Add missing code for z-fit support for zoom, rotate persistent object.
Fixed wrong statement that should enable frustum culling optimization for zoom, rotate persistent object.
Fixed BVH_LinearBuilder.lxx to correctly control number of items in leaf node for a case of items with equal bounding boxes.
Added non-regression test case for z-clipping of transform persistent objects.
std::vector<BVH_EncodedLink>::iterator theStart,
std::vector<BVH_EncodedLink>::iterator theFinal)
{
- if (theFinal - theStart > BVH_Builder<T, N>::myLeafNodeSize && theBit >= 0)
+ if (theFinal - theStart > BVH_Builder<T, N>::myLeafNodeSize)
{
- std::vector<BVH_EncodedLink>::iterator aPosition = std::lower_bound (
- theStart, theFinal, BVH_EncodedLink(), BVH::BitComparator (theBit));
+ std::vector<BVH_EncodedLink>::iterator aPosition =
+ (theBit >= 0) ? std::lower_bound (theStart, theFinal, BVH_EncodedLink(), BVH::BitComparator (theBit))
+ : theStart + ((theFinal - theStart) / 2);
if (aPosition == theStart || aPosition == theFinal)
{
}
}
-//! Auxiliary method for MinMaxValues() method
-inline void addStructureBndBox (const Handle(Graphic3d_Structure)& theStruct,
- const Standard_Boolean theToIgnoreInfiniteFlag,
- Bnd_Box& theBndBox)
-{
- if (!theStruct->IsVisible())
- {
- return;
- }
- else if (theStruct->IsInfinite()
- && !theToIgnoreInfiniteFlag)
- {
- // XMin, YMin .... ZMax are initialized by means of infinite line data
- const Bnd_Box aBox = theStruct->MinMaxValues (Standard_False);
- if (!aBox.IsWhole()
- && !aBox.IsVoid())
- {
- theBndBox.Add (aBox);
- }
- return;
- }
-
- // Only non-empty and non-infinite structures
- // are taken into account for calculation of MinMax
- if (theStruct->IsEmpty()
- || theStruct->TransformPersistenceMode() != Graphic3d_TMF_None)
- {
- return;
- }
-
- // "FitAll" operation ignores object with transform persistence parameter
- const Bnd_Box aBox = theStruct->MinMaxValues (theToIgnoreInfiniteFlag);
-
- // To prevent float overflow at camera parameters calculation and further
- // rendering, bounding boxes with at least one vertex coordinate out of
- // float range are skipped by view fit algorithms
- if (Abs (aBox.CornerMax().X()) >= ShortRealLast() ||
- Abs (aBox.CornerMax().Y()) >= ShortRealLast() ||
- Abs (aBox.CornerMax().Z()) >= ShortRealLast() ||
- Abs (aBox.CornerMin().X()) >= ShortRealLast() ||
- Abs (aBox.CornerMin().Y()) >= ShortRealLast() ||
- Abs (aBox.CornerMin().Z()) >= ShortRealLast())
- return;
-
- theBndBox.Add (aBox);
-}
-
// =======================================================================
// function : MinMaxValues
// purpose :
{
Bnd_Box aResult;
const Standard_Integer aViewId = Identification();
+
+ Handle(Graphic3d_Camera) aCamera = Camera();
+ Standard_Integer aWinWidth = 0;
+ Standard_Integer aWinHeight = 0;
+ if (IsDefined())
+ {
+ Window()->Size (aWinWidth, aWinHeight);
+ }
+
for (Graphic3d_MapIteratorOfMapOfStructure aStructIter (theSet); aStructIter.More(); aStructIter.Next())
{
const Handle(Graphic3d_Structure)& aStructure = aStructIter.Key();
- if (!aStructIter.Value()->IsVisible())
+ if (!aStructure->IsVisible() || aStructure->IsEmpty())
+ {
+ continue;
+ }
+ else if (!aStructure->CStructure()->ViewAffinity.IsNull()
+ && !aStructure->CStructure()->ViewAffinity->IsVisible (aViewId))
+ {
+ continue;
+ }
+
+ // "FitAll" operation ignores object with transform persistence parameter
+ if (aStructure->TransformPersistence().Flags != Graphic3d_TMF_None)
+ {
+ // Panning and 2d persistence apply changes to projection or/and its translation components.
+ // It makes them incompatible with z-fitting algorithm. Ignored by now.
+ if (!theToIgnoreInfiniteFlag ||
+ (aStructure->TransformPersistence().Flags & Graphic3d_TMF_2d) ||
+ (aStructure->TransformPersistence().Flags & Graphic3d_TMF_PanPers) ||
+ (aStructure->TransformPersistence().Flags & Graphic3d_TMF_TriedronPers))
+ {
+ continue;
+ }
+ }
+
+ Bnd_Box aBox = aStructure->MinMaxValues (theToIgnoreInfiniteFlag);
+
+ if (aBox.IsWhole() || aBox.IsVoid())
{
continue;
}
- else if (!aStructIter.Value()->CStructure()->ViewAffinity.IsNull()
- && !aStructIter.Value()->CStructure()->ViewAffinity->IsVisible (aViewId))
+
+ if (aStructure->TransformPersistence().Flags != Graphic3d_TMF_None)
+ {
+ const Graphic3d_Mat4d& aProjectionMat = aCamera->ProjectionMatrix();
+ const Graphic3d_Mat4d& aWorldViewMat = aCamera->OrientationMatrix();
+ aStructure->TransformPersistence().Apply (aProjectionMat, aWorldViewMat, aWinWidth, aWinHeight, aBox);
+ }
+
+ // To prevent float overflow at camera parameters calculation and further
+ // rendering, bounding boxes with at least one vertex coordinate out of
+ // float range are skipped by view fit algorithms
+ if (Abs (aBox.CornerMax().X()) >= ShortRealLast() ||
+ Abs (aBox.CornerMax().Y()) >= ShortRealLast() ||
+ Abs (aBox.CornerMax().Z()) >= ShortRealLast() ||
+ Abs (aBox.CornerMin().X()) >= ShortRealLast() ||
+ Abs (aBox.CornerMin().Y()) >= ShortRealLast() ||
+ Abs (aBox.CornerMin().Z()) >= ShortRealLast())
{
continue;
}
- addStructureBndBox (aStructure, theToIgnoreInfiniteFlag, aResult);
+ aResult.Add (aBox);
}
return aResult;
}
-// Created on: 2015-06-30
+// Created on: 2015-06-30
// Created by: Anton POLETAEV
// Copyright (c) 2015 OPEN CASCADE SAS
//
const Standard_Integer aStructIdx1 = theIdx1 + 1;
const Standard_Integer aStructIdx2 = theIdx2 + 1;
- myStructs.Swap (aStructIdx1, aStructIdx2);
+ myStructs .Swap (aStructIdx1, aStructIdx2);
myStructBoxes.Swap (aStructIdx1, aStructIdx2);
}
const OpenGl_Mat4& theWorldViewMatrix,
const Graphic3d_WorldViewProjState& theWVPState)
{
- if (!myIsDirty && (myStructBoxesState.IsValid() && !myStructBoxesState.IsChanged(theWVPState)))
+ if (!myIsDirty
+ && (myStructBoxesState.IsValid()
+ && !myStructBoxesState.IsChanged (theWVPState)))
{
return myBVH;
}
const OpenGl_Structure* aStructure = myStructs (aStructIdx);
HBndBox4f aBoundingBox = new Graphic3d_BndBox4f;
-
- if (aStructure->TransformPersistence.Flags && !(aStructure->TransformPersistence.Flags & Graphic3d_TMF_2d))
- {
- *aBoundingBox = aStructure->BoundingBox();
-
- aStructure->TransformPersistence.Apply (theProjectionMatrix, theWorldViewMatrix, 0, 0, *aBoundingBox);
- }
+ *aBoundingBox = aStructure->BoundingBox();
+ aStructure->TransformPersistence.Apply (theProjectionMatrix, theWorldViewMatrix, 0, 0, *aBoundingBox);
myStructBoxes.Add (aBoundingBox);
}
// =======================================================================
void OpenGl_BVHTreeSelector::SetViewVolume (const Handle(Graphic3d_Camera)& theCamera)
{
- if (myWorldViewProjState == theCamera->WorldViewProjState())
- {
+ if (!myWorldViewProjState.IsChanged (theCamera->WorldViewProjState()))
return;
- }
myIsProjectionParallel = theCamera->IsOrthographic();
}
else if (!isForChangePriority)
{
- if (!theStruct->TransformPersistence.Flags)
+ if (theStruct->TransformPersistence.Flags == Graphic3d_TMF_None)
{
myBVHPrimitives.Add (theStruct);
}
if (aStruct->IsAlwaysRendered())
continue;
- if (!aStruct->TransformPersistence.Flags)
+ if (aStruct->TransformPersistence.Flags == Graphic3d_TMF_None)
{
myBVHPrimitives.Add (aStruct);
}
void OpenGl_Layer::traverse (OpenGl_BVHTreeSelector& theSelector) const
{
// handle a case when all objects are infinite
- if (myBVHPrimitives.Size() == 0 && myBVHPrimitivesTrsfPers.Size() == 0)
+ if (myBVHPrimitives .Size() == 0
+ && myBVHPrimitivesTrsfPers.Size() == 0)
return;
theSelector.CacheClipPtsProjections();
if (isTrsfPers)
{
if (myBVHPrimitivesTrsfPers.Size() == 0)
- {
continue;
- }
- const OpenGl_Mat4& aProjection = theSelector.ProjectionMatrix();
- const OpenGl_Mat4& aWorldView = theSelector.WorldViewMatrix();
+
+ const OpenGl_Mat4& aProjection = theSelector.ProjectionMatrix();
+ const OpenGl_Mat4& aWorldView = theSelector.WorldViewMatrix();
const Graphic3d_WorldViewProjState& aWVPState = theSelector.WorldViewProjState();
aBVHTree = myBVHPrimitivesTrsfPers.BVH (aProjection, aWorldView, aWVPState);
}
else
{
if (myBVHPrimitives.Size() == 0)
- {
continue;
- }
+
aBVHTree = myBVHPrimitives.BVH();
}
|| IsForHighlight
|| IsMutable
|| Is2dText
- || TransformPersistence.Flags != 0;
+ || (TransformPersistence.Flags & Graphic3d_TMF_2d) != 0
+ || (TransformPersistence.Flags & Graphic3d_TMF_PanPers) != 0
+ || (TransformPersistence.Flags & Graphic3d_TMF_TriedronPers) != 0;
}
//! This method releases GL resources without actual elements destruction.
--- /dev/null
+puts "================================================================"
+puts "CR26792"
+puts "Visualization, Graphic3d - Z-fit support for transform persistence is missing after removing Visual3d_View"
+puts "================================================================"
+puts ""
+
+vinit
+vclear
+vaxo
+
+box b 100 100 100
+vdisplay b -trsfPers zoom
+vzoom 0.01
+vzfit
+
+checkcolor 204 184 1.0 1.0 0.0
+checkcolor 232 205 1.0 1.0 0.0
+checkcolor 262 182 1.0 1.0 0.0
+checkcolor 233 184 1.0 1.0 0.0
+
+set only_screen 1
\ No newline at end of file