Skip to content

Commit

Permalink
#5584: Target line rendering is working now, including highlight rend…
Browse files Browse the repository at this point in the history
…ering when source entities are selected
  • Loading branch information
codereader committed Dec 4, 2021
1 parent 8a2d608 commit ee5d717
Show file tree
Hide file tree
Showing 6 changed files with 46 additions and 39 deletions.
2 changes: 2 additions & 0 deletions radiantcore/entity/EntityNode.cpp
Expand Up @@ -430,6 +430,8 @@ void EntityNode::setRenderSystem(const RenderSystemPtr& renderSystem)
// Make sure any attached entities have a render system too
for (IEntityNodePtr node: _attachedEnts)
node->setRenderSystem(renderSystem);

TargetableNode::onRenderSystemChanged();
}

std::size_t EntityNode::getHighlightFlags()
Expand Down
41 changes: 7 additions & 34 deletions radiantcore/entity/target/RenderableTargetLines.h
Expand Up @@ -11,7 +11,7 @@ namespace entity

namespace
{
const double TARGET_MAX_ARROW_LENGTH = 10;
constexpr const double TARGET_MAX_ARROW_LENGTH = 10;
}

/**
Expand All @@ -24,8 +24,9 @@ namespace
* frontend render pass.
*/
class RenderableTargetLines :
public RenderablePointVector
public OpenGLRenderable
{
private:
const TargetKeyCollection& _targetKeys;

bool _needsUpdate;
Expand All @@ -35,7 +36,6 @@ class RenderableTargetLines :

public:
RenderableTargetLines(const TargetKeyCollection& targetKeys) :
RenderablePointVector(GL_LINES),
_targetKeys(targetKeys),
_needsUpdate(true),
_surfaceSlot(render::IGeometryRenderer::InvalidSlot),
Expand Down Expand Up @@ -114,39 +114,12 @@ class RenderableTargetLines :
}
}

void render(const ShaderPtr& shader, IRenderableCollector& collector, const VolumeTest& volume, const Vector3& worldPosition)
void render(const RenderInfo& info) const override
{
#if 0
if (_targetKeys.empty())
{
return;
}

// Clear the vector
clear();

// Populate the RenderablePointVector with all target coordinates
_targetKeys.forEachTarget([&] (const TargetPtr& target)
if (_surfaceSlot != render::IGeometryRenderer::InvalidSlot && _shader)
{
if (!target || target->isEmpty() || !target->isVisible())
{
return;
}

Vector3 targetPosition = target->getPosition();

if (volume.TestLine(Segment::createForStartEnd(worldPosition, targetPosition)))
{
addTargetLine(worldPosition, targetPosition);
}
});

// If we hold any objects now, add us as renderable
if (!empty())
{
collector.addRenderable(*shader, *this, Matrix4::getIdentity());
}
#endif
_shader->renderGeometry(_surfaceSlot);
}
}

private:
Expand Down
25 changes: 21 additions & 4 deletions radiantcore/entity/target/TargetLineNode.cpp
Expand Up @@ -28,6 +28,20 @@ const AABB& TargetLineNode::localAABB() const
return _aabb;
}

void TargetLineNode::onInsertIntoScene(scene::IMapRootNode& root)
{
Node::onInsertIntoScene(root);

_targetLines.queueUpdate();
}

void TargetLineNode::onRemoveFromScene(scene::IMapRootNode& root)
{
Node::onRemoveFromScene(root);

_targetLines.clear();
}

void TargetLineNode::onPreRender(const VolumeTest& volume)
{
// If the owner is hidden, the lines are hidden too
Expand Down Expand Up @@ -60,10 +74,13 @@ void TargetLineNode::renderWireframe(IRenderableCollector& collector, const Volu

void TargetLineNode::renderHighlights(IRenderableCollector& collector, const VolumeTest& volume)
{
// TODO: render slot
#if 0
renderWireframe(collector, volume);
#endif
collector.addHighlightRenderable(_targetLines, Matrix4::getIdentity());
}

void TargetLineNode::onRenderSystemChanged()
{
_targetLines.clear();
_targetLines.queueUpdate();
}

void TargetLineNode::onVisibilityChanged(bool visible)
Expand Down
7 changes: 6 additions & 1 deletion radiantcore/entity/target/TargetLineNode.h
Expand Up @@ -16,7 +16,7 @@ class EntityNode;
* the lines from disappearing from the view when the targeting/targeted entities
* get culled by the space partitioning system during rendering.
*/
class TargetLineNode :
class TargetLineNode final :
public scene::Node
{
private:
Expand All @@ -42,6 +42,11 @@ class TargetLineNode :
void renderHighlights(IRenderableCollector& collector, const VolumeTest& volumeTest) override;
std::size_t getHighlightFlags() override;

void onRenderSystemChanged();

void onInsertIntoScene(scene::IMapRootNode& root) override;
void onRemoveFromScene(scene::IMapRootNode& root) override;

protected:
void onVisibilityChanged(bool isVisibleNow) override;

Expand Down
8 changes: 8 additions & 0 deletions radiantcore/entity/target/TargetableNode.cpp
Expand Up @@ -143,4 +143,12 @@ void TargetableNode::onTargetKeyCollectionChanged()
}
}

void TargetableNode::onRenderSystemChanged()
{
if (_targetLineNode)
{
_targetLineNode->onRenderSystemChanged();
}
}

} // namespace entity
2 changes: 2 additions & 0 deletions radiantcore/entity/target/TargetableNode.h
Expand Up @@ -72,6 +72,8 @@ class TargetableNode :

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

void onRenderSystemChanged();
};

} // namespace entity

0 comments on commit ee5d717

Please sign in to comment.