1 // Created on: 2011-09-20
2 // Created by: Sergey ZERCHANINOV
3 // Copyright (c) 2011-2013 OPEN CASCADE SAS
5 // The content of this file is subject to the Open CASCADE Technology Public
6 // License Version 6.5 (the "License"). You may not use the content of this file
7 // except in compliance with the License. Please obtain a copy of the License
8 // at http://www.opencascade.org and read it completely before using this file.
10 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
11 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
13 // The Original Code and all software distributed under the License is
14 // distributed on an "AS IS" basis, without warranty of any kind, and the
15 // Initial Developer hereby disclaims all such warranties, including without
16 // limitation, any warranties of merchantability, fitness for a particular
17 // purpose or non-infringement. Please see the License for the specific terms
18 // and conditions governing the rights and limitations under the License.
20 #include <OpenGl_GlCore11.hxx>
27 #include <InterfaceGraphic_Graphic3d.hxx>
28 #include <InterfaceGraphic_Aspect.hxx>
29 #include <InterfaceGraphic_Visual3d.hxx>
38 #include <OpenGl_Workspace.hxx>
39 #include <OpenGl_View.hxx>
40 #include <OpenGl_GraduatedTrihedron.hxx>
41 #include <OpenGl_AspectLine.hxx>
43 const OpenGl_AspectLine myDefaultAspectLine;
45 static const OpenGl_TextParam THE_LABEL_PARAMS =
47 16, Graphic3d_HTA_LEFT, Graphic3d_VTA_BOTTOM
51 float xmin = 0.0f, ymin = 0.0f, zmin = 0.0f, xmax = 100.0f, ymax = 100.0f, zmax = 100.0f;
53 /* Normal of the view (not normalized!) */
54 static float getNormal(float* normal)
57 GLdouble model_matrix[16], proj_matrix[16];
59 glGetDoublev(GL_MODELVIEW_MATRIX, model_matrix);
60 glGetDoublev(GL_PROJECTION_MATRIX, proj_matrix);
61 glGetIntegerv(GL_VIEWPORT, viewport);
63 double x1, y1, z1, x2, y2, z2, x3, y3, z3;
64 gluUnProject(viewport[0], viewport[1], 0., model_matrix, proj_matrix, viewport, &x1, &y1, &z1);
65 gluUnProject(viewport[0] + viewport[2], viewport[1], 0., model_matrix, proj_matrix, viewport, &x2, &y2, &z2);
66 gluUnProject(viewport[0], viewport[1] + viewport[3], 0., model_matrix, proj_matrix, viewport, &x3, &y3, &z3);
68 /* Normal out of user is p1p3^p1p2 */
69 const double dx1 = x3 - x1;
70 const double dy1 = y3 - y1;
71 const double dz1 = z3 - z1;
72 const double dx2 = x2 - x1;
73 const double dy2 = y2 - y1;
74 const double dz2 = z2 - z1;
75 normal[0] = (float) (dy1 * dz2 - dz1 * dy2);
76 normal[1] = (float) (dz1 * dx2 - dx1 * dz2);
77 normal[2] = (float) (dx1 * dy2 - dy1 * dx2);
79 /* Distance corresponding to 1 pixel */
80 const float width = (float) sqrt(dx2 * dx2 + dy2 * dy2 + dz2 * dz2);
81 return width / (float) viewport[2];
84 static float getDistance2Corner(float* normal, float* center, float x, float y, float z)
86 return normal[0] * (x - center[0]) + normal[1] * (y - center[1]) + normal[2] * (z - center[2]);
89 static char getFarestCorner(float d000, float d100, float d010, float d001,
90 float d110, float d101, float d011, float d111)
93 d000 > d100 && d000 > d010 && d000 > d001 && d000 > d110 &&
94 d000 > d101 && d000 > d011 && d000 > d111)
98 else if (d100 > 0.0f &&
99 d100 > d000 && d100 > d010 && d100 > d001 && d100 > d110 &&
100 d100 > d101 && d100 > d011 && d100 > d111)
104 else if (d010 > 0.0f &&
105 d010 > d000 && d010 > d100 && d010 > d001 && d010 > d110 &&
106 d010 > d101 && d010 > d011 && d010 > d111)
110 else if (d001 > 0.0f &&
111 d001 > d000 && d001 > d100 && d001 > d010 && d001 > d110 &&
112 d001 > d101 && d001 > d011 && d001 > d111)
116 else if (d110 > 0.0f &&
117 d110 > d000 && d110 > d100 && d110 > d010 && d110 > d001 &&
118 d110 > d101 && d110 > d011 && d110 > d111)
122 else if (d101 > 0.0f &&
123 d101 > d000 && d101 > d100 && d101 > d010 && d101 > d001 &&
124 d101 > d110 && d101 > d011 && d101 > d111)
128 else if (d011 > 0.0f &&
129 d011 > d000 && d011 > d100 && d011 > d010 && d011 > d001 &&
130 d011 > d110 && d011 > d101 && d011 > d111)
137 static void drawArrow(float x1, float y1, float z1,
138 float x2, float y2, float z2,
139 float xn, float yn, float zn)
145 float xa1, ya1, za1, xa2, ya2, za2;
147 /* Start of arrow: at 10% from the end */
148 x0 = x1 + 0.9f * (x2 - x1); y0 = y1 + 0.9f * (y2 - y1); z0 = z1 + 0.9f * (z2 - z1);
150 /* Base of the arrow */
151 xa = (x2 - x0); ya = (y2 - y0); za = (z2 - z0);
153 /* Height of the arrow */
154 h = sqrtf(xa * xa + ya * ya + za * za);
157 xa = xa / h; ya = ya / h; za = za / h;
159 /* Radial direction to the arrow */
160 xr = ya * zn - za * yn;
161 yr = za * xn - xa * zn;
162 zr = xa * yn - ya * xn;
164 /* Normalize the radial vector */
165 r = sqrtf(xr * xr + yr * yr + zr * zr);
168 xr = xr / r; yr = yr / r; zr = zr / r;
170 /* First point of the base of the arrow */
172 xr = r * xr; yr = r * yr; zr = r * zr;
173 xa1 = x0 + xr; ya1 = y0 + yr; za1 = z0 + zr;
175 /* Second point of the base of the arrow */
176 xa2 = x0 - xr; ya2 = y0 - yr; za2 = z0 - zr;
178 /* Draw a line to the arrow */
180 glVertex3f(x1, y1, z1);
181 glVertex3f(x0, y0, z0);
184 /* Draw a triangle of the arrow */
185 glBegin(GL_LINE_LOOP);
186 glVertex3f(xa1, ya1, za1);
187 glVertex3f(xa2, ya2, za2);
188 glVertex3f(x2, y2, z2);
192 // =======================================================================
193 // function : Release
195 // =======================================================================
196 void OpenGl_GraduatedTrihedron::Release (const Handle(OpenGl_Context)& theCtx)
198 myLabelX.Release (theCtx);
199 myLabelY.Release (theCtx);
200 myLabelZ.Release (theCtx);
201 myLabelValues.Release (theCtx);
204 OpenGl_GraduatedTrihedron::OpenGl_GraduatedTrihedron (const Graphic3d_CGraduatedTrihedron& theData)
205 : myLabelX (theData.xname, OpenGl_Vec3(1.0f, 0.0f, 0.0f), THE_LABEL_PARAMS),
206 myLabelY (theData.yname, OpenGl_Vec3(0.0f, 1.0f, 0.0f), THE_LABEL_PARAMS),
207 myLabelZ (theData.zname, OpenGl_Vec3(0.0f, 0.0f, 1.0f), THE_LABEL_PARAMS),
208 myToDrawXName (theData.xdrawname == Standard_True),
209 myToDrawYName (theData.ydrawname == Standard_True),
210 myToDrawZName (theData.zdrawname == Standard_True),
211 myToDrawXValues (theData.xdrawvalues == Standard_True),
212 myToDrawYValues (theData.ydrawvalues == Standard_True),
213 myToDrawZValues (theData.zdrawvalues == Standard_True),
214 myToDrawGrid (theData.drawgrid == Standard_True),
215 myToDrawAxes (theData.drawaxes == Standard_True),
219 myXOffset (theData.xoffset),
220 myYOffset (theData.yoffset),
221 myZOffset (theData.zoffset),
222 myXAxisOffset (theData.xaxisoffset),
223 myYAxisOffset (theData.yaxisoffset),
224 myZAxisOffset (theData.zaxisoffset),
225 myDrawXTickmarks (theData.xdrawtickmarks),
226 myDrawYTickmarks (theData.ydrawtickmarks),
227 myDrawZTickmarks (theData.zdrawtickmarks),
228 myXTickmarkLength (theData.xtickmarklength),
229 myYTickmarkLength (theData.ytickmarklength),
230 myZTickmarkLength (theData.ztickmarklength),
231 myCbCubicAxes (theData.cbCubicAxes),
232 myPtrVisual3dView (theData.ptrVisual3dView)
234 myAspectLabels.ChangeFontName() = theData.fontOfNames;
235 myAspectValues.ChangeFontName() = theData.fontOfValues;
236 myAspectLabels.SetFontAspect (theData.styleOfNames);
237 myAspectValues.SetFontAspect (theData.styleOfValues);
238 myLabelX.SetFontSize (NULL, theData.sizeOfNames);
239 myLabelY.SetFontSize (NULL, theData.sizeOfNames);
240 myLabelZ.SetFontSize (NULL, theData.sizeOfNames);
241 myLabelValues.SetFontSize (NULL, theData.sizeOfValues);
244 myGridColor[0] = (float) theData.gridcolor.Red();
245 myGridColor[1] = (float) theData.gridcolor.Green();
246 myGridColor[2] = (float) theData.gridcolor.Blue();
248 myXNameColor.rgb[0] = (float )theData.xnamecolor.Red();
249 myXNameColor.rgb[1] = (float )theData.xnamecolor.Green();
250 myXNameColor.rgb[2] = (float )theData.xnamecolor.Blue();
251 myXNameColor.rgb[3] = 1.0f;
253 myYNameColor.rgb[0] = (float )theData.ynamecolor.Red();
254 myYNameColor.rgb[1] = (float )theData.ynamecolor.Green();
255 myYNameColor.rgb[2] = (float )theData.ynamecolor.Blue();
256 myYNameColor.rgb[3] = 1.0f;
258 myZNameColor.rgb[0] = (float )theData.znamecolor.Red();
259 myZNameColor.rgb[1] = (float )theData.znamecolor.Green();
260 myZNameColor.rgb[2] = (float )theData.znamecolor.Blue();
261 myZNameColor.rgb[3] = 1.0f;
262 // X color of axis and values
263 myXColor.rgb[0] = (float )theData.xcolor.Red();
264 myXColor.rgb[1] = (float )theData.xcolor.Green();
265 myXColor.rgb[2] = (float )theData.xcolor.Blue();
266 myXColor.rgb[3] = 1.0f;
267 // Y color of axis and values
268 myYColor.rgb[0] = (float )theData.ycolor.Red();
269 myYColor.rgb[1] = (float )theData.ycolor.Green();
270 myYColor.rgb[2] = (float )theData.ycolor.Blue();
271 myYColor.rgb[3] = 1.0f;
272 // Z color of axis and values
273 myZColor.rgb[0] = (float )theData.zcolor.Red();
274 myZColor.rgb[1] = (float )theData.zcolor.Green();
275 myZColor.rgb[2] = (float )theData.zcolor.Blue();
276 myZColor.rgb[3] = 1.0f;
279 OpenGl_GraduatedTrihedron::~OpenGl_GraduatedTrihedron()
284 //call_graduatedtrihedron_redraw
285 void OpenGl_GraduatedTrihedron::Render (const Handle(OpenGl_Workspace)& theWorkspace) const
287 const OpenGl_AspectLine *oldAspectLine = theWorkspace->SetAspectLine(&myDefaultAspectLine);
288 theWorkspace->AspectLine(Standard_True);
290 /* Update boundary box */
292 myCbCubicAxes(myPtrVisual3dView);
294 /* Disable lighting for lines */
295 GLboolean light = glIsEnabled(GL_LIGHTING);
297 glDisable(GL_LIGHTING);
299 /* Find the farest point of bounding box */
301 /* Get normal of the view out of user. */
302 /* Also, the method return distance corresponding to 1 pixel */
304 float dpix = getNormal(normal);
306 /* Normalize normal */
307 float d = sqrtf(normal[0] * normal[0] + normal[1] * normal[1] + normal[2] * normal[2]);
312 /* Get central point of bounding box */
314 center[0] = 0.5f * (xmin + xmax);
315 center[1] = 0.5f * (ymin + ymax);
316 center[2] = 0.5f * (zmin + zmax);
318 /* Check distance to corners of bounding box along the normal */
319 float d000 = getDistance2Corner(normal, center, xmin, ymin, zmin);
320 float d100 = getDistance2Corner(normal, center, xmax, ymin, zmin);
321 float d010 = getDistance2Corner(normal, center, xmin, ymax, zmin);
322 float d001 = getDistance2Corner(normal, center, xmin, ymin, zmax);
323 float d110 = getDistance2Corner(normal, center, xmax, ymax, zmin);
324 float d101 = getDistance2Corner(normal, center, xmax, ymin, zmax);
325 float d011 = getDistance2Corner(normal, center, xmin, ymax, zmax);
326 float d111 = getDistance2Corner(normal, center, xmax, ymax, zmax);
327 unsigned char farestCorner = getFarestCorner(d000, d100, d010, d001, d110, d101, d011, d111);
329 /* Choose axes for the grid. */
330 float LX1[6], LX2[6], LX3[6]; /* Lines along X direction */
331 float LY1[6], LY2[6], LY3[6]; /* Lines along Y direction */
332 float LZ1[6], LZ2[6], LZ3[6]; /* Lines along Z direction */
333 unsigned char LX1draw = 0, LX2draw = 0, LX3draw = 0; /* Allows drawing of X-line (000 - 100 is forbidden) */
334 unsigned char LY1draw = 0, LY2draw = 0, LY3draw = 0; /* Allows drawing of Y-line (000 - 010 is forbidden) */
335 unsigned char LZ1draw = 0, LZ2draw = 0, LZ3draw = 0; /* Allows drawing of Z-line (000 - 001 is forbidden) */
337 /* The first axis will be used for drawing the text and the values. */
338 switch (farestCorner)
344 LX1[0] = xmin; LX1[1] = ymin; LX1[2] = zmax; LX1[3] = xmax; LX1[4] = ymin; LX1[5] = zmax;
346 LX2draw = 0; /* forbidden! */
347 LX2[0] = xmin; LX2[1] = ymin; LX2[2] = zmin; LX2[3] = xmax; LX2[4] = ymin; LX2[5] = zmin;
350 LX3[0] = xmin; LX3[1] = ymax; LX3[2] = zmin; LX3[3] = xmax; LX3[4] = ymax; LX3[5] = zmin;
354 LY1[0] = xmax; LY1[1] = ymin; LY1[2] = zmin; LY1[3] = xmax; LY1[4] = ymax; LY1[5] = zmin;
356 LY2draw = 0; /* forbidden! */
357 LY2[0] = xmin; LY2[1] = ymin; LY2[2] = zmin; LY2[3] = xmin; LY2[4] = ymax; LY2[5] = zmin;
360 LY3[0] = xmin; LY3[1] = ymin; LY3[2] = zmax; LY3[3] = xmin; LY3[4] = ymax; LY3[5] = zmax;
364 LZ1[0] = xmax; LZ1[1] = ymin; LZ1[2] = zmin; LZ1[3] = xmax; LZ1[4] = ymin; LZ1[5] = zmax;
366 LZ2draw = 0; /* forbidden! */
367 LZ2[0] = xmin; LZ2[1] = ymin; LZ2[2] = zmin; LZ2[3] = xmin; LZ2[4] = ymin; LZ2[5] = zmax;
370 LZ3[0] = xmin; LZ3[1] = ymax; LZ3[2] = zmin; LZ3[3] = xmin; LZ3[4] = ymax; LZ3[5] = zmax;
378 LX1[0] = xmin; LX1[1] = ymin; LX1[2] = zmax; LX1[3] = xmax; LX1[4] = ymin; LX1[5] = zmax;
380 LX2draw = 0; /* forbidden! */
381 LX2[0] = xmin; LX2[1] = ymin; LX2[2] = zmin; LX2[3] = xmax; LX2[4] = ymin; LX2[5] = zmin;
384 LX3[0] = xmin; LX3[1] = ymax; LX3[2] = zmin; LX3[3] = xmax; LX3[4] = ymax; LX3[5] = zmin;
387 LY1draw = 0; /* forbidden! */
388 LY1[0] = xmin; LY1[1] = ymin; LY1[2] = zmin; LY1[3] = xmin; LY1[4] = ymax; LY1[5] = zmin;
391 LY2[0] = xmax; LY2[1] = ymin; LY2[2] = zmin; LY2[3] = xmax; LY2[4] = ymax; LY2[5] = zmin;
394 LY3[0] = xmax; LY3[1] = ymin; LY3[2] = zmax; LY3[3] = xmax; LY3[4] = ymax; LY3[5] = zmax;
397 LZ1draw = 0; /* forbidden! */
398 LZ1[0] = xmin; LZ1[1] = ymin; LZ1[2] = zmin; LZ1[3] = xmin; LZ1[4] = ymin; LZ1[5] = zmax;
401 LZ2[0] = xmax; LZ2[1] = ymin; LZ2[2] = zmin; LZ2[3] = xmax; LZ2[4] = ymin; LZ2[5] = zmax;
404 LZ3[0] = xmax; LZ3[1] = ymax; LZ3[2] = zmin; LZ3[3] = xmax; LZ3[4] = ymax; LZ3[5] = zmax;
411 LX1draw = 0; /* forbidden */
412 LX1[0] = xmin; LX1[1] = ymin; LX1[2] = zmin; LX1[3] = xmax; LX1[4] = ymin; LX1[5] = zmin;
415 LX2[0] = xmin; LX2[1] = ymax; LX2[2] = zmin; LX2[3] = xmax; LX2[4] = ymax; LX2[5] = zmin;
418 LX3[0] = xmin; LX3[1] = ymax; LX3[2] = zmax; LX3[3] = xmax; LX3[4] = ymax; LX3[5] = zmax;
422 LY1[0] = xmax; LY1[1] = ymin; LY1[2] = zmin; LY1[3] = xmax; LY1[4] = ymax; LY1[5] = zmin;
424 LY2draw = 0; /* forbidden */
425 LY2[0] = xmin; LY2[1] = ymin; LY2[2] = zmin; LY2[3] = xmin; LY2[4] = ymax; LY2[5] = zmin;
428 LY3[0] = xmin; LY3[1] = ymin; LY3[2] = zmax; LY3[3] = xmin; LY3[4] = ymax; LY3[5] = zmax;
432 LZ1[0] = xmax; LZ1[1] = ymax; LZ1[2] = zmin; LZ1[3] = xmax; LZ1[4] = ymax; LZ1[5] = zmax;
435 LZ2[0] = xmin; LZ2[1] = ymax; LZ2[2] = zmin; LZ2[3] = xmin; LZ2[4] = ymax; LZ2[5] = zmax;
437 LZ3draw = 0; /* forbidden */
438 LZ3[0] = xmin; LZ3[1] = ymin; LZ3[2] = zmin; LZ3[3] = xmin; LZ3[4] = ymin; LZ3[5] = zmax;
445 LX1draw = 0; /* forbidden */
446 LX1[0] = xmin; LX1[1] = ymin; LX1[2] = zmin; LX1[3] = xmax; LX1[4] = ymin; LX1[5] = zmin;
449 LX2[0] = xmin; LX2[1] = ymin; LX2[2] = zmax; LX2[3] = xmax; LX2[4] = ymin; LX2[5] = zmax;
452 LX3[0] = xmin; LX3[1] = ymax; LX3[2] = zmax; LX3[3] = xmax; LX3[4] = ymax; LX3[5] = zmax;
455 LY1draw = 0; /* forbidden */
456 LY1[0] = xmin; LY1[1] = ymin; LY1[2] = zmin; LY1[3] = xmin; LY1[4] = ymax; LY1[5] = zmin;
459 LY2[0] = xmin; LY2[1] = ymin; LY2[2] = zmax; LY2[3] = xmin; LY2[4] = ymax; LY2[5] = zmax;
462 LY3[0] = xmax; LY3[1] = ymin; LY3[2] = zmax; LY3[3] = xmax; LY3[4] = ymax; LY3[5] = zmax;
466 LZ1[0] = xmax; LZ1[1] = ymin; LZ1[2] = zmin; LZ1[3] = xmax; LZ1[4] = ymin; LZ1[5] = zmax;
468 LZ2draw = 0; /* forbidden */
469 LZ2[0] = xmin; LZ2[1] = ymin; LZ2[2] = zmin; LZ2[3] = xmin; LZ2[4] = ymin; LZ2[5] = zmax;
472 LZ3[0] = xmin; LZ3[1] = ymax; LZ3[2] = zmin; LZ3[3] = xmin; LZ3[4] = ymax; LZ3[5] = zmax;
479 LX1draw = 0; /* forbidden */
480 LX1[0] = xmin; LX1[1] = ymin; LX1[2] = zmin; LX1[3] = xmax; LX1[4] = ymin; LX1[5] = zmin;
483 LX2[0] = xmin; LX2[1] = ymax; LX2[2] = zmin; LX2[3] = xmax; LX2[4] = ymax; LX2[5] = zmin;
486 LX3[0] = xmin; LX3[1] = ymax; LX3[2] = zmax; LX3[3] = xmax; LX3[4] = ymax; LX3[5] = zmax;
489 LY1draw = 0; /* forbidden */
490 LY1[0] = xmin; LY1[1] = ymin; LY1[2] = zmin; LY1[3] = xmin; LY1[4] = ymax; LY1[5] = zmin;
493 LY2[0] = xmax; LY2[1] = ymin; LY2[2] = zmin; LY2[3] = xmax; LY2[4] = ymax; LY2[5] = zmin;
496 LY3[0] = xmax; LY3[1] = ymin; LY3[2] = zmax; LY3[3] = xmax; LY3[4] = ymax; LY3[5] = zmax;
500 LZ1[0] = xmax; LZ1[1] = ymin; LZ1[2] = zmin; LZ1[3] = xmax; LZ1[4] = ymin; LZ1[5] = zmax;
503 LZ2[0] = xmax; LZ2[1] = ymax; LZ2[2] = zmin; LZ2[3] = xmax; LZ2[4] = ymax; LZ2[5] = zmax;
506 LZ3[0] = xmin; LZ3[1] = ymax; LZ3[2] = zmin; LZ3[3] = xmin; LZ3[4] = ymax; LZ3[5] = zmax;
513 LX1draw = 0; /* forbidden */
514 LX1[0] = xmin; LX1[1] = ymin; LX1[2] = zmin; LX1[3] = xmax; LX1[4] = ymin; LX1[5] = zmin;
517 LX2[0] = xmin; LX2[1] = ymin; LX2[2] = zmax; LX2[3] = xmax; LX2[4] = ymin; LX2[5] = zmax;
520 LX3[0] = xmin; LX3[1] = ymax; LX3[2] = zmax; LX3[3] = xmax; LX3[4] = ymax; LX3[5] = zmax;
524 LY1[0] = xmax; LY1[1] = ymin; LY1[2] = zmin; LY1[3] = xmax; LY1[4] = ymax; LY1[5] = zmin;
527 LY2[0] = xmax; LY2[1] = ymin; LY2[2] = zmax; LY2[3] = xmax; LY2[4] = ymax; LY2[5] = zmax;
530 LY3[0] = xmin; LY3[1] = ymin; LY3[2] = zmax; LY3[3] = xmin; LY3[4] = ymax; LY3[5] = zmax;
533 LZ1draw = 0; /* forbidden */
534 LZ1[0] = xmin; LZ1[1] = ymin; LZ1[2] = zmin; LZ1[3] = xmin; LZ1[4] = ymin; LZ1[5] = zmax;
537 LZ2[0] = xmax; LZ2[1] = ymin; LZ2[2] = zmin; LZ2[3] = xmax; LZ2[4] = ymin; LZ2[5] = zmax;
540 LZ3[0] = xmax; LZ3[1] = ymax; LZ3[2] = zmin; LZ3[3] = xmax; LZ3[4] = ymax; LZ3[5] = zmax;
548 LX1[0] = xmin; LX1[1] = ymin; LX1[2] = zmax; LX1[3] = xmax; LX1[4] = ymin; LX1[5] = zmax;
551 LX2[0] = xmin; LX2[1] = ymax; LX2[2] = zmax; LX2[3] = xmax; LX2[4] = ymax; LX2[5] = zmax;
554 LX3[0] = xmin; LX3[1] = ymax; LX3[2] = zmin; LX3[3] = xmax; LX3[4] = ymax; LX3[5] = zmin;
557 LY1draw = 0; /* forbidden */
558 LY1[0] = xmin; LY1[1] = ymin; LY1[2] = zmin; LY1[3] = xmin; LY1[4] = ymax; LY1[5] = zmin;
561 LY2[0] = xmin; LY2[1] = ymin; LY2[2] = zmax; LY2[3] = xmin; LY2[4] = ymax; LY2[5] = zmax;
564 LY3[0] = xmax; LY3[1] = ymin; LY3[2] = zmax; LY3[3] = xmax; LY3[4] = ymax; LY3[5] = zmax;
567 LZ1draw = 0; /* forbidden */
568 LZ1[0] = xmin; LZ1[1] = ymin; LZ1[2] = zmin; LZ1[3] = xmin; LZ1[4] = ymin; LZ1[5] = zmax;
571 LZ2[0] = xmin; LZ2[1] = ymax; LZ2[2] = zmin; LZ2[3] = xmin; LZ2[4] = ymax; LZ2[5] = zmax;
574 LZ3[0] = xmax; LZ3[1] = ymax; LZ3[2] = zmin; LZ3[3] = xmax; LZ3[4] = ymax; LZ3[5] = zmax;
582 LX1[0] = xmin; LX1[1] = ymax; LX1[2] = zmin; LX1[3] = xmax; LX1[4] = ymax; LX1[5] = zmin;
585 LX2[0] = xmin; LX2[1] = ymax; LX2[2] = zmax; LX2[3] = xmax; LX2[4] = ymax; LX2[5] = zmax;
588 LX3[0] = xmin; LX3[1] = ymin; LX3[2] = zmax; LX3[3] = xmax; LX3[4] = ymin; LX3[5] = zmax;
592 LY1[0] = xmax; LY1[1] = ymin; LY1[2] = zmin; LY1[3] = xmax; LY1[4] = ymax; LY1[5] = zmin;
595 LY2[0] = xmax; LY2[1] = ymin; LY2[2] = zmax; LY2[3] = xmax; LY2[4] = ymax; LY2[5] = zmax;
598 LY3[0] = xmin; LY3[1] = ymin; LY3[2] = zmax; LY3[3] = xmin; LY3[4] = ymax; LY3[5] = zmax;
602 LZ1[0] = xmax; LZ1[1] = ymin; LZ1[2] = zmin; LZ1[3] = xmax; LZ1[4] = ymin; LZ1[5] = zmax;
605 LZ2[0] = xmax; LZ2[1] = ymax; LZ2[2] = zmin; LZ2[3] = xmax; LZ2[4] = ymax; LZ2[5] = zmax;
608 LZ3[0] = xmin; LZ3[1] = ymax; LZ3[2] = zmin; LZ3[3] = xmin; LZ3[4] = ymax; LZ3[5] = zmax;
614 // Draw the graduated trihedron
615 unsigned int i, offset;
617 float step, dx, dy, dz;
622 glColor3fv(myGridColor);
624 // Boundary grid-lines
627 glVertex3fv(&(LX1[0]));
628 glVertex3fv(&(LX1[3]));
632 glVertex3fv(&(LX2[0]));
633 glVertex3fv(&(LX2[3]));
637 glVertex3fv(&(LX3[0]));
638 glVertex3fv(&(LX3[3]));
642 glVertex3fv(&(LY1[0]));
643 glVertex3fv(&(LY1[3]));
647 glVertex3fv(&(LY2[0]));
648 glVertex3fv(&(LY2[3]));
652 glVertex3fv(&(LY3[0]));
653 glVertex3fv(&(LY3[3]));
657 glVertex3fv(&(LZ1[0]));
658 glVertex3fv(&(LZ1[3]));
662 glVertex3fv(&(LZ2[0]));
663 glVertex3fv(&(LZ2[3]));
667 glVertex3fv(&(LZ3[0]));
668 glVertex3fv(&(LZ3[3]));
672 /* Intermediate grid-lines */
676 i = myToDrawAxes ? 1 : 0;
677 step = fabsf(LX1[3] - LX1[0]) / (float) myNbX;
680 glBegin(GL_LINE_STRIP);
681 glVertex3f(LX1[0] + i * step, LX1[1], LX1[2]);
682 glVertex3f(LX2[0] + i * step, LX2[1], LX2[2]);
683 glVertex3f(LX3[0] + i * step, LX3[1], LX3[2]);
691 i = myToDrawAxes ? 1 : 0;
692 step = fabsf(LY1[4] - LY1[1]) / (float) myNbY;
695 glBegin(GL_LINE_STRIP);
696 glVertex3f(LY1[0], LY1[1] + i * step, LY1[2]);
697 glVertex3f(LY2[0], LY2[1] + i * step, LY2[2]);
698 glVertex3f(LY3[0], LY3[1] + i * step, LY3[2]);
706 i = myToDrawAxes ? 1 : 0;
707 step = fabsf(LZ1[5] - LZ1[2]) / (float) myNbZ;
711 glBegin(GL_LINE_STRIP);
712 glVertex3f(LZ1[0], LZ1[1], LZ1[2] + i * step);
713 glVertex3f(LZ2[0], LZ2[1], LZ2[2] + i * step);
714 glVertex3f(LZ3[0], LZ3[1], LZ3[2] + i * step);
725 glColor3fv(myXColor.rgb);
726 drawArrow(xmin, ymin, zmin, xmax, ymin, zmin, normal[0], normal[1], normal[2]);
729 glColor3fv(myYColor.rgb);
730 drawArrow(xmin, ymin, zmin, xmin, ymax, zmin, normal[0], normal[1], normal[2]);
733 glColor3fv(myZColor.rgb);
734 drawArrow(xmin, ymin, zmin, xmin, ymin, zmax, normal[0], normal[1], normal[2]);
737 // Names of axes & values
740 if (myToDrawXName || myToDrawXValues)
742 // Middle point of the first X-axis
743 m1[0] = 0.5f * (LX1[0] + LX1[3]);
744 m1[1] = 0.5f * (LX1[1] + LX1[4]);
745 m1[2] = 0.5f * (LX1[2] + LX1[5]);
747 // Middle point of the second X-axis
748 m2[0] = 0.5f * (LX2[0] + LX2[3]);
749 m2[1] = 0.5f * (LX2[1] + LX2[4]);
750 m2[2] = 0.5f * (LX2[2] + LX2[5]);
752 // Apply offset to m1
754 if (fabsf(dy) > 1.e-7f)
756 dy = (dy > 0.0f)? 1.0f : -1.0f;
759 if (fabsf(dz) > 1.e-7f)
761 dz = (dz > 0.0f)? 1.0f : -1.0f;
769 offset = myXAxisOffset + myXTickmarkLength;
772 myAspectLabels.ChangeColor() = myXNameColor;
773 const OpenGl_AspectText* aPrevAspectText = theWorkspace->SetAspectText (&myAspectLabels);
774 myLabelX.SetPosition (OpenGl_Vec3(m1[0], m1[1] + offset * m2[1], m1[2] + offset * m2[2]));
775 myLabelX.Render (theWorkspace);
776 theWorkspace->SetAspectText (aPrevAspectText);
780 if (myToDrawXValues && myNbX > 0)
782 myAspectValues.ChangeColor() = myXColor;
783 const OpenGl_AspectText* aPrevAspectText = theWorkspace->SetAspectText (&myAspectValues);
785 step = fabsf(LX1[3] - LX1[0]) / (float) myNbX;
786 offset = myXOffset + myXTickmarkLength;
787 for (unsigned int anIter = 0; anIter <= myNbX; ++anIter)
789 sprintf (textValue, "%g", LX1[0] + anIter * step);
790 myLabelValues.Init (theWorkspace->GetGlContext(), textValue,
791 OpenGl_Vec3(LX1[0] + anIter * step, m1[1] + offset * m2[1], m1[2] + offset * m2[2]));
792 myLabelValues.Render (theWorkspace);
794 theWorkspace->SetAspectText (aPrevAspectText);
798 if (myDrawXTickmarks && myNbX > 0)
800 glColor3fv(myGridColor);
802 step = fabsf(LX1[3] - LX1[0]) / (float) myNbX;
803 for (unsigned int anIter = 0; anIter <= myNbX; ++anIter)
806 glVertex3f(LX1[0] + anIter * step, m1[1], m1[2]);
807 glVertex3f(LX1[0] + anIter * step, m1[1] + myXTickmarkLength * m2[1], m1[2] + myXTickmarkLength * m2[2]);
813 if (myToDrawYName || myToDrawYValues)
815 // Middle point of the first Y-axis
816 m1[0] = 0.5f * (LY1[0] + LY1[3]);
817 m1[1] = 0.5f * (LY1[1] + LY1[4]);
818 m1[2] = 0.5f * (LY1[2] + LY1[5]);
820 // Middle point of the second Y-axis
821 m2[0] = 0.5f * (LY2[0] + LY2[3]);
822 m2[1] = 0.5f * (LY2[1] + LY2[4]);
823 m2[2] = 0.5f * (LY2[2] + LY2[5]);
825 // Apply offset to m1
827 if (fabsf(dx) > 1.e-7f)
829 dx = (dx > 0.0f)? 1.0f : -1.0f;
832 if (fabsf(dz) > 1.e-7f)
834 dz = (dz > 0.0f)? 1.0f : -1.0f;
843 offset = myYAxisOffset + myYTickmarkLength;
845 myAspectLabels.ChangeColor() = myYNameColor;
846 const OpenGl_AspectText* aPrevAspectText = theWorkspace->SetAspectText (&myAspectLabels);
847 myLabelY.SetPosition (OpenGl_Vec3(m1[0] + offset * m2[0], m1[1], m1[2] + offset * m2[2]));
848 myLabelY.Render (theWorkspace);
849 theWorkspace->SetAspectText (aPrevAspectText);
853 if (myToDrawYValues && myNbY > 0)
855 myAspectValues.ChangeColor() = myYColor;
856 const OpenGl_AspectText* aPrevAspectText = theWorkspace->SetAspectText (&myAspectValues);
858 step = fabsf(LY1[4] - LY1[1]) / (float) myNbY;
859 offset = myYOffset + myYTickmarkLength;
860 for (unsigned int anIter = 0; anIter <= myNbY; ++anIter)
862 sprintf (textValue, "%g", LY1[1] + anIter * step);
863 myLabelValues.Init (theWorkspace->GetGlContext(), textValue,
864 OpenGl_Vec3(m1[0] + offset * m2[0], LY1[1] + anIter * step, m1[2] + offset * m2[2]));
865 myLabelValues.Render (theWorkspace);
867 theWorkspace->SetAspectText (aPrevAspectText);
871 if (myDrawYTickmarks && myNbY > 0)
873 glColor3fv(myGridColor);
876 step = fabsf(LY1[4] - LY1[1]) / (float) myNbY;
880 glVertex3f(m1[0], LY1[1] + i * step, m1[2]);
881 glVertex3f(m1[0] + myYTickmarkLength * m2[0], LY1[1] + i * step, m1[2] + myYTickmarkLength * m2[2]);
888 if (myToDrawZName || myToDrawZValues)
890 // Middle point of the first Z-axis
891 m1[0] = 0.5f * (LZ1[0] + LZ1[3]);
892 m1[1] = 0.5f * (LZ1[1] + LZ1[4]);
893 m1[2] = 0.5f * (LZ1[2] + LZ1[5]);
895 // Middle point of the second Z-axis
896 m2[0] = 0.5f * (LZ2[0] + LZ2[3]);
897 m2[1] = 0.5f * (LZ2[1] + LZ2[4]);
898 m2[2] = 0.5f * (LZ2[2] + LZ2[5]);
900 // Apply offset to m1
902 if (fabsf(dx) > 1.e-7f)
904 dx = (dx > 0.0f)? 1.0f : -1.0f;
907 if (fabsf(dy) > 1.e-7f)
909 dy = (dy > 0.0f)? 1.0f : -1.0f;
918 offset = myZAxisOffset + myZTickmarkLength;
920 myAspectLabels.ChangeColor() = myZNameColor;
921 const OpenGl_AspectText* aPrevAspectText = theWorkspace->SetAspectText (&myAspectLabels);
922 myLabelZ.SetPosition (OpenGl_Vec3(m1[0] + offset * m2[0], m1[1] + offset * m2[1], m1[2]));
923 myLabelZ.Render (theWorkspace);
924 theWorkspace->SetAspectText (aPrevAspectText);
928 if (myToDrawZValues && myNbZ > 0)
930 myAspectValues.ChangeColor() = myZColor;
931 const OpenGl_AspectText* aPrevAspectText = theWorkspace->SetAspectText (&myAspectValues);
933 step = fabsf(LZ1[5] - LZ1[2]) / (float) myNbZ;
934 offset = myZOffset + myZTickmarkLength;
935 for (unsigned int anIter = 0; anIter <= myNbZ; ++anIter)
937 sprintf (textValue, "%g", LZ1[2] + anIter * step);
938 myLabelValues.Init (theWorkspace->GetGlContext(), textValue,
939 OpenGl_Vec3(m1[0] + offset * m2[0], m1[1] + offset * m2[1], LZ1[2] + anIter * step));
940 myLabelValues.Render (theWorkspace);
942 theWorkspace->SetAspectText (aPrevAspectText);
946 if (myDrawZTickmarks && myNbZ > 0)
948 glColor3fv(myGridColor);
951 step = fabsf(LZ1[5] - LZ1[2]) / (float) myNbZ;
955 glVertex3f(m1[0], m1[1], LZ1[2] + i * step);
956 glVertex3f(m1[0] + myZTickmarkLength * m2[0], m1[1] + myZTickmarkLength * m2[1], LZ1[2] + i * step);
963 // Activate the lighting if it was turned off by this method call
965 glEnable(GL_LIGHTING);
967 theWorkspace->SetAspectLine(oldAspectLine);
970 //call_graduatedtrihedron_minmaxvalues
971 void OpenGl_GraduatedTrihedron::SetMinMax (const Standard_ShortReal xMin, const Standard_ShortReal yMin, const Standard_ShortReal zMin,
972 const Standard_ShortReal xMax, const Standard_ShortReal yMax, const Standard_ShortReal zMax)