0026122: Visualization, TKOpenGl - clipping and capping is broken when ffp is disable...
[occt.git] / src / OpenGl / OpenGl_CappingAlgo.cxx
index 1436030..50cc186 100755 (executable)
 #include <OpenGl_CappingPlaneResource.hxx>
 #include <OpenGl_Vec.hxx>
 #include <OpenGl_Structure.hxx>
-
-IMPLEMENT_STANDARD_HANDLE(OpenGl_CappingAlgoFilter, OpenGl_RenderFilter)
-IMPLEMENT_STANDARD_RTTIEXT(OpenGl_CappingAlgoFilter, OpenGl_RenderFilter)
-
-Handle(OpenGl_RenderFilter) OpenGl_CappingAlgo::myRenderFilter;
-OpenGl_AspectFace OpenGl_CappingAlgo::myFrontCulling;
-OpenGl_AspectFace OpenGl_CappingAlgo::myNoneCulling;
-Standard_Boolean OpenGl_CappingAlgo::myIsInit = Standard_False;
+#include <Graphic3d_GraphicDriver.hxx>
 
 namespace
 {
-
 #if !defined(GL_ES_VERSION_2_0)
   static const GLint THE_FILLPRIM_FROM = GL_TRIANGLES;
   static const GLint THE_FILLPRIM_TO   = GL_POLYGON;
@@ -39,34 +31,6 @@ namespace
   static const GLint THE_FILLPRIM_FROM = GL_TRIANGLES;
   static const GLint THE_FILLPRIM_TO   = GL_TRIANGLE_FAN;
 #endif
-
-  static const OpenGl_Vec4 THE_CAPPING_PLN_VERTS[12] =
-    { OpenGl_Vec4 ( 0.0f, 0.0f, 0.0f, 1.0f),
-      OpenGl_Vec4 ( 1.0f, 0.0f, 0.0f, 0.0f),
-      OpenGl_Vec4 ( 0.0f, 0.0f, 1.0f, 0.0f),
-      OpenGl_Vec4 ( 0.0f, 0.0f, 0.0f, 1.0f),
-      OpenGl_Vec4 ( 0.0f, 0.0f, 1.0f, 0.0f),
-      OpenGl_Vec4 (-1.0f, 0.0f, 0.0f, 0.0f),
-      OpenGl_Vec4 ( 0.0f, 0.0f, 0.0f, 1.0f),
-      OpenGl_Vec4 (-1.0f, 0.0f, 0.0f, 0.0f),
-      OpenGl_Vec4 ( 0.0f, 0.0f,-1.0f, 0.0f),
-      OpenGl_Vec4 ( 0.0f, 0.0f, 0.0f, 1.0f),
-      OpenGl_Vec4 ( 0.0f, 0.0f,-1.0f, 0.0f),
-      OpenGl_Vec4 ( 1.0f, 0.0f, 0.0f, 0.0f) };
-
-  static const OpenGl_Vec4 THE_CAPPING_PLN_TCOORD[12] =
-    { OpenGl_Vec4 ( 0.0f, 0.0f, 0.0f, 1.0f),
-      OpenGl_Vec4 ( 1.0f, 0.0f, 0.0f, 0.0f),
-      OpenGl_Vec4 ( 0.0f, 1.0f, 0.0f, 0.0f),
-      OpenGl_Vec4 ( 0.0f, 0.0f, 0.0f, 1.0f),
-      OpenGl_Vec4 ( 0.0f, 1.0f, 0.0f, 0.0f),
-      OpenGl_Vec4 (-1.0f, 0.0f, 0.0f, 0.0f),
-      OpenGl_Vec4 ( 0.0f, 0.0f, 0.0f, 1.0f),
-      OpenGl_Vec4 (-1.0f, 0.0f, 0.0f, 0.0f),
-      OpenGl_Vec4 ( 0.0f,-1.0f, 0.0f, 0.0f),
-      OpenGl_Vec4 ( 0.0f, 0.0f, 0.0f, 1.0f),
-      OpenGl_Vec4 ( 0.0f,-1.0f, 0.0f, 0.0f),
-      OpenGl_Vec4 ( 1.0f, 0.0f, 0.0f, 0.0f) };
 }
 
 // =======================================================================
@@ -98,16 +62,12 @@ void OpenGl_CappingAlgo::RenderCapping (const Handle(OpenGl_Workspace)&  theWork
     return;
   }
 
-  // init internal data
-  Init();
-
   // remember current aspect face defined in workspace
   const OpenGl_AspectFace* aFaceAsp = theWorkspace->AspectFace (Standard_False);
 
   // replace primitive groups rendering filter
-  static Handle(OpenGl_CappingAlgoFilter) aCappingFilter = new OpenGl_CappingAlgoFilter();
   Handle(OpenGl_RenderFilter) aRenderFilter = theWorkspace->GetRenderFilter();
-  theWorkspace->SetRenderFilter (aCappingFilter);
+  theWorkspace->SetRenderFilter (theWorkspace->DefaultCappingAlgoFilter());
 
   // prepare for rendering the clip planes
   glEnable (GL_STENCIL_TEST);
@@ -134,14 +94,14 @@ void OpenGl_CappingAlgo::RenderCapping (const Handle(OpenGl_Workspace)&  theWork
     {
       const Handle(Graphic3d_ClipPlane)& aPlane = aPlaneIt.Value();
       const Standard_Boolean isOn = (aPlane == aRenderPlane);
-      aContext->ChangeClipping().SetEnabled (aPlane, isOn);
+      aContext->ChangeClipping().SetEnabled (aContext, aPlane, isOn);
     }
 
     glClear (GL_STENCIL_BUFFER_BIT);
     glColorMask (GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
 
     // override aspects, disable culling
-    theWorkspace->SetAspectFace (NoneCulling());
+    theWorkspace->SetAspectFace (&theWorkspace->NoneCulling());
     theWorkspace->AspectFace (Standard_True);
 
     // evaluate number of pair faces
@@ -159,7 +119,7 @@ void OpenGl_CappingAlgo::RenderCapping (const Handle(OpenGl_Workspace)&  theWork
     }
 
     // override material, cull back faces
-    theWorkspace->SetAspectFace (FrontCulling());
+    theWorkspace->SetAspectFace (&theWorkspace->FrontCulling());
     theWorkspace->AspectFace (Standard_True);
 
     // enable all clip plane except the rendered one
@@ -167,7 +127,7 @@ void OpenGl_CappingAlgo::RenderCapping (const Handle(OpenGl_Workspace)&  theWork
     {
       const Handle(Graphic3d_ClipPlane)& aPlane = aPlaneIt.Value();
       const Standard_Boolean isOn = (aPlane != aRenderPlane);
-      aContext->ChangeClipping().SetEnabled (aPlane, isOn);
+      aContext->ChangeClipping().SetEnabled (aContext, aPlane, isOn);
     }
 
     // render capping plane using the generated stencil mask
@@ -189,7 +149,7 @@ void OpenGl_CappingAlgo::RenderCapping (const Handle(OpenGl_Workspace)&  theWork
   // enable clipping
   for (aCappingIt.Init (aContextPlanes); aCappingIt.More(); aCappingIt.Next())
   {
-    aContext->ChangeClipping().SetEnabled (aCappingIt.Value(), Standard_True);
+    aContext->ChangeClipping().SetEnabled (aContext, aCappingIt.Value(), Standard_True);
   }
 
   // restore rendering aspects
@@ -226,24 +186,12 @@ void OpenGl_CappingAlgo::RenderPlane (const Handle(OpenGl_Workspace)& theWorkspa
     theWorkspace->SetAspectFace (aPlaneAspect);
   }
 
-  // apply aspect for rendering
-  theWorkspace->AspectFace (Standard_True);
-
   // set identity model matrix
   aContext->ModelWorldState.Push();
   aContext->ModelWorldState.SetCurrent (OpenGl_Mat4::Map (*aPlaneRes->Orientation()->mat));
   aContext->ApplyModelViewMatrix();
 
-#if !defined(GL_ES_VERSION_2_0)
-  glNormal3f (0.0f, 1.0f, 0.0f);
-  glEnableClientState (GL_VERTEX_ARRAY);
-  glVertexPointer (4, GL_FLOAT, 0, (GLfloat* )&THE_CAPPING_PLN_VERTS);
-  glEnableClientState (GL_TEXTURE_COORD_ARRAY);
-  glTexCoordPointer (4, GL_FLOAT, 0, (GLfloat*)&THE_CAPPING_PLN_TCOORD);
-  glDrawArrays (GL_TRIANGLES, 0, 12);
-  glDisableClientState (GL_VERTEX_ARRAY);
-  glDisableClientState (GL_TEXTURE_COORD_ARRAY);
-#endif
+  aPlaneRes->Primitives().Render (theWorkspace);
 
   aContext->ModelWorldState.Pop();
   aContext->ApplyModelViewMatrix();
@@ -255,25 +203,6 @@ void OpenGl_CappingAlgo::RenderPlane (const Handle(OpenGl_Workspace)& theWorkspa
   aContext->ReleaseResource (aResId, Standard_True);
 }
 
-// =======================================================================
-// function : Init
-// purpose  :
-// =======================================================================
-void OpenGl_CappingAlgo::Init()
-{
-  if (myIsInit)
-    return;
-
-  myRenderFilter = new OpenGl_CappingAlgoFilter();
-  myNoneCulling.ChangeCullingMode() = TelCullNone;
-  myNoneCulling.ChangeEdge() = 0;
-
-  myFrontCulling.ChangeCullingMode() = TelCullBack;
-  myFrontCulling.ChangeEdge() = 0;
-
-  myIsInit = Standard_True;
-}
-
 // =======================================================================
 // function : CanRender
 // purpose  :