Skip to content

Commit

Permalink
#5430: EClassManager is referencing the EClassColourManager to apply …
Browse files Browse the repository at this point in the history
…colour overrides
  • Loading branch information
codereader committed Nov 24, 2020
1 parent 2848511 commit 1994e93
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 0 deletions.
4 changes: 4 additions & 0 deletions include/ieclasscolours.h
@@ -1,5 +1,6 @@
#pragma once

#include <functional>
#include "imodule.h"
#include "ieclass.h"
#include "math/Vector3.h"
Expand Down Expand Up @@ -28,6 +29,9 @@ class IColourManager :
// Applies a possible colour override to the given entity class
virtual void applyColours(const IEntityClassPtr& eclass) = 0;

// Visit each override definition with the given functor
virtual void foreachOverrideColour(const std::function<void(const std::string&, const Vector3&)>& functor) = 0;

// Removes the override colour for the given entity class
virtual void removeOverrideColour(const std::string& eclass) = 0;
};
Expand Down
14 changes: 14 additions & 0 deletions radiantcore/eclass/EClassColourManager.cpp
@@ -1,5 +1,6 @@
#include "EClassColourManager.h"

#include "itextstream.h"
#include "module/StaticModule.h"

namespace eclass
Expand All @@ -12,14 +13,27 @@ void EClassColourManager::addOverrideColour(const std::string& eclass, const Vec

void EClassColourManager::applyColours(const IEntityClassPtr& eclass)
{
assert(eclass);

auto foundOverride = _overrides.find(eclass->getName());

if (foundOverride != _overrides.end())
{
rDebug() << "Applying colour " << foundOverride->second << " to eclass " << eclass->getName() << std::endl;

eclass->setColour(foundOverride->second);
}
}

void EClassColourManager::foreachOverrideColour(
const std::function<void(const std::string&, const Vector3&)>& functor)
{
for (const auto& pair : _overrides)
{
functor(pair.first, pair.second);
}
}

void EClassColourManager::removeOverrideColour(const std::string& eclass)
{
_overrides.erase(eclass);
Expand Down
1 change: 1 addition & 0 deletions radiantcore/eclass/EClassColourManager.h
Expand Up @@ -17,6 +17,7 @@ class EClassColourManager :

void addOverrideColour(const std::string& eclass, const Vector3& colour) override;
void applyColours(const IEntityClassPtr& eclass) override;
void foreachOverrideColour(const std::function<void(const std::string&, const Vector3&)>& functor) override;
void removeOverrideColour(const std::string& eclass) override;

// RegisterableModule implementation
Expand Down
20 changes: 20 additions & 0 deletions radiantcore/eclass/EClassManager.cpp
@@ -1,6 +1,7 @@
#include "EClassManager.h"

#include "iarchive.h"
#include "ieclasscolours.h"
#include "i18n.h"
#include "iregistry.h"
#include "icommandsystem.h"
Expand Down Expand Up @@ -64,6 +65,9 @@ IEntityClassPtr EClassManager::findOrInsert(const std::string& name, bool has_br
// so that brushes of unknown entites don't get lost (issue #240)
eclass = Doom3EntityClass::create(lName, true);

// Any overrides should also apply to entityDefs that are crated on the fly
GlobalEclassColourManager().applyColours(eclass);

// Try to insert the class
return insertUnique(eclass);
}
Expand Down Expand Up @@ -179,10 +183,25 @@ void EClassManager::loadDefAndResolveInheritance()
{
parseDefFiles();
resolveInheritance();
applyColours();

_defsLoadedSignal.emit();
}

void EClassManager::applyColours()
{
GlobalEclassColourManager().foreachOverrideColour([&](const std::string& eclass, const Vector3& colour)
{
auto foundEclass = _entityClasses.find(string::to_lower_copy(eclass));

if (foundEclass != _entityClasses.end())
{
rDebug() << "Applying colour " << colour << " to eclass " << eclass << std::endl;
foundEclass->second->setColour(colour);
}
});
}

void EClassManager::realise()
{
if (_realised)
Expand Down Expand Up @@ -278,6 +297,7 @@ const StringSet& EClassManager::getDependencies() const
_dependencies.insert(MODULE_VIRTUALFILESYSTEM);
_dependencies.insert(MODULE_XMLREGISTRY);
_dependencies.insert(MODULE_COMMANDSYSTEM);
_dependencies.insert(MODULE_ECLASS_COLOUR_MANAGER);
}

return _dependencies;
Expand Down
3 changes: 3 additions & 0 deletions radiantcore/eclass/EClassManager.h
Expand Up @@ -93,6 +93,9 @@ class EClassManager :
// Worker function usually done in a separate thread
void loadDefAndResolveInheritance();

// Applies possible colour overrides to all affected eclasses
void applyColours();

// Tries to insert the given eclass, not overwriting existing ones
// In either case, the eclass in the map is returned
Doom3EntityClassPtr insertUnique(const Doom3EntityClassPtr& eclass);
Expand Down

0 comments on commit 1994e93

Please sign in to comment.