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