Commit | Line | Data |
---|---|---|
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 | //============================================================================= | |
37 | Graphic3d_Structure::Graphic3d_Structure (const Handle(Graphic3d_StructureManager)& theManager) | |
38 | : myStructureManager (theManager.operator->()), | |
39 | myFirstStructureManager (theManager.operator->()), | |
40 | myComputeVisual (Graphic3d_TOS_ALL), | |
41 | myHighlightColor (Quantity_NOC_WHITE), | |
42 | myHighlightMethod (Aspect_TOHM_COLOR), | |
43 | myOwner (NULL), | |
44 | myVisual (Graphic3d_TOS_ALL) | |
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 | ||
679ecdee | 60 | //============================================================================= |
61 | //function : Graphic3d_Structure | |
62 | //purpose : | |
63 | //============================================================================= | |
64 | Graphic3d_Structure::Graphic3d_Structure (const Handle(Graphic3d_StructureManager)& theManager, | |
65 | const Handle(Graphic3d_Structure)& thePrs) | |
66 | : myStructureManager (theManager.operator->()), | |
67 | myFirstStructureManager (theManager.operator->()), | |
68 | myComputeVisual (thePrs->myComputeVisual), | |
69 | myHighlightColor (thePrs->myHighlightColor), | |
70 | myHighlightMethod (thePrs->myHighlightMethod), | |
71 | myOwner (thePrs->myOwner), | |
72 | myVisual (thePrs->myVisual) | |
73 | { | |
74 | myCStructure = thePrs->myCStructure->ShadowLink (theManager); | |
75 | ||
76 | // default aspects | |
77 | Handle(Graphic3d_AspectLine3d) aAspectLine3d = new Graphic3d_AspectLine3d(); | |
78 | Handle(Graphic3d_AspectText3d) aAspectText3d = new Graphic3d_AspectText3d(); | |
79 | Handle(Graphic3d_AspectMarker3d) aAspectMarker3d = new Graphic3d_AspectMarker3d(); | |
80 | Handle(Graphic3d_AspectFillArea3d) aAspectFillArea3d = new Graphic3d_AspectFillArea3d(); | |
81 | theManager->PrimitivesAspect (aAspectLine3d, aAspectText3d, aAspectMarker3d, aAspectFillArea3d); | |
82 | aAspectFillArea3d->SetPolygonOffsets (Aspect_POM_Fill, 1.0, 0.0); | |
83 | ||
84 | // update the associated CStructure | |
85 | UpdateStructure (aAspectLine3d, aAspectText3d, aAspectMarker3d, aAspectFillArea3d); | |
86 | } | |
87 | ||
63bcc448 | 88 | //============================================================================= |
89 | //function : Destroy | |
90 | //purpose : | |
91 | //============================================================================= | |
92 | void 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 | //============================================================================= | |
104 | void 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 | //============================================================================= | |
121 | void 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 | //============================================================================= | |
172 | void 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 | //============================================================================= | |
189 | void 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 | //============================================================================= | |
208 | void 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 | //============================================================================= | |
235 | void 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 | //============================================================================= | |
255 | Standard_Integer Graphic3d_Structure::DisplayPriority() const | |
256 | { | |
257 | return myCStructure->Priority; | |
7fd59977 | 258 | } |
259 | ||
63bcc448 | 260 | //============================================================================= |
261 | //function : Erase | |
262 | //purpose : | |
263 | //============================================================================= | |
264 | void 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 | //============================================================================= | |
282 | void 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 | //============================================================================= | |
322 | void 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 | //============================================================================= | |
357 | void 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 | //============================================================================= | |
370 | void 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 | //============================================================================= | |
392 | void 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 | //============================================================================= | |
412 | const Quantity_Color& Graphic3d_Structure::HighlightColor() const | |
413 | { | |
414 | return myHighlightColor; | |
7fd59977 | 415 | } |
416 | ||
63bcc448 | 417 | //============================================================================= |
418 | //function : IsDisplayed | |
419 | //purpose : | |
420 | //============================================================================= | |
421 | Standard_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 | //============================================================================= | |
430 | Standard_Boolean Graphic3d_Structure::IsDeleted() const | |
431 | { | |
432 | return myCStructure.IsNull(); | |
7fd59977 | 433 | } |
434 | ||
63bcc448 | 435 | //============================================================================= |
436 | //function : IsHighlighted | |
437 | //purpose : | |
438 | //============================================================================= | |
439 | Standard_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 | //============================================================================= | |
448 | Standard_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 | //============================================================================= | |
457 | Standard_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 | //============================================================================= | |
466 | Standard_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 | //============================================================================= | |
481 | Standard_Boolean Graphic3d_Structure::IsTransformed() const | |
482 | { | |
483 | Standard_Boolean aResult = Standard_False; | |
484 | for (Standard_Integer i = 0; i <= 3 && !aResult; ++i) | |
485 | { | |
486 | for (Standard_Integer j = 0; j <= 3 && !aResult; ++j) | |
487 | { | |
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 | //============================================================================= | |
501 | Standard_Boolean Graphic3d_Structure::ContainsFacet() const | |
502 | { | |
503 | if (IsDeleted()) | |
504 | { | |
505 | return Standard_False; | |
506 | } | |
507 | else if (myCStructure->ContainsFacet > 0) | |
508 | { | |
509 | // if one of groups contains at least one facet, the structure contains it too | |
510 | return Standard_True; | |
511 | } | |
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 | //============================================================================= | |
529 | Standard_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 | //============================================================================= | |
564 | void Graphic3d_Structure::PrimitivesAspect (Handle(Graphic3d_AspectLine3d)& theAspLine, | |
565 | Handle(Graphic3d_AspectText3d)& theAspText, | |
566 | Handle(Graphic3d_AspectMarker3d)& theAspMarker, | |
567 | Handle(Graphic3d_AspectFillArea3d)& theAspFill) const | |
568 | { | |
569 | theAspLine = Line3dAspect(); | |
570 | theAspText = Text3dAspect(); | |
571 | theAspMarker = Marker3dAspect(); | |
572 | theAspFill = FillArea3dAspect(); | |
7fd59977 | 573 | } |
574 | ||
63bcc448 | 575 | //============================================================================= |
576 | //function : GroupsWithFacet | |
577 | //purpose : | |
578 | //============================================================================= | |
579 | void Graphic3d_Structure::GroupsWithFacet (const Standard_Integer theDelta) | |
580 | { | |
581 | myCStructure->ContainsFacet = myCStructure->ContainsFacet + theDelta; | |
582 | if (myCStructure->ContainsFacet < 0) | |
583 | { | |
584 | myCStructure->ContainsFacet = 0; | |
585 | } | |
7fd59977 | 586 | } |
587 | ||
63bcc448 | 588 | //============================================================================= |
589 | //function : Compute | |
590 | //purpose : | |
591 | //============================================================================= | |
eb4320f2 | 592 | void Graphic3d_Structure::Compute() |
593 | { | |
594 | // Implemented by Presentation | |
595 | } | |
596 | ||
63bcc448 | 597 | //============================================================================= |
598 | //function : Compute | |
599 | //purpose : | |
600 | //============================================================================= | |
601 | Handle(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 | //============================================================================= | |
611 | Handle(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 | //============================================================================= | |
622 | void 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 | //============================================================================= | |
632 | void 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 | //============================================================================= | |
643 | void Graphic3d_Structure::ReCompute() | |
644 | { | |
645 | myStructureManager->ReCompute (this); | |
7fd59977 | 646 | } |
647 | ||
63bcc448 | 648 | //============================================================================= |
649 | //function : ReCompute | |
650 | //purpose : | |
651 | //============================================================================= | |
652 | void 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 | //============================================================================= | |
661 | void 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 | //============================================================================= | |
670 | Standard_Boolean Graphic3d_Structure::IsInfinite() const | |
671 | { | |
672 | return IsDeleted() | |
673 | || myCStructure->IsInfinite; | |
7fd59977 | 674 | } |
675 | ||
63bcc448 | 676 | //============================================================================= |
677 | //function : GraphicClear | |
678 | //purpose : | |
679 | //============================================================================= | |
680 | void 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 | 709 | void 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 | 718 | void 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 | //============================================================================= | |
727 | Handle(Graphic3d_AspectLine3d) Graphic3d_Structure::Line3dAspect() const | |
728 | { | |
729 | const Standard_Real anRGB[3] = | |
730 | { | |
731 | Standard_Real (myCStructure->ContextLine.Color.r), | |
732 | Standard_Real (myCStructure->ContextLine.Color.g), | |
733 | Standard_Real (myCStructure->ContextLine.Color.b) | |
734 | }; | |
735 | Quantity_Color aColor; | |
736 | aColor.SetValues (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB); | |
737 | Aspect_TypeOfLine aLType = Aspect_TypeOfLine (myCStructure->ContextLine.LineType); | |
738 | Standard_Real aWidth = Standard_Real (myCStructure->ContextLine.Width); | |
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 | //============================================================================= | |
749 | Handle(Graphic3d_AspectText3d) Graphic3d_Structure::Text3dAspect() const | |
750 | { | |
751 | const Standard_Real anRGB[3] = | |
752 | { | |
753 | Standard_Real (myCStructure->ContextText.Color.r), | |
754 | Standard_Real (myCStructure->ContextText.Color.g), | |
755 | Standard_Real (myCStructure->ContextText.Color.b) | |
756 | }; | |
757 | Quantity_Color aColor; | |
758 | aColor.SetValues (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB); | |
759 | Standard_CString aFont = Standard_CString (myCStructure->ContextText.Font); | |
760 | Standard_Real anExpansion = Standard_Real (myCStructure->ContextText.Expan); | |
761 | Standard_Real aSpace = Standard_Real (myCStructure->ContextText.Space); | |
762 | Aspect_TypeOfStyleText aStyle = Aspect_TypeOfStyleText (myCStructure->ContextText.Style); | |
763 | Aspect_TypeOfDisplayText aDispType = Aspect_TypeOfDisplayText (myCStructure->ContextText.DisplayType); | |
764 | ||
765 | Handle(Graphic3d_AspectText3d) anAspText = new Graphic3d_AspectText3d (aColor, aFont, anExpansion, aSpace, aStyle, aDispType); | |
766 | anAspText->SetShaderProgram (myCStructure->ContextText.ShaderProgram); | |
767 | return anAspText; | |
7fd59977 | 768 | } |
769 | ||
63bcc448 | 770 | //============================================================================= |
771 | //function : Marker3dAspect | |
772 | //purpose : | |
773 | //============================================================================= | |
774 | Handle(Graphic3d_AspectMarker3d) Graphic3d_Structure::Marker3dAspect() const | |
775 | { | |
776 | const Standard_Real anRGB[3] = | |
777 | { | |
778 | Standard_Real (myCStructure->ContextMarker.Color.r), | |
779 | Standard_Real (myCStructure->ContextMarker.Color.g), | |
780 | Standard_Real (myCStructure->ContextMarker.Color.b) | |
781 | }; | |
782 | Quantity_Color aColor; | |
783 | aColor.SetValues (anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB); | |
784 | Aspect_TypeOfMarker aMType = myCStructure->ContextMarker.MarkerType; | |
785 | Standard_Real aScale = Standard_Real (myCStructure->ContextMarker.Scale); | |
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 | //============================================================================= | |
796 | Handle(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 | //============================================================================= | |
944 | const Graphic3d_SequenceOfGroup& Graphic3d_Structure::Groups() const | |
945 | { | |
b64d84be | 946 | return myCStructure->Groups(); |
7fd59977 | 947 | } |
948 | ||
63bcc448 | 949 | //============================================================================= |
950 | //function : NumberOfGroups | |
951 | //purpose : | |
952 | //============================================================================= | |
953 | Standard_Integer Graphic3d_Structure::NumberOfGroups() const | |
954 | { | |
b64d84be | 955 | return myCStructure->Groups().Length(); |
7fd59977 | 956 | } |
957 | ||
63bcc448 | 958 | //============================================================================= |
959 | //function : SetPrimitivesAspect | |
960 | //purpose : | |
961 | //============================================================================= | |
962 | void 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 | //============================================================================= | |
994 | void 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 | //============================================================================= | |
1149 | void 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 | //============================================================================= | |
1195 | void 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 | //============================================================================= | |
1227 | void 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 | //============================================================================= | |
1267 | void 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 | //============================================================================= | |
1284 | Graphic3d_TypeOfStructure Graphic3d_Structure::Visual() const | |
1285 | { | |
1286 | return myVisual; | |
7fd59977 | 1287 | } |
1288 | ||
63bcc448 | 1289 | //============================================================================= |
1290 | //function : AcceptConnection | |
1291 | //purpose : | |
1292 | //============================================================================= | |
1293 | Standard_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 | //============================================================================= | |
1307 | void 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 | //============================================================================= | |
1320 | void Graphic3d_Structure::SetOwner (const Standard_Address theOwner) | |
1321 | { | |
1322 | myOwner = theOwner; | |
7fd59977 | 1323 | } |
1324 | ||
63bcc448 | 1325 | //============================================================================= |
1326 | //function : Owner | |
1327 | //purpose : | |
1328 | //============================================================================= | |
1329 | Standard_Address Graphic3d_Structure::Owner() const | |
1330 | { | |
1331 | return myOwner; | |
7fd59977 | 1332 | } |
1333 | ||
63bcc448 | 1334 | //============================================================================= |
1335 | //function : Descendants | |
1336 | //purpose : | |
1337 | //============================================================================= | |
1338 | void 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 | //============================================================================= | |
1351 | void 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 | //============================================================================= | |
1410 | void 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 | //============================================================================= | |
1447 | void 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 | //============================================================================= | |
1486 | Graphic3d_TypeOfComposition Graphic3d_Structure::Composition() const | |
1487 | { | |
1488 | return myCStructure->Composition; | |
7fd59977 | 1489 | } |
1490 | ||
63bcc448 | 1491 | //============================================================================= |
1492 | //function : SetTransform | |
1493 | //purpose : | |
1494 | //============================================================================= | |
1495 | void 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 | //============================================================================= | |
1591 | void 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 | //============================================================================= | |
1615 | void Graphic3d_Structure::MinMaxValues (Standard_Real& theXMin, | |
1616 | Standard_Real& theYMin, | |
1617 | Standard_Real& theZMin, | |
1618 | Standard_Real& theXMax, | |
1619 | Standard_Real& theYMax, | |
1620 | Standard_Real& theZMax, | |
1621 | const Standard_Boolean theToIgnoreInfiniteFlag) const | |
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 | //============================================================================= | |
1731 | Standard_Integer Graphic3d_Structure::Identification() const | |
1732 | { | |
1733 | return myCStructure->Id; | |
7fd59977 | 1734 | } |
1735 | ||
63bcc448 | 1736 | //============================================================================= |
1737 | //function : SetTransformPersistence | |
1738 | //purpose : | |
1739 | //============================================================================= | |
1740 | void 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 | //============================================================================= | |
1749 | void 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 | 1767 | Graphic3d_TransModeFlags Graphic3d_Structure::TransformPersistenceMode() const |
1768 | { | |
63bcc448 | 1769 | return myCStructure->TransformPersistence.Flag; |
7fd59977 | 1770 | } |
1771 | ||
63bcc448 | 1772 | //============================================================================= |
1773 | //function : TransformPersistencePoint | |
1774 | //purpose : | |
1775 | //============================================================================= | |
7fd59977 | 1776 | gp_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 | //============================================================================= |
1786 | //function : Remove | |
1787 | //purpose : | |
1788 | //============================================================================= | |
1789 | void 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 | ||
b64d84be | 1823 | //============================================================================= |
1824 | //function : NewGroup | |
1825 | //purpose : | |
1826 | //============================================================================= | |
1827 | Handle(Graphic3d_Group) Graphic3d_Structure::NewGroup() | |
1828 | { | |
1829 | return myCStructure->NewGroup (this); | |
1830 | } | |
1831 | ||
63bcc448 | 1832 | //============================================================================= |
1833 | //function : Remove | |
1834 | //purpose : | |
1835 | //============================================================================= | |
1836 | void 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 | //============================================================================= | |
1852 | Handle(Graphic3d_StructureManager) Graphic3d_Structure::StructureManager() const | |
1853 | { | |
1854 | return myStructureManager; | |
7fd59977 | 1855 | } |
1856 | ||
197ac94e | 1857 | //============================================================================= |
1858 | //function : MinMaxCoord | |
1859 | //purpose : | |
1860 | //============================================================================= | |
1861 | void 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 | //============================================================================= | |
1927 | void 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 | //============================================================================= | |
2012 | void 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 | //============================================================================= | |
2050 | Graphic3d_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 | //============================================================================= | |
2064 | Graphic3d_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 | //============================================================================= | |
2078 | void 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 | //============================================================================= | |
2133 | void 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 | //============================================================================= | |
2162 | void 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 | //============================================================================= | |
2178 | void 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 | //============================================================================= | |
2195 | void 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 | //============================================================================= | |
2371 | void 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 | //============================================================================= | |
2418 | void 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 | //============================================================================= | |
2434 | void 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 | //============================================================================= | |
2454 | Graphic3d_TypeOfStructure Graphic3d_Structure::ComputeVisual() const | |
2455 | { | |
2456 | return myComputeVisual; | |
7fd59977 | 2457 | } |
2458 | ||
63bcc448 | 2459 | //============================================================================= |
2460 | //function : SetComputeVisual | |
2461 | //purpose : | |
2462 | //============================================================================= | |
2463 | void 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 | //============================================================================= | |
2477 | void 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 | //============================================================================= | |
2486 | Standard_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 | ||
59f45b7c | 2495 | //======================================================================= |
2496 | //function : SetZLayer | |
2497 | //purpose : | |
2498 | //======================================================================= | |
59f45b7c | 2499 | void 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 | 2512 | Standard_Integer Graphic3d_Structure::GetZLayer () const |
2513 | { | |
63bcc448 | 2514 | return myStructureManager->GetZLayer (this); |
59f45b7c | 2515 | } |
4269bd1b | 2516 | |
2517 | //======================================================================= | |
2518 | //function : SetClipPlanes | |
2519 | //purpose : | |
2520 | //======================================================================= | |
51b10cd4 | 2521 | void 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 | 2530 | const Graphic3d_SequenceOfHClipPlane& Graphic3d_Structure::GetClipPlanes() const |
4269bd1b | 2531 | { |
63bcc448 | 2532 | return myCStructure->ClipPlanes(); |
4269bd1b | 2533 | } |