Skip to content

Commit 59b7d1b

Browse files
committed
Adding interface and logic to maintain MRML transforms for each generic VR tracker
Requires VTK version that exposes generic tracker API
1 parent b91508c commit 59b7d1b

File tree

7 files changed

+295
-77
lines changed

7 files changed

+295
-77
lines changed

VirtualReality/MRML/vtkMRMLVirtualRealityViewNode.cxx

Lines changed: 136 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ const char* vtkMRMLVirtualRealityViewNode::ReferenceViewNodeReferenceRole = "Ref
2727
const char* vtkMRMLVirtualRealityViewNode::LeftControllerTransformRole = "LeftController";
2828
const char* vtkMRMLVirtualRealityViewNode::RightControllerTransformRole = "RightController";
2929
const char* vtkMRMLVirtualRealityViewNode::HMDTransformRole = "HMD";
30+
const char* vtkMRMLVirtualRealityViewNode::TrackerTransformRole = "GenericTracker";
3031

3132
//----------------------------------------------------------------------------
3233
vtkMRMLNodeNewMacro(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
//----------------------------------------------------------------------------
134135
void 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
//----------------------------------------------------------------------------
153154
void 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*
196199
bool 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
//----------------------------------------------------------------------------
335417
void 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
//----------------------------------------------------------------------------
450560
bool vtkMRMLVirtualRealityViewNode::HasError()
451561
{

0 commit comments

Comments
 (0)