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
70 #if !defined(GL_ES_VERSION_2_0)
72 const OpenGl_AspectLine* anAspectLine = theWorkspace->AspectLine (Standard_True);
73 const Handle(OpenGl_Texture) aPrevTexture = theWorkspace->DisableTexture();
75 glDisable (GL_LIGHTING);
76 if ((theWorkspace->NamedStatus & OPENGL_NS_IMMEDIATE) != 0)
78 glDepthMask (GL_FALSE);
81 // Use highlight colors
82 theWorkspace->GetGlContext()->core11->glColor3fv ((theWorkspace->NamedStatus & OPENGL_NS_HIGHLIGHT) ? theWorkspace->HighlightColor->rgb : anAspectLine->Color().rgb);
84 glEnableClientState (GL_VERTEX_ARRAY);
85 glVertexPointer (3, GL_FLOAT, 0, (GLfloat* )&myVerts);
86 glDrawArrays (GL_LINE_STRIP, 0, 16);
87 glDisableClientState (GL_VERTEX_ARRAY);
90 if (!aPrevTexture.IsNull())
92 theWorkspace->EnableTexture (aPrevTexture);
97 //! Release graphical resources
98 virtual void Release (OpenGl_Context*)
105 //! Protected destructor
106 virtual ~OpenGl_BndBoxPrs() {}
110 OpenGl_Vec3 myVerts[16]; //!< vertices array
114 DEFINE_STANDARD_ALLOC
118 /*----------------------------------------------------------------------*/
120 // =======================================================================
121 // function : OpenGl_Structure
123 // =======================================================================
124 OpenGl_Structure::OpenGl_Structure (const Handle(Graphic3d_StructureManager)& theManager)
125 : Graphic3d_CStructure (theManager),
126 myTransformation(NULL),
130 myAspectMarker(NULL),
132 myHighlightColor(NULL),
135 myIsRaytracable (Standard_False),
136 myModificationState (0),
137 myIsCulled (Standard_True),
138 myIsMirrored (Standard_False)
143 // =======================================================================
144 // function : ~OpenGl_Structure
146 // =======================================================================
147 OpenGl_Structure::~OpenGl_Structure()
149 Release (Handle(OpenGl_Context)());
150 delete myTransformation; myTransformation = NULL;
151 delete myTransPers; myTransPers = NULL;
154 // =======================================================================
155 // function : UpdateAspects
157 // =======================================================================
158 void OpenGl_Structure::UpdateAspects()
160 SetTransformPersistence (TransformPersistence);
162 if (ContextLine.IsDef)
163 SetAspectLine (ContextLine);
165 if (ContextFillArea.IsDef)
166 SetAspectFace (ContextFillArea);
168 if (ContextMarker.IsDef)
169 SetAspectMarker (ContextMarker);
171 if (ContextText.IsDef)
172 SetAspectText (ContextText);
175 // =======================================================================
176 // function : UpdateTransformation
178 // =======================================================================
179 void OpenGl_Structure::UpdateTransformation()
181 if (myTransformation == NULL)
183 myTransformation = new OpenGl_Matrix();
186 Standard_ShortReal (*aMat)[4] = Graphic3d_CStructure::Transformation;
188 Standard_ShortReal aDet =
189 aMat[0][0] * (aMat[1][1] * aMat[2][2] - aMat[2][1] * aMat[1][2]) -
190 aMat[0][1] * (aMat[1][0] * aMat[2][2] - aMat[2][0] * aMat[1][2]) +
191 aMat[0][2] * (aMat[1][0] * aMat[2][1] - aMat[2][0] * aMat[1][1]);
193 // Determinant of transform matrix less then 0 means that mirror transform applied.
194 myIsMirrored = aDet < 0.0f;
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)& aContext = GlDriver()->GetSharedContext();
299 setHighlightColor (aContext, theColor);
301 clearHighlightColor (aContext);
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)& aContext = GlDriver()->GetSharedContext();
314 clearHighlightBox (aContext);
318 if (!myHighlightBox.IsNull())
320 myHighlightBox->Release (aContext);
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) &theWorkspace) const
616 const Graphic3d_SequenceOfGroup& aGroups = DrawGroups();
617 for (OpenGl_Structure::GroupIterator aGroupIter (aGroups); aGroupIter.More(); aGroupIter.Next())
619 aGroupIter.Value()->Render (theWorkspace);
623 // =======================================================================
626 // =======================================================================
627 void OpenGl_Structure::Render (const Handle(OpenGl_Workspace) &theWorkspace) const
629 // Process the structure only if visible
630 if (myNamedStatus & OPENGL_NS_HIDE)
635 const Handle(OpenGl_Context)& aCtx = theWorkspace->GetGlContext();
637 // Render named status
638 const Standard_Integer aNamedStatus = theWorkspace->NamedStatus;
639 theWorkspace->NamedStatus |= myNamedStatus;
641 // Do we need to restore GL_NORMALIZE?
642 const Standard_Boolean anOldGlNormalize = aCtx->IsGlNormalizeEnabled();
644 // Apply local transformation
645 if (myTransformation)
647 OpenGl_Matrix aModelWorld;
648 OpenGl_Transposemat3 (&aModelWorld, myTransformation);
649 aCtx->ModelWorldState.Push();
650 aCtx->ModelWorldState.SetCurrent (OpenGl_Mat4::Map ((Standard_ShortReal* )aModelWorld.mat));
652 Standard_ShortReal aScaleX = OpenGl_Vec3 (myTransformation->mat[0][0],
653 myTransformation->mat[0][1],
654 myTransformation->mat[0][2]).SquareModulus();
655 // Scale transform detected.
656 if (Abs (aScaleX - 1.f) > Precision::Confusion())
658 aCtx->SetGlNormalizeEnabled (Standard_True);
662 // Apply transform persistence
663 const TEL_TRANSFORM_PERSISTENCE *aTransPersistence = NULL;
664 if ( myTransPers && myTransPers->mode != 0 )
666 aTransPersistence = theWorkspace->ActiveView()->BeginTransformPersistence (aCtx, myTransPers);
669 // Take into account transform persistence
670 aCtx->ApplyModelViewMatrix();
673 const OpenGl_AspectLine *anAspectLine = theWorkspace->AspectLine (Standard_False);
674 const OpenGl_AspectFace *anAspectFace = theWorkspace->AspectFace (Standard_False);
675 const OpenGl_AspectMarker *anAspectMarker = theWorkspace->AspectMarker (Standard_False);
676 const OpenGl_AspectText *anAspectText = theWorkspace->AspectText (Standard_False);
679 theWorkspace->SetAspectLine (myAspectLine);
683 theWorkspace->SetAspectFace (myAspectFace);
687 theWorkspace->SetAspectMarker (myAspectMarker);
691 theWorkspace->SetAspectText (myAspectText);
694 // Apply correction for mirror transform
697 aCtx->core11fwd->glFrontFace (GL_CW);
700 // Apply highlight color
701 const TEL_COLOUR *aHighlightColor = theWorkspace->HighlightColor;
702 if (myHighlightColor)
703 theWorkspace->HighlightColor = myHighlightColor;
705 // Render connected structures
706 OpenGl_ListOfStructure::Iterator anIter (myConnected);
707 while (anIter.More())
709 anIter.Value()->RenderGeometry (theWorkspace);
713 // Set up plane equations for non-structure transformed global model-view matrix
714 // List of planes to be applied to context state
715 Handle(Graphic3d_SequenceOfHClipPlane) aUserPlanes;
717 // Collect clipping planes of structure scope
718 if (!myClipPlanes.IsEmpty())
720 Graphic3d_SequenceOfHClipPlane::Iterator aClippingIter (myClipPlanes);
721 for (; aClippingIter.More(); aClippingIter.Next())
723 const Handle(Graphic3d_ClipPlane)& aClipPlane = aClippingIter.Value();
724 if (!aClipPlane->IsOn())
729 if (aUserPlanes.IsNull())
731 aUserPlanes = new Graphic3d_SequenceOfHClipPlane();
734 aUserPlanes->Append (aClipPlane);
738 if (!aUserPlanes.IsNull() && !aUserPlanes->IsEmpty())
740 // add planes at loaded view matrix state
741 aCtx->ChangeClipping().AddWorld (*aUserPlanes, theWorkspace);
743 // Set OCCT state uniform variables
744 if (!aCtx->ShaderManager()->IsEmpty())
746 aCtx->ShaderManager()->UpdateClippingState();
751 const Graphic3d_SequenceOfGroup& aGroups = DrawGroups();
752 for (OpenGl_Structure::GroupIterator aGroupIter (aGroups); aGroupIter.More(); aGroupIter.Next())
754 aGroupIter.Value()->Render (theWorkspace);
757 // Reset correction for mirror transform
760 aCtx->core11fwd->glFrontFace (GL_CCW);
763 // Render capping for structure groups
764 if (!aCtx->Clipping().Planes().IsEmpty())
766 OpenGl_CappingAlgo::RenderCapping (theWorkspace, aGroups);
769 // Revert structure clippings
770 if (!aUserPlanes.IsNull() && !aUserPlanes->IsEmpty())
772 aCtx->ChangeClipping().Remove (*aUserPlanes);
774 // Set OCCT state uniform variables
775 if (!aCtx->ShaderManager()->IsEmpty())
777 aCtx->ShaderManager()->RevertClippingState();
781 // Apply local transformation
782 if (myTransformation)
784 aCtx->ModelWorldState.Pop();
785 aCtx->SetGlNormalizeEnabled (anOldGlNormalize);
788 // Restore highlight color
789 theWorkspace->HighlightColor = aHighlightColor;
792 theWorkspace->SetAspectLine (anAspectLine);
793 theWorkspace->SetAspectFace (anAspectFace);
794 theWorkspace->SetAspectMarker (anAspectMarker);
795 theWorkspace->SetAspectText (anAspectText);
797 // Restore transform persistence
798 if ( myTransPers && myTransPers->mode != 0 )
800 theWorkspace->ActiveView()->BeginTransformPersistence (aCtx, aTransPersistence);
803 // Apply highlight box
804 if (!myHighlightBox.IsNull())
806 myHighlightBox->Render (theWorkspace);
809 // Restore named status
810 theWorkspace->NamedStatus = aNamedStatus;
813 // =======================================================================
814 // function : Release
816 // =======================================================================
817 void OpenGl_Structure::Release (const Handle(OpenGl_Context)& theGlCtx)
821 OpenGl_Element::Destroy (theGlCtx.operator->(), myAspectLine);
822 OpenGl_Element::Destroy (theGlCtx.operator->(), myAspectFace);
823 OpenGl_Element::Destroy (theGlCtx.operator->(), myAspectMarker);
824 OpenGl_Element::Destroy (theGlCtx.operator->(), myAspectText);
825 clearHighlightColor (theGlCtx);
827 // Remove from connected list of ancestor
828 UnregisterFromAncestorStructure();
831 // =======================================================================
832 // function : ReleaseGlResources
834 // =======================================================================
835 void OpenGl_Structure::ReleaseGlResources (const Handle(OpenGl_Context)& theGlCtx)
837 for (OpenGl_Structure::GroupIterator aGroupIter (myGroups); aGroupIter.More(); aGroupIter.Next())
839 aGroupIter.ChangeValue()->Release (theGlCtx);
841 if (myAspectLine != NULL)
843 myAspectLine->Release (theGlCtx.operator->());
845 if (myAspectFace != NULL)
847 myAspectFace->Release (theGlCtx.operator->());
849 if (myAspectMarker != NULL)
851 myAspectMarker->Release (theGlCtx.operator->());
853 if (myAspectText != NULL)
855 myAspectText->Release (theGlCtx.operator->());
857 if (!myHighlightBox.IsNull())
859 myHighlightBox->Release (theGlCtx.operator->());
863 //=======================================================================
864 //function : SetZLayer
866 //=======================================================================
867 void OpenGl_Structure::SetZLayer (const Standard_Integer theLayerIndex)
869 myZLayer = theLayerIndex;
872 //=======================================================================
873 //function : GetZLayer
875 //=======================================================================
876 Standard_Integer OpenGl_Structure::GetZLayer () const
881 //=======================================================================
882 //function : ShadowLink
884 //=======================================================================
885 Handle(Graphic3d_CStructure) OpenGl_Structure::ShadowLink (const Handle(Graphic3d_StructureManager)& theManager) const
887 return new OpenGl_StructureShadow (theManager, this);