diff --git a/include/ientity.h b/include/ientity.h index 33319074ca..dcb7b92249 100644 --- a/include/ientity.h +++ b/include/ientity.h @@ -317,6 +317,34 @@ class ITargetManager }; typedef std::shared_ptr ITargetManagerPtr; +/** + * Global entity settings affecting appearance, render options, etc. + */ +class IEntitySettings +{ +public: + virtual bool getRenderEntityNames() const = 0; + virtual void setRenderEntityNames(bool value) = 0; + + virtual bool getShowAllSpeakerRadii() const = 0; + virtual void setShowAllSpeakerRadii(bool value) = 0; + + virtual bool getShowAllLightRadii() const = 0; + virtual void setShowAllLightRadii(bool value) = 0; + + virtual bool getDragResizeEntitiesSymmetrically() const = 0; + virtual void setDragResizeEntitiesSymmetrically(bool value) = 0; + + virtual bool getAlwaysShowLightVertices() const = 0; + virtual void setAlwaysShowLightVertices(bool value) = 0; + + virtual bool getFreeObjectRotation() const = 0; + virtual void setFreeObjectRotation(bool value) = 0; + + virtual bool getShowEntityAngles() const = 0; + virtual void setShowEntityAngles(bool value) = 0; +}; + const char* const MODULE_ENTITY("EntityModule"); /** @@ -334,6 +362,9 @@ class IEntityModule : // Constructs a new targetmanager instance (used by root nodes) virtual ITargetManagerPtr createTargetManager() = 0; + + // Access to the settings manager + virtual IEntitySettings& getSettings() = 0; }; inline IEntityModule& GlobalEntityModule() diff --git a/radiant/entity/EntityModule.cpp b/radiant/entity/EntityModule.cpp index e0987acb57..c46d5e2c26 100644 --- a/radiant/entity/EntityModule.cpp +++ b/radiant/entity/EntityModule.cpp @@ -24,6 +24,7 @@ #include "eclassmodel/EclassModelNode.h" #include "target/TargetManager.h" #include "module/StaticModule.h" +#include "EntitySettings.h" namespace entity { @@ -107,6 +108,11 @@ ITargetManagerPtr Doom3EntityModule::createTargetManager() return std::make_shared(); } +IEntitySettings& Doom3EntityModule::getSettings() +{ + return *EntitySettings::InstancePtr(); +} + // RegisterableModule implementation const std::string& Doom3EntityModule::getName() const { @@ -118,7 +124,7 @@ const StringSet& Doom3EntityModule::getDependencies() const { static StringSet _dependencies; - if (_dependencies.empty()) + if (_dependencies.empty()) { _dependencies.insert(MODULE_XMLREGISTRY); _dependencies.insert(MODULE_MAP); diff --git a/radiant/entity/EntityModule.h b/radiant/entity/EntityModule.h index 02a53e0858..e9f401d38c 100644 --- a/radiant/entity/EntityModule.h +++ b/radiant/entity/EntityModule.h @@ -14,6 +14,7 @@ class Doom3EntityModule : // EntityCreator implementation IEntityNodePtr createEntity(const IEntityClassPtr& eclass) override; ITargetManagerPtr createTargetManager() override; + IEntitySettings& getSettings() override; // RegisterableModule implementation virtual const std::string& getName() const override; diff --git a/radiant/entity/EntityNode.cpp b/radiant/entity/EntityNode.cpp index ed28cbf8d1..cd6b26f76d 100644 --- a/radiant/entity/EntityNode.cpp +++ b/radiant/entity/EntityNode.cpp @@ -236,7 +236,7 @@ void EntityNode::renderWireframe(RenderableCollector& collector, const VolumeTest& volume) const { // Submit renderable text name if required - if (EntitySettings::InstancePtr()->renderEntityNames()) + if (EntitySettings::InstancePtr()->getRenderEntityNames()) { collector.addRenderable(getWireShader(), _renderableName, localToWorld()); } diff --git a/radiant/entity/EntitySettings.h b/radiant/entity/EntitySettings.h index ab0c7943b6..01f6c71569 100644 --- a/radiant/entity/EntitySettings.h +++ b/radiant/entity/EntitySettings.h @@ -27,7 +27,8 @@ typedef std::shared_ptr EntitySettingsPtr; * variables accordingly. This can be used as some sort of "cache" * to avoid slow registry queries during rendering, for instance. */ -class EntitySettings +class EntitySettings : + public IEntitySettings { public: enum LightEditVertexType @@ -81,36 +82,83 @@ class EntitySettings return _lightVertexColours[type]; } - bool renderEntityNames() { + bool getRenderEntityNames() const override + { return _renderEntityNames; } - bool showAllSpeakerRadii() { + void setRenderEntityNames(bool value) override + { + _renderEntityNames = value; + onSettingsChanged(); + } + + bool getShowAllSpeakerRadii() const override + { return _showAllSpeakerRadii; } - bool showAllLightRadii() { + void setShowAllSpeakerRadii(bool value) override + { + _showAllSpeakerRadii = value; + onSettingsChanged(); + } + + bool getShowAllLightRadii() const override + { return _showAllLightRadii; } - bool dragResizeEntitiesSymmetrically() { + void setShowAllLightRadii(bool value) override + { + _showAllLightRadii = value; + onSettingsChanged(); + } + + bool getDragResizeEntitiesSymmetrically() const override + { return _dragResizeEntitiesSymmetrically; } - bool alwaysShowLightVertices() { + void setDragResizeEntitiesSymmetrically(bool value) override + { + _dragResizeEntitiesSymmetrically = value; + onSettingsChanged(); + } + + bool getAlwaysShowLightVertices() const override + { return _alwaysShowLightVertices; } - bool freeObjectRotation() + void setAlwaysShowLightVertices(bool value) override + { + _alwaysShowLightVertices = value; + onSettingsChanged(); + } + + bool getFreeObjectRotation() const override { return _freeObjectRotation; } - bool showEntityAngles() + void setFreeObjectRotation(bool value) override + { + _freeObjectRotation = value; + onSettingsChanged(); + } + + bool getShowEntityAngles() const override { return _showEntityAngles; } + void setShowEntityAngles(bool value) override + { + _showEntityAngles = value; + onSettingsChanged(); + } + // Container for the singleton (ptr) static EntitySettingsPtr& InstancePtr(); diff --git a/radiant/entity/generic/GenericEntity.cpp b/radiant/entity/generic/GenericEntity.cpp index fe6e754952..6131dfd4ef 100644 --- a/radiant/entity/generic/GenericEntity.cpp +++ b/radiant/entity/generic/GenericEntity.cpp @@ -51,7 +51,7 @@ const AABB& GenericEntity::localAABB() const { void GenericEntity::renderArrow(const ShaderPtr& shader, RenderableCollector& collector, const VolumeTest& volume, const Matrix4& localToWorld) const { - if (EntitySettings::InstancePtr()->showEntityAngles()) + if (EntitySettings::InstancePtr()->getShowEntityAngles()) { collector.addRenderable(shader, m_arrow, localToWorld); } diff --git a/radiant/entity/light/Light.cpp b/radiant/entity/light/Light.cpp index 13f9015ffb..9ffa613236 100644 --- a/radiant/entity/light/Light.cpp +++ b/radiant/entity/light/Light.cpp @@ -370,7 +370,7 @@ void Light::snapto(float snap) void Light::setLightRadius(const AABB& aabb) { - if (EntitySettings::InstancePtr()->dragResizeEntitiesSymmetrically()) + if (EntitySettings::InstancePtr()->getDragResizeEntitiesSymmetrically()) { // Leave origin unchanged, calculate the new symmetrical radius Vector3 delta = aabb.getExtents() - m_doom3Radius.m_radiusTransformed; @@ -571,7 +571,7 @@ void Light::renderWireframe(RenderableCollector& collector, collector.addRenderable(_owner.getColourShader(), *this, localToWorld); // Render bounding box if selected or the showAllLighRadii flag is set - if (selected || EntitySettings::InstancePtr()->showAllLightRadii()) + if (selected || EntitySettings::InstancePtr()->getShowAllLightRadii()) { if (isProjected()) { diff --git a/radiant/entity/light/LightNode.cpp b/radiant/entity/light/LightNode.cpp index ad03e24f16..f294e2866b 100644 --- a/radiant/entity/light/LightNode.cpp +++ b/radiant/entity/light/LightNode.cpp @@ -360,7 +360,7 @@ void LightNode::renderInactiveComponents(RenderableCollector& collector, const V // check if we should draw the center of the light anyway if (selected && GlobalSelectionSystem().ComponentMode() != SelectionSystem::eVertex - && EntitySettings::InstancePtr()->alwaysShowLightVertices()) + && EntitySettings::InstancePtr()->getAlwaysShowLightVertices()) { if (_light.isProjected()) { diff --git a/radiant/entity/speaker/SpeakerNode.cpp b/radiant/entity/speaker/SpeakerNode.cpp index d3104378ae..15e1a0f4fa 100644 --- a/radiant/entity/speaker/SpeakerNode.cpp +++ b/radiant/entity/speaker/SpeakerNode.cpp @@ -247,7 +247,7 @@ void SpeakerNode::renderSolid(RenderableCollector& collector, // Submit the speaker radius if we are selected or the "show all speaker // radii" option is set - if (isSelected() || EntitySettings::InstancePtr()->showAllSpeakerRadii()) + if (isSelected() || EntitySettings::InstancePtr()->getShowAllSpeakerRadii()) { collector.addRenderable(getFillShader(), _renderableRadii, localToWorld()); } @@ -261,7 +261,7 @@ void SpeakerNode::renderWireframe(RenderableCollector& collector, // Submit the speaker radius if we are selected or the "show all speaker // radii" option is set - if (isSelected() || EntitySettings::InstancePtr()->showAllSpeakerRadii()) + if (isSelected() || EntitySettings::InstancePtr()->getShowAllSpeakerRadii()) { collector.addRenderable(getWireShader(), _renderableRadii, localToWorld()); } @@ -306,7 +306,7 @@ void SpeakerNode::setRadiusFromAABB(const AABB& aabb) maxTrans = (fabs(delta.y()) > fabs(delta.z())) ? delta.y() : delta.z(); } - if (EntitySettings::InstancePtr()->dragResizeEntitiesSymmetrically()) + if (EntitySettings::InstancePtr()->getDragResizeEntitiesSymmetrically()) { // For a symmetric AABB change, take the extents delta times 2 maxTrans *= 2;