9 #include <argos3/core/simulator/entity/embodied_entity.h>
10 #include <argos3/core/utility/math/vector2.h>
11 #include <argos3/core/utility/math/vector3.h>
12 #include <argos3/plugins/simulator/entities/led_equipped_entity.h>
13 #include <argos3/plugins/simulator/visualizations/qt-opengl/qtopengl_widget.h>
23 static const Real LEG_HEIGHT = 0.166f;
24 static const Real LEG_WIDTH = 0.02f;
25 static const Real LEG_HALF_WIDTH = LEG_WIDTH * 0.5f;
26 static const Real LEG_DEPTH = 0.005f;
27 static const Real LEG_HALF_DEPTH = LEG_DEPTH * 0.5f;
30 static const Real RING_OUTER_RADIUS = 0.25f;
31 static const Real RING_INNER_RADIUS = 0.237f;
32 static const Real RING_HEIGHT = 0.015f;
33 static const Real RING_ELEVATION = LEG_HEIGHT - RING_HEIGHT;
36 static const Real LED_HEIGHT = 0.01f;
37 static const Real LED_SIDE = RING_HEIGHT;
38 static const Real LED_HALF_SIDE = LED_SIDE * 0.5f;
39 static const Real LED_SIDE_RING_ELEVATION = RING_ELEVATION + LED_HALF_SIDE;
40 static const Real LED_BOTTOM_RING_ELEVATION = RING_ELEVATION - LED_HEIGHT;
41 static const Real LED_BOTTOM_RING_DISTANCE = RING_OUTER_RADIUS - LEG_HALF_WIDTH;
44 static const Real ROD_SIDE = 0.07f;
45 static const Real ROD_HALF_SIDE = ROD_SIDE * 0.5f;
46 static const Real ROD_HEIGHT = 0.4f;
47 static const Real ROD_ELEVATION = LEG_HEIGHT;
54 m_fLEDAngleSlice(360.0f / 16.0f) {
56 m_unLists = glGenLists(4);
59 m_unLegList = m_unLists;
60 m_unBodyList = m_unLists + 1;
61 m_unSideLEDList = m_unLists + 2;
62 m_unBottomLEDList = m_unLists + 3;
65 glNewList(m_unLegList, GL_COMPILE);
70 glNewList(m_unBodyList, GL_COMPILE);
75 glNewList(m_unSideLEDList, GL_COMPILE);
80 glNewList(m_unBottomLEDList, GL_COMPILE);
89 glDeleteLists(m_unLists, 4);
99 glRotatef(45.0f, 0.0f, 0.0f, 1.0f);
100 glTranslatef(RING_OUTER_RADIUS, 0.0f, 0.0f);
101 glCallList(m_unLegList);
104 glRotatef(135.0f, 0.0f, 0.0f, 1.0f);
105 glTranslatef(RING_OUTER_RADIUS, 0.0f, 0.0f);
106 glCallList(m_unLegList);
109 glRotatef(225.0f, 0.0f, 0.0f, 1.0f);
110 glTranslatef(RING_OUTER_RADIUS, 0.0f, 0.0f);
111 glCallList(m_unLegList);
114 glRotatef(315.0f, 0.0f, 0.0f, 1.0f);
115 glTranslatef(RING_OUTER_RADIUS, 0.0f, 0.0f);
116 glCallList(m_unLegList);
119 glCallList(m_unBodyList);
123 glRotatef(m_fLEDAngleSlice * 0.5f, 0.0f, 0.0f, 1.0f);
129 glCallList(m_unSideLEDList);
133 glCallList(m_unBottomLEDList);
134 for(
UInt32 i = 1; i < 16; i++) {
135 glRotatef(m_fLEDAngleSlice, 0.0f, 0.0f, 1.0f);
141 glCallList(m_unSideLEDList);
145 glCallList(m_unBottomLEDList);
147 glRotatef(135.0f, 0.0f, 0.0f, 1.0f);
148 glTranslatef(-0.3*RING_OUTER_RADIUS, 0.0f, 0.0f);
153 glCallList(m_unBottomLEDList);
161 const GLfloat fEmissionFactor = 10.0f;
162 const GLfloat pfColor[] = { f_red, f_green, f_blue, 1.0f };
163 const GLfloat pfSpecular[] = { 0.0f, 0.0f, 0.0f, 1.0f };
164 const GLfloat pfShininess[] = { 0.0f };
165 const GLfloat pfEmission[] = { f_red * fEmissionFactor, f_green * fEmissionFactor, f_blue * fEmissionFactor, 1.0f };
166 glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, pfColor);
167 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, pfSpecular);
168 glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, pfShininess);
169 glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, pfEmission);
176 const GLfloat pfColor[] = { 0.25f, 0.25f, 0.25f, 1.0f };
177 const GLfloat pfSpecular[] = { 0.9f, 0.9f, 0.9f, 1.0f };
178 const GLfloat pfShininess[] = { 100.0f };
179 const GLfloat pfEmission[] = { 0.0f, 0.0f, 0.0f, 1.0f };
180 glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, pfColor);
181 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, pfSpecular);
182 glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, pfShininess);
183 glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, pfEmission);
192 glNormal3f(0.0f, 0.0f, 1.0f);
193 glVertex3f(-LEG_HALF_WIDTH, -LEG_HALF_DEPTH, LEG_HEIGHT);
194 glVertex3f( LEG_HALF_WIDTH, -LEG_HALF_DEPTH, LEG_HEIGHT);
195 glVertex3f( LEG_HALF_WIDTH, LEG_HALF_DEPTH, LEG_HEIGHT);
196 glVertex3f(-LEG_HALF_WIDTH, LEG_HALF_DEPTH, LEG_HEIGHT);
200 glNormal3f(0.0f, 0.0f, -1.0f);
201 glVertex3f(-LEG_HALF_WIDTH, -LEG_HALF_DEPTH, 0.0f);
202 glVertex3f(-LEG_HALF_WIDTH, LEG_HALF_DEPTH, 0.0f);
203 glVertex3f( LEG_HALF_WIDTH, LEG_HALF_DEPTH, 0.0f);
204 glVertex3f( LEG_HALF_WIDTH, -LEG_HALF_DEPTH, 0.0f);
207 glBegin(GL_QUAD_STRIP);
209 glNormal3f(0.0f, -1.0f, 0.0f);
210 glVertex3f(-LEG_HALF_WIDTH, -LEG_HALF_DEPTH, LEG_HEIGHT);
211 glVertex3f(-LEG_HALF_WIDTH, -LEG_HALF_DEPTH, 0.0f);
213 glVertex3f( LEG_HALF_WIDTH, -LEG_HALF_DEPTH, LEG_HEIGHT);
214 glVertex3f( LEG_HALF_WIDTH, -LEG_HALF_DEPTH, 0.0f);
216 glNormal3f(1.0f, 0.0f, 0.0f);
217 glVertex3f( LEG_HALF_WIDTH, LEG_HALF_DEPTH, LEG_HEIGHT);
218 glVertex3f( LEG_HALF_WIDTH, LEG_HALF_DEPTH, 0.0f);
220 glNormal3f(0.0f, 1.0f, 0.0f);
221 glVertex3f(-LEG_HALF_WIDTH, LEG_HALF_DEPTH, LEG_HEIGHT);
222 glVertex3f(-LEG_HALF_WIDTH, LEG_HALF_DEPTH, 0.0f);
224 glNormal3f(-1.0f, 0.0f, 0.0f);
225 glVertex3f(-LEG_HALF_WIDTH, -LEG_HALF_DEPTH, LEG_HEIGHT);
226 glVertex3f(-LEG_HALF_WIDTH, -LEG_HALF_DEPTH, 0.0f);
236 glBegin(GL_TRIANGLES);
238 glVertex3f(LED_HEIGHT + RING_OUTER_RADIUS, 0.0f, LED_SIDE_RING_ELEVATION );
239 glVertex3f( RING_OUTER_RADIUS, LED_HALF_SIDE, LED_SIDE_RING_ELEVATION + LED_HALF_SIDE);
240 glVertex3f( RING_OUTER_RADIUS, -LED_HALF_SIDE, LED_SIDE_RING_ELEVATION + LED_HALF_SIDE);
242 glVertex3f(LED_HEIGHT + RING_OUTER_RADIUS, 0.0f, LED_SIDE_RING_ELEVATION );
243 glVertex3f( RING_OUTER_RADIUS, -LED_HALF_SIDE, LED_SIDE_RING_ELEVATION - LED_HALF_SIDE);
244 glVertex3f( RING_OUTER_RADIUS, LED_HALF_SIDE, LED_SIDE_RING_ELEVATION - LED_HALF_SIDE);
246 glVertex3f(LED_HEIGHT + RING_OUTER_RADIUS, 0.0f, LED_SIDE_RING_ELEVATION );
247 glVertex3f( RING_OUTER_RADIUS, LED_HALF_SIDE, LED_SIDE_RING_ELEVATION - LED_HALF_SIDE);
248 glVertex3f( RING_OUTER_RADIUS, LED_HALF_SIDE, LED_SIDE_RING_ELEVATION + LED_HALF_SIDE);
250 glVertex3f(LED_HEIGHT + RING_OUTER_RADIUS, 0.0f, LED_SIDE_RING_ELEVATION );
251 glVertex3f( RING_OUTER_RADIUS, -LED_HALF_SIDE, LED_SIDE_RING_ELEVATION + LED_HALF_SIDE);
252 glVertex3f( RING_OUTER_RADIUS, -LED_HALF_SIDE, LED_SIDE_RING_ELEVATION - LED_HALF_SIDE);
262 glBegin(GL_TRIANGLES);
264 glVertex3f(LED_BOTTOM_RING_DISTANCE, 0.0f, LED_BOTTOM_RING_ELEVATION);
265 glVertex3f(RING_OUTER_RADIUS, LED_HALF_SIDE, RING_ELEVATION);
266 glVertex3f(RING_OUTER_RADIUS, -LED_HALF_SIDE, RING_ELEVATION);
268 glVertex3f(LED_BOTTOM_RING_DISTANCE, 0.0f, LED_BOTTOM_RING_ELEVATION);
269 glVertex3f(RING_OUTER_RADIUS - LED_SIDE, -LED_HALF_SIDE, RING_ELEVATION);
270 glVertex3f(RING_OUTER_RADIUS - LED_SIDE, LED_HALF_SIDE, RING_ELEVATION);
272 glVertex3f(LED_BOTTOM_RING_DISTANCE, 0.0f, LED_BOTTOM_RING_ELEVATION);
273 glVertex3f(RING_OUTER_RADIUS - LED_SIDE, LED_HALF_SIDE, RING_ELEVATION);
274 glVertex3f(RING_OUTER_RADIUS , LED_HALF_SIDE, RING_ELEVATION);
276 glVertex3f(LED_BOTTOM_RING_DISTANCE, 0.0f, LED_BOTTOM_RING_ELEVATION);
277 glVertex3f(RING_OUTER_RADIUS , -LED_HALF_SIDE, RING_ELEVATION);
278 glVertex3f(RING_OUTER_RADIUS - LED_SIDE, -LED_HALF_SIDE, RING_ELEVATION);
287 CVector2 cVertex(RING_OUTER_RADIUS, 0.0f);
291 glNormal3f(0.0f, 0.0f, -1.0f);
292 for(GLuint i = 0; i <= m_unVertices; i++) {
293 glVertex3f(cVertex.
GetX(), cVertex.
GetY(), RING_ELEVATION);
300 cVertex.
Set(RING_OUTER_RADIUS, 0.0f);
301 glBegin(GL_QUAD_STRIP);
302 for(GLuint i = 0; i <= m_unVertices; i++) {
303 glNormal3f(cNormal.
GetX(), cNormal.
GetY(), 0.0f);
304 glVertex3f(cVertex.
GetX(), cVertex.
GetY(), RING_ELEVATION + RING_HEIGHT);
305 glVertex3f(cVertex.
GetX(), cVertex.
GetY(), RING_ELEVATION);
312 glNormal3f(0.0f, 0.0f, 1.0f);
313 cVertex.
Set(RING_OUTER_RADIUS, 0.0f);
314 for(GLuint i = 0; i <= m_unVertices; i++) {
315 glVertex3f(cVertex.
GetX(), cVertex.
GetY(), RING_ELEVATION + RING_HEIGHT);
322 glNormal3f(0.0f, 0.0f, 1.0f);
323 glVertex3f(-ROD_HALF_SIDE, -ROD_HALF_SIDE, ROD_ELEVATION+ROD_HEIGHT);
324 glVertex3f( ROD_HALF_SIDE, -ROD_HALF_SIDE, ROD_ELEVATION+ROD_HEIGHT);
325 glVertex3f( ROD_HALF_SIDE, ROD_HALF_SIDE, ROD_ELEVATION+ROD_HEIGHT);
326 glVertex3f(-ROD_HALF_SIDE, ROD_HALF_SIDE, ROD_ELEVATION+ROD_HEIGHT);
329 glBegin(GL_QUAD_STRIP);
331 glNormal3f(0.0f, -1.0f, 0.0f);
332 glVertex3f(-ROD_HALF_SIDE, -ROD_HALF_SIDE, ROD_ELEVATION+ROD_HEIGHT);
333 glVertex3f(-ROD_HALF_SIDE, -ROD_HALF_SIDE, ROD_ELEVATION);
335 glVertex3f( ROD_HALF_SIDE, -ROD_HALF_SIDE, ROD_ELEVATION+ROD_HEIGHT);
336 glVertex3f( ROD_HALF_SIDE, -ROD_HALF_SIDE, ROD_ELEVATION);
338 glNormal3f(1.0f, 0.0f, 0.0f);
339 glVertex3f( ROD_HALF_SIDE, ROD_HALF_SIDE, ROD_ELEVATION+ROD_HEIGHT);
340 glVertex3f( ROD_HALF_SIDE, ROD_HALF_SIDE, ROD_ELEVATION);
342 glNormal3f(0.0f, 1.0f, 0.0f);
343 glVertex3f(-ROD_HALF_SIDE, ROD_HALF_SIDE, ROD_ELEVATION+ROD_HEIGHT);
344 glVertex3f(-ROD_HALF_SIDE, ROD_HALF_SIDE, ROD_ELEVATION);
346 glNormal3f(-1.0f, 0.0f, 0.0f);
347 glVertex3f(-ROD_HALF_SIDE, -ROD_HALF_SIDE, ROD_ELEVATION+ROD_HEIGHT);
348 glVertex3f(-ROD_HALF_SIDE, -ROD_HALF_SIDE, ROD_ELEVATION);
362 m_cModel.
Draw(c_entity);