From fb7d017ca18acd1f77557420e627c94b7b9274ad Mon Sep 17 00:00:00 2001 From: Jeremy Rotsztain Date: Wed, 10 Aug 2016 14:52:17 -0700 Subject: [PATCH 1/7] adding getter and setter for HMD matrix --- src/ofxOpenVR.cpp | 50 ++++++++++++++++++++++++++++++++++++++++++++++- src/ofxOpenVR.h | 7 +++++++ 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/src/ofxOpenVR.cpp b/src/ofxOpenVR.cpp index bd38f85..a9c9bd9 100644 --- a/src/ofxOpenVR.cpp +++ b/src/ofxOpenVR.cpp @@ -234,6 +234,37 @@ ofMatrix4x4 ofxOpenVR::getCurrentViewMatrix(vr::Hmd_Eye nEye) return matrix; } +//-------------------------------------------------------------- +ofMatrix4x4 ofxOpenVR::getCurrentEyeMatrix(vr::Hmd_Eye nEye) { + + Matrix4 matV; + if (nEye == vr::Eye_Left) + { + matV = _mat4eyePosLeft; + } + else if (nEye == vr::Eye_Right) + { + matV = _mat4eyePosRight; + } + + ofMatrix4x4 matrix(matV.get()); + return matrix; +} + +//-------------------------------------------------------------- + +ofMatrix4x4 ofxOpenVR::getCurrentHMDMatrix() { + + return ofMatrix4x4(_mat4HMDPose.get()); +} + +//-------------------------------------------------------------- + +void ofxOpenVR::setCurrentHMDMatrix(ofMatrix4x4 & mat) { + + _mat4HMDPose.set(mat.getPtr()); +} + //-------------------------------------------------------------- ofMatrix4x4 ofxOpenVR::getControllerPose(vr::ETrackedControllerRole nController) { @@ -315,6 +346,24 @@ void ofxOpenVR::hideGrid(float transitionDuration) } } +//-------------------------------------------------------------- + +void ofxOpenVR::setNearClip(float nearClip) { + + _fNearClip = nearClip; + + setupCameras(); +} + +//-------------------------------------------------------------- + +void ofxOpenVR::setFarClip(float farClip){ + + _fFarClip = farClip; + + setupCameras(); +} + //-------------------------------------------------------------- bool ofxOpenVR::init() { @@ -1112,7 +1161,6 @@ void ofxOpenVR::renderDistortion() { glDisable(GL_DEPTH_TEST); glViewport(0, 0, ofGetWidth(), ofGetHeight()); - glBindVertexArray(_unLensVAO); _lensShader.begin(); diff --git a/src/ofxOpenVR.h b/src/ofxOpenVR.h index f9ca8c3..8005dd1 100644 --- a/src/ofxOpenVR.h +++ b/src/ofxOpenVR.h @@ -64,6 +64,10 @@ class ofxOpenVR { ofMatrix4x4 getCurrentViewProjectionMatrix(vr::Hmd_Eye nEye); ofMatrix4x4 getCurrentProjectionMatrix(vr::Hmd_Eye nEye); ofMatrix4x4 getCurrentViewMatrix(vr::Hmd_Eye nEye); + ofMatrix4x4 getCurrentEyeMatrix(vr::Hmd_Eye nEye); + + ofMatrix4x4 getCurrentHMDMatrix(); + void setCurrentHMDMatrix(ofMatrix4x4 & mat); ofMatrix4x4 getControllerPose(vr::ETrackedControllerRole nController); bool isControllerConnected(vr::ETrackedControllerRole nController); @@ -81,6 +85,9 @@ class ofxOpenVR { void showGrid(float transitionDuration = 2.0f); void hideGrid(float transitionDuration = 2.0f); + void setNearClip(float near); + void setFarClip(float far); + ofEvent ofxOpenVRControllerEvent; private: From 8f3fe32616fc787ed29baba8716020135911ad9e Mon Sep 17 00:00:00 2001 From: Jeremy Rotsztain Date: Wed, 10 Aug 2016 14:58:01 -0700 Subject: [PATCH 2/7] removed eyematrix code --- src/ofxOpenVR.cpp | 17 ----------------- src/ofxOpenVR.h | 1 + 2 files changed, 1 insertion(+), 17 deletions(-) diff --git a/src/ofxOpenVR.cpp b/src/ofxOpenVR.cpp index a9c9bd9..24648d7 100644 --- a/src/ofxOpenVR.cpp +++ b/src/ofxOpenVR.cpp @@ -234,23 +234,6 @@ ofMatrix4x4 ofxOpenVR::getCurrentViewMatrix(vr::Hmd_Eye nEye) return matrix; } -//-------------------------------------------------------------- -ofMatrix4x4 ofxOpenVR::getCurrentEyeMatrix(vr::Hmd_Eye nEye) { - - Matrix4 matV; - if (nEye == vr::Eye_Left) - { - matV = _mat4eyePosLeft; - } - else if (nEye == vr::Eye_Right) - { - matV = _mat4eyePosRight; - } - - ofMatrix4x4 matrix(matV.get()); - return matrix; -} - //-------------------------------------------------------------- ofMatrix4x4 ofxOpenVR::getCurrentHMDMatrix() { diff --git a/src/ofxOpenVR.h b/src/ofxOpenVR.h index 8005dd1..72b1145 100644 --- a/src/ofxOpenVR.h +++ b/src/ofxOpenVR.h @@ -87,6 +87,7 @@ class ofxOpenVR { void setNearClip(float near); void setFarClip(float far); + void setFOV(float fov); ofEvent ofxOpenVRControllerEvent; From e089167268bf84665d6bc9fe59a8dd727eb78821 Mon Sep 17 00:00:00 2001 From: Jeremy Rotsztain Date: Wed, 10 Aug 2016 14:59:29 -0700 Subject: [PATCH 3/7] removed eyematrix code --- src/ofxOpenVR.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/ofxOpenVR.h b/src/ofxOpenVR.h index 72b1145..b019702 100644 --- a/src/ofxOpenVR.h +++ b/src/ofxOpenVR.h @@ -63,8 +63,6 @@ class ofxOpenVR { Matrix4 getHMDMatrixPoseEye(vr::Hmd_Eye nEye); ofMatrix4x4 getCurrentViewProjectionMatrix(vr::Hmd_Eye nEye); ofMatrix4x4 getCurrentProjectionMatrix(vr::Hmd_Eye nEye); - ofMatrix4x4 getCurrentViewMatrix(vr::Hmd_Eye nEye); - ofMatrix4x4 getCurrentEyeMatrix(vr::Hmd_Eye nEye); ofMatrix4x4 getCurrentHMDMatrix(); void setCurrentHMDMatrix(ofMatrix4x4 & mat); From d79e90e9aef63e76e3b6c63b8293a686c01a6fd6 Mon Sep 17 00:00:00 2001 From: Jeremy Rotsztain Date: Wed, 10 Aug 2016 15:00:47 -0700 Subject: [PATCH 4/7] cleanup --- src/ofxOpenVR.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ofxOpenVR.h b/src/ofxOpenVR.h index b019702..ef82df6 100644 --- a/src/ofxOpenVR.h +++ b/src/ofxOpenVR.h @@ -63,6 +63,7 @@ class ofxOpenVR { Matrix4 getHMDMatrixPoseEye(vr::Hmd_Eye nEye); ofMatrix4x4 getCurrentViewProjectionMatrix(vr::Hmd_Eye nEye); ofMatrix4x4 getCurrentProjectionMatrix(vr::Hmd_Eye nEye); + ofMatrix4x4 getCurrentViewMatrix(vr::Hmd_Eye nEye); ofMatrix4x4 getCurrentHMDMatrix(); void setCurrentHMDMatrix(ofMatrix4x4 & mat); From 9d21deedb988f7db2b9e385ee9c3fb0ba6de39e0 Mon Sep 17 00:00:00 2001 From: Jeremy Rotsztain Date: Wed, 10 Aug 2016 15:02:07 -0700 Subject: [PATCH 5/7] cleanup --- src/ofxOpenVR.cpp | 1 + src/ofxOpenVR.h | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ofxOpenVR.cpp b/src/ofxOpenVR.cpp index 24648d7..964230f 100644 --- a/src/ofxOpenVR.cpp +++ b/src/ofxOpenVR.cpp @@ -1144,6 +1144,7 @@ void ofxOpenVR::renderDistortion() { glDisable(GL_DEPTH_TEST); glViewport(0, 0, ofGetWidth(), ofGetHeight()); + glBindVertexArray(_unLensVAO); _lensShader.begin(); diff --git a/src/ofxOpenVR.h b/src/ofxOpenVR.h index ef82df6..f7f3649 100644 --- a/src/ofxOpenVR.h +++ b/src/ofxOpenVR.h @@ -86,8 +86,7 @@ class ofxOpenVR { void setNearClip(float near); void setFarClip(float far); - void setFOV(float fov); - + ofEvent ofxOpenVRControllerEvent; private: From 94cc426d4b6966682d735c7f32ee70ef401a9106 Mon Sep 17 00:00:00 2001 From: Jeremy Rotsztain Date: Tue, 16 Aug 2016 10:03:40 -0700 Subject: [PATCH 6/7] adding camera on a path example --- example-animatedpath/addons.make | 1 + example-animatedpath/bin/data/.gitkeep | 0 example-animatedpath/bin/data/of.png | Bin 0 -> 59713 bytes example-animatedpath/icon.rc | 8 + example-animatedpath/src/main.cpp | 12 ++ example-animatedpath/src/ofApp.cpp | 211 +++++++++++++++++++++++++ example-animatedpath/src/ofApp.h | 40 +++++ 7 files changed, 272 insertions(+) create mode 100644 example-animatedpath/addons.make create mode 100644 example-animatedpath/bin/data/.gitkeep create mode 100644 example-animatedpath/bin/data/of.png create mode 100644 example-animatedpath/icon.rc create mode 100644 example-animatedpath/src/main.cpp create mode 100644 example-animatedpath/src/ofApp.cpp create mode 100644 example-animatedpath/src/ofApp.h diff --git a/example-animatedpath/addons.make b/example-animatedpath/addons.make new file mode 100644 index 0000000..131d951 --- /dev/null +++ b/example-animatedpath/addons.make @@ -0,0 +1 @@ +ofxOpenVR diff --git a/example-animatedpath/bin/data/.gitkeep b/example-animatedpath/bin/data/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/example-animatedpath/bin/data/of.png b/example-animatedpath/bin/data/of.png new file mode 100644 index 0000000000000000000000000000000000000000..9c88d6755f43be11bde8d7b14b996e46335e7279 GIT binary patch literal 59713 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%0D<>lEf89j~$%HLay6Gi%Of-Bwlhh&^U zJ5P*A9>#wO7g{V*dcz?FZ@!4b#DgPqF&06Gip z$`6bS>FL@5+WtJ>vYlHcw0cYEIW1DCQ`@SOy|KHd63%+hk{L*(Z)Ru5eB3uD3B=p@g89Ylw!+4hytCP@14cbDqxkGp$_sW?D zwD}x{EP-45eC)CQ36WCAW-q}a0v~?4!%z!q{hS{ckB3V^g62xGX zFY@Sm5yOAvdF4y~NuT!(AWy&uoqePzw*hr%X-O35BU&z<3za5V@s&H|n zn1-nybP*WbNB<{`>B~QtwrC!K1(%T3!W|@>UT3pW6gvC$4=PJNlBckAfc9>P>w#L_ zt=ebykPJcoV}jxl*qX7ZrLNYttP`C?=R!*;Nz|I%K88Ju*wVWJ+hT=DZmRFbwXkf9 zKDvoE+=;uM0p};K(4vS_X&@<)||5uP=pHG9zPO7II3SqO|T!e`8VcAV$r4DhKsOZKEvb!9CwaynmuYVQ#CiwKw=KTWJ3`B z9`qfrEb;srv&eK$2Q7)-j{T&=Th%q@?&*MyrPt|D49rL>Qh%Q2vnR*!at=CHf6$rU z6SDvbG@jh3o^9x*+jX|BvH3fRo@NY=EmFe`&o{qs|0<-KXl9B~n{dl0N>ccvxDY)G z3$wDm71MKw`Nr?JXZ8y+udLhImdDY$dr*&$yA)TGD1PmYC#rJuu#I+XQ=vUN+hCtN zbgwm|T~@x zZXJCdZ^&K$gMcYIBxW6>sk_x){lbra^Ao!Kr(rih@>>DRs>% zj*<++j^ONQ->-05@jd`Z9cjfzb03i0v-(dX{X+E>D`YV`*(K-+me4ghPzNsDz(W&t zvLw44x`u~E;pNSb{ERZWsBH)8dVkn6Xo?3KKTNm<2TGlGK1^Sxth^4YKQU{nxNaR( z_TYH%-t69>D>Rg^siCm;UR$@|YqcA1z1aVfJdx4^)WX_kiuD(vd5_38-p&-VNZw`m zjP>M3VekqmX__yjH*+;oAlmGc!sy4Q>QGy|R!94DdXa-x5~0%Wi#8}o3=b&hay0~# zA(*)UP3e7#otLNQ`{kyvI*2+hGg`iDcAvfksW$A7BK2_6UD%({_wTFV4YFma-Dh26 zI?zPI@z+XWBa8lCD6|w$YokH2#u$1>sOM2eyIa&f@W*BMS8TlpTP+60PoJdFF`FHu1k;JcD~b%hRD{e(t7zzBcdC-~W&) zoZIuTN7j?kBe?FB4)t_&B;(6}|8XiTU8P>XZSu@q;0ldILTNUdgzXR68cK~-$`7T* z2adz0gARY4WkGl%^dbGt(=G6|?A=mMkpBh)uZOXOOwgo;;s&4Iz3OW`_2`RNv+!AA z=CSnfkLS;yw_bW8EtmvSO>DJ;8Pc_a9ve<{F{_!d0;(0>#Hs}f*JhP<8$3T8m7Fc{ z1UyiW($Brk?ruDJO7OO}J<&pH8Fn%_DWuxyDn#aqdH!asr z8KDHUo(d;SJY(Z*z|zhob>9N_gRmQ~Mibr`s_L`ItLd6MiA|a?Ik~}*n6}@-X3YVj zdq#{eOAW*}VZ7@e)G-JZh(WNt1$Ib{jc-38m?T#e5(qJUoh9j0#UpiSs2>|?9gGqj ztic&EzIXM|DU-B685#3uCKdiFS!N^(~uWtRBF0`PgAZrqMSbtqki^7 zBe7`cAiMJ}OspUFJ^Xv-T}v?3RG@Ko&NX51IfggReYXQK**FBvIoRiC#3;mTp{5Ms z9R|+_e8J2#9~zAofol=B2PHtzuc*e=n!mA3?8cq?TC5uYaVP+5P`{P(#;r%L)9=W; z!PLsh&)+yBCMvjD`B$clZpt4u^xbOBs|-BvLK9sQ`zvPVz+}?(zags1{H@2 role: " << (int)args.controllerRole << " - event type: " << (int)args.eventType << " - button type: " << (int)args.buttonType << " - x: " << args.analogInput_xAxis << " - y: " << args.analogInput_yAxis << endl; +} + +//-------------------------------------------------------------- +void ofApp::keyPressed(int key){ + + _openVR.toggleGrid(); +} + +//-------------------------------------------------------------- +void ofApp::keyReleased(int key){ + +} + +//-------------------------------------------------------------- +void ofApp::mouseMoved(int x, int y ){ + +} + +//-------------------------------------------------------------- +void ofApp::mouseDragged(int x, int y, int button){ + +} + +//-------------------------------------------------------------- +void ofApp::mousePressed(int x, int y, int button){ + +} + +//-------------------------------------------------------------- +void ofApp::mouseReleased(int x, int y, int button){ + +} + +//-------------------------------------------------------------- +void ofApp::mouseEntered(int x, int y){ + +} + +//-------------------------------------------------------------- +void ofApp::mouseExited(int x, int y){ + +} + +//-------------------------------------------------------------- +void ofApp::windowResized(int w, int h){ + +} + +//-------------------------------------------------------------- +void ofApp::gotMessage(ofMessage msg){ + +} + +//-------------------------------------------------------------- +void ofApp::dragEvent(ofDragInfo dragInfo){ + +} + diff --git a/example-animatedpath/src/ofApp.h b/example-animatedpath/src/ofApp.h new file mode 100644 index 0000000..71744d5 --- /dev/null +++ b/example-animatedpath/src/ofApp.h @@ -0,0 +1,40 @@ +#pragma once + +#include "ofMain.h" +#include "ofxOpenVR.h" + +//-------------------------------------------------------------- +class ofApp : public ofBaseApp { + +public: + void setup(); + void exit(); + void update(); + void draw(); + + void keyPressed(int key); + void keyReleased(int key); + void mouseMoved(int x, int y); + void mouseDragged(int x, int y, int button); + void mousePressed(int x, int y, int button); + void mouseReleased(int x, int y, int button); + void mouseEntered(int x, int y); + void mouseExited(int x, int y); + void windowResized(int w, int h); + void dragEvent(ofDragInfo dragInfo); + void gotMessage(ofMessage msg); + + void render(vr::Hmd_Eye nEye); + + void controllerEvent(ofxOpenVRControllerEventArgs& args); + +private: + + ofxOpenVR _openVR; + ofShader _shader; + + ofLight _light; + ofBoxPrimitive _box; + + ofVec3f _cameraPos; +}; From 03de0fa3b7a112780eeb168eee17b5c41f4e6020 Mon Sep 17 00:00:00 2001 From: Jeremy Rotsztain Date: Tue, 16 Aug 2016 10:13:01 -0700 Subject: [PATCH 7/7] adding camera on a path example --- example-animatedpath/src/ofApp.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/example-animatedpath/src/ofApp.cpp b/example-animatedpath/src/ofApp.cpp index be42b8a..d1db4c7 100644 --- a/example-animatedpath/src/ofApp.cpp +++ b/example-animatedpath/src/ofApp.cpp @@ -94,6 +94,9 @@ void ofApp::update(){ //-------------------------------------------------------------- void ofApp::draw(){ + ofEnableLighting(); + ofEnableDepthTest(); + _openVR.render(); _openVR.renderDistortion();