0026122: Visualization, TKOpenGl - clipping and capping is broken when ffp is disable...
[occt.git] / src / OpenGl / OpenGl_Clipping.cxx
index 9bfce47..37c7422 100755 (executable)
 // commercial license or contractual agreement.
 
 #include <OpenGl_Clipping.hxx>
+
 #include <OpenGl_GlCore11.hxx>
 #include <OpenGl_Workspace.hxx>
+#include <OpenGl_Context.hxx>
 
 #if defined(GL_ES_VERSION_2_0)
   // id does not matter for GLSL-based clipping, just for consistency
@@ -48,42 +50,56 @@ void OpenGl_Clipping::Init (const Standard_Integer theMaxPlanes)
 }
 
 // =======================================================================
-// function : Add
+// function : add
 // purpose  :
 // =======================================================================
-void OpenGl_Clipping::Add (Graphic3d_SequenceOfHClipPlane& thePlanes,
-                           const EquationCoords& theCoordSpace,
-                           const Handle(OpenGl_Workspace)& theWS)
+void OpenGl_Clipping::add (const Handle(OpenGl_Context)&   theGlCtx,
+                           const EquationCoords&           theCoordSpace,
+                           Graphic3d_SequenceOfHClipPlane& thePlanes)
 {
-  Handle(OpenGl_Context) aContext = theWS->GetGlContext();
+  const bool toUseFfp = theGlCtx->core11 != NULL
+                     && theGlCtx->caps->ffpEnable;
+  if (!toUseFfp)
+  {
+    addLazy (theGlCtx, theCoordSpace, thePlanes);
+    return;
+  }
 
   if (EquationCoords_View == theCoordSpace)
   {
-    aContext->WorldViewState.Push();
-    aContext->WorldViewState.SetIdentity();
+    theGlCtx->WorldViewState.Push();
+    theGlCtx->WorldViewState.SetIdentity();
   }
 
   // Set either identity or pure view matrix.
-  aContext->ApplyWorldViewMatrix();
+  theGlCtx->ApplyWorldViewMatrix();
 
-  Add (thePlanes, theCoordSpace);
+  addLazy (theGlCtx, theCoordSpace, thePlanes);
 
   if (EquationCoords_View == theCoordSpace)
   {
-    aContext->WorldViewState.Pop();
+    theGlCtx->WorldViewState.Pop();
   }
 
   // Restore combined model-view matrix.
-  aContext->ApplyModelViewMatrix();
-
+  theGlCtx->ApplyModelViewMatrix();
 }
 
 // =======================================================================
-// function : Add
+// function : addLazy
 // purpose  :
 // =======================================================================
-void OpenGl_Clipping::Add (Graphic3d_SequenceOfHClipPlane& thePlanes, const EquationCoords& theCoordSpace)
+void OpenGl_Clipping::addLazy (const Handle(OpenGl_Context)&   theGlCtx,
+                               const EquationCoords&           theCoordSpace,
+                               Graphic3d_SequenceOfHClipPlane& thePlanes)
 {
+#if !defined(GL_ES_VERSION_2_0)
+  const bool toUseFfp = theGlCtx->core11 != NULL
+                     && theGlCtx->caps->ffpEnable;
+#else
+  (void )theGlCtx;
+#endif
+
   Graphic3d_SequenceOfHClipPlane::Iterator aPlaneIt (thePlanes);
   while (aPlaneIt.More() && myEmptyPlaneIds->HasFree())
   {
@@ -99,8 +115,11 @@ void OpenGl_Clipping::Add (Graphic3d_SequenceOfHClipPlane& thePlanes, const Equa
     myPlaneStates.Bind (aPlane, PlaneProps (theCoordSpace, anID, Standard_True));
 
   #if !defined(GL_ES_VERSION_2_0)
-    ::glEnable ((GLenum)anID);
-    ::glClipPlane ((GLenum)anID, aPlane->GetEquation());
+    if (toUseFfp)
+    {
+      ::glEnable ((GLenum)anID);
+      theGlCtx->core11->glClipPlane ((GLenum)anID, aPlane->GetEquation());
+    }
   #endif
     if (aPlane->IsCapping())
     {
@@ -127,8 +146,16 @@ void OpenGl_Clipping::Add (Graphic3d_SequenceOfHClipPlane& thePlanes, const Equa
 // function : Remove
 // purpose  :
 // =======================================================================
-void OpenGl_Clipping::Remove (const Graphic3d_SequenceOfHClipPlane& thePlanes)
+void OpenGl_Clipping::Remove (const Handle(OpenGl_Context)&         theGlCtx,
+                              const Graphic3d_SequenceOfHClipPlane& thePlanes)
 {
+#if !defined(GL_ES_VERSION_2_0)
+  const bool toUseFfp = theGlCtx->core11 != NULL
+                     && theGlCtx->caps->ffpEnable;
+#else
+  (void )theGlCtx;
+#endif
+
   Graphic3d_SequenceOfHClipPlane::Iterator aPlaneIt (thePlanes);
   for (; aPlaneIt.More(); aPlaneIt.Next())
   {
@@ -143,7 +170,10 @@ void OpenGl_Clipping::Remove (const Graphic3d_SequenceOfHClipPlane& thePlanes)
     if (aProps.IsEnabled)
     {
     #if !defined(GL_ES_VERSION_2_0)
-      glDisable ((GLenum)anID);
+      if (toUseFfp)
+      {
+        ::glDisable ((GLenum)anID);
+      }
     #endif
       if (aPlane->IsCapping())
       {
@@ -179,8 +209,9 @@ void OpenGl_Clipping::Remove (const Graphic3d_SequenceOfHClipPlane& thePlanes)
 // function : SetEnabled
 // purpose  :
 // =======================================================================
-void OpenGl_Clipping::SetEnabled (const Handle(Graphic3d_ClipPlane)& thePlane,
-                                  const Standard_Boolean theIsEnabled)
+void OpenGl_Clipping::SetEnabled (const Handle(OpenGl_Context)&      theGlCtx,
+                                  const Handle(Graphic3d_ClipPlane)& thePlane,
+                                  const Standard_Boolean             theIsEnabled)
 {
   if (!Contains (thePlane))
   {
@@ -195,11 +226,16 @@ void OpenGl_Clipping::SetEnabled (const Handle(Graphic3d_ClipPlane)& thePlane,
 
 #if !defined(GL_ES_VERSION_2_0)
   GLenum anID = (GLenum)aProps.ContextID;
+  const bool toUseFfp = theGlCtx->core11 != NULL
+                     && theGlCtx->caps->ffpEnable;
 #endif
   if (theIsEnabled)
   {
   #if !defined(GL_ES_VERSION_2_0)
-    glEnable (anID);
+    if (toUseFfp)
+    {
+      ::glEnable (anID);
+    }
   #endif
     if (thePlane->IsCapping())
     {
@@ -213,7 +249,10 @@ void OpenGl_Clipping::SetEnabled (const Handle(Graphic3d_ClipPlane)& thePlane,
   else
   {
   #if !defined(GL_ES_VERSION_2_0)
-    glDisable (anID);
+    if (toUseFfp)
+    {
+      ::glDisable (anID);
+    }
   #endif
     if (thePlane->IsCapping())
     {