@@ -27,6 +27,7 @@ const char* vtkMRMLVirtualRealityViewNode::ReferenceViewNodeReferenceRole = "Ref
2727const char * vtkMRMLVirtualRealityViewNode::LeftControllerTransformRole = " LeftController" ;
2828const char * vtkMRMLVirtualRealityViewNode::RightControllerTransformRole = " RightController" ;
2929const char * vtkMRMLVirtualRealityViewNode::HMDTransformRole = " HMD" ;
30+ const char * vtkMRMLVirtualRealityViewNode::TrackerTransformRole = " GenericTracker" ;
3031
3132// ----------------------------------------------------------------------------
3233vtkMRMLNodeNewMacro (vtkMRMLVirtualRealityViewNode);
@@ -41,7 +42,7 @@ vtkMRMLVirtualRealityViewNode::vtkMRMLVirtualRealityViewNode()
4142 , MotionSensitivity(0.5 )
4243 , ControllerTransformsUpdate(false )
4344 , ControllerModelsVisible(true )
44- , TrackerReferenceModelsVisible (true )
45+ , LighthouseModelsVisible (true )
4546{
4647 this ->Visibility = 0 ; // hidden by default to not connect to the headset until it is needed
4748 this ->BackgroundColor [0 ] = this ->defaultBackgroundColor ()[0 ];
@@ -73,12 +74,12 @@ void vtkMRMLVirtualRealityViewNode::WriteXML(ostream& of, int nIndent)
7374 vtkMRMLWriteXMLBooleanMacro (backLights, BackLights);
7475 vtkMRMLWriteXMLFloatMacro (desiredUpdateRate, DesiredUpdateRate);
7576 vtkMRMLWriteXMLFloatMacro (magnification, Magnification);
76- vtkMRMLWriteXMLFloatMacro (motionSpeed,MotionSpeed);
77+ vtkMRMLWriteXMLFloatMacro (motionSpeed, MotionSpeed);
7778 vtkMRMLWriteXMLFloatMacro (motionSensitivity, MotionSensitivity);
7879 vtkMRMLWriteXMLBooleanMacro (controllerTransformsUpdate, ControllerTransformsUpdate);
7980 vtkMRMLWriteXMLBooleanMacro (hmdTransformUpdate, HMDTransformUpdate);
8081 vtkMRMLWriteXMLBooleanMacro (controllerModelsVisible, ControllerModelsVisible);
81- vtkMRMLWriteXMLBooleanMacro (trackerReferenceModelsVisible, TrackerReferenceModelsVisible );
82+ vtkMRMLWriteXMLBooleanMacro (lighthouseModelsVisible, LighthouseModelsVisible );
8283 vtkMRMLWriteXMLEndMacro ();
8384}
8485
@@ -99,7 +100,7 @@ void vtkMRMLVirtualRealityViewNode::ReadXMLAttributes(const char** atts)
99100 vtkMRMLReadXMLBooleanMacro (controllerTransformsUpdate, ControllerTransformsUpdate);
100101 vtkMRMLReadXMLBooleanMacro (hmdTransformUpdate, HMDTransformUpdate);
101102 vtkMRMLReadXMLBooleanMacro (controllerModelsVisible, ControllerModelsVisible);
102- vtkMRMLReadXMLBooleanMacro (trackerReferenceModelsVisible, TrackerReferenceModelsVisible );
103+ vtkMRMLReadXMLBooleanMacro (lighthouseModelsVisible, LighthouseModelsVisible );
103104 vtkMRMLReadXMLEndMacro ();
104105
105106 this ->EndModify (disabledModify);
@@ -108,7 +109,7 @@ void vtkMRMLVirtualRealityViewNode::ReadXMLAttributes(const char** atts)
108109// ----------------------------------------------------------------------------
109110// Copy the node's attributes to this object.
110111// Does NOT copy: ID, FilePrefix, Name, ID
111- void vtkMRMLVirtualRealityViewNode::Copy (vtkMRMLNode * anode)
112+ void vtkMRMLVirtualRealityViewNode::Copy (vtkMRMLNode* anode)
112113{
113114 int disabledModify = this ->StartModify ();
114115
@@ -124,7 +125,7 @@ void vtkMRMLVirtualRealityViewNode::Copy(vtkMRMLNode *anode)
124125 vtkMRMLCopyBooleanMacro (ControllerTransformsUpdate);
125126 vtkMRMLCopyBooleanMacro (HMDTransformUpdate);
126127 vtkMRMLCopyBooleanMacro (ControllerModelsVisible);
127- vtkMRMLCopyBooleanMacro (TrackerReferenceModelsVisible );
128+ vtkMRMLCopyBooleanMacro (LighthouseModelsVisible );
128129 vtkMRMLCopyEndMacro ();
129130
130131 this ->EndModify (disabledModify);
@@ -133,7 +134,7 @@ void vtkMRMLVirtualRealityViewNode::Copy(vtkMRMLNode *anode)
133134// ----------------------------------------------------------------------------
134135void vtkMRMLVirtualRealityViewNode::PrintSelf (ostream& os, vtkIndent indent)
135136{
136- this ->Superclass ::PrintSelf (os,indent);
137+ this ->Superclass ::PrintSelf (os, indent);
137138
138139 vtkMRMLPrintBeginMacro (os, indent);
139140 vtkMRMLPrintBooleanMacro (TwoSidedLighting);
@@ -145,18 +146,18 @@ void vtkMRMLVirtualRealityViewNode::PrintSelf(ostream& os, vtkIndent indent)
145146 vtkMRMLPrintBooleanMacro (ControllerTransformsUpdate);
146147 vtkMRMLPrintBooleanMacro (HMDTransformUpdate);
147148 vtkMRMLPrintBooleanMacro (ControllerModelsVisible);
148- vtkMRMLPrintBooleanMacro (TrackerReferenceModelsVisible );
149+ vtkMRMLPrintBooleanMacro (LighthouseModelsVisible );
149150 vtkMRMLPrintEndMacro ();
150151}
151152
152153// ----------------------------------------------------------------------------
153154void vtkMRMLVirtualRealityViewNode::SetSceneReferences ()
154155{
155156 if (!this ->Scene )
156- {
157- vtkErrorMacro (<< " SetSceneReferences: Scene is expected to be non NULL." );
157+ {
158+ vtkErrorMacro ( << " SetSceneReferences: Scene is expected to be non NULL." );
158159 return ;
159- }
160+ }
160161
161162 this ->SetAndObserveParentLayoutNode (this );
162163}
@@ -167,7 +168,8 @@ double* vtkMRMLVirtualRealityViewNode::defaultBackgroundColor()
167168 // static double backgroundColor[3] = {0.70196, 0.70196, 0.90588};
168169 static double backgroundColor[3 ] = {0.7568627450980392 ,
169170 0.7647058823529412 ,
170- 0.9098039215686275 };
171+ 0.9098039215686275
172+ };
171173 return backgroundColor;
172174}
173175
@@ -176,7 +178,8 @@ double* vtkMRMLVirtualRealityViewNode::defaultBackgroundColor2()
176178{
177179 static double backgroundColor2[3 ] = {0.4549019607843137 ,
178180 0.4705882352941176 ,
179- 0.7450980392156863 };
181+ 0.7450980392156863
182+ };
180183 return backgroundColor2;
181184}
182185
@@ -196,17 +199,17 @@ void vtkMRMLVirtualRealityViewNode::SetAndObserveReferenceViewNodeID(const char*
196199bool vtkMRMLVirtualRealityViewNode::SetAndObserveReferenceViewNode (vtkMRMLViewNode* node)
197200{
198201 if (node == NULL )
199- {
202+ {
200203 this ->SetAndObserveReferenceViewNodeID (NULL );
201204 return true ;
202- }
205+ }
203206 if (this ->Scene != node->GetScene () || node->GetID () == NULL )
204- {
207+ {
205208 vtkErrorMacro (" SetAndObserveReferenceViewNode: The referenced and referencing node are not in the same scene" );
206209 return false ;
207- }
208- this ->SetAndObserveReferenceViewNodeID (node->GetID ());
209- return true ;
210+ }
211+ this ->SetAndObserveReferenceViewNodeID (node->GetID ());
212+ return true ;
210213}
211214
212215// ----------------------------------------------------------------------------
@@ -216,7 +219,7 @@ vtkMRMLLinearTransformNode* vtkMRMLVirtualRealityViewNode::GetControllerTransfor
216219 {
217220 return this ->GetLeftControllerTransformNode ();
218221 }
219- else if (device == vtkEventDataDevice::RightController)
222+ else if (device == vtkEventDataDevice::RightController)
220223 {
221224 return this ->GetRightControllerTransformNode ();
222225 }
@@ -239,7 +242,7 @@ const char* vtkMRMLVirtualRealityViewNode::GetLeftControllerTransformNodeID()
239242}
240243
241244// ----------------------------------------------------------------------------
242- void vtkMRMLVirtualRealityViewNode::SetAndObserveLeftControllerTransformNodeID (const char * nodeId)
245+ void vtkMRMLVirtualRealityViewNode::SetAndObserveLeftControllerTransformNodeID (const char * nodeId)
243246{
244247 this ->SetAndObserveNodeReferenceID (vtkMRMLVirtualRealityViewNode::LeftControllerTransformRole, nodeId);
245248}
@@ -274,7 +277,7 @@ const char* vtkMRMLVirtualRealityViewNode::GetRightControllerTransformNodeID()
274277}
275278
276279// ----------------------------------------------------------------------------
277- void vtkMRMLVirtualRealityViewNode::SetAndObserveRightControllerTransformNodeID (const char * nodeId)
280+ void vtkMRMLVirtualRealityViewNode::SetAndObserveRightControllerTransformNodeID (const char * nodeId)
278281{
279282 this ->SetAndObserveNodeReferenceID (vtkMRMLVirtualRealityViewNode::RightControllerTransformRole, nodeId);
280283}
@@ -309,7 +312,7 @@ const char* vtkMRMLVirtualRealityViewNode::GetHMDTransformNodeID()
309312}
310313
311314// ----------------------------------------------------------------------------
312- void vtkMRMLVirtualRealityViewNode::SetAndObserveHMDTransformNodeID (const char * nodeId)
315+ void vtkMRMLVirtualRealityViewNode::SetAndObserveHMDTransformNodeID (const char * nodeId)
313316{
314317 this ->SetAndObserveNodeReferenceID (vtkMRMLVirtualRealityViewNode::HMDTransformRole, nodeId);
315318}
@@ -331,6 +334,85 @@ bool vtkMRMLVirtualRealityViewNode::SetAndObserveHMDTransformNode(vtkMRMLLinearT
331334 return true ;
332335}
333336
337+ // ----------------------------------------------------------------------------
338+ vtkMRMLTransformNode* vtkMRMLVirtualRealityViewNode::GetTrackerTransformNode (const char * openVrDeviceId)
339+ {
340+ if (openVrDeviceId == nullptr )
341+ {
342+ return nullptr ;
343+ }
344+ std::stringstream ss;
345+ ss << openVrDeviceId << " ." << this ->TrackerTransformRole ;
346+ return vtkMRMLLinearTransformNode::SafeDownCast (
347+ this ->GetNthNodeReference (ss.str ().c_str (), 0 ));
348+ }
349+
350+ // ----------------------------------------------------------------------------
351+ const char * vtkMRMLVirtualRealityViewNode::GetTrackerTransformNodeID (const char * openVrDeviceId)
352+ {
353+ if (openVrDeviceId == nullptr )
354+ {
355+ return nullptr ;
356+ }
357+ std::stringstream ss;
358+ ss << openVrDeviceId << " ." << this ->TrackerTransformRole ;
359+ return this ->GetNthNodeReferenceID (ss.str ().c_str (), 0 );
360+ }
361+
362+ // ----------------------------------------------------------------------------
363+ vtkMRMLTransformNode* vtkMRMLVirtualRealityViewNode::SetAndObserveTrackerTransformNodeID (const char * nodeId, const char * openVrDeviceId)
364+ {
365+ if (openVrDeviceId == nullptr )
366+ {
367+ return nullptr ;
368+ }
369+ std::stringstream ss;
370+ ss << openVrDeviceId << " ." << this ->TrackerTransformRole ;
371+ return vtkMRMLTransformNode::SafeDownCast (this ->SetAndObserveNthNodeReferenceID (ss.str ().c_str (), 0 , nodeId));
372+ }
373+
374+ // ----------------------------------------------------------------------------
375+ vtkMRMLTransformNode* vtkMRMLVirtualRealityViewNode::SetAndObserveTrackerTransformNode (vtkMRMLTransformNode* node, const char * openVrDeviceId)
376+ {
377+ if (openVrDeviceId == nullptr )
378+ {
379+ return nullptr ;
380+ }
381+ std::stringstream ss;
382+ ss << openVrDeviceId << " ." << this ->TrackerTransformRole ;
383+ if (node == nullptr )
384+ {
385+ return vtkMRMLTransformNode::SafeDownCast (this ->SetAndObserveNthNodeReferenceID (ss.str ().c_str (), 0 , nullptr ));
386+ }
387+ return vtkMRMLTransformNode::SafeDownCast (this ->SetAndObserveNthNodeReferenceID (ss.str ().c_str (), 0 , node->GetID ()));
388+ }
389+
390+ // ----------------------------------------------------------------------------
391+ void vtkMRMLVirtualRealityViewNode::RemoveTrackerTransformNode (const char * openVrDeviceId)
392+ {
393+ if (openVrDeviceId == nullptr )
394+ {
395+ return ;
396+ }
397+ std::stringstream ss;
398+ ss << openVrDeviceId << " ." << this ->TrackerTransformRole ;
399+ this ->RemoveNthNodeReferenceID (ss.str ().c_str (), 0 );
400+ }
401+
402+ // ----------------------------------------------------------------------------
403+ void vtkMRMLVirtualRealityViewNode::RemoveAllTrackerTransformNodes ()
404+ {
405+ std::vector<std::string> roles;
406+ this ->GetNodeReferenceRoles (roles);
407+ for (std::vector<std::string>::iterator it = roles.begin (); it != roles.end (); ++it)
408+ {
409+ if (it->find (this ->TrackerTransformRole ) != std::string::npos)
410+ {
411+ this ->RemoveNodeReferenceIDs (it->c_str ());
412+ }
413+ }
414+ }
415+
334416// ----------------------------------------------------------------------------
335417void vtkMRMLVirtualRealityViewNode::CreateDefaultControllerTransformNodes ()
336418{
@@ -346,7 +428,7 @@ void vtkMRMLVirtualRealityViewNode::CreateDefaultControllerTransformNodes()
346428 if (linearTransformNode == NULL )
347429 {
348430 linearTransformNode = vtkSmartPointer<vtkMRMLLinearTransformNode>::Take (
349- vtkMRMLLinearTransformNode::SafeDownCast (this ->GetScene ()->CreateNodeByClass (" vtkMRMLLinearTransformNode" )));
431+ vtkMRMLLinearTransformNode::SafeDownCast (this ->GetScene ()->CreateNodeByClass (" vtkMRMLLinearTransformNode" )));
350432 linearTransformNode->SetSingletonTag (" VirtualReality.LeftController" );
351433 linearTransformNode->SetName (" VirtualReality.LeftController" );
352434 this ->GetScene ()->AddNode (linearTransformNode);
@@ -360,7 +442,7 @@ void vtkMRMLVirtualRealityViewNode::CreateDefaultControllerTransformNodes()
360442 if (linearTransformNode == NULL )
361443 {
362444 linearTransformNode = vtkSmartPointer<vtkMRMLLinearTransformNode>::Take (
363- vtkMRMLLinearTransformNode::SafeDownCast (this ->GetScene ()->CreateNodeByClass (" vtkMRMLLinearTransformNode" )));
445+ vtkMRMLLinearTransformNode::SafeDownCast (this ->GetScene ()->CreateNodeByClass (" vtkMRMLLinearTransformNode" )));
364446 linearTransformNode->SetSingletonTag (" VirtualReality.RightController" );
365447 linearTransformNode->SetName (" VirtualReality.RightController" );
366448 this ->GetScene ()->AddNode (linearTransformNode);
@@ -384,7 +466,7 @@ void vtkMRMLVirtualRealityViewNode::CreateDefaultHMDTransformNode()
384466 if (linearTransformNode == NULL )
385467 {
386468 linearTransformNode = vtkSmartPointer<vtkMRMLLinearTransformNode>::Take (
387- vtkMRMLLinearTransformNode::SafeDownCast (this ->GetScene ()->CreateNodeByClass (" vtkMRMLLinearTransformNode" )));
469+ vtkMRMLLinearTransformNode::SafeDownCast (this ->GetScene ()->CreateNodeByClass (" vtkMRMLLinearTransformNode" )));
388470 linearTransformNode->SetSingletonTag (" VirtualReality.HMD" );
389471 linearTransformNode->SetName (" VirtualReality.HMD" );
390472 this ->GetScene ()->AddNode (linearTransformNode);
@@ -446,6 +528,34 @@ void vtkMRMLVirtualRealityViewNode::SetHMDTransformUpdate(bool enable)
446528 this ->Modified ();
447529}
448530
531+ // ----------------------------------------------------------------------------
532+ void vtkMRMLVirtualRealityViewNode::SetTrackerTransformUpdate (bool enable)
533+ {
534+ if (enable == this ->TrackerTransformUpdate )
535+ {
536+ // no change
537+ return ;
538+ }
539+
540+ this ->TrackerTransformUpdate = enable;
541+
542+ if (!enable)
543+ {
544+ for (NodeReferencesType::iterator roleIt = this ->NodeReferences .begin (); roleIt != this ->NodeReferences .end (); roleIt++)
545+ {
546+ if (roleIt->first .find (this ->TrackerTransformRole ) != std::string::npos)
547+ {
548+ vtkMRMLNode* node = this ->GetNodeReference (roleIt->first .c_str ());
549+ if (node)
550+ {
551+ node->SetAttribute (" VirtualReality.TrackerActive" , " 0" );
552+ }
553+ }
554+ }
555+ }
556+ this ->Modified ();
557+ }
558+
449559// ----------------------------------------------------------------------------
450560bool vtkMRMLVirtualRealityViewNode::HasError ()
451561{
0 commit comments