From 97d9ca717a46f633bfaeb2994b1a9b7042c4a331 Mon Sep 17 00:00:00 2001 From: omigamedev Date: Sun, 21 Jul 2019 08:47:26 +0200 Subject: [PATCH] fix shader for Apple devices --- data/shaders/stroke-dilate.glsl | 22 ++++++++++++++-------- src/rtt.cpp | 2 +- src/shader.cpp | 6 ++++-- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/data/shaders/stroke-dilate.glsl b/data/shaders/stroke-dilate.glsl index 4ea702a..f40152c 100644 --- a/data/shaders/stroke-dilate.glsl +++ b/data/shaders/stroke-dilate.glsl @@ -24,15 +24,21 @@ void main() highp vec4 bg = texture(tex_bg, uv); if (bg.a == 0.0) { + highp ivec2 sz = textureSize(tex_bg, 0); + highp ivec2 uv_raster = ivec2(uv * vec2(sz)); highp vec4 sum = vec4(0.0); - for (int y = -1; y <= 1; y++) - { - for (int x = -1; x <= 1; x++) - { - highp vec4 c = textureOffset(tex_bg, uv, ivec2(x, y)); - sum += vec4(c.rgb * c.a, c.a); - } - } + highp vec4 c; + c = texelFetch(tex_bg, uv_raster + ivec2(-1, -1), 0); sum += vec4(c.rgb * c.a, c.a); + c = texelFetch(tex_bg, uv_raster + ivec2(-1, 0), 0); sum += vec4(c.rgb * c.a, c.a); + c = texelFetch(tex_bg, uv_raster + ivec2(-1, 1), 0); sum += vec4(c.rgb * c.a, c.a); + + c = texelFetch(tex_bg, uv_raster + ivec2( 0, -1), 0); sum += vec4(c.rgb * c.a, c.a); + c = texelFetch(tex_bg, uv_raster + ivec2( 0, 1), 0); sum += vec4(c.rgb * c.a, c.a); + + c = texelFetch(tex_bg, uv_raster + ivec2( 1, -1), 0); sum += vec4(c.rgb * c.a, c.a); + c = texelFetch(tex_bg, uv_raster + ivec2( 1, 0), 0); sum += vec4(c.rgb * c.a, c.a); + c = texelFetch(tex_bg, uv_raster + ivec2( 1, 1), 0); sum += vec4(c.rgb * c.a, c.a); + frag = sum.a > 0.0 ? vec4(sum.rgb / sum.a, 0.0) : bg; } else diff --git a/src/rtt.cpp b/src/rtt.cpp index 6d6fbba..88aee87 100644 --- a/src/rtt.cpp +++ b/src/rtt.cpp @@ -259,7 +259,7 @@ void RTT::clear_mask(glm::bool4 mask, glm::vec4 color) { // save old state std::array old_mask; - glGetBooleanv(GL_COLOR_WRITEMASK, std::data(old_mask)); + glGetBooleanv(GL_COLOR_WRITEMASK, old_mask.data()); // clear with mask glColorMask(mask.r, mask.g, mask.b, mask.a); diff --git a/src/shader.cpp b/src/shader.cpp index 1136aee..b277e0b 100644 --- a/src/shader.cpp +++ b/src/shader.cpp @@ -15,7 +15,8 @@ std::string Shader::read(const std::string& path) if (a.open(path.c_str())) { struct stat tmp_info; - if (stat(path.c_str(), &tmp_info) == 0) + std::string abs_path = Asset::absolute(path); + if (stat(abs_path.c_str(), &tmp_info) == 0) m_deps[path] = tmp_info; std::regex reg_include(R"!(#include "([^"]+)")!"); @@ -133,7 +134,8 @@ bool Shader::reload() struct stat tmp_info; for (auto& d : m_deps) { - if (stat(d.first.c_str(), &tmp_info) != 0) + std::string abs_path = Asset::absolute(d.first); + if (stat(abs_path.c_str(), &tmp_info) != 0) continue; if (tmp_info.st_mtime > d.second.st_mtime) {