]> OCCT Git - occt-copy.git/commitdiff
0026792: Visualization, Graphic3d - Z-fit support for transform persistence is missin...
authorapl <apl@opencascade.com>
Wed, 21 Oct 2015 10:25:57 +0000 (13:25 +0300)
committeraba <aba@opencascade.com>
Thu, 29 Oct 2015 06:29:54 +0000 (09:29 +0300)
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.
Added non-regression test case for z-clipping of transform persistent objects.

src/Graphic3d/Graphic3d_CView.cxx
src/OpenGl/OpenGl_Structure.hxx
tests/bugs/vis/bug26792 [new file with mode: 0644]

index b760b918b02df4e2241082b3b495f82d842d7ffd..44b6a5ceadba7dd06e7d9629242b21c1c716d8eb 100644 (file)
@@ -402,53 +402,6 @@ void Graphic3d_CView::DisplayedStructures (Graphic3d_MapOfStructure& theStructur
   }
 }
 
-//! 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  :
@@ -473,20 +426,69 @@ Bnd_Box Graphic3d_CView::MinMaxValues (const Graphic3d_MapOfStructure& theSet,
 {
   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)
+    {
+      // 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))
+      {
+        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;
 }
index bca38b091c8125b6d5d086d8d398c98ee322e66d..0c012b1a3debb5071645435cfa74caf0b6e73e2d 100644 (file)
@@ -163,7 +163,8 @@ public:
         || IsForHighlight
         || IsMutable
         || Is2dText
-        || TransformPersistence.Flags != 0;
+        || (TransformPersistence.Flags & Graphic3d_TMF_2d)      != 0
+        || (TransformPersistence.Flags & Graphic3d_TMF_PanPers) != 0;
   }
 
   //! This method releases GL resources without actual elements destruction.
diff --git a/tests/bugs/vis/bug26792 b/tests/bugs/vis/bug26792
new file mode 100644 (file)
index 0000000..6502545
--- /dev/null
@@ -0,0 +1,21 @@
+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