1 // Copyright (c) 2011-2019 OPEN CASCADE SAS
3 // This file is part of Open CASCADE Technology software library.
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
14 #include <Graphic3d_Layer.hxx>
16 #include <Graphic3d_CStructure.hxx>
17 #include <Graphic3d_CullingTool.hxx>
19 IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_Layer, Standard_Transient)
21 // =======================================================================
22 // function : Graphic3d_Layer
24 // =======================================================================
25 Graphic3d_Layer::Graphic3d_Layer (Graphic3d_ZLayerId theId,
26 Standard_Integer theNbPriorities,
27 const Handle(Select3D_BVHBuilder3d)& theBuilder)
28 : myArray (0, theNbPriorities - 1),
30 myNbStructuresNotCulled (0),
32 myBVHPrimitivesTrsfPers (theBuilder),
33 myBVHIsLeftChildQueuedFirst (Standard_True),
34 myIsBVHPrimitivesNeedsReset (Standard_False)
36 myIsBoundingBoxNeedsReset[0] = myIsBoundingBoxNeedsReset[1] = true;
39 // =======================================================================
40 // function : ~Graphic3d_Layer
42 // =======================================================================
43 Graphic3d_Layer::~Graphic3d_Layer()
48 // =======================================================================
51 // =======================================================================
52 void Graphic3d_Layer::Add (const Graphic3d_CStructure* theStruct,
53 Standard_Integer thePriority,
54 Standard_Boolean isForChangePriority)
56 const Standard_Integer anIndex = Min (Max (thePriority, 0), myArray.Length() - 1);
57 if (theStruct == NULL)
62 myArray (anIndex).Add (theStruct);
63 if (theStruct->IsAlwaysRendered())
65 theStruct->MarkAsNotCulled();
66 if (!isForChangePriority)
68 myAlwaysRenderedMap.Add (theStruct);
71 else if (!isForChangePriority)
73 if (theStruct->TransformPersistence().IsNull())
75 myBVHPrimitives.Add (theStruct);
79 myBVHPrimitivesTrsfPers.Add (theStruct);
85 // =======================================================================
88 // =======================================================================
89 bool Graphic3d_Layer::Remove (const Graphic3d_CStructure* theStruct,
90 Standard_Integer& thePriority,
91 Standard_Boolean isForChangePriority)
93 if (theStruct == NULL)
99 const Standard_Integer aNbPriorities = myArray.Length();
100 for (Standard_Integer aPriorityIter = 0; aPriorityIter < aNbPriorities; ++aPriorityIter)
102 Graphic3d_IndexedMapOfStructure& aStructures = myArray (aPriorityIter);
103 const Standard_Integer anIndex = aStructures.FindIndex (theStruct);
109 aStructures.Swap (anIndex, aStructures.Size());
110 aStructures.RemoveLast();
112 if (!isForChangePriority)
114 Standard_Boolean isAlwaysRend = theStruct->IsAlwaysRendered();
117 if (!myBVHPrimitives.Remove (theStruct))
119 if (!myBVHPrimitivesTrsfPers.Remove (theStruct))
121 isAlwaysRend = Standard_True;
127 const Standard_Integer anIndex2 = myAlwaysRenderedMap.FindIndex (theStruct);
130 myAlwaysRenderedMap.Swap (myAlwaysRenderedMap.Size(), anIndex2);
131 myAlwaysRenderedMap.RemoveLast();
136 thePriority = aPriorityIter;
144 // =======================================================================
145 // function : InvalidateBVHData
147 // =======================================================================
148 void Graphic3d_Layer::InvalidateBVHData()
150 myIsBVHPrimitivesNeedsReset = Standard_True;
153 //! Calculate a finite bounding box of infinite object as its middle point.
154 inline Graphic3d_BndBox3d centerOfinfiniteBndBox (const Graphic3d_BndBox3d& theBndBox)
156 // bounding borders of infinite line has been calculated as own point in center of this line
157 const Graphic3d_Vec3d aDiagVec = theBndBox.CornerMax() - theBndBox.CornerMin();
158 return aDiagVec.SquareModulus() >= 500000.0 * 500000.0
159 ? Graphic3d_BndBox3d ((theBndBox.CornerMin() + theBndBox.CornerMax()) * 0.5)
160 : Graphic3d_BndBox3d();
163 //! Return true if at least one vertex coordinate out of float range.
164 inline bool isInfiniteBndBox (const Graphic3d_BndBox3d& theBndBox)
166 return Abs (theBndBox.CornerMax().x()) >= ShortRealLast()
167 || Abs (theBndBox.CornerMax().y()) >= ShortRealLast()
168 || Abs (theBndBox.CornerMax().z()) >= ShortRealLast()
169 || Abs (theBndBox.CornerMin().x()) >= ShortRealLast()
170 || Abs (theBndBox.CornerMin().y()) >= ShortRealLast()
171 || Abs (theBndBox.CornerMin().z()) >= ShortRealLast();
174 // =======================================================================
175 // function : BoundingBox
177 // =======================================================================
178 Bnd_Box Graphic3d_Layer::BoundingBox (Standard_Integer theViewId,
179 const Handle(Graphic3d_Camera)& theCamera,
180 Standard_Integer theWindowWidth,
181 Standard_Integer theWindowHeight,
182 Standard_Boolean theToIncludeAuxiliary) const
186 const Standard_Integer aBoxId = !theToIncludeAuxiliary ? 0 : 1;
187 const Graphic3d_Mat4d& aProjectionMat = theCamera->ProjectionMatrix();
188 const Graphic3d_Mat4d& aWorldViewMat = theCamera->OrientationMatrix();
189 if (myIsBoundingBoxNeedsReset[aBoxId])
191 // Recompute layer bounding box
192 myBoundingBox[aBoxId].SetVoid();
194 for (Graphic3d_ArrayOfIndexedMapOfStructure::Iterator aMapIter (myArray); aMapIter.More(); aMapIter.Next())
196 const Graphic3d_IndexedMapOfStructure& aStructures = aMapIter.Value();
197 for (Graphic3d_IndexedMapOfStructure::Iterator aStructIter (aStructures); aStructIter.More(); aStructIter.Next())
199 const Graphic3d_CStructure* aStructure = aStructIter.Value();
200 if (!aStructure->IsVisible (theViewId))
205 // "FitAll" operation ignores object with transform persistence parameter
206 // but adds transform persistence point in a bounding box of layer (only zoom pers. objects).
207 if (!aStructure->TransformPersistence().IsNull())
209 if (!theToIncludeAuxiliary
210 && aStructure->TransformPersistence()->IsZoomOrRotate())
212 const gp_Pnt anAnchor = aStructure->TransformPersistence()->AnchorPoint();
213 myBoundingBox[aBoxId].Add (anAnchor);
216 // Panning and 2d persistence apply changes to projection or/and its translation components.
217 // It makes them incompatible with z-fitting algorithm. Ignored by now.
218 else if (!theToIncludeAuxiliary
219 || aStructure->TransformPersistence()->IsTrihedronOr2d())
225 Graphic3d_BndBox3d aBox = aStructure->BoundingBox();
231 if (aStructure->IsInfinite
232 && !theToIncludeAuxiliary)
234 // include center of infinite object
235 aBox = centerOfinfiniteBndBox (aBox);
238 if (!aStructure->TransformPersistence().IsNull())
240 aStructure->TransformPersistence()->Apply (theCamera, aProjectionMat, aWorldViewMat, theWindowWidth, theWindowHeight, aBox);
243 // skip too big boxes to prevent float overflow at camera parameters calculation
245 && !isInfiniteBndBox (aBox))
247 myBoundingBox[aBoxId].Add (gp_Pnt (aBox.CornerMin().x(), aBox.CornerMin().y(), aBox.CornerMin().z()));
248 myBoundingBox[aBoxId].Add (gp_Pnt (aBox.CornerMax().x(), aBox.CornerMax().y(), aBox.CornerMax().z()));
253 myIsBoundingBoxNeedsReset[aBoxId] = false;
256 Bnd_Box aResBox = myBoundingBox[aBoxId];
257 if (!theToIncludeAuxiliary
258 || myAlwaysRenderedMap.IsEmpty())
263 // add transformation-persistent objects which depend on camera position (and thus can not be cached) for operations like Z-fit
264 for (NCollection_IndexedMap<const Graphic3d_CStructure*>::Iterator aStructIter (myAlwaysRenderedMap); aStructIter.More(); aStructIter.Next())
266 const Graphic3d_CStructure* aStructure = aStructIter.Value();
267 if (!aStructure->IsVisible (theViewId))
271 else if (aStructure->TransformPersistence().IsNull()
272 || !aStructure->TransformPersistence()->IsTrihedronOr2d())
277 Graphic3d_BndBox3d aBox = aStructure->BoundingBox();
283 aStructure->TransformPersistence()->Apply (theCamera, aProjectionMat, aWorldViewMat, theWindowWidth, theWindowHeight, aBox);
285 && !isInfiniteBndBox (aBox))
287 aResBox.Add (gp_Pnt (aBox.CornerMin().x(), aBox.CornerMin().y(), aBox.CornerMin().z()));
288 aResBox.Add (gp_Pnt (aBox.CornerMax().x(), aBox.CornerMax().y(), aBox.CornerMax().z()));
295 // =======================================================================
296 // function : considerZoomPersistenceObjects
298 // =======================================================================
299 Standard_Real Graphic3d_Layer::considerZoomPersistenceObjects (Standard_Integer theViewId,
300 const Handle(Graphic3d_Camera)& theCamera,
301 Standard_Integer theWindowWidth,
302 Standard_Integer theWindowHeight) const
304 if (NbOfTransformPersistenceObjects() == 0)
309 const Graphic3d_Mat4d& aProjectionMat = theCamera->ProjectionMatrix();
310 const Graphic3d_Mat4d& aWorldViewMat = theCamera->OrientationMatrix();
311 Standard_Real aMaxCoef = -std::numeric_limits<double>::max();
313 for (Graphic3d_ArrayOfIndexedMapOfStructure::Iterator aMapIter (myArray); aMapIter.More(); aMapIter.Next())
315 const Graphic3d_IndexedMapOfStructure& aStructures = aMapIter.Value();
316 for (Graphic3d_IndexedMapOfStructure::Iterator aStructIter (aStructures); aStructIter.More(); aStructIter.Next())
318 const Graphic3d_CStructure* aStructure = aStructIter.Value();
319 if (!aStructure->IsVisible (theViewId)
320 || aStructure->TransformPersistence().IsNull()
321 || !aStructure->TransformPersistence()->IsZoomOrRotate())
326 Graphic3d_BndBox3d aBox = aStructure->BoundingBox();
332 aStructure->TransformPersistence()->Apply (theCamera, aProjectionMat, aWorldViewMat, theWindowWidth, theWindowHeight, aBox);
334 const BVH_Vec3d& aCornerMin = aBox.CornerMin();
335 const BVH_Vec3d& aCornerMax = aBox.CornerMax();
336 const Standard_Integer aNbOfPoints = 8;
337 const gp_Pnt aPoints[aNbOfPoints] = { gp_Pnt (aCornerMin.x(), aCornerMin.y(), aCornerMin.z()),
338 gp_Pnt (aCornerMin.x(), aCornerMin.y(), aCornerMax.z()),
339 gp_Pnt (aCornerMin.x(), aCornerMax.y(), aCornerMin.z()),
340 gp_Pnt (aCornerMin.x(), aCornerMax.y(), aCornerMax.z()),
341 gp_Pnt (aCornerMax.x(), aCornerMin.y(), aCornerMin.z()),
342 gp_Pnt (aCornerMax.x(), aCornerMin.y(), aCornerMax.z()),
343 gp_Pnt (aCornerMax.x(), aCornerMax.y(), aCornerMin.z()),
344 gp_Pnt (aCornerMax.x(), aCornerMax.y(), aCornerMax.z()) };
345 gp_Pnt aConvertedPoints[aNbOfPoints];
346 Standard_Real aConvertedMinX = std::numeric_limits<double>::max();
347 Standard_Real aConvertedMaxX = -std::numeric_limits<double>::max();
348 Standard_Real aConvertedMinY = std::numeric_limits<double>::max();
349 Standard_Real aConvertedMaxY = -std::numeric_limits<double>::max();
350 for (Standard_Integer anIdx = 0; anIdx < aNbOfPoints; ++anIdx)
352 aConvertedPoints[anIdx] = theCamera->Project (aPoints[anIdx]);
354 aConvertedMinX = Min (aConvertedMinX, aConvertedPoints[anIdx].X());
355 aConvertedMaxX = Max (aConvertedMaxX, aConvertedPoints[anIdx].X());
357 aConvertedMinY = Min (aConvertedMinY, aConvertedPoints[anIdx].Y());
358 aConvertedMaxY = Max (aConvertedMaxY, aConvertedPoints[anIdx].Y());
361 const Standard_Boolean isBigObject = (Abs (aConvertedMaxX - aConvertedMinX) > 2.0) // width of zoom pers. object greater than width of window
362 || (Abs (aConvertedMaxY - aConvertedMinY) > 2.0); // height of zoom pers. object greater than height of window
363 const Standard_Boolean isAlreadyInScreen = (aConvertedMinX > -1.0 && aConvertedMinX < 1.0)
364 && (aConvertedMaxX > -1.0 && aConvertedMaxX < 1.0)
365 && (aConvertedMinY > -1.0 && aConvertedMinY < 1.0)
366 && (aConvertedMaxY > -1.0 && aConvertedMaxY < 1.0);
367 if (isBigObject || isAlreadyInScreen)
372 const gp_Pnt aTPPoint = aStructure->TransformPersistence()->AnchorPoint();
373 gp_Pnt aConvertedTPPoint = theCamera->Project (aTPPoint);
374 aConvertedTPPoint.SetZ (0.0);
376 if (aConvertedTPPoint.Coord().Modulus() < Precision::Confusion())
381 Standard_Real aShiftX = 0.0;
382 if (aConvertedMinX < -1.0)
384 aShiftX = ((aConvertedMaxX < -1.0) ? (-(1.0 + aConvertedMaxX) + (aConvertedMaxX - aConvertedMinX)) : -(1.0 + aConvertedMinX));
386 else if (aConvertedMaxX > 1.0)
388 aShiftX = ((aConvertedMinX > 1.0) ? ((aConvertedMinX - 1.0) + (aConvertedMaxX - aConvertedMinX)) : (aConvertedMaxX - 1.0));
391 Standard_Real aShiftY = 0.0;
392 if (aConvertedMinY < -1.0)
394 aShiftY = ((aConvertedMaxY < -1.0) ? (-(1.0 + aConvertedMaxY) + (aConvertedMaxY - aConvertedMinY)) : -(1.0 + aConvertedMinY));
396 else if (aConvertedMaxY > 1.0)
398 aShiftY = ((aConvertedMinY > 1.0) ? ((aConvertedMinY - 1.0) + (aConvertedMaxY - aConvertedMinY)) : (aConvertedMaxY - 1.0));
401 const Standard_Real aDifX = Abs (aConvertedTPPoint.X()) - aShiftX;
402 const Standard_Real aDifY = Abs (aConvertedTPPoint.Y()) - aShiftY;
403 if (aDifX > Precision::Confusion())
405 aMaxCoef = Max (aMaxCoef, Abs (aConvertedTPPoint.X()) / aDifX);
407 if (aDifY > Precision::Confusion())
409 aMaxCoef = Max (aMaxCoef, Abs (aConvertedTPPoint.Y()) / aDifY);
414 return (aMaxCoef > 0.0) ? aMaxCoef : 1.0;
417 // =======================================================================
418 // function : updateBVH
420 // =======================================================================
421 void Graphic3d_Layer::updateBVH() const
423 if (!myIsBVHPrimitivesNeedsReset)
428 myBVHPrimitives.Clear();
429 myBVHPrimitivesTrsfPers.Clear();
430 myAlwaysRenderedMap.Clear();
431 myIsBVHPrimitivesNeedsReset = Standard_False;
432 for (Graphic3d_ArrayOfIndexedMapOfStructure::Iterator aMapIter (myArray); aMapIter.More(); aMapIter.Next())
434 const Graphic3d_IndexedMapOfStructure& aStructures = aMapIter.Value();
435 for (Graphic3d_IndexedMapOfStructure::Iterator aStructIter (aStructures); aStructIter.More(); aStructIter.Next())
437 const Graphic3d_CStructure* aStruct = aStructIter.Value();
438 if (aStruct->IsAlwaysRendered())
440 aStruct->MarkAsNotCulled();
441 myAlwaysRenderedMap.Add (aStruct);
443 else if (aStruct->TransformPersistence().IsNull())
445 myBVHPrimitives.Add (aStruct);
449 myBVHPrimitivesTrsfPers.Add (aStruct);
455 // =======================================================================
456 // function : UpdateCulling
458 // =======================================================================
459 void Graphic3d_Layer::UpdateCulling (Standard_Integer theViewId,
460 const Graphic3d_CullingTool& theSelector,
461 const Graphic3d_RenderingParams::FrustumCulling theFrustumCullingState)
465 myNbStructuresNotCulled = myNbStructures;
466 if (theFrustumCullingState != Graphic3d_RenderingParams::FrustumCulling_NoUpdate)
468 Standard_Boolean toTraverse = (theFrustumCullingState == Graphic3d_RenderingParams::FrustumCulling_On);
469 for (Graphic3d_IndexedMapOfStructure::Iterator aStructIter (myBVHPrimitives.Structures()); aStructIter.More(); aStructIter.Next())
471 const Graphic3d_CStructure* aStruct = aStructIter.Value();
472 aStruct->SetCulled (toTraverse);
474 for (Graphic3d_IndexedMapOfStructure::Iterator aStructIter (myBVHPrimitivesTrsfPers.Structures()); aStructIter.More(); aStructIter.Next())
476 const Graphic3d_CStructure* aStruct = aStructIter.Value();
477 aStruct->SetCulled (toTraverse);
481 if (theFrustumCullingState != Graphic3d_RenderingParams::FrustumCulling_On)
485 if (myBVHPrimitives .Size() == 0
486 && myBVHPrimitivesTrsfPers.Size() == 0)
491 myNbStructuresNotCulled = myAlwaysRenderedMap.Extent();
492 Graphic3d_CullingTool::CullingContext aCullCtx;
493 theSelector.SetCullingDistance(aCullCtx, myLayerSettings.CullingDistance());
494 theSelector.SetCullingSize (aCullCtx, myLayerSettings.CullingSize());
495 for (Standard_Integer aBVHTreeIdx = 0; aBVHTreeIdx < 2; ++aBVHTreeIdx)
497 const Standard_Boolean isTrsfPers = aBVHTreeIdx == 1;
498 opencascade::handle<BVH_Tree<Standard_Real, 3> > aBVHTree;
501 if (myBVHPrimitivesTrsfPers.Size() == 0)
504 const Graphic3d_Mat4d& aProjection = theSelector.ProjectionMatrix();
505 const Graphic3d_Mat4d& aWorldView = theSelector.WorldViewMatrix();
506 const Graphic3d_WorldViewProjState& aWVPState = theSelector.WorldViewProjState();
507 const Standard_Integer aViewportWidth = theSelector.ViewportWidth();
508 const Standard_Integer aViewportHeight = theSelector.ViewportHeight();
510 aBVHTree = myBVHPrimitivesTrsfPers.BVH (theSelector.Camera(), aProjection, aWorldView, aViewportWidth, aViewportHeight, aWVPState);
514 if (myBVHPrimitives.Size() == 0)
517 aBVHTree = myBVHPrimitives.BVH();
520 if (theSelector.IsCulled (aCullCtx, aBVHTree->MinPoint (0), aBVHTree->MaxPoint (0)))
525 Standard_Integer aStack[BVH_Constants_MaxTreeDepth];
526 Standard_Integer aHead = -1;
527 Standard_Integer aNode = 0; // a root node
530 if (!aBVHTree->IsOuter (aNode))
532 const Standard_Integer aLeftChildIdx = aBVHTree->Child<0> (aNode);
533 const Standard_Integer aRightChildIdx = aBVHTree->Child<1> (aNode);
534 const Standard_Boolean isLeftChildIn = !theSelector.IsCulled (aCullCtx, aBVHTree->MinPoint (aLeftChildIdx), aBVHTree->MaxPoint (aLeftChildIdx));
535 const Standard_Boolean isRightChildIn = !theSelector.IsCulled (aCullCtx, aBVHTree->MinPoint (aRightChildIdx), aBVHTree->MaxPoint (aRightChildIdx));
539 aNode = myBVHIsLeftChildQueuedFirst ? aLeftChildIdx : aRightChildIdx;
540 aStack[++aHead] = myBVHIsLeftChildQueuedFirst ? aRightChildIdx : aLeftChildIdx;
541 myBVHIsLeftChildQueuedFirst = !myBVHIsLeftChildQueuedFirst;
543 else if (isLeftChildIn
546 aNode = isLeftChildIn ? aLeftChildIdx : aRightChildIdx;
555 aNode = aStack[aHead--];
560 const Standard_Integer aStartIdx = aBVHTree->BegPrimitive (aNode);
561 const Standard_Integer anEndIdx = aBVHTree->EndPrimitive (aNode);
562 for (Standard_Integer anIdx = aStartIdx; anIdx <= anEndIdx; ++anIdx)
564 const Graphic3d_CStructure* aStruct = isTrsfPers
565 ? myBVHPrimitivesTrsfPers.GetStructureById (anIdx)
566 : myBVHPrimitives.GetStructureById (anIdx);
567 if (aStruct->IsVisible (theViewId))
569 aStruct->MarkAsNotCulled();
570 ++myNbStructuresNotCulled;
578 aNode = aStack[aHead--];
584 // =======================================================================
587 // =======================================================================
588 Standard_Boolean Graphic3d_Layer::Append (const Graphic3d_Layer& theOther)
590 // the source priority list shouldn't have more priorities
591 const Standard_Integer aNbPriorities = theOther.NbPriorities();
592 if (aNbPriorities > NbPriorities())
594 return Standard_False;
597 // add all structures to destination priority list
598 for (Standard_Integer aPriorityIter = 0; aPriorityIter < aNbPriorities; ++aPriorityIter)
600 const Graphic3d_IndexedMapOfStructure& aStructures = theOther.myArray (aPriorityIter);
601 for (Graphic3d_IndexedMapOfStructure::Iterator aStructIter (aStructures); aStructIter.More(); aStructIter.Next())
603 Add (aStructIter.Value(), aPriorityIter);
607 return Standard_True;
610 //=======================================================================
611 //function : SetLayerSettings
613 //=======================================================================
614 void Graphic3d_Layer::SetLayerSettings (const Graphic3d_ZLayerSettings& theSettings)
616 const Standard_Boolean toUpdateTrsf = !myLayerSettings.Origin().IsEqual (theSettings.Origin(), gp::Resolution());
617 myLayerSettings = theSettings;
623 for (Graphic3d_ArrayOfIndexedMapOfStructure::Iterator aMapIter (myArray); aMapIter.More(); aMapIter.Next())
625 Graphic3d_IndexedMapOfStructure& aStructures = aMapIter.ChangeValue();
626 for (Graphic3d_IndexedMapOfStructure::Iterator aStructIter (aStructures); aStructIter.More(); aStructIter.Next())
628 Graphic3d_CStructure* aStructure = const_cast<Graphic3d_CStructure* >(aStructIter.Value());
629 aStructure->updateLayerTransformation();
634 // =======================================================================
635 // function : DumpJson
637 // =======================================================================
638 void Graphic3d_Layer::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const
640 OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream)
642 OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, this)
643 OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myLayerId)
644 OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myNbStructures)
645 OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myNbStructuresNotCulled)
647 const Standard_Integer aNbPriorities = myArray.Length();
648 for (Standard_Integer aPriorityIter = 0; aPriorityIter < aNbPriorities; ++aPriorityIter)
650 const Graphic3d_IndexedMapOfStructure& aStructures = myArray (aPriorityIter);
651 for (Graphic3d_IndexedMapOfStructure::Iterator aStructIter (aStructures); aStructIter.More(); aStructIter.Next())
653 const Graphic3d_CStructure* aStructure = aStructIter.Value();
654 OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, aStructure)
658 OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myLayerSettings)
660 OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myBVHIsLeftChildQueuedFirst)
661 OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsBVHPrimitivesNeedsReset)
662 OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsBoundingBoxNeedsReset[0])
663 OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsBoundingBoxNeedsReset[1])
665 OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myBoundingBox[0])
666 OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myBoundingBox[1])