/******************************Module*Header*******************************\ * Module Name: util.cxx * * Copyright (c) 1997 Microsoft Corporation * \**************************************************************************/ #include #include #include #include #include #include "mtk.hxx" #include "util.hxx" GLuint defaultQuad; // display list for quad // Local copies of tranf. matrices, for determing rect bounds static GLdouble modelMatrix[16]; static GLdouble projMatrix[16]; static GLint viewport[4]; /**************************************************************************\ * \**************************************************************************/ void UpdateLocalTransforms( int bits ) { // Get current transformation info if( bits & UPDATE_MODELVIEW_MATRIX_BIT ) glGetDoublev( GL_MODELVIEW_MATRIX, modelMatrix ); if( bits & UPDATE_PROJECTION_MATRIX_BIT ) glGetDoublev( GL_PROJECTION_MATRIX, projMatrix ); if( bits & UPDATE_VIEWPORT_BIT ) glGetIntegerv( GL_VIEWPORT, viewport ); } void TransformObjectToWindow( POINT3D *pIn, POINT3D *pOut, int nPts ) { DPOINT3D outD; for( ; nPts; nPts--, pIn++, pOut++ ) { gluProject( pIn->x, pIn->y, pIn->z, modelMatrix, projMatrix, viewport, &outD.x, &outD.y, &outD.z ); pOut->x = (float) outD.x; pOut->y = (float) outD.y; pOut->z = (float) outD.z; } } void TransformWindowToObject( POINT3D *pIn, POINT3D *pOut ) { DPOINT3D outD; gluUnProject( pIn->x, pIn->y, pIn->z, modelMatrix, projMatrix, viewport, &outD.x, &outD.y, &outD.z ); pOut->x = (float) outD.x; pOut->y = (float) outD.y; pOut->z = (float) outD.z; } void DrawRect( FSIZE *fSize ) { float w = fSize->width / 2.0f; float h = fSize->height / 2.0f; glNormal3f( 0.0f, 0.0f, 1.0f ); glBegin( GL_QUADS ); glTexCoord2f( 1.0f, 1.0f ); glVertex3f( w, h, 0.0f ); glTexCoord2f( 0.0f, 1.0f ); glVertex3f( -w, h, 0.0f ); glTexCoord2f( 0.0f, 0.0f ); glVertex3f( -w, -h, 0.0f ); glTexCoord2f( 1.0f, 0.0f ); glVertex3f( w, -h, 0.0f ); glEnd(); } void AddSwapHintRect( GLIRECT *pRect ) { glAddSwapHintRect( pRect->x, pRect->y, pRect->width, pRect->height ); } #define BloatRect( pRect, n ) \ pRect->x -= n; \ pRect->y -= n; \ pRect->width += (n << 2); \ pRect->height+= (n << 2); // Calculate the 2d view rect, using view parameters and window size. The // rect is in the z=0 plane. // Calculate the 2d window rect for each log object // !!! Assumes no rotation of the object !!! void CalcRect( POINT3D *pbl, POINT3D *ptr, GLIRECT *pRect ) { //mf: check for inclusive/exclusive and rounding problems // 1) truncate both pRect->x = (int) (pbl->x); pRect->y = (int) (pbl->y); pRect->width = ((int) (ptr->x )) - pRect->x + 1; pRect->height = ((int) (ptr->y )) - pRect->y + 1; //mf: while this works for polygons, it does not work for lines, since // the rasterization rules are different for lines. Lines can be off by // +1, so bloat the box by 1 on all sides. BloatRect( pRect, 1 ); } // Calcs window rects for the objects at REST (pObj->dest) void CalcMinMaxRect( POINT3D *pts, GLIRECT *pRect, int nPts ) { POINT2D min, max; // Use first point to init min,max min.x = max.x = pts->x; min.y = max.y = pts->y; nPts--; pts++; for( ; nPts; nPts--, pts++ ) { if( pts->x < min.x ) min.x = pts->x; if( pts->x > max.x ) max.x = pts->x; if( pts->y < min.y ) min.y = pts->y; if( pts->y > max.y ) max.y = pts->y; } pRect->x = (int) (min.x); pRect->y = (int) (min.y); pRect->width = ((int) max.x) - pRect->x + 1; pRect->height = ((int) max.y) - pRect->y + 1; BloatRect( pRect, 1 ); }