0024687: TKOpenGl shader programs - same view state for different v3d views
authorduv <duv@opencascade.com>
Thu, 20 Mar 2014 10:39:23 +0000 (14:39 +0400)
committerbugmaster <bugmaster@opencascade.com>
Thu, 20 Mar 2014 10:40:25 +0000 (14:40 +0400)
OpenGl_ShaderManager::IsSameView() - add const

src/OpenGl/OpenGl_ShaderManager.cxx
src/OpenGl/OpenGl_ShaderManager.hxx
src/OpenGl/OpenGl_View_2.cxx

index 92a4c2d..55dc4d4 100755 (executable)
@@ -33,8 +33,9 @@ IMPLEMENT_STANDARD_RTTIEXT(OpenGl_ShaderManager, Standard_Transient)
 // purpose  : Creates new empty shader manager
 // =======================================================================
 OpenGl_ShaderManager::OpenGl_ShaderManager (OpenGl_Context* theContext)
-: myContext (theContext),
-  myIsPP    (Standard_False)
+: myContext  (theContext),
+  myIsPP     (Standard_False),
+  myLastView (NULL)
 {
   //
 }
index 8acf35a..4ea5d32 100755 (executable)
@@ -25,6 +25,8 @@
 #include <OpenGl_ShaderProgram.hxx>
 #include <OpenGl_ShaderStates.hxx>
 
+class OpenGl_View;
+
 //! List of shader programs.
 typedef NCollection_Sequence<Handle(OpenGl_ShaderProgram)> OpenGl_ShaderProgramList;
 
@@ -165,6 +167,19 @@ public:
     myContext = theCtx;
   }
 
+  //! Sets last view manger used with.
+  //! Helps to handle matrix states in multi-view configurations.
+  void SetLastView (const OpenGl_View* theLastView)
+  {
+    myLastView = theLastView;
+  }
+
+  //! Returns true when provided view is the same as cached one.
+  bool IsSameView (const OpenGl_View* theView) const
+  {
+    return myLastView == theView;
+  }
+
 protected:
 
   OpenGl_ShaderProgramList myProgramList;  //!< The list of shader programs
@@ -173,7 +188,7 @@ protected:
 private:
 
   Standard_Boolean         myIsPP;         //!< Is any program object bound (programmable pipeline)?
-
+  const OpenGl_View*       myLastView;     //!< Pointer to the last view shader manager used with.
 };
 
 #endif // _OpenGl_ShaderManager_HeaderFile
index 2292b91..46014e1 100644 (file)
@@ -421,6 +421,19 @@ void OpenGl_View::Render (const Handle(OpenGl_PrinterContext)& thePrintContext,
     }
   }
 
+  if (!aManager.IsNull())
+  {
+    if (!aManager->IsSameView (this))
+    {
+      // Force update camera states
+      myProjectionState = myCamera->ProjectionState();
+      aManager->UpdateProjectionStateTo ((const Tmatrix3*)myCamera->ProjectionMatrixF().GetData());
+
+      myModelViewState = myCamera->ModelViewState();
+      aManager->UpdateWorldViewStateTo ((const Tmatrix3*)myCamera->OrientationMatrixF().GetData());
+    }
+  }
+
   // ====================================
   //      Step 2: Redraw background
   // ====================================
@@ -624,6 +637,15 @@ void OpenGl_View::Render (const Handle(OpenGl_PrinterContext)& thePrintContext,
   }
 
   delete[] aOldPlanes;
+
+  // ==============================================================
+  //      Step 8: Keep shader manager informed about last View
+  // ==============================================================
+
+  if (!aManager.IsNull())
+  {
+    aManager->SetLastView (this);
+  }
 }
 
 /*----------------------------------------------------------------------*/