@@ -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-
5655vtkStandardNewMacro (vtkOpenVRRenderWindow);
5756
58- vtkCxxSetObjectMacro (vtkOpenVRRenderWindow, DashboardOverlay, vtkOpenVROverlay);
59-
6057// ------------------------------------------------------------------------------
6158vtkOpenVRRenderWindow::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.
8766vtkRenderWindowInteractor* 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
9774std::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.
555460void 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