From 428010ac241ffcbe0b96c71949eccc42adeff76d Mon Sep 17 00:00:00 2001
From: Nicolas Pope <nwpope@utu.fi>
Date: Mon, 3 Aug 2020 15:14:44 +0300
Subject: [PATCH] VR flip shader

---
 applications/gui2/src/modules/camera.hpp    | 1 +
 applications/gui2/src/views/camera.cpp      | 2 ++
 applications/gui2/src/widgets/imageview.cpp | 4 +++-
 applications/gui2/src/widgets/imageview.hpp | 3 +++
 4 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/applications/gui2/src/modules/camera.hpp b/applications/gui2/src/modules/camera.hpp
index 12c1a2634..c22675f7e 100644
--- a/applications/gui2/src/modules/camera.hpp
+++ b/applications/gui2/src/modules/camera.hpp
@@ -49,6 +49,7 @@ public:
 	inline bool isLive() const { return live_; }
 	inline bool isTouchable() const { return touch_; }
 	inline bool isMovable() const { return movable_; }
+	inline bool isVR() const { return vr_; }
 
 	ftl::render::Colouriser* colouriser() { return colouriser_.get(); };
 	ftl::overlay::Overlay* overlay() { return overlay_.get(); }
diff --git a/applications/gui2/src/views/camera.cpp b/applications/gui2/src/views/camera.cpp
index fcf7a4a57..b70f82da0 100644
--- a/applications/gui2/src/views/camera.cpp
+++ b/applications/gui2/src/views/camera.cpp
@@ -377,6 +377,8 @@ CameraView::CameraView(ftl::gui2::Screen* parent, ftl::gui2::Camera* ctrl) :
 	imview_ = new ftl::gui2::FTLImageView(this);
 	panel_ = new ftl::gui2::MediaPanel(screen(), ctrl, this);
 
+	imview_->setFlipped(ctrl->isVR());
+
 	auto *mod = ctrl_->screen->getModule<ftl::gui2::Statistics>();
 	if (ctrl_->isMovable()) {
 		imview_->setCursor(nanogui::Cursor::Hand);
diff --git a/applications/gui2/src/widgets/imageview.cpp b/applications/gui2/src/widgets/imageview.cpp
index 178ce2f3e..356257797 100644
--- a/applications/gui2/src/widgets/imageview.cpp
+++ b/applications/gui2/src/widgets/imageview.cpp
@@ -49,13 +49,14 @@ namespace {
 		R"(#version 330
 		uniform vec2 scaleFactor;
 		uniform vec2 position;
+		uniform float flip_y;
 		in vec2 vertex;
 		out vec2 uv;
 		void main() {
 			uv = vertex;
 			vec2 scaledVertex = (vertex * scaleFactor) + position;
 			gl_Position  = vec4(2.0*scaledVertex.x - 1.0,
-								1.0 - 2.0*scaledVertex.y,
+								flip_y*(1.0 - 2.0*scaledVertex.y),
 								0.0, 1.0);
 
 		})";
@@ -322,6 +323,7 @@ void ftl::gui2::ImageView::draw(NVGcontext* ctx) {
 		glActiveTexture(GL_TEXTURE0);
 		glBindTexture(GL_TEXTURE_2D, mImageID);
 		mShader.setUniform("image", 0);
+		mShader.setUniform("flip_y", (flipped_) ? -1.0f : 1.0f);
 		mShader.setUniform("scaleFactor", scaleFactor);
 		mShader.setUniform("position", imagePosition);
 		mShader.drawIndexed(GL_TRIANGLES, 0, 2);
diff --git a/applications/gui2/src/widgets/imageview.hpp b/applications/gui2/src/widgets/imageview.hpp
index f7541c5d7..740152cdf 100644
--- a/applications/gui2/src/widgets/imageview.hpp
+++ b/applications/gui2/src/widgets/imageview.hpp
@@ -55,6 +55,8 @@ public:
 	float scale() const { return mScale; }
 	void setScale(float scale) { mScale = scale > 0.01f ? scale : 0.01f; }
 
+	inline void setFlipped(bool flipped) { flipped_ = flipped; }
+
 	bool fixedOffset() const { return mFixedOffset; }
 	void setFixedOffset(bool fixedOffset) { mFixedOffset = fixedOffset; }
 	bool fixedScale() const { return mFixedScale; }
@@ -166,6 +168,7 @@ protected:
 	nanogui::Vector2f mOffset;
 	bool mFixedScale;
 	bool mFixedOffset;
+	bool flipped_ = false;
 
 	// Fine-tuning parameters.
 	float mZoomSensitivity = 1.1f;
-- 
GitLab