/
RenderableAasFile.cpp
119 lines (93 loc) · 3.01 KB
/
RenderableAasFile.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include "RenderableAasFile.h"
#include "iregistry.h"
#include "ui/imainframe.h"
#include "ivolumetest.h"
#include "registry/registry.h"
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 *= _hideDistanceSquared;
GlobalRegistry().signalForKey(RKEY_SHOW_AAS_AREA_NUMBERS).connect([this]()
{
_renderNumbers = registry::getValue<bool>(RKEY_SHOW_AAS_AREA_NUMBERS);
GlobalMainFrame().updateAllWindows();
});
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();
});
}
void RenderableAasFile::setRenderSystem(const RenderSystemPtr& renderSystem)
{
_renderSystem = renderSystem;
}
void RenderableAasFile::renderSolid(IRenderableCollector& collector, const VolumeTest& volume) const
{
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());
}
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()
{
return Highlight::NoHighlight;
}
void RenderableAasFile::setAasFile(const IAasFilePtr& aasFile)
{
_aasFile = 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) return;
_normalShader = GlobalRenderSystem().capture("$AAS_AREA");
constructRenderables();
}
void RenderableAasFile::constructRenderables()
{
_renderableAabbs.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));
}
}
} // namespace