Skip to content

Commit

Permalink
#5584: Use a const AABB reference to construct the RenderableEntityBox.
Browse files Browse the repository at this point in the history
This might cause troubles when the RenderableEntityBox owner is changed to a base class, or if virtualness is added to some signatures.
In this case, an approach to pass an interface or function object to retrieve the bounds and the world position on demand is probably safer.
  • Loading branch information
codereader committed Dec 11, 2021
1 parent 5d2a1e1 commit a585124
Show file tree
Hide file tree
Showing 7 changed files with 54 additions and 70 deletions.
14 changes: 6 additions & 8 deletions radiantcore/entity/RenderableEntityBox.cpp
Expand Up @@ -103,8 +103,9 @@ static const std::vector<unsigned int> FillBoxIndices

}

RenderableEntityBox::RenderableEntityBox(EntityNode& node) :
_node(node),
RenderableEntityBox::RenderableEntityBox(const AABB& bounds, const Vector3& worldPos) :
_bounds(bounds),
_worldPos(worldPos),
_needsUpdate(true),
_filledBox(true)
{}
Expand All @@ -131,20 +132,17 @@ void RenderableEntityBox::updateGeometry()
_needsUpdate = false;

static Vector3 Origin(0, 0, 0);
const auto& bounds = _node.localAABB();

// Calculate the corner vertices of this bounding box, plus the mid-point
Vector3 max(Origin + bounds.extents);
Vector3 min(Origin - bounds.extents);
Vector3 max(Origin + _bounds.extents);
Vector3 min(Origin - _bounds.extents);

auto vertices = _filledBox ? getFillBoxVertices(min, max) : getWireframeBoxVertices(min, max);

// Move the points to their world position
const auto& translation = _node.worldAABB().getOrigin();

for (auto& vertex : vertices)
{
vertex.vertex += translation;
vertex.vertex += _worldPos;
}

if (_filledBox)
Expand Down
5 changes: 3 additions & 2 deletions radiantcore/entity/RenderableEntityBox.h
Expand Up @@ -11,12 +11,13 @@ class RenderableEntityBox :
public render::RenderableGeometry
{
private:
const EntityNode& _node;
const AABB& _bounds;
const Vector3& _worldPos;
bool _needsUpdate;
bool _filledBox;

public:
RenderableEntityBox(EntityNode& node);
RenderableEntityBox(const AABB& bounds, const Vector3& worldPos);

void queueUpdate();
void setFillMode(bool fill);
Expand Down
4 changes: 2 additions & 2 deletions radiantcore/entity/generic/GenericEntityNode.cpp
Expand Up @@ -14,7 +14,7 @@ GenericEntityNode::GenericEntityNode(const IEntityClassPtr& eclass) :
m_angle(AngleKey::IDENTITY),
m_rotationKey(std::bind(&GenericEntityNode::rotationChanged, this)),
_renderableArrow(*this),
_renderableBox(*this),
_renderableBox(localAABB(), worldAABB().getOrigin()),
_allow3Drotations(_spawnArgs.getKeyValue("editor_rotatable") == "1")
{}

Expand All @@ -27,7 +27,7 @@ GenericEntityNode::GenericEntityNode(const GenericEntityNode& other) :
m_angle(AngleKey::IDENTITY),
m_rotationKey(std::bind(&GenericEntityNode::rotationChanged, this)),
_renderableArrow(*this),
_renderableBox(*this),
_renderableBox(localAABB(), worldAABB().getOrigin()),
_allow3Drotations(_spawnArgs.getKeyValue("editor_rotatable") == "1")
{}

Expand Down
36 changes: 25 additions & 11 deletions radiantcore/entity/speaker/SpeakerNode.cpp
Expand Up @@ -18,12 +18,11 @@ SpeakerNode::SpeakerNode(const IEntityClassPtr& eclass) :
EntityNode(eclass),
m_originKey(std::bind(&SpeakerNode::originChanged, this)),
m_origin(ORIGINKEY_IDENTITY),
_renderableBox(m_aabb_local, worldAABB().getOrigin()),
_renderableRadii(m_origin, _radiiTransformed),
m_useSpeakerRadii(true),
m_minIsSet(false),
m_maxIsSet(false),
m_aabb_solid(m_aabb_local),
m_aabb_wire(m_aabb_local),
_radiusMinObserver(std::bind(&SpeakerNode::sMinChanged, this, std::placeholders::_1)),
_radiusMaxObserver(std::bind(&SpeakerNode::sMaxChanged, this, std::placeholders::_1)),
_shaderObserver(std::bind(&SpeakerNode::sShaderChanged, this, std::placeholders::_1)),
Expand All @@ -35,12 +34,11 @@ SpeakerNode::SpeakerNode(const SpeakerNode& other) :
Snappable(other),
m_originKey(std::bind(&SpeakerNode::originChanged, this)),
m_origin(ORIGINKEY_IDENTITY),
_renderableBox(m_aabb_local, worldAABB().getOrigin()),
_renderableRadii(m_origin, _radiiTransformed),
m_useSpeakerRadii(true),
m_minIsSet(false),
m_maxIsSet(false),
m_aabb_solid(m_aabb_local),
m_aabb_wire(m_aabb_local),
_radiusMinObserver(std::bind(&SpeakerNode::sMinChanged, this, std::placeholders::_1)),
_radiusMaxObserver(std::bind(&SpeakerNode::sMaxChanged, this, std::placeholders::_1)),
_shaderObserver(std::bind(&SpeakerNode::sShaderChanged, this, std::placeholders::_1)),
Expand Down Expand Up @@ -161,14 +159,12 @@ void SpeakerNode::sMaxChanged(const std::string& value)
updateAABB();
}

// Snappable implementation
void SpeakerNode::snapto(float snap)
{
m_originKey.snap(snap);
m_originKey.write(_spawnArgs);
}

// Bounded implementation
const AABB& SpeakerNode::localAABB() const
{
return m_aabb_border;
Expand Down Expand Up @@ -242,15 +238,18 @@ scene::INodePtr SpeakerNode::clone() const
return node;
}

/* Renderable implementation */
void SpeakerNode::onPreRender(const VolumeTest& volume)
{
EntityNode::onPreRender(volume);

_renderableBox.update(getColourShader());
}

void SpeakerNode::renderSolid(IRenderableCollector& collector,
const VolumeTest& volume) const
{
EntityNode::renderSolid(collector, volume);

collector.addRenderable(*getFillShader(), m_aabb_solid, localToWorld());

// Submit the speaker radius if we are selected or the "show all speaker
// radii" option is set
if (isSelected() || EntitySettings::InstancePtr()->getShowAllSpeakerRadii())
Expand All @@ -263,8 +262,6 @@ void SpeakerNode::renderWireframe(IRenderableCollector& collector,
{
EntityNode::renderWireframe(collector, volume);

collector.addRenderable(*getWireShader(), m_aabb_wire, localToWorld());

// Submit the speaker radius if we are selected or the "show all speaker
// radii" option is set
if (isSelected() || EntitySettings::InstancePtr()->getShowAllSpeakerRadii())
Expand All @@ -273,6 +270,21 @@ void SpeakerNode::renderWireframe(IRenderableCollector& collector,
}
}

void SpeakerNode::renderHighlights(IRenderableCollector& collector, const VolumeTest& volume)
{
EntityNode::renderHighlights(collector, volume);

collector.addHighlightRenderable(_renderableBox, Matrix4::getIdentity());
}

void SpeakerNode::setRenderSystem(const RenderSystemPtr& renderSystem)
{
EntityNode::setRenderSystem(renderSystem);

// Clear the geometry from any previous shader
_renderableBox.clear();
}

void SpeakerNode::translate(const Vector3& translation)
{
m_origin += translation;
Expand All @@ -282,6 +294,8 @@ void SpeakerNode::updateTransform()
{
localToParent() = Matrix4::getTranslation(m_origin);
transformChanged();

_renderableBox.queueUpdate();
}

void SpeakerNode::updateAABB()
Expand Down
15 changes: 9 additions & 6 deletions radiantcore/entity/speaker/SpeakerNode.h
Expand Up @@ -14,6 +14,7 @@
#include "dragplanes.h"
#include "../target/TargetableNode.h"
#include "../EntityNode.h"
#include "../RenderableEntityBox.h"

namespace entity
{
Expand All @@ -22,7 +23,7 @@ class SpeakerNode;
typedef std::shared_ptr<SpeakerNode> SpeakerNodePtr;

/// Entity node representing a speaker
class SpeakerNode :
class SpeakerNode final :
public EntityNode,
public Snappable,
public PlaneSelectable,
Expand All @@ -40,6 +41,9 @@ class SpeakerNode :
// The default radii as defined on the currently active sound shader
SoundRadii _defaultRadii;

// The small entity box
RenderableEntityBox _renderableBox;

// Renderable speaker radii
RenderableSpeakerRadii _renderableRadii;

Expand All @@ -52,9 +56,6 @@ class SpeakerNode :
// the AABB that determines the rendering area
AABB m_aabb_border;

RenderableSolidAABB m_aabb_solid;
RenderableWireframeAABB m_aabb_wire;

KeyObserverDelegate _radiusMinObserver;
KeyObserverDelegate _radiusMaxObserver;
KeyObserverDelegate _shaderObserver;
Expand All @@ -66,7 +67,6 @@ class SpeakerNode :
SpeakerNode(const IEntityClassPtr& eclass);
SpeakerNode(const SpeakerNode& other);
void translate(const Vector3& translation);
void rotate(const Quaternion& rotation);
void revertTransform() override;
void freezeTransform() override;
void updateTransform();
Expand Down Expand Up @@ -111,8 +111,11 @@ class SpeakerNode :
scene::INodePtr clone() const override;

// Renderable implementation
void onPreRender(const VolumeTest& volume);
void renderSolid(IRenderableCollector& collector, const VolumeTest& volume) const override;
void renderWireframe(IRenderableCollector& collector, const VolumeTest& volume) const override;
void renderHighlights(IRenderableCollector& collector, const VolumeTest& volume);
void setRenderSystem(const RenderSystemPtr& renderSystem) override;

void selectedChangedComponent(const ISelectable& selectable);

Expand All @@ -132,4 +135,4 @@ class SpeakerNode :
void evaluateTransform();
};

} // namespace entity
} // namespace
18 changes: 3 additions & 15 deletions radiantcore/entity/speaker/SpeakerRenderables.cpp
Expand Up @@ -172,26 +172,14 @@ const AABB& RenderableSpeakerRadii::localAABB()
return m_aabb_local;
}

// Set min
/*void RenderableSpeakerRadii::setMin(float min, bool inMetres)
{
m_radii.setMin(min, inMetres);
}
// Set max
void RenderableSpeakerRadii::setMax(float max, bool inMetres)
{
m_radii.setMax(max, inMetres);
}*/

float RenderableSpeakerRadii::getMin()
float RenderableSpeakerRadii::getMin() const
{
return m_radii.getMin();
}

float RenderableSpeakerRadii::getMax()
float RenderableSpeakerRadii::getMax() const
{
return m_radii.getMax();
}

} // namespace entity
} // namespace
32 changes: 6 additions & 26 deletions radiantcore/entity/speaker/SpeakerRenderables.h
@@ -1,5 +1,4 @@
#ifndef SPEAKERRENDERABLES_H_
#define SPEAKERRENDERABLES_H_
#pragma once

#include "math/Vector3.h"
#include "math/Vector4.h"
Expand All @@ -9,13 +8,8 @@
#include "igl.h"
#include "isound.h"

// the drawing functions
void sphereDrawFill(const Vector3& origin, float radius, int sides);
void sphereDrawWire(const Vector3& origin, float radius, int sides);
void speakerDrawRadiiWire(const Vector3& origin, const float envelope[2]);
void speakerDrawRadiiFill(const Vector3& origin, const float envelope[2]);

namespace entity {
namespace entity
{

/**
* \brief
Expand Down Expand Up @@ -45,27 +39,13 @@ class RenderableSpeakerRadii
m_radii(radii)
{}

/**
* \brief
* Set the minimum radius to render.
*/
//void setMin(float min, bool inMetres = false);

/**
* \brief
* Set the maximum radius to render.
*/
//void setMax(float max, bool inMetres = false);

// Gets the minimum/maximum values to render
float getMin();
float getMax();
float getMin() const;
float getMax() const;

void render(const RenderInfo& info) const;
const AABB& localAABB();

}; // class RenderSpeakerRadii

} // namespace entity

#endif /*SPEAKERRENDERABLES_H_*/
} // namespace

0 comments on commit a585124

Please sign in to comment.