0024752: Visualization - inherit OpenGl_Group from Graphic3d_Group
[occt.git] / src / Graphic3d / Graphic3d_Structure.cxx
1 // Created by: NW,JPB,CAL
2 // Copyright (c) 1991-1999 Matra Datavision
3 // Copyright (c) 1999-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
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.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16 #include <Graphic3d_Structure.ixx>
17 #include <Graphic3d_Structure.pxx>
18
19 #include <Graphic3d_GraphicDriver.hxx>
20 #include <Graphic3d_MaterialAspect.hxx>
21
22 #include <Graphic3d_MapOfStructure.hxx>
23 #include <Graphic3d_MapIteratorOfMapOfStructure.hxx>
24
25 #include <Quantity_Color.hxx>
26 #include <TColStd_Array2OfReal.hxx>
27 #include <Graphic3d_TextureMap.hxx>
28
29 #include <Aspect_PolygonOffsetMode.hxx>
30
31 #include <stdio.h>
32
33 //=============================================================================
34 //function : Graphic3d_Structure
35 //purpose  :
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),
43   myOwner                 (NULL),
44   myVisual                (Graphic3d_TOS_ALL)
45 {
46   myCStructure = theManager->GraphicDriver()->Structure (theManager);
47
48   // default aspects
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);
55
56   // update the associated CStructure
57   UpdateStructure (aAspectLine3d, aAspectText3d, aAspectMarker3d, aAspectFillArea3d);
58 }
59
60 //=============================================================================
61 //function : Graphic3d_Structure
62 //purpose  :
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)
73 {
74   myCStructure = thePrs->myCStructure->ShadowLink (theManager);
75
76   // default aspects
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);
83
84   // update the associated CStructure
85   UpdateStructure (aAspectLine3d, aAspectText3d, aAspectMarker3d, aAspectFillArea3d);
86 }
87
88 //=============================================================================
89 //function : Destroy
90 //purpose  :
91 //=============================================================================
92 void Graphic3d_Structure::Destroy()
93 {
94   // as myFirstStructureManager can be already destroyed,
95   // avoid attempts to access it
96   myFirstStructureManager = NULL;
97   Remove();
98 }
99
100 //=============================================================================
101 //function : Clear
102 //purpose  :
103 //=============================================================================
104 void Graphic3d_Structure::Clear (const Standard_Boolean theWithDestruction)
105 {
106   if (IsDeleted()) return;
107
108   // clean groups in graphics driver at first
109   GraphicClear (theWithDestruction);
110
111   myCStructure->ContainsFacet = 0;
112   myStructureManager->Clear (this, theWithDestruction);
113
114   Update();
115 }
116
117 //=============================================================================
118 //function : Remove
119 //purpose  :
120 //=============================================================================
121 void Graphic3d_Structure::Remove()
122 {
123   if (IsDeleted()) return;
124
125   // clean groups in graphics driver at first; this is also should be done
126   // to avoid unwanted group cleaning in group's destructor
127   // Pass Standard_False to Clear(..) method to avoid updating in
128   // structure manager, it isn't necessary, besides of it structure manager
129   // could be already destroyed and invalid pointers used in structure;
130   for (Graphic3d_SequenceOfGroup::Iterator aGroupIter (myCStructure->Groups()); aGroupIter.More(); aGroupIter.Next())
131   {
132     aGroupIter.ChangeValue()->Clear (Standard_False);
133   }
134
135   Standard_Address APtr = (void *) this;
136   // It is necessary to remove the eventual pointer on the structure
137   // that can be destroyed, in the list of descendants
138   // of ancestors of this structure and in the list of ancestors
139   // of descendants of the same structure.
140
141   const Standard_Integer aNbDesc = myDescendants.Length();
142   for (Standard_Integer aStructIter = 1; aStructIter <= aNbDesc; ++aStructIter)
143   {
144     ((Graphic3d_Structure *)(myDescendants.ChangeValue (aStructIter)))->Remove (APtr, Graphic3d_TOC_ANCESTOR);
145   }
146
147   const Standard_Integer aNbAnces = myAncestors.Length();
148   for (Standard_Integer aStructIter = 1; aStructIter <= aNbAnces; ++aStructIter)
149   {
150     ((Graphic3d_Structure *)(myAncestors.ChangeValue (aStructIter)))->Remove (APtr, Graphic3d_TOC_DESCENDANT);
151   }
152
153   myCStructure->ContainsFacet = 0;
154
155   // Destruction of me in the graphic library
156   const Standard_Integer aStructId = myCStructure->Id;
157   myCStructure->GraphicDriver()->RemoveStructure (myCStructure);
158   myCStructure.Nullify();
159
160   // Liberation of the identification if the destroyed structure
161   // in the first manager that performs creation of the structure.
162   if (myFirstStructureManager != NULL)
163   {
164     myFirstStructureManager->Remove (aStructId);
165   }
166 }
167
168 //=============================================================================
169 //function : Display
170 //purpose  :
171 //=============================================================================
172 void Graphic3d_Structure::Display()
173 {
174   if (IsDeleted()) return;
175
176   if (!myCStructure->stick)
177   {
178     myCStructure->stick = 1;
179     myStructureManager->Display (this);
180   }
181
182   myCStructure->visible = 1;
183 }
184
185 //=============================================================================
186 //function : Display
187 //purpose  :
188 //=============================================================================
189 void Graphic3d_Structure::Display (const Standard_Integer thePriority)
190 {
191   if (IsDeleted()) return;
192
193   SetDisplayPriority (thePriority);
194
195   if (!myCStructure->stick)
196   {
197     myCStructure->stick = 1;
198     myStructureManager->Display (this);
199   }
200
201   myCStructure->visible = 1;
202 }
203
204 //=============================================================================
205 //function : SetDisplayPriority
206 //purpose  :
207 //=============================================================================
208 void Graphic3d_Structure::SetDisplayPriority (const Standard_Integer thePriority)
209 {
210   if (IsDeleted()
211    || thePriority == myCStructure->Priority)
212   {
213     return;
214   }
215
216   myCStructure->PreviousPriority = myCStructure->Priority;
217   myCStructure->Priority         = thePriority;
218
219   if (myCStructure->Priority != myCStructure->PreviousPriority)
220   {
221     Graphic3d_PriorityDefinitionError_Raise_if ((myCStructure->Priority > Structure_MAX_PRIORITY)
222                                              || (myCStructure->Priority < Structure_MIN_PRIORITY),
223                                                 "Bad value for StructurePriority");
224     if (myCStructure->stick)
225     {
226       myStructureManager->ChangeDisplayPriority (this, myCStructure->PreviousPriority, myCStructure->Priority);
227     }
228   }
229 }
230
231 //=============================================================================
232 //function : ResetDisplayPriority
233 //purpose  :
234 //=============================================================================
235 void Graphic3d_Structure::ResetDisplayPriority()
236 {
237   if (IsDeleted()
238    || myCStructure->Priority == myCStructure->PreviousPriority)
239   {
240     return;
241   }
242
243   const Standard_Integer aPriority = myCStructure->Priority;
244   myCStructure->Priority = myCStructure->PreviousPriority;
245   if (myCStructure->stick)
246   {
247     myStructureManager->ChangeDisplayPriority (this, aPriority, myCStructure->Priority);
248   }
249 }
250
251 //=============================================================================
252 //function : DisplayPriority
253 //purpose  :
254 //=============================================================================
255 Standard_Integer Graphic3d_Structure::DisplayPriority() const
256 {
257   return myCStructure->Priority;
258 }
259
260 //=============================================================================
261 //function : Erase
262 //purpose  :
263 //=============================================================================
264 void Graphic3d_Structure::Erase()
265 {
266   if (IsDeleted())
267   {
268     return;
269   }
270
271   if (myCStructure->stick)
272   {
273     myCStructure->stick = 0;
274     myStructureManager->Erase (this);
275   }
276 }
277
278 //=============================================================================
279 //function : Highlight
280 //purpose  :
281 //=============================================================================
282 void Graphic3d_Structure::Highlight (const Aspect_TypeOfHighlightMethod theMethod)
283 {
284   if (IsDeleted())
285   {
286     return;
287   }
288
289   // Highlight on already Highlighted structure.
290   if (myCStructure->highlight)
291   {
292     Aspect_TypeOfUpdate anUpdateMode = myStructureManager->UpdateMode();
293     if (anUpdateMode == Aspect_TOU_WAIT)
294     {
295       UnHighlight();
296     }
297     else
298     {
299       // To avoid call of method : Update()
300       // Not useful and can be costly.
301       myStructureManager->SetUpdateMode (Aspect_TOU_WAIT);
302       UnHighlight();
303       myStructureManager->SetUpdateMode (anUpdateMode);
304     }
305   }
306
307   SetDisplayPriority (Structure_MAX_PRIORITY - 1);
308
309   GraphicHighlight (theMethod);
310   if (myCStructure->stick)
311   {
312     myStructureManager->Highlight (this, theMethod);
313   }
314
315   Update();
316 }
317
318 //=============================================================================
319 //function : SetHighlightColor
320 //purpose  :
321 //=============================================================================
322 void Graphic3d_Structure::SetHighlightColor (const Quantity_Color& theColor)
323 {
324   if (IsDeleted())
325   {
326     return;
327   }
328
329   if (!myCStructure->highlight)
330   {
331     myHighlightColor = theColor;
332     return;
333   }
334
335   // Change highlight color on already Highlighted structure.
336   Aspect_TypeOfUpdate anUpdateMode  = myStructureManager->UpdateMode();
337   if (anUpdateMode == Aspect_TOU_WAIT)
338   {
339     UnHighlight();
340   }
341   else
342   {
343     // To avoid call of method : Update()
344     // Not useful and can be costly.
345     myStructureManager->SetUpdateMode (Aspect_TOU_WAIT);
346     UnHighlight();
347     myStructureManager->SetUpdateMode (anUpdateMode);
348   }
349   myHighlightColor = theColor;
350   Highlight (myHighlightMethod);
351 }
352
353 //=============================================================================
354 //function : SetVisible
355 //purpose  :
356 //=============================================================================
357 void Graphic3d_Structure::SetVisible (const Standard_Boolean theValue)
358 {
359   if (IsDeleted()) return;
360
361   myCStructure->visible = theValue ? 1 : 0;
362   myCStructure->UpdateNamedStatus();
363   Update();
364 }
365
366 //=============================================================================
367 //function : SetPick
368 //purpose  :
369 //=============================================================================
370 void Graphic3d_Structure::SetPick (const Standard_Boolean theValue)
371 {
372   if (IsDeleted ()) return;
373
374   myCStructure->pick = theValue ? 1 : 0;
375   myCStructure->UpdateNamedStatus();
376
377   if (theValue)
378   {
379     myStructureManager->Detectable (this);
380   }
381   else
382   {
383     myStructureManager->Undetectable (this);
384   }
385   Update();
386 }
387
388 //=============================================================================
389 //function : UnHighlight
390 //purpose  :
391 //=============================================================================
392 void Graphic3d_Structure::UnHighlight()
393 {
394   if (IsDeleted()) return;
395
396   if (myCStructure->highlight)
397   {
398     myCStructure->highlight = 0;
399
400     GraphicUnHighlight();
401     myStructureManager->UnHighlight (this);
402
403     ResetDisplayPriority();
404     Update();
405   }
406 }
407
408 //=============================================================================
409 //function : HighlightColor
410 //purpose  :
411 //=============================================================================
412 const Quantity_Color& Graphic3d_Structure::HighlightColor() const
413 {
414   return myHighlightColor;
415 }
416
417 //=============================================================================
418 //function : IsDisplayed
419 //purpose  :
420 //=============================================================================
421 Standard_Boolean Graphic3d_Structure::IsDisplayed() const
422 {
423   return myCStructure->stick ? Standard_True : Standard_False;
424 }
425
426 //=============================================================================
427 //function : IsDeleted
428 //purpose  :
429 //=============================================================================
430 Standard_Boolean Graphic3d_Structure::IsDeleted() const
431 {
432   return myCStructure.IsNull();
433 }
434
435 //=============================================================================
436 //function : IsHighlighted
437 //purpose  :
438 //=============================================================================
439 Standard_Boolean Graphic3d_Structure::IsHighlighted() const
440 {
441   return myCStructure->highlight ? Standard_True : Standard_False;
442 }
443
444 //=============================================================================
445 //function : IsSelectable
446 //purpose  :
447 //=============================================================================
448 Standard_Boolean Graphic3d_Structure::IsSelectable() const
449 {
450   return myCStructure->pick ? Standard_True : Standard_False;
451 }
452
453 //=============================================================================
454 //function : IsVisible
455 //purpose  :
456 //=============================================================================
457 Standard_Boolean Graphic3d_Structure::IsVisible() const
458 {
459   return myCStructure->visible ? Standard_True : Standard_False;
460 }
461
462 //=============================================================================
463 //function : IsRotated
464 //purpose  :
465 //=============================================================================
466 Standard_Boolean Graphic3d_Structure::IsRotated() const
467 {
468   // A somewhat light test !
469   return myCStructure->Transformation[0][1] != 0.0
470       || myCStructure->Transformation[0][2] != 0.0
471       || myCStructure->Transformation[1][0] != 0.0
472       || myCStructure->Transformation[1][2] != 0.0
473       || myCStructure->Transformation[2][0] != 0.0
474       || myCStructure->Transformation[2][1] != 0.0;
475 }
476
477 //=============================================================================
478 //function : IsTransformed
479 //purpose  :
480 //=============================================================================
481 Standard_Boolean Graphic3d_Structure::IsTransformed() const
482 {
483   Standard_Boolean aResult = Standard_False;
484   for (Standard_Integer i = 0; i <= 3 && !aResult; ++i)
485   {
486     for (Standard_Integer j = 0; j <= 3 && !aResult; ++j)
487     {
488       if (i == j)
489         aResult = myCStructure->Transformation[i][j] != 1.0;
490       else
491         aResult = myCStructure->Transformation[i][j] != 0.0;
492     }
493   }
494   return aResult;
495 }
496
497 //=============================================================================
498 //function : ContainsFacet
499 //purpose  :
500 //=============================================================================
501 Standard_Boolean Graphic3d_Structure::ContainsFacet() const
502 {
503   if (IsDeleted())
504   {
505     return Standard_False;
506   }
507   else if (myCStructure->ContainsFacet > 0)
508   {
509     // if one of groups contains at least one facet, the structure contains it too
510     return Standard_True;
511   }
512
513   // stop at the first descendant containing at least one facet
514   const Standard_Integer aNbDesc = myDescendants.Length();
515   for (Standard_Integer aStructIter = 1; aStructIter <= aNbDesc; ++aStructIter)
516   {
517     if (((const Graphic3d_Structure *)(myDescendants.Value (aStructIter)))->ContainsFacet())
518     {
519       return Standard_True;
520     }
521   }
522   return Standard_False;
523 }
524
525 //=============================================================================
526 //function : IsEmpty
527 //purpose  :
528 //=============================================================================
529 Standard_Boolean Graphic3d_Structure::IsEmpty() const
530 {
531   if (IsDeleted())
532   {
533     return Standard_True;
534   }
535
536   // structure is empty:
537   // - if all these groups are empty
538   // - or if all groups are empty and all their descendants are empty
539   // - or if all its descendants are empty
540   for (Graphic3d_SequenceOfGroup::Iterator aGroupIter (myCStructure->Groups()); aGroupIter.More(); aGroupIter.Next())
541   {
542     if (!aGroupIter.Value()->IsEmpty())
543     {
544       return Standard_False;
545     }
546   }
547
548   // stop at the first non-empty descendant
549   const Standard_Integer aNbDesc = myDescendants.Length();
550   for (Standard_Integer aDescIter = 1; aDescIter <= aNbDesc; ++aDescIter)
551   {
552     if (!((const Graphic3d_Structure* )(myDescendants.Value (aDescIter)))->IsEmpty())
553     {
554       return Standard_False;
555     }
556   }
557   return Standard_True;
558 }
559
560 //=============================================================================
561 //function : PrimitivesAspect
562 //purpose  :
563 //=============================================================================
564 void Graphic3d_Structure::PrimitivesAspect (Handle(Graphic3d_AspectLine3d)&     theAspLine,
565                                             Handle(Graphic3d_AspectText3d)&     theAspText,
566                                             Handle(Graphic3d_AspectMarker3d)&   theAspMarker,
567                                             Handle(Graphic3d_AspectFillArea3d)& theAspFill) const
568 {
569   theAspLine   = Line3dAspect();
570   theAspText   = Text3dAspect();
571   theAspMarker = Marker3dAspect();
572   theAspFill   = FillArea3dAspect();
573 }
574
575 //=============================================================================
576 //function : GroupsWithFacet
577 //purpose  :
578 //=============================================================================
579 void Graphic3d_Structure::GroupsWithFacet (const Standard_Integer theDelta)
580 {
581   myCStructure->ContainsFacet = myCStructure->ContainsFacet + theDelta;
582   if (myCStructure->ContainsFacet < 0)
583   {
584     myCStructure->ContainsFacet = 0;
585   }
586 }
587
588 //=============================================================================
589 //function : Compute
590 //purpose  :
591 //=============================================================================
592 void Graphic3d_Structure::Compute()
593 {
594   // Implemented by Presentation
595 }
596
597 //=============================================================================
598 //function : Compute
599 //purpose  :
600 //=============================================================================
601 Handle(Graphic3d_Structure) Graphic3d_Structure::Compute (const Handle(Graphic3d_DataStructureManager)& )
602 {
603   // Implemented by Presentation
604   return this;
605 }
606
607 //=============================================================================
608 //function : Compute
609 //purpose  :
610 //=============================================================================
611 Handle(Graphic3d_Structure) Graphic3d_Structure::Compute (const Handle(Graphic3d_DataStructureManager)& ,
612                                                           const TColStd_Array2OfReal& )
613 {
614   // Implemented by Presentation
615   return this;
616 }
617
618 //=============================================================================
619 //function : Compute
620 //purpose  :
621 //=============================================================================
622 void Graphic3d_Structure::Compute (const Handle(Graphic3d_DataStructureManager)& ,
623                                    Handle(Graphic3d_Structure)& )
624 {
625   // Implemented by Presentation
626 }
627
628 //=============================================================================
629 //function : Compute
630 //purpose  :
631 //=============================================================================
632 void Graphic3d_Structure::Compute (const Handle(Graphic3d_DataStructureManager)& ,
633                                    const TColStd_Array2OfReal& ,
634                                    Handle(Graphic3d_Structure)& )
635 {
636   // Implemented by Presentation
637 }
638
639 //=============================================================================
640 //function : ReCompute
641 //purpose  :
642 //=============================================================================
643 void Graphic3d_Structure::ReCompute()
644 {
645   myStructureManager->ReCompute (this);
646 }
647
648 //=============================================================================
649 //function : ReCompute
650 //purpose  :
651 //=============================================================================
652 void Graphic3d_Structure::ReCompute (const Handle(Graphic3d_DataStructureManager)& theProjector)
653 {
654   myStructureManager->ReCompute (this, theProjector);
655 }
656
657 //=============================================================================
658 //function : SetInfiniteState
659 //purpose  :
660 //=============================================================================
661 void Graphic3d_Structure::SetInfiniteState (const Standard_Boolean theToSet)
662 {
663   myCStructure->IsInfinite = theToSet ? 1 : 0;
664 }
665
666 //=============================================================================
667 //function : IsInfinite
668 //purpose  :
669 //=============================================================================
670 Standard_Boolean Graphic3d_Structure::IsInfinite() const
671 {
672   return IsDeleted()
673        || myCStructure->IsInfinite;
674 }
675
676 //=============================================================================
677 //function : GraphicClear
678 //purpose  :
679 //=============================================================================
680 void Graphic3d_Structure::GraphicClear (const Standard_Boolean theWithDestruction)
681 {
682   if (myCStructure.IsNull())
683   {
684     return;
685   }
686
687   // clean and empty each group
688   for (Graphic3d_SequenceOfGroup::Iterator aGroupIter (myCStructure->Groups()); aGroupIter.More(); aGroupIter.Next())
689   {
690     aGroupIter.ChangeValue()->Clear();
691   }
692   if (!theWithDestruction)
693   {
694     return;
695   }
696
697   while (!myCStructure->Groups().IsEmpty())
698   {
699     Handle(Graphic3d_Group) aGroup = myCStructure->Groups().First();
700     aGroup->Remove();
701   }
702   myCStructure->Clear();
703 }
704
705 //=============================================================================
706 //function : GraphicConnect
707 //purpose  :
708 //=============================================================================
709 void Graphic3d_Structure::GraphicConnect (const Handle(Graphic3d_Structure)& theDaughter)
710 {
711   myCStructure->Connect (*theDaughter->myCStructure);
712 }
713
714 //=============================================================================
715 //function : GraphicDisconnect
716 //purpose  :
717 //=============================================================================
718 void Graphic3d_Structure::GraphicDisconnect (const Handle(Graphic3d_Structure)& theDaughter)
719 {
720   myCStructure->Disconnect (*theDaughter->myCStructure);
721 }
722
723 //=============================================================================
724 //function : Line3dAspect
725 //purpose  :
726 //=============================================================================
727 Handle(Graphic3d_AspectLine3d) Graphic3d_Structure::Line3dAspect() const
728 {
729   const Standard_Real anRGB[3] =
730   {
731     Standard_Real (myCStructure->ContextLine.Color.r),
732     Standard_Real (myCStructure->ContextLine.Color.g),
733     Standard_Real (myCStructure->ContextLine.Color.b)
734   };
735   Quantity_Color aColor;
736   aColor.SetValues (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
737   Aspect_TypeOfLine aLType = Aspect_TypeOfLine (myCStructure->ContextLine.LineType);
738   Standard_Real     aWidth = Standard_Real     (myCStructure->ContextLine.Width);
739
740   Handle(Graphic3d_AspectLine3d) anAspLine = new Graphic3d_AspectLine3d (aColor, aLType, aWidth);
741   anAspLine->SetShaderProgram (myCStructure->ContextLine.ShaderProgram);
742   return anAspLine;
743 }
744
745 //=============================================================================
746 //function : Text3dAspect
747 //purpose  :
748 //=============================================================================
749 Handle(Graphic3d_AspectText3d) Graphic3d_Structure::Text3dAspect() const
750 {
751   const Standard_Real anRGB[3] =
752   {
753     Standard_Real (myCStructure->ContextText.Color.r),
754     Standard_Real (myCStructure->ContextText.Color.g),
755     Standard_Real (myCStructure->ContextText.Color.b)
756   };
757   Quantity_Color aColor;
758   aColor.SetValues (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
759   Standard_CString         aFont       = Standard_CString         (myCStructure->ContextText.Font);
760   Standard_Real            anExpansion = Standard_Real            (myCStructure->ContextText.Expan);
761   Standard_Real            aSpace      = Standard_Real            (myCStructure->ContextText.Space);
762   Aspect_TypeOfStyleText   aStyle      = Aspect_TypeOfStyleText   (myCStructure->ContextText.Style);
763   Aspect_TypeOfDisplayText aDispType   = Aspect_TypeOfDisplayText (myCStructure->ContextText.DisplayType);
764
765   Handle(Graphic3d_AspectText3d) anAspText = new Graphic3d_AspectText3d (aColor, aFont, anExpansion, aSpace, aStyle, aDispType);
766   anAspText->SetShaderProgram (myCStructure->ContextText.ShaderProgram);
767   return anAspText;
768 }
769
770 //=============================================================================
771 //function : Marker3dAspect
772 //purpose  :
773 //=============================================================================
774 Handle(Graphic3d_AspectMarker3d) Graphic3d_Structure::Marker3dAspect() const
775 {
776   const Standard_Real anRGB[3] =
777   {
778     Standard_Real (myCStructure->ContextMarker.Color.r),
779     Standard_Real (myCStructure->ContextMarker.Color.g),
780     Standard_Real (myCStructure->ContextMarker.Color.b)
781   };
782   Quantity_Color aColor;
783   aColor.SetValues (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
784   Aspect_TypeOfMarker aMType = myCStructure->ContextMarker.MarkerType;
785   Standard_Real       aScale = Standard_Real (myCStructure->ContextMarker.Scale);
786
787   Handle(Graphic3d_AspectMarker3d) anAspMarker = new Graphic3d_AspectMarker3d (aMType, aColor, aScale);
788   anAspMarker->SetShaderProgram (myCStructure->ContextMarker.ShaderProgram);
789   return anAspMarker;
790 }
791
792 //=============================================================================
793 //function : FillArea3dAspect
794 //purpose  :
795 //=============================================================================
796 Handle(Graphic3d_AspectFillArea3d) Graphic3d_Structure::FillArea3dAspect() const
797 {
798   // Back Material
799   Graphic3d_MaterialAspect aBack;
800   aBack.SetShininess    (Standard_Real (myCStructure->ContextFillArea.Back.Shininess));
801   aBack.SetAmbient      (Standard_Real (myCStructure->ContextFillArea.Back.Ambient));
802   aBack.SetDiffuse      (Standard_Real (myCStructure->ContextFillArea.Back.Diffuse));
803   aBack.SetSpecular     (Standard_Real (myCStructure->ContextFillArea.Back.Specular));
804   aBack.SetTransparency (Standard_Real (myCStructure->ContextFillArea.Back.Transparency));
805   aBack.SetEmissive     (Standard_Real (myCStructure->ContextFillArea.Back.Emission));
806   if (myCStructure->ContextFillArea.Back.IsAmbient == 1)
807     aBack.SetReflectionModeOn  (Graphic3d_TOR_AMBIENT);
808   else
809     aBack.SetReflectionModeOff (Graphic3d_TOR_AMBIENT);
810   if (myCStructure->ContextFillArea.Back.IsDiffuse == 1)
811     aBack.SetReflectionModeOn  (Graphic3d_TOR_DIFFUSE);
812   else
813     aBack.SetReflectionModeOff (Graphic3d_TOR_DIFFUSE);
814   if (myCStructure->ContextFillArea.Back.IsSpecular == 1)
815     aBack.SetReflectionModeOn  (Graphic3d_TOR_SPECULAR);
816   else
817     aBack.SetReflectionModeOff (Graphic3d_TOR_SPECULAR);
818   if (myCStructure->ContextFillArea.Back.IsEmission == 1)
819     aBack.SetReflectionModeOn  (Graphic3d_TOR_EMISSION);
820   else
821     aBack.SetReflectionModeOff (Graphic3d_TOR_EMISSION);
822
823   Quantity_Color aColor (Standard_Real (myCStructure->ContextFillArea.Back.ColorSpec.r),
824                          Standard_Real (myCStructure->ContextFillArea.Back.ColorSpec.g),
825                          Standard_Real (myCStructure->ContextFillArea.Back.ColorSpec.b), Quantity_TOC_RGB);
826   aBack.SetSpecularColor (aColor);
827
828   aColor.SetValues (Standard_Real (myCStructure->ContextFillArea.Back.ColorAmb.r),
829                     Standard_Real (myCStructure->ContextFillArea.Back.ColorAmb.g),
830                     Standard_Real (myCStructure->ContextFillArea.Back.ColorAmb.b), Quantity_TOC_RGB);
831   aBack.SetAmbientColor (aColor);
832
833   aColor.SetValues (Standard_Real (myCStructure->ContextFillArea.Back.ColorDif.r),
834                     Standard_Real (myCStructure->ContextFillArea.Back.ColorDif.g),
835                     Standard_Real (myCStructure->ContextFillArea.Back.ColorDif.b), Quantity_TOC_RGB);
836   aBack.SetDiffuseColor (aColor);
837
838   aColor.SetValues (Standard_Real (myCStructure->ContextFillArea.Back.ColorEms.r),
839                     Standard_Real (myCStructure->ContextFillArea.Back.ColorEms.g),
840                     Standard_Real (myCStructure->ContextFillArea.Back.ColorEms.b), Quantity_TOC_RGB);
841   aBack.SetEmissiveColor (aColor);
842
843   aBack.SetEnvReflexion (myCStructure->ContextFillArea.Back.EnvReflexion);
844   aBack.SetMaterialType (myCStructure->ContextFillArea.Back.IsPhysic ? Graphic3d_MATERIAL_PHYSIC : Graphic3d_MATERIAL_ASPECT);
845
846   // Front Material
847   Graphic3d_MaterialAspect aFront;
848   aFront.SetShininess    (Standard_Real (myCStructure->ContextFillArea.Front.Shininess));
849   aFront.SetAmbient      (Standard_Real (myCStructure->ContextFillArea.Front.Ambient));
850   aFront.SetDiffuse      (Standard_Real (myCStructure->ContextFillArea.Front.Diffuse));
851   aFront.SetSpecular     (Standard_Real (myCStructure->ContextFillArea.Front.Specular));
852   aFront.SetTransparency (Standard_Real (myCStructure->ContextFillArea.Front.Transparency));
853   aFront.SetEmissive     (Standard_Real (myCStructure->ContextFillArea.Front.Emission));
854   if (myCStructure->ContextFillArea.Front.IsAmbient == 1)
855     aFront.SetReflectionModeOn  (Graphic3d_TOR_AMBIENT);
856   else
857     aFront.SetReflectionModeOff (Graphic3d_TOR_AMBIENT);
858   if (myCStructure->ContextFillArea.Front.IsDiffuse == 1)
859     aFront.SetReflectionModeOn  (Graphic3d_TOR_DIFFUSE);
860   else
861     aFront.SetReflectionModeOff (Graphic3d_TOR_DIFFUSE);
862   if (myCStructure->ContextFillArea.Front.IsSpecular == 1)
863     aFront.SetReflectionModeOn  (Graphic3d_TOR_SPECULAR);
864   else
865     aFront.SetReflectionModeOff (Graphic3d_TOR_SPECULAR);
866   if (myCStructure->ContextFillArea.Front.Emission == 1)
867     aFront.SetReflectionModeOn  (Graphic3d_TOR_EMISSION);
868   else
869     aFront.SetReflectionModeOff (Graphic3d_TOR_EMISSION);
870
871   aColor.SetValues (Standard_Real (myCStructure->ContextFillArea.Front.ColorSpec.r),
872                     Standard_Real (myCStructure->ContextFillArea.Front.ColorSpec.g),
873                     Standard_Real (myCStructure->ContextFillArea.Front.ColorSpec.b), Quantity_TOC_RGB);
874   aFront.SetSpecularColor (aColor);
875
876   aColor.SetValues (Standard_Real (myCStructure->ContextFillArea.Front.ColorAmb.r),
877                     Standard_Real (myCStructure->ContextFillArea.Front.ColorAmb.g),
878                     Standard_Real (myCStructure->ContextFillArea.Front.ColorAmb.b), Quantity_TOC_RGB);
879   aFront.SetAmbientColor (aColor);
880
881   aColor.SetValues (Standard_Real (myCStructure->ContextFillArea.Front.ColorDif.r),
882                     Standard_Real (myCStructure->ContextFillArea.Front.ColorDif.g),
883                     Standard_Real (myCStructure->ContextFillArea.Front.ColorDif.b), Quantity_TOC_RGB);
884   aFront.SetDiffuseColor (aColor);
885
886   aColor.SetValues (Standard_Real (myCStructure->ContextFillArea.Front.ColorEms.r),
887                     Standard_Real (myCStructure->ContextFillArea.Front.ColorEms.g),
888                     Standard_Real (myCStructure->ContextFillArea.Front.ColorEms.b), Quantity_TOC_RGB);
889   aFront.SetEmissiveColor (aColor);
890
891   aFront.SetEnvReflexion (myCStructure->ContextFillArea.Front.EnvReflexion);
892   aFront.SetMaterialType (myCStructure->ContextFillArea.Front.IsPhysic ? Graphic3d_MATERIAL_PHYSIC : Graphic3d_MATERIAL_ASPECT);
893
894   Quantity_Color anIntColor  (Standard_Real (myCStructure->ContextFillArea.IntColor.r),
895                               Standard_Real (myCStructure->ContextFillArea.IntColor.g),
896                               Standard_Real (myCStructure->ContextFillArea.IntColor.b), Quantity_TOC_RGB);
897   Quantity_Color anEdgeColor (Standard_Real (myCStructure->ContextFillArea.EdgeColor.r),
898                               Standard_Real (myCStructure->ContextFillArea.EdgeColor.g),
899                               Standard_Real (myCStructure->ContextFillArea.EdgeColor.b), Quantity_TOC_RGB);
900   Handle(Graphic3d_AspectFillArea3d) anAspFill = new Graphic3d_AspectFillArea3d (Aspect_InteriorStyle (myCStructure->ContextFillArea.Style),
901                                                                                  anIntColor, anEdgeColor,
902                                                                                  Aspect_TypeOfLine    (myCStructure->ContextFillArea.LineType),
903                                                                                  Standard_Real        (myCStructure->ContextFillArea.Width),
904                                                                                  aFront, aBack);
905
906   // Edges
907   if (myCStructure->ContextFillArea.Edge == 1)
908     anAspFill->SetEdgeOn();
909   else
910     anAspFill->SetEdgeOff();
911   // Hatch
912   anAspFill->SetHatchStyle (Aspect_HatchStyle (myCStructure->ContextFillArea.Hatch));
913   // Materials
914   // Front and Back face
915   if (myCStructure->ContextFillArea.Distinguish == 1)
916     anAspFill->SetDistinguishOn();
917   else
918     anAspFill->SetDistinguishOff();
919   if (myCStructure->ContextFillArea.BackFace == 1)
920     anAspFill->SuppressBackFace();
921   else
922     anAspFill->AllowBackFace();
923   // Texture
924   anAspFill->SetTextureMap (myCStructure->ContextFillArea.Texture.TextureMap);
925   if (myCStructure->ContextFillArea.Texture.doTextureMap == 1)
926   {
927     anAspFill->SetTextureMapOn();
928   }
929   else
930   {
931     anAspFill->SetTextureMapOff();
932   }
933   anAspFill->SetShaderProgram  (myCStructure->ContextFillArea.ShaderProgram);
934   anAspFill->SetPolygonOffsets (myCStructure->ContextFillArea.PolygonOffsetMode,
935                                 myCStructure->ContextFillArea.PolygonOffsetFactor,
936                                 myCStructure->ContextFillArea.PolygonOffsetUnits);
937   return anAspFill;
938 }
939
940 //=============================================================================
941 //function : Groups
942 //purpose  :
943 //=============================================================================
944 const Graphic3d_SequenceOfGroup& Graphic3d_Structure::Groups() const
945 {
946   return myCStructure->Groups();
947 }
948
949 //=============================================================================
950 //function : NumberOfGroups
951 //purpose  :
952 //=============================================================================
953 Standard_Integer Graphic3d_Structure::NumberOfGroups() const
954 {
955   return myCStructure->Groups().Length();
956 }
957
958 //=============================================================================
959 //function : SetPrimitivesAspect
960 //purpose  :
961 //=============================================================================
962 void Graphic3d_Structure::SetPrimitivesAspect (const Handle(Graphic3d_AspectLine3d)& theAspLine)
963 {
964   if (IsDeleted()) return;
965
966   Standard_Real     aWidth;
967   Quantity_Color    aColor;
968   Aspect_TypeOfLine aLType;
969   theAspLine->Values (aColor, aLType, aWidth);
970
971   myCStructure->ContextLine.Color.r        = float (aColor.Red());
972   myCStructure->ContextLine.Color.g        = float (aColor.Green());
973   myCStructure->ContextLine.Color.b        = float (aColor.Blue());
974   myCStructure->ContextLine.LineType       = int   (aLType);
975   myCStructure->ContextLine.Width          = float (aWidth);
976   myCStructure->ContextLine.ShaderProgram  = theAspLine->ShaderProgram();
977   myCStructure->ContextLine.IsDef          = 1;
978
979   myCStructure->UpdateAspects();
980
981   // Attributes are "IsSet" during the first update of context (line, marker...)
982   myCStructure->ContextLine.IsSet     = 1;
983   myCStructure->ContextFillArea.IsSet = 1;
984   myCStructure->ContextMarker.IsSet   = 1;
985   myCStructure->ContextText.IsSet     = 1;
986
987   Update();
988 }
989
990 //=============================================================================
991 //function : SetPrimitivesAspect
992 //purpose  :
993 //=============================================================================
994 void Graphic3d_Structure::SetPrimitivesAspect (const Handle(Graphic3d_AspectFillArea3d)& theAspFill)
995 {
996   if (IsDeleted()) return;
997
998   Standard_Real        anRGB[3];
999   Standard_Real        aWidth;
1000   Quantity_Color       anIntColor;
1001   Quantity_Color       aBackIntColor;
1002   Quantity_Color       anEdgeColor;
1003   Aspect_TypeOfLine    aLType;
1004   Aspect_InteriorStyle aStyle;
1005   theAspFill->Values (aStyle, anIntColor, aBackIntColor, anEdgeColor, aLType, aWidth);
1006
1007   anIntColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
1008   myCStructure->ContextFillArea.Style      = aStyle;
1009   myCStructure->ContextFillArea.IntColor.r = float (anRGB[0]);
1010   myCStructure->ContextFillArea.IntColor.g = float (anRGB[1]);
1011   myCStructure->ContextFillArea.IntColor.b = float (anRGB[2]);
1012
1013   if (theAspFill->Distinguish())
1014   {
1015     aBackIntColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
1016   }
1017   myCStructure->ContextFillArea.BackIntColor.r = float(anRGB[0]);
1018   myCStructure->ContextFillArea.BackIntColor.g = float(anRGB[1]);
1019   myCStructure->ContextFillArea.BackIntColor.b = float(anRGB[2]);
1020
1021   // Edges
1022   myCStructure->ContextFillArea.Edge        = theAspFill->Edge () ? 1 : 0;
1023   myCStructure->ContextFillArea.EdgeColor.r = float (anEdgeColor.Red());
1024   myCStructure->ContextFillArea.EdgeColor.g = float (anEdgeColor.Green());
1025   myCStructure->ContextFillArea.EdgeColor.b = float (anEdgeColor.Blue());
1026   myCStructure->ContextFillArea.LineType    = aLType;
1027   myCStructure->ContextFillArea.Width       = float (aWidth);
1028   myCStructure->ContextFillArea.Hatch       = theAspFill->HatchStyle();
1029
1030   // Front and Back face
1031   myCStructure->ContextFillArea.Distinguish = theAspFill->Distinguish() ? 1 : 0;
1032   myCStructure->ContextFillArea.BackFace    = theAspFill->BackFace()    ? 1 : 0;
1033
1034   // Back Material
1035   const Graphic3d_MaterialAspect& aBack = theAspFill->BackMaterial();
1036   // Light specificity
1037   myCStructure->ContextFillArea.Back.Shininess    = float (aBack.Shininess());
1038   myCStructure->ContextFillArea.Back.Ambient      = float (aBack.Ambient());
1039   myCStructure->ContextFillArea.Back.Diffuse      = float (aBack.Diffuse());
1040   myCStructure->ContextFillArea.Back.Specular     = float (aBack.Specular());
1041   myCStructure->ContextFillArea.Back.Transparency = float (aBack.Transparency());
1042   myCStructure->ContextFillArea.Back.Emission     = float (aBack.Emissive());
1043
1044   // Reflection mode
1045   myCStructure->ContextFillArea.Back.IsAmbient    = (aBack.ReflectionMode (Graphic3d_TOR_AMBIENT)  ? 1 : 0);
1046   myCStructure->ContextFillArea.Back.IsDiffuse    = (aBack.ReflectionMode (Graphic3d_TOR_DIFFUSE)  ? 1 : 0);
1047   myCStructure->ContextFillArea.Back.IsSpecular   = (aBack.ReflectionMode (Graphic3d_TOR_SPECULAR) ? 1 : 0);
1048   myCStructure->ContextFillArea.Back.IsEmission   = (aBack.ReflectionMode (Graphic3d_TOR_EMISSION) ? 1 : 0);
1049
1050   // Material type
1051   //JR/Hp
1052   myCStructure->ContextFillArea.Back.IsPhysic = (aBack.MaterialType (Graphic3d_MATERIAL_PHYSIC) ? 1 : 0 );
1053
1054   // Specular Color
1055   myCStructure->ContextFillArea.Back.ColorSpec.r  = float (aBack.SpecularColor().Red());
1056   myCStructure->ContextFillArea.Back.ColorSpec.g  = float (aBack.SpecularColor().Green());
1057   myCStructure->ContextFillArea.Back.ColorSpec.b  = float (aBack.SpecularColor().Blue());
1058
1059   // Ambient color
1060   myCStructure->ContextFillArea.Back.ColorAmb.r   = float (aBack.AmbientColor().Red());
1061   myCStructure->ContextFillArea.Back.ColorAmb.g   = float (aBack.AmbientColor().Green());
1062   myCStructure->ContextFillArea.Back.ColorAmb.b   = float (aBack.AmbientColor().Blue());
1063
1064   // Diffuse color
1065   myCStructure->ContextFillArea.Back.ColorDif.r   = float (aBack.DiffuseColor().Red());
1066   myCStructure->ContextFillArea.Back.ColorDif.g   = float (aBack.DiffuseColor().Green());
1067   myCStructure->ContextFillArea.Back.ColorDif.b   = float (aBack.DiffuseColor().Blue());
1068
1069   // Emissive color
1070   myCStructure->ContextFillArea.Back.ColorEms.r   = float (aBack.EmissiveColor().Red());
1071   myCStructure->ContextFillArea.Back.ColorEms.g   = float (aBack.EmissiveColor().Green());
1072   myCStructure->ContextFillArea.Back.ColorEms.b   = float (aBack.EmissiveColor().Blue());
1073
1074   myCStructure->ContextFillArea.Back.EnvReflexion =
1075     float ((theAspFill->BackMaterial ()).EnvReflexion());
1076
1077   // Front Material
1078   const Graphic3d_MaterialAspect& aFront = theAspFill->FrontMaterial();
1079   // Light specificity
1080   myCStructure->ContextFillArea.Front.Shininess    = float (aFront.Shininess());
1081   myCStructure->ContextFillArea.Front.Ambient      = float (aFront.Ambient());
1082   myCStructure->ContextFillArea.Front.Diffuse      = float (aFront.Diffuse());
1083   myCStructure->ContextFillArea.Front.Specular     = float (aFront.Specular());
1084   myCStructure->ContextFillArea.Front.Transparency = float (aFront.Transparency());
1085   myCStructure->ContextFillArea.Front.Emission     = float (aFront.Emissive());
1086
1087   // Reflection mode
1088   myCStructure->ContextFillArea.Front.IsAmbient    = (aFront.ReflectionMode (Graphic3d_TOR_AMBIENT)  ? 1 : 0);
1089   myCStructure->ContextFillArea.Front.IsDiffuse    = (aFront.ReflectionMode (Graphic3d_TOR_DIFFUSE)  ? 1 : 0);
1090   myCStructure->ContextFillArea.Front.IsSpecular   = (aFront.ReflectionMode (Graphic3d_TOR_SPECULAR) ? 1 : 0);
1091   myCStructure->ContextFillArea.Front.IsEmission   = (aFront.ReflectionMode (Graphic3d_TOR_EMISSION) ? 1 : 0);
1092
1093   // Materail type
1094   //JR/Hp
1095   myCStructure->ContextFillArea.Front.IsPhysic     = (aFront.MaterialType (Graphic3d_MATERIAL_PHYSIC) ? 1 : 0);
1096
1097   // Specular Color
1098   myCStructure->ContextFillArea.Front.ColorSpec.r  = float (aFront.SpecularColor().Red());
1099   myCStructure->ContextFillArea.Front.ColorSpec.g  = float (aFront.SpecularColor().Green());
1100   myCStructure->ContextFillArea.Front.ColorSpec.b  = float (aFront.SpecularColor().Blue());
1101
1102   // Ambient color
1103   myCStructure->ContextFillArea.Front.ColorAmb.r   = float (aFront.AmbientColor().Red());
1104   myCStructure->ContextFillArea.Front.ColorAmb.g   = float (aFront.AmbientColor().Green());
1105   myCStructure->ContextFillArea.Front.ColorAmb.b   = float (aFront.AmbientColor().Blue());
1106
1107   // Diffuse color
1108   myCStructure->ContextFillArea.Front.ColorDif.r   = float (aFront.DiffuseColor().Red());
1109   myCStructure->ContextFillArea.Front.ColorDif.g   = float (aFront.DiffuseColor().Green());
1110   myCStructure->ContextFillArea.Front.ColorDif.b   = float (aFront.DiffuseColor().Blue());
1111
1112   // Emissive color
1113   myCStructure->ContextFillArea.Front.ColorEms.r   = float (aFront.EmissiveColor().Red());
1114   myCStructure->ContextFillArea.Front.ColorEms.g   = float (aFront.EmissiveColor().Green());
1115   myCStructure->ContextFillArea.Front.ColorEms.b   = float (aFront.EmissiveColor().Blue());
1116
1117   myCStructure->ContextFillArea.Front.EnvReflexion = float (aFront.EnvReflexion());
1118
1119   myCStructure->ContextFillArea.IsDef = 1; // Definition material ok
1120
1121   myCStructure->ContextFillArea.Texture.TextureMap   = theAspFill->TextureMap();
1122   myCStructure->ContextFillArea.Texture.doTextureMap = theAspFill->TextureMapState() ? 1 : 0;
1123   myCStructure->ContextFillArea.ShaderProgram        = theAspFill->ShaderProgram();
1124
1125   Standard_Integer   aPolyMode;
1126   Standard_ShortReal aPolyFactor, aPolyUnits;
1127   theAspFill->PolygonOffsets (aPolyMode, aPolyFactor, aPolyUnits);
1128   myCStructure->ContextFillArea.PolygonOffsetMode   = aPolyMode;
1129   myCStructure->ContextFillArea.PolygonOffsetFactor = aPolyFactor;
1130   myCStructure->ContextFillArea.PolygonOffsetUnits  = aPolyUnits;
1131
1132   myCStructure->UpdateAspects();
1133
1134   // Attributes are "IsSet" during the first update of context (line, marker...)
1135   myCStructure->ContextLine.IsSet     = 1;
1136   myCStructure->ContextFillArea.IsSet = 1;
1137   myCStructure->ContextMarker.IsSet   = 1;
1138   myCStructure->ContextText.IsSet     = 1;
1139
1140   Update();
1141 }
1142
1143 //=============================================================================
1144 //function : SetPrimitivesAspect
1145 //purpose  :
1146 //=============================================================================
1147 void Graphic3d_Structure::SetPrimitivesAspect (const Handle(Graphic3d_AspectText3d)& theAspText)
1148 {
1149   if (IsDeleted()) return;
1150
1151   Standard_CString         aFont;
1152   Standard_Real            aSpace, anExpansion, aTextAngle;
1153   Quantity_Color           aColor, aColorSub;
1154   Aspect_TypeOfStyleText   aStyle;
1155   Aspect_TypeOfDisplayText aDispType;
1156   Standard_Boolean         isTextZoomable;
1157   Font_FontAspect          aTextFontAspect;
1158   theAspText->Values (aColor, aFont, anExpansion, aSpace, aStyle, aDispType, aColorSub, isTextZoomable, aTextAngle, aTextFontAspect);
1159
1160   myCStructure->ContextText.Color.r         = float (aColor.Red());
1161   myCStructure->ContextText.Color.g         = float (aColor.Green());
1162   myCStructure->ContextText.Color.b         = float (aColor.Blue());
1163   myCStructure->ContextText.Font            = aFont;
1164   myCStructure->ContextText.Expan           = float (anExpansion);
1165   myCStructure->ContextText.Space           = float (aSpace);
1166   myCStructure->ContextText.Style           = aStyle;
1167   myCStructure->ContextText.DisplayType     = aDispType;
1168   myCStructure->ContextText.ColorSubTitle.r = float (aColorSub.Red());
1169   myCStructure->ContextText.ColorSubTitle.g = float (aColorSub.Green());
1170   myCStructure->ContextText.ColorSubTitle.b = float (aColorSub.Blue());
1171   myCStructure->ContextText.TextZoomable    = isTextZoomable;
1172   myCStructure->ContextText.TextAngle       = float (aTextAngle);
1173   myCStructure->ContextText.TextFontAspect  = aTextFontAspect;
1174   myCStructure->ContextText.ShaderProgram   = theAspText->ShaderProgram();
1175
1176   myCStructure->ContextText.IsDef = 1;
1177
1178   myCStructure->UpdateAspects();
1179
1180   // Attributes are "IsSet" during the first update of a context (line, marker...)
1181   myCStructure->ContextLine.IsSet     = 1;
1182   myCStructure->ContextFillArea.IsSet = 1;
1183   myCStructure->ContextMarker.IsSet   = 1;
1184   myCStructure->ContextText.IsSet     = 1;
1185
1186   Update();
1187 }
1188
1189 //=============================================================================
1190 //function : SetPrimitivesAspect
1191 //purpose  :
1192 //=============================================================================
1193 void Graphic3d_Structure::SetPrimitivesAspect (const Handle(Graphic3d_AspectMarker3d)& theAspMarker)
1194 {
1195   if (IsDeleted()) return;
1196
1197   Standard_Real       aScale;
1198   Quantity_Color      aColor;
1199   Aspect_TypeOfMarker aMType;
1200   theAspMarker->Values (aColor, aMType, aScale);
1201
1202   myCStructure->ContextMarker.Color.r       = float (aColor.Red());
1203   myCStructure->ContextMarker.Color.g       = float (aColor.Green());
1204   myCStructure->ContextMarker.Color.b       = float (aColor.Blue());
1205   myCStructure->ContextMarker.MarkerType    = aMType;
1206   myCStructure->ContextMarker.Scale         = float (aScale);
1207   myCStructure->ContextMarker.ShaderProgram = theAspMarker->ShaderProgram();
1208   myCStructure->ContextMarker.IsDef         = 1;
1209
1210   myCStructure->UpdateAspects();
1211
1212   // Attributes are "IsSet" during the first update of a context (line, marker...)
1213   myCStructure->ContextLine.IsSet     = 1;
1214   myCStructure->ContextFillArea.IsSet = 1;
1215   myCStructure->ContextMarker.IsSet   = 1;
1216   myCStructure->ContextText.IsSet     = 1;
1217
1218   Update();
1219 }
1220
1221 //=============================================================================
1222 //function : SetVisual
1223 //purpose  :
1224 //=============================================================================
1225 void Graphic3d_Structure::SetVisual (const Graphic3d_TypeOfStructure theVisual)
1226 {
1227   if (IsDeleted()
1228    || myVisual == theVisual)
1229   {
1230     return;
1231   }
1232
1233   if (!myCStructure->stick)
1234   {
1235     myVisual = theVisual;
1236     SetComputeVisual (theVisual);
1237   }
1238   else
1239   {
1240     Aspect_TypeOfUpdate anUpdateMode  = myStructureManager->UpdateMode();
1241     if (anUpdateMode == Aspect_TOU_WAIT)
1242     {
1243       Erase();
1244       myVisual = theVisual;
1245       SetComputeVisual (theVisual);
1246       Display();
1247     }
1248     else {
1249       // To avoid calling method : Update ()
1250       // Not useful and can be costly.
1251       myStructureManager->SetUpdateMode (Aspect_TOU_WAIT);
1252       Erase();
1253       myVisual = theVisual;
1254       SetComputeVisual (theVisual);
1255       myStructureManager->SetUpdateMode (anUpdateMode);
1256       Display();
1257     }
1258   }
1259 }
1260
1261 //=============================================================================
1262 //function : SetZoomLimit
1263 //purpose  :
1264 //=============================================================================
1265 void Graphic3d_Structure::SetZoomLimit (const Standard_Real theLimitInf,
1266                                         const Standard_Real theLimitSup)
1267 {
1268   (void )theLimitInf;
1269   (void )theLimitSup;
1270   Graphic3d_StructureDefinitionError_Raise_if (theLimitInf <= 0.0,
1271                                                "Bad value for ZoomLimit inf");
1272   Graphic3d_StructureDefinitionError_Raise_if (theLimitSup <= 0.0,
1273                                                "Bad value for ZoomLimit sup");
1274   Graphic3d_StructureDefinitionError_Raise_if (theLimitSup < theLimitInf,
1275                                                "ZoomLimit sup < ZoomLimit inf");
1276 }
1277
1278 //=============================================================================
1279 //function : Visual
1280 //purpose  :
1281 //=============================================================================
1282 Graphic3d_TypeOfStructure Graphic3d_Structure::Visual() const
1283 {
1284   return myVisual;
1285 }
1286
1287 //=============================================================================
1288 //function : AcceptConnection
1289 //purpose  :
1290 //=============================================================================
1291 Standard_Boolean Graphic3d_Structure::AcceptConnection (const Handle(Graphic3d_Structure)& theStructure1,
1292                                                         const Handle(Graphic3d_Structure)& theStructure2,
1293                                                         const Graphic3d_TypeOfConnection   theType)
1294 {
1295   // cycle detection
1296   Graphic3d_MapOfStructure aSet;
1297   Graphic3d_Structure::Network (theStructure2, theType, aSet);
1298   return !aSet.Contains (theStructure1);
1299 }
1300
1301 //=============================================================================
1302 //function : Ancestors
1303 //purpose  :
1304 //=============================================================================
1305 void Graphic3d_Structure::Ancestors (Graphic3d_MapOfStructure& theSet) const
1306 {
1307   const Standard_Integer aNbAnces = myAncestors.Length ();
1308   for (Standard_Integer anIter = 1; anIter <= aNbAnces; ++anIter)
1309   {
1310     theSet.Add ((Graphic3d_Structure* )(myAncestors.Value (anIter)));
1311   }
1312 }
1313
1314 //=============================================================================
1315 //function : SetOwner
1316 //purpose  :
1317 //=============================================================================
1318 void Graphic3d_Structure::SetOwner (const Standard_Address theOwner)
1319 {
1320   myOwner = theOwner;
1321 }
1322
1323 //=============================================================================
1324 //function : Owner
1325 //purpose  :
1326 //=============================================================================
1327 Standard_Address Graphic3d_Structure::Owner() const
1328 {
1329   return myOwner;
1330 }
1331
1332 //=============================================================================
1333 //function : Descendants
1334 //purpose  :
1335 //=============================================================================
1336 void Graphic3d_Structure::Descendants (Graphic3d_MapOfStructure& theSet) const
1337 {
1338   const Standard_Integer aNbDesc = myDescendants.Length ();
1339   for (Standard_Integer anIter = 1; anIter <= aNbDesc; ++anIter)
1340   {
1341     theSet.Add ((Graphic3d_Structure* )(myDescendants.Value (anIter)));
1342   }
1343 }
1344
1345 //=============================================================================
1346 //function : Connect
1347 //purpose  :
1348 //=============================================================================
1349 void Graphic3d_Structure::Connect (const Handle(Graphic3d_Structure)& theStructure,
1350                                    const Graphic3d_TypeOfConnection   theType,
1351                                    const Standard_Boolean             theWithCheck)
1352 {
1353   if (IsDeleted()) return;
1354
1355   // cycle detection
1356   if (theWithCheck
1357    && !Graphic3d_Structure::AcceptConnection (this, theStructure, theType))
1358   {
1359     return;
1360   }
1361
1362   switch (theType)
1363   {
1364     case Graphic3d_TOC_DESCENDANT:
1365     {
1366       const Standard_Integer aNbDesc = myDescendants.Length();
1367       for (Standard_Integer anIter = 1; anIter <= aNbDesc; ++anIter)
1368       {
1369         if (myDescendants.Value (anIter) == theStructure.operator->())
1370         {
1371           return;
1372         }
1373       }
1374
1375       myDescendants.Append (theStructure.operator->());
1376       theStructure->Connect (this, Graphic3d_TOC_ANCESTOR);
1377
1378       GraphicConnect (theStructure);
1379       myStructureManager->Connect (this, theStructure);
1380
1381       Update();
1382       return;
1383     }
1384     case Graphic3d_TOC_ANCESTOR:
1385     {
1386       const Standard_Integer aNbAnces = myAncestors.Length();
1387       for (Standard_Integer anIter = 1; anIter <= aNbAnces; ++anIter)
1388       {
1389         if (myAncestors.Value (anIter) == theStructure.operator->())
1390         {
1391           return;
1392         }
1393       }
1394
1395       myAncestors.Append (theStructure.operator->());
1396       theStructure->Connect (this, Graphic3d_TOC_DESCENDANT);
1397
1398       // myGraphicDriver->Connect is called in case if connection between parent and child
1399       return;
1400     }
1401   }
1402 }
1403
1404 //=============================================================================
1405 //function : Disconnect
1406 //purpose  :
1407 //=============================================================================
1408 void Graphic3d_Structure::Disconnect (const Handle(Graphic3d_Structure)& theStructure)
1409 {
1410   if (IsDeleted()) return;
1411
1412   const Standard_Integer aNbDesc = myDescendants.Length();
1413   for (Standard_Integer anIter = 1; anIter <= aNbDesc; ++anIter)
1414   {
1415     if (myDescendants.Value (anIter) == theStructure.operator->())
1416     {
1417       myDescendants.Remove (anIter);
1418       theStructure->Disconnect (this);
1419
1420       GraphicDisconnect (theStructure);
1421       myStructureManager->Disconnect (this, theStructure);
1422
1423       Update();
1424       return;
1425     }
1426   }
1427
1428   const Standard_Integer aNbAnces = myAncestors.Length();
1429   for (Standard_Integer anIter = 1; anIter <= aNbAnces; ++anIter)
1430   {
1431     if (myAncestors.Value (anIter) == theStructure.operator->())
1432     {
1433       myAncestors.Remove (anIter);
1434       theStructure->Disconnect (this);
1435       // no call of myGraphicDriver->Disconnect in case of an ancestor
1436       return;
1437     }
1438   }
1439 }
1440
1441 //=============================================================================
1442 //function : DisconnectAll
1443 //purpose  :
1444 //=============================================================================
1445 void Graphic3d_Structure::DisconnectAll (const Graphic3d_TypeOfConnection theType)
1446 {
1447   if (IsDeleted()) return;
1448
1449   switch (theType)
1450   {
1451     case Graphic3d_TOC_DESCENDANT:
1452     {
1453       const Standard_Integer aLength = myDescendants.Length();
1454       for (Standard_Integer anIter = 1; anIter <= aLength; ++anIter)
1455       {
1456         // Value (1) instead of Value (i) as myDescendants
1457         // is modified by :
1458         // Graphic3d_Structure::Disconnect (AStructure)
1459         // that takes AStructure from myDescendants
1460         ((Graphic3d_Structure* )(myDescendants.Value (1)))->Disconnect (this);
1461       }
1462       break;
1463     }
1464     case Graphic3d_TOC_ANCESTOR:
1465     {
1466       const Standard_Integer aLength = myAncestors.Length();
1467       for (Standard_Integer anIter = 1; anIter <= aLength; ++anIter)
1468       {
1469         // Value (1) instead of Value (i) as myAncestors
1470         // is modified by :
1471         // Graphic3d_Structure::Disconnect (AStructure)
1472         // that takes AStructure from myAncestors
1473         ((Graphic3d_Structure* )(myAncestors.Value (1)))->Disconnect (this);
1474       }
1475       break;
1476     }
1477   }
1478 }
1479
1480 //=============================================================================
1481 //function : Composition
1482 //purpose  :
1483 //=============================================================================
1484 Graphic3d_TypeOfComposition Graphic3d_Structure::Composition() const
1485 {
1486   return myCStructure->Composition;
1487 }
1488
1489 //=============================================================================
1490 //function : SetTransform
1491 //purpose  :
1492 //=============================================================================
1493 void Graphic3d_Structure::SetTransform (const TColStd_Array2OfReal&       theMatrix,
1494                                         const Graphic3d_TypeOfComposition theType)
1495 {
1496   if (IsDeleted()) return;
1497
1498   Standard_Real valuetrsf;
1499   Standard_Real valueoldtrsf;
1500   Standard_Real valuenewtrsf;
1501   TColStd_Array2OfReal aNewTrsf  (0, 3, 0, 3);
1502   TColStd_Array2OfReal aMatrix44 (0, 3, 0, 3);
1503
1504   // Assign the new transformation in an array [0..3][0..3]
1505   // Avoid problemes if the user has defined matrice [1..4][1..4]
1506   //                                              or [3..6][-1..2] !!
1507   Standard_Integer lr = theMatrix.LowerRow();
1508   Standard_Integer ur = theMatrix.UpperRow();
1509   Standard_Integer lc = theMatrix.LowerCol();
1510   Standard_Integer uc = theMatrix.UpperCol();
1511
1512   if ((ur - lr + 1 != 4) || (uc - lc + 1 != 4))
1513   {
1514     Graphic3d_TransformError::Raise ("Transform : not a 4x4 matrix");
1515   }
1516
1517   switch (theType)
1518   {
1519     case Graphic3d_TOC_REPLACE:
1520     {
1521       myCStructure->Composition = Graphic3d_TOC_REPLACE;
1522       // Update of CStructure
1523       for (Standard_Integer i = 0; i <= 3; ++i)
1524       {
1525         for (Standard_Integer j = 0; j <= 3; ++j)
1526         {
1527           myCStructure->Transformation[i][j] = float (theMatrix (lr + i, lc + j));
1528           aNewTrsf (i, j) = theMatrix (lr + i, lc + j);
1529         }
1530       }
1531       break;
1532     }
1533     case Graphic3d_TOC_POSTCONCATENATE:
1534     {
1535       myCStructure->Composition = Graphic3d_TOC_POSTCONCATENATE;
1536       // To simplify management of indices
1537       for (Standard_Integer i = 0; i <= 3; ++i)
1538       {
1539         for (Standard_Integer j = 0; j <= 3; ++j)
1540         {
1541           aMatrix44 (i, j) = theMatrix (lr + i, lc + j);
1542         }
1543       }
1544
1545       // Calculation of the product of matrices
1546       for (Standard_Integer i = 0; i <= 3; ++i)
1547       {
1548         for (Standard_Integer j = 0; j <= 3; ++j)
1549         {
1550           aNewTrsf (i, j) = 0.0;
1551           for (Standard_Integer k = 0; k <= 3; ++k)
1552           {
1553             valueoldtrsf = myCStructure->Transformation[i][k];
1554             valuetrsf    = aMatrix44 (k, j);
1555             valuenewtrsf = aNewTrsf (i, j) + valueoldtrsf * valuetrsf;
1556             aNewTrsf (i, j) = valuenewtrsf;
1557           }
1558         }
1559       }
1560
1561       // Update of CStructure
1562       for (Standard_Integer i = 0; i <= 3; ++i)
1563       {
1564         for (Standard_Integer j = 0; j <= 3; ++j)
1565         {
1566           myCStructure->Transformation[i][j] = float (aNewTrsf (i, j));
1567         }
1568       }
1569       break;
1570     }
1571   }
1572
1573   // If transformation, no validation of hidden already calculated parts
1574   if (IsRotated())
1575   {
1576     ReCompute();
1577   }
1578
1579   GraphicTransform (aNewTrsf);
1580   myStructureManager->SetTransform (this, aNewTrsf);
1581
1582   Update();
1583 }
1584
1585 //=============================================================================
1586 //function : Transform
1587 //purpose  :
1588 //=============================================================================
1589 void Graphic3d_Structure::Transform (TColStd_Array2OfReal& theMatrix) const
1590 {
1591
1592   Standard_Integer lr = theMatrix.LowerRow ();
1593   Standard_Integer ur = theMatrix.UpperRow ();
1594   Standard_Integer lc = theMatrix.LowerCol ();
1595   Standard_Integer uc = theMatrix.UpperCol ();
1596
1597   if ((ur - lr + 1 != 4) || (uc - lc + 1 != 4))
1598     Graphic3d_TransformError::Raise ("Transform : not a 4x4 matrix");
1599
1600   for (Standard_Integer i = 0; i <= 3; ++i)
1601   {
1602     for (Standard_Integer j = 0; j <= 3; ++j)
1603     {
1604       theMatrix (lr + i, lc + j) = myCStructure->Transformation[i][j];
1605     }
1606   }
1607 }
1608
1609 //=============================================================================
1610 //function : MinMaxValues
1611 //purpose  :
1612 //=============================================================================
1613 void Graphic3d_Structure::MinMaxValues (Standard_Real& theXMin,
1614                                         Standard_Real& theYMin,
1615                                         Standard_Real& theZMin,
1616                                         Standard_Real& theXMax,
1617                                         Standard_Real& theYMax,
1618                                         Standard_Real& theZMax,
1619                                         const Standard_Boolean theToIgnoreInfiniteFlag) const
1620 {
1621   if (IsEmpty())
1622   {
1623     return;
1624   }
1625
1626   Standard_Real aXMin, aYMin, aZMin, aXMax, aYMax, aZMax;
1627   MinMaxCoord (aXMin, aYMin, aZMin, aXMax, aYMax, aZMax);
1628
1629   // Infinite boundaries corresponding to empty structure or
1630   // non-empty structure, without any primitives specified
1631   if (aXMin == RealFirst() && aYMin == RealFirst() && aZMin == RealFirst() &&
1632       aXMax == RealLast()  && aYMax == RealLast()  && aZMax == RealLast())
1633   {
1634     theXMin = RealFirst();
1635     theYMin = RealFirst();
1636     theZMin = RealFirst();
1637     theXMax = RealLast();
1638     theYMax = RealLast();
1639     theZMax = RealLast();
1640     return;
1641   }
1642
1643   // Handle flag, which specifies that structure should be considered as infinite
1644   if (IsInfinite() && !theToIgnoreInfiniteFlag)
1645   {
1646     Graphic3d_Vertex aVertexMin (aXMin, aYMin, aZMin);
1647     Graphic3d_Vertex aVertexMax (aXMax, aYMax, aZMax);
1648     const Standard_Real aDistance = aVertexMin.Distance (aVertexMax);
1649
1650     // Special case for infinite line:
1651     // Bounding borders of infinite line has been
1652     // calculated as own point in center of this line
1653     if (aDistance >= 500000.0)
1654     {
1655       theXMin = theXMax = 0.5 * (aXMin + aXMax);
1656       theYMin = theYMax = 0.5 * (aYMin + aYMax);
1657       theZMin = theZMax = 0.5 * (aZMin + aZMax);
1658       return;
1659     }
1660
1661     theXMin = RealFirst();
1662     theYMin = RealFirst();
1663     theZMin = RealFirst();
1664     theXMax = RealLast();
1665     theYMax = RealLast();
1666     theZMax = RealLast();
1667     return;
1668   }
1669
1670   // Min-Max values of the descendant structures
1671   Standard_Real aDescXMin = RealLast();
1672   Standard_Real aDescYMin = RealLast();
1673   Standard_Real aDescZMin = RealLast();
1674   Standard_Real aDescXMax = RealFirst();
1675   Standard_Real aDescYMax = RealFirst();
1676   Standard_Real aDescZMax = RealFirst();
1677   for (Standard_Integer aStructIt = 1; aStructIt <= myDescendants.Length(); aStructIt++)
1678   {
1679     Graphic3d_Structure* aStructure = (Graphic3d_Structure*) myDescendants.Value (aStructIt);
1680     aStructure->MinMaxValues (aXMin, aYMin, aZMin, aXMax, aYMax, aZMax);
1681     aDescXMin = Min (aXMin, aDescXMin);
1682     aDescYMin = Min (aYMin, aDescYMin);
1683     aDescZMin = Min (aZMin, aDescZMin);
1684     aDescXMax = Max (aXMax, aDescXMax);
1685     aDescYMax = Max (aYMax, aDescYMax);
1686     aDescZMax = Max (aZMax, aDescZMax);
1687   }
1688
1689   if (aDescXMin != RealLast()  || aDescYMin != RealLast()  ||
1690       aDescZMin != RealLast()  || aDescXMax != RealFirst() ||
1691       aDescYMax != RealFirst() || aDescZMax != RealFirst())
1692   {
1693     aXMin = Min (aDescXMin, aXMin);
1694     aYMin = Min (aDescYMin, aYMin);
1695     aZMin = Min (aDescZMin, aZMin);
1696     aXMax = Max (aDescXMax, aXMax);
1697     aYMax = Max (aDescYMax, aYMax);
1698     aZMax = Max (aDescZMax, aZMax);
1699   }
1700
1701   // Case impossible as it would mean that the structure is empty or infinite
1702   if (aXMin == RealFirst() && aYMin == RealFirst() && aZMin == RealFirst() &&
1703       aXMax == RealLast()  && aYMax == RealLast()  && aZMax == RealLast())
1704   {
1705     theXMin = RealFirst();
1706     theYMin = RealFirst();
1707     theZMin = RealFirst();
1708     theXMax = RealLast();
1709     theYMax = RealLast();
1710     theZMax = RealLast();
1711     return;
1712   }
1713
1714   TColStd_Array2OfReal aTrsf(0, 3, 0, 3);
1715   Transform (aTrsf);
1716   TransformBoundaries (aTrsf, aXMin, aYMin, aZMin, aXMax, aYMax, aZMax);
1717   theXMin = aXMin;
1718   theYMin = aYMin;
1719   theZMin = aZMin;
1720   theXMax = aXMax;
1721   theYMax = aYMax;
1722   theZMax = aZMax;
1723 }
1724
1725 //=============================================================================
1726 //function : Identification
1727 //purpose  :
1728 //=============================================================================
1729 Standard_Integer Graphic3d_Structure::Identification() const
1730 {
1731   return myCStructure->Id;
1732 }
1733
1734 //=============================================================================
1735 //function : SetTransformPersistence
1736 //purpose  :
1737 //=============================================================================
1738 void Graphic3d_Structure::SetTransformPersistence (const Graphic3d_TransModeFlags& theFlag)
1739 {
1740   SetTransformPersistence (theFlag, gp_Pnt (0.0, 0.0, 0.0));
1741 }
1742
1743 //=============================================================================
1744 //function : SetTransformPersistence
1745 //purpose  :
1746 //=============================================================================
1747 void Graphic3d_Structure::SetTransformPersistence (const Graphic3d_TransModeFlags& theFlag,
1748                                                    const gp_Pnt&                   thePoint)
1749 {
1750   if (IsDeleted()) return;
1751
1752   myCStructure->TransformPersistence.Flag    = theFlag;
1753   myCStructure->TransformPersistence.Point.x = float (thePoint.X());
1754   myCStructure->TransformPersistence.Point.y = float (thePoint.Y());
1755   myCStructure->TransformPersistence.Point.z = float (thePoint.Z());
1756   myCStructure->UpdateAspects();
1757
1758   myCStructure->TransformPersistence.IsSet = 1;
1759 }
1760
1761 //=============================================================================
1762 //function : TransformPersistenceMode
1763 //purpose  :
1764 //=============================================================================
1765 Graphic3d_TransModeFlags Graphic3d_Structure::TransformPersistenceMode() const
1766 {
1767   return myCStructure->TransformPersistence.Flag;
1768 }
1769
1770 //=============================================================================
1771 //function : TransformPersistencePoint
1772 //purpose  :
1773 //=============================================================================
1774 gp_Pnt Graphic3d_Structure::TransformPersistencePoint() const
1775 {
1776   gp_Pnt aPnt (0.0, 0.0, 0.0);
1777   aPnt.SetX (myCStructure->TransformPersistence.Point.x);
1778   aPnt.SetY (myCStructure->TransformPersistence.Point.y);
1779   aPnt.SetZ (myCStructure->TransformPersistence.Point.z);
1780   return aPnt;
1781 }
1782
1783 //=============================================================================
1784 //function : Remove
1785 //purpose  :
1786 //=============================================================================
1787 void Graphic3d_Structure::Remove (const Standard_Address           thePtr,
1788                                   const Graphic3d_TypeOfConnection theType)
1789 {
1790   switch (theType)
1791   {
1792     case Graphic3d_TOC_DESCENDANT:
1793     {
1794       const Standard_Integer aNbDesc = myDescendants.Length();
1795       for (Standard_Integer anIter = 1; anIter <= aNbDesc; ++anIter)
1796       {
1797         if (myDescendants.Value (anIter) == thePtr)
1798         {
1799           myDescendants.Remove (anIter);
1800           return;
1801         }
1802       }
1803       break;
1804     }
1805     case Graphic3d_TOC_ANCESTOR:
1806     {
1807       const Standard_Integer aNbAncestors = myAncestors.Length();
1808       for (Standard_Integer anIter = 1; anIter <= aNbAncestors; ++anIter)
1809       {
1810         if (myAncestors.Value (anIter) == thePtr)
1811         {
1812           myAncestors.Remove (anIter);
1813           return;
1814         }
1815       }
1816       break;
1817     }
1818   }
1819 }
1820
1821 //=============================================================================
1822 //function : NewGroup
1823 //purpose  :
1824 //=============================================================================
1825 Handle(Graphic3d_Group) Graphic3d_Structure::NewGroup()
1826 {
1827   return myCStructure->NewGroup (this);
1828 }
1829
1830 //=============================================================================
1831 //function : Remove
1832 //purpose  :
1833 //=============================================================================
1834 void Graphic3d_Structure::Remove (const Handle(Graphic3d_Group)& theGroup)
1835 {
1836   if (theGroup.IsNull()
1837    || theGroup->myStructure != this)
1838   {
1839     return;
1840   }
1841
1842   myCStructure->RemoveGroup (theGroup);
1843   theGroup->myStructure = NULL;
1844 }
1845
1846 //=============================================================================
1847 //function : StructureManager
1848 //purpose  :
1849 //=============================================================================
1850 Handle(Graphic3d_StructureManager) Graphic3d_Structure::StructureManager() const
1851 {
1852   return myStructureManager;
1853 }
1854
1855 //=============================================================================
1856 //function : MinMaxCoord
1857 //purpose  :
1858 //=============================================================================
1859 void Graphic3d_Structure::MinMaxCoord (Standard_Real& theXMin,
1860                                        Standard_Real& theYMin,
1861                                        Standard_Real& theZMin,
1862                                        Standard_Real& theXMax,
1863                                        Standard_Real& theYMax,
1864                                        Standard_Real& theZMax) const
1865 {
1866   if (IsEmpty())
1867   {
1868     theXMin = RealFirst();
1869     theYMin = RealFirst();
1870     theZMin = RealFirst();
1871     theXMax = RealLast();
1872     theYMax = RealLast();
1873     theZMax = RealLast();
1874     return;
1875   }
1876
1877   Standard_Real aXMin = RealLast();
1878   Standard_Real aYMin = RealLast();
1879   Standard_Real aZMin = RealLast();
1880   Standard_Real aXMax = RealFirst();
1881   Standard_Real aYMax = RealFirst();
1882   Standard_Real aZMax = RealFirst();
1883   Standard_Real aGroupXMin, aGroupYMin, aGroupZMin, aGroupXMax, aGroupYMax, aGroupZMax;
1884   for (Graphic3d_SequenceOfGroup::Iterator aGroupIter (myCStructure->Groups()); aGroupIter.More(); aGroupIter.Next())
1885   {
1886     const Handle(Graphic3d_Group)& aGroup = aGroupIter.Value();
1887     if (aGroup->IsEmpty())
1888     {
1889       continue;
1890     }
1891
1892     aGroup->MinMaxValues (aGroupXMin, aGroupYMin, aGroupZMin, aGroupXMax, aGroupYMax, aGroupZMax);
1893     aXMin = Min (aXMin, aGroupXMin);
1894     aYMin = Min (aYMin, aGroupYMin);
1895     aZMin = Min (aZMin, aGroupZMin);
1896     aXMax = Max (aXMax, aGroupXMax);
1897     aYMax = Max (aYMax, aGroupYMax);
1898     aZMax = Max (aZMax, aGroupZMax);
1899   }
1900
1901   // Case impossible as it would mean that the structure is empty
1902   if (aXMin == RealLast()  && aYMin == RealLast()  && aZMin == RealLast() &&
1903       aXMax == RealFirst() && aYMax == RealFirst() && aZMax == RealFirst())
1904   {
1905     theXMin = RealFirst();
1906     theYMin = RealFirst();
1907     theZMin = RealFirst();
1908     theXMax = RealLast();
1909     theYMax = RealLast();
1910     theZMax = RealLast();
1911   }
1912
1913   theXMin = aXMin;
1914   theYMin = aYMin;
1915   theZMin = aZMin;
1916   theXMax = aXMax;
1917   theYMax = aYMax;
1918   theZMax = aZMax;
1919 }
1920
1921 //=============================================================================
1922 //function : MinMaxCoordWithDescendants
1923 //purpose  :
1924 //=============================================================================
1925 void Graphic3d_Structure::MinMaxCoordWithDescendants (Standard_Real& theXMin,
1926                                                       Standard_Real& theYMin,
1927                                                       Standard_Real& theZMin,
1928                                                       Standard_Real& theXMax,
1929                                                       Standard_Real& theYMax,
1930                                                       Standard_Real& theZMax) const
1931 {
1932   if (IsEmpty())
1933   {
1934     theXMin = RealFirst();
1935     theYMin = RealFirst();
1936     theZMin = RealFirst();
1937     theXMax = RealLast();
1938     theYMax = RealLast();
1939     theZMax = RealLast();
1940     return;
1941   }
1942
1943   Standard_Real aXMin, aYMin, aZMin, aXMax, aYMax, aZMax;
1944   MinMaxCoord (aXMin, aYMin, aZMin, aXMax, aYMax, aZMax);
1945
1946   // Min-Max of the descendant structures
1947   Standard_Real aDescXMin = RealLast();
1948   Standard_Real aDescYMin = RealLast();
1949   Standard_Real aDescZMin = RealLast();
1950   Standard_Real aDescXMax = RealFirst();
1951   Standard_Real aDescYMax = RealFirst();
1952   Standard_Real aDescZMax = RealFirst();
1953   for (Standard_Integer aStructIt = 1; aStructIt <= myDescendants.Length(); aStructIt++)
1954   {
1955     Graphic3d_Structure* aStructure = (Graphic3d_Structure*) myDescendants.Value (aStructIt);
1956     if (aStructure->IsEmpty())
1957     {
1958       continue;
1959     }
1960
1961     aStructure->MinMaxCoordWithDescendants (aXMin, aYMin, aZMin, aXMax, aYMax, aZMax);
1962     aDescXMin = Min (aXMin, aDescXMin);
1963     aDescYMin = Min (aYMin, aDescYMin);
1964     aDescZMin = Min (aZMin, aDescZMin);
1965     aDescXMax = Max (aXMax, aDescXMax);
1966     aDescYMax = Max (aYMax, aDescYMax);
1967     aDescZMax = Max (aZMax, aDescZMax);
1968   }
1969
1970   if (aDescXMin != RealLast()  || aDescYMin != RealLast()  ||
1971       aDescZMin != RealLast()  || aDescXMax != RealFirst() ||
1972       aDescYMax != RealFirst() || aDescZMax != RealFirst())
1973   {
1974     TColStd_Array2OfReal aTrsf(0, 3, 0, 3);
1975     Transform (aTrsf);
1976     TransformBoundaries (aTrsf, aDescXMin, aDescYMin, aDescZMin, aDescXMax, aDescYMax, aDescZMax);
1977
1978     aXMin = Min (aDescXMin, aXMin);
1979     aYMin = Min (aDescYMin, aYMin);
1980     aZMin = Min (aDescZMin, aZMin);
1981     aXMax = Max (aDescXMax, aXMax);
1982     aYMax = Max (aDescYMax, aYMax);
1983     aZMax = Max (aDescZMax, aZMax);
1984   }
1985
1986   // Case impossible as it would mean that the structure is empty
1987   if (aXMin == RealLast()  && aYMin == RealLast()  && aZMin == RealLast() &&
1988       aXMax == RealFirst() && aYMax == RealFirst() && aZMax == RealFirst())
1989   {
1990     theXMin = RealFirst();
1991     theYMin = RealFirst();
1992     theZMin = RealFirst();
1993     theXMax = RealLast();
1994     theYMax = RealLast();
1995     theZMax = RealLast();
1996   }
1997
1998   theXMin = aXMin;
1999   theYMin = aYMin;
2000   theZMin = aZMin;
2001   theXMax = aXMax;
2002   theYMax = aYMax;
2003   theZMax = aZMax;
2004 }
2005
2006 //=============================================================================
2007 //function : Transforms
2008 //purpose  :
2009 //=============================================================================
2010 void Graphic3d_Structure::Transforms (const TColStd_Array2OfReal& theTrsf,
2011                                       const Standard_Real theX,    const Standard_Real theY,    const Standard_Real theZ,
2012                                       Standard_Real&      theNewX, Standard_Real&      theNewY, Standard_Real&      theNewZ)
2013 {
2014   const Standard_Real aRL = RealLast();
2015   const Standard_Real aRF = RealFirst();
2016   if ((theX == aRF) || (theY == aRF) || (theZ == aRF)
2017    || (theX == aRL) || (theY == aRL) || (theZ == aRL))
2018   {
2019     theNewX = theX;
2020     theNewY = theY;
2021     theNewZ = theZ;
2022   }
2023   else
2024   {
2025     Standard_Real A, B, C, D;
2026     A       = theTrsf (0, 0);
2027     B       = theTrsf (0, 1);
2028     C       = theTrsf (0, 2);
2029     D       = theTrsf (0, 3);
2030     theNewX = A * theX + B * theY + C * theZ + D;
2031     A       = theTrsf (1, 0);
2032     B       = theTrsf (1, 1);
2033     C       = theTrsf (1, 2);
2034     D       = theTrsf (1, 3);
2035     theNewY = A * theX + B * theY + C * theZ + D;
2036     A       = theTrsf (2, 0);
2037     B       = theTrsf (2, 1);
2038     C       = theTrsf (2, 2);
2039     D       = theTrsf (2, 3);
2040     theNewZ = A * theX + B * theY + C * theZ + D;
2041   }
2042 }
2043
2044 //=============================================================================
2045 //function : Transforms
2046 //purpose  :
2047 //=============================================================================
2048 Graphic3d_Vector Graphic3d_Structure::Transforms (const TColStd_Array2OfReal& theTrsf,
2049                                                   const Graphic3d_Vector&     theCoord)
2050 {
2051   Standard_Real anXYZ[3];
2052   Graphic3d_Structure::Transforms (theTrsf,
2053                                    theCoord.X(), theCoord.Y(), theCoord.Z(),
2054                                    anXYZ[0], anXYZ[1], anXYZ[2]);
2055   return Graphic3d_Vector (anXYZ[0], anXYZ[1], anXYZ[2]);
2056 }
2057
2058 //=============================================================================
2059 //function : Transforms
2060 //purpose  :
2061 //=============================================================================
2062 Graphic3d_Vertex Graphic3d_Structure::Transforms (const TColStd_Array2OfReal& theTrsf,
2063                                                   const Graphic3d_Vertex&     theCoord)
2064 {
2065   Standard_Real anXYZ[3];
2066   Graphic3d_Structure::Transforms (theTrsf,
2067                                    theCoord.X(), theCoord.Y(), theCoord.Z(),
2068                                    anXYZ[0], anXYZ[1], anXYZ[2]);
2069   return Graphic3d_Vertex (anXYZ[0], anXYZ[1], anXYZ[2]);
2070 }
2071
2072 //=============================================================================
2073 //function : Transforms
2074 //purpose  :
2075 //=============================================================================
2076 void Graphic3d_Structure::TransformBoundaries (const TColStd_Array2OfReal& theTrsf,
2077                                                Standard_Real& theXMin,
2078                                                Standard_Real& theYMin,
2079                                                Standard_Real& theZMin,
2080                                                Standard_Real& theXMax,
2081                                                Standard_Real& theYMax,
2082                                                Standard_Real& theZMax)
2083 {
2084   Standard_Real aXMin, aYMin, aZMin, aXMax, aYMax, aZMax, anU, aV, aW;
2085
2086   Graphic3d_Structure::Transforms (theTrsf, theXMin, theYMin, theZMin, aXMin, aYMin, aZMin);
2087   Graphic3d_Structure::Transforms (theTrsf, theXMax, theYMax, theZMax, aXMax, aYMax, aZMax);
2088
2089   Graphic3d_Structure::Transforms (theTrsf, theXMin, theYMin, theZMax, 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);
2093
2094   Graphic3d_Structure::Transforms (theTrsf, theXMax, theYMin, theZMax, anU, aV, aW);
2095   aXMin = Min (anU, aXMin); aXMax = Max (anU, aXMax);
2096   aYMin = Min (aV,  aYMin); aYMax = Max (aV,  aYMax);
2097   aZMin = Min (aW,  aZMin); aZMax = Max (aW,  aZMax);
2098
2099   Graphic3d_Structure::Transforms (theTrsf, theXMax, theYMin, theZMin, anU, aV, aW);
2100   aXMin = Min (anU, aXMin); aXMax = Max (anU, aXMax);
2101   aYMin = Min (aV,  aYMin); aYMax = Max (aV,  aYMax);
2102   aZMin = Min (aW,  aZMin); aZMax = Max (aW,  aZMax);
2103
2104   Graphic3d_Structure::Transforms (theTrsf, theXMax, theYMax, theZMin, anU, aV, aW);
2105   aXMin = Min (anU, aXMin); aXMax = Max (anU, aXMax);
2106   aYMin = Min (aV,  aYMin); aYMax = Max (aV,  aYMax);
2107   aZMin = Min (aW,  aZMin); aZMax = Max (aW,  aZMax);
2108
2109   Graphic3d_Structure::Transforms (theTrsf, theXMin, theYMax, theZMax, anU, aV, aW);
2110   aXMin = Min (anU, aXMin); aXMax = Max (anU, aXMax);
2111   aYMin = Min (aV,  aYMin); aYMax = Max (aV,  aYMax);
2112   aZMin = Min (aW,  aZMin); aZMax = Max (aW,  aZMax);
2113
2114   Graphic3d_Structure::Transforms (theTrsf, theXMin, theYMax, theZMin, anU, aV, aW);
2115   aXMin = Min (anU, aXMin); aXMax = Max (anU, aXMax);
2116   aYMin = Min (aV,  aYMin); aYMax = Max (aV,  aYMax);
2117   aZMin = Min (aW,  aZMin); aZMax = Max (aW,  aZMax);
2118
2119   theXMin = aXMin;
2120   theYMin = aYMin;
2121   theZMin = aZMin;
2122   theXMax = aXMax;
2123   theYMax = aYMax;
2124   theZMax = aZMax;
2125 }
2126
2127 //=============================================================================
2128 //function : Network
2129 //purpose  :
2130 //=============================================================================
2131 void Graphic3d_Structure::Network (const Handle(Graphic3d_Structure)& theStructure,
2132                                    const Graphic3d_TypeOfConnection   theType,
2133                                    Graphic3d_MapOfStructure&          theSet)
2134 {
2135   Graphic3d_MapOfStructure aSetD, aSetA;
2136   theStructure->Descendants (aSetD);
2137   theStructure->Ancestors   (aSetA);
2138   theSet.Add (theStructure);
2139   switch (theType)
2140   {
2141     case Graphic3d_TOC_DESCENDANT:
2142       for (Graphic3d_MapIteratorOfMapOfStructure anIter (aSetD); anIter.More(); anIter.Next())
2143       {
2144         Graphic3d_Structure::Network (anIter.Key(), theType, theSet);
2145       }
2146       break;
2147     case Graphic3d_TOC_ANCESTOR:
2148       for (Graphic3d_MapIteratorOfMapOfStructure anIter (aSetA); anIter.More(); anIter.Next())
2149       {
2150         Graphic3d_Structure::Network (anIter.Key (), theType, theSet);
2151       }
2152       break;
2153   }
2154 }
2155
2156 //=============================================================================
2157 //function : PrintNetwork
2158 //purpose  :
2159 //=============================================================================
2160 void Graphic3d_Structure::PrintNetwork (const Handle(Graphic3d_Structure)& theStructure,
2161                                         const Graphic3d_TypeOfConnection   theType)
2162 {
2163   Graphic3d_MapOfStructure aSet;
2164   Graphic3d_Structure::Network (theStructure, theType, aSet);
2165   for (Graphic3d_MapIteratorOfMapOfStructure anIter (aSet); anIter.More(); anIter.Next())
2166   {
2167     std::cout << "\tIdent " << (anIter.Key())->Identification () << "\n";
2168   }
2169   std::cout << std::flush;
2170 }
2171
2172 //=============================================================================
2173 //function : Update
2174 //purpose  :
2175 //=============================================================================
2176 void Graphic3d_Structure::Update() const
2177 {
2178   if (IsDeleted())
2179   {
2180     return;
2181   }
2182
2183   if (myStructureManager->UpdateMode() == Aspect_TOU_ASAP)
2184   {
2185     myStructureManager->Update();
2186   }
2187 }
2188
2189 //=============================================================================
2190 //function : UpdateStructure
2191 //purpose  :
2192 //=============================================================================
2193 void Graphic3d_Structure::UpdateStructure (const Handle(Graphic3d_AspectLine3d)&     theAspLine,
2194                                            const Handle(Graphic3d_AspectText3d)&     theAspText,
2195                                            const Handle(Graphic3d_AspectMarker3d)&   theAspMarker,
2196                                            const Handle(Graphic3d_AspectFillArea3d)& theAspFill)
2197 {
2198   Standard_CString          aFont;
2199   Standard_Real             aSpace, anExpansion, aWidth, aScale;
2200   Quantity_Color            aColor, anIntColor, aBackIntColor, anEdgeColor, aColorSub;
2201   Aspect_TypeOfLine         aLType;
2202   Aspect_TypeOfMarker       aMType;
2203   Aspect_InteriorStyle      aStyle;
2204   Aspect_TypeOfStyleText    aStyleT;
2205   Aspect_TypeOfDisplayText  aDisplayType;
2206   Standard_Boolean          aTextZoomable;
2207   Standard_Real             aTextAngle;
2208   Font_FontAspect           aTextFontAspect;
2209
2210   theAspLine->Values (aColor, aLType, aWidth);
2211   myCStructure->ContextLine.Color.r        = float (aColor.Red());
2212   myCStructure->ContextLine.Color.g        = float (aColor.Green());
2213   myCStructure->ContextLine.Color.b        = float (aColor.Blue());
2214   myCStructure->ContextLine.LineType       = aLType;
2215   myCStructure->ContextLine.Width          = float (aWidth);
2216   myCStructure->ContextLine.ShaderProgram  = theAspLine->ShaderProgram();
2217
2218   theAspMarker->Values (aColor, aMType, aScale);
2219   myCStructure->ContextMarker.Color.r      = float (aColor.Red());
2220   myCStructure->ContextMarker.Color.g      = float (aColor.Green());
2221   myCStructure->ContextMarker.Color.b      = float (aColor.Blue());
2222   myCStructure->ContextMarker.MarkerType   = aMType;
2223   myCStructure->ContextMarker.Scale        = float (aScale);
2224   myCStructure->ContextMarker.ShaderProgram = theAspMarker->ShaderProgram();
2225
2226   theAspText->Values (aColor, aFont, anExpansion, aSpace, aStyleT, aDisplayType, aColorSub, aTextZoomable, aTextAngle, aTextFontAspect);
2227   myCStructure->ContextText.Color.r          = float (aColor.Red());
2228   myCStructure->ContextText.Color.g          = float (aColor.Green());
2229   myCStructure->ContextText.Color.b          = float (aColor.Blue());
2230   myCStructure->ContextText.Font             = aFont;
2231   myCStructure->ContextText.Expan            = float (anExpansion);
2232   myCStructure->ContextText.Style            = aStyleT;
2233   myCStructure->ContextText.DisplayType      = aDisplayType;
2234   myCStructure->ContextText.Space            = float (aSpace);
2235   myCStructure->ContextText.ColorSubTitle.r  = float (aColorSub.Red());
2236   myCStructure->ContextText.ColorSubTitle.g  = float (aColorSub.Green());
2237   myCStructure->ContextText.ColorSubTitle.b  = float (aColorSub.Blue());
2238   myCStructure->ContextText.TextZoomable     = aTextZoomable;
2239   myCStructure->ContextText.TextAngle        = float (aTextAngle);
2240   myCStructure->ContextText.TextFontAspect   = aTextFontAspect;
2241   myCStructure->ContextText.ShaderProgram    = theAspText->ShaderProgram();
2242
2243   Standard_Real anRGB[3];
2244   theAspFill->Values (aStyle, anIntColor, aBackIntColor, anEdgeColor, aLType, aWidth);
2245   anIntColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
2246   myCStructure->ContextFillArea.Style      = aStyle;
2247   myCStructure->ContextFillArea.IntColor.r = float (anRGB[0]);
2248   myCStructure->ContextFillArea.IntColor.g = float (anRGB[1]);
2249   myCStructure->ContextFillArea.IntColor.b = float (anRGB[2]);
2250
2251   if (theAspFill->Distinguish())
2252   {
2253     aBackIntColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
2254   }
2255   myCStructure->ContextFillArea.BackIntColor.r = float (anRGB[0]);
2256   myCStructure->ContextFillArea.BackIntColor.g = float (anRGB[1]);
2257   myCStructure->ContextFillArea.BackIntColor.b = float (anRGB[2]);
2258
2259   // Edges
2260   myCStructure->ContextFillArea.Edge               = theAspFill->Edge () ? 1:0;
2261   myCStructure->ContextFillArea.EdgeColor.r        = float (anEdgeColor.Red());
2262   myCStructure->ContextFillArea.EdgeColor.g        = float (anEdgeColor.Green());
2263   myCStructure->ContextFillArea.EdgeColor.b        = float (anEdgeColor.Blue());
2264   myCStructure->ContextFillArea.LineType           = aLType;
2265   myCStructure->ContextFillArea.Width              = float (aWidth);
2266   myCStructure->ContextFillArea.Hatch              = theAspFill->HatchStyle();
2267
2268   // Front and Back face
2269   myCStructure->ContextFillArea.Distinguish        = theAspFill->Distinguish() ? 1 : 0;
2270   myCStructure->ContextFillArea.BackFace           = theAspFill->BackFace()    ? 1 : 0;
2271   // Back Material
2272   const Graphic3d_MaterialAspect& aBack = theAspFill->BackMaterial();
2273   // Light specificity
2274   myCStructure->ContextFillArea.Back.Shininess     = float (aBack.Shininess());
2275   myCStructure->ContextFillArea.Back.Ambient       = float (aBack.Ambient());
2276   myCStructure->ContextFillArea.Back.Diffuse       = float (aBack.Diffuse());
2277   myCStructure->ContextFillArea.Back.Specular      = float (aBack.Specular());
2278   myCStructure->ContextFillArea.Back.Transparency  = float (aBack.Transparency());
2279   myCStructure->ContextFillArea.Back.Emission      = float (aBack.Emissive());
2280
2281   // Reflection mode
2282   myCStructure->ContextFillArea.Back.IsAmbient     = (aBack.ReflectionMode (Graphic3d_TOR_AMBIENT)  ? 1 : 0);
2283   myCStructure->ContextFillArea.Back.IsDiffuse     = (aBack.ReflectionMode (Graphic3d_TOR_DIFFUSE)  ? 1 : 0);
2284   myCStructure->ContextFillArea.Back.IsSpecular    = (aBack.ReflectionMode (Graphic3d_TOR_SPECULAR) ? 1 : 0);
2285   myCStructure->ContextFillArea.Back.IsEmission    = (aBack.ReflectionMode (Graphic3d_TOR_EMISSION) ? 1 : 0);
2286
2287   // Material type
2288   myCStructure->ContextFillArea.Back.IsPhysic      = (aBack.MaterialType (Graphic3d_MATERIAL_PHYSIC) ? 1 : 0);
2289
2290   // Specular color
2291   myCStructure->ContextFillArea.Back.ColorSpec.r   = float (aBack.SpecularColor().Red());
2292   myCStructure->ContextFillArea.Back.ColorSpec.g   = float (aBack.SpecularColor().Green());
2293   myCStructure->ContextFillArea.Back.ColorSpec.b   = float (aBack.SpecularColor().Blue());
2294
2295   // Ambient color
2296   myCStructure->ContextFillArea.Back.ColorAmb.r    = float (aBack.AmbientColor().Red());
2297   myCStructure->ContextFillArea.Back.ColorAmb.g    = float (aBack.AmbientColor().Green());
2298   myCStructure->ContextFillArea.Back.ColorAmb.b    = float (aBack.AmbientColor().Blue());
2299
2300   // Diffuse color
2301   myCStructure->ContextFillArea.Back.ColorDif.r    = float (aBack.DiffuseColor().Red());
2302   myCStructure->ContextFillArea.Back.ColorDif.g    = float (aBack.DiffuseColor().Green());
2303   myCStructure->ContextFillArea.Back.ColorDif.b    = float (aBack.DiffuseColor().Blue());
2304
2305   // Emissive color
2306   myCStructure->ContextFillArea.Back.ColorEms.r    = float (aBack.EmissiveColor().Red());
2307   myCStructure->ContextFillArea.Back.ColorEms.g    = float (aBack.EmissiveColor().Green());
2308   myCStructure->ContextFillArea.Back.ColorEms.b    = float (aBack.EmissiveColor().Blue());
2309
2310   myCStructure->ContextFillArea.Back.EnvReflexion  = float (aBack.EnvReflexion());
2311
2312   // Front Material
2313   const Graphic3d_MaterialAspect& aFront = theAspFill->FrontMaterial();
2314   // Light specificity
2315   myCStructure->ContextFillArea.Front.Shininess    = float (aFront.Shininess());
2316   myCStructure->ContextFillArea.Front.Ambient      = float (aFront.Ambient());
2317   myCStructure->ContextFillArea.Front.Diffuse      = float (aFront.Diffuse());
2318   myCStructure->ContextFillArea.Front.Specular     = float (aFront.Specular());
2319   myCStructure->ContextFillArea.Front.Transparency = float (aFront.Transparency());
2320   myCStructure->ContextFillArea.Front.Emission     = float (aFront.Emissive());
2321
2322   // Reflection mode
2323   myCStructure->ContextFillArea.Front.IsAmbient    = (aFront.ReflectionMode (Graphic3d_TOR_AMBIENT)  ? 1 : 0);
2324   myCStructure->ContextFillArea.Front.IsDiffuse    = (aFront.ReflectionMode (Graphic3d_TOR_DIFFUSE)  ? 1 : 0);
2325   myCStructure->ContextFillArea.Front.IsSpecular   = (aFront.ReflectionMode (Graphic3d_TOR_SPECULAR) ? 1 : 0);
2326   myCStructure->ContextFillArea.Front.IsEmission   = (aFront.ReflectionMode (Graphic3d_TOR_EMISSION) ? 1 : 0);
2327
2328   // Material type
2329   myCStructure->ContextFillArea.Front.IsPhysic     = (aFront.MaterialType (Graphic3d_MATERIAL_PHYSIC) ? 1 : 0);
2330
2331   // Specular color
2332   myCStructure->ContextFillArea.Front.ColorSpec.r  = float (aFront.SpecularColor().Red());
2333   myCStructure->ContextFillArea.Front.ColorSpec.g  = float (aFront.SpecularColor().Green());
2334   myCStructure->ContextFillArea.Front.ColorSpec.b  = float (aFront.SpecularColor().Blue());
2335
2336   // Ambient color
2337   myCStructure->ContextFillArea.Front.ColorAmb.r   = float (aFront.AmbientColor().Red());
2338   myCStructure->ContextFillArea.Front.ColorAmb.g   = float (aFront.AmbientColor().Green());
2339   myCStructure->ContextFillArea.Front.ColorAmb.b   = float (aFront.AmbientColor().Blue());
2340
2341   // Diffuse color
2342   myCStructure->ContextFillArea.Front.ColorDif.r   = float (aFront.DiffuseColor().Red());
2343   myCStructure->ContextFillArea.Front.ColorDif.g   = float (aFront.DiffuseColor().Green());
2344   myCStructure->ContextFillArea.Front.ColorDif.b   = float (aFront.DiffuseColor().Blue());
2345
2346   // Emissive color
2347   myCStructure->ContextFillArea.Front.ColorEms.r   = float (aFront.EmissiveColor().Red());
2348   myCStructure->ContextFillArea.Front.ColorEms.g   = float (aFront.EmissiveColor().Green());
2349   myCStructure->ContextFillArea.Front.ColorEms.b   = float (aFront.EmissiveColor().Blue());
2350
2351   myCStructure->ContextFillArea.Front.EnvReflexion = float (aFront.EnvReflexion());
2352
2353   myCStructure->ContextFillArea.Texture.TextureMap   = theAspFill->TextureMap();
2354   myCStructure->ContextFillArea.Texture.doTextureMap = theAspFill->TextureMapState() ? 1 : 0;
2355   myCStructure->ContextFillArea.ShaderProgram        = theAspFill->ShaderProgram();
2356
2357   Standard_Integer   aPolyMode;
2358   Standard_ShortReal aPolyFactor, aPolyUnits;
2359   theAspFill->PolygonOffsets (aPolyMode, aPolyFactor, aPolyUnits);
2360   myCStructure->ContextFillArea.PolygonOffsetMode   = aPolyMode;
2361   myCStructure->ContextFillArea.PolygonOffsetFactor = aPolyFactor;
2362   myCStructure->ContextFillArea.PolygonOffsetUnits  = aPolyUnits;
2363 }
2364
2365 //=============================================================================
2366 //function : GraphicHighlight
2367 //purpose  :
2368 //=============================================================================
2369 void Graphic3d_Structure::GraphicHighlight (const Aspect_TypeOfHighlightMethod theMethod)
2370 {
2371   Standard_Real anRGB[3];
2372   myCStructure->highlight = 1;
2373   myHighlightMethod = theMethod;
2374   switch (theMethod)
2375   {
2376     case Aspect_TOHM_COLOR:
2377     {
2378       myHighlightColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
2379       myCStructure->HighlightWithColor (Graphic3d_Vec3 (float (anRGB[0]), float (anRGB[1]), float (anRGB[2])), Standard_True);
2380       myCStructure->UpdateNamedStatus();
2381       break;
2382     }
2383     case Aspect_TOHM_BOUNDBOX:
2384     {
2385       Standard_Real XMin, YMin, ZMin, XMax, YMax, ZMax;
2386       if (IsEmpty() || IsInfinite())
2387       {
2388         // Empty or infinite structure
2389         XMin = YMin = ZMin = 0.0;
2390         XMax = YMax = ZMax = 0.0;
2391       }
2392       else
2393       {
2394         MinMaxCoordWithDescendants (XMin, YMin, ZMin, XMax, YMax, ZMax);
2395       }
2396       myCStructure->BoundBox.Pmin.x  = float (XMin);
2397       myCStructure->BoundBox.Pmin.y  = float (YMin);
2398       myCStructure->BoundBox.Pmin.z  = float (ZMin);
2399       myCStructure->BoundBox.Pmax.x  = float (XMax);
2400       myCStructure->BoundBox.Pmax.y  = float (YMax);
2401       myCStructure->BoundBox.Pmax.z  = float (ZMax);
2402       myHighlightColor.Values (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB);
2403       myCStructure->BoundBox.Color.r = float (anRGB[0]);
2404       myCStructure->BoundBox.Color.g = float (anRGB[1]);
2405       myCStructure->BoundBox.Color.b = float (anRGB[2]);
2406       myCStructure->HighlightWithBndBox (this, Standard_True);
2407       break;
2408     }
2409   }
2410 }
2411
2412 //=============================================================================
2413 //function : GraphicTransform
2414 //purpose  :
2415 //=============================================================================
2416 void Graphic3d_Structure::GraphicTransform (const TColStd_Array2OfReal& theMatrix)
2417 {
2418   for (Standard_Integer i = 0; i <= 3; ++i)
2419   {
2420     for (Standard_Integer j = 0; j <= 3; ++j)
2421     {
2422       myCStructure->Transformation[i][j] = float (theMatrix (i, j));
2423     }
2424   }
2425   myCStructure->UpdateTransformation();
2426 }
2427
2428 //=============================================================================
2429 //function : GraphicUnHighlight
2430 //purpose  :
2431 //=============================================================================
2432 void Graphic3d_Structure::GraphicUnHighlight()
2433 {
2434   myCStructure->highlight = 0;
2435   switch (myHighlightMethod)
2436   {
2437     case Aspect_TOHM_COLOR:
2438       myCStructure->HighlightWithColor (Graphic3d_Vec3 (0.0f, 0.0f, 0.0f), Standard_False);
2439       myCStructure->UpdateNamedStatus();
2440       break;
2441     case Aspect_TOHM_BOUNDBOX:
2442       myCStructure->HighlightWithBndBox (this, Standard_False);
2443       myCStructure->UpdateNamedStatus();
2444       break;
2445   }
2446 }
2447
2448 //=============================================================================
2449 //function : ComputeVisual
2450 //purpose  :
2451 //=============================================================================
2452 Graphic3d_TypeOfStructure Graphic3d_Structure::ComputeVisual() const
2453 {
2454   return myComputeVisual;
2455 }
2456
2457 //=============================================================================
2458 //function : SetComputeVisual
2459 //purpose  :
2460 //=============================================================================
2461 void Graphic3d_Structure::SetComputeVisual (const Graphic3d_TypeOfStructure theVisual)
2462 {
2463   // The ComputeVisual is saved only if the structure is declared TOS_ALL, TOS_WIREFRAME or TOS_SHADING.
2464   // This declaration permits to calculate proper representation of the structure calculated by Compute instead of passage to TOS_COMPUTED.
2465   if (theVisual != Graphic3d_TOS_COMPUTED)
2466   {
2467     myComputeVisual = theVisual;
2468   }
2469 }
2470
2471 //=============================================================================
2472 //function : Plot
2473 //purpose  :
2474 //=============================================================================
2475 void Graphic3d_Structure::Plot (const Handle(Graphic3d_Plotter)& )
2476 {
2477   //
2478 }
2479
2480 //=============================================================================
2481 //function : SetHLRValidation
2482 //purpose  :
2483 //=============================================================================
2484 void Graphic3d_Structure::SetHLRValidation (const Standard_Boolean theFlag)
2485 {
2486   myCStructure->HLRValidation = theFlag ? 1 : 0;
2487 }
2488
2489 //=============================================================================
2490 //function : HLRValidation
2491 //purpose  :
2492 //=============================================================================
2493 Standard_Boolean Graphic3d_Structure::HLRValidation() const
2494 {
2495   // Hidden parts stored in <me> are valid if :
2496   // 1/ the owner is defined.
2497   // 2/ they are not invalid.
2498   return myOwner != NULL
2499       && myCStructure->HLRValidation != 0;
2500 }
2501
2502 //=======================================================================
2503 //function : SetZLayer
2504 //purpose  :
2505 //=======================================================================
2506 void Graphic3d_Structure::SetZLayer (const Standard_Integer theLayerId)
2507 {
2508   // if the structure is not displayed, unable to change its display layer
2509   if (IsDeleted ())
2510     return;
2511
2512   myStructureManager->ChangeZLayer (this, theLayerId);
2513 }
2514
2515 //=======================================================================
2516 //function : GetZLayer
2517 //purpose  :
2518 //=======================================================================
2519 Standard_Integer Graphic3d_Structure::GetZLayer () const
2520 {
2521   return myStructureManager->GetZLayer (this);
2522 }
2523
2524 //=======================================================================
2525 //function : SetClipPlanes
2526 //purpose  :
2527 //=======================================================================
2528 void Graphic3d_Structure::SetClipPlanes (const Graphic3d_SequenceOfHClipPlane& thePlanes)
2529 {
2530   myCStructure->SetClipPlanes (thePlanes);
2531 }
2532
2533 //=======================================================================
2534 //function : GetClipPlanes
2535 //purpose  :
2536 //=======================================================================
2537 const Graphic3d_SequenceOfHClipPlane& Graphic3d_Structure::GetClipPlanes() const
2538 {
2539   return myCStructure->ClipPlanes();
2540 }