0026960: Visualization, TKOpenGl - update transformation of dynamically highlighted...
authorvpa <vpa@opencascade.com>
Fri, 18 Dec 2015 18:29:13 +0000 (21:29 +0300)
committerbugmaster <bugmaster@opencascade.com>
Wed, 23 Dec 2015 08:36:44 +0000 (11:36 +0300)
- added method UpdateHighlightTrsf for immediate update of highlight presentation's transformation;
- interfaces for immediate transformation update of corresponding presentations were added to entity owner classes;
- test case for issue #26960

src/AIS/AIS_InteractiveContext.cxx
src/PrsMgr/PrsMgr_PresentationManager.cxx
src/PrsMgr/PrsMgr_PresentationManager.hxx
src/SelectMgr/SelectMgr_EntityOwner.cxx
src/SelectMgr/SelectMgr_EntityOwner.hxx
src/StdSelect/StdSelect_BRepOwner.cxx
src/StdSelect/StdSelect_BRepOwner.hxx
tests/bugs/vis/bug26960 [new file with mode: 0644]

index a8c9cd4..90a95ec 100644 (file)
@@ -1431,6 +1431,15 @@ void AIS_InteractiveContext::SetLocation (const Handle(AIS_InteractiveObject)& t
     Handle(StdSelect_ViewerSelector3d) aTempSel = myLocalContexts (myCurLocalIndex)->MainSelector();
     mgrSelector->Update (theIObj, aTempSel, Standard_False);
   }
+
+  // if the object or its part is highlighted dynamically, it is necessary to apply location transformation
+  // to its highlight structure immediately
+  if (!myLastPicked.IsNull() && myLastPicked->Selectable() == theIObj)
+  {
+    myLastPicked->UpdateHighlightTrsf (myMainVwr,
+                                       myMainPM,
+                                       theIObj->HasDisplayMode() ? theIObj->DisplayMode() : 0);
+  }
 }
 
 //=======================================================================
index c5ed816..6c3d1bf 100644 (file)
@@ -669,3 +669,65 @@ void PrsMgr_PresentationManager::SetShadingAspect (const Handle(PrsMgr_Presentab
     aPrs->SetShadingAspect (theShadingAspect);
   }
 }
+
+namespace
+{
+  // =======================================================================
+  // function : updatePrsTransformation
+  // purpose  : Internal funtion that scans thePrsList for shadow presentations
+  //            and applies transformation theTrsf to them in case if parent ID
+  //            of shadow presentation is equal to theRefId
+  // =======================================================================
+  void updatePrsTransformation (const PrsMgr_ListOfPresentations& thePrsList,
+                                const Standard_Integer theRefId,
+                                const Graphic3d_Mat4& theTrsf)
+  {
+    for (PrsMgr_ListOfPresentations::Iterator anIter (thePrsList); anIter.More(); anIter.Next())
+    {
+      const Handle(Prs3d_Presentation)& aPrs = anIter.Value();
+      if (aPrs.IsNull())
+        continue;
+
+      Handle(Prs3d_PresentationShadow) aShadowPrs = Handle(Prs3d_PresentationShadow)::DownCast (aPrs);
+      if (aShadowPrs.IsNull() || aShadowPrs->ParentId() != theRefId)
+        continue;
+
+      aShadowPrs->CStructure()->Transformation = theTrsf;
+    }
+  }
+}
+
+// =======================================================================
+// function : UpdateHighlightTrsf
+// purpose  :
+// =======================================================================
+void PrsMgr_PresentationManager::UpdateHighlightTrsf (const Handle(V3d_Viewer)& theViewer,
+                                                      const Handle(PrsMgr_PresentableObject)& theObj,
+                                                      const Standard_Integer theMode,
+                                                      const Handle(PrsMgr_PresentableObject)& theSelObj)
+{
+  if (theObj.IsNull())
+    return;
+
+  const Handle(Prs3d_Presentation)& aBasePrs = Presentation (theObj, theMode, Standard_False)->Presentation();
+  const Handle(Prs3d_Presentation)& aParentPrs = theSelObj.IsNull() ?
+    aBasePrs : Presentation (theSelObj, theMode, Standard_False)->Presentation();
+  const Standard_Integer aParentId = aParentPrs->CStructure()->Id;
+
+  updatePrsTransformation (myImmediateList, aParentId, aBasePrs->CStructure()->Transformation);
+
+  if (!myViewDependentImmediateList.IsEmpty())
+  {
+    for (theViewer->InitActiveViews(); theViewer->MoreActiveViews(); theViewer->NextActiveViews())
+    {
+      const Handle(Graphic3d_CView)& aView = theViewer->ActiveView()->View();
+      Handle(Graphic3d_Structure) aViewDepParentPrs;
+      if (aView->IsComputed (aParentId, aViewDepParentPrs))
+      {
+        updatePrsTransformation (myViewDependentImmediateList,
+                                 aViewDepParentPrs->CStructure()->Id,
+                                 aBasePrs->CStructure()->Transformation);
+      }
+    }
+  }
+}
index b08a438..ed7918d 100644 (file)
@@ -162,6 +162,14 @@ public:
   //! Optional argument theSelObj specifies parent decomposed object to inherit its view affinity.
   Standard_EXPORT Handle(PrsMgr_Presentation) Presentation (const Handle(PrsMgr_PresentableObject)& thePrsObject, const Standard_Integer theMode = 0, const Standard_Boolean theToCreate = Standard_False, const Handle(PrsMgr_PresentableObject)& theSelObj = NULL) const;
 
+  //! Allows to apply location transformation to shadow highlight presentation immediately.
+  //! @param theObj defines the base object, it local transformation will be applied to corresponding highlight structure
+  //! @param theMode defines display mode of the base object
+  //! @param theSelObj defines the object produced after decomposition of the base object for local selection
+  Standard_EXPORT void UpdateHighlightTrsf (const Handle(V3d_Viewer)& theViewer,
+                                            const Handle(PrsMgr_PresentableObject)& theObj,
+                                            const Standard_Integer theMode = 0,
+                                            const Handle(PrsMgr_PresentableObject)& theSelObj = NULL);
 
 
 
index fef3faf..560a32a 100644 (file)
@@ -164,3 +164,17 @@ void SelectMgr_EntityOwner::SetZLayer (const Standard_Integer )
 {
   //
 }
+
+//=======================================================================
+//function : UpdateHighlightTrsf
+//purpose  :
+//=======================================================================
+void SelectMgr_EntityOwner::UpdateHighlightTrsf (const Handle(V3d_Viewer)& theViewer,
+                                                 const Handle(PrsMgr_PresentationManager3d)& theManager,
+                                                 const Standard_Integer theDispMode)
+{
+  if (mySelectable == NULL)
+    return;
+
+  theManager->UpdateHighlightTrsf (theViewer, mySelectable, theDispMode);
+}
index 97dcde2..1d0b6fc 100644 (file)
@@ -31,6 +31,7 @@ class Standard_NoSuchObject;
 class SelectMgr_SelectableObject;
 class PrsMgr_PresentationManager;
 class TopLoc_Location;
+class V3d_Viewer;
 
 
 class SelectMgr_EntityOwner;
@@ -130,7 +131,10 @@ public:
   //! Set Z layer ID and update all presentations.
   Standard_EXPORT virtual void SetZLayer (const Graphic3d_ZLayerId theLayerId);
 
-
+  //! Implements immediate application of location transformation of parent object to dynamic highlight structure
+  Standard_EXPORT virtual void UpdateHighlightTrsf (const Handle(V3d_Viewer)& theViewer,
+                                                    const Handle(PrsMgr_PresentationManager3d)& theManager,
+                                                    const Standard_Integer theDispMode);
 
 
   DEFINE_STANDARD_RTTIEXT(SelectMgr_EntityOwner,SelectBasics_EntityOwner)
index 4f258a9..9189e41 100644 (file)
@@ -244,3 +244,17 @@ void StdSelect_BRepOwner::SetZLayer (const Graphic3d_ZLayerId theLayerId)
     myPrsSh->SetZLayer (theLayerId);
   }
 }
+
+//=======================================================================
+//function : UpdateHighlightTrsf
+//purpose  :
+//=======================================================================
+void StdSelect_BRepOwner::UpdateHighlightTrsf (const Handle(V3d_Viewer)& theViewer,
+                                               const Handle(PrsMgr_PresentationManager3d)& theManager,
+                                               const Standard_Integer theDispMode)
+{
+  if (myPrsSh.IsNull() && Selectable().IsNull())
+    return;
+
+  theManager->UpdateHighlightTrsf (theViewer, Selectable(), theDispMode, myPrsSh);
+}
index aad8db7..55bc9bc 100644 (file)
@@ -130,8 +130,10 @@ public:
   //! Set Z layer ID and update all presentations.
   Standard_EXPORT virtual void SetZLayer (const Graphic3d_ZLayerId theLayerId) Standard_OVERRIDE;
 
-
-
+  //! Implements immediate application of location transformation of parent object to dynamic highlight structure
+  Standard_EXPORT virtual void UpdateHighlightTrsf (const Handle(V3d_Viewer)& theViewer,
+                                                    const Handle(PrsMgr_PresentationManager3d)& theManager,
+                                                    const Standard_Integer theDispMode) Standard_OVERRIDE;
 
   DEFINE_STANDARD_RTTIEXT(StdSelect_BRepOwner,SelectMgr_EntityOwner)
 
diff --git a/tests/bugs/vis/bug26960 b/tests/bugs/vis/bug26960
new file mode 100644 (file)
index 0000000..769d32a
--- /dev/null
@@ -0,0 +1,28 @@
+puts "========"
+puts "OCC26960"
+puts "========"
+puts ""
+##################################################################
+puts "Visualization, TKOpenGl - update transformation of dynamically highlighted presentation"
+##################################################################
+
+pload VISUALIZATION MODELING
+
+box b 1 2 3
+
+vclear
+vinit View1
+
+vdisplay -dispmode 1 -highmode 1 b
+vfit
+vselmode 4 1
+vmoveto 250 250
+if {[vreadpixel 350 140 rgb name] != "BLACK"} {
+  puts "ERROR: wrong inital location"
+}
+vsetlocation b 0.5 0 0
+if {[vreadpixel 350 140 rgb name] != "CYAN1"} {
+  puts "ERROR: the transformation was not applied to highlight structure"
+}
+
+set only_screen 1