<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 14 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:purple;
text-decoration:underline;}
span.EmailStyle17
{mso-style-type:personal-compose;
font-family:"Calibri","sans-serif";
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-family:"Calibri","sans-serif";}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link=blue vlink=purple><div class=WordSection1><p class=MsoNormal>I am rendering an isosurface computed from an image volume. When I compute the isosurface and then render it once everything works fine. In the same session with the same mapper and render window I try to generate the same isosurface again using the same parameters. What gets rendered to the screen is just a 2D image of one part of the surface and then when I go to rotate it and the screen goes black. This must be some kind of memory issue, but I shouldn’t be near my memory limit, and I should just be reusing memory. Here’s the code I use (in C# using Activiz) for the function:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New";color:#2B91AF'> vtkMarchingCubes</span><span style='font-size:10.0pt;font-family:"Courier New"'> vMarch = <span style='color:#2B91AF'>vtkMarchingCubes</span>.New();<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> vMarch.SetInputConnection(vResampler.GetOutputPort());<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> vMarch.ComputeNormalsOff();<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> vMarch.ComputeGradientsOff();<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> vMarch.ComputeScalarsOff();<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'><o:p> </o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> vMarch.SetValue(0, tabbedOptions1.sbIsoThresh.Value);<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> vMarch.ReleaseDataFlagOn();<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> vMarch.ProgressEvt += <span style='color:blue'>new</span> <span style='color:#2B91AF'>vtkObject</span>.<span style='color:#2B91AF'>vtkObjectEventHandler</span>(vMarch_ProgressEvt);<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> progressBar.Show();<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> progressBar.Message = <span style='color:#A31515'>"Calculating isosurface... Please wait."</span>;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> <o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> vMarch.Update();<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'><o:p> </o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> progressBar.Message = <span style='color:#A31515'>"Filtering isosurface... Please wait."</span>;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> <span style='color:#2B91AF'>vtkPolyDataConnectivityFilter</span> confilter = <span style='color:#2B91AF'>vtkPolyDataConnectivityFilter</span>.New();<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> confilter.ProgressEvt += <span style='color:blue'>new</span> <span style='color:#2B91AF'>vtkObject</span>.<span style='color:#2B91AF'>vtkObjectEventHandler</span>(vMarch_ProgressEvt);<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> confilter.SetInputConnection(vMarch.GetOutputPort());<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> confilter.SetExtractionModeToAllRegions();<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> confilter.ReleaseDataFlagOn();<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> confilter.Update();<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New";color:green'><o:p> </o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> progressBar.Message = <span style='color:#A31515'>"Smoothing isosurface... Please wait."</span>;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> <span style='color:#2B91AF'>vtkSmoothPolyDataFilter</span> smoothFilt = <span style='color:#2B91AF'>vtkSmoothPolyDataFilter</span>.New();<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> smoothFilt.ProgressEvt += <span style='color:blue'>new</span> <span style='color:#2B91AF'>vtkObject</span>.<span style='color:#2B91AF'>vtkObjectEventHandler</span>(vMarch_ProgressEvt);<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> smoothFilt.SetInputConnection(confilter.GetOutputPort());<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> smoothFilt.SetNumberOfIterations(5);<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> smoothFilt.SetRelaxationFactor(.1);<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> smoothFilt.FeatureEdgeSmoothingOff();<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> smoothFilt.BoundarySmoothingOff();<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> smoothFilt.SetConvergence(0);<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> smoothFilt.ReleaseDataFlagOn();<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> smoothFilt.Update();<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New";color:green'><o:p> </o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> progressBar.Message = <span style='color:#A31515'>"Calculating surface normals... Please wait."</span>;<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> <span style='color:#2B91AF'>vtkPolyDataNormals</span> vNorms = <span style='color:#2B91AF'>vtkPolyDataNormals</span>.New();<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> vNorms.ProgressEvt += <span style='color:blue'>new</span> <span style='color:#2B91AF'>vtkObject</span>.<span style='color:#2B91AF'>vtkObjectEventHandler</span>(vMarch_ProgressEvt);<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> vNorms.SetInputConnection(smoothFilt.GetOutputPort());<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> vNorms.ReleaseDataFlagOn();<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> vNorms.Update();<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New";color:green'><o:p> </o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> <span style='color:blue'>if</span> (vPolyMapper==<span style='color:blue'>null</span>)<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> vPolyMapper = <span style='color:#2B91AF'>vtkOpenGLPolyDataMapper</span>.New();<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'><o:p> </o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> vPolyMapper.SetInputConnection(vNorms.GetOutputPort());<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> vPolyMapper.ScalarVisibilityOff();<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> vPolyMapper.ReleaseDataFlagOn();<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> <span style='color:blue'>if</span> (vActor == <span style='color:blue'>null</span>)<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> vActor = <span style='color:#2B91AF'>vtkActor</span>.New();<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'><o:p> </o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> vActor.GetProperty().SetColor(tabbedOptions1.IsoColor[0], tabbedOptions1.IsoColor[1], tabbedOptions1.IsoColor[2]);<o:p></o:p></span></p><p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;font-family:"Courier New"'> vActor.GetProperty().SetOpacity(.01 * (<span style='color:blue'>double</span>)tabbedOptions1.sbIsoOpacity.Value); <o:p></o:p></span></p><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'> vActor.SetMapper(vPolyMapper);<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'> Then I render it with the window’s Render() method.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'>As you can see I am using the ReleaseDataFlagOn() , and all the variables used to create the isosurface are local variables that go out of scope when this function ends, so there mmemory is freed. The polymapper and actor are global variables, and need to be this way to make the rendering work correctly. The data from which the isosurface is generated is 512x512x94, so it’s not huge. Like I mentioned, it works the first time I generate the isosurface, but why not the second time? Anyone have any clues or a better way to do this? I have also used vtkContourFilter to generate the isosurface, and it works fine, but I want to have multiple ways to get the isosurface. The method above provides a smoother surface, which is why I like it better than the contour filter.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'>Thanks,<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'>Sean<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'><o:p> </o:p></span></p><p class=MsoNormal><o:p> </o:p></p></div></body></html>