Skip to content
/ VTK Public

Commit af0fab4

Browse files
committed
Clean up VR and OpenVR classes
Mostly InteractorStyle, RenderWindow and RenderWindowInteractor for VR and OpenVR.
1 parent 1aac3fe commit af0fab4

17 files changed

+984
-1122
lines changed

Rendering/OpenVR/vtkOpenVRInteractorStyle.cxx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ PURPOSE. See the above copyright notice for more information.
2121
#include "vtkOpenVRRenderWindow.h"
2222
#include "vtkOpenVRRenderWindowInteractor.h"
2323
#include "vtkVRControlsHelper.h"
24-
#include "vtkVRRenderWindowInteractor.h"
2524

2625
vtkStandardNewMacro(vtkOpenVRInteractorStyle);
2726

Rendering/OpenVR/vtkOpenVRInteractorStyle.h

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ PURPOSE. See the above copyright notice for more information.
1414
=========================================================================*/
1515
/**
1616
* @class vtkOpenVRInteractorStyle
17-
* @brief extended from vtkInteractorStyle3D to override command methods
17+
* @brief Implements OpenVR specific functions required by vtkVRInteractorStyle.
1818
*/
1919

2020
#ifndef vtkOpenVRInteractorStyle_h
@@ -32,8 +32,19 @@ class VTKRENDERINGOPENVR_EXPORT vtkOpenVRInteractorStyle : public vtkVRInteracto
3232
static vtkOpenVRInteractorStyle* New();
3333
vtkTypeMacro(vtkOpenVRInteractorStyle, vtkVRInteractorStyle);
3434

35-
virtual void SetupActions(vtkRenderWindowInteractor* iren) override;
36-
virtual void LoadNextCameraPose() override;
35+
/**
36+
* Setup default actions defined with an action path and a corresponding command.
37+
*/
38+
void SetupActions(vtkRenderWindowInteractor* iren) override;
39+
40+
/**
41+
* Load the next camera pose.
42+
*/
43+
void LoadNextCameraPose() override;
44+
45+
/**
46+
* Creates a new ControlsHelper suitable for use with this class.
47+
*/
3748
vtkVRControlsHelper* MakeControlsHelper() override;
3849

3950
protected:

Rendering/OpenVR/vtkOpenVRRenderWindow.cxx

Lines changed: 26 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -45,55 +45,32 @@ under their BSD license found here:
4545
#include "vtkRenderWindowInteractor.h"
4646
#include "vtkRendererCollection.h"
4747
#include "vtkShaderProgram.h"
48+
#include "vtkSmartPointer.h"
4849
#include "vtkTextureObject.h"
4950
#include "vtkTransform.h"
5051

5152
#include <cmath>
5253
#include <sstream>
5354

54-
#include "vtkOpenGLError.h"
55-
5655
vtkStandardNewMacro(vtkOpenVRRenderWindow);
5756

58-
vtkCxxSetObjectMacro(vtkOpenVRRenderWindow, DashboardOverlay, vtkOpenVROverlay);
59-
6057
//------------------------------------------------------------------------------
6158
vtkOpenVRRenderWindow::vtkOpenVRRenderWindow()
62-
: BaseStationVisibility(false)
6359
{
64-
this->OpenVRRenderModels = nullptr;
65-
this->HMD = nullptr;
66-
67-
this->TrackHMD = true;
68-
6960
this->TrackedDeviceToRenderModel.resize(vr::k_unMaxTrackedDeviceCount);
7061
this->TrackedDevicePoses.resize(vr::k_unMaxTrackedDeviceCount);
71-
72-
this->DashboardOverlay = vtkOpenVRDefaultOverlay::New();
73-
}
74-
75-
//------------------------------------------------------------------------------
76-
vtkOpenVRRenderWindow::~vtkOpenVRRenderWindow()
77-
{
78-
if (this->DashboardOverlay)
79-
{
80-
this->DashboardOverlay->Delete();
81-
this->DashboardOverlay = nullptr;
82-
}
62+
this->DashboardOverlay = vtkSmartPointer<vtkOpenVRDefaultOverlay>::New();
8363
}
8464

8565
//------------------------------------------------------------------------------
86-
// Create an interactor that will work with this renderer.
8766
vtkRenderWindowInteractor* vtkOpenVRRenderWindow::MakeRenderWindowInteractor()
8867
{
89-
this->Interactor = vtkOpenVRRenderWindowInteractor::New();
68+
this->Interactor = vtkSmartPointer<vtkOpenVRRenderWindowInteractor>::New();
9069
this->Interactor->SetRenderWindow(this);
9170
return this->Interactor;
9271
}
9372

9473
//------------------------------------------------------------------------------
95-
// Purpose: Helper to get a string from a tracked device property and turn it
96-
// into a std::string
9774
std::string vtkOpenVRRenderWindow::GetTrackedDeviceString(vr::IVRSystem* pHmd,
9875
vr::TrackedDeviceIndex_t unDevice, vr::TrackedDeviceProperty prop,
9976
vr::TrackedPropertyError* peError)
@@ -171,7 +148,8 @@ void vtkOpenVRRenderWindow::RenderModels()
171148
vtkOpenVRModel* pRenderModel = this->FindOrLoadRenderModel(sRenderModelName.c_str());
172149
if (pRenderModel)
173150
{
174-
this->TrackedDeviceToRenderModel[unTrackedDevice] = pRenderModel;
151+
this->TrackedDeviceToRenderModel[unTrackedDevice] =
152+
vtkSmartPointer<vtkVRModel>::Take(pRenderModel);
175153
pRenderModel->TrackedDevice = this->GetDeviceFromDeviceIndex(unTrackedDevice);
176154
}
177155
}
@@ -180,8 +158,6 @@ void vtkOpenVRRenderWindow::RenderModels()
180158
this->TrackedDeviceToRenderModel[unTrackedDevice]->GetVisibility())
181159
{
182160
vtkMatrix4x4* tdPose = this->TrackedDevicePoses[unTrackedDevice];
183-
// const float(*tdPose)[4] = this->TrackedDevicePoses[unTrackedDevice];
184-
// const float[3][4] tdPose = this->TrackedDevicePoses[unTrackedDevice];
185161

186162
// Render model if pose is valid
187163
if (tdPose)
@@ -208,37 +184,8 @@ void vtkOpenVRRenderWindow::UpdateHMDMatrixPose()
208184
// Store poses with generic type
209185
for (uint32_t deviceIdx = 0; deviceIdx < vr::k_unMaxTrackedDeviceCount; ++deviceIdx)
210186
{
211-
// float(*tdPose)[4] = this->TrackedDevicePoses[deviceIdx];
212-
// float(*openVRPose)[4] = OpenVRTrackedDevicePoses[deviceIdx].mDeviceToAbsoluteTracking.m;
213-
214-
// for (vtkIdType i = 0; i < 3; ++i)
215-
// {
216-
// for (vtkIdType j = 0; j < 4; ++j)
217-
// {
218-
// tdPose[i][j] = openVRPose[i][j];
219-
// }
220-
// }
221-
222-
double elems[16] = { 0.0 };
223187
vtkMatrix4x4* tdPose = this->TrackedDevicePoses[deviceIdx];
224-
float(*openVRPose)[4] = OpenVRTrackedDevicePoses[deviceIdx].mDeviceToAbsoluteTracking.m;
225-
226-
for (vtkIdType i = 0; i < 3; ++i)
227-
{
228-
for (vtkIdType j = 0; j < 4; ++j)
229-
{
230-
elems[4 * i + j] = openVRPose[i][j];
231-
}
232-
}
233-
234-
// Add last row
235-
elems[12] = 0.0;
236-
elems[13] = 0.0;
237-
elems[14] = 0.0;
238-
elems[15] = 1.0;
239-
240-
// Fill pose matrix
241-
tdPose->DeepCopy(elems);
188+
this->CreateMatrixFromVrPose(tdPose, OpenVRTrackedDevicePoses[deviceIdx]);
242189
}
243190

244191
// update the camera values based on the pose
@@ -249,12 +196,10 @@ void vtkOpenVRRenderWindow::UpdateHMDMatrixPose()
249196
this->Renderers->InitTraversal(rit);
250197
while ((ren = this->Renderers->GetNextRenderer(rit)))
251198
{
252-
vtkOpenVRCamera* cam = static_cast<vtkOpenVRCamera*>(ren->GetActiveCamera());
199+
vtkOpenVRCamera* cam = vtkOpenVRCamera::SafeDownCast(ren->GetActiveCamera());
253200
this->HMDTransform->Identity();
254201

255202
// get the position and orientation of the HMD
256-
// float[3][4] tdPose = this->TrackedDevicePoses[vr::k_unTrackedDeviceIndex_Hmd];
257-
// const float(*tdPose)[4] = this->TrackedDevicePoses[vr::k_unTrackedDeviceIndex_Hmd];
258203
vtkMatrix4x4* tdPose = this->TrackedDevicePoses[vr::k_unTrackedDeviceIndex_Hmd];
259204

260205
// Note: Scaling is applied through moving the camera closer to the focal point, because
@@ -274,9 +219,6 @@ void vtkOpenVRRenderWindow::UpdateHMDMatrixPose()
274219
vtkMath::Cross(physicalY_NonscaledWorld, physicalZ_NonscaledWorld, physicalX_NonscaledWorld);
275220

276221
// extract HMD axes and position
277-
// double hmdX_Physical[3] = { tdPose[0][0], tdPose[1][0], tdPose[2][0] };
278-
// double hmdY_Physical[3] = { tdPose[0][1], tdPose[1][1], tdPose[2][1] };
279-
// double hmdPosition_Physical[3] = { tdPose[0][3], tdPose[1][3], tdPose[2][3] };
280222
double hmdX_Physical[3] = { tdPose->GetElement(0, 0), tdPose->GetElement(1, 0),
281223
tdPose->GetElement(2, 0) };
282224
double hmdY_Physical[3] = { tdPose->GetElement(0, 1), tdPose->GetElement(1, 1),
@@ -341,24 +283,20 @@ void vtkOpenVRRenderWindow::CreateMatrixFromVrPose(
341283
vtkMatrix4x4* result, const vr::TrackedDevicePose_t& vrPose)
342284
{
343285
const float(*openVRPose)[4] = vrPose.mDeviceToAbsoluteTracking.m;
344-
double elems[16] = { 0.0 };
345286

346287
for (vtkIdType i = 0; i < 3; ++i)
347288
{
348289
for (vtkIdType j = 0; j < 4; ++j)
349290
{
350-
elems[4 * i + j] = openVRPose[i][j];
291+
result->SetElement(i, j, openVRPose[i][j]);
351292
}
352293
}
353294

354295
// Add last row
355-
elems[12] = 0.0;
356-
elems[13] = 0.0;
357-
elems[14] = 0.0;
358-
elems[15] = 1.0;
359-
360-
// Fill pose matrix
361-
result->DeepCopy(elems);
296+
result->SetElement(3, 0, 0.0);
297+
result->SetElement(3, 1, 0.0);
298+
result->SetElement(3, 2, 0.0);
299+
result->SetElement(3, 3, 1.0);
362300
}
363301

364302
//------------------------------------------------------------------------------
@@ -370,45 +308,16 @@ void vtkOpenVRRenderWindow::Render()
370308
}
371309
else
372310
{
373-
// Retrieve Open VR poses
311+
// Retrieve OpenVR poses
374312
vr::TrackedDevicePose_t OpenVRTrackedDevicePoses[vr::k_unMaxTrackedDeviceCount];
375313
vr::VRCompositor()->WaitGetPoses(
376314
OpenVRTrackedDevicePoses, vr::k_unMaxTrackedDeviceCount, nullptr, 0);
377315

378316
// Store poses with generic type
379317
for (uint32_t deviceIdx = 0; deviceIdx < vr::k_unMaxTrackedDeviceCount; ++deviceIdx)
380318
{
381-
// float(*tdPose)[4] = this->TrackedDevicePoses[deviceIdx];
382-
// float(*openVRPose)[4] = OpenVRTrackedDevicePoses[deviceIdx].mDeviceToAbsoluteTracking.m;
383-
384-
// for (vtkIdType i = 0; i < 3; ++i)
385-
// {
386-
// for (vtkIdType j = 0; j < 4; ++j)
387-
// {
388-
// tdPose[i][j] = openVRPose[i][j];
389-
// }
390-
// }
391-
392-
double elems[16] = { 0.0 };
393319
vtkMatrix4x4* tdPose = this->TrackedDevicePoses[deviceIdx];
394-
float(*openVRPose)[4] = OpenVRTrackedDevicePoses[deviceIdx].mDeviceToAbsoluteTracking.m;
395-
396-
for (vtkIdType i = 0; i < 3; ++i)
397-
{
398-
for (vtkIdType j = 0; j < 4; ++j)
399-
{
400-
elems[4 * i + j] = openVRPose[i][j];
401-
}
402-
}
403-
404-
// Add last row
405-
elems[12] = 0.0;
406-
elems[13] = 0.0;
407-
elems[14] = 0.0;
408-
elems[15] = 1.0;
409-
410-
// Fill pose matrix
411-
tdPose->DeepCopy(elems);
320+
this->CreateMatrixFromVrPose(tdPose, OpenVRTrackedDevicePoses[deviceIdx]);
412321
}
413322
}
414323

@@ -442,10 +351,10 @@ void vtkOpenVRRenderWindow::StereoRenderComplete()
442351
this->RenderModels();
443352

444353
// reset the camera to a neutral position
445-
vtkRenderer* ren = static_cast<vtkRenderer*>(this->GetRenderers()->GetItemAsObject(0));
354+
vtkRenderer* ren = vtkRenderer::SafeDownCast(this->GetRenderers()->GetItemAsObject(0));
446355
if (ren && !ren->GetSelector())
447356
{
448-
vtkOpenVRCamera* cam = static_cast<vtkOpenVRCamera*>(ren->GetActiveCamera());
357+
vtkOpenVRCamera* cam = vtkOpenVRCamera::SafeDownCast(ren->GetActiveCamera());
449358
cam->ApplyEyePose(this, false, -1.0);
450359
}
451360

@@ -465,11 +374,8 @@ void vtkOpenVRRenderWindow::StereoRenderComplete()
465374
}
466375

467376
//------------------------------------------------------------------------------
468-
bool vtkOpenVRRenderWindow::CreateFramebuffers()
377+
bool vtkOpenVRRenderWindow::CreateFramebuffers(uint32_t viewCount)
469378
{
470-
// We have two eyes
471-
// TODO be more generic
472-
const uint32_t viewCount = 2;
473379
this->FramebufferDescs.resize(viewCount);
474380
for (uint32_t vc = 0; vc < viewCount; vc++)
475381
{
@@ -551,7 +457,6 @@ std::string vtkOpenVRRenderWindow::GetWindowTitleFromAPI()
551457
}
552458

553459
//------------------------------------------------------------------------------
554-
// Initialize the rendering window.
555460
void vtkOpenVRRenderWindow::Initialize()
556461
{
557462
// Loading the SteamVR Runtime
@@ -626,19 +531,22 @@ vtkEventDataDevice vtkOpenVRRenderWindow::GetDeviceFromDeviceIndex(vr::TrackedDe
626531
{
627532
return vtkEventDataDevice::HeadMountedDisplay;
628533
}
629-
if (index ==
534+
else if (index ==
630535
this->HMD->GetTrackedDeviceIndexForControllerRole(vr::TrackedControllerRole_LeftHand))
631536
{
632537
return vtkEventDataDevice::LeftController;
633538
}
634-
if (index ==
539+
else if (index ==
635540
this->HMD->GetTrackedDeviceIndexForControllerRole(vr::TrackedControllerRole_RightHand))
636541
{
637542
return vtkEventDataDevice::RightController;
638543
}
544+
else if (index == vr::k_unTrackedDeviceIndexInvalid)
545+
{
546+
return vtkEventDataDevice::Unknown;
547+
}
639548
else
640549
{
641-
// TODO: return Unknown if trackedDeviceIndexInvalid
642550
return vtkEventDataDevice::GenericTracker;
643551
}
644552
}
@@ -694,11 +602,13 @@ uint32_t vtkOpenVRRenderWindow::GetTrackedDeviceIndexForDevice(
694602

695603
return devIndex;
696604
}
605+
697606
return this->InvalidDeviceIndex;
698607
}
699608

700609
//------------------------------------------------------------------------------
701-
uint32_t vtkOpenVRRenderWindow::GetNumberOfTrackedDevicesForDevice(vtkEventDataDevice)
610+
uint32_t vtkOpenVRRenderWindow::GetNumberOfTrackedDevicesForDevice(
611+
vtkEventDataDevice vtkNotUsed(dev))
702612
{
703613
vr::TrackedDeviceIndex_t devices[1];
704614
return this->HMD->GetSortedTrackedDeviceIndicesOfClass(

0 commit comments

Comments
 (0)