7fd59977 |
1 | |
2 | #include <OpenGl_transform_persistence.hxx> |
3 | |
4 | #include <OpenGl_tgl_all.hxx> |
5 | |
6 | #include <stddef.h> |
7 | #include <stdio.h> |
8 | #include <stdlib.h> |
9 | #include <math.h> /* pour M_PI */ |
10 | |
11 | #include <GL/gl.h> |
12 | #include <GL/glu.h> |
13 | |
14 | /* ABD 29/10/04 Transform Persistence of Presentation( pan, zoom, rotate ) */ |
15 | |
16 | #include <OpenGl_cmn_varargs.hxx> |
17 | #include <OpenGl_telem_attri.hxx> |
18 | #include <OpenGl_tsm.hxx> |
19 | #include <OpenGl_telem.hxx> |
20 | #include <OpenGl_telem_inquire.hxx> |
21 | #include <OpenGl_tsm_ws.hxx> /* pour TsmGetWSAttri */ |
22 | #include <OpenGl_telem_view.hxx> /* pour tel_view_data */ |
23 | |
24 | |
25 | #include <OpenGl_tgl_funcs.hxx> |
26 | |
27 | #include <OpenGl_Memory.hxx> |
28 | |
29 | |
30 | /*----------------------------------------------------------------------*/ |
31 | /* |
32 | * Type definitions |
33 | */ |
34 | |
35 | typedef struct |
36 | { |
37 | TEL_VIEW_REP vrep; |
38 | #ifdef CAL_100498 |
39 | Tmatrix3 inverse_matrix;/* accelerates UVN2XYZ conversion */ |
40 | #endif |
41 | } TEL_VIEW_DATA, *tel_view_data; /* Internal data stored for every view rep */ |
42 | |
43 | |
44 | |
45 | static TStatus TransformPersistenceDisplay( TSM_ELEM_DATA, Tint, cmn_key* ); |
46 | static TStatus TransformPersistenceAdd( TSM_ELEM_DATA, Tint, cmn_key* ); |
47 | static TStatus TransformPersistenceDelete( TSM_ELEM_DATA, Tint, cmn_key* ); |
48 | static TStatus TransformPersistencePrint( TSM_ELEM_DATA, Tint, cmn_key* ); |
49 | |
50 | static TStatus (*MtdTbl[])( TSM_ELEM_DATA, Tint, cmn_key* ) = |
51 | { |
52 | TransformPersistenceDisplay, /* PickTraverse */ |
53 | TransformPersistenceDisplay, |
54 | TransformPersistenceAdd, |
55 | 0, /*TransformPersistenceDelete,*/ |
56 | TransformPersistencePrint, |
57 | 0 /* Inquire */ |
58 | }; |
59 | |
60 | |
61 | MtblPtr |
62 | TelTransformPersistentInitClass( TelType *el ) |
63 | { |
64 | *el = TelTransformPersistence; |
65 | return MtdTbl; |
66 | } |
67 | |
68 | static TStatus |
69 | TransformPersistenceAdd( TSM_ELEM_DATA d, Tint n, cmn_key *k ) |
70 | { |
71 | tel_transform_persistence data = new TEL_TRANSFORM_PERSISTENCE(); |
72 | |
73 | if( !data ) |
74 | return TFailure; |
75 | |
76 | *data = *(tel_transform_persistence)(k[0]->data.pdata); |
77 | |
78 | ((tsm_elem_data)(d.pdata))->pdata = data; |
79 | |
80 | return TSuccess; |
81 | } |
82 | |
83 | |
84 | static TStatus |
85 | TransformPersistenceDisplay( TSM_ELEM_DATA data, Tint n, cmn_key *k ) |
86 | { |
87 | CMN_KEY key; |
88 | |
89 | key.id = TelTransformPersistence; |
90 | key.data.pdata = data.pdata; |
91 | TsmSetAttri( 1, &key ); |
92 | return TSuccess; |
93 | } |
94 | |
95 | static TStatus |
96 | TransformPersistenceDelete( TSM_ELEM_DATA data, Tint n, cmn_key *k ) |
97 | { |
98 | /* transform_persistence_end();*/ |
99 | return TSuccess; |
100 | } |
101 | |
102 | |
103 | static TStatus |
104 | TransformPersistencePrint( TSM_ELEM_DATA data, Tint n, cmn_key *k ) |
105 | { |
106 | |
107 | return TSuccess; |
108 | } |
109 | |
110 | /***********************************/ |
111 | static int isGenerated = 0; |
112 | |
113 | void transform_persistence_end(void) |
114 | { |
115 | if( isGenerated == 1 ) |
116 | /* restore matrix */ |
117 | { |
118 | glMatrixMode (GL_PROJECTION); |
119 | glPopMatrix (); |
120 | glMatrixMode (GL_MODELVIEW); |
121 | glPopMatrix (); |
122 | isGenerated = 0; |
123 | } |
124 | |
125 | /*printf( "Transform Persistence End: %i \n", isGenerated );*/ |
126 | } |
127 | |
128 | |
129 | void transform_persistence_begin( int theFlag, |
130 | float theX, |
131 | float theY, |
132 | float theZ ) |
133 | { |
134 | CMN_KEY_DATA key; |
135 | tel_view_data vptr; |
136 | int i, j; |
137 | GLdouble modelMatrix[4][4]; |
138 | GLdouble projMatrix[4][4]; |
139 | GLdouble idenMatrix[4][4] = { {1.,0.,0.,0.}, {0.,1.,0.,0.}, {0.,0.,1.,0.},{0.,0.,0.,1.} }; |
140 | GLint viewport[4]; |
141 | double det2; |
142 | |
143 | double W, H, W1, W2, H1, H2; |
144 | double winx, winy, winz; |
145 | double scaleX, scaleY, scaleZ; |
146 | |
147 | #ifdef PRINT1 |
148 | printf( "Transform Persistence Mode: %i\n", theFlag ); |
149 | printf( "Transform Persistence PointX: %f\n", theX ); |
150 | printf( "Transform Persistence PointY: %f\n", theY ); |
151 | printf( "Transform Persistence PointZ: %f\n", theZ ); |
152 | #endif /*PRINT1*/ |
153 | |
154 | if( theFlag == 0 ) |
155 | { |
156 | transform_persistence_end(); |
157 | return; |
158 | } |
159 | |
160 | glGetIntegerv (GL_VIEWPORT, viewport); |
161 | glGetDoublev( GL_MODELVIEW_MATRIX, (GLdouble *) modelMatrix ); |
162 | glGetDoublev( GL_PROJECTION_MATRIX, (GLdouble *) projMatrix ); |
163 | |
164 | W = viewport[2]; |
165 | H = viewport[3]; |
166 | |
167 | if( isGenerated == 0 ) |
168 | isGenerated = 1; |
169 | else |
170 | { |
171 | /* restore matrix */ |
172 | glMatrixMode (GL_PROJECTION); |
173 | glPopMatrix (); |
174 | glMatrixMode (GL_MODELVIEW); |
175 | glPopMatrix (); |
176 | } |
177 | |
178 | glMatrixMode( GL_MODELVIEW ); |
179 | glPushMatrix(); |
180 | glLoadIdentity(); |
181 | |
182 | glMatrixMode( GL_PROJECTION ); |
183 | glPushMatrix(); |
184 | glLoadIdentity(); |
185 | |
186 | /*pre loading matrix*/ |
187 | if( theFlag & TPF_PAN ) |
188 | /* Annulate translate matrix */ |
189 | { |
190 | modelMatrix[3][0] = 0.; |
191 | modelMatrix[3][1] = 0.; |
192 | modelMatrix[3][2] = 0.; |
193 | projMatrix[3][0] = 0.; |
194 | projMatrix[3][1] = 0.; |
195 | projMatrix[3][2] = 0.; |
196 | } |
197 | |
198 | if( theFlag & TPF_ZOOM ) |
199 | /* Annulate zoom matrix */ |
200 | { |
201 | if( W > H ) |
202 | det2 = 0.002 / projMatrix[1][1]; |
203 | else |
204 | det2 = 0.002 / projMatrix[0][0]; |
205 | |
206 | TsmGetWSAttri( TglActiveWs, WSViews, &key ); |
207 | vptr = (tel_view_data)key.pdata ; /* Obtain defined view data*/ |
208 | scaleX = vptr->vrep.extra.scaleFactors[0]; |
209 | scaleY = vptr->vrep.extra.scaleFactors[1]; |
210 | scaleZ = vptr->vrep.extra.scaleFactors[2]; |
211 | |
212 | for( i = 0; i < 3; i++ ) |
213 | { |
214 | for( j = 0; j < 3; j++ ) |
215 | { |
216 | if(i == 0) |
217 | modelMatrix[i][j] /= scaleX; |
218 | if(i == 1) |
219 | modelMatrix[i][j] /= scaleY; |
220 | if(i == 2) |
221 | modelMatrix[i][j] /= scaleZ; |
222 | } |
223 | } |
224 | for( i = 0 ; i < 2; i++ ) |
225 | projMatrix[i][i] *= det2; |
226 | } |
227 | |
228 | if( theFlag & TPF_ROTATE ) |
229 | /* Annulate rotate matrix */ |
230 | { |
231 | modelMatrix[0][0] = 1.; |
232 | modelMatrix[1][1] = 1.; |
233 | modelMatrix[2][2] = 1.; |
234 | |
235 | modelMatrix[1][0] = 0.; |
236 | modelMatrix[2][0] = 0.; |
237 | modelMatrix[0][1] = 0.; |
238 | modelMatrix[2][1] = 0.; |
239 | modelMatrix[0][2] = 0.; |
240 | modelMatrix[1][2] = 0.; |
241 | } |
242 | else if( theFlag & TPF_RELATIVE_ROTATE ) |
243 | /* Initialize relative rotate matrix*/ |
244 | { |
245 | modelMatrix[3][0] = 0.; |
246 | modelMatrix[3][1] = 0.; |
247 | modelMatrix[3][2] = 0.; |
248 | |
249 | glMatrixMode( GL_MODELVIEW ); |
250 | glLoadIdentity(); |
251 | glTranslated( theX, theY, theZ ); |
252 | } |
253 | |
254 | if( theFlag == TPF_TRIEDRON ) |
255 | { |
256 | /* Annulate translation matrix */ |
257 | modelMatrix[3][0] = 0.; |
258 | modelMatrix[3][1] = 0.; |
259 | modelMatrix[3][2] = 0.; |
260 | |
261 | projMatrix[3][0] = 0.; |
262 | projMatrix[3][1] = 0.; |
263 | projMatrix[3][2] = 0.; |
264 | |
265 | if( W > H ) |
266 | det2 = 0.002 / projMatrix[1][1]; |
267 | else |
268 | det2 = 0.002 / projMatrix[0][0]; |
269 | |
270 | for( i = 0 ; i < 2; i++ ) |
271 | projMatrix[i][i] *= det2; |
272 | } |
273 | |
274 | /* load matrix */ |
275 | glMatrixMode (GL_MODELVIEW); |
276 | glMultMatrixd( (GLdouble *) modelMatrix); |
277 | |
278 | glMatrixMode ( GL_PROJECTION ); |
279 | glMultMatrixd( (GLdouble *) projMatrix); |
280 | |
281 | |
282 | /*post loading matrix*/ |
283 | if( theFlag == TPF_TRIEDRON ) |
284 | { |
285 | glMatrixMode( GL_PROJECTION ); |
286 | |
287 | gluUnProject( W/2, H/2., 0, (GLdouble*)idenMatrix, (GLdouble*)projMatrix, (GLint*)viewport, &winx, &winy, &winz); |
288 | W1 = winx; |
289 | H1 = winy; |
290 | gluUnProject( -W/2, -H/2., 0, (GLdouble*)idenMatrix, (GLdouble*)projMatrix, (GLint*)viewport, &winx, &winy, &winz); |
291 | W2 = winx; |
292 | H2 = winy; |
293 | |
294 | if( theX == 0. && theY == 0. ) |
295 | { |
296 | /*center*/ |
297 | } |
298 | else if( theX > 0. && theY > 0. ) |
299 | { |
300 | /*right upper*/ |
301 | glTranslated( (W1 - W2)/2. - theZ/2., (H1-H2)/2. - theZ/2., 0. ); |
302 | } |
303 | else if( theX > 0. && theY < 0. ) |
304 | { |
305 | /*right lower*/ |
306 | glTranslated( (W1 - W2)/2. - theZ/2., -(H1-H2)/2. + theZ/2., 0. ); |
307 | } |
308 | else if( theX < 0. && theY > 0. ) |
309 | { |
310 | /*left upper*/ |
311 | glTranslated( -(W1 - W2)/2. + theZ/2., (H1-H2)/2. - theZ/2., 0. ); |
312 | } |
313 | else if( theX < 0 && theY < 0 ) |
314 | { |
315 | /*left lower*/ |
316 | glTranslated( -(W1 - W2)/2. + theZ/2., -(H1-H2)/2. + theZ/2., 0. ); |
317 | } |
318 | } |
319 | } |