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 //=============================================================================
61 //function : Graphic3d_Structure
63 //=============================================================================
64 Graphic3d_Structure::Graphic3d_Structure (const Handle(Graphic3d_StructureManager)& theManager,
65 const Handle(Graphic3d_Structure)& thePrs)
66 : myStructureManager (theManager.operator->()),
67 myFirstStructureManager (theManager.operator->()),
68 myComputeVisual (thePrs->myComputeVisual),
69 myHighlightColor (thePrs->myHighlightColor),
70 myHighlightMethod (thePrs->myHighlightMethod),
71 myOwner (thePrs->myOwner),
72 myVisual (thePrs->myVisual)
74 myCStructure = thePrs->myCStructure->ShadowLink (theManager);
77 Handle(Graphic3d_AspectLine3d) aAspectLine3d = new Graphic3d_AspectLine3d();
78 Handle(Graphic3d_AspectText3d) aAspectText3d = new Graphic3d_AspectText3d();
79 Handle(Graphic3d_AspectMarker3d) aAspectMarker3d = new Graphic3d_AspectMarker3d();
80 Handle(Graphic3d_AspectFillArea3d) aAspectFillArea3d = new Graphic3d_AspectFillArea3d();
81 theManager->PrimitivesAspect (aAspectLine3d, aAspectText3d, aAspectMarker3d, aAspectFillArea3d);
82 aAspectFillArea3d->SetPolygonOffsets (Aspect_POM_Fill, 1.0, 0.0);
84 // update the associated CStructure
85 UpdateStructure (aAspectLine3d, aAspectText3d, aAspectMarker3d, aAspectFillArea3d);
88 //=============================================================================
91 //=============================================================================
92 void Graphic3d_Structure::Destroy()
94 // as myFirstStructureManager can be already destroyed,
95 // avoid attempts to access it
96 myFirstStructureManager = NULL;
100 //=============================================================================
103 //=============================================================================
104 void Graphic3d_Structure::Clear (const Standard_Boolean theWithDestruction)
106 if (IsDeleted()) return;
108 myCStructure->ContainsFacet = 0;
110 // clean groups in graphics driver at first
111 GraphicClear (theWithDestruction);
113 // only then remove group references
114 if (theWithDestruction)
117 myStructureManager->Clear (this, theWithDestruction);
122 //=============================================================================
125 //=============================================================================
126 void Graphic3d_Structure::Remove()
128 if (IsDeleted()) return;
130 // clean groups in graphics driver at first; this is also should be done
131 // to avoid unwanted group cleaning in group's destructor
132 // Pass Standard_False to Clear(..) method to avoid updating in
133 // structure manager, it isn't necessary, besides of it structure manager
134 // could be already destroyed and invalid pointers used in structure;
135 Standard_Integer Length = myGroups.Length();
136 for (Standard_Integer aGrId = 1; aGrId <= Length; ++aGrId)
137 myGroups.ChangeValue (aGrId)->Clear (Standard_False);
139 // Standard_Address APtr = (void *) This ().operator->();
140 Standard_Address APtr = (void *) this;
141 // It is necessary to remove the eventual pointer on the structure
142 // that can be destroyed, in the list of descendants
143 // of ancesters of this structure and in the list of ancesters
144 // of descendants of the same structure.
146 Length = myDescendants.Length();
147 for (Standard_Integer i = 1; i <= Length; ++i)
149 ((Graphic3d_Structure *)(myDescendants.Value (i)))->Remove (APtr, Graphic3d_TOC_ANCESTOR);
152 Length = myAncestors.Length();
153 for (Standard_Integer i = 1; i <= Length; ++i)
155 ((Graphic3d_Structure *)(myAncestors.Value (i)))->Remove (APtr, Graphic3d_TOC_DESCENDANT);
158 myCStructure->ContainsFacet = 0;
160 // Destruction of me in the graphic library
161 const Standard_Integer aStructId = myCStructure->Id;
162 myCStructure->GraphicDriver()->RemoveStructure (myCStructure);
163 myCStructure.Nullify();
165 // Liberation of the identification if the destroyed structure
166 // in the first manager that performs creation of the structure.
167 if (myFirstStructureManager != NULL)
169 myFirstStructureManager->Remove (aStructId);
173 //=============================================================================
176 //=============================================================================
177 void Graphic3d_Structure::Display()
179 if (IsDeleted()) return;
181 if (!myCStructure->stick)
183 myCStructure->stick = 1;
184 myStructureManager->Display (this);
187 myCStructure->visible = 1;
190 //=============================================================================
193 //=============================================================================
194 void Graphic3d_Structure::Display (const Standard_Integer thePriority)
196 if (IsDeleted()) return;
198 SetDisplayPriority (thePriority);
200 if (!myCStructure->stick)
202 myCStructure->stick = 1;
203 myStructureManager->Display (this);
206 myCStructure->visible = 1;
209 //=============================================================================
210 //function : SetDisplayPriority
212 //=============================================================================
213 void Graphic3d_Structure::SetDisplayPriority (const Standard_Integer thePriority)
216 || thePriority == myCStructure->Priority)
221 myCStructure->PreviousPriority = myCStructure->Priority;
222 myCStructure->Priority = thePriority;
224 if (myCStructure->Priority != myCStructure->PreviousPriority)
226 Graphic3d_PriorityDefinitionError_Raise_if ((myCStructure->Priority > Structure_MAX_PRIORITY)
227 || (myCStructure->Priority < Structure_MIN_PRIORITY),
228 "Bad value for StructurePriority");
229 if (myCStructure->stick)
231 myStructureManager->ChangeDisplayPriority (this, myCStructure->PreviousPriority, myCStructure->Priority);
236 //=============================================================================
237 //function : ResetDisplayPriority
239 //=============================================================================
240 void Graphic3d_Structure::ResetDisplayPriority()
243 || myCStructure->Priority == myCStructure->PreviousPriority)
248 const Standard_Integer aPriority = myCStructure->Priority;
249 myCStructure->Priority = myCStructure->PreviousPriority;
250 if (myCStructure->stick)
252 myStructureManager->ChangeDisplayPriority (this, aPriority, myCStructure->Priority);
256 //=============================================================================
257 //function : DisplayPriority
259 //=============================================================================
260 Standard_Integer Graphic3d_Structure::DisplayPriority() const
262 return myCStructure->Priority;
265 //=============================================================================
268 //=============================================================================
269 void Graphic3d_Structure::Erase()
276 if (myCStructure->stick)
278 myCStructure->stick = 0;
279 myStructureManager->Erase (this);
283 //=============================================================================
284 //function : Highlight
286 //=============================================================================
287 void Graphic3d_Structure::Highlight (const Aspect_TypeOfHighlightMethod theMethod)
294 // Highlight on already Highlighted structure.
295 if (myCStructure->highlight)
297 Aspect_TypeOfUpdate anUpdateMode = myStructureManager->UpdateMode();
298 if (anUpdateMode == Aspect_TOU_WAIT)
304 // To avoid call of method : Update()
305 // Not useful and can be costly.
306 myStructureManager->SetUpdateMode (Aspect_TOU_WAIT);
308 myStructureManager->SetUpdateMode (anUpdateMode);
312 SetDisplayPriority (Structure_MAX_PRIORITY - 1);
314 GraphicHighlight (theMethod);
315 if (myCStructure->stick)
317 myStructureManager->Highlight (this, theMethod);
323 //=============================================================================
324 //function : SetHighlightColor
326 //=============================================================================
327 void Graphic3d_Structure::SetHighlightColor (const Quantity_Color& theColor)
334 if (!myCStructure->highlight)
336 myHighlightColor = theColor;
340 // Change highlight color on already Highlighted structure.
341 Aspect_TypeOfUpdate anUpdateMode = myStructureManager->UpdateMode();
342 if (anUpdateMode == Aspect_TOU_WAIT)
348 // To avoid call of method : Update()
349 // Not useful and can be costly.
350 myStructureManager->SetUpdateMode (Aspect_TOU_WAIT);
352 myStructureManager->SetUpdateMode (anUpdateMode);
354 myHighlightColor = theColor;
355 Highlight (myHighlightMethod);
358 //=============================================================================
359 //function : SetVisible
361 //=============================================================================
362 void Graphic3d_Structure::SetVisible (const Standard_Boolean theValue)
364 if (IsDeleted()) return;
366 myCStructure->visible = theValue ? 1 : 0;
367 myCStructure->UpdateNamedStatus();
371 //=============================================================================
374 //=============================================================================
375 void Graphic3d_Structure::SetPick (const Standard_Boolean theValue)
377 if (IsDeleted ()) return;
379 myCStructure->pick = theValue ? 1 : 0;
380 myCStructure->UpdateNamedStatus();
384 myStructureManager->Detectable (this);
388 myStructureManager->Undetectable (this);
393 //=============================================================================
394 //function : UnHighlight
396 //=============================================================================
397 void Graphic3d_Structure::UnHighlight()
399 if (IsDeleted()) return;
401 if (myCStructure->highlight)
403 myCStructure->highlight = 0;
405 GraphicUnHighlight();
406 myStructureManager->UnHighlight (this);
408 ResetDisplayPriority();
413 //=============================================================================
414 //function : HighlightColor
416 //=============================================================================
417 const Quantity_Color& Graphic3d_Structure::HighlightColor() const
419 return myHighlightColor;
422 //=============================================================================
423 //function : IsDisplayed
425 //=============================================================================
426 Standard_Boolean Graphic3d_Structure::IsDisplayed() const
428 return myCStructure->stick ? Standard_True : Standard_False;
431 //=============================================================================
432 //function : IsDeleted
434 //=============================================================================
435 Standard_Boolean Graphic3d_Structure::IsDeleted() const
437 return myCStructure.IsNull();
440 //=============================================================================
441 //function : IsHighlighted
443 //=============================================================================
444 Standard_Boolean Graphic3d_Structure::IsHighlighted() const
446 return myCStructure->highlight ? Standard_True : Standard_False;
449 //=============================================================================
450 //function : IsSelectable
452 //=============================================================================
453 Standard_Boolean Graphic3d_Structure::IsSelectable() const
455 return myCStructure->pick ? Standard_True : Standard_False;
458 //=============================================================================
459 //function : IsVisible
461 //=============================================================================
462 Standard_Boolean Graphic3d_Structure::IsVisible() const
464 return myCStructure->visible ? Standard_True : Standard_False;
467 //=============================================================================
468 //function : IsRotated
470 //=============================================================================
471 Standard_Boolean Graphic3d_Structure::IsRotated() const
473 // A somewhat light test !
474 return myCStructure->Transformation[0][1] != 0.0
475 || myCStructure->Transformation[0][2] != 0.0
476 || myCStructure->Transformation[1][0] != 0.0
477 || myCStructure->Transformation[1][2] != 0.0
478 || myCStructure->Transformation[2][0] != 0.0
479 || myCStructure->Transformation[2][1] != 0.0;
482 //=============================================================================
483 //function : IsTransformed
485 //=============================================================================
486 Standard_Boolean Graphic3d_Structure::IsTransformed() const
488 Standard_Boolean aResult = Standard_False;
489 for (Standard_Integer i = 0; i <= 3 && !aResult; ++i)
491 for (Standard_Integer j = 0; j <= 3 && !aResult; ++j)
494 aResult = myCStructure->Transformation[i][j] != 1.0;
496 aResult = myCStructure->Transformation[i][j] != 0.0;
502 //=============================================================================
503 //function : ContainsFacet
505 //=============================================================================
506 Standard_Boolean Graphic3d_Structure::ContainsFacet() const
510 return Standard_False;
512 else if (myCStructure->ContainsFacet > 0)
514 // if one of groups contains at least one facet, the structure contains it too
515 return Standard_True;
518 // stop at the first descendant containing at least one facet
519 const Standard_Integer aNbDesc = myDescendants.Length();
520 for (Standard_Integer aStructIter = 1; aStructIter <= aNbDesc; ++aStructIter)
522 if (((Graphic3d_Structure *)(myDescendants.Value (aStructIter)))->ContainsFacet())
524 return Standard_True;
527 return Standard_False;
530 //=============================================================================
533 //=============================================================================
534 Standard_Boolean Graphic3d_Structure::IsEmpty() const
538 return Standard_True;
541 // structure is empty:
542 // - if all these groups are empty
543 // - or if all groups are empty and all their descendants are empty
544 // - or if all its descendants are empty
545 const Standard_Integer aNbGroups = myGroups.Length();
546 for (Standard_Integer aGrpIter = 1; aGrpIter <= aNbGroups; ++aGrpIter)
548 if (!myGroups.Value (aGrpIter)->IsEmpty())
550 return Standard_False;
554 // stop at the first non-empty descendant
555 const Standard_Integer aNbDesc = myDescendants.Length();
556 for (Standard_Integer aDescIter = 1; aDescIter <= aNbDesc; ++aDescIter)
558 if (!((Graphic3d_Structure* )(myDescendants.Value (aDescIter)))->IsEmpty())
560 return Standard_False;
563 return Standard_True;
566 //=============================================================================
567 //function : PrimitivesAspect
569 //=============================================================================
570 void Graphic3d_Structure::PrimitivesAspect (Handle(Graphic3d_AspectLine3d)& theAspLine,
571 Handle(Graphic3d_AspectText3d)& theAspText,
572 Handle(Graphic3d_AspectMarker3d)& theAspMarker,
573 Handle(Graphic3d_AspectFillArea3d)& theAspFill) const
575 theAspLine = Line3dAspect();
576 theAspText = Text3dAspect();
577 theAspMarker = Marker3dAspect();
578 theAspFill = FillArea3dAspect();
581 //=============================================================================
582 //function : GroupsWithFacet
584 //=============================================================================
585 void Graphic3d_Structure::GroupsWithFacet (const Standard_Integer theDelta)
587 myCStructure->ContainsFacet = myCStructure->ContainsFacet + theDelta;
588 if (myCStructure->ContainsFacet < 0)
590 myCStructure->ContainsFacet = 0;
594 //=============================================================================
597 //=============================================================================
598 void Graphic3d_Structure::Compute()
600 // Implemented by Presentation
603 //=============================================================================
606 //=============================================================================
607 Handle(Graphic3d_Structure) Graphic3d_Structure::Compute (const Handle(Graphic3d_DataStructureManager)& )
609 // Implemented by Presentation
613 //=============================================================================
616 //=============================================================================
617 Handle(Graphic3d_Structure) Graphic3d_Structure::Compute (const Handle(Graphic3d_DataStructureManager)& ,
618 const TColStd_Array2OfReal& )
620 // Implemented by Presentation
624 //=============================================================================
627 //=============================================================================
628 void Graphic3d_Structure::Compute (const Handle(Graphic3d_DataStructureManager)& ,
629 Handle(Graphic3d_Structure)& )
631 // Implemented by Presentation
634 //=============================================================================
637 //=============================================================================
638 void Graphic3d_Structure::Compute (const Handle(Graphic3d_DataStructureManager)& ,
639 const TColStd_Array2OfReal& ,
640 Handle(Graphic3d_Structure)& )
642 // Implemented by Presentation
645 //=============================================================================
646 //function : ReCompute
648 //=============================================================================
649 void Graphic3d_Structure::ReCompute()
651 myStructureManager->ReCompute (this);
654 //=============================================================================
655 //function : ReCompute
657 //=============================================================================
658 void Graphic3d_Structure::ReCompute (const Handle(Graphic3d_DataStructureManager)& theProjector)
660 myStructureManager->ReCompute (this, theProjector);
663 //=============================================================================
664 //function : SetInfiniteState
666 //=============================================================================
667 void Graphic3d_Structure::SetInfiniteState (const Standard_Boolean theToSet)
669 myCStructure->IsInfinite = theToSet ? 1 : 0;
672 //=============================================================================
673 //function : IsInfinite
675 //=============================================================================
676 Standard_Boolean Graphic3d_Structure::IsInfinite() const
679 || myCStructure->IsInfinite;
682 //=============================================================================
683 //function : GraphicClear
685 //=============================================================================
686 void Graphic3d_Structure::GraphicClear (const Standard_Boolean theWithDestruction)
688 // clean and empty each group
689 const Standard_Integer aLength = myGroups.Length();
690 for (Standard_Integer aGrId = 1; aGrId <= aLength; ++aGrId)
692 myGroups.ChangeValue (aGrId)->Clear();
695 if (theWithDestruction)
697 while (!myGroups.IsEmpty())
699 Handle(Graphic3d_Group) aGroup = myGroups.First();
703 myCStructure->Clear();
707 //=============================================================================
708 //function : GraphicConnect
710 //=============================================================================
711 void Graphic3d_Structure::GraphicConnect (const Handle(Graphic3d_Structure)& theDaughter)
713 myCStructure->Connect (*theDaughter->myCStructure);
716 //=============================================================================
717 //function : GraphicDisconnect
719 //=============================================================================
720 void Graphic3d_Structure::GraphicDisconnect (const Handle(Graphic3d_Structure)& theDaughter)
722 myCStructure->Disconnect (*theDaughter->myCStructure);
725 //=============================================================================
726 //function : Line3dAspect
728 //=============================================================================
729 Handle(Graphic3d_AspectLine3d) Graphic3d_Structure::Line3dAspect() const
731 const Standard_Real anRGB[3] =
733 Standard_Real (myCStructure->ContextLine.Color.r),
734 Standard_Real (myCStructure->ContextLine.Color.g),
735 Standard_Real (myCStructure->ContextLine.Color.b)
737 Quantity_Color aColor;
738 aColor.SetValues (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
739 Aspect_TypeOfLine aLType = Aspect_TypeOfLine (myCStructure->ContextLine.LineType);
740 Standard_Real aWidth = Standard_Real (myCStructure->ContextLine.Width);
742 Handle(Graphic3d_AspectLine3d) anAspLine = new Graphic3d_AspectLine3d (aColor, aLType, aWidth);
743 anAspLine->SetShaderProgram (myCStructure->ContextLine.ShaderProgram);
747 //=============================================================================
748 //function : Text3dAspect
750 //=============================================================================
751 Handle(Graphic3d_AspectText3d) Graphic3d_Structure::Text3dAspect() const
753 const Standard_Real anRGB[3] =
755 Standard_Real (myCStructure->ContextText.Color.r),
756 Standard_Real (myCStructure->ContextText.Color.g),
757 Standard_Real (myCStructure->ContextText.Color.b)
759 Quantity_Color aColor;
760 aColor.SetValues (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
761 Standard_CString aFont = Standard_CString (myCStructure->ContextText.Font);
762 Standard_Real anExpansion = Standard_Real (myCStructure->ContextText.Expan);
763 Standard_Real aSpace = Standard_Real (myCStructure->ContextText.Space);
764 Aspect_TypeOfStyleText aStyle = Aspect_TypeOfStyleText (myCStructure->ContextText.Style);
765 Aspect_TypeOfDisplayText aDispType = Aspect_TypeOfDisplayText (myCStructure->ContextText.DisplayType);
767 Handle(Graphic3d_AspectText3d) anAspText = new Graphic3d_AspectText3d (aColor, aFont, anExpansion, aSpace, aStyle, aDispType);
768 anAspText->SetShaderProgram (myCStructure->ContextText.ShaderProgram);
772 //=============================================================================
773 //function : Marker3dAspect
775 //=============================================================================
776 Handle(Graphic3d_AspectMarker3d) Graphic3d_Structure::Marker3dAspect() const
778 const Standard_Real anRGB[3] =
780 Standard_Real (myCStructure->ContextMarker.Color.r),
781 Standard_Real (myCStructure->ContextMarker.Color.g),
782 Standard_Real (myCStructure->ContextMarker.Color.b)
784 Quantity_Color aColor;
785 aColor.SetValues (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
786 Aspect_TypeOfMarker aMType = myCStructure->ContextMarker.MarkerType;
787 Standard_Real aScale = Standard_Real (myCStructure->ContextMarker.Scale);
789 Handle(Graphic3d_AspectMarker3d) anAspMarker = new Graphic3d_AspectMarker3d (aMType, aColor, aScale);
790 anAspMarker->SetShaderProgram (myCStructure->ContextMarker.ShaderProgram);
794 //=============================================================================
795 //function : FillArea3dAspect
797 //=============================================================================
798 Handle(Graphic3d_AspectFillArea3d) Graphic3d_Structure::FillArea3dAspect() const
801 Graphic3d_MaterialAspect aBack;
802 aBack.SetShininess (Standard_Real (myCStructure->ContextFillArea.Back.Shininess));
803 aBack.SetAmbient (Standard_Real (myCStructure->ContextFillArea.Back.Ambient));
804 aBack.SetDiffuse (Standard_Real (myCStructure->ContextFillArea.Back.Diffuse));
805 aBack.SetSpecular (Standard_Real (myCStructure->ContextFillArea.Back.Specular));
806 aBack.SetTransparency (Standard_Real (myCStructure->ContextFillArea.Back.Transparency));
807 aBack.SetEmissive (Standard_Real (myCStructure->ContextFillArea.Back.Emission));
808 if (myCStructure->ContextFillArea.Back.IsAmbient == 1)
809 aBack.SetReflectionModeOn (Graphic3d_TOR_AMBIENT);
811 aBack.SetReflectionModeOff (Graphic3d_TOR_AMBIENT);
812 if (myCStructure->ContextFillArea.Back.IsDiffuse == 1)
813 aBack.SetReflectionModeOn (Graphic3d_TOR_DIFFUSE);
815 aBack.SetReflectionModeOff (Graphic3d_TOR_DIFFUSE);
816 if (myCStructure->ContextFillArea.Back.IsSpecular == 1)
817 aBack.SetReflectionModeOn (Graphic3d_TOR_SPECULAR);
819 aBack.SetReflectionModeOff (Graphic3d_TOR_SPECULAR);
820 if (myCStructure->ContextFillArea.Back.IsEmission == 1)
821 aBack.SetReflectionModeOn (Graphic3d_TOR_EMISSION);
823 aBack.SetReflectionModeOff (Graphic3d_TOR_EMISSION);
825 Quantity_Color aColor (Standard_Real (myCStructure->ContextFillArea.Back.ColorSpec.r),
826 Standard_Real (myCStructure->ContextFillArea.Back.ColorSpec.g),
827 Standard_Real (myCStructure->ContextFillArea.Back.ColorSpec.b), Quantity_TOC_RGB);
828 aBack.SetSpecularColor (aColor);
830 aColor.SetValues (Standard_Real (myCStructure->ContextFillArea.Back.ColorAmb.r),
831 Standard_Real (myCStructure->ContextFillArea.Back.ColorAmb.g),
832 Standard_Real (myCStructure->ContextFillArea.Back.ColorAmb.b), Quantity_TOC_RGB);
833 aBack.SetAmbientColor (aColor);
835 aColor.SetValues (Standard_Real (myCStructure->ContextFillArea.Back.ColorDif.r),
836 Standard_Real (myCStructure->ContextFillArea.Back.ColorDif.g),
837 Standard_Real (myCStructure->ContextFillArea.Back.ColorDif.b), Quantity_TOC_RGB);
838 aBack.SetDiffuseColor (aColor);
840 aColor.SetValues (Standard_Real (myCStructure->ContextFillArea.Back.ColorEms.r),
841 Standard_Real (myCStructure->ContextFillArea.Back.ColorEms.g),
842 Standard_Real (myCStructure->ContextFillArea.Back.ColorEms.b), Quantity_TOC_RGB);
843 aBack.SetEmissiveColor (aColor);
845 aBack.SetEnvReflexion (myCStructure->ContextFillArea.Back.EnvReflexion);
846 aBack.SetMaterialType (myCStructure->ContextFillArea.Back.IsPhysic ? Graphic3d_MATERIAL_PHYSIC : Graphic3d_MATERIAL_ASPECT);
849 Graphic3d_MaterialAspect aFront;
850 aFront.SetShininess (Standard_Real (myCStructure->ContextFillArea.Front.Shininess));
851 aFront.SetAmbient (Standard_Real (myCStructure->ContextFillArea.Front.Ambient));
852 aFront.SetDiffuse (Standard_Real (myCStructure->ContextFillArea.Front.Diffuse));
853 aFront.SetSpecular (Standard_Real (myCStructure->ContextFillArea.Front.Specular));
854 aFront.SetTransparency (Standard_Real (myCStructure->ContextFillArea.Front.Transparency));
855 aFront.SetEmissive (Standard_Real (myCStructure->ContextFillArea.Front.Emission));
856 if (myCStructure->ContextFillArea.Front.IsAmbient == 1)
857 aFront.SetReflectionModeOn (Graphic3d_TOR_AMBIENT);
859 aFront.SetReflectionModeOff (Graphic3d_TOR_AMBIENT);
860 if (myCStructure->ContextFillArea.Front.IsDiffuse == 1)
861 aFront.SetReflectionModeOn (Graphic3d_TOR_DIFFUSE);
863 aFront.SetReflectionModeOff (Graphic3d_TOR_DIFFUSE);
864 if (myCStructure->ContextFillArea.Front.IsSpecular == 1)
865 aFront.SetReflectionModeOn (Graphic3d_TOR_SPECULAR);
867 aFront.SetReflectionModeOff (Graphic3d_TOR_SPECULAR);
868 if (myCStructure->ContextFillArea.Front.Emission == 1)
869 aFront.SetReflectionModeOn (Graphic3d_TOR_EMISSION);
871 aFront.SetReflectionModeOff (Graphic3d_TOR_EMISSION);
873 aColor.SetValues (Standard_Real (myCStructure->ContextFillArea.Front.ColorSpec.r),
874 Standard_Real (myCStructure->ContextFillArea.Front.ColorSpec.g),
875 Standard_Real (myCStructure->ContextFillArea.Front.ColorSpec.b), Quantity_TOC_RGB);
876 aFront.SetSpecularColor (aColor);
878 aColor.SetValues (Standard_Real (myCStructure->ContextFillArea.Front.ColorAmb.r),
879 Standard_Real (myCStructure->ContextFillArea.Front.ColorAmb.g),
880 Standard_Real (myCStructure->ContextFillArea.Front.ColorAmb.b), Quantity_TOC_RGB);
881 aFront.SetAmbientColor (aColor);
883 aColor.SetValues (Standard_Real (myCStructure->ContextFillArea.Front.ColorDif.r),
884 Standard_Real (myCStructure->ContextFillArea.Front.ColorDif.g),
885 Standard_Real (myCStructure->ContextFillArea.Front.ColorDif.b), Quantity_TOC_RGB);
886 aFront.SetDiffuseColor (aColor);
888 aColor.SetValues (Standard_Real (myCStructure->ContextFillArea.Front.ColorEms.r),
889 Standard_Real (myCStructure->ContextFillArea.Front.ColorEms.g),
890 Standard_Real (myCStructure->ContextFillArea.Front.ColorEms.b), Quantity_TOC_RGB);
891 aFront.SetEmissiveColor (aColor);
893 aFront.SetEnvReflexion (myCStructure->ContextFillArea.Front.EnvReflexion);
894 aFront.SetMaterialType (myCStructure->ContextFillArea.Front.IsPhysic ? Graphic3d_MATERIAL_PHYSIC : Graphic3d_MATERIAL_ASPECT);
896 Quantity_Color anIntColor (Standard_Real (myCStructure->ContextFillArea.IntColor.r),
897 Standard_Real (myCStructure->ContextFillArea.IntColor.g),
898 Standard_Real (myCStructure->ContextFillArea.IntColor.b), Quantity_TOC_RGB);
899 Quantity_Color anEdgeColor (Standard_Real (myCStructure->ContextFillArea.EdgeColor.r),
900 Standard_Real (myCStructure->ContextFillArea.EdgeColor.g),
901 Standard_Real (myCStructure->ContextFillArea.EdgeColor.b), Quantity_TOC_RGB);
902 Handle(Graphic3d_AspectFillArea3d) anAspFill = new Graphic3d_AspectFillArea3d (Aspect_InteriorStyle (myCStructure->ContextFillArea.Style),
903 anIntColor, anEdgeColor,
904 Aspect_TypeOfLine (myCStructure->ContextFillArea.LineType),
905 Standard_Real (myCStructure->ContextFillArea.Width),
909 if (myCStructure->ContextFillArea.Edge == 1)
910 anAspFill->SetEdgeOn();
912 anAspFill->SetEdgeOff();
914 anAspFill->SetHatchStyle (Aspect_HatchStyle (myCStructure->ContextFillArea.Hatch));
916 // Front and Back face
917 if (myCStructure->ContextFillArea.Distinguish == 1)
918 anAspFill->SetDistinguishOn();
920 anAspFill->SetDistinguishOff();
921 if (myCStructure->ContextFillArea.BackFace == 1)
922 anAspFill->SuppressBackFace();
924 anAspFill->AllowBackFace();
926 anAspFill->SetTextureMap (myCStructure->ContextFillArea.Texture.TextureMap);
927 if (myCStructure->ContextFillArea.Texture.doTextureMap == 1)
929 anAspFill->SetTextureMapOn();
933 anAspFill->SetTextureMapOff();
935 anAspFill->SetShaderProgram (myCStructure->ContextFillArea.ShaderProgram);
936 anAspFill->SetPolygonOffsets (myCStructure->ContextFillArea.PolygonOffsetMode,
937 myCStructure->ContextFillArea.PolygonOffsetFactor,
938 myCStructure->ContextFillArea.PolygonOffsetUnits);
942 //=============================================================================
945 //=============================================================================
946 const Graphic3d_SequenceOfGroup& Graphic3d_Structure::Groups() const
951 //=============================================================================
952 //function : NumberOfGroups
954 //=============================================================================
955 Standard_Integer Graphic3d_Structure::NumberOfGroups() const
957 return myGroups.Length();
960 //=============================================================================
961 //function : SetPrimitivesAspect
963 //=============================================================================
964 void Graphic3d_Structure::SetPrimitivesAspect (const Handle(Graphic3d_AspectLine3d)& theAspLine)
966 if (IsDeleted()) return;
968 Standard_Real aWidth;
969 Quantity_Color aColor;
970 Aspect_TypeOfLine aLType;
971 theAspLine->Values (aColor, aLType, aWidth);
973 myCStructure->ContextLine.Color.r = float (aColor.Red());
974 myCStructure->ContextLine.Color.g = float (aColor.Green());
975 myCStructure->ContextLine.Color.b = float (aColor.Blue());
976 myCStructure->ContextLine.LineType = int (aLType);
977 myCStructure->ContextLine.Width = float (aWidth);
978 myCStructure->ContextLine.ShaderProgram = theAspLine->ShaderProgram();
979 myCStructure->ContextLine.IsDef = 1;
981 myCStructure->UpdateAspects();
983 // Attributes are "IsSet" during the first update of context (line, marker...)
984 myCStructure->ContextLine.IsSet = 1;
985 myCStructure->ContextFillArea.IsSet = 1;
986 myCStructure->ContextMarker.IsSet = 1;
987 myCStructure->ContextText.IsSet = 1;
992 //=============================================================================
993 //function : SetPrimitivesAspect
995 //=============================================================================
996 void Graphic3d_Structure::SetPrimitivesAspect (const Handle(Graphic3d_AspectFillArea3d)& theAspFill)
998 if (IsDeleted()) return;
1000 Standard_Real anRGB[3];
1001 Standard_Real aWidth;
1002 Quantity_Color anIntColor;
1003 Quantity_Color aBackIntColor;
1004 Quantity_Color anEdgeColor;
1005 Aspect_TypeOfLine aLType;
1006 Aspect_InteriorStyle aStyle;
1007 theAspFill->Values (aStyle, anIntColor, aBackIntColor, anEdgeColor, aLType, aWidth);
1009 anIntColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
1010 myCStructure->ContextFillArea.Style = aStyle;
1011 myCStructure->ContextFillArea.IntColor.r = float (anRGB[0]);
1012 myCStructure->ContextFillArea.IntColor.g = float (anRGB[1]);
1013 myCStructure->ContextFillArea.IntColor.b = float (anRGB[2]);
1015 if (theAspFill->Distinguish())
1017 aBackIntColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
1019 myCStructure->ContextFillArea.BackIntColor.r = float(anRGB[0]);
1020 myCStructure->ContextFillArea.BackIntColor.g = float(anRGB[1]);
1021 myCStructure->ContextFillArea.BackIntColor.b = float(anRGB[2]);
1024 myCStructure->ContextFillArea.Edge = theAspFill->Edge () ? 1 : 0;
1025 myCStructure->ContextFillArea.EdgeColor.r = float (anEdgeColor.Red());
1026 myCStructure->ContextFillArea.EdgeColor.g = float (anEdgeColor.Green());
1027 myCStructure->ContextFillArea.EdgeColor.b = float (anEdgeColor.Blue());
1028 myCStructure->ContextFillArea.LineType = aLType;
1029 myCStructure->ContextFillArea.Width = float (aWidth);
1030 myCStructure->ContextFillArea.Hatch = theAspFill->HatchStyle();
1032 // Front and Back face
1033 myCStructure->ContextFillArea.Distinguish = theAspFill->Distinguish() ? 1 : 0;
1034 myCStructure->ContextFillArea.BackFace = theAspFill->BackFace() ? 1 : 0;
1037 const Graphic3d_MaterialAspect& aBack = theAspFill->BackMaterial();
1038 // Light specificity
1039 myCStructure->ContextFillArea.Back.Shininess = float (aBack.Shininess());
1040 myCStructure->ContextFillArea.Back.Ambient = float (aBack.Ambient());
1041 myCStructure->ContextFillArea.Back.Diffuse = float (aBack.Diffuse());
1042 myCStructure->ContextFillArea.Back.Specular = float (aBack.Specular());
1043 myCStructure->ContextFillArea.Back.Transparency = float (aBack.Transparency());
1044 myCStructure->ContextFillArea.Back.Emission = float (aBack.Emissive());
1047 myCStructure->ContextFillArea.Back.IsAmbient = (aBack.ReflectionMode (Graphic3d_TOR_AMBIENT) ? 1 : 0);
1048 myCStructure->ContextFillArea.Back.IsDiffuse = (aBack.ReflectionMode (Graphic3d_TOR_DIFFUSE) ? 1 : 0);
1049 myCStructure->ContextFillArea.Back.IsSpecular = (aBack.ReflectionMode (Graphic3d_TOR_SPECULAR) ? 1 : 0);
1050 myCStructure->ContextFillArea.Back.IsEmission = (aBack.ReflectionMode (Graphic3d_TOR_EMISSION) ? 1 : 0);
1054 myCStructure->ContextFillArea.Back.IsPhysic = (aBack.MaterialType (Graphic3d_MATERIAL_PHYSIC) ? 1 : 0 );
1057 myCStructure->ContextFillArea.Back.ColorSpec.r = float (aBack.SpecularColor().Red());
1058 myCStructure->ContextFillArea.Back.ColorSpec.g = float (aBack.SpecularColor().Green());
1059 myCStructure->ContextFillArea.Back.ColorSpec.b = float (aBack.SpecularColor().Blue());
1062 myCStructure->ContextFillArea.Back.ColorAmb.r = float (aBack.AmbientColor().Red());
1063 myCStructure->ContextFillArea.Back.ColorAmb.g = float (aBack.AmbientColor().Green());
1064 myCStructure->ContextFillArea.Back.ColorAmb.b = float (aBack.AmbientColor().Blue());
1067 myCStructure->ContextFillArea.Back.ColorDif.r = float (aBack.DiffuseColor().Red());
1068 myCStructure->ContextFillArea.Back.ColorDif.g = float (aBack.DiffuseColor().Green());
1069 myCStructure->ContextFillArea.Back.ColorDif.b = float (aBack.DiffuseColor().Blue());
1072 myCStructure->ContextFillArea.Back.ColorEms.r = float (aBack.EmissiveColor().Red());
1073 myCStructure->ContextFillArea.Back.ColorEms.g = float (aBack.EmissiveColor().Green());
1074 myCStructure->ContextFillArea.Back.ColorEms.b = float (aBack.EmissiveColor().Blue());
1076 myCStructure->ContextFillArea.Back.EnvReflexion =
1077 float ((theAspFill->BackMaterial ()).EnvReflexion());
1080 const Graphic3d_MaterialAspect& aFront = theAspFill->FrontMaterial();
1081 // Light specificity
1082 myCStructure->ContextFillArea.Front.Shininess = float (aFront.Shininess());
1083 myCStructure->ContextFillArea.Front.Ambient = float (aFront.Ambient());
1084 myCStructure->ContextFillArea.Front.Diffuse = float (aFront.Diffuse());
1085 myCStructure->ContextFillArea.Front.Specular = float (aFront.Specular());
1086 myCStructure->ContextFillArea.Front.Transparency = float (aFront.Transparency());
1087 myCStructure->ContextFillArea.Front.Emission = float (aFront.Emissive());
1090 myCStructure->ContextFillArea.Front.IsAmbient = (aFront.ReflectionMode (Graphic3d_TOR_AMBIENT) ? 1 : 0);
1091 myCStructure->ContextFillArea.Front.IsDiffuse = (aFront.ReflectionMode (Graphic3d_TOR_DIFFUSE) ? 1 : 0);
1092 myCStructure->ContextFillArea.Front.IsSpecular = (aFront.ReflectionMode (Graphic3d_TOR_SPECULAR) ? 1 : 0);
1093 myCStructure->ContextFillArea.Front.IsEmission = (aFront.ReflectionMode (Graphic3d_TOR_EMISSION) ? 1 : 0);
1097 myCStructure->ContextFillArea.Front.IsPhysic = (aFront.MaterialType (Graphic3d_MATERIAL_PHYSIC) ? 1 : 0);
1100 myCStructure->ContextFillArea.Front.ColorSpec.r = float (aFront.SpecularColor().Red());
1101 myCStructure->ContextFillArea.Front.ColorSpec.g = float (aFront.SpecularColor().Green());
1102 myCStructure->ContextFillArea.Front.ColorSpec.b = float (aFront.SpecularColor().Blue());
1105 myCStructure->ContextFillArea.Front.ColorAmb.r = float (aFront.AmbientColor().Red());
1106 myCStructure->ContextFillArea.Front.ColorAmb.g = float (aFront.AmbientColor().Green());
1107 myCStructure->ContextFillArea.Front.ColorAmb.b = float (aFront.AmbientColor().Blue());
1110 myCStructure->ContextFillArea.Front.ColorDif.r = float (aFront.DiffuseColor().Red());
1111 myCStructure->ContextFillArea.Front.ColorDif.g = float (aFront.DiffuseColor().Green());
1112 myCStructure->ContextFillArea.Front.ColorDif.b = float (aFront.DiffuseColor().Blue());
1115 myCStructure->ContextFillArea.Front.ColorEms.r = float (aFront.EmissiveColor().Red());
1116 myCStructure->ContextFillArea.Front.ColorEms.g = float (aFront.EmissiveColor().Green());
1117 myCStructure->ContextFillArea.Front.ColorEms.b = float (aFront.EmissiveColor().Blue());
1119 myCStructure->ContextFillArea.Front.EnvReflexion = float (aFront.EnvReflexion());
1121 myCStructure->ContextFillArea.IsDef = 1; // Definition material ok
1123 myCStructure->ContextFillArea.Texture.TextureMap = theAspFill->TextureMap();
1124 myCStructure->ContextFillArea.Texture.doTextureMap = theAspFill->TextureMapState() ? 1 : 0;
1125 myCStructure->ContextFillArea.ShaderProgram = theAspFill->ShaderProgram();
1127 Standard_Integer aPolyMode;
1128 Standard_ShortReal aPolyFactor, aPolyUnits;
1129 theAspFill->PolygonOffsets (aPolyMode, aPolyFactor, aPolyUnits);
1130 myCStructure->ContextFillArea.PolygonOffsetMode = aPolyMode;
1131 myCStructure->ContextFillArea.PolygonOffsetFactor = aPolyFactor;
1132 myCStructure->ContextFillArea.PolygonOffsetUnits = aPolyUnits;
1134 myCStructure->UpdateAspects();
1136 // Attributes are "IsSet" during the first update of context (line, marker...)
1137 myCStructure->ContextLine.IsSet = 1;
1138 myCStructure->ContextFillArea.IsSet = 1;
1139 myCStructure->ContextMarker.IsSet = 1;
1140 myCStructure->ContextText.IsSet = 1;
1145 //=============================================================================
1146 //function : SetPrimitivesAspect
1148 //=============================================================================
1149 void Graphic3d_Structure::SetPrimitivesAspect (const Handle(Graphic3d_AspectText3d)& theAspText)
1151 if (IsDeleted()) return;
1153 Standard_CString aFont;
1154 Standard_Real aSpace, anExpansion, aTextAngle;
1155 Quantity_Color aColor, aColorSub;
1156 Aspect_TypeOfStyleText aStyle;
1157 Aspect_TypeOfDisplayText aDispType;
1158 Standard_Boolean isTextZoomable;
1159 Font_FontAspect aTextFontAspect;
1160 theAspText->Values (aColor, aFont, anExpansion, aSpace, aStyle, aDispType, aColorSub, isTextZoomable, aTextAngle, aTextFontAspect);
1162 myCStructure->ContextText.Color.r = float (aColor.Red());
1163 myCStructure->ContextText.Color.g = float (aColor.Green());
1164 myCStructure->ContextText.Color.b = float (aColor.Blue());
1165 myCStructure->ContextText.Font = aFont;
1166 myCStructure->ContextText.Expan = float (anExpansion);
1167 myCStructure->ContextText.Space = float (aSpace);
1168 myCStructure->ContextText.Style = aStyle;
1169 myCStructure->ContextText.DisplayType = aDispType;
1170 myCStructure->ContextText.ColorSubTitle.r = float (aColorSub.Red());
1171 myCStructure->ContextText.ColorSubTitle.g = float (aColorSub.Green());
1172 myCStructure->ContextText.ColorSubTitle.b = float (aColorSub.Blue());
1173 myCStructure->ContextText.TextZoomable = isTextZoomable;
1174 myCStructure->ContextText.TextAngle = float (aTextAngle);
1175 myCStructure->ContextText.TextFontAspect = aTextFontAspect;
1176 myCStructure->ContextText.ShaderProgram = theAspText->ShaderProgram();
1178 myCStructure->ContextText.IsDef = 1;
1180 myCStructure->UpdateAspects();
1182 // Attributes are "IsSet" during the first update of a context (line, marker...)
1183 myCStructure->ContextLine.IsSet = 1;
1184 myCStructure->ContextFillArea.IsSet = 1;
1185 myCStructure->ContextMarker.IsSet = 1;
1186 myCStructure->ContextText.IsSet = 1;
1191 //=============================================================================
1192 //function : SetPrimitivesAspect
1194 //=============================================================================
1195 void Graphic3d_Structure::SetPrimitivesAspect (const Handle(Graphic3d_AspectMarker3d)& theAspMarker)
1197 if (IsDeleted()) return;
1199 Standard_Real aScale;
1200 Quantity_Color aColor;
1201 Aspect_TypeOfMarker aMType;
1202 theAspMarker->Values (aColor, aMType, aScale);
1204 myCStructure->ContextMarker.Color.r = float (aColor.Red());
1205 myCStructure->ContextMarker.Color.g = float (aColor.Green());
1206 myCStructure->ContextMarker.Color.b = float (aColor.Blue());
1207 myCStructure->ContextMarker.MarkerType = aMType;
1208 myCStructure->ContextMarker.Scale = float (aScale);
1209 myCStructure->ContextMarker.ShaderProgram = theAspMarker->ShaderProgram();
1210 myCStructure->ContextMarker.IsDef = 1;
1212 myCStructure->UpdateAspects();
1214 // Attributes are "IsSet" during the first update of a context (line, marker...)
1215 myCStructure->ContextLine.IsSet = 1;
1216 myCStructure->ContextFillArea.IsSet = 1;
1217 myCStructure->ContextMarker.IsSet = 1;
1218 myCStructure->ContextText.IsSet = 1;
1223 //=============================================================================
1224 //function : SetVisual
1226 //=============================================================================
1227 void Graphic3d_Structure::SetVisual (const Graphic3d_TypeOfStructure theVisual)
1230 || myVisual == theVisual)
1235 if (!myCStructure->stick)
1237 myVisual = theVisual;
1238 SetComputeVisual (theVisual);
1242 Aspect_TypeOfUpdate anUpdateMode = myStructureManager->UpdateMode();
1243 if (anUpdateMode == Aspect_TOU_WAIT)
1246 myVisual = theVisual;
1247 SetComputeVisual (theVisual);
1251 // To avoid calling method : Update ()
1252 // Not useful and can be costly.
1253 myStructureManager->SetUpdateMode (Aspect_TOU_WAIT);
1255 myVisual = theVisual;
1256 SetComputeVisual (theVisual);
1257 myStructureManager->SetUpdateMode (anUpdateMode);
1263 //=============================================================================
1264 //function : SetZoomLimit
1266 //=============================================================================
1267 void Graphic3d_Structure::SetZoomLimit (const Standard_Real theLimitInf,
1268 const Standard_Real theLimitSup)
1272 Graphic3d_StructureDefinitionError_Raise_if (theLimitInf <= 0.0,
1273 "Bad value for ZoomLimit inf");
1274 Graphic3d_StructureDefinitionError_Raise_if (theLimitSup <= 0.0,
1275 "Bad value for ZoomLimit sup");
1276 Graphic3d_StructureDefinitionError_Raise_if (theLimitSup < theLimitInf,
1277 "ZoomLimit sup < ZoomLimit inf");
1280 //=============================================================================
1283 //=============================================================================
1284 Graphic3d_TypeOfStructure Graphic3d_Structure::Visual() const
1289 //=============================================================================
1290 //function : AcceptConnection
1292 //=============================================================================
1293 Standard_Boolean Graphic3d_Structure::AcceptConnection (const Handle(Graphic3d_Structure)& theStructure1,
1294 const Handle(Graphic3d_Structure)& theStructure2,
1295 const Graphic3d_TypeOfConnection theType)
1298 Graphic3d_MapOfStructure aSet;
1299 Graphic3d_Structure::Network (theStructure2, theType, aSet);
1300 return !aSet.Contains (theStructure1);
1303 //=============================================================================
1304 //function : Ancestors
1306 //=============================================================================
1307 void Graphic3d_Structure::Ancestors (Graphic3d_MapOfStructure& theSet) const
1309 const Standard_Integer aNbAnces = myAncestors.Length ();
1310 for (Standard_Integer anIter = 1; anIter <= aNbAnces; ++anIter)
1312 theSet.Add ((Graphic3d_Structure* )(myAncestors.Value (anIter)));
1316 //=============================================================================
1317 //function : SetOwner
1319 //=============================================================================
1320 void Graphic3d_Structure::SetOwner (const Standard_Address theOwner)
1325 //=============================================================================
1328 //=============================================================================
1329 Standard_Address Graphic3d_Structure::Owner() const
1334 //=============================================================================
1335 //function : Descendants
1337 //=============================================================================
1338 void Graphic3d_Structure::Descendants (Graphic3d_MapOfStructure& theSet) const
1340 const Standard_Integer aNbDesc = myDescendants.Length ();
1341 for (Standard_Integer anIter = 1; anIter <= aNbDesc; ++anIter)
1343 theSet.Add ((Graphic3d_Structure* )(myDescendants.Value (anIter)));
1347 //=============================================================================
1348 //function : Connect
1350 //=============================================================================
1351 void Graphic3d_Structure::Connect (const Handle(Graphic3d_Structure)& theStructure,
1352 const Graphic3d_TypeOfConnection theType,
1353 const Standard_Boolean theWithCheck)
1355 if (IsDeleted()) return;
1359 && !Graphic3d_Structure::AcceptConnection (this, theStructure, theType))
1366 case Graphic3d_TOC_DESCENDANT:
1368 const Standard_Integer aNbDesc = myDescendants.Length();
1369 for (Standard_Integer anIter = 1; anIter <= aNbDesc; ++anIter)
1371 if (myDescendants.Value (anIter) == theStructure.operator->())
1377 myDescendants.Append (theStructure.operator->());
1378 theStructure->Connect (this, Graphic3d_TOC_ANCESTOR);
1380 GraphicConnect (theStructure);
1381 myStructureManager->Connect (this, theStructure);
1386 case Graphic3d_TOC_ANCESTOR:
1388 const Standard_Integer aNbAnces = myAncestors.Length();
1389 for (Standard_Integer anIter = 1; anIter <= aNbAnces; ++anIter)
1391 if (myAncestors.Value (anIter) == theStructure.operator->())
1397 myAncestors.Append (theStructure.operator->());
1398 theStructure->Connect (this, Graphic3d_TOC_DESCENDANT);
1400 // myGraphicDriver->Connect is called in case if connection between parent and child
1406 //=============================================================================
1407 //function : Disconnect
1409 //=============================================================================
1410 void Graphic3d_Structure::Disconnect (const Handle(Graphic3d_Structure)& theStructure)
1412 if (IsDeleted()) return;
1414 const Standard_Integer aNbDesc = myDescendants.Length();
1415 for (Standard_Integer anIter = 1; anIter <= aNbDesc; ++anIter)
1417 if (myDescendants.Value (anIter) == theStructure.operator->())
1419 myDescendants.Remove (anIter);
1420 theStructure->Disconnect (this);
1422 GraphicDisconnect (theStructure);
1423 myStructureManager->Disconnect (this, theStructure);
1430 const Standard_Integer aNbAnces = myAncestors.Length();
1431 for (Standard_Integer anIter = 1; anIter <= aNbAnces; ++anIter)
1433 if (myAncestors.Value (anIter) == theStructure.operator->())
1435 myAncestors.Remove (anIter);
1436 theStructure->Disconnect (this);
1437 // no call of myGraphicDriver->Disconnect in case of an ancestor
1443 //=============================================================================
1444 //function : DisconnectAll
1446 //=============================================================================
1447 void Graphic3d_Structure::DisconnectAll (const Graphic3d_TypeOfConnection theType)
1449 if (IsDeleted()) return;
1453 case Graphic3d_TOC_DESCENDANT:
1455 const Standard_Integer aLength = myDescendants.Length();
1456 for (Standard_Integer anIter = 1; anIter <= aLength; ++anIter)
1458 // Value (1) instead of Value (i) as myDescendants
1460 // Graphic3d_Structure::Disconnect (AStructure)
1461 // that takes AStructure from myDescendants
1462 ((Graphic3d_Structure* )(myDescendants.Value (1)))->Disconnect (this);
1466 case Graphic3d_TOC_ANCESTOR:
1468 const Standard_Integer aLength = myAncestors.Length();
1469 for (Standard_Integer anIter = 1; anIter <= aLength; ++anIter)
1471 // Value (1) instead of Value (i) as myAncestors
1473 // Graphic3d_Structure::Disconnect (AStructure)
1474 // that takes AStructure from myAncestors
1475 ((Graphic3d_Structure* )(myAncestors.Value (1)))->Disconnect (this);
1482 //=============================================================================
1483 //function : Composition
1485 //=============================================================================
1486 Graphic3d_TypeOfComposition Graphic3d_Structure::Composition() const
1488 return myCStructure->Composition;
1491 //=============================================================================
1492 //function : SetTransform
1494 //=============================================================================
1495 void Graphic3d_Structure::SetTransform (const TColStd_Array2OfReal& theMatrix,
1496 const Graphic3d_TypeOfComposition theType)
1498 if (IsDeleted()) return;
1500 Standard_Real valuetrsf;
1501 Standard_Real valueoldtrsf;
1502 Standard_Real valuenewtrsf;
1503 TColStd_Array2OfReal aNewTrsf (0, 3, 0, 3);
1504 TColStd_Array2OfReal aMatrix44 (0, 3, 0, 3);
1506 // Assign the new transformation in an array [0..3][0..3]
1507 // Avoid problemes if the user has defined matrice [1..4][1..4]
1508 // or [3..6][-1..2] !!
1509 Standard_Integer lr = theMatrix.LowerRow();
1510 Standard_Integer ur = theMatrix.UpperRow();
1511 Standard_Integer lc = theMatrix.LowerCol();
1512 Standard_Integer uc = theMatrix.UpperCol();
1514 if ((ur - lr + 1 != 4) || (uc - lc + 1 != 4))
1516 Graphic3d_TransformError::Raise ("Transform : not a 4x4 matrix");
1521 case Graphic3d_TOC_REPLACE:
1523 myCStructure->Composition = Graphic3d_TOC_REPLACE;
1524 // Update of CStructure
1525 for (Standard_Integer i = 0; i <= 3; ++i)
1527 for (Standard_Integer j = 0; j <= 3; ++j)
1529 myCStructure->Transformation[i][j] = float (theMatrix (lr + i, lc + j));
1530 aNewTrsf (i, j) = theMatrix (lr + i, lc + j);
1535 case Graphic3d_TOC_POSTCONCATENATE:
1537 myCStructure->Composition = Graphic3d_TOC_POSTCONCATENATE;
1538 // To simplify management of indices
1539 for (Standard_Integer i = 0; i <= 3; ++i)
1541 for (Standard_Integer j = 0; j <= 3; ++j)
1543 aMatrix44 (i, j) = theMatrix (lr + i, lc + j);
1547 // Calculation of the product of matrices
1548 for (Standard_Integer i = 0; i <= 3; ++i)
1550 for (Standard_Integer j = 0; j <= 3; ++j)
1552 aNewTrsf (i, j) = 0.0;
1553 for (Standard_Integer k = 0; k <= 3; ++k)
1555 valueoldtrsf = myCStructure->Transformation[i][k];
1556 valuetrsf = aMatrix44 (k, j);
1557 valuenewtrsf = aNewTrsf (i, j) + valueoldtrsf * valuetrsf;
1558 aNewTrsf (i, j) = valuenewtrsf;
1563 // Update of CStructure
1564 for (Standard_Integer i = 0; i <= 3; ++i)
1566 for (Standard_Integer j = 0; j <= 3; ++j)
1568 myCStructure->Transformation[i][j] = float (aNewTrsf (i, j));
1575 // If transformation, no validation of hidden already calculated parts
1581 GraphicTransform (aNewTrsf);
1582 myStructureManager->SetTransform (this, aNewTrsf);
1587 //=============================================================================
1588 //function : Transform
1590 //=============================================================================
1591 void Graphic3d_Structure::Transform (TColStd_Array2OfReal& theMatrix) const
1594 Standard_Integer lr = theMatrix.LowerRow ();
1595 Standard_Integer ur = theMatrix.UpperRow ();
1596 Standard_Integer lc = theMatrix.LowerCol ();
1597 Standard_Integer uc = theMatrix.UpperCol ();
1599 if ((ur - lr + 1 != 4) || (uc - lc + 1 != 4))
1600 Graphic3d_TransformError::Raise ("Transform : not a 4x4 matrix");
1602 for (Standard_Integer i = 0; i <= 3; ++i)
1604 for (Standard_Integer j = 0; j <= 3; ++j)
1606 theMatrix (lr + i, lc + j) = myCStructure->Transformation[i][j];
1611 //=============================================================================
1612 //function : MinMaxValues
1614 //=============================================================================
1615 void Graphic3d_Structure::MinMaxValues (Standard_Real& theXMin,
1616 Standard_Real& theYMin,
1617 Standard_Real& theZMin,
1618 Standard_Real& theXMax,
1619 Standard_Real& theYMax,
1620 Standard_Real& theZMax,
1621 const Standard_Boolean theToIgnoreInfiniteFlag) const
1628 Standard_Real aXMin, aYMin, aZMin, aXMax, aYMax, aZMax;
1629 MinMaxCoord (aXMin, aYMin, aZMin, aXMax, aYMax, aZMax);
1631 // Infinite boundaries corresponding to empty structure or
1632 // non-empty structure, without any primitives specified
1633 if (aXMin == RealFirst() && aYMin == RealFirst() && aZMin == RealFirst() &&
1634 aXMax == RealLast() && aYMax == RealLast() && aZMax == RealLast())
1636 theXMin = RealFirst();
1637 theYMin = RealFirst();
1638 theZMin = RealFirst();
1639 theXMax = RealLast();
1640 theYMax = RealLast();
1641 theZMax = RealLast();
1645 // Handle flag, which specifies that structure should be considered as infinite
1646 if (IsInfinite() && !theToIgnoreInfiniteFlag)
1648 Graphic3d_Vertex aVertexMin (aXMin, aYMin, aZMin);
1649 Graphic3d_Vertex aVertexMax (aXMax, aYMax, aZMax);
1650 const Standard_Real aDistance = aVertexMin.Distance (aVertexMax);
1652 // Special case for infinite line:
1653 // Bounding borders of infinite line has been
1654 // calculated as own point in center of this line
1655 if (aDistance >= 500000.0)
1657 theXMin = theXMax = 0.5 * (aXMin + aXMax);
1658 theYMin = theYMax = 0.5 * (aYMin + aYMax);
1659 theZMin = theZMax = 0.5 * (aZMin + aZMax);
1663 theXMin = RealFirst();
1664 theYMin = RealFirst();
1665 theZMin = RealFirst();
1666 theXMax = RealLast();
1667 theYMax = RealLast();
1668 theZMax = RealLast();
1672 // Min-Max values of the descendant structures
1673 Standard_Real aDescXMin = RealLast();
1674 Standard_Real aDescYMin = RealLast();
1675 Standard_Real aDescZMin = RealLast();
1676 Standard_Real aDescXMax = RealFirst();
1677 Standard_Real aDescYMax = RealFirst();
1678 Standard_Real aDescZMax = RealFirst();
1679 for (Standard_Integer aStructIt = 1; aStructIt <= myDescendants.Length(); aStructIt++)
1681 Graphic3d_Structure* aStructure = (Graphic3d_Structure*) myDescendants.Value (aStructIt);
1682 aStructure->MinMaxValues (aXMin, aYMin, aZMin, aXMax, aYMax, aZMax);
1683 aDescXMin = Min (aXMin, aDescXMin);
1684 aDescYMin = Min (aYMin, aDescYMin);
1685 aDescZMin = Min (aZMin, aDescZMin);
1686 aDescXMax = Max (aXMax, aDescXMax);
1687 aDescYMax = Max (aYMax, aDescYMax);
1688 aDescZMax = Max (aZMax, aDescZMax);
1691 if (aDescXMin != RealLast() || aDescYMin != RealLast() ||
1692 aDescZMin != RealLast() || aDescXMax != RealFirst() ||
1693 aDescYMax != RealFirst() || aDescZMax != RealFirst())
1695 aXMin = Min (aDescXMin, aXMin);
1696 aYMin = Min (aDescYMin, aYMin);
1697 aZMin = Min (aDescZMin, aZMin);
1698 aXMax = Max (aDescXMax, aXMax);
1699 aYMax = Max (aDescYMax, aYMax);
1700 aZMax = Max (aDescZMax, aZMax);
1703 // Case impossible as it would mean that the structure is empty or infinite
1704 if (aXMin == RealFirst() && aYMin == RealFirst() && aZMin == RealFirst() &&
1705 aXMax == RealLast() && aYMax == RealLast() && aZMax == RealLast())
1707 theXMin = RealFirst();
1708 theYMin = RealFirst();
1709 theZMin = RealFirst();
1710 theXMax = RealLast();
1711 theYMax = RealLast();
1712 theZMax = RealLast();
1716 TColStd_Array2OfReal aTrsf(0, 3, 0, 3);
1718 TransformBoundaries (aTrsf, aXMin, aYMin, aZMin, aXMax, aYMax, aZMax);
1727 //=============================================================================
1728 //function : Identification
1730 //=============================================================================
1731 Standard_Integer Graphic3d_Structure::Identification() const
1733 return myCStructure->Id;
1736 //=============================================================================
1737 //function : SetTransformPersistence
1739 //=============================================================================
1740 void Graphic3d_Structure::SetTransformPersistence (const Graphic3d_TransModeFlags& theFlag)
1742 SetTransformPersistence (theFlag, gp_Pnt (0.0, 0.0, 0.0));
1745 //=============================================================================
1746 //function : SetTransformPersistence
1748 //=============================================================================
1749 void Graphic3d_Structure::SetTransformPersistence (const Graphic3d_TransModeFlags& theFlag,
1750 const gp_Pnt& thePoint)
1752 if (IsDeleted()) return;
1754 myCStructure->TransformPersistence.Flag = theFlag;
1755 myCStructure->TransformPersistence.Point.x = float (thePoint.X());
1756 myCStructure->TransformPersistence.Point.y = float (thePoint.Y());
1757 myCStructure->TransformPersistence.Point.z = float (thePoint.Z());
1758 myCStructure->UpdateAspects();
1760 myCStructure->TransformPersistence.IsSet = 1;
1763 //=============================================================================
1764 //function : TransformPersistenceMode
1766 //=============================================================================
1767 Graphic3d_TransModeFlags Graphic3d_Structure::TransformPersistenceMode() const
1769 return myCStructure->TransformPersistence.Flag;
1772 //=============================================================================
1773 //function : TransformPersistencePoint
1775 //=============================================================================
1776 gp_Pnt Graphic3d_Structure::TransformPersistencePoint() const
1778 gp_Pnt aPnt (0.0, 0.0, 0.0);
1779 aPnt.SetX (myCStructure->TransformPersistence.Point.x);
1780 aPnt.SetY (myCStructure->TransformPersistence.Point.y);
1781 aPnt.SetZ (myCStructure->TransformPersistence.Point.z);
1785 //=============================================================================
1788 //=============================================================================
1789 void Graphic3d_Structure::Add (const Handle(Graphic3d_Group)& theGroup)
1791 // Method called only by the constructor of Graphic3d_Group
1792 // It is easy to check presence of <theGroup> in sequence myGroups.
1793 myGroups.Append (theGroup);
1796 //=============================================================================
1799 //=============================================================================
1800 void Graphic3d_Structure::Remove (const Standard_Address thePtr,
1801 const Graphic3d_TypeOfConnection theType)
1805 case Graphic3d_TOC_DESCENDANT:
1807 const Standard_Integer aNbDesc = myDescendants.Length();
1808 for (Standard_Integer anIter = 1; anIter <= aNbDesc; ++anIter)
1810 if (myDescendants.Value (anIter) == thePtr)
1812 myDescendants.Remove (anIter);
1818 case Graphic3d_TOC_ANCESTOR:
1820 const Standard_Integer aNbAncestors = myAncestors.Length();
1821 for (Standard_Integer anIter = 1; anIter <= aNbAncestors; ++anIter)
1823 if (myAncestors.Value (anIter) == thePtr)
1825 myAncestors.Remove (anIter);
1834 //=============================================================================
1837 //=============================================================================
1838 void Graphic3d_Structure::Remove (const Handle(Graphic3d_Group)& theGroup)
1840 const Standard_Integer aNbGroups = myGroups.Length();
1841 for (Standard_Integer aGrpIter = 1; aGrpIter <= aNbGroups; ++aGrpIter)
1843 if (myGroups.Value (aGrpIter) == theGroup)
1845 myGroups.Remove (aGrpIter);
1851 //=============================================================================
1852 //function : StructureManager
1854 //=============================================================================
1855 Handle(Graphic3d_StructureManager) Graphic3d_Structure::StructureManager() const
1857 return myStructureManager;
1860 //=============================================================================
1861 //function : MinMaxCoord
1863 //=============================================================================
1864 void Graphic3d_Structure::MinMaxCoord (Standard_Real& theXMin,
1865 Standard_Real& theYMin,
1866 Standard_Real& theZMin,
1867 Standard_Real& theXMax,
1868 Standard_Real& theYMax,
1869 Standard_Real& theZMax) const
1873 theXMin = RealFirst();
1874 theYMin = RealFirst();
1875 theZMin = RealFirst();
1876 theXMax = RealLast();
1877 theYMax = RealLast();
1878 theZMax = RealLast();
1882 Standard_Real aXMin = RealLast();
1883 Standard_Real aYMin = RealLast();
1884 Standard_Real aZMin = RealLast();
1885 Standard_Real aXMax = RealFirst();
1886 Standard_Real aYMax = RealFirst();
1887 Standard_Real aZMax = RealFirst();
1888 Standard_Real aGroupXMin, aGroupYMin, aGroupZMin, aGroupXMax, aGroupYMax, aGroupZMax;
1889 for (Standard_Integer aGroupIt = 1; aGroupIt <= myGroups.Length(); aGroupIt++)
1891 const Handle(Graphic3d_Group)& aGroup = myGroups.Value (aGroupIt);
1893 if (aGroup->IsEmpty())
1898 aGroup->MinMaxValues (aGroupXMin, aGroupYMin, aGroupZMin, aGroupXMax, aGroupYMax, aGroupZMax);
1899 aXMin = Min (aXMin, aGroupXMin);
1900 aYMin = Min (aYMin, aGroupYMin);
1901 aZMin = Min (aZMin, aGroupZMin);
1902 aXMax = Max (aXMax, aGroupXMax);
1903 aYMax = Max (aYMax, aGroupYMax);
1904 aZMax = Max (aZMax, aGroupZMax);
1907 // Case impossible as it would mean that the structure is empty
1908 if (aXMin == RealLast() && aYMin == RealLast() && aZMin == RealLast() &&
1909 aXMax == RealFirst() && aYMax == RealFirst() && aZMax == RealFirst())
1911 theXMin = RealFirst();
1912 theYMin = RealFirst();
1913 theZMin = RealFirst();
1914 theXMax = RealLast();
1915 theYMax = RealLast();
1916 theZMax = RealLast();
1927 //=============================================================================
1928 //function : MinMaxCoordWithDescendants
1930 //=============================================================================
1931 void Graphic3d_Structure::MinMaxCoordWithDescendants (Standard_Real& theXMin,
1932 Standard_Real& theYMin,
1933 Standard_Real& theZMin,
1934 Standard_Real& theXMax,
1935 Standard_Real& theYMax,
1936 Standard_Real& theZMax) const
1940 theXMin = RealFirst();
1941 theYMin = RealFirst();
1942 theZMin = RealFirst();
1943 theXMax = RealLast();
1944 theYMax = RealLast();
1945 theZMax = RealLast();
1949 Standard_Real aXMin, aYMin, aZMin, aXMax, aYMax, aZMax;
1950 MinMaxCoord (aXMin, aYMin, aZMin, aXMax, aYMax, aZMax);
1952 // Min-Max of the descendant structures
1953 Standard_Real aDescXMin = RealLast();
1954 Standard_Real aDescYMin = RealLast();
1955 Standard_Real aDescZMin = RealLast();
1956 Standard_Real aDescXMax = RealFirst();
1957 Standard_Real aDescYMax = RealFirst();
1958 Standard_Real aDescZMax = RealFirst();
1959 for (Standard_Integer aStructIt = 1; aStructIt <= myDescendants.Length(); aStructIt++)
1961 Graphic3d_Structure* aStructure = (Graphic3d_Structure*) myDescendants.Value (aStructIt);
1962 if (aStructure->IsEmpty())
1967 aStructure->MinMaxCoordWithDescendants (aXMin, aYMin, aZMin, aXMax, aYMax, aZMax);
1968 aDescXMin = Min (aXMin, aDescXMin);
1969 aDescYMin = Min (aYMin, aDescYMin);
1970 aDescZMin = Min (aZMin, aDescZMin);
1971 aDescXMax = Max (aXMax, aDescXMax);
1972 aDescYMax = Max (aYMax, aDescYMax);
1973 aDescZMax = Max (aZMax, aDescZMax);
1976 if (aDescXMin != RealLast() || aDescYMin != RealLast() ||
1977 aDescZMin != RealLast() || aDescXMax != RealFirst() ||
1978 aDescYMax != RealFirst() || aDescZMax != RealFirst())
1980 TColStd_Array2OfReal aTrsf(0, 3, 0, 3);
1982 TransformBoundaries (aTrsf, aDescXMin, aDescYMin, aDescZMin, aDescXMax, aDescYMax, aDescZMax);
1984 aXMin = Min (aDescXMin, aXMin);
1985 aYMin = Min (aDescYMin, aYMin);
1986 aZMin = Min (aDescZMin, aZMin);
1987 aXMax = Max (aDescXMax, aXMax);
1988 aYMax = Max (aDescYMax, aYMax);
1989 aZMax = Max (aDescZMax, aZMax);
1992 // Case impossible as it would mean that the structure is empty
1993 if (aXMin == RealLast() && aYMin == RealLast() && aZMin == RealLast() &&
1994 aXMax == RealFirst() && aYMax == RealFirst() && aZMax == RealFirst())
1996 theXMin = RealFirst();
1997 theYMin = RealFirst();
1998 theZMin = RealFirst();
1999 theXMax = RealLast();
2000 theYMax = RealLast();
2001 theZMax = RealLast();
2012 //=============================================================================
2013 //function : Transforms
2015 //=============================================================================
2016 void Graphic3d_Structure::Transforms (const TColStd_Array2OfReal& theTrsf,
2017 const Standard_Real theX, const Standard_Real theY, const Standard_Real theZ,
2018 Standard_Real& theNewX, Standard_Real& theNewY, Standard_Real& theNewZ)
2020 const Standard_Real aRL = RealLast();
2021 const Standard_Real aRF = RealFirst();
2022 if ((theX == aRF) || (theY == aRF) || (theZ == aRF)
2023 || (theX == aRL) || (theY == aRL) || (theZ == aRL))
2031 Standard_Real A, B, C, D;
2036 theNewX = A * theX + B * theY + C * theZ + D;
2041 theNewY = A * theX + B * theY + C * theZ + D;
2046 theNewZ = A * theX + B * theY + C * theZ + D;
2050 //=============================================================================
2051 //function : Transforms
2053 //=============================================================================
2054 Graphic3d_Vector Graphic3d_Structure::Transforms (const TColStd_Array2OfReal& theTrsf,
2055 const Graphic3d_Vector& theCoord)
2057 Standard_Real anXYZ[3];
2058 Graphic3d_Structure::Transforms (theTrsf,
2059 theCoord.X(), theCoord.Y(), theCoord.Z(),
2060 anXYZ[0], anXYZ[1], anXYZ[2]);
2061 return Graphic3d_Vector (anXYZ[0], anXYZ[1], anXYZ[2]);
2064 //=============================================================================
2065 //function : Transforms
2067 //=============================================================================
2068 Graphic3d_Vertex Graphic3d_Structure::Transforms (const TColStd_Array2OfReal& theTrsf,
2069 const Graphic3d_Vertex& theCoord)
2071 Standard_Real anXYZ[3];
2072 Graphic3d_Structure::Transforms (theTrsf,
2073 theCoord.X(), theCoord.Y(), theCoord.Z(),
2074 anXYZ[0], anXYZ[1], anXYZ[2]);
2075 return Graphic3d_Vertex (anXYZ[0], anXYZ[1], anXYZ[2]);
2078 //=============================================================================
2079 //function : Transforms
2081 //=============================================================================
2082 void Graphic3d_Structure::TransformBoundaries (const TColStd_Array2OfReal& theTrsf,
2083 Standard_Real& theXMin,
2084 Standard_Real& theYMin,
2085 Standard_Real& theZMin,
2086 Standard_Real& theXMax,
2087 Standard_Real& theYMax,
2088 Standard_Real& theZMax)
2090 Standard_Real aXMin, aYMin, aZMin, aXMax, aYMax, aZMax, anU, aV, aW;
2092 Graphic3d_Structure::Transforms (theTrsf, theXMin, theYMin, theZMin, aXMin, aYMin, aZMin);
2093 Graphic3d_Structure::Transforms (theTrsf, theXMax, theYMax, theZMax, aXMax, aYMax, aZMax);
2095 Graphic3d_Structure::Transforms (theTrsf, theXMin, theYMin, theZMax, anU, aV, aW);
2096 aXMin = Min (anU, aXMin); aXMax = Max (anU, aXMax);
2097 aYMin = Min (aV, aYMin); aYMax = Max (aV, aYMax);
2098 aZMin = Min (aW, aZMin); aZMax = Max (aW, aZMax);
2100 Graphic3d_Structure::Transforms (theTrsf, theXMax, theYMin, theZMax, anU, aV, aW);
2101 aXMin = Min (anU, aXMin); aXMax = Max (anU, aXMax);
2102 aYMin = Min (aV, aYMin); aYMax = Max (aV, aYMax);
2103 aZMin = Min (aW, aZMin); aZMax = Max (aW, aZMax);
2105 Graphic3d_Structure::Transforms (theTrsf, theXMax, theYMin, theZMin, anU, aV, aW);
2106 aXMin = Min (anU, aXMin); aXMax = Max (anU, aXMax);
2107 aYMin = Min (aV, aYMin); aYMax = Max (aV, aYMax);
2108 aZMin = Min (aW, aZMin); aZMax = Max (aW, aZMax);
2110 Graphic3d_Structure::Transforms (theTrsf, theXMax, theYMax, theZMin, anU, aV, aW);
2111 aXMin = Min (anU, aXMin); aXMax = Max (anU, aXMax);
2112 aYMin = Min (aV, aYMin); aYMax = Max (aV, aYMax);
2113 aZMin = Min (aW, aZMin); aZMax = Max (aW, aZMax);
2115 Graphic3d_Structure::Transforms (theTrsf, theXMin, theYMax, theZMax, anU, aV, aW);
2116 aXMin = Min (anU, aXMin); aXMax = Max (anU, aXMax);
2117 aYMin = Min (aV, aYMin); aYMax = Max (aV, aYMax);
2118 aZMin = Min (aW, aZMin); aZMax = Max (aW, aZMax);
2120 Graphic3d_Structure::Transforms (theTrsf, theXMin, theYMax, theZMin, anU, aV, aW);
2121 aXMin = Min (anU, aXMin); aXMax = Max (anU, aXMax);
2122 aYMin = Min (aV, aYMin); aYMax = Max (aV, aYMax);
2123 aZMin = Min (aW, aZMin); aZMax = Max (aW, aZMax);
2133 //=============================================================================
2134 //function : Network
2136 //=============================================================================
2137 void Graphic3d_Structure::Network (const Handle(Graphic3d_Structure)& theStructure,
2138 const Graphic3d_TypeOfConnection theType,
2139 Graphic3d_MapOfStructure& theSet)
2141 Graphic3d_MapOfStructure aSetD, aSetA;
2142 theStructure->Descendants (aSetD);
2143 theStructure->Ancestors (aSetA);
2144 theSet.Add (theStructure);
2147 case Graphic3d_TOC_DESCENDANT:
2148 for (Graphic3d_MapIteratorOfMapOfStructure anIter (aSetD); anIter.More(); anIter.Next())
2150 Graphic3d_Structure::Network (anIter.Key(), theType, theSet);
2153 case Graphic3d_TOC_ANCESTOR:
2154 for (Graphic3d_MapIteratorOfMapOfStructure anIter (aSetA); anIter.More(); anIter.Next())
2156 Graphic3d_Structure::Network (anIter.Key (), theType, theSet);
2162 //=============================================================================
2163 //function : PrintNetwork
2165 //=============================================================================
2166 void Graphic3d_Structure::PrintNetwork (const Handle(Graphic3d_Structure)& theStructure,
2167 const Graphic3d_TypeOfConnection theType)
2169 Graphic3d_MapOfStructure aSet;
2170 Graphic3d_Structure::Network (theStructure, theType, aSet);
2171 for (Graphic3d_MapIteratorOfMapOfStructure anIter (aSet); anIter.More(); anIter.Next())
2173 std::cout << "\tIdent " << (anIter.Key())->Identification () << "\n";
2175 std::cout << std::flush;
2178 //=============================================================================
2181 //=============================================================================
2182 void Graphic3d_Structure::Update() const
2189 if (myStructureManager->UpdateMode() == Aspect_TOU_ASAP)
2191 myStructureManager->Update();
2195 //=============================================================================
2196 //function : UpdateStructure
2198 //=============================================================================
2199 void Graphic3d_Structure::UpdateStructure (const Handle(Graphic3d_AspectLine3d)& theAspLine,
2200 const Handle(Graphic3d_AspectText3d)& theAspText,
2201 const Handle(Graphic3d_AspectMarker3d)& theAspMarker,
2202 const Handle(Graphic3d_AspectFillArea3d)& theAspFill)
2204 Standard_CString aFont;
2205 Standard_Real aSpace, anExpansion, aWidth, aScale;
2206 Quantity_Color aColor, anIntColor, aBackIntColor, anEdgeColor, aColorSub;
2207 Aspect_TypeOfLine aLType;
2208 Aspect_TypeOfMarker aMType;
2209 Aspect_InteriorStyle aStyle;
2210 Aspect_TypeOfStyleText aStyleT;
2211 Aspect_TypeOfDisplayText aDisplayType;
2212 Standard_Boolean aTextZoomable;
2213 Standard_Real aTextAngle;
2214 Font_FontAspect aTextFontAspect;
2216 theAspLine->Values (aColor, aLType, aWidth);
2217 myCStructure->ContextLine.Color.r = float (aColor.Red());
2218 myCStructure->ContextLine.Color.g = float (aColor.Green());
2219 myCStructure->ContextLine.Color.b = float (aColor.Blue());
2220 myCStructure->ContextLine.LineType = aLType;
2221 myCStructure->ContextLine.Width = float (aWidth);
2222 myCStructure->ContextLine.ShaderProgram = theAspLine->ShaderProgram();
2224 theAspMarker->Values (aColor, aMType, aScale);
2225 myCStructure->ContextMarker.Color.r = float (aColor.Red());
2226 myCStructure->ContextMarker.Color.g = float (aColor.Green());
2227 myCStructure->ContextMarker.Color.b = float (aColor.Blue());
2228 myCStructure->ContextMarker.MarkerType = aMType;
2229 myCStructure->ContextMarker.Scale = float (aScale);
2230 myCStructure->ContextMarker.ShaderProgram = theAspMarker->ShaderProgram();
2232 theAspText->Values (aColor, aFont, anExpansion, aSpace, aStyleT, aDisplayType, aColorSub, aTextZoomable, aTextAngle, aTextFontAspect);
2233 myCStructure->ContextText.Color.r = float (aColor.Red());
2234 myCStructure->ContextText.Color.g = float (aColor.Green());
2235 myCStructure->ContextText.Color.b = float (aColor.Blue());
2236 myCStructure->ContextText.Font = aFont;
2237 myCStructure->ContextText.Expan = float (anExpansion);
2238 myCStructure->ContextText.Style = aStyleT;
2239 myCStructure->ContextText.DisplayType = aDisplayType;
2240 myCStructure->ContextText.Space = float (aSpace);
2241 myCStructure->ContextText.ColorSubTitle.r = float (aColorSub.Red());
2242 myCStructure->ContextText.ColorSubTitle.g = float (aColorSub.Green());
2243 myCStructure->ContextText.ColorSubTitle.b = float (aColorSub.Blue());
2244 myCStructure->ContextText.TextZoomable = aTextZoomable;
2245 myCStructure->ContextText.TextAngle = float (aTextAngle);
2246 myCStructure->ContextText.TextFontAspect = aTextFontAspect;
2247 myCStructure->ContextText.ShaderProgram = theAspText->ShaderProgram();
2249 Standard_Real anRGB[3];
2250 theAspFill->Values (aStyle, anIntColor, aBackIntColor, anEdgeColor, aLType, aWidth);
2251 anIntColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
2252 myCStructure->ContextFillArea.Style = aStyle;
2253 myCStructure->ContextFillArea.IntColor.r = float (anRGB[0]);
2254 myCStructure->ContextFillArea.IntColor.g = float (anRGB[1]);
2255 myCStructure->ContextFillArea.IntColor.b = float (anRGB[2]);
2257 if (theAspFill->Distinguish())
2259 aBackIntColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
2261 myCStructure->ContextFillArea.BackIntColor.r = float (anRGB[0]);
2262 myCStructure->ContextFillArea.BackIntColor.g = float (anRGB[1]);
2263 myCStructure->ContextFillArea.BackIntColor.b = float (anRGB[2]);
2266 myCStructure->ContextFillArea.Edge = theAspFill->Edge () ? 1:0;
2267 myCStructure->ContextFillArea.EdgeColor.r = float (anEdgeColor.Red());
2268 myCStructure->ContextFillArea.EdgeColor.g = float (anEdgeColor.Green());
2269 myCStructure->ContextFillArea.EdgeColor.b = float (anEdgeColor.Blue());
2270 myCStructure->ContextFillArea.LineType = aLType;
2271 myCStructure->ContextFillArea.Width = float (aWidth);
2272 myCStructure->ContextFillArea.Hatch = theAspFill->HatchStyle();
2274 // Front and Back face
2275 myCStructure->ContextFillArea.Distinguish = theAspFill->Distinguish() ? 1 : 0;
2276 myCStructure->ContextFillArea.BackFace = theAspFill->BackFace() ? 1 : 0;
2278 const Graphic3d_MaterialAspect& aBack = theAspFill->BackMaterial();
2279 // Light specificity
2280 myCStructure->ContextFillArea.Back.Shininess = float (aBack.Shininess());
2281 myCStructure->ContextFillArea.Back.Ambient = float (aBack.Ambient());
2282 myCStructure->ContextFillArea.Back.Diffuse = float (aBack.Diffuse());
2283 myCStructure->ContextFillArea.Back.Specular = float (aBack.Specular());
2284 myCStructure->ContextFillArea.Back.Transparency = float (aBack.Transparency());
2285 myCStructure->ContextFillArea.Back.Emission = float (aBack.Emissive());
2288 myCStructure->ContextFillArea.Back.IsAmbient = (aBack.ReflectionMode (Graphic3d_TOR_AMBIENT) ? 1 : 0);
2289 myCStructure->ContextFillArea.Back.IsDiffuse = (aBack.ReflectionMode (Graphic3d_TOR_DIFFUSE) ? 1 : 0);
2290 myCStructure->ContextFillArea.Back.IsSpecular = (aBack.ReflectionMode (Graphic3d_TOR_SPECULAR) ? 1 : 0);
2291 myCStructure->ContextFillArea.Back.IsEmission = (aBack.ReflectionMode (Graphic3d_TOR_EMISSION) ? 1 : 0);
2294 myCStructure->ContextFillArea.Back.IsPhysic = (aBack.MaterialType (Graphic3d_MATERIAL_PHYSIC) ? 1 : 0);
2297 myCStructure->ContextFillArea.Back.ColorSpec.r = float (aBack.SpecularColor().Red());
2298 myCStructure->ContextFillArea.Back.ColorSpec.g = float (aBack.SpecularColor().Green());
2299 myCStructure->ContextFillArea.Back.ColorSpec.b = float (aBack.SpecularColor().Blue());
2302 myCStructure->ContextFillArea.Back.ColorAmb.r = float (aBack.AmbientColor().Red());
2303 myCStructure->ContextFillArea.Back.ColorAmb.g = float (aBack.AmbientColor().Green());
2304 myCStructure->ContextFillArea.Back.ColorAmb.b = float (aBack.AmbientColor().Blue());
2307 myCStructure->ContextFillArea.Back.ColorDif.r = float (aBack.DiffuseColor().Red());
2308 myCStructure->ContextFillArea.Back.ColorDif.g = float (aBack.DiffuseColor().Green());
2309 myCStructure->ContextFillArea.Back.ColorDif.b = float (aBack.DiffuseColor().Blue());
2312 myCStructure->ContextFillArea.Back.ColorEms.r = float (aBack.EmissiveColor().Red());
2313 myCStructure->ContextFillArea.Back.ColorEms.g = float (aBack.EmissiveColor().Green());
2314 myCStructure->ContextFillArea.Back.ColorEms.b = float (aBack.EmissiveColor().Blue());
2316 myCStructure->ContextFillArea.Back.EnvReflexion = float (aBack.EnvReflexion());
2319 const Graphic3d_MaterialAspect& aFront = theAspFill->FrontMaterial();
2320 // Light specificity
2321 myCStructure->ContextFillArea.Front.Shininess = float (aFront.Shininess());
2322 myCStructure->ContextFillArea.Front.Ambient = float (aFront.Ambient());
2323 myCStructure->ContextFillArea.Front.Diffuse = float (aFront.Diffuse());
2324 myCStructure->ContextFillArea.Front.Specular = float (aFront.Specular());
2325 myCStructure->ContextFillArea.Front.Transparency = float (aFront.Transparency());
2326 myCStructure->ContextFillArea.Front.Emission = float (aFront.Emissive());
2329 myCStructure->ContextFillArea.Front.IsAmbient = (aFront.ReflectionMode (Graphic3d_TOR_AMBIENT) ? 1 : 0);
2330 myCStructure->ContextFillArea.Front.IsDiffuse = (aFront.ReflectionMode (Graphic3d_TOR_DIFFUSE) ? 1 : 0);
2331 myCStructure->ContextFillArea.Front.IsSpecular = (aFront.ReflectionMode (Graphic3d_TOR_SPECULAR) ? 1 : 0);
2332 myCStructure->ContextFillArea.Front.IsEmission = (aFront.ReflectionMode (Graphic3d_TOR_EMISSION) ? 1 : 0);
2335 myCStructure->ContextFillArea.Front.IsPhysic = (aFront.MaterialType (Graphic3d_MATERIAL_PHYSIC) ? 1 : 0);
2338 myCStructure->ContextFillArea.Front.ColorSpec.r = float (aFront.SpecularColor().Red());
2339 myCStructure->ContextFillArea.Front.ColorSpec.g = float (aFront.SpecularColor().Green());
2340 myCStructure->ContextFillArea.Front.ColorSpec.b = float (aFront.SpecularColor().Blue());
2343 myCStructure->ContextFillArea.Front.ColorAmb.r = float (aFront.AmbientColor().Red());
2344 myCStructure->ContextFillArea.Front.ColorAmb.g = float (aFront.AmbientColor().Green());
2345 myCStructure->ContextFillArea.Front.ColorAmb.b = float (aFront.AmbientColor().Blue());
2348 myCStructure->ContextFillArea.Front.ColorDif.r = float (aFront.DiffuseColor().Red());
2349 myCStructure->ContextFillArea.Front.ColorDif.g = float (aFront.DiffuseColor().Green());
2350 myCStructure->ContextFillArea.Front.ColorDif.b = float (aFront.DiffuseColor().Blue());
2353 myCStructure->ContextFillArea.Front.ColorEms.r = float (aFront.EmissiveColor().Red());
2354 myCStructure->ContextFillArea.Front.ColorEms.g = float (aFront.EmissiveColor().Green());
2355 myCStructure->ContextFillArea.Front.ColorEms.b = float (aFront.EmissiveColor().Blue());
2357 myCStructure->ContextFillArea.Front.EnvReflexion = float (aFront.EnvReflexion());
2359 myCStructure->ContextFillArea.Texture.TextureMap = theAspFill->TextureMap();
2360 myCStructure->ContextFillArea.Texture.doTextureMap = theAspFill->TextureMapState() ? 1 : 0;
2361 myCStructure->ContextFillArea.ShaderProgram = theAspFill->ShaderProgram();
2363 Standard_Integer aPolyMode;
2364 Standard_ShortReal aPolyFactor, aPolyUnits;
2365 theAspFill->PolygonOffsets (aPolyMode, aPolyFactor, aPolyUnits);
2366 myCStructure->ContextFillArea.PolygonOffsetMode = aPolyMode;
2367 myCStructure->ContextFillArea.PolygonOffsetFactor = aPolyFactor;
2368 myCStructure->ContextFillArea.PolygonOffsetUnits = aPolyUnits;
2371 //=============================================================================
2372 //function : GraphicHighlight
2374 //=============================================================================
2375 void Graphic3d_Structure::GraphicHighlight (const Aspect_TypeOfHighlightMethod theMethod)
2377 Standard_Real anRGB[3];
2378 myCStructure->highlight = 1;
2379 myHighlightMethod = theMethod;
2382 case Aspect_TOHM_COLOR:
2384 myHighlightColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
2385 myCStructure->HighlightWithColor (Graphic3d_Vec3 (float (anRGB[0]), float (anRGB[1]), float (anRGB[2])), Standard_True);
2386 myCStructure->UpdateNamedStatus();
2389 case Aspect_TOHM_BOUNDBOX:
2391 Standard_Real XMin, YMin, ZMin, XMax, YMax, ZMax;
2392 if (IsEmpty() || IsInfinite())
2394 // Empty or infinite structure
2395 XMin = YMin = ZMin = 0.0;
2396 XMax = YMax = ZMax = 0.0;
2400 MinMaxCoordWithDescendants (XMin, YMin, ZMin, XMax, YMax, ZMax);
2402 myCStructure->BoundBox.Pmin.x = float (XMin);
2403 myCStructure->BoundBox.Pmin.y = float (YMin);
2404 myCStructure->BoundBox.Pmin.z = float (ZMin);
2405 myCStructure->BoundBox.Pmax.x = float (XMax);
2406 myCStructure->BoundBox.Pmax.y = float (YMax);
2407 myCStructure->BoundBox.Pmax.z = float (ZMax);
2408 myHighlightColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
2409 myCStructure->BoundBox.Color.r = float (anRGB[0]);
2410 myCStructure->BoundBox.Color.g = float (anRGB[1]);
2411 myCStructure->BoundBox.Color.b = float (anRGB[2]);
2412 myCStructure->HighlightWithBndBox (Standard_True);
2418 //=============================================================================
2419 //function : GraphicTransform
2421 //=============================================================================
2422 void Graphic3d_Structure::GraphicTransform (const TColStd_Array2OfReal& theMatrix)
2424 for (Standard_Integer i = 0; i <= 3; ++i)
2426 for (Standard_Integer j = 0; j <= 3; ++j)
2428 myCStructure->Transformation[i][j] = float (theMatrix (i, j));
2431 myCStructure->UpdateTransformation();
2434 //=============================================================================
2435 //function : GraphicUnHighlight
2437 //=============================================================================
2438 void Graphic3d_Structure::GraphicUnHighlight()
2440 myCStructure->highlight = 0;
2441 switch (myHighlightMethod)
2443 case Aspect_TOHM_COLOR:
2444 myCStructure->HighlightWithColor (Graphic3d_Vec3 (0.0f, 0.0f, 0.0f), Standard_False);
2445 myCStructure->UpdateNamedStatus();
2447 case Aspect_TOHM_BOUNDBOX:
2448 myCStructure->HighlightWithBndBox (Standard_False);
2449 myCStructure->UpdateNamedStatus();
2454 //=============================================================================
2455 //function : ComputeVisual
2457 //=============================================================================
2458 Graphic3d_TypeOfStructure Graphic3d_Structure::ComputeVisual() const
2460 return myComputeVisual;
2463 //=============================================================================
2464 //function : SetComputeVisual
2466 //=============================================================================
2467 void Graphic3d_Structure::SetComputeVisual (const Graphic3d_TypeOfStructure theVisual)
2469 // The ComputeVisual is saved only if the structure is declared TOS_ALL, TOS_WIREFRAME or TOS_SHADING.
2470 // This declaration permits to calculate proper representation of the structure calculated by Compute instead of passage to TOS_COMPUTED.
2471 if (theVisual != Graphic3d_TOS_COMPUTED)
2473 myComputeVisual = theVisual;
2477 //=============================================================================
2480 //=============================================================================
2481 void Graphic3d_Structure::Plot (const Handle(Graphic3d_Plotter)& )
2486 //=============================================================================
2487 //function : SetHLRValidation
2489 //=============================================================================
2490 void Graphic3d_Structure::SetHLRValidation (const Standard_Boolean theFlag)
2492 myCStructure->HLRValidation = theFlag ? 1 : 0;
2495 //=============================================================================
2496 //function : HLRValidation
2498 //=============================================================================
2499 Standard_Boolean Graphic3d_Structure::HLRValidation() const
2501 // Hidden parts stored in <me> are valid if :
2502 // 1/ the owner is defined.
2503 // 2/ they are not invalid.
2504 return myOwner != NULL
2505 && myCStructure->HLRValidation != 0;
2508 //=======================================================================
2509 //function : CStructure
2511 //=======================================================================
2512 const Handle(Graphic3d_CStructure)& Graphic3d_Structure::CStructure() const
2514 return myCStructure;
2517 //=======================================================================
2518 //function : SetZLayer
2520 //=======================================================================
2521 void Graphic3d_Structure::SetZLayer (const Standard_Integer theLayerId)
2523 // if the structure is not displayed, unable to change its display layer
2527 myStructureManager->ChangeZLayer (this, theLayerId);
2530 //=======================================================================
2531 //function : GetZLayer
2533 //=======================================================================
2534 Standard_Integer Graphic3d_Structure::GetZLayer () const
2536 return myStructureManager->GetZLayer (this);
2539 //=======================================================================
2540 //function : SetClipPlanes
2542 //=======================================================================
2543 void Graphic3d_Structure::SetClipPlanes (const Graphic3d_SequenceOfHClipPlane& thePlanes)
2545 myCStructure->SetClipPlanes (thePlanes);
2548 //=======================================================================
2549 //function : GetClipPlanes
2551 //=======================================================================
2552 const Graphic3d_SequenceOfHClipPlane& Graphic3d_Structure::GetClipPlanes() const
2554 return myCStructure->ClipPlanes();