diff --git a/applications/gui2/src/modules/camera.hpp b/applications/gui2/src/modules/camera.hpp index 12c1a2634fa6010f202f806b5ee268f0d707014c..c22675f7e38b86976264b4d1940602f8952a74cb 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 fcf7a4a57e0d4aac645506c6b4603aad4d6c8888..b70f82da0d767d0006fca1e3230446a355bc853a 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 178ce2f3e09f26ebefc3b71d7bf411cd51554d27..3562577975d3d882b3599e6efbbc693811bb5c8f 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 f7541c5d78f548056fff51bfbd4acbde874b033b..740152cdf15183a2aed2440c53ea52edb1059fa3 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;