1 #include "medit.h"
2 #include "extern.h"
3 #include "sproto.h"
4
5
drawRulers(pScene sc)6 void drawRulers(pScene sc) {
7 pMesh mesh = cv.mesh[sc->idmesh];
8
9 if ( ddebug ) printf("draw rulers\n");
10
11 glPushMatrix();
12 glTranslatef(-mesh->xtra,-mesh->ytra,-mesh->ztra);
13 glColor3fv(sc->par.line);
14 glEnable(GL_LINE_STIPPLE);
15 glLineStipple(1,0x0444);
16 glLineWidth(2.);
17 glBegin(GL_LINES);
18 glVertex3f(mesh->xmin,mesh->ymin,mesh->zmin);
19 glVertex3f(mesh->xmax,mesh->ymin,mesh->zmin);
20 glVertex3f(mesh->xmin,mesh->ymax,mesh->zmin);
21 glVertex3f(mesh->xmax,mesh->ymax,mesh->zmin);
22 glVertex3f(mesh->xmin,mesh->ymin,mesh->zmin);
23 glVertex3f(mesh->xmin,mesh->ymax,mesh->zmin);
24 glVertex3f(mesh->xmax,mesh->ymin,mesh->zmin);
25 glVertex3f(mesh->xmax,mesh->ymax,mesh->zmin);
26
27 glVertex3f(mesh->xmin,mesh->ymin,mesh->zmax);
28 glVertex3f(mesh->xmax,mesh->ymin,mesh->zmax);
29 glVertex3f(mesh->xmin,mesh->ymax,mesh->zmax);
30 glVertex3f(mesh->xmax,mesh->ymax,mesh->zmax);
31 glVertex3f(mesh->xmin,mesh->ymin,mesh->zmax);
32 glVertex3f(mesh->xmin,mesh->ymax,mesh->zmax);
33 glVertex3f(mesh->xmax,mesh->ymin,mesh->zmax);
34 glVertex3f(mesh->xmax,mesh->ymax,mesh->zmax);
35
36 glVertex3f(mesh->xmin,mesh->ymin,mesh->zmin);
37 glVertex3f(mesh->xmin,mesh->ymin,mesh->zmax);
38 glVertex3f(mesh->xmin,mesh->ymax,mesh->zmin);
39 glVertex3f(mesh->xmin,mesh->ymax,mesh->zmax);
40 glVertex3f(mesh->xmax,mesh->ymin,mesh->zmin);
41 glVertex3f(mesh->xmax,mesh->ymin,mesh->zmax);
42 glVertex3f(mesh->xmax,mesh->ymax,mesh->zmin);
43 glVertex3f(mesh->xmax,mesh->ymax,mesh->zmax);
44 glEnd();
45 glLineWidth(1.);
46 glDisable(GL_LINE_STIPPLE);
47 glPopMatrix();
48
49 }
50
drawAxis(pScene sc,int dim)51 void drawAxis(pScene sc,int dim) {
52 pMesh mesh;
53
54 /* default */
55 if ( ddebug ) printf("draw axis\n");
56 mesh = cv.mesh[sc->idmesh];
57
58 glPushMatrix();
59 glTranslatef(1.01*(mesh->xmin-mesh->xtra),
60 1.01*(mesh->ymin-mesh->ytra),
61 1.01*(mesh->zmin-mesh->ztra));
62 glScalef(0.6*sc->dmin,0.6*sc->dmin,0.6*sc->dmin);
63 glLineWidth(max(2,sc->par.linewidth));
64 glColor3f(1.0,0.,0.);
65 if ( mesh->dim == 2 ) {
66 glBegin(GL_LINE_STRIP);
67 glVertex2f(0.0, 0.0);
68 glVertex2f(1.0, 0.0);
69 glVertex2f(0.95, 0.01);
70 glVertex2f(0.95, -0.01);
71 glVertex2f(1.0, 0.0);
72 glEnd();
73 glBegin(GL_LINE_STRIP);
74 glVertex2f(0.0, 0.0);
75 glVertex2f(0.0, 1.0);
76 glVertex2f(-0.01, 0.95);
77 glVertex2f(0.01, 0.95);
78 glVertex2f(0.0, 1.0);
79 glEnd();
80
81 /*glColor3f(0.0f,1.0f,0.0f);*/
82 glColor3f(1.-sc->par.back[0],1.0-sc->par.back[1],1.0-sc->par.back[2]);
83 glRasterPos3f(1.02, 0.0, 0.0);
84 glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12,'x');
85 glRasterPos3f(0.0, 1.02, 0.0);
86 glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12,'y');
87 }
88 else {
89 glBegin(GL_LINE_STRIP);
90 glVertex3f(0.0, 0.0, 0.0);
91 glVertex3f(1.0, 0.0, 0.0);
92 glVertex3f(0.95, 0.01, 0.0);
93 glVertex3f(0.95, -0.01, 0.0);
94 glVertex3f(1.0, 0.0, 0.0);
95 glVertex3f(0.95, 0.0, 0.01);
96 glVertex3f(0.95, 0.0, -0.01);
97 glVertex3f(1.0, 0.0, 0.0);
98 glEnd();
99 glBegin(GL_LINE_STRIP);
100 glVertex3f(0.0, 0.0, 0.0);
101 glVertex3f(0.0, 1.0, 0.0);
102 glVertex3f(0.0, 0.95, 0.01);
103 glVertex3f(0.0, 0.95, -0.01);
104 glVertex3f(0.0, 1.0, 0.0);
105 glVertex3f(0.01, 0.95, 0.0);
106 glVertex3f(-0.01, 0.95, 0.0);
107 glVertex3f(0.0, 1.0, 0.0);
108 glEnd();
109 glBegin(GL_LINE_STRIP);
110 glVertex3f(0.0, 0.0, 0.0);
111 glVertex3f(0.0, 0.0, 1.0);
112 glVertex3f(0.01, 0.0, 0.95);
113 glVertex3f(-0.01, 0.0, 0.95);
114 glVertex3f(0.0, 0.0, 1.0);
115 glVertex3f(0.0, 0.01, 0.95);
116 glVertex3f(0.0, -0.01, 0.95);
117 glVertex3f(0.0, 0.0, 1.0);
118 glEnd();
119
120 /*glColor3f(0.0f,1.0f,0.0f);*/
121 glColor3f(1.-sc->par.back[0],1.0-sc->par.back[1],1.0-sc->par.back[2]);
122 glRasterPos3f(1.02, 0.0, 0.0);
123 glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12,'x');
124 glRasterPos3f(0.0, 1.02, 0.0);
125 glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12,'y');
126 glRasterPos3f(0.0, 0.0, 1.02);
127 glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12,'z');
128 }
129
130 glLineWidth(1.0);
131 glPopMatrix();
132 }
133
134
drawBox(pScene sc,pMesh mesh,int mode)135 void drawBox(pScene sc,pMesh mesh,int mode) {
136 pMaterial pm;
137 float cx,cy,cz;
138 int i,k,m;
139
140 glDisable(GL_LIGHTING);
141 glPushMatrix();
142 glScalef(1.01 * fabs(mesh->xmax-mesh->xmin),
143 1.01 * fabs(mesh->ymax-mesh->ymin),
144 1.01 * fabs(mesh->zmax-mesh->zmin));
145 glColor3f(1.0,0.0,0.5);
146 glutWireCube(1.0);
147 glPopMatrix();
148
149 /* one box per sub-domain */
150 if ( mode ) {
151 for (m=0; m<sc->par.nbmat; m++) {
152 pm = &sc->material[m];
153 for (i=0; i<MAX_LIST; i++) {
154 k = pm->depmat[i];
155 if ( !k || pm->flag ) continue;
156 cx = 0.5 * (pm->ext[3]+pm->ext[0]);
157 cy = 0.5 * (pm->ext[4]+pm->ext[1]);
158 cz = 0.5 * (pm->ext[5]+pm->ext[2]);
159 glPushMatrix();
160 glColor3fv(pm->dif);
161 glTranslatef(cx,cy,cz);
162 glScalef(pm->ext[3]-pm->ext[0],pm->ext[4]-pm->ext[1],
163 pm->ext[5]-pm->ext[2]);
164 glutWireCube(1.0);
165 glPopMatrix();
166 }
167 }
168 }
169 }
170
171
drawCube(pScene sc,pMesh mesh)172 void drawCube(pScene sc,pMesh mesh) {
173 pTransform cubetr;
174 pCube cube;
175 float x1,y1,z1,x2,y2,z2,xd,yd,zd;
176
177 cube = sc->cube;
178 cubetr = cube->cubetr;
179
180 if ( cube->active & C_UPDATE ) updateCube(cube,mesh);
181
182 glDisable(GL_LIGHTING);
183 glPushMatrix();
184 glMultMatrixf(cubetr->matrix);
185
186 glLineWidth(3.0);
187 if ( cube->active & C_EDIT ) glColor3f(1.0,0.0,1.0);
188 else if ( cube->active & C_FREEZE ) glColor3f(0.0,0.6,0.9);
189 else glColor3f(0.0,1.0,0.0);
190 x1 = cube->cmi[0] - mesh->xtra;
191 y1 = cube->cmi[1] - mesh->ytra;
192 z1 = cube->cmi[2] - mesh->ztra;
193 x2 = cube->cma[0] - mesh->xtra;
194 y2 = cube->cma[1] - mesh->ytra;
195 z2 = cube->cma[2] - mesh->ztra;
196 xd = cube->cma[0] - cube->cmi[0];
197 yd = cube->cma[1] - cube->cmi[1];
198 zd = cube->cma[2] - cube->cmi[2];
199
200 glBegin(GL_QUADS);
201 glVertex3f(x1,y1,z1);
202 glVertex3f(x1+xd,y1,z1);
203 glVertex3f(x1+xd,y1+yd,z1);
204 glVertex3f(x1,y1+yd,z1);
205
206 glVertex3f(x1,y1,z2);
207 glVertex3f(x1+xd,y1,z2);
208 glVertex3f(x1+xd,y1+yd,z2);
209 glVertex3f(x1,y1+yd,z2);
210 glEnd();
211 glBegin(GL_LINES);
212 glVertex3f(x1,y1,z1);
213 glVertex3f(x1,y1,z2);
214
215 glVertex3f(x1+xd,y1,z1);
216 glVertex3f(x1+xd,y1,z2);
217
218 glVertex3f(x1+xd,y1+yd,z1);
219 glVertex3f(x1+xd,y1+yd,z2);
220
221 glVertex3f(x1,y1+yd,z1);
222 glVertex3f(x1,y1+yd,z2);
223 glEnd();
224
225 glLineWidth(1.0);
226
227 glPopMatrix();
228 }
229
230
drawGrid(pScene sc,pMesh mesh)231 void drawGrid(pScene sc,pMesh mesh) {
232 int k;
233
234 /* default */
235 if ( ddebug ) printf("draw grid + graduation\n");
236
237 if ( !sc->grid ) {
238 sc->grid = glGenLists(1);
239 glNewList(sc->grid,GL_COMPILE);
240 glBegin(GL_LINES);
241 for (k=0; k<5; k++) {
242 glVertex3f(k*0.25,0.,0.); glVertex3f(k*0.25,1.,0.);
243 glVertex3f(0.,k*0.25,0.); glVertex3f(1.,k*0.25,0.);
244 glVertex3f(0.,k*0.25,0.); glVertex3f(0.,k*0.25,1.);
245 glVertex3f(0.,0.,k*0.25); glVertex3f(0.,1.,k*0.25);
246 glVertex3f(k*0.25,0.,0.); glVertex3f(k*0.25,0.,1.);
247 glVertex3f(0.,0.,k*0.25); glVertex3f(1.,0.,k*0.25);
248 }
249 glEnd();
250 glEndList();
251 }
252
253 /* call display list */
254 glPushMatrix();
255 glTranslatef(-0.3*fabs(sc->dmax),0.,-4.7*sc->dmax);
256 glRotatef(-60.,1.,0.,0.);
257 glRotatef(-120.,0.,0.,1.);
258 glScalef(2.5*sc->dmax,2.5*sc->dmax,2.5*sc->dmax);
259 glDisable(GL_LIGHTING);
260
261 glColor3f(0.4,0.4,0.4);
262 glCallList(sc->grid);
263
264 glColor3fv(sc->par.line);
265 output3(0.0,0.0,0.0,"%.2f",mesh->xmin);
266 output3(1.1,0.0,0.0,"%.2f",mesh->xmax);
267 output3(0.0,1.01,0.0,"%.2f",mesh->ymax);
268 output3(0.0,0.0,1.01,"%.2f",mesh->zmax);
269 glEnable(GL_LIGHTING);
270 glPopMatrix();
271 }
272
273
drawBase(pScene sc,pMesh mesh)274 void drawBase(pScene sc,pMesh mesh) {
275 int k;
276
277 /* default */
278 if ( ddebug ) printf("draw base\n");
279
280 if ( !sc->grid ) {
281 sc->grid = glGenLists(1);
282 glNewList(sc->grid,GL_COMPILE);
283 if ( glGetError() ) return;
284 glColor3f(0.5,0.5,0.5);
285 glLineWidth(2.0);
286 glBegin(GL_LINES);
287 for (k=0; k<21; k+=5) {
288 glVertex3f(k*0.05,0.,0.); glVertex3f(k*0.05,1.,0.);
289 glVertex3f(0.,k*0.05,0.); glVertex3f(1.,k*0.05,0.);
290 }
291 glEnd();
292 glColor3f(0.6,0.6,0.6);
293 glLineWidth(1.0);
294 glBegin(GL_LINES);
295 for (k=0; k<21; k++) {
296 if ( k%5 == 0 ) continue;
297 glVertex3f(k*0.05,0.,0.); glVertex3f(k*0.05,1.,0.);
298 glVertex3f(0.,k*0.05,0.); glVertex3f(1.,k*0.05,0.);
299 }
300 glEnd();
301 glEndList();
302 }
303
304 glPushMatrix();
305 glTranslatef(-1.5*sc->dmax,-1.5*sc->dmax,-0.5*(mesh->zmax-mesh->zmin));
306 glScalef(3*sc->dmax,3*sc->dmax,3*sc->dmax);
307 glDisable(GL_LIGHTING);
308 glCallList(sc->grid);
309 glPopMatrix();
310 }
311
312
313 /* draw HUD system for flight */
drawHUD(pScene sc)314 void drawHUD(pScene sc) {
315 pCamera c;
316 pMesh mesh;
317 GLfloat xm,ym,x,y,dx,dy,alt;
318 double azim,elev;
319 int i,j;
320
321 if ( ddebug ) fprintf(stdout,"drawHUD\n");
322 glDisable(GL_DEPTH_TEST);
323 glDisable(GL_LIGHTING);
324
325 glMatrixMode(GL_PROJECTION);
326 glPushMatrix();
327 glLoadIdentity();
328 gluOrtho2D(-0.5,639.5,-0.5,479.5);
329
330 c = sc->camera;
331 mesh = cv.mesh[sc->idmesh];
332 glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
333 glColor3f(0.0,0.5,0.0);
334 glLineWidth(1.0f);
335 xm = sc->par.xs / 2.0f;
336 ym = sc->par.ys / 2.0f;
337 glRecti(200,160,440,320);
338
339 /* altitude */
340 glColor3f(1.0,0.5,0.0);
341 output2(230,330,"speed: %6.1f",1000.0f*c->spmod/sc->dmax);
342
343 switch(c->vecup) {
344 case X_AXIS: alt = (c->eye[1]+mesh->xtra)/(mesh->xmax-mesh->xmin); break;
345 case Y_AXIS: alt = (c->eye[1]+mesh->ytra)/(mesh->ymax-mesh->ymin); break;
346 case Z_AXIS: alt = (c->eye[1]+mesh->ztra)/(mesh->zmax-mesh->zmin); break;
347 default: alt = 0.0; break;
348 }
349 glColor3f(1.0,0.5,0.0);
350 output2(350,330,"alt: %9.1f",1000.0f*alt);
351
352 /* horiz rulers */
353 output2(310,139.0f,"azim");
354 glColor3f(0.0,1.0,0.0);
355 output2(197,150,"-180");
356 output2(257,150," -90");
357 output2(317,150,"0");
358 output2(377,150," 90");
359 output2(437,150,"180");
360 x = 200.0f;
361 glBegin(GL_LINES);
362 for (i=1; i<8; i++) {
363 x += 240.0 / 8.0;
364 glVertex2f(x,158.0);
365 glVertex2f(x,162.0);
366 }
367 glEnd();
368
369 /* vert rulers */
370 glColor3f(0.0,1.0,0.0);
371 output2(185,160,"-90");
372 output2(185,200,"-45");
373 output2(185,240,"0");
374 output2(185,280,"45");
375 output2(185,320,"90");
376 y = 160.0f;
377 glBegin(GL_LINES);
378 for (i=1; i<8; i++) {
379 y += 160.0 / 8.0;
380 glVertex2f(198,y);
381 glVertex2f(202,y);
382 }
383 glEnd();
384
385 /* azimuth */
386 azim = Azimuth(c);
387 if ( azim > 0.0f ) azim = 180.0f - azim;
388 else if ( azim < 0.0f ) azim = -180.0f - azim;
389 x = 2.0/3.0*azim + 320.0f;
390 glColor3f(1.0,0.0,0.0);
391 glLineWidth(1.0);
392 output2(x,143.0,"%d",azim>0 ? (int)(azim+0.5) : (int)(azim-0.5));
393 glBegin(GL_LINES);
394 glVertex2f(x,166.0);
395 glVertex2f(x,318.0);
396 glEnd();
397 y = 160.0f;
398 dy = 160.0 / 8.0;
399 glBegin(GL_LINES);
400 for (i=0; i<8; i++) {
401 glVertex2f(x-4,y);
402 glVertex2f(x+4,y);
403 for (j=0; j<5; j++) {
404 glVertex2f(x-2,y+j*dy/5.0);
405 glVertex2f(x+2,y+j*dy/5.0);
406 }
407 y += dy;
408 }
409 glEnd();
410
411 /* elevation */
412 elev = Elevation(c);
413 if ( elev > 90.0f ) y = 320.0f;
414 else if ( elev < -90.0f ) y = 160.0f;
415 else y = 8.0/9.0 * elev + 240.0;
416 glColor3f(1.0,0.0,0.0);
417 output2(175.0,y,"%5.1f",elev);
418 glBegin(GL_LINES);
419 glVertex2f(206.0,y);
420 glVertex2f(438.0,y);
421 glEnd();
422 x = 200.0f;
423 dx = 240.0f / 8.0f;
424 glBegin(GL_LINES);
425 for (i=1; i<=8; i++) {
426 glVertex2f(x,y-4);
427 glVertex2f(x,y+4);
428 for (j=0; j<5; j++) {
429 glVertex2f(x+j*dx/5.0,y-2);
430 glVertex2f(x+j*dx/5.0,y+2);
431 }
432 x += dx;
433 }
434 glEnd();
435
436 /* horizon */
437 glLineWidth(2.0f);
438 glColor3f(0.0,0.0,1.0);
439 glBegin(GL_LINES);
440 glVertex2f(200.0,240.0);
441 glVertex2f(440.0,240.0);
442 glEnd();
443 glLineWidth(1.0f);
444
445 /* HUD */
446 glColor3f(1.0,0.0,0.0);
447 glBegin(GL_LINES);
448 glVertex2f(310,230);
449 glVertex2f(330,230);
450 glVertex2f(310,250);
451 glVertex2f(330,250);
452
453 glVertex2f(310,230);
454 glVertex2f(310,234);
455 glVertex2f(330,230);
456 glVertex2f(330,234);
457
458 glVertex2f(310,246);
459 glVertex2f(310,250);
460 glVertex2f(330,246);
461 glVertex2f(330,250);
462 glEnd();
463 /*glRecti(318,238,322,242);*/
464 glColor3f(0.0,1.0,0.0);
465 glLineWidth(3.0f);
466 glBegin(GL_LINES);
467 glVertex2f(320.,235.);
468 glVertex2f(320.,245.);
469 glVertex2f(315.,240.);
470 glVertex2f(325.,240.);
471 glEnd();
472 glLineWidth(1.0f);
473
474 glMatrixMode(GL_PROJECTION);
475 glPopMatrix();
476 glMatrixMode(GL_MODELVIEW);
477 glEnable(GL_DEPTH_TEST);
478 }
479