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.
16 #include <Graphic3d_Structure.ixx>
17 #include <Graphic3d_Structure.pxx>
19 #include <Graphic3d_GraphicDriver.hxx>
20 #include <Graphic3d_MaterialAspect.hxx>
22 #include <Graphic3d_MapOfStructure.hxx>
23 #include <Graphic3d_MapIteratorOfMapOfStructure.hxx>
25 #include <Quantity_Color.hxx>
26 #include <TColStd_Array2OfReal.hxx>
27 #include <Graphic3d_TextureMap.hxx>
29 #include <Aspect_PolygonOffsetMode.hxx>
33 //=============================================================================
34 //function : Graphic3d_Structure
36 //=============================================================================
37 Graphic3d_Structure::Graphic3d_Structure (const Handle(Graphic3d_StructureManager)& theManager)
38 : myStructureManager (theManager.operator->()),
39 myFirstStructureManager (theManager.operator->()),
40 myComputeVisual (Graphic3d_TOS_ALL),
41 myHighlightColor (Quantity_NOC_WHITE),
42 myHighlightMethod (Aspect_TOHM_COLOR),
44 myVisual (Graphic3d_TOS_ALL)
46 myCStructure = theManager->GraphicDriver()->Structure (theManager);
49 Handle(Graphic3d_AspectLine3d) aAspectLine3d = new Graphic3d_AspectLine3d();
50 Handle(Graphic3d_AspectText3d) aAspectText3d = new Graphic3d_AspectText3d();
51 Handle(Graphic3d_AspectMarker3d) aAspectMarker3d = new Graphic3d_AspectMarker3d();
52 Handle(Graphic3d_AspectFillArea3d) aAspectFillArea3d = new Graphic3d_AspectFillArea3d();
53 theManager->PrimitivesAspect (aAspectLine3d, aAspectText3d, aAspectMarker3d, aAspectFillArea3d);
54 aAspectFillArea3d->SetPolygonOffsets (Aspect_POM_Fill, 1.0, 0.0);
56 // update the associated CStructure
57 UpdateStructure (aAspectLine3d, aAspectText3d, aAspectMarker3d, aAspectFillArea3d);
60 //=============================================================================
63 //=============================================================================
64 void Graphic3d_Structure::Destroy()
66 // as myFirstStructureManager can be already destroyed,
67 // avoid attempts to access it
68 myFirstStructureManager = NULL;
72 //=============================================================================
75 //=============================================================================
76 void Graphic3d_Structure::Clear (const Standard_Boolean theWithDestruction)
78 if (IsDeleted()) return;
80 myCStructure->ContainsFacet = 0;
82 // clean groups in graphics driver at first
83 GraphicClear (theWithDestruction);
85 // only then remove group references
86 if (theWithDestruction)
89 myStructureManager->Clear (this, theWithDestruction);
94 //=============================================================================
97 //=============================================================================
98 void Graphic3d_Structure::Remove()
100 if (IsDeleted()) return;
102 // clean groups in graphics driver at first; this is also should be done
103 // to avoid unwanted group cleaning in group's destructor
104 // Pass Standard_False to Clear(..) method to avoid updating in
105 // structure manager, it isn't necessary, besides of it structure manager
106 // could be already destroyed and invalid pointers used in structure;
107 Standard_Integer Length = myGroups.Length();
108 for (Standard_Integer aGrId = 1; aGrId <= Length; ++aGrId)
109 myGroups.ChangeValue (aGrId)->Clear (Standard_False);
111 // Standard_Address APtr = (void *) This ().operator->();
112 Standard_Address APtr = (void *) this;
113 // It is necessary to remove the eventual pointer on the structure
114 // that can be destroyed, in the list of descendants
115 // of ancesters of this structure and in the list of ancesters
116 // of descendants of the same structure.
118 Length = myDescendants.Length();
119 for (Standard_Integer i = 1; i <= Length; ++i)
121 ((Graphic3d_Structure *)(myDescendants.Value (i)))->Remove (APtr, Graphic3d_TOC_ANCESTOR);
124 Length = myAncestors.Length();
125 for (Standard_Integer i = 1; i <= Length; ++i)
127 ((Graphic3d_Structure *)(myAncestors.Value (i)))->Remove (APtr, Graphic3d_TOC_DESCENDANT);
130 myCStructure->ContainsFacet = 0;
132 // Destruction of me in the graphic library
133 const Standard_Integer aStructId = myCStructure->Id;
134 myCStructure->GraphicDriver()->RemoveStructure (myCStructure);
135 myCStructure.Nullify();
137 // Liberation of the identification if the destroyed structure
138 // in the first manager that performs creation of the structure.
139 if (myFirstStructureManager != NULL)
141 myFirstStructureManager->Remove (aStructId);
145 //=============================================================================
148 //=============================================================================
149 void Graphic3d_Structure::Display()
151 if (IsDeleted()) return;
153 if (!myCStructure->stick)
155 myCStructure->stick = 1;
156 myStructureManager->Display (this);
159 myCStructure->visible = 1;
162 //=============================================================================
165 //=============================================================================
166 void Graphic3d_Structure::Display (const Standard_Integer thePriority)
168 if (IsDeleted()) return;
170 SetDisplayPriority (thePriority);
172 if (!myCStructure->stick)
174 myCStructure->stick = 1;
175 myStructureManager->Display (this);
178 myCStructure->visible = 1;
181 //=============================================================================
182 //function : SetDisplayPriority
184 //=============================================================================
185 void Graphic3d_Structure::SetDisplayPriority (const Standard_Integer thePriority)
188 || thePriority == myCStructure->Priority)
193 myCStructure->PreviousPriority = myCStructure->Priority;
194 myCStructure->Priority = thePriority;
196 if (myCStructure->Priority != myCStructure->PreviousPriority)
198 Graphic3d_PriorityDefinitionError_Raise_if ((myCStructure->Priority > Structure_MAX_PRIORITY)
199 || (myCStructure->Priority < Structure_MIN_PRIORITY),
200 "Bad value for StructurePriority");
201 if (myCStructure->stick)
203 myStructureManager->ChangeDisplayPriority (this, myCStructure->PreviousPriority, myCStructure->Priority);
208 //=============================================================================
209 //function : ResetDisplayPriority
211 //=============================================================================
212 void Graphic3d_Structure::ResetDisplayPriority()
215 || myCStructure->Priority == myCStructure->PreviousPriority)
220 const Standard_Integer aPriority = myCStructure->Priority;
221 myCStructure->Priority = myCStructure->PreviousPriority;
222 if (myCStructure->stick)
224 myStructureManager->ChangeDisplayPriority (this, aPriority, myCStructure->Priority);
228 //=============================================================================
229 //function : DisplayPriority
231 //=============================================================================
232 Standard_Integer Graphic3d_Structure::DisplayPriority() const
234 return myCStructure->Priority;
237 //=============================================================================
240 //=============================================================================
241 void Graphic3d_Structure::Erase()
248 if (myCStructure->stick)
250 myCStructure->stick = 0;
251 myStructureManager->Erase (this);
255 //=============================================================================
256 //function : Highlight
258 //=============================================================================
259 void Graphic3d_Structure::Highlight (const Aspect_TypeOfHighlightMethod theMethod)
266 // Highlight on already Highlighted structure.
267 if (myCStructure->highlight)
269 Aspect_TypeOfUpdate anUpdateMode = myStructureManager->UpdateMode();
270 if (anUpdateMode == Aspect_TOU_WAIT)
276 // To avoid call of method : Update()
277 // Not useful and can be costly.
278 myStructureManager->SetUpdateMode (Aspect_TOU_WAIT);
280 myStructureManager->SetUpdateMode (anUpdateMode);
284 SetDisplayPriority (Structure_MAX_PRIORITY - 1);
286 GraphicHighlight (theMethod);
287 myStructureManager->Highlight (this, theMethod);
292 //=============================================================================
293 //function : SetHighlightColor
295 //=============================================================================
296 void Graphic3d_Structure::SetHighlightColor (const Quantity_Color& theColor)
303 if (!myCStructure->highlight)
305 myHighlightColor = theColor;
309 // Change highlight color on already Highlighted structure.
310 Aspect_TypeOfUpdate anUpdateMode = myStructureManager->UpdateMode();
311 if (anUpdateMode == Aspect_TOU_WAIT)
317 // To avoid call of method : Update()
318 // Not useful and can be costly.
319 myStructureManager->SetUpdateMode (Aspect_TOU_WAIT);
321 myStructureManager->SetUpdateMode (anUpdateMode);
323 myHighlightColor = theColor;
324 Highlight (myHighlightMethod);
327 //=============================================================================
328 //function : SetVisible
330 //=============================================================================
331 void Graphic3d_Structure::SetVisible (const Standard_Boolean theValue)
333 if (IsDeleted()) return;
335 myCStructure->visible = theValue ? 1 : 0;
336 myCStructure->UpdateNamedStatus();
340 //=============================================================================
343 //=============================================================================
344 void Graphic3d_Structure::SetPick (const Standard_Boolean theValue)
346 if (IsDeleted ()) return;
348 myCStructure->pick = theValue ? 1 : 0;
349 myCStructure->UpdateNamedStatus();
353 myStructureManager->Detectable (this);
357 myStructureManager->Undetectable (this);
362 //=============================================================================
363 //function : UnHighlight
365 //=============================================================================
366 void Graphic3d_Structure::UnHighlight()
368 if (IsDeleted()) return;
370 if (myCStructure->highlight)
372 myCStructure->highlight = 0;
374 GraphicUnHighlight();
375 myStructureManager->UnHighlight (this);
377 ResetDisplayPriority();
382 //=============================================================================
383 //function : HighlightColor
385 //=============================================================================
386 const Quantity_Color& Graphic3d_Structure::HighlightColor() const
388 return myHighlightColor;
391 //=============================================================================
392 //function : IsDisplayed
394 //=============================================================================
395 Standard_Boolean Graphic3d_Structure::IsDisplayed() const
397 return myCStructure->stick ? Standard_True : Standard_False;
400 //=============================================================================
401 //function : IsDeleted
403 //=============================================================================
404 Standard_Boolean Graphic3d_Structure::IsDeleted() const
406 return myCStructure.IsNull();
409 //=============================================================================
410 //function : IsHighlighted
412 //=============================================================================
413 Standard_Boolean Graphic3d_Structure::IsHighlighted() const
415 return myCStructure->highlight ? Standard_True : Standard_False;
418 //=============================================================================
419 //function : IsSelectable
421 //=============================================================================
422 Standard_Boolean Graphic3d_Structure::IsSelectable() const
424 return myCStructure->pick ? Standard_True : Standard_False;
427 //=============================================================================
428 //function : IsVisible
430 //=============================================================================
431 Standard_Boolean Graphic3d_Structure::IsVisible() const
433 return myCStructure->visible ? Standard_True : Standard_False;
436 //=============================================================================
437 //function : IsRotated
439 //=============================================================================
440 Standard_Boolean Graphic3d_Structure::IsRotated() const
442 // A somewhat light test !
443 return myCStructure->Transformation[0][1] != 0.0
444 || myCStructure->Transformation[0][2] != 0.0
445 || myCStructure->Transformation[1][0] != 0.0
446 || myCStructure->Transformation[1][2] != 0.0
447 || myCStructure->Transformation[2][0] != 0.0
448 || myCStructure->Transformation[2][1] != 0.0;
451 //=============================================================================
452 //function : IsTransformed
454 //=============================================================================
455 Standard_Boolean Graphic3d_Structure::IsTransformed() const
457 Standard_Boolean aResult = Standard_False;
458 for (Standard_Integer i = 0; i <= 3 && !aResult; ++i)
460 for (Standard_Integer j = 0; j <= 3 && !aResult; ++j)
463 aResult = myCStructure->Transformation[i][j] != 1.0;
465 aResult = myCStructure->Transformation[i][j] != 0.0;
471 //=============================================================================
472 //function : ContainsFacet
474 //=============================================================================
475 Standard_Boolean Graphic3d_Structure::ContainsFacet() const
479 return Standard_False;
481 else if (myCStructure->ContainsFacet > 0)
483 // if one of groups contains at least one facet, the structure contains it too
484 return Standard_True;
487 // stop at the first descendant containing at least one facet
488 const Standard_Integer aNbDesc = myDescendants.Length();
489 for (Standard_Integer aStructIter = 1; aStructIter <= aNbDesc; ++aStructIter)
491 if (((Graphic3d_Structure *)(myDescendants.Value (aStructIter)))->ContainsFacet())
493 return Standard_True;
496 return Standard_False;
499 //=============================================================================
502 //=============================================================================
503 Standard_Boolean Graphic3d_Structure::IsEmpty() const
507 return Standard_True;
510 // structure is empty:
511 // - if all these groups are empty
512 // - or if all groups are empty and all their descendants are empty
513 // - or if all its descendants are empty
514 const Standard_Integer aNbGroups = myGroups.Length();
515 for (Standard_Integer aGrpIter = 1; aGrpIter <= aNbGroups; ++aGrpIter)
517 if (!myGroups.Value (aGrpIter)->IsEmpty())
519 return Standard_False;
523 // stop at the first non-empty descendant
524 const Standard_Integer aNbDesc = myDescendants.Length();
525 for (Standard_Integer aDescIter = 1; aDescIter <= aNbDesc; ++aDescIter)
527 if (!((Graphic3d_Structure* )(myDescendants.Value (aDescIter)))->IsEmpty())
529 return Standard_False;
532 return Standard_True;
535 //=============================================================================
536 //function : PrimitivesAspect
538 //=============================================================================
539 void Graphic3d_Structure::PrimitivesAspect (Handle(Graphic3d_AspectLine3d)& theAspLine,
540 Handle(Graphic3d_AspectText3d)& theAspText,
541 Handle(Graphic3d_AspectMarker3d)& theAspMarker,
542 Handle(Graphic3d_AspectFillArea3d)& theAspFill) const
544 theAspLine = Line3dAspect();
545 theAspText = Text3dAspect();
546 theAspMarker = Marker3dAspect();
547 theAspFill = FillArea3dAspect();
550 //=============================================================================
551 //function : GroupsWithFacet
553 //=============================================================================
554 void Graphic3d_Structure::GroupsWithFacet (const Standard_Integer theDelta)
556 myCStructure->ContainsFacet = myCStructure->ContainsFacet + theDelta;
557 if (myCStructure->ContainsFacet < 0)
559 myCStructure->ContainsFacet = 0;
563 //=============================================================================
566 //=============================================================================
567 void Graphic3d_Structure::Compute()
569 // Implemented by Presentation
572 //=============================================================================
575 //=============================================================================
576 Handle(Graphic3d_Structure) Graphic3d_Structure::Compute (const Handle(Graphic3d_DataStructureManager)& )
578 // Implemented by Presentation
582 //=============================================================================
585 //=============================================================================
586 Handle(Graphic3d_Structure) Graphic3d_Structure::Compute (const Handle(Graphic3d_DataStructureManager)& ,
587 const TColStd_Array2OfReal& )
589 // Implemented by Presentation
593 //=============================================================================
596 //=============================================================================
597 void Graphic3d_Structure::Compute (const Handle(Graphic3d_DataStructureManager)& ,
598 Handle(Graphic3d_Structure)& )
600 // Implemented by Presentation
603 //=============================================================================
606 //=============================================================================
607 void Graphic3d_Structure::Compute (const Handle(Graphic3d_DataStructureManager)& ,
608 const TColStd_Array2OfReal& ,
609 Handle(Graphic3d_Structure)& )
611 // Implemented by Presentation
614 //=============================================================================
615 //function : ReCompute
617 //=============================================================================
618 void Graphic3d_Structure::ReCompute()
620 myStructureManager->ReCompute (this);
623 //=============================================================================
624 //function : ReCompute
626 //=============================================================================
627 void Graphic3d_Structure::ReCompute (const Handle(Graphic3d_DataStructureManager)& theProjector)
629 myStructureManager->ReCompute (this, theProjector);
632 //=============================================================================
633 //function : SetInfiniteState
635 //=============================================================================
636 void Graphic3d_Structure::SetInfiniteState (const Standard_Boolean theToSet)
638 myCStructure->IsInfinite = theToSet ? 1 : 0;
641 //=============================================================================
642 //function : IsInfinite
644 //=============================================================================
645 Standard_Boolean Graphic3d_Structure::IsInfinite() const
648 || myCStructure->IsInfinite;
651 //=============================================================================
652 //function : GraphicClear
654 //=============================================================================
655 void Graphic3d_Structure::GraphicClear (const Standard_Boolean theWithDestruction)
657 // clean and empty each group
658 const Standard_Integer aLength = myGroups.Length();
659 for (Standard_Integer aGrId = 1; aGrId <= aLength; ++aGrId)
661 myGroups.ChangeValue (aGrId)->Clear();
664 if (theWithDestruction)
666 while (!myGroups.IsEmpty())
668 Handle(Graphic3d_Group) aGroup = myGroups.First();
672 myCStructure->Clear();
676 //=============================================================================
677 //function : GraphicConnect
679 //=============================================================================
680 void Graphic3d_Structure::GraphicConnect (const Handle(Graphic3d_Structure)& theDaughter)
682 myCStructure->Connect (*theDaughter->myCStructure);
685 //=============================================================================
686 //function : GraphicDisconnect
688 //=============================================================================
689 void Graphic3d_Structure::GraphicDisconnect (const Handle(Graphic3d_Structure)& theDaughter)
691 myCStructure->Disconnect (*theDaughter->myCStructure);
694 //=============================================================================
695 //function : Line3dAspect
697 //=============================================================================
698 Handle(Graphic3d_AspectLine3d) Graphic3d_Structure::Line3dAspect() const
700 const Standard_Real anRGB[3] =
702 Standard_Real (myCStructure->ContextLine.Color.r),
703 Standard_Real (myCStructure->ContextLine.Color.g),
704 Standard_Real (myCStructure->ContextLine.Color.b)
706 Quantity_Color aColor;
707 aColor.SetValues (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
708 Aspect_TypeOfLine aLType = Aspect_TypeOfLine (myCStructure->ContextLine.LineType);
709 Standard_Real aWidth = Standard_Real (myCStructure->ContextLine.Width);
711 Handle(Graphic3d_AspectLine3d) anAspLine = new Graphic3d_AspectLine3d (aColor, aLType, aWidth);
712 anAspLine->SetShaderProgram (myCStructure->ContextLine.ShaderProgram);
716 //=============================================================================
717 //function : Text3dAspect
719 //=============================================================================
720 Handle(Graphic3d_AspectText3d) Graphic3d_Structure::Text3dAspect() const
722 const Standard_Real anRGB[3] =
724 Standard_Real (myCStructure->ContextText.Color.r),
725 Standard_Real (myCStructure->ContextText.Color.g),
726 Standard_Real (myCStructure->ContextText.Color.b)
728 Quantity_Color aColor;
729 aColor.SetValues (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
730 Standard_CString aFont = Standard_CString (myCStructure->ContextText.Font);
731 Standard_Real anExpansion = Standard_Real (myCStructure->ContextText.Expan);
732 Standard_Real aSpace = Standard_Real (myCStructure->ContextText.Space);
733 Aspect_TypeOfStyleText aStyle = Aspect_TypeOfStyleText (myCStructure->ContextText.Style);
734 Aspect_TypeOfDisplayText aDispType = Aspect_TypeOfDisplayText (myCStructure->ContextText.DisplayType);
736 Handle(Graphic3d_AspectText3d) anAspText = new Graphic3d_AspectText3d (aColor, aFont, anExpansion, aSpace, aStyle, aDispType);
737 anAspText->SetShaderProgram (myCStructure->ContextText.ShaderProgram);
741 //=============================================================================
742 //function : Marker3dAspect
744 //=============================================================================
745 Handle(Graphic3d_AspectMarker3d) Graphic3d_Structure::Marker3dAspect() const
747 const Standard_Real anRGB[3] =
749 Standard_Real (myCStructure->ContextMarker.Color.r),
750 Standard_Real (myCStructure->ContextMarker.Color.g),
751 Standard_Real (myCStructure->ContextMarker.Color.b)
753 Quantity_Color aColor;
754 aColor.SetValues (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
755 Aspect_TypeOfMarker aMType = myCStructure->ContextMarker.MarkerType;
756 Standard_Real aScale = Standard_Real (myCStructure->ContextMarker.Scale);
758 Handle(Graphic3d_AspectMarker3d) anAspMarker = new Graphic3d_AspectMarker3d (aMType, aColor, aScale);
759 anAspMarker->SetShaderProgram (myCStructure->ContextMarker.ShaderProgram);
763 //=============================================================================
764 //function : FillArea3dAspect
766 //=============================================================================
767 Handle(Graphic3d_AspectFillArea3d) Graphic3d_Structure::FillArea3dAspect() const
770 Graphic3d_MaterialAspect aBack;
771 aBack.SetShininess (Standard_Real (myCStructure->ContextFillArea.Back.Shininess));
772 aBack.SetAmbient (Standard_Real (myCStructure->ContextFillArea.Back.Ambient));
773 aBack.SetDiffuse (Standard_Real (myCStructure->ContextFillArea.Back.Diffuse));
774 aBack.SetSpecular (Standard_Real (myCStructure->ContextFillArea.Back.Specular));
775 aBack.SetTransparency (Standard_Real (myCStructure->ContextFillArea.Back.Transparency));
776 aBack.SetEmissive (Standard_Real (myCStructure->ContextFillArea.Back.Emission));
777 if (myCStructure->ContextFillArea.Back.IsAmbient == 1)
778 aBack.SetReflectionModeOn (Graphic3d_TOR_AMBIENT);
780 aBack.SetReflectionModeOff (Graphic3d_TOR_AMBIENT);
781 if (myCStructure->ContextFillArea.Back.IsDiffuse == 1)
782 aBack.SetReflectionModeOn (Graphic3d_TOR_DIFFUSE);
784 aBack.SetReflectionModeOff (Graphic3d_TOR_DIFFUSE);
785 if (myCStructure->ContextFillArea.Back.IsSpecular == 1)
786 aBack.SetReflectionModeOn (Graphic3d_TOR_SPECULAR);
788 aBack.SetReflectionModeOff (Graphic3d_TOR_SPECULAR);
789 if (myCStructure->ContextFillArea.Back.IsEmission == 1)
790 aBack.SetReflectionModeOn (Graphic3d_TOR_EMISSION);
792 aBack.SetReflectionModeOff (Graphic3d_TOR_EMISSION);
794 Quantity_Color aColor (Standard_Real (myCStructure->ContextFillArea.Back.ColorSpec.r),
795 Standard_Real (myCStructure->ContextFillArea.Back.ColorSpec.g),
796 Standard_Real (myCStructure->ContextFillArea.Back.ColorSpec.b), Quantity_TOC_RGB);
797 aBack.SetSpecularColor (aColor);
799 aColor.SetValues (Standard_Real (myCStructure->ContextFillArea.Back.ColorAmb.r),
800 Standard_Real (myCStructure->ContextFillArea.Back.ColorAmb.g),
801 Standard_Real (myCStructure->ContextFillArea.Back.ColorAmb.b), Quantity_TOC_RGB);
802 aBack.SetAmbientColor (aColor);
804 aColor.SetValues (Standard_Real (myCStructure->ContextFillArea.Back.ColorDif.r),
805 Standard_Real (myCStructure->ContextFillArea.Back.ColorDif.g),
806 Standard_Real (myCStructure->ContextFillArea.Back.ColorDif.b), Quantity_TOC_RGB);
807 aBack.SetDiffuseColor (aColor);
809 aColor.SetValues (Standard_Real (myCStructure->ContextFillArea.Back.ColorEms.r),
810 Standard_Real (myCStructure->ContextFillArea.Back.ColorEms.g),
811 Standard_Real (myCStructure->ContextFillArea.Back.ColorEms.b), Quantity_TOC_RGB);
812 aBack.SetEmissiveColor (aColor);
814 aBack.SetEnvReflexion (myCStructure->ContextFillArea.Back.EnvReflexion);
815 aBack.SetMaterialType (myCStructure->ContextFillArea.Back.IsPhysic ? Graphic3d_MATERIAL_PHYSIC : Graphic3d_MATERIAL_ASPECT);
818 Graphic3d_MaterialAspect aFront;
819 aFront.SetShininess (Standard_Real (myCStructure->ContextFillArea.Front.Shininess));
820 aFront.SetAmbient (Standard_Real (myCStructure->ContextFillArea.Front.Ambient));
821 aFront.SetDiffuse (Standard_Real (myCStructure->ContextFillArea.Front.Diffuse));
822 aFront.SetSpecular (Standard_Real (myCStructure->ContextFillArea.Front.Specular));
823 aFront.SetTransparency (Standard_Real (myCStructure->ContextFillArea.Front.Transparency));
824 aFront.SetEmissive (Standard_Real (myCStructure->ContextFillArea.Front.Emission));
825 if (myCStructure->ContextFillArea.Front.IsAmbient == 1)
826 aFront.SetReflectionModeOn (Graphic3d_TOR_AMBIENT);
828 aFront.SetReflectionModeOff (Graphic3d_TOR_AMBIENT);
829 if (myCStructure->ContextFillArea.Front.IsDiffuse == 1)
830 aFront.SetReflectionModeOn (Graphic3d_TOR_DIFFUSE);
832 aFront.SetReflectionModeOff (Graphic3d_TOR_DIFFUSE);
833 if (myCStructure->ContextFillArea.Front.IsSpecular == 1)
834 aFront.SetReflectionModeOn (Graphic3d_TOR_SPECULAR);
836 aFront.SetReflectionModeOff (Graphic3d_TOR_SPECULAR);
837 if (myCStructure->ContextFillArea.Front.Emission == 1)
838 aFront.SetReflectionModeOn (Graphic3d_TOR_EMISSION);
840 aFront.SetReflectionModeOff (Graphic3d_TOR_EMISSION);
842 aColor.SetValues (Standard_Real (myCStructure->ContextFillArea.Front.ColorSpec.r),
843 Standard_Real (myCStructure->ContextFillArea.Front.ColorSpec.g),
844 Standard_Real (myCStructure->ContextFillArea.Front.ColorSpec.b), Quantity_TOC_RGB);
845 aFront.SetSpecularColor (aColor);
847 aColor.SetValues (Standard_Real (myCStructure->ContextFillArea.Front.ColorAmb.r),
848 Standard_Real (myCStructure->ContextFillArea.Front.ColorAmb.g),
849 Standard_Real (myCStructure->ContextFillArea.Front.ColorAmb.b), Quantity_TOC_RGB);
850 aFront.SetAmbientColor (aColor);
852 aColor.SetValues (Standard_Real (myCStructure->ContextFillArea.Front.ColorDif.r),
853 Standard_Real (myCStructure->ContextFillArea.Front.ColorDif.g),
854 Standard_Real (myCStructure->ContextFillArea.Front.ColorDif.b), Quantity_TOC_RGB);
855 aFront.SetDiffuseColor (aColor);
857 aColor.SetValues (Standard_Real (myCStructure->ContextFillArea.Front.ColorEms.r),
858 Standard_Real (myCStructure->ContextFillArea.Front.ColorEms.g),
859 Standard_Real (myCStructure->ContextFillArea.Front.ColorEms.b), Quantity_TOC_RGB);
860 aFront.SetEmissiveColor (aColor);
862 aFront.SetEnvReflexion (myCStructure->ContextFillArea.Front.EnvReflexion);
863 aFront.SetMaterialType (myCStructure->ContextFillArea.Front.IsPhysic ? Graphic3d_MATERIAL_PHYSIC : Graphic3d_MATERIAL_ASPECT);
865 Quantity_Color anIntColor (Standard_Real (myCStructure->ContextFillArea.IntColor.r),
866 Standard_Real (myCStructure->ContextFillArea.IntColor.g),
867 Standard_Real (myCStructure->ContextFillArea.IntColor.b), Quantity_TOC_RGB);
868 Quantity_Color anEdgeColor (Standard_Real (myCStructure->ContextFillArea.EdgeColor.r),
869 Standard_Real (myCStructure->ContextFillArea.EdgeColor.g),
870 Standard_Real (myCStructure->ContextFillArea.EdgeColor.b), Quantity_TOC_RGB);
871 Handle(Graphic3d_AspectFillArea3d) anAspFill = new Graphic3d_AspectFillArea3d (Aspect_InteriorStyle (myCStructure->ContextFillArea.Style),
872 anIntColor, anEdgeColor,
873 Aspect_TypeOfLine (myCStructure->ContextFillArea.LineType),
874 Standard_Real (myCStructure->ContextFillArea.Width),
878 if (myCStructure->ContextFillArea.Edge == 1)
879 anAspFill->SetEdgeOn();
881 anAspFill->SetEdgeOff();
883 anAspFill->SetHatchStyle (Aspect_HatchStyle (myCStructure->ContextFillArea.Hatch));
885 // Front and Back face
886 if (myCStructure->ContextFillArea.Distinguish == 1)
887 anAspFill->SetDistinguishOn();
889 anAspFill->SetDistinguishOff();
890 if (myCStructure->ContextFillArea.BackFace == 1)
891 anAspFill->SuppressBackFace();
893 anAspFill->AllowBackFace();
895 anAspFill->SetTextureMap (myCStructure->ContextFillArea.Texture.TextureMap);
896 if (myCStructure->ContextFillArea.Texture.doTextureMap == 1)
898 anAspFill->SetTextureMapOn();
902 anAspFill->SetTextureMapOff();
904 anAspFill->SetShaderProgram (myCStructure->ContextFillArea.ShaderProgram);
905 anAspFill->SetPolygonOffsets (myCStructure->ContextFillArea.PolygonOffsetMode,
906 myCStructure->ContextFillArea.PolygonOffsetFactor,
907 myCStructure->ContextFillArea.PolygonOffsetUnits);
911 //=============================================================================
914 //=============================================================================
915 const Graphic3d_SequenceOfGroup& Graphic3d_Structure::Groups() const
920 //=============================================================================
921 //function : NumberOfGroups
923 //=============================================================================
924 Standard_Integer Graphic3d_Structure::NumberOfGroups() const
926 return myGroups.Length();
929 //=============================================================================
930 //function : SetPrimitivesAspect
932 //=============================================================================
933 void Graphic3d_Structure::SetPrimitivesAspect (const Handle(Graphic3d_AspectLine3d)& theAspLine)
935 if (IsDeleted()) return;
937 Standard_Real aWidth;
938 Quantity_Color aColor;
939 Aspect_TypeOfLine aLType;
940 theAspLine->Values (aColor, aLType, aWidth);
942 myCStructure->ContextLine.Color.r = float (aColor.Red());
943 myCStructure->ContextLine.Color.g = float (aColor.Green());
944 myCStructure->ContextLine.Color.b = float (aColor.Blue());
945 myCStructure->ContextLine.LineType = int (aLType);
946 myCStructure->ContextLine.Width = float (aWidth);
947 myCStructure->ContextLine.ShaderProgram = theAspLine->ShaderProgram();
948 myCStructure->ContextLine.IsDef = 1;
950 myCStructure->UpdateAspects();
952 // Attributes are "IsSet" during the first update of context (line, marker...)
953 myCStructure->ContextLine.IsSet = 1;
954 myCStructure->ContextFillArea.IsSet = 1;
955 myCStructure->ContextMarker.IsSet = 1;
956 myCStructure->ContextText.IsSet = 1;
961 //=============================================================================
962 //function : SetPrimitivesAspect
964 //=============================================================================
965 void Graphic3d_Structure::SetPrimitivesAspect (const Handle(Graphic3d_AspectFillArea3d)& theAspFill)
967 if (IsDeleted()) return;
969 Standard_Real anRGB[3];
970 Standard_Real aWidth;
971 Quantity_Color anIntColor;
972 Quantity_Color aBackIntColor;
973 Quantity_Color anEdgeColor;
974 Aspect_TypeOfLine aLType;
975 Aspect_InteriorStyle aStyle;
976 theAspFill->Values (aStyle, anIntColor, aBackIntColor, anEdgeColor, aLType, aWidth);
978 anIntColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
979 myCStructure->ContextFillArea.Style = aStyle;
980 myCStructure->ContextFillArea.IntColor.r = float (anRGB[0]);
981 myCStructure->ContextFillArea.IntColor.g = float (anRGB[1]);
982 myCStructure->ContextFillArea.IntColor.b = float (anRGB[2]);
984 if (theAspFill->Distinguish())
986 aBackIntColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
988 myCStructure->ContextFillArea.BackIntColor.r = float(anRGB[0]);
989 myCStructure->ContextFillArea.BackIntColor.g = float(anRGB[1]);
990 myCStructure->ContextFillArea.BackIntColor.b = float(anRGB[2]);
993 myCStructure->ContextFillArea.Edge = theAspFill->Edge () ? 1 : 0;
994 myCStructure->ContextFillArea.EdgeColor.r = float (anEdgeColor.Red());
995 myCStructure->ContextFillArea.EdgeColor.g = float (anEdgeColor.Green());
996 myCStructure->ContextFillArea.EdgeColor.b = float (anEdgeColor.Blue());
997 myCStructure->ContextFillArea.LineType = aLType;
998 myCStructure->ContextFillArea.Width = float (aWidth);
999 myCStructure->ContextFillArea.Hatch = theAspFill->HatchStyle();
1001 // Front and Back face
1002 myCStructure->ContextFillArea.Distinguish = theAspFill->Distinguish() ? 1 : 0;
1003 myCStructure->ContextFillArea.BackFace = theAspFill->BackFace() ? 1 : 0;
1006 const Graphic3d_MaterialAspect& aBack = theAspFill->BackMaterial();
1007 // Light specificity
1008 myCStructure->ContextFillArea.Back.Shininess = float (aBack.Shininess());
1009 myCStructure->ContextFillArea.Back.Ambient = float (aBack.Ambient());
1010 myCStructure->ContextFillArea.Back.Diffuse = float (aBack.Diffuse());
1011 myCStructure->ContextFillArea.Back.Specular = float (aBack.Specular());
1012 myCStructure->ContextFillArea.Back.Transparency = float (aBack.Transparency());
1013 myCStructure->ContextFillArea.Back.Emission = float (aBack.Emissive());
1016 myCStructure->ContextFillArea.Back.IsAmbient = (aBack.ReflectionMode (Graphic3d_TOR_AMBIENT) ? 1 : 0);
1017 myCStructure->ContextFillArea.Back.IsDiffuse = (aBack.ReflectionMode (Graphic3d_TOR_DIFFUSE) ? 1 : 0);
1018 myCStructure->ContextFillArea.Back.IsSpecular = (aBack.ReflectionMode (Graphic3d_TOR_SPECULAR) ? 1 : 0);
1019 myCStructure->ContextFillArea.Back.IsEmission = (aBack.ReflectionMode (Graphic3d_TOR_EMISSION) ? 1 : 0);
1023 myCStructure->ContextFillArea.Back.IsPhysic = (aBack.MaterialType (Graphic3d_MATERIAL_PHYSIC) ? 1 : 0 );
1026 myCStructure->ContextFillArea.Back.ColorSpec.r = float (aBack.SpecularColor().Red());
1027 myCStructure->ContextFillArea.Back.ColorSpec.g = float (aBack.SpecularColor().Green());
1028 myCStructure->ContextFillArea.Back.ColorSpec.b = float (aBack.SpecularColor().Blue());
1031 myCStructure->ContextFillArea.Back.ColorAmb.r = float (aBack.AmbientColor().Red());
1032 myCStructure->ContextFillArea.Back.ColorAmb.g = float (aBack.AmbientColor().Green());
1033 myCStructure->ContextFillArea.Back.ColorAmb.b = float (aBack.AmbientColor().Blue());
1036 myCStructure->ContextFillArea.Back.ColorDif.r = float (aBack.DiffuseColor().Red());
1037 myCStructure->ContextFillArea.Back.ColorDif.g = float (aBack.DiffuseColor().Green());
1038 myCStructure->ContextFillArea.Back.ColorDif.b = float (aBack.DiffuseColor().Blue());
1041 myCStructure->ContextFillArea.Back.ColorEms.r = float (aBack.EmissiveColor().Red());
1042 myCStructure->ContextFillArea.Back.ColorEms.g = float (aBack.EmissiveColor().Green());
1043 myCStructure->ContextFillArea.Back.ColorEms.b = float (aBack.EmissiveColor().Blue());
1045 myCStructure->ContextFillArea.Back.EnvReflexion =
1046 float ((theAspFill->BackMaterial ()).EnvReflexion());
1049 const Graphic3d_MaterialAspect& aFront = theAspFill->FrontMaterial();
1050 // Light specificity
1051 myCStructure->ContextFillArea.Front.Shininess = float (aFront.Shininess());
1052 myCStructure->ContextFillArea.Front.Ambient = float (aFront.Ambient());
1053 myCStructure->ContextFillArea.Front.Diffuse = float (aFront.Diffuse());
1054 myCStructure->ContextFillArea.Front.Specular = float (aFront.Specular());
1055 myCStructure->ContextFillArea.Front.Transparency = float (aFront.Transparency());
1056 myCStructure->ContextFillArea.Front.Emission = float (aFront.Emissive());
1059 myCStructure->ContextFillArea.Front.IsAmbient = (aFront.ReflectionMode (Graphic3d_TOR_AMBIENT) ? 1 : 0);
1060 myCStructure->ContextFillArea.Front.IsDiffuse = (aFront.ReflectionMode (Graphic3d_TOR_DIFFUSE) ? 1 : 0);
1061 myCStructure->ContextFillArea.Front.IsSpecular = (aFront.ReflectionMode (Graphic3d_TOR_SPECULAR) ? 1 : 0);
1062 myCStructure->ContextFillArea.Front.IsEmission = (aFront.ReflectionMode (Graphic3d_TOR_EMISSION) ? 1 : 0);
1066 myCStructure->ContextFillArea.Front.IsPhysic = (aFront.MaterialType (Graphic3d_MATERIAL_PHYSIC) ? 1 : 0);
1069 myCStructure->ContextFillArea.Front.ColorSpec.r = float (aFront.SpecularColor().Red());
1070 myCStructure->ContextFillArea.Front.ColorSpec.g = float (aFront.SpecularColor().Green());
1071 myCStructure->ContextFillArea.Front.ColorSpec.b = float (aFront.SpecularColor().Blue());
1074 myCStructure->ContextFillArea.Front.ColorAmb.r = float (aFront.AmbientColor().Red());
1075 myCStructure->ContextFillArea.Front.ColorAmb.g = float (aFront.AmbientColor().Green());
1076 myCStructure->ContextFillArea.Front.ColorAmb.b = float (aFront.AmbientColor().Blue());
1079 myCStructure->ContextFillArea.Front.ColorDif.r = float (aFront.DiffuseColor().Red());
1080 myCStructure->ContextFillArea.Front.ColorDif.g = float (aFront.DiffuseColor().Green());
1081 myCStructure->ContextFillArea.Front.ColorDif.b = float (aFront.DiffuseColor().Blue());
1084 myCStructure->ContextFillArea.Front.ColorEms.r = float (aFront.EmissiveColor().Red());
1085 myCStructure->ContextFillArea.Front.ColorEms.g = float (aFront.EmissiveColor().Green());
1086 myCStructure->ContextFillArea.Front.ColorEms.b = float (aFront.EmissiveColor().Blue());
1088 myCStructure->ContextFillArea.Front.EnvReflexion = float (aFront.EnvReflexion());
1090 myCStructure->ContextFillArea.IsDef = 1; // Definition material ok
1092 myCStructure->ContextFillArea.Texture.TextureMap = theAspFill->TextureMap();
1093 myCStructure->ContextFillArea.Texture.doTextureMap = theAspFill->TextureMapState() ? 1 : 0;
1094 myCStructure->ContextFillArea.ShaderProgram = theAspFill->ShaderProgram();
1096 Standard_Integer aPolyMode;
1097 Standard_ShortReal aPolyFactor, aPolyUnits;
1098 theAspFill->PolygonOffsets (aPolyMode, aPolyFactor, aPolyUnits);
1099 myCStructure->ContextFillArea.PolygonOffsetMode = aPolyMode;
1100 myCStructure->ContextFillArea.PolygonOffsetFactor = aPolyFactor;
1101 myCStructure->ContextFillArea.PolygonOffsetUnits = aPolyUnits;
1103 myCStructure->UpdateAspects();
1105 // Attributes are "IsSet" during the first update of context (line, marker...)
1106 myCStructure->ContextLine.IsSet = 1;
1107 myCStructure->ContextFillArea.IsSet = 1;
1108 myCStructure->ContextMarker.IsSet = 1;
1109 myCStructure->ContextText.IsSet = 1;
1114 //=============================================================================
1115 //function : SetPrimitivesAspect
1117 //=============================================================================
1118 void Graphic3d_Structure::SetPrimitivesAspect (const Handle(Graphic3d_AspectText3d)& theAspText)
1120 if (IsDeleted()) return;
1122 Standard_CString aFont;
1123 Standard_Real aSpace, anExpansion, aTextAngle;
1124 Quantity_Color aColor, aColorSub;
1125 Aspect_TypeOfStyleText aStyle;
1126 Aspect_TypeOfDisplayText aDispType;
1127 Standard_Boolean isTextZoomable;
1128 Font_FontAspect aTextFontAspect;
1129 theAspText->Values (aColor, aFont, anExpansion, aSpace, aStyle, aDispType, aColorSub, isTextZoomable, aTextAngle, aTextFontAspect);
1131 myCStructure->ContextText.Color.r = float (aColor.Red());
1132 myCStructure->ContextText.Color.g = float (aColor.Green());
1133 myCStructure->ContextText.Color.b = float (aColor.Blue());
1134 myCStructure->ContextText.Font = aFont;
1135 myCStructure->ContextText.Expan = float (anExpansion);
1136 myCStructure->ContextText.Space = float (aSpace);
1137 myCStructure->ContextText.Style = aStyle;
1138 myCStructure->ContextText.DisplayType = aDispType;
1139 myCStructure->ContextText.ColorSubTitle.r = float (aColorSub.Red());
1140 myCStructure->ContextText.ColorSubTitle.g = float (aColorSub.Green());
1141 myCStructure->ContextText.ColorSubTitle.b = float (aColorSub.Blue());
1142 myCStructure->ContextText.TextZoomable = isTextZoomable;
1143 myCStructure->ContextText.TextAngle = float (aTextAngle);
1144 myCStructure->ContextText.TextFontAspect = aTextFontAspect;
1145 myCStructure->ContextText.ShaderProgram = theAspText->ShaderProgram();
1147 myCStructure->ContextText.IsDef = 1;
1149 myCStructure->UpdateAspects();
1151 // Attributes are "IsSet" during the first update of a context (line, marker...)
1152 myCStructure->ContextLine.IsSet = 1;
1153 myCStructure->ContextFillArea.IsSet = 1;
1154 myCStructure->ContextMarker.IsSet = 1;
1155 myCStructure->ContextText.IsSet = 1;
1160 //=============================================================================
1161 //function : SetPrimitivesAspect
1163 //=============================================================================
1164 void Graphic3d_Structure::SetPrimitivesAspect (const Handle(Graphic3d_AspectMarker3d)& theAspMarker)
1166 if (IsDeleted()) return;
1168 Standard_Real aScale;
1169 Quantity_Color aColor;
1170 Aspect_TypeOfMarker aMType;
1171 theAspMarker->Values (aColor, aMType, aScale);
1173 myCStructure->ContextMarker.Color.r = float (aColor.Red());
1174 myCStructure->ContextMarker.Color.g = float (aColor.Green());
1175 myCStructure->ContextMarker.Color.b = float (aColor.Blue());
1176 myCStructure->ContextMarker.MarkerType = aMType;
1177 myCStructure->ContextMarker.Scale = float (aScale);
1178 myCStructure->ContextMarker.ShaderProgram = theAspMarker->ShaderProgram();
1179 myCStructure->ContextMarker.IsDef = 1;
1181 myCStructure->UpdateAspects();
1183 // Attributes are "IsSet" during the first update of a context (line, marker...)
1184 myCStructure->ContextLine.IsSet = 1;
1185 myCStructure->ContextFillArea.IsSet = 1;
1186 myCStructure->ContextMarker.IsSet = 1;
1187 myCStructure->ContextText.IsSet = 1;
1192 //=============================================================================
1193 //function : SetVisual
1195 //=============================================================================
1196 void Graphic3d_Structure::SetVisual (const Graphic3d_TypeOfStructure theVisual)
1199 || myVisual == theVisual)
1204 if (!myCStructure->stick)
1206 myVisual = theVisual;
1207 SetComputeVisual (theVisual);
1211 Aspect_TypeOfUpdate anUpdateMode = myStructureManager->UpdateMode();
1212 if (anUpdateMode == Aspect_TOU_WAIT)
1215 myVisual = theVisual;
1216 SetComputeVisual (theVisual);
1220 // To avoid calling method : Update ()
1221 // Not useful and can be costly.
1222 myStructureManager->SetUpdateMode (Aspect_TOU_WAIT);
1224 myVisual = theVisual;
1225 SetComputeVisual (theVisual);
1226 myStructureManager->SetUpdateMode (anUpdateMode);
1232 //=============================================================================
1233 //function : SetZoomLimit
1235 //=============================================================================
1236 void Graphic3d_Structure::SetZoomLimit (const Standard_Real theLimitInf,
1237 const Standard_Real theLimitSup)
1241 Graphic3d_StructureDefinitionError_Raise_if (theLimitInf <= 0.0,
1242 "Bad value for ZoomLimit inf");
1243 Graphic3d_StructureDefinitionError_Raise_if (theLimitSup <= 0.0,
1244 "Bad value for ZoomLimit sup");
1245 Graphic3d_StructureDefinitionError_Raise_if (theLimitSup < theLimitInf,
1246 "ZoomLimit sup < ZoomLimit inf");
1249 //=============================================================================
1252 //=============================================================================
1253 Graphic3d_TypeOfStructure Graphic3d_Structure::Visual() const
1258 //=============================================================================
1259 //function : AcceptConnection
1261 //=============================================================================
1262 Standard_Boolean Graphic3d_Structure::AcceptConnection (const Handle(Graphic3d_Structure)& theStructure1,
1263 const Handle(Graphic3d_Structure)& theStructure2,
1264 const Graphic3d_TypeOfConnection theType)
1267 Graphic3d_MapOfStructure aSet;
1268 Graphic3d_Structure::Network (theStructure2, theType, aSet);
1269 return !aSet.Contains (theStructure1);
1272 //=============================================================================
1273 //function : Ancestors
1275 //=============================================================================
1276 void Graphic3d_Structure::Ancestors (Graphic3d_MapOfStructure& theSet) const
1278 const Standard_Integer aNbAnces = myAncestors.Length ();
1279 for (Standard_Integer anIter = 1; anIter <= aNbAnces; ++anIter)
1281 theSet.Add ((Graphic3d_Structure* )(myAncestors.Value (anIter)));
1285 //=============================================================================
1286 //function : SetOwner
1288 //=============================================================================
1289 void Graphic3d_Structure::SetOwner (const Standard_Address theOwner)
1294 //=============================================================================
1297 //=============================================================================
1298 Standard_Address Graphic3d_Structure::Owner() const
1303 //=============================================================================
1304 //function : Descendants
1306 //=============================================================================
1307 void Graphic3d_Structure::Descendants (Graphic3d_MapOfStructure& theSet) const
1309 const Standard_Integer aNbDesc = myDescendants.Length ();
1310 for (Standard_Integer anIter = 1; anIter <= aNbDesc; ++anIter)
1312 theSet.Add ((Graphic3d_Structure* )(myDescendants.Value (anIter)));
1316 //=============================================================================
1317 //function : Connect
1319 //=============================================================================
1320 void Graphic3d_Structure::Connect (const Handle(Graphic3d_Structure)& theStructure,
1321 const Graphic3d_TypeOfConnection theType,
1322 const Standard_Boolean theWithCheck)
1324 if (IsDeleted()) return;
1328 && !Graphic3d_Structure::AcceptConnection (this, theStructure, theType))
1335 case Graphic3d_TOC_DESCENDANT:
1337 const Standard_Integer aNbDesc = myDescendants.Length();
1338 for (Standard_Integer anIter = 1; anIter <= aNbDesc; ++anIter)
1340 if (myDescendants.Value (anIter) == theStructure.operator->())
1346 myDescendants.Append (theStructure.operator->());
1347 theStructure->Connect (this, Graphic3d_TOC_ANCESTOR);
1349 GraphicConnect (theStructure);
1350 myStructureManager->Connect (this, theStructure);
1355 case Graphic3d_TOC_ANCESTOR:
1357 const Standard_Integer aNbAnces = myAncestors.Length();
1358 for (Standard_Integer anIter = 1; anIter <= aNbAnces; ++anIter)
1360 if (myAncestors.Value (anIter) == theStructure.operator->())
1366 myAncestors.Append (theStructure.operator->());
1367 theStructure->Connect (this, Graphic3d_TOC_DESCENDANT);
1369 // myGraphicDriver->Connect is called in case if connection between parent and child
1375 //=============================================================================
1376 //function : Disconnect
1378 //=============================================================================
1379 void Graphic3d_Structure::Disconnect (const Handle(Graphic3d_Structure)& theStructure)
1381 if (IsDeleted()) return;
1383 const Standard_Integer aNbDesc = myDescendants.Length();
1384 for (Standard_Integer anIter = 1; anIter <= aNbDesc; ++anIter)
1386 if (myDescendants.Value (anIter) == theStructure.operator->())
1388 myDescendants.Remove (anIter);
1389 theStructure->Disconnect (this);
1391 GraphicDisconnect (theStructure);
1392 myStructureManager->Disconnect (this, theStructure);
1399 const Standard_Integer aNbAnces = myAncestors.Length();
1400 for (Standard_Integer anIter = 1; anIter <= aNbAnces; ++anIter)
1402 if (myAncestors.Value (anIter) == theStructure.operator->())
1404 myAncestors.Remove (anIter);
1405 theStructure->Disconnect (this);
1406 // no call of myGraphicDriver->Disconnect in case of an ancestor
1412 //=============================================================================
1413 //function : DisconnectAll
1415 //=============================================================================
1416 void Graphic3d_Structure::DisconnectAll (const Graphic3d_TypeOfConnection theType)
1418 if (IsDeleted()) return;
1422 case Graphic3d_TOC_DESCENDANT:
1424 const Standard_Integer aLength = myDescendants.Length();
1425 for (Standard_Integer anIter = 1; anIter <= aLength; ++anIter)
1427 // Value (1) instead of Value (i) as myDescendants
1429 // Graphic3d_Structure::Disconnect (AStructure)
1430 // that takes AStructure from myDescendants
1431 ((Graphic3d_Structure* )(myDescendants.Value (1)))->Disconnect (this);
1435 case Graphic3d_TOC_ANCESTOR:
1437 const Standard_Integer aLength = myAncestors.Length();
1438 for (Standard_Integer anIter = 1; anIter <= aLength; ++anIter)
1440 // Value (1) instead of Value (i) as myAncestors
1442 // Graphic3d_Structure::Disconnect (AStructure)
1443 // that takes AStructure from myAncestors
1444 ((Graphic3d_Structure* )(myAncestors.Value (1)))->Disconnect (this);
1451 //=============================================================================
1452 //function : Composition
1454 //=============================================================================
1455 Graphic3d_TypeOfComposition Graphic3d_Structure::Composition() const
1457 return myCStructure->Composition;
1460 //=============================================================================
1461 //function : SetTransform
1463 //=============================================================================
1464 void Graphic3d_Structure::SetTransform (const TColStd_Array2OfReal& theMatrix,
1465 const Graphic3d_TypeOfComposition theType)
1467 if (IsDeleted()) return;
1469 Standard_Real valuetrsf;
1470 Standard_Real valueoldtrsf;
1471 Standard_Real valuenewtrsf;
1472 TColStd_Array2OfReal aNewTrsf (0, 3, 0, 3);
1473 TColStd_Array2OfReal aMatrix44 (0, 3, 0, 3);
1475 // Assign the new transformation in an array [0..3][0..3]
1476 // Avoid problemes if the user has defined matrice [1..4][1..4]
1477 // or [3..6][-1..2] !!
1478 Standard_Integer lr = theMatrix.LowerRow();
1479 Standard_Integer ur = theMatrix.UpperRow();
1480 Standard_Integer lc = theMatrix.LowerCol();
1481 Standard_Integer uc = theMatrix.UpperCol();
1483 if ((ur - lr + 1 != 4) || (uc - lc + 1 != 4))
1485 Graphic3d_TransformError::Raise ("Transform : not a 4x4 matrix");
1490 case Graphic3d_TOC_REPLACE:
1492 myCStructure->Composition = Graphic3d_TOC_REPLACE;
1493 // Update of CStructure
1494 for (Standard_Integer i = 0; i <= 3; ++i)
1496 for (Standard_Integer j = 0; j <= 3; ++j)
1498 myCStructure->Transformation[i][j] = float (theMatrix (lr + i, lc + j));
1499 aNewTrsf (i, j) = theMatrix (lr + i, lc + j);
1504 case Graphic3d_TOC_POSTCONCATENATE:
1506 myCStructure->Composition = Graphic3d_TOC_POSTCONCATENATE;
1507 // To simplify management of indices
1508 for (Standard_Integer i = 0; i <= 3; ++i)
1510 for (Standard_Integer j = 0; j <= 3; ++j)
1512 aMatrix44 (i, j) = theMatrix (lr + i, lc + j);
1516 // Calculation of the product of matrices
1517 for (Standard_Integer i = 0; i <= 3; ++i)
1519 for (Standard_Integer j = 0; j <= 3; ++j)
1521 aNewTrsf (i, j) = 0.0;
1522 for (Standard_Integer k = 0; k <= 3; ++k)
1524 valueoldtrsf = myCStructure->Transformation[i][k];
1525 valuetrsf = aMatrix44 (k, j);
1526 valuenewtrsf = aNewTrsf (i, j) + valueoldtrsf * valuetrsf;
1527 aNewTrsf (i, j) = valuenewtrsf;
1532 // Update of CStructure
1533 for (Standard_Integer i = 0; i <= 3; ++i)
1535 for (Standard_Integer j = 0; j <= 3; ++j)
1537 myCStructure->Transformation[i][j] = float (aNewTrsf (i, j));
1544 // If transformation, no validation of hidden already calculated parts
1550 GraphicTransform (aNewTrsf);
1551 myStructureManager->SetTransform (this, aNewTrsf);
1556 //=============================================================================
1557 //function : Transform
1559 //=============================================================================
1560 void Graphic3d_Structure::Transform (TColStd_Array2OfReal& theMatrix) const
1563 Standard_Integer lr = theMatrix.LowerRow ();
1564 Standard_Integer ur = theMatrix.UpperRow ();
1565 Standard_Integer lc = theMatrix.LowerCol ();
1566 Standard_Integer uc = theMatrix.UpperCol ();
1568 if ((ur - lr + 1 != 4) || (uc - lc + 1 != 4))
1569 Graphic3d_TransformError::Raise ("Transform : not a 4x4 matrix");
1571 for (Standard_Integer i = 0; i <= 3; ++i)
1573 for (Standard_Integer j = 0; j <= 3; ++j)
1575 theMatrix (lr + i, lc + j) = myCStructure->Transformation[i][j];
1580 //=============================================================================
1581 //function : MinMaxValues
1583 //=============================================================================
1584 void Graphic3d_Structure::MinMaxValues (Standard_Real& theXMin,
1585 Standard_Real& theYMin,
1586 Standard_Real& theZMin,
1587 Standard_Real& theXMax,
1588 Standard_Real& theYMax,
1589 Standard_Real& theZMax,
1590 const Standard_Boolean theToIgnoreInfiniteFlag) const
1597 Standard_Real aXMin, aYMin, aZMin, aXMax, aYMax, aZMax;
1598 MinMaxCoord (aXMin, aYMin, aZMin, aXMax, aYMax, aZMax);
1600 // Infinite boundaries corresponding to empty structure or
1601 // non-empty structure, without any primitives specified
1602 if (aXMin == RealFirst() && aYMin == RealFirst() && aZMin == RealFirst() &&
1603 aXMax == RealLast() && aYMax == RealLast() && aZMax == RealLast())
1605 theXMin = RealFirst();
1606 theYMin = RealFirst();
1607 theZMin = RealFirst();
1608 theXMax = RealLast();
1609 theYMax = RealLast();
1610 theZMax = RealLast();
1614 // Handle flag, which specifies that structure should be considered as infinite
1615 if (IsInfinite() && !theToIgnoreInfiniteFlag)
1617 Graphic3d_Vertex aVertexMin (aXMin, aYMin, aZMin);
1618 Graphic3d_Vertex aVertexMax (aXMax, aYMax, aZMax);
1619 const Standard_Real aDistance = aVertexMin.Distance (aVertexMax);
1621 // Special case for infinite line:
1622 // Bounding borders of infinite line has been
1623 // calculated as own point in center of this line
1624 if (aDistance >= 500000.0)
1626 theXMin = theXMax = 0.5 * (aXMin + aXMax);
1627 theYMin = theYMax = 0.5 * (aYMin + aYMax);
1628 theZMin = theZMax = 0.5 * (aZMin + aZMax);
1632 theXMin = RealFirst();
1633 theYMin = RealFirst();
1634 theZMin = RealFirst();
1635 theXMax = RealLast();
1636 theYMax = RealLast();
1637 theZMax = RealLast();
1641 // Min-Max values of the descendant structures
1642 Standard_Real aDescXMin = RealLast();
1643 Standard_Real aDescYMin = RealLast();
1644 Standard_Real aDescZMin = RealLast();
1645 Standard_Real aDescXMax = RealFirst();
1646 Standard_Real aDescYMax = RealFirst();
1647 Standard_Real aDescZMax = RealFirst();
1648 for (Standard_Integer aStructIt = 1; aStructIt <= myDescendants.Length(); aStructIt++)
1650 Graphic3d_Structure* aStructure = (Graphic3d_Structure*) myDescendants.Value (aStructIt);
1651 aStructure->MinMaxValues (aXMin, aYMin, aZMin, aXMax, aYMax, aZMax);
1652 aDescXMin = Min (aXMin, aDescXMin);
1653 aDescYMin = Min (aYMin, aDescYMin);
1654 aDescZMin = Min (aZMin, aDescZMin);
1655 aDescXMax = Max (aXMax, aDescXMax);
1656 aDescYMax = Max (aYMax, aDescYMax);
1657 aDescZMax = Max (aZMax, aDescZMax);
1660 if (aDescXMin != RealLast() || aDescYMin != RealLast() ||
1661 aDescZMin != RealLast() || aDescXMax != RealFirst() ||
1662 aDescYMax != RealFirst() || aDescZMax != RealFirst())
1664 aXMin = Min (aDescXMin, aXMin);
1665 aYMin = Min (aDescYMin, aYMin);
1666 aZMin = Min (aDescZMin, aZMin);
1667 aXMax = Max (aDescXMax, aXMax);
1668 aYMax = Max (aDescYMax, aYMax);
1669 aZMax = Max (aDescZMax, aZMax);
1672 // Case impossible as it would mean that the structure is empty or infinite
1673 if (aXMin == RealFirst() && aYMin == RealFirst() && aZMin == RealFirst() &&
1674 aXMax == RealLast() && aYMax == RealLast() && aZMax == RealLast())
1676 theXMin = RealFirst();
1677 theYMin = RealFirst();
1678 theZMin = RealFirst();
1679 theXMax = RealLast();
1680 theYMax = RealLast();
1681 theZMax = RealLast();
1685 TColStd_Array2OfReal aTrsf(0, 3, 0, 3);
1687 TransformBoundaries (aTrsf, aXMin, aYMin, aZMin, aXMax, aYMax, aZMax);
1696 //=============================================================================
1697 //function : Identification
1699 //=============================================================================
1700 Standard_Integer Graphic3d_Structure::Identification() const
1702 return myCStructure->Id;
1705 //=============================================================================
1706 //function : SetTransformPersistence
1708 //=============================================================================
1709 void Graphic3d_Structure::SetTransformPersistence (const Graphic3d_TransModeFlags& theFlag)
1711 SetTransformPersistence (theFlag, gp_Pnt (0.0, 0.0, 0.0));
1714 //=============================================================================
1715 //function : SetTransformPersistence
1717 //=============================================================================
1718 void Graphic3d_Structure::SetTransformPersistence (const Graphic3d_TransModeFlags& theFlag,
1719 const gp_Pnt& thePoint)
1721 if (IsDeleted()) return;
1723 myCStructure->TransformPersistence.Flag = theFlag;
1724 myCStructure->TransformPersistence.Point.x = float (thePoint.X());
1725 myCStructure->TransformPersistence.Point.y = float (thePoint.Y());
1726 myCStructure->TransformPersistence.Point.z = float (thePoint.Z());
1727 myCStructure->UpdateAspects();
1729 myCStructure->TransformPersistence.IsSet = 1;
1732 //=============================================================================
1733 //function : TransformPersistenceMode
1735 //=============================================================================
1736 Graphic3d_TransModeFlags Graphic3d_Structure::TransformPersistenceMode() const
1738 return myCStructure->TransformPersistence.Flag;
1741 //=============================================================================
1742 //function : TransformPersistencePoint
1744 //=============================================================================
1745 gp_Pnt Graphic3d_Structure::TransformPersistencePoint() const
1747 gp_Pnt aPnt (0.0, 0.0, 0.0);
1748 aPnt.SetX (myCStructure->TransformPersistence.Point.x);
1749 aPnt.SetY (myCStructure->TransformPersistence.Point.y);
1750 aPnt.SetZ (myCStructure->TransformPersistence.Point.z);
1754 //=============================================================================
1757 //=============================================================================
1758 void Graphic3d_Structure::Add (const Handle(Graphic3d_Group)& theGroup)
1760 // Method called only by the constructor of Graphic3d_Group
1761 // It is easy to check presence of <theGroup> in sequence myGroups.
1762 myGroups.Append (theGroup);
1765 //=============================================================================
1768 //=============================================================================
1769 void Graphic3d_Structure::Remove (const Standard_Address thePtr,
1770 const Graphic3d_TypeOfConnection theType)
1774 case Graphic3d_TOC_DESCENDANT:
1776 const Standard_Integer aNbDesc = myDescendants.Length();
1777 for (Standard_Integer anIter = 1; anIter <= aNbDesc; ++anIter)
1779 if (myDescendants.Value (anIter) == thePtr)
1781 myDescendants.Remove (anIter);
1787 case Graphic3d_TOC_ANCESTOR:
1789 const Standard_Integer aNbAncestors = myAncestors.Length();
1790 for (Standard_Integer anIter = 1; anIter <= aNbAncestors; ++anIter)
1792 if (myAncestors.Value (anIter) == thePtr)
1794 myAncestors.Remove (anIter);
1803 //=============================================================================
1806 //=============================================================================
1807 void Graphic3d_Structure::Remove (const Handle(Graphic3d_Group)& theGroup)
1809 const Standard_Integer aNbGroups = myGroups.Length();
1810 for (Standard_Integer aGrpIter = 1; aGrpIter <= aNbGroups; ++aGrpIter)
1812 if (myGroups.Value (aGrpIter) == theGroup)
1814 myGroups.Remove (aGrpIter);
1820 //=============================================================================
1821 //function : StructureManager
1823 //=============================================================================
1824 Handle(Graphic3d_StructureManager) Graphic3d_Structure::StructureManager() const
1826 return myStructureManager;
1829 //=============================================================================
1830 //function : MinMaxCoord
1832 //=============================================================================
1833 void Graphic3d_Structure::MinMaxCoord (Standard_Real& theXMin,
1834 Standard_Real& theYMin,
1835 Standard_Real& theZMin,
1836 Standard_Real& theXMax,
1837 Standard_Real& theYMax,
1838 Standard_Real& theZMax) const
1842 theXMin = RealFirst();
1843 theYMin = RealFirst();
1844 theZMin = RealFirst();
1845 theXMax = RealLast();
1846 theYMax = RealLast();
1847 theZMax = RealLast();
1851 Standard_Real aXMin = RealLast();
1852 Standard_Real aYMin = RealLast();
1853 Standard_Real aZMin = RealLast();
1854 Standard_Real aXMax = RealFirst();
1855 Standard_Real aYMax = RealFirst();
1856 Standard_Real aZMax = RealFirst();
1857 Standard_Real aGroupXMin, aGroupYMin, aGroupZMin, aGroupXMax, aGroupYMax, aGroupZMax;
1858 for (Standard_Integer aGroupIt = 1; aGroupIt <= myGroups.Length(); aGroupIt++)
1860 const Handle(Graphic3d_Group)& aGroup = myGroups.Value (aGroupIt);
1862 if (aGroup->IsEmpty())
1867 aGroup->MinMaxValues (aGroupXMin, aGroupYMin, aGroupZMin, aGroupXMax, aGroupYMax, aGroupZMax);
1868 aXMin = Min (aXMin, aGroupXMin);
1869 aYMin = Min (aYMin, aGroupYMin);
1870 aZMin = Min (aZMin, aGroupZMin);
1871 aXMax = Max (aXMax, aGroupXMax);
1872 aYMax = Max (aYMax, aGroupYMax);
1873 aZMax = Max (aZMax, aGroupZMax);
1876 // Case impossible as it would mean that the structure is empty
1877 if (aXMin == RealLast() && aYMin == RealLast() && aZMin == RealLast() &&
1878 aXMax == RealFirst() && aYMax == RealFirst() && aZMax == RealFirst())
1880 theXMin = RealFirst();
1881 theYMin = RealFirst();
1882 theZMin = RealFirst();
1883 theXMax = RealLast();
1884 theYMax = RealLast();
1885 theZMax = RealLast();
1896 //=============================================================================
1897 //function : MinMaxCoordWithDescendants
1899 //=============================================================================
1900 void Graphic3d_Structure::MinMaxCoordWithDescendants (Standard_Real& theXMin,
1901 Standard_Real& theYMin,
1902 Standard_Real& theZMin,
1903 Standard_Real& theXMax,
1904 Standard_Real& theYMax,
1905 Standard_Real& theZMax) const
1909 theXMin = RealFirst();
1910 theYMin = RealFirst();
1911 theZMin = RealFirst();
1912 theXMax = RealLast();
1913 theYMax = RealLast();
1914 theZMax = RealLast();
1918 Standard_Real aXMin, aYMin, aZMin, aXMax, aYMax, aZMax;
1919 MinMaxCoord (aXMin, aYMin, aZMin, aXMax, aYMax, aZMax);
1921 // Min-Max of the descendant structures
1922 Standard_Real aDescXMin = RealLast();
1923 Standard_Real aDescYMin = RealLast();
1924 Standard_Real aDescZMin = RealLast();
1925 Standard_Real aDescXMax = RealFirst();
1926 Standard_Real aDescYMax = RealFirst();
1927 Standard_Real aDescZMax = RealFirst();
1928 for (Standard_Integer aStructIt = 1; aStructIt <= myDescendants.Length(); aStructIt++)
1930 Graphic3d_Structure* aStructure = (Graphic3d_Structure*) myDescendants.Value (aStructIt);
1931 if (aStructure->IsEmpty())
1936 aStructure->MinMaxCoordWithDescendants (aXMin, aYMin, aZMin, aXMax, aYMax, aZMax);
1937 aDescXMin = Min (aXMin, aDescXMin);
1938 aDescYMin = Min (aYMin, aDescYMin);
1939 aDescZMin = Min (aZMin, aDescZMin);
1940 aDescXMax = Max (aXMax, aDescXMax);
1941 aDescYMax = Max (aYMax, aDescYMax);
1942 aDescZMax = Max (aZMax, aDescZMax);
1945 if (aDescXMin != RealLast() || aDescYMin != RealLast() ||
1946 aDescZMin != RealLast() || aDescXMax != RealFirst() ||
1947 aDescYMax != RealFirst() || aDescZMax != RealFirst())
1949 TColStd_Array2OfReal aTrsf(0, 3, 0, 3);
1951 TransformBoundaries (aTrsf, aDescXMin, aDescYMin, aDescZMin, aDescXMax, aDescYMax, aDescZMax);
1953 aXMin = Min (aDescXMin, aXMin);
1954 aYMin = Min (aDescYMin, aYMin);
1955 aZMin = Min (aDescZMin, aZMin);
1956 aXMax = Max (aDescXMax, aXMax);
1957 aYMax = Max (aDescYMax, aYMax);
1958 aZMax = Max (aDescZMax, aZMax);
1961 // Case impossible as it would mean that the structure is empty
1962 if (aXMin == RealLast() && aYMin == RealLast() && aZMin == RealLast() &&
1963 aXMax == RealFirst() && aYMax == RealFirst() && aZMax == RealFirst())
1965 theXMin = RealFirst();
1966 theYMin = RealFirst();
1967 theZMin = RealFirst();
1968 theXMax = RealLast();
1969 theYMax = RealLast();
1970 theZMax = RealLast();
1981 //=============================================================================
1982 //function : Transforms
1984 //=============================================================================
1985 void Graphic3d_Structure::Transforms (const TColStd_Array2OfReal& theTrsf,
1986 const Standard_Real theX, const Standard_Real theY, const Standard_Real theZ,
1987 Standard_Real& theNewX, Standard_Real& theNewY, Standard_Real& theNewZ)
1989 const Standard_Real aRL = RealLast();
1990 const Standard_Real aRF = RealFirst();
1991 if ((theX == aRF) || (theY == aRF) || (theZ == aRF)
1992 || (theX == aRL) || (theY == aRL) || (theZ == aRL))
2000 Standard_Real A, B, C, D;
2005 theNewX = A * theX + B * theY + C * theZ + D;
2010 theNewY = A * theX + B * theY + C * theZ + D;
2015 theNewZ = A * theX + B * theY + C * theZ + D;
2019 //=============================================================================
2020 //function : Transforms
2022 //=============================================================================
2023 Graphic3d_Vector Graphic3d_Structure::Transforms (const TColStd_Array2OfReal& theTrsf,
2024 const Graphic3d_Vector& theCoord)
2026 Standard_Real anXYZ[3];
2027 Graphic3d_Structure::Transforms (theTrsf,
2028 theCoord.X(), theCoord.Y(), theCoord.Z(),
2029 anXYZ[0], anXYZ[1], anXYZ[2]);
2030 return Graphic3d_Vector (anXYZ[0], anXYZ[1], anXYZ[2]);
2033 //=============================================================================
2034 //function : Transforms
2036 //=============================================================================
2037 Graphic3d_Vertex Graphic3d_Structure::Transforms (const TColStd_Array2OfReal& theTrsf,
2038 const Graphic3d_Vertex& theCoord)
2040 Standard_Real anXYZ[3];
2041 Graphic3d_Structure::Transforms (theTrsf,
2042 theCoord.X(), theCoord.Y(), theCoord.Z(),
2043 anXYZ[0], anXYZ[1], anXYZ[2]);
2044 return Graphic3d_Vertex (anXYZ[0], anXYZ[1], anXYZ[2]);
2047 //=============================================================================
2048 //function : Transforms
2050 //=============================================================================
2051 void Graphic3d_Structure::TransformBoundaries (const TColStd_Array2OfReal& theTrsf,
2052 Standard_Real& theXMin,
2053 Standard_Real& theYMin,
2054 Standard_Real& theZMin,
2055 Standard_Real& theXMax,
2056 Standard_Real& theYMax,
2057 Standard_Real& theZMax)
2059 Standard_Real aXMin, aYMin, aZMin, aXMax, aYMax, aZMax, anU, aV, aW;
2061 Graphic3d_Structure::Transforms (theTrsf, theXMin, theYMin, theZMin, aXMin, aYMin, aZMin);
2062 Graphic3d_Structure::Transforms (theTrsf, theXMax, theYMax, theZMax, aXMax, aYMax, aZMax);
2064 Graphic3d_Structure::Transforms (theTrsf, theXMin, theYMin, theZMax, anU, aV, aW);
2065 aXMin = Min (anU, aXMin); aXMax = Max (anU, aXMax);
2066 aYMin = Min (aV, aYMin); aYMax = Max (aV, aYMax);
2067 aZMin = Min (aW, aZMin); aZMax = Max (aW, aZMax);
2069 Graphic3d_Structure::Transforms (theTrsf, theXMax, theYMin, theZMax, anU, aV, aW);
2070 aXMin = Min (anU, aXMin); aXMax = Max (anU, aXMax);
2071 aYMin = Min (aV, aYMin); aYMax = Max (aV, aYMax);
2072 aZMin = Min (aW, aZMin); aZMax = Max (aW, aZMax);
2074 Graphic3d_Structure::Transforms (theTrsf, theXMax, theYMin, theZMin, anU, aV, aW);
2075 aXMin = Min (anU, aXMin); aXMax = Max (anU, aXMax);
2076 aYMin = Min (aV, aYMin); aYMax = Max (aV, aYMax);
2077 aZMin = Min (aW, aZMin); aZMax = Max (aW, aZMax);
2079 Graphic3d_Structure::Transforms (theTrsf, theXMax, theYMax, theZMin, anU, aV, aW);
2080 aXMin = Min (anU, aXMin); aXMax = Max (anU, aXMax);
2081 aYMin = Min (aV, aYMin); aYMax = Max (aV, aYMax);
2082 aZMin = Min (aW, aZMin); aZMax = Max (aW, aZMax);
2084 Graphic3d_Structure::Transforms (theTrsf, theXMin, theYMax, theZMax, anU, aV, aW);
2085 aXMin = Min (anU, aXMin); aXMax = Max (anU, aXMax);
2086 aYMin = Min (aV, aYMin); aYMax = Max (aV, aYMax);
2087 aZMin = Min (aW, aZMin); aZMax = Max (aW, aZMax);
2089 Graphic3d_Structure::Transforms (theTrsf, theXMin, theYMax, theZMin, anU, aV, aW);
2090 aXMin = Min (anU, aXMin); aXMax = Max (anU, aXMax);
2091 aYMin = Min (aV, aYMin); aYMax = Max (aV, aYMax);
2092 aZMin = Min (aW, aZMin); aZMax = Max (aW, aZMax);
2102 //=============================================================================
2103 //function : Network
2105 //=============================================================================
2106 void Graphic3d_Structure::Network (const Handle(Graphic3d_Structure)& theStructure,
2107 const Graphic3d_TypeOfConnection theType,
2108 Graphic3d_MapOfStructure& theSet)
2110 Graphic3d_MapOfStructure aSetD, aSetA;
2111 theStructure->Descendants (aSetD);
2112 theStructure->Ancestors (aSetA);
2113 theSet.Add (theStructure);
2116 case Graphic3d_TOC_DESCENDANT:
2117 for (Graphic3d_MapIteratorOfMapOfStructure anIter (aSetD); anIter.More(); anIter.Next())
2119 Graphic3d_Structure::Network (anIter.Key(), theType, theSet);
2122 case Graphic3d_TOC_ANCESTOR:
2123 for (Graphic3d_MapIteratorOfMapOfStructure anIter (aSetA); anIter.More(); anIter.Next())
2125 Graphic3d_Structure::Network (anIter.Key (), theType, theSet);
2131 //=============================================================================
2132 //function : PrintNetwork
2134 //=============================================================================
2135 void Graphic3d_Structure::PrintNetwork (const Handle(Graphic3d_Structure)& theStructure,
2136 const Graphic3d_TypeOfConnection theType)
2138 Graphic3d_MapOfStructure aSet;
2139 Graphic3d_Structure::Network (theStructure, theType, aSet);
2140 for (Graphic3d_MapIteratorOfMapOfStructure anIter (aSet); anIter.More(); anIter.Next())
2142 std::cout << "\tIdent " << (anIter.Key())->Identification () << "\n";
2144 std::cout << std::flush;
2147 //=============================================================================
2150 //=============================================================================
2151 void Graphic3d_Structure::Update() const
2158 if (myStructureManager->UpdateMode() == Aspect_TOU_ASAP)
2160 myStructureManager->Update();
2164 //=============================================================================
2165 //function : UpdateStructure
2167 //=============================================================================
2168 void Graphic3d_Structure::UpdateStructure (const Handle(Graphic3d_AspectLine3d)& theAspLine,
2169 const Handle(Graphic3d_AspectText3d)& theAspText,
2170 const Handle(Graphic3d_AspectMarker3d)& theAspMarker,
2171 const Handle(Graphic3d_AspectFillArea3d)& theAspFill)
2173 Standard_CString aFont;
2174 Standard_Real aSpace, anExpansion, aWidth, aScale;
2175 Quantity_Color aColor, anIntColor, aBackIntColor, anEdgeColor, aColorSub;
2176 Aspect_TypeOfLine aLType;
2177 Aspect_TypeOfMarker aMType;
2178 Aspect_InteriorStyle aStyle;
2179 Aspect_TypeOfStyleText aStyleT;
2180 Aspect_TypeOfDisplayText aDisplayType;
2181 Standard_Boolean aTextZoomable;
2182 Standard_Real aTextAngle;
2183 Font_FontAspect aTextFontAspect;
2185 theAspLine->Values (aColor, aLType, aWidth);
2186 myCStructure->ContextLine.Color.r = float (aColor.Red());
2187 myCStructure->ContextLine.Color.g = float (aColor.Green());
2188 myCStructure->ContextLine.Color.b = float (aColor.Blue());
2189 myCStructure->ContextLine.LineType = aLType;
2190 myCStructure->ContextLine.Width = float (aWidth);
2191 myCStructure->ContextLine.ShaderProgram = theAspLine->ShaderProgram();
2193 theAspMarker->Values (aColor, aMType, aScale);
2194 myCStructure->ContextMarker.Color.r = float (aColor.Red());
2195 myCStructure->ContextMarker.Color.g = float (aColor.Green());
2196 myCStructure->ContextMarker.Color.b = float (aColor.Blue());
2197 myCStructure->ContextMarker.MarkerType = aMType;
2198 myCStructure->ContextMarker.Scale = float (aScale);
2199 myCStructure->ContextMarker.ShaderProgram = theAspMarker->ShaderProgram();
2201 theAspText->Values (aColor, aFont, anExpansion, aSpace, aStyleT, aDisplayType, aColorSub, aTextZoomable, aTextAngle, aTextFontAspect);
2202 myCStructure->ContextText.Color.r = float (aColor.Red());
2203 myCStructure->ContextText.Color.g = float (aColor.Green());
2204 myCStructure->ContextText.Color.b = float (aColor.Blue());
2205 myCStructure->ContextText.Font = aFont;
2206 myCStructure->ContextText.Expan = float (anExpansion);
2207 myCStructure->ContextText.Style = aStyleT;
2208 myCStructure->ContextText.DisplayType = aDisplayType;
2209 myCStructure->ContextText.Space = float (aSpace);
2210 myCStructure->ContextText.ColorSubTitle.r = float (aColorSub.Red());
2211 myCStructure->ContextText.ColorSubTitle.g = float (aColorSub.Green());
2212 myCStructure->ContextText.ColorSubTitle.b = float (aColorSub.Blue());
2213 myCStructure->ContextText.TextZoomable = aTextZoomable;
2214 myCStructure->ContextText.TextAngle = float (aTextAngle);
2215 myCStructure->ContextText.TextFontAspect = aTextFontAspect;
2216 myCStructure->ContextText.ShaderProgram = theAspText->ShaderProgram();
2218 Standard_Real anRGB[3];
2219 theAspFill->Values (aStyle, anIntColor, aBackIntColor, anEdgeColor, aLType, aWidth);
2220 anIntColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
2221 myCStructure->ContextFillArea.Style = aStyle;
2222 myCStructure->ContextFillArea.IntColor.r = float (anRGB[0]);
2223 myCStructure->ContextFillArea.IntColor.g = float (anRGB[1]);
2224 myCStructure->ContextFillArea.IntColor.b = float (anRGB[2]);
2226 if (theAspFill->Distinguish())
2228 aBackIntColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
2230 myCStructure->ContextFillArea.BackIntColor.r = float (anRGB[0]);
2231 myCStructure->ContextFillArea.BackIntColor.g = float (anRGB[1]);
2232 myCStructure->ContextFillArea.BackIntColor.b = float (anRGB[2]);
2235 myCStructure->ContextFillArea.Edge = theAspFill->Edge () ? 1:0;
2236 myCStructure->ContextFillArea.EdgeColor.r = float (anEdgeColor.Red());
2237 myCStructure->ContextFillArea.EdgeColor.g = float (anEdgeColor.Green());
2238 myCStructure->ContextFillArea.EdgeColor.b = float (anEdgeColor.Blue());
2239 myCStructure->ContextFillArea.LineType = aLType;
2240 myCStructure->ContextFillArea.Width = float (aWidth);
2241 myCStructure->ContextFillArea.Hatch = theAspFill->HatchStyle();
2243 // Front and Back face
2244 myCStructure->ContextFillArea.Distinguish = theAspFill->Distinguish() ? 1 : 0;
2245 myCStructure->ContextFillArea.BackFace = theAspFill->BackFace() ? 1 : 0;
2247 const Graphic3d_MaterialAspect& aBack = theAspFill->BackMaterial();
2248 // Light specificity
2249 myCStructure->ContextFillArea.Back.Shininess = float (aBack.Shininess());
2250 myCStructure->ContextFillArea.Back.Ambient = float (aBack.Ambient());
2251 myCStructure->ContextFillArea.Back.Diffuse = float (aBack.Diffuse());
2252 myCStructure->ContextFillArea.Back.Specular = float (aBack.Specular());
2253 myCStructure->ContextFillArea.Back.Transparency = float (aBack.Transparency());
2254 myCStructure->ContextFillArea.Back.Emission = float (aBack.Emissive());
2257 myCStructure->ContextFillArea.Back.IsAmbient = (aBack.ReflectionMode (Graphic3d_TOR_AMBIENT) ? 1 : 0);
2258 myCStructure->ContextFillArea.Back.IsDiffuse = (aBack.ReflectionMode (Graphic3d_TOR_DIFFUSE) ? 1 : 0);
2259 myCStructure->ContextFillArea.Back.IsSpecular = (aBack.ReflectionMode (Graphic3d_TOR_SPECULAR) ? 1 : 0);
2260 myCStructure->ContextFillArea.Back.IsEmission = (aBack.ReflectionMode (Graphic3d_TOR_EMISSION) ? 1 : 0);
2263 myCStructure->ContextFillArea.Back.IsPhysic = (aBack.MaterialType (Graphic3d_MATERIAL_PHYSIC) ? 1 : 0);
2266 myCStructure->ContextFillArea.Back.ColorSpec.r = float (aBack.SpecularColor().Red());
2267 myCStructure->ContextFillArea.Back.ColorSpec.g = float (aBack.SpecularColor().Green());
2268 myCStructure->ContextFillArea.Back.ColorSpec.b = float (aBack.SpecularColor().Blue());
2271 myCStructure->ContextFillArea.Back.ColorAmb.r = float (aBack.AmbientColor().Red());
2272 myCStructure->ContextFillArea.Back.ColorAmb.g = float (aBack.AmbientColor().Green());
2273 myCStructure->ContextFillArea.Back.ColorAmb.b = float (aBack.AmbientColor().Blue());
2276 myCStructure->ContextFillArea.Back.ColorDif.r = float (aBack.DiffuseColor().Red());
2277 myCStructure->ContextFillArea.Back.ColorDif.g = float (aBack.DiffuseColor().Green());
2278 myCStructure->ContextFillArea.Back.ColorDif.b = float (aBack.DiffuseColor().Blue());
2281 myCStructure->ContextFillArea.Back.ColorEms.r = float (aBack.EmissiveColor().Red());
2282 myCStructure->ContextFillArea.Back.ColorEms.g = float (aBack.EmissiveColor().Green());
2283 myCStructure->ContextFillArea.Back.ColorEms.b = float (aBack.EmissiveColor().Blue());
2285 myCStructure->ContextFillArea.Back.EnvReflexion = float (aBack.EnvReflexion());
2288 const Graphic3d_MaterialAspect& aFront = theAspFill->FrontMaterial();
2289 // Light specificity
2290 myCStructure->ContextFillArea.Front.Shininess = float (aFront.Shininess());
2291 myCStructure->ContextFillArea.Front.Ambient = float (aFront.Ambient());
2292 myCStructure->ContextFillArea.Front.Diffuse = float (aFront.Diffuse());
2293 myCStructure->ContextFillArea.Front.Specular = float (aFront.Specular());
2294 myCStructure->ContextFillArea.Front.Transparency = float (aFront.Transparency());
2295 myCStructure->ContextFillArea.Front.Emission = float (aFront.Emissive());
2298 myCStructure->ContextFillArea.Front.IsAmbient = (aFront.ReflectionMode (Graphic3d_TOR_AMBIENT) ? 1 : 0);
2299 myCStructure->ContextFillArea.Front.IsDiffuse = (aFront.ReflectionMode (Graphic3d_TOR_DIFFUSE) ? 1 : 0);
2300 myCStructure->ContextFillArea.Front.IsSpecular = (aFront.ReflectionMode (Graphic3d_TOR_SPECULAR) ? 1 : 0);
2301 myCStructure->ContextFillArea.Front.IsEmission = (aFront.ReflectionMode (Graphic3d_TOR_EMISSION) ? 1 : 0);
2304 myCStructure->ContextFillArea.Front.IsPhysic = (aFront.MaterialType (Graphic3d_MATERIAL_PHYSIC) ? 1 : 0);
2307 myCStructure->ContextFillArea.Front.ColorSpec.r = float (aFront.SpecularColor().Red());
2308 myCStructure->ContextFillArea.Front.ColorSpec.g = float (aFront.SpecularColor().Green());
2309 myCStructure->ContextFillArea.Front.ColorSpec.b = float (aFront.SpecularColor().Blue());
2312 myCStructure->ContextFillArea.Front.ColorAmb.r = float (aFront.AmbientColor().Red());
2313 myCStructure->ContextFillArea.Front.ColorAmb.g = float (aFront.AmbientColor().Green());
2314 myCStructure->ContextFillArea.Front.ColorAmb.b = float (aFront.AmbientColor().Blue());
2317 myCStructure->ContextFillArea.Front.ColorDif.r = float (aFront.DiffuseColor().Red());
2318 myCStructure->ContextFillArea.Front.ColorDif.g = float (aFront.DiffuseColor().Green());
2319 myCStructure->ContextFillArea.Front.ColorDif.b = float (aFront.DiffuseColor().Blue());
2322 myCStructure->ContextFillArea.Front.ColorEms.r = float (aFront.EmissiveColor().Red());
2323 myCStructure->ContextFillArea.Front.ColorEms.g = float (aFront.EmissiveColor().Green());
2324 myCStructure->ContextFillArea.Front.ColorEms.b = float (aFront.EmissiveColor().Blue());
2326 myCStructure->ContextFillArea.Front.EnvReflexion = float (aFront.EnvReflexion());
2328 myCStructure->ContextFillArea.Texture.TextureMap = theAspFill->TextureMap();
2329 myCStructure->ContextFillArea.Texture.doTextureMap = theAspFill->TextureMapState() ? 1 : 0;
2330 myCStructure->ContextFillArea.ShaderProgram = theAspFill->ShaderProgram();
2332 Standard_Integer aPolyMode;
2333 Standard_ShortReal aPolyFactor, aPolyUnits;
2334 theAspFill->PolygonOffsets (aPolyMode, aPolyFactor, aPolyUnits);
2335 myCStructure->ContextFillArea.PolygonOffsetMode = aPolyMode;
2336 myCStructure->ContextFillArea.PolygonOffsetFactor = aPolyFactor;
2337 myCStructure->ContextFillArea.PolygonOffsetUnits = aPolyUnits;
2340 //=============================================================================
2341 //function : GraphicHighlight
2343 //=============================================================================
2344 void Graphic3d_Structure::GraphicHighlight (const Aspect_TypeOfHighlightMethod theMethod)
2346 Standard_Real anRGB[3];
2347 myCStructure->highlight = 1;
2348 myHighlightMethod = theMethod;
2351 case Aspect_TOHM_COLOR:
2353 myHighlightColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
2354 myCStructure->HighlightWithColor (Graphic3d_Vec3 (float (anRGB[0]), float (anRGB[1]), float (anRGB[2])), Standard_True);
2355 myCStructure->UpdateNamedStatus();
2358 case Aspect_TOHM_BOUNDBOX:
2360 Standard_Real XMin, YMin, ZMin, XMax, YMax, ZMax;
2361 if (IsEmpty() || IsInfinite())
2363 // Empty or infinite structure
2364 XMin = YMin = ZMin = 0.0;
2365 XMax = YMax = ZMax = 0.0;
2369 MinMaxCoordWithDescendants (XMin, YMin, ZMin, XMax, YMax, ZMax);
2371 myCStructure->BoundBox.Pmin.x = float (XMin);
2372 myCStructure->BoundBox.Pmin.y = float (YMin);
2373 myCStructure->BoundBox.Pmin.z = float (ZMin);
2374 myCStructure->BoundBox.Pmax.x = float (XMax);
2375 myCStructure->BoundBox.Pmax.y = float (YMax);
2376 myCStructure->BoundBox.Pmax.z = float (ZMax);
2377 myHighlightColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
2378 myCStructure->BoundBox.Color.r = float (anRGB[0]);
2379 myCStructure->BoundBox.Color.g = float (anRGB[1]);
2380 myCStructure->BoundBox.Color.b = float (anRGB[2]);
2381 myCStructure->HighlightWithBndBox (Standard_True);
2387 //=============================================================================
2388 //function : GraphicTransform
2390 //=============================================================================
2391 void Graphic3d_Structure::GraphicTransform (const TColStd_Array2OfReal& theMatrix)
2393 for (Standard_Integer i = 0; i <= 3; ++i)
2395 for (Standard_Integer j = 0; j <= 3; ++j)
2397 myCStructure->Transformation[i][j] = float (theMatrix (i, j));
2400 myCStructure->UpdateTransformation();
2403 //=============================================================================
2404 //function : GraphicUnHighlight
2406 //=============================================================================
2407 void Graphic3d_Structure::GraphicUnHighlight()
2409 myCStructure->highlight = 0;
2410 switch (myHighlightMethod)
2412 case Aspect_TOHM_COLOR:
2413 myCStructure->HighlightWithColor (Graphic3d_Vec3 (0.0f, 0.0f, 0.0f), Standard_False);
2414 myCStructure->UpdateNamedStatus();
2416 case Aspect_TOHM_BOUNDBOX:
2417 myCStructure->HighlightWithBndBox (Standard_False);
2418 myCStructure->UpdateNamedStatus();
2423 //=============================================================================
2424 //function : ComputeVisual
2426 //=============================================================================
2427 Graphic3d_TypeOfStructure Graphic3d_Structure::ComputeVisual() const
2429 return myComputeVisual;
2432 //=============================================================================
2433 //function : SetComputeVisual
2435 //=============================================================================
2436 void Graphic3d_Structure::SetComputeVisual (const Graphic3d_TypeOfStructure theVisual)
2438 // The ComputeVisual is saved only if the structure is declared TOS_ALL, TOS_WIREFRAME or TOS_SHADING.
2439 // This declaration permits to calculate proper representation of the structure calculated by Compute instead of passage to TOS_COMPUTED.
2440 if (theVisual != Graphic3d_TOS_COMPUTED)
2442 myComputeVisual = theVisual;
2446 //=============================================================================
2449 //=============================================================================
2450 void Graphic3d_Structure::Plot (const Handle(Graphic3d_Plotter)& )
2455 //=============================================================================
2456 //function : SetHLRValidation
2458 //=============================================================================
2459 void Graphic3d_Structure::SetHLRValidation (const Standard_Boolean theFlag)
2461 myCStructure->HLRValidation = theFlag ? 1 : 0;
2464 //=============================================================================
2465 //function : HLRValidation
2467 //=============================================================================
2468 Standard_Boolean Graphic3d_Structure::HLRValidation() const
2470 // Hidden parts stored in <me> are valid if :
2471 // 1/ the owner is defined.
2472 // 2/ they are not invalid.
2473 return myOwner != NULL
2474 && myCStructure->HLRValidation != 0;
2477 //=======================================================================
2478 //function : CStructure
2480 //=======================================================================
2481 const Handle(Graphic3d_CStructure)& Graphic3d_Structure::CStructure() const
2483 return myCStructure;
2486 //=======================================================================
2487 //function : SetZLayer
2489 //=======================================================================
2490 void Graphic3d_Structure::SetZLayer (const Standard_Integer theLayerId)
2492 // if the structure is not displayed, unable to change its display layer
2496 myStructureManager->ChangeZLayer (this, theLayerId);
2499 //=======================================================================
2500 //function : GetZLayer
2502 //=======================================================================
2503 Standard_Integer Graphic3d_Structure::GetZLayer () const
2505 return myStructureManager->GetZLayer (this);
2508 //=======================================================================
2509 //function : SetClipPlanes
2511 //=======================================================================
2512 void Graphic3d_Structure::SetClipPlanes (const Graphic3d_SequenceOfHClipPlane& thePlanes)
2514 myCStructure->SetClipPlanes (thePlanes);
2517 //=======================================================================
2518 //function : GetClipPlanes
2520 //=======================================================================
2521 const Graphic3d_SequenceOfHClipPlane& Graphic3d_Structure::GetClipPlanes() const
2523 return myCStructure->ClipPlanes();