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