From d4d42e8ba9eb697cc91468d024005e65c59c3276 Mon Sep 17 00:00:00 2001 From: George FunBook Date: Sun, 29 Dec 2024 23:51:55 -0500 Subject: [PATCH 1/4] fix camera.color --- flixel/graphics/tile/FlxGraphicsShader.hx | 71 ++++++++++------------- 1 file changed, 32 insertions(+), 39 deletions(-) diff --git a/flixel/graphics/tile/FlxGraphicsShader.hx b/flixel/graphics/tile/FlxGraphicsShader.hx index e433b45a86..478d9671d1 100644 --- a/flixel/graphics/tile/FlxGraphicsShader.hx +++ b/flixel/graphics/tile/FlxGraphicsShader.hx @@ -4,66 +4,59 @@ import openfl.display.GraphicsShader; class FlxGraphicsShader extends GraphicsShader { - @:glVertexSource(" - #pragma header - + @:glVertexHeader(" attribute float alpha; attribute vec4 colorMultiplier; attribute vec4 colorOffset; uniform bool hasColorTransform; - - void main(void) + ") + @:glVertexBody(" + openfl_Alphav = openfl_Alpha * alpha; + + if (hasColorTransform) { - #pragma body - - openfl_Alphav = openfl_Alpha * alpha; - - if (hasColorTransform) + if (openfl_HasColorTransform) + { + openfl_ColorOffsetv = (openfl_ColorOffsetv * colorMultiplier) + (colorOffset / 255.0); + openfl_ColorMultiplierv *= colorMultiplier; + } + else { openfl_ColorOffsetv = colorOffset / 255.0; openfl_ColorMultiplierv = colorMultiplier; } - }") + } + ") @:glFragmentHeader(" - uniform bool hasTransform; + uniform bool hasTransform; // TODO: Is this still needed? uniform bool hasColorTransform; - vec4 flixel_texture2D(sampler2D bitmap, vec2 coord) { vec4 color = texture2D(bitmap, coord); - if (!hasTransform) - { + if (!(hasTransform || openfl_HasColorTransform)) return color; - } - + if (color.a == 0.0) - { return vec4(0.0, 0.0, 0.0, 0.0); - } - - if (!hasColorTransform) - { - return color * openfl_Alphav; - } - - color = vec4(color.rgb / color.a, color.a); - - color = clamp(openfl_ColorOffsetv + (color * openfl_ColorMultiplierv), 0.0, 1.0); - - if (color.a > 0.0) + + if (openfl_HasColorTransform || hasColorTransform) { - return vec4(color.rgb * color.a * openfl_Alphav, color.a * openfl_Alphav); + color = vec4 (color.rgb / color.a, color.a); + vec4 mult = vec4 (openfl_ColorMultiplierv.rgb, 1.0); + color = clamp (openfl_ColorOffsetv + (color * mult), 0.0, 1.0); + + if (color.a == 0.0) + return vec4 (0.0, 0.0, 0.0, 0.0); + + return vec4 (color.rgb * color.a * openfl_Alphav, color.a * openfl_Alphav); } - return vec4(0.0, 0.0, 0.0, 0.0); + + return color * openfl_Alphav; } ") - @:glFragmentSource(" - #pragma header - - void main(void) - { - gl_FragColor = flixel_texture2D(bitmap, openfl_TextureCoordv); - }") + @:glFragmentBody(" + gl_FragColor = flixel_texture2D(bitmap, openfl_TextureCoordv); + ") public function new() { super(); From a72419075c08939d7e40f57f8d0989ea1492e26d Mon Sep 17 00:00:00 2001 From: George FunBook Date: Sun, 29 Dec 2024 23:53:43 -0500 Subject: [PATCH 2/4] doc --- flixel/graphics/tile/FlxGraphicsShader.hx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flixel/graphics/tile/FlxGraphicsShader.hx b/flixel/graphics/tile/FlxGraphicsShader.hx index 478d9671d1..5e1e01d0f2 100644 --- a/flixel/graphics/tile/FlxGraphicsShader.hx +++ b/flixel/graphics/tile/FlxGraphicsShader.hx @@ -28,7 +28,7 @@ class FlxGraphicsShader extends GraphicsShader } ") @:glFragmentHeader(" - uniform bool hasTransform; // TODO: Is this still needed? + uniform bool hasTransform; // TODO: Is this still needed? Apparently, yes! uniform bool hasColorTransform; vec4 flixel_texture2D(sampler2D bitmap, vec2 coord) { From a9497cf181ef8c4f1771192581efcb19c69934cf Mon Sep 17 00:00:00 2001 From: George FunBook Date: Mon, 30 Dec 2024 10:48:20 -0500 Subject: [PATCH 3/4] simplify shader --- flixel/graphics/tile/FlxDrawQuadsItem.hx | 1 - flixel/graphics/tile/FlxDrawTrianglesItem.hx | 1 - flixel/graphics/tile/FlxGraphicsShader.hx | 37 +++++++++----------- 3 files changed, 17 insertions(+), 22 deletions(-) diff --git a/flixel/graphics/tile/FlxDrawQuadsItem.hx b/flixel/graphics/tile/FlxDrawQuadsItem.hx index bd73f8b346..adfa2bf6ed 100644 --- a/flixel/graphics/tile/FlxDrawQuadsItem.hx +++ b/flixel/graphics/tile/FlxDrawQuadsItem.hx @@ -130,7 +130,6 @@ class FlxDrawQuadsItem extends FlxDrawBaseItem shader.colorOffset.value = colorOffsets; } - setParameterValue(shader.hasTransform, true); setParameterValue(shader.hasColorTransform, colored || hasColorOffsets); #if (openfl > "8.7.0") diff --git a/flixel/graphics/tile/FlxDrawTrianglesItem.hx b/flixel/graphics/tile/FlxDrawTrianglesItem.hx index c1af4b6438..b1d4a64880 100644 --- a/flixel/graphics/tile/FlxDrawTrianglesItem.hx +++ b/flixel/graphics/tile/FlxDrawTrianglesItem.hx @@ -76,7 +76,6 @@ class FlxDrawTrianglesItem extends FlxDrawBaseItem shader.colorOffset.value = null; } - setParameterValue(shader.hasTransform, true); setParameterValue(shader.hasColorTransform, colored || hasColorOffsets); #if (openfl > "8.7.0") diff --git a/flixel/graphics/tile/FlxGraphicsShader.hx b/flixel/graphics/tile/FlxGraphicsShader.hx index 5e1e01d0f2..4829975b8e 100644 --- a/flixel/graphics/tile/FlxGraphicsShader.hx +++ b/flixel/graphics/tile/FlxGraphicsShader.hx @@ -17,41 +17,38 @@ class FlxGraphicsShader extends GraphicsShader { if (openfl_HasColorTransform) { + // concat transforms openfl_ColorOffsetv = (openfl_ColorOffsetv * colorMultiplier) + (colorOffset / 255.0); openfl_ColorMultiplierv *= colorMultiplier; } else { + // overwrite openfl's transform openfl_ColorOffsetv = colorOffset / 255.0; openfl_ColorMultiplierv = colorMultiplier; } } ") @:glFragmentHeader(" - uniform bool hasTransform; // TODO: Is this still needed? Apparently, yes! uniform bool hasColorTransform; + + vec4 transform(vec4 color, vec4 mult, vec4 offset, float alpha) + { + color = clamp(offset + (color * mult), 0.0, 1.0); + alpha *= color.a; + return vec4 (color.rgb * alpha, alpha); + } + + vec4 transformIf(bool hasTransform, vec4 color, vec4 mult, vec4 offset, float alpha) + { + return mix(color, transform(color, mult, offset, alpha), float(hasTransform)); + } + vec4 flixel_texture2D(sampler2D bitmap, vec2 coord) { vec4 color = texture2D(bitmap, coord); - if (!(hasTransform || openfl_HasColorTransform)) - return color; - - if (color.a == 0.0) - return vec4(0.0, 0.0, 0.0, 0.0); - - if (openfl_HasColorTransform || hasColorTransform) - { - color = vec4 (color.rgb / color.a, color.a); - vec4 mult = vec4 (openfl_ColorMultiplierv.rgb, 1.0); - color = clamp (openfl_ColorOffsetv + (color * mult), 0.0, 1.0); - - if (color.a == 0.0) - return vec4 (0.0, 0.0, 0.0, 0.0); - - return vec4 (color.rgb * color.a * openfl_Alphav, color.a * openfl_Alphav); - } - - return color * openfl_Alphav; + bool hasTransform = openfl_HasColorTransform || hasColorTransform; + return transformIf(hasTransform, color, openfl_ColorMultiplierv, openfl_ColorOffsetv, openfl_Alphav); } ") @:glFragmentBody(" From ddc71544562e6bf3b3f64654440fde2bea45071c Mon Sep 17 00:00:00 2001 From: George FunBook Date: Wed, 1 Jan 2025 23:34:21 -0600 Subject: [PATCH 4/4] fix issues --- flixel/graphics/tile/FlxDrawQuadsItem.hx | 1 + flixel/graphics/tile/FlxDrawTrianglesItem.hx | 1 + flixel/graphics/tile/FlxGraphicsShader.hx | 16 +++++++++++----- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/flixel/graphics/tile/FlxDrawQuadsItem.hx b/flixel/graphics/tile/FlxDrawQuadsItem.hx index adfa2bf6ed..bd73f8b346 100644 --- a/flixel/graphics/tile/FlxDrawQuadsItem.hx +++ b/flixel/graphics/tile/FlxDrawQuadsItem.hx @@ -130,6 +130,7 @@ class FlxDrawQuadsItem extends FlxDrawBaseItem shader.colorOffset.value = colorOffsets; } + setParameterValue(shader.hasTransform, true); setParameterValue(shader.hasColorTransform, colored || hasColorOffsets); #if (openfl > "8.7.0") diff --git a/flixel/graphics/tile/FlxDrawTrianglesItem.hx b/flixel/graphics/tile/FlxDrawTrianglesItem.hx index b1d4a64880..c1af4b6438 100644 --- a/flixel/graphics/tile/FlxDrawTrianglesItem.hx +++ b/flixel/graphics/tile/FlxDrawTrianglesItem.hx @@ -76,6 +76,7 @@ class FlxDrawTrianglesItem extends FlxDrawBaseItem shader.colorOffset.value = null; } + setParameterValue(shader.hasTransform, true); setParameterValue(shader.hasColorTransform, colored || hasColorOffsets); #if (openfl > "8.7.0") diff --git a/flixel/graphics/tile/FlxGraphicsShader.hx b/flixel/graphics/tile/FlxGraphicsShader.hx index 4829975b8e..b9f31d2a7a 100644 --- a/flixel/graphics/tile/FlxGraphicsShader.hx +++ b/flixel/graphics/tile/FlxGraphicsShader.hx @@ -30,25 +30,31 @@ class FlxGraphicsShader extends GraphicsShader } ") @:glFragmentHeader(" + // Note: this is being set to false somewhere! + uniform bool hasTransform; uniform bool hasColorTransform; vec4 transform(vec4 color, vec4 mult, vec4 offset, float alpha) { color = clamp(offset + (color * mult), 0.0, 1.0); - alpha *= color.a; - return vec4 (color.rgb * alpha, alpha); + return vec4 (color.rgb, 1.0) * color.a * alpha; } vec4 transformIf(bool hasTransform, vec4 color, vec4 mult, vec4 offset, float alpha) { - return mix(color, transform(color, mult, offset, alpha), float(hasTransform)); + return mix(color * alpha, transform(color, mult, offset, alpha), float(hasTransform)); } vec4 flixel_texture2D(sampler2D bitmap, vec2 coord) { vec4 color = texture2D(bitmap, coord); - bool hasTransform = openfl_HasColorTransform || hasColorTransform; - return transformIf(hasTransform, color, openfl_ColorMultiplierv, openfl_ColorOffsetv, openfl_Alphav); + if (!hasTransform && !openfl_HasColorTransform) + return color; + + color = mix(color, vec4(0.0), float(color.a == 0.0)); + + bool _hasTransform = openfl_HasColorTransform || hasColorTransform; + return transformIf(_hasTransform, color, openfl_ColorMultiplierv, openfl_ColorOffsetv, openfl_Alphav); } ") @:glFragmentBody("