1 // Created on: 2011-08-01
2 // Created by: Sergey ZERCHANINOV
3 // Copyright (c) 2011-2014 OPEN CASCADE SAS
5 // This file is part of Open CASCADE Technology software library.
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
16 #include <OpenGl_CappingAlgo.hxx>
17 #include <OpenGl_Context.hxx>
18 #include <OpenGl_GlCore11.hxx>
19 #include <OpenGl_GraphicDriver.hxx>
20 #include <OpenGl_ShaderManager.hxx>
21 #include <OpenGl_ShaderProgram.hxx>
22 #include <OpenGl_StructureShadow.hxx>
23 #include <OpenGl_telem_util.hxx>
24 #include <OpenGl_Vec.hxx>
25 #include <OpenGl_View.hxx>
26 #include <OpenGl_Workspace.hxx>
28 #include <Graphic3d_SequenceOfHClipPlane_Handle.hxx>
30 IMPLEMENT_STANDARD_HANDLE (OpenGl_Structure, Graphic3d_CStructure)
31 IMPLEMENT_STANDARD_RTTIEXT(OpenGl_Structure, Graphic3d_CStructure)
33 //! Auxiliary class for bounding box presentation
34 class OpenGl_BndBoxPrs : public OpenGl_Element
40 OpenGl_BndBoxPrs (const Graphic3d_BndBox4f& theBndBox)
42 const float Xm = theBndBox.CornerMin().x();
43 const float Ym = theBndBox.CornerMin().y();
44 const float Zm = theBndBox.CornerMin().z();
45 const float XM = theBndBox.CornerMax().x();
46 const float YM = theBndBox.CornerMax().y();
47 const float ZM = theBndBox.CornerMax().z();
49 myVerts[0] = OpenGl_Vec3 (Xm, Ym, Zm);
50 myVerts[1] = OpenGl_Vec3 (Xm, Ym, ZM);
51 myVerts[2] = OpenGl_Vec3 (Xm, YM, ZM);
52 myVerts[3] = OpenGl_Vec3 (Xm, YM, Zm);
53 myVerts[4] = OpenGl_Vec3 (Xm, Ym, Zm);
54 myVerts[5] = OpenGl_Vec3 (XM, Ym, Zm);
55 myVerts[6] = OpenGl_Vec3 (XM, Ym, ZM);
56 myVerts[7] = OpenGl_Vec3 (XM, YM, ZM);
57 myVerts[8] = OpenGl_Vec3 (XM, YM, Zm);
58 myVerts[9] = OpenGl_Vec3 (XM, Ym, Zm);
59 myVerts[10] = OpenGl_Vec3 (XM, YM, Zm);
60 myVerts[11] = OpenGl_Vec3 (Xm, YM, Zm);
61 myVerts[12] = OpenGl_Vec3 (Xm, YM, ZM);
62 myVerts[13] = OpenGl_Vec3 (XM, YM, ZM);
63 myVerts[14] = OpenGl_Vec3 (XM, Ym, ZM);
64 myVerts[15] = OpenGl_Vec3 (Xm, Ym, ZM);
67 //! Render presentation
68 virtual void Render (const Handle(OpenGl_Workspace)& theWorkspace) const
71 const OpenGl_AspectLine* anAspectLine = theWorkspace->AspectLine (Standard_True);
72 const Handle(OpenGl_Texture) aPrevTexture = theWorkspace->DisableTexture();
74 glDisable (GL_LIGHTING);
75 if ((theWorkspace->NamedStatus & OPENGL_NS_IMMEDIATE) != 0)
77 glDepthMask (GL_FALSE);
80 // Use highlight colors
81 glColor3fv ((theWorkspace->NamedStatus & OPENGL_NS_HIGHLIGHT) ? theWorkspace->HighlightColor->rgb : anAspectLine->Color().rgb);
83 glEnableClientState (GL_VERTEX_ARRAY);
84 glVertexPointer (3, GL_FLOAT, 0, (GLfloat* )&myVerts);
85 glDrawArrays (GL_LINE_STRIP, 0, 16);
86 glDisableClientState (GL_VERTEX_ARRAY);
89 if (!aPrevTexture.IsNull())
91 theWorkspace->EnableTexture (aPrevTexture);
95 //! Release graphical resources
96 virtual void Release (OpenGl_Context*)
103 //! Protected destructor
104 virtual ~OpenGl_BndBoxPrs() {}
108 OpenGl_Vec3 myVerts[16]; //!< vertices array
112 DEFINE_STANDARD_ALLOC
116 /*----------------------------------------------------------------------*/
118 // =======================================================================
119 // function : call_util_transpose_mat
121 // =======================================================================
122 static void call_util_transpose_mat (float tmat[16], float mat[4][4])
128 tmat[j*4+i] = mat[i][j];
131 // =======================================================================
132 // function : OpenGl_Structure
134 // =======================================================================
135 OpenGl_Structure::OpenGl_Structure (const Handle(Graphic3d_StructureManager)& theManager)
136 : Graphic3d_CStructure (theManager),
137 myTransformation(NULL),
141 myAspectMarker(NULL),
143 myHighlightColor(NULL),
146 myIsRaytracable (Standard_False),
147 myModificationState (0),
148 myIsCulled (Standard_True)
153 // =======================================================================
154 // function : ~OpenGl_Structure
156 // =======================================================================
157 OpenGl_Structure::~OpenGl_Structure()
159 Release (Handle(OpenGl_Context)());
160 delete myTransformation; myTransformation = NULL;
161 delete myTransPers; myTransPers = NULL;
164 // =======================================================================
165 // function : UpdateAspects
167 // =======================================================================
168 void OpenGl_Structure::UpdateAspects()
170 SetTransformPersistence (TransformPersistence);
172 if (ContextLine.IsDef)
173 SetAspectLine (ContextLine);
175 if (ContextFillArea.IsDef)
176 SetAspectFace (ContextFillArea);
178 if (ContextMarker.IsDef)
179 SetAspectMarker (ContextMarker);
181 if (ContextText.IsDef)
182 SetAspectText (ContextText);
185 // =======================================================================
186 // function : UpdateTransformation
188 // =======================================================================
189 void OpenGl_Structure::UpdateTransformation()
191 if (myTransformation == NULL)
193 myTransformation = new OpenGl_Matrix();
196 matcpy (myTransformation->mat, &Graphic3d_CStructure::Transformation[0][0]);
200 UpdateStateWithAncestorStructures();
204 // =======================================================================
205 // function : SetTransformPersistence
207 // =======================================================================
208 void OpenGl_Structure::SetTransformPersistence(const CALL_DEF_TRANSFORM_PERSISTENCE &ATransPers)
211 myTransPers = new TEL_TRANSFORM_PERSISTENCE;
213 myTransPers->mode = ATransPers.Flag;
214 myTransPers->pointX = ATransPers.Point.x;
215 myTransPers->pointY = ATransPers.Point.y;
216 myTransPers->pointZ = ATransPers.Point.z;
220 // =======================================================================
221 // function : SetAspectLine
223 // =======================================================================
224 void OpenGl_Structure::SetAspectLine (const CALL_DEF_CONTEXTLINE &theAspect)
228 myAspectLine = new OpenGl_AspectLine();
230 myAspectLine->SetAspect (theAspect);
233 // =======================================================================
234 // function : SetAspectFace
236 // =======================================================================
237 void OpenGl_Structure::SetAspectFace (const CALL_DEF_CONTEXTFILLAREA& theAspect)
241 myAspectFace = new OpenGl_AspectFace();
243 myAspectFace->SetAspect (theAspect);
247 UpdateStateWithAncestorStructures();
251 // =======================================================================
252 // function : SetAspectMarker
254 // =======================================================================
255 void OpenGl_Structure::SetAspectMarker (const CALL_DEF_CONTEXTMARKER& theAspect)
259 myAspectMarker = new OpenGl_AspectMarker();
261 myAspectMarker->SetAspect (theAspect);
264 // =======================================================================
265 // function : SetAspectText
267 // =======================================================================
268 void OpenGl_Structure::SetAspectText (const CALL_DEF_CONTEXTTEXT &theAspect)
272 myAspectText = new OpenGl_AspectText();
274 myAspectText->SetAspect (theAspect);
277 // =======================================================================
278 // function : clearHighlightBox
280 // =======================================================================
281 void OpenGl_Structure::clearHighlightBox (const Handle(OpenGl_Context)& theGlCtx)
283 if (!myHighlightBox.IsNull())
285 myHighlightBox->Release (theGlCtx);
286 myHighlightBox.Nullify();
290 // =======================================================================
291 // function : HighlightWithColor
293 // =======================================================================
294 void OpenGl_Structure::HighlightWithColor (const Graphic3d_Vec3& theColor,
295 const Standard_Boolean theToCreate)
297 const Handle(OpenGl_Context)& aCtx = GlDriver()->GetSharedContext();
299 setHighlightColor (aCtx, theColor);
301 clearHighlightColor (aCtx);
304 // =======================================================================
305 // function : HighlightWithBndBox
307 // =======================================================================
308 void OpenGl_Structure::HighlightWithBndBox (const Handle(Graphic3d_Structure)& theStruct,
309 const Standard_Boolean theToCreate)
311 const Handle(OpenGl_Context)& aCtx = GlDriver()->GetSharedContext();
314 clearHighlightBox (aCtx);
318 if (!myHighlightBox.IsNull())
320 myHighlightBox->Release (aCtx);
324 myHighlightBox = new OpenGl_Group (theStruct);
327 CALL_DEF_CONTEXTLINE& aContextLine = myHighlightBox->ChangeContextLine();
328 aContextLine.IsDef = 1;
329 aContextLine.Color = HighlightColor;
330 aContextLine.LineType = Aspect_TOL_SOLID;
331 aContextLine.Width = 1.0f;
332 myHighlightBox->UpdateAspectLine (Standard_True);
334 OpenGl_BndBoxPrs* aBndBoxPrs = new OpenGl_BndBoxPrs (myBndBox);
335 myHighlightBox->AddElement (aBndBoxPrs);
338 // =======================================================================
339 // function : setHighlightColor
341 // =======================================================================
342 void OpenGl_Structure::setHighlightColor (const Handle(OpenGl_Context)& theGlCtx,
343 const Graphic3d_Vec3& theColor)
345 clearHighlightBox (theGlCtx);
346 if (myHighlightColor == NULL)
348 myHighlightColor = new TEL_COLOUR();
351 myHighlightColor->rgb[0] = theColor.r();
352 myHighlightColor->rgb[1] = theColor.g();
353 myHighlightColor->rgb[2] = theColor.b();
354 myHighlightColor->rgb[3] = 1.F;
357 // =======================================================================
358 // function : clearHighlightColor
360 // =======================================================================
361 void OpenGl_Structure::clearHighlightColor (const Handle(OpenGl_Context)& theGlCtx)
363 clearHighlightBox(theGlCtx);
364 delete myHighlightColor;
365 myHighlightColor = NULL;
368 // =======================================================================
369 // function : UpdateNamedStatus
371 // =======================================================================
372 void OpenGl_Structure::UpdateNamedStatus()
375 if (highlight) myNamedStatus |= OPENGL_NS_HIGHLIGHT;
376 if (!visible) myNamedStatus |= OPENGL_NS_HIDE;
380 UpdateStateWithAncestorStructures();
384 // =======================================================================
385 // function : RegisterAncestorStructure
387 // =======================================================================
388 void OpenGl_Structure::RegisterAncestorStructure (const OpenGl_Structure* theStructure) const
390 for (OpenGl_ListOfStructure::Iterator anIt (myAncestorStructures); anIt.More(); anIt.Next())
392 if (anIt.Value() == theStructure)
398 myAncestorStructures.Append (theStructure);
401 // =======================================================================
402 // function : UnregisterAncestorStructure
404 // =======================================================================
405 void OpenGl_Structure::UnregisterAncestorStructure (const OpenGl_Structure* theStructure) const
407 for (OpenGl_ListOfStructure::Iterator anIt (myAncestorStructures); anIt.More(); anIt.Next())
409 if (anIt.Value() == theStructure)
411 myAncestorStructures.Remove (anIt);
417 // =======================================================================
418 // function : UnregisterFromAncestorStructure
420 // =======================================================================
421 void OpenGl_Structure::UnregisterFromAncestorStructure() const
423 for (OpenGl_ListOfStructure::Iterator anIta (myAncestorStructures); anIta.More(); anIta.Next())
425 OpenGl_Structure* anAncestor = const_cast<OpenGl_Structure*> (anIta.ChangeValue());
427 for (OpenGl_ListOfStructure::Iterator anIts (anAncestor->myConnected); anIts.More(); anIts.Next())
429 if (anIts.Value() == this)
431 anAncestor->myConnected.Remove (anIts);
438 // =======================================================================
439 // function : UpdateStateWithAncestorStructures
441 // =======================================================================
442 void OpenGl_Structure::UpdateStateWithAncestorStructures() const
444 myModificationState++;
446 for (OpenGl_ListOfStructure::Iterator anIt (myAncestorStructures); anIt.More(); anIt.Next())
448 anIt.Value()->UpdateStateWithAncestorStructures();
452 // =======================================================================
453 // function : UpdateRaytracableWithAncestorStructures
455 // =======================================================================
456 void OpenGl_Structure::UpdateRaytracableWithAncestorStructures() const
458 myIsRaytracable = OpenGl_Raytrace::IsRaytracedStructure (this);
460 if (!myIsRaytracable)
462 for (OpenGl_ListOfStructure::Iterator anIt (myAncestorStructures); anIt.More(); anIt.Next())
464 anIt.Value()->UpdateRaytracableWithAncestorStructures();
469 // =======================================================================
470 // function : SetRaytracableWithAncestorStructures
472 // =======================================================================
473 void OpenGl_Structure::SetRaytracableWithAncestorStructures() const
475 myIsRaytracable = Standard_True;
477 for (OpenGl_ListOfStructure::Iterator anIt (myAncestorStructures); anIt.More(); anIt.Next())
479 if (!anIt.Value()->IsRaytracable())
481 anIt.Value()->SetRaytracableWithAncestorStructures();
486 // =======================================================================
487 // function : Connect
489 // =======================================================================
490 void OpenGl_Structure::Connect (Graphic3d_CStructure& theStructure)
492 OpenGl_Structure* aStruct = (OpenGl_Structure* )&theStructure;
493 Disconnect (theStructure);
494 myConnected.Append (aStruct);
496 if (aStruct->IsRaytracable())
498 UpdateStateWithAncestorStructures();
499 SetRaytracableWithAncestorStructures();
502 aStruct->RegisterAncestorStructure (this);
505 // =======================================================================
506 // function : Disconnect
508 // =======================================================================
509 void OpenGl_Structure::Disconnect (Graphic3d_CStructure& theStructure)
511 OpenGl_Structure* aStruct = (OpenGl_Structure* )&theStructure;
512 for (OpenGl_ListOfStructure::Iterator anIter (myConnected); anIter.More(); anIter.Next())
514 // Check for the given structure
515 if (anIter.Value() == aStruct)
517 myConnected.Remove (anIter);
519 if (aStruct->IsRaytracable())
521 UpdateStateWithAncestorStructures();
522 UpdateRaytracableWithAncestorStructures();
525 aStruct->UnregisterAncestorStructure (this);
531 // =======================================================================
532 // function : NewGroup
534 // =======================================================================
535 Handle(Graphic3d_Group) OpenGl_Structure::NewGroup (const Handle(Graphic3d_Structure)& theStruct)
537 Handle(OpenGl_Group) aGroup = new OpenGl_Group (theStruct);
538 myGroups.Append (aGroup);
542 // =======================================================================
543 // function : RemoveGroup
545 // =======================================================================
546 void OpenGl_Structure::RemoveGroup (const Handle(Graphic3d_Group)& theGroup)
548 if (theGroup.IsNull())
553 for (Graphic3d_SequenceOfGroup::Iterator aGroupIter (myGroups); aGroupIter.More(); aGroupIter.Next())
555 // Check for the given group
556 if (aGroupIter.Value() == theGroup)
558 theGroup->Clear (Standard_False);
560 if (((OpenGl_Group* )theGroup.operator->())->IsRaytracable())
562 UpdateStateWithAncestorStructures();
563 UpdateRaytracableWithAncestorStructures();
566 myGroups.Remove (aGroupIter);
572 // =======================================================================
575 // =======================================================================
576 void OpenGl_Structure::Clear()
578 Clear (GlDriver()->GetSharedContext());
581 // =======================================================================
584 // =======================================================================
585 void OpenGl_Structure::Clear (const Handle(OpenGl_Context)& theGlCtx)
587 Standard_Boolean aRaytracableGroupDeleted (Standard_False);
590 for (OpenGl_Structure::GroupIterator aGroupIter (myGroups); aGroupIter.More(); aGroupIter.Next())
592 aRaytracableGroupDeleted |= aGroupIter.Value()->IsRaytracable();
595 aGroupIter.ChangeValue()->Release (theGlCtx);
599 if (aRaytracableGroupDeleted)
601 UpdateStateWithAncestorStructures();
602 UpdateRaytracableWithAncestorStructures();
605 Is2dText = Standard_False;
606 IsForHighlight = Standard_False;
609 // =======================================================================
610 // function : RenderGeometry
612 // =======================================================================
613 void OpenGl_Structure::RenderGeometry (const Handle(OpenGl_Workspace) &AWorkspace) const
616 const Graphic3d_SequenceOfGroup& aGroups = DrawGroups();
617 for (OpenGl_Structure::GroupIterator aGroupIter (aGroups); aGroupIter.More(); aGroupIter.Next())
619 aGroupIter.Value()->Render (AWorkspace);
623 // =======================================================================
626 // =======================================================================
627 void OpenGl_Structure::Render (const Handle(OpenGl_Workspace) &AWorkspace) const
629 // Process the structure only if visible
630 if ( myNamedStatus & OPENGL_NS_HIDE )
633 const Handle(OpenGl_Context)& aCtx = AWorkspace->GetGlContext();
635 // Render named status
636 const Standard_Integer named_status = AWorkspace->NamedStatus;
637 AWorkspace->NamedStatus |= myNamedStatus;
639 // Is rendering in ADD or IMMEDIATE mode?
640 const Standard_Boolean isImmediate = (AWorkspace->NamedStatus & OPENGL_NS_IMMEDIATE) != 0;
642 // Apply local transformation
643 GLint matrix_mode = 0;
644 const OpenGl_Matrix *local_trsf = NULL;
645 if (myTransformation)
649 Tmatrix3 aModelWorld;
650 call_util_transpose_mat (*aModelWorld, myTransformation->mat);
651 glGetIntegerv (GL_MATRIX_MODE, &matrix_mode);
653 if (!aCtx->ShaderManager()->IsEmpty())
656 glGetFloatv (GL_MODELVIEW_MATRIX, *aWorldView);
658 Tmatrix3 aProjection;
659 glGetFloatv (GL_PROJECTION_MATRIX, *aProjection);
661 aCtx->ShaderManager()->UpdateModelWorldStateTo (&aModelWorld);
662 aCtx->ShaderManager()->UpdateWorldViewStateTo (&aWorldView);
663 aCtx->ShaderManager()->UpdateProjectionStateTo (&aProjection);
666 glMatrixMode (GL_MODELVIEW);
668 glScalef (1.F, 1.F, 1.F);
669 glMultMatrixf (*aModelWorld);
673 glMatrixMode (GL_MODELVIEW);
676 local_trsf = AWorkspace->SetStructureMatrix (myTransformation);
680 // Apply transform persistence
681 const TEL_TRANSFORM_PERSISTENCE *trans_pers = NULL;
682 if ( myTransPers && myTransPers->mode != 0 )
684 trans_pers = AWorkspace->ActiveView()->BeginTransformPersistence (aCtx, myTransPers);
688 const OpenGl_AspectLine *aspect_line = AWorkspace->AspectLine(Standard_False);
689 const OpenGl_AspectFace *aspect_face = AWorkspace->AspectFace(Standard_False);
690 const OpenGl_AspectMarker *aspect_marker = AWorkspace->AspectMarker(Standard_False);
691 const OpenGl_AspectText *aspect_text = AWorkspace->AspectText(Standard_False);
693 AWorkspace->SetAspectLine(myAspectLine);
695 AWorkspace->SetAspectFace(myAspectFace);
697 AWorkspace->SetAspectMarker(myAspectMarker);
699 AWorkspace->SetAspectText(myAspectText);
701 // Apply highlight color
702 const TEL_COLOUR *highlight_color = AWorkspace->HighlightColor;
703 if (myHighlightColor)
704 AWorkspace->HighlightColor = myHighlightColor;
706 // Render connected structures
707 OpenGl_ListOfStructure::Iterator its(myConnected);
710 its.Value()->RenderGeometry (AWorkspace);
714 // Set up plane equations for non-structure transformed global model-view matrix
715 const Handle(OpenGl_Context)& aContext = AWorkspace->GetGlContext();
717 // List of planes to be applied to context state
718 Handle(Graphic3d_SequenceOfHClipPlane) aUserPlanes;
720 // Collect clipping planes of structure scope
721 if (!myClipPlanes.IsEmpty())
723 Graphic3d_SequenceOfHClipPlane::Iterator aClippingIt (myClipPlanes);
724 for (; aClippingIt.More(); aClippingIt.Next())
726 const Handle(Graphic3d_ClipPlane)& aClipPlane = aClippingIt.Value();
727 if (!aClipPlane->IsOn())
732 if (aUserPlanes.IsNull())
734 aUserPlanes = new Graphic3d_SequenceOfHClipPlane();
737 aUserPlanes->Append (aClipPlane);
741 if (!aUserPlanes.IsNull() && !aUserPlanes->IsEmpty())
743 // add planes at loaded view matrix state
744 aContext->ChangeClipping().AddWorld (*aUserPlanes, AWorkspace);
746 // Set OCCT state uniform variables
747 if (!aContext->ShaderManager()->IsEmpty())
749 aContext->ShaderManager()->UpdateClippingState();
754 const Graphic3d_SequenceOfGroup& aGroups = DrawGroups();
755 for (OpenGl_Structure::GroupIterator aGroupIter (aGroups); aGroupIter.More(); aGroupIter.Next())
757 aGroupIter.Value()->Render (AWorkspace);
760 // Render capping for structure groups
761 if (!aContext->Clipping().Planes().IsEmpty())
763 OpenGl_CappingAlgo::RenderCapping (AWorkspace, aGroups);
766 // Revert structure clippings
767 if (!aUserPlanes.IsNull() && !aUserPlanes->IsEmpty())
769 aContext->ChangeClipping().Remove (*aUserPlanes);
771 // Set OCCT state uniform variables
772 if (!aContext->ShaderManager()->IsEmpty())
774 aContext->ShaderManager()->RevertClippingState();
778 // Restore highlight color
779 AWorkspace->HighlightColor = highlight_color;
782 AWorkspace->SetAspectLine(aspect_line);
783 AWorkspace->SetAspectFace(aspect_face);
784 AWorkspace->SetAspectMarker(aspect_marker);
785 AWorkspace->SetAspectText(aspect_text);
787 // Restore transform persistence
788 if ( myTransPers && myTransPers->mode != 0 )
790 AWorkspace->ActiveView()->BeginTransformPersistence (aContext, trans_pers);
793 // Restore local transformation
794 if (myTransformation)
799 glMatrixMode (matrix_mode);
801 Tmatrix3 aModelWorldState = { { 1.f, 0.f, 0.f, 0.f },
802 { 0.f, 1.f, 0.f, 0.f },
803 { 0.f, 0.f, 1.f, 0.f },
804 { 0.f, 0.f, 0.f, 1.f } };
806 aContext->ShaderManager()->RevertModelWorldStateTo (&aModelWorldState);
810 AWorkspace->SetStructureMatrix (local_trsf, true);
812 glMatrixMode (GL_MODELVIEW);
817 // Apply highlight box
818 if (!myHighlightBox.IsNull())
820 myHighlightBox->Render (AWorkspace);
823 // Restore named status
824 AWorkspace->NamedStatus = named_status;
827 // =======================================================================
828 // function : Release
830 // =======================================================================
831 void OpenGl_Structure::Release (const Handle(OpenGl_Context)& theGlCtx)
835 OpenGl_Element::Destroy (theGlCtx.operator->(), myAspectLine);
836 OpenGl_Element::Destroy (theGlCtx.operator->(), myAspectFace);
837 OpenGl_Element::Destroy (theGlCtx.operator->(), myAspectMarker);
838 OpenGl_Element::Destroy (theGlCtx.operator->(), myAspectText);
839 clearHighlightColor (theGlCtx);
841 // Remove from connected list of ancestor
842 UnregisterFromAncestorStructure();
845 // =======================================================================
846 // function : ReleaseGlResources
848 // =======================================================================
849 void OpenGl_Structure::ReleaseGlResources (const Handle(OpenGl_Context)& theGlCtx)
851 for (OpenGl_Structure::GroupIterator aGroupIter (myGroups); aGroupIter.More(); aGroupIter.Next())
853 aGroupIter.ChangeValue()->Release (theGlCtx);
855 if (myAspectLine != NULL)
857 myAspectLine->Release (theGlCtx.operator->());
859 if (myAspectFace != NULL)
861 myAspectFace->Release (theGlCtx.operator->());
863 if (myAspectMarker != NULL)
865 myAspectMarker->Release (theGlCtx.operator->());
867 if (myAspectText != NULL)
869 myAspectText->Release (theGlCtx.operator->());
871 if (!myHighlightBox.IsNull())
873 myHighlightBox->Release (theGlCtx.operator->());
877 //=======================================================================
878 //function : SetZLayer
880 //=======================================================================
881 void OpenGl_Structure::SetZLayer (const Standard_Integer theLayerIndex)
883 myZLayer = theLayerIndex;
886 //=======================================================================
887 //function : GetZLayer
889 //=======================================================================
890 Standard_Integer OpenGl_Structure::GetZLayer () const
895 //=======================================================================
896 //function : ShadowLink
898 //=======================================================================
899 Handle(Graphic3d_CStructure) OpenGl_Structure::ShadowLink (const Handle(Graphic3d_StructureManager)& theManager) const
901 return new OpenGl_StructureShadow (theManager, this);