0028668: Point Cloud Rendering - standard selection API returns invalid values CR0-SCHARP-FH IR-2019-05-31
authorkgv <kgv@opencascade.com>
Thu, 30 May 2019 07:02:25 +0000 (10:02 +0300)
committerbugmaster <bugmaster@opencascade.com>
Fri, 31 May 2019 16:47:03 +0000 (19:47 +0300)
Added an argument to OpenGl_GraphicDriver::GetSharedContext() for returning only currently bound OpenGL context.
SelectMgr_SelectingVolumeManager::GetMousePosition() - added getter returning mouse coordinates.

src/OpenGl/OpenGl_GraphicDriver.cxx
src/OpenGl/OpenGl_GraphicDriver.hxx
src/SelectBasics/SelectBasics_SelectingVolumeManager.hxx
src/SelectMgr/SelectMgr_RectangularFrustum.hxx
src/SelectMgr/SelectMgr_SelectingVolumeManager.hxx

index 833c4c5..b60b7cd 100644 (file)
@@ -447,23 +447,26 @@ void OpenGl_GraphicDriver::EnableVBO (const Standard_Boolean theToTurnOn)
 // function : GetSharedContext
 // purpose  :
 // =======================================================================
-const Handle(OpenGl_Context)& OpenGl_GraphicDriver::GetSharedContext() const
+const Handle(OpenGl_Context)& OpenGl_GraphicDriver::GetSharedContext (bool theBound) const
 {
   if (myMapOfView.IsEmpty())
   {
     return TheNullGlCtx;
   }
 
-  NCollection_Map<Handle(OpenGl_View)>::Iterator anIter (myMapOfView);
-  for (; anIter.More(); anIter.Next())
+  for (NCollection_Map<Handle(OpenGl_View)>::Iterator aViewIter (myMapOfView); aViewIter.More(); aViewIter.Next())
   {
-    Handle(OpenGl_Window) aWindow = anIter.Value()->GlWindow();
-    if (aWindow.IsNull())
+    if (const Handle(OpenGl_Window)& aWindow = aViewIter.Value()->GlWindow())
     {
-      continue;
+      if (!theBound)
+      {
+        return aWindow->GetGlContext();
+      }
+      else if (aWindow->GetGlContext()->IsCurrent())
+      {
+        return aWindow->GetGlContext();
+      }
     }
-
-    return aWindow->GetGlContext();
   }
 
   return TheNullGlCtx;
index 4cdba03..a07ec64 100644 (file)
@@ -153,7 +153,9 @@ public:
 
   //! Method to retrieve valid GL context.
   //! Could return NULL-handle if no window created by this driver.
-  Standard_EXPORT const Handle(OpenGl_Context)& GetSharedContext() const;
+  //! @param theBound if TRUE then currently bound context will be returned,
+  //!                 any context will be returned otherwise
+  Standard_EXPORT const Handle(OpenGl_Context)& GetSharedContext (bool theBound = false) const;
 
 #if defined(HAVE_EGL) || defined(HAVE_GLES2) || defined(OCCT_UWP) || defined(__ANDROID__) || defined(__QNX__)
   Aspect_Display          getRawGlDisplay() const { return myEglDisplay; }
index 1c68de1..eb93e1c 100644 (file)
@@ -109,6 +109,9 @@ public:
   //! correspondingly) onto far view frustum plane
   virtual gp_Pnt GetFarPickedPnt() const = 0;
 
+  //! Return mouse coordinates for Point selection mode.
+  virtual gp_Pnt2d GetMousePosition() const = 0;
+
   //! Stores plane equation coefficients (in the following form:
   //! Ax + By + Cz + D = 0) to the given vector
   virtual void GetPlanes (NCollection_Vector<NCollection_Vec4<Standard_Real> >& thePlaneEquations) const = 0;
index 1fae9f4..10ad731 100644 (file)
@@ -133,6 +133,9 @@ public:
   //! correspondingly) onto far view frustum plane
   inline const gp_Pnt& GetFarPnt() const { return myFarPickedPnt; }
 
+  //! Return mouse coordinates.
+  const gp_Pnt2d& GetMousePosition() const { return myMousePos; }
+
   //! Stores plane equation coefficients (in the following form:
   //! Ax + By + Cz + D = 0) to the given vector
   Standard_EXPORT virtual void GetPlanes (NCollection_Vector<SelectMgr_Vec4>& thePlaneEquations) const Standard_OVERRIDE;
index 92715fa..d54cf1f 100644 (file)
@@ -196,6 +196,17 @@ public:
   //! correspondingly) onto far view frustum plane
   Standard_EXPORT virtual gp_Pnt GetFarPickedPnt() const Standard_OVERRIDE;
 
+  //! Return mouse coordinates for Point selection mode.
+  virtual gp_Pnt2d GetMousePosition() const Standard_OVERRIDE
+  {
+    if (myActiveSelectionType != Point)
+    {
+      return gp_Pnt2d (RealLast(), RealLast());
+    }
+    const SelectMgr_RectangularFrustum* aFr = reinterpret_cast<const SelectMgr_RectangularFrustum*> (mySelectingVolumes[myActiveSelectionType / 2].get());
+    return aFr->GetMousePosition();
+  }
+
   //! Returns active selecting volume that was built during last
   //! run of OCCT selection mechanism
   Handle(SelectMgr_BaseFrustum) ActiveVolume() const