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.
20 #include <OpenGl_IndexBuffer.hxx>
21 #include <OpenGl_Context.hxx>
23 #include <OpenGl_PrimitiveArray.hxx>
25 #include <OpenGl_AspectFace.hxx>
26 #include <OpenGl_GraphicDriver.hxx>
27 #include <OpenGl_Structure.hxx>
28 #include <OpenGl_Workspace.hxx>
30 #include <InterfaceGraphic_PrimitiveArray.hxx>
34 static unsigned long vRand = 1L;
35 #define OGL_Rand() (vRand = vRand * 214013L + 2531011L)
38 // =======================================================================
39 // function : clearMemoryOwn
41 // =======================================================================
42 void OpenGl_PrimitiveArray::clearMemoryOwn() const
44 Standard::Free ((Standard_Address& )myPArray->edges);
45 Standard::Free ((Standard_Address& )myPArray->vertices);
46 Standard::Free ((Standard_Address& )myPArray->vcolours);
47 Standard::Free ((Standard_Address& )myPArray->vnormals);
48 Standard::Free ((Standard_Address& )myPArray->vtexels);
49 Standard::Free ((Standard_Address& )myPArray->edge_vis); /// ???
51 myPArray->edges = NULL;
52 myPArray->vertices = NULL;
53 myPArray->vcolours = NULL;
54 myPArray->vnormals = NULL;
55 myPArray->vtexels = NULL;
56 myPArray->edge_vis = NULL;
59 // =======================================================================
60 // function : clearMemoryGL
62 // =======================================================================
63 void OpenGl_PrimitiveArray::clearMemoryGL (const Handle(OpenGl_Context)& theGlCtx) const
65 for (Standard_Integer anIter = 0; anIter < VBOMaxType; ++anIter)
67 if (!myVbos[anIter].IsNull())
69 myVbos[anIter]->Release (theGlCtx.operator->());
70 myVbos[anIter].Nullify();
75 // =======================================================================
76 // function : BuildVBO
78 // =======================================================================
79 Standard_Boolean OpenGl_PrimitiveArray::BuildVBO (const Handle(OpenGl_Workspace)& theWorkspace) const
81 const Handle(OpenGl_Context)& aGlCtx = theWorkspace->GetGlContext();
82 if (myPArray->vertices == NULL)
84 // vertices should be always defined - others are optional
85 return Standard_False;
87 myVbos[VBOVertices] = new OpenGl_VertexBuffer();
88 if (!myVbos[VBOVertices]->Init (aGlCtx, 3, myPArray->num_vertexs, &myPArray->vertices[0].xyz[0]))
90 clearMemoryGL (aGlCtx);
91 return Standard_False;
94 if (myPArray->edges != NULL)
96 myVbos[VBOEdges] = new OpenGl_IndexBuffer();
97 if (!myVbos[VBOEdges]->Init (aGlCtx, 1, myPArray->num_edges, (GLuint* )myPArray->edges))
99 clearMemoryGL (aGlCtx);
100 return Standard_False;
103 if (myPArray->vcolours != NULL)
105 myVbos[VBOVcolours] = new OpenGl_VertexBuffer();
106 if (!myVbos[VBOVcolours]->Init (aGlCtx, 4, myPArray->num_vertexs, (GLubyte* )myPArray->vcolours))
108 clearMemoryGL (aGlCtx);
109 return Standard_False;
112 if (myPArray->vnormals != NULL)
114 myVbos[VBOVnormals] = new OpenGl_VertexBuffer();
115 if (!myVbos[VBOVnormals]->Init (aGlCtx, 3, myPArray->num_vertexs, &myPArray->vnormals[0].xyz[0]))
117 clearMemoryGL (aGlCtx);
118 return Standard_False;
121 if (myPArray->vtexels)
123 myVbos[VBOVtexels] = new OpenGl_VertexBuffer();
124 if (!myVbos[VBOVtexels]->Init (aGlCtx, 2, myPArray->num_vertexs, &myPArray->vtexels[0].xy[0]))
126 clearMemoryGL (aGlCtx);
127 return Standard_False;
132 return Standard_True;
135 // =======================================================================
136 // function : DrawArray
138 // =======================================================================
139 void OpenGl_PrimitiveArray::DrawArray (Tint theLightingModel,
140 const Aspect_InteriorStyle theInteriorStyle,
142 const TEL_COLOUR* theInteriorColour,
143 const TEL_COLOUR* theLineColour,
144 const TEL_COLOUR* theEdgeColour,
145 const OPENGL_SURF_PROP* theFaceProp,
146 const Handle(OpenGl_Workspace)& theWorkspace) const
148 const Handle(OpenGl_Context)& aGlContext = theWorkspace->GetGlContext();
152 // Following pointers have been provided for performance improvement
153 tel_colour pfc = myPArray->fcolours;
154 Tint* pvc = myPArray->vcolours;
157 for (i = 0; i < myPArray->num_vertexs; ++i)
159 transp = int(theFaceProp->trans * 255.0f);
160 #if defined (sparc) || defined (__sparc__) || defined (__sparc)
161 pvc[i] = (pvc[i] & 0xffffff00);
164 pvc[i] = (pvc[i] & 0x00ffffff);
165 pvc[i] += transp << 24;
170 switch (myPArray->type)
172 case TelPointsArrayType:
173 case TelPolylinesArrayType:
174 case TelSegmentsArrayType:
175 glColor3fv (theLineColour->rgb);
177 case TelPolygonsArrayType:
178 case TelTrianglesArrayType:
179 case TelQuadranglesArrayType:
180 case TelTriangleStripsArrayType:
181 case TelQuadrangleStripsArrayType:
182 case TelTriangleFansArrayType:
183 glColor3fv (theInteriorColour->rgb);
187 // Temporarily disable environment mapping
188 if (myDrawMode <= GL_LINE_STRIP)
190 glPushAttrib (GL_ENABLE_BIT);
191 glDisable (GL_TEXTURE_1D);
192 glDisable (GL_TEXTURE_2D);
195 if (theWorkspace->DegenerateModel < 2 &&
196 ((myDrawMode > GL_LINE_STRIP && theInteriorStyle != Aspect_IS_EMPTY) ||
197 (myDrawMode <= GL_LINE_STRIP)))
199 if (theWorkspace->NamedStatus & OPENGL_NS_HIGHLIGHT)
205 if (theInteriorStyle == Aspect_IS_HIDDENLINE)
212 // Sometimes the GL_LIGHTING mode is activated here
213 // without glEnable(GL_LIGHTING) call for an unknown reason, so it is necessary
214 // to call glEnable(GL_LIGHTING) to synchronize Light On/Off mechanism*
215 if (theLightingModel == 0 || myDrawMode <= GL_LINE_STRIP)
216 glDisable (GL_LIGHTING);
218 glEnable (GL_LIGHTING);
222 if (myPArray->vertices != NULL)
224 glVertexPointer (3, GL_FLOAT, 0, myPArray->vertices); // array of vertices
225 glEnableClientState (GL_VERTEX_ARRAY);
227 if (myPArray->vnormals != NULL)
229 glNormalPointer (GL_FLOAT, 0, myPArray->vnormals); // array of normals
230 glEnableClientState (GL_NORMAL_ARRAY);
232 if (myPArray->vtexels != NULL)
234 glTexCoordPointer (2, GL_FLOAT, 0, myPArray->vtexels); // array of texture coordinates
235 glEnableClientState (GL_TEXTURE_COORD_ARRAY);
240 glColorPointer (4, GL_UNSIGNED_BYTE, 0, pvc); // array of colors
241 glEnableClientState (GL_COLOR_ARRAY);
242 glColorMaterial (GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE);
243 glEnable (GL_COLOR_MATERIAL);
248 // Bindings concrete pointer in accordance with VBO buffer
249 myVbos[VBOVertices]->BindFixed (aGlContext, GL_VERTEX_ARRAY);
250 if (!myVbos[VBOVnormals].IsNull())
252 myVbos[VBOVnormals]->BindFixed (aGlContext, GL_NORMAL_ARRAY);
254 if (!myVbos[VBOVtexels].IsNull() && (theWorkspace->NamedStatus & OPENGL_NS_FORBIDSETTEX) == 0)
256 myVbos[VBOVtexels]->BindFixed (aGlContext, GL_TEXTURE_COORD_ARRAY);
258 if (!myVbos[VBOVcolours].IsNull())
260 myVbos[VBOVcolours]->BindFixed (aGlContext, GL_COLOR_ARRAY);
261 glColorMaterial (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
262 glEnable (GL_COLOR_MATERIAL);
266 /// OCC22236 NOTE: draw for all situations:
267 /// 1) draw elements from myPArray->bufferVBO[VBOEdges] indicies array
268 /// 2) draw elements from vertice array, when bounds defines count of primitive's verts.
269 /// 3) draw primitive by vertexes if no edges and bounds array is specified
272 if (!myVbos[VBOEdges].IsNull())
274 myVbos[VBOEdges]->Bind (aGlContext);
275 if (myPArray->num_bounds > 0)
277 // draw primitives by vertex count with the indicies
278 Tint* anOffset = NULL;
279 for (i = 0; i < myPArray->num_bounds; ++i)
281 glDrawElements (myDrawMode, myPArray->bounds[i], myVbos[VBOEdges]->GetDataType(), anOffset);
282 anOffset += myPArray->bounds[i];
287 // draw one (or sequential) primitive by the indicies
288 glDrawElements (myDrawMode, myPArray->num_edges, myVbos[VBOEdges]->GetDataType(), NULL);
290 myVbos[VBOEdges]->Unbind (aGlContext);
292 else if (myPArray->num_bounds > 0)
294 for (i = n = 0; i < myPArray->num_bounds; ++i)
296 glDrawArrays (myDrawMode, n, myPArray->bounds[i]);
297 n += myPArray->bounds[i];
302 glDrawArrays (myDrawMode, 0, myVbos[VBOVertices]->GetElemsNb());
306 myVbos[VBOVertices]->UnbindFixed (aGlContext, GL_VERTEX_ARRAY);
307 if (!myVbos[VBOVnormals].IsNull())
309 myVbos[VBOVnormals]->UnbindFixed (aGlContext, GL_NORMAL_ARRAY);
311 if (!myVbos[VBOVtexels].IsNull() && (theWorkspace->NamedStatus & OPENGL_NS_FORBIDSETTEX) == 0)
313 myVbos[VBOVtexels]->UnbindFixed (aGlContext, GL_TEXTURE_COORD_ARRAY);
315 if (!myVbos[VBOVcolours].IsNull())
317 myVbos[VBOVcolours]->UnbindFixed (aGlContext, GL_COLOR_ARRAY);
318 glDisable (GL_COLOR_MATERIAL);
319 theWorkspace->NamedStatus |= OPENGL_NS_RESMAT; // Reset material
324 if (myPArray->num_bounds > 0)
326 if (myPArray->num_edges > 0)
328 for (i = n = 0; i < myPArray->num_bounds; ++i)
330 if (pfc != NULL) glColor3fv (pfc[i].rgb);
331 glDrawElements (myDrawMode, myPArray->bounds[i], GL_UNSIGNED_INT, (GLenum* )&myPArray->edges[n]);
332 n += myPArray->bounds[i];
337 for (i = n = 0; i < myPArray->num_bounds; ++i)
341 glColor3fv (pfc[i].rgb);
343 glDrawArrays (myDrawMode, n, myPArray->bounds[i]);
344 n += myPArray->bounds[i];
348 else if (myPArray->num_edges > 0)
350 glDrawElements (myDrawMode, myPArray->num_edges, GL_UNSIGNED_INT, (GLenum* )myPArray->edges);
354 glDrawArrays (myDrawMode, 0, myPArray->num_vertexs);
359 glDisable (GL_COLOR_MATERIAL);
360 theWorkspace->NamedStatus |= OPENGL_NS_RESMAT; // Reset material
363 glDisableClientState (GL_VERTEX_ARRAY);
364 if (myPArray->vcolours != NULL)
365 glDisableClientState (GL_COLOR_ARRAY);
366 if (myPArray->vnormals != NULL)
367 glDisableClientState (GL_NORMAL_ARRAY);
368 if (myPArray->vtexels != NULL)
369 glDisableClientState (GL_TEXTURE_COORD_ARRAY);
372 if (theWorkspace->DegenerateModel)
374 if (myDrawMode <= GL_LINE_STRIP)
382 if (theEdgeFlag || theWorkspace->DegenerateModel)
384 switch (theWorkspace->DegenerateModel)
386 default: // XXX_TDM_NODE or TINY
387 // On some NVIDIA graphic cards, using glEdgeFlagPointer() in
388 // combination with VBO ( edge flag data put into a VBO buffer)
389 // leads to a crash in a driver. Therefore, edge flags are simply
390 // igonored when VBOs are enabled, so all the edges are drawn if
391 // edge visibility is turned on. In order to draw edges selectively,
392 // either disable VBO or turn off edge visibilty in the current
393 // primitive array and create a separate primitive array (segments)
394 // and put edges to be drawn into it.
395 if (myDrawMode > GL_LINE_STRIP)
397 DrawEdges (theEdgeFlag ? theEdgeColour : theInteriorColour, theWorkspace);
400 // DegenerateModel(as Lines, Points, BBoxs) are used only without VBO
401 case 2: // XXX_TDM_WIREFRAME
403 DrawDegeneratesAsLines ((theEdgeFlag ? theEdgeColour : theInteriorColour), theWorkspace);
405 case 3: // XXX_TDM_MARKER
407 DrawDegeneratesAsPoints ((theEdgeFlag ? theEdgeColour : theInteriorColour), theWorkspace->SkipRatio);
409 case 4: // XXX_TDM_BBOX
411 DrawDegeneratesAsBBoxs (theEdgeFlag ? theEdgeColour : theInteriorColour);
416 if (myDrawMode <= GL_LINE_STRIP)
420 // =======================================================================
421 // function : DrawEdges
423 // =======================================================================
424 void OpenGl_PrimitiveArray::DrawEdges (const TEL_COLOUR* theEdgeColour,
425 const Handle(OpenGl_Workspace)& theWorkspace) const
427 glDisable (GL_LIGHTING);
429 const Handle(OpenGl_Context)& aGlContext = theWorkspace->GetGlContext();
430 const OpenGl_AspectLine* anAspectLineOld = NULL;
431 if (myDrawMode > GL_LINE_STRIP)
433 anAspectLineOld = theWorkspace->SetAspectLine (theWorkspace->AspectFace (Standard_True)->AspectEdge());
434 theWorkspace->AspectLine (Standard_True);
436 glPushAttrib (GL_POLYGON_BIT);
437 glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
442 /// OCC22236 NOTE: draw edges for all situations:
443 /// 1) draw elements with GL_LINE style as edges from myPArray->bufferVBO[VBOEdges] indicies array
444 /// 2) draw elements from vertice array, when bounds defines count of primitive's verts.
445 /// 3) draw primitive's edges by vertexes if no edges and bounds array is specified
448 myVbos[VBOVertices]->BindFixed (aGlContext, GL_VERTEX_ARRAY);
449 glColor3fv (theEdgeColour->rgb);
450 if (!myVbos[VBOEdges].IsNull())
452 myVbos[VBOEdges]->Bind (aGlContext);
454 // draw primitives by vertex count with the indicies
455 if (myPArray->num_bounds > 0)
458 for (i = 0, offset = 0; i < myPArray->num_bounds; ++i)
460 glDrawElements (myDrawMode, myPArray->bounds[i], myVbos[VBOEdges]->GetDataType(), offset);
461 offset += myPArray->bounds[i];
464 // draw one (or sequential) primitive by the indicies
467 glDrawElements (myDrawMode, myVbos[VBOEdges]->GetElemsNb(), myVbos[VBOEdges]->GetDataType(), NULL);
469 myVbos[VBOEdges]->Unbind (aGlContext);
471 else if (myPArray->num_bounds > 0)
473 for (i = n = 0; i < myPArray->num_bounds; ++i)
475 glDrawArrays (myDrawMode, n, myPArray->bounds[i]);
476 n += myPArray->bounds[i];
481 glDrawArrays (myDrawMode, 0, myPArray->num_vertexs);
485 myVbos[VBOVertices]->UnbindFixed (aGlContext, GL_VERTEX_ARRAY);
489 glEnableClientState (GL_VERTEX_ARRAY);
490 glVertexPointer (3, GL_FLOAT, 0, myPArray->vertices); // array of vertices
492 glColor3fv (theEdgeColour->rgb);
493 if (myPArray->num_bounds > 0)
495 if (myPArray->num_edges > 0)
497 for (i = n = 0; i < myPArray->num_bounds; ++i)
499 if (myPArray->edge_vis)
501 glBegin (myDrawMode);
502 for (j = 0; j < myPArray->bounds[i]; ++j)
504 glEdgeFlag (myPArray->edge_vis[n+j]);
505 glVertex3fv (&myPArray->vertices[myPArray->edges[n+j]].xyz[0]);
511 glDrawElements (myDrawMode, myPArray->bounds[i], GL_UNSIGNED_INT, (GLenum* )&myPArray->edges[n]);
513 n += myPArray->bounds[i];
518 for (i = n = 0 ; i < myPArray->num_bounds; ++i)
520 glDrawArrays (myDrawMode, n, myPArray->bounds[i]);
521 n += myPArray->bounds[i];
525 else if (myPArray->num_edges > 0)
527 if (myPArray->edge_vis)
529 glBegin (myDrawMode);
530 for (i = 0; i < myPArray->num_edges; ++i)
532 glEdgeFlag (myPArray->edge_vis[i]);
533 glVertex3fv (&myPArray->vertices[myPArray->edges[i]].xyz[0]);
539 glDrawElements (myDrawMode, myPArray->num_edges, GL_UNSIGNED_INT, (GLenum* )myPArray->edges);
544 glDrawArrays (myDrawMode, 0, myPArray->num_vertexs);
548 if (myDrawMode > GL_LINE_STRIP)
550 // Restore line context
551 theWorkspace->SetAspectLine (anAspectLineOld);
556 // =======================================================================
557 // function : DrawDegeneratesPointsAsPoints
559 // =======================================================================
560 void OpenGl_PrimitiveArray::DrawDegeneratesPointsAsPoints() const
562 tel_point pv = myPArray->vertices;
563 for (Tint aVertId = 0; aVertId < myPArray->num_vertexs; ++aVertId)
565 glVertex3fv (&pv[aVertId].xyz[0]);
569 // =======================================================================
570 // function : DrawDegeneratesLinesAsPoints
572 // =======================================================================
573 void OpenGl_PrimitiveArray::DrawDegeneratesLinesAsPoints() const
576 tel_point pv = myPArray->vertices;
579 while (j < myPArray->num_vertexs)
581 pt[0] = pv[j].xyz[0];
582 pt[1] = pv[j].xyz[1];
583 pt[2] = pv[j].xyz[2]; ++j;
584 pt[0] += pv[j].xyz[0];
585 pt[1] += pv[j].xyz[1];
586 pt[2] += pv[j].xyz[2]; ++j;
594 // =======================================================================
595 // function : DrawDegeneratesTrianglesAsPoints
597 // =======================================================================
598 void OpenGl_PrimitiveArray::DrawDegeneratesTrianglesAsPoints() const
602 tel_point pv = myPArray->vertices;
604 if (myPArray->num_edges > 0)
606 for (j = 0; j < myPArray->num_edges; j += 3)
608 iv = myPArray->edges[j];
609 pt[0] = pv[iv].xyz[0];
610 pt[1] = pv[iv].xyz[1];
611 pt[2] = pv[iv].xyz[2];
612 for (i = 1; i < 3; ++i)
614 iv = myPArray->edges[j+i];
615 pt[0] += pv[iv].xyz[0];
616 pt[1] += pv[iv].xyz[1];
617 pt[2] += pv[iv].xyz[2];
627 for (j = 0; j < myPArray->num_vertexs; j += 3)
629 pt[0] = pv[j].xyz[0];
630 pt[1] = pv[j].xyz[1];
631 pt[2] = pv[j].xyz[2];
632 for (i = 1; i < 3; ++i)
634 pt[0] += pv[j+i].xyz[0];
635 pt[1] += pv[j+i].xyz[1];
636 pt[2] += pv[j+i].xyz[2];
646 // =======================================================================
647 // function : DrawDegeneratesTrianglesAsPoints
649 // =======================================================================
650 void OpenGl_PrimitiveArray::DrawDegeneratesTrianglestripsAsPoints() const
654 tel_point pv = myPArray->vertices;
656 if (myPArray->num_bounds > 0)
658 for (k = n = 0; k < myPArray->num_bounds; ++k)
660 for (j = 0; j < myPArray->bounds[k] - 2; ++j)
662 pt[0] = pv[n+j].xyz[0];
663 pt[1] = pv[n+j].xyz[1];
664 pt[2] = pv[n+j].xyz[2];
665 for (i = 1; i < 3; ++i)
667 pt[0] += pv[n+j+i].xyz[0];
668 pt[1] += pv[n+j+i].xyz[1];
669 pt[2] += pv[n+j+i].xyz[2];
676 n += myPArray->bounds[k];
681 for (j = 0; j < myPArray->num_vertexs - 2; ++j)
683 pt[0] = pv[j].xyz[0];
684 pt[1] = pv[j].xyz[1];
685 pt[2] = pv[j].xyz[2];
686 for (i = 1; i < 3; ++i)
688 pt[0] += pv[j+i].xyz[0];
689 pt[1] += pv[j+i].xyz[1];
690 pt[2] += pv[j+i].xyz[2];
700 // =======================================================================
701 // function : DrawDegeneratesPolygonsAsPoints
703 // =======================================================================
704 void OpenGl_PrimitiveArray::DrawDegeneratesPolygonsAsPoints() const
708 tel_point pv = myPArray->vertices;
710 if (myPArray->num_bounds > 0)
712 if (myPArray->num_edges > 0)
714 for (k = n = 0; k < myPArray->num_bounds; ++k)
716 pt[0] = pt[1] = pt[2] = 0.0;
717 for (j = 0; j < myPArray->bounds[k]; ++j)
719 iv = myPArray->edges[n+j];
720 pt[0] += pv[iv].xyz[0];
721 pt[1] += pv[iv].xyz[1];
722 pt[2] += pv[iv].xyz[2];
724 pt[0] /= myPArray->bounds[k];
725 pt[1] /= myPArray->bounds[k];
726 pt[2] /= myPArray->bounds[k];
728 n += myPArray->bounds[k];
733 for (k = n = 0; k < myPArray->num_bounds; ++k)
735 pt[0] = pt[1] = pt[2] = 0.0;
736 for (j = 0; j < myPArray->bounds[k]; ++j)
738 pt[0] += pv[n+j].xyz[0];
739 pt[1] += pv[n+j].xyz[1];
740 pt[2] += pv[n+j].xyz[2];
742 pt[0] /= myPArray->bounds[k];
743 pt[1] /= myPArray->bounds[k];
744 pt[2] /= myPArray->bounds[k];
746 n += myPArray->bounds[k];
750 else if (myPArray->num_edges > 0)
752 pt[0] = pt[1] = pt[2] = 0.0;
753 for (j = 0; j < myPArray->num_edges; ++j)
755 iv = myPArray->edges[j];
756 pt[0] += pv[iv].xyz[0];
757 pt[1] += pv[iv].xyz[1];
758 pt[2] += pv[iv].xyz[2];
760 pt[0] /= myPArray->num_edges;
761 pt[1] /= myPArray->num_edges;
762 pt[2] /= myPArray->num_edges;
767 pt[0] = pt[1] = pt[2] = 0.0;
768 for (j = 0; j < myPArray->num_vertexs; ++j)
770 pt[0] += pv[j].xyz[0];
771 pt[1] += pv[j].xyz[1];
772 pt[2] += pv[j].xyz[2];
774 pt[0] /= myPArray->num_vertexs;
775 pt[1] /= myPArray->num_vertexs;
776 pt[2] /= myPArray->num_vertexs;
781 // =======================================================================
782 // function : DrawDegeneratesQuadranglesAsPoints
784 // =======================================================================
785 void OpenGl_PrimitiveArray::DrawDegeneratesQuadranglesAsPoints() const
789 tel_point pv = myPArray->vertices;
791 if (myPArray->num_edges > 0)
793 for (j = 0; j < myPArray->num_edges; j += 4)
795 pt[0] = pt[1] = pt[2] = 0.0;
796 for (i = 0; i < 4; ++i)
798 iv = myPArray->edges[j+i];
799 pt[0] += pv[iv].xyz[0];
800 pt[1] += pv[iv].xyz[1];
801 pt[2] += pv[iv].xyz[2];
811 for (j = 0; j < myPArray->num_vertexs; j += 4)
813 pt[0] = pt[1] = pt[2] = 0.0;
814 for (i = 0; i < 4; ++i)
816 pt[0] += pv[j+i].xyz[0];
817 pt[1] += pv[j+i].xyz[1];
818 pt[2] += pv[j+i].xyz[2];
828 // =======================================================================
829 // function : DrawDegeneratesAsPoints
831 // =======================================================================
832 void OpenGl_PrimitiveArray::DrawDegeneratesQuadranglestripsAsPoints() const
836 tel_point pv = myPArray->vertices;
838 if (myPArray->num_bounds > 0)
840 for (k = n = 0; k < myPArray->num_bounds; ++k)
842 for (j = 0; j < myPArray->bounds[k] - 2; j += 2)
844 pt[0] = pt[1] = pt[2] = 0.;
845 for (i = 0; i < 4; ++i)
847 pt[0] += pv[n+j+i].xyz[0];
848 pt[1] += pv[n+j+i].xyz[1];
849 pt[2] += pv[n+j+i].xyz[2];
856 n += myPArray->bounds[k];
861 for (j = 0; j < myPArray->num_vertexs - 2; j += 2)
863 pt[0] = pt[1] = pt[2] = 0.;
864 for (i = 0; i < 4; ++i)
866 pt[0] += pv[j+i].xyz[0];
867 pt[1] += pv[j+i].xyz[1];
868 pt[2] += pv[j+i].xyz[2];
878 // =======================================================================
879 // function : DrawDegeneratesAsPoints
881 // =======================================================================
882 void OpenGl_PrimitiveArray::DrawDegeneratesAsPoints (const TEL_COLOUR* theEdgeColour,
883 const float theSkipRatio) const
885 if (theSkipRatio >= 1.0f)
888 GLboolean zbuff_state = glIsEnabled (GL_DEPTH_TEST);
889 glDisable (GL_LIGHTING);
891 glDisable (GL_DEPTH_TEST);
892 glColor3fv (theEdgeColour->rgb);
898 DrawDegeneratesPointsAsPoints();
901 DrawDegeneratesLinesAsPoints();
905 DrawDegeneratesPolygonsAsPoints();
908 DrawDegeneratesTrianglesAsPoints();
911 DrawDegeneratesQuadranglesAsPoints();
913 case GL_TRIANGLE_FAN:
914 case GL_TRIANGLE_STRIP:
915 DrawDegeneratesTrianglestripsAsPoints();
918 DrawDegeneratesQuadranglestripsAsPoints();
925 glEnable (GL_DEPTH_TEST);
928 // =======================================================================
929 // function : DrawDegeneratesLinesAsLines
931 // =======================================================================
932 void OpenGl_PrimitiveArray::DrawDegeneratesLinesAsLines (const float theSkipRatio) const
935 tel_point pv = myPArray->vertices;
937 Tint n = myPArray->num_vertexs;
938 Tint j = int((1.0f - theSkipRatio) * n);
942 myPArray->keys[i] = -myPArray->keys[i];
945 if (myPArray->num_bounds > 0)
947 if (myPArray->num_edges > 0)
949 for (i = n = 0; i < myPArray->num_bounds; ++i)
952 for (j = 0; j < myPArray->bounds[i]; ++j)
954 iv = myPArray->edges[n + j];
955 if (myPArray->keys[iv] < 0)
957 myPArray->keys[iv] = -myPArray->keys[iv];
958 glVertex3fv (pv[iv].xyz);
962 n += myPArray->bounds[i];
967 for (i = n = 0; i < myPArray->num_bounds; ++i)
970 for (j = 0; j < myPArray->bounds[i]; ++j)
972 if (myPArray->keys[n+j] < 0)
974 myPArray->keys[n+j] = -myPArray->keys[n+j];
975 glVertex3fv (pv[n+j].xyz);
979 n += myPArray->bounds[i];
983 else if (myPArray->num_edges > 0)
986 for (j = 0; j < myPArray->num_edges; ++j)
988 iv = myPArray->edges[j];
989 if (myPArray->keys[iv] < 0)
991 myPArray->keys[iv] = -myPArray->keys[iv];
992 glVertex3fv (pv[iv].xyz);
1000 for (j = 0; j < myPArray->num_vertexs; ++j)
1002 if (myPArray->keys[j] < 0)
1004 myPArray->keys[j] = -myPArray->keys[j];
1005 glVertex3fv (pv[j].xyz);
1012 // =======================================================================
1013 // function : DrawDegeneratesTrianglesAsLines
1015 // =======================================================================
1016 void OpenGl_PrimitiveArray::DrawDegeneratesTrianglesAsLines (const float theSkipRatio) const
1019 tel_point pv = myPArray->vertices;
1021 Tint n = myPArray->num_vertexs / 3;
1022 Tint j = int((1.0f - theSkipRatio) * n);
1025 i = OGL_Rand() % n; i *= 3;
1026 myPArray->keys[i] = -myPArray->keys[i];
1029 if (myPArray->num_edges > 0)
1031 for (j = 0; j < myPArray->num_edges; j += 3)
1033 iv = myPArray->edges[j];
1034 if (myPArray->keys[iv] < 0)
1036 myPArray->keys[iv] = -myPArray->keys[iv];
1037 glBegin (GL_LINE_LOOP);
1038 for (i = 0; i < 3; ++i)
1040 iv = myPArray->edges[j+i];
1041 glVertex3fv (pv[iv].xyz);
1049 for (j = 0; j < myPArray->num_vertexs; j += 3)
1051 if (myPArray->keys[j] < 0)
1053 myPArray->keys[j] = -myPArray->keys[j];
1054 glBegin (GL_LINE_LOOP);
1055 for (i = 0; i < 3; ++i)
1057 glVertex3fv (pv[j+i].xyz);
1065 // =======================================================================
1066 // function : DrawDegeneratesTrianglesAsLines
1068 // =======================================================================
1069 void OpenGl_PrimitiveArray::DrawDegeneratesTrianglestripsAsLines (const float theSkipRatio) const
1071 Tint i, j, k, n, ni;
1072 tel_point pv = myPArray->vertices;
1074 if (myPArray->num_bounds > 0)
1076 for (i = n = 0; i < myPArray->num_bounds; ++i)
1078 ni = myPArray->bounds[i] - 2;
1079 k = int((1.0f - theSkipRatio) * ni);
1082 j = OGL_Rand() % ni; j += 2;
1083 myPArray->keys[n+j] = -myPArray->keys[n+j];
1085 for (j = 2; j < myPArray->bounds[i]; ++j)
1087 if (myPArray->keys[n+j] < 0)
1089 myPArray->keys[n+j] = -myPArray->keys[n+j];
1090 glBegin (GL_LINE_LOOP);
1091 glVertex3fv (pv[n+j-2].xyz);
1092 glVertex3fv (pv[n+j-1].xyz);
1093 glVertex3fv (pv[n+j].xyz);
1097 n += myPArray->bounds[i];
1102 ni = myPArray->num_vertexs - 2;
1103 k = int((1.0f - theSkipRatio) * ni);
1106 j = OGL_Rand() % ni; j += 2;
1107 myPArray->keys[j] = -myPArray->keys[j];
1109 for (j = 2; j < myPArray->num_vertexs; ++j)
1111 if (myPArray->keys[j] < 0)
1113 myPArray->keys[j] = -myPArray->keys[j];
1114 glBegin (GL_LINE_LOOP);
1115 glVertex3fv (pv[j-2].xyz);
1116 glVertex3fv (pv[j-1].xyz);
1117 glVertex3fv (pv[j].xyz);
1124 // =======================================================================
1125 // function : DrawDegeneratesPolygonsAsLines
1127 // =======================================================================
1128 void OpenGl_PrimitiveArray::DrawDegeneratesPolygonsAsLines (const float theSkipRatio) const
1131 tel_point pv = myPArray->vertices;
1133 Tint n = myPArray->num_vertexs;
1134 Tint j = int((1.0f - theSkipRatio) * n);
1138 myPArray->keys[i] = -myPArray->keys[i];
1141 if (myPArray->num_bounds > 0)
1143 if (myPArray->num_edges > 0)
1145 for (i = n = 0; i < myPArray->num_bounds; ++i)
1147 glBegin (GL_LINE_LOOP);
1148 for (j = 0; j < myPArray->bounds[i]; ++j)
1150 iv = myPArray->edges[n+j];
1151 if (myPArray->keys[iv] < 0)
1153 myPArray->keys[iv] = -myPArray->keys[iv];
1154 glVertex3fv (pv[iv].xyz);
1158 n += myPArray->bounds[i];
1163 for (i = n = 0; i < myPArray->num_bounds; ++i)
1165 glBegin (GL_LINE_LOOP);
1166 for (j = 0; j < myPArray->bounds[i]; ++j)
1168 if (myPArray->keys[n+j] < 0)
1170 myPArray->keys[n+j] = -myPArray->keys[n+j];
1171 glVertex3fv (pv[n+j].xyz);
1175 n += myPArray->bounds[i];
1179 else if (myPArray->num_edges > 0)
1181 glBegin (GL_LINE_LOOP);
1182 for (j = 0; j < myPArray->num_edges; ++j)
1184 iv = myPArray->edges[j];
1185 if (myPArray->keys[iv] < 0)
1187 myPArray->keys[iv] = -myPArray->keys[iv];
1188 glVertex3fv (pv[iv].xyz);
1195 glBegin (GL_LINE_LOOP);
1196 for (j = 0; j < myPArray->num_vertexs; ++j)
1198 if (myPArray->keys[j] < 0)
1200 myPArray->keys[j] = -myPArray->keys[j];
1201 glVertex3fv (pv[j].xyz);
1208 // =======================================================================
1209 // function : DrawDegeneratesQuadranglesAsLines
1211 // =======================================================================
1212 void OpenGl_PrimitiveArray::DrawDegeneratesQuadranglesAsLines (const float theSkipRatio) const
1215 tel_point pv = myPArray->vertices;
1217 Tint n = myPArray->num_vertexs / 4;
1218 Tint j = int((1.0f - theSkipRatio) * n);
1221 i = OGL_Rand() % n; i *= 4;
1222 myPArray->keys[i] = -myPArray->keys[i];
1225 if (myPArray->num_edges > 0)
1227 for (j = 0; j < myPArray->num_edges; j += 4)
1229 iv = myPArray->edges[j];
1230 if (myPArray->keys[iv] < 0)
1232 myPArray->keys[iv] = -myPArray->keys[iv];
1233 glBegin (GL_LINE_LOOP);
1234 for (i = 0; i < 4; ++i)
1236 iv = myPArray->edges[j+i];
1237 glVertex3fv (pv[iv].xyz);
1245 for (j = 0; j < myPArray->num_vertexs; j += 4)
1247 if (myPArray->keys[j] < 0)
1249 myPArray->keys[j] = -myPArray->keys[j];
1250 glBegin (GL_LINE_LOOP);
1251 for (i = 0; i < 4; ++i)
1253 glVertex3fv (pv[j+i].xyz);
1261 // =======================================================================
1262 // function : DrawDegeneratesQuadranglesAsLines
1264 // =======================================================================
1265 void OpenGl_PrimitiveArray::DrawDegeneratesQuadranglestripsAsLines (const float theSkipRatio) const
1267 Tint i, j, k, n, ni;
1268 tel_point pv = myPArray->vertices;
1270 if (myPArray->num_bounds > 0)
1272 for (i = n = 0; i < myPArray->num_bounds; ++i)
1274 ni = myPArray->bounds[i] / 2 - 2;
1275 k = int((1.0f - theSkipRatio) * ni);
1278 j = OGL_Rand() % ni; j = j * 2 + 2;
1279 myPArray->keys[n+j] = -myPArray->keys[n+j];
1281 for (j = 3; j < myPArray->bounds[i]; j += 2)
1283 if (myPArray->keys[n+j] < 0)
1285 myPArray->keys[n+j] = -myPArray->keys[n+j];
1286 glBegin (GL_LINE_LOOP);
1287 glVertex3fv (pv[n+j-3].xyz);
1288 glVertex3fv (pv[n+j-2].xyz);
1289 glVertex3fv (pv[n+j-1].xyz);
1290 glVertex3fv (pv[n+j].xyz);
1294 n += myPArray->bounds[i];
1299 ni = myPArray->num_vertexs / 2 - 2;
1300 k = int((1.0f - theSkipRatio) * ni);
1303 j = OGL_Rand() % ni; j = j * 2 + 2;
1304 myPArray->keys[j] = -myPArray->keys[j];
1306 for (j = 3; j < myPArray->num_vertexs; j += 2)
1308 if (myPArray->keys[j] < 0)
1310 myPArray->keys[j] = -myPArray->keys[j];
1311 glBegin (GL_LINE_LOOP);
1312 glVertex3fv (pv[j-3].xyz);
1313 glVertex3fv (pv[j-2].xyz);
1314 glVertex3fv (pv[j-1].xyz);
1315 glVertex3fv (pv[j].xyz);
1322 // =======================================================================
1323 // function : DrawDegeneratesAsLines
1325 // =======================================================================
1326 void OpenGl_PrimitiveArray::DrawDegeneratesAsLines (const TEL_COLOUR* theEdgeColour,
1327 const Handle(OpenGl_Workspace)& theWorkspace) const
1329 const float aSkipRatio = theWorkspace->SkipRatio;
1331 GLboolean zbuff_state = glIsEnabled (GL_DEPTH_TEST);
1333 glDisable (GL_LIGHTING);
1336 glDisable (GL_DEPTH_TEST);
1338 glColor3fv (theEdgeColour->rgb);
1340 if (aSkipRatio != 0.0f)
1345 if (aSkipRatio < 1.0f)
1346 DrawDegeneratesPointsAsPoints();
1349 DrawDegeneratesLinesAsLines (aSkipRatio);
1353 DrawDegeneratesPolygonsAsLines (aSkipRatio);
1356 DrawDegeneratesTrianglesAsLines (aSkipRatio);
1359 DrawDegeneratesQuadranglesAsLines (aSkipRatio);
1361 case GL_TRIANGLE_FAN:
1362 case GL_TRIANGLE_STRIP:
1363 DrawDegeneratesTrianglestripsAsLines (aSkipRatio);
1366 DrawDegeneratesQuadranglestripsAsLines (aSkipRatio);
1375 glPushAttrib (GL_POLYGON_BIT);
1376 glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
1378 GLboolean color_array_mode = glIsEnabled (GL_COLOR_ARRAY);
1379 GLboolean edge_flag_array_mode = glIsEnabled (GL_EDGE_FLAG_ARRAY);
1380 GLboolean index_array_mode = glIsEnabled (GL_INDEX_ARRAY);
1381 GLboolean normal_array_mode = glIsEnabled (GL_NORMAL_ARRAY);
1382 GLboolean texture_coord_array_mode = glIsEnabled (GL_TEXTURE_COORD_ARRAY);
1383 GLboolean vertex_array_mode = glIsEnabled (GL_VERTEX_ARRAY);
1385 glDisableClientState (GL_COLOR_ARRAY);
1386 glDisableClientState (GL_EDGE_FLAG_ARRAY);
1387 glDisableClientState (GL_INDEX_ARRAY);
1388 glDisableClientState (GL_NORMAL_ARRAY);
1389 glDisableClientState (GL_TEXTURE_COORD_ARRAY);
1391 if (!vertex_array_mode)
1392 glEnableClientState (GL_VERTEX_ARRAY);
1394 glVertexPointer (3, GL_FLOAT, 0, myPArray->vertices); // array of vertices
1396 if (myPArray->num_bounds > 0)
1398 if (myPArray->num_edges > 0)
1400 for (i = n = 0; i < myPArray->num_bounds; ++i)
1402 glDrawElements (myDrawMode, myPArray->bounds[i], GL_UNSIGNED_INT, (GLenum* )&myPArray->edges[n]);
1403 n += myPArray->bounds[i];
1408 for (i = n = 0; i < myPArray->num_bounds; ++i)
1410 glDrawArrays (myDrawMode, n, myPArray->bounds[i]);
1411 n += myPArray->bounds[i];
1415 else if (myPArray->num_edges > 0)
1417 glDrawElements (myDrawMode, myPArray->num_edges, GL_UNSIGNED_INT, (GLenum* )myPArray->edges);
1421 glDrawArrays (myDrawMode, 0, myPArray->num_vertexs);
1424 if (!vertex_array_mode) glDisableClientState (GL_VERTEX_ARRAY);
1426 if (color_array_mode) glEnableClientState (GL_COLOR_ARRAY);
1427 if (edge_flag_array_mode) glEnableClientState (GL_EDGE_FLAG_ARRAY);
1428 if (index_array_mode) glEnableClientState (GL_INDEX_ARRAY);
1429 if (normal_array_mode) glEnableClientState (GL_NORMAL_ARRAY);
1430 if (texture_coord_array_mode) glEnableClientState (GL_TEXTURE_COORD_ARRAY);
1436 glEnable(GL_DEPTH_TEST);
1439 // =======================================================================
1440 // function : DrawDegeneratesAsBBoxs
1442 // =======================================================================
1443 void OpenGl_PrimitiveArray::DrawDegeneratesAsBBoxs (const TEL_COLOUR* theEdgeColour) const
1445 GLfloat minp[3] = { FLT_MAX, FLT_MAX, FLT_MAX };
1446 GLfloat maxp[3] = { FLT_MIN, FLT_MIN, FLT_MIN };
1447 tel_point pv = myPArray->vertices;
1449 glDisable (GL_LIGHTING);
1451 glColor3fv (theEdgeColour->rgb);
1453 for (Tint i = 0; i < myPArray->num_vertexs; ++i)
1455 if (pv[i].xyz[0] < minp[0])
1456 minp[0] = pv[i].xyz[0];
1457 if (pv[i].xyz[1] < minp[1])
1458 minp[1] = pv[i].xyz[1];
1459 if (pv[i].xyz[2] < minp[2])
1460 minp[2] = pv[i].xyz[2];
1462 if (pv[i].xyz[0] > maxp[0])
1463 maxp[0] = pv[i].xyz[0];
1464 if (pv[i].xyz[1] > maxp[1])
1465 maxp[1] = pv[i].xyz[1];
1466 if (pv[i].xyz[2] > maxp[2])
1467 maxp[2] = pv[i].xyz[2];
1470 glBegin (GL_LINE_STRIP);
1473 glVertex3f (minp[0], maxp[1], minp[2]);
1474 glVertex3f (minp[0], maxp[1], maxp[2]);
1475 glVertex3f (minp[0], minp[1], maxp[2]);
1476 glVertex3f (minp[0], minp[1], minp[2]);
1478 glVertex3f (maxp[0], minp[1], minp[2]);
1479 glVertex3f (maxp[0], maxp[1], minp[2]);
1480 glVertex3f (maxp[0], maxp[1], maxp[2]);
1481 glVertex3f (maxp[0], minp[1], maxp[2]);
1482 glVertex3f (maxp[0], minp[1], minp[2]);
1484 glVertex3f (maxp[0], minp[1], maxp[2]);
1485 glVertex3f (minp[0], minp[1], maxp[2]);
1486 glVertex3f (minp[0], maxp[1], maxp[2]);
1488 glVertex3f (maxp[0], maxp[1], minp[2]);
1489 glVertex3f (minp[0], maxp[1], minp[2]);
1494 // =======================================================================
1495 // function : OpenGl_PrimitiveArray
1497 // =======================================================================
1498 OpenGl_PrimitiveArray::OpenGl_PrimitiveArray (CALL_DEF_PARRAY* thePArray)
1499 : myPArray (thePArray),
1500 myDrawMode (DRAW_MODE_NONE),
1501 myIsVboInit (Standard_False)
1503 switch (myPArray->type)
1505 case TelPointsArrayType:
1506 myDrawMode = GL_POINTS;
1508 case TelPolylinesArrayType:
1509 myDrawMode = GL_LINE_STRIP;
1511 case TelSegmentsArrayType:
1512 myDrawMode = GL_LINES;
1514 case TelPolygonsArrayType:
1515 myDrawMode = GL_POLYGON;
1517 case TelTrianglesArrayType:
1518 myDrawMode = GL_TRIANGLES;
1520 case TelQuadranglesArrayType:
1521 myDrawMode = GL_QUADS;
1523 case TelTriangleStripsArrayType:
1524 myDrawMode = GL_TRIANGLE_STRIP;
1526 case TelQuadrangleStripsArrayType:
1527 myDrawMode = GL_QUAD_STRIP;
1529 case TelTriangleFansArrayType:
1530 myDrawMode = GL_TRIANGLE_FAN;
1535 // =======================================================================
1536 // function : ~OpenGl_PrimitiveArray
1538 // =======================================================================
1539 OpenGl_PrimitiveArray::~OpenGl_PrimitiveArray()
1544 // =======================================================================
1545 // function : Release
1547 // =======================================================================
1548 void OpenGl_PrimitiveArray::Release (const Handle(OpenGl_Context)& theContext)
1550 for (Standard_Integer anIter = 0; anIter < VBOMaxType; ++anIter)
1552 if (!myVbos[anIter].IsNull())
1554 if (!theContext.IsNull())
1556 theContext->DelayedRelease (myVbos[anIter]);
1558 myVbos[anIter].Nullify();
1563 // =======================================================================
1564 // function : Render
1566 // =======================================================================
1567 void OpenGl_PrimitiveArray::Render (const Handle(OpenGl_Workspace)& theWorkspace) const
1569 if (myPArray == NULL || myDrawMode == DRAW_MODE_NONE || myPArray->num_vertexs <= 0)
1574 // create VBOs on first render call
1575 if (!myIsVboInit && OpenGl_GraphicDriver::ToUseVBO() && theWorkspace->GetGlContext()->core15 != NULL)
1577 BuildVBO (theWorkspace);
1578 myIsVboInit = Standard_True;
1581 Standard_Boolean toDisableTexture = Standard_False;
1582 switch (myPArray->type)
1584 case TelPointsArrayType:
1585 case TelPolylinesArrayType:
1586 case TelSegmentsArrayType:
1588 glDisable (GL_LIGHTING);
1590 if ((theWorkspace->NamedStatus & OPENGL_NS_ANIMATION) != 0 &&
1591 (theWorkspace->NamedStatus & OPENGL_NS_WIREFRAME) == 0 &&
1592 theWorkspace->DegenerateModel)
1594 glDisable (GL_DEPTH_TEST);
1595 toDisableTexture = (theWorkspace->NamedStatus & OPENGL_NS_TEXTURE);
1596 theWorkspace->NamedStatus |= OPENGL_NS_WIREFRAME;
1600 case TelPolygonsArrayType:
1601 case TelTrianglesArrayType:
1602 case TelQuadranglesArrayType:
1603 case TelTriangleStripsArrayType:
1604 case TelTriangleFansArrayType:
1605 case TelQuadrangleStripsArrayType:
1607 if ((theWorkspace->NamedStatus & OPENGL_NS_ANIMATION) != 0 &&
1608 (theWorkspace->NamedStatus & OPENGL_NS_WIREFRAME) != 0 &&
1609 theWorkspace->DegenerateModel < 2)
1611 glEnable (GL_DEPTH_TEST);
1612 theWorkspace->NamedStatus &= ~OPENGL_NS_WIREFRAME;
1620 Handle(OpenGl_Texture) aPrevTexture;
1621 const OpenGl_AspectFace* anAspectFace = theWorkspace->AspectFace (Standard_True);
1622 const OpenGl_AspectLine* anAspectLine = theWorkspace->AspectLine (Standard_True);
1623 const OpenGl_AspectMarker* anAspectMarker = theWorkspace->AspectMarker (myPArray->type == TelPointsArrayType);
1624 if (toDisableTexture)
1626 aPrevTexture = theWorkspace->DisableTexture();
1629 Tint aFrontLightingModel = anAspectFace->IntFront.color_mask;
1630 const TEL_COLOUR* anInteriorColor = &anAspectFace->IntFront.matcol;
1631 const TEL_COLOUR* anEdgeColor = &anAspectFace->AspectEdge()->Color();
1632 const TEL_COLOUR* aLineColor = (myPArray->type == TelPointsArrayType) ? &anAspectMarker->Color() : &anAspectLine->Color();
1634 // Use highlight colors
1635 if (theWorkspace->NamedStatus & OPENGL_NS_HIGHLIGHT)
1637 anEdgeColor = anInteriorColor = aLineColor = theWorkspace->HighlightColor;
1638 aFrontLightingModel = 0;
1641 DrawArray (aFrontLightingModel,
1642 anAspectFace->InteriorStyle,
1647 &anAspectFace->IntFront,
1650 if (!aPrevTexture.IsNull())
1652 theWorkspace->EnableTexture (aPrevTexture);