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