From 12282b681db0b3d6958cb645b5a89c8e468be174 Mon Sep 17 00:00:00 2001
From: Nicolas Pope <nwpope@utu.fi>
Date: Thu, 1 Aug 2019 15:19:44 +0300
Subject: [PATCH] WIP More attempts at eye poses

---
 applications/gui/src/camera.cpp               | 12 ++++++-
 applications/gui/src/screen.cpp               |  3 +-
 applications/reconstruct/src/splat_render.cpp | 33 ++++++++++++++-----
 3 files changed, 37 insertions(+), 11 deletions(-)

diff --git a/applications/gui/src/camera.cpp b/applications/gui/src/camera.cpp
index 9390df759..0f2d8c1fa 100644
--- a/applications/gui/src/camera.cpp
+++ b/applications/gui/src/camera.cpp
@@ -271,7 +271,17 @@ const GLTexture &ftl::gui::Camera::captureFrame() {
 			{
 				auto pose = ConvertSteamVRMatrixToMatrix4( rTrackedDevicePose_[vr::k_unTrackedDeviceIndex_Hmd].mDeviceToAbsoluteTracking );
 				pose.inverse();
-				if (src_->hasCapabilities(ftl::rgbd::kCapMovable)) src_->setPose(pose);
+
+				// Lerp the Eye
+				eye_[0] += (neye_[0] - eye_[0]) * lerpSpeed_ * delta_;
+				eye_[1] += (neye_[1] - eye_[1]) * lerpSpeed_ * delta_;
+				eye_[2] += (neye_[2] - eye_[2]) * lerpSpeed_ * delta_;
+
+				Eigen::Translation3d trans(eye_);
+				Eigen::Affine3d t(trans);
+				Eigen::Matrix4d viewPose = t.matrix() * pose;
+
+				if (src_->hasCapabilities(ftl::rgbd::kCapMovable)) src_->setPose(viewPose);
 			} else {
 				LOG(ERROR) << "No VR Pose";
 			}
diff --git a/applications/gui/src/screen.cpp b/applications/gui/src/screen.cpp
index 4d53fbb93..6fcd4c124 100644
--- a/applications/gui/src/screen.cpp
+++ b/applications/gui/src/screen.cpp
@@ -37,7 +37,7 @@ namespace {
             uv = vertex;
             vec2 scaledVertex = (vertex * scaleFactor) + position;
             gl_Position  = vec4(2.0*scaledVertex.x - 1.0,
-                                1.0 - 2.0*scaledVertex.y,
+                                2.0*scaledVertex.y - 1.0,
                                 0.0, 1.0);
         })";
 
@@ -365,6 +365,7 @@ void ftl::gui::Screen::draw(NVGcontext *ctx) {
 		if (hasVR() && imageSize[0] > 0 && camera_->getLeft().isValid() && camera_->getRight().isValid()) {
 			vr::Texture_t leftEyeTexture = {(void*)(uintptr_t)leftEye_, vr::TextureType_OpenGL, vr::ColorSpace_Gamma };
 			vr::VRCompositor()->Submit(vr::Eye_Left, &leftEyeTexture );
+			glBindTexture(GL_TEXTURE_2D, rightEye_);
 			vr::Texture_t rightEyeTexture = {(void*)(uintptr_t)rightEye_, vr::TextureType_OpenGL, vr::ColorSpace_Gamma };
 			vr::VRCompositor()->Submit(vr::Eye_Right, &rightEyeTexture );
 		}
diff --git a/applications/reconstruct/src/splat_render.cpp b/applications/reconstruct/src/splat_render.cpp
index 61a8fcb7c..b1c39f649 100644
--- a/applications/reconstruct/src/splat_render.cpp
+++ b/applications/reconstruct/src/splat_render.cpp
@@ -13,6 +13,21 @@ Splatter::~Splatter() {
 
 }
 
+static Eigen::Matrix4f adjustPose(const Eigen::Matrix4f &pose, float baseline) {
+	Eigen::Affine3f transform(Eigen::Translation3f(baseline,0.0f,0.0f));
+	Eigen::Matrix4f matrix = pose;
+	Eigen::Matrix4f rmat = pose;
+	rmat(0,3) = 0.0f;
+	rmat(1,3) = 0.0f;
+	rmat(2,3) = 0.0f;
+	Eigen::Matrix4f tmat = transform.matrix();
+	tmat(0,0) = 0.0f;
+	tmat(1,1) = 0.0f;
+	tmat(2,2) = 0.0f;
+	tmat(3,3) = 0.0f;
+	return (tmat * pose) + pose;
+}
+
 void Splatter::render(ftl::rgbd::Source *src, cudaStream_t stream) {
 	if (!src->isReady()) return;
 
@@ -37,8 +52,14 @@ void Splatter::render(ftl::rgbd::Source *src, cudaStream_t stream) {
 	// Parameters object to pass to CUDA describing the camera
 	SplatParams params;
 	params.m_flags = 0;
-	params.m_viewMatrix = MatrixConversion::toCUDA(src->getPose().cast<float>().inverse());
-	params.m_viewMatrixInverse = MatrixConversion::toCUDA(src->getPose().cast<float>());
+
+	// Adjust pose to left eye position
+	Eigen::Matrix4f matrix =  adjustPose(src->getPose().cast<float>(), -camera.baseline/2.0f);
+	params.m_viewMatrix = MatrixConversion::toCUDA(matrix.inverse());
+	params.m_viewMatrixInverse = MatrixConversion::toCUDA(matrix);
+
+	//params.m_viewMatrix = MatrixConversion::toCUDA(src->getPose().cast<float>().inverse());
+	//params.m_viewMatrixInverse = MatrixConversion::toCUDA(src->getPose().cast<float>());
 	params.voxelSize = scene_->getHashParams().m_virtualVoxelSize;
 	params.camera.flags = 0;
 	params.camera.fx = camera.fx;
@@ -82,13 +103,7 @@ void Splatter::render(ftl::rgbd::Source *src, cudaStream_t stream) {
 			src->writeFrames(colour1_, depth2_, stream);
 		} else if (src->getChannel() == ftl::rgbd::kChanRight) {
 			// Adjust pose to right eye position
-			Eigen::Affine3f transform(Eigen::Translation3f(camera.baseline,0.0f,0.0f));
-			Eigen::Matrix4f tmat = transform.matrix();
-			Eigen::Matrix4f rmat = src->getPose().cast<float>();
-			rmat(3,0) = 0.0f;
-			rmat(3,1) = 0.0f;
-			rmat(3,2) = 0.0f;
-			Eigen::Matrix4f matrix =  (rmat * transform.matrix()) + src->getPose().cast<float>();
+			Eigen::Matrix4f matrix =  adjustPose(src->getPose().cast<float>(), camera.baseline/2.0f);
 			params.m_viewMatrix = MatrixConversion::toCUDA(matrix.inverse());
 			params.m_viewMatrixInverse = MatrixConversion::toCUDA(matrix);
 
-- 
GitLab