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