Skip to content

Commit

Permalink
#5923: Handle visibility changes of targetable nodes
Browse files Browse the repository at this point in the history
  • Loading branch information
codereader committed Mar 19, 2022
1 parent 3f42ccd commit 416c1ff
Show file tree
Hide file tree
Showing 8 changed files with 43 additions and 4 deletions.
3 changes: 3 additions & 0 deletions include/ientity.h
Expand Up @@ -433,6 +433,9 @@ class ITargetManager
*/
virtual void associateTarget(const std::string& name, const scene::INode& node) = 0;

// Will be called by a TargetableNode to notify about visibility changes
virtual void onTargetVisibilityChanged(const std::string& name, const scene::INode& node) = 0;

// Will be called by a TargetableNode to notify about a position change
virtual void onTargetPositionChanged(const std::string& name, const scene::INode& node) = 0;

Expand Down
1 change: 1 addition & 0 deletions radiantcore/entity/EntityNode.cpp
Expand Up @@ -478,6 +478,7 @@ std::size_t EntityNode::getHighlightFlags()
void EntityNode::onVisibilityChanged(bool isVisibleNow)
{
SelectableNode::onVisibilityChanged(isVisibleNow);
TargetableNode::onVisibilityChanged(isVisibleNow);

for (const auto& [node, _] : _attachedEnts)
{
Expand Down
12 changes: 10 additions & 2 deletions radiantcore/entity/target/Target.h
Expand Up @@ -62,6 +62,8 @@ class Target :

void clear()
{
// Notify any watchers on scene removal
signal_TargetChanged().emit();
_node = nullptr;
}

Expand Down Expand Up @@ -89,10 +91,16 @@ class Target :
// Invoked by the TargetManager when an entity's position changed
void onPositionChanged()
{
signal_PositionChanged().emit();
signal_TargetChanged().emit();
}

sigc::signal<void>& signal_PositionChanged()
// Invoked by the TargetManager when an entity's visibility has changed
void onVisibilityChanged()
{
signal_TargetChanged().emit();
}

sigc::signal<void>& signal_TargetChanged()
{
return _sigPositionChanged;
}
Expand Down
4 changes: 2 additions & 2 deletions radiantcore/entity/target/TargetKey.cpp
Expand Up @@ -23,7 +23,7 @@ void TargetKey::onTargetManagerChanged()
_target = std::static_pointer_cast<Target>(manager->getTarget(_curValue));
assert(_target);

_target->signal_PositionChanged().connect(sigc::mem_fun(this, &TargetKey::onTargetPositionChanged));
_target->signal_TargetChanged().connect(sigc::mem_fun(this, &TargetKey::onTargetPositionChanged));
}

const TargetPtr& TargetKey::getTarget() const
Expand Down Expand Up @@ -58,7 +58,7 @@ void TargetKey::onKeyValueChanged(const std::string& newValue)
_target = std::static_pointer_cast<Target>(targetManager->getTarget(_curValue));
assert(_target);

_target->signal_PositionChanged().connect(sigc::mem_fun(this, &TargetKey::onTargetPositionChanged));
_target->signal_TargetChanged().connect(sigc::mem_fun(this, &TargetKey::onTargetPositionChanged));
}
}

Expand Down
14 changes: 14 additions & 0 deletions radiantcore/entity/target/TargetManager.cpp
Expand Up @@ -36,6 +36,18 @@ ITargetableObjectPtr TargetManager::getTarget(const std::string& name)
return target;
}

void TargetManager::onTargetVisibilityChanged(const std::string& name, const scene::INode& node)
{
if (name.empty()) return;

auto existing = _targets.find(name);

if (existing != _targets.end())
{
existing->second->onVisibilityChanged();
}
}

void TargetManager::onTargetPositionChanged(const std::string& name, const scene::INode& node)
{
if (name.empty()) return;
Expand Down Expand Up @@ -63,6 +75,8 @@ void TargetManager::associateTarget(const std::string& name, const scene::INode&
{
// Already registered, but empty => associate it
found->second->setNode(node);
// Trigger a visibility changed signal
found->second->onVisibilityChanged();
}
else {
// Non-empty target!
Expand Down
3 changes: 3 additions & 0 deletions radiantcore/entity/target/TargetManager.h
Expand Up @@ -40,6 +40,9 @@ class TargetManager :
*/
void associateTarget(const std::string& name, const scene::INode& node) override;

// Is called by the TargetableNode to notify about visibility changes
void onTargetVisibilityChanged(const std::string& name, const scene::INode& node) override;

// Is called by the TargetableNode to notify about a position change
void onTargetPositionChanged(const std::string& name, const scene::INode& node) override;

Expand Down
8 changes: 8 additions & 0 deletions radiantcore/entity/target/TargetableNode.cpp
Expand Up @@ -133,6 +133,14 @@ void TargetableNode::onRemoveFromScene(scene::IMapRootNode& root)
_targetKeys.onTargetManagerChanged();
}

void TargetableNode::onVisibilityChanged(bool isVisibleNow)
{
if (!_targetManager) return;

// Notify the target manager that our position has changed
_targetManager->onTargetVisibilityChanged(_targetName, _node);
}

void TargetableNode::onTargetKeyCollectionChanged()
{
if (!_targetKeys.empty())
Expand Down
2 changes: 2 additions & 0 deletions radiantcore/entity/target/TargetableNode.h
Expand Up @@ -69,6 +69,8 @@ class TargetableNode :
void onInsertIntoScene(scene::IMapRootNode& root);
void onRemoveFromScene(scene::IMapRootNode& root);

void onVisibilityChanged(bool isVisibleNow);

// Invoked by the TargetKeyCollection when the number of observed has changed
void onTargetKeyCollectionChanged();

Expand Down

0 comments on commit 416c1ff

Please sign in to comment.