diff --git a/flixel/FlxCamera.hx b/flixel/FlxCamera.hx index 27a4b67630..1843e255f9 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 @@ -773,13 +765,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); } @@ -817,11 +808,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 @@ -910,10 +900,9 @@ 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); - drawItem.addTriangles(vertices, indices, uvtData, colors, position, cameraBounds, transform); + 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); drawItem.addTriangles(vertices, indices, uvtData, colors, position, cameraBounds); 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 be24ceaf80..821a8f3a31 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); 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 04b6fa119c..d62720544d 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); 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