From 7279c5c10e59fa4e51871c9f342a343ac6518ddd Mon Sep 17 00:00:00 2001 From: MaybeMaru <97055307+MaybeMaru@users.noreply.github.com> Date: Fri, 19 Sep 2025 00:22:47 +0200 Subject: [PATCH 1/2] Many backend changes --- flixel/FlxCamera.hx | 39 +++++--------- flixel/FlxStrip.hx | 2 +- flixel/graphics/tile/FlxDrawBaseItem.hx | 7 --- flixel/graphics/tile/FlxDrawQuadsItem.hx | 42 +++++++-------- flixel/graphics/tile/FlxDrawTrianglesItem.hx | 54 ++++++++++---------- flixel/graphics/tile/FlxGraphicsShader.hx | 24 +++------ flixel/text/FlxBitmapText.hx | 3 +- 7 files changed, 70 insertions(+), 101 deletions(-) diff --git a/flixel/FlxCamera.hx b/flixel/FlxCamera.hx index 94d7973df8..3a76ac28d0 100644 --- a/flixel/FlxCamera.hx +++ b/flixel/FlxCamera.hx @@ -573,20 +573,17 @@ class FlxCamera extends FlxBasic static var renderRect:FlxRect = FlxRect.get(); @:noCompletion - public function startQuadBatch(graphic:FlxGraphic, colored:Bool, hasColorOffsets:Bool = false, ?blend:BlendMode, smooth:Bool = false, ?shader:FlxShader) + public function startQuadBatch(graphic:FlxGraphic, colored:Bool, ?blend:BlendMode, smooth:Bool = false, ?shader:FlxShader) { #if FLX_RENDER_TRIANGLE return startTrianglesBatch(graphic, smooth, colored, blend); #else var itemToReturn = null; - var blendInt:Int = FlxDrawBaseItem.blendToInt(blend); if (_currentDrawItem != null && _currentDrawItem.type == FlxDrawItemType.TILES && _headTiles.graphics == graphic && _headTiles.colored == colored - && _headTiles.hasColorOffsets == hasColorOffsets - && _headTiles.blending == blendInt && _headTiles.blend == blend && _headTiles.antialiasing == smooth && _headTiles.shader == shader) @@ -613,8 +610,6 @@ class FlxCamera extends FlxBasic itemToReturn.graphics = graphic; itemToReturn.antialiasing = smooth; itemToReturn.colored = colored; - itemToReturn.hasColorOffsets = hasColorOffsets; - itemToReturn.blending = blendInt; itemToReturn.blend = blend; itemToReturn.shader = shader; @@ -638,19 +633,17 @@ class FlxCamera extends FlxBasic } @:noCompletion - public function startTrianglesBatch(graphic:FlxGraphic, smoothing:Bool = false, isColored:Bool = false, ?blend:BlendMode, ?hasColorOffsets:Bool, ?shader:FlxShader):FlxDrawTrianglesItem + public function startTrianglesBatch(graphic:FlxGraphic, smoothing:Bool = false, isColored:Bool = false, ?blend:BlendMode, ?shader:FlxShader, + ?repeat:Bool = false):FlxDrawTrianglesItem { - var blendInt:Int = FlxDrawBaseItem.blendToInt(blend); - if (_currentDrawItem != null && _currentDrawItem.type == FlxDrawItemType.TRIANGLES && _headTriangles.graphics == graphic && _headTriangles.antialiasing == smoothing && _headTriangles.colored == isColored - && _headTriangles.blending == blendInt && _headTriangles.blend == blend + && _headTriangles.repeat == repeat #if !flash - && _headTriangles.hasColorOffsets == hasColorOffsets && _headTriangles.shader == shader #end ) @@ -658,14 +651,14 @@ class FlxCamera extends FlxBasic return _headTriangles; } - return getNewDrawTrianglesItem(graphic, smoothing, isColored, blend, hasColorOffsets, shader); + return getNewDrawTrianglesItem(graphic, smoothing, isColored, blend, shader, repeat); } @:noCompletion - public function getNewDrawTrianglesItem(graphic:FlxGraphic, smoothing:Bool = false, isColored:Bool = false, ?blend:BlendMode, ?hasColorOffsets:Bool, ?shader:FlxShader):FlxDrawTrianglesItem + public function getNewDrawTrianglesItem(graphic:FlxGraphic, smoothing:Bool = false, isColored:Bool = false, ?blend:BlendMode, ?shader:FlxShader, + ?repeat:Bool = false):FlxDrawTrianglesItem { var itemToReturn:FlxDrawTrianglesItem = null; - var blendInt:Int = FlxDrawBaseItem.blendToInt(blend); if (_storageTrianglesHead != null) { @@ -682,10 +675,9 @@ class FlxCamera extends FlxBasic itemToReturn.graphics = graphic; itemToReturn.antialiasing = smoothing; itemToReturn.colored = isColored; - itemToReturn.blending = blendInt; itemToReturn.blend = blend; + itemToReturn.repeat = repeat; #if !flash - itemToReturn.hasColorOffsets = hasColorOffsets; itemToReturn.shader = shader; #end @@ -771,13 +763,12 @@ class FlxCamera extends FlxBasic } else { - var isColored = (transform != null #if !html5 && transform.hasRGBMultipliers() #end); - var hasColorOffsets:Bool = (transform != null && transform.hasRGBAOffsets()); + var isColored = (transform != null #if !html5 && (transform.hasRGBMultipliers() || transform.hasRGBAOffsets()) #end); #if FLX_RENDER_TRIANGLE var drawItem:FlxDrawTrianglesItem = startTrianglesBatch(frame.parent, smoothing, isColored, blend); #else - var drawItem = startQuadBatch(frame.parent, isColored, hasColorOffsets, blend, smoothing, shader); + var drawItem = startQuadBatch(frame.parent, isColored, blend, smoothing, shader); #end drawItem.addQuad(frame, matrix, transform); } @@ -815,11 +806,10 @@ class FlxCamera extends FlxBasic _helperMatrix.identity(); _helperMatrix.translate(destPoint.x + frame.offset.x, destPoint.y + frame.offset.y); - var isColored = (transform != null && transform.hasRGBMultipliers()); - var hasColorOffsets:Bool = (transform != null && transform.hasRGBAOffsets()); + var isColored = (transform != null #if !html5 && (transform.hasRGBMultipliers() || transform.hasRGBAOffsets()) #end); #if !FLX_RENDER_TRIANGLE - var drawItem = startQuadBatch(frame.parent, isColored, hasColorOffsets, blend, smoothing, shader); + var drawItem = startQuadBatch(frame.parent, isColored, blend, smoothing, shader); #else var drawItem:FlxDrawTrianglesItem = startTrianglesBatch(frame.parent, smoothing, isColored, blend); #end @@ -909,9 +899,8 @@ class FlxCamera extends FlxBasic var isColored:Bool = (colors != null && colors.length != 0); #if !flash - var hasColorOffsets:Bool = (transform != null && transform.hasRGBAOffsets()); - isColored = isColored || (transform != null && transform.hasRGBMultipliers()); - var drawItem:FlxDrawTrianglesItem = startTrianglesBatch(graphic, smoothing, isColored, blend, hasColorOffsets, shader); + isColored = isColored || (transform != null #if !html5 && (transform.hasRGBMultipliers() || transform.hasRGBAOffsets()) #end); + var drawItem:FlxDrawTrianglesItem = startTrianglesBatch(graphic, smoothing, isColored, blend, shader); drawItem.addTriangles(vertices, indices, uvtData, colors, position, _bounds, transform); #else var drawItem:FlxDrawTrianglesItem = startTrianglesBatch(graphic, smoothing, isColored, blend); diff --git a/flixel/FlxStrip.hx b/flixel/FlxStrip.hx index 14778b32f5..bb13c5e9e5 100644 --- a/flixel/FlxStrip.hx +++ b/flixel/FlxStrip.hx @@ -32,7 +32,7 @@ class FlxStrip extends FlxSprite public var colors:DrawData = new DrawData(); - public var repeat:Bool = false; + public var repeat:Bool = true; override public function destroy():Void { diff --git a/flixel/graphics/tile/FlxDrawBaseItem.hx b/flixel/graphics/tile/FlxDrawBaseItem.hx index 8291ade2e1..937735da29 100644 --- a/flixel/graphics/tile/FlxDrawBaseItem.hx +++ b/flixel/graphics/tile/FlxDrawBaseItem.hx @@ -16,11 +16,6 @@ class FlxDrawBaseItem */ public static var drawCalls:Int = 0; - public static function blendToInt(blend:BlendMode):Int - { - return 0; // no blend mode support in drawQuads() - } - public var nextTyped:T; public var next:FlxDrawBaseItem; @@ -28,8 +23,6 @@ class FlxDrawBaseItem public var graphics:FlxGraphic; public var antialiasing:Bool = false; public var colored:Bool = false; - public var hasColorOffsets:Bool = false; - public var blending:Int = 0; public var blend:BlendMode; public var type:FlxDrawItemType; diff --git a/flixel/graphics/tile/FlxDrawQuadsItem.hx b/flixel/graphics/tile/FlxDrawQuadsItem.hx index 9b513a8106..c86106a49e 100644 --- a/flixel/graphics/tile/FlxDrawQuadsItem.hx +++ b/flixel/graphics/tile/FlxDrawQuadsItem.hx @@ -35,11 +35,11 @@ class FlxDrawQuadsItem extends FlxDrawBaseItem super.reset(); rects.length = 0; transforms.length = 0; - alphas.splice(0, alphas.length); + alphas.resize(0); if (colorMultipliers != null) - colorMultipliers.splice(0, colorMultipliers.length); + colorMultipliers.resize(0); if (colorOffsets != null) - colorOffsets.splice(0, colorOffsets.length); + colorOffsets.resize(0); } override public function dispose():Void @@ -71,7 +71,7 @@ class FlxDrawQuadsItem extends FlxDrawBaseItem for (i in 0...VERTICES_PER_QUAD) alphas.push(alphaMultiplier); - if (colored || hasColorOffsets) + if (colored) { if (colorMultipliers == null) colorMultipliers = []; @@ -79,32 +79,28 @@ class FlxDrawQuadsItem extends FlxDrawBaseItem if (colorOffsets == null) colorOffsets = []; - for (i in 0...VERTICES_PER_QUAD) + if (transform != null) { - if (transform != null) + for (i in 0...VERTICES_PER_QUAD) { colorMultipliers.push(transform.redMultiplier); colorMultipliers.push(transform.greenMultiplier); colorMultipliers.push(transform.blueMultiplier); + colorMultipliers.push(1); colorOffsets.push(transform.redOffset); colorOffsets.push(transform.greenOffset); colorOffsets.push(transform.blueOffset); colorOffsets.push(transform.alphaOffset); } - else + } + else + { + for (i in 0...(VERTICES_PER_QUAD * 4)) { colorMultipliers.push(1); - colorMultipliers.push(1); - colorMultipliers.push(1); - - colorOffsets.push(0); - colorOffsets.push(0); - colorOffsets.push(0); colorOffsets.push(0); } - - colorMultipliers.push(1); } } } @@ -114,24 +110,28 @@ class FlxDrawQuadsItem extends FlxDrawBaseItem { if (rects.length == 0) return; - + // TODO: catch this error when the dev actually messes up, not in the draw phase if (shader == null && graphics.isDestroyed) throw 'Attempted to render an invalid FlxDrawItem, did you destroy a cached sprite?'; - + final shader = shader != null ? shader : graphics.shader; shader.bitmap.input = graphics.bitmap; shader.bitmap.filter = (camera.antialiasing || antialiasing) ? LINEAR : NEAREST; shader.alpha.value = alphas; - if (colored || hasColorOffsets) + if (colored) { shader.colorMultiplier.value = colorMultipliers; shader.colorOffset.value = colorOffsets; } + else + { + shader.colorMultiplier.value = null; + shader.colorOffset.value = null; + } - setParameterValue(shader.hasTransform, true); - setParameterValue(shader.hasColorTransform, colored || hasColorOffsets); + setParameterValue(shader.hasColorTransform, colored); camera.canvas.graphics.overrideBlendMode(blend); camera.canvas.graphics.beginShaderFill(shader); @@ -146,4 +146,4 @@ class FlxDrawQuadsItem extends FlxDrawBaseItem parameter.value[0] = value; } #end -} \ No newline at end of file +} diff --git a/flixel/graphics/tile/FlxDrawTrianglesItem.hx b/flixel/graphics/tile/FlxDrawTrianglesItem.hx index b2f71ce51e..c485abf718 100644 --- a/flixel/graphics/tile/FlxDrawTrianglesItem.hx +++ b/flixel/graphics/tile/FlxDrawTrianglesItem.hx @@ -25,11 +25,14 @@ class FlxDrawTrianglesItem extends FlxDrawBaseItem #if !flash public var shader:FlxShader; + var alphas:Array; var colorMultipliers:Array; var colorOffsets:Array; #end + public var repeat:Bool = false; + public var vertices:DrawData = new DrawData(); public var indices:DrawData = new DrawData(); public var uvtData:DrawData = new DrawData(); @@ -59,13 +62,13 @@ class FlxDrawTrianglesItem extends FlxDrawBaseItem return; #if !flash - var shader = shader != null ? shader : graphics.shader; + final shader = shader != null ? shader : graphics.shader; shader.bitmap.input = graphics.bitmap; shader.bitmap.filter = (camera.antialiasing || antialiasing) ? LINEAR : NEAREST; - shader.bitmap.wrap = REPEAT; // in order to prevent breaking tiling behaviour in classes that use drawTriangles + shader.bitmap.wrap = repeat ? REPEAT : CLAMP; shader.alpha.value = alphas; - if (colored || hasColorOffsets) + if (colored) { shader.colorMultiplier.value = colorMultipliers; shader.colorOffset.value = colorOffsets; @@ -76,14 +79,12 @@ class FlxDrawTrianglesItem extends FlxDrawBaseItem shader.colorOffset.value = null; } - setParameterValue(shader.hasTransform, true); - setParameterValue(shader.hasColorTransform, colored || hasColorOffsets); + setParameterValue(shader.hasColorTransform, colored); camera.canvas.graphics.overrideBlendMode(blend); - camera.canvas.graphics.beginShaderFill(shader); #else - camera.canvas.graphics.beginBitmapFill(graphics.bitmap, null, true, (camera.antialiasing || antialiasing)); + camera.canvas.graphics.beginBitmapFill(graphics.bitmap, null, repeat, (camera.antialiasing || antialiasing)); #end camera.canvas.graphics.drawTriangles(vertices, indices, uvtData, TriangleCulling.NONE); @@ -113,11 +114,11 @@ class FlxDrawTrianglesItem extends FlxDrawBaseItem indicesPosition = 0; colorsPosition = 0; #if !flash - alphas.splice(0, alphas.length); + alphas.resize(0); if (colorMultipliers != null) - colorMultipliers.splice(0, colorMultipliers.length); + colorMultipliers.resize(0); if (colorOffsets != null) - colorOffsets.splice(0, colorOffsets.length); + colorOffsets.resize(0); #end } @@ -214,12 +215,11 @@ class FlxDrawTrianglesItem extends FlxDrawBaseItem cameraBounds.putWeak(); #if !flash - for (_ in 0...indicesLength) - { - alphas.push(transform != null ? transform.alphaMultiplier : 1.0); - } + var alphaMultiplier = transform != null ? transform.alphaMultiplier : 1.0; + for (i in 0...indicesLength) + alphas.push(alphaMultiplier); - if (colored || hasColorOffsets) + if (colored) { if (colorMultipliers == null) colorMultipliers = []; @@ -227,32 +227,30 @@ class FlxDrawTrianglesItem extends FlxDrawBaseItem if (colorOffsets == null) colorOffsets = []; - for (_ in 0...indicesLength) + if (transform != null) { - if(transform != null) + for (i in 0...indicesLength) { colorMultipliers.push(transform.redMultiplier); colorMultipliers.push(transform.greenMultiplier); colorMultipliers.push(transform.blueMultiplier); + colorMultipliers.push(1); colorOffsets.push(transform.redOffset); colorOffsets.push(transform.greenOffset); colorOffsets.push(transform.blueOffset); colorOffsets.push(transform.alphaOffset); } - else + } + else + { + for (i in 0...indicesLength) { - colorMultipliers.push(1); - colorMultipliers.push(1); - colorMultipliers.push(1); - - colorOffsets.push(0); - colorOffsets.push(0); - colorOffsets.push(0); - colorOffsets.push(0); + for (_ in 0...4) + colorMultipliers.push(1); + for (_ in 0...4) + colorOffsets.push(0); } - - colorMultipliers.push(1); } } #end diff --git a/flixel/graphics/tile/FlxGraphicsShader.hx b/flixel/graphics/tile/FlxGraphicsShader.hx index 343eb13eb6..2fdb7b3e0e 100644 --- a/flixel/graphics/tile/FlxGraphicsShader.hx +++ b/flixel/graphics/tile/FlxGraphicsShader.hx @@ -28,30 +28,20 @@ class FlxGraphicsShader extends GraphicsShader } ", true) @:glFragmentHeader(" - uniform bool hasTransform; // TODO: Is this still needed? Apparently, yes! uniform bool hasColorTransform; vec4 flixel_texture2D(sampler2D bitmap, vec2 coord) { vec4 color = texture2D(bitmap, coord); - if (!(hasTransform || openfl_HasColorTransform)) + if (color.a == 0.0) return color; - if (color.a == 0.0) - return vec4(0.0, 0.0, 0.0, 0.0); + if (!(hasColorTransform || openfl_HasColorTransform)) + return color * openfl_Alphav; - 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; + 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); + return vec4 (color.rgb * color.a * openfl_Alphav, color.a * openfl_Alphav); } ", true) @:glFragmentBody(" diff --git a/flixel/text/FlxBitmapText.hx b/flixel/text/FlxBitmapText.hx index 9055e77e61..7e6fefb0cd 100644 --- a/flixel/text/FlxBitmapText.hx +++ b/flixel/text/FlxBitmapText.hx @@ -403,8 +403,7 @@ class FlxBitmapText extends FlxSprite camera.drawPixels(FlxG.bitmap.whitePixel, null, matrix, colorTransform, blend, antialiasing); } - final hasColorOffsets = (colorTransform != null && colorTransform.hasRGBAOffsets()); - final drawItem = camera.startQuadBatch(font.parent, true, hasColorOffsets, blend, antialiasing, shader); + final drawItem = camera.startQuadBatch(font.parent, true, blend, antialiasing, shader); function addQuad(charCode:Int, x:Float, y:Float, color:ColorTransform) { var frame = font.getCharFrame(charCode); From 3077225a5a40af2ba358344339502fa5e0890321 Mon Sep 17 00:00:00 2001 From: MaybeMaru <97055307+MaybeMaru@users.noreply.github.com> Date: Fri, 19 Sep 2025 00:50:11 +0200 Subject: [PATCH 2/2] Update FlxTilemap.hx --- flixel/tile/FlxTilemap.hx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flixel/tile/FlxTilemap.hx b/flixel/tile/FlxTilemap.hx index 80aecfc4d9..63c6664fd8 100644 --- a/flixel/tile/FlxTilemap.hx +++ b/flixel/tile/FlxTilemap.hx @@ -1217,7 +1217,8 @@ class FlxTypedTilemap extends FlxBaseTilemap @:access(flixel.FlxCamera) function drawTilemap(buffer:FlxTilemapBuffer, camera:FlxCamera):Void { - var isColored:Bool = (alpha != 1) || (color != 0xffffff); + var isColored = (colorTransform != null #if !html5 + && (colorTransform.hasRGBMultipliers() || colorTransform.hasRGBAOffsets()) #end); // only used for renderTile var drawX:Float = 0; @@ -1240,8 +1241,7 @@ class FlxTypedTilemap extends FlxBaseTilemap scaledWidth = scaledTileWidth; scaledHeight = scaledTileHeight; - var hasColorOffsets:Bool = (colorTransform != null && colorTransform.hasRGBAOffsets()); - drawItem = camera.startQuadBatch(graphic, isColored, hasColorOffsets, blend, antialiasing, shader); + drawItem = camera.startQuadBatch(graphic, isColored, blend, antialiasing, shader); } // Copy tile images into the tile buffer