#include #include #include #include #include #include /* pour M_PI */ #include #include /* ABD 29/10/04 Transform Persistence of Presentation( pan, zoom, rotate ) */ #include #include #include #include #include #include /* pour TsmGetWSAttri */ #include /* pour tel_view_data */ #include #include /*----------------------------------------------------------------------*/ /* * Type definitions */ typedef struct { TEL_VIEW_REP vrep; #ifdef CAL_100498 Tmatrix3 inverse_matrix;/* accelerates UVN2XYZ conversion */ #endif } TEL_VIEW_DATA, *tel_view_data; /* Internal data stored for every view rep */ static TStatus TransformPersistenceDisplay( TSM_ELEM_DATA, Tint, cmn_key* ); static TStatus TransformPersistenceAdd( TSM_ELEM_DATA, Tint, cmn_key* ); static TStatus TransformPersistenceDelete( TSM_ELEM_DATA, Tint, cmn_key* ); static TStatus TransformPersistencePrint( TSM_ELEM_DATA, Tint, cmn_key* ); static TStatus (*MtdTbl[])( TSM_ELEM_DATA, Tint, cmn_key* ) = { TransformPersistenceDisplay, /* PickTraverse */ TransformPersistenceDisplay, TransformPersistenceAdd, 0, /*TransformPersistenceDelete,*/ TransformPersistencePrint, 0 /* Inquire */ }; MtblPtr TelTransformPersistentInitClass( TelType *el ) { *el = TelTransformPersistence; return MtdTbl; } static TStatus TransformPersistenceAdd( TSM_ELEM_DATA d, Tint n, cmn_key *k ) { tel_transform_persistence data = new TEL_TRANSFORM_PERSISTENCE(); if( !data ) return TFailure; *data = *(tel_transform_persistence)(k[0]->data.pdata); ((tsm_elem_data)(d.pdata))->pdata = data; return TSuccess; } static TStatus TransformPersistenceDisplay( TSM_ELEM_DATA data, Tint n, cmn_key *k ) { CMN_KEY key; key.id = TelTransformPersistence; key.data.pdata = data.pdata; TsmSetAttri( 1, &key ); return TSuccess; } static TStatus TransformPersistenceDelete( TSM_ELEM_DATA data, Tint n, cmn_key *k ) { /* transform_persistence_end();*/ return TSuccess; } static TStatus TransformPersistencePrint( TSM_ELEM_DATA data, Tint n, cmn_key *k ) { return TSuccess; } /***********************************/ static int isGenerated = 0; void transform_persistence_end(void) { if( isGenerated == 1 ) /* restore matrix */ { glMatrixMode (GL_PROJECTION); glPopMatrix (); glMatrixMode (GL_MODELVIEW); glPopMatrix (); isGenerated = 0; } /*printf( "Transform Persistence End: %i \n", isGenerated );*/ } void transform_persistence_begin( int theFlag, float theX, float theY, float theZ ) { CMN_KEY_DATA key; tel_view_data vptr; int i, j; GLdouble modelMatrix[4][4]; GLdouble projMatrix[4][4]; GLdouble idenMatrix[4][4] = { {1.,0.,0.,0.}, {0.,1.,0.,0.}, {0.,0.,1.,0.},{0.,0.,0.,1.} }; GLint viewport[4]; double det2; double W, H, W1, W2, H1, H2; double winx, winy, winz; double scaleX, scaleY, scaleZ; #ifdef PRINT1 printf( "Transform Persistence Mode: %i\n", theFlag ); printf( "Transform Persistence PointX: %f\n", theX ); printf( "Transform Persistence PointY: %f\n", theY ); printf( "Transform Persistence PointZ: %f\n", theZ ); #endif /*PRINT1*/ if( theFlag == 0 ) { transform_persistence_end(); return; } glGetIntegerv (GL_VIEWPORT, viewport); glGetDoublev( GL_MODELVIEW_MATRIX, (GLdouble *) modelMatrix ); glGetDoublev( GL_PROJECTION_MATRIX, (GLdouble *) projMatrix ); W = viewport[2]; H = viewport[3]; if( isGenerated == 0 ) isGenerated = 1; else { /* restore matrix */ glMatrixMode (GL_PROJECTION); glPopMatrix (); glMatrixMode (GL_MODELVIEW); glPopMatrix (); } glMatrixMode( GL_MODELVIEW ); glPushMatrix(); glLoadIdentity(); glMatrixMode( GL_PROJECTION ); glPushMatrix(); glLoadIdentity(); /*pre loading matrix*/ if( theFlag & TPF_PAN ) /* Annulate translate matrix */ { modelMatrix[3][0] = 0.; modelMatrix[3][1] = 0.; modelMatrix[3][2] = 0.; projMatrix[3][0] = 0.; projMatrix[3][1] = 0.; projMatrix[3][2] = 0.; } if( theFlag & TPF_ZOOM ) /* Annulate zoom matrix */ { if( W > H ) det2 = 0.002 / projMatrix[1][1]; else det2 = 0.002 / projMatrix[0][0]; TsmGetWSAttri( TglActiveWs, WSViews, &key ); vptr = (tel_view_data)key.pdata ; /* Obtain defined view data*/ scaleX = vptr->vrep.extra.scaleFactors[0]; scaleY = vptr->vrep.extra.scaleFactors[1]; scaleZ = vptr->vrep.extra.scaleFactors[2]; for( i = 0; i < 3; i++ ) { for( j = 0; j < 3; j++ ) { if(i == 0) modelMatrix[i][j] /= scaleX; if(i == 1) modelMatrix[i][j] /= scaleY; if(i == 2) modelMatrix[i][j] /= scaleZ; } } for( i = 0 ; i < 2; i++ ) projMatrix[i][i] *= det2; } if( theFlag & TPF_ROTATE ) /* Annulate rotate matrix */ { modelMatrix[0][0] = 1.; modelMatrix[1][1] = 1.; modelMatrix[2][2] = 1.; modelMatrix[1][0] = 0.; modelMatrix[2][0] = 0.; modelMatrix[0][1] = 0.; modelMatrix[2][1] = 0.; modelMatrix[0][2] = 0.; modelMatrix[1][2] = 0.; } else if( theFlag & TPF_RELATIVE_ROTATE ) /* Initialize relative rotate matrix*/ { modelMatrix[3][0] = 0.; modelMatrix[3][1] = 0.; modelMatrix[3][2] = 0.; glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); glTranslated( theX, theY, theZ ); } if( theFlag == TPF_TRIEDRON ) { /* Annulate translation matrix */ modelMatrix[3][0] = 0.; modelMatrix[3][1] = 0.; modelMatrix[3][2] = 0.; projMatrix[3][0] = 0.; projMatrix[3][1] = 0.; projMatrix[3][2] = 0.; if( W > H ) det2 = 0.002 / projMatrix[1][1]; else det2 = 0.002 / projMatrix[0][0]; for( i = 0 ; i < 2; i++ ) projMatrix[i][i] *= det2; } /* load matrix */ glMatrixMode (GL_MODELVIEW); glMultMatrixd( (GLdouble *) modelMatrix); glMatrixMode ( GL_PROJECTION ); glMultMatrixd( (GLdouble *) projMatrix); /*post loading matrix*/ if( theFlag == TPF_TRIEDRON ) { glMatrixMode( GL_PROJECTION ); gluUnProject( W/2, H/2., 0, (GLdouble*)idenMatrix, (GLdouble*)projMatrix, (GLint*)viewport, &winx, &winy, &winz); W1 = winx; H1 = winy; gluUnProject( -W/2, -H/2., 0, (GLdouble*)idenMatrix, (GLdouble*)projMatrix, (GLint*)viewport, &winx, &winy, &winz); W2 = winx; H2 = winy; if( theX == 0. && theY == 0. ) { /*center*/ } else if( theX > 0. && theY > 0. ) { /*right upper*/ glTranslated( (W1 - W2)/2. - theZ/2., (H1-H2)/2. - theZ/2., 0. ); } else if( theX > 0. && theY < 0. ) { /*right lower*/ glTranslated( (W1 - W2)/2. - theZ/2., -(H1-H2)/2. + theZ/2., 0. ); } else if( theX < 0. && theY > 0. ) { /*left upper*/ glTranslated( -(W1 - W2)/2. + theZ/2., (H1-H2)/2. - theZ/2., 0. ); } else if( theX < 0 && theY < 0 ) { /*left lower*/ glTranslated( -(W1 - W2)/2. + theZ/2., -(H1-H2)/2. + theZ/2., 0. ); } } }