From: apl Date: Wed, 21 Oct 2015 10:25:57 +0000 (+0300) Subject: 0026792: Visualization, Graphic3d - Z-fit support for transform persistence is missin... X-Git-Url: http://git.dev.opencascade.org/gitweb/?a=commitdiff_plain;h=626a5c40daa8cc8db5fcc5dbcb904f15ea51846a;p=occt-copy.git 0026792: Visualization, Graphic3d - Z-fit support for transform persistence is missing after removing Visual3d_View 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. --- diff --git a/src/Graphic3d/Graphic3d_CView.cxx b/src/Graphic3d/Graphic3d_CView.cxx index 5568201086..31a993a2e9 100644 --- a/src/Graphic3d/Graphic3d_CView.cxx +++ b/src/Graphic3d/Graphic3d_CView.cxx @@ -401,53 +401,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 : @@ -472,20 +425,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; } diff --git a/src/OpenGl/OpenGl_Structure.hxx b/src/OpenGl/OpenGl_Structure.hxx index bca38b091c..0c012b1a3d 100644 --- a/src/OpenGl/OpenGl_Structure.hxx +++ b/src/OpenGl/OpenGl_Structure.hxx @@ -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 index 0000000000..65025456d6 --- /dev/null +++ b/tests/bugs/vis/bug26792 @@ -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