diff --git a/bin/npvr.dll b/bin/npvr.dll index a71d1fc..3618fc9 100644 Binary files a/bin/npvr.dll and b/bin/npvr.dll differ diff --git a/examples/OculusRawData.html b/examples/OculusRawData.html new file mode 100644 index 0000000..00d9dbf --- /dev/null +++ b/examples/OculusRawData.html @@ -0,0 +1,57 @@ + + + + NPVR Raw Data + + + + + + + + diff --git a/examples/rift_demo.html b/examples/rift_demo.html index c2b7498..b2403b1 100644 --- a/examples/rift_demo.html +++ b/examples/rift_demo.html @@ -1,4 +1,4 @@ - + @@ -151,8 +151,8 @@ controls = new THREE.OculusRiftControls( camera ); scene.add( controls.getObject() ); - // var cameraHelper = new THREE.CameraHelper(camera); - // scene.add(cameraHelper); + //var cameraHelper = new THREE.CameraHelper(camera); + //scene.add(cameraHelper); ray = new THREE.Raycaster(); ray.ray.direction.set( 0, -1, 0 ); @@ -276,12 +276,20 @@ } // Poll VR, if it's ready. - if (vr.isReady) { - vr.poll(vrstate); - } + if (vr.isReady) { + vr.poll(vrstate); + + camera.position.x = vrstate.oculus.position[0] * 100; + camera.position.y = vrstate.oculus.position[1] * 100 +50; + camera.position.z = vrstate.oculus.position[2] * 100; + + camera.rotation.w = vrstate.oculus.rotation[3] * Math.PI; + camera.rotation.y = vrstate.oculus.rotation[1] * Math.PI; + camera.rotation.z = vrstate.oculus.rotation[2] * Math.PI; + camera.rotation.x = vrstate.oculus.rotation[0] * Math.PI; + } controls.update( Date.now() - time, vr.isReady ? vrstate : null ); - //renderer.render( scene, camera ); effect.render( scene, camera ); time = Date.now(); diff --git a/lib/vr.js b/lib/vr.js index 563e6bb..f93ee77 100644 --- a/lib/vr.js +++ b/lib/vr.js @@ -283,12 +283,17 @@ vr.poll = function(state) { }; function parseOculusChunk(state, data) { - if (data.length == 5) { + if (data.length == 8) { state.oculus.present = true; state.oculus.rotation[0] = parseFloat(data[1]); state.oculus.rotation[1] = parseFloat(data[2]); state.oculus.rotation[2] = parseFloat(data[3]); state.oculus.rotation[3] = parseFloat(data[4]); + + state.oculus.position = new Array(); + state.oculus.position[0] = parseFloat(data[5]); + state.oculus.position[1] = parseFloat(data[6]); + state.oculus.position[2] = parseFloat(data[7]); } else { state.oculus.present = false; } diff --git a/src/npvr/ovr_manager.cpp b/src/npvr/ovr_manager.cpp index d2f5b0a..53aea06 100644 --- a/src/npvr/ovr_manager.cpp +++ b/src/npvr/ovr_manager.cpp @@ -11,43 +11,39 @@ OVRManager *OVRManager::Instance() { } OVRManager::OVRManager() { - OVR::System::Init(); - sensor_fusion_ = new OVR::SensorFusion(); - device_manager_ = OVR::DeviceManager::Create(); - hmd_device_ = device_manager_->EnumerateDevices().CreateDevice(); - if (hmd_device_) { - sensor_fusion_->AttachToSensor(hmd_device_->GetSensor()); - } - device_manager_->SetMessageHandler(this); -} + ovr_Initialize(); + ovrHmd hmd_devive = ovrHmd_Create(0); + hmd_device_ = hmd_devive; -void OVRManager::OnMessage(const OVR::Message &message) { - switch(message.Type) { - case OVR::MessageType::Message_DeviceRemoved: - // TODO: Verify that the removed device is the one we're using. - if (hmd_device_) { - hmd_device_->Release(); - hmd_device_ = NULL; - } - break; - case OVR::MessageType::Message_DeviceAdded: - if (!hmd_device_) { - // TODO: This doesn't work for some reason. - hmd_device_ = device_manager_->EnumerateDevices().CreateDevice(); - if (hmd_device_) { - sensor_fusion_->AttachToSensor(hmd_device_->GetSensor()); - } - } - break; - default: - break; - } + ovrHmd_ConfigureTracking(hmd_devive, ovrTrackingCap_Orientation | + ovrTrackingCap_MagYawCorrection | + ovrTrackingCap_Position, 0); } bool OVRManager::DevicePresent() const { return hmd_device_; } -OVR::Quatf &OVRManager::GetOrientation() const { - return sensor_fusion_->GetOrientation(); +OVR::Quatf* &OVRManager::GetOrientation() const { + + static ovrPosef eyeRenderPose[2]; + + ovrEyeType eye = hmd_device_->EyeRenderOrder[0]; + eyeRenderPose[0] = ovrHmd_GetEyePose(hmd_device_, eye); + + OVR::Quatf* orientation = new OVR::Quatf(eyeRenderPose[0].Orientation.x, eyeRenderPose[0].Orientation.y, eyeRenderPose[0].Orientation.z, eyeRenderPose[0].Orientation.w); + + return orientation; +} + +OVR::Vector3f* &OVRManager::GetPosition() const { + + static ovrPosef eyeRenderPose[2]; + + ovrEyeType eye = hmd_device_->EyeRenderOrder[0]; + eyeRenderPose[0] = ovrHmd_GetEyePose(hmd_device_, eye); + + OVR::Vector3f* position = new OVR::Vector3f(eyeRenderPose[0].Position.x, eyeRenderPose[0].Position.y, eyeRenderPose[0].Position.z); + + return position; } diff --git a/src/npvr/ovr_manager.h b/src/npvr/ovr_manager.h index 6694375..28c843b 100644 --- a/src/npvr/ovr_manager.h +++ b/src/npvr/ovr_manager.h @@ -8,17 +8,15 @@ namespace npvr { -class OVRManager: public OVR::MessageHandler { +class OVRManager { public: static OVRManager *Instance(); bool DevicePresent() const; - OVR::Quatf &GetOrientation() const; - virtual void OnMessage(const OVR::Message &message); + OVR::Quatf* &GetOrientation() const; + OVR::Vector3f* &GetPosition() const; private: OVRManager(); - OVR::DeviceManager *device_manager_; - OVR::HMDDevice *hmd_device_; - OVR::SensorFusion *sensor_fusion_; + ovrHmd hmd_device_; }; } // namespace npvr diff --git a/src/npvr/vr_object.cpp b/src/npvr/vr_object.cpp index 6ee1a51..a39d202 100644 --- a/src/npvr/vr_object.cpp +++ b/src/npvr/vr_object.cpp @@ -165,9 +165,13 @@ void VRObject::PollOculus(std::ostringstream& s) { OVRManager *manager = OVRManager::Instance(); if (manager->DevicePresent()) { s << "r,"; - OVR::Quatf o = manager->GetOrientation(); - s << o.x << "," << o.y << "," << o.z << "," << o.w; - s << "|"; + OVR::Quatf* o = manager->GetOrientation(); + // Extended with the three position parameters! ==> Attention: Needs update from VR.js + OVR::Vector3f* pos = manager->GetPosition(); + s << o->x << "," << o->y << "," << o->z << "," << o->w; + s << "," << pos->x << "," << pos->y << "," << pos->z; + + s << "|"; } } diff --git a/third_party/gyp b/third_party/gyp deleted file mode 160000 index 12d97ef..0000000 --- a/third_party/gyp +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 12d97efcb0d2cbe321ab6f050c2b2311e7048429