From 76addecde6ee2f93a40a2483ad1c747284ae7df4 Mon Sep 17 00:00:00 2001 From: Matthew Mott Date: Sun, 12 Dec 2021 14:05:20 +0000 Subject: [PATCH] GenericEntityNode now uses observeKey() with auto-disconnection --- radiantcore/entity/AngleKey.h | 7 +++-- .../entity/generic/GenericEntityNode.cpp | 31 +++++-------------- .../entity/generic/GenericEntityNode.h | 14 ++++++--- 3 files changed, 22 insertions(+), 30 deletions(-) diff --git a/radiantcore/entity/AngleKey.h b/radiantcore/entity/AngleKey.h index fdeb6700b7..c26201a262 100644 --- a/radiantcore/entity/AngleKey.h +++ b/radiantcore/entity/AngleKey.h @@ -9,7 +9,8 @@ class Entity; namespace entity { -class AngleKey +/// Wrapper for an "angle" spawnarg +class AngleKey: public sigc::trackable { private: std::function _angleChanged; @@ -19,8 +20,8 @@ class AngleKey public: static const float IDENTITY; - AngleKey(const std::function& angleChanged) : - _angleChanged(angleChanged), + AngleKey(const std::function& angleChanged) : + _angleChanged(angleChanged), _value(IDENTITY) {} diff --git a/radiantcore/entity/generic/GenericEntityNode.cpp b/radiantcore/entity/generic/GenericEntityNode.cpp index 5bc540a916..1183f19f54 100644 --- a/radiantcore/entity/generic/GenericEntityNode.cpp +++ b/radiantcore/entity/generic/GenericEntityNode.cpp @@ -37,19 +37,6 @@ GenericEntityNode::GenericEntityNode(const GenericEntityNode& other) : GenericEntityNode::~GenericEntityNode() { - if (!_allow3Drotations) - { - // Ordinary rotation (2D around z axis), use angle key observer - removeKeyObserver("angle", _angleObserver); - } - else - { - // Full 3D rotations allowed, observe both keys using the rotation key observer - removeKeyObserver("angle", _angleObserver); - removeKeyObserver("rotation", _rotationObserver); - } - - removeKeyObserver("origin", m_originKey); } GenericEntityNodePtr GenericEntityNode::Create(const IEntityClassPtr& eclass) @@ -71,22 +58,20 @@ void GenericEntityNode::construct() if (!_allow3Drotations) { - _angleObserver.setCallback(std::bind(&AngleKey::angleChanged, &m_angleKey, std::placeholders::_1)); - // Ordinary rotation (2D around z axis), use angle key observer - addKeyObserver("angle", _angleObserver); + static_assert(std::is_base_of::value); + observeKey("angle", sigc::mem_fun(m_angleKey, &AngleKey::angleChanged)); } else { - _angleObserver.setCallback(std::bind(&RotationKey::angleChanged, &m_rotationKey, std::placeholders::_1)); - _rotationObserver.setCallback(std::bind(&RotationKey::rotationChanged, &m_rotationKey, std::placeholders::_1)); - // Full 3D rotations allowed, observe both keys using the rotation key observer - addKeyObserver("angle", _angleObserver); - addKeyObserver("rotation", _rotationObserver); - } + static_assert(std::is_base_of::value); + observeKey("angle", sigc::mem_fun(m_rotationKey, &RotationKey::angleChanged)); + observeKey("rotation", sigc::mem_fun(m_rotationKey, &RotationKey::rotationChanged)); + } - addKeyObserver("origin", m_originKey); + static_assert(std::is_base_of::value); + observeKey("origin", sigc::mem_fun(m_originKey, &OriginKey::onKeyValueChanged)); } void GenericEntityNode::snapto(float snap) diff --git a/radiantcore/entity/generic/GenericEntityNode.h b/radiantcore/entity/generic/GenericEntityNode.h index 9e317d0b03..dd6893a4f0 100644 --- a/radiantcore/entity/generic/GenericEntityNode.h +++ b/radiantcore/entity/generic/GenericEntityNode.h @@ -24,7 +24,16 @@ namespace entity class GenericEntityNode; typedef std::shared_ptr GenericEntityNodePtr; -/// EntityNode subclass for all entity types not handled by a specific class + +/** + * @brief EntityNode subclass for all entity types not handled by a specific + * class. + * + * Generic entity nodes represent entities which have no editor-specific + * functionality, beyond simply existing and pointing in a particular direction. + * They are rendered as boxes with an angle/rotation arrow. Common generic + * entities include "info_playerstart" and "info_location". + */ class GenericEntityNode: public EntityNode, public Snappable { OriginKey m_originKey; @@ -53,9 +62,6 @@ class GenericEntityNode: public EntityNode, public Snappable // FALSE if the arrow is caught in the xy plane bool _allow3Drotations; - KeyObserverDelegate _rotationObserver; - KeyObserverDelegate _angleObserver; - // Whether to draw a solid/shaded box in full material render mode or just the wireframe enum SolidAAABBRenderMode {