1 #include "medit.h"
2 #include "extern.h"
3 #include "sproto.h"
4 
5 
6 /* display cube */
updateCube(pCube cube,pMesh mesh)7 void updateCube(pCube cube,pMesh mesh) {
8   pScene      sc;
9   pTransform  cubetr,view;
10   GLfloat     inv[16],axis[4],trans[4];
11   int         idw;
12 
13   /* default */
14   if ( ddebug ) printf("updateCube\n");
15 
16   /* retrieve context */
17   idw    = currentScene();
18   sc     = cv.scene[idw];
19   view   = sc->view;
20   cubetr = cube->cubetr;
21 
22   /* compute cube transform */
23   if ( cube->active & C_EDIT ) {
24     invertMatrix(view->matrix,inv);
25     inv[3] = inv[7] = inv[11] = 0.0f;  inv[15] = 1.0;
26 
27     /* rotation cumulative */
28     if ( cubetr->angle != 0.0 ) {
29       transformVector(trans,cubetr->axis,inv);
30       glPushMatrix();
31       glLoadIdentity();
32       glRotatef(cubetr->angle,trans[0],trans[1],trans[2]);
33       glMultMatrixf(cubetr->rot);
34       glGetFloatv(GL_MODELVIEW_MATRIX,cubetr->rot);
35       glPopMatrix();
36     }
37 
38     /* translation cumulative */
39     axis[0] = cubetr->panx;
40     axis[1] = cubetr->pany;
41     axis[2] = 0.0;
42     axis[3] = 1.0;
43     transformVector(trans,axis,inv);
44 
45     cubetr->tra[12] = trans[0];
46     cubetr->tra[13] = trans[1];
47     cubetr->tra[14] = trans[2];
48 
49    /* final transformation */
50     glPushMatrix();
51     glLoadIdentity();
52     glMultMatrixf(cubetr->tra);
53     glMultMatrixf(cubetr->rot);
54     glGetFloatv(GL_MODELVIEW_MATRIX,cubetr->matrix);
55     glPopMatrix();
56   }
57   if ( !cubetr->manim ) {
58     cubetr->angle = 0.0;
59     cube->active ^= C_UPDATE;
60   }
61 }
62 
63 
dumpCube(pScene sc,pMesh mesh,pCube cube)64 void dumpCube(pScene sc,pMesh mesh,pCube cube) {
65   float  *tr,u[4];
66   double  v[4];
67   int     i;
68   FILE   *out;
69 
70   tr = cube->cubetr->matrix;
71 
72   out = fopen("tr.data","w");
73   for (i=0; i<4; i++)
74     fprintf(out,"%f %f %f %f\n",tr[i],tr[4+i],tr[8+i],tr[12+i]);
75 
76   u[0] = cube->cmi[0] - mesh->xtra;
77   u[1] = cube->cmi[1] - mesh->ytra;
78   u[2] = cube->cmi[2] - mesh->ztra;
79   u[3] = 1.0;
80   /*printf("avant %f %f %f %f\n",u[0],u[1],u[2],u[3]);*/
81   transformPoint2(v,u,tr);
82   fprintf(out,"\n%f %f %f   %f\n",
83           v[0]+mesh->xtra,v[1]+mesh->ytra,v[2]+mesh->ztra,v[3]);
84 
85   u[0] = cube->cma[0] - mesh->xtra;
86   u[1] = cube->cma[1] - mesh->ytra;
87   u[2] = cube->cma[2] - mesh->ztra;
88   /*printf("avant %f %f %f %f\n",u[0],u[1],u[2],u[3]);*/
89   transformPoint2(v,u,tr);
90   fprintf(out,"%f %f %f   %f\n",
91           v[0]+mesh->xtra,v[1]+mesh->ytra,v[2]+mesh->ztra,v[3]);
92 
93   fprintf(out,"\n%f %f %f\n",
94           cube->cubetr->tra[12],cube->cubetr->tra[13],cube->cubetr->tra[14]);
95 
96   fprintf(out,"%f   %f %f %f\n",
97     cube->cubetr->angle,cube->cubetr->axis[0],cube->cubetr->axis[1],
98     cube->cubetr->axis[2]);
99   fclose(out);
100 }
101 
102 
resetCube(pScene sc,pCube cube,pMesh mesh)103 void resetCube(pScene sc,pCube cube,pMesh mesh) {
104 
105   resetTransform(cube->cubetr);
106 
107   cube->active |= C_REDO;
108   cube->cmi[0]  = mesh->xmin;
109   cube->cmi[1]  = mesh->ymin;
110   cube->cmi[2]  = mesh->zmin;
111   cube->cma[0]  = mesh->xmax;
112   cube->cma[1]  = mesh->ymax;
113   cube->cma[2]  = mesh->zmax;
114 }
115 
116 
createCube(pScene sc,pMesh mesh)117 pCube createCube(pScene sc,pMesh mesh) {
118   pCube   cube;
119 
120   cube = (pCube)M_calloc(1,sizeof(struct cube),"cube");
121   assert(cube);
122 
123   cube->cubetr = (pTransform)M_calloc(1,sizeof(struct transform),"cube");
124   if ( !cube->cubetr )  return(0);
125 
126   resetCube(sc,cube,mesh);
127   return(cube);
128 }
129