1 // File: GLViewer_Grid.cxx
2 // Created: November, 2004
4 // Copyright (C) CEA 2004
6 //#include <GLViewerAfx.h>
7 #include "GLViewer_Grid.h"
8 #include "GLViewer_Defs.h"
10 #include <Precision.hxx>
13 GLViewer_Grid::GLViewer_Grid() :
14 myGridList( 0 ), myGridHeight( (GLfloat)0.0 ), myGridWidth( (GLfloat)0.0 ),
15 myWinW( (GLfloat)0.0 ), myWinH( (GLfloat)0.0 ), myXSize( (GLfloat)0.0 ), myYSize( (GLfloat)0.0 ),
16 myXPan( (GLfloat)0.0 ), myYPan( (GLfloat)0.0 ), myXScale( (GLfloat)1.0 ), myYScale( (GLfloat)1.0 ),
17 myLineWidth( (GLfloat)0.05 ), myCenterWidth( (GLfloat)1.5 ), myCenterRadius( (GLfloat)5.0 ),
18 myScaleFactor( 10 ), myIsUpdate( GL_FALSE )
23 myAxisColor[0] = 0.75;
24 myAxisColor[1] = 0.75;
25 myAxisColor[2] = 0.75;
28 GLViewer_Grid::GLViewer_Grid( GLfloat width, GLfloat height,
29 GLfloat winW, GLfloat winH,
30 GLfloat xSize, GLfloat ySize,
31 GLfloat xPan, GLfloat yPan,
32 GLfloat xScale, GLfloat yScale ) :
33 myGridList( 0 ), myGridHeight( (GLfloat)0.0 ), myGridWidth( (GLfloat)0.0 ),
34 myWinW( (GLfloat)0.0 ), myWinH( (GLfloat)0.0 ), myXSize( (GLfloat)0.0 ), myYSize( (GLfloat)0.0 ),
35 myXPan( (GLfloat)0.0 ), myYPan( (GLfloat)0.0 ), myXScale( (GLfloat)1.0 ), myYScale( (GLfloat)1.0 ),
36 myLineWidth( (GLfloat)0.05 ), myCenterWidth( (GLfloat)1.5 ), myCenterRadius( (GLfloat)5.0 ),
37 myScaleFactor( 10 ), myIsUpdate( GL_FALSE )
42 myAxisColor[0] = 0.75;
43 myAxisColor[1] = 0.75;
44 myAxisColor[2] = 0.75;
47 GLViewer_Grid::~GLViewer_Grid()
51 void GLViewer_Grid::draw()
53 if ( myGridList == 0 || myIsUpdate )
56 glCallList( myGridList );
59 void GLViewer_Grid::setGridColor( GLfloat r, GLfloat g, GLfloat b )
61 if( myGridColor[0] == r && myGridColor[1] == g && myGridColor[2] == b )
70 void GLViewer_Grid::setAxisColor( GLfloat r, GLfloat g, GLfloat b )
72 if( myAxisColor[0] == r && myAxisColor[1] == g && myAxisColor[2] == b )
81 void GLViewer_Grid::setGridWidth( float w )
83 if( myGridWidth == w )
90 void GLViewer_Grid::setCenterRadius( int r )
92 if( myCenterRadius == r )
99 void GLViewer_Grid::setSize( float xSize, float ySize )
101 if( myXSize == xSize && myYSize == ySize )
106 myIsUpdate = GL_TRUE;
109 void GLViewer_Grid::setPan( float xPan, float yPan )
111 if( myXPan == xPan && myYPan == yPan )
116 myIsUpdate = GL_TRUE;
119 bool GLViewer_Grid::setZoom( float zoom )
125 float bXScale = myXScale;
126 float bYScale = myYScale;
131 if( fabs(myXScale) < Precision::Confusion() || fabs(myYScale) < Precision::Confusion() )
139 myGridHeight /= zoom;
140 myIsUpdate = GL_TRUE;
144 void GLViewer_Grid::setResize( float WinW, float WinH, float zoom )
146 if( myWinW == WinW && myWinH == WinH && zoom == 1.0 )
149 myGridWidth = myGridWidth + ( WinW - myWinW ) * myXScale;
150 myGridHeight = myGridHeight + ( WinH - myWinH ) * myYScale;
154 myIsUpdate = GL_TRUE;
157 void GLViewer_Grid::getSize( float& xSize, float& ySize ) const
163 void GLViewer_Grid::getPan( float& xPan, float& yPan ) const
169 void GLViewer_Grid::getScale( float& xScale, float& yScale ) const
175 bool GLViewer_Grid::initList()
177 myIsUpdate = GL_FALSE;
179 if( myXSize == (GLfloat)0.0 )
180 myXSize = (GLfloat)0.1;
181 if( myYSize == (GLfloat)0.0 )
182 myYSize = (GLfloat)0.1;
185 if( ( myXSize >= myGridWidth/5 ) && ( myYSize >= myGridHeight/5 ) )
187 myXSize /= myScaleFactor;
188 myYSize /= myScaleFactor;
191 else if( ( myXSize * myScaleFactor < myGridWidth/5 )
192 || ( myYSize * myScaleFactor < myGridHeight/5 ) )
194 myXSize *= myScaleFactor;
195 myYSize *= myScaleFactor;
199 //int n = myGridWidth / myXSize;
200 //int m = myGridHeight / myYSize;
201 // do not initialise integer by float
202 //if( ( n != 0 ) || ( m != 0 ) )
203 if( ( myGridWidth > 0.5 * myXSize ) || ( myGridHeight > 0.5 * myYSize ) )
205 if ( myGridList != 0 )
207 glDeleteLists( myGridList, 1 );
208 if ( glGetError() != GL_NO_ERROR )
212 float xLoc = (int)(myXPan / myXSize) * myXSize;
213 float yLoc = (int)(myYPan / myYSize) * myYSize;
215 myGridList = glGenLists( 1 );
216 glNewList( myGridList, GL_COMPILE );
218 glColor3f( myGridColor[0], myGridColor[1], myGridColor[2] );
219 glLineWidth( myLineWidth );
222 for( int j = 0; ( j-1 ) * myXSize <= myGridWidth / 2 ; j++ )
224 glVertex2d( -myXSize * j - xLoc, -myGridHeight / 2 - myYSize - yLoc );
225 glVertex2d( -myXSize * j - xLoc, myGridHeight / 2 + myYSize - yLoc );
226 glVertex2d( myXSize * j - xLoc, -myGridHeight / 2 - myYSize - yLoc );
227 glVertex2d( myXSize * j - xLoc, myGridHeight / 2 + myYSize - yLoc );
229 for( int i = 0; ( i-1 ) * myYSize <= myGridHeight / 2 ; i++)
231 glVertex2d( -myGridWidth / 2 - myXSize - xLoc, -myYSize * i - yLoc );
232 glVertex2d( myGridWidth / 2 + myXSize - xLoc, -myYSize * i - yLoc );
233 glVertex2d( -myGridWidth / 2 - myXSize - xLoc, myYSize * i - yLoc );
234 glVertex2d( myGridWidth / 2 + myXSize - xLoc, myYSize * i - yLoc );
238 glColor3f( myAxisColor[0], myAxisColor[1], myAxisColor[2] );
239 glLineWidth( myCenterWidth );
242 glVertex2d( myGridWidth / 2 + myXSize - xLoc, 0);
243 glVertex2d( -myGridWidth / 2 - myXSize - xLoc, 0);
244 glVertex2d( 0, myGridHeight / 2 + myYSize - yLoc );
245 glVertex2d( 0, -myGridHeight / 2 - myYSize - yLoc );
248 glBegin( GL_LINE_LOOP );
250 for ( int k = 0; k < SEGMENTS; k++ )
252 glVertex2f( cos(angle) * myCenterRadius * myXScale,
253 sin(angle) * myCenterRadius * myYScale );