Skip to content

Commit

Permalink
#5584: Start migrating RenderableAasFile. Move RenderableBoundingBoxe…
Browse files Browse the repository at this point in the history
…s to render namespace.
  • Loading branch information
codereader committed Jan 24, 2022
1 parent 081e049 commit f6f67f1
Show file tree
Hide file tree
Showing 8 changed files with 185 additions and 83 deletions.
71 changes: 71 additions & 0 deletions libs/render/RenderableBoundingBoxes.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
#pragma once

#include <vector>
#include "math/Vector4.h"
#include "math/AABB.h"
#include "RenderableBox.h"
#include "RenderableGeometry.h"

namespace render
{

class RenderableBoundingBoxes :
public render::RenderableGeometry
{
private:
const std::vector<AABB>& _aabbs;
bool _needsUpdate;
Vector4 _colour;

public:
RenderableBoundingBoxes(const std::vector<AABB>& aabbs, const Vector4& colour = { 1,1,1,1 }) :
_aabbs(aabbs),
_needsUpdate(true),
_colour(colour)
{}

void queueUpdate()
{
_needsUpdate = true;
}

protected:
void updateGeometry() override
{
if (!_needsUpdate) return;

_needsUpdate = false;

std::vector<ArbitraryMeshVertex> vertices;
std::vector<unsigned int> indices;

static auto WireframeBoxIndices = render::detail::generateWireframeBoxIndices();

vertices.reserve(_aabbs.size() * 8); // 8 vertices per box
indices.reserve(WireframeBoxIndices.size() * _aabbs.size()); // indices per box * boxes

for (const auto& aabb : _aabbs)
{
// Calculate the corner vertices of this bounding box
Vector3 max(aabb.origin + aabb.extents);
Vector3 min(aabb.origin - aabb.extents);

auto boxVertices = render::detail::getWireframeBoxVertices(min, max, _colour);

auto indexOffset = static_cast<unsigned int>(vertices.size());

vertices.insert(vertices.begin(),
std::make_move_iterator(boxVertices.begin()),
std::make_move_iterator(boxVertices.end()));

for (auto index : WireframeBoxIndices)
{
indices.push_back(indexOffset + index);
}
}

RenderableGeometry::updateGeometry(render::GeometryType::Lines, vertices, indices);
}
};

}
5 changes: 5 additions & 0 deletions radiant/ui/aas/AasControl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ AasControl::~AasControl()
// Detach before destruction
if (_toggle->GetValue())
{
_renderable.clear();
GlobalRenderSystem().detachRenderable(_renderable);
}
}
Expand Down Expand Up @@ -91,11 +92,14 @@ void AasControl::onToggle(wxCommandEvent& ev)
if (_toggle->GetValue())
{
ensureAasFileLoaded();

_renderable.setAasFile(_aasFile);
GlobalRenderSystem().attachRenderable(_renderable);
}
else
{
// Disable rendering
_renderable.clear();
GlobalRenderSystem().detachRenderable(_renderable);
}

Expand All @@ -106,6 +110,7 @@ void AasControl::onRefresh(wxCommandEvent& ev)
{
// Detach renderable
_aasFile.reset();
_renderable.clear();

if (_toggle->GetValue())
{
Expand Down
112 changes: 92 additions & 20 deletions radiant/ui/aas/RenderableAasFile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,32 +12,82 @@ namespace map
RenderableAasFile::RenderableAasFile() :
_renderNumbers(registry::getValue<bool>(RKEY_SHOW_AAS_AREA_NUMBERS)),
_hideDistantAreas(registry::getValue<bool>(RKEY_HIDE_DISTANT_AAS_AREAS)),
_hideDistanceSquared(registry::getValue<float>(RKEY_AAS_AREA_HIDE_DISTANCE))
_hideDistanceSquared(registry::getValue<float>(RKEY_AAS_AREA_HIDE_DISTANCE)),
_renderableAreas(_visibleAreas, { 1,1,1,1 })
{
_hideDistanceSquared *= _hideDistanceSquared;

GlobalRegistry().signalForKey(RKEY_SHOW_AAS_AREA_NUMBERS).connect([this]()
{
_renderNumbers = registry::getValue<bool>(RKEY_SHOW_AAS_AREA_NUMBERS);
GlobalMainFrame().updateAllWindows();
});
GlobalRegistry().signalForKey(RKEY_SHOW_AAS_AREA_NUMBERS).connect(
sigc::mem_fun(*this, &RenderableAasFile::onShowAreaNumbersChanged));

GlobalRegistry().signalForKey(RKEY_HIDE_DISTANT_AAS_AREAS).connect([this]()
{
_hideDistantAreas = registry::getValue<bool>(RKEY_HIDE_DISTANT_AAS_AREAS);
_hideDistanceSquared = registry::getValue<float>(RKEY_AAS_AREA_HIDE_DISTANCE);
_hideDistanceSquared *= _hideDistanceSquared;
GlobalMainFrame().updateAllWindows();
});
GlobalRegistry().signalForKey(RKEY_HIDE_DISTANT_AAS_AREAS).connect(
sigc::mem_fun(*this, &RenderableAasFile::onHideDistantAreasChanged));
}

void RenderableAasFile::onShowAreaNumbersChanged()
{
_renderNumbers = registry::getValue<bool>(RKEY_SHOW_AAS_AREA_NUMBERS);
GlobalMainFrame().updateAllWindows();
}

void RenderableAasFile::onHideDistantAreasChanged()
{
_hideDistantAreas = registry::getValue<bool>(RKEY_HIDE_DISTANT_AAS_AREAS);
_hideDistanceSquared = registry::getValue<float>(RKEY_AAS_AREA_HIDE_DISTANCE);
_hideDistanceSquared *= _hideDistanceSquared;

if (!_hideDistantAreas)
{
_visibleAreas = _areas;
}

_renderableAreas.queueUpdate();
GlobalMainFrame().updateAllWindows();
}

void RenderableAasFile::setRenderSystem(const RenderSystemPtr& renderSystem)
void RenderableAasFile::onPreRender(const VolumeTest& volume)
{
_renderSystem = renderSystem;
if (!_aasFile || !volume.fill()) return; // only react to camera views

if (_hideDistantAreas)
{
// Get the camera position for distance clipping
auto invModelView = volume.GetModelview().getFullInverse();
auto viewPos = invModelView.tCol().getProjected();

_visibleAreas.clear();

for (const auto& area : _areas)
{
if (_hideDistantAreas && (area.getOrigin() - viewPos).getLengthSquared() > _hideDistanceSquared)
{
continue;
}

_visibleAreas.push_back(area);
}

_renderableAreas.queueUpdate();
}

auto renderSystem = GlobalMapModule().getRoot()->getRenderSystem();

if (!renderSystem)
{
return;
}

if (!_normalShader)
{
_normalShader = renderSystem->capture("$AAS_AREA");
}

_renderableAreas.update(_normalShader);
}

void RenderableAasFile::renderSolid(IRenderableCollector& collector, const VolumeTest& volume) const
{
#if 0
if (!_aasFile) return;

// Get the camera position for distance clipping
Expand All @@ -53,7 +103,7 @@ void RenderableAasFile::renderSolid(IRenderableCollector& collector, const Volum

collector.addRenderable(*_normalShader, aabb, Matrix4::getIdentity());
}

#endif
if (_renderNumbers)
{
collector.addRenderable(*_normalShader, *this, Matrix4::getIdentity());
Expand All @@ -72,7 +122,9 @@ std::size_t RenderableAasFile::getHighlightFlags()

void RenderableAasFile::setAasFile(const IAasFilePtr& aasFile)
{
_aasFile = aasFile;
clear();

_aasFile = aasFile;

prepare();
}
Expand All @@ -97,23 +149,43 @@ void RenderableAasFile::render(const RenderInfo& info) const

void RenderableAasFile::prepare()
{
if (!_aasFile) return;

_normalShader = GlobalRenderSystem().capture("$AAS_AREA");
if (!_aasFile)
{
clear();
return;
}

constructRenderables();
}

void RenderableAasFile::constructRenderables()
{
_renderableAabbs.clear();
_areas.clear();

for (std::size_t areaNum = 0; areaNum < _aasFile->getNumAreas(); ++areaNum)
{
const IAasFile::Area& area = _aasFile->getArea(static_cast<int>(areaNum));

_renderableAabbs.push_back(RenderableSolidAABB(area.bounds));
_areas.push_back(area.bounds);
}

if (!_hideDistantAreas)
{
_visibleAreas = _areas;
}

_renderableAreas.queueUpdate();
}

void RenderableAasFile::clear()
{
_aasFile.reset();
_renderableAreas.clear();
_areas.clear();
_visibleAreas.clear();
_normalShader.reset();
}

} // namespace
14 changes: 11 additions & 3 deletions radiant/ui/aas/RenderableAasFile.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include "iaasfile.h"

#include "entitylib.h"
#include "render/RenderableBoundingBoxes.h"

namespace map
{
Expand All @@ -24,22 +25,27 @@ class RenderableAasFile :
public sigc::trackable
{
private:
RenderSystemPtr _renderSystem;

IAasFilePtr _aasFile;

ShaderPtr _normalShader;

std::list<RenderableSolidAABB> _renderableAabbs;
std::vector<AABB> _areas;
std::vector<AABB> _visibleAreas;

bool _renderNumbers;
bool _hideDistantAreas;
float _hideDistanceSquared;

render::RenderableBoundingBoxes _renderableAreas;

public:
RenderableAasFile();

void setRenderSystem(const RenderSystemPtr& renderSystem) override;
void clear();

void setRenderSystem(const RenderSystemPtr& renderSystem) override {}
void onPreRender(const VolumeTest& volume) override;
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) override
Expand All @@ -54,6 +60,8 @@ class RenderableAasFile :
private:
void prepare();
void constructRenderables();
void onHideDistantAreasChanged();
void onShowAreaNumbersChanged();
};

} // namespace
3 changes: 2 additions & 1 deletion radiantcore/selection/manipulators/ModelScaleManipulator.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

#include "entitylib.h"
#include "Renderables.h"
#include "render/RenderableBoundingBoxes.h"

class Entity;

Expand All @@ -29,7 +30,7 @@ class ModelScaleManipulator final :
ShaderPtr _lineShader;

std::vector<AABB> _aabbs;
RenderableBoundingBoxes _renderableAABBs;
render::RenderableBoundingBoxes _renderableAABBs;
RenderableCornerPoints _renderableCornerPoints;

scene::INodePtr _curManipulatable;
Expand Down
59 changes: 0 additions & 59 deletions radiantcore/selection/manipulators/Renderables.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,65 +8,6 @@
namespace selection
{

class RenderableBoundingBoxes :
public render::RenderableGeometry
{
private:
const std::vector<AABB>& _aabbs;
bool _needsUpdate;
Vector4 _colour;

public:
RenderableBoundingBoxes(const std::vector<AABB>& aabbs, const Vector4& colour = { 1,1,1,1 }) :
_aabbs(aabbs),
_needsUpdate(true),
_colour(colour)
{}

void queueUpdate()
{
_needsUpdate = true;
}

protected:
void updateGeometry() override
{
if (!_needsUpdate) return;

_needsUpdate = false;

std::vector<ArbitraryMeshVertex> vertices;
std::vector<unsigned int> indices;

static auto WireframeBoxIndices = render::detail::generateWireframeBoxIndices();

vertices.reserve(_aabbs.size() * 8); // 8 vertices per box
indices.reserve(WireframeBoxIndices.size() * _aabbs.size()); // indices per box * boxes

for (const auto& aabb : _aabbs)
{
// Calculate the corner vertices of this bounding box
Vector3 max(aabb.origin + aabb.extents);
Vector3 min(aabb.origin - aabb.extents);

auto boxVertices = render::detail::getWireframeBoxVertices(min, max, _colour);

auto indexOffset = static_cast<unsigned int>(vertices.size());

vertices.insert(vertices.begin(),
std::make_move_iterator(boxVertices.begin()),
std::make_move_iterator(boxVertices.end()));

for (auto index : WireframeBoxIndices)
{
indices.push_back(indexOffset + index);
}
}

RenderableGeometry::updateGeometry(render::GeometryType::Lines, vertices, indices);
}
};

class RenderableCornerPoints :
public render::RenderableGeometry
{
Expand Down
Loading

0 comments on commit f6f67f1

Please sign in to comment.