<html 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=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@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;}
p.msonormal0, li.msonormal0, div.msonormal0
{mso-style-name:msonormal;
mso-margin-top-alt:auto;
margin-right:0cm;
mso-margin-bottom-alt:auto;
margin-left:0cm;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
span.hoenzb
{mso-style-name:hoenzb;}
span.EmailStyle19
{mso-style-type:personal;
font-family:"Calibri",sans-serif;
color:windowtext;}
span.EmailStyle21
{mso-style-type:personal-reply;
font-family:"Calibri",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;}
@page WordSection1
{size:612.0pt 792.0pt;
margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
{page:WordSection1;}
--></style>
</head>
<body lang="EN-CA" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US">Ha. Look at that. I had been searching and I somehow missed the general transform (it took me a 2<sup>nd</sup> look to even see beyond “SetInput”, and I can call “Concatenate” to add any number of inputs. I’ll update
my code to test that.<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">This does indeed seem to replace the purpose of my vtkDualInputTransform.<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">However:<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">For problem 2, I still need to make an Actor-to-Transform adapter, unless there is something I don’t see?<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">For problem 3, I’m not bypassing a transform, I’m muting parts of a single transform (eg: the scale, orientation or translation portions). Not sure if this is what you had meant?<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> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Patrick.<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> </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> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span style="font-size:12.0pt;color:black">From: </span></b><span style="font-size:12.0pt;color:black">vtk-developers <vtk-developers-bounces@public.kitware.com> on behalf of Andras Lasso <lasso@queensu.ca><br>
<b>Date: </b>Tuesday, June 5, 2018 at 11:06 AM<br>
<b>To: </b>"vtk-developers@public.kitware.com" <vtk-developers@public.kitware.com><br>
<b>Subject: </b>Re: [vtk-developers] Improvements to the transform pipeline (3 vtkTransform derived classes).<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<p class="MsoNormal"><a name="_MailOriginalBody">Hi Patrick,<o:p></o:p></a></p>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody">I think these problems are already solved, since you can dynamically concatenate any number of transforms in any combinations (including inverting them) using vtkGeneralTransform.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody">Regarding your solution proposed for “problem” 3: Ability to temporarily bypass a transform without changing the pipeline would be a feature that I would find useful. Some warping transforms
already have scale parameter for enabling/disabling (or slightly emphasizing or de-emphasizing) a transformation, which comes very handy for visualizing the effect of the transformation. This feature could be generalized and moved to vtkAbstractTransform class.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody"> <o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody">Andras<o:p></o:p></span></p>
<div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody"> <o:p></o:p></span></p>
</div>
<div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><span style="mso-bookmark:_MailOriginalBody">---------- Forwarded message ----------<br>
From: <b>Patrick Bergeron</b> <</span><a href="mailto:pbergeron@spiria.com"><span style="mso-bookmark:_MailOriginalBody">pbergeron@spiria.com</span><span style="mso-bookmark:_MailOriginalBody"></span></a><span style="mso-bookmark:_MailOriginalBody">><br>
Date: Tue, Jun 5, 2018 at 10:33 AM<br>
Subject: [vtk-developers] Improvements to the transform pipeline (3 vtkTransform derived classes).<br>
To: "</span><a href="mailto:vtk-developers@public.kitware.com"><span style="mso-bookmark:_MailOriginalBody">vtk-developers@public.kitware.com</span><span style="mso-bookmark:_MailOriginalBody"></span></a><span style="mso-bookmark:_MailOriginalBody">" <</span><a href="mailto:vtk-developers@public.kitware.com"><span style="mso-bookmark:_MailOriginalBody">vtk-developers@public.kitware.com</span><span style="mso-bookmark:_MailOriginalBody"></span></a><span style="mso-bookmark:_MailOriginalBody">><br>
<br>
<br>
<o:p></o:p></span></p>
<div>
<div id="m_4896201940082277444divtagdefaultwrapper">
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">Hi everyone.</span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">I've been using VTK for a bit now, and I've made a few improvements I'd like to contribute to the community. </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">Before I do, however, I'd like to know if there is interest in me doing so before I go through the hassles of submission.</span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">GENERAL PROBLEM STATEMENT (MOTIVATION)</span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">---------------------------------------------------------------</span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">I have a list of objects that I'd like to transform using a single widget. Widgets take a single vtkProp3D as target. For (multiple) reasons
beyond the scope of this discussion, I couldn't use vtkAssembly to target my multiple actors. Plus, I wanted each actor to transform according to their local reference frame, not the reference frame of the vtkAssembly. </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">PROBLEM (1/3)</span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">---------------------</span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">vtkTransform can take as input another vtkTransform, to which it concatenates its own SRT values, its output being it the concatenation
of the input transform and itself.</span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">This is useful and allows for multiple scenarios, including this common pattern of parent-child hierarchical chain of transforms,
as is shown in this Robot-Arm example. </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"></span><a href="https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.vtk.org%2FWiki%2FVTK%2FExamples%2FCxx%2FPolyData%2FTransformPipeline&data=02%7C01%7Classo%40queensu.ca%7C6b89e9286a8c496b460808d5caf28d0e%7Cd61ecb3b38b142d582c4efb2838b925c%7C1%7C0%7C636638065458569187&sdata=pXnPwQTqvWrH1L2NOrQR33gpasKrz2H3CEtfwRXSMqg%3D&reserved=0" target="_blank"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt">https://www.vtk.org/Wiki/VTK/Examples/Cxx/PolyData/TransformPipeline</span></span><span style="mso-bookmark:_MailOriginalBody"></span></a><span style="mso-bookmark:_MailOriginalBody"><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">In the example above, 3 transforms are chained together, and </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">xform1 --to--> xform2's input , xform2's output -- to --> xform3's input.</span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">xform1 is set as the user transform of the root actor</span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">xform2 is set as the user transform of the mid actor</span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">xform3 is set as the user transform of the leaf actor</span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">In other words, the *parent's transform* is inherited, and each actor's *local transformation* is controlled by calling the normal
functions, such as TranslateX, RotateY, etc, and when concatenated provides the actor's *global transform*</span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">That's all fine, as long as you want to, or can, control each of the local transform directly. But what if you'd like to also control
the *local transform* via another transformation pipeline? The vtkTransform's input is already taken by the parent transform, were would I plug the local transform's input?</span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">SOLUTION (1/3) -- Introducing vtkDualInputTransform</span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">------------------------------------------------------------------------</span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">As its name implies, vtkDualInput transform adds a second input (Input2) to the standard vtkTransform.</span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">Whereas the vtkTransform's output was : GetMatrix() = [INPUT][MYSELF], </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">Then vtkDualInputTransform's putput is : GetMatrix() = [INPUT][INPUT2] [MYSELF]</span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">(with adaptations wrt Pre-Post multiply flag).</span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">In vtkDualInputTransform, both Input1 and Input2 can be muted, so that they are skipped, just as if there was no input connected.
(It's like closing a gate)</span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">ADVANTAGES</span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">-------------------</span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">With the vtkDualInputTransform, you can create complex chains of transforms that allows for direct control of different parts
of the transform multiple actors from a single source.</span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">In my case, Input1 is the parent transform, Input2 is the local transform, and I leave the internals alone (set to Identity).</span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">The result is thus GetMatrix() = [INPUT][INPUT2][IDENTITY] = [INPUT][INPUT2]</span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">Using this pattern, I have 100 actors driven by different pipelines, yet I can affect all of them at once by changing a common
transformation pipeline that is plugged into the second input. </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">PROBLEM (2/3)</span><o:p></o:p></span></p>
<p><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">---------------------</span><o:p></o:p></span></p>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
</div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">With the vtkDualInputTransform in place, which I could plug into an Actor's UserTransform, I could now effect the global transform using 2 transformation
pipelines (its parent tranform, and its local transform). </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">But, what if I wanted to transform my actors by setting affecting their local transforms using another actor as the driver? </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">(why? because a widget targets a prop/actor, and I want the changes to the targetted actor's transformation to propagate down
to a transformation pipeline to affect other actors)</span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">In other words, I want: </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">widget -> actorA's transform -> input of vtkTransform --> input of vtkTransform --> input of vtkTansform --> input of actorB,
actorC, actorD (etc)'s UserTransform.</span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">While we can do actorA's GetMatrix() (which is the concat of its input and own pos/ori/scale/origin/etc), there is unfortunately,
there is no way to do actor->GetTransform() (since it might get pushed/popped from the stack, it might not always be valid, might disappear etc). So how do I drive a transform pipeline from an actor?</span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p style="margin:0cm;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">SOLUTION (2/3) -- Introducing vtkProp3DTransformAdapter</span><o:p></o:p></span></p>
<p><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">-------------------------------------------------------------------------------</span><o:p></o:p></span></p>
<p><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">This is another derivative of vtkTransform. It has a SetProp3D method, which serves the same purpose as the vtkTransform's input.</span><o:p></o:p></span></p>
<p><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">(in fact, vtkProp3DTransformAdapter's input is not used, and a warning is issued if it is)</span><o:p></o:p></span></p>
<p><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">In vtkProp3DTransformAdapter, in the InternalUpdate method, instead of calling Input->GetMatrix(), we simply call prop3D->GetMatrix(), which ensures is always valid.</span><o:p></o:p></span></p>
<p><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">PROBLEM (3/3)</span><o:p></o:p></span></p>
<p><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">--------------------</span><o:p></o:p></span></p>
<p><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">Finally, there's a catch: I want to affect multiple actors's global transform but control the local transform, but there's a catch when doing [INPUT][INPUT2].</span><o:p></o:p></span></p>
<p><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">Indeed, that concatenation is (roughly) the equivalent of: </span><o:p></o:p></span></p>
<p><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">Result = [IN_scl] x [IN_ori] x [IN_trs] x [IN2_scl] x [IN2_ori] x [IN2_trs].</span><o:p></o:p></span></p>
<p><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">In other words, by the time we multiply IN2, IN's translation is already considered, so scale and rotation of the 2nd input will have their transformation center set
to IN's translation, which a problem.</span><o:p></o:p></span></p>
<p><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">What I want instead is consider the concatenation of the scale, orientation, and transformation :</span><o:p></o:p></span></p>
<p><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">Result = [IN_scl] x [IN2_scl] x [IN_ori] x [IN2_ori] x [IN_trs] x [IN2_trs].</span><o:p></o:p></span></p>
<p><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<p><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">SOLUTION (3/3) -- Introducing vtkMutableTransform</span><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">---------------------------------------------------------------------</span><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">Unfortunately, I did not find a proper name for this one, as "mutable" can imply "changeable". But I meant it to mean that you could "mute" portions
of the transform. </span><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">The goal of this derived class is that you feed it a transform, and out comes the same transform without the muted portions. For example, the transform's
output is the same as the input, with scaling, orientation, or translation stripped out. </span><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">CONCLUSION: </span><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">--------------------</span><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">Using the proper combination of the 3 vtkTransform derivatives described above, and chained together in the proper order, you can make a transformation graph
that is fully automated and controllable from any point or any source in the transform pipeline.</span><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
</div>
<p><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">Let me know if there is interest in me submitting these 3 classes.</span><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:black">Regards</span><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:#888888">Patrick Bergeron</span><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:#888888"> </span><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody"><span style="font-size:12.0pt;color:#888888"> </span><o:p></o:p></span></p>
</div>
</div>
</div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><span style="mso-bookmark:_MailOriginalBody"><br>
_______________________________________________<br>
Powered by </span><a href="https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.kitware.com&data=02%7C01%7Classo%40queensu.ca%7C6b89e9286a8c496b460808d5caf28d0e%7Cd61ecb3b38b142d582c4efb2838b925c%7C1%7C0%7C636638065458579192&sdata=ND4Lji1seVVbOpfZS32rdAoK63YcovmmNnCIJ%2FMGbd4%3D&reserved=0" target="_blank"><span style="mso-bookmark:_MailOriginalBody">www.kitware.com</span><span style="mso-bookmark:_MailOriginalBody"></span></a><span style="mso-bookmark:_MailOriginalBody"><br>
<br>
Visit other Kitware open-source projects at </span><a href="https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.kitware.com%2Fopensource%2Fopensource.html&data=02%7C01%7Classo%40queensu.ca%7C6b89e9286a8c496b460808d5caf28d0e%7Cd61ecb3b38b142d582c4efb2838b925c%7C1%7C0%7C636638065458579192&sdata=goL7rexn7zpTaCgEvjUs4RuPtrjT39C28xawZEVrJTQ%3D&reserved=0" target="_blank"><span style="mso-bookmark:_MailOriginalBody">http://www.kitware.com/opensource/opensource.html</span><span style="mso-bookmark:_MailOriginalBody"></span></a><span style="mso-bookmark:_MailOriginalBody"><br>
<br>
Search the list archives at: </span><a href="https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fmarkmail.org%2Fsearch%2F%3Fq%3Dvtk-developers&data=02%7C01%7Classo%40queensu.ca%7C6b89e9286a8c496b460808d5caf28d0e%7Cd61ecb3b38b142d582c4efb2838b925c%7C1%7C0%7C636638065458589201&sdata=ODTmVvghR4cbVnFAdVMkkh%2Fse%2FQDxh2CBx9ZTGPLVDk%3D&reserved=0" target="_blank"><span style="mso-bookmark:_MailOriginalBody">http://markmail.org/search/?q=vtk-developers</span><span style="mso-bookmark:_MailOriginalBody"></span></a><span style="mso-bookmark:_MailOriginalBody"><br>
<br>
Follow this link to subscribe/unsubscribe:<br>
</span><a href="https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fpublic.kitware.com%2Fmailman%2Flistinfo%2Fvtk-developers&data=02%7C01%7Classo%40queensu.ca%7C6b89e9286a8c496b460808d5caf28d0e%7Cd61ecb3b38b142d582c4efb2838b925c%7C1%7C0%7C636638065458589201&sdata=SlXsK2dV%2BOAciW9a%2BT0kykN2CI9zhRcqcTJw%2BcgE81c%3D&reserved=0" target="_blank"><span style="mso-bookmark:_MailOriginalBody">https://public.kitware.com/mailman/listinfo/vtk-developers</span><span style="mso-bookmark:_MailOriginalBody"></span></a><span style="mso-bookmark:_MailOriginalBody"><br>
<br>
<br>
<o:p></o:p></span></p>
</div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody"><br>
<br clear="all">
<br>
-- <o:p></o:p></span></p>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody">+1 919 869 8849<o:p></o:p></span></p>
</div>
</div>
</div>
</div>
</body>
</html>