Salome HOME
remove compilation warnings
[modules/gui.git] / src / GLViewer / GLViewer_Grid.cxx
1 // File:      GLViewer_Grid.cxx
2 // Created:   November, 2004
3 // Author:    OCC team
4 // Copyright (C) CEA 2004
5
6 //#include <GLViewerAfx.h>
7 #include "GLViewer_Grid.h"
8 #include "GLViewer_Defs.h"
9
10 #include <Precision.hxx>
11 #include <qglobal.h>
12
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 )
19 {
20   myGridColor[0] = 0.5;
21   myGridColor[1] = 0.5;
22   myGridColor[2] = 0.5;
23   myAxisColor[0] = 0.75;
24   myAxisColor[1] = 0.75;
25   myAxisColor[2] = 0.75;
26 }
27
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 )
38 {
39   myGridColor[0] = 0.5;
40   myGridColor[1] = 0.5;
41   myGridColor[2] = 0.5;
42   myAxisColor[0] = 0.75;
43   myAxisColor[1] = 0.75;
44   myAxisColor[2] = 0.75;
45 }
46
47 GLViewer_Grid::~GLViewer_Grid()
48 {
49 }
50
51 void GLViewer_Grid::draw()
52 {
53   if ( myGridList == 0 || myIsUpdate )
54     initList();
55
56   glCallList( myGridList );
57 }
58
59 void GLViewer_Grid::setGridColor( GLfloat r, GLfloat g, GLfloat b )
60 {
61   if( myGridColor[0] == r && myGridColor[1] == g && myGridColor[2] == b )
62     return;
63
64   myGridColor[0] = r;
65   myGridColor[1] = g;
66   myGridColor[2] = b;
67   myIsUpdate = GL_TRUE;
68 }
69
70 void GLViewer_Grid::setAxisColor( GLfloat r, GLfloat g, GLfloat b )
71 {
72   if( myAxisColor[0] == r && myAxisColor[1] == g && myAxisColor[2] == b )
73     return;
74
75   myAxisColor[0] = r;
76   myAxisColor[1] = g;
77   myAxisColor[2] = b;
78   myIsUpdate = GL_TRUE;
79 }
80
81 void GLViewer_Grid::setGridWidth( float w )
82 {
83   if( myGridWidth == w )
84     return;
85
86   myGridWidth = w;
87   myIsUpdate = GL_TRUE;
88 }
89
90 void GLViewer_Grid::setCenterRadius( int r )
91 {
92   if( myCenterRadius == r )
93     return;
94
95   myCenterRadius = r;
96   myIsUpdate = GL_TRUE;
97 }
98
99 void GLViewer_Grid::setSize( float xSize, float ySize )
100 {
101   if( myXSize == xSize && myYSize == ySize )
102     return;
103   
104   myXSize = xSize;
105   myYSize = ySize;
106   myIsUpdate = GL_TRUE;
107 }
108
109 void GLViewer_Grid::setPan( float xPan, float yPan )
110 {
111   if( myXPan == xPan && myYPan == yPan )
112     return;
113  
114   myXPan = xPan;
115   myYPan = yPan;
116   myIsUpdate = GL_TRUE; 
117 }
118
119 bool GLViewer_Grid::setZoom( float zoom )
120 {
121   if( zoom == 1.0 )
122     return true;
123   
124   //backup values
125   float bXScale = myXScale;
126   float bYScale = myYScale;
127
128   myXScale /= zoom; 
129   myYScale /= zoom;
130
131   if( fabs(myXScale) < Precision::Confusion() || fabs(myYScale) < Precision::Confusion() )
132   { //undo
133     myXScale = bXScale;
134     myYScale = bYScale;
135     return false;
136   }
137   
138   myGridWidth /= zoom; 
139   myGridHeight /= zoom;  
140   myIsUpdate = GL_TRUE;
141   return true;
142 }
143
144 void GLViewer_Grid::setResize( float WinW, float WinH, float zoom )
145 {
146   if( myWinW == WinW && myWinH == WinH && zoom == 1.0 )
147     return;
148
149   myGridWidth = myGridWidth + ( WinW - myWinW ) * myXScale; 
150   myGridHeight = myGridHeight + ( WinH - myWinH ) * myYScale;
151   myWinW = WinW;
152   myWinH = WinH;
153   setZoom( zoom );
154   myIsUpdate = GL_TRUE;
155 }
156
157 void GLViewer_Grid::getSize( float& xSize, float& ySize ) const
158 {
159   xSize = myXSize;
160   ySize = myYSize;
161 }
162
163 void GLViewer_Grid::getPan( float& xPan, float& yPan ) const
164 {
165   xPan = myXPan;
166   yPan = myYPan;
167 }
168
169 void GLViewer_Grid::getScale( float& xScale, float& yScale ) const
170 {
171   xScale = myXScale;
172   yScale = myYScale;
173 }
174
175 bool GLViewer_Grid::initList()
176 {
177   myIsUpdate = GL_FALSE;
178    
179     if( myXSize == (GLfloat)0.0 )
180         myXSize = (GLfloat)0.1;
181     if( myYSize == (GLfloat)0.0 )
182         myYSize = (GLfloat)0.1;
183
184 label:
185   if( ( myXSize >= myGridWidth/5 ) && ( myYSize >= myGridHeight/5 ) )
186   { //zoom in
187     myXSize /= myScaleFactor;
188     myYSize /= myScaleFactor;
189     goto label;
190   }
191   else if( ( myXSize * myScaleFactor < myGridWidth/5 ) 
192         || ( myYSize * myScaleFactor < myGridHeight/5 ) )
193   { //zoom out
194     myXSize *= myScaleFactor;
195     myYSize *= myScaleFactor;
196     goto label;
197   }
198
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 ) )
204   { 
205     if ( myGridList != 0 )  
206     { 
207       glDeleteLists( myGridList, 1 ); 
208       if ( glGetError() != GL_NO_ERROR ) 
209     return FALSE;
210     } 
211          
212     float xLoc = (int)(myXPan / myXSize) * myXSize; 
213     float yLoc = (int)(myYPan / myYSize) * myYSize; 
214  
215     myGridList = glGenLists( 1 ); 
216     glNewList( myGridList, GL_COMPILE ); 
217
218     glColor3f( myGridColor[0], myGridColor[1], myGridColor[2] );  
219     glLineWidth( myLineWidth ); 
220     
221     glBegin( GL_LINES ); 
222     for( int j = 0; ( j-1 ) * myXSize <= myGridWidth / 2 ; j++ )
223     { 
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 );
228     }
229     for( int i = 0; ( i-1 ) * myYSize <= myGridHeight / 2 ; i++)  
230     {
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 ); 
235     } 
236     glEnd();
237
238     glColor3f( myAxisColor[0], myAxisColor[1], myAxisColor[2] );
239     glLineWidth( myCenterWidth );
240
241     glBegin( GL_LINES );
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 );    
246     glEnd();
247
248     glBegin( GL_LINE_LOOP ); 
249     double angle = 0.0;
250     for ( int k = 0; k < SEGMENTS; k++ )     
251     { 
252       glVertex2f( cos(angle) * myCenterRadius * myXScale,
253           sin(angle) * myCenterRadius * myYScale ); 
254       angle += STEP; 
255     } 
256     glEnd();
257
258     glEndList();
259   }
260   return TRUE;
261 }