Skip to content

Commit 21e6e9a

Browse files
committed
Move reference mark OpenGL objects to renderer class
1 parent 3fcafd6 commit 21e6e9a

File tree

13 files changed

+372
-231
lines changed

13 files changed

+372
-231
lines changed

src/celengine/axisarrow.cpp

Lines changed: 16 additions & 145 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include <celmath/mathlib.h>
1919
#include <celmath/vecgl.h>
2020
#include <celrender/linerenderer.h>
21+
#include <celrender/referencemarkrenderer.h>
2122
#include <celrender/gl/buffer.h>
2223
#include <celrender/gl/vertexobject.h>
2324
#include "axisarrow.h"
@@ -34,140 +35,7 @@ using namespace std::string_view_literals;
3435
using celestia::render::LineRenderer;
3536
namespace gl = celestia::gl;
3637
namespace math = celestia::math;
37-
38-
namespace
39-
{
40-
41-
constexpr float shaftLength = 0.85f;
42-
constexpr float headLength = 0.10f;
43-
constexpr float shaftRadius = 0.010f;
44-
constexpr float headRadius = 0.025f;
45-
constexpr unsigned int nSections = 30;
46-
47-
std::vector<Eigen::Vector3f>
48-
GetArrowVertices()
49-
{
50-
constexpr unsigned int totalVertices = nSections * 3U + 3U;
51-
52-
std::vector<Eigen::Vector3f> vertices;
53-
vertices.reserve(totalVertices);
54-
vertices.emplace_back(Eigen::Vector3f::Zero());
55-
vertices.emplace_back(0.0f, 0.0f, shaftLength);
56-
vertices.emplace_back(0.0f, 0.0f, shaftLength + headLength);
57-
58-
for (unsigned int i = 0U; i < nSections; ++i)
59-
{
60-
float s;
61-
float c;
62-
math::sincos((static_cast<float>(i) * 2.0f * celestia::numbers::pi_v<float>) / nSections, s, c);
63-
64-
vertices.emplace_back(shaftRadius * s, shaftRadius * c, 0.0f);
65-
vertices.emplace_back(shaftRadius * s, shaftRadius * c, shaftLength);
66-
vertices.emplace_back(headRadius * s, headRadius * c, shaftLength);
67-
}
68-
69-
return vertices;
70-
}
71-
72-
std::vector<GLushort>
73-
GetArrowIndices()
74-
{
75-
constexpr unsigned int circleSize = (nSections + 1U) * 3U;
76-
constexpr unsigned int shaftSize = 3U + nSections * 6U;
77-
constexpr unsigned int annulusSize = (nSections + 1U) * 3U;
78-
constexpr unsigned int headSize = (nSections + 1U) * 3U;
79-
80-
constexpr unsigned int totalSize = circleSize + shaftSize + annulusSize + headSize;
81-
82-
std::vector<GLushort> indices(totalSize, GLushort(0));
83-
84-
GLushort* const circle = indices.data();
85-
GLushort* const shaft = circle + circleSize;
86-
GLushort* const annulus = shaft + shaftSize;
87-
GLushort* const head = annulus + annulusSize;
88-
89-
GLushort* circlePtr = circle;
90-
GLushort* shaftPtr = shaft;
91-
GLushort* annulusPtr = annulus;
92-
GLushort* headPtr = head;
93-
94-
constexpr GLushort vZero = 0;
95-
constexpr GLushort v3 = 1;
96-
constexpr GLushort v4 = 2;
97-
for (unsigned int i = 0U; i <= nSections; ++i)
98-
{
99-
unsigned int idx = i < nSections ? i : 0;
100-
auto v0 = static_cast<GLushort>(3U + idx * 3U);
101-
auto v1 = static_cast<GLushort>(v0 + 1U);
102-
auto v2 = static_cast<GLushort>(v0 + 2U);
103-
104-
// Circle at bottom
105-
if (i > 0)
106-
*(circlePtr++) = v0;
107-
*(circlePtr++) = vZero;
108-
*(circlePtr++) = v1;
109-
110-
// Shaft
111-
if (i > 0)
112-
{
113-
*(shaftPtr++) = v0; // left triangle
114-
115-
*(shaftPtr++) = v0; // right
116-
*(shaftPtr++) = static_cast<GLushort>(idx * 3U + 1U) ; // v1Prev
117-
*(shaftPtr++) = v1;
118-
}
119-
*(shaftPtr++) = v0; // left
120-
*(shaftPtr++) = v1;
121-
122-
// Annulus
123-
if (i > 0)
124-
*(annulusPtr++) = v2;
125-
*(annulusPtr++) = v2;
126-
*(annulusPtr++) = v3;
127-
128-
// Head
129-
if (i > 0)
130-
*(headPtr++) = v2;
131-
*(headPtr++) = v4;
132-
*(headPtr++) = v2;
133-
}
134-
135-
*circlePtr = circle[1];
136-
*shaftPtr = shaft[0];
137-
*annulusPtr = annulus[1];
138-
*headPtr = head[1];
139-
140-
return indices;
141-
}
142-
143-
gl::VertexObject&
144-
GetArrowVAO()
145-
{
146-
static gl::VertexObject* vo = nullptr;
147-
148-
if (vo)
149-
return *vo;
150-
151-
vo = std::make_unique<gl::VertexObject>().release();
152-
153-
auto vertices = GetArrowVertices();
154-
auto indices = GetArrowIndices();
155-
156-
static gl::Buffer* vertexBuffer = std::make_unique<gl::Buffer>(gl::Buffer::TargetHint::Array).release();
157-
vertexBuffer->setData(vertices, gl::Buffer::BufferUsage::StaticDraw);
158-
159-
vo->addVertexBuffer(*vertexBuffer,
160-
CelestiaGLProgram::VertexCoordAttributeIndex,
161-
3,
162-
gl::VertexObject::DataType::Float);
163-
gl::Buffer indexBuffer(gl::Buffer::TargetHint::ElementArray, indices);
164-
vo->setCount(static_cast<int>(indices.size()));
165-
vo->setIndexBuffer(std::move(indexBuffer), 0, gl::VertexObject::IndexType::UnsignedShort);
166-
167-
return *vo;
168-
}
169-
170-
} // anonymous namespace
38+
namespace render = celestia::render;
17139

17240
/****** ArrowReferenceMark base class ******/
17341

@@ -194,7 +62,7 @@ ArrowReferenceMark::setColor(const Color &_color)
19462

19563

19664
void
197-
ArrowReferenceMark::render(Renderer* renderer,
65+
ArrowReferenceMark::render(render::ReferenceMarkRenderer* refMarkRenderer,
19866
const Eigen::Vector3f& position,
19967
float /* discSize */,
20068
double tdb,
@@ -215,12 +83,13 @@ ArrowReferenceMark::render(Renderer* renderer,
21583
ps.depthTest = true;
21684
ps.depthMask = true;
21785

218-
renderer->setPipelineState(ps);
86+
refMarkRenderer->renderer().setPipelineState(ps);
21987

22088
Eigen::Affine3f transform = Eigen::Translation3f(position) * q.cast<float>() * Eigen::Scaling(size);
22189
Eigen::Matrix4f mv = (*m.modelview) * transform.matrix();
22290

223-
CelestiaGLProgram* prog = renderer->getShaderManager().getShader(shadprop);
91+
render::ArrowRenderer& arrowRenderer = refMarkRenderer->arrowRenderer();
92+
CelestiaGLProgram* prog = arrowRenderer.program();
22493
if (prog == nullptr)
22594
return;
22695
prog->use();
@@ -229,7 +98,7 @@ ArrowReferenceMark::render(Renderer* renderer,
22998
glVertexAttrib4f(CelestiaGLProgram::ColorAttributeIndex,
23099
color.red(), color.green(), color.blue(), 1.0f);
231100

232-
GetArrowVAO().draw();
101+
arrowRenderer.vertexObject()->draw();
233102
}
234103

235104

@@ -255,7 +124,7 @@ AxesReferenceMark::setOpacity(float _opacity)
255124
}
256125

257126
void
258-
AxesReferenceMark::render(Renderer* renderer,
127+
AxesReferenceMark::render(render::ReferenceMarkRenderer* refMarkRenderer,
259128
const Eigen::Vector3f& position,
260129
float /* discSize */,
261130
double tdb,
@@ -274,15 +143,16 @@ AxesReferenceMark::render(Renderer* renderer,
274143
ps.blending = true;
275144
ps.blendFunc = {GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA};
276145
}
277-
renderer->setPipelineState(ps);
146+
refMarkRenderer->renderer().setPipelineState(ps);
278147

279148
Eigen::Affine3f transform = Eigen::Translation3f(position) * q.cast<float>() * Eigen::Scaling(size);
280149
Eigen::Matrix4f projection = *m.projection;
281150
Eigen::Matrix4f modelView = (*m.modelview) * transform.matrix();
282151

283152
float labelScale = 0.1f;
284153

285-
CelestiaGLProgram* prog = renderer->getShaderManager().getShader(shadprop);
154+
render::ArrowRenderer& arrowRenderer = refMarkRenderer->arrowRenderer();
155+
CelestiaGLProgram* prog = arrowRenderer.program();
286156
if (prog == nullptr)
287157
return;
288158
prog->use();
@@ -294,21 +164,22 @@ AxesReferenceMark::render(Renderer* renderer,
294164
Eigen::Matrix4f xModelView = modelView * math::YRot90Matrix<float>;
295165
glVertexAttrib4f(CelestiaGLProgram::ColorAttributeIndex, 1.0f, 0.0f, 0.0f, opacity);
296166
prog->setMVPMatrices(projection, xModelView);
297-
GetArrowVAO().draw();
167+
arrowRenderer.vertexObject()->draw();
298168

299169
// y-axis
300170
Eigen::Matrix4f yModelView = modelView * math::YRot180Matrix<float>;
301171
glVertexAttrib4f(CelestiaGLProgram::ColorAttributeIndex, 0.0f, 1.0f, 0.0f, opacity);
302172
prog->setMVPMatrices(projection, yModelView);
303-
GetArrowVAO().draw();
173+
arrowRenderer.vertexObject()->draw();
304174

305175
// z-axis
306176
Eigen::Matrix4f zModelView = modelView * math::XRot270Matrix<float>;
307177
glVertexAttrib4f(CelestiaGLProgram::ColorAttributeIndex, 0.0f, 0.0f, 1.0f, opacity);
308178
prog->setMVPMatrices(projection, zModelView);
309-
GetArrowVAO().draw();
179+
arrowRenderer.vertexObject()->draw();
310180

311-
LineRenderer lr(*renderer);
181+
LineRenderer& lr = arrowRenderer.lineRenderer();
182+
lr.clear();
312183
lr.startUpdate();
313184
// X
314185
lr.addSegment({0.0f, 0.0f, 0.0f}, {1.0f, 0.0f, 1.0f});

src/celengine/axisarrow.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@
2323

2424
class Body;
2525

26+
namespace celestia::render
27+
{
28+
class ReferenceMarkRenderer;
29+
}
30+
2631
class ArrowReferenceMark : public ReferenceMark
2732
{
2833
public:
@@ -31,7 +36,7 @@ class ArrowReferenceMark : public ReferenceMark
3136
void setSize(float _size);
3237
void setColor(const Color& _color);
3338

34-
void render(Renderer* renderer,
39+
void render(celestia::render::ReferenceMarkRenderer* refMarkRenderer,
3540
const Eigen::Vector3f& position,
3641
float discSize,
3742
double tdb,
@@ -60,7 +65,7 @@ class AxesReferenceMark : public ReferenceMark
6065
void setSize(float _size);
6166
void setOpacity(float _opacity);
6267

63-
void render(Renderer* renderer,
68+
void render(celestia::render::ReferenceMarkRenderer* refMarkRenderer,
6469
const Eigen::Vector3f& position,
6570
float discSize,
6671
double tdb,

0 commit comments

Comments
 (0)