From 8b7267cf879d80515f1f63a90fcd4f7f4bdbec09 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Thu, 8 Sep 2016 19:02:13 +0200 Subject: [PATCH] MaskAnaglyph present mode --- src/gl/renderer/gl_postprocess.cpp | 50 +++++++++++++++++------------- src/gl/renderer/gl_renderer.h | 1 + src/gl/stereo3d/gl_anaglyph.cpp | 21 +++++++++++++ src/gl/stereo3d/gl_anaglyph.h | 21 +++---------- 4 files changed, 56 insertions(+), 37 deletions(-) diff --git a/src/gl/renderer/gl_postprocess.cpp b/src/gl/renderer/gl_postprocess.cpp index 4bacf54d4..00083480c 100644 --- a/src/gl/renderer/gl_postprocess.cpp +++ b/src/gl/renderer/gl_postprocess.cpp @@ -397,6 +397,8 @@ void FGLRenderer::Flush() { FGLDebug::PushGroup("Eye2D"); mBuffers->BindEyeFB(eye_ix); + glViewport(mScreenViewport.left, mScreenViewport.top, mScreenViewport.width, mScreenViewport.height); + glScissor(mScreenViewport.left, mScreenViewport.top, mScreenViewport.width, mScreenViewport.height); m2DDrawer->Draw(); FGLDebug::PopGroup(); } @@ -437,28 +439,8 @@ void FGLRenderer::CopyToBackbuffer(const GL_IRECT *bounds, bool applyGamma) box = mOutputLetterbox; } - // Present what was rendered: - glViewport(box.left, box.top, box.width, box.height); - - mPresentShader->Bind(); - mPresentShader->InputTexture.Set(0); - if (!applyGamma || framebuffer->IsHWGammaActive()) - { - mPresentShader->InvGamma.Set(1.0f); - mPresentShader->Contrast.Set(1.0f); - mPresentShader->Brightness.Set(0.0f); - } - else - { - mPresentShader->InvGamma.Set(1.0f / clamp(Gamma, 0.1f, 4.f)); - mPresentShader->Contrast.Set(clamp(vid_contrast, 0.1f, 3.f)); - mPresentShader->Brightness.Set(clamp(vid_brightness, -0.8f, 0.8f)); - } - mPresentShader->Scale.Set(mScreenViewport.width / (float)mBuffers->GetWidth(), mScreenViewport.height / (float)mBuffers->GetHeight()); mBuffers->BindCurrentTexture(0); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - RenderScreenQuad(); + DrawPresentTexture(box, applyGamma); } else if (!bounds) { @@ -468,6 +450,32 @@ void FGLRenderer::CopyToBackbuffer(const GL_IRECT *bounds, bool applyGamma) FGLDebug::PopGroup(); } +void FGLRenderer::DrawPresentTexture(const GL_IRECT &box, bool applyGamma) +{ + glViewport(box.left, box.top, box.width, box.height); + + glActiveTexture(GL_TEXTURE0); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + mPresentShader->Bind(); + mPresentShader->InputTexture.Set(0); + if (!applyGamma || framebuffer->IsHWGammaActive()) + { + mPresentShader->InvGamma.Set(1.0f); + mPresentShader->Contrast.Set(1.0f); + mPresentShader->Brightness.Set(0.0f); + } + else + { + mPresentShader->InvGamma.Set(1.0f / clamp(Gamma, 0.1f, 4.f)); + mPresentShader->Contrast.Set(clamp(vid_contrast, 0.1f, 3.f)); + mPresentShader->Brightness.Set(clamp(vid_brightness, -0.8f, 0.8f)); + } + mPresentShader->Scale.Set(mScreenViewport.width / (float)mBuffers->GetWidth(), mScreenViewport.height / (float)mBuffers->GetHeight()); + RenderScreenQuad(); +} + //----------------------------------------------------------------------------- // // Fills the black bars around the screen letterbox diff --git a/src/gl/renderer/gl_renderer.h b/src/gl/renderer/gl_renderer.h index d768728c4..162fb6dcf 100644 --- a/src/gl/renderer/gl_renderer.h +++ b/src/gl/renderer/gl_renderer.h @@ -173,6 +173,7 @@ public: void ClearTonemapPalette(); void LensDistortScene(); void CopyToBackbuffer(const GL_IRECT *bounds, bool applyGamma); + void DrawPresentTexture(const GL_IRECT &box, bool applyGamma); void Flush(); void SetProjection(float fov, float ratio, float fovratio); diff --git a/src/gl/stereo3d/gl_anaglyph.cpp b/src/gl/stereo3d/gl_anaglyph.cpp index c84c35091..3c051d390 100644 --- a/src/gl/stereo3d/gl_anaglyph.cpp +++ b/src/gl/stereo3d/gl_anaglyph.cpp @@ -34,6 +34,8 @@ */ #include "gl_anaglyph.h" +#include "gl/renderer/gl_renderer.h" +#include "gl/renderer/gl_renderbuffers.h" namespace s3d { @@ -44,6 +46,25 @@ MaskAnaglyph::MaskAnaglyph(const ColorMask& leftColorMask, double ipdMeters) eye_ptrs.Push(&rightEye); } +void MaskAnaglyph::Present() const +{ + GLRenderer->mBuffers->BindOutputFB(); + GLRenderer->ClearBorders(); + + gl_RenderState.SetColorMask(leftEye.GetColorMask().r, leftEye.GetColorMask().g, leftEye.GetColorMask().b, true); + gl_RenderState.ApplyColorMask(); + GLRenderer->mBuffers->BindEyeTexture(0, 0); + GLRenderer->DrawPresentTexture(GLRenderer->mOutputLetterbox, true); + + gl_RenderState.SetColorMask(rightEye.GetColorMask().r, rightEye.GetColorMask().g, rightEye.GetColorMask().b, true); + gl_RenderState.ApplyColorMask(); + GLRenderer->mBuffers->BindEyeTexture(1, 0); + GLRenderer->DrawPresentTexture(GLRenderer->mOutputLetterbox, true); + + gl_RenderState.ResetColorMask(); + gl_RenderState.ApplyColorMask(); +} + /* static */ const GreenMagenta& GreenMagenta::getInstance(float ipd) diff --git a/src/gl/stereo3d/gl_anaglyph.h b/src/gl/stereo3d/gl_anaglyph.h index a82ce0f3b..e3383fe26 100644 --- a/src/gl/stereo3d/gl_anaglyph.h +++ b/src/gl/stereo3d/gl_anaglyph.h @@ -61,14 +61,8 @@ class AnaglyphLeftPose : public LeftEyePose { public: AnaglyphLeftPose(const ColorMask& colorMask, float ipd) : LeftEyePose(ipd), colorMask(colorMask) {} - virtual void SetUp() const { - gl_RenderState.SetColorMask(colorMask.r, colorMask.g, colorMask.b, true); - gl_RenderState.ApplyColorMask(); - } - virtual void TearDown() const { - gl_RenderState.ResetColorMask(); - gl_RenderState.ApplyColorMask(); - } + ColorMask GetColorMask() const { return colorMask; } + private: ColorMask colorMask; }; @@ -77,14 +71,8 @@ class AnaglyphRightPose : public RightEyePose { public: AnaglyphRightPose(const ColorMask& colorMask, float ipd) : RightEyePose(ipd), colorMask(colorMask) {} - virtual void SetUp() const { - gl_RenderState.SetColorMask(colorMask.r, colorMask.g, colorMask.b, true); - gl_RenderState.ApplyColorMask(); - } - virtual void TearDown() const { - gl_RenderState.ResetColorMask(); - gl_RenderState.ApplyColorMask(); - } + ColorMask GetColorMask() const { return colorMask; } + private: ColorMask colorMask; }; @@ -93,6 +81,7 @@ class MaskAnaglyph : public Stereo3DMode { public: MaskAnaglyph(const ColorMask& leftColorMask, double ipdMeters); + void Present() const override; private: AnaglyphLeftPose leftEye; AnaglyphRightPose rightEye;