1 // Created by: NW,JPB,CAL
2 // Copyright (c) 1991-1999 Matra Datavision
3 // Copyright (c) 1999-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.
17 #include <Aspect_PolygonOffsetMode.hxx>
18 #include <Bnd_Box.hxx>
20 #include <Graphic3d_AspectFillArea3d.hxx>
21 #include <Graphic3d_AspectLine3d.hxx>
22 #include <Graphic3d_AspectMarker3d.hxx>
23 #include <Graphic3d_AspectText3d.hxx>
24 #include <Graphic3d_DataStructureManager.hxx>
25 #include <Graphic3d_GraphicDriver.hxx>
26 #include <Graphic3d_Group.hxx>
27 #include <Graphic3d_MapIteratorOfMapOfStructure.hxx>
28 #include <Graphic3d_MapOfStructure.hxx>
29 #include <Graphic3d_MaterialAspect.hxx>
30 #include <Graphic3d_PriorityDefinitionError.hxx>
31 #include <Graphic3d_Structure.hxx>
32 #include "Graphic3d_Structure.pxx"
33 #include <Graphic3d_StructureDefinitionError.hxx>
34 #include <Graphic3d_StructureManager.hxx>
35 #include <Graphic3d_TextureMap.hxx>
36 #include <Graphic3d_TransformError.hxx>
37 #include <Graphic3d_Vector.hxx>
38 #include <Quantity_Color.hxx>
39 #include <Standard_Type.hxx>
40 #include <TColStd_Array2OfReal.hxx>
43 //=============================================================================
44 //function : Graphic3d_Structure
46 //=============================================================================
47 Graphic3d_Structure::Graphic3d_Structure (const Handle(Graphic3d_StructureManager)& theManager)
48 : myStructureManager (theManager.operator->()),
49 myFirstStructureManager (theManager.operator->()),
50 myComputeVisual (Graphic3d_TOS_ALL),
51 myHighlightColor (Quantity_NOC_WHITE),
52 myHighlightMethod (Aspect_TOHM_COLOR),
54 myVisual (Graphic3d_TOS_ALL)
56 myCStructure = theManager->GraphicDriver()->Structure (theManager);
59 Handle(Graphic3d_AspectLine3d) aAspectLine3d = new Graphic3d_AspectLine3d();
60 Handle(Graphic3d_AspectText3d) aAspectText3d = new Graphic3d_AspectText3d();
61 Handle(Graphic3d_AspectMarker3d) aAspectMarker3d = new Graphic3d_AspectMarker3d();
62 Handle(Graphic3d_AspectFillArea3d) aAspectFillArea3d = new Graphic3d_AspectFillArea3d();
63 theManager->PrimitivesAspect (aAspectLine3d, aAspectText3d, aAspectMarker3d, aAspectFillArea3d);
64 aAspectFillArea3d->SetPolygonOffsets (Aspect_POM_Fill, 1.0, 0.0);
66 // update the associated CStructure
67 UpdateStructure (aAspectLine3d, aAspectText3d, aAspectMarker3d, aAspectFillArea3d);
70 //=============================================================================
71 //function : Graphic3d_Structure
73 //=============================================================================
74 Graphic3d_Structure::Graphic3d_Structure (const Handle(Graphic3d_StructureManager)& theManager,
75 const Handle(Graphic3d_Structure)& thePrs)
76 : myStructureManager (theManager.operator->()),
77 myFirstStructureManager (theManager.operator->()),
78 myComputeVisual (thePrs->myComputeVisual),
79 myHighlightColor (thePrs->myHighlightColor),
80 myHighlightMethod (thePrs->myHighlightMethod),
81 myOwner (thePrs->myOwner),
82 myVisual (thePrs->myVisual)
84 myCStructure = thePrs->myCStructure->ShadowLink (theManager);
87 Handle(Graphic3d_AspectLine3d) aAspectLine3d = new Graphic3d_AspectLine3d();
88 Handle(Graphic3d_AspectText3d) aAspectText3d = new Graphic3d_AspectText3d();
89 Handle(Graphic3d_AspectMarker3d) aAspectMarker3d = new Graphic3d_AspectMarker3d();
90 Handle(Graphic3d_AspectFillArea3d) aAspectFillArea3d = new Graphic3d_AspectFillArea3d();
91 theManager->PrimitivesAspect (aAspectLine3d, aAspectText3d, aAspectMarker3d, aAspectFillArea3d);
92 aAspectFillArea3d->SetPolygonOffsets (Aspect_POM_Fill, 1.0, 0.0);
94 // update the associated CStructure
95 UpdateStructure (aAspectLine3d, aAspectText3d, aAspectMarker3d, aAspectFillArea3d);
98 //=============================================================================
101 //=============================================================================
102 void Graphic3d_Structure::Destroy()
104 // as myFirstStructureManager can be already destroyed,
105 // avoid attempts to access it
106 myFirstStructureManager = NULL;
110 //=============================================================================
113 //=============================================================================
114 void Graphic3d_Structure::Clear (const Standard_Boolean theWithDestruction)
116 if (IsDeleted()) return;
118 // clean groups in graphics driver at first
119 GraphicClear (theWithDestruction);
121 myCStructure->ContainsFacet = 0;
122 myStructureManager->Clear (this, theWithDestruction);
127 //=======================================================================
128 //function : CalculateBoundBox
129 //purpose : Calculates AABB of a structure.
130 //=======================================================================
131 void Graphic3d_Structure::CalculateBoundBox()
133 Graphic3d_BndBox4d aBox;
134 addTransformed (aBox, Standard_True);
135 if (aBox.IsValid() && myCStructure->TransformPersistence.Flag == 0)
137 Graphic3d_Vec4 aMinPt (RealToShortReal (aBox.CornerMin().x()),
138 RealToShortReal (aBox.CornerMin().y()),
139 RealToShortReal (aBox.CornerMin().z()),
141 Graphic3d_Vec4 aMaxPt (RealToShortReal (aBox.CornerMax().x()),
142 RealToShortReal (aBox.CornerMax().y()),
143 RealToShortReal (aBox.CornerMax().z()),
145 myCStructure->ChangeBoundingBox() = Graphic3d_BndBox4f (aMinPt, aMaxPt);
149 myCStructure->ChangeBoundingBox().Clear();
153 //=============================================================================
156 //=============================================================================
157 void Graphic3d_Structure::Remove()
159 if (IsDeleted()) return;
161 // clean groups in graphics driver at first; this is also should be done
162 // to avoid unwanted group cleaning in group's destructor
163 // Pass Standard_False to Clear(..) method to avoid updating in
164 // structure manager, it isn't necessary, besides of it structure manager
165 // could be already destroyed and invalid pointers used in structure;
166 for (Graphic3d_SequenceOfGroup::Iterator aGroupIter (myCStructure->Groups()); aGroupIter.More(); aGroupIter.Next())
168 aGroupIter.ChangeValue()->Clear (Standard_False);
171 Standard_Address APtr = (void *) this;
172 // It is necessary to remove the eventual pointer on the structure
173 // that can be destroyed, in the list of descendants
174 // of ancestors of this structure and in the list of ancestors
175 // of descendants of the same structure.
177 for (Standard_Integer aStructIdx = 1, aNbDesc = myDescendants.Size(); aStructIdx <= aNbDesc; ++aStructIdx)
179 ((Graphic3d_Structure *)myDescendants.FindKey (aStructIdx))->Remove (APtr, Graphic3d_TOC_ANCESTOR);
182 for (Standard_Integer aStructIdx = 1, aNbAnces = myAncestors.Size(); aStructIdx <= aNbAnces; ++aStructIdx)
184 ((Graphic3d_Structure *)myAncestors.FindKey (aStructIdx))->Remove (APtr, Graphic3d_TOC_DESCENDANT);
187 // Destruction of me in the graphic library
188 const Standard_Integer aStructId = myCStructure->Id;
189 myCStructure->GraphicDriver()->RemoveStructure (myCStructure);
190 myCStructure.Nullify();
192 // Liberation of the identification if the destroyed structure
193 // in the first manager that performs creation of the structure.
194 if (myFirstStructureManager != NULL)
196 myFirstStructureManager->Remove (aStructId);
200 //=============================================================================
203 //=============================================================================
204 void Graphic3d_Structure::Display()
206 if (IsDeleted()) return;
208 if (!myCStructure->stick)
210 myCStructure->stick = 1;
211 myStructureManager->Display (this);
214 if (myCStructure->visible != 1)
216 myCStructure->visible = 1;
217 myCStructure->OnVisibilityChanged();
221 //=============================================================================
222 //function : SetIsForHighlight
224 //=============================================================================
225 void Graphic3d_Structure::SetIsForHighlight (const Standard_Boolean isForHighlight)
227 myCStructure->IsForHighlight = isForHighlight;
230 //=============================================================================
231 //function : SetDisplayPriority
233 //=============================================================================
234 void Graphic3d_Structure::SetDisplayPriority (const Standard_Integer thePriority)
237 || thePriority == myCStructure->Priority)
242 myCStructure->PreviousPriority = myCStructure->Priority;
243 myCStructure->Priority = thePriority;
245 if (myCStructure->Priority != myCStructure->PreviousPriority)
247 Graphic3d_PriorityDefinitionError_Raise_if ((myCStructure->Priority > Structure_MAX_PRIORITY)
248 || (myCStructure->Priority < Structure_MIN_PRIORITY),
249 "Bad value for StructurePriority");
250 if (myCStructure->stick)
252 myStructureManager->ChangeDisplayPriority (this, myCStructure->PreviousPriority, myCStructure->Priority);
257 //=============================================================================
258 //function : ResetDisplayPriority
260 //=============================================================================
261 void Graphic3d_Structure::ResetDisplayPriority()
264 || myCStructure->Priority == myCStructure->PreviousPriority)
269 const Standard_Integer aPriority = myCStructure->Priority;
270 myCStructure->Priority = myCStructure->PreviousPriority;
271 if (myCStructure->stick)
273 myStructureManager->ChangeDisplayPriority (this, aPriority, myCStructure->Priority);
277 //=============================================================================
278 //function : DisplayPriority
280 //=============================================================================
281 Standard_Integer Graphic3d_Structure::DisplayPriority() const
283 return myCStructure->Priority;
286 //=============================================================================
289 //=============================================================================
290 void Graphic3d_Structure::Erase()
297 if (myCStructure->stick)
299 myCStructure->stick = 0;
300 myStructureManager->Erase (this);
304 //=============================================================================
305 //function : Highlight
307 //=============================================================================
308 void Graphic3d_Structure::Highlight (const Aspect_TypeOfHighlightMethod theMethod,
309 const Quantity_Color& theColor,
310 const Standard_Boolean theToUpdateMgr)
317 myHighlightColor = theColor;
319 // Highlight on already Highlighted structure.
320 if (myCStructure->highlight)
322 Aspect_TypeOfUpdate anUpdateMode = myStructureManager->UpdateMode();
323 if (anUpdateMode == Aspect_TOU_WAIT)
329 // To avoid call of method : Update()
330 // Not useful and can be costly.
331 myStructureManager->SetUpdateMode (Aspect_TOU_WAIT);
333 myStructureManager->SetUpdateMode (anUpdateMode);
337 SetDisplayPriority (Structure_MAX_PRIORITY - 1);
339 GraphicHighlight (theMethod);
346 if (myCStructure->stick)
348 myStructureManager->Highlight (this, theMethod);
354 //=============================================================================
355 //function : SetVisible
357 //=============================================================================
358 void Graphic3d_Structure::SetVisible (const Standard_Boolean theValue)
360 if (IsDeleted()) return;
362 const unsigned isVisible = theValue ? 1 : 0;
363 if (myCStructure->visible == isVisible)
368 myCStructure->visible = isVisible;
369 myCStructure->OnVisibilityChanged();
373 //=============================================================================
374 //function : UnHighlight
376 //=============================================================================
377 void Graphic3d_Structure::UnHighlight()
379 if (IsDeleted()) return;
381 if (myCStructure->highlight)
383 myCStructure->highlight = 0;
385 GraphicUnHighlight();
386 myStructureManager->UnHighlight (this);
388 ResetDisplayPriority();
393 //=============================================================================
394 //function : HighlightColor
396 //=============================================================================
397 const Quantity_Color& Graphic3d_Structure::HighlightColor() const
399 return myHighlightColor;
402 //=============================================================================
403 //function : IsDisplayed
405 //=============================================================================
406 Standard_Boolean Graphic3d_Structure::IsDisplayed() const
408 return myCStructure->stick ? Standard_True : Standard_False;
411 //=============================================================================
412 //function : IsDeleted
414 //=============================================================================
415 Standard_Boolean Graphic3d_Structure::IsDeleted() const
417 return myCStructure.IsNull();
420 //=============================================================================
421 //function : IsHighlighted
423 //=============================================================================
424 Standard_Boolean Graphic3d_Structure::IsHighlighted() const
426 return myCStructure->highlight ? Standard_True : Standard_False;
429 //=============================================================================
430 //function : IsVisible
432 //=============================================================================
433 Standard_Boolean Graphic3d_Structure::IsVisible() const
435 return myCStructure->visible ? Standard_True : Standard_False;
438 //=============================================================================
439 //function : IsRotated
441 //=============================================================================
442 Standard_Boolean Graphic3d_Structure::IsRotated() const
444 // A somewhat light test !
445 return myCStructure->Transformation[0][1] != 0.0
446 || myCStructure->Transformation[0][2] != 0.0
447 || myCStructure->Transformation[1][0] != 0.0
448 || myCStructure->Transformation[1][2] != 0.0
449 || myCStructure->Transformation[2][0] != 0.0
450 || myCStructure->Transformation[2][1] != 0.0;
453 //=============================================================================
454 //function : IsTransformed
456 //=============================================================================
457 Standard_Boolean Graphic3d_Structure::IsTransformed() const
459 Standard_Boolean aResult = Standard_False;
460 for (Standard_Integer i = 0; i <= 3 && !aResult; ++i)
462 for (Standard_Integer j = 0; j <= 3 && !aResult; ++j)
465 aResult = myCStructure->Transformation[i][j] != 1.0;
467 aResult = myCStructure->Transformation[i][j] != 0.0;
473 //=============================================================================
474 //function : ContainsFacet
476 //=============================================================================
477 Standard_Boolean Graphic3d_Structure::ContainsFacet() const
481 return Standard_False;
483 else if (myCStructure->ContainsFacet > 0)
485 // if one of groups contains at least one facet, the structure contains it too
486 return Standard_True;
489 // stop at the first descendant containing at least one facet
490 for (Graphic3d_IndexedMapOfAddress::Iterator anIter (myDescendants); anIter.More(); anIter.Next())
492 if (((const Graphic3d_Structure *)anIter.Value())->ContainsFacet())
494 return Standard_True;
497 return Standard_False;
500 //=============================================================================
503 //=============================================================================
504 Standard_Boolean Graphic3d_Structure::IsEmpty() const
508 return Standard_True;
511 // structure is empty:
512 // - if all these groups are empty
513 // - or if all groups are empty and all their descendants are empty
514 // - or if all its descendants are empty
515 for (Graphic3d_SequenceOfGroup::Iterator aGroupIter (myCStructure->Groups()); aGroupIter.More(); aGroupIter.Next())
517 if (!aGroupIter.Value()->IsEmpty())
519 return Standard_False;
523 // stop at the first non-empty descendant
524 for (Graphic3d_IndexedMapOfAddress::Iterator anIter (myDescendants); anIter.More(); anIter.Next())
526 if (!((const Graphic3d_Structure* )anIter.Value())->IsEmpty())
528 return Standard_False;
531 return Standard_True;
534 //=============================================================================
535 //function : PrimitivesAspect
537 //=============================================================================
538 void Graphic3d_Structure::PrimitivesAspect (Handle(Graphic3d_AspectLine3d)& theAspLine,
539 Handle(Graphic3d_AspectText3d)& theAspText,
540 Handle(Graphic3d_AspectMarker3d)& theAspMarker,
541 Handle(Graphic3d_AspectFillArea3d)& theAspFill) const
543 theAspLine = Line3dAspect();
544 theAspText = Text3dAspect();
545 theAspMarker = Marker3dAspect();
546 theAspFill = FillArea3dAspect();
549 //=============================================================================
550 //function : GroupsWithFacet
552 //=============================================================================
553 void Graphic3d_Structure::GroupsWithFacet (const Standard_Integer theDelta)
555 myCStructure->ContainsFacet = myCStructure->ContainsFacet + theDelta;
556 if (myCStructure->ContainsFacet < 0)
558 myCStructure->ContainsFacet = 0;
562 //=============================================================================
565 //=============================================================================
566 void Graphic3d_Structure::Compute()
568 // Implemented by Presentation
571 //=============================================================================
574 //=============================================================================
575 Handle(Graphic3d_Structure) Graphic3d_Structure::Compute (const Handle(Graphic3d_DataStructureManager)& )
577 // Implemented by Presentation
581 //=============================================================================
584 //=============================================================================
585 Handle(Graphic3d_Structure) Graphic3d_Structure::Compute (const Handle(Graphic3d_DataStructureManager)& ,
586 const TColStd_Array2OfReal& )
588 // Implemented by Presentation
592 //=============================================================================
595 //=============================================================================
596 void Graphic3d_Structure::Compute (const Handle(Graphic3d_DataStructureManager)& ,
597 Handle(Graphic3d_Structure)& )
599 // Implemented by Presentation
602 //=============================================================================
605 //=============================================================================
606 void Graphic3d_Structure::Compute (const Handle(Graphic3d_DataStructureManager)& ,
607 const TColStd_Array2OfReal& ,
608 Handle(Graphic3d_Structure)& )
610 // Implemented by Presentation
613 //=============================================================================
614 //function : ReCompute
616 //=============================================================================
617 void Graphic3d_Structure::ReCompute()
619 myStructureManager->ReCompute (this);
622 //=============================================================================
623 //function : ReCompute
625 //=============================================================================
626 void Graphic3d_Structure::ReCompute (const Handle(Graphic3d_DataStructureManager)& theProjector)
628 myStructureManager->ReCompute (this, theProjector);
631 //=============================================================================
632 //function : SetInfiniteState
634 //=============================================================================
635 void Graphic3d_Structure::SetInfiniteState (const Standard_Boolean theToSet)
637 myCStructure->IsInfinite = theToSet ? 1 : 0;
640 //=============================================================================
641 //function : IsInfinite
643 //=============================================================================
644 Standard_Boolean Graphic3d_Structure::IsInfinite() const
647 || myCStructure->IsInfinite;
650 //=============================================================================
651 //function : GraphicClear
653 //=============================================================================
654 void Graphic3d_Structure::GraphicClear (const Standard_Boolean theWithDestruction)
656 if (myCStructure.IsNull())
661 // clean and empty each group
662 for (Graphic3d_SequenceOfGroup::Iterator aGroupIter (myCStructure->Groups()); aGroupIter.More(); aGroupIter.Next())
664 aGroupIter.ChangeValue()->Clear();
666 if (!theWithDestruction)
671 while (!myCStructure->Groups().IsEmpty())
673 Handle(Graphic3d_Group) aGroup = myCStructure->Groups().First();
676 myCStructure->Clear();
679 //=============================================================================
680 //function : GraphicConnect
682 //=============================================================================
683 void Graphic3d_Structure::GraphicConnect (const Handle(Graphic3d_Structure)& theDaughter)
685 myCStructure->Connect (*theDaughter->myCStructure);
688 //=============================================================================
689 //function : GraphicDisconnect
691 //=============================================================================
692 void Graphic3d_Structure::GraphicDisconnect (const Handle(Graphic3d_Structure)& theDaughter)
694 myCStructure->Disconnect (*theDaughter->myCStructure);
697 //=============================================================================
698 //function : Line3dAspect
700 //=============================================================================
701 Handle(Graphic3d_AspectLine3d) Graphic3d_Structure::Line3dAspect() const
703 const Standard_Real anRGB[3] =
705 Standard_Real (myCStructure->ContextLine.Color.r),
706 Standard_Real (myCStructure->ContextLine.Color.g),
707 Standard_Real (myCStructure->ContextLine.Color.b)
709 Quantity_Color aColor;
710 aColor.SetValues (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
711 Aspect_TypeOfLine aLType = Aspect_TypeOfLine (myCStructure->ContextLine.LineType);
712 Standard_Real aWidth = Standard_Real (myCStructure->ContextLine.Width);
714 Handle(Graphic3d_AspectLine3d) anAspLine = new Graphic3d_AspectLine3d (aColor, aLType, aWidth);
715 anAspLine->SetShaderProgram (myCStructure->ContextLine.ShaderProgram);
719 //=============================================================================
720 //function : Text3dAspect
722 //=============================================================================
723 Handle(Graphic3d_AspectText3d) Graphic3d_Structure::Text3dAspect() const
725 const Standard_Real anRGB[3] =
727 Standard_Real (myCStructure->ContextText.Color.r),
728 Standard_Real (myCStructure->ContextText.Color.g),
729 Standard_Real (myCStructure->ContextText.Color.b)
731 Quantity_Color aColor;
732 aColor.SetValues (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
733 Standard_CString aFont = Standard_CString (myCStructure->ContextText.Font);
734 Standard_Real anExpansion = Standard_Real (myCStructure->ContextText.Expan);
735 Standard_Real aSpace = Standard_Real (myCStructure->ContextText.Space);
736 Aspect_TypeOfStyleText aStyle = Aspect_TypeOfStyleText (myCStructure->ContextText.Style);
737 Aspect_TypeOfDisplayText aDispType = Aspect_TypeOfDisplayText (myCStructure->ContextText.DisplayType);
739 Handle(Graphic3d_AspectText3d) anAspText = new Graphic3d_AspectText3d (aColor, aFont, anExpansion, aSpace, aStyle, aDispType);
740 anAspText->SetShaderProgram (myCStructure->ContextText.ShaderProgram);
744 //=============================================================================
745 //function : Marker3dAspect
747 //=============================================================================
748 Handle(Graphic3d_AspectMarker3d) Graphic3d_Structure::Marker3dAspect() const
750 const Standard_Real anRGB[3] =
752 Standard_Real (myCStructure->ContextMarker.Color.r),
753 Standard_Real (myCStructure->ContextMarker.Color.g),
754 Standard_Real (myCStructure->ContextMarker.Color.b)
756 Quantity_Color aColor;
757 aColor.SetValues (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
758 Aspect_TypeOfMarker aMType = myCStructure->ContextMarker.MarkerType;
759 Standard_Real aScale = Standard_Real (myCStructure->ContextMarker.Scale);
761 Handle(Graphic3d_AspectMarker3d) anAspMarker = new Graphic3d_AspectMarker3d (aMType, aColor, aScale);
762 anAspMarker->SetShaderProgram (myCStructure->ContextMarker.ShaderProgram);
766 //=============================================================================
767 //function : FillArea3dAspect
769 //=============================================================================
770 Handle(Graphic3d_AspectFillArea3d) Graphic3d_Structure::FillArea3dAspect() const
773 Graphic3d_MaterialAspect aBack;
774 aBack.SetShininess (Standard_Real (myCStructure->ContextFillArea.Back.Shininess));
775 aBack.SetAmbient (Standard_Real (myCStructure->ContextFillArea.Back.Ambient));
776 aBack.SetDiffuse (Standard_Real (myCStructure->ContextFillArea.Back.Diffuse));
777 aBack.SetSpecular (Standard_Real (myCStructure->ContextFillArea.Back.Specular));
778 aBack.SetTransparency (Standard_Real (myCStructure->ContextFillArea.Back.Transparency));
779 aBack.SetEmissive (Standard_Real (myCStructure->ContextFillArea.Back.Emission));
780 if (myCStructure->ContextFillArea.Back.IsAmbient == 1)
781 aBack.SetReflectionModeOn (Graphic3d_TOR_AMBIENT);
783 aBack.SetReflectionModeOff (Graphic3d_TOR_AMBIENT);
784 if (myCStructure->ContextFillArea.Back.IsDiffuse == 1)
785 aBack.SetReflectionModeOn (Graphic3d_TOR_DIFFUSE);
787 aBack.SetReflectionModeOff (Graphic3d_TOR_DIFFUSE);
788 if (myCStructure->ContextFillArea.Back.IsSpecular == 1)
789 aBack.SetReflectionModeOn (Graphic3d_TOR_SPECULAR);
791 aBack.SetReflectionModeOff (Graphic3d_TOR_SPECULAR);
792 if (myCStructure->ContextFillArea.Back.IsEmission == 1)
793 aBack.SetReflectionModeOn (Graphic3d_TOR_EMISSION);
795 aBack.SetReflectionModeOff (Graphic3d_TOR_EMISSION);
797 Quantity_Color aColor (Standard_Real (myCStructure->ContextFillArea.Back.ColorSpec.r),
798 Standard_Real (myCStructure->ContextFillArea.Back.ColorSpec.g),
799 Standard_Real (myCStructure->ContextFillArea.Back.ColorSpec.b), Quantity_TOC_RGB);
800 aBack.SetSpecularColor (aColor);
802 aColor.SetValues (Standard_Real (myCStructure->ContextFillArea.Back.ColorAmb.r),
803 Standard_Real (myCStructure->ContextFillArea.Back.ColorAmb.g),
804 Standard_Real (myCStructure->ContextFillArea.Back.ColorAmb.b), Quantity_TOC_RGB);
805 aBack.SetAmbientColor (aColor);
807 aColor.SetValues (Standard_Real (myCStructure->ContextFillArea.Back.ColorDif.r),
808 Standard_Real (myCStructure->ContextFillArea.Back.ColorDif.g),
809 Standard_Real (myCStructure->ContextFillArea.Back.ColorDif.b), Quantity_TOC_RGB);
810 aBack.SetDiffuseColor (aColor);
812 aColor.SetValues (Standard_Real (myCStructure->ContextFillArea.Back.ColorEms.r),
813 Standard_Real (myCStructure->ContextFillArea.Back.ColorEms.g),
814 Standard_Real (myCStructure->ContextFillArea.Back.ColorEms.b), Quantity_TOC_RGB);
815 aBack.SetEmissiveColor (aColor);
817 aBack.SetEnvReflexion (myCStructure->ContextFillArea.Back.EnvReflexion);
818 aBack.SetMaterialType (myCStructure->ContextFillArea.Back.IsPhysic ? Graphic3d_MATERIAL_PHYSIC : Graphic3d_MATERIAL_ASPECT);
820 aBack.SetRefractionIndex (Standard_Real (myCStructure->ContextFillArea.Back.RefractionIndex));
821 aBack.SetBSDF (myCStructure->ContextFillArea.Back.BSDF);
824 Graphic3d_MaterialAspect aFront;
825 aFront.SetShininess (Standard_Real (myCStructure->ContextFillArea.Front.Shininess));
826 aFront.SetAmbient (Standard_Real (myCStructure->ContextFillArea.Front.Ambient));
827 aFront.SetDiffuse (Standard_Real (myCStructure->ContextFillArea.Front.Diffuse));
828 aFront.SetSpecular (Standard_Real (myCStructure->ContextFillArea.Front.Specular));
829 aFront.SetTransparency (Standard_Real (myCStructure->ContextFillArea.Front.Transparency));
830 aFront.SetEmissive (Standard_Real (myCStructure->ContextFillArea.Front.Emission));
831 if (myCStructure->ContextFillArea.Front.IsAmbient == 1)
832 aFront.SetReflectionModeOn (Graphic3d_TOR_AMBIENT);
834 aFront.SetReflectionModeOff (Graphic3d_TOR_AMBIENT);
835 if (myCStructure->ContextFillArea.Front.IsDiffuse == 1)
836 aFront.SetReflectionModeOn (Graphic3d_TOR_DIFFUSE);
838 aFront.SetReflectionModeOff (Graphic3d_TOR_DIFFUSE);
839 if (myCStructure->ContextFillArea.Front.IsSpecular == 1)
840 aFront.SetReflectionModeOn (Graphic3d_TOR_SPECULAR);
842 aFront.SetReflectionModeOff (Graphic3d_TOR_SPECULAR);
843 if (myCStructure->ContextFillArea.Front.Emission == 1)
844 aFront.SetReflectionModeOn (Graphic3d_TOR_EMISSION);
846 aFront.SetReflectionModeOff (Graphic3d_TOR_EMISSION);
848 aColor.SetValues (Standard_Real (myCStructure->ContextFillArea.Front.ColorSpec.r),
849 Standard_Real (myCStructure->ContextFillArea.Front.ColorSpec.g),
850 Standard_Real (myCStructure->ContextFillArea.Front.ColorSpec.b), Quantity_TOC_RGB);
851 aFront.SetSpecularColor (aColor);
853 aColor.SetValues (Standard_Real (myCStructure->ContextFillArea.Front.ColorAmb.r),
854 Standard_Real (myCStructure->ContextFillArea.Front.ColorAmb.g),
855 Standard_Real (myCStructure->ContextFillArea.Front.ColorAmb.b), Quantity_TOC_RGB);
856 aFront.SetAmbientColor (aColor);
858 aColor.SetValues (Standard_Real (myCStructure->ContextFillArea.Front.ColorDif.r),
859 Standard_Real (myCStructure->ContextFillArea.Front.ColorDif.g),
860 Standard_Real (myCStructure->ContextFillArea.Front.ColorDif.b), Quantity_TOC_RGB);
861 aFront.SetDiffuseColor (aColor);
863 aColor.SetValues (Standard_Real (myCStructure->ContextFillArea.Front.ColorEms.r),
864 Standard_Real (myCStructure->ContextFillArea.Front.ColorEms.g),
865 Standard_Real (myCStructure->ContextFillArea.Front.ColorEms.b), Quantity_TOC_RGB);
866 aFront.SetEmissiveColor (aColor);
868 aFront.SetEnvReflexion (myCStructure->ContextFillArea.Front.EnvReflexion);
869 aFront.SetMaterialType (myCStructure->ContextFillArea.Front.IsPhysic ? Graphic3d_MATERIAL_PHYSIC : Graphic3d_MATERIAL_ASPECT);
871 aFront.SetRefractionIndex (Standard_Real (myCStructure->ContextFillArea.Front.RefractionIndex));
872 aFront.SetBSDF (myCStructure->ContextFillArea.Front.BSDF);
874 Quantity_Color anIntColor (Standard_Real (myCStructure->ContextFillArea.IntColor.r),
875 Standard_Real (myCStructure->ContextFillArea.IntColor.g),
876 Standard_Real (myCStructure->ContextFillArea.IntColor.b), Quantity_TOC_RGB);
877 Quantity_Color anEdgeColor (Standard_Real (myCStructure->ContextFillArea.EdgeColor.r),
878 Standard_Real (myCStructure->ContextFillArea.EdgeColor.g),
879 Standard_Real (myCStructure->ContextFillArea.EdgeColor.b), Quantity_TOC_RGB);
880 Handle(Graphic3d_AspectFillArea3d) anAspFill = new Graphic3d_AspectFillArea3d (Aspect_InteriorStyle (myCStructure->ContextFillArea.Style),
881 anIntColor, anEdgeColor,
882 Aspect_TypeOfLine (myCStructure->ContextFillArea.LineType),
883 Standard_Real (myCStructure->ContextFillArea.Width),
887 if (myCStructure->ContextFillArea.Edge == 1)
888 anAspFill->SetEdgeOn();
890 anAspFill->SetEdgeOff();
892 anAspFill->SetHatchStyle (Aspect_HatchStyle (myCStructure->ContextFillArea.Hatch));
894 // Front and Back face
895 if (myCStructure->ContextFillArea.Distinguish == 1)
896 anAspFill->SetDistinguishOn();
898 anAspFill->SetDistinguishOff();
899 if (myCStructure->ContextFillArea.BackFace == 1)
900 anAspFill->SuppressBackFace();
902 anAspFill->AllowBackFace();
904 anAspFill->SetTextureMap (myCStructure->ContextFillArea.Texture.TextureMap);
905 if (myCStructure->ContextFillArea.Texture.doTextureMap == 1)
907 anAspFill->SetTextureMapOn();
911 anAspFill->SetTextureMapOff();
913 anAspFill->SetShaderProgram (myCStructure->ContextFillArea.ShaderProgram);
914 anAspFill->SetPolygonOffsets (myCStructure->ContextFillArea.PolygonOffsetMode,
915 myCStructure->ContextFillArea.PolygonOffsetFactor,
916 myCStructure->ContextFillArea.PolygonOffsetUnits);
920 //=============================================================================
923 //=============================================================================
924 const Graphic3d_SequenceOfGroup& Graphic3d_Structure::Groups() const
926 return myCStructure->Groups();
929 //=============================================================================
930 //function : NumberOfGroups
932 //=============================================================================
933 Standard_Integer Graphic3d_Structure::NumberOfGroups() const
935 return myCStructure->Groups().Length();
938 //=============================================================================
939 //function : SetPrimitivesAspect
941 //=============================================================================
942 void Graphic3d_Structure::SetPrimitivesAspect (const Handle(Graphic3d_AspectLine3d)& theAspLine)
944 if (IsDeleted()) return;
946 Standard_Real aWidth;
947 Quantity_Color aColor;
948 Aspect_TypeOfLine aLType;
949 theAspLine->Values (aColor, aLType, aWidth);
951 myCStructure->ContextLine.Color.r = float (aColor.Red());
952 myCStructure->ContextLine.Color.g = float (aColor.Green());
953 myCStructure->ContextLine.Color.b = float (aColor.Blue());
954 myCStructure->ContextLine.LineType = int (aLType);
955 myCStructure->ContextLine.Width = float (aWidth);
956 myCStructure->ContextLine.ShaderProgram = theAspLine->ShaderProgram();
957 myCStructure->ContextLine.IsDef = 1;
959 myCStructure->UpdateAspects();
961 // Attributes are "IsSet" during the first update of context (line, marker...)
962 myCStructure->ContextLine.IsSet = 1;
963 myCStructure->ContextFillArea.IsSet = 1;
964 myCStructure->ContextMarker.IsSet = 1;
965 myCStructure->ContextText.IsSet = 1;
970 //=============================================================================
971 //function : SetPrimitivesAspect
973 //=============================================================================
974 void Graphic3d_Structure::SetPrimitivesAspect (const Handle(Graphic3d_AspectFillArea3d)& theAspFill)
976 if (IsDeleted()) return;
978 Standard_Real anRGB[3];
979 Standard_Real aWidth;
980 Quantity_Color anIntColor;
981 Quantity_Color aBackIntColor;
982 Quantity_Color anEdgeColor;
983 Aspect_TypeOfLine aLType;
984 Aspect_InteriorStyle aStyle;
985 theAspFill->Values (aStyle, anIntColor, aBackIntColor, anEdgeColor, aLType, aWidth);
987 anIntColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
988 myCStructure->ContextFillArea.Style = aStyle;
989 myCStructure->ContextFillArea.IntColor.r = float (anRGB[0]);
990 myCStructure->ContextFillArea.IntColor.g = float (anRGB[1]);
991 myCStructure->ContextFillArea.IntColor.b = float (anRGB[2]);
993 if (theAspFill->Distinguish())
995 aBackIntColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
997 myCStructure->ContextFillArea.BackIntColor.r = float(anRGB[0]);
998 myCStructure->ContextFillArea.BackIntColor.g = float(anRGB[1]);
999 myCStructure->ContextFillArea.BackIntColor.b = float(anRGB[2]);
1002 myCStructure->ContextFillArea.Edge = theAspFill->Edge () ? 1 : 0;
1003 myCStructure->ContextFillArea.EdgeColor.r = float (anEdgeColor.Red());
1004 myCStructure->ContextFillArea.EdgeColor.g = float (anEdgeColor.Green());
1005 myCStructure->ContextFillArea.EdgeColor.b = float (anEdgeColor.Blue());
1006 myCStructure->ContextFillArea.LineType = aLType;
1007 myCStructure->ContextFillArea.Width = float (aWidth);
1008 myCStructure->ContextFillArea.Hatch = theAspFill->HatchStyle();
1010 // Front and Back face
1011 myCStructure->ContextFillArea.Distinguish = theAspFill->Distinguish() ? 1 : 0;
1012 myCStructure->ContextFillArea.BackFace = theAspFill->BackFace() ? 1 : 0;
1015 const Graphic3d_MaterialAspect& aBack = theAspFill->BackMaterial();
1016 // Light specificity
1017 myCStructure->ContextFillArea.Back.Shininess = float (aBack.Shininess());
1018 myCStructure->ContextFillArea.Back.Ambient = float (aBack.Ambient());
1019 myCStructure->ContextFillArea.Back.Diffuse = float (aBack.Diffuse());
1020 myCStructure->ContextFillArea.Back.Specular = float (aBack.Specular());
1021 myCStructure->ContextFillArea.Back.Transparency = float (aBack.Transparency());
1022 myCStructure->ContextFillArea.Back.RefractionIndex = float (aBack.RefractionIndex());
1023 myCStructure->ContextFillArea.Back.BSDF = aBack.BSDF();
1024 myCStructure->ContextFillArea.Back.Emission = float (aBack.Emissive());
1027 myCStructure->ContextFillArea.Back.IsAmbient = (aBack.ReflectionMode (Graphic3d_TOR_AMBIENT) ? 1 : 0);
1028 myCStructure->ContextFillArea.Back.IsDiffuse = (aBack.ReflectionMode (Graphic3d_TOR_DIFFUSE) ? 1 : 0);
1029 myCStructure->ContextFillArea.Back.IsSpecular = (aBack.ReflectionMode (Graphic3d_TOR_SPECULAR) ? 1 : 0);
1030 myCStructure->ContextFillArea.Back.IsEmission = (aBack.ReflectionMode (Graphic3d_TOR_EMISSION) ? 1 : 0);
1034 myCStructure->ContextFillArea.Back.IsPhysic = (aBack.MaterialType (Graphic3d_MATERIAL_PHYSIC) ? 1 : 0 );
1037 myCStructure->ContextFillArea.Back.ColorSpec.r = float (aBack.SpecularColor().Red());
1038 myCStructure->ContextFillArea.Back.ColorSpec.g = float (aBack.SpecularColor().Green());
1039 myCStructure->ContextFillArea.Back.ColorSpec.b = float (aBack.SpecularColor().Blue());
1042 myCStructure->ContextFillArea.Back.ColorAmb.r = float (aBack.AmbientColor().Red());
1043 myCStructure->ContextFillArea.Back.ColorAmb.g = float (aBack.AmbientColor().Green());
1044 myCStructure->ContextFillArea.Back.ColorAmb.b = float (aBack.AmbientColor().Blue());
1047 myCStructure->ContextFillArea.Back.ColorDif.r = float (aBack.DiffuseColor().Red());
1048 myCStructure->ContextFillArea.Back.ColorDif.g = float (aBack.DiffuseColor().Green());
1049 myCStructure->ContextFillArea.Back.ColorDif.b = float (aBack.DiffuseColor().Blue());
1052 myCStructure->ContextFillArea.Back.ColorEms.r = float (aBack.EmissiveColor().Red());
1053 myCStructure->ContextFillArea.Back.ColorEms.g = float (aBack.EmissiveColor().Green());
1054 myCStructure->ContextFillArea.Back.ColorEms.b = float (aBack.EmissiveColor().Blue());
1056 myCStructure->ContextFillArea.Back.EnvReflexion =
1057 float ((theAspFill->BackMaterial ()).EnvReflexion());
1060 const Graphic3d_MaterialAspect& aFront = theAspFill->FrontMaterial();
1061 // Light specificity
1062 myCStructure->ContextFillArea.Front.Shininess = float (aFront.Shininess());
1063 myCStructure->ContextFillArea.Front.Ambient = float (aFront.Ambient());
1064 myCStructure->ContextFillArea.Front.Diffuse = float (aFront.Diffuse());
1065 myCStructure->ContextFillArea.Front.Specular = float (aFront.Specular());
1066 myCStructure->ContextFillArea.Front.Transparency = float (aFront.Transparency());
1067 myCStructure->ContextFillArea.Front.RefractionIndex = float (aFront.RefractionIndex());
1068 myCStructure->ContextFillArea.Front.BSDF = aFront.BSDF();
1069 myCStructure->ContextFillArea.Front.Emission = float (aFront.Emissive());
1072 myCStructure->ContextFillArea.Front.IsAmbient = (aFront.ReflectionMode (Graphic3d_TOR_AMBIENT) ? 1 : 0);
1073 myCStructure->ContextFillArea.Front.IsDiffuse = (aFront.ReflectionMode (Graphic3d_TOR_DIFFUSE) ? 1 : 0);
1074 myCStructure->ContextFillArea.Front.IsSpecular = (aFront.ReflectionMode (Graphic3d_TOR_SPECULAR) ? 1 : 0);
1075 myCStructure->ContextFillArea.Front.IsEmission = (aFront.ReflectionMode (Graphic3d_TOR_EMISSION) ? 1 : 0);
1079 myCStructure->ContextFillArea.Front.IsPhysic = (aFront.MaterialType (Graphic3d_MATERIAL_PHYSIC) ? 1 : 0);
1082 myCStructure->ContextFillArea.Front.ColorSpec.r = float (aFront.SpecularColor().Red());
1083 myCStructure->ContextFillArea.Front.ColorSpec.g = float (aFront.SpecularColor().Green());
1084 myCStructure->ContextFillArea.Front.ColorSpec.b = float (aFront.SpecularColor().Blue());
1087 myCStructure->ContextFillArea.Front.ColorAmb.r = float (aFront.AmbientColor().Red());
1088 myCStructure->ContextFillArea.Front.ColorAmb.g = float (aFront.AmbientColor().Green());
1089 myCStructure->ContextFillArea.Front.ColorAmb.b = float (aFront.AmbientColor().Blue());
1092 myCStructure->ContextFillArea.Front.ColorDif.r = float (aFront.DiffuseColor().Red());
1093 myCStructure->ContextFillArea.Front.ColorDif.g = float (aFront.DiffuseColor().Green());
1094 myCStructure->ContextFillArea.Front.ColorDif.b = float (aFront.DiffuseColor().Blue());
1097 myCStructure->ContextFillArea.Front.ColorEms.r = float (aFront.EmissiveColor().Red());
1098 myCStructure->ContextFillArea.Front.ColorEms.g = float (aFront.EmissiveColor().Green());
1099 myCStructure->ContextFillArea.Front.ColorEms.b = float (aFront.EmissiveColor().Blue());
1101 myCStructure->ContextFillArea.Front.EnvReflexion = float (aFront.EnvReflexion());
1103 myCStructure->ContextFillArea.IsDef = 1; // Definition material ok
1105 myCStructure->ContextFillArea.Texture.TextureMap = theAspFill->TextureMap();
1106 myCStructure->ContextFillArea.Texture.doTextureMap = theAspFill->TextureMapState() ? 1 : 0;
1107 myCStructure->ContextFillArea.ShaderProgram = theAspFill->ShaderProgram();
1109 Standard_Integer aPolyMode;
1110 Standard_ShortReal aPolyFactor, aPolyUnits;
1111 theAspFill->PolygonOffsets (aPolyMode, aPolyFactor, aPolyUnits);
1112 myCStructure->ContextFillArea.PolygonOffsetMode = aPolyMode;
1113 myCStructure->ContextFillArea.PolygonOffsetFactor = aPolyFactor;
1114 myCStructure->ContextFillArea.PolygonOffsetUnits = aPolyUnits;
1116 myCStructure->UpdateAspects();
1118 // Attributes are "IsSet" during the first update of context (line, marker...)
1119 myCStructure->ContextLine.IsSet = 1;
1120 myCStructure->ContextFillArea.IsSet = 1;
1121 myCStructure->ContextMarker.IsSet = 1;
1122 myCStructure->ContextText.IsSet = 1;
1127 //=============================================================================
1128 //function : SetPrimitivesAspect
1130 //=============================================================================
1131 void Graphic3d_Structure::SetPrimitivesAspect (const Handle(Graphic3d_AspectText3d)& theAspText)
1133 if (IsDeleted()) return;
1135 Standard_CString aFont;
1136 Standard_Real aSpace, anExpansion, aTextAngle;
1137 Quantity_Color aColor, aColorSub;
1138 Aspect_TypeOfStyleText aStyle;
1139 Aspect_TypeOfDisplayText aDispType;
1140 Standard_Boolean isTextZoomable;
1141 Font_FontAspect aTextFontAspect;
1142 theAspText->Values (aColor, aFont, anExpansion, aSpace, aStyle, aDispType, aColorSub, isTextZoomable, aTextAngle, aTextFontAspect);
1144 myCStructure->ContextText.Color.r = float (aColor.Red());
1145 myCStructure->ContextText.Color.g = float (aColor.Green());
1146 myCStructure->ContextText.Color.b = float (aColor.Blue());
1147 myCStructure->ContextText.Font = aFont;
1148 myCStructure->ContextText.Expan = float (anExpansion);
1149 myCStructure->ContextText.Space = float (aSpace);
1150 myCStructure->ContextText.Style = aStyle;
1151 myCStructure->ContextText.DisplayType = aDispType;
1152 myCStructure->ContextText.ColorSubTitle.r = float (aColorSub.Red());
1153 myCStructure->ContextText.ColorSubTitle.g = float (aColorSub.Green());
1154 myCStructure->ContextText.ColorSubTitle.b = float (aColorSub.Blue());
1155 myCStructure->ContextText.TextZoomable = isTextZoomable;
1156 myCStructure->ContextText.TextAngle = float (aTextAngle);
1157 myCStructure->ContextText.TextFontAspect = aTextFontAspect;
1158 myCStructure->ContextText.ShaderProgram = theAspText->ShaderProgram();
1160 myCStructure->ContextText.IsDef = 1;
1162 myCStructure->UpdateAspects();
1164 // Attributes are "IsSet" during the first update of a context (line, marker...)
1165 myCStructure->ContextLine.IsSet = 1;
1166 myCStructure->ContextFillArea.IsSet = 1;
1167 myCStructure->ContextMarker.IsSet = 1;
1168 myCStructure->ContextText.IsSet = 1;
1173 //=============================================================================
1174 //function : SetPrimitivesAspect
1176 //=============================================================================
1177 void Graphic3d_Structure::SetPrimitivesAspect (const Handle(Graphic3d_AspectMarker3d)& theAspMarker)
1179 if (IsDeleted()) return;
1181 Standard_Real aScale;
1182 Quantity_Color aColor;
1183 Aspect_TypeOfMarker aMType;
1184 theAspMarker->Values (aColor, aMType, aScale);
1186 myCStructure->ContextMarker.Color.r = float (aColor.Red());
1187 myCStructure->ContextMarker.Color.g = float (aColor.Green());
1188 myCStructure->ContextMarker.Color.b = float (aColor.Blue());
1189 myCStructure->ContextMarker.MarkerType = aMType;
1190 myCStructure->ContextMarker.Scale = float (aScale);
1191 myCStructure->ContextMarker.ShaderProgram = theAspMarker->ShaderProgram();
1192 myCStructure->ContextMarker.IsDef = 1;
1194 myCStructure->UpdateAspects();
1196 // Attributes are "IsSet" during the first update of a context (line, marker...)
1197 myCStructure->ContextLine.IsSet = 1;
1198 myCStructure->ContextFillArea.IsSet = 1;
1199 myCStructure->ContextMarker.IsSet = 1;
1200 myCStructure->ContextText.IsSet = 1;
1205 //=============================================================================
1206 //function : SetVisual
1208 //=============================================================================
1209 void Graphic3d_Structure::SetVisual (const Graphic3d_TypeOfStructure theVisual)
1212 || myVisual == theVisual)
1217 if (!myCStructure->stick)
1219 myVisual = theVisual;
1220 SetComputeVisual (theVisual);
1224 Aspect_TypeOfUpdate anUpdateMode = myStructureManager->UpdateMode();
1225 if (anUpdateMode == Aspect_TOU_WAIT)
1228 myVisual = theVisual;
1229 SetComputeVisual (theVisual);
1233 // To avoid calling method : Update ()
1234 // Not useful and can be costly.
1235 myStructureManager->SetUpdateMode (Aspect_TOU_WAIT);
1237 myVisual = theVisual;
1238 SetComputeVisual (theVisual);
1239 myStructureManager->SetUpdateMode (anUpdateMode);
1245 //=============================================================================
1246 //function : SetZoomLimit
1248 //=============================================================================
1249 void Graphic3d_Structure::SetZoomLimit (const Standard_Real theLimitInf,
1250 const Standard_Real theLimitSup)
1254 Graphic3d_StructureDefinitionError_Raise_if (theLimitInf <= 0.0,
1255 "Bad value for ZoomLimit inf");
1256 Graphic3d_StructureDefinitionError_Raise_if (theLimitSup <= 0.0,
1257 "Bad value for ZoomLimit sup");
1258 Graphic3d_StructureDefinitionError_Raise_if (theLimitSup < theLimitInf,
1259 "ZoomLimit sup < ZoomLimit inf");
1262 //=============================================================================
1265 //=============================================================================
1266 Graphic3d_TypeOfStructure Graphic3d_Structure::Visual() const
1271 //=============================================================================
1272 //function : AcceptConnection
1274 //=============================================================================
1275 Standard_Boolean Graphic3d_Structure::AcceptConnection (const Handle(Graphic3d_Structure)& theStructure1,
1276 const Handle(Graphic3d_Structure)& theStructure2,
1277 const Graphic3d_TypeOfConnection theType)
1280 Graphic3d_MapOfStructure aSet;
1281 Graphic3d_Structure::Network (theStructure2, theType, aSet);
1282 return !aSet.Contains (theStructure1);
1285 //=============================================================================
1286 //function : Ancestors
1288 //=============================================================================
1289 void Graphic3d_Structure::Ancestors (Graphic3d_MapOfStructure& theSet) const
1291 for (Graphic3d_IndexedMapOfAddress::Iterator anIter (myAncestors); anIter.More(); anIter.Next())
1293 theSet.Add ((Graphic3d_Structure* )anIter.Value());
1297 //=============================================================================
1298 //function : SetOwner
1300 //=============================================================================
1301 void Graphic3d_Structure::SetOwner (const Standard_Address theOwner)
1306 //=============================================================================
1309 //=============================================================================
1310 Standard_Address Graphic3d_Structure::Owner() const
1315 //=============================================================================
1316 //function : Descendants
1318 //=============================================================================
1319 void Graphic3d_Structure::Descendants (Graphic3d_MapOfStructure& theSet) const
1321 for (Graphic3d_IndexedMapOfAddress::Iterator anIter (myDescendants); anIter.More(); anIter.Next())
1323 theSet.Add ((Graphic3d_Structure* )anIter.Value());
1327 //=============================================================================
1328 //function : AppendAncestor
1330 //=============================================================================
1331 Standard_Boolean Graphic3d_Structure::AppendAncestor (const Standard_Address theAncestor)
1333 const Standard_Integer aSize = myAncestors.Size();
1335 return myAncestors.Add (theAncestor) > aSize; // new object
1338 //=============================================================================
1339 //function : AppendDescendant
1341 //=============================================================================
1342 Standard_Boolean Graphic3d_Structure::AppendDescendant (const Standard_Address theDescendant)
1344 const Standard_Integer aSize = myDescendants.Size();
1346 return myDescendants.Add (theDescendant) > aSize; // new object
1349 //=============================================================================
1350 //function : RemoveAncestor
1352 //=============================================================================
1353 Standard_Boolean Graphic3d_Structure::RemoveAncestor (const Standard_Address theAncestor)
1355 const Standard_Integer anIndex = myAncestors.FindIndex (theAncestor);
1359 myAncestors.Swap (anIndex, myAncestors.Size());
1360 myAncestors.RemoveLast();
1363 return anIndex != 0; // object was found
1366 //=============================================================================
1367 //function : RemoveDescendant
1369 //=============================================================================
1370 Standard_Boolean Graphic3d_Structure::RemoveDescendant (const Standard_Address theDescendant)
1372 const Standard_Integer anIndex = myDescendants.FindIndex (theDescendant);
1376 myDescendants.Swap (anIndex, myDescendants.Size());
1377 myDescendants.RemoveLast();
1380 return anIndex != 0; // object was found
1383 //=============================================================================
1384 //function : Connect
1386 //=============================================================================
1387 void Graphic3d_Structure::Connect (const Handle(Graphic3d_Structure)& theStructure,
1388 const Graphic3d_TypeOfConnection theType,
1389 const Standard_Boolean theWithCheck)
1398 && !Graphic3d_Structure::AcceptConnection (this, theStructure, theType))
1403 const Standard_Address aStructure = theStructure.operator->();
1405 if (theType == Graphic3d_TOC_DESCENDANT)
1407 if (!AppendDescendant (aStructure))
1412 CalculateBoundBox();
1413 theStructure->Connect (this, Graphic3d_TOC_ANCESTOR);
1415 GraphicConnect (theStructure);
1416 myStructureManager->Connect (this, theStructure);
1420 else // Graphic3d_TOC_ANCESTOR
1422 if (!AppendAncestor (aStructure))
1427 CalculateBoundBox();
1428 theStructure->Connect (this, Graphic3d_TOC_DESCENDANT);
1430 // myStructureManager->Connect is called in case if connection between parent and child
1434 //=============================================================================
1435 //function : Disconnect
1437 //=============================================================================
1438 void Graphic3d_Structure::Disconnect (const Handle(Graphic3d_Structure)& theStructure)
1445 const Standard_Address aStructure = theStructure.operator->();
1447 if (RemoveDescendant (aStructure))
1449 theStructure->Disconnect (this);
1451 GraphicDisconnect (theStructure);
1452 myStructureManager->Disconnect (this, theStructure);
1454 CalculateBoundBox();
1457 else if (RemoveAncestor (aStructure))
1459 theStructure->Disconnect (this);
1460 CalculateBoundBox();
1462 // no call of myStructureManager->Disconnect in case of an ancestor
1466 //=============================================================================
1467 //function : DisconnectAll
1469 //=============================================================================
1470 void Graphic3d_Structure::DisconnectAll (const Graphic3d_TypeOfConnection theType)
1472 if (IsDeleted()) return;
1476 case Graphic3d_TOC_DESCENDANT:
1478 for (Standard_Integer anIdx = 1, aLength = myDescendants.Size(); anIdx <= aLength; ++anIdx)
1480 // Value (1) instead of Value (i) as myDescendants
1482 // Graphic3d_Structure::Disconnect (AStructure)
1483 // that takes AStructure from myDescendants
1484 ((Graphic3d_Structure* )(myDescendants.FindKey (1)))->Disconnect (this);
1488 case Graphic3d_TOC_ANCESTOR:
1490 for (Standard_Integer anIdx = 1, aLength = myAncestors.Size(); anIdx <= aLength; ++anIdx)
1492 // Value (1) instead of Value (i) as myAncestors
1494 // Graphic3d_Structure::Disconnect (AStructure)
1495 // that takes AStructure from myAncestors
1496 ((Graphic3d_Structure* )(myAncestors.FindKey (1)))->Disconnect (this);
1503 //=============================================================================
1504 //function : Composition
1506 //=============================================================================
1507 Graphic3d_TypeOfComposition Graphic3d_Structure::Composition() const
1509 return myCStructure->Composition;
1512 //=============================================================================
1513 //function : SetTransform
1515 //=============================================================================
1516 void Graphic3d_Structure::SetTransform (const TColStd_Array2OfReal& theMatrix,
1517 const Graphic3d_TypeOfComposition theType)
1519 if (IsDeleted()) return;
1521 Standard_Real valuetrsf;
1522 Standard_Real valueoldtrsf;
1523 Standard_Real valuenewtrsf;
1524 TColStd_Array2OfReal aNewTrsf (0, 3, 0, 3);
1525 TColStd_Array2OfReal aMatrix44 (0, 3, 0, 3);
1527 // Assign the new transformation in an array [0..3][0..3]
1528 // Avoid problems if the user has defined matrix [1..4][1..4]
1529 // or [3..6][-1..2] !!
1530 Standard_Integer lr = theMatrix.LowerRow();
1531 Standard_Integer ur = theMatrix.UpperRow();
1532 Standard_Integer lc = theMatrix.LowerCol();
1533 Standard_Integer uc = theMatrix.UpperCol();
1535 if ((ur - lr + 1 != 4) || (uc - lc + 1 != 4))
1537 Graphic3d_TransformError::Raise ("Transform : not a 4x4 matrix");
1542 case Graphic3d_TOC_REPLACE:
1544 myCStructure->Composition = Graphic3d_TOC_REPLACE;
1545 // Update of CStructure
1546 for (Standard_Integer i = 0; i <= 3; ++i)
1548 for (Standard_Integer j = 0; j <= 3; ++j)
1550 myCStructure->Transformation[i][j] = float (theMatrix (lr + i, lc + j));
1551 aNewTrsf (i, j) = theMatrix (lr + i, lc + j);
1556 case Graphic3d_TOC_POSTCONCATENATE:
1558 myCStructure->Composition = Graphic3d_TOC_POSTCONCATENATE;
1559 // To simplify management of indices
1560 for (Standard_Integer i = 0; i <= 3; ++i)
1562 for (Standard_Integer j = 0; j <= 3; ++j)
1564 aMatrix44 (i, j) = theMatrix (lr + i, lc + j);
1568 // Calculation of the product of matrices
1569 for (Standard_Integer i = 0; i <= 3; ++i)
1571 for (Standard_Integer j = 0; j <= 3; ++j)
1573 aNewTrsf (i, j) = 0.0;
1574 for (Standard_Integer k = 0; k <= 3; ++k)
1576 valueoldtrsf = myCStructure->Transformation[i][k];
1577 valuetrsf = aMatrix44 (k, j);
1578 valuenewtrsf = aNewTrsf (i, j) + valueoldtrsf * valuetrsf;
1579 aNewTrsf (i, j) = valuenewtrsf;
1584 // Update of CStructure
1585 for (Standard_Integer i = 0; i <= 3; ++i)
1587 for (Standard_Integer j = 0; j <= 3; ++j)
1589 myCStructure->Transformation[i][j] = float (aNewTrsf (i, j));
1596 // If transformation, no validation of hidden already calculated parts
1602 myCStructure->UpdateTransformation();
1603 myStructureManager->SetTransform (this, aNewTrsf);
1608 //=============================================================================
1609 //function : Transform
1611 //=============================================================================
1612 void Graphic3d_Structure::Transform (TColStd_Array2OfReal& theMatrix) const
1615 Standard_Integer lr = theMatrix.LowerRow ();
1616 Standard_Integer ur = theMatrix.UpperRow ();
1617 Standard_Integer lc = theMatrix.LowerCol ();
1618 Standard_Integer uc = theMatrix.UpperCol ();
1620 if ((ur - lr + 1 != 4) || (uc - lc + 1 != 4))
1621 Graphic3d_TransformError::Raise ("Transform : not a 4x4 matrix");
1623 for (Standard_Integer i = 0; i <= 3; ++i)
1625 for (Standard_Integer j = 0; j <= 3; ++j)
1627 theMatrix (lr + i, lc + j) = myCStructure->Transformation[i][j];
1633 //=============================================================================
1634 //function : MinMaxValues
1636 //=============================================================================
1637 Bnd_Box Graphic3d_Structure::MinMaxValues (const Standard_Boolean theToIgnoreInfiniteFlag) const
1639 Graphic3d_BndBox4d aBox;
1641 addTransformed (aBox, theToIgnoreInfiniteFlag);
1644 aResult.Add (gp_Pnt (aBox.CornerMin().x(),
1645 aBox.CornerMin().y(),
1646 aBox.CornerMin().z()));
1647 aResult.Add (gp_Pnt (aBox.CornerMax().x(),
1648 aBox.CornerMax().y(),
1649 aBox.CornerMax().z()));
1651 Standard_Real aLimMin = ShortRealFirst() + 1.0;
1652 Standard_Real aLimMax = ShortRealLast() - 1.0;
1653 gp_Pnt aMin = aResult.CornerMin();
1654 gp_Pnt aMax = aResult.CornerMax();
1655 if (aMin.X() < aLimMin && aMin.Y() < aLimMin && aMin.Z() < aLimMin &&
1656 aMax.X() > aLimMax && aMax.Y() > aLimMax && aMax.Z() > aLimMax)
1658 //For structure which infinite in all three dimensions the Whole bounding box will be returned
1665 //=============================================================================
1666 //function : Identification
1668 //=============================================================================
1669 Standard_Integer Graphic3d_Structure::Identification() const
1671 return myCStructure->Id;
1674 //=============================================================================
1675 //function : SetTransformPersistence
1677 //=============================================================================
1678 void Graphic3d_Structure::SetTransformPersistence (const Graphic3d_TransModeFlags& theFlag)
1680 SetTransformPersistence (theFlag, gp_Pnt (0.0, 0.0, 0.0));
1683 //=============================================================================
1684 //function : SetTransformPersistence
1686 //=============================================================================
1687 void Graphic3d_Structure::SetTransformPersistence (const Graphic3d_TransModeFlags& theFlag,
1688 const gp_Pnt& thePoint)
1690 if (IsDeleted()) return;
1692 myCStructure->TransformPersistence.Flag = theFlag;
1693 myCStructure->TransformPersistence.Point.x = float (thePoint.X());
1694 myCStructure->TransformPersistence.Point.y = float (thePoint.Y());
1695 myCStructure->TransformPersistence.Point.z = float (thePoint.Z());
1696 myCStructure->UpdateAspects();
1697 CalculateBoundBox();
1699 myCStructure->TransformPersistence.IsSet = 1;
1702 //=============================================================================
1703 //function : TransformPersistenceMode
1705 //=============================================================================
1706 Graphic3d_TransModeFlags Graphic3d_Structure::TransformPersistenceMode() const
1708 return myCStructure->TransformPersistence.Flag;
1711 //=============================================================================
1712 //function : TransformPersistencePoint
1714 //=============================================================================
1715 gp_Pnt Graphic3d_Structure::TransformPersistencePoint() const
1717 gp_Pnt aPnt (0.0, 0.0, 0.0);
1718 aPnt.SetX (myCStructure->TransformPersistence.Point.x);
1719 aPnt.SetY (myCStructure->TransformPersistence.Point.y);
1720 aPnt.SetZ (myCStructure->TransformPersistence.Point.z);
1724 //=============================================================================
1727 //=============================================================================
1728 void Graphic3d_Structure::Remove (const Standard_Address thePtr,
1729 const Graphic3d_TypeOfConnection theType)
1731 if (theType == Graphic3d_TOC_DESCENDANT)
1733 RemoveDescendant (thePtr);
1737 RemoveAncestor (thePtr);
1741 //=============================================================================
1742 //function : NewGroup
1744 //=============================================================================
1745 Handle(Graphic3d_Group) Graphic3d_Structure::NewGroup()
1747 return myCStructure->NewGroup (this);
1750 //=============================================================================
1753 //=============================================================================
1754 void Graphic3d_Structure::Remove (const Handle(Graphic3d_Group)& theGroup)
1756 if (theGroup.IsNull()
1757 || theGroup->myStructure != this)
1762 myCStructure->RemoveGroup (theGroup);
1763 theGroup->myStructure = NULL;
1766 //=============================================================================
1767 //function : StructureManager
1769 //=============================================================================
1770 Handle(Graphic3d_StructureManager) Graphic3d_Structure::StructureManager() const
1772 return myStructureManager;
1775 //=============================================================================
1776 //function : minMaxCoord
1778 //=============================================================================
1779 Graphic3d_BndBox4f Graphic3d_Structure::minMaxCoord() const
1781 Graphic3d_BndBox4f aBnd;
1782 for (Graphic3d_SequenceOfGroup::Iterator aGroupIter (myCStructure->Groups()); aGroupIter.More(); aGroupIter.Next())
1784 aBnd.Combine (aGroupIter.Value()->BoundingBox());
1789 //=============================================================================
1790 //function : addTransformed
1792 //=============================================================================
1793 void Graphic3d_Structure::getBox (Graphic3d_BndBox4d& theBox,
1794 const Standard_Boolean theToIgnoreInfiniteFlag) const
1796 Graphic3d_BndBox4f aBoxF = minMaxCoord();
1797 if (aBoxF.IsValid())
1799 theBox = Graphic3d_BndBox4d (Graphic3d_Vec4d ((Standard_Real )aBoxF.CornerMin().x(),
1800 (Standard_Real )aBoxF.CornerMin().y(),
1801 (Standard_Real )aBoxF.CornerMin().z(),
1802 (Standard_Real )aBoxF.CornerMin().w()),
1803 Graphic3d_Vec4d ((Standard_Real )aBoxF.CornerMax().x(),
1804 (Standard_Real )aBoxF.CornerMax().y(),
1805 (Standard_Real )aBoxF.CornerMax().z(),
1806 (Standard_Real )aBoxF.CornerMax().w()));
1808 && !theToIgnoreInfiniteFlag)
1810 const Graphic3d_Vec4d aDiagVec = theBox.CornerMax() - theBox.CornerMin();
1811 if (aDiagVec.xyz().SquareModulus() >= 500000.0 * 500000.0)
1813 // bounding borders of infinite line has been calculated as own point in center of this line
1814 theBox = Graphic3d_BndBox4d ((theBox.CornerMin() + theBox.CornerMax()) * 0.5);
1818 theBox = Graphic3d_BndBox4d (Graphic3d_Vec4d (RealFirst(), RealFirst(), RealFirst(), 1.0),
1819 Graphic3d_Vec4d (RealLast(), RealLast(), RealLast(), 1.0));
1826 //=============================================================================
1827 //function : addTransformed
1829 //=============================================================================
1830 void Graphic3d_Structure::addTransformed (Graphic3d_BndBox4d& theBox,
1831 const Standard_Boolean theToIgnoreInfiniteFlag) const
1833 Graphic3d_BndBox4d aCombinedBox, aBox;
1834 getBox (aCombinedBox, theToIgnoreInfiniteFlag);
1836 for (Graphic3d_IndexedMapOfAddress::Iterator anIter (myDescendants); anIter.More(); anIter.Next())
1838 const Graphic3d_Structure* aStruct = (const Graphic3d_Structure* )anIter.Value();
1839 aStruct->getBox (aBox, theToIgnoreInfiniteFlag);
1840 aCombinedBox.Combine (aBox);
1843 aBox = aCombinedBox;
1846 TColStd_Array2OfReal aTrsf (0, 3, 0, 3);
1848 TransformBoundaries (aTrsf, aBox.CornerMin().x(), aBox.CornerMin().y(), aBox.CornerMin().z(),
1849 aBox.CornerMax().x(), aBox.CornerMax().y(), aBox.CornerMax().z());
1851 // if box is still valid after transformation
1854 theBox.Combine (aBox);
1856 else // it was infinite, return untransformed
1858 theBox.Combine (aCombinedBox);
1863 //=============================================================================
1864 //function : Transforms
1866 //=============================================================================
1867 void Graphic3d_Structure::Transforms (const TColStd_Array2OfReal& theTrsf,
1868 const Standard_Real theX, const Standard_Real theY, const Standard_Real theZ,
1869 Standard_Real& theNewX, Standard_Real& theNewY, Standard_Real& theNewZ)
1871 const Standard_Real aRL = RealLast();
1872 const Standard_Real aRF = RealFirst();
1873 if ((theX == aRF) || (theY == aRF) || (theZ == aRF)
1874 || (theX == aRL) || (theY == aRL) || (theZ == aRL))
1882 Standard_Real A, B, C, D;
1887 theNewX = A * theX + B * theY + C * theZ + D;
1892 theNewY = A * theX + B * theY + C * theZ + D;
1897 theNewZ = A * theX + B * theY + C * theZ + D;
1901 //=============================================================================
1902 //function : Transforms
1904 //=============================================================================
1905 Graphic3d_Vector Graphic3d_Structure::Transforms (const TColStd_Array2OfReal& theTrsf,
1906 const Graphic3d_Vector& theCoord)
1908 Standard_Real anXYZ[3];
1909 Graphic3d_Structure::Transforms (theTrsf,
1910 theCoord.X(), theCoord.Y(), theCoord.Z(),
1911 anXYZ[0], anXYZ[1], anXYZ[2]);
1912 return Graphic3d_Vector (anXYZ[0], anXYZ[1], anXYZ[2]);
1915 //=============================================================================
1916 //function : Transforms
1918 //=============================================================================
1919 Graphic3d_Vertex Graphic3d_Structure::Transforms (const TColStd_Array2OfReal& theTrsf,
1920 const Graphic3d_Vertex& theCoord)
1922 Standard_Real anXYZ[3];
1923 Graphic3d_Structure::Transforms (theTrsf,
1924 theCoord.X(), theCoord.Y(), theCoord.Z(),
1925 anXYZ[0], anXYZ[1], anXYZ[2]);
1926 return Graphic3d_Vertex (anXYZ[0], anXYZ[1], anXYZ[2]);
1929 //=============================================================================
1930 //function : Transforms
1932 //=============================================================================
1933 void Graphic3d_Structure::TransformBoundaries (const TColStd_Array2OfReal& theTrsf,
1934 Standard_Real& theXMin,
1935 Standard_Real& theYMin,
1936 Standard_Real& theZMin,
1937 Standard_Real& theXMax,
1938 Standard_Real& theYMax,
1939 Standard_Real& theZMax)
1941 Standard_Real aXMin, aYMin, aZMin, aXMax, aYMax, aZMax, anU, aV, aW;
1943 Graphic3d_Structure::Transforms (theTrsf, theXMin, theYMin, theZMin, aXMin, aYMin, aZMin);
1944 Graphic3d_Structure::Transforms (theTrsf, theXMax, theYMax, theZMax, aXMax, aYMax, aZMax);
1946 Graphic3d_Structure::Transforms (theTrsf, theXMin, theYMin, theZMax, anU, aV, aW);
1947 aXMin = Min (anU, aXMin); aXMax = Max (anU, aXMax);
1948 aYMin = Min (aV, aYMin); aYMax = Max (aV, aYMax);
1949 aZMin = Min (aW, aZMin); aZMax = Max (aW, aZMax);
1951 Graphic3d_Structure::Transforms (theTrsf, theXMax, theYMin, theZMax, anU, aV, aW);
1952 aXMin = Min (anU, aXMin); aXMax = Max (anU, aXMax);
1953 aYMin = Min (aV, aYMin); aYMax = Max (aV, aYMax);
1954 aZMin = Min (aW, aZMin); aZMax = Max (aW, aZMax);
1956 Graphic3d_Structure::Transforms (theTrsf, theXMax, theYMin, theZMin, anU, aV, aW);
1957 aXMin = Min (anU, aXMin); aXMax = Max (anU, aXMax);
1958 aYMin = Min (aV, aYMin); aYMax = Max (aV, aYMax);
1959 aZMin = Min (aW, aZMin); aZMax = Max (aW, aZMax);
1961 Graphic3d_Structure::Transforms (theTrsf, theXMax, theYMax, theZMin, anU, aV, aW);
1962 aXMin = Min (anU, aXMin); aXMax = Max (anU, aXMax);
1963 aYMin = Min (aV, aYMin); aYMax = Max (aV, aYMax);
1964 aZMin = Min (aW, aZMin); aZMax = Max (aW, aZMax);
1966 Graphic3d_Structure::Transforms (theTrsf, theXMin, theYMax, theZMax, anU, aV, aW);
1967 aXMin = Min (anU, aXMin); aXMax = Max (anU, aXMax);
1968 aYMin = Min (aV, aYMin); aYMax = Max (aV, aYMax);
1969 aZMin = Min (aW, aZMin); aZMax = Max (aW, aZMax);
1971 Graphic3d_Structure::Transforms (theTrsf, theXMin, theYMax, theZMin, anU, aV, aW);
1972 aXMin = Min (anU, aXMin); aXMax = Max (anU, aXMax);
1973 aYMin = Min (aV, aYMin); aYMax = Max (aV, aYMax);
1974 aZMin = Min (aW, aZMin); aZMax = Max (aW, aZMax);
1984 //=============================================================================
1985 //function : Network
1987 //=============================================================================
1988 void Graphic3d_Structure::Network (const Handle(Graphic3d_Structure)& theStructure,
1989 const Graphic3d_TypeOfConnection theType,
1990 Graphic3d_MapOfStructure& theSet)
1992 Graphic3d_MapOfStructure aSetD, aSetA;
1993 theStructure->Descendants (aSetD);
1994 theStructure->Ancestors (aSetA);
1995 theSet.Add (theStructure);
1998 case Graphic3d_TOC_DESCENDANT:
1999 for (Graphic3d_MapIteratorOfMapOfStructure anIter (aSetD); anIter.More(); anIter.Next())
2001 Graphic3d_Structure::Network (anIter.Key(), theType, theSet);
2004 case Graphic3d_TOC_ANCESTOR:
2005 for (Graphic3d_MapIteratorOfMapOfStructure anIter (aSetA); anIter.More(); anIter.Next())
2007 Graphic3d_Structure::Network (anIter.Key (), theType, theSet);
2013 //=============================================================================
2014 //function : PrintNetwork
2016 //=============================================================================
2017 void Graphic3d_Structure::PrintNetwork (const Handle(Graphic3d_Structure)& theStructure,
2018 const Graphic3d_TypeOfConnection theType)
2020 Graphic3d_MapOfStructure aSet;
2021 Graphic3d_Structure::Network (theStructure, theType, aSet);
2022 for (Graphic3d_MapIteratorOfMapOfStructure anIter (aSet); anIter.More(); anIter.Next())
2024 std::cout << "\tIdent " << (anIter.Key())->Identification () << "\n";
2026 std::cout << std::flush;
2029 //=============================================================================
2032 //=============================================================================
2033 void Graphic3d_Structure::Update() const
2040 if (myStructureManager->UpdateMode() == Aspect_TOU_ASAP)
2042 myStructureManager->Update();
2046 //=============================================================================
2047 //function : UpdateStructure
2049 //=============================================================================
2050 void Graphic3d_Structure::UpdateStructure (const Handle(Graphic3d_AspectLine3d)& theAspLine,
2051 const Handle(Graphic3d_AspectText3d)& theAspText,
2052 const Handle(Graphic3d_AspectMarker3d)& theAspMarker,
2053 const Handle(Graphic3d_AspectFillArea3d)& theAspFill)
2055 Standard_CString aFont;
2056 Standard_Real aSpace, anExpansion, aWidth, aScale;
2057 Quantity_Color aColor, anIntColor, aBackIntColor, anEdgeColor, aColorSub;
2058 Aspect_TypeOfLine aLType;
2059 Aspect_TypeOfMarker aMType;
2060 Aspect_InteriorStyle aStyle;
2061 Aspect_TypeOfStyleText aStyleT;
2062 Aspect_TypeOfDisplayText aDisplayType;
2063 Standard_Boolean aTextZoomable;
2064 Standard_Real aTextAngle;
2065 Font_FontAspect aTextFontAspect;
2067 theAspLine->Values (aColor, aLType, aWidth);
2068 myCStructure->ContextLine.Color.r = float (aColor.Red());
2069 myCStructure->ContextLine.Color.g = float (aColor.Green());
2070 myCStructure->ContextLine.Color.b = float (aColor.Blue());
2071 myCStructure->ContextLine.LineType = aLType;
2072 myCStructure->ContextLine.Width = float (aWidth);
2073 myCStructure->ContextLine.ShaderProgram = theAspLine->ShaderProgram();
2075 theAspMarker->Values (aColor, aMType, aScale);
2076 myCStructure->ContextMarker.Color.r = float (aColor.Red());
2077 myCStructure->ContextMarker.Color.g = float (aColor.Green());
2078 myCStructure->ContextMarker.Color.b = float (aColor.Blue());
2079 myCStructure->ContextMarker.MarkerType = aMType;
2080 myCStructure->ContextMarker.Scale = float (aScale);
2081 myCStructure->ContextMarker.ShaderProgram = theAspMarker->ShaderProgram();
2083 theAspText->Values (aColor, aFont, anExpansion, aSpace, aStyleT, aDisplayType, aColorSub, aTextZoomable, aTextAngle, aTextFontAspect);
2084 myCStructure->ContextText.Color.r = float (aColor.Red());
2085 myCStructure->ContextText.Color.g = float (aColor.Green());
2086 myCStructure->ContextText.Color.b = float (aColor.Blue());
2087 myCStructure->ContextText.Font = aFont;
2088 myCStructure->ContextText.Expan = float (anExpansion);
2089 myCStructure->ContextText.Style = aStyleT;
2090 myCStructure->ContextText.DisplayType = aDisplayType;
2091 myCStructure->ContextText.Space = float (aSpace);
2092 myCStructure->ContextText.ColorSubTitle.r = float (aColorSub.Red());
2093 myCStructure->ContextText.ColorSubTitle.g = float (aColorSub.Green());
2094 myCStructure->ContextText.ColorSubTitle.b = float (aColorSub.Blue());
2095 myCStructure->ContextText.TextZoomable = aTextZoomable;
2096 myCStructure->ContextText.TextAngle = float (aTextAngle);
2097 myCStructure->ContextText.TextFontAspect = aTextFontAspect;
2098 myCStructure->ContextText.ShaderProgram = theAspText->ShaderProgram();
2100 Standard_Real anRGB[3];
2101 theAspFill->Values (aStyle, anIntColor, aBackIntColor, anEdgeColor, aLType, aWidth);
2102 anIntColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
2103 myCStructure->ContextFillArea.Style = aStyle;
2104 myCStructure->ContextFillArea.IntColor.r = float (anRGB[0]);
2105 myCStructure->ContextFillArea.IntColor.g = float (anRGB[1]);
2106 myCStructure->ContextFillArea.IntColor.b = float (anRGB[2]);
2108 if (theAspFill->Distinguish())
2110 aBackIntColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
2112 myCStructure->ContextFillArea.BackIntColor.r = float (anRGB[0]);
2113 myCStructure->ContextFillArea.BackIntColor.g = float (anRGB[1]);
2114 myCStructure->ContextFillArea.BackIntColor.b = float (anRGB[2]);
2117 myCStructure->ContextFillArea.Edge = theAspFill->Edge () ? 1:0;
2118 myCStructure->ContextFillArea.EdgeColor.r = float (anEdgeColor.Red());
2119 myCStructure->ContextFillArea.EdgeColor.g = float (anEdgeColor.Green());
2120 myCStructure->ContextFillArea.EdgeColor.b = float (anEdgeColor.Blue());
2121 myCStructure->ContextFillArea.LineType = aLType;
2122 myCStructure->ContextFillArea.Width = float (aWidth);
2123 myCStructure->ContextFillArea.Hatch = theAspFill->HatchStyle();
2125 // Front and Back face
2126 myCStructure->ContextFillArea.Distinguish = theAspFill->Distinguish() ? 1 : 0;
2127 myCStructure->ContextFillArea.BackFace = theAspFill->BackFace() ? 1 : 0;
2129 const Graphic3d_MaterialAspect& aBack = theAspFill->BackMaterial();
2130 // Light specificity
2131 myCStructure->ContextFillArea.Back.Shininess = float (aBack.Shininess());
2132 myCStructure->ContextFillArea.Back.Ambient = float (aBack.Ambient());
2133 myCStructure->ContextFillArea.Back.Diffuse = float (aBack.Diffuse());
2134 myCStructure->ContextFillArea.Back.Specular = float (aBack.Specular());
2135 myCStructure->ContextFillArea.Back.Transparency = float (aBack.Transparency());
2136 myCStructure->ContextFillArea.Back.Emission = float (aBack.Emissive());
2139 myCStructure->ContextFillArea.Back.IsAmbient = (aBack.ReflectionMode (Graphic3d_TOR_AMBIENT) ? 1 : 0);
2140 myCStructure->ContextFillArea.Back.IsDiffuse = (aBack.ReflectionMode (Graphic3d_TOR_DIFFUSE) ? 1 : 0);
2141 myCStructure->ContextFillArea.Back.IsSpecular = (aBack.ReflectionMode (Graphic3d_TOR_SPECULAR) ? 1 : 0);
2142 myCStructure->ContextFillArea.Back.IsEmission = (aBack.ReflectionMode (Graphic3d_TOR_EMISSION) ? 1 : 0);
2145 myCStructure->ContextFillArea.Back.IsPhysic = (aBack.MaterialType (Graphic3d_MATERIAL_PHYSIC) ? 1 : 0);
2148 myCStructure->ContextFillArea.Back.ColorSpec.r = float (aBack.SpecularColor().Red());
2149 myCStructure->ContextFillArea.Back.ColorSpec.g = float (aBack.SpecularColor().Green());
2150 myCStructure->ContextFillArea.Back.ColorSpec.b = float (aBack.SpecularColor().Blue());
2153 myCStructure->ContextFillArea.Back.ColorAmb.r = float (aBack.AmbientColor().Red());
2154 myCStructure->ContextFillArea.Back.ColorAmb.g = float (aBack.AmbientColor().Green());
2155 myCStructure->ContextFillArea.Back.ColorAmb.b = float (aBack.AmbientColor().Blue());
2158 myCStructure->ContextFillArea.Back.ColorDif.r = float (aBack.DiffuseColor().Red());
2159 myCStructure->ContextFillArea.Back.ColorDif.g = float (aBack.DiffuseColor().Green());
2160 myCStructure->ContextFillArea.Back.ColorDif.b = float (aBack.DiffuseColor().Blue());
2163 myCStructure->ContextFillArea.Back.ColorEms.r = float (aBack.EmissiveColor().Red());
2164 myCStructure->ContextFillArea.Back.ColorEms.g = float (aBack.EmissiveColor().Green());
2165 myCStructure->ContextFillArea.Back.ColorEms.b = float (aBack.EmissiveColor().Blue());
2167 myCStructure->ContextFillArea.Back.EnvReflexion = float (aBack.EnvReflexion());
2170 const Graphic3d_MaterialAspect& aFront = theAspFill->FrontMaterial();
2171 // Light specificity
2172 myCStructure->ContextFillArea.Front.Shininess = float (aFront.Shininess());
2173 myCStructure->ContextFillArea.Front.Ambient = float (aFront.Ambient());
2174 myCStructure->ContextFillArea.Front.Diffuse = float (aFront.Diffuse());
2175 myCStructure->ContextFillArea.Front.Specular = float (aFront.Specular());
2176 myCStructure->ContextFillArea.Front.Transparency = float (aFront.Transparency());
2177 myCStructure->ContextFillArea.Front.Emission = float (aFront.Emissive());
2180 myCStructure->ContextFillArea.Front.IsAmbient = (aFront.ReflectionMode (Graphic3d_TOR_AMBIENT) ? 1 : 0);
2181 myCStructure->ContextFillArea.Front.IsDiffuse = (aFront.ReflectionMode (Graphic3d_TOR_DIFFUSE) ? 1 : 0);
2182 myCStructure->ContextFillArea.Front.IsSpecular = (aFront.ReflectionMode (Graphic3d_TOR_SPECULAR) ? 1 : 0);
2183 myCStructure->ContextFillArea.Front.IsEmission = (aFront.ReflectionMode (Graphic3d_TOR_EMISSION) ? 1 : 0);
2186 myCStructure->ContextFillArea.Front.IsPhysic = (aFront.MaterialType (Graphic3d_MATERIAL_PHYSIC) ? 1 : 0);
2189 myCStructure->ContextFillArea.Front.ColorSpec.r = float (aFront.SpecularColor().Red());
2190 myCStructure->ContextFillArea.Front.ColorSpec.g = float (aFront.SpecularColor().Green());
2191 myCStructure->ContextFillArea.Front.ColorSpec.b = float (aFront.SpecularColor().Blue());
2194 myCStructure->ContextFillArea.Front.ColorAmb.r = float (aFront.AmbientColor().Red());
2195 myCStructure->ContextFillArea.Front.ColorAmb.g = float (aFront.AmbientColor().Green());
2196 myCStructure->ContextFillArea.Front.ColorAmb.b = float (aFront.AmbientColor().Blue());
2199 myCStructure->ContextFillArea.Front.ColorDif.r = float (aFront.DiffuseColor().Red());
2200 myCStructure->ContextFillArea.Front.ColorDif.g = float (aFront.DiffuseColor().Green());
2201 myCStructure->ContextFillArea.Front.ColorDif.b = float (aFront.DiffuseColor().Blue());
2204 myCStructure->ContextFillArea.Front.ColorEms.r = float (aFront.EmissiveColor().Red());
2205 myCStructure->ContextFillArea.Front.ColorEms.g = float (aFront.EmissiveColor().Green());
2206 myCStructure->ContextFillArea.Front.ColorEms.b = float (aFront.EmissiveColor().Blue());
2208 myCStructure->ContextFillArea.Front.EnvReflexion = float (aFront.EnvReflexion());
2210 myCStructure->ContextFillArea.Texture.TextureMap = theAspFill->TextureMap();
2211 myCStructure->ContextFillArea.Texture.doTextureMap = theAspFill->TextureMapState() ? 1 : 0;
2212 myCStructure->ContextFillArea.ShaderProgram = theAspFill->ShaderProgram();
2214 Standard_Integer aPolyMode;
2215 Standard_ShortReal aPolyFactor, aPolyUnits;
2216 theAspFill->PolygonOffsets (aPolyMode, aPolyFactor, aPolyUnits);
2217 myCStructure->ContextFillArea.PolygonOffsetMode = aPolyMode;
2218 myCStructure->ContextFillArea.PolygonOffsetFactor = aPolyFactor;
2219 myCStructure->ContextFillArea.PolygonOffsetUnits = aPolyUnits;
2222 //=============================================================================
2223 //function : GraphicHighlight
2225 //=============================================================================
2226 void Graphic3d_Structure::GraphicHighlight (const Aspect_TypeOfHighlightMethod theMethod)
2228 Standard_Real anRGB[3];
2229 myCStructure->highlight = 1;
2230 myHighlightMethod = theMethod;
2233 case Aspect_TOHM_COLOR:
2235 myHighlightColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
2236 myCStructure->HighlightWithColor (Graphic3d_Vec3 (float (anRGB[0]), float (anRGB[1]), float (anRGB[2])), Standard_True);
2239 case Aspect_TOHM_BOUNDBOX:
2241 myHighlightColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
2242 myCStructure->HighlightColor.r = float (anRGB[0]);
2243 myCStructure->HighlightColor.g = float (anRGB[1]);
2244 myCStructure->HighlightColor.b = float (anRGB[2]);
2245 myCStructure->HighlightWithBndBox (this, Standard_True);
2251 //=============================================================================
2252 //function : GraphicTransform
2254 //=============================================================================
2255 void Graphic3d_Structure::GraphicTransform (const TColStd_Array2OfReal& theMatrix)
2257 for (Standard_Integer i = 0; i <= 3; ++i)
2259 for (Standard_Integer j = 0; j <= 3; ++j)
2261 myCStructure->Transformation[i][j] = float (theMatrix (i, j));
2264 myCStructure->UpdateTransformation();
2267 //=============================================================================
2268 //function : GraphicUnHighlight
2270 //=============================================================================
2271 void Graphic3d_Structure::GraphicUnHighlight()
2273 myCStructure->highlight = 0;
2274 switch (myHighlightMethod)
2276 case Aspect_TOHM_COLOR:
2277 myCStructure->HighlightWithColor (Graphic3d_Vec3 (0.0f, 0.0f, 0.0f), Standard_False);
2279 case Aspect_TOHM_BOUNDBOX:
2280 myCStructure->HighlightWithBndBox (this, Standard_False);
2285 //=============================================================================
2286 //function : ComputeVisual
2288 //=============================================================================
2289 Graphic3d_TypeOfStructure Graphic3d_Structure::ComputeVisual() const
2291 return myComputeVisual;
2294 //=============================================================================
2295 //function : SetComputeVisual
2297 //=============================================================================
2298 void Graphic3d_Structure::SetComputeVisual (const Graphic3d_TypeOfStructure theVisual)
2300 // The ComputeVisual is saved only if the structure is declared TOS_ALL, TOS_WIREFRAME or TOS_SHADING.
2301 // This declaration permits to calculate proper representation of the structure calculated by Compute instead of passage to TOS_COMPUTED.
2302 if (theVisual != Graphic3d_TOS_COMPUTED)
2304 myComputeVisual = theVisual;
2308 //=============================================================================
2309 //function : SetHLRValidation
2311 //=============================================================================
2312 void Graphic3d_Structure::SetHLRValidation (const Standard_Boolean theFlag)
2314 myCStructure->HLRValidation = theFlag ? 1 : 0;
2317 //=============================================================================
2318 //function : HLRValidation
2320 //=============================================================================
2321 Standard_Boolean Graphic3d_Structure::HLRValidation() const
2323 // Hidden parts stored in <me> are valid if :
2324 // 1/ the owner is defined.
2325 // 2/ they are not invalid.
2326 return myOwner != NULL
2327 && myCStructure->HLRValidation != 0;
2330 //=======================================================================
2331 //function : SetZLayer
2333 //=======================================================================
2334 void Graphic3d_Structure::SetZLayer (const Graphic3d_ZLayerId theLayerId)
2336 // if the structure is not displayed, unable to change its display layer
2340 myStructureManager->ChangeZLayer (this, theLayerId);
2341 myCStructure->SetZLayer (theLayerId);
2344 //=======================================================================
2345 //function : GetZLayer
2347 //=======================================================================
2348 Graphic3d_ZLayerId Graphic3d_Structure::GetZLayer() const
2350 return myCStructure->ZLayer();
2353 //=======================================================================
2354 //function : SetClipPlanes
2356 //=======================================================================
2357 void Graphic3d_Structure::SetClipPlanes (const Graphic3d_SequenceOfHClipPlane& thePlanes)
2359 myCStructure->SetClipPlanes (thePlanes);
2362 //=======================================================================
2363 //function : GetClipPlanes
2365 //=======================================================================
2366 const Graphic3d_SequenceOfHClipPlane& Graphic3d_Structure::GetClipPlanes() const
2368 return myCStructure->ClipPlanes();
2371 //=======================================================================
2372 //function : SetMutable
2374 //=======================================================================
2375 void Graphic3d_Structure::SetMutable (const Standard_Boolean theIsMutable)
2377 myCStructure->IsMutable = theIsMutable;
2380 //=======================================================================
2381 //function : IsMutable
2383 //=======================================================================
2384 Standard_Boolean Graphic3d_Structure::IsMutable() const
2386 return myCStructure->IsMutable;