diff --git a/include/ieclasscolours.h b/include/ieclasscolours.h new file mode 100644 index 0000000000..912c724c31 --- /dev/null +++ b/include/ieclasscolours.h @@ -0,0 +1,47 @@ +#pragma once + +#include "imodule.h" +#include "ieclass.h" +#include "math/Vector3.h" + +namespace eclass +{ + +/** + * Manages the entity class colour overrides that are applied + * to certain eclasses as defined in the currently active + * colour scheme. + */ +class IColourManager : + public RegisterableModule +{ +public: + virtual ~IColourManager() {} + + // Register an override for the given entity class, such that the wire/fill shader + // colours of the named entity class are using the given colour instead of the one + // defined in the entityDef block. + // Adding an override for an entity class will replace any existing overrides. + // The colour is given in RGB values with each component in the interval [0..1]. + virtual void addOverrideColour(const std::string& eclass, const Vector3& colour) = 0; + + // Applies a possible colour override to the given entity class + virtual void applyColours(const IEntityClassPtr& eclass) = 0; + + // Removes the override colour for the given entity class + virtual void removeOverrideColour(const std::string& eclass) = 0; +}; + +} + +const char* const MODULE_ECLASS_COLOUR_MANAGER("EclassColourManager"); + +/** + * Return the global IEClassColourManager to the application. + * \ingroup eclass + */ +inline eclass::IColourManager& GlobalEclassColourManager() +{ + static module::InstanceReference _reference(MODULE_ECLASS_COLOUR_MANAGER); + return _reference; +} diff --git a/radiantcore/Makefile.am b/radiantcore/Makefile.am index f42527c193..2be292d5bb 100644 --- a/radiantcore/Makefile.am +++ b/radiantcore/Makefile.am @@ -52,6 +52,7 @@ libradiantcore_la_SOURCES = Radiant.cpp \ clipper/SplitAlgorithm.cpp \ commandsystem/CommandSystem.cpp \ eclass/Doom3EntityClass.cpp \ + eclass/EClassColourManager.cpp \ eclass/EClassManager.cpp \ entity/ShaderParms.cpp \ entity/EntitySettings.cpp \ diff --git a/radiantcore/eclass/EClassColourManager.cpp b/radiantcore/eclass/EClassColourManager.cpp new file mode 100644 index 0000000000..e880d27ce6 --- /dev/null +++ b/radiantcore/eclass/EClassColourManager.cpp @@ -0,0 +1,47 @@ +#include "EClassColourManager.h" + +#include "module/StaticModule.h" + +namespace eclass +{ + +void EClassColourManager::addOverrideColour(const std::string& eclass, const Vector3& colour) +{ + _overrides[eclass] = colour; +} + +void EClassColourManager::applyColours(const IEntityClassPtr& eclass) +{ + auto foundOverride = _overrides.find(eclass->getName()); + + if (foundOverride != _overrides.end()) + { + eclass->setColour(foundOverride->second); + } +} + +void EClassColourManager::removeOverrideColour(const std::string& eclass) +{ + _overrides.erase(eclass); +} + +const std::string& EClassColourManager::getName() const +{ + static std::string _name(MODULE_ECLASS_COLOUR_MANAGER); + return _name; +} + +const StringSet& EClassColourManager::getDependencies() const +{ + static StringSet _dependencies; + return _dependencies; +} + +void EClassColourManager::initialiseModule(const IApplicationContext& ctx) +{ + rMessage() << getName() << "::initialiseModule called." << std::endl; +} + +module::StaticModule eclassColourManagerModule; + +} diff --git a/radiantcore/eclass/EClassColourManager.h b/radiantcore/eclass/EClassColourManager.h new file mode 100644 index 0000000000..481e8352d9 --- /dev/null +++ b/radiantcore/eclass/EClassColourManager.h @@ -0,0 +1,29 @@ +#pragma once + +#include +#include "ieclasscolours.h" + +namespace eclass +{ + +class EClassColourManager : + public IColourManager +{ +private: + std::map _overrides; + +public: + // IColourManager implementation + + void addOverrideColour(const std::string& eclass, const Vector3& colour) override; + void applyColours(const IEntityClassPtr& eclass) override; + void removeOverrideColour(const std::string& eclass) override; + + // RegisterableModule implementation + + const std::string& getName() const override; + const StringSet& getDependencies() const override; + void initialiseModule(const IApplicationContext& ctx) override; +}; + +} diff --git a/tools/msvc/DarkRadiantCore.vcxproj b/tools/msvc/DarkRadiantCore.vcxproj index 46ca05c273..9d463c5eb4 100644 --- a/tools/msvc/DarkRadiantCore.vcxproj +++ b/tools/msvc/DarkRadiantCore.vcxproj @@ -39,6 +39,7 @@ + @@ -716,6 +717,7 @@ + diff --git a/tools/msvc/DarkRadiantCore.vcxproj.filters b/tools/msvc/DarkRadiantCore.vcxproj.filters index b42f3cb427..93b46ca3f2 100644 --- a/tools/msvc/DarkRadiantCore.vcxproj.filters +++ b/tools/msvc/DarkRadiantCore.vcxproj.filters @@ -997,6 +997,9 @@ src\model\export + + src\eclass + @@ -2031,5 +2034,8 @@ src\model\export + + src\eclass + \ No newline at end of file diff --git a/tools/msvc/include.vcxproj b/tools/msvc/include.vcxproj index 2b348f9c6a..b3b276f8aa 100644 --- a/tools/msvc/include.vcxproj +++ b/tools/msvc/include.vcxproj @@ -111,6 +111,7 @@ +