<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=iso-8859-1">
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@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:0cm;
        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;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Vorformatiert Zchn";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0cm;
        margin-right:0cm;
        margin-bottom:0cm;
        margin-left:36.0pt;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
span.E-MailFormatvorlage17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.HTMLVorformatiertZchn
        {mso-style-name:"HTML Vorformatiert Zchn";
        mso-style-priority:99;
        mso-style-link:"HTML Vorformatiert";
        font-family:"Courier New";}
.MsoChpDefault
        {mso-style-type:export-only;}
@page Section1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 2.0cm 70.85pt;}
div.Section1
        {page:Section1;}
 /* List Definitions */
 @list l0
        {mso-list-id:1794057016;
        mso-list-type:hybrid;
        mso-list-template-ids:-997403660 67567617 67567619 67567621 67567617 67567619 67567621 67567617 67567619 67567621;}
@list l0:level1
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
ol
        {margin-bottom:0cm;}
ul
        {margin-bottom:0cm;}
-->
</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=DE link=blue vlink=purple>

<div class=Section1>

<p class=MsoNormal>Dear VTK-Users,<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal><span lang=EN-US>in a previous post (<a
href="http://www.vtk.org/pipermail/vtkusers/2009-December/104490.html">http://www.vtk.org/pipermail/vtkusers/2009-December/104490.html</a>)
I reported a strong performance leak during rendering twice of my object with
the new multipass framework of VTK. Especially, if my object consist of many
triangles. Now, I figured out what the problem was by examine the source code
of the vtkOpenGLMapper and want to shade these information with the
VTK-community, especially these users which have not yet a deep understanding
of the rendering pipeline of VTK, like me.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US>In the render-routine of my derived
vtkRenderPass-class I changed some actor properties, e.g., surface rendering
style (wireframe or surface) or opacity via &#8220;actor-&gt;GetProperty()-&gt;SetOpacity(&#8230;)&#8221;
in each pass. This occurred a deletion and new creation of the display lists of
the corresponding polydata-object in the mapper. Because this happened every
frame, the performance leak occurred.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US>To resolve it, I use the property key
capability of the frame work by orientation to  vtkShadowMappPass. Like in my previous
approach, I create different actors of my object based on the same vtkPolyData
object. After this, I set the properties of each actor in that way I want to
use it in the corresponding pass (e.g. wireframe). Additionally I set different
vtkInformation-objects with special keys as property keys to the actors. In my
render-routine of my derived vtkRenderingPass I set  the required keys to my
render state object and only these actor(s) with the same key is (are) rendered.
Now I can call <o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New"'>this-&gt;DelegatePass-&gt;Render(&amp;newRenderState);
multiple times with setting the correct key property and without performace
leak.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New"'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New"'>Here
is a (pseudo-)code snippet which illustrate what I have done. For
simplification I distinguish between my main-routine (definition of the
vtkPolyData, vtkRenderer and so on) and my derived vtkRenderPass-class
vtkMyRenderPass.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New"'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US>///////////////<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>Main-routine:<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>///////////////<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US>// 1. Setup actors with corresponding key
properties<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";
color:#010001'>mySurfaceMapper-&gt;SetInput(myVtkPolyData);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";
color:#010001'>mySurfaceActor-&gt;SetMapper(mySurfaceMapper);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";
color:#010001'>myWireframeSurfaceActor-&gt;SetMapper(mySurfaceMapper);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span lang=EN-US
style='font-size:10.0pt;font-family:"Courier New";color:#010001'>vtkSmartPointer</span><span
lang=EN-US style='font-size:10.0pt;font-family:"Courier New"'>&lt;<span
style='color:#010001'>vtkInformation</span>&gt;<span style='color:#010001'>surfacePropKey</span>
= <span style='color:#010001'>vtkSmartPointer</span>&lt;<span style='color:
#010001'>vtkInformation</span>&gt;::<span style='color:#010001'>New</span>();<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span lang=EN-US
style='font-size:10.0pt;font-family:"Courier New";color:#010001'>surfacePropKey</span><span
lang=EN-US style='font-size:10.0pt;font-family:"Courier New"'> -&gt;<span
style='color:#010001'>Set</span>(<span style='color:#010001'>vtkMyRenderPass</span>::<span
style='color:#010001'>SURFACE</span>(), 0);<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span lang=EN-US
style='font-size:10.0pt;font-family:"Courier New";color:#010001'>surfaceActor</span><span
lang=EN-US style='font-size:10.0pt;font-family:"Courier New"'>-&gt;<span
style='color:#010001'>SetPropertyKeys</span>(<span style='color:#010001'>surfacePropKey</span>);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New"'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span lang=EN-US
style='font-size:10.0pt;font-family:"Courier New";color:#010001'>vtkSmartPointer</span><span
lang=EN-US style='font-size:10.0pt;font-family:"Courier New"'>&lt;<span
style='color:#010001'>vtkInformation</span>&gt;wirfeframe<span
style='color:#010001'>PropKey</span> = <span style='color:#010001'>vtkSmartPointer</span>&lt;<span
style='color:#010001'>vtkInformation</span>&gt;::<span style='color:#010001'>New</span>();<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span lang=EN-US
style='font-size:10.0pt;font-family:"Courier New"'>wirfeframe<span
style='color:#010001'>PropKey</span> -&gt;<span style='color:#010001'>Set</span>(<span
style='color:#010001'>vtkMyRenderPass</span>::WIREFRAME(), 0);<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span lang=EN-US
style='font-size:10.0pt;font-family:"Courier New";color:#010001'>myWireframeSurfaceActor-&gt;SetPropertyKeys</span><span
lang=EN-US style='font-size:10.0pt;font-family:"Courier New"'>(wirfeframe<span
style='color:#010001'>PropKey</span>);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New"'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US>// 2. Create all necessary passes (vtkLightsPass,
vtkOpaquePass, vtkTranslucentPass, and so on), collect them<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>// in a vtkRenderPassCollection, pass it into
a vtkSequencePass and delegate it to a vtkCameraPass.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US>// 3. Create vtkMyRenderPass and set its delegate
pass to the vtkCameraPass.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";
color:#010001'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US>////////////////////</span><span
lang=EN-US style='font-size:10.0pt;font-family:"Courier New";color:#010001'><o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";
color:#010001'>vtkMyRenderPass<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>////////////////////<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US>// 1. Setup pass like other rendering
passes e.g. vtkShadowMappPass (e.g. frame buffers, texture objects, shaders, &#8230;)<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US>// 2. Define the property keys in the
header file &#8230;<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New";
color:#010001'>static vtkInformationIntegerKey *SURFACE();<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New";
color:#010001'>static vtkInformationIntegerKey *WIREFRAME ();<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>// &#8230;and the corresponding macros in
the c++-file<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New";
color:#010001'>vtkInformationKeyMacro</span><span style='font-size:10.0pt;
font-family:"Courier New"'>(</span><span lang=EN-US style='font-size:10.0pt;
font-family:"Courier New";color:#010001'>vtkMyRenderPass</span><span
style='font-size:10.0pt;font-family:"Courier New"'>,<span style='color:#010001'>SURFACE</span>,<span
style='color:#010001'>Integer</span>);<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New";
color:#010001'>vtkInformationKeyMacro</span><span style='font-size:10.0pt;
font-family:"Courier New"'>(</span><span lang=EN-US style='font-size:10.0pt;
font-family:"Courier New";color:#010001'>vtkMyRenderPass</span><span
style='font-size:10.0pt;font-family:"Courier New"'>,</span><span
style='font-size:10.0pt;font-family:"Courier New"'> <span lang=EN-US>WIREFRAME</span></span><span
style='font-size:10.0pt;font-family:"Courier New"'>,<span style='color:#010001'>Integer</span>);<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US>// 3. Create vtkInformation-object which
holds the current required keys<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span lang=EN-US
style='font-size:10.0pt;font-family:"Courier New";color:#010001'>if (this-&gt;requiredKeys
== 0) this-&gt;requiredKeys = vtkSmartPointer&lt;vtkInformation&gt;::New();<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";
color:#010001'>this-&gt;requiredKeys</span><span lang=EN-US style='font-size:
10.0pt;font-family:"Courier New"'>-&gt;<span style='color:#010001'>Set</span>(<span
style='color:#010001'>vtkMyRenderPass</span>::<span style='color:#010001'>SURFACE</span>(),0);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";
color:#010001'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US>// 4. Create vtkRenderState object, set
key-object, framebuffers and so on<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span lang=EN-US
style='font-size:10.0pt;font-family:"Courier New";color:#010001'>vtkRenderState</span><span
lang=EN-US style='font-size:10.0pt;font-family:"Courier New"'> <span
style='color:#010001'>newRenderState</span>(<span style='color:#010001'>renderer</span>);<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span lang=EN-US
style='font-size:10.0pt;font-family:"Courier New";color:#010001'>newRenderState</span><span
lang=EN-US style='font-size:10.0pt;font-family:"Courier New"'>.<span
style='color:#010001'>SetPropArrayAndCount</span>(<span style='color:#010001'>renderState</span>-&gt;<span
style='color:#010001'>GetPropArray</span>(), <span style='color:#010001'>renderState</span>-&gt;<span
style='color:#010001'>GetPropArrayCount</span>());<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";
color:#010001'>newRenderState</span><span lang=EN-US style='font-size:10.0pt;
font-family:"Courier New"'>.<span style='color:#010001'>SetRequiredKeys</span>(<span
style='color:#010001'>requiredKeys</span>);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";
color:#010001'>newRenderState.SetFrameBuffer(this-&gt;FrameBufferObject);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New"'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US>// 5. Render first pass<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";
color:#010001'>this-&gt;DelegatePass-&gt;Render(renderState);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";
color:#010001'>this-&gt;NumberOfRenderedProps += this-&gt;DelegatePass-&gt;GetNumberOfRenderedProps();<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US>// 6. Remove key SURFACE and set key
WIREFRAME <o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span lang=EN-US
style='font-size:10.0pt;font-family:"Courier New";color:#010001'>requiredKeys</span><span
lang=EN-US style='font-size:10.0pt;font-family:"Courier New"'>-&gt;<span
style='color:#010001'>Remove</span>(<span style='color:#010001'>vtkHiddenLineDesignerPass</span>::<span
style='color:#010001'>SURFACE_SEMI</span>());<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";
color:#010001'>requiredKeys</span><span lang=EN-US style='font-size:10.0pt;
font-family:"Courier New"'>-&gt;<span style='color:#010001'>Set</span>(<span
style='color:#010001'>vtkMyRenderPass</span>::WIREFRAME(),0);<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span lang=EN-US
style='font-size:10.0pt;font-family:"Courier New";color:#010001'>newRenderState</span><span
lang=EN-US style='font-size:10.0pt;font-family:"Courier New"'>.<span
style='color:#010001'>SetRequiredKeys</span>(<span style='color:#010001'>requiredKeys</span>);<o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span lang=EN-US
style='font-size:10.0pt;font-family:"Courier New"'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US>// 7. Render second pass<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";
color:#010001'>this-&gt;DelegatePass-&gt;Render(renderState);<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";
color:#010001'>this-&gt;NumberOfRenderedProps += this-&gt;DelegatePass-&gt;GetNumberOfRenderedProps();<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New"'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US>// 8. Remove key WIREFRAME to have a &#8220;clean&#8221;
key-property object for a new call of the render-routine<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";
color:#010001'>requiredKeys</span><span lang=EN-US style='font-size:10.0pt;
font-family:"Courier New"'>-&gt;<span style='color:#010001'>Remove</span>(<span
style='color:#010001'>vtkMyRenderPass</span>:: WIREFRAME());<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New"'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Courier New";
color:#010001'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US>I hope this small example helps somebody by
implementing its on multipass algorithms. The capability of the key property
object is a very flexible and good design decision . Thanks to </span><span
lang=EN-US>François Bertel for designing and implementing this framework!<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US>Best regards, Rocco</span><span lang=EN-US><o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

</div>

</body>

</html>