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;
3435using celestia::render::LineRenderer;
3536namespace gl = celestia::gl;
3637namespace 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
19664void
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
257126void
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 });
0 commit comments