1 // Created on: 2011-07-13
2 // Created by: Sergey ZERCHANINOV
3 // Copyright (c) 2011-2012 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.
21 #include <OpenGl_IndexBuffer.hxx>
22 #include <OpenGl_Context.hxx>
24 #include <OpenGl_PrimitiveArray.hxx>
26 #include <OpenGl_AspectFace.hxx>
27 #include <OpenGl_GraphicDriver.hxx>
28 #include <OpenGl_Structure.hxx>
29 #include <OpenGl_TextureBox.hxx>
31 #include <InterfaceGraphic_PrimitiveArray.hxx>
35 static unsigned long vRand = 1L;
36 #define OGL_Rand() (vRand = vRand * 214013L + 2531011L)
39 // =======================================================================
40 // function : clearMemoryOwn
42 // =======================================================================
43 void OpenGl_PrimitiveArray::clearMemoryOwn() const
45 Standard::Free ((Standard_Address& )myPArray->edges);
46 Standard::Free ((Standard_Address& )myPArray->vertices);
47 Standard::Free ((Standard_Address& )myPArray->vcolours);
48 Standard::Free ((Standard_Address& )myPArray->vnormals);
49 Standard::Free ((Standard_Address& )myPArray->vtexels);
50 Standard::Free ((Standard_Address& )myPArray->edge_vis); /// ???
52 myPArray->edges = NULL;
53 myPArray->vertices = NULL;
54 myPArray->vcolours = NULL;
55 myPArray->vnormals = NULL;
56 myPArray->vtexels = NULL;
57 myPArray->edge_vis = NULL;
60 // =======================================================================
61 // function : clearMemoryGL
63 // =======================================================================
64 void OpenGl_PrimitiveArray::clearMemoryGL (const Handle(OpenGl_Context)& theGlCtx) const
66 for (Standard_Integer anIter = 0; anIter < VBOMaxType; ++anIter)
68 if (!myVbos[anIter].IsNull())
70 myVbos[anIter]->Release (theGlCtx.operator->());
71 myVbos[anIter].Nullify();
76 // =======================================================================
77 // function : BuildVBO
79 // =======================================================================
80 Standard_Boolean OpenGl_PrimitiveArray::BuildVBO (const Handle(OpenGl_Workspace)& theWorkspace) const
82 const Handle(OpenGl_Context)& aGlCtx = theWorkspace->GetGlContext();
83 if (myPArray->vertices == NULL)
85 // vertices should be always defined - others are optional
86 return Standard_False;
88 myVbos[VBOVertices] = new OpenGl_VertexBuffer();
89 if (!myVbos[VBOVertices]->Init (aGlCtx, 3, myPArray->num_vertexs, &myPArray->vertices[0].xyz[0]))
91 clearMemoryGL (aGlCtx);
92 return Standard_False;
95 if (myPArray->edges != NULL)
97 myVbos[VBOEdges] = new OpenGl_IndexBuffer();
98 if (!myVbos[VBOEdges]->Init (aGlCtx, 1, myPArray->num_edges, (GLuint* )myPArray->edges))
100 clearMemoryGL (aGlCtx);
101 return Standard_False;
104 if (myPArray->vcolours != NULL)
106 myVbos[VBOVcolours] = new OpenGl_VertexBuffer();
107 if (!myVbos[VBOVcolours]->Init (aGlCtx, 4, myPArray->num_vertexs, (GLubyte* )myPArray->vcolours))
109 clearMemoryGL (aGlCtx);
110 return Standard_False;
113 if (myPArray->vnormals != NULL)
115 myVbos[VBOVnormals] = new OpenGl_VertexBuffer();
116 if (!myVbos[VBOVnormals]->Init (aGlCtx, 3, myPArray->num_vertexs, &myPArray->vnormals[0].xyz[0]))
118 clearMemoryGL (aGlCtx);
119 return Standard_False;
122 if (myPArray->vtexels)
124 myVbos[VBOVtexels] = new OpenGl_VertexBuffer();
125 if (!myVbos[VBOVtexels]->Init (aGlCtx, 2, myPArray->num_vertexs, &myPArray->vtexels[0].xy[0]))
127 clearMemoryGL (aGlCtx);
128 return Standard_False;
133 return Standard_True;
136 // =======================================================================
137 // function : DrawArray
139 // =======================================================================
140 void OpenGl_PrimitiveArray::DrawArray (Tint theLightingModel,
141 const Aspect_InteriorStyle theInteriorStyle,
143 const TEL_COLOUR* theInteriorColour,
144 const TEL_COLOUR* theLineColour,
145 const TEL_COLOUR* theEdgeColour,
146 const OPENGL_SURF_PROP* theFaceProp,
147 const Handle(OpenGl_Workspace)& theWorkspace) const
149 const Handle(OpenGl_Context)& aGlContext = theWorkspace->GetGlContext();
153 // Following pointers have been provided for performance improvement
154 tel_colour pfc = myPArray->fcolours;
155 Tint* pvc = myPArray->vcolours;
158 for (i = 0; i < myPArray->num_vertexs; ++i)
160 transp = int(theFaceProp->trans * 255.0f);
161 #if defined (sparc) || defined (__sparc__) || defined (__sparc)
162 pvc[i] = (pvc[i] & 0xffffff00);
165 pvc[i] = (pvc[i] & 0x00ffffff);
166 pvc[i] += transp << 24;
171 switch (myPArray->type)
173 case TelPointsArrayType:
174 case TelPolylinesArrayType:
175 case TelSegmentsArrayType:
176 glColor3fv (theLineColour->rgb);
178 case TelPolygonsArrayType:
179 case TelTrianglesArrayType:
180 case TelQuadranglesArrayType:
181 case TelTriangleStripsArrayType:
182 case TelQuadrangleStripsArrayType:
183 case TelTriangleFansArrayType:
184 glColor3fv (theInteriorColour->rgb);
188 // Temporarily disable environment mapping
189 if (myDrawMode <= GL_LINE_STRIP)
191 glPushAttrib (GL_ENABLE_BIT);
192 glDisable (GL_TEXTURE_1D);
193 glDisable (GL_TEXTURE_2D);
196 if (theWorkspace->DegenerateModel < 2 &&
197 ((myDrawMode > GL_LINE_STRIP && theInteriorStyle != Aspect_IS_EMPTY) ||
198 (myDrawMode <= GL_LINE_STRIP)))
200 if (theWorkspace->NamedStatus & OPENGL_NS_HIGHLIGHT)
206 if (theInteriorStyle == Aspect_IS_HIDDENLINE)
213 // Sometimes the GL_LIGHTING mode is activated here
214 // without glEnable(GL_LIGHTING) call for an unknown reason, so it is necessary
215 // to call glEnable(GL_LIGHTING) to synchronize Light On/Off mechanism*
216 if (theLightingModel == 0 || myDrawMode <= GL_LINE_STRIP)
217 glDisable (GL_LIGHTING);
219 glEnable (GL_LIGHTING);
223 if (myPArray->vertices != NULL)
225 glVertexPointer (3, GL_FLOAT, 0, myPArray->vertices); // array of vertices
226 glEnableClientState (GL_VERTEX_ARRAY);
228 if (myPArray->vnormals != NULL)
230 glNormalPointer (GL_FLOAT, 0, myPArray->vnormals); // array of normals
231 glEnableClientState (GL_NORMAL_ARRAY);
233 if (myPArray->vtexels != NULL)
235 glTexCoordPointer (2, GL_FLOAT, 0, myPArray->vtexels); // array of texture coordinates
236 glEnableClientState (GL_TEXTURE_COORD_ARRAY);
241 glColorPointer (4, GL_UNSIGNED_BYTE, 0, pvc); // array of colors
242 glEnableClientState (GL_COLOR_ARRAY);
243 glColorMaterial (GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE);
244 glEnable (GL_COLOR_MATERIAL);
249 // Bindings concrete pointer in accordance with VBO buffer
250 myVbos[VBOVertices]->BindFixed (aGlContext, GL_VERTEX_ARRAY);
251 if (!myVbos[VBOVnormals].IsNull())
253 myVbos[VBOVnormals]->BindFixed (aGlContext, GL_NORMAL_ARRAY);
255 if (!myVbos[VBOVtexels].IsNull() && (theWorkspace->NamedStatus & OPENGL_NS_FORBIDSETTEX) == 0)
257 myVbos[VBOVtexels]->BindFixed (aGlContext, GL_TEXTURE_COORD_ARRAY);
259 if (!myVbos[VBOVcolours].IsNull())
261 myVbos[VBOVcolours]->BindFixed (aGlContext, GL_COLOR_ARRAY);
262 glColorMaterial (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
263 glEnable (GL_COLOR_MATERIAL);
267 /// OCC22236 NOTE: draw for all situations:
268 /// 1) draw elements from myPArray->bufferVBO[VBOEdges] indicies array
269 /// 2) draw elements from vertice array, when bounds defines count of primitive's verts.
270 /// 3) draw primitive by vertexes if no edges and bounds array is specified
273 if (!myVbos[VBOEdges].IsNull())
275 myVbos[VBOEdges]->Bind (aGlContext);
276 if (myPArray->num_bounds > 0)
278 // draw primitives by vertex count with the indicies
279 Tint* anOffset = NULL;
280 for (i = 0; i < myPArray->num_bounds; ++i)
282 glDrawElements (myDrawMode, myPArray->bounds[i], myVbos[VBOEdges]->GetDataType(), anOffset);
283 anOffset += myPArray->bounds[i];
288 // draw one (or sequential) primitive by the indicies
289 glDrawElements (myDrawMode, myPArray->num_edges, myVbos[VBOEdges]->GetDataType(), NULL);
291 myVbos[VBOEdges]->Unbind (aGlContext);
293 else if (myPArray->num_bounds > 0)
295 for (i = n = 0; i < myPArray->num_bounds; ++i)
297 glDrawArrays (myDrawMode, n, myPArray->bounds[i]);
298 n += myPArray->bounds[i];
303 glDrawArrays (myDrawMode, 0, myVbos[VBOVertices]->GetElemsNb());
307 myVbos[VBOVertices]->UnbindFixed (aGlContext, GL_VERTEX_ARRAY);
308 if (!myVbos[VBOVnormals].IsNull())
310 myVbos[VBOVnormals]->UnbindFixed (aGlContext, GL_NORMAL_ARRAY);
312 if (!myVbos[VBOVtexels].IsNull() && (theWorkspace->NamedStatus & OPENGL_NS_FORBIDSETTEX) == 0)
314 myVbos[VBOVtexels]->UnbindFixed (aGlContext, GL_TEXTURE_COORD_ARRAY);
316 if (!myVbos[VBOVcolours].IsNull())
318 myVbos[VBOVcolours]->UnbindFixed (aGlContext, GL_COLOR_ARRAY);
319 glDisable (GL_COLOR_MATERIAL);
320 theWorkspace->NamedStatus |= OPENGL_NS_RESMAT; // Reset material
325 if (myPArray->num_bounds > 0)
327 if (myPArray->num_edges > 0)
329 for (i = n = 0; i < myPArray->num_bounds; ++i)
331 if (pfc != NULL) glColor3fv (pfc[i].rgb);
332 glDrawElements (myDrawMode, myPArray->bounds[i], GL_UNSIGNED_INT, (GLenum* )&myPArray->edges[n]);
333 n += myPArray->bounds[i];
338 for (i = n = 0; i < myPArray->num_bounds; ++i)
342 glColor3fv (pfc[i].rgb);
344 glDrawArrays (myDrawMode, n, myPArray->bounds[i]);
345 n += myPArray->bounds[i];
349 else if (myPArray->num_edges > 0)
351 glDrawElements (myDrawMode, myPArray->num_edges, GL_UNSIGNED_INT, (GLenum* )myPArray->edges);
355 glDrawArrays (myDrawMode, 0, myPArray->num_vertexs);
360 glDisable (GL_COLOR_MATERIAL);
361 theWorkspace->NamedStatus |= OPENGL_NS_RESMAT; // Reset material
364 glDisableClientState (GL_VERTEX_ARRAY);
365 if (myPArray->vcolours != NULL)
366 glDisableClientState (GL_COLOR_ARRAY);
367 if (myPArray->vnormals != NULL)
368 glDisableClientState (GL_NORMAL_ARRAY);
369 if (myPArray->vtexels != NULL)
370 glDisableClientState (GL_TEXTURE_COORD_ARRAY);
373 if (theWorkspace->DegenerateModel)
375 if (myDrawMode <= GL_LINE_STRIP)
383 if (theEdgeFlag || theWorkspace->DegenerateModel)
385 switch (theWorkspace->DegenerateModel)
387 default: // XXX_TDM_NODE or TINY
388 // On some NVIDIA graphic cards, using glEdgeFlagPointer() in
389 // combination with VBO ( edge flag data put into a VBO buffer)
390 // leads to a crash in a driver. Therefore, edge flags are simply
391 // igonored when VBOs are enabled, so all the edges are drawn if
392 // edge visibility is turned on. In order to draw edges selectively,
393 // either disable VBO or turn off edge visibilty in the current
394 // primitive array and create a separate primitive array (segments)
395 // and put edges to be drawn into it.
396 if (myDrawMode > GL_LINE_STRIP)
398 DrawEdges (theEdgeFlag ? theEdgeColour : theInteriorColour, theWorkspace);
401 // DegenerateModel(as Lines, Points, BBoxs) are used only without VBO
402 case 2: // XXX_TDM_WIREFRAME
404 DrawDegeneratesAsLines ((theEdgeFlag ? theEdgeColour : theInteriorColour), theWorkspace);
406 case 3: // XXX_TDM_MARKER
408 DrawDegeneratesAsPoints ((theEdgeFlag ? theEdgeColour : theInteriorColour), theWorkspace->SkipRatio);
410 case 4: // XXX_TDM_BBOX
412 DrawDegeneratesAsBBoxs (theEdgeFlag ? theEdgeColour : theInteriorColour);
417 if (myDrawMode <= GL_LINE_STRIP)
421 // =======================================================================
422 // function : DrawEdges
424 // =======================================================================
425 void OpenGl_PrimitiveArray::DrawEdges (const TEL_COLOUR* theEdgeColour,
426 const Handle(OpenGl_Workspace)& theWorkspace) const
428 glDisable (GL_LIGHTING);
430 const Handle(OpenGl_Context)& aGlContext = theWorkspace->GetGlContext();
431 const OpenGl_AspectLine* anAspectLineOld = NULL;
432 if (myDrawMode > GL_LINE_STRIP)
434 anAspectLineOld = theWorkspace->SetAspectLine (theWorkspace->AspectFace (Standard_True)->AspectEdge());
435 theWorkspace->AspectLine (Standard_True);
437 glPushAttrib (GL_POLYGON_BIT);
438 glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
443 /// OCC22236 NOTE: draw edges for all situations:
444 /// 1) draw elements with GL_LINE style as edges from myPArray->bufferVBO[VBOEdges] indicies array
445 /// 2) draw elements from vertice array, when bounds defines count of primitive's verts.
446 /// 3) draw primitive's edges by vertexes if no edges and bounds array is specified
449 myVbos[VBOVertices]->BindFixed (aGlContext, GL_VERTEX_ARRAY);
450 glColor3fv (theEdgeColour->rgb);
451 if (!myVbos[VBOEdges].IsNull())
453 myVbos[VBOEdges]->Bind (aGlContext);
455 // draw primitives by vertex count with the indicies
456 if (myPArray->num_bounds > 0)
459 for (i = 0, offset = 0; i < myPArray->num_bounds; ++i)
461 glDrawElements (myDrawMode, myPArray->bounds[i], myVbos[VBOEdges]->GetDataType(), offset);
462 offset += myPArray->bounds[i];
465 // draw one (or sequential) primitive by the indicies
468 glDrawElements (myDrawMode, myVbos[VBOEdges]->GetElemsNb(), myVbos[VBOEdges]->GetDataType(), NULL);
470 myVbos[VBOEdges]->Unbind (aGlContext);
472 else if (myPArray->num_bounds > 0)
474 for (i = n = 0; i < myPArray->num_bounds; ++i)
476 glDrawArrays (myDrawMode, n, myPArray->bounds[i]);
477 n += myPArray->bounds[i];
482 glDrawArrays (myDrawMode, 0, myPArray->num_vertexs);
486 myVbos[VBOVertices]->UnbindFixed (aGlContext, GL_VERTEX_ARRAY);
490 glEnableClientState (GL_VERTEX_ARRAY);
491 glVertexPointer (3, GL_FLOAT, 0, myPArray->vertices); // array of vertices
493 glColor3fv (theEdgeColour->rgb);
494 if (myPArray->num_bounds > 0)
496 if (myPArray->num_edges > 0)
498 for (i = n = 0; i < myPArray->num_bounds; ++i)
500 if (myPArray->edge_vis)
502 glBegin (myDrawMode);
503 for (j = 0; j < myPArray->bounds[i]; ++j)
505 glEdgeFlag (myPArray->edge_vis[n+j]);
506 glVertex3fv (&myPArray->vertices[myPArray->edges[n+j]].xyz[0]);
512 glDrawElements (myDrawMode, myPArray->bounds[i], GL_UNSIGNED_INT, (GLenum* )&myPArray->edges[n]);
514 n += myPArray->bounds[i];
519 for (i = n = 0 ; i < myPArray->num_bounds; ++i)
521 glDrawArrays (myDrawMode, n, myPArray->bounds[i]);
522 n += myPArray->bounds[i];
526 else if (myPArray->num_edges > 0)
528 if (myPArray->edge_vis)
530 glBegin (myDrawMode);
531 for (i = 0; i < myPArray->num_edges; ++i)
533 glEdgeFlag (myPArray->edge_vis[i]);
534 glVertex3fv (&myPArray->vertices[myPArray->edges[i]].xyz[0]);
540 glDrawElements (myDrawMode, myPArray->num_edges, GL_UNSIGNED_INT, (GLenum* )myPArray->edges);
545 glDrawArrays (myDrawMode, 0, myPArray->num_vertexs);
549 if (myDrawMode > GL_LINE_STRIP)
551 // Restore line context
552 theWorkspace->SetAspectLine (anAspectLineOld);
557 // =======================================================================
558 // function : DrawDegeneratesPointsAsPoints
560 // =======================================================================
561 void OpenGl_PrimitiveArray::DrawDegeneratesPointsAsPoints() const
563 tel_point pv = myPArray->vertices;
564 for (Tint aVertId = 0; aVertId < myPArray->num_vertexs; ++aVertId)
566 glVertex3fv (&pv[aVertId].xyz[0]);
570 // =======================================================================
571 // function : DrawDegeneratesLinesAsPoints
573 // =======================================================================
574 void OpenGl_PrimitiveArray::DrawDegeneratesLinesAsPoints() const
577 tel_point pv = myPArray->vertices;
580 while (j < myPArray->num_vertexs)
582 pt[0] = pv[j].xyz[0];
583 pt[1] = pv[j].xyz[1];
584 pt[2] = pv[j].xyz[2]; ++j;
585 pt[0] += pv[j].xyz[0];
586 pt[1] += pv[j].xyz[1];
587 pt[2] += pv[j].xyz[2]; ++j;
595 // =======================================================================
596 // function : DrawDegeneratesTrianglesAsPoints
598 // =======================================================================
599 void OpenGl_PrimitiveArray::DrawDegeneratesTrianglesAsPoints() const
603 tel_point pv = myPArray->vertices;
605 if (myPArray->num_edges > 0)
607 for (j = 0; j < myPArray->num_edges; j += 3)
609 iv = myPArray->edges[j];
610 pt[0] = pv[iv].xyz[0];
611 pt[1] = pv[iv].xyz[1];
612 pt[2] = pv[iv].xyz[2];
613 for (i = 1; i < 3; ++i)
615 iv = myPArray->edges[j+i];
616 pt[0] += pv[iv].xyz[0];
617 pt[1] += pv[iv].xyz[1];
618 pt[2] += pv[iv].xyz[2];
628 for (j = 0; j < myPArray->num_vertexs; j += 3)
630 pt[0] = pv[j].xyz[0];
631 pt[1] = pv[j].xyz[1];
632 pt[2] = pv[j].xyz[2];
633 for (i = 1; i < 3; ++i)
635 pt[0] += pv[j+i].xyz[0];
636 pt[1] += pv[j+i].xyz[1];
637 pt[2] += pv[j+i].xyz[2];
647 // =======================================================================
648 // function : DrawDegeneratesTrianglesAsPoints
650 // =======================================================================
651 void OpenGl_PrimitiveArray::DrawDegeneratesTrianglestripsAsPoints() const
655 tel_point pv = myPArray->vertices;
657 if (myPArray->num_bounds > 0)
659 for (k = n = 0; k < myPArray->num_bounds; ++k)
661 for (j = 0; j < myPArray->bounds[k] - 2; ++j)
663 pt[0] = pv[n+j].xyz[0];
664 pt[1] = pv[n+j].xyz[1];
665 pt[2] = pv[n+j].xyz[2];
666 for (i = 1; i < 3; ++i)
668 pt[0] += pv[n+j+i].xyz[0];
669 pt[1] += pv[n+j+i].xyz[1];
670 pt[2] += pv[n+j+i].xyz[2];
677 n += myPArray->bounds[k];
682 for (j = 0; j < myPArray->num_vertexs - 2; ++j)
684 pt[0] = pv[j].xyz[0];
685 pt[1] = pv[j].xyz[1];
686 pt[2] = pv[j].xyz[2];
687 for (i = 1; i < 3; ++i)
689 pt[0] += pv[j+i].xyz[0];
690 pt[1] += pv[j+i].xyz[1];
691 pt[2] += pv[j+i].xyz[2];
701 // =======================================================================
702 // function : DrawDegeneratesPolygonsAsPoints
704 // =======================================================================
705 void OpenGl_PrimitiveArray::DrawDegeneratesPolygonsAsPoints() const
709 tel_point pv = myPArray->vertices;
711 if (myPArray->num_bounds > 0)
713 if (myPArray->num_edges > 0)
715 for (k = n = 0; k < myPArray->num_bounds; ++k)
717 pt[0] = pt[1] = pt[2] = 0.0;
718 for (j = 0; j < myPArray->bounds[k]; ++j)
720 iv = myPArray->edges[n+j];
721 pt[0] += pv[iv].xyz[0];
722 pt[1] += pv[iv].xyz[1];
723 pt[2] += pv[iv].xyz[2];
725 pt[0] /= myPArray->bounds[k];
726 pt[1] /= myPArray->bounds[k];
727 pt[2] /= myPArray->bounds[k];
729 n += myPArray->bounds[k];
734 for (k = n = 0; k < myPArray->num_bounds; ++k)
736 pt[0] = pt[1] = pt[2] = 0.0;
737 for (j = 0; j < myPArray->bounds[k]; ++j)
739 pt[0] += pv[n+j].xyz[0];
740 pt[1] += pv[n+j].xyz[1];
741 pt[2] += pv[n+j].xyz[2];
743 pt[0] /= myPArray->bounds[k];
744 pt[1] /= myPArray->bounds[k];
745 pt[2] /= myPArray->bounds[k];
747 n += myPArray->bounds[k];
751 else if (myPArray->num_edges > 0)
753 pt[0] = pt[1] = pt[2] = 0.0;
754 for (j = 0; j < myPArray->num_edges; ++j)
756 iv = myPArray->edges[j];
757 pt[0] += pv[iv].xyz[0];
758 pt[1] += pv[iv].xyz[1];
759 pt[2] += pv[iv].xyz[2];
761 pt[0] /= myPArray->num_edges;
762 pt[1] /= myPArray->num_edges;
763 pt[2] /= myPArray->num_edges;
768 pt[0] = pt[1] = pt[2] = 0.0;
769 for (j = 0; j < myPArray->num_vertexs; ++j)
771 pt[0] += pv[j].xyz[0];
772 pt[1] += pv[j].xyz[1];
773 pt[2] += pv[j].xyz[2];
775 pt[0] /= myPArray->num_vertexs;
776 pt[1] /= myPArray->num_vertexs;
777 pt[2] /= myPArray->num_vertexs;
782 // =======================================================================
783 // function : DrawDegeneratesQuadranglesAsPoints
785 // =======================================================================
786 void OpenGl_PrimitiveArray::DrawDegeneratesQuadranglesAsPoints() const
790 tel_point pv = myPArray->vertices;
792 if (myPArray->num_edges > 0)
794 for (j = 0; j < myPArray->num_edges; j += 4)
796 pt[0] = pt[1] = pt[2] = 0.0;
797 for (i = 0; i < 4; ++i)
799 iv = myPArray->edges[j+i];
800 pt[0] += pv[iv].xyz[0];
801 pt[1] += pv[iv].xyz[1];
802 pt[2] += pv[iv].xyz[2];
812 for (j = 0; j < myPArray->num_vertexs; j += 4)
814 pt[0] = pt[1] = pt[2] = 0.0;
815 for (i = 0; i < 4; ++i)
817 pt[0] += pv[j+i].xyz[0];
818 pt[1] += pv[j+i].xyz[1];
819 pt[2] += pv[j+i].xyz[2];
829 // =======================================================================
830 // function : DrawDegeneratesAsPoints
832 // =======================================================================
833 void OpenGl_PrimitiveArray::DrawDegeneratesQuadranglestripsAsPoints() const
837 tel_point pv = myPArray->vertices;
839 if (myPArray->num_bounds > 0)
841 for (k = n = 0; k < myPArray->num_bounds; ++k)
843 for (j = 0; j < myPArray->bounds[k] - 2; j += 2)
845 pt[0] = pt[1] = pt[2] = 0.;
846 for (i = 0; i < 4; ++i)
848 pt[0] += pv[n+j+i].xyz[0];
849 pt[1] += pv[n+j+i].xyz[1];
850 pt[2] += pv[n+j+i].xyz[2];
857 n += myPArray->bounds[k];
862 for (j = 0; j < myPArray->num_vertexs - 2; j += 2)
864 pt[0] = pt[1] = pt[2] = 0.;
865 for (i = 0; i < 4; ++i)
867 pt[0] += pv[j+i].xyz[0];
868 pt[1] += pv[j+i].xyz[1];
869 pt[2] += pv[j+i].xyz[2];
879 // =======================================================================
880 // function : DrawDegeneratesAsPoints
882 // =======================================================================
883 void OpenGl_PrimitiveArray::DrawDegeneratesAsPoints (const TEL_COLOUR* theEdgeColour,
884 const float theSkipRatio) const
886 if (theSkipRatio >= 1.0f)
889 GLboolean zbuff_state = glIsEnabled (GL_DEPTH_TEST);
890 glDisable (GL_LIGHTING);
892 glDisable (GL_DEPTH_TEST);
893 glColor3fv (theEdgeColour->rgb);
899 DrawDegeneratesPointsAsPoints();
902 DrawDegeneratesLinesAsPoints();
906 DrawDegeneratesPolygonsAsPoints();
909 DrawDegeneratesTrianglesAsPoints();
912 DrawDegeneratesQuadranglesAsPoints();
914 case GL_TRIANGLE_FAN:
915 case GL_TRIANGLE_STRIP:
916 DrawDegeneratesTrianglestripsAsPoints();
919 DrawDegeneratesQuadranglestripsAsPoints();
926 glEnable (GL_DEPTH_TEST);
929 // =======================================================================
930 // function : DrawDegeneratesLinesAsLines
932 // =======================================================================
933 void OpenGl_PrimitiveArray::DrawDegeneratesLinesAsLines (const float theSkipRatio) const
936 tel_point pv = myPArray->vertices;
938 Tint n = myPArray->num_vertexs;
939 Tint j = int((1.0f - theSkipRatio) * n);
943 myPArray->keys[i] = -myPArray->keys[i];
946 if (myPArray->num_bounds > 0)
948 if (myPArray->num_edges > 0)
950 for (i = n = 0; i < myPArray->num_bounds; ++i)
953 for (j = 0; j < myPArray->bounds[i]; ++j)
955 iv = myPArray->edges[n + j];
956 if (myPArray->keys[iv] < 0)
958 myPArray->keys[iv] = -myPArray->keys[iv];
959 glVertex3fv (pv[iv].xyz);
963 n += myPArray->bounds[i];
968 for (i = n = 0; i < myPArray->num_bounds; ++i)
971 for (j = 0; j < myPArray->bounds[i]; ++j)
973 if (myPArray->keys[n+j] < 0)
975 myPArray->keys[n+j] = -myPArray->keys[n+j];
976 glVertex3fv (pv[n+j].xyz);
980 n += myPArray->bounds[i];
984 else if (myPArray->num_edges > 0)
987 for (j = 0; j < myPArray->num_edges; ++j)
989 iv = myPArray->edges[j];
990 if (myPArray->keys[iv] < 0)
992 myPArray->keys[iv] = -myPArray->keys[iv];
993 glVertex3fv (pv[iv].xyz);
1001 for (j = 0; j < myPArray->num_vertexs; ++j)
1003 if (myPArray->keys[j] < 0)
1005 myPArray->keys[j] = -myPArray->keys[j];
1006 glVertex3fv (pv[j].xyz);
1013 // =======================================================================
1014 // function : DrawDegeneratesTrianglesAsLines
1016 // =======================================================================
1017 void OpenGl_PrimitiveArray::DrawDegeneratesTrianglesAsLines (const float theSkipRatio) const
1020 tel_point pv = myPArray->vertices;
1022 Tint n = myPArray->num_vertexs / 3;
1023 Tint j = int((1.0f - theSkipRatio) * n);
1026 i = OGL_Rand() % n; i *= 3;
1027 myPArray->keys[i] = -myPArray->keys[i];
1030 if (myPArray->num_edges > 0)
1032 for (j = 0; j < myPArray->num_edges; j += 3)
1034 iv = myPArray->edges[j];
1035 if (myPArray->keys[iv] < 0)
1037 myPArray->keys[iv] = -myPArray->keys[iv];
1038 glBegin (GL_LINE_LOOP);
1039 for (i = 0; i < 3; ++i)
1041 iv = myPArray->edges[j+i];
1042 glVertex3fv (pv[iv].xyz);
1050 for (j = 0; j < myPArray->num_vertexs; j += 3)
1052 if (myPArray->keys[j] < 0)
1054 myPArray->keys[j] = -myPArray->keys[j];
1055 glBegin (GL_LINE_LOOP);
1056 for (i = 0; i < 3; ++i)
1058 glVertex3fv (pv[j+i].xyz);
1066 // =======================================================================
1067 // function : DrawDegeneratesTrianglesAsLines
1069 // =======================================================================
1070 void OpenGl_PrimitiveArray::DrawDegeneratesTrianglestripsAsLines (const float theSkipRatio) const
1072 Tint i, j, k, n, ni;
1073 tel_point pv = myPArray->vertices;
1075 if (myPArray->num_bounds > 0)
1077 for (i = n = 0; i < myPArray->num_bounds; ++i)
1079 ni = myPArray->bounds[i] - 2;
1080 k = int((1.0f - theSkipRatio) * ni);
1083 j = OGL_Rand() % ni; j += 2;
1084 myPArray->keys[n+j] = -myPArray->keys[n+j];
1086 for (j = 2; j < myPArray->bounds[i]; ++j)
1088 if (myPArray->keys[n+j] < 0)
1090 myPArray->keys[n+j] = -myPArray->keys[n+j];
1091 glBegin (GL_LINE_LOOP);
1092 glVertex3fv (pv[n+j-2].xyz);
1093 glVertex3fv (pv[n+j-1].xyz);
1094 glVertex3fv (pv[n+j].xyz);
1098 n += myPArray->bounds[i];
1103 ni = myPArray->num_vertexs - 2;
1104 k = int((1.0f - theSkipRatio) * ni);
1107 j = OGL_Rand() % ni; j += 2;
1108 myPArray->keys[j] = -myPArray->keys[j];
1110 for (j = 2; j < myPArray->num_vertexs; ++j)
1112 if (myPArray->keys[j] < 0)
1114 myPArray->keys[j] = -myPArray->keys[j];
1115 glBegin (GL_LINE_LOOP);
1116 glVertex3fv (pv[j-2].xyz);
1117 glVertex3fv (pv[j-1].xyz);
1118 glVertex3fv (pv[j].xyz);
1125 // =======================================================================
1126 // function : DrawDegeneratesPolygonsAsLines
1128 // =======================================================================
1129 void OpenGl_PrimitiveArray::DrawDegeneratesPolygonsAsLines (const float theSkipRatio) const
1132 tel_point pv = myPArray->vertices;
1134 Tint n = myPArray->num_vertexs;
1135 Tint j = int((1.0f - theSkipRatio) * n);
1139 myPArray->keys[i] = -myPArray->keys[i];
1142 if (myPArray->num_bounds > 0)
1144 if (myPArray->num_edges > 0)
1146 for (i = n = 0; i < myPArray->num_bounds; ++i)
1148 glBegin (GL_LINE_LOOP);
1149 for (j = 0; j < myPArray->bounds[i]; ++j)
1151 iv = myPArray->edges[n+j];
1152 if (myPArray->keys[iv] < 0)
1154 myPArray->keys[iv] = -myPArray->keys[iv];
1155 glVertex3fv (pv[iv].xyz);
1159 n += myPArray->bounds[i];
1164 for (i = n = 0; i < myPArray->num_bounds; ++i)
1166 glBegin (GL_LINE_LOOP);
1167 for (j = 0; j < myPArray->bounds[i]; ++j)
1169 if (myPArray->keys[n+j] < 0)
1171 myPArray->keys[n+j] = -myPArray->keys[n+j];
1172 glVertex3fv (pv[n+j].xyz);
1176 n += myPArray->bounds[i];
1180 else if (myPArray->num_edges > 0)
1182 glBegin (GL_LINE_LOOP);
1183 for (j = 0; j < myPArray->num_edges; ++j)
1185 iv = myPArray->edges[j];
1186 if (myPArray->keys[iv] < 0)
1188 myPArray->keys[iv] = -myPArray->keys[iv];
1189 glVertex3fv (pv[iv].xyz);
1196 glBegin (GL_LINE_LOOP);
1197 for (j = 0; j < myPArray->num_vertexs; ++j)
1199 if (myPArray->keys[j] < 0)
1201 myPArray->keys[j] = -myPArray->keys[j];
1202 glVertex3fv (pv[j].xyz);
1209 // =======================================================================
1210 // function : DrawDegeneratesQuadranglesAsLines
1212 // =======================================================================
1213 void OpenGl_PrimitiveArray::DrawDegeneratesQuadranglesAsLines (const float theSkipRatio) const
1216 tel_point pv = myPArray->vertices;
1218 Tint n = myPArray->num_vertexs / 4;
1219 Tint j = int((1.0f - theSkipRatio) * n);
1222 i = OGL_Rand() % n; i *= 4;
1223 myPArray->keys[i] = -myPArray->keys[i];
1226 if (myPArray->num_edges > 0)
1228 for (j = 0; j < myPArray->num_edges; j += 4)
1230 iv = myPArray->edges[j];
1231 if (myPArray->keys[iv] < 0)
1233 myPArray->keys[iv] = -myPArray->keys[iv];
1234 glBegin (GL_LINE_LOOP);
1235 for (i = 0; i < 4; ++i)
1237 iv = myPArray->edges[j+i];
1238 glVertex3fv (pv[iv].xyz);
1246 for (j = 0; j < myPArray->num_vertexs; j += 4)
1248 if (myPArray->keys[j] < 0)
1250 myPArray->keys[j] = -myPArray->keys[j];
1251 glBegin (GL_LINE_LOOP);
1252 for (i = 0; i < 4; ++i)
1254 glVertex3fv (pv[j+i].xyz);
1262 // =======================================================================
1263 // function : DrawDegeneratesQuadranglesAsLines
1265 // =======================================================================
1266 void OpenGl_PrimitiveArray::DrawDegeneratesQuadranglestripsAsLines (const float theSkipRatio) const
1268 Tint i, j, k, n, ni;
1269 tel_point pv = myPArray->vertices;
1271 if (myPArray->num_bounds > 0)
1273 for (i = n = 0; i < myPArray->num_bounds; ++i)
1275 ni = myPArray->bounds[i] / 2 - 2;
1276 k = int((1.0f - theSkipRatio) * ni);
1279 j = OGL_Rand() % ni; j = j * 2 + 2;
1280 myPArray->keys[n+j] = -myPArray->keys[n+j];
1282 for (j = 3; j < myPArray->bounds[i]; j += 2)
1284 if (myPArray->keys[n+j] < 0)
1286 myPArray->keys[n+j] = -myPArray->keys[n+j];
1287 glBegin (GL_LINE_LOOP);
1288 glVertex3fv (pv[n+j-3].xyz);
1289 glVertex3fv (pv[n+j-2].xyz);
1290 glVertex3fv (pv[n+j-1].xyz);
1291 glVertex3fv (pv[n+j].xyz);
1295 n += myPArray->bounds[i];
1300 ni = myPArray->num_vertexs / 2 - 2;
1301 k = int((1.0f - theSkipRatio) * ni);
1304 j = OGL_Rand() % ni; j = j * 2 + 2;
1305 myPArray->keys[j] = -myPArray->keys[j];
1307 for (j = 3; j < myPArray->num_vertexs; j += 2)
1309 if (myPArray->keys[j] < 0)
1311 myPArray->keys[j] = -myPArray->keys[j];
1312 glBegin (GL_LINE_LOOP);
1313 glVertex3fv (pv[j-3].xyz);
1314 glVertex3fv (pv[j-2].xyz);
1315 glVertex3fv (pv[j-1].xyz);
1316 glVertex3fv (pv[j].xyz);
1323 // =======================================================================
1324 // function : DrawDegeneratesAsLines
1326 // =======================================================================
1327 void OpenGl_PrimitiveArray::DrawDegeneratesAsLines (const TEL_COLOUR* theEdgeColour,
1328 const Handle(OpenGl_Workspace)& theWorkspace) const
1330 const float aSkipRatio = theWorkspace->SkipRatio;
1332 GLboolean zbuff_state = glIsEnabled (GL_DEPTH_TEST);
1334 glDisable (GL_LIGHTING);
1337 glDisable (GL_DEPTH_TEST);
1339 glColor3fv (theEdgeColour->rgb);
1341 if (aSkipRatio != 0.0f)
1346 if (aSkipRatio < 1.0f)
1347 DrawDegeneratesPointsAsPoints();
1350 DrawDegeneratesLinesAsLines (aSkipRatio);
1354 DrawDegeneratesPolygonsAsLines (aSkipRatio);
1357 DrawDegeneratesTrianglesAsLines (aSkipRatio);
1360 DrawDegeneratesQuadranglesAsLines (aSkipRatio);
1362 case GL_TRIANGLE_FAN:
1363 case GL_TRIANGLE_STRIP:
1364 DrawDegeneratesTrianglestripsAsLines (aSkipRatio);
1367 DrawDegeneratesQuadranglestripsAsLines (aSkipRatio);
1376 glPushAttrib (GL_POLYGON_BIT);
1377 glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
1379 GLboolean color_array_mode = glIsEnabled (GL_COLOR_ARRAY);
1380 GLboolean edge_flag_array_mode = glIsEnabled (GL_EDGE_FLAG_ARRAY);
1381 GLboolean index_array_mode = glIsEnabled (GL_INDEX_ARRAY);
1382 GLboolean normal_array_mode = glIsEnabled (GL_NORMAL_ARRAY);
1383 GLboolean texture_coord_array_mode = glIsEnabled (GL_TEXTURE_COORD_ARRAY);
1384 GLboolean vertex_array_mode = glIsEnabled (GL_VERTEX_ARRAY);
1386 glDisableClientState (GL_COLOR_ARRAY);
1387 glDisableClientState (GL_EDGE_FLAG_ARRAY);
1388 glDisableClientState (GL_INDEX_ARRAY);
1389 glDisableClientState (GL_NORMAL_ARRAY);
1390 glDisableClientState (GL_TEXTURE_COORD_ARRAY);
1392 if (!vertex_array_mode)
1393 glEnableClientState (GL_VERTEX_ARRAY);
1395 glVertexPointer (3, GL_FLOAT, 0, myPArray->vertices); // array of vertices
1397 if (myPArray->num_bounds > 0)
1399 if (myPArray->num_edges > 0)
1401 for (i = n = 0; i < myPArray->num_bounds; ++i)
1403 glDrawElements (myDrawMode, myPArray->bounds[i], GL_UNSIGNED_INT, (GLenum* )&myPArray->edges[n]);
1404 n += myPArray->bounds[i];
1409 for (i = n = 0; i < myPArray->num_bounds; ++i)
1411 glDrawArrays (myDrawMode, n, myPArray->bounds[i]);
1412 n += myPArray->bounds[i];
1416 else if (myPArray->num_edges > 0)
1418 glDrawElements (myDrawMode, myPArray->num_edges, GL_UNSIGNED_INT, (GLenum* )myPArray->edges);
1422 glDrawArrays (myDrawMode, 0, myPArray->num_vertexs);
1425 if (!vertex_array_mode) glDisableClientState (GL_VERTEX_ARRAY);
1427 if (color_array_mode) glEnableClientState (GL_COLOR_ARRAY);
1428 if (edge_flag_array_mode) glEnableClientState (GL_EDGE_FLAG_ARRAY);
1429 if (index_array_mode) glEnableClientState (GL_INDEX_ARRAY);
1430 if (normal_array_mode) glEnableClientState (GL_NORMAL_ARRAY);
1431 if (texture_coord_array_mode) glEnableClientState (GL_TEXTURE_COORD_ARRAY);
1437 glEnable(GL_DEPTH_TEST);
1440 // =======================================================================
1441 // function : DrawDegeneratesAsBBoxs
1443 // =======================================================================
1444 void OpenGl_PrimitiveArray::DrawDegeneratesAsBBoxs (const TEL_COLOUR* theEdgeColour) const
1446 GLfloat minp[3] = { FLT_MAX, FLT_MAX, FLT_MAX };
1447 GLfloat maxp[3] = { FLT_MIN, FLT_MIN, FLT_MIN };
1448 tel_point pv = myPArray->vertices;
1450 glDisable (GL_LIGHTING);
1452 glColor3fv (theEdgeColour->rgb);
1454 for (Tint i = 0; i < myPArray->num_vertexs; ++i)
1456 if (pv[i].xyz[0] < minp[0])
1457 minp[0] = pv[i].xyz[0];
1458 if (pv[i].xyz[1] < minp[1])
1459 minp[1] = pv[i].xyz[1];
1460 if (pv[i].xyz[2] < minp[2])
1461 minp[2] = pv[i].xyz[2];
1463 if (pv[i].xyz[0] > maxp[0])
1464 maxp[0] = pv[i].xyz[0];
1465 if (pv[i].xyz[1] > maxp[1])
1466 maxp[1] = pv[i].xyz[1];
1467 if (pv[i].xyz[2] > maxp[2])
1468 maxp[2] = pv[i].xyz[2];
1471 glBegin (GL_LINE_STRIP);
1474 glVertex3f (minp[0], maxp[1], minp[2]);
1475 glVertex3f (minp[0], maxp[1], maxp[2]);
1476 glVertex3f (minp[0], minp[1], maxp[2]);
1477 glVertex3f (minp[0], minp[1], minp[2]);
1479 glVertex3f (maxp[0], minp[1], minp[2]);
1480 glVertex3f (maxp[0], maxp[1], minp[2]);
1481 glVertex3f (maxp[0], maxp[1], maxp[2]);
1482 glVertex3f (maxp[0], minp[1], maxp[2]);
1483 glVertex3f (maxp[0], minp[1], minp[2]);
1485 glVertex3f (maxp[0], minp[1], maxp[2]);
1486 glVertex3f (minp[0], minp[1], maxp[2]);
1487 glVertex3f (minp[0], maxp[1], maxp[2]);
1489 glVertex3f (maxp[0], maxp[1], minp[2]);
1490 glVertex3f (minp[0], maxp[1], minp[2]);
1495 // =======================================================================
1496 // function : OpenGl_PrimitiveArray
1498 // =======================================================================
1499 OpenGl_PrimitiveArray::OpenGl_PrimitiveArray (CALL_DEF_PARRAY* thePArray)
1500 : myPArray (thePArray),
1501 myDrawMode (DRAW_MODE_NONE),
1502 myIsVboInit (Standard_False)
1504 switch (myPArray->type)
1506 case TelPointsArrayType:
1507 myDrawMode = GL_POINTS;
1509 case TelPolylinesArrayType:
1510 myDrawMode = GL_LINE_STRIP;
1512 case TelSegmentsArrayType:
1513 myDrawMode = GL_LINES;
1515 case TelPolygonsArrayType:
1516 myDrawMode = GL_POLYGON;
1518 case TelTrianglesArrayType:
1519 myDrawMode = GL_TRIANGLES;
1521 case TelQuadranglesArrayType:
1522 myDrawMode = GL_QUADS;
1524 case TelTriangleStripsArrayType:
1525 myDrawMode = GL_TRIANGLE_STRIP;
1527 case TelQuadrangleStripsArrayType:
1528 myDrawMode = GL_QUAD_STRIP;
1530 case TelTriangleFansArrayType:
1531 myDrawMode = GL_TRIANGLE_FAN;
1536 // =======================================================================
1537 // function : ~OpenGl_PrimitiveArray
1539 // =======================================================================
1540 OpenGl_PrimitiveArray::~OpenGl_PrimitiveArray()
1545 // =======================================================================
1546 // function : Release
1548 // =======================================================================
1549 void OpenGl_PrimitiveArray::Release (const Handle(OpenGl_Context)& theContext)
1551 for (Standard_Integer anIter = 0; anIter < VBOMaxType; ++anIter)
1553 if (!myVbos[anIter].IsNull())
1555 theContext->DelayedRelease (myVbos[anIter]);
1556 myVbos[anIter].Nullify();
1561 // =======================================================================
1562 // function : Render
1564 // =======================================================================
1565 void OpenGl_PrimitiveArray::Render (const Handle(OpenGl_Workspace)& theWorkspace) const
1567 if (myPArray == NULL || myDrawMode == DRAW_MODE_NONE || myPArray->num_vertexs <= 0)
1570 // create VBOs on first render call
1571 if (!myIsVboInit && OpenGl_GraphicDriver::ToUseVBO() && theWorkspace->GetGlContext()->core15 != NULL)
1573 BuildVBO (theWorkspace);
1574 myIsVboInit = Standard_True;
1577 switch (myPArray->type)
1579 case TelPointsArrayType:
1580 case TelPolylinesArrayType:
1581 case TelSegmentsArrayType:
1583 glDisable (GL_LIGHTING);
1585 if ((theWorkspace->NamedStatus & OPENGL_NS_ANIMATION) != 0 &&
1586 (theWorkspace->NamedStatus & OPENGL_NS_WIREFRAME) == 0 &&
1587 theWorkspace->DegenerateModel)
1589 glDisable (GL_DEPTH_TEST);
1590 if (theWorkspace->NamedStatus & OPENGL_NS_TEXTURE)
1592 theWorkspace->NamedStatus |= OPENGL_NS_WIREFRAME;
1596 case TelPolygonsArrayType:
1597 case TelTrianglesArrayType:
1598 case TelQuadranglesArrayType:
1599 case TelTriangleStripsArrayType:
1600 case TelTriangleFansArrayType:
1601 case TelQuadrangleStripsArrayType:
1603 if ((theWorkspace->NamedStatus & OPENGL_NS_ANIMATION) != 0 &&
1604 (theWorkspace->NamedStatus & OPENGL_NS_WIREFRAME) != 0 &&
1605 theWorkspace->DegenerateModel < 2)
1607 if (theWorkspace->NamedStatus & OPENGL_NS_TEXTURE)
1609 glEnable (GL_DEPTH_TEST);
1610 theWorkspace->NamedStatus &= ~OPENGL_NS_WIREFRAME;
1618 const OpenGl_AspectFace* anAspectFace = theWorkspace->AspectFace (Standard_True);
1619 const OpenGl_AspectLine* anAspectLine = theWorkspace->AspectLine (Standard_True);
1620 const OpenGl_AspectMarker* anAspectMarker = theWorkspace->AspectMarker (myPArray->type == TelPointsArrayType);
1622 Tint aFrontLightingModel = anAspectFace->Context().IntFront.color_mask;
1623 const TEL_COLOUR* anInteriorColor = &anAspectFace->Context().IntFront.matcol;
1624 const TEL_COLOUR* anEdgeColor = &anAspectFace->AspectEdge()->Color();
1625 const TEL_COLOUR* aLineColor = (myPArray->type == TelPointsArrayType) ? &anAspectMarker->Color() : &anAspectLine->Color();
1627 // Use highlight colors
1628 if (theWorkspace->NamedStatus & OPENGL_NS_HIGHLIGHT)
1630 anEdgeColor = anInteriorColor = aLineColor = theWorkspace->HighlightColor;
1631 aFrontLightingModel = 0;
1634 DrawArray (aFrontLightingModel,
1635 anAspectFace->Context().InteriorStyle,
1636 anAspectFace->Context().Edge,
1640 &anAspectFace->Context().IntFront,
1643 switch (myPArray->type)
1645 case TelPointsArrayType:
1646 case TelPolylinesArrayType:
1647 case TelSegmentsArrayType:
1649 if (theWorkspace->NamedStatus & OPENGL_NS_TEXTURE)