1 // Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
25 #include <OpenGL/gl.h>
30 #include "OCCViewer_Trihedron.h"
33 #include <SUIT_ResourceMgr.h>
34 #include <SUIT_Session.h>
36 #include <Graphic3d_AspectFillArea3d.hxx>
37 #include <Graphic3d_Group.hxx>
38 #include <Graphic3d_MaterialAspect.hxx>
39 #include <Prs3d_Presentation.hxx>
40 #include <Prs3d_Root.hxx>
41 #include <PrsMgr_PresentationManager3d.hxx>
44 #if !defined WIN32 && !defined __APPLE__
50 #define PI 3.14159265359
52 OCCT_IMPLEMENT_STANDARD_RTTIEXT( OCCViewer_Trihedron, AIS_InteractiveObject )
57 OCCViewer_Trihedron::OCCViewer_Trihedron( const PrsMgr_TypeOfPresentation3d t )
58 : AIS_InteractiveObject( t ),
66 OCCViewer_Trihedron::~OCCViewer_Trihedron()
69 glDeleteLists( myTextList, 256 );
73 * Sets the bounding box (MinMax values).
75 #if OCC_VERSION_LARGE > 0x06070100 // for OCC-6.7.2 and higher version
76 void OCCViewer_Trihedron::bounds( Graphic3d_BndBox4f& theMinMax ) const
78 Graphic3d_Vec4 aMinPt (-1.f, -1.f, -1.f, 1.f);
79 Graphic3d_Vec4 aMaxPt (1.f, 1.f, 1.f, 1.f);
81 theMinMax.Add (aMinPt);
82 theMinMax.Add (aMaxPt);
85 void OCCViewer_Trihedron::bounds( Graphic3d_CBounds& aMinMax ) const
87 Standard_Real aXMin = -1, aYMin = -1, aZMin = -1;
88 Standard_Real aXMax = 1, aYMax = 1, aZMax = 1;
90 if( aMinMax.XMin > aXMin ) aMinMax.XMin = aXMin;
91 if( aMinMax.YMin > aYMin ) aMinMax.YMin = aYMin;
92 if( aMinMax.ZMin > aZMin ) aMinMax.ZMin = aZMin;
93 if( aMinMax.XMax < aXMax ) aMinMax.XMax = aXMax;
94 if( aMinMax.YMax < aYMax ) aMinMax.YMax = aYMax;
95 if( aMinMax.ZMax < aZMax ) aMinMax.ZMax = aZMax;
100 * Redefined method. Calculates the object presentation.
102 void OCCViewer_Trihedron::Compute( const Handle( PrsMgr_PresentationManager3d )&,
103 const Handle( Prs3d_Presentation )& aPrs,
104 const Standard_Integer aMode )
109 Handle( Graphic3d_Group ) aGroup = Prs3d_Root::CurrentGroup( aPrs );
110 aGroup->UserDraw( this );
114 * Redefined method. Does nothing.
116 void OCCViewer_Trihedron::ComputeSelection( const Handle( SelectMgr_Selection )& theSelection,
117 const Standard_Integer theMode )
122 * Generates text list.
124 GLuint generateTextList()
127 GLuint aList = glGenLists( 256 );
130 HGLRC hglrc = wglGetCurrentContext();
133 HDC hdc = ::wglGetCurrentDC();
134 HFONT font = CreateFont( -12, 0, 0, 0,
141 FF_DONTCARE | DEFAULT_PITCH,
143 HFONT oldFont = (HFONT)SelectObject( hdc, font );
145 ok = ::wglUseFontBitmaps( hdc, 0, 256, aList );
146 SelectObject( hdc, oldFont );
147 DeleteObject( font );
149 #elif !defined(__APPLE__) // X Window
150 Display* dpy = glXGetCurrentDisplay();
154 char** aFontList = XListFonts( dpy, "*-courier-*", 1, &aFontCount );
157 //XFontStruct* fontInfo = XLoadQueryFont( dpy, "-*-courier-*-r-*-*-14-*-*-*-m-*-*-*" );
158 Font aFont = XLoadFont( dpy, aFontList[0] );
159 glXUseXFont( aFont, 0, 256, aList );
160 XUnloadFont( dpy, aFont );
163 XFreeFontNames( aFontList );
168 glDeleteLists( aList, 256 );
176 void drawText( GLuint theTextList, const char* theText, GLdouble thePosition[3], GLfloat theColor[3] )
178 glColor3fv( theColor );
179 glRasterPos3dv( thePosition );
180 glListBase( theTextList );
181 glCallLists( strlen( theText ), GL_UNSIGNED_BYTE, (GLubyte*)theText );
185 * Displays trihedron.
187 void OCCViewer_Trihedron::display()
189 GLdouble TriedronOrigin[3] = { 0.0, 0.0, 0.0 };
191 GLdouble TriedronAxeX[3] = { 1.0, 0.0, 0.0 };
192 GLdouble TriedronAxeY[3] = { 0.0, 1.0, 0.0 };
193 GLdouble TriedronAxeZ[3] = { 0.0, 0.0, 1.0 };
195 GLfloat TriedronColorX[3] = { 1.0, 0.0, 0.0 };
196 GLfloat TriedronColorY[3] = { 0.0, 1.0, 0.0 };
197 GLfloat TriedronColorZ[3] = { 0.0, 0.0, 1.0 };
199 GLfloat TriedronLetterColorX[3] = { 1.0, 1.0, 1.0 };
200 GLfloat TriedronLetterColorY[3] = { 1.0, 1.0, 1.0 };
201 GLfloat TriedronLetterColorZ[3] = { 1.0, 1.0, 1.0 };
203 GLfloat TriedronLineWidth = 2.0;
204 GLdouble TriedronScale = 0.15;
206 GLdouble U, V, minUV;
208 glGetIntegerv(GL_VIEWPORT, aViewPort);
217 GLdouble L = minUV * TriedronScale;
219 TriedronOrigin[0]= 0.0;
220 TriedronOrigin[1]= 0.0;
221 TriedronOrigin[2]= 0.0;
223 TriedronAxeX[0] = TriedronOrigin[0] + L;
224 TriedronAxeX[1] = TriedronOrigin[1] + 0.0;
225 TriedronAxeX[2] = TriedronOrigin[2] + 0.0;
227 TriedronAxeY[0] = TriedronOrigin[0] + 0.0;
228 TriedronAxeY[1] = TriedronOrigin[1] + L;
229 TriedronAxeY[2] = TriedronOrigin[2] + 0.0;
231 TriedronAxeZ[0] = TriedronOrigin[0] + 0.0;
232 TriedronAxeZ[1] = TriedronOrigin[1] + 0.0;
233 TriedronAxeZ[2] = TriedronOrigin[2] + L;
235 glPushAttrib( GL_CURRENT_BIT | GL_ENABLE_BIT | GL_LIGHTING_BIT | GL_LINE_BIT | GL_VIEWPORT_BIT );
237 glDepthRange( 0, 0 );
238 glDisable( GL_LIGHTING );
239 glDisable( GL_COLOR_MATERIAL );
240 for( int i = 0; i < GL_MAX_CLIP_PLANES; i++ )
241 glDisable( GL_CLIP_PLANE0 + i );
243 glLineWidth( TriedronLineWidth );
245 glColor3fv( TriedronColorX );
247 glVertex3dv( TriedronOrigin );
248 glVertex3dv( TriedronAxeX );
251 glColor3fv( TriedronColorY );
253 glVertex3dv( TriedronOrigin );
254 glVertex3dv( TriedronAxeY );
257 glColor3fv( TriedronColorZ );
259 glVertex3dv( TriedronOrigin );
260 glVertex3dv( TriedronAxeZ );
263 GLdouble l = L - L/4.;
264 GLdouble rayon = L/20.;
265 GLint ii, NbFacettes = 12;
266 GLdouble Angle = 2. * PI / NbFacettes;
267 GLdouble TriedronCoord[3] = { 1.0, 0.0, 0.0 };
269 if( myTextList == 0 )
270 myTextList = generateTextList();
272 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
274 glColor3fv( TriedronColorX );
275 glBegin( GL_TRIANGLE_FAN );
276 glVertex3dv( TriedronAxeX );
277 TriedronCoord[0] = TriedronOrigin[0] + l ;
280 TriedronCoord[1] = TriedronOrigin[1] + ( rayon * sin(ii * Angle) );
281 TriedronCoord[2] = TriedronOrigin[2] + ( rayon * cos(ii * Angle) );
282 glVertex3dv( TriedronCoord );
287 drawText( myTextList, "X", TriedronAxeX, TriedronLetterColorX );
289 glColor3fv( TriedronColorY );
290 glBegin( GL_TRIANGLE_FAN );
291 glVertex3dv( TriedronAxeY );
292 TriedronCoord[1] = TriedronOrigin[1] + l ;
295 TriedronCoord[0] = TriedronOrigin[0] + (rayon * cos(ii * Angle) );
296 TriedronCoord[2] = TriedronOrigin[2] + (rayon * sin(ii * Angle) );
297 glVertex3dv( TriedronCoord );
302 drawText( myTextList, "Y", TriedronAxeY, TriedronLetterColorY );
304 glColor3fv( TriedronColorZ );
305 glBegin( GL_TRIANGLE_FAN );
306 glVertex3dv( TriedronAxeZ );
307 TriedronCoord[2] = TriedronOrigin[2] + l ;
310 TriedronCoord[0] = TriedronOrigin[0] + ( rayon * sin(ii * Angle) );
311 TriedronCoord[1] = TriedronOrigin[1] + ( rayon * cos(ii * Angle) );
312 glVertex3dv( TriedronCoord );
317 drawText( myTextList, "Z", TriedronAxeZ, TriedronLetterColorZ );