From c5c788e976b838a54ac30941db2d250549c613d2 Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Mon, 27 Jan 2014 02:58:34 -0400 Subject: [PATCH] =?UTF-8?q?Added=20a=20built-in=20variable=20readable=20in?= =?UTF-8?q?=20shaders:=20=E2=80=98love=5FScreenSize=E2=80=99.=20Its=20x=20?= =?UTF-8?q?and=20y=20components=20contain=20the=20width=20and=20height=20o?= =?UTF-8?q?f=20the=20current=20viewport.=20Resolves=20issue=20#841.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/graphics/opengl/OpenGL.h | 5 +++++ src/modules/graphics/opengl/Shader.cpp | 26 +++++++++++++++++--------- src/modules/graphics/opengl/Shader.h | 3 ++- src/scripts/graphics.lua | 6 +++--- src/scripts/graphics.lua.h | 16 ++++++++-------- 5 files changed, 35 insertions(+), 21 deletions(-) diff --git a/src/modules/graphics/opengl/OpenGL.h b/src/modules/graphics/opengl/OpenGL.h index 602770164..8e61c012e 100644 --- a/src/modules/graphics/opengl/OpenGL.h +++ b/src/modules/graphics/opengl/OpenGL.h @@ -87,6 +87,11 @@ public: Viewport(int _x, int _y, int _w, int _h) : x(_x), y(_y), w(_w), h(_h) {} + + bool operator == (const Viewport &rhs) const + { + return x == rhs.x && y == rhs.y && w == rhs.w && h == rhs.h; + } }; OpenGL(); diff --git a/src/modules/graphics/opengl/Shader.cpp b/src/modules/graphics/opengl/Shader.cpp index 365a52569..7b94e805c 100644 --- a/src/modules/graphics/opengl/Shader.cpp +++ b/src/modules/graphics/opengl/Shader.cpp @@ -72,6 +72,7 @@ Shader::Shader(const ShaderSources &sources) , builtinUniforms() , vertexAttributes() , lastCanvas((Canvas *) -1) + , lastViewport() { if (shaderSources.empty()) throw love::Exception("Cannot create shader: no source code!"); @@ -693,30 +694,37 @@ bool Shader::sendBuiltinFloat(BuiltinExtern builtin, int size, const GLfloat *ve void Shader::checkSetScreenParams() { - if (lastCanvas == Canvas::current) + OpenGL::Viewport view = gl.getViewport(); + + if (view == lastViewport && lastCanvas == Canvas::current) return; - // In the shader, we do pixcoord.y = gl_FragCoord.y * params[0] + params[1]. + // In the shader, we do pixcoord.y = gl_FragCoord.y * params.z + params.w. // This lets us flip pixcoord.y when needed, to be consistent (Canvases // have flipped y-values for pixel coordinates.) - GLfloat params[] = {0.0f, 0.0f}; + GLfloat params[] = { + (GLfloat) view.w, (GLfloat) view.h, + 0.0f, 0.0f, + }; if (Canvas::current != nullptr) { // gl_FragCoord.y is flipped in Canvases, so we un-flip: // pixcoord.y = gl_FragCoord.y * -1.0 + height. - params[0] = -1.0f; - params[1] = (float) Canvas::current->getHeight(); + params[2] = -1.0f; + params[3] = (GLfloat) view.h; } else { // No flipping: pixcoord.y = gl_FragCoord.y * 1.0 + 0.0. - params[0] = 1.0f; - params[1] = 0.0f; + params[2] = 1.0f; + params[3] = 0.0f; } - sendBuiltinFloat(BUILTIN_SCREEN_PARAMS, 2, params, 1); + sendBuiltinFloat(BUILTIN_SCREEN_SIZE, 4, params, 1); + lastCanvas = Canvas::current; + lastViewport = view; } const std::map &Shader::getBoundRetainables() const @@ -767,7 +775,7 @@ StringMap Shader::attribNames(Sha StringMap::Entry Shader::builtinNameEntries[] = { - {"love_ScreenParams", Shader::BUILTIN_SCREEN_PARAMS}, + {"love_ScreenSize", Shader::BUILTIN_SCREEN_SIZE}, }; StringMap Shader::builtinNames(Shader::builtinNameEntries, sizeof(Shader::builtinNameEntries)); diff --git a/src/modules/graphics/opengl/Shader.h b/src/modules/graphics/opengl/Shader.h index 937d79308..db116cc47 100644 --- a/src/modules/graphics/opengl/Shader.h +++ b/src/modules/graphics/opengl/Shader.h @@ -59,7 +59,7 @@ public: // Built-in extern (uniform) variables. enum BuiltinExtern { - BUILTIN_SCREEN_PARAMS, + BUILTIN_SCREEN_SIZE, BUILTIN_MAX_ENUM }; @@ -216,6 +216,7 @@ private: // Pointer to the active Canvas when the screen params were last checked. Canvas *lastCanvas; + OpenGL::Viewport lastViewport; // Max GPU texture units available for sent images static GLint maxTexUnits; diff --git a/src/scripts/graphics.lua b/src/scripts/graphics.lua index 0d6ce715e..4b2b9b814 100644 --- a/src/scripts/graphics.lua +++ b/src/scripts/graphics.lua @@ -1304,7 +1304,7 @@ do #define TransformProjectionMatrix gl_ModelViewProjectionMatrix #define NormalMatrix gl_NormalMatrix uniform sampler2D _tex0_; -uniform vec2 love_ScreenParams;]] +uniform vec4 love_ScreenSize;]] local GLSL_VERTEX = { HEADER = [[ @@ -1346,7 +1346,7 @@ void main() { float dummy = texture2D(_tex0_, vec2(.5)).r; // See Shader::checkSetScreenParams in Shader.cpp. - vec2 pixelcoord = vec2(gl_FragCoord.x, (gl_FragCoord.y * love_ScreenParams[0]) + love_ScreenParams[1]); + vec2 pixelcoord = vec2(gl_FragCoord.x, (gl_FragCoord.y * love_ScreenSize.z) + love_ScreenSize.w); gl_FragColor = effect(VaryingColor, _tex0_, VaryingTexCoord.st, pixelcoord); }]], @@ -1357,7 +1357,7 @@ void main() { float dummy = texture2D(_tex0_, vec2(.5)).r; // See Shader::checkSetScreenParams in Shader.cpp. - vec2 pixelcoord = vec2(gl_FragCoord.x, (gl_FragCoord.y * love_ScreenParams[0]) + love_ScreenParams[1]); + vec2 pixelcoord = vec2(gl_FragCoord.x, (gl_FragCoord.y * love_ScreenSize.z) + love_ScreenSize.w); effects(VaryingColor, _tex0_, VaryingTexCoord.st, pixelcoord); }]], diff --git a/src/scripts/graphics.lua.h b/src/scripts/graphics.lua.h index 280c4c83c..b89461c99 100644 --- a/src/scripts/graphics.lua.h +++ b/src/scripts/graphics.lua.h @@ -6295,8 +6295,8 @@ const unsigned char graphics_lua[] = 0x69, 0x78, 0x20, 0x67, 0x6c, 0x5f, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x5f, 0x74, 0x65, 0x78, 0x30, 0x5f, 0x3b, 0x0a, - 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x5f, - 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x5d, 0x5d, 0x0a, + 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x5f, + 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x53, 0x69, 0x7a, 0x65, 0x3b, 0x5d, 0x5d, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x47, 0x4c, 0x53, 0x4c, 0x5f, 0x56, 0x45, 0x52, 0x54, 0x45, 0x58, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x09, 0x09, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x20, 0x3d, 0x20, 0x5b, 0x5b, 0x0a, @@ -6365,9 +6365,9 @@ const unsigned char graphics_lua[] = 0x09, 0x76, 0x65, 0x63, 0x32, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x2c, 0x20, 0x28, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, - 0x79, 0x20, 0x2a, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x5f, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x5b, 0x30, 0x5d, 0x29, 0x20, 0x2b, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x5f, 0x53, 0x63, 0x72, - 0x65, 0x65, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x31, 0x5d, 0x29, 0x3b, 0x0a, + 0x79, 0x20, 0x2a, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x5f, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x53, 0x69, 0x7a, + 0x65, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x5f, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, + 0x53, 0x69, 0x7a, 0x65, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x09, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x28, 0x56, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x5f, 0x74, 0x65, 0x78, 0x30, 0x5f, 0x2c, 0x20, 0x56, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x54, 0x65, @@ -6390,9 +6390,9 @@ const unsigned char graphics_lua[] = 0x09, 0x76, 0x65, 0x63, 0x32, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x2c, 0x20, 0x28, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, - 0x79, 0x20, 0x2a, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x5f, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x5b, 0x30, 0x5d, 0x29, 0x20, 0x2b, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x5f, 0x53, 0x63, 0x72, - 0x65, 0x65, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x31, 0x5d, 0x29, 0x3b, 0x0a, + 0x79, 0x20, 0x2a, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x5f, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x53, 0x69, 0x7a, + 0x65, 0x2e, 0x7a, 0x29, 0x20, 0x2b, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x5f, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, + 0x53, 0x69, 0x7a, 0x65, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x09, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x28, 0x56, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x5f, 0x74, 0x65, 0x78, 0x30, 0x5f, 0x2c, 0x20, 0x56, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x54, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x73, 0x74, 0x2c, 0x20, 0x70, 0x69, 0x78,