0024353: TKOpenGl - crash in IsRaytracedStructure when clearing mutli-connected prese...
authorkgv <kgv@opencascade.com>
Thu, 21 Nov 2013 09:29:08 +0000 (13:29 +0400)
committerbugmaster <bugmaster@opencascade.com>
Thu, 21 Nov 2013 09:29:53 +0000 (13:29 +0400)
Correction of test cases for issue CR24353

src/OpenGl/OpenGl_SceneGeometry.cxx
src/OpenGl/OpenGl_Structure.cxx
src/OpenGl/OpenGl_Structure.hxx
src/OpenGl/OpenGl_Workspace_Raytrace.cxx
tests/v3d/raytrace/connected [new file with mode: 0644]

index 472687e..be2f350 100644 (file)
@@ -146,7 +146,8 @@ OpenGl_RaytraceLight::OpenGl_RaytraceLight (const OpenGl_RTVec4f& theDiffuse,
 // =======================================================================
 OpenGl_RTVec4f OpenGl_RaytraceScene::Center (const int theTriangle) const
 {
-  const OpenGl_RTVec4i anIndex (Triangles [theTriangle]);
+  const OpenGl_RTVec4i& anIndex = Triangles [theTriangle];
+
   return ( Vertices[anIndex.x()] +
            Vertices[anIndex.y()] +
            Vertices[anIndex.z()] ) * ( 1.f / 3.f );
@@ -159,7 +160,8 @@ OpenGl_RTVec4f OpenGl_RaytraceScene::Center (const int theTriangle) const
 float OpenGl_RaytraceScene::CenterAxis (const int theTriangle,
                                         const int theAxis) const
 {
-  const OpenGl_RTVec4i anIndex (Triangles [theTriangle]);
+  const OpenGl_RTVec4i& anIndex = Triangles [theTriangle];
+
   return ( Vertices[anIndex.x()][theAxis] +
            Vertices[anIndex.y()][theAxis] +
            Vertices[anIndex.z()][theAxis] ) * ( 1.f / 3.f );
@@ -171,11 +173,11 @@ float OpenGl_RaytraceScene::CenterAxis (const int theTriangle,
 // =======================================================================
 OpenGl_AABB OpenGl_RaytraceScene::Box (const int theTriangle) const
 {
-  const OpenGl_RTVec4i anIndex (Triangles[theTriangle]);
+  const OpenGl_RTVec4i& anIndex = Triangles[theTriangle];
 
-  const OpenGl_RTVec4f pA = Vertices[anIndex.x()];
-  const OpenGl_RTVec4f pB = Vertices[anIndex.y()];
-  const OpenGl_RTVec4f pC = Vertices[anIndex.z()];
+  const OpenGl_RTVec4f& pA = Vertices[anIndex.x()];
+  const OpenGl_RTVec4f& pB = Vertices[anIndex.y()];
+  const OpenGl_RTVec4f& pC = Vertices[anIndex.z()];
 
   OpenGl_AABB aBox (pA);
 
index 42ade61..f7a89cc 100644 (file)
@@ -386,6 +386,27 @@ void OpenGl_Structure::UnregisterAncestorStructure (const OpenGl_Structure* theS
 }
 
 // =======================================================================
+// function : UnregisterFromAncestorStructure
+// purpose  :
+// =======================================================================
+void OpenGl_Structure::UnregisterFromAncestorStructure() const
+{
+  for (OpenGl_ListOfStructure::Iterator anIta (myAncestorStructures); anIta.More(); anIta.Next())
+  {
+    OpenGl_Structure* anAncestor = const_cast<OpenGl_Structure*> (anIta.ChangeValue());
+
+    for (OpenGl_ListOfStructure::Iterator anIts (anAncestor->myConnected); anIts.More(); anIts.Next())
+    {
+      if (anIts.Value() == this)
+      {
+        anAncestor->myConnected.Remove (anIts);
+        return;
+      }      
+    }
+  }
+}
+
+// =======================================================================
 // function : UpdateStateWithAncestorStructures
 // purpose  :
 // =======================================================================
@@ -778,6 +799,11 @@ void OpenGl_Structure::Release (const Handle(OpenGl_Context)& theGlCtx)
   OpenGl_Element::Destroy (theGlCtx, myAspectMarker);
   OpenGl_Element::Destroy (theGlCtx, myAspectText);
   ClearHighlightColor (theGlCtx);
+
+#ifdef HAVE_OPENCL
+  // Remove from connected list of ancestor
+  UnregisterFromAncestorStructure();
+#endif
 }
 
 // =======================================================================
index 994e6ad..4a4fe17 100644 (file)
@@ -138,6 +138,9 @@ protected:
   //! Unregisters ancestor connected structure (for updating ray-tracing state).
   void UnregisterAncestorStructure (const OpenGl_Structure* theStructure) const;
 
+  //! Unregisters structure from ancestor structure (for updating ray-tracing state).
+  void UnregisterFromAncestorStructure() const;
+
   //! Updates modification state for structure and its parents.
   void UpdateStateWithAncestorStructures() const;
 
index 192b21e..eee0428 100644 (file)
@@ -47,7 +47,7 @@
 using namespace OpenGl_Raytrace;
 
 //! Use this macro to output ray-tracing debug info
-// #define RAY_TRACE_PRINT_INFO
+//#define RAY_TRACE_PRINT_INFO
 
 #ifdef RAY_TRACE_PRINT_INFO
   #include <OSD_Timer.hxx>
diff --git a/tests/v3d/raytrace/connected b/tests/v3d/raytrace/connected
new file mode 100644 (file)
index 0000000..a2f8467
--- /dev/null
@@ -0,0 +1,32 @@
+puts "TODO ?OCC24130 Windows: TKOpenGl | Type\: Error | ID\: 0 | Severity\: High | Message\:"
+
+puts "========"
+puts "Ray Tracing - check rendering of multi-connected structures"
+puts "========"
+
+# create boxes
+box b1 0 0 0 1 2 3
+box b2 3 0 0 3 2 1
+
+# draw box
+vinit View1
+vclear
+vsetdispmode 1
+vraytrace 0
+vaxo
+vconnectsh b1c -3 0 0 1 0 0 0 0 1 b1 b2
+vfit
+vrotate 0.2 0.0 0.0
+vclear
+vconnectsh b1c -3 0 0 1 0 0 0 0 1 b1 b2
+
+# take snapshot with fixed pipeline
+vdump $::imagedir/${::casename}_OFF.png
+
+# turn on ray tracing
+vraytrace 1
+vclinfo
+vdump $::imagedir/${::casename}_rt1.png
+
+vclear
+vconnectsh b1c -3 0 0 1 0 0 0 0 1 b1 b2