Skip to content

Commit

Permalink
#5584: AAS area numbers are rendered through RenderableText instances…
Browse files Browse the repository at this point in the history
… now.
  • Loading branch information
codereader committed Jan 24, 2022
1 parent f6f67f1 commit 8e7f007
Show file tree
Hide file tree
Showing 5 changed files with 66 additions and 62 deletions.
22 changes: 19 additions & 3 deletions libs/render/RenderableText.h
Expand Up @@ -21,11 +21,15 @@ class RenderableText :
ITextRenderer::Ptr _renderer;
ITextRenderer::Slot _slot;

bool _visible;

public:
RenderableText(const Vector4& colour = { 0,0,0,1 }) :
RenderableText(const std::string& text = "", const Vector4& colour = {0,0,0,1}) :
_worldPosition(0,0,0),
_colour(colour),
_slot(ITextRenderer::InvalidSlot)
_text(text),
_slot(ITextRenderer::InvalidSlot),
_visible(true)
{}

// Noncopyable
Expand All @@ -37,6 +41,11 @@ class RenderableText :
clear();
}

void setVisible(bool isVisible)
{
_visible = isVisible;
}

void update(const ITextRenderer::Ptr& renderer)
{
bool rendererChanged = _renderer != renderer;
Expand Down Expand Up @@ -73,7 +82,9 @@ class RenderableText :

const std::string& getText() override
{
return _text;
// Return an empty text if this renderable is invisible
static std::string EmptyText;
return _visible ? _text : EmptyText;
}

void setText(const std::string& text)
Expand All @@ -86,6 +97,11 @@ class RenderableText :
return _colour;
}

void setColour(const Vector4& colour)
{
_colour = colour;
}

private:
// Removes the text from the attached renderer. Does nothing if no text has been added.
void removeTextFromRenderer()
Expand Down
96 changes: 41 additions & 55 deletions radiant/ui/aas/RenderableAasFile.cpp
Expand Up @@ -49,6 +49,23 @@ void RenderableAasFile::onPreRender(const VolumeTest& volume)
{
if (!_aasFile || !volume.fill()) return; // only react to camera views

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

if (!renderSystem)
{
return;
}

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

if (!_textRenderer)
{
_textRenderer = renderSystem->captureTextRenderer(IGLFont::Style::Sans, 14);
}

if (_hideDistantAreas)
{
// Get the camera position for distance clipping
Expand All @@ -59,61 +76,40 @@ void RenderableAasFile::onPreRender(const VolumeTest& volume)

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

_visibleAreas.push_back(area);
}

for (auto& [areaNum, text] : _renderableNumbers)
{
text.setVisible(_renderNumbers &&
(_aasFile->getArea(areaNum).center - viewPos).getLengthSquared() <= _hideDistanceSquared);
text.update(_textRenderer);
}

_renderableAreas.queueUpdate();
}

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

if (!renderSystem)
else
{
return;
}

if (!_normalShader)
{
_normalShader = renderSystem->capture("$AAS_AREA");
for (auto& [_, text] : _renderableNumbers)
{
text.setVisible(_renderNumbers);
text.update(_textRenderer);
}
}

_renderableAreas.update(_normalShader);
}

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

// Get the camera position for distance clipping
Matrix4 invModelView = volume.GetModelview().getFullInverse();
Vector3 viewPos = invModelView.tCol().getProjected();

for (const RenderableSolidAABB& aabb : _renderableAabbs)
{
if (_hideDistantAreas && (aabb.getAABB().getOrigin() - viewPos).getLengthSquared() > _hideDistanceSquared)
{
continue;
}

collector.addRenderable(*_normalShader, aabb, Matrix4::getIdentity());
}
#endif
if (_renderNumbers)
{
collector.addRenderable(*_normalShader, *this, Matrix4::getIdentity());
}
}
{}

void RenderableAasFile::renderWireframe(IRenderableCollector& collector, const VolumeTest& volume) const
{
// Do nothing in wireframe mode
}
{}

std::size_t RenderableAasFile::getHighlightFlags()
{
Expand All @@ -129,24 +125,6 @@ void RenderableAasFile::setAasFile(const IAasFilePtr& aasFile)
prepare();
}

void RenderableAasFile::render(const RenderInfo& info) const
{
// draw label
// Render the area numbers
for (std::size_t areaNum = 0; areaNum < _aasFile->getNumAreas(); ++areaNum)
{
const IAasFile::Area& area = _aasFile->getArea(static_cast<int>(areaNum));

if (_hideDistantAreas && (area.center - info.getViewerLocation()).getLengthSquared() > _hideDistanceSquared)
{
continue;
}

glRasterPos3dv(area.center);
GlobalOpenGL().drawString(string::to_string(areaNum));
}
}

void RenderableAasFile::prepare()
{
if (!_aasFile)
Expand All @@ -162,13 +140,19 @@ void RenderableAasFile::constructRenderables()
{
_renderableAabbs.clear();
_areas.clear();
_renderableNumbers.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);

// Allocate a new RenderableNumber for eeach area
auto& text = _renderableNumbers.emplace(areaNum, string::to_string(areaNum)).first->second;
text.setWorldPosition(area.center);
text.setColour({ 1,1,1,1 });
}

if (!_hideDistantAreas)
Expand All @@ -185,7 +169,9 @@ void RenderableAasFile::clear()
_renderableAreas.clear();
_areas.clear();
_visibleAreas.clear();
_renderableNumbers.clear();
_normalShader.reset();
_textRenderer.reset();
}

} // namespace
6 changes: 3 additions & 3 deletions radiant/ui/aas/RenderableAasFile.h
Expand Up @@ -9,6 +9,7 @@

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

namespace map
{
Expand All @@ -21,13 +22,13 @@ const char* const RKEY_AAS_AREA_HIDE_DISTANCE = "user/ui/aasViewer/hideDistance"
// optionally showing the area numbers too
class RenderableAasFile :
public Renderable,
public OpenGLRenderable,
public sigc::trackable
{
private:
IAasFilePtr _aasFile;

ShaderPtr _normalShader;
ITextRenderer::Ptr _textRenderer;

std::list<RenderableSolidAABB> _renderableAabbs;
std::vector<AABB> _areas;
Expand All @@ -38,6 +39,7 @@ class RenderableAasFile :
float _hideDistanceSquared;

render::RenderableBoundingBoxes _renderableAreas;
std::map<int, render::RenderableText> _renderableNumbers;

public:
RenderableAasFile();
Expand All @@ -55,8 +57,6 @@ class RenderableAasFile :

void setAasFile(const IAasFilePtr& aasFile);

void render(const RenderInfo& info) const override;

private:
void prepare();
void constructRenderables();
Expand Down
2 changes: 2 additions & 0 deletions radiantcore/rendersystem/OpenGLRenderSystem.cpp
Expand Up @@ -238,6 +238,8 @@ void OpenGLRenderSystem::render(RenderViewType renderViewType,
}

// Render all text
glDisable(GL_DEPTH_TEST);

for (const auto& [_, textRenderer] : _textRenderers)
{
textRenderer->render();
Expand Down
2 changes: 1 addition & 1 deletion radiantcore/selection/manipulators/RotateManipulator.cpp
Expand Up @@ -29,7 +29,7 @@ RotateManipulator::RotateManipulator(ManipulationPivot& pivot, std::size_t segme
_circleScreen(CircleSegments, CircleRadius * 1.15, _pivot2World._viewpointSpace),
_circleSphere(CircleSegments, CircleRadius, _pivot2World._viewpointSpace),
_pivotPoint(_localPivotPoint, _pivot2World._worldSpace),
_angleText(AngleTextColour)
_angleText("", AngleTextColour)
{}

void RotateManipulator::updateColours()
Expand Down

0 comments on commit 8e7f007

Please sign in to comment.