1 // Created on: 2011-09-20
2 // Created by: Sergey ZERCHANINOV
3 // Copyright (c) 2011-2013 OPEN CASCADE SAS
5 // This file is part of Open CASCADE Technology software library.
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
16 #include <OpenGl_GlCore11.hxx>
23 #include <InterfaceGraphic_Graphic3d.hxx>
24 #include <InterfaceGraphic_Aspect.hxx>
25 #include <InterfaceGraphic_Visual3d.hxx>
34 #include <OpenGl_Workspace.hxx>
35 #include <OpenGl_View.hxx>
36 #include <OpenGl_GraduatedTrihedron.hxx>
37 #include <OpenGl_AspectLine.hxx>
39 const OpenGl_AspectLine myDefaultAspectLine;
41 static const OpenGl_TextParam THE_LABEL_PARAMS =
43 16, Graphic3d_HTA_LEFT, Graphic3d_VTA_BOTTOM
47 float xmin = 0.0f, ymin = 0.0f, zmin = 0.0f, xmax = 100.0f, ymax = 100.0f, zmax = 100.0f;
49 /* Normal of the view (not normalized!) */
50 static float getNormal(float* normal)
53 GLdouble model_matrix[16], proj_matrix[16];
55 glGetDoublev(GL_MODELVIEW_MATRIX, model_matrix);
56 glGetDoublev(GL_PROJECTION_MATRIX, proj_matrix);
57 glGetIntegerv(GL_VIEWPORT, viewport);
59 double x1, y1, z1, x2, y2, z2, x3, y3, z3;
60 gluUnProject(viewport[0], viewport[1], 0., model_matrix, proj_matrix, viewport, &x1, &y1, &z1);
61 gluUnProject(viewport[0] + viewport[2], viewport[1], 0., model_matrix, proj_matrix, viewport, &x2, &y2, &z2);
62 gluUnProject(viewport[0], viewport[1] + viewport[3], 0., model_matrix, proj_matrix, viewport, &x3, &y3, &z3);
64 /* Normal out of user is p1p3^p1p2 */
65 const double dx1 = x3 - x1;
66 const double dy1 = y3 - y1;
67 const double dz1 = z3 - z1;
68 const double dx2 = x2 - x1;
69 const double dy2 = y2 - y1;
70 const double dz2 = z2 - z1;
71 normal[0] = (float) (dy1 * dz2 - dz1 * dy2);
72 normal[1] = (float) (dz1 * dx2 - dx1 * dz2);
73 normal[2] = (float) (dx1 * dy2 - dy1 * dx2);
75 /* Distance corresponding to 1 pixel */
76 const float width = (float) sqrt(dx2 * dx2 + dy2 * dy2 + dz2 * dz2);
77 return width / (float) viewport[2];
80 static float getDistance2Corner(float* normal, float* center, float x, float y, float z)
82 return normal[0] * (x - center[0]) + normal[1] * (y - center[1]) + normal[2] * (z - center[2]);
85 static char getFarestCorner(float d000, float d100, float d010, float d001,
86 float d110, float d101, float d011, float d111)
89 d000 > d100 && d000 > d010 && d000 > d001 && d000 > d110 &&
90 d000 > d101 && d000 > d011 && d000 > d111)
94 else if (d100 > 0.0f &&
95 d100 > d000 && d100 > d010 && d100 > d001 && d100 > d110 &&
96 d100 > d101 && d100 > d011 && d100 > d111)
100 else if (d010 > 0.0f &&
101 d010 > d000 && d010 > d100 && d010 > d001 && d010 > d110 &&
102 d010 > d101 && d010 > d011 && d010 > d111)
106 else if (d001 > 0.0f &&
107 d001 > d000 && d001 > d100 && d001 > d010 && d001 > d110 &&
108 d001 > d101 && d001 > d011 && d001 > d111)
112 else if (d110 > 0.0f &&
113 d110 > d000 && d110 > d100 && d110 > d010 && d110 > d001 &&
114 d110 > d101 && d110 > d011 && d110 > d111)
118 else if (d101 > 0.0f &&
119 d101 > d000 && d101 > d100 && d101 > d010 && d101 > d001 &&
120 d101 > d110 && d101 > d011 && d101 > d111)
124 else if (d011 > 0.0f &&
125 d011 > d000 && d011 > d100 && d011 > d010 && d011 > d001 &&
126 d011 > d110 && d011 > d101 && d011 > d111)
133 static void drawArrow(float x1, float y1, float z1,
134 float x2, float y2, float z2,
135 float xn, float yn, float zn)
141 float xa1, ya1, za1, xa2, ya2, za2;
143 /* Start of arrow: at 10% from the end */
144 x0 = x1 + 0.9f * (x2 - x1); y0 = y1 + 0.9f * (y2 - y1); z0 = z1 + 0.9f * (z2 - z1);
146 /* Base of the arrow */
147 xa = (x2 - x0); ya = (y2 - y0); za = (z2 - z0);
149 /* Height of the arrow */
150 h = sqrtf(xa * xa + ya * ya + za * za);
153 xa = xa / h; ya = ya / h; za = za / h;
155 /* Radial direction to the arrow */
156 xr = ya * zn - za * yn;
157 yr = za * xn - xa * zn;
158 zr = xa * yn - ya * xn;
160 /* Normalize the radial vector */
161 r = sqrtf(xr * xr + yr * yr + zr * zr);
164 xr = xr / r; yr = yr / r; zr = zr / r;
166 /* First point of the base of the arrow */
168 xr = r * xr; yr = r * yr; zr = r * zr;
169 xa1 = x0 + xr; ya1 = y0 + yr; za1 = z0 + zr;
171 /* Second point of the base of the arrow */
172 xa2 = x0 - xr; ya2 = y0 - yr; za2 = z0 - zr;
174 /* Draw a line to the arrow */
176 glVertex3f(x1, y1, z1);
177 glVertex3f(x0, y0, z0);
180 /* Draw a triangle of the arrow */
181 glBegin(GL_LINE_LOOP);
182 glVertex3f(xa1, ya1, za1);
183 glVertex3f(xa2, ya2, za2);
184 glVertex3f(x2, y2, z2);
188 // =======================================================================
189 // function : Release
191 // =======================================================================
192 void OpenGl_GraduatedTrihedron::Release (const Handle(OpenGl_Context)& theCtx)
194 myLabelX.Release (theCtx);
195 myLabelY.Release (theCtx);
196 myLabelZ.Release (theCtx);
197 myLabelValues.Release (theCtx);
200 OpenGl_GraduatedTrihedron::OpenGl_GraduatedTrihedron (const Graphic3d_CGraduatedTrihedron& theData)
201 : myLabelX (theData.xname, OpenGl_Vec3(1.0f, 0.0f, 0.0f), THE_LABEL_PARAMS),
202 myLabelY (theData.yname, OpenGl_Vec3(0.0f, 1.0f, 0.0f), THE_LABEL_PARAMS),
203 myLabelZ (theData.zname, OpenGl_Vec3(0.0f, 0.0f, 1.0f), THE_LABEL_PARAMS),
204 myToDrawXName (theData.xdrawname == Standard_True),
205 myToDrawYName (theData.ydrawname == Standard_True),
206 myToDrawZName (theData.zdrawname == Standard_True),
207 myToDrawXValues (theData.xdrawvalues == Standard_True),
208 myToDrawYValues (theData.ydrawvalues == Standard_True),
209 myToDrawZValues (theData.zdrawvalues == Standard_True),
210 myToDrawGrid (theData.drawgrid == Standard_True),
211 myToDrawAxes (theData.drawaxes == Standard_True),
215 myXOffset (theData.xoffset),
216 myYOffset (theData.yoffset),
217 myZOffset (theData.zoffset),
218 myXAxisOffset (theData.xaxisoffset),
219 myYAxisOffset (theData.yaxisoffset),
220 myZAxisOffset (theData.zaxisoffset),
221 myDrawXTickmarks (theData.xdrawtickmarks),
222 myDrawYTickmarks (theData.ydrawtickmarks),
223 myDrawZTickmarks (theData.zdrawtickmarks),
224 myXTickmarkLength (theData.xtickmarklength),
225 myYTickmarkLength (theData.ytickmarklength),
226 myZTickmarkLength (theData.ztickmarklength),
227 myCbCubicAxes (theData.cbCubicAxes),
228 myPtrVisual3dView (theData.ptrVisual3dView)
230 myAspectLabels.ChangeFontName() = theData.fontOfNames;
231 myAspectValues.ChangeFontName() = theData.fontOfValues;
232 myAspectLabels.SetFontAspect (theData.styleOfNames);
233 myAspectValues.SetFontAspect (theData.styleOfValues);
234 myLabelX.SetFontSize (NULL, theData.sizeOfNames);
235 myLabelY.SetFontSize (NULL, theData.sizeOfNames);
236 myLabelZ.SetFontSize (NULL, theData.sizeOfNames);
237 myLabelValues.SetFontSize (NULL, theData.sizeOfValues);
240 myGridColor[0] = (float) theData.gridcolor.Red();
241 myGridColor[1] = (float) theData.gridcolor.Green();
242 myGridColor[2] = (float) theData.gridcolor.Blue();
244 myXNameColor.rgb[0] = (float )theData.xnamecolor.Red();
245 myXNameColor.rgb[1] = (float )theData.xnamecolor.Green();
246 myXNameColor.rgb[2] = (float )theData.xnamecolor.Blue();
247 myXNameColor.rgb[3] = 1.0f;
249 myYNameColor.rgb[0] = (float )theData.ynamecolor.Red();
250 myYNameColor.rgb[1] = (float )theData.ynamecolor.Green();
251 myYNameColor.rgb[2] = (float )theData.ynamecolor.Blue();
252 myYNameColor.rgb[3] = 1.0f;
254 myZNameColor.rgb[0] = (float )theData.znamecolor.Red();
255 myZNameColor.rgb[1] = (float )theData.znamecolor.Green();
256 myZNameColor.rgb[2] = (float )theData.znamecolor.Blue();
257 myZNameColor.rgb[3] = 1.0f;
258 // X color of axis and values
259 myXColor.rgb[0] = (float )theData.xcolor.Red();
260 myXColor.rgb[1] = (float )theData.xcolor.Green();
261 myXColor.rgb[2] = (float )theData.xcolor.Blue();
262 myXColor.rgb[3] = 1.0f;
263 // Y color of axis and values
264 myYColor.rgb[0] = (float )theData.ycolor.Red();
265 myYColor.rgb[1] = (float )theData.ycolor.Green();
266 myYColor.rgb[2] = (float )theData.ycolor.Blue();
267 myYColor.rgb[3] = 1.0f;
268 // Z color of axis and values
269 myZColor.rgb[0] = (float )theData.zcolor.Red();
270 myZColor.rgb[1] = (float )theData.zcolor.Green();
271 myZColor.rgb[2] = (float )theData.zcolor.Blue();
272 myZColor.rgb[3] = 1.0f;
275 OpenGl_GraduatedTrihedron::~OpenGl_GraduatedTrihedron()
280 //call_graduatedtrihedron_redraw
281 void OpenGl_GraduatedTrihedron::Render (const Handle(OpenGl_Workspace)& theWorkspace) const
283 const OpenGl_AspectLine *oldAspectLine = theWorkspace->SetAspectLine(&myDefaultAspectLine);
284 theWorkspace->AspectLine(Standard_True);
286 /* Update boundary box */
288 myCbCubicAxes(myPtrVisual3dView);
290 /* Disable lighting for lines */
291 GLboolean light = glIsEnabled(GL_LIGHTING);
293 glDisable(GL_LIGHTING);
295 /* Find the farest point of bounding box */
297 /* Get normal of the view out of user. */
298 /* Also, the method return distance corresponding to 1 pixel */
300 float dpix = getNormal(normal);
302 /* Normalize normal */
303 float d = sqrtf(normal[0] * normal[0] + normal[1] * normal[1] + normal[2] * normal[2]);
308 /* Get central point of bounding box */
310 center[0] = 0.5f * (xmin + xmax);
311 center[1] = 0.5f * (ymin + ymax);
312 center[2] = 0.5f * (zmin + zmax);
314 /* Check distance to corners of bounding box along the normal */
315 float d000 = getDistance2Corner(normal, center, xmin, ymin, zmin);
316 float d100 = getDistance2Corner(normal, center, xmax, ymin, zmin);
317 float d010 = getDistance2Corner(normal, center, xmin, ymax, zmin);
318 float d001 = getDistance2Corner(normal, center, xmin, ymin, zmax);
319 float d110 = getDistance2Corner(normal, center, xmax, ymax, zmin);
320 float d101 = getDistance2Corner(normal, center, xmax, ymin, zmax);
321 float d011 = getDistance2Corner(normal, center, xmin, ymax, zmax);
322 float d111 = getDistance2Corner(normal, center, xmax, ymax, zmax);
323 unsigned char farestCorner = getFarestCorner(d000, d100, d010, d001, d110, d101, d011, d111);
325 /* Choose axes for the grid. */
326 float LX1[6], LX2[6], LX3[6]; /* Lines along X direction */
327 float LY1[6], LY2[6], LY3[6]; /* Lines along Y direction */
328 float LZ1[6], LZ2[6], LZ3[6]; /* Lines along Z direction */
329 unsigned char LX1draw = 0, LX2draw = 0, LX3draw = 0; /* Allows drawing of X-line (000 - 100 is forbidden) */
330 unsigned char LY1draw = 0, LY2draw = 0, LY3draw = 0; /* Allows drawing of Y-line (000 - 010 is forbidden) */
331 unsigned char LZ1draw = 0, LZ2draw = 0, LZ3draw = 0; /* Allows drawing of Z-line (000 - 001 is forbidden) */
333 /* The first axis will be used for drawing the text and the values. */
334 switch (farestCorner)
340 LX1[0] = xmin; LX1[1] = ymin; LX1[2] = zmax; LX1[3] = xmax; LX1[4] = ymin; LX1[5] = zmax;
342 LX2draw = 0; /* forbidden! */
343 LX2[0] = xmin; LX2[1] = ymin; LX2[2] = zmin; LX2[3] = xmax; LX2[4] = ymin; LX2[5] = zmin;
346 LX3[0] = xmin; LX3[1] = ymax; LX3[2] = zmin; LX3[3] = xmax; LX3[4] = ymax; LX3[5] = zmin;
350 LY1[0] = xmax; LY1[1] = ymin; LY1[2] = zmin; LY1[3] = xmax; LY1[4] = ymax; LY1[5] = zmin;
352 LY2draw = 0; /* forbidden! */
353 LY2[0] = xmin; LY2[1] = ymin; LY2[2] = zmin; LY2[3] = xmin; LY2[4] = ymax; LY2[5] = zmin;
356 LY3[0] = xmin; LY3[1] = ymin; LY3[2] = zmax; LY3[3] = xmin; LY3[4] = ymax; LY3[5] = zmax;
360 LZ1[0] = xmax; LZ1[1] = ymin; LZ1[2] = zmin; LZ1[3] = xmax; LZ1[4] = ymin; LZ1[5] = zmax;
362 LZ2draw = 0; /* forbidden! */
363 LZ2[0] = xmin; LZ2[1] = ymin; LZ2[2] = zmin; LZ2[3] = xmin; LZ2[4] = ymin; LZ2[5] = zmax;
366 LZ3[0] = xmin; LZ3[1] = ymax; LZ3[2] = zmin; LZ3[3] = xmin; LZ3[4] = ymax; LZ3[5] = zmax;
374 LX1[0] = xmin; LX1[1] = ymin; LX1[2] = zmax; LX1[3] = xmax; LX1[4] = ymin; LX1[5] = zmax;
376 LX2draw = 0; /* forbidden! */
377 LX2[0] = xmin; LX2[1] = ymin; LX2[2] = zmin; LX2[3] = xmax; LX2[4] = ymin; LX2[5] = zmin;
380 LX3[0] = xmin; LX3[1] = ymax; LX3[2] = zmin; LX3[3] = xmax; LX3[4] = ymax; LX3[5] = zmin;
383 LY1draw = 0; /* forbidden! */
384 LY1[0] = xmin; LY1[1] = ymin; LY1[2] = zmin; LY1[3] = xmin; LY1[4] = ymax; LY1[5] = zmin;
387 LY2[0] = xmax; LY2[1] = ymin; LY2[2] = zmin; LY2[3] = xmax; LY2[4] = ymax; LY2[5] = zmin;
390 LY3[0] = xmax; LY3[1] = ymin; LY3[2] = zmax; LY3[3] = xmax; LY3[4] = ymax; LY3[5] = zmax;
393 LZ1draw = 0; /* forbidden! */
394 LZ1[0] = xmin; LZ1[1] = ymin; LZ1[2] = zmin; LZ1[3] = xmin; LZ1[4] = ymin; LZ1[5] = zmax;
397 LZ2[0] = xmax; LZ2[1] = ymin; LZ2[2] = zmin; LZ2[3] = xmax; LZ2[4] = ymin; LZ2[5] = zmax;
400 LZ3[0] = xmax; LZ3[1] = ymax; LZ3[2] = zmin; LZ3[3] = xmax; LZ3[4] = ymax; LZ3[5] = zmax;
407 LX1draw = 0; /* forbidden */
408 LX1[0] = xmin; LX1[1] = ymin; LX1[2] = zmin; LX1[3] = xmax; LX1[4] = ymin; LX1[5] = zmin;
411 LX2[0] = xmin; LX2[1] = ymax; LX2[2] = zmin; LX2[3] = xmax; LX2[4] = ymax; LX2[5] = zmin;
414 LX3[0] = xmin; LX3[1] = ymax; LX3[2] = zmax; LX3[3] = xmax; LX3[4] = ymax; LX3[5] = zmax;
418 LY1[0] = xmax; LY1[1] = ymin; LY1[2] = zmin; LY1[3] = xmax; LY1[4] = ymax; LY1[5] = zmin;
420 LY2draw = 0; /* forbidden */
421 LY2[0] = xmin; LY2[1] = ymin; LY2[2] = zmin; LY2[3] = xmin; LY2[4] = ymax; LY2[5] = zmin;
424 LY3[0] = xmin; LY3[1] = ymin; LY3[2] = zmax; LY3[3] = xmin; LY3[4] = ymax; LY3[5] = zmax;
428 LZ1[0] = xmax; LZ1[1] = ymax; LZ1[2] = zmin; LZ1[3] = xmax; LZ1[4] = ymax; LZ1[5] = zmax;
431 LZ2[0] = xmin; LZ2[1] = ymax; LZ2[2] = zmin; LZ2[3] = xmin; LZ2[4] = ymax; LZ2[5] = zmax;
433 LZ3draw = 0; /* forbidden */
434 LZ3[0] = xmin; LZ3[1] = ymin; LZ3[2] = zmin; LZ3[3] = xmin; LZ3[4] = ymin; LZ3[5] = zmax;
441 LX1draw = 0; /* forbidden */
442 LX1[0] = xmin; LX1[1] = ymin; LX1[2] = zmin; LX1[3] = xmax; LX1[4] = ymin; LX1[5] = zmin;
445 LX2[0] = xmin; LX2[1] = ymin; LX2[2] = zmax; LX2[3] = xmax; LX2[4] = ymin; LX2[5] = zmax;
448 LX3[0] = xmin; LX3[1] = ymax; LX3[2] = zmax; LX3[3] = xmax; LX3[4] = ymax; LX3[5] = zmax;
451 LY1draw = 0; /* forbidden */
452 LY1[0] = xmin; LY1[1] = ymin; LY1[2] = zmin; LY1[3] = xmin; LY1[4] = ymax; LY1[5] = zmin;
455 LY2[0] = xmin; LY2[1] = ymin; LY2[2] = zmax; LY2[3] = xmin; LY2[4] = ymax; LY2[5] = zmax;
458 LY3[0] = xmax; LY3[1] = ymin; LY3[2] = zmax; LY3[3] = xmax; LY3[4] = ymax; LY3[5] = zmax;
462 LZ1[0] = xmax; LZ1[1] = ymin; LZ1[2] = zmin; LZ1[3] = xmax; LZ1[4] = ymin; LZ1[5] = zmax;
464 LZ2draw = 0; /* forbidden */
465 LZ2[0] = xmin; LZ2[1] = ymin; LZ2[2] = zmin; LZ2[3] = xmin; LZ2[4] = ymin; LZ2[5] = zmax;
468 LZ3[0] = xmin; LZ3[1] = ymax; LZ3[2] = zmin; LZ3[3] = xmin; LZ3[4] = ymax; LZ3[5] = zmax;
475 LX1draw = 0; /* forbidden */
476 LX1[0] = xmin; LX1[1] = ymin; LX1[2] = zmin; LX1[3] = xmax; LX1[4] = ymin; LX1[5] = zmin;
479 LX2[0] = xmin; LX2[1] = ymax; LX2[2] = zmin; LX2[3] = xmax; LX2[4] = ymax; LX2[5] = zmin;
482 LX3[0] = xmin; LX3[1] = ymax; LX3[2] = zmax; LX3[3] = xmax; LX3[4] = ymax; LX3[5] = zmax;
485 LY1draw = 0; /* forbidden */
486 LY1[0] = xmin; LY1[1] = ymin; LY1[2] = zmin; LY1[3] = xmin; LY1[4] = ymax; LY1[5] = zmin;
489 LY2[0] = xmax; LY2[1] = ymin; LY2[2] = zmin; LY2[3] = xmax; LY2[4] = ymax; LY2[5] = zmin;
492 LY3[0] = xmax; LY3[1] = ymin; LY3[2] = zmax; LY3[3] = xmax; LY3[4] = ymax; LY3[5] = zmax;
496 LZ1[0] = xmax; LZ1[1] = ymin; LZ1[2] = zmin; LZ1[3] = xmax; LZ1[4] = ymin; LZ1[5] = zmax;
499 LZ2[0] = xmax; LZ2[1] = ymax; LZ2[2] = zmin; LZ2[3] = xmax; LZ2[4] = ymax; LZ2[5] = zmax;
502 LZ3[0] = xmin; LZ3[1] = ymax; LZ3[2] = zmin; LZ3[3] = xmin; LZ3[4] = ymax; LZ3[5] = zmax;
509 LX1draw = 0; /* forbidden */
510 LX1[0] = xmin; LX1[1] = ymin; LX1[2] = zmin; LX1[3] = xmax; LX1[4] = ymin; LX1[5] = zmin;
513 LX2[0] = xmin; LX2[1] = ymin; LX2[2] = zmax; LX2[3] = xmax; LX2[4] = ymin; LX2[5] = zmax;
516 LX3[0] = xmin; LX3[1] = ymax; LX3[2] = zmax; LX3[3] = xmax; LX3[4] = ymax; LX3[5] = zmax;
520 LY1[0] = xmax; LY1[1] = ymin; LY1[2] = zmin; LY1[3] = xmax; LY1[4] = ymax; LY1[5] = zmin;
523 LY2[0] = xmax; LY2[1] = ymin; LY2[2] = zmax; LY2[3] = xmax; LY2[4] = ymax; LY2[5] = zmax;
526 LY3[0] = xmin; LY3[1] = ymin; LY3[2] = zmax; LY3[3] = xmin; LY3[4] = ymax; LY3[5] = zmax;
529 LZ1draw = 0; /* forbidden */
530 LZ1[0] = xmin; LZ1[1] = ymin; LZ1[2] = zmin; LZ1[3] = xmin; LZ1[4] = ymin; LZ1[5] = zmax;
533 LZ2[0] = xmax; LZ2[1] = ymin; LZ2[2] = zmin; LZ2[3] = xmax; LZ2[4] = ymin; LZ2[5] = zmax;
536 LZ3[0] = xmax; LZ3[1] = ymax; LZ3[2] = zmin; LZ3[3] = xmax; LZ3[4] = ymax; LZ3[5] = zmax;
544 LX1[0] = xmin; LX1[1] = ymin; LX1[2] = zmax; LX1[3] = xmax; LX1[4] = ymin; LX1[5] = zmax;
547 LX2[0] = xmin; LX2[1] = ymax; LX2[2] = zmax; LX2[3] = xmax; LX2[4] = ymax; LX2[5] = zmax;
550 LX3[0] = xmin; LX3[1] = ymax; LX3[2] = zmin; LX3[3] = xmax; LX3[4] = ymax; LX3[5] = zmin;
553 LY1draw = 0; /* forbidden */
554 LY1[0] = xmin; LY1[1] = ymin; LY1[2] = zmin; LY1[3] = xmin; LY1[4] = ymax; LY1[5] = zmin;
557 LY2[0] = xmin; LY2[1] = ymin; LY2[2] = zmax; LY2[3] = xmin; LY2[4] = ymax; LY2[5] = zmax;
560 LY3[0] = xmax; LY3[1] = ymin; LY3[2] = zmax; LY3[3] = xmax; LY3[4] = ymax; LY3[5] = zmax;
563 LZ1draw = 0; /* forbidden */
564 LZ1[0] = xmin; LZ1[1] = ymin; LZ1[2] = zmin; LZ1[3] = xmin; LZ1[4] = ymin; LZ1[5] = zmax;
567 LZ2[0] = xmin; LZ2[1] = ymax; LZ2[2] = zmin; LZ2[3] = xmin; LZ2[4] = ymax; LZ2[5] = zmax;
570 LZ3[0] = xmax; LZ3[1] = ymax; LZ3[2] = zmin; LZ3[3] = xmax; LZ3[4] = ymax; LZ3[5] = zmax;
578 LX1[0] = xmin; LX1[1] = ymax; LX1[2] = zmin; LX1[3] = xmax; LX1[4] = ymax; LX1[5] = zmin;
581 LX2[0] = xmin; LX2[1] = ymax; LX2[2] = zmax; LX2[3] = xmax; LX2[4] = ymax; LX2[5] = zmax;
584 LX3[0] = xmin; LX3[1] = ymin; LX3[2] = zmax; LX3[3] = xmax; LX3[4] = ymin; LX3[5] = zmax;
588 LY1[0] = xmax; LY1[1] = ymin; LY1[2] = zmin; LY1[3] = xmax; LY1[4] = ymax; LY1[5] = zmin;
591 LY2[0] = xmax; LY2[1] = ymin; LY2[2] = zmax; LY2[3] = xmax; LY2[4] = ymax; LY2[5] = zmax;
594 LY3[0] = xmin; LY3[1] = ymin; LY3[2] = zmax; LY3[3] = xmin; LY3[4] = ymax; LY3[5] = zmax;
598 LZ1[0] = xmax; LZ1[1] = ymin; LZ1[2] = zmin; LZ1[3] = xmax; LZ1[4] = ymin; LZ1[5] = zmax;
601 LZ2[0] = xmax; LZ2[1] = ymax; LZ2[2] = zmin; LZ2[3] = xmax; LZ2[4] = ymax; LZ2[5] = zmax;
604 LZ3[0] = xmin; LZ3[1] = ymax; LZ3[2] = zmin; LZ3[3] = xmin; LZ3[4] = ymax; LZ3[5] = zmax;
610 // Draw the graduated trihedron
611 unsigned int i, offset;
613 float step, dx, dy, dz;
618 glColor3fv(myGridColor);
620 // Boundary grid-lines
623 glVertex3fv(&(LX1[0]));
624 glVertex3fv(&(LX1[3]));
628 glVertex3fv(&(LX2[0]));
629 glVertex3fv(&(LX2[3]));
633 glVertex3fv(&(LX3[0]));
634 glVertex3fv(&(LX3[3]));
638 glVertex3fv(&(LY1[0]));
639 glVertex3fv(&(LY1[3]));
643 glVertex3fv(&(LY2[0]));
644 glVertex3fv(&(LY2[3]));
648 glVertex3fv(&(LY3[0]));
649 glVertex3fv(&(LY3[3]));
653 glVertex3fv(&(LZ1[0]));
654 glVertex3fv(&(LZ1[3]));
658 glVertex3fv(&(LZ2[0]));
659 glVertex3fv(&(LZ2[3]));
663 glVertex3fv(&(LZ3[0]));
664 glVertex3fv(&(LZ3[3]));
668 /* Intermediate grid-lines */
672 i = myToDrawAxes ? 1 : 0;
673 step = fabsf(LX1[3] - LX1[0]) / (float) myNbX;
676 glBegin(GL_LINE_STRIP);
677 glVertex3f(LX1[0] + i * step, LX1[1], LX1[2]);
678 glVertex3f(LX2[0] + i * step, LX2[1], LX2[2]);
679 glVertex3f(LX3[0] + i * step, LX3[1], LX3[2]);
687 i = myToDrawAxes ? 1 : 0;
688 step = fabsf(LY1[4] - LY1[1]) / (float) myNbY;
691 glBegin(GL_LINE_STRIP);
692 glVertex3f(LY1[0], LY1[1] + i * step, LY1[2]);
693 glVertex3f(LY2[0], LY2[1] + i * step, LY2[2]);
694 glVertex3f(LY3[0], LY3[1] + i * step, LY3[2]);
702 i = myToDrawAxes ? 1 : 0;
703 step = fabsf(LZ1[5] - LZ1[2]) / (float) myNbZ;
707 glBegin(GL_LINE_STRIP);
708 glVertex3f(LZ1[0], LZ1[1], LZ1[2] + i * step);
709 glVertex3f(LZ2[0], LZ2[1], LZ2[2] + i * step);
710 glVertex3f(LZ3[0], LZ3[1], LZ3[2] + i * step);
721 glColor3fv(myXColor.rgb);
722 drawArrow(xmin, ymin, zmin, xmax, ymin, zmin, normal[0], normal[1], normal[2]);
725 glColor3fv(myYColor.rgb);
726 drawArrow(xmin, ymin, zmin, xmin, ymax, zmin, normal[0], normal[1], normal[2]);
729 glColor3fv(myZColor.rgb);
730 drawArrow(xmin, ymin, zmin, xmin, ymin, zmax, normal[0], normal[1], normal[2]);
733 // Names of axes & values
736 if (myToDrawXName || myToDrawXValues)
738 // Middle point of the first X-axis
739 m1[0] = 0.5f * (LX1[0] + LX1[3]);
740 m1[1] = 0.5f * (LX1[1] + LX1[4]);
741 m1[2] = 0.5f * (LX1[2] + LX1[5]);
743 // Middle point of the second X-axis
744 m2[0] = 0.5f * (LX2[0] + LX2[3]);
745 m2[1] = 0.5f * (LX2[1] + LX2[4]);
746 m2[2] = 0.5f * (LX2[2] + LX2[5]);
748 // Apply offset to m1
750 if (fabsf(dy) > 1.e-7f)
752 dy = (dy > 0.0f)? 1.0f : -1.0f;
755 if (fabsf(dz) > 1.e-7f)
757 dz = (dz > 0.0f)? 1.0f : -1.0f;
765 offset = myXAxisOffset + myXTickmarkLength;
768 myAspectLabels.ChangeColor() = myXNameColor;
769 const OpenGl_AspectText* aPrevAspectText = theWorkspace->SetAspectText (&myAspectLabels);
770 myLabelX.SetPosition (OpenGl_Vec3(m1[0], m1[1] + offset * m2[1], m1[2] + offset * m2[2]));
771 myLabelX.Render (theWorkspace);
772 theWorkspace->SetAspectText (aPrevAspectText);
776 if (myToDrawXValues && myNbX > 0)
778 myAspectValues.ChangeColor() = myXColor;
779 const OpenGl_AspectText* aPrevAspectText = theWorkspace->SetAspectText (&myAspectValues);
781 step = fabsf(LX1[3] - LX1[0]) / (float) myNbX;
782 offset = myXOffset + myXTickmarkLength;
783 for (unsigned int anIter = 0; anIter <= myNbX; ++anIter)
785 sprintf (textValue, "%g", LX1[0] + anIter * step);
786 myLabelValues.Init (theWorkspace->GetGlContext(), textValue,
787 OpenGl_Vec3(LX1[0] + anIter * step, m1[1] + offset * m2[1], m1[2] + offset * m2[2]));
788 myLabelValues.Render (theWorkspace);
790 theWorkspace->SetAspectText (aPrevAspectText);
794 if (myDrawXTickmarks && myNbX > 0)
796 glColor3fv(myGridColor);
798 step = fabsf(LX1[3] - LX1[0]) / (float) myNbX;
799 for (unsigned int anIter = 0; anIter <= myNbX; ++anIter)
802 glVertex3f(LX1[0] + anIter * step, m1[1], m1[2]);
803 glVertex3f(LX1[0] + anIter * step, m1[1] + myXTickmarkLength * m2[1], m1[2] + myXTickmarkLength * m2[2]);
809 if (myToDrawYName || myToDrawYValues)
811 // Middle point of the first Y-axis
812 m1[0] = 0.5f * (LY1[0] + LY1[3]);
813 m1[1] = 0.5f * (LY1[1] + LY1[4]);
814 m1[2] = 0.5f * (LY1[2] + LY1[5]);
816 // Middle point of the second Y-axis
817 m2[0] = 0.5f * (LY2[0] + LY2[3]);
818 m2[1] = 0.5f * (LY2[1] + LY2[4]);
819 m2[2] = 0.5f * (LY2[2] + LY2[5]);
821 // Apply offset to m1
823 if (fabsf(dx) > 1.e-7f)
825 dx = (dx > 0.0f)? 1.0f : -1.0f;
828 if (fabsf(dz) > 1.e-7f)
830 dz = (dz > 0.0f)? 1.0f : -1.0f;
839 offset = myYAxisOffset + myYTickmarkLength;
841 myAspectLabels.ChangeColor() = myYNameColor;
842 const OpenGl_AspectText* aPrevAspectText = theWorkspace->SetAspectText (&myAspectLabels);
843 myLabelY.SetPosition (OpenGl_Vec3(m1[0] + offset * m2[0], m1[1], m1[2] + offset * m2[2]));
844 myLabelY.Render (theWorkspace);
845 theWorkspace->SetAspectText (aPrevAspectText);
849 if (myToDrawYValues && myNbY > 0)
851 myAspectValues.ChangeColor() = myYColor;
852 const OpenGl_AspectText* aPrevAspectText = theWorkspace->SetAspectText (&myAspectValues);
854 step = fabsf(LY1[4] - LY1[1]) / (float) myNbY;
855 offset = myYOffset + myYTickmarkLength;
856 for (unsigned int anIter = 0; anIter <= myNbY; ++anIter)
858 sprintf (textValue, "%g", LY1[1] + anIter * step);
859 myLabelValues.Init (theWorkspace->GetGlContext(), textValue,
860 OpenGl_Vec3(m1[0] + offset * m2[0], LY1[1] + anIter * step, m1[2] + offset * m2[2]));
861 myLabelValues.Render (theWorkspace);
863 theWorkspace->SetAspectText (aPrevAspectText);
867 if (myDrawYTickmarks && myNbY > 0)
869 glColor3fv(myGridColor);
872 step = fabsf(LY1[4] - LY1[1]) / (float) myNbY;
876 glVertex3f(m1[0], LY1[1] + i * step, m1[2]);
877 glVertex3f(m1[0] + myYTickmarkLength * m2[0], LY1[1] + i * step, m1[2] + myYTickmarkLength * m2[2]);
884 if (myToDrawZName || myToDrawZValues)
886 // Middle point of the first Z-axis
887 m1[0] = 0.5f * (LZ1[0] + LZ1[3]);
888 m1[1] = 0.5f * (LZ1[1] + LZ1[4]);
889 m1[2] = 0.5f * (LZ1[2] + LZ1[5]);
891 // Middle point of the second Z-axis
892 m2[0] = 0.5f * (LZ2[0] + LZ2[3]);
893 m2[1] = 0.5f * (LZ2[1] + LZ2[4]);
894 m2[2] = 0.5f * (LZ2[2] + LZ2[5]);
896 // Apply offset to m1
898 if (fabsf(dx) > 1.e-7f)
900 dx = (dx > 0.0f)? 1.0f : -1.0f;
903 if (fabsf(dy) > 1.e-7f)
905 dy = (dy > 0.0f)? 1.0f : -1.0f;
914 offset = myZAxisOffset + myZTickmarkLength;
916 myAspectLabels.ChangeColor() = myZNameColor;
917 const OpenGl_AspectText* aPrevAspectText = theWorkspace->SetAspectText (&myAspectLabels);
918 myLabelZ.SetPosition (OpenGl_Vec3(m1[0] + offset * m2[0], m1[1] + offset * m2[1], m1[2]));
919 myLabelZ.Render (theWorkspace);
920 theWorkspace->SetAspectText (aPrevAspectText);
924 if (myToDrawZValues && myNbZ > 0)
926 myAspectValues.ChangeColor() = myZColor;
927 const OpenGl_AspectText* aPrevAspectText = theWorkspace->SetAspectText (&myAspectValues);
929 step = fabsf(LZ1[5] - LZ1[2]) / (float) myNbZ;
930 offset = myZOffset + myZTickmarkLength;
931 for (unsigned int anIter = 0; anIter <= myNbZ; ++anIter)
933 sprintf (textValue, "%g", LZ1[2] + anIter * step);
934 myLabelValues.Init (theWorkspace->GetGlContext(), textValue,
935 OpenGl_Vec3(m1[0] + offset * m2[0], m1[1] + offset * m2[1], LZ1[2] + anIter * step));
936 myLabelValues.Render (theWorkspace);
938 theWorkspace->SetAspectText (aPrevAspectText);
942 if (myDrawZTickmarks && myNbZ > 0)
944 glColor3fv(myGridColor);
947 step = fabsf(LZ1[5] - LZ1[2]) / (float) myNbZ;
951 glVertex3f(m1[0], m1[1], LZ1[2] + i * step);
952 glVertex3f(m1[0] + myZTickmarkLength * m2[0], m1[1] + myZTickmarkLength * m2[1], LZ1[2] + i * step);
959 // Activate the lighting if it was turned off by this method call
961 glEnable(GL_LIGHTING);
963 theWorkspace->SetAspectLine(oldAspectLine);
966 //call_graduatedtrihedron_minmaxvalues
967 void OpenGl_GraduatedTrihedron::SetMinMax (const Standard_ShortReal xMin, const Standard_ShortReal yMin, const Standard_ShortReal zMin,
968 const Standard_ShortReal xMax, const Standard_ShortReal yMax, const Standard_ShortReal zMax)