1 // File: OpenGl_GraduatedTrihedron.cxx
2 // Created: 20 September 2011
3 // Author: Sergey ZERCHANINOV
4 // Copyright: OPEN CASCADE 2011
6 #include <OpenGl_tgl_all.hxx>
16 #include <InterfaceGraphic_Graphic3d.hxx>
17 #include <InterfaceGraphic_Aspect.hxx>
18 #include <InterfaceGraphic_Visual3d.hxx>
27 #include <OpenGl_Workspace.hxx>
28 #include <OpenGl_View.hxx>
29 #include <OpenGl_GraduatedTrihedron.hxx>
30 #include <OpenGl_AspectLine.hxx>
32 IMPLEMENT_STANDARD_HANDLE(OpenGl_GraduatedTrihedron,MMgt_TShared)
33 IMPLEMENT_STANDARD_RTTIEXT(OpenGl_GraduatedTrihedron,MMgt_TShared)
35 const OpenGl_AspectLine myDefaultAspectLine;
38 float xmin = 0.0f, ymin = 0.0f, zmin = 0.0f, xmax = 100.0f, ymax = 100.0f, zmax = 100.0f;
40 /* Normal of the view (not normalized!) */
41 static float getNormal(float* normal)
44 GLdouble model_matrix[16], proj_matrix[16];
46 glGetDoublev(GL_MODELVIEW_MATRIX, model_matrix);
47 glGetDoublev(GL_PROJECTION_MATRIX, proj_matrix);
48 glGetIntegerv(GL_VIEWPORT, viewport);
50 double x1, y1, z1, x2, y2, z2, x3, y3, z3;
51 gluUnProject(viewport[0], viewport[1], 0., model_matrix, proj_matrix, viewport, &x1, &y1, &z1);
52 gluUnProject(viewport[0] + viewport[2], viewport[1], 0., model_matrix, proj_matrix, viewport, &x2, &y2, &z2);
53 gluUnProject(viewport[0], viewport[1] + viewport[3], 0., model_matrix, proj_matrix, viewport, &x3, &y3, &z3);
55 /* Normal out of user is p1p3^p1p2 */
56 const double dx1 = x3 - x1;
57 const double dy1 = y3 - y1;
58 const double dz1 = z3 - z1;
59 const double dx2 = x2 - x1;
60 const double dy2 = y2 - y1;
61 const double dz2 = z2 - z1;
62 normal[0] = (float) (dy1 * dz2 - dz1 * dy2);
63 normal[1] = (float) (dz1 * dx2 - dx1 * dz2);
64 normal[2] = (float) (dx1 * dy2 - dy1 * dx2);
66 /* Distance corresponding to 1 pixel */
67 const float width = (float) sqrt(dx2 * dx2 + dy2 * dy2 + dz2 * dz2);
68 return width / (float) viewport[2];
71 static float getDistance2Corner(float* normal, float* center, float x, float y, float z)
73 return normal[0] * (x - center[0]) + normal[1] * (y - center[1]) + normal[2] * (z - center[2]);
76 static char getFarestCorner(float d000, float d100, float d010, float d001,
77 float d110, float d101, float d011, float d111)
80 d000 > d100 && d000 > d010 && d000 > d001 && d000 > d110 &&
81 d000 > d101 && d000 > d011 && d000 > d111)
85 else if (d100 > 0.0f &&
86 d100 > d000 && d100 > d010 && d100 > d001 && d100 > d110 &&
87 d100 > d101 && d100 > d011 && d100 > d111)
91 else if (d010 > 0.0f &&
92 d010 > d000 && d010 > d100 && d010 > d001 && d010 > d110 &&
93 d010 > d101 && d010 > d011 && d010 > d111)
97 else if (d001 > 0.0f &&
98 d001 > d000 && d001 > d100 && d001 > d010 && d001 > d110 &&
99 d001 > d101 && d001 > d011 && d001 > d111)
103 else if (d110 > 0.0f &&
104 d110 > d000 && d110 > d100 && d110 > d010 && d110 > d001 &&
105 d110 > d101 && d110 > d011 && d110 > d111)
109 else if (d101 > 0.0f &&
110 d101 > d000 && d101 > d100 && d101 > d010 && d101 > d001 &&
111 d101 > d110 && d101 > d011 && d101 > d111)
115 else if (d011 > 0.0f &&
116 d011 > d000 && d011 > d100 && d011 > d010 && d011 > d001 &&
117 d011 > d110 && d011 > d101 && d011 > d111)
124 static void drawText(const Handle(OpenGl_Workspace) &AWorkspace, const wchar_t* text, const char* font, OSD_FontAspect style, int size, float x, float y, float z)
126 AWorkspace->FindFont(font, style, size);
127 AWorkspace->RenderText(text, 0, x, y, z);
129 /* 4 OCC 6.3.1 and older:
133 fontBase = tXfmsetfont (1.0F, 1.0F);
135 fontBase = WNTSetFont (1.0F, 1.0F);
139 tXfmprstr(text, fontBase, x, y, z);
141 WNTPuts(text, fontBase, 0, x, y, z);
146 static void drawArrow(float x1, float y1, float z1,
147 float x2, float y2, float z2,
148 float xn, float yn, float zn)
154 float xa1, ya1, za1, xa2, ya2, za2;
156 /* Start of arrow: at 10% from the end */
157 x0 = x1 + 0.9f * (x2 - x1); y0 = y1 + 0.9f * (y2 - y1); z0 = z1 + 0.9f * (z2 - z1);
159 /* Base of the arrow */
160 xa = (x2 - x0); ya = (y2 - y0); za = (z2 - z0);
162 /* Height of the arrow */
163 h = sqrtf(xa * xa + ya * ya + za * za);
166 xa = xa / h; ya = ya / h; za = za / h;
168 /* Radial direction to the arrow */
169 xr = ya * zn - za * yn;
170 yr = za * xn - xa * zn;
171 zr = xa * yn - ya * xn;
173 /* Normalize the radial vector */
174 r = sqrtf(xr * xr + yr * yr + zr * zr);
177 xr = xr / r; yr = yr / r; zr = zr / r;
179 /* First point of the base of the arrow */
181 xr = r * xr; yr = r * yr; zr = r * zr;
182 xa1 = x0 + xr; ya1 = y0 + yr; za1 = z0 + zr;
184 /* Second point of the base of the arrow */
185 xa2 = x0 - xr; ya2 = y0 - yr; za2 = z0 - zr;
187 /* Draw a line to the arrow */
189 glVertex3f(x1, y1, z1);
190 glVertex3f(x0, y0, z0);
193 /* Draw a triangle of the arrow */
194 glBegin(GL_LINE_LOOP);
195 glVertex3f(xa1, ya1, za1);
196 glVertex3f(xa2, ya2, za2);
197 glVertex3f(x2, y2, z2);
201 OpenGl_GraduatedTrihedron::OpenGl_GraduatedTrihedron (const Graphic3d_CGraduatedTrihedron &AData)
202 : myXName(NULL), myYName(NULL), myZName(NULL),
203 myDrawXName(AData.xdrawname), myDrawYName(AData.ydrawname), myDrawZName(AData.zdrawname),
204 myDrawXValues(AData.xdrawvalues), myDrawYValues(AData.ydrawvalues), myDrawZValues(AData.zdrawvalues),
205 myDrawGrid(AData.drawgrid), myDrawAxes(AData.drawaxes),
206 myNbX(AData.nbx), myNbY(AData.nby), myNbZ(AData.nbz),
207 myXOffset(AData.xoffset), myYOffset(AData.yoffset), myZOffset(AData.zoffset),
208 myXAxisOffset(AData.xaxisoffset), myYAxisOffset(AData.yaxisoffset), myZAxisOffset(AData.zaxisoffset),
209 myDrawXTickmarks(AData.xdrawtickmarks), myDrawYTickmarks(AData.ydrawtickmarks), myDrawZTickmarks(AData.zdrawtickmarks),
210 myXTickmarkLength(AData.xtickmarklength), myYTickmarkLength(AData.ytickmarklength), myZTickmarkLength(AData.ztickmarklength),
212 myStyleOfNames(AData.styleOfNames),
213 mySizeOfNames(AData.sizeOfNames),
214 myFontOfValues(NULL),
215 myStyleOfValues(AData.styleOfValues),
216 mySizeOfValues(AData.sizeOfValues),
217 myCbCubicAxes(AData.cbCubicAxes),
218 myPtrVisual3dView(AData.ptrVisual3dView)
222 int len = AData.xname.Length();
225 Standard_ExtString iname = AData.xname.ToExtString();
226 wchar_t *xname = new wchar_t[len+1];
227 len = 0; while (xname[len] = (wchar_t)(iname[len])) len++;
231 len = AData.yname.Length();
234 Standard_ExtString iname = AData.yname.ToExtString();
235 wchar_t *yname = new wchar_t[len+1];
236 len = 0; while (yname[len] = (wchar_t)(iname[len])) len++;
240 len = AData.zname.Length();
243 Standard_ExtString iname = AData.zname.ToExtString();
244 wchar_t *zname = new wchar_t[len+1];
245 len = 0; while (zname[len] = (wchar_t)(iname[len])) len++;
249 myGridColor[0] = (float) AData.gridcolor.Red();
250 myGridColor[1] = (float) AData.gridcolor.Green();
251 myGridColor[2] = (float) AData.gridcolor.Blue();
253 myXNameColor[0] = (float) AData.xnamecolor.Red();
254 myXNameColor[1] = (float) AData.xnamecolor.Green();
255 myXNameColor[2] = (float) AData.xnamecolor.Blue();
257 myYNameColor[0] = (float) AData.ynamecolor.Red();
258 myYNameColor[1] = (float) AData.ynamecolor.Green();
259 myYNameColor[2] = (float) AData.ynamecolor.Blue();
261 myZNameColor[0] = (float) AData.znamecolor.Red();
262 myZNameColor[1] = (float) AData.znamecolor.Green();
263 myZNameColor[2] = (float) AData.znamecolor.Blue();
264 /* X color of axis and values */
265 myXColor[0] = (float) AData.xcolor.Red();
266 myXColor[1] = (float) AData.xcolor.Green();
267 myXColor[2] = (float) AData.xcolor.Blue();
268 /* Y color of axis and values */
269 myYColor[0] = (float) AData.ycolor.Red();
270 myYColor[1] = (float) AData.ycolor.Green();
271 myYColor[2] = (float) AData.ycolor.Blue();
272 /* Z color of axis and values */
273 myZColor[0] = (float) AData.zcolor.Red();
274 myZColor[1] = (float) AData.zcolor.Green();
275 myZColor[2] = (float) AData.zcolor.Blue();
276 /* Font name of names of axes: Courier, Arial, ... */
277 len = AData.fontOfNames.Length();
278 char *fontOfNames = new char[len+1];
280 strcpy(fontOfNames, AData.fontOfNames.ToCString());
282 fontOfNames[0] = '\0';
283 myFontOfNames = fontOfNames;
284 /* Font name of values: Courier, Arial, ... */
285 len = AData.fontOfValues.Length();
286 char *fontOfValues = new char[len+1];
288 strcpy(fontOfValues, AData.fontOfValues.ToCString());
290 fontOfValues[0] = '\0';
291 myFontOfValues = fontOfValues;
294 OpenGl_GraduatedTrihedron::~OpenGl_GraduatedTrihedron ()
306 delete[] myFontOfNames;
308 delete[] myFontOfValues;
311 //call_graduatedtrihedron_redraw
312 void OpenGl_GraduatedTrihedron::Render (const Handle(OpenGl_Workspace) &AWorkspace) const
314 const OpenGl_AspectLine *oldAspectLine = AWorkspace->SetAspectLine(&myDefaultAspectLine);
315 AWorkspace->AspectLine(Standard_True);
317 /* Update boundary box */
319 myCbCubicAxes(myPtrVisual3dView);
321 /* Disable lighting for lines */
322 GLboolean light = glIsEnabled(GL_LIGHTING);
324 glDisable(GL_LIGHTING);
326 /* Find the farest point of bounding box */
328 /* Get normal of the view out of user. */
329 /* Also, the method return distance corresponding to 1 pixel */
331 float dpix = getNormal(normal);
333 /* Normalize normal */
334 float d = sqrtf(normal[0] * normal[0] + normal[1] * normal[1] + normal[2] * normal[2]);
339 /* Get central point of bounding box */
341 center[0] = 0.5f * (xmin + xmax);
342 center[1] = 0.5f * (ymin + ymax);
343 center[2] = 0.5f * (zmin + zmax);
345 /* Check distance to corners of bounding box along the normal */
346 float d000 = getDistance2Corner(normal, center, xmin, ymin, zmin);
347 float d100 = getDistance2Corner(normal, center, xmax, ymin, zmin);
348 float d010 = getDistance2Corner(normal, center, xmin, ymax, zmin);
349 float d001 = getDistance2Corner(normal, center, xmin, ymin, zmax);
350 float d110 = getDistance2Corner(normal, center, xmax, ymax, zmin);
351 float d101 = getDistance2Corner(normal, center, xmax, ymin, zmax);
352 float d011 = getDistance2Corner(normal, center, xmin, ymax, zmax);
353 float d111 = getDistance2Corner(normal, center, xmax, ymax, zmax);
354 unsigned char farestCorner = getFarestCorner(d000, d100, d010, d001, d110, d101, d011, d111);
356 /* Choose axes for the grid. */
357 float LX1[6], LX2[6], LX3[6]; /* Lines along X direction */
358 float LY1[6], LY2[6], LY3[6]; /* Lines along Y direction */
359 float LZ1[6], LZ2[6], LZ3[6]; /* Lines along Z direction */
360 unsigned char LX1draw, LX2draw, LX3draw; /* Allows drawing of X-line (000 - 100 is forbidden) */
361 unsigned char LY1draw, LY2draw, LY3draw; /* Allows drawing of Y-line (000 - 010 is forbidden) */
362 unsigned char LZ1draw, LZ2draw, LZ3draw; /* Allows drawing of Z-line (000 - 001 is forbidden) */
364 /* The first axis will be used for drawing the text and the values. */
365 switch (farestCorner)
371 LX1[0] = xmin; LX1[1] = ymin; LX1[2] = zmax; LX1[3] = xmax; LX1[4] = ymin; LX1[5] = zmax;
373 LX2draw = 0; /* forbidden! */
374 LX2[0] = xmin; LX2[1] = ymin; LX2[2] = zmin; LX2[3] = xmax; LX2[4] = ymin; LX2[5] = zmin;
377 LX3[0] = xmin; LX3[1] = ymax; LX3[2] = zmin; LX3[3] = xmax; LX3[4] = ymax; LX3[5] = zmin;
381 LY1[0] = xmax; LY1[1] = ymin; LY1[2] = zmin; LY1[3] = xmax; LY1[4] = ymax; LY1[5] = zmin;
383 LY2draw = 0; /* forbidden! */
384 LY2[0] = xmin; LY2[1] = ymin; LY2[2] = zmin; LY2[3] = xmin; LY2[4] = ymax; LY2[5] = zmin;
387 LY3[0] = xmin; LY3[1] = ymin; LY3[2] = zmax; LY3[3] = xmin; LY3[4] = ymax; LY3[5] = zmax;
391 LZ1[0] = xmax; LZ1[1] = ymin; LZ1[2] = zmin; LZ1[3] = xmax; LZ1[4] = ymin; LZ1[5] = zmax;
393 LZ2draw = 0; /* forbidden! */
394 LZ2[0] = xmin; LZ2[1] = ymin; LZ2[2] = zmin; LZ2[3] = xmin; LZ2[4] = ymin; LZ2[5] = zmax;
397 LZ3[0] = xmin; LZ3[1] = ymax; LZ3[2] = zmin; LZ3[3] = xmin; LZ3[4] = ymax; LZ3[5] = zmax;
405 LX1[0] = xmin; LX1[1] = ymin; LX1[2] = zmax; LX1[3] = xmax; LX1[4] = ymin; LX1[5] = zmax;
407 LX2draw = 0; /* forbidden! */
408 LX2[0] = xmin; LX2[1] = ymin; LX2[2] = zmin; LX2[3] = xmax; LX2[4] = ymin; LX2[5] = zmin;
411 LX3[0] = xmin; LX3[1] = ymax; LX3[2] = zmin; LX3[3] = xmax; LX3[4] = ymax; LX3[5] = zmin;
414 LY1draw = 0; /* forbidden! */
415 LY1[0] = xmin; LY1[1] = ymin; LY1[2] = zmin; LY1[3] = xmin; LY1[4] = ymax; LY1[5] = zmin;
418 LY2[0] = xmax; LY2[1] = ymin; LY2[2] = zmin; LY2[3] = xmax; LY2[4] = ymax; LY2[5] = zmin;
421 LY3[0] = xmax; LY3[1] = ymin; LY3[2] = zmax; LY3[3] = xmax; LY3[4] = ymax; LY3[5] = zmax;
424 LZ1draw = 0; /* forbidden! */
425 LZ1[0] = xmin; LZ1[1] = ymin; LZ1[2] = zmin; LZ1[3] = xmin; LZ1[4] = ymin; LZ1[5] = zmax;
428 LZ2[0] = xmax; LZ2[1] = ymin; LZ2[2] = zmin; LZ2[3] = xmax; LZ2[4] = ymin; LZ2[5] = zmax;
431 LZ3[0] = xmax; LZ3[1] = ymax; LZ3[2] = zmin; LZ3[3] = xmax; LZ3[4] = ymax; LZ3[5] = zmax;
438 LX1draw = 0; /* forbidden */
439 LX1[0] = xmin; LX1[1] = ymin; LX1[2] = zmin; LX1[3] = xmax; LX1[4] = ymin; LX1[5] = zmin;
442 LX2[0] = xmin; LX2[1] = ymax; LX2[2] = zmin; LX2[3] = xmax; LX2[4] = ymax; LX2[5] = zmin;
445 LX3[0] = xmin; LX3[1] = ymax; LX3[2] = zmax; LX3[3] = xmax; LX3[4] = ymax; LX3[5] = zmax;
449 LY1[0] = xmax; LY1[1] = ymin; LY1[2] = zmin; LY1[3] = xmax; LY1[4] = ymax; LY1[5] = zmin;
451 LY2draw = 0; /* forbidden */
452 LY2[0] = xmin; LY2[1] = ymin; LY2[2] = zmin; LY2[3] = xmin; LY2[4] = ymax; LY2[5] = zmin;
455 LY3[0] = xmin; LY3[1] = ymin; LY3[2] = zmax; LY3[3] = xmin; LY3[4] = ymax; LY3[5] = zmax;
459 LZ1[0] = xmax; LZ1[1] = ymax; LZ1[2] = zmin; LZ1[3] = xmax; LZ1[4] = ymax; LZ1[5] = zmax;
462 LZ2[0] = xmin; LZ2[1] = ymax; LZ2[2] = zmin; LZ2[3] = xmin; LZ2[4] = ymax; LZ2[5] = zmax;
464 LZ3draw = 0; /* forbidden */
465 LZ3[0] = xmin; LZ3[1] = ymin; LZ3[2] = zmin; LZ3[3] = xmin; LZ3[4] = ymin; LZ3[5] = zmax;
472 LX1draw = 0; /* forbidden */
473 LX1[0] = xmin; LX1[1] = ymin; LX1[2] = zmin; LX1[3] = xmax; LX1[4] = ymin; LX1[5] = zmin;
476 LX2[0] = xmin; LX2[1] = ymin; LX2[2] = zmax; LX2[3] = xmax; LX2[4] = ymin; LX2[5] = zmax;
479 LX3[0] = xmin; LX3[1] = ymax; LX3[2] = zmax; LX3[3] = xmax; LX3[4] = ymax; LX3[5] = zmax;
482 LY1draw = 0; /* forbidden */
483 LY1[0] = xmin; LY1[1] = ymin; LY1[2] = zmin; LY1[3] = xmin; LY1[4] = ymax; LY1[5] = zmin;
486 LY2[0] = xmin; LY2[1] = ymin; LY2[2] = zmax; LY2[3] = xmin; LY2[4] = ymax; LY2[5] = zmax;
489 LY3[0] = xmax; LY3[1] = ymin; LY3[2] = zmax; LY3[3] = xmax; LY3[4] = ymax; LY3[5] = zmax;
493 LZ1[0] = xmax; LZ1[1] = ymin; LZ1[2] = zmin; LZ1[3] = xmax; LZ1[4] = ymin; LZ1[5] = zmax;
495 LZ2draw = 0; /* forbidden */
496 LZ2[0] = xmin; LZ2[1] = ymin; LZ2[2] = zmin; LZ2[3] = xmin; LZ2[4] = ymin; LZ2[5] = zmax;
499 LZ3[0] = xmin; LZ3[1] = ymax; LZ3[2] = zmin; LZ3[3] = xmin; LZ3[4] = ymax; LZ3[5] = zmax;
506 LX1draw = 0; /* forbidden */
507 LX1[0] = xmin; LX1[1] = ymin; LX1[2] = zmin; LX1[3] = xmax; LX1[4] = ymin; LX1[5] = zmin;
510 LX2[0] = xmin; LX2[1] = ymax; LX2[2] = zmin; LX2[3] = xmax; LX2[4] = ymax; LX2[5] = zmin;
513 LX3[0] = xmin; LX3[1] = ymax; LX3[2] = zmax; LX3[3] = xmax; LX3[4] = ymax; LX3[5] = zmax;
516 LY1draw = 0; /* forbidden */
517 LY1[0] = xmin; LY1[1] = ymin; LY1[2] = zmin; LY1[3] = xmin; LY1[4] = ymax; LY1[5] = zmin;
520 LY2[0] = xmax; LY2[1] = ymin; LY2[2] = zmin; LY2[3] = xmax; LY2[4] = ymax; LY2[5] = zmin;
523 LY3[0] = xmax; LY3[1] = ymin; LY3[2] = zmax; LY3[3] = xmax; LY3[4] = ymax; LY3[5] = zmax;
527 LZ1[0] = xmax; LZ1[1] = ymin; LZ1[2] = zmin; LZ1[3] = xmax; LZ1[4] = ymin; LZ1[5] = zmax;
530 LZ2[0] = xmax; LZ2[1] = ymax; LZ2[2] = zmin; LZ2[3] = xmax; LZ2[4] = ymax; LZ2[5] = zmax;
533 LZ3[0] = xmin; LZ3[1] = ymax; LZ3[2] = zmin; LZ3[3] = xmin; LZ3[4] = ymax; LZ3[5] = zmax;
540 LX1draw = 0; /* forbidden */
541 LX1[0] = xmin; LX1[1] = ymin; LX1[2] = zmin; LX1[3] = xmax; LX1[4] = ymin; LX1[5] = zmin;
544 LX2[0] = xmin; LX2[1] = ymin; LX2[2] = zmax; LX2[3] = xmax; LX2[4] = ymin; LX2[5] = zmax;
547 LX3[0] = xmin; LX3[1] = ymax; LX3[2] = zmax; LX3[3] = xmax; LX3[4] = ymax; LX3[5] = zmax;
551 LY1[0] = xmax; LY1[1] = ymin; LY1[2] = zmin; LY1[3] = xmax; LY1[4] = ymax; LY1[5] = zmin;
554 LY2[0] = xmax; LY2[1] = ymin; LY2[2] = zmax; LY2[3] = xmax; LY2[4] = ymax; LY2[5] = zmax;
557 LY3[0] = xmin; LY3[1] = ymin; LY3[2] = zmax; LY3[3] = xmin; LY3[4] = ymax; LY3[5] = zmax;
560 LZ1draw = 0; /* forbidden */
561 LZ1[0] = xmin; LZ1[1] = ymin; LZ1[2] = zmin; LZ1[3] = xmin; LZ1[4] = ymin; LZ1[5] = zmax;
564 LZ2[0] = xmax; LZ2[1] = ymin; LZ2[2] = zmin; LZ2[3] = xmax; LZ2[4] = ymin; LZ2[5] = zmax;
567 LZ3[0] = xmax; LZ3[1] = ymax; LZ3[2] = zmin; LZ3[3] = xmax; LZ3[4] = ymax; LZ3[5] = zmax;
575 LX1[0] = xmin; LX1[1] = ymin; LX1[2] = zmax; LX1[3] = xmax; LX1[4] = ymin; LX1[5] = zmax;
578 LX2[0] = xmin; LX2[1] = ymax; LX2[2] = zmax; LX2[3] = xmax; LX2[4] = ymax; LX2[5] = zmax;
581 LX3[0] = xmin; LX3[1] = ymax; LX3[2] = zmin; LX3[3] = xmax; LX3[4] = ymax; LX3[5] = zmin;
584 LY1draw = 0; /* forbidden */
585 LY1[0] = xmin; LY1[1] = ymin; LY1[2] = zmin; LY1[3] = xmin; LY1[4] = ymax; LY1[5] = zmin;
588 LY2[0] = xmin; LY2[1] = ymin; LY2[2] = zmax; LY2[3] = xmin; LY2[4] = ymax; LY2[5] = zmax;
591 LY3[0] = xmax; LY3[1] = ymin; LY3[2] = zmax; LY3[3] = xmax; LY3[4] = ymax; LY3[5] = zmax;
594 LZ1draw = 0; /* forbidden */
595 LZ1[0] = xmin; LZ1[1] = ymin; LZ1[2] = zmin; LZ1[3] = xmin; LZ1[4] = ymin; LZ1[5] = zmax;
598 LZ2[0] = xmin; LZ2[1] = ymax; LZ2[2] = zmin; LZ2[3] = xmin; LZ2[4] = ymax; LZ2[5] = zmax;
601 LZ3[0] = xmax; LZ3[1] = ymax; LZ3[2] = zmin; LZ3[3] = xmax; LZ3[4] = ymax; LZ3[5] = zmax;
609 LX1[0] = xmin; LX1[1] = ymax; LX1[2] = zmin; LX1[3] = xmax; LX1[4] = ymax; LX1[5] = zmin;
612 LX2[0] = xmin; LX2[1] = ymax; LX2[2] = zmax; LX2[3] = xmax; LX2[4] = ymax; LX2[5] = zmax;
615 LX3[0] = xmin; LX3[1] = ymin; LX3[2] = zmax; LX3[3] = xmax; LX3[4] = ymin; LX3[5] = zmax;
619 LY1[0] = xmax; LY1[1] = ymin; LY1[2] = zmin; LY1[3] = xmax; LY1[4] = ymax; LY1[5] = zmin;
622 LY2[0] = xmax; LY2[1] = ymin; LY2[2] = zmax; LY2[3] = xmax; LY2[4] = ymax; LY2[5] = zmax;
625 LY3[0] = xmin; LY3[1] = ymin; LY3[2] = zmax; LY3[3] = xmin; LY3[4] = ymax; LY3[5] = zmax;
629 LZ1[0] = xmax; LZ1[1] = ymin; LZ1[2] = zmin; LZ1[3] = xmax; LZ1[4] = ymin; LZ1[5] = zmax;
632 LZ2[0] = xmax; LZ2[1] = ymax; LZ2[2] = zmin; LZ2[3] = xmax; LZ2[4] = ymax; LZ2[5] = zmax;
635 LZ3[0] = xmin; LZ3[1] = ymax; LZ3[2] = zmin; LZ3[3] = xmin; LZ3[4] = ymax; LZ3[5] = zmax;
641 /* Draw the graduated trihedron */
642 unsigned int i, j, offset;
644 float step, dx, dy, dz;
649 glColor3fv(myGridColor);
651 /* Boundary grid-lines */
654 glVertex3fv(&(LX1[0]));
655 glVertex3fv(&(LX1[3]));
659 glVertex3fv(&(LX2[0]));
660 glVertex3fv(&(LX2[3]));
664 glVertex3fv(&(LX3[0]));
665 glVertex3fv(&(LX3[3]));
669 glVertex3fv(&(LY1[0]));
670 glVertex3fv(&(LY1[3]));
674 glVertex3fv(&(LY2[0]));
675 glVertex3fv(&(LY2[3]));
679 glVertex3fv(&(LY3[0]));
680 glVertex3fv(&(LY3[3]));
684 glVertex3fv(&(LZ1[0]));
685 glVertex3fv(&(LZ1[3]));
689 glVertex3fv(&(LZ2[0]));
690 glVertex3fv(&(LZ2[3]));
694 glVertex3fv(&(LZ3[0]));
695 glVertex3fv(&(LZ3[3]));
699 /* Intermediate grid-lines */
703 i = myDrawAxes ? 1 : 0;
704 step = fabsf(LX1[3] - LX1[0]) / (float) myNbX;
707 glBegin(GL_LINE_STRIP);
708 glVertex3f(LX1[0] + i * step, LX1[1], LX1[2]);
709 glVertex3f(LX2[0] + i * step, LX2[1], LX2[2]);
710 glVertex3f(LX3[0] + i * step, LX3[1], LX3[2]);
718 i = myDrawAxes ? 1 : 0;
719 step = fabsf(LY1[4] - LY1[1]) / (float) myNbY;
722 glBegin(GL_LINE_STRIP);
723 glVertex3f(LY1[0], LY1[1] + i * step, LY1[2]);
724 glVertex3f(LY2[0], LY2[1] + i * step, LY2[2]);
725 glVertex3f(LY3[0], LY3[1] + i * step, LY3[2]);
733 i = myDrawAxes ? 1 : 0;
734 step = fabsf(LZ1[5] - LZ1[2]) / (float) myNbZ;
737 glBegin(GL_LINE_STRIP);
738 glVertex3f(LZ1[0], LZ1[1], LZ1[2] + i * step);
739 glVertex3f(LZ2[0], LZ2[1], LZ2[2] + i * step);
740 glVertex3f(LZ3[0], LZ3[1], LZ3[2] + i * step);
751 glColor3fv(myXColor);
752 drawArrow(xmin, ymin, zmin, xmax, ymin, zmin, normal[0], normal[1], normal[2]);
755 glColor3fv(myYColor);
756 drawArrow(xmin, ymin, zmin, xmin, ymax, zmin, normal[0], normal[1], normal[2]);
759 glColor3fv(myZColor);
760 drawArrow(xmin, ymin, zmin, xmin, ymin, zmax, normal[0], normal[1], normal[2]);
763 /* Names of axes & values */
765 wchar_t wtextValue[128];
767 if (myDrawXName || myDrawXValues)
769 /* Middle point of the first X-axis */
770 m1[0] = 0.5f * (LX1[0] + LX1[3]);
771 m1[1] = 0.5f * (LX1[1] + LX1[4]);
772 m1[2] = 0.5f * (LX1[2] + LX1[5]);
774 /* Middle point of the second X-axis */
775 m2[0] = 0.5f * (LX2[0] + LX2[3]);
776 m2[1] = 0.5f * (LX2[1] + LX2[4]);
777 m2[2] = 0.5f * (LX2[2] + LX2[5]);
779 /* Apply offset to m1 */
781 if (fabsf(dy) > 1.e-7f)
783 dy = (dy > 0.0f)? 1.0f : -1.0f;
786 if (fabsf(dz) > 1.e-7f)
788 dz = (dz > 0.0f)? 1.0f : -1.0f;
796 glColor3fv(myXNameColor);
797 offset = myXAxisOffset + myXTickmarkLength;
798 drawText(AWorkspace, myXName, myFontOfNames, myStyleOfNames, mySizeOfNames,
799 m1[0], m1[1] + offset * m2[1], m1[2] + offset * m2[2]);
803 if (myDrawXValues && myNbX > 0)
805 glColor3fv(myXColor);
808 step = fabsf(LX1[3] - LX1[0]) / (float) myNbX;
809 offset = myXOffset + myXTickmarkLength;
812 sprintf(textValue, "%g", LX1[0] + i * step);
813 j = 0; while (wtextValue[j] = textValue[j]) j++;
814 drawText(AWorkspace, wtextValue, myFontOfValues, myStyleOfValues, mySizeOfValues,
815 LX1[0] + i * step, m1[1] + offset * m2[1], m1[2] + offset * m2[2]);
821 if (myDrawXTickmarks && myNbX > 0)
823 glColor3fv(myGridColor);
826 step = fabsf(LX1[3] - LX1[0]) / (float) myNbX;
830 glVertex3f(LX1[0] + i * step, m1[1], m1[2]);
831 glVertex3f(LX1[0] + i * step, m1[1] + myXTickmarkLength * m2[1], m1[2] + myXTickmarkLength * m2[2]);
838 if (myDrawYName || myDrawYValues)
840 /* Middle point of the first Y-axis */
841 m1[0] = 0.5f * (LY1[0] + LY1[3]);
842 m1[1] = 0.5f * (LY1[1] + LY1[4]);
843 m1[2] = 0.5f * (LY1[2] + LY1[5]);
845 /* Middle point of the second Y-axis */
846 m2[0] = 0.5f * (LY2[0] + LY2[3]);
847 m2[1] = 0.5f * (LY2[1] + LY2[4]);
848 m2[2] = 0.5f * (LY2[2] + LY2[5]);
850 /* Apply offset to m1 */
852 if (fabsf(dx) > 1.e-7f)
854 dx = (dx > 0.0f)? 1.0f : -1.0f;
857 if (fabsf(dz) > 1.e-7f)
859 dz = (dz > 0.0f)? 1.0f : -1.0f;
868 glColor3fv(myYNameColor);
869 offset = myYAxisOffset + myYTickmarkLength;
870 drawText(AWorkspace, myYName, myFontOfNames, myStyleOfNames, mySizeOfNames,
871 m1[0] + offset * m2[0], m1[1], m1[2] + offset * m2[2]);
875 if (myDrawYValues && myNbY > 0)
877 glColor3fv(myYColor);
880 step = fabsf(LY1[4] - LY1[1]) / (float) myNbY;
881 offset = myYOffset + myYTickmarkLength;
884 sprintf(textValue, "%g", LY1[1] + i * step);
885 j = 0; while (wtextValue[j] = textValue[j]) j++;
886 drawText(AWorkspace, wtextValue, myFontOfValues, myStyleOfValues, mySizeOfValues,
887 m1[0] + offset * m2[0], LY1[1] + i * step, m1[2] + offset * m2[2]);
893 if (myDrawYTickmarks && myNbY > 0)
895 glColor3fv(myGridColor);
898 step = fabsf(LY1[4] - LY1[1]) / (float) myNbY;
902 glVertex3f(m1[0], LY1[1] + i * step, m1[2]);
903 glVertex3f(m1[0] + myYTickmarkLength * m2[0], LY1[1] + i * step, m1[2] + myYTickmarkLength * m2[2]);
910 if (myDrawZName || myDrawZValues)
912 /* Middle point of the first Z-axis */
913 m1[0] = 0.5f * (LZ1[0] + LZ1[3]);
914 m1[1] = 0.5f * (LZ1[1] + LZ1[4]);
915 m1[2] = 0.5f * (LZ1[2] + LZ1[5]);
917 /* Middle point of the second Z-axis */
918 m2[0] = 0.5f * (LZ2[0] + LZ2[3]);
919 m2[1] = 0.5f * (LZ2[1] + LZ2[4]);
920 m2[2] = 0.5f * (LZ2[2] + LZ2[5]);
922 /* Apply offset to m1 */
924 if (fabsf(dx) > 1.e-7f)
926 dx = (dx > 0.0f)? 1.0f : -1.0f;
929 if (fabsf(dy) > 1.e-7f)
931 dy = (dy > 0.0f)? 1.0f : -1.0f;
940 glColor3fv(myZNameColor);
941 offset = myZAxisOffset + myZTickmarkLength;
942 drawText(AWorkspace, myZName, myFontOfNames, myStyleOfNames, mySizeOfNames,
943 m1[0] + offset * m2[0], m1[1] + offset * m2[1], m1[2]);
947 if (myDrawZValues && myNbZ > 0)
949 glColor3fv(myZColor);
952 step = fabsf(LZ1[5] - LZ1[2]) / (float) myNbZ;
953 offset = myZOffset + myZTickmarkLength;
956 sprintf(textValue, "%g", LZ1[2] + i * step);
957 j = 0; while (wtextValue[j] = textValue[j]) j++;
958 drawText(AWorkspace, wtextValue, myFontOfValues, myStyleOfValues, mySizeOfValues,
959 m1[0] + offset * m2[0], m1[1] + offset * m2[1], LZ1[2] + i * step);
965 if (myDrawZTickmarks && myNbZ > 0)
967 glColor3fv(myGridColor);
970 step = fabsf(LZ1[5] - LZ1[2]) / (float) myNbZ;
974 glVertex3f(m1[0], m1[1], LZ1[2] + i * step);
975 glVertex3f(m1[0] + myZTickmarkLength * m2[0], m1[1] + myZTickmarkLength * m2[1], LZ1[2] + i * step);
982 /* Activate the lighting if it was turned off by this method call */
984 glEnable(GL_LIGHTING);
986 AWorkspace->SetAspectLine(oldAspectLine);
989 //call_graduatedtrihedron_minmaxvalues
990 void OpenGl_GraduatedTrihedron::SetMinMax (const Standard_ShortReal xMin, const Standard_ShortReal yMin, const Standard_ShortReal zMin,
991 const Standard_ShortReal xMax, const Standard_ShortReal yMax, const Standard_ShortReal zMax)