OCC22108 Cutting plane unpredictable behaviour in V3d_View
authorAPL <>
Thu, 28 Apr 2011 15:54:34 +0000 (15:54 +0000)
committerbugmaster <bugmaster@opencascade.com>
Mon, 5 Mar 2012 15:28:18 +0000 (19:28 +0400)
src/OpenGl/OpenGl_telem_view.hxx
src/OpenGl/OpenGl_togl_print.cxx
src/OpenGl/OpenGl_togl_redraw.cxx
src/OpenGl/OpenGl_togl_setplane.cxx
src/OpenGl/OpenGl_togl_update.cxx
src/OpenGl/OpenGl_togl_vieworientation.cxx
src/OpenGl/OpenGl_view.cxx

index c2b27a3..421bac1 100755 (executable)
@@ -25,6 +25,8 @@ Suppression de TelPrintAllViews()
 #define  OPENGL_TELEM_VIEW_H
 
 #include <OpenGl_telem.hxx>
+#include <OpenGl_tgl.hxx>
+#include <NCollection_List.hxx>
 
 typedef  struct
 {
@@ -44,6 +46,8 @@ typedef  struct
   Tfloat    zmax;
 } Tlimit3;
 
+
+
 typedef  enum
 {
   TelParallel, TelPerspective
@@ -74,6 +78,7 @@ typedef  struct
   Tint        border_indicator;
   TEL_COLOUR  border_colour;
   Tint        active_status;
+  NCollection_List<CALL_DEF_PLANE> clipping_planes;
   struct
   {
     Tfloat  vrp[3];
index ecb10e5..ed55b8f 100755 (executable)
@@ -312,6 +312,8 @@ call_togl_print
     // redraw to new Rendering Context
     call_func_redraw_all_structs_begin (aview->WsId);
 
+    call_togl_setplane( aview ); /* update clipping planes */
+
     if (background == 0)
     {
       glClearColor(1.0, 1.0, 1.0, 1.0);
index 9e36711..ea1caaa 100755 (executable)
@@ -59,7 +59,6 @@ GLboolean g_fBitmap;
 #include <OpenGl_tgl_funcs.hxx>
 #include <OpenGl_tgl_subrvis.hxx>
 #include <OpenGl_FrameBuffer.hxx>
-#include <OpenGl_ResourceCleaner.hxx>
 #include <InterfaceGraphic_Graphic3d.hxx>
 #include <InterfaceGraphic_Visual3d.hxx>
 
@@ -87,8 +86,9 @@ call_togl_redraw
       aFrameBuffer->BindBuffer();
       swap = 0; // no need to swap buffers
     }
-    OpenGl_ResourceCleaner::GetInstance()->Cleanup();
+
     call_func_redraw_all_structs_begin (aview->WsId);
+    call_togl_setplane( aview ); /* apl - OCC22108: update clipping planes */
     if (anunderlayer->ptrLayer)
     {
       call_togl_redraw_layer2d (aview, anunderlayer);
@@ -163,8 +163,8 @@ call_togl_redraw_area
       glScissor ((GLint )x,
                  (GLint )((int )aview->DefWindow.dy - (y + height)),
                  (GLsizei )width, (GLsizei )height);
-      OpenGl_ResourceCleaner::GetInstance()->Cleanup();
       call_func_redraw_all_structs_begin (aview->WsId);
+      call_togl_setplane( aview ); /* apl - OCC22108: update clipping planes */
       if (anunderlayer->ptrLayer)
       {
         call_togl_redraw_layer2d (aview, anunderlayer);
index 097662f..437e844 100755 (executable)
@@ -2,8 +2,23 @@
 
 #include <OpenGl_tgl_all.hxx>
 #include <OpenGl_tgl.hxx>
+#include <OpenGl_tgl_funcs.hxx>
+#include <OpenGl_telem_view.hxx>
+#include <OpenGl_tsm_ws.hxx>
 #include <GL/gl.h>
 
+
+struct TEL_VIEW_DATA
+{
+  TEL_VIEW_REP    vrep;
+#ifdef CAL_100498
+  Tmatrix3        inverse_matrix;/* accelerates UVN2XYZ conversion */
+#endif
+  IMPLEMENT_MEMORY_OPERATORS
+};
+typedef TEL_VIEW_DATA *tel_view_data;   /* Internal data stored for every view rep */
+
+
 void EXPORT
 /* unimplemented */
 call_togl_setplane
@@ -12,38 +27,34 @@ call_togl_setplane
  )
 {
 #ifdef GER61454
+
+  CMN_KEY_DATA    key;
+  tel_view_data   vptr;
+  TEL_VIEW_REP   *call_viewrep;
   CALL_DEF_PLANE *plane;
-  int j,planeid ;
-
-  if( aview->Context.NbActivePlane > 0 ) {
-    for( j=0 ; j<aview->Context.NbActivePlane ; j++ ) {
-      plane = &aview->Context.ActivePlane[j];
-      if( plane->PlaneId > 0 ) {
-        planeid = GL_CLIP_PLANE2 + j;
-        if( plane->Active ) {
-          GLdouble equation[4];
-          equation[0] = plane->CoefA;      
-          equation[1] = plane->CoefB;      
-          equation[2] = plane->CoefC;      
-          equation[3] = plane->CoefD;
-          /*
-          Activates new clip planes
-          */ 
-          glClipPlane( planeid , equation );     
-          if( !glIsEnabled( planeid ) ) glEnable( planeid );     
-        } else {
-          if( glIsEnabled( planeid ) ) glDisable( planeid );     
-        }
-      }
-    }
-  }
-  /*
-  Disable the remainder Clip planes
-  */
-  for( j=aview->Context.NbActivePlane ; j<call_facilities_list.MaxPlanes ; j++ ) {
-    planeid = GL_CLIP_PLANE2 + j;
-    if( glIsEnabled( planeid ) ) glDisable( planeid );
-  }
+  int j;
+  
+  // return view representation 
+  
+  if( aview->ViewId == 0 )
+    return;                 // no modifications on default view
+
+  if( TsmGetWSAttri( aview->WsId, WSViews, &key ) != TSuccess )
+    return;
+
+  vptr = (tel_view_data)key.pdata;
+  if( !vptr )
+    return;
+
+  call_viewrep = &vptr->vrep;
+  
+  // clear clipping planes information
+  call_viewrep->clipping_planes.Clear();
+  // update information 
+  if( aview->Context.NbActivePlane > 0 )
+    for( j=0 ; j<aview->Context.NbActivePlane ; j++ )
+      call_viewrep->clipping_planes.Append( aview->Context.ActivePlane[j] );
 #endif
-  return;
+return;
 }
index e2d2a6f..82c29f5 100755 (executable)
@@ -67,6 +67,9 @@ void EXPORT call_togl_update
     TsmGetWSAttri (aview->WsId, WSWindow, &data);
     if (TxglWinset (call_thedisplay, (Window) data.ldata) == TSuccess) {
       call_func_redraw_all_structs_begin (aview->WsId);
+      
+      call_togl_setplane( aview ); /* update clipping planes */
+
       if (anunderlayer->ptrLayer)
         call_togl_redraw_layer2d (aview, anunderlayer);
       call_func_redraw_all_structs_proc (aview->WsId);
index d39a3a5..77fecb4 100755 (executable)
@@ -15,7 +15,6 @@ xx-xx-xx : CAL ; Creation.
 10-07-96 : FMN ; Suppression #define sur calcul matrice
 
 ************************************************************************/
-#define GER61454        //GG 14-09-99 Activates the model clipping planes
 
 /*----------------------------------------------------------------------*/
 /*
@@ -96,9 +95,6 @@ call_togl_vieworientation
       waitwait = 1;
       call_togl_viewmapping( aview, waitwait );
       call_togl_cliplimit( aview, waitwait );
-#ifdef GER61454
-      call_togl_setplane( aview );
-#endif
       TelSetViewRepresentation( aview->WsId, aview->ViewId, &call_viewrep );
     }
   }
index 0bf6e4d..0360916 100755 (executable)
@@ -86,6 +86,7 @@ if any was defined
 #include <OpenGl_tsm_ws.hxx>
 #include <OpenGl_txgl.hxx>
 #include <OpenGl_Memory.hxx>
+#include <Standard_TypeDef.hxx>
 
 /*----------------------------------------------------------------------*/
 /*
@@ -138,7 +139,9 @@ typedef TEL_VIEW_DATA *tel_view_data;   /* Internal data stored for every view r
 * Variables statiques
 */
 
-static void set_clipplanes( tel_view_rep );
+static void set_clipplanes( tel_view_rep );      /* front & back clip planes */
+static void set_userclipplanes( tel_view_rep );  /* user-defined clipping planes */
+
 #ifdef CAL_100498
 static  void  TelEvalInverseMatrix( Tfloat*, Tfloat*, Tfloat*, /*vrp,vpn,vup*/
                                     Tfloat, Tmatrix3 );        /*vpd,inverse*/
@@ -504,6 +507,7 @@ TelGetViewRepresentation( Tint  Wsid /* Workstation id*/,
       vrep->extra.map.viewport.zmin = ( float )0.0;
     vrep->extra.map.viewport.xmax = vrep->extra.map.viewport.ymax =
       vrep->extra.map.viewport.zmax = ( float )1.0;
+    vrep->clipping_planes.Clear();
     return TSuccess;
   }
 
@@ -791,6 +795,7 @@ TelSetViewIndex( Tint  Wsid /* Workstation id */,
   vptr = (tel_view_data)key.pdata ; /* Obtain defined view data*/
   if( !vptr ) return TFailure; /* no view defined yet */ 
 
 #ifdef TRACE_MATRIX
   printf("OpenGl_view.c::TelSetViewIndex::glMatrixMode(GL_MODELVIEW) \n"); 
 #endif
@@ -802,8 +807,10 @@ TelSetViewIndex( Tint  Wsid /* Workstation id */,
     glDisable(GL_NORMALIZE);
   glMatrixMode(GL_MODELVIEW);
   set_clipplanes( &(vptr->vrep) );
+  
 
   glLoadMatrixf((GLfloat *) vptr->vrep.orientation_matrix );
+  set_userclipplanes( &(vptr->vrep) ); /* set clipping planes defined by user */
 
 #ifdef ENVTEX
   /*
@@ -845,7 +852,6 @@ TelSetViewIndex( Tint  Wsid /* Workstation id */,
   pr_matrix( vptr->vrep.mapping_matrix );
 #endif
 
-
   return vptr->vrep.active_status == TOn ? TSuccess : TFailure;
 }
 
@@ -889,14 +895,14 @@ TelSetViewProjection( Tint  Wsid /* Workstation id */,
   if( !vptr ) return TFailure; /* no view defined yet */ 
 
   set_clipplanes( &(vptr->vrep) );
+  set_userclipplanes( &(vptr->vrep) );
 
 #ifdef TRACE_MATRIX
   printf("OpenGl_view.c::TelSetViewProjection::glMatrixMode(GL_PROJECTION) \n"); 
 #endif
   glMatrixMode(GL_PROJECTION);
   glLoadMatrixf((GLfloat *) vptr->vrep.mapping_matrix );
-
-
   return vptr->vrep.active_status == TOn ? TSuccess : TFailure;
 }
 
@@ -1080,6 +1086,60 @@ set_clipplanes( tel_view_rep vrep )
   glLoadMatrixf( (GLfloat *) mat );
 }
 
+static void
+set_userclipplanes( tel_view_rep vrep )
+{
+  int j,planeid;
+  CALL_DEF_PLANE* plane;
+
+#ifdef TRACE_MATRIX
+  printf("OpenGl_view.c::set_userclipplanes::glMatrixMode(GL_MODELVIEW) \n"); 
+#endif
+
+  
+  NCollection_List<CALL_DEF_PLANE>::Iterator planeIter(vrep->clipping_planes);
+  
+  // go through all of planes in the list & preview them
+  for( j=0 ; planeIter.More(); planeIter.Next(), j++ ) 
+  {
+    plane = const_cast<CALL_DEF_PLANE*>(&planeIter.Value());
+    
+    if( plane->PlaneId > 0 ) 
+    {
+      planeid = GL_CLIP_PLANE2 + j;
+
+      if( plane->Active ) 
+      {
+         // Activates new clip planes
+         GLdouble equation[4];
+         equation[0] = plane->CoefA;
+         equation[1] = plane->CoefB;
+         equation[2] = plane->CoefC;
+         equation[3] = plane->CoefD;
+         
+          glClipPlane( planeid , equation );     
+          if( !glIsEnabled( planeid ) ) glEnable( planeid );     
+      } 
+      else 
+      {
+       if( glIsEnabled( planeid ) ) glDisable( planeid );     
+      }
+    }
+  }   //for( ; planeIter.More(); planeIter.Next() ) 
+
+  // Disable the remainder Clip planes
+
+  for( j=vrep->clipping_planes.Size(); j < call_facilities_list.MaxPlanes; j++ )
+  {
+    planeid = GL_CLIP_PLANE2 + j; 
+
+    if( glIsEnabled( planeid ) ) 
+      glDisable( planeid );
+   }
+
+  
+}
+
 /*----------------------------------------------------------------------*/
 
 TStatus