0026538: Visualization - Infinite growth of maxtrix stack in OpenGl_Structure::Render
authorapl <apl@opencascade.com>
Thu, 20 Aug 2015 13:49:48 +0000 (16:49 +0300)
committerski <ski@opencascade.com>
Thu, 20 Aug 2015 13:50:31 +0000 (16:50 +0300)
Test case for issue CR26538
Small correction

src/OpenGl/OpenGl_Structure.cxx
tests/bugs/vis/bug26538 [new file with mode: 0755]

index c6c0403..c7a5699 100644 (file)
@@ -538,22 +538,21 @@ void OpenGl_Structure::Render (const Handle(OpenGl_Workspace) &theWorkspace) con
   const Standard_Boolean anOldGlNormalize = aCtx->IsGlNormalizeEnabled();
 
   // Apply local transformation
-  OpenGl_Mat4 aModelWorld;
   if (myTransformation)
   {
-    OpenGl_Transposemat3 ((OpenGl_Matrix*)aModelWorld.ChangeData(), myTransformation);
+    OpenGl_Matrix aModelWorld;
+    OpenGl_Transposemat3 (&aModelWorld, myTransformation);
+    aCtx->ModelWorldState.Push();
+    aCtx->ModelWorldState.SetCurrent (OpenGl_Mat4::Map ((Standard_ShortReal* )aModelWorld.mat));
 
-    Standard_ShortReal aScaleX = OpenGl_Vec3 (aModelWorld.GetValue (0, 0),
-                                              aModelWorld.GetValue (1, 0),
-                                              aModelWorld.GetValue (2, 0)).SquareModulus();
+    Standard_ShortReal aScaleX = OpenGl_Vec3 (myTransformation->mat[0][0],
+                                              myTransformation->mat[0][1],
+                                              myTransformation->mat[0][2]).SquareModulus();
     // Scale transform detected.
     if (Abs (aScaleX - 1.f) > Precision::Confusion())
     {
       aCtx->SetGlNormalizeEnabled (Standard_True);
     }
-
-    aCtx->ModelWorldState.Push();
-    aCtx->ModelWorldState.SetCurrent (aModelWorld);
   }
   if (TransformPersistence.Flags)
   {
@@ -567,11 +566,9 @@ void OpenGl_Structure::Render (const Handle(OpenGl_Workspace) &theWorkspace) con
     aCtx->WorldViewState.SetCurrent (aWorldView);
     aCtx->ApplyProjectionMatrix();
   }
-  if (aModelWorld || TransformPersistence.Flags)
-  {
-    aCtx->ApplyModelViewMatrix();
-  }
 
+  // Take into account transform persistence
+  aCtx->ApplyModelViewMatrix();
 
   // Apply aspects
   const OpenGl_AspectLine *anAspectLine = theWorkspace->AspectLine (Standard_False);
@@ -681,7 +678,7 @@ void OpenGl_Structure::Render (const Handle(OpenGl_Workspace) &theWorkspace) con
   }
 
   // Restore local transformation
-  if (!aModelWorld.IsIdentity())
+  if (myTransformation)
   {
     aCtx->ModelWorldState.Pop();
     aCtx->SetGlNormalizeEnabled (anOldGlNormalize);
@@ -692,10 +689,6 @@ void OpenGl_Structure::Render (const Handle(OpenGl_Workspace) &theWorkspace) con
     aCtx->WorldViewState.Pop();
     aCtx->ApplyProjectionMatrix();
   }
-  if (!aModelWorld.IsIdentity() || TransformPersistence.Flags)
-  {
-    aCtx->ApplyWorldViewMatrix();
-  }
 
   // Restore highlight color
   theWorkspace->HighlightColor = aHighlightColor;
diff --git a/tests/bugs/vis/bug26538 b/tests/bugs/vis/bug26538
new file mode 100755 (executable)
index 0000000..d93cd07
--- /dev/null
@@ -0,0 +1,27 @@
+puts "============"
+puts "OCC26538"
+puts "============"
+puts ""
+#######################################################################
+# Visualization - Infinite growth of maxtrix stack in OpenGl_Structure::Render
+#######################################################################
+
+box b1 1 1 1
+box b2 1 1 1
+
+vinit
+vdisplay b1
+vdisplay b2
+vsetlocation b2 10 10 10
+vfit
+
+set listmem {}
+
+set i_max 3
+for {set i 1} {${i} <= ${i_max}} {incr i} {
+   vfps 1000
+   lappend listmem [meminfo h]
+   checktrend $listmem 0 1 "Memory leak detected"
+}
+
+vdump ${imagedir}/${casename}.png