From d390790c224826335bbebf62b5163c7a7c31e3c4 Mon Sep 17 00:00:00 2001 From: ACrazyTown <47027981+ACrazyTown@users.noreply.github.com> Date: Tue, 23 Dec 2025 13:04:03 +0100 Subject: [PATCH 01/28] Implement FlxCameraView & port blit/quad renderer --- flixel/FlxCamera.hx | 851 +++++-------------- flixel/FlxObject.hx | 10 +- flixel/graphics/tile/FlxDrawQuadsItem.hx | 8 +- flixel/graphics/tile/FlxDrawTrianglesItem.hx | 10 +- flixel/system/frontEnds/CameraFrontEnd.hx | 58 +- flixel/system/render/FlxCameraView.hx | 378 ++++++++ flixel/system/render/blit/FlxBlitView.hx | 490 +++++++++++ flixel/system/render/quad/FlxQuadView.hx | 497 +++++++++++ 8 files changed, 1623 insertions(+), 679 deletions(-) create mode 100644 flixel/system/render/FlxCameraView.hx create mode 100644 flixel/system/render/blit/FlxBlitView.hx create mode 100644 flixel/system/render/quad/FlxQuadView.hx diff --git a/flixel/FlxCamera.hx b/flixel/FlxCamera.hx index 94d7973df8..f1546839ba 100644 --- a/flixel/FlxCamera.hx +++ b/flixel/FlxCamera.hx @@ -1,5 +1,9 @@ package flixel; +import flixel.system.render.FlxCameraView; +import flixel.system.render.quad.FlxQuadView; +import flixel.system.render.blit.FlxBlitView; + import openfl.display.Bitmap; import openfl.display.BitmapData; import openfl.display.DisplayObject; @@ -98,6 +102,26 @@ class FlxCamera extends FlxBasic */ public var totalScaleY(default, null):Float; + /** + * Render view for this camera. + * All rendering related commands (like draw rectangle or fill camera view with specified color) are handled by this object. + */ + public var view(default, null):FlxCameraView; + + /** + * This camera's `view`, but typed as a `FlxQuadView`. + * + * **NOTE**: May be null depending on the render implementation used. + */ + public var viewQuad(default, null):Null; + + /** + * This camera's `view`, but typed as a `FlxBlitView`. + * + * **NOTE**: May be null depending on the render implementation used. + */ + public var viewBlit(default, null):Null; + /** * Tells the camera to use this following style. */ @@ -161,7 +185,8 @@ class FlxCamera extends FlxBasic * The actual `BitmapData` of the camera display itself. * Used in blit render mode, where you can manipulate its pixels for achieving some visual effects. */ - public var buffer:BitmapData; + @:deprecated("buffer is deprecated, avoid referencing it directly and use the methods from camera.view instead") + public var buffer(get, set):BitmapData; /** * The natural background color of the camera, in `AARRGGBB` format. Defaults to `FlxG.cameras.bgColor`. @@ -176,7 +201,8 @@ class FlxCamera extends FlxBasic * * **NOTE:** This field is only used in blit render mode. */ - public var screen:FlxSprite; + @:deprecated("screen is deprecated, avoid referencing it directly and use the methods from camera.view instead") + public var screen(get, set):FlxSprite; /** * Whether to use alpha blending for the camera's background fill or not. @@ -197,7 +223,8 @@ class FlxCamera extends FlxBasic * * Its position is modified by `updateFlashSpritePosition()` which is called every frame. */ - public var flashSprite:Sprite = new Sprite(); + @:deprecated("flashSprite is deprecated, avoid referencing it directly and use the methods from camera.view instead") + public var flashSprite(get, set):Sprite; /** * Whether the positions of the objects rendered on this camera are rounded. @@ -322,11 +349,13 @@ class FlxCamera extends FlxBasic * Helper matrix object. Used in blit render mode when camera's zoom is less than initialZoom * (it is applied to all objects rendered on the camera at such circumstances). */ + @:deprecated("depblit") var _blitMatrix:FlxMatrix = new FlxMatrix(); /** * Logical flag for tracking whether to apply _blitMatrix transformation to objects or not. */ + @:deprecated("depblit") var _useBlitMatrix:Bool = false; /** @@ -366,6 +395,7 @@ class FlxCamera extends FlxBasic * (the area of camera's buffer which should be filled with `bgColor`). * Do not modify it unless you know what are you doing. */ + @:deprecated("depblit") var _flashRect:Rectangle; /** @@ -373,6 +403,7 @@ class FlxCamera extends FlxBasic * Its coordinates are always `(0,0)`, where camera's buffer filling should start. * Do not modify it unless you know what are you doing. */ + @:deprecated("depblit") var _flashPoint:Point = new Point(); /** @@ -480,6 +511,7 @@ class FlxCamera extends FlxBasic * Internal helper variable for doing better wipes/fills between renders. * Used it blit render mode only (in `fill()` method). */ + @:deprecated("depblit") var _fill:BitmapData; /** @@ -488,6 +520,7 @@ class FlxCamera extends FlxBasic * Its position is modified by `updateInternalSpritePositions()`, which is called on camera's resize and scale events. * It is a child of the `_scrollRect` `Sprite`. */ + @:deprecated("depblit") var _flashBitmap:Bitmap; /** @@ -495,11 +528,13 @@ class FlxCamera extends FlxBasic * It is a child of `flashSprite`. * Its position is modified by `updateScrollRect()` method, which is called on camera's resize and scale events. */ - var _scrollRect:Sprite = new Sprite(); + @:deprecated("depshared") + var _scrollRect:Sprite; /** * Helper rect for `drawTriangles()` visibility checks */ + @:deprecated("depblit") var _bounds:FlxRect = FlxRect.get(); /** @@ -508,7 +543,8 @@ class FlxCamera extends FlxBasic * It is a child of `_scrollRect` `Sprite` (which trims graphics that should be invisible). * Its position is modified by `updateInternalSpritePositions()`, which is called on camera's resize and scale events. */ - public var canvas:Sprite; + @:deprecated("canvas is deprecated, avoid referencing it directly and use the methods from camera.view instead") + public var canvas(get, set):Sprite; #if FLX_DEBUG /** @@ -517,407 +553,162 @@ class FlxCamera extends FlxBasic * It is a child of `_scrollRect` `Sprite` (which trims graphics that should be invisible). * Its position is modified by `updateInternalSpritePositions()`, which is called on camera's resize and scale events. */ - public var debugLayer:Sprite; + @:deprecated("debugLayer is deprecated, avoid referencing it directly and use the methods from camera.view instead") + public var debugLayer(get, set):Sprite; #end + @:deprecated("depshared") var _helperMatrix:FlxMatrix = new FlxMatrix(); + @:deprecated("depblit") var _helperPoint:Point = new Point(); /** * Currently used draw stack item */ + @:deprecated("depquad") var _currentDrawItem:FlxDrawBaseItem; /** * Pointer to head of stack with draw items */ + @:deprecated("depquad") var _headOfDrawStack:FlxDrawBaseItem; /** * Last draw tiles item */ + @:deprecated("depquad") var _headTiles:FlxDrawItem; /** * Last draw triangles item */ + @:deprecated("depquad") var _headTriangles:FlxDrawTrianglesItem; /** * Draw tiles stack items that can be reused */ + @:deprecated("depquad") static var _storageTilesHead:FlxDrawItem; /** * Draw triangles stack items that can be reused */ + @:deprecated("depquad") static var _storageTrianglesHead:FlxDrawTrianglesItem; /** * Internal variable, used for visibility checks to minimize `drawTriangles()` calls. */ + @:deprecated("depblit") static var drawVertices:Vector = new Vector(); /** * Internal variable, used in blit render mode to render triangles (`drawTriangles()`) on camera's buffer. */ + @:deprecated("depblit") static var trianglesSprite:Sprite = new Sprite(); /** * Internal variables, used in blit render mode to draw trianglesSprite on camera's buffer. * Added for less garbage creation. */ + @:deprecated("depblit") static var renderPoint:FlxPoint = FlxPoint.get(); + @:deprecated("depblit") static var renderRect:FlxRect = FlxRect.get(); @:noCompletion public function startQuadBatch(graphic:FlxGraphic, colored:Bool, hasColorOffsets:Bool = false, ?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) - { - return _headTiles; - } - - if (_storageTilesHead != null) - { - itemToReturn = _storageTilesHead; - var newHead = _storageTilesHead.nextTyped; - itemToReturn.reset(); - _storageTilesHead = newHead; - } - else - { - itemToReturn = new FlxDrawItem(); - } - - // TODO: catch this error when the dev actually messes up, not in the draw phase - if (graphic.isDestroyed) - throw 'Cannot queue ${graphic.key}. This sprite was destroyed.'; - - itemToReturn.graphics = graphic; - itemToReturn.antialiasing = smooth; - itemToReturn.colored = colored; - itemToReturn.hasColorOffsets = hasColorOffsets; - itemToReturn.blending = blendInt; - itemToReturn.blend = blend; - itemToReturn.shader = shader; - - itemToReturn.nextTyped = _headTiles; - _headTiles = itemToReturn; - - if (_headOfDrawStack == null) - { - _headOfDrawStack = itemToReturn; - } - - if (_currentDrawItem != null) - { - _currentDrawItem.next = itemToReturn; - } - - _currentDrawItem = itemToReturn; - - return itemToReturn; - #end + return viewQuad.startQuadBatch(graphic, colored, hasColorOffsets, blend, smooth, shader); } @:noCompletion public function startTrianglesBatch(graphic:FlxGraphic, smoothing:Bool = false, isColored:Bool = false, ?blend:BlendMode, ?hasColorOffsets:Bool, ?shader:FlxShader):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 - #if !flash - && _headTriangles.hasColorOffsets == hasColorOffsets - && _headTriangles.shader == shader - #end - ) - { - return _headTriangles; - } - - return getNewDrawTrianglesItem(graphic, smoothing, isColored, blend, hasColorOffsets, shader); + return viewQuad.startTrianglesBatch(graphic, smoothing, isColored, blend, hasColorOffsets, shader); } @:noCompletion public function getNewDrawTrianglesItem(graphic:FlxGraphic, smoothing:Bool = false, isColored:Bool = false, ?blend:BlendMode, ?hasColorOffsets:Bool, ?shader:FlxShader):FlxDrawTrianglesItem { - var itemToReturn:FlxDrawTrianglesItem = null; - var blendInt:Int = FlxDrawBaseItem.blendToInt(blend); - - if (_storageTrianglesHead != null) - { - itemToReturn = _storageTrianglesHead; - var newHead:FlxDrawTrianglesItem = _storageTrianglesHead.nextTyped; - itemToReturn.reset(); - _storageTrianglesHead = newHead; - } - else - { - itemToReturn = new FlxDrawTrianglesItem(); - } - - itemToReturn.graphics = graphic; - itemToReturn.antialiasing = smoothing; - itemToReturn.colored = isColored; - itemToReturn.blending = blendInt; - itemToReturn.blend = blend; - #if !flash - itemToReturn.hasColorOffsets = hasColorOffsets; - itemToReturn.shader = shader; - #end - - itemToReturn.nextTyped = _headTriangles; - _headTriangles = itemToReturn; - - if (_headOfDrawStack == null) - { - _headOfDrawStack = itemToReturn; - } + return viewQuad.getNewDrawTrianglesItem(graphic, smoothing, isColored, blend, hasColorOffsets, shader); + } - if (_currentDrawItem != null) - { - _currentDrawItem.next = itemToReturn; - } + @:allow(flixel.system.frontEnds.CameraFrontEnd) + function clearDrawStack():Void + { + viewQuad.clearDrawStack(); + } - _currentDrawItem = itemToReturn; + @:allow(flixel.system.frontEnds.CameraFrontEnd) + inline function lock(?useBufferLocking:Bool):Void + { + view.lock(useBufferLocking); + } - return itemToReturn; + @:allow(flixel.system.frontEnds.CameraFrontEnd) + function render():Void + { + view.render(); } @:allow(flixel.system.frontEnds.CameraFrontEnd) - function clearDrawStack():Void + inline function unlock(?useBufferLocking:Bool):Void { - var currTiles = _headTiles; - var newTilesHead; + view.unlock(useBufferLocking); + } - while (currTiles != null) - { - newTilesHead = currTiles.nextTyped; - currTiles.reset(); - currTiles.nextTyped = _storageTilesHead; - _storageTilesHead = currTiles; - currTiles = newTilesHead; - } + public function beginDrawDebug():Void + { + view.beginDrawDebug(); + } - var currTriangles:FlxDrawTrianglesItem = _headTriangles; - var newTrianglesHead:FlxDrawTrianglesItem; + public function endDrawDebug(?matrix:FlxMatrix):Void + { + view.endDrawDebug(matrix); + } - while (currTriangles != null) - { - newTrianglesHead = currTriangles.nextTyped; - currTriangles.reset(); - currTriangles.nextTyped = _storageTrianglesHead; - _storageTrianglesHead = currTriangles; - currTriangles = newTrianglesHead; - } + public function drawDebugRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor, thickness:Float = 1.0):Void + { + view.drawDebugRect(x, y, width, height, color, thickness); + } - _currentDrawItem = null; - _headOfDrawStack = null; - _headTiles = null; - _headTriangles = null; + public function drawDebugFilledRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor):Void + { + view.drawDebugFilledRect(x, y, width, height, color); } - @:allow(flixel.system.frontEnds.CameraFrontEnd) - function render():Void + public function drawDebugCircle(x:Float, y:Float, radius:Float, color:FlxColor):Void { - var currItem:FlxDrawBaseItem = _headOfDrawStack; - while (currItem != null) - { - currItem.render(this); - currItem = currItem.next; - } + view.drawDebugCircle(x, y, radius, color); + } + + public function drawDebugLine(x1:Float, y1:Float, x2:Float, y2:Float, color:FlxColor, thickness:Float = 1.0):Void + { + view.drawDebugLine(x1, y1, x2, y2, color, thickness); } public function drawPixels(?frame:FlxFrame, ?pixels:BitmapData, matrix:FlxMatrix, ?transform:ColorTransform, ?blend:BlendMode, ?smoothing:Bool = false, ?shader:FlxShader):Void { - if (FlxG.renderBlit) - { - _helperMatrix.copyFrom(matrix); - - if (_useBlitMatrix) - { - _helperMatrix.concat(_blitMatrix); - buffer.draw(pixels, _helperMatrix, null, null, null, (smoothing || antialiasing)); - } - else - { - _helperMatrix.translate(-viewMarginLeft, -viewMarginTop); - buffer.draw(pixels, _helperMatrix, null, blend, null, (smoothing || antialiasing)); - } - } - else - { - var isColored = (transform != null #if !html5 && transform.hasRGBMultipliers() #end); - var hasColorOffsets:Bool = (transform != null && transform.hasRGBAOffsets()); - - #if FLX_RENDER_TRIANGLE - var drawItem:FlxDrawTrianglesItem = startTrianglesBatch(frame.parent, smoothing, isColored, blend); - #else - var drawItem = startQuadBatch(frame.parent, isColored, hasColorOffsets, blend, smoothing, shader); - #end - drawItem.addQuad(frame, matrix, transform); - } + view.drawPixels(frame, pixels, matrix, transform, blend, smoothing, shader); } public function copyPixels(?frame:FlxFrame, ?pixels:BitmapData, ?sourceRect:Rectangle, destPoint:Point, ?transform:ColorTransform, ?blend:BlendMode, ?smoothing:Bool = false, ?shader:FlxShader):Void { - if (FlxG.renderBlit) - { - if (pixels != null) - { - if (_useBlitMatrix) - { - _helperMatrix.identity(); - _helperMatrix.translate(destPoint.x, destPoint.y); - _helperMatrix.concat(_blitMatrix); - buffer.draw(pixels, _helperMatrix, null, null, null, (smoothing || antialiasing)); - } - else - { - _helperPoint.x = destPoint.x - Std.int(viewMarginLeft); - _helperPoint.y = destPoint.y - Std.int(viewMarginTop); - buffer.copyPixels(pixels, sourceRect, _helperPoint, null, null, true); - } - } - else if (frame != null) - { - // TODO: fix this case for zoom less than initial zoom... - frame.paint(buffer, destPoint, true); - } - } - else - { - _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()); - - #if !FLX_RENDER_TRIANGLE - var drawItem = startQuadBatch(frame.parent, isColored, hasColorOffsets, blend, smoothing, shader); - #else - var drawItem:FlxDrawTrianglesItem = startTrianglesBatch(frame.parent, smoothing, isColored, blend); - #end - drawItem.addQuad(frame, _helperMatrix, transform); - } + view.copyPixels(frame, pixels, sourceRect, destPoint, transform, blend, smoothing, shader); } public function drawTriangles(graphic:FlxGraphic, vertices:DrawData, indices:DrawData, uvtData:DrawData, ?colors:DrawData, ?position:FlxPoint, ?blend:BlendMode, repeat:Bool = false, smoothing:Bool = false, ?transform:ColorTransform, ?shader:FlxShader):Void { - if (FlxG.renderBlit) - { - if (position == null) - position = renderPoint.set(); - - _bounds.set(0, 0, width, height); - - var verticesLength:Int = vertices.length; - var currentVertexPosition:Int = 0; - - var tempX:Float, tempY:Float; - var i:Int = 0; - var bounds = renderRect.set(); - drawVertices.splice(0, drawVertices.length); - - while (i < verticesLength) - { - tempX = position.x + vertices[i]; - tempY = position.y + vertices[i + 1]; - - drawVertices[currentVertexPosition++] = tempX; - drawVertices[currentVertexPosition++] = tempY; - - if (i == 0) - { - bounds.set(tempX, tempY, 0, 0); - } - else - { - FlxDrawTrianglesItem.inflateBounds(bounds, tempX, tempY); - } - - i += 2; - } - - position.putWeak(); - - if (!_bounds.overlaps(bounds)) - { - drawVertices.splice(drawVertices.length - verticesLength, verticesLength); - } - else - { - trianglesSprite.graphics.clear(); - trianglesSprite.graphics.beginBitmapFill(graphic.bitmap, null, repeat, smoothing); - trianglesSprite.graphics.drawTriangles(drawVertices, indices, uvtData); - trianglesSprite.graphics.endFill(); - - // TODO: check this block of code for cases, when zoom < 1 (or initial zoom?)... - if (_useBlitMatrix) - _helperMatrix.copyFrom(_blitMatrix); - else - { - _helperMatrix.identity(); - _helperMatrix.translate(-viewMarginLeft, -viewMarginTop); - } - - buffer.draw(trianglesSprite, _helperMatrix); - #if FLX_DEBUG - if (FlxG.debugger.drawDebug) - { - var gfx:Graphics = FlxSpriteUtil.flashGfx; - gfx.clear(); - gfx.lineStyle(1, FlxColor.BLUE, 0.5); - gfx.drawTriangles(drawVertices, indices); - buffer.draw(FlxSpriteUtil.flashGfxSprite, _helperMatrix); - } - #end - // End of TODO... - } - - bounds.put(); - } - else - { - _bounds.set(0, 0, width, height); - 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, _bounds, transform); - #else - var drawItem:FlxDrawTrianglesItem = startTrianglesBatch(graphic, smoothing, isColored, blend); - drawItem.addTriangles(vertices, indices, uvtData, colors, position, _bounds); - #end - } + view.drawTriangles(graphic, vertices, indices, uvtData, colors, position, blend, repeat, smoothing, transform, shader); } /** @@ -925,22 +716,9 @@ class FlxCamera extends FlxBasic * @param rect rectangle to prepare for rendering * @return transformed rectangle with respect to camera's zoom factor */ - function transformRect(rect:FlxRect):FlxRect + inline function transformRect(rect:FlxRect):FlxRect { - if (FlxG.renderBlit) - { - rect.offset(-viewMarginLeft, -viewMarginTop); - - if (_useBlitMatrix) - { - rect.x *= zoom; - rect.y *= zoom; - rect.width *= zoom; - rect.height *= zoom; - } - } - - return rect; + return view.transformRect(rect); } /** @@ -948,17 +726,9 @@ class FlxCamera extends FlxBasic * @param point point to prepare for rendering * @return transformed point with respect to camera's zoom factor */ - function transformPoint(point:FlxPoint):FlxPoint + inline function transformPoint(point:FlxPoint):FlxPoint { - if (FlxG.renderBlit) - { - point.subtract(viewMarginLeft, viewMarginTop); - - if (_useBlitMatrix) - point.scale(zoom); - } - - return point; + return view.transformPoint(point); } /** @@ -968,10 +738,7 @@ class FlxCamera extends FlxBasic */ inline function transformVector(vector:FlxPoint):FlxPoint { - if (FlxG.renderBlit && _useBlitMatrix) - vector.scale(zoom); - - return vector; + return view.transformVector(vector); } /** @@ -981,18 +748,9 @@ class FlxCamera extends FlxBasic * @param object display object to apply transformations to. * @return transformed object. */ - function transformObject(object:DisplayObject):DisplayObject + inline function transformObject(object:DisplayObject):DisplayObject { - object.scaleX *= totalScaleX; - object.scaleY *= totalScaleY; - - object.x -= scroll.x * totalScaleX; - object.y -= scroll.y * totalScaleY; - - object.x -= 0.5 * width * (scaleX - initialZoom) * FlxG.scaleMode.scale.x; - object.y -= 0.5 * height * (scaleY - initialZoom) * FlxG.scaleMode.scale.y; - - return object; + return view.transformObject(object); } /** @@ -1023,34 +781,15 @@ class FlxCamera extends FlxBasic this.width = width; this.height = height; - _flashRect = new Rectangle(0, 0, width, height); - flashSprite.addChild(_scrollRect); - _scrollRect.scrollRect = new Rectangle(); + view = FlxCameraView.create(this); + if (view is FlxQuadView) + viewQuad = cast view; + else if (view is FlxBlitView) + viewBlit = cast view; pixelPerfectRender = FlxG.renderBlit; - if (FlxG.renderBlit) - { - screen = new FlxSprite(); - buffer = new BitmapData(width, height, true, 0); - screen.pixels = buffer; - screen.origin.set(); - _flashBitmap = new Bitmap(buffer); - _scrollRect.addChild(_flashBitmap); - _fill = new BitmapData(width, height, true, FlxColor.TRANSPARENT); - } - else - { - canvas = new Sprite(); - _scrollRect.addChild(canvas); - - #if FLX_DEBUG - debugLayer = new Sprite(); - _scrollRect.addChild(debugLayer); - #end - } - set_color(FlxColor.WHITE); // sets the scale of flash sprite, which in turn loads flashOffset values @@ -1069,42 +808,7 @@ class FlxCamera extends FlxBasic */ override public function destroy():Void { - FlxDestroyUtil.removeChild(flashSprite, _scrollRect); - - if (FlxG.renderBlit) - { - FlxDestroyUtil.removeChild(_scrollRect, _flashBitmap); - screen = FlxDestroyUtil.destroy(screen); - buffer = null; - _flashBitmap = null; - _fill = FlxDestroyUtil.dispose(_fill); - } - else - { - #if FLX_DEBUG - FlxDestroyUtil.removeChild(_scrollRect, debugLayer); - debugLayer = null; - #end - - FlxDestroyUtil.removeChild(_scrollRect, canvas); - if (canvas != null) - { - for (i in 0...canvas.numChildren) - { - canvas.removeChildAt(0); - } - canvas = null; - } - - if (_headOfDrawStack != null) - { - clearDrawStack(); - } - - _blitMatrix = null; - _helperMatrix = null; - _helperPoint = null; - } + view.destroy(); _bounds = null; scroll = FlxDestroyUtil.put(scroll); @@ -1112,10 +816,6 @@ class FlxCamera extends FlxBasic deadzone = FlxDestroyUtil.put(deadzone); target = null; - flashSprite = null; - _scrollRect = null; - _flashRect = null; - _flashPoint = null; _fxFlashComplete = null; _fxFadeComplete = null; _fxShakeComplete = null; @@ -1334,6 +1034,9 @@ class FlxCamera extends FlxBasic } else { + var offsetX:Float = 0; + var offsetY:Float = 0; + final pixelPerfect = pixelPerfectShake == null ? pixelPerfectRender : pixelPerfectShake; if (_fxShakeAxes.x) { @@ -1341,7 +1044,7 @@ class FlxCamera extends FlxBasic if (pixelPerfect) shakePixels = Math.round(shakePixels); - flashSprite.x += shakePixels * zoom * FlxG.scaleMode.scale.x; + offsetX = shakePixels * zoom * FlxG.scaleMode.scale.x; } if (_fxShakeAxes.y) @@ -1350,8 +1053,10 @@ class FlxCamera extends FlxBasic if (pixelPerfect) shakePixels = Math.round(shakePixels); - flashSprite.y += shakePixels * zoom * FlxG.scaleMode.scale.y; + offsetY = shakePixels * zoom * FlxG.scaleMode.scale.y; } + + view.offsetView(offsetX, offsetY); } } } @@ -1362,11 +1067,8 @@ class FlxCamera extends FlxBasic */ function updateFlashSpritePosition():Void { - if (flashSprite != null) - { - flashSprite.x = x * FlxG.scaleMode.scale.x + _flashOffset.x; - flashSprite.y = y * FlxG.scaleMode.scale.y + _flashOffset.y; - } + if (view != null) + view.updatePosition(); } /** @@ -1375,8 +1077,8 @@ class FlxCamera extends FlxBasic */ function updateFlashOffset():Void { - _flashOffset.x = width * 0.5 * FlxG.scaleMode.scale.x * initialZoom; - _flashOffset.y = height * 0.5 * FlxG.scaleMode.scale.y * initialZoom; + if (view != null) + view.updateOffset(); } /** @@ -1389,20 +1091,8 @@ class FlxCamera extends FlxBasic */ function updateScrollRect():Void { - var rect:Rectangle = (_scrollRect != null) ? _scrollRect.scrollRect : null; - - if (rect != null) - { - rect.x = rect.y = 0; - - rect.width = width * initialZoom * FlxG.scaleMode.scale.x; - rect.height = height * initialZoom * FlxG.scaleMode.scale.y; - - _scrollRect.scrollRect = rect; - - _scrollRect.x = -0.5 * rect.width; - _scrollRect.y = -0.5 * rect.height; - } + if (view != null) + view.updateScrollRect(); } /** @@ -1413,36 +1103,8 @@ class FlxCamera extends FlxBasic */ function updateInternalSpritePositions():Void { - if (FlxG.renderBlit) - { - if (_flashBitmap != null) - { - _flashBitmap.x = 0; - _flashBitmap.y = 0; - } - } - else - { - if (canvas != null) - { - canvas.x = -0.5 * width * (scaleX - initialZoom) * FlxG.scaleMode.scale.x; - canvas.y = -0.5 * height * (scaleY - initialZoom) * FlxG.scaleMode.scale.y; - - canvas.scaleX = totalScaleX; - canvas.scaleY = totalScaleY; - - #if FLX_DEBUG - if (debugLayer != null) - { - debugLayer.x = canvas.x; - debugLayer.y = canvas.y; - - debugLayer.scaleX = totalScaleX; - debugLayer.scaleY = totalScaleY; - } - #end - } - } + if (view != null) + view.updateInternals(); } /** @@ -1657,101 +1319,57 @@ class FlxCamera extends FlxBasic /** * Fill the camera with the specified color. * - * @param Color The color to fill with in `0xAARRGGBB` hex format. - * @param BlendAlpha Whether to blend the alpha value or just wipe the previous contents. Default is `true`. + * @param color The color to fill with in `0xAARRGGBB` hex format. + * @param blendAlpha Whether to blend the alpha value or just wipe the previous contents. Default is `true`. */ - public function fill(Color:FlxColor, BlendAlpha:Bool = true, FxAlpha:Float = 1.0, ?graphics:Graphics):Void + @:deprecated("The 4-arg fill(color, blendAlpha, fxAlpha, ?graphics) is deprecated, use the 2-arg fill(color, blendAlpha) instead.") + overload public inline extern function fill(color:FlxColor, blendAlpha:Bool = true, fxAlpha:Float = 1.0, ?graphics:Graphics):Void { - if (FlxG.renderBlit) - { - if (BlendAlpha) - { - _fill.fillRect(_flashRect, Color); - buffer.copyPixels(_fill, _flashRect, _flashPoint, null, null, BlendAlpha); - } - else - { - buffer.fillRect(_flashRect, Color); - } - } - else - { - if (FxAlpha == 0) - return; - - final targetGraphics = (graphics == null) ? canvas.graphics : graphics; + color.alphaFloat = fxAlpha; + view.fill(color, blendAlpha); + } - targetGraphics.overrideBlendMode(null); - targetGraphics.beginFill(Color, FxAlpha); - // i'm drawing rect with these parameters to avoid light lines at the top and left of the camera, - // which could appear while cameras fading - targetGraphics.drawRect(viewMarginLeft - 1, viewMarginTop - 1, viewWidth + 2, viewHeight + 2); - targetGraphics.endFill(); - } + /** + * Fill the camera with the specified color. + * + * @param color The color to fill with in `0xAARRGGBB` hex format. + * @param blendAlpha Whether to blend the alpha value or just wipe the previous contents. Default is `true`. + */ + overload public inline extern function fill(color:FlxColor, blendAlpha:Bool = true):Void + { + view.fill(color, blendAlpha); } /** * Internal helper function, handles the actual drawing of all the special effects. */ - @:allow(flixel.system.frontEnds.CameraFrontEnd) + @:allow(flixel.system.render.FlxCameraView) function drawFX():Void { // Draw the "flash" special effect onto the buffer if (_fxFlashAlpha > 0.0) { - if (FlxG.renderBlit) - { - var color = _fxFlashColor; - color.alphaFloat *= _fxFlashAlpha; - fill(color); - } - else - { - final alpha = _fxFlashColor.alphaFloat * _fxFlashAlpha; - fill(_fxFlashColor.rgb, true, alpha, canvas.graphics); - } + var color = _fxFlashColor; + color.alphaFloat *= _fxFlashAlpha; + view.fill(color); } // Draw the "fade" special effect onto the buffer if (_fxFadeAlpha > 0.0) { - if (FlxG.renderBlit) - { - var color = _fxFadeColor; - color.alphaFloat *= _fxFadeAlpha; - fill(color); - } - else - { - final alpha = _fxFadeColor.alphaFloat * _fxFadeAlpha; - fill(_fxFadeColor.rgb, true, alpha, canvas.graphics); - } + var color = _fxFadeColor; + color.alphaFloat *= _fxFadeAlpha; + view.fill(color); } } @:allow(flixel.system.frontEnds.CameraFrontEnd) function checkResize():Void { - if (FlxG.renderBlit) - { - if (width != buffer.width || height != buffer.height) - { - var oldBuffer:FlxGraphic = screen.graphic; - buffer = new BitmapData(width, height, true, 0); - screen.pixels = buffer; - screen.origin.set(); - _flashBitmap.bitmapData = buffer; - _flashRect.width = width; - _flashRect.height = height; - _fill = FlxDestroyUtil.dispose(_fill); - _fill = new BitmapData(width, height, true, FlxColor.TRANSPARENT); - FlxG.bitmap.removeIfNoUse(oldBuffer); - } - - updateBlitMatrix(); - } + view.checkResize(); } + @:deprecated("depblit") inline function updateBlitMatrix():Void { _blitMatrix.identity(); @@ -1838,24 +1456,7 @@ class FlxCamera extends FlxBasic totalScaleX = scaleX * FlxG.scaleMode.scale.x; totalScaleY = scaleY * FlxG.scaleMode.scale.y; - if (FlxG.renderBlit) - { - updateBlitMatrix(); - - if (_useBlitMatrix) - { - _flashBitmap.scaleX = initialZoom * FlxG.scaleMode.scale.x; - _flashBitmap.scaleY = initialZoom * FlxG.scaleMode.scale.y; - } - else - { - _flashBitmap.scaleX = totalScaleX; - _flashBitmap.scaleY = totalScaleY; - } - } - - calcMarginX(); - calcMarginY(); + view.updateScale(); updateScrollRect(); updateInternalSpritePositions(); @@ -1916,7 +1517,9 @@ class FlxCamera extends FlxBasic if (width != Value && Value > 0) { width = Value; - calcMarginX(); + + if (view != null) + view.calcMarginX(); updateFlashOffset(); updateScrollRect(); updateInternalSpritePositions(); @@ -1931,7 +1534,9 @@ class FlxCamera extends FlxBasic if (height != Value && Value > 0) { height = Value; - calcMarginY(); + + if (view != null) + view.calcMarginY(); updateFlashOffset(); updateScrollRect(); updateInternalSpritePositions(); @@ -1948,69 +1553,32 @@ class FlxCamera extends FlxBasic return zoom; } - function set_alpha(Alpha:Float):Float + function set_alpha(alpha:Float):Float { - alpha = FlxMath.bound(Alpha, 0, 1); - if (FlxG.renderBlit) - { - _flashBitmap.alpha = Alpha; - } - else - { - canvas.alpha = Alpha; - } - return Alpha; + this.alpha = FlxMath.bound(alpha, 0, 1); + view.alpha = alpha; + return alpha; } - function set_angle(Angle:Float):Float + function set_angle(angle:Float):Float { - angle = Angle; - flashSprite.rotation = Angle; - return Angle; + this.angle = angle; + view.angle = angle; + return angle; } - function set_color(Color:FlxColor):FlxColor + function set_color(color:FlxColor):FlxColor { - color = Color; - var colorTransform:ColorTransform; - - if (FlxG.renderBlit) - { - if (_flashBitmap == null) - { - return Color; - } - colorTransform = _flashBitmap.transform.colorTransform; - } - else - { - colorTransform = canvas.transform.colorTransform; - } - - colorTransform.redMultiplier = color.redFloat; - colorTransform.greenMultiplier = color.greenFloat; - colorTransform.blueMultiplier = color.blueFloat; - - if (FlxG.renderBlit) - { - _flashBitmap.transform.colorTransform = colorTransform; - } - else - { - canvas.transform.colorTransform = colorTransform; - } - - return Color; + this.color = color; + view.color = color; + return color; } - function set_antialiasing(Antialiasing:Bool):Bool + function set_antialiasing(antialiasing:Bool):Bool { - antialiasing = Antialiasing; - if (FlxG.renderBlit) - { - _flashBitmap.smoothing = Antialiasing; - } - return Antialiasing; + this.antialiasing = antialiasing; + view.antialiasing = antialiasing; + return antialiasing; } function set_x(x:Float):Float @@ -2029,21 +1597,20 @@ class FlxCamera extends FlxBasic override function set_visible(visible:Bool):Bool { - if (flashSprite != null) - { - flashSprite.visible = visible; - } + view.visible = visible; return this.visible = visible; } + @:deprecated("depshared") inline function calcMarginX():Void { - viewMarginX = 0.5 * width * (scaleX - initialZoom) / scaleX; + view.calcMarginX(); } + @:deprecated("depshared") inline function calcMarginY():Void { - viewMarginY = 0.5 * height * (scaleY - initialZoom) / scaleY; + view.calcMarginY(); } static inline function get_defaultCameras():Array @@ -2115,6 +1682,59 @@ class FlxCamera extends FlxBasic { return scroll.y + viewMarginBottom; } + + inline function set_flashSprite(value:Sprite):Sprite + { + var sprite = FlxG.renderTile ? viewQuad.flashSprite : viewBlit.flashSprite; + return sprite = value; + } + + inline function get_flashSprite():Sprite + { + return FlxG.renderTile ? viewQuad.flashSprite : viewBlit.flashSprite; + } + + inline function set_screen(value:FlxSprite):FlxSprite + { + return viewBlit.screen = value; + } + + inline function get_screen():FlxSprite + { + return viewBlit.screen; + } + + inline function set_buffer(value:BitmapData):BitmapData + { + return viewBlit.buffer = value; + } + + inline function get_buffer():BitmapData + { + return viewBlit.buffer; + } + + inline function set_canvas(value:Sprite):Sprite + { + return viewQuad.canvas = value; + } + + inline function get_canvas():Sprite + { + return viewQuad.canvas; + } + + #if FLX_DEBUG + inline function set_debugLayer(value:Sprite):Sprite + { + return viewQuad.debugLayer; + } + + inline function get_debugLayer():Sprite + { + return viewQuad.debugLayer; + } + #end /** * Do not use the following fields! They only exists because FlxCamera extends FlxBasic, @@ -2135,7 +1755,6 @@ class FlxCamera extends FlxBasic @:deprecated("don't reference camera.cameras") @:noCompletion override function set_cameras(value:Array):Array throw "don't reference camera.cameras"; - } enum FlxCameraFollowStyle diff --git a/flixel/FlxObject.hx b/flixel/FlxObject.hx index 756d23a498..f91fc082af 100644 --- a/flixel/FlxObject.hx +++ b/flixel/FlxObject.hx @@ -1289,23 +1289,25 @@ class FlxObject extends FlxBasic gfx.drawRect(rect.x + 0.5, rect.y + 0.5, rect.width - 1.0, rect.height - 1.0); } + @:deprecated("use object.beginDrawDebug(camera) is deprecated, camera.beginDrawDebug() instead") inline function beginDrawDebug(camera:FlxCamera):Graphics { + camera.beginDrawDebug(); + if (FlxG.renderBlit) { - FlxSpriteUtil.flashGfx.clear(); return FlxSpriteUtil.flashGfx; } else { - return camera.debugLayer.graphics; + return camera.viewQuad.debugLayer.graphics; } } + @:deprecated("use object.endDrawDebug(camera) is deprecated, camera.endDrawDebug() instead") inline function endDrawDebug(camera:FlxCamera) { - if (FlxG.renderBlit) - camera.buffer.draw(FlxSpriteUtil.flashGfxSprite); + camera.endDrawDebug(); } #end diff --git a/flixel/graphics/tile/FlxDrawQuadsItem.hx b/flixel/graphics/tile/FlxDrawQuadsItem.hx index 9b513a8106..93e1ced9ff 100644 --- a/flixel/graphics/tile/FlxDrawQuadsItem.hx +++ b/flixel/graphics/tile/FlxDrawQuadsItem.hx @@ -133,9 +133,9 @@ class FlxDrawQuadsItem extends FlxDrawBaseItem setParameterValue(shader.hasTransform, true); setParameterValue(shader.hasColorTransform, colored || hasColorOffsets); - camera.canvas.graphics.overrideBlendMode(blend); - camera.canvas.graphics.beginShaderFill(shader); - camera.canvas.graphics.drawQuads(rects, null, transforms); + camera.viewQuad.canvas.graphics.overrideBlendMode(blend); + camera.viewQuad.canvas.graphics.beginShaderFill(shader); + camera.viewQuad.canvas.graphics.drawQuads(rects, null, transforms); super.render(camera); } @@ -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..2367b4c1d2 100644 --- a/flixel/graphics/tile/FlxDrawTrianglesItem.hx +++ b/flixel/graphics/tile/FlxDrawTrianglesItem.hx @@ -79,15 +79,15 @@ class FlxDrawTrianglesItem extends FlxDrawBaseItem setParameterValue(shader.hasTransform, true); setParameterValue(shader.hasColorTransform, colored || hasColorOffsets); - camera.canvas.graphics.overrideBlendMode(blend); + camera.viewQuad.canvas.graphics.overrideBlendMode(blend); - camera.canvas.graphics.beginShaderFill(shader); + camera.viewQuad.canvas.graphics.beginShaderFill(shader); #else - camera.canvas.graphics.beginBitmapFill(graphics.bitmap, null, true, (camera.antialiasing || antialiasing)); + camera.viewQuad.canvas.graphics.beginBitmapFill(graphics.bitmap, null, true, (camera.antialiasing || antialiasing)); #end - camera.canvas.graphics.drawTriangles(vertices, indices, uvtData, TriangleCulling.NONE); - camera.canvas.graphics.endFill(); + camera.viewQuad.canvas.graphics.drawTriangles(vertices, indices, uvtData, TriangleCulling.NONE); + camera.viewQuad.canvas.graphics.endFill(); #if FLX_DEBUG if (FlxG.debugger.drawDebug) diff --git a/flixel/system/frontEnds/CameraFrontEnd.hx b/flixel/system/frontEnds/CameraFrontEnd.hx index 965d0eff3d..c334b6b849 100644 --- a/flixel/system/frontEnds/CameraFrontEnd.hx +++ b/flixel/system/frontEnds/CameraFrontEnd.hx @@ -64,7 +64,7 @@ class CameraFrontEnd */ public function add(NewCamera:T, DefaultDrawTarget:Bool = true):T { - FlxG.game.addChildAt(NewCamera.flashSprite, FlxG.game.getChildIndex(FlxG.game._inputContainer)); + FlxG.game.addChildAt(NewCamera.view.display, FlxG.game.getChildIndex(FlxG.game._inputContainer)); list.push(NewCamera); if (DefaultDrawTarget) @@ -97,8 +97,8 @@ class CameraFrontEnd if (position >= list.length) return add(newCamera); - final childIndex = FlxG.game.getChildIndex(list[position].flashSprite); - FlxG.game.addChildAt(newCamera.flashSprite, childIndex); + final childIndex = FlxG.game.getChildIndex(list[position].view.display); + FlxG.game.addChildAt(newCamera.view.display, childIndex); list.insert(position, newCamera); if (defaultDrawTarget) @@ -122,7 +122,7 @@ class CameraFrontEnd var index:Int = list.indexOf(Camera); if (Camera != null && index != -1) { - FlxG.game.removeChild(Camera.flashSprite); + FlxG.game.removeChild(Camera.view.display); list.splice(index, 1); defaults.remove(Camera); } @@ -257,39 +257,9 @@ class CameraFrontEnd { for (camera in list) { - if (camera == null || !camera.exists || !camera.visible) + if ((camera != null) && camera.exists && camera.visible) { - continue; - } - - if (FlxG.renderBlit) - { - camera.checkResize(); - - if (useBufferLocking) - { - camera.buffer.lock(); - } - } - - if (FlxG.renderTile) - { - camera.clearDrawStack(); - camera.canvas.graphics.clear(); - // Clearing camera's debug sprite - #if FLX_DEBUG - camera.debugLayer.graphics.clear(); - #end - } - - if (FlxG.renderBlit) - { - camera.fill(camera.bgColor, camera.useBgAlphaBlending); - camera.screen.dirty = true; - } - else - { - camera.fill(camera.bgColor.rgb, camera.useBgAlphaBlending, camera.bgColor.alphaFloat); + camera.lock(useBufferLocking); } } } @@ -317,21 +287,9 @@ class CameraFrontEnd { for (camera in list) { - if ((camera == null) || !camera.exists || !camera.visible) - { - continue; - } - - camera.drawFX(); - - if (FlxG.renderBlit) + if ((camera != null) && camera.exists && camera.visible) { - if (useBufferLocking) - { - camera.buffer.unlock(); - } - - camera.screen.dirty = true; + camera.unlock(useBufferLocking); } } } diff --git a/flixel/system/render/FlxCameraView.hx b/flixel/system/render/FlxCameraView.hx new file mode 100644 index 0000000000..6115ecc27f --- /dev/null +++ b/flixel/system/render/FlxCameraView.hx @@ -0,0 +1,378 @@ +package flixel.system.render; + +import flixel.math.FlxRect; +import openfl.display.DisplayObjectContainer; +import flixel.FlxG; +import flixel.FlxCamera; +import flixel.util.FlxDestroyUtil; +import flixel.graphics.FlxGraphic; +import flixel.system.FlxAssets.FlxShader; +import flixel.graphics.frames.FlxFrame; +import flixel.math.FlxPoint; +import flixel.math.FlxMatrix; +import flixel.graphics.tile.FlxDrawTrianglesItem.DrawData; +import flixel.util.FlxColor; +import openfl.filters.BitmapFilter; +import openfl.geom.ColorTransform; +import openfl.geom.Point; +import openfl.geom.Rectangle; +import openfl.display.BlendMode; +import openfl.display.DisplayObject; +import openfl.display.BitmapData; + +/** + * A `FlxCameraView` is the base class for all rendering functionality. + * It does not contain any rendering logic by itself, rather it is extended by the various renderer implementations. + */ +@:allow(flixel.FlxCamera) +class FlxCameraView implements IFlxDestroyable +{ + /** + * The number of total draw calls in a frame. + */ + public static var totalDrawCalls:Int = 0; + + /** + * Creates a `FlxCameraView` object tied to a camera, based on the target and project configuration. + * @param camera The camera to create the view for + */ + public static inline function create(camera:FlxCamera):FlxCameraView + { + if (FlxG.renderTile) + { + return cast new flixel.system.render.quad.FlxQuadView(camera); + } + else + { + return cast new flixel.system.render.blit.FlxBlitView(camera); + } + } + + /** + * Display object which is used as a container for all of the camera's graphics. + * This object is added to the display tree. + */ + public var display(get, never):DisplayObjectContainer; + + /** + * The parent camera for this view. + */ + public var camera(default, null):FlxCamera; + + /** + * The margin cut off on the left and right by the camera zooming in (or out), in world space. + */ + public var viewMarginX(default, null):Float; + + /** + * The margin cut off on the top and bottom by the camera zooming in (or out), in world space. + */ + public var viewMarginY(default, null):Float; + + /** + * The margin cut off on the left by the camera zooming in (or out), in world space. + */ + public var viewMarginLeft(get, never):Float; + + /** + * The margin cut off on the top by the camera zooming in (or out), in world space + */ + public var viewMarginTop(get, never):Float; + + /** + * The margin cut off on the right by the camera zooming in (or out), in world space + */ + public var viewMarginRight(get, never):Float; + + /** + * The margin cut off on the bottom by the camera zooming in (or out), in world space + */ + public var viewMarginBottom(get, never):Float; + + /** + * The size of the camera's view, in world space. + */ + public var viewWidth(get, never):Float; + + /** + * The size of the camera's view, in world space. + */ + public var viewHeight(get, never):Float; + + /** + * The left of the camera's view, in world space. + */ + public var viewX(get, never):Float; + + /** + * The top of the camera's view, in world space. + */ + public var viewY(get, never):Float; + + /** + * The left of the camera's view, in world space. + */ + public var viewLeft(get, never):Float; + + /** + * The top of the camera's view, in world space. + */ + public var viewTop(get, never):Float; + + /** + * The right side of the camera's view, in world space. + */ + public var viewRight(get, never):Float; + + /** + * The bottom side of the camera's view, in world space. + */ + public var viewBottom(get, never):Float; + + public var antialiasing(get, set):Bool; + public var angle(get, set):Float; + public var alpha(get, set):Float; + public var color(get, set):FlxColor; + public var visible(get, set):Bool; + public var filters:Array = []; + + var _flashOffset:FlxPoint = FlxPoint.get(); + + function new(camera:FlxCamera) + { + this.camera = camera; + } + + public function destroy():Void + { + _flashOffset = FlxDestroyUtil.put(_flashOffset); + } + + public function lock(?useBufferLocking:Bool):Void {} + + public function render():Void {} + + public function unlock(?useBufferLocking:Bool):Void {} + + public function drawPixels(?frame:FlxFrame, ?pixels:BitmapData, matrix:FlxMatrix, ?transform:ColorTransform, ?blend:BlendMode, smoothing:Bool = false, + ?shader:FlxShader):Void {} + + public function copyPixels(?frame:FlxFrame, ?pixels:BitmapData, ?sourceRect:Rectangle, destPoint:Point, ?transform:ColorTransform, ?blend:BlendMode, + smoothing:Bool = false, ?shader:FlxShader):Void {} + + public function drawTriangles(graphic:FlxGraphic, vertices:DrawData, indices:DrawData, uvtData:DrawData, ?colors:DrawData, + ?position:FlxPoint, ?blend:BlendMode, repeat:Bool = false, smoothing:Bool = false, ?transform:ColorTransform, ?shader:FlxShader):Void {} + + public function beginDrawDebug():Void {} + + public function endDrawDebug(?matrix:FlxMatrix):Void {} + + public function drawDebugRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor, thickness:Float = 1.0):Void {} + + public function drawDebugFilledRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor):Void {} + + public function drawDebugCircle(x:Float, y:Float, radius:Float, color:FlxColor):Void {} + + public function drawDebugLine(x1:Float, y1:Float, x2:Float, y2:Float, color:FlxColor, thickness:Float = 1.0):Void {} + + public function fill(color:FlxColor, blendAlpha:Bool = true):Void {} + + function drawFX():Void {} + + function updateScale():Void + { + calcMarginX(); + calcMarginY(); + } + + function updatePosition():Void {} + function updateInternals():Void {} + + function updateOffset():Void + { + _flashOffset.x = camera.width * 0.5 * FlxG.scaleMode.scale.x * camera.initialZoom; + _flashOffset.y = camera.height * 0.5 * FlxG.scaleMode.scale.y * camera.initialZoom; + } + + public function offsetView(x:Float, y:Float):Void {} + + function updateScrollRect():Void {} + + /** + * Helper method preparing debug rectangle for rendering in blit render mode + * @param rect rectangle to prepare for rendering + * @return transformed rectangle with respect to camera's zoom factor + */ + function transformRect(rect:FlxRect):FlxRect + { + return rect; + } + + /** + * Helper method preparing debug point for rendering in blit render mode (for debug path rendering, for example) + * @param point point to prepare for rendering + * @return transformed point with respect to camera's zoom factor + */ + function transformPoint(point:FlxPoint):FlxPoint + { + return point; + } + + /** + * Helper method preparing debug vectors (relative positions) for rendering in blit render mode + * @param vector relative position to prepare for rendering + * @return transformed vector with respect to camera's zoom factor + */ + function transformVector(vector:FlxPoint):FlxPoint + { + return vector; + } + + /** + * Helper method for applying transformations (scaling and offsets) + * to specified display objects which has been added to the camera display list. + * For example, debug sprite for nape debug rendering. + * @param object display object to apply transformations to. + * @return transformed object. + */ + function transformObject(object:DisplayObject):DisplayObject + { + object.scaleX *= camera.totalScaleX; + object.scaleY *= camera.totalScaleY; + + object.x -= camera.scroll.x * camera.totalScaleX; + object.y -= camera.scroll.y * camera.totalScaleY; + + object.x -= 0.5 * camera.width * (camera.scaleX - camera.initialZoom) * FlxG.scaleMode.scale.x; + object.y -= 0.5 * camera.height * (camera.scaleY - camera.initialZoom) * FlxG.scaleMode.scale.y; + + return object; + } + + function checkResize():Void {} + + public inline function calcMarginX():Void + { + viewMarginX = 0.5 * camera.width * (camera.scaleX - camera.initialZoom) / camera.scaleX; + } + + public inline function calcMarginY():Void + { + viewMarginY = 0.5 * camera.height * (camera.scaleY - camera.initialZoom) / camera.scaleY; + } + + inline function get_viewMarginLeft():Float + { + return viewMarginX; + } + + inline function get_viewMarginTop():Float + { + return viewMarginY; + } + + inline function get_viewMarginRight():Float + { + return camera.width - viewMarginX; + } + + inline function get_viewMarginBottom():Float + { + return camera.height - viewMarginY; + } + + inline function get_viewWidth():Float + { + return camera.width - viewMarginX * 2; + } + + inline function get_viewHeight():Float + { + return camera.height - viewMarginY * 2; + } + + inline function get_viewX():Float + { + return camera.scroll.x + viewMarginX; + } + + inline function get_viewY():Float + { + return camera.scroll.y + viewMarginY; + } + + inline function get_viewLeft():Float + { + return viewX; + } + + inline function get_viewTop():Float + { + return viewY; + } + + inline function get_viewRight():Float + { + return camera.scroll.x + viewMarginRight; + } + + inline function get_viewBottom():Float + { + return camera.scroll.y + viewMarginBottom; + } + + function get_display():DisplayObjectContainer + { + return null; + } + + function get_color():FlxColor + { + return camera.color; + } + + function set_color(color:FlxColor):FlxColor + { + return color; + } + + function get_antialiasing():Bool + { + return camera.antialiasing; + } + + function set_antialiasing(antialiasing:Bool):Bool + { + return antialiasing; + } + + function get_angle():Float + { + return camera.angle; + } + + function set_angle(angle:Float):Float + { + return angle; + } + + function get_visible():Bool + { + return camera.visible; + } + + function set_visible(visible:Bool):Bool + { + return visible; + } + + function get_alpha():Float + { + return camera.alpha; + } + + function set_alpha(alpha:Float):Float + { + return alpha; + } +} diff --git a/flixel/system/render/blit/FlxBlitView.hx b/flixel/system/render/blit/FlxBlitView.hx new file mode 100644 index 0000000000..a60834688a --- /dev/null +++ b/flixel/system/render/blit/FlxBlitView.hx @@ -0,0 +1,490 @@ +package flixel.system.render.blit; + +import flixel.math.FlxRect; +import openfl.display.Bitmap; +import openfl.display.DisplayObjectContainer; +import flixel.system.render.FlxCameraView; +import flixel.FlxG; +import flixel.FlxCamera; +import flixel.util.FlxDestroyUtil; +import flixel.graphics.FlxGraphic; +import flixel.system.FlxAssets.FlxShader; +import flixel.graphics.frames.FlxFrame; +import flixel.math.FlxPoint; +import flixel.math.FlxMatrix; +import flixel.graphics.tile.FlxDrawTrianglesItem; +import flixel.util.FlxColor; +import openfl.filters.BitmapFilter; +import openfl.geom.ColorTransform; +import openfl.geom.Point; +import openfl.geom.Rectangle; +import openfl.display.BlendMode; +import openfl.display.DisplayObject; +import openfl.display.BitmapData; +import openfl.display.Sprite; +import openfl.Vector; +import openfl.display.Graphics; +import flixel.util.FlxSpriteUtil; + +class FlxBlitView extends FlxCameraView +{ + /** + * Internal variable, used in blit render mode to render triangles (`drawTriangles()`) on camera's buffer. + */ + static var trianglesSprite:Sprite = new Sprite(); + + /** + * Internal variables, used in blit render mode to draw trianglesSprite on camera's buffer. + * Added for less garbage creation. + */ + static var renderPoint:FlxPoint = FlxPoint.get(); + + static var renderRect:FlxRect = FlxRect.get(); + + /** + * Internal variable, used for visibility checks to minimize `drawTriangles()` calls. + */ + static var drawVertices:Vector = new Vector(); + + /** + * Used to render buffer to screen space. + * NOTE: We don't recommend modifying this directly unless you are fairly experienced. + * Uses include 3D projection, advanced display list modification, and more. + * This is container for everything else that is used by camera and rendered to the camera. + * + * Its position is modified by `updateFlashSpritePosition()` which is called every frame. + */ + public var flashSprite:Sprite = new Sprite(); + + /** + * Sometimes it's easier to just work with a `FlxSprite`, than it is to work directly with the `BitmapData` buffer. + * This sprite reference will allow you to do exactly that. + * Basically, this sprite's `pixels` property is the camera's `BitmapData` buffer. + * + * **NOTE:** This field is only used in blit render mode. + */ + public var screen:FlxSprite; + + /** + * The actual `BitmapData` of the camera display itself. + * Used in blit render mode, where you can manipulate its pixels for achieving some visual effects. + */ + public var buffer:BitmapData; + + /** + * Internal sprite, used for correct trimming of camera viewport. + * It is a child of `flashSprite`. + * Its position is modified by `updateScrollRect()` method, which is called on camera's resize and scale events. + */ + var _scrollRect:Sprite = new Sprite(); + + /** + * Internal, used in blit render mode in camera's `fill()` method for less garbage creation. + * It represents the size of buffer `BitmapData` + * (the area of camera's buffer which should be filled with `bgColor`). + * Do not modify it unless you know what are you doing. + */ + var _flashRect:Rectangle; + + /** + * Internal, used in blit render mode in camera's `fill()` method for less garbage creation: + * Its coordinates are always `(0,0)`, where camera's buffer filling should start. + * Do not modify it unless you know what are you doing. + */ + var _flashPoint:Point = new Point(); + + /** + * Internal, used to render buffer to screen space. Used it blit render mode only. + * This Bitmap used for rendering camera's buffer (`_flashBitmap.bitmapData = buffer;`) + * Its position is modified by `updateInternalSpritePositions()`, which is called on camera's resize and scale events. + * It is a child of the `_scrollRect` `Sprite`. + */ + var _flashBitmap:Bitmap; + + /** + * Internal helper variable for doing better wipes/fills between renders. + * Used it blit render mode only (in `fill()` method). + */ + var _fill:BitmapData; + + /** + * Helper rect for `drawTriangles()` visibility checks + */ + var _bounds:FlxRect = FlxRect.get(); + + /** + * Logical flag for tracking whether to apply _blitMatrix transformation to objects or not. + */ + var _useBlitMatrix:Bool = false; + + /** + * Helper matrix object. Used in blit render mode when camera's zoom is less than initialZoom + * (it is applied to all objects rendered on the camera at such circumstances). + */ + var _blitMatrix:FlxMatrix = new FlxMatrix(); + + var _helperMatrix:FlxMatrix = new FlxMatrix(); + var _helperPoint:Point = new Point(); + + @:allow(flixel.system.render.FlxCameraView) + function new(camera:FlxCamera) + { + super(camera); + + flashSprite.addChild(_scrollRect); + _scrollRect.scrollRect = new Rectangle(); + + _flashRect = new Rectangle(0, 0, camera.width, camera.height); + + screen = new FlxSprite(); + buffer = new BitmapData(camera.width, camera.height, true, 0); + screen.pixels = buffer; + screen.origin.set(); + _flashBitmap = new Bitmap(buffer); + _scrollRect.addChild(_flashBitmap); + _fill = new BitmapData(camera.width, camera.height, true, FlxColor.TRANSPARENT); + } + + override function destroy():Void + { + super.destroy(); + + FlxDestroyUtil.removeChild(flashSprite, _scrollRect); + FlxDestroyUtil.removeChild(_scrollRect, _flashBitmap); + screen = FlxDestroyUtil.destroy(screen); + buffer = null; + _flashBitmap = null; + _fill = FlxDestroyUtil.dispose(_fill); + flashSprite = null; + _scrollRect = null; + _flashRect = null; + _flashPoint = null; + } + + override function lock(?useBufferLocking:Bool) + { + checkResize(); + + if (useBufferLocking) + { + buffer.lock(); + } + + fill(camera.bgColor, camera.useBgAlphaBlending); + screen.dirty = true; + } + + override function unlock(?useBufferLocking:Bool):Void + { + camera.drawFX(); + + if (useBufferLocking) + { + buffer.unlock(); + } + + screen.dirty = true; + } + + override function beginDrawDebug():Void + { + FlxSpriteUtil.flashGfx.clear(); + } + + override function endDrawDebug(?matrix:FlxMatrix):Void + { + buffer.draw(FlxSpriteUtil.flashGfxSprite); + } + + override function drawPixels(?frame:FlxFrame, ?pixels:BitmapData, matrix:FlxMatrix, ?transform:ColorTransform, ?blend:BlendMode, smoothing:Bool = false, ?shader:FlxShader):Void + { + _helperMatrix.copyFrom(matrix); + + if (_useBlitMatrix) + { + _helperMatrix.concat(_blitMatrix); + buffer.draw(pixels, _helperMatrix, null, null, null, (smoothing || antialiasing)); + } + else + { + _helperMatrix.translate(-viewMarginLeft, -viewMarginTop); + buffer.draw(pixels, _helperMatrix, null, blend, null, (smoothing || antialiasing)); + } + } + + override function copyPixels(?frame:FlxFrame, ?pixels:BitmapData, ?sourceRect:Rectangle, destPoint:Point, ?transform:ColorTransform, ?blend:BlendMode, smoothing:Bool = false, ?shader:FlxShader) + { + if (pixels != null) + { + if (_useBlitMatrix) + { + _helperMatrix.identity(); + _helperMatrix.translate(destPoint.x, destPoint.y); + _helperMatrix.concat(_blitMatrix); + buffer.draw(pixels, _helperMatrix, null, null, null, (smoothing || antialiasing)); + } + else + { + _helperPoint.x = destPoint.x - Std.int(viewMarginLeft); + _helperPoint.y = destPoint.y - Std.int(viewMarginTop); + buffer.copyPixels(pixels, sourceRect, _helperPoint, null, null, true); + } + } + else if (frame != null) + { + // TODO: fix this case for zoom less than initial zoom... + frame.paint(buffer, destPoint, true); + } + } + + override function drawTriangles(graphic:FlxGraphic, vertices:DrawData, indices:DrawData, uvtData:DrawData, ?colors:DrawData, + ?position:FlxPoint, ?blend:BlendMode, repeat:Bool = false, smoothing:Bool = false, ?transform:ColorTransform, ?shader:FlxShader) + { + if (position == null) + position = renderPoint.set(); + + _bounds.set(0, 0, camera.width, camera.height); + + var verticesLength:Int = vertices.length; + var currentVertexPosition:Int = 0; + + var tempX:Float, tempY:Float; + var i:Int = 0; + var bounds = renderRect.set(); + drawVertices.splice(0, drawVertices.length); + + while (i < verticesLength) + { + tempX = position.x + vertices[i]; + tempY = position.y + vertices[i + 1]; + + drawVertices[currentVertexPosition++] = tempX; + drawVertices[currentVertexPosition++] = tempY; + + if (i == 0) + { + bounds.set(tempX, tempY, 0, 0); + } + else + { + FlxDrawTrianglesItem.inflateBounds(bounds, tempX, tempY); + } + + i += 2; + } + + position.putWeak(); + + if (!_bounds.overlaps(bounds)) + { + drawVertices.splice(drawVertices.length - verticesLength, verticesLength); + } + else + { + trianglesSprite.graphics.clear(); + trianglesSprite.graphics.beginBitmapFill(graphic.bitmap, null, repeat, smoothing); + trianglesSprite.graphics.drawTriangles(drawVertices, indices, uvtData); + trianglesSprite.graphics.endFill(); + + // TODO: check this block of code for cases, when zoom < 1 (or initial zoom?)... + if (_useBlitMatrix) + _helperMatrix.copyFrom(_blitMatrix); + else + { + _helperMatrix.identity(); + _helperMatrix.translate(-viewMarginLeft, -viewMarginTop); + } + + buffer.draw(trianglesSprite, _helperMatrix); + #if FLX_DEBUG + if (FlxG.debugger.drawDebug) + { + var gfx:Graphics = FlxSpriteUtil.flashGfx; + gfx.clear(); + gfx.lineStyle(1, FlxColor.BLUE, 0.5); + gfx.drawTriangles(drawVertices, indices); + buffer.draw(FlxSpriteUtil.flashGfxSprite, _helperMatrix); + } + #end + // End of TODO... + } + + bounds.put(); + } + + override function fill(color:FlxColor, blendAlpha:Bool = true) + { + if (blendAlpha) + { + _fill.fillRect(_flashRect, color); + buffer.copyPixels(_fill, _flashRect, _flashPoint, null, null, blendAlpha); + } + else + { + buffer.fillRect(_flashRect, color); + } + } + + override function offsetView(x:Float, y:Float):Void + { + flashSprite.x += x; + flashSprite.y += y; + } + + override function updatePosition():Void + { + if (flashSprite != null) + { + flashSprite.x = camera.x * FlxG.scaleMode.scale.x + _flashOffset.x; + flashSprite.y = camera.y * FlxG.scaleMode.scale.y + _flashOffset.y; + } + } + + override function updateScrollRect():Void + { + var rect:Rectangle = (_scrollRect != null) ? _scrollRect.scrollRect : null; + + if (rect != null) + { + rect.x = rect.y = 0; + + rect.width = camera.width * camera.initialZoom * FlxG.scaleMode.scale.x; + rect.height = camera.height * camera.initialZoom * FlxG.scaleMode.scale.y; + + _scrollRect.scrollRect = rect; + + _scrollRect.x = -0.5 * rect.width; + _scrollRect.y = -0.5 * rect.height; + } + } + + override function updateScale():Void + { + updateBlitMatrix(); + + if (_useBlitMatrix) + { + _flashBitmap.scaleX = camera.initialZoom * FlxG.scaleMode.scale.x; + _flashBitmap.scaleY = camera.initialZoom * FlxG.scaleMode.scale.y; + } + else + { + _flashBitmap.scaleX = camera.totalScaleX; + _flashBitmap.scaleY = camera.totalScaleY; + } + + super.updateScale(); + } + + override function updateInternals():Void + { + if (_flashBitmap != null) + { + _flashBitmap.x = 0; + _flashBitmap.y = 0; + } + } + + override function checkResize() + { + if (camera.width != buffer.width || camera.height != buffer.height) + { + var oldBuffer:FlxGraphic = screen.graphic; + buffer = new BitmapData(camera.width, camera.height, true, 0); + screen.pixels = buffer; + screen.origin.set(); + _flashBitmap.bitmapData = buffer; + _flashRect.width = camera.width; + _flashRect.height = camera.height; + _fill = FlxDestroyUtil.dispose(_fill); + _fill = new BitmapData(camera.width, camera.height, true, FlxColor.TRANSPARENT); + FlxG.bitmap.removeIfNoUse(oldBuffer); + } + + updateBlitMatrix(); + } + + inline function updateBlitMatrix():Void + { + _blitMatrix.identity(); + _blitMatrix.translate(-viewMarginLeft, -viewMarginTop); + _blitMatrix.scale(camera.scaleX, camera.scaleY); + + _useBlitMatrix = (camera.scaleX < camera.initialZoom) || (camera.scaleY < camera.initialZoom); + } + + override function transformRect(rect:FlxRect):FlxRect + { + rect.offset(-viewMarginLeft, -viewMarginTop); + + if (_useBlitMatrix) + { + rect.x *= camera.zoom; + rect.y *= camera.zoom; + rect.width *= camera.zoom; + rect.height *= camera.zoom; + } + + return rect; + } + + override function transformPoint(point:FlxPoint):FlxPoint + { + point.subtract(viewMarginLeft, viewMarginTop); + + if (_useBlitMatrix) + point.scale(camera.zoom); + + return point; + } + + override function transformVector(vector:FlxPoint):FlxPoint + { + if (_useBlitMatrix) + vector.scale(camera.zoom); + + return vector; + } + + override function get_display():DisplayObjectContainer + { + return flashSprite; + } + + override function set_color(color:FlxColor):FlxColor + { + if (_flashBitmap != null) + { + final colorTransform:ColorTransform = _flashBitmap.transform.colorTransform; + + colorTransform.redMultiplier = color.redFloat; + colorTransform.greenMultiplier = color.greenFloat; + colorTransform.blueMultiplier = color.blueFloat; + + _flashBitmap.transform.colorTransform = colorTransform; + } + + return color; + } + + override function set_antialiasing(antialiasing:Bool):Bool + { + return _flashBitmap.smoothing = antialiasing; + } + + override function set_alpha(alpha:Float):Float + { + return _flashBitmap.alpha = alpha; + } + + override function set_angle(angle:Float):Float + { + return flashSprite.rotation = angle; + } + + override function set_visible(visible:Bool):Bool + { + flashSprite.visible = visible; + return visible; + } +} diff --git a/flixel/system/render/quad/FlxQuadView.hx b/flixel/system/render/quad/FlxQuadView.hx new file mode 100644 index 0000000000..78d580cbf8 --- /dev/null +++ b/flixel/system/render/quad/FlxQuadView.hx @@ -0,0 +1,497 @@ +package flixel.system.render.quad; + +import flixel.math.FlxRect; +import openfl.display.DisplayObjectContainer; +import flixel.system.render.FlxCameraView; +import flixel.FlxG; +import flixel.FlxCamera; +import flixel.util.FlxDestroyUtil; +import flixel.graphics.FlxGraphic; +import flixel.system.FlxAssets.FlxShader; +import flixel.graphics.frames.FlxFrame; +import flixel.math.FlxPoint; +import flixel.math.FlxMatrix; +import flixel.graphics.tile.FlxDrawBaseItem; +import flixel.graphics.tile.FlxDrawQuadsItem; +import flixel.graphics.tile.FlxDrawTrianglesItem; +import flixel.util.FlxColor; +import openfl.filters.BitmapFilter; +import openfl.geom.ColorTransform; +import openfl.geom.Point; +import openfl.geom.Rectangle; +import openfl.display.BlendMode; +import openfl.display.DisplayObject; +import openfl.display.BitmapData; +import openfl.display.Sprite; + +using flixel.util.FlxColorTransformUtil; + +private typedef FlxDrawItem = flixel.graphics.tile.FlxDrawQuadsItem; + +class FlxQuadView extends FlxCameraView +{ + /** + * Sprite used for actual rendering in tile render mode (instead of `_flashBitmap` for blitting). + * Its graphics is used as a drawing surface for `drawTriangles()` and `drawTiles()` methods. + * It is a child of `_scrollRect` `Sprite` (which trims graphics that should be invisible). + * Its position is modified by `updateInternalSpritePositions()`, which is called on camera's resize and scale events. + */ + public var canvas:Sprite; + + #if FLX_DEBUG + /** + * Sprite for visual effects (flash and fade) and drawDebug information + * (bounding boxes are drawn on it) for tile render mode. + * It is a child of `_scrollRect` `Sprite` (which trims graphics that should be invisible). + * Its position is modified by `updateInternalSpritePositions()`, which is called on camera's resize and scale events. + */ + public var debugLayer:Sprite; + #end + + /** + * Used to render buffer to screen space. + * NOTE: We don't recommend modifying this directly unless you are fairly experienced. + * Uses include 3D projection, advanced display list modification, and more. + * This is container for everything else that is used by camera and rendered to the camera. + * + * Its position is modified by `updateFlashSpritePosition()` which is called every frame. + */ + public var flashSprite:Sprite = new Sprite(); + + /** + * Internal sprite, used for correct trimming of camera viewport. + * It is a child of `flashSprite`. + * Its position is modified by `updateScrollRect()` method, which is called on camera's resize and scale events. + */ + var _scrollRect:Sprite = new Sprite(); + + /** + * Helper rect for `drawTriangles()` visibility checks + */ + var _bounds:FlxRect = FlxRect.get(); + + var _helperMatrix:FlxMatrix = new FlxMatrix(); + + @:allow(flixel.system.render.FlxCameraView) + function new(camera:FlxCamera) + { + super(camera); + + flashSprite.addChild(_scrollRect); + _scrollRect.scrollRect = new Rectangle(); + + canvas = new Sprite(); + _scrollRect.addChild(canvas); + + #if FLX_DEBUG + debugLayer = new Sprite(); + _scrollRect.addChild(debugLayer); + #end + } + + override function destroy():Void + { + super.destroy(); + + FlxDestroyUtil.removeChild(flashSprite, _scrollRect); + #if FLX_DEBUG + FlxDestroyUtil.removeChild(_scrollRect, debugLayer); + debugLayer = null; + #end + + FlxDestroyUtil.removeChild(_scrollRect, canvas); + if (canvas != null) + { + for (i in 0...canvas.numChildren) + { + canvas.removeChildAt(0); + } + canvas = null; + } + + if (_headOfDrawStack != null) + { + clearDrawStack(); + } + + flashSprite = null; + _scrollRect = null; + _helperMatrix = null; + } + + override function lock(?useBufferLocking:Bool):Void + { + clearDrawStack(); + + canvas.graphics.clear(); + // Clearing camera's debug sprite + #if FLX_DEBUG + debugLayer.graphics.clear(); + #end + + fill(camera.bgColor, camera.useBgAlphaBlending); + } + + override function render():Void + { + flashSprite.filters = camera.filtersEnabled ? filters : null; + + var currItem:FlxDrawBaseItem = _headOfDrawStack; + while (currItem != null) + { + currItem.render(camera); + currItem = currItem.next; + } + } + + override function unlock(?useBufferLocking:Bool):Void + { + camera.drawFX(); + } + + override function drawPixels(?frame:FlxFrame, ?pixels:BitmapData, matrix:FlxMatrix, ?transform:ColorTransform, ?blend:BlendMode, smoothing:Bool = false, ?shader:FlxShader) + { + var isColored = (transform != null #if !html5 && transform.hasRGBMultipliers() #end); + var hasColorOffsets:Bool = (transform != null && transform.hasRGBAOffsets()); + + #if FLX_RENDER_TRIANGLE + final drawItem:FlxDrawTrianglesItem = startTrianglesBatch(frame.parent, smoothing, isColored, blend, hasColorOffsets, shader); + #else + final drawItem:FlxDrawQuadsItem = startQuadBatch(frame.parent, isColored, hasColorOffsets, blend, smoothing, shader); + #end + drawItem.addQuad(frame, matrix, transform); + } + + override function copyPixels(?frame:FlxFrame, ?pixels:BitmapData, ?sourceRect:Rectangle, destPoint:Point, ?transform:ColorTransform, ?blend:BlendMode, smoothing:Bool = false, ?shader:FlxShader) + { + _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()); + + #if !FLX_RENDER_TRIANGLE + var drawItem = startQuadBatch(frame.parent, isColored, hasColorOffsets, blend, smoothing, shader); + #else + var drawItem:FlxDrawTrianglesItem = startTrianglesBatch(frame.parent, smoothing, isColored, blend); + #end + drawItem.addQuad(frame, _helperMatrix, transform); + } + + override function drawTriangles(graphic:FlxGraphic, vertices:DrawData, indices:DrawData, uvtData:DrawData, ?colors:DrawData, ?position:FlxPoint, ?blend:BlendMode, repeat:Bool = false, smoothing:Bool = false, ?transform:ColorTransform, ?shader:FlxShader) + { + _bounds.set(0, 0, camera.width, camera.height); + 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, _bounds, transform); + #else + var drawItem:FlxDrawTrianglesItem = startTrianglesBatch(graphic, smoothing, isColored, blend); + drawItem.addTriangles(vertices, indices, uvtData, colors, position, _bounds); + #end + } + + override function fill(color:FlxColor, blendAlpha:Bool = true):Void + { + if (color.alpha == 0) + return; + + canvas.graphics.overrideBlendMode(null); + canvas.graphics.beginFill(color.rgb, color.alphaFloat); + // i'm drawing rect with these parameters to avoid light lines at the top and left of the camera, + // which could appear while cameras fading + canvas.graphics.drawRect(viewMarginLeft - 1, viewMarginTop - 1, viewWidth + 2, viewHeight + 2); + canvas.graphics.endFill(); + } + + override function offsetView(x:Float, y:Float):Void + { + flashSprite.x += x; + flashSprite.y += y; + } + + override function updatePosition():Void + { + if (flashSprite != null) + { + flashSprite.x = camera.x * FlxG.scaleMode.scale.x + _flashOffset.x; + flashSprite.y = camera.y * FlxG.scaleMode.scale.y + _flashOffset.y; + } + } + + override function updateScrollRect():Void + { + var rect:Rectangle = (_scrollRect != null) ? _scrollRect.scrollRect : null; + + if (rect != null) + { + rect.x = rect.y = 0; + + rect.width = camera.width * camera.initialZoom * FlxG.scaleMode.scale.x; + rect.height = camera.height * camera.initialZoom * FlxG.scaleMode.scale.y; + + _scrollRect.scrollRect = rect; + + _scrollRect.x = -0.5 * rect.width; + _scrollRect.y = -0.5 * rect.height; + } + } + + override function updateInternals():Void + { + if (canvas != null) + { + canvas.x = -0.5 * camera.width * (camera.scaleX - camera.initialZoom) * FlxG.scaleMode.scale.x; + canvas.y = -0.5 * camera.height * (camera.scaleY - camera.initialZoom) * FlxG.scaleMode.scale.y; + + canvas.scaleX = camera.totalScaleX; + canvas.scaleY = camera.totalScaleY; + + #if FLX_DEBUG + if (debugLayer != null) + { + debugLayer.x = canvas.x; + debugLayer.y = canvas.y; + + debugLayer.scaleX = camera.totalScaleX; + debugLayer.scaleY = camera.totalScaleY; + } + #end + } + } + + override function set_color(color:FlxColor):FlxColor + { + final colorTransform:ColorTransform = canvas.transform.colorTransform; + + colorTransform.redMultiplier = color.redFloat; + colorTransform.greenMultiplier = color.greenFloat; + colorTransform.blueMultiplier = color.blueFloat; + + canvas.transform.colorTransform = colorTransform; + + return color; + } + + override function set_alpha(alpha:Float):Float + { + return canvas.alpha = alpha; + } + + override function set_angle(angle:Float):Float + { + return flashSprite.rotation = angle; + } + + override function set_visible(visible:Bool):Bool + { + flashSprite.visible = visible; + return visible; + } + + override function get_display():DisplayObjectContainer + { + return flashSprite; + } + + /** + * Currently used draw stack item + */ + var _currentDrawItem:FlxDrawBaseItem; + + /** + * Pointer to head of stack with draw items + */ + var _headOfDrawStack:FlxDrawBaseItem; + + /** + * Last draw tiles item + */ + var _headTiles:FlxDrawItem; + + /** + * Last draw triangles item + */ + var _headTriangles:FlxDrawTrianglesItem; + + /** + * Draw tiles stack items that can be reused + */ + static var _storageTilesHead:FlxDrawItem; + + /** + * Draw triangles stack items that can be reused + */ + static var _storageTrianglesHead:FlxDrawTrianglesItem; + + @:noCompletion + public function startQuadBatch(graphic:FlxGraphic, colored:Bool, hasColorOffsets:Bool = false, ?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) + { + return _headTiles; + } + + if (_storageTilesHead != null) + { + itemToReturn = _storageTilesHead; + var newHead = _storageTilesHead.nextTyped; + itemToReturn.reset(); + _storageTilesHead = newHead; + } + else + { + itemToReturn = new FlxDrawItem(); + } + + // TODO: catch this error when the dev actually messes up, not in the draw phase + if (graphic.isDestroyed) + throw 'Cannot queue ${graphic.key}. This sprite was destroyed.'; + + itemToReturn.graphics = graphic; + itemToReturn.antialiasing = smooth; + itemToReturn.colored = colored; + itemToReturn.hasColorOffsets = hasColorOffsets; + itemToReturn.blending = blendInt; + itemToReturn.blend = blend; + itemToReturn.shader = shader; + + itemToReturn.nextTyped = _headTiles; + _headTiles = itemToReturn; + + if (_headOfDrawStack == null) + { + _headOfDrawStack = itemToReturn; + } + + if (_currentDrawItem != null) + { + _currentDrawItem.next = itemToReturn; + } + + _currentDrawItem = itemToReturn; + + return itemToReturn; + #end + } + + @:noCompletion + public function startTrianglesBatch(graphic:FlxGraphic, smoothing:Bool = false, isColored:Bool = false, ?blend:BlendMode, ?hasColorOffsets:Bool, ?shader:FlxShader):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 + #if !flash + && _headTriangles.hasColorOffsets == hasColorOffsets + && _headTriangles.shader == shader + #end + ) + { + return _headTriangles; + } + + return getNewDrawTrianglesItem(graphic, smoothing, isColored, blend, hasColorOffsets, shader); + } + + @:noCompletion + public function getNewDrawTrianglesItem(graphic:FlxGraphic, smoothing:Bool = false, isColored:Bool = false, ?blend:BlendMode, ?hasColorOffsets:Bool, ?shader:FlxShader):FlxDrawTrianglesItem + { + var itemToReturn:FlxDrawTrianglesItem = null; + var blendInt:Int = FlxDrawBaseItem.blendToInt(blend); + + if (_storageTrianglesHead != null) + { + itemToReturn = _storageTrianglesHead; + var newHead:FlxDrawTrianglesItem = _storageTrianglesHead.nextTyped; + itemToReturn.reset(); + _storageTrianglesHead = newHead; + } + else + { + itemToReturn = new FlxDrawTrianglesItem(); + } + + itemToReturn.graphics = graphic; + itemToReturn.antialiasing = smoothing; + itemToReturn.colored = isColored; + itemToReturn.blending = blendInt; + itemToReturn.blend = blend; + #if !flash + itemToReturn.hasColorOffsets = hasColorOffsets; + itemToReturn.shader = shader; + #end + + itemToReturn.nextTyped = _headTriangles; + _headTriangles = itemToReturn; + + if (_headOfDrawStack == null) + { + _headOfDrawStack = itemToReturn; + } + + if (_currentDrawItem != null) + { + _currentDrawItem.next = itemToReturn; + } + + _currentDrawItem = itemToReturn; + + return itemToReturn; + } + + @:noCompletion + public function clearDrawStack():Void + { + var currTiles = _headTiles; + var newTilesHead; + + while (currTiles != null) + { + newTilesHead = currTiles.nextTyped; + currTiles.reset(); + currTiles.nextTyped = _storageTilesHead; + _storageTilesHead = currTiles; + currTiles = newTilesHead; + } + + var currTriangles:FlxDrawTrianglesItem = _headTriangles; + var newTrianglesHead:FlxDrawTrianglesItem; + + while (currTriangles != null) + { + newTrianglesHead = currTriangles.nextTyped; + currTriangles.reset(); + currTriangles.nextTyped = _storageTrianglesHead; + _storageTrianglesHead = currTriangles; + currTriangles = newTrianglesHead; + } + + _currentDrawItem = null; + _headOfDrawStack = null; + _headTiles = null; + _headTriangles = null; + } +} From 1b1a5a06967b52bc5cd2d509654ec76fe5d5e1e5 Mon Sep 17 00:00:00 2001 From: ACrazyTown <47027981+ACrazyTown@users.noreply.github.com> Date: Tue, 23 Dec 2025 13:18:29 +0100 Subject: [PATCH 02/28] merge some fixes from upstream cus im dumb and on an old branch!! --- flixel/system/render/blit/FlxBlitView.hx | 14 ++++--- flixel/system/render/quad/FlxQuadView.hx | 50 +++++++----------------- 2 files changed, 22 insertions(+), 42 deletions(-) diff --git a/flixel/system/render/blit/FlxBlitView.hx b/flixel/system/render/blit/FlxBlitView.hx index a60834688a..1988abc9e5 100644 --- a/flixel/system/render/blit/FlxBlitView.hx +++ b/flixel/system/render/blit/FlxBlitView.hx @@ -139,7 +139,7 @@ class FlxBlitView extends FlxCameraView screen = new FlxSprite(); buffer = new BitmapData(camera.width, camera.height, true, 0); screen.pixels = buffer; - screen.origin.set(); + screen.origin.zero(); _flashBitmap = new Bitmap(buffer); _scrollRect.addChild(_flashBitmap); _fill = new BitmapData(camera.width, camera.height, true, FlxColor.TRANSPARENT); @@ -159,6 +159,7 @@ class FlxBlitView extends FlxCameraView _scrollRect = null; _flashRect = null; _flashPoint = null; + _bounds = FlxDestroyUtil.put(_bounds); } override function lock(?useBufferLocking:Bool) @@ -240,11 +241,11 @@ class FlxBlitView extends FlxCameraView override function drawTriangles(graphic:FlxGraphic, vertices:DrawData, indices:DrawData, uvtData:DrawData, ?colors:DrawData, ?position:FlxPoint, ?blend:BlendMode, repeat:Bool = false, smoothing:Bool = false, ?transform:ColorTransform, ?shader:FlxShader) { + final cameraBounds = _bounds.set(viewMarginLeft, viewMarginTop, viewWidth, viewHeight); + if (position == null) position = renderPoint.set(); - _bounds.set(0, 0, camera.width, camera.height); - var verticesLength:Int = vertices.length; var currentVertexPosition:Int = 0; @@ -275,7 +276,7 @@ class FlxBlitView extends FlxCameraView position.putWeak(); - if (!_bounds.overlaps(bounds)) + if (!cameraBounds.overlaps(bounds)) { drawVertices.splice(drawVertices.length - verticesLength, verticesLength); } @@ -295,7 +296,8 @@ class FlxBlitView extends FlxCameraView _helperMatrix.translate(-viewMarginLeft, -viewMarginTop); } - buffer.draw(trianglesSprite, _helperMatrix); + buffer.draw(trianglesSprite, _helperMatrix, transform); + #if FLX_DEBUG if (FlxG.debugger.drawDebug) { @@ -392,7 +394,7 @@ class FlxBlitView extends FlxCameraView var oldBuffer:FlxGraphic = screen.graphic; buffer = new BitmapData(camera.width, camera.height, true, 0); screen.pixels = buffer; - screen.origin.set(); + screen.origin.zero(); _flashBitmap.bitmapData = buffer; _flashRect.width = camera.width; _flashRect.height = camera.height; diff --git a/flixel/system/render/quad/FlxQuadView.hx b/flixel/system/render/quad/FlxQuadView.hx index 78d580cbf8..35df206c18 100644 --- a/flixel/system/render/quad/FlxQuadView.hx +++ b/flixel/system/render/quad/FlxQuadView.hx @@ -26,8 +26,6 @@ import openfl.display.Sprite; using flixel.util.FlxColorTransformUtil; -private typedef FlxDrawItem = flixel.graphics.tile.FlxDrawQuadsItem; - class FlxQuadView extends FlxCameraView { /** @@ -117,6 +115,7 @@ class FlxQuadView extends FlxCameraView flashSprite = null; _scrollRect = null; _helperMatrix = null; + _bounds = FlxDestroyUtil.put(_bounds); } override function lock(?useBufferLocking:Bool):Void @@ -170,35 +169,27 @@ class FlxQuadView extends FlxCameraView var isColored = (transform != null && transform.hasRGBMultipliers()); var hasColorOffsets:Bool = (transform != null && transform.hasRGBAOffsets()); - #if !FLX_RENDER_TRIANGLE - var drawItem = startQuadBatch(frame.parent, isColored, hasColorOffsets, blend, smoothing, shader); + #if FLX_RENDER_TRIANGLE + final drawItem:FlxDrawTrianglesItem = startTrianglesBatch(frame.parent, smoothing, isColored, blend, hasColorOffsets, shader); #else - var drawItem:FlxDrawTrianglesItem = startTrianglesBatch(frame.parent, smoothing, isColored, blend); + final drawItem:FlxDrawQuadsItem = startQuadBatch(frame.parent, isColored, hasColorOffsets, blend, smoothing, shader); #end drawItem.addQuad(frame, _helperMatrix, transform); } override function drawTriangles(graphic:FlxGraphic, vertices:DrawData, indices:DrawData, uvtData:DrawData, ?colors:DrawData, ?position:FlxPoint, ?blend:BlendMode, repeat:Bool = false, smoothing:Bool = false, ?transform:ColorTransform, ?shader:FlxShader) { - _bounds.set(0, 0, camera.width, camera.height); - var isColored:Bool = (colors != null && colors.length != 0); + final cameraBounds = _bounds.set(viewMarginLeft, viewMarginTop, viewWidth, viewHeight); - #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, _bounds, transform); - #else - var drawItem:FlxDrawTrianglesItem = startTrianglesBatch(graphic, smoothing, isColored, blend); - drawItem.addTriangles(vertices, indices, uvtData, colors, position, _bounds); - #end + final isColored = (colors != null && colors.length != 0) || (transform != null && transform.hasRGBMultipliers()); + final hasColorOffsets = (transform != null && transform.hasRGBAOffsets()); + + final drawItem = startTrianglesBatch(graphic, smoothing, isColored, blend, hasColorOffsets, shader); + drawItem.addTriangles(vertices, indices, uvtData, colors, position, cameraBounds, transform); } override function fill(color:FlxColor, blendAlpha:Bool = true):Void { - if (color.alpha == 0) - return; - canvas.graphics.overrideBlendMode(null); canvas.graphics.beginFill(color.rgb, color.alphaFloat); // i'm drawing rect with these parameters to avoid light lines at the top and left of the camera, @@ -310,7 +301,7 @@ class FlxQuadView extends FlxCameraView /** * Last draw tiles item */ - var _headTiles:FlxDrawItem; + var _headTiles:FlxDrawQuadsItem; /** * Last draw triangles item @@ -320,7 +311,7 @@ class FlxQuadView extends FlxCameraView /** * Draw tiles stack items that can be reused */ - static var _storageTilesHead:FlxDrawItem; + static var _storageTilesHead:FlxDrawQuadsItem; /** * Draw triangles stack items that can be reused @@ -334,14 +325,12 @@ class FlxQuadView extends FlxCameraView 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) @@ -358,7 +347,7 @@ class FlxQuadView extends FlxCameraView } else { - itemToReturn = new FlxDrawItem(); + itemToReturn = new FlxDrawQuadsItem(); } // TODO: catch this error when the dev actually messes up, not in the draw phase @@ -369,7 +358,6 @@ class FlxQuadView extends FlxCameraView itemToReturn.antialiasing = smooth; itemToReturn.colored = colored; itemToReturn.hasColorOffsets = hasColorOffsets; - itemToReturn.blending = blendInt; itemToReturn.blend = blend; itemToReturn.shader = shader; @@ -395,20 +383,14 @@ class FlxQuadView extends FlxCameraView @:noCompletion public function startTrianglesBatch(graphic:FlxGraphic, smoothing:Bool = false, isColored:Bool = false, ?blend:BlendMode, ?hasColorOffsets:Bool, ?shader:FlxShader):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 - #if !flash && _headTriangles.hasColorOffsets == hasColorOffsets - && _headTriangles.shader == shader - #end - ) + && _headTriangles.shader == shader) { return _headTriangles; } @@ -420,7 +402,6 @@ class FlxQuadView extends FlxCameraView public function getNewDrawTrianglesItem(graphic:FlxGraphic, smoothing:Bool = false, isColored:Bool = false, ?blend:BlendMode, ?hasColorOffsets:Bool, ?shader:FlxShader):FlxDrawTrianglesItem { var itemToReturn:FlxDrawTrianglesItem = null; - var blendInt:Int = FlxDrawBaseItem.blendToInt(blend); if (_storageTrianglesHead != null) { @@ -437,12 +418,9 @@ class FlxQuadView extends FlxCameraView itemToReturn.graphics = graphic; itemToReturn.antialiasing = smoothing; itemToReturn.colored = isColored; - itemToReturn.blending = blendInt; itemToReturn.blend = blend; - #if !flash itemToReturn.hasColorOffsets = hasColorOffsets; itemToReturn.shader = shader; - #end itemToReturn.nextTyped = _headTriangles; _headTriangles = itemToReturn; From 66c64bdc0909fbcac297490922d3e3b1ee907481 Mon Sep 17 00:00:00 2001 From: ACrazyTown <47027981+ACrazyTown@users.noreply.github.com> Date: Tue, 23 Dec 2025 13:18:48 +0100 Subject: [PATCH 03/28] formatting --- flixel/system/render/FlxCameraView.hx | 259 +++++---- flixel/system/render/blit/FlxBlitView.hx | 712 ++++++++++++----------- flixel/system/render/quad/FlxQuadView.hx | 363 ++++++------ 3 files changed, 671 insertions(+), 663 deletions(-) diff --git a/flixel/system/render/FlxCameraView.hx b/flixel/system/render/FlxCameraView.hx index 6115ecc27f..e70383fbd5 100644 --- a/flixel/system/render/FlxCameraView.hx +++ b/flixel/system/render/FlxCameraView.hx @@ -27,178 +27,179 @@ import openfl.display.BitmapData; @:allow(flixel.FlxCamera) class FlxCameraView implements IFlxDestroyable { - /** - * The number of total draw calls in a frame. - */ - public static var totalDrawCalls:Int = 0; - - /** - * Creates a `FlxCameraView` object tied to a camera, based on the target and project configuration. - * @param camera The camera to create the view for - */ - public static inline function create(camera:FlxCamera):FlxCameraView - { - if (FlxG.renderTile) - { - return cast new flixel.system.render.quad.FlxQuadView(camera); - } - else - { - return cast new flixel.system.render.blit.FlxBlitView(camera); - } - } - - /** + /** + * The number of total draw calls in a frame. + */ + public static var totalDrawCalls:Int = 0; + + /** + * Creates a `FlxCameraView` object tied to a camera, based on the target and project configuration. + * @param camera The camera to create the view for + */ + public static inline function create(camera:FlxCamera):FlxCameraView + { + if (FlxG.renderTile) + { + return cast new flixel.system.render.quad.FlxQuadView(camera); + } + else + { + return cast new flixel.system.render.blit.FlxBlitView(camera); + } + } + + /** * Display object which is used as a container for all of the camera's graphics. * This object is added to the display tree. */ - public var display(get, never):DisplayObjectContainer; - - /** - * The parent camera for this view. - */ - public var camera(default, null):FlxCamera; - - /** + public var display(get, never):DisplayObjectContainer; + + /** + * The parent camera for this view. + */ + public var camera(default, null):FlxCamera; + + /** * The margin cut off on the left and right by the camera zooming in (or out), in world space. */ public var viewMarginX(default, null):Float; - + /** * The margin cut off on the top and bottom by the camera zooming in (or out), in world space. */ public var viewMarginY(default, null):Float; - + /** * The margin cut off on the left by the camera zooming in (or out), in world space. */ public var viewMarginLeft(get, never):Float; - + /** * The margin cut off on the top by the camera zooming in (or out), in world space */ public var viewMarginTop(get, never):Float; - + /** * The margin cut off on the right by the camera zooming in (or out), in world space */ public var viewMarginRight(get, never):Float; - + /** * The margin cut off on the bottom by the camera zooming in (or out), in world space */ public var viewMarginBottom(get, never):Float; - + /** * The size of the camera's view, in world space. */ public var viewWidth(get, never):Float; - + /** * The size of the camera's view, in world space. */ public var viewHeight(get, never):Float; - + /** * The left of the camera's view, in world space. */ public var viewX(get, never):Float; - + /** * The top of the camera's view, in world space. */ public var viewY(get, never):Float; - + /** * The left of the camera's view, in world space. */ public var viewLeft(get, never):Float; - + /** * The top of the camera's view, in world space. */ public var viewTop(get, never):Float; - + /** * The right side of the camera's view, in world space. */ public var viewRight(get, never):Float; - + /** * The bottom side of the camera's view, in world space. */ public var viewBottom(get, never):Float; - - public var antialiasing(get, set):Bool; + + public var antialiasing(get, set):Bool; public var angle(get, set):Float; public var alpha(get, set):Float; public var color(get, set):FlxColor; public var visible(get, set):Bool; public var filters:Array = []; - - var _flashOffset:FlxPoint = FlxPoint.get(); - - function new(camera:FlxCamera) - { - this.camera = camera; - } - - public function destroy():Void - { - _flashOffset = FlxDestroyUtil.put(_flashOffset); - } - - public function lock(?useBufferLocking:Bool):Void {} - + + var _flashOffset:FlxPoint = FlxPoint.get(); + + function new(camera:FlxCamera) + { + this.camera = camera; + } + + public function destroy():Void + { + _flashOffset = FlxDestroyUtil.put(_flashOffset); + } + + public function lock(?useBufferLocking:Bool):Void {} + public function render():Void {} - - public function unlock(?useBufferLocking:Bool):Void {} - + + public function unlock(?useBufferLocking:Bool):Void {} + public function drawPixels(?frame:FlxFrame, ?pixels:BitmapData, matrix:FlxMatrix, ?transform:ColorTransform, ?blend:BlendMode, smoothing:Bool = false, - ?shader:FlxShader):Void {} - + ?shader:FlxShader):Void {} + public function copyPixels(?frame:FlxFrame, ?pixels:BitmapData, ?sourceRect:Rectangle, destPoint:Point, ?transform:ColorTransform, ?blend:BlendMode, - smoothing:Bool = false, ?shader:FlxShader):Void {} - + smoothing:Bool = false, ?shader:FlxShader):Void {} + public function drawTriangles(graphic:FlxGraphic, vertices:DrawData, indices:DrawData, uvtData:DrawData, ?colors:DrawData, - ?position:FlxPoint, ?blend:BlendMode, repeat:Bool = false, smoothing:Bool = false, ?transform:ColorTransform, ?shader:FlxShader):Void {} - + ?position:FlxPoint, ?blend:BlendMode, repeat:Bool = false, smoothing:Bool = false, ?transform:ColorTransform, ?shader:FlxShader):Void {} + public function beginDrawDebug():Void {} - + public function endDrawDebug(?matrix:FlxMatrix):Void {} - + public function drawDebugRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor, thickness:Float = 1.0):Void {} - + public function drawDebugFilledRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor):Void {} - + public function drawDebugCircle(x:Float, y:Float, radius:Float, color:FlxColor):Void {} - + public function drawDebugLine(x1:Float, y1:Float, x2:Float, y2:Float, color:FlxColor, thickness:Float = 1.0):Void {} - - public function fill(color:FlxColor, blendAlpha:Bool = true):Void {} - + + public function fill(color:FlxColor, blendAlpha:Bool = true):Void {} + function drawFX():Void {} - - function updateScale():Void + + function updateScale():Void { calcMarginX(); calcMarginY(); } - + function updatePosition():Void {} + function updateInternals():Void {} - - function updateOffset():Void + + function updateOffset():Void { _flashOffset.x = camera.width * 0.5 * FlxG.scaleMode.scale.x * camera.initialZoom; _flashOffset.y = camera.height * 0.5 * FlxG.scaleMode.scale.y * camera.initialZoom; } - + public function offsetView(x:Float, y:Float):Void {} - + function updateScrollRect():Void {} - - /** + + /** * Helper method preparing debug rectangle for rendering in blit render mode * @param rect rectangle to prepare for rendering * @return transformed rectangle with respect to camera's zoom factor @@ -207,7 +208,7 @@ class FlxCameraView implements IFlxDestroyable { return rect; } - + /** * Helper method preparing debug point for rendering in blit render mode (for debug path rendering, for example) * @param point point to prepare for rendering @@ -217,7 +218,7 @@ class FlxCameraView implements IFlxDestroyable { return point; } - + /** * Helper method preparing debug vectors (relative positions) for rendering in blit render mode * @param vector relative position to prepare for rendering @@ -227,7 +228,7 @@ class FlxCameraView implements IFlxDestroyable { return vector; } - + /** * Helper method for applying transformations (scaling and offsets) * to specified display objects which has been added to the camera display list. @@ -239,28 +240,28 @@ class FlxCameraView implements IFlxDestroyable { object.scaleX *= camera.totalScaleX; object.scaleY *= camera.totalScaleY; - + object.x -= camera.scroll.x * camera.totalScaleX; object.y -= camera.scroll.y * camera.totalScaleY; - + object.x -= 0.5 * camera.width * (camera.scaleX - camera.initialZoom) * FlxG.scaleMode.scale.x; object.y -= 0.5 * camera.height * (camera.scaleY - camera.initialZoom) * FlxG.scaleMode.scale.y; - + return object; } - - function checkResize():Void {} - - public inline function calcMarginX():Void + + function checkResize():Void {} + + public inline function calcMarginX():Void { viewMarginX = 0.5 * camera.width * (camera.scaleX - camera.initialZoom) / camera.scaleX; } - + public inline function calcMarginY():Void { viewMarginY = 0.5 * camera.height * (camera.scaleY - camera.initialZoom) / camera.scaleY; } - + inline function get_viewMarginLeft():Float { return viewMarginX; @@ -320,33 +321,33 @@ class FlxCameraView implements IFlxDestroyable { return camera.scroll.y + viewMarginBottom; } - - function get_display():DisplayObjectContainer - { - return null; - } - - function get_color():FlxColor - { - return camera.color; - } - - function set_color(color:FlxColor):FlxColor - { - return color; - } - - function get_antialiasing():Bool - { - return camera.antialiasing; - } - - function set_antialiasing(antialiasing:Bool):Bool - { - return antialiasing; - } - - function get_angle():Float + + function get_display():DisplayObjectContainer + { + return null; + } + + function get_color():FlxColor + { + return camera.color; + } + + function set_color(color:FlxColor):FlxColor + { + return color; + } + + function get_antialiasing():Bool + { + return camera.antialiasing; + } + + function set_antialiasing(antialiasing:Bool):Bool + { + return antialiasing; + } + + function get_angle():Float { return camera.angle; } @@ -355,8 +356,8 @@ class FlxCameraView implements IFlxDestroyable { return angle; } - - function get_visible():Bool + + function get_visible():Bool { return camera.visible; } @@ -365,8 +366,8 @@ class FlxCameraView implements IFlxDestroyable { return visible; } - - function get_alpha():Float + + function get_alpha():Float { return camera.alpha; } diff --git a/flixel/system/render/blit/FlxBlitView.hx b/flixel/system/render/blit/FlxBlitView.hx index 1988abc9e5..c1d5b15e43 100644 --- a/flixel/system/render/blit/FlxBlitView.hx +++ b/flixel/system/render/blit/FlxBlitView.hx @@ -28,25 +28,25 @@ import flixel.util.FlxSpriteUtil; class FlxBlitView extends FlxCameraView { - /** + /** * Internal variable, used in blit render mode to render triangles (`drawTriangles()`) on camera's buffer. */ static var trianglesSprite:Sprite = new Sprite(); - - /** + + /** * Internal variables, used in blit render mode to draw trianglesSprite on camera's buffer. * Added for less garbage creation. */ static var renderPoint:FlxPoint = FlxPoint.get(); - + static var renderRect:FlxRect = FlxRect.get(); - - /** + + /** * Internal variable, used for visibility checks to minimize `drawTriangles()` calls. */ static var drawVertices:Vector = new Vector(); - - /** + + /** * Used to render buffer to screen space. * NOTE: We don't recommend modifying this directly unless you are fairly experienced. * Uses include 3D projection, advanced display list modification, and more. @@ -55,8 +55,8 @@ class FlxBlitView extends FlxCameraView * Its position is modified by `updateFlashSpritePosition()` which is called every frame. */ public var flashSprite:Sprite = new Sprite(); - - /** + + /** * Sometimes it's easier to just work with a `FlxSprite`, than it is to work directly with the `BitmapData` buffer. * This sprite reference will allow you to do exactly that. * Basically, this sprite's `pixels` property is the camera's `BitmapData` buffer. @@ -64,429 +64,431 @@ class FlxBlitView extends FlxCameraView * **NOTE:** This field is only used in blit render mode. */ public var screen:FlxSprite; - - /** + + /** * The actual `BitmapData` of the camera display itself. * Used in blit render mode, where you can manipulate its pixels for achieving some visual effects. */ public var buffer:BitmapData; - - /** + + /** * Internal sprite, used for correct trimming of camera viewport. * It is a child of `flashSprite`. * Its position is modified by `updateScrollRect()` method, which is called on camera's resize and scale events. */ var _scrollRect:Sprite = new Sprite(); - - /** + + /** * Internal, used in blit render mode in camera's `fill()` method for less garbage creation. * It represents the size of buffer `BitmapData` * (the area of camera's buffer which should be filled with `bgColor`). * Do not modify it unless you know what are you doing. */ var _flashRect:Rectangle; - + /** * Internal, used in blit render mode in camera's `fill()` method for less garbage creation: * Its coordinates are always `(0,0)`, where camera's buffer filling should start. * Do not modify it unless you know what are you doing. */ var _flashPoint:Point = new Point(); - - /** + + /** * Internal, used to render buffer to screen space. Used it blit render mode only. * This Bitmap used for rendering camera's buffer (`_flashBitmap.bitmapData = buffer;`) * Its position is modified by `updateInternalSpritePositions()`, which is called on camera's resize and scale events. * It is a child of the `_scrollRect` `Sprite`. */ var _flashBitmap:Bitmap; - - /** + + /** * Internal helper variable for doing better wipes/fills between renders. * Used it blit render mode only (in `fill()` method). */ var _fill:BitmapData; - - /** + + /** * Helper rect for `drawTriangles()` visibility checks */ var _bounds:FlxRect = FlxRect.get(); - - /** + + /** * Logical flag for tracking whether to apply _blitMatrix transformation to objects or not. */ - var _useBlitMatrix:Bool = false; - - /** + var _useBlitMatrix:Bool = false; + + /** * Helper matrix object. Used in blit render mode when camera's zoom is less than initialZoom * (it is applied to all objects rendered on the camera at such circumstances). */ var _blitMatrix:FlxMatrix = new FlxMatrix(); - - var _helperMatrix:FlxMatrix = new FlxMatrix(); + + var _helperMatrix:FlxMatrix = new FlxMatrix(); var _helperPoint:Point = new Point(); - - @:allow(flixel.system.render.FlxCameraView) - function new(camera:FlxCamera) - { - super(camera); - - flashSprite.addChild(_scrollRect); - _scrollRect.scrollRect = new Rectangle(); - - _flashRect = new Rectangle(0, 0, camera.width, camera.height); - - screen = new FlxSprite(); - buffer = new BitmapData(camera.width, camera.height, true, 0); - screen.pixels = buffer; - screen.origin.zero(); - _flashBitmap = new Bitmap(buffer); - _scrollRect.addChild(_flashBitmap); - _fill = new BitmapData(camera.width, camera.height, true, FlxColor.TRANSPARENT); - } - - override function destroy():Void - { - super.destroy(); - - FlxDestroyUtil.removeChild(flashSprite, _scrollRect); - FlxDestroyUtil.removeChild(_scrollRect, _flashBitmap); - screen = FlxDestroyUtil.destroy(screen); - buffer = null; - _flashBitmap = null; - _fill = FlxDestroyUtil.dispose(_fill); - flashSprite = null; + + @:allow(flixel.system.render.FlxCameraView) + function new(camera:FlxCamera) + { + super(camera); + + flashSprite.addChild(_scrollRect); + _scrollRect.scrollRect = new Rectangle(); + + _flashRect = new Rectangle(0, 0, camera.width, camera.height); + + screen = new FlxSprite(); + buffer = new BitmapData(camera.width, camera.height, true, 0); + screen.pixels = buffer; + screen.origin.zero(); + _flashBitmap = new Bitmap(buffer); + _scrollRect.addChild(_flashBitmap); + _fill = new BitmapData(camera.width, camera.height, true, FlxColor.TRANSPARENT); + } + + override function destroy():Void + { + super.destroy(); + + FlxDestroyUtil.removeChild(flashSprite, _scrollRect); + FlxDestroyUtil.removeChild(_scrollRect, _flashBitmap); + screen = FlxDestroyUtil.destroy(screen); + buffer = null; + _flashBitmap = null; + _fill = FlxDestroyUtil.dispose(_fill); + flashSprite = null; _scrollRect = null; _flashRect = null; _flashPoint = null; - _bounds = FlxDestroyUtil.put(_bounds); - } - - override function lock(?useBufferLocking:Bool) - { - checkResize(); - - if (useBufferLocking) - { - buffer.lock(); - } - - fill(camera.bgColor, camera.useBgAlphaBlending); - screen.dirty = true; - } - - override function unlock(?useBufferLocking:Bool):Void - { - camera.drawFX(); - - if (useBufferLocking) - { - buffer.unlock(); - } - - screen.dirty = true; - } - - override function beginDrawDebug():Void - { - FlxSpriteUtil.flashGfx.clear(); - } - - override function endDrawDebug(?matrix:FlxMatrix):Void - { - buffer.draw(FlxSpriteUtil.flashGfxSprite); - } - - override function drawPixels(?frame:FlxFrame, ?pixels:BitmapData, matrix:FlxMatrix, ?transform:ColorTransform, ?blend:BlendMode, smoothing:Bool = false, ?shader:FlxShader):Void - { - _helperMatrix.copyFrom(matrix); - - if (_useBlitMatrix) - { - _helperMatrix.concat(_blitMatrix); - buffer.draw(pixels, _helperMatrix, null, null, null, (smoothing || antialiasing)); - } - else - { - _helperMatrix.translate(-viewMarginLeft, -viewMarginTop); - buffer.draw(pixels, _helperMatrix, null, blend, null, (smoothing || antialiasing)); - } - } - - override function copyPixels(?frame:FlxFrame, ?pixels:BitmapData, ?sourceRect:Rectangle, destPoint:Point, ?transform:ColorTransform, ?blend:BlendMode, smoothing:Bool = false, ?shader:FlxShader) - { - if (pixels != null) - { - if (_useBlitMatrix) - { - _helperMatrix.identity(); - _helperMatrix.translate(destPoint.x, destPoint.y); - _helperMatrix.concat(_blitMatrix); - buffer.draw(pixels, _helperMatrix, null, null, null, (smoothing || antialiasing)); - } - else - { - _helperPoint.x = destPoint.x - Std.int(viewMarginLeft); - _helperPoint.y = destPoint.y - Std.int(viewMarginTop); - buffer.copyPixels(pixels, sourceRect, _helperPoint, null, null, true); - } - } - else if (frame != null) - { - // TODO: fix this case for zoom less than initial zoom... - frame.paint(buffer, destPoint, true); - } - } - - override function drawTriangles(graphic:FlxGraphic, vertices:DrawData, indices:DrawData, uvtData:DrawData, ?colors:DrawData, - ?position:FlxPoint, ?blend:BlendMode, repeat:Bool = false, smoothing:Bool = false, ?transform:ColorTransform, ?shader:FlxShader) - { - final cameraBounds = _bounds.set(viewMarginLeft, viewMarginTop, viewWidth, viewHeight); - - if (position == null) - position = renderPoint.set(); - - var verticesLength:Int = vertices.length; - var currentVertexPosition:Int = 0; - - var tempX:Float, tempY:Float; - var i:Int = 0; - var bounds = renderRect.set(); - drawVertices.splice(0, drawVertices.length); - - while (i < verticesLength) - { - tempX = position.x + vertices[i]; - tempY = position.y + vertices[i + 1]; - - drawVertices[currentVertexPosition++] = tempX; - drawVertices[currentVertexPosition++] = tempY; - - if (i == 0) - { - bounds.set(tempX, tempY, 0, 0); - } - else - { - FlxDrawTrianglesItem.inflateBounds(bounds, tempX, tempY); - } - - i += 2; - } - - position.putWeak(); - - if (!cameraBounds.overlaps(bounds)) - { - drawVertices.splice(drawVertices.length - verticesLength, verticesLength); - } - else - { - trianglesSprite.graphics.clear(); - trianglesSprite.graphics.beginBitmapFill(graphic.bitmap, null, repeat, smoothing); - trianglesSprite.graphics.drawTriangles(drawVertices, indices, uvtData); - trianglesSprite.graphics.endFill(); - - // TODO: check this block of code for cases, when zoom < 1 (or initial zoom?)... - if (_useBlitMatrix) - _helperMatrix.copyFrom(_blitMatrix); - else - { - _helperMatrix.identity(); - _helperMatrix.translate(-viewMarginLeft, -viewMarginTop); - } - - buffer.draw(trianglesSprite, _helperMatrix, transform); - - #if FLX_DEBUG - if (FlxG.debugger.drawDebug) - { - var gfx:Graphics = FlxSpriteUtil.flashGfx; - gfx.clear(); - gfx.lineStyle(1, FlxColor.BLUE, 0.5); - gfx.drawTriangles(drawVertices, indices); - buffer.draw(FlxSpriteUtil.flashGfxSprite, _helperMatrix); - } - #end - // End of TODO... - } - - bounds.put(); - } - - override function fill(color:FlxColor, blendAlpha:Bool = true) - { - if (blendAlpha) - { - _fill.fillRect(_flashRect, color); - buffer.copyPixels(_fill, _flashRect, _flashPoint, null, null, blendAlpha); - } - else - { - buffer.fillRect(_flashRect, color); - } - } - - override function offsetView(x:Float, y:Float):Void + _bounds = FlxDestroyUtil.put(_bounds); + } + + override function lock(?useBufferLocking:Bool) + { + checkResize(); + + if (useBufferLocking) + { + buffer.lock(); + } + + fill(camera.bgColor, camera.useBgAlphaBlending); + screen.dirty = true; + } + + override function unlock(?useBufferLocking:Bool):Void + { + camera.drawFX(); + + if (useBufferLocking) + { + buffer.unlock(); + } + + screen.dirty = true; + } + + override function beginDrawDebug():Void + { + FlxSpriteUtil.flashGfx.clear(); + } + + override function endDrawDebug(?matrix:FlxMatrix):Void + { + buffer.draw(FlxSpriteUtil.flashGfxSprite); + } + + override function drawPixels(?frame:FlxFrame, ?pixels:BitmapData, matrix:FlxMatrix, ?transform:ColorTransform, ?blend:BlendMode, smoothing:Bool = false, + ?shader:FlxShader):Void + { + _helperMatrix.copyFrom(matrix); + + if (_useBlitMatrix) + { + _helperMatrix.concat(_blitMatrix); + buffer.draw(pixels, _helperMatrix, null, null, null, (smoothing || antialiasing)); + } + else + { + _helperMatrix.translate(-viewMarginLeft, -viewMarginTop); + buffer.draw(pixels, _helperMatrix, null, blend, null, (smoothing || antialiasing)); + } + } + + override function copyPixels(?frame:FlxFrame, ?pixels:BitmapData, ?sourceRect:Rectangle, destPoint:Point, ?transform:ColorTransform, ?blend:BlendMode, + smoothing:Bool = false, ?shader:FlxShader) + { + if (pixels != null) + { + if (_useBlitMatrix) + { + _helperMatrix.identity(); + _helperMatrix.translate(destPoint.x, destPoint.y); + _helperMatrix.concat(_blitMatrix); + buffer.draw(pixels, _helperMatrix, null, null, null, (smoothing || antialiasing)); + } + else + { + _helperPoint.x = destPoint.x - Std.int(viewMarginLeft); + _helperPoint.y = destPoint.y - Std.int(viewMarginTop); + buffer.copyPixels(pixels, sourceRect, _helperPoint, null, null, true); + } + } + else if (frame != null) + { + // TODO: fix this case for zoom less than initial zoom... + frame.paint(buffer, destPoint, true); + } + } + + override function drawTriangles(graphic:FlxGraphic, vertices:DrawData, indices:DrawData, uvtData:DrawData, ?colors:DrawData, + ?position:FlxPoint, ?blend:BlendMode, repeat:Bool = false, smoothing:Bool = false, ?transform:ColorTransform, ?shader:FlxShader) + { + final cameraBounds = _bounds.set(viewMarginLeft, viewMarginTop, viewWidth, viewHeight); + + if (position == null) + position = renderPoint.set(); + + var verticesLength:Int = vertices.length; + var currentVertexPosition:Int = 0; + + var tempX:Float, tempY:Float; + var i:Int = 0; + var bounds = renderRect.set(); + drawVertices.splice(0, drawVertices.length); + + while (i < verticesLength) + { + tempX = position.x + vertices[i]; + tempY = position.y + vertices[i + 1]; + + drawVertices[currentVertexPosition++] = tempX; + drawVertices[currentVertexPosition++] = tempY; + + if (i == 0) + { + bounds.set(tempX, tempY, 0, 0); + } + else + { + FlxDrawTrianglesItem.inflateBounds(bounds, tempX, tempY); + } + + i += 2; + } + + position.putWeak(); + + if (!cameraBounds.overlaps(bounds)) + { + drawVertices.splice(drawVertices.length - verticesLength, verticesLength); + } + else + { + trianglesSprite.graphics.clear(); + trianglesSprite.graphics.beginBitmapFill(graphic.bitmap, null, repeat, smoothing); + trianglesSprite.graphics.drawTriangles(drawVertices, indices, uvtData); + trianglesSprite.graphics.endFill(); + + // TODO: check this block of code for cases, when zoom < 1 (or initial zoom?)... + if (_useBlitMatrix) + _helperMatrix.copyFrom(_blitMatrix); + else + { + _helperMatrix.identity(); + _helperMatrix.translate(-viewMarginLeft, -viewMarginTop); + } + + buffer.draw(trianglesSprite, _helperMatrix, transform); + + #if FLX_DEBUG + if (FlxG.debugger.drawDebug) + { + var gfx:Graphics = FlxSpriteUtil.flashGfx; + gfx.clear(); + gfx.lineStyle(1, FlxColor.BLUE, 0.5); + gfx.drawTriangles(drawVertices, indices); + buffer.draw(FlxSpriteUtil.flashGfxSprite, _helperMatrix); + } + #end + // End of TODO... + } + + bounds.put(); + } + + override function fill(color:FlxColor, blendAlpha:Bool = true) + { + if (blendAlpha) + { + _fill.fillRect(_flashRect, color); + buffer.copyPixels(_fill, _flashRect, _flashPoint, null, null, blendAlpha); + } + else + { + buffer.fillRect(_flashRect, color); + } + } + + override function offsetView(x:Float, y:Float):Void { flashSprite.x += x; flashSprite.y += y; } - - override function updatePosition():Void - { - if (flashSprite != null) + + override function updatePosition():Void + { + if (flashSprite != null) { flashSprite.x = camera.x * FlxG.scaleMode.scale.x + _flashOffset.x; flashSprite.y = camera.y * FlxG.scaleMode.scale.y + _flashOffset.y; } - } - - override function updateScrollRect():Void - { - var rect:Rectangle = (_scrollRect != null) ? _scrollRect.scrollRect : null; - + } + + override function updateScrollRect():Void + { + var rect:Rectangle = (_scrollRect != null) ? _scrollRect.scrollRect : null; + if (rect != null) { rect.x = rect.y = 0; - + rect.width = camera.width * camera.initialZoom * FlxG.scaleMode.scale.x; rect.height = camera.height * camera.initialZoom * FlxG.scaleMode.scale.y; - + _scrollRect.scrollRect = rect; - + _scrollRect.x = -0.5 * rect.width; _scrollRect.y = -0.5 * rect.height; } - } - - override function updateScale():Void - { - updateBlitMatrix(); - - if (_useBlitMatrix) - { - _flashBitmap.scaleX = camera.initialZoom * FlxG.scaleMode.scale.x; - _flashBitmap.scaleY = camera.initialZoom * FlxG.scaleMode.scale.y; - } - else - { - _flashBitmap.scaleX = camera.totalScaleX; - _flashBitmap.scaleY = camera.totalScaleY; - } - - super.updateScale(); - } - - override function updateInternals():Void - { - if (_flashBitmap != null) - { - _flashBitmap.x = 0; - _flashBitmap.y = 0; - } - } - - override function checkResize() - { - if (camera.width != buffer.width || camera.height != buffer.height) - { - var oldBuffer:FlxGraphic = screen.graphic; - buffer = new BitmapData(camera.width, camera.height, true, 0); - screen.pixels = buffer; - screen.origin.zero(); - _flashBitmap.bitmapData = buffer; - _flashRect.width = camera.width; - _flashRect.height = camera.height; - _fill = FlxDestroyUtil.dispose(_fill); - _fill = new BitmapData(camera.width, camera.height, true, FlxColor.TRANSPARENT); - FlxG.bitmap.removeIfNoUse(oldBuffer); - } - - updateBlitMatrix(); - } - - inline function updateBlitMatrix():Void + } + + override function updateScale():Void + { + updateBlitMatrix(); + + if (_useBlitMatrix) + { + _flashBitmap.scaleX = camera.initialZoom * FlxG.scaleMode.scale.x; + _flashBitmap.scaleY = camera.initialZoom * FlxG.scaleMode.scale.y; + } + else + { + _flashBitmap.scaleX = camera.totalScaleX; + _flashBitmap.scaleY = camera.totalScaleY; + } + + super.updateScale(); + } + + override function updateInternals():Void + { + if (_flashBitmap != null) + { + _flashBitmap.x = 0; + _flashBitmap.y = 0; + } + } + + override function checkResize() + { + if (camera.width != buffer.width || camera.height != buffer.height) + { + var oldBuffer:FlxGraphic = screen.graphic; + buffer = new BitmapData(camera.width, camera.height, true, 0); + screen.pixels = buffer; + screen.origin.zero(); + _flashBitmap.bitmapData = buffer; + _flashRect.width = camera.width; + _flashRect.height = camera.height; + _fill = FlxDestroyUtil.dispose(_fill); + _fill = new BitmapData(camera.width, camera.height, true, FlxColor.TRANSPARENT); + FlxG.bitmap.removeIfNoUse(oldBuffer); + } + + updateBlitMatrix(); + } + + inline function updateBlitMatrix():Void { _blitMatrix.identity(); _blitMatrix.translate(-viewMarginLeft, -viewMarginTop); _blitMatrix.scale(camera.scaleX, camera.scaleY); - + _useBlitMatrix = (camera.scaleX < camera.initialZoom) || (camera.scaleY < camera.initialZoom); } - - override function transformRect(rect:FlxRect):FlxRect + + override function transformRect(rect:FlxRect):FlxRect { - rect.offset(-viewMarginLeft, -viewMarginTop); - - if (_useBlitMatrix) - { - rect.x *= camera.zoom; - rect.y *= camera.zoom; - rect.width *= camera.zoom; - rect.height *= camera.zoom; - } - + rect.offset(-viewMarginLeft, -viewMarginTop); + + if (_useBlitMatrix) + { + rect.x *= camera.zoom; + rect.y *= camera.zoom; + rect.width *= camera.zoom; + rect.height *= camera.zoom; + } + return rect; } - - override function transformPoint(point:FlxPoint):FlxPoint + + override function transformPoint(point:FlxPoint):FlxPoint { - point.subtract(viewMarginLeft, viewMarginTop); - - if (_useBlitMatrix) - point.scale(camera.zoom); - + point.subtract(viewMarginLeft, viewMarginTop); + + if (_useBlitMatrix) + point.scale(camera.zoom); + return point; } - - override function transformVector(vector:FlxPoint):FlxPoint + + override function transformVector(vector:FlxPoint):FlxPoint { if (_useBlitMatrix) vector.scale(camera.zoom); - + return vector; } - - override function get_display():DisplayObjectContainer - { - return flashSprite; - } - - override function set_color(color:FlxColor):FlxColor - { - if (_flashBitmap != null) - { - final colorTransform:ColorTransform = _flashBitmap.transform.colorTransform; - - colorTransform.redMultiplier = color.redFloat; - colorTransform.greenMultiplier = color.greenFloat; - colorTransform.blueMultiplier = color.blueFloat; - - _flashBitmap.transform.colorTransform = colorTransform; - } - - return color; - } - - override function set_antialiasing(antialiasing:Bool):Bool - { + + override function get_display():DisplayObjectContainer + { + return flashSprite; + } + + override function set_color(color:FlxColor):FlxColor + { + if (_flashBitmap != null) + { + final colorTransform:ColorTransform = _flashBitmap.transform.colorTransform; + + colorTransform.redMultiplier = color.redFloat; + colorTransform.greenMultiplier = color.greenFloat; + colorTransform.blueMultiplier = color.blueFloat; + + _flashBitmap.transform.colorTransform = colorTransform; + } + + return color; + } + + override function set_antialiasing(antialiasing:Bool):Bool + { return _flashBitmap.smoothing = antialiasing; - } - - override function set_alpha(alpha:Float):Float - { - return _flashBitmap.alpha = alpha; - } - - override function set_angle(angle:Float):Float - { - return flashSprite.rotation = angle; - } - - override function set_visible(visible:Bool):Bool - { + } + + override function set_alpha(alpha:Float):Float + { + return _flashBitmap.alpha = alpha; + } + + override function set_angle(angle:Float):Float + { + return flashSprite.rotation = angle; + } + + override function set_visible(visible:Bool):Bool + { flashSprite.visible = visible; - return visible; - } + return visible; + } } diff --git a/flixel/system/render/quad/FlxQuadView.hx b/flixel/system/render/quad/FlxQuadView.hx index 35df206c18..093e2fedf2 100644 --- a/flixel/system/render/quad/FlxQuadView.hx +++ b/flixel/system/render/quad/FlxQuadView.hx @@ -28,14 +28,14 @@ using flixel.util.FlxColorTransformUtil; class FlxQuadView extends FlxCameraView { - /** + /** * Sprite used for actual rendering in tile render mode (instead of `_flashBitmap` for blitting). * Its graphics is used as a drawing surface for `drawTriangles()` and `drawTiles()` methods. * It is a child of `_scrollRect` `Sprite` (which trims graphics that should be invisible). * Its position is modified by `updateInternalSpritePositions()`, which is called on camera's resize and scale events. */ public var canvas:Sprite; - + #if FLX_DEBUG /** * Sprite for visual effects (flash and fade) and drawDebug information @@ -45,8 +45,8 @@ class FlxQuadView extends FlxCameraView */ public var debugLayer:Sprite; #end - - /** + + /** * Used to render buffer to screen space. * NOTE: We don't recommend modifying this directly unless you are fairly experienced. * Uses include 3D projection, advanced display list modification, and more. @@ -55,104 +55,105 @@ class FlxQuadView extends FlxCameraView * Its position is modified by `updateFlashSpritePosition()` which is called every frame. */ public var flashSprite:Sprite = new Sprite(); - - /** + + /** * Internal sprite, used for correct trimming of camera viewport. * It is a child of `flashSprite`. * Its position is modified by `updateScrollRect()` method, which is called on camera's resize and scale events. */ var _scrollRect:Sprite = new Sprite(); - + /** * Helper rect for `drawTriangles()` visibility checks */ var _bounds:FlxRect = FlxRect.get(); - + var _helperMatrix:FlxMatrix = new FlxMatrix(); - - @:allow(flixel.system.render.FlxCameraView) - function new(camera:FlxCamera) - { - super(camera); - + + @:allow(flixel.system.render.FlxCameraView) + function new(camera:FlxCamera) + { + super(camera); + flashSprite.addChild(_scrollRect); - _scrollRect.scrollRect = new Rectangle(); - - canvas = new Sprite(); - _scrollRect.addChild(canvas); - - #if FLX_DEBUG - debugLayer = new Sprite(); - _scrollRect.addChild(debugLayer); - #end - } - - override function destroy():Void - { - super.destroy(); - - FlxDestroyUtil.removeChild(flashSprite, _scrollRect); - #if FLX_DEBUG - FlxDestroyUtil.removeChild(_scrollRect, debugLayer); - debugLayer = null; - #end - - FlxDestroyUtil.removeChild(_scrollRect, canvas); - if (canvas != null) - { - for (i in 0...canvas.numChildren) - { - canvas.removeChildAt(0); - } - canvas = null; - } - - if (_headOfDrawStack != null) - { - clearDrawStack(); - } - - flashSprite = null; + _scrollRect.scrollRect = new Rectangle(); + + canvas = new Sprite(); + _scrollRect.addChild(canvas); + + #if FLX_DEBUG + debugLayer = new Sprite(); + _scrollRect.addChild(debugLayer); + #end + } + + override function destroy():Void + { + super.destroy(); + + FlxDestroyUtil.removeChild(flashSprite, _scrollRect); + #if FLX_DEBUG + FlxDestroyUtil.removeChild(_scrollRect, debugLayer); + debugLayer = null; + #end + + FlxDestroyUtil.removeChild(_scrollRect, canvas); + if (canvas != null) + { + for (i in 0...canvas.numChildren) + { + canvas.removeChildAt(0); + } + canvas = null; + } + + if (_headOfDrawStack != null) + { + clearDrawStack(); + } + + flashSprite = null; _scrollRect = null; _helperMatrix = null; _bounds = FlxDestroyUtil.put(_bounds); - } - - override function lock(?useBufferLocking:Bool):Void - { - clearDrawStack(); - - canvas.graphics.clear(); - // Clearing camera's debug sprite - #if FLX_DEBUG - debugLayer.graphics.clear(); - #end - - fill(camera.bgColor, camera.useBgAlphaBlending); - } - - override function render():Void - { + } + + override function lock(?useBufferLocking:Bool):Void + { + clearDrawStack(); + + canvas.graphics.clear(); + // Clearing camera's debug sprite + #if FLX_DEBUG + debugLayer.graphics.clear(); + #end + + fill(camera.bgColor, camera.useBgAlphaBlending); + } + + override function render():Void + { flashSprite.filters = camera.filtersEnabled ? filters : null; - - var currItem:FlxDrawBaseItem = _headOfDrawStack; + + var currItem:FlxDrawBaseItem = _headOfDrawStack; while (currItem != null) { currItem.render(camera); currItem = currItem.next; } - } - - override function unlock(?useBufferLocking:Bool):Void - { - camera.drawFX(); - } - - override function drawPixels(?frame:FlxFrame, ?pixels:BitmapData, matrix:FlxMatrix, ?transform:ColorTransform, ?blend:BlendMode, smoothing:Bool = false, ?shader:FlxShader) + } + + override function unlock(?useBufferLocking:Bool):Void + { + camera.drawFX(); + } + + override function drawPixels(?frame:FlxFrame, ?pixels:BitmapData, matrix:FlxMatrix, ?transform:ColorTransform, ?blend:BlendMode, smoothing:Bool = false, + ?shader:FlxShader) { var isColored = (transform != null #if !html5 && transform.hasRGBMultipliers() #end); var hasColorOffsets:Bool = (transform != null && transform.hasRGBAOffsets()); - + #if FLX_RENDER_TRIANGLE final drawItem:FlxDrawTrianglesItem = startTrianglesBatch(frame.parent, smoothing, isColored, blend, hasColorOffsets, shader); #else @@ -160,15 +161,16 @@ class FlxQuadView extends FlxCameraView #end drawItem.addQuad(frame, matrix, transform); } - - override function copyPixels(?frame:FlxFrame, ?pixels:BitmapData, ?sourceRect:Rectangle, destPoint:Point, ?transform:ColorTransform, ?blend:BlendMode, smoothing:Bool = false, ?shader:FlxShader) + + override function copyPixels(?frame:FlxFrame, ?pixels:BitmapData, ?sourceRect:Rectangle, destPoint:Point, ?transform:ColorTransform, ?blend:BlendMode, + smoothing:Bool = false, ?shader:FlxShader) { _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()); - + #if FLX_RENDER_TRIANGLE final drawItem:FlxDrawTrianglesItem = startTrianglesBatch(frame.parent, smoothing, isColored, blend, hasColorOffsets, shader); #else @@ -176,18 +178,19 @@ class FlxQuadView extends FlxCameraView #end drawItem.addQuad(frame, _helperMatrix, transform); } - - override function drawTriangles(graphic:FlxGraphic, vertices:DrawData, indices:DrawData, uvtData:DrawData, ?colors:DrawData, ?position:FlxPoint, ?blend:BlendMode, repeat:Bool = false, smoothing:Bool = false, ?transform:ColorTransform, ?shader:FlxShader) + + override function drawTriangles(graphic:FlxGraphic, vertices:DrawData, indices:DrawData, uvtData:DrawData, ?colors:DrawData, + ?position:FlxPoint, ?blend:BlendMode, repeat:Bool = false, smoothing:Bool = false, ?transform:ColorTransform, ?shader:FlxShader) { final cameraBounds = _bounds.set(viewMarginLeft, viewMarginTop, viewWidth, viewHeight); - + final isColored = (colors != null && colors.length != 0) || (transform != null && transform.hasRGBMultipliers()); final hasColorOffsets = (transform != null && transform.hasRGBAOffsets()); - + final drawItem = startTrianglesBatch(graphic, smoothing, isColored, blend, hasColorOffsets, shader); drawItem.addTriangles(vertices, indices, uvtData, colors, position, cameraBounds, transform); } - + override function fill(color:FlxColor, blendAlpha:Bool = true):Void { canvas.graphics.overrideBlendMode(null); @@ -197,135 +200,135 @@ class FlxQuadView extends FlxCameraView canvas.graphics.drawRect(viewMarginLeft - 1, viewMarginTop - 1, viewWidth + 2, viewHeight + 2); canvas.graphics.endFill(); } - + override function offsetView(x:Float, y:Float):Void { flashSprite.x += x; flashSprite.y += y; } - - override function updatePosition():Void - { - if (flashSprite != null) + + override function updatePosition():Void + { + if (flashSprite != null) { flashSprite.x = camera.x * FlxG.scaleMode.scale.x + _flashOffset.x; flashSprite.y = camera.y * FlxG.scaleMode.scale.y + _flashOffset.y; } - } - + } + override function updateScrollRect():Void - { - var rect:Rectangle = (_scrollRect != null) ? _scrollRect.scrollRect : null; - + { + var rect:Rectangle = (_scrollRect != null) ? _scrollRect.scrollRect : null; + if (rect != null) { rect.x = rect.y = 0; - + rect.width = camera.width * camera.initialZoom * FlxG.scaleMode.scale.x; rect.height = camera.height * camera.initialZoom * FlxG.scaleMode.scale.y; - + _scrollRect.scrollRect = rect; - + _scrollRect.x = -0.5 * rect.width; _scrollRect.y = -0.5 * rect.height; } - } - - override function updateInternals():Void - { - if (canvas != null) - { - canvas.x = -0.5 * camera.width * (camera.scaleX - camera.initialZoom) * FlxG.scaleMode.scale.x; - canvas.y = -0.5 * camera.height * (camera.scaleY - camera.initialZoom) * FlxG.scaleMode.scale.y; - - canvas.scaleX = camera.totalScaleX; - canvas.scaleY = camera.totalScaleY; - - #if FLX_DEBUG - if (debugLayer != null) - { - debugLayer.x = canvas.x; - debugLayer.y = canvas.y; - - debugLayer.scaleX = camera.totalScaleX; - debugLayer.scaleY = camera.totalScaleY; - } - #end - } - } - - override function set_color(color:FlxColor):FlxColor + } + + override function updateInternals():Void + { + if (canvas != null) + { + canvas.x = -0.5 * camera.width * (camera.scaleX - camera.initialZoom) * FlxG.scaleMode.scale.x; + canvas.y = -0.5 * camera.height * (camera.scaleY - camera.initialZoom) * FlxG.scaleMode.scale.y; + + canvas.scaleX = camera.totalScaleX; + canvas.scaleY = camera.totalScaleY; + + #if FLX_DEBUG + if (debugLayer != null) + { + debugLayer.x = canvas.x; + debugLayer.y = canvas.y; + + debugLayer.scaleX = camera.totalScaleX; + debugLayer.scaleY = camera.totalScaleY; + } + #end + } + } + + override function set_color(color:FlxColor):FlxColor { final colorTransform:ColorTransform = canvas.transform.colorTransform; - + colorTransform.redMultiplier = color.redFloat; colorTransform.greenMultiplier = color.greenFloat; colorTransform.blueMultiplier = color.blueFloat; canvas.transform.colorTransform = colorTransform; - + return color; } - + override function set_alpha(alpha:Float):Float { return canvas.alpha = alpha; } - - override function set_angle(angle:Float):Float - { - return flashSprite.rotation = angle; - } - - override function set_visible(visible:Bool):Bool - { + + override function set_angle(angle:Float):Float + { + return flashSprite.rotation = angle; + } + + override function set_visible(visible:Bool):Bool + { flashSprite.visible = visible; - return visible; - } - - override function get_display():DisplayObjectContainer - { - return flashSprite; - } - - /** + return visible; + } + + override function get_display():DisplayObjectContainer + { + return flashSprite; + } + + /** * Currently used draw stack item */ var _currentDrawItem:FlxDrawBaseItem; - + /** * Pointer to head of stack with draw items */ var _headOfDrawStack:FlxDrawBaseItem; - + /** * Last draw tiles item */ var _headTiles:FlxDrawQuadsItem; - + /** * Last draw triangles item */ var _headTriangles:FlxDrawTrianglesItem; - + /** * Draw tiles stack items that can be reused */ static var _storageTilesHead:FlxDrawQuadsItem; - + /** * Draw triangles stack items that can be reused */ static var _storageTrianglesHead:FlxDrawTrianglesItem; - - @:noCompletion + + @:noCompletion public function startQuadBatch(graphic:FlxGraphic, colored:Bool, hasColorOffsets:Bool = false, ?blend:BlendMode, smooth:Bool = false, ?shader:FlxShader) { #if FLX_RENDER_TRIANGLE return startTrianglesBatch(graphic, smooth, colored, blend); #else var itemToReturn = null; - + if (_currentDrawItem != null && _currentDrawItem.type == FlxDrawItemType.TILES && _headTiles.graphics == graphic @@ -337,7 +340,7 @@ class FlxQuadView extends FlxCameraView { return _headTiles; } - + if (_storageTilesHead != null) { itemToReturn = _storageTilesHead; @@ -353,35 +356,36 @@ class FlxQuadView extends FlxCameraView // TODO: catch this error when the dev actually messes up, not in the draw phase if (graphic.isDestroyed) throw 'Cannot queue ${graphic.key}. This sprite was destroyed.'; - + itemToReturn.graphics = graphic; itemToReturn.antialiasing = smooth; itemToReturn.colored = colored; itemToReturn.hasColorOffsets = hasColorOffsets; itemToReturn.blend = blend; itemToReturn.shader = shader; - + itemToReturn.nextTyped = _headTiles; _headTiles = itemToReturn; - + if (_headOfDrawStack == null) { _headOfDrawStack = itemToReturn; } - + if (_currentDrawItem != null) { _currentDrawItem.next = itemToReturn; } - + _currentDrawItem = itemToReturn; - + return itemToReturn; #end } - + @: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, ?hasColorOffsets:Bool, + ?shader:FlxShader):FlxDrawTrianglesItem { if (_currentDrawItem != null && _currentDrawItem.type == FlxDrawItemType.TRIANGLES @@ -394,15 +398,16 @@ class FlxQuadView extends FlxCameraView { return _headTriangles; } - + return getNewDrawTrianglesItem(graphic, smoothing, isColored, blend, hasColorOffsets, shader); } - + @: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, ?hasColorOffsets:Bool, + ?shader:FlxShader):FlxDrawTrianglesItem { var itemToReturn:FlxDrawTrianglesItem = null; - + if (_storageTrianglesHead != null) { itemToReturn = _storageTrianglesHead; @@ -414,38 +419,38 @@ class FlxQuadView extends FlxCameraView { itemToReturn = new FlxDrawTrianglesItem(); } - + itemToReturn.graphics = graphic; itemToReturn.antialiasing = smoothing; itemToReturn.colored = isColored; itemToReturn.blend = blend; itemToReturn.hasColorOffsets = hasColorOffsets; itemToReturn.shader = shader; - + itemToReturn.nextTyped = _headTriangles; _headTriangles = itemToReturn; - + if (_headOfDrawStack == null) { _headOfDrawStack = itemToReturn; } - + if (_currentDrawItem != null) { _currentDrawItem.next = itemToReturn; } - + _currentDrawItem = itemToReturn; - + return itemToReturn; } - + @:noCompletion public function clearDrawStack():Void { var currTiles = _headTiles; var newTilesHead; - + while (currTiles != null) { newTilesHead = currTiles.nextTyped; @@ -454,10 +459,10 @@ class FlxQuadView extends FlxCameraView _storageTilesHead = currTiles; currTiles = newTilesHead; } - + var currTriangles:FlxDrawTrianglesItem = _headTriangles; var newTrianglesHead:FlxDrawTrianglesItem; - + while (currTriangles != null) { newTrianglesHead = currTriangles.nextTyped; @@ -466,7 +471,7 @@ class FlxQuadView extends FlxCameraView _storageTrianglesHead = currTriangles; currTriangles = newTrianglesHead; } - + _currentDrawItem = null; _headOfDrawStack = null; _headTiles = null; From a0861e9f261b72e722858e0c53f5347d2e480c96 Mon Sep 17 00:00:00 2001 From: ACrazyTown <47027981+ACrazyTown@users.noreply.github.com> Date: Tue, 23 Dec 2025 14:08:42 +0100 Subject: [PATCH 04/28] Add debug drawing methods to `FlxCamera` and `FlxCameraView` --- flixel/FlxCamera.hx | 28 +++++++----- flixel/FlxObject.hx | 25 ++++++++--- flixel/graphics/tile/FlxDrawTrianglesItem.hx | 2 +- flixel/path/FlxBasePath.hx | 44 ++++++++---------- .../system/debug/interaction/Interaction.hx | 26 +++++------ .../system/debug/interaction/tools/Pointer.hx | 16 +++---- .../debug/interaction/tools/Transform.hx | 45 +++++++++---------- flixel/system/render/blit/FlxBlitView.hx | 32 +++++++++++++ flixel/system/render/quad/FlxQuadView.hx | 32 +++++++++++++ .../system/scaleModes/StageSizeScaleMode.hx | 4 +- flixel/tile/FlxTilemap.hx | 2 +- 11 files changed, 166 insertions(+), 90 deletions(-) diff --git a/flixel/FlxCamera.hx b/flixel/FlxCamera.hx index 99b030bf96..05c5cff0de 100644 --- a/flixel/FlxCamera.hx +++ b/flixel/FlxCamera.hx @@ -1,10 +1,5 @@ package flixel; -<<<<<<< HEAD -import flixel.system.render.FlxCameraView; -import flixel.system.render.quad.FlxQuadView; -import flixel.system.render.blit.FlxBlitView; - import openfl.display.Bitmap; import openfl.display.BitmapData; import openfl.display.DisplayObject; @@ -13,8 +8,6 @@ import openfl.display.Sprite; import openfl.geom.ColorTransform; import openfl.geom.Point; import openfl.geom.Rectangle; -======= ->>>>>>> upstream/dev import flixel.graphics.FlxGraphic; import flixel.graphics.frames.FlxFrame; import flixel.graphics.tile.FlxDrawBaseItem; @@ -25,6 +18,9 @@ import flixel.math.FlxMatrix; import flixel.math.FlxPoint; import flixel.math.FlxRect; import flixel.system.FlxAssets.FlxShader; +import flixel.system.render.FlxCameraView; +import flixel.system.render.quad.FlxQuadView; +import flixel.system.render.blit.FlxBlitView; import flixel.util.FlxAxes; import flixel.util.FlxColor; import flixel.util.FlxDestroyUtil; @@ -36,6 +32,7 @@ import openfl.display.BlendMode; import openfl.display.DisplayObject; import openfl.display.Graphics; import openfl.display.Sprite; +import openfl.display.DisplayObjectContainer; import openfl.filters.BitmapFilter; import openfl.geom.ColorTransform; import openfl.geom.Point; @@ -355,6 +352,11 @@ class FlxCamera extends FlxBasic */ public var viewBottom(get, never):Float; + /** + * Reference to camera's `view.display`. + */ + public var display(get, never):DisplayObjectContainer; + /** * Helper matrix object. Used in blit render mode when camera's zoom is less than initialZoom * (it is applied to all objects rendered on the camera at such circumstances). @@ -545,7 +547,7 @@ class FlxCamera extends FlxBasic * Helper rect for `drawTriangles()` visibility checks */ @:deprecated("depblit") - var _bounds:FlxRect = FlxRect.get(); + var _bounds:FlxRect; /** * Sprite used for actual rendering in tile render mode (instead of `_flashBitmap` for blitting). @@ -589,7 +591,7 @@ class FlxCamera extends FlxBasic * Last draw tiles item */ @:deprecated("depquad") - var _headTiles:FlxDrawItem; + var _headTiles:FlxDrawQuadsItem; /** * Last draw triangles item @@ -601,7 +603,7 @@ class FlxCamera extends FlxBasic * Draw tiles stack items that can be reused */ @:deprecated("depquad") - static var _storageTilesHead:FlxDrawItem; + static var _storageTilesHead:FlxDrawQuadsItem; /** * Draw triangles stack items that can be reused @@ -820,7 +822,6 @@ class FlxCamera extends FlxBasic { view.destroy(); - _bounds = FlxDestroyUtil.put(_bounds); scroll = FlxDestroyUtil.put(scroll); targetOffset = FlxDestroyUtil.put(targetOffset); deadzone = FlxDestroyUtil.put(deadzone); @@ -2017,6 +2018,11 @@ class FlxCamera extends FlxBasic return scroll.y + viewMarginBottom; } + inline function get_display():DisplayObjectContainer + { + return view.display; + } + inline function set_flashSprite(value:Sprite):Sprite { var sprite = FlxG.renderTile ? viewQuad.flashSprite : viewBlit.flashSprite; diff --git a/flixel/FlxObject.hx b/flixel/FlxObject.hx index 080d4edca1..4647ac5cf8 100644 --- a/flixel/FlxObject.hx +++ b/flixel/FlxObject.hx @@ -1318,18 +1318,27 @@ class FlxObject extends FlxBasic if (rect.width > 0 && rect.height > 0) { - final gfx = beginDrawDebug(camera); - drawDebugBoundingBox(gfx, rect, allowCollisions, immovable); - endDrawDebug(camera); + camera.beginDrawDebug(); + drawDebugBoundingBox(camera, rect, allowCollisions); + camera.endDrawDebug(); } } - function drawDebugBoundingBox(gfx:Graphics, rect:FlxRect, allowCollisions:FlxDirectionFlags, partial:Bool) + @:deprecated("drawDebugBoundingBox(gfx, rect, allowCollisions, partial) is deprecated. Use drawDebugBoundingBox(camera, rect, allowCollisions) instead.") + overload extern inline function drawDebugBoundingBox(gfx:Graphics, rect:FlxRect, allowCollisions:FlxDirectionFlags, partial:Bool) { // Find the color to use final color = getDebugBoundingBoxColor(allowCollisions); drawDebugBoundingBoxColor(gfx, rect, color); } + + overload extern inline function drawDebugBoundingBox(camera:FlxCamera, rect:FlxRect, allowCollisions:FlxDirectionFlags) + { + // Find the color to use + var color = getDebugBoundingBoxColor(allowCollisions); + color.alphaFloat = 0.75; + drawDebugBoundingBoxColor(camera, rect, color); + } function getDebugBoundingBoxColor(allowCollisions:FlxDirectionFlags) { @@ -1346,13 +1355,19 @@ class FlxObject extends FlxBasic } - function drawDebugBoundingBoxColor(gfx:Graphics, rect:FlxRect, color:FlxColor) + @:deprecated("drawDebugBoundingBoxColor(gfx, rect, color) is deprecated, use drawDebugBoundingBoxColor(camera, rect, color) instead") + overload extern inline function drawDebugBoundingBoxColor(gfx:Graphics, rect:FlxRect, color:FlxColor) { // fill static graphics object with square shape gfx.lineStyle(1, color, 0.75, false, null, null, MITER, 255); gfx.drawRect(rect.x + 0.5, rect.y + 0.5, rect.width - 1.0, rect.height - 1.0); } + overload extern inline function drawDebugBoundingBoxColor(camera:FlxCamera, rect:FlxRect, color:FlxColor) + { + camera.drawDebugRect(rect.x + 0.5, rect.y + 0.5, rect.width - 1.0, rect.height - 1.0, color); + } + @:deprecated("use object.beginDrawDebug(camera) is deprecated, camera.beginDrawDebug() instead") inline function beginDrawDebug(camera:FlxCamera):Graphics { diff --git a/flixel/graphics/tile/FlxDrawTrianglesItem.hx b/flixel/graphics/tile/FlxDrawTrianglesItem.hx index 66e6c192ab..e3ac8acb43 100644 --- a/flixel/graphics/tile/FlxDrawTrianglesItem.hx +++ b/flixel/graphics/tile/FlxDrawTrianglesItem.hx @@ -88,7 +88,7 @@ class FlxDrawTrianglesItem extends FlxDrawBaseItem #if FLX_DEBUG if (FlxG.debugger.drawDebug) { - var gfx:Graphics = camera.debugLayer.graphics; + var gfx:Graphics = camera.viewQuad.debugLayer.graphics; gfx.lineStyle(1, FlxColor.BLUE, 0.5); gfx.drawTriangles(vertices, indices, uvtData); } diff --git a/flixel/path/FlxBasePath.hx b/flixel/path/FlxBasePath.hx index 3fa14e379a..b993c338f3 100644 --- a/flixel/path/FlxBasePath.hx +++ b/flixel/path/FlxBasePath.hx @@ -318,18 +318,8 @@ class FlxTypedBasePath extends FlxBasic implements IFlxDestroy */ public function drawDebugOnCamera(camera:FlxCamera):Void { - // Set up our global flash graphics object to draw out the path - var gfx:Graphics = null; - if (FlxG.renderBlit) - { - gfx = FlxSpriteUtil.flashGfx; - gfx.clear(); - } - else - { - gfx = camera.debugLayer.graphics; - } - + camera.beginDrawDebug(); + final length = nodes.length; // Then fill up the object with node and path graphics for (i=>node in nodes) @@ -355,24 +345,20 @@ class FlxTypedBasePath extends FlxBasic implements IFlxDestroy } // draw a box for the node - drawNode(gfx, prevNodeScreen, nodeSize, nodeColor); + drawNode(camera, prevNodeScreen, nodeSize, nodeColor); if (i + 1 < length || loopType == LOOP) { // draw a line to the next node, if LOOP, get connect the tail and head final nextNode = nodes[(i + 1) % length]; final nextNodeScreen = copyWorldToScreenPos(nextNode, camera); - drawLine(gfx, prevNodeScreen, nextNodeScreen); + drawLine(camera, prevNodeScreen, nextNodeScreen); nextNodeScreen.put(); } prevNodeScreen.put(); } - if (FlxG.renderBlit) - { - // then stamp the path down onto the game buffer - camera.buffer.draw(FlxSpriteUtil.flashGfxSprite); - } + camera.endDrawDebug(); } @:access(flixel.FlxCamera) @@ -396,16 +382,14 @@ class FlxTypedBasePath extends FlxBasic implements IFlxDestroy return result; } - inline function drawNode(gfx:Graphics, node:FlxPoint, size:Int, color:FlxColor) + inline function drawNode(camera:FlxCamera, node:FlxPoint, size:Int, color:FlxColor) { - gfx.beginFill(color.rgb, color.alphaFloat); - gfx.lineStyle(); final offset = Math.floor(size * 0.5); - gfx.drawRect(node.x - offset, node.y - offset, size, size); - gfx.endFill(); + camera.drawDebugFilledRect(node.x - offset, node.y - offset, size, size, color); } - function drawLine(gfx:Graphics, node1:FlxPoint, node2:FlxPoint) + @:deprecated("drawLine(gfx, node1, node2) is deprecated. Use drawLine(camera, node1, node2) instead.") + overload extern inline function drawLine(gfx:Graphics, node1:FlxPoint, node2:FlxPoint) { // then draw a line to the next node final color = debugDrawData.lineColor; @@ -416,6 +400,16 @@ class FlxTypedBasePath extends FlxBasic implements IFlxDestroy gfx.moveTo(node1.x + lineOffset, node1.y + lineOffset); gfx.lineTo(node2.x + lineOffset, node2.y + lineOffset); } + + overload extern inline function drawLine(camera:FlxCamera, node1:FlxPoint, node2:FlxPoint) + { + // then draw a line to the next node + final color = debugDrawData.lineColor; + final size = debugDrawData.lineSize; + final lineOffset = debugDrawData.lineSize / 2; + + camera.drawDebugLine(node1.x + lineOffset, node1.y + lineOffset, node2.x + lineOffset, node2.y + lineOffset, color, size); + } #end } diff --git a/flixel/system/debug/interaction/Interaction.hx b/flixel/system/debug/interaction/Interaction.hx index 799201e498..9c68f03c05 100644 --- a/flixel/system/debug/interaction/Interaction.hx +++ b/flixel/system/debug/interaction/Interaction.hx @@ -16,6 +16,7 @@ import flixel.system.debug.interaction.tools.TrackObject; import flixel.system.debug.interaction.tools.Transform; import flixel.util.FlxDestroyUtil; import flixel.util.FlxSpriteUtil; +import flixel.util.FlxColor; import openfl.display.BitmapData; import openfl.display.DisplayObject; import openfl.display.Graphics; @@ -377,6 +378,7 @@ class Interaction extends Window drawItemsSelection(); } + @:deprecated("getDebugGraphics() is deprecated. Use the debug draw functions from FlxCamera instead.") public function getDebugGraphics():Graphics { if (FlxG.renderBlit) @@ -394,25 +396,23 @@ class Interaction extends Window function drawItemsSelection():Void { - var gfx:Graphics = getDebugGraphics(); - if (gfx == null) - return; + final camera = FlxG.camera; + camera.beginDrawDebug(); for (member in selectedItems) { if (member != null && member.scrollFactor != null && member.isOnScreen()) { final margin = 0.5; - final scroll = FlxG.camera.scroll; + final scroll = camera.scroll; // Render a white rectangle centered at the selected item - gfx.lineStyle(1.0, 0xFFFFFF, 0.75); - gfx.drawRect(member.x - scroll.x - margin, member.y - scroll.y - margin, member.width + margin*2, member.height + margin*2); + + final color:FlxColor = FlxColor.fromRGBFloat(1, 1, 1, 0.75); + camera.drawDebugRect(member.x - scroll.x - margin, member.y - scroll.y - margin, member.width + margin*2, member.height + margin*2, color); } } - // Draw the debug info to the main camera buffer. - if (FlxG.renderBlit) - FlxG.camera.buffer.draw(FlxSpriteUtil.flashGfxSprite); + camera.endDrawDebug(); } /** @@ -791,18 +791,18 @@ class Interaction extends Window public function toDebugX(worldX:Float, camera:FlxCamera) { if (FlxG.renderTile) - return camera.canvas.localToGlobal(new Point(worldX, 0)).x; + return camera.viewQuad.canvas.localToGlobal(new Point(worldX, 0)).x; else @:privateAccess - return camera._flashBitmap.localToGlobal(new Point(worldX, 0)).x; + return camera.viewBlit._flashBitmap.localToGlobal(new Point(worldX, 0)).x; } public function toDebugY(worldY:Float, camera:FlxCamera) { if (FlxG.renderTile) - return camera.canvas.localToGlobal(new Point(0, worldY)).y; + return camera.viewQuad.canvas.localToGlobal(new Point(0, worldY)).y; else @:privateAccess - return camera._flashBitmap.localToGlobal(new Point(0, worldY)).y; + return camera.viewBlit._flashBitmap.localToGlobal(new Point(0, worldY)).y; } } diff --git a/flixel/system/debug/interaction/tools/Pointer.hx b/flixel/system/debug/interaction/tools/Pointer.hx index ecc4d354a4..e11a070126 100644 --- a/flixel/system/debug/interaction/tools/Pointer.hx +++ b/flixel/system/debug/interaction/tools/Pointer.hx @@ -9,6 +9,7 @@ import flixel.math.FlxRect; import flixel.system.debug.Icon; import flixel.system.debug.interaction.Interaction; import flixel.util.FlxSpriteUtil; +import flixel.util.FlxColor; using flixel.util.FlxArrayUtil; @@ -133,9 +134,7 @@ class Pointer extends Tool override public function draw():Void { - var gfx:Graphics = _brain.getDebugGraphics(); - if (gfx == null) - return; + FlxG.camera.beginDrawDebug(); switch state { @@ -144,14 +143,13 @@ class Pointer extends Tool final rect = FlxRect.get(); setAbsRect(rect, startX, startY, _brain.flixelPointer.x, _brain.flixelPointer.y); // Render the selection rectangle - gfx.lineStyle(0.9, 0xbb0000); - gfx.drawRect(FlxG.camera.scroll.x + rect.x, FlxG.camera.scroll.y + rect.y, rect.width, rect.height); + var color:FlxColor = 0xbb0000; + color.alphaFloat = 0.9; + FlxG.camera.drawDebugRect(FlxG.camera.scroll.x + rect.x, FlxG.camera.scroll.y + rect.y, rect.width, rect.height, color); rect.put(); } - // Render everything into the camera buffer - if (FlxG.renderBlit) - FlxG.camera.buffer.draw(FlxSpriteUtil.flashGfxSprite); + FlxG.camera.endDrawDebug(); } static function setAbsRect(rect:FlxRect, x1:Float, y1:Float, x2:Float, y2:Float) @@ -174,4 +172,4 @@ private enum Selection { TOP(obj:Null); ALL(objs:Array); -} \ No newline at end of file +} diff --git a/flixel/system/debug/interaction/tools/Transform.hx b/flixel/system/debug/interaction/tools/Transform.hx index 428fa4b505..c26d428700 100644 --- a/flixel/system/debug/interaction/tools/Transform.hx +++ b/flixel/system/debug/interaction/tools/Transform.hx @@ -232,34 +232,35 @@ class Transform extends Tool case TRANSFORM(target, _, _, _): target; } + + FlxG.camera.beginDrawDebug(); - final gfx = _brain.getDebugGraphics(); - if (gfx == null) - return; - - drawSelection(gfx, target.getDefaultCamera()); - Marker.draw(target.x + target.origin.x, target.y + target.origin.y, false, gfx); + final camera = target.getDefaultCamera(); + drawSelection(camera); + Marker.draw(target.x + target.origin.x, target.y + target.origin.y, false, camera); - // Draw the debug info to the main camera buffer. - if (FlxG.renderBlit) - FlxG.camera.buffer.draw(FlxSpriteUtil.flashGfxSprite); + FlxG.camera.endDrawDebug(); } - - function drawSelection(gfx:Graphics, camera:FlxCamera) + + function drawSelection(camera:FlxCamera) { - gfx.lineStyle(1.0, FlxColor.MAGENTA, 1.0, false, LineScaleMode.NORMAL, CapsStyle.SQUARE); - // draw lines - gfx.moveTo(markers[3].x, markers[3].y); + var prevX = markers[3].x; + var prevY = markers[3].y; for (marker in markers) - gfx.lineTo(marker.x, marker.y); + { + camera.drawDebugLine(prevX, prevY, marker.x, marker.y, FlxColor.MAGENTA); + + prevX = marker.x; + prevY = marker.y; + } // draw markers for (marker in markers) { final x = marker.x; final y = marker.y; - Marker.draw(x, y, marker.type == ROTATE, gfx); + Marker.draw(x, y, marker.type == ROTATE, camera); } } } @@ -297,15 +298,13 @@ private class Marker y = target.y + target.origin.y + rot.y; rot.put(); } - - public static function draw(screenX:Float, screenY:Float, circle:Bool, gfx:Graphics) + + public static function draw(screenX:Float, screenY:Float, circle:Bool, camera:FlxCamera) { - gfx.beginFill(FlxColor.MAGENTA); if (circle) - gfx.drawCircle(screenX, screenY, CIRCLE_RADIUS); + camera.drawDebugCircle(screenX, screenY, CIRCLE_RADIUS, FlxColor.MAGENTA); else - gfx.drawRect(screenX - RECT_MARGIN, screenY - RECT_MARGIN, RECT_SIZE, RECT_SIZE); - gfx.endFill(); + camera.drawDebugFilledRect(screenX - RECT_MARGIN, screenY - RECT_MARGIN, RECT_SIZE, RECT_SIZE, FlxColor.MAGENTA); } } @@ -353,4 +352,4 @@ private enum TransformAction SET_SCALE_X(start:Float); SET_SCALE_Y(start:Float); SET_SCALE_XY(startX:Float, startY:Float); -} \ No newline at end of file +} diff --git a/flixel/system/render/blit/FlxBlitView.hx b/flixel/system/render/blit/FlxBlitView.hx index c1d5b15e43..fd7c069e7b 100644 --- a/flixel/system/render/blit/FlxBlitView.hx +++ b/flixel/system/render/blit/FlxBlitView.hx @@ -196,6 +196,38 @@ class FlxBlitView extends FlxCameraView { buffer.draw(FlxSpriteUtil.flashGfxSprite); } + + override public function drawDebugRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor, thickness:Float = 1.0):Void + { + final gfx = FlxSpriteUtil.flashGfx; + gfx.lineStyle(thickness, color.rgb, color.alphaFloat, false, null, null, MITER, 255); + gfx.drawRect(x, y, width, height); + } + + override public function drawDebugFilledRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor):Void + { + final gfx = FlxSpriteUtil.flashGfx; + gfx.lineStyle(); + gfx.beginFill(color.rgb, color.alphaFloat); + gfx.drawRect(x, y, width, height); + gfx.endFill(); + } + + override public function drawDebugCircle(x:Float, y:Float, radius:Float, color:FlxColor):Void + { + final gfx = FlxSpriteUtil.flashGfx; + gfx.beginFill(color.rgb, color.alphaFloat); + gfx.drawCircle(x, y, radius); + gfx.endFill(); + } + + override public function drawDebugLine(x1:Float, y1:Float, x2:Float, y2:Float, color:FlxColor, thickness:Float = 1.0):Void + { + final gfx = FlxSpriteUtil.flashGfx; + gfx.lineStyle(thickness, color.rgb, color.alphaFloat, false, null, null, MITER, 255); + gfx.moveTo(x1, x2); + gfx.lineTo(x2, y2); + } override function drawPixels(?frame:FlxFrame, ?pixels:BitmapData, matrix:FlxMatrix, ?transform:ColorTransform, ?blend:BlendMode, smoothing:Bool = false, ?shader:FlxShader):Void diff --git a/flixel/system/render/quad/FlxQuadView.hx b/flixel/system/render/quad/FlxQuadView.hx index 093e2fedf2..d615efce10 100644 --- a/flixel/system/render/quad/FlxQuadView.hx +++ b/flixel/system/render/quad/FlxQuadView.hx @@ -148,6 +148,38 @@ class FlxQuadView extends FlxCameraView camera.drawFX(); } + override public function drawDebugRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor, thickness:Float = 1.0):Void + { + final gfx = debugLayer.graphics; + gfx.lineStyle(thickness, color.rgb, color.alphaFloat, false, null, null, MITER, 255); + gfx.drawRect(x, y, width, height); + } + + override public function drawDebugFilledRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor):Void + { + final gfx = debugLayer.graphics; + gfx.lineStyle(); + gfx.beginFill(color.rgb, color.alphaFloat); + gfx.drawRect(x, y, width, height); + gfx.endFill(); + } + + override public function drawDebugCircle(x:Float, y:Float, radius:Float, color:FlxColor):Void + { + final gfx = debugLayer.graphics; + gfx.beginFill(color.rgb, color.alphaFloat); + gfx.drawCircle(x, y, radius); + gfx.endFill(); + } + + override public function drawDebugLine(x1:Float, y1:Float, x2:Float, y2:Float, color:FlxColor, thickness:Float = 1.0):Void + { + final gfx = debugLayer.graphics; + gfx.lineStyle(thickness, color.rgb, color.alphaFloat, false, null, null, MITER, 255); + gfx.moveTo(x1, x2); + gfx.lineTo(x2, y2); + } + override function drawPixels(?frame:FlxFrame, ?pixels:BitmapData, matrix:FlxMatrix, ?transform:ColorTransform, ?blend:BlendMode, smoothing:Bool = false, ?shader:FlxShader) { diff --git a/flixel/system/scaleModes/StageSizeScaleMode.hx b/flixel/system/scaleModes/StageSizeScaleMode.hx index e6cecff086..15c041ff63 100644 --- a/flixel/system/scaleModes/StageSizeScaleMode.hx +++ b/flixel/system/scaleModes/StageSizeScaleMode.hx @@ -32,8 +32,8 @@ class StageSizeScaleMode extends BaseScaleMode var newH = Math.ceil(Height / FlxG.camera.zoom); FlxG.camera.setSize(newW, newH); - FlxG.camera.flashSprite.x += (newW - oldW) / 2; - FlxG.camera.flashSprite.y += (newH - oldH) / 2; + FlxG.camera.display.x += (newW - oldW) / 2; + FlxG.camera.display.y += (newH - oldH) / 2; } } } diff --git a/flixel/tile/FlxTilemap.hx b/flixel/tile/FlxTilemap.hx index 85d3478b32..bca2cc2548 100644 --- a/flixel/tile/FlxTilemap.hx +++ b/flixel/tile/FlxTilemap.hx @@ -595,7 +595,7 @@ class FlxTypedTilemap extends FlxBaseTilemap if (color != null) { final colStr = color.toHexString(); - drawDebugBoundingBoxColor(camera.debugLayer.graphics, rect, color); + drawDebugBoundingBoxColor(camera, rect, color); } } } From 2d4eacb790c3da3595b2eb7187819ae67aaa8bf1 Mon Sep 17 00:00:00 2001 From: ACrazyTown <47027981+ACrazyTown@users.noreply.github.com> Date: Tue, 23 Dec 2025 14:47:53 +0100 Subject: [PATCH 05/28] FlxQuadView: wrap debug draw methods in FLX_DEBUG --- flixel/system/render/quad/FlxQuadView.hx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/flixel/system/render/quad/FlxQuadView.hx b/flixel/system/render/quad/FlxQuadView.hx index d615efce10..aaab60857c 100644 --- a/flixel/system/render/quad/FlxQuadView.hx +++ b/flixel/system/render/quad/FlxQuadView.hx @@ -148,14 +148,15 @@ class FlxQuadView extends FlxCameraView camera.drawFX(); } - override public function drawDebugRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor, thickness:Float = 1.0):Void + #if FLX_DEBUG + override function drawDebugRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor, thickness:Float = 1.0):Void { final gfx = debugLayer.graphics; gfx.lineStyle(thickness, color.rgb, color.alphaFloat, false, null, null, MITER, 255); gfx.drawRect(x, y, width, height); } - override public function drawDebugFilledRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor):Void + override function drawDebugFilledRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor):Void { final gfx = debugLayer.graphics; gfx.lineStyle(); @@ -164,7 +165,7 @@ class FlxQuadView extends FlxCameraView gfx.endFill(); } - override public function drawDebugCircle(x:Float, y:Float, radius:Float, color:FlxColor):Void + override function drawDebugCircle(x:Float, y:Float, radius:Float, color:FlxColor):Void { final gfx = debugLayer.graphics; gfx.beginFill(color.rgb, color.alphaFloat); @@ -172,13 +173,14 @@ class FlxQuadView extends FlxCameraView gfx.endFill(); } - override public function drawDebugLine(x1:Float, y1:Float, x2:Float, y2:Float, color:FlxColor, thickness:Float = 1.0):Void + override function drawDebugLine(x1:Float, y1:Float, x2:Float, y2:Float, color:FlxColor, thickness:Float = 1.0):Void { final gfx = debugLayer.graphics; gfx.lineStyle(thickness, color.rgb, color.alphaFloat, false, null, null, MITER, 255); gfx.moveTo(x1, x2); gfx.lineTo(x2, y2); } + #end override function drawPixels(?frame:FlxFrame, ?pixels:BitmapData, matrix:FlxMatrix, ?transform:ColorTransform, ?blend:BlendMode, smoothing:Bool = false, ?shader:FlxShader) From 07215116adae7eb5bcabb1322a928459099638f6 Mon Sep 17 00:00:00 2001 From: ACrazyTown <47027981+ACrazyTown@users.noreply.github.com> Date: Wed, 24 Dec 2025 12:41:15 +0100 Subject: [PATCH 06/28] use FlxCameraView to count draw calls --- flixel/FlxGame.hx | 7 +++---- flixel/graphics/tile/FlxDrawBaseItem.hx | 16 ++++++++++++++-- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/flixel/FlxGame.hx b/flixel/FlxGame.hx index 6f9eb08b3b..8337763b5b 100644 --- a/flixel/FlxGame.hx +++ b/flixel/FlxGame.hx @@ -1,6 +1,6 @@ package flixel; -import flixel.graphics.tile.FlxDrawBaseItem; +import flixel.system.render.FlxCameraView; import flixel.system.FlxSplash; import flixel.util.FlxArrayUtil; import flixel.util.FlxDestroyUtil; @@ -803,8 +803,7 @@ class FlxGame extends Sprite FlxG.signals.preDraw.dispatch(); - if (FlxG.renderTile) - FlxDrawBaseItem.drawCalls = 0; + FlxCameraView.totalDrawCalls = 0; FlxG.cameras.lock(); @@ -824,7 +823,7 @@ class FlxGame extends Sprite FlxG.cameras.render(); #if FLX_DEBUG - debugger.stats.drawCalls(FlxDrawBaseItem.drawCalls); + debugger.stats.drawCalls(FlxCameraView.totalDrawCalls); #end } diff --git a/flixel/graphics/tile/FlxDrawBaseItem.hx b/flixel/graphics/tile/FlxDrawBaseItem.hx index fc91f4d8a1..d89be00aef 100644 --- a/flixel/graphics/tile/FlxDrawBaseItem.hx +++ b/flixel/graphics/tile/FlxDrawBaseItem.hx @@ -2,6 +2,7 @@ package flixel.graphics.tile; import flixel.FlxCamera; import flixel.graphics.frames.FlxFrame; +import flixel.system.render.FlxCameraView; import flixel.math.FlxMatrix; import openfl.display.BlendMode; import openfl.geom.ColorTransform; @@ -14,7 +15,18 @@ class FlxDrawBaseItem /** * Tracks the total number of draw calls made each frame. */ - public static var drawCalls:Int = 0; + @:deprecated("drawCalls is deprecated, use FlxCameraView.totalDrawCalls instead") + public static var drawCalls(get, set):Int; + + static function set_drawCalls(value:Int):Int + { + return FlxCameraView.totalDrawCalls = value; + } + + static function get_drawCalls():Int + { + return FlxCameraView.totalDrawCalls; + } @:noCompletion @:deprecated("blendToInt() is deprecated, remove all references to it") @@ -63,7 +75,7 @@ class FlxDrawBaseItem public function render(camera:FlxCamera):Void { - drawCalls++; + FlxCameraView.totalDrawCalls++; } public function addQuad(frame:FlxFrame, matrix:FlxMatrix, ?transform:ColorTransform):Void {} From f45d5a1e03b01254a800e6eb392f4fe0929eb5df Mon Sep 17 00:00:00 2001 From: ACrazyTown <47027981+ACrazyTown@users.noreply.github.com> Date: Wed, 24 Dec 2025 13:06:22 +0100 Subject: [PATCH 07/28] Fix filters --- flixel/system/render/FlxCameraView.hx | 20 +++++++++++++++++++- flixel/system/render/quad/FlxQuadView.hx | 2 +- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/flixel/system/render/FlxCameraView.hx b/flixel/system/render/FlxCameraView.hx index e70383fbd5..4bf3e38e7b 100644 --- a/flixel/system/render/FlxCameraView.hx +++ b/flixel/system/render/FlxCameraView.hx @@ -129,12 +129,30 @@ class FlxCameraView implements IFlxDestroyable */ public var viewBottom(get, never):Float; + /** + * A shortcut for `camera.antialiasing`. Used so implementations can listen to changes. + */ public var antialiasing(get, set):Bool; + + /** + * A shortcut for `camera.angle`. Used so implementations can listen to changes. + */ public var angle(get, set):Float; + + /** + * A shortcut for `camera.alpha`. Used so implementations can listen to changes. + */ public var alpha(get, set):Float; + + /** + * A shortcut for `camera.color`. Used so implementations can listen to changes. + */ public var color(get, set):FlxColor; + + /** + * A shortcut for `camera.visible`. Used so implementations can listen to changes. + */ public var visible(get, set):Bool; - public var filters:Array = []; var _flashOffset:FlxPoint = FlxPoint.get(); diff --git a/flixel/system/render/quad/FlxQuadView.hx b/flixel/system/render/quad/FlxQuadView.hx index aaab60857c..68fc74f63f 100644 --- a/flixel/system/render/quad/FlxQuadView.hx +++ b/flixel/system/render/quad/FlxQuadView.hx @@ -133,7 +133,7 @@ class FlxQuadView extends FlxCameraView override function render():Void { - flashSprite.filters = camera.filtersEnabled ? filters : null; + flashSprite.filters = camera.filtersEnabled ? camera.filters : null; var currItem:FlxDrawBaseItem = _headOfDrawStack; while (currItem != null) From 5a81eafed44149e9c4cd9cc029bdf0e7d2dd9f9b Mon Sep 17 00:00:00 2001 From: ACrazyTown <47027981+ACrazyTown@users.noreply.github.com> Date: Wed, 24 Dec 2025 13:39:27 +0100 Subject: [PATCH 08/28] drawDebugCircle -> drawDebugFilledCircle --- flixel/FlxCamera.hx | 4 ++-- flixel/system/debug/interaction/tools/Transform.hx | 2 +- flixel/system/render/FlxCameraView.hx | 2 +- flixel/system/render/blit/FlxBlitView.hx | 2 +- flixel/system/render/quad/FlxQuadView.hx | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/flixel/FlxCamera.hx b/flixel/FlxCamera.hx index 05c5cff0de..4985f060f6 100644 --- a/flixel/FlxCamera.hx +++ b/flixel/FlxCamera.hx @@ -695,9 +695,9 @@ class FlxCamera extends FlxBasic view.drawDebugFilledRect(x, y, width, height, color); } - public function drawDebugCircle(x:Float, y:Float, radius:Float, color:FlxColor):Void + public function drawDebugFilledCircle(x:Float, y:Float, radius:Float, color:FlxColor):Void { - view.drawDebugCircle(x, y, radius, color); + view.drawDebugFilledCircle(x, y, radius, color); } public function drawDebugLine(x1:Float, y1:Float, x2:Float, y2:Float, color:FlxColor, thickness:Float = 1.0):Void diff --git a/flixel/system/debug/interaction/tools/Transform.hx b/flixel/system/debug/interaction/tools/Transform.hx index c26d428700..44b050492d 100644 --- a/flixel/system/debug/interaction/tools/Transform.hx +++ b/flixel/system/debug/interaction/tools/Transform.hx @@ -302,7 +302,7 @@ private class Marker public static function draw(screenX:Float, screenY:Float, circle:Bool, camera:FlxCamera) { if (circle) - camera.drawDebugCircle(screenX, screenY, CIRCLE_RADIUS, FlxColor.MAGENTA); + camera.drawDebugFilledCircle(screenX, screenY, CIRCLE_RADIUS, FlxColor.MAGENTA); else camera.drawDebugFilledRect(screenX - RECT_MARGIN, screenY - RECT_MARGIN, RECT_SIZE, RECT_SIZE, FlxColor.MAGENTA); } diff --git a/flixel/system/render/FlxCameraView.hx b/flixel/system/render/FlxCameraView.hx index 4bf3e38e7b..da814eb7e2 100644 --- a/flixel/system/render/FlxCameraView.hx +++ b/flixel/system/render/FlxCameraView.hx @@ -189,7 +189,7 @@ class FlxCameraView implements IFlxDestroyable public function drawDebugFilledRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor):Void {} - public function drawDebugCircle(x:Float, y:Float, radius:Float, color:FlxColor):Void {} + public function drawDebugFilledCircle(x:Float, y:Float, radius:Float, color:FlxColor):Void {} public function drawDebugLine(x1:Float, y1:Float, x2:Float, y2:Float, color:FlxColor, thickness:Float = 1.0):Void {} diff --git a/flixel/system/render/blit/FlxBlitView.hx b/flixel/system/render/blit/FlxBlitView.hx index fd7c069e7b..86b3613f08 100644 --- a/flixel/system/render/blit/FlxBlitView.hx +++ b/flixel/system/render/blit/FlxBlitView.hx @@ -213,7 +213,7 @@ class FlxBlitView extends FlxCameraView gfx.endFill(); } - override public function drawDebugCircle(x:Float, y:Float, radius:Float, color:FlxColor):Void + override public function drawDebugFilledCircle(x:Float, y:Float, radius:Float, color:FlxColor):Void { final gfx = FlxSpriteUtil.flashGfx; gfx.beginFill(color.rgb, color.alphaFloat); diff --git a/flixel/system/render/quad/FlxQuadView.hx b/flixel/system/render/quad/FlxQuadView.hx index 68fc74f63f..13e42dad8a 100644 --- a/flixel/system/render/quad/FlxQuadView.hx +++ b/flixel/system/render/quad/FlxQuadView.hx @@ -165,7 +165,7 @@ class FlxQuadView extends FlxCameraView gfx.endFill(); } - override function drawDebugCircle(x:Float, y:Float, radius:Float, color:FlxColor):Void + override function drawDebugFilledCircle(x:Float, y:Float, radius:Float, color:FlxColor):Void { final gfx = debugLayer.graphics; gfx.beginFill(color.rgb, color.alphaFloat); From dfd46040f1f7c2e97c686fce005bc12e79b2d60a Mon Sep 17 00:00:00 2001 From: ACrazyTown <47027981+ACrazyTown@users.noreply.github.com> Date: Wed, 24 Dec 2025 13:53:39 +0100 Subject: [PATCH 09/28] move view margins back to FlxCamera doesn't seem to be a reason for them to be in FlxCameraView? if I've overlooked something then we can easily move them back at some later point in time --- flixel/FlxCamera.hx | 13 +- flixel/system/render/FlxCameraView.hx | 144 +---------------------- flixel/system/render/blit/FlxBlitView.hx | 16 +-- flixel/system/render/quad/FlxQuadView.hx | 4 +- 4 files changed, 17 insertions(+), 160 deletions(-) diff --git a/flixel/FlxCamera.hx b/flixel/FlxCamera.hx index 4985f060f6..3f5ab8e4b0 100644 --- a/flixel/FlxCamera.hx +++ b/flixel/FlxCamera.hx @@ -53,6 +53,7 @@ using flixel.util.FlxColorTransformUtil; * |-> `canvas:Sprite` (its graphics is used for rendering objects in tile render mode) * |-> `debugLayer:Sprite` (this sprite is used in tile render mode for rendering debug info, like bounding boxes) */ +@:allow(flixel.system.render.FlxCameraView) class FlxCamera extends FlxBasic { /** @@ -1853,8 +1854,7 @@ class FlxCamera extends FlxBasic { width = Value; - if (view != null) - view.calcMarginX(); + calcMarginX(); updateFlashOffset(); updateScrollRect(); updateInternalSpritePositions(); @@ -1870,8 +1870,7 @@ class FlxCamera extends FlxBasic { height = Value; - if (view != null) - view.calcMarginY(); + calcMarginY(); updateFlashOffset(); updateScrollRect(); updateInternalSpritePositions(); @@ -1936,16 +1935,14 @@ class FlxCamera extends FlxBasic return this.visible = visible; } - @:deprecated("depshared") inline function calcMarginX():Void { - view.calcMarginX(); + viewMarginX = 0.5 * width * (scaleX - initialZoom) / scaleX; } - @:deprecated("depshared") inline function calcMarginY():Void { - view.calcMarginY(); + viewMarginY = 0.5 * height * (scaleY - initialZoom) / scaleY; } static inline function get_defaultCameras():Array diff --git a/flixel/system/render/FlxCameraView.hx b/flixel/system/render/FlxCameraView.hx index da814eb7e2..7e1de9eae0 100644 --- a/flixel/system/render/FlxCameraView.hx +++ b/flixel/system/render/FlxCameraView.hx @@ -59,76 +59,6 @@ class FlxCameraView implements IFlxDestroyable */ public var camera(default, null):FlxCamera; - /** - * The margin cut off on the left and right by the camera zooming in (or out), in world space. - */ - public var viewMarginX(default, null):Float; - - /** - * The margin cut off on the top and bottom by the camera zooming in (or out), in world space. - */ - public var viewMarginY(default, null):Float; - - /** - * The margin cut off on the left by the camera zooming in (or out), in world space. - */ - public var viewMarginLeft(get, never):Float; - - /** - * The margin cut off on the top by the camera zooming in (or out), in world space - */ - public var viewMarginTop(get, never):Float; - - /** - * The margin cut off on the right by the camera zooming in (or out), in world space - */ - public var viewMarginRight(get, never):Float; - - /** - * The margin cut off on the bottom by the camera zooming in (or out), in world space - */ - public var viewMarginBottom(get, never):Float; - - /** - * The size of the camera's view, in world space. - */ - public var viewWidth(get, never):Float; - - /** - * The size of the camera's view, in world space. - */ - public var viewHeight(get, never):Float; - - /** - * The left of the camera's view, in world space. - */ - public var viewX(get, never):Float; - - /** - * The top of the camera's view, in world space. - */ - public var viewY(get, never):Float; - - /** - * The left of the camera's view, in world space. - */ - public var viewLeft(get, never):Float; - - /** - * The top of the camera's view, in world space. - */ - public var viewTop(get, never):Float; - - /** - * The right side of the camera's view, in world space. - */ - public var viewRight(get, never):Float; - - /** - * The bottom side of the camera's view, in world space. - */ - public var viewBottom(get, never):Float; - /** * A shortcut for `camera.antialiasing`. Used so implementations can listen to changes. */ @@ -199,8 +129,8 @@ class FlxCameraView implements IFlxDestroyable function updateScale():Void { - calcMarginX(); - calcMarginY(); + camera.calcMarginX(); + camera.calcMarginY(); } function updatePosition():Void {} @@ -270,76 +200,6 @@ class FlxCameraView implements IFlxDestroyable function checkResize():Void {} - public inline function calcMarginX():Void - { - viewMarginX = 0.5 * camera.width * (camera.scaleX - camera.initialZoom) / camera.scaleX; - } - - public inline function calcMarginY():Void - { - viewMarginY = 0.5 * camera.height * (camera.scaleY - camera.initialZoom) / camera.scaleY; - } - - inline function get_viewMarginLeft():Float - { - return viewMarginX; - } - - inline function get_viewMarginTop():Float - { - return viewMarginY; - } - - inline function get_viewMarginRight():Float - { - return camera.width - viewMarginX; - } - - inline function get_viewMarginBottom():Float - { - return camera.height - viewMarginY; - } - - inline function get_viewWidth():Float - { - return camera.width - viewMarginX * 2; - } - - inline function get_viewHeight():Float - { - return camera.height - viewMarginY * 2; - } - - inline function get_viewX():Float - { - return camera.scroll.x + viewMarginX; - } - - inline function get_viewY():Float - { - return camera.scroll.y + viewMarginY; - } - - inline function get_viewLeft():Float - { - return viewX; - } - - inline function get_viewTop():Float - { - return viewY; - } - - inline function get_viewRight():Float - { - return camera.scroll.x + viewMarginRight; - } - - inline function get_viewBottom():Float - { - return camera.scroll.y + viewMarginBottom; - } - function get_display():DisplayObjectContainer { return null; diff --git a/flixel/system/render/blit/FlxBlitView.hx b/flixel/system/render/blit/FlxBlitView.hx index 86b3613f08..7b626aafd5 100644 --- a/flixel/system/render/blit/FlxBlitView.hx +++ b/flixel/system/render/blit/FlxBlitView.hx @@ -241,7 +241,7 @@ class FlxBlitView extends FlxCameraView } else { - _helperMatrix.translate(-viewMarginLeft, -viewMarginTop); + _helperMatrix.translate(-camera.viewMarginLeft, -camera.viewMarginTop); buffer.draw(pixels, _helperMatrix, null, blend, null, (smoothing || antialiasing)); } } @@ -260,8 +260,8 @@ class FlxBlitView extends FlxCameraView } else { - _helperPoint.x = destPoint.x - Std.int(viewMarginLeft); - _helperPoint.y = destPoint.y - Std.int(viewMarginTop); + _helperPoint.x = destPoint.x - Std.int(camera.viewMarginLeft); + _helperPoint.y = destPoint.y - Std.int(camera.viewMarginTop); buffer.copyPixels(pixels, sourceRect, _helperPoint, null, null, true); } } @@ -275,7 +275,7 @@ class FlxBlitView extends FlxCameraView override function drawTriangles(graphic:FlxGraphic, vertices:DrawData, indices:DrawData, uvtData:DrawData, ?colors:DrawData, ?position:FlxPoint, ?blend:BlendMode, repeat:Bool = false, smoothing:Bool = false, ?transform:ColorTransform, ?shader:FlxShader) { - final cameraBounds = _bounds.set(viewMarginLeft, viewMarginTop, viewWidth, viewHeight); + final cameraBounds = _bounds.set(camera.viewMarginLeft, camera.viewMarginTop, camera.viewWidth, camera.viewHeight); if (position == null) position = renderPoint.set(); @@ -327,7 +327,7 @@ class FlxBlitView extends FlxCameraView else { _helperMatrix.identity(); - _helperMatrix.translate(-viewMarginLeft, -viewMarginTop); + _helperMatrix.translate(-camera.viewMarginLeft, -camera.viewMarginTop); } buffer.draw(trianglesSprite, _helperMatrix, transform); @@ -443,7 +443,7 @@ class FlxBlitView extends FlxCameraView inline function updateBlitMatrix():Void { _blitMatrix.identity(); - _blitMatrix.translate(-viewMarginLeft, -viewMarginTop); + _blitMatrix.translate(-camera.viewMarginLeft, -camera.viewMarginTop); _blitMatrix.scale(camera.scaleX, camera.scaleY); _useBlitMatrix = (camera.scaleX < camera.initialZoom) || (camera.scaleY < camera.initialZoom); @@ -451,7 +451,7 @@ class FlxBlitView extends FlxCameraView override function transformRect(rect:FlxRect):FlxRect { - rect.offset(-viewMarginLeft, -viewMarginTop); + rect.offset(-camera.viewMarginLeft, -camera.viewMarginTop); if (_useBlitMatrix) { @@ -466,7 +466,7 @@ class FlxBlitView extends FlxCameraView override function transformPoint(point:FlxPoint):FlxPoint { - point.subtract(viewMarginLeft, viewMarginTop); + point.subtract(camera.viewMarginLeft, camera.viewMarginTop); if (_useBlitMatrix) point.scale(camera.zoom); diff --git a/flixel/system/render/quad/FlxQuadView.hx b/flixel/system/render/quad/FlxQuadView.hx index 13e42dad8a..5c188814fe 100644 --- a/flixel/system/render/quad/FlxQuadView.hx +++ b/flixel/system/render/quad/FlxQuadView.hx @@ -216,7 +216,7 @@ class FlxQuadView extends FlxCameraView override function drawTriangles(graphic:FlxGraphic, vertices:DrawData, indices:DrawData, uvtData:DrawData, ?colors:DrawData, ?position:FlxPoint, ?blend:BlendMode, repeat:Bool = false, smoothing:Bool = false, ?transform:ColorTransform, ?shader:FlxShader) { - final cameraBounds = _bounds.set(viewMarginLeft, viewMarginTop, viewWidth, viewHeight); + final cameraBounds = _bounds.set(camera.viewMarginLeft, camera.viewMarginTop, camera.viewWidth, camera.viewHeight); final isColored = (colors != null && colors.length != 0) || (transform != null && transform.hasRGBMultipliers()); final hasColorOffsets = (transform != null && transform.hasRGBAOffsets()); @@ -231,7 +231,7 @@ class FlxQuadView extends FlxCameraView canvas.graphics.beginFill(color.rgb, color.alphaFloat); // i'm drawing rect with these parameters to avoid light lines at the top and left of the camera, // which could appear while cameras fading - canvas.graphics.drawRect(viewMarginLeft - 1, viewMarginTop - 1, viewWidth + 2, viewHeight + 2); + canvas.graphics.drawRect(camera.viewMarginLeft - 1, camera.viewMarginTop - 1, camera.viewWidth + 2, camera.viewHeight + 2); canvas.graphics.endFill(); } From 3cd97d9b4ea0ef5d4eb36849cf8809eacc02c80e Mon Sep 17 00:00:00 2001 From: ACrazyTown <47027981+ACrazyTown@users.noreply.github.com> Date: Wed, 24 Dec 2025 14:18:17 +0100 Subject: [PATCH 10/28] redo unlock/lock --- flixel/FlxCamera.hx | 12 ++--- flixel/FlxGame.hx | 8 ++-- flixel/system/frontEnds/CameraFrontEnd.hx | 57 ++++++++++++++++------- flixel/system/render/FlxCameraView.hx | 14 ++++-- flixel/system/render/blit/FlxBlitView.hx | 12 ++++- flixel/system/render/quad/FlxQuadView.hx | 7 +-- 6 files changed, 68 insertions(+), 42 deletions(-) diff --git a/flixel/FlxCamera.hx b/flixel/FlxCamera.hx index 3f5ab8e4b0..bc29a043ef 100644 --- a/flixel/FlxCamera.hx +++ b/flixel/FlxCamera.hx @@ -659,9 +659,9 @@ class FlxCamera extends FlxBasic } @:allow(flixel.system.frontEnds.CameraFrontEnd) - inline function lock(?useBufferLocking:Bool):Void + inline function clear():Void { - view.lock(useBufferLocking); + view.clear(); } @:allow(flixel.system.frontEnds.CameraFrontEnd) @@ -669,13 +669,7 @@ class FlxCamera extends FlxBasic { view.render(); } - - @:allow(flixel.system.frontEnds.CameraFrontEnd) - inline function unlock(?useBufferLocking:Bool):Void - { - view.unlock(useBufferLocking); - } - + public function beginDrawDebug():Void { view.beginDrawDebug(); diff --git a/flixel/FlxGame.hx b/flixel/FlxGame.hx index 8337763b5b..a71d34cfa7 100644 --- a/flixel/FlxGame.hx +++ b/flixel/FlxGame.hx @@ -805,7 +805,7 @@ class FlxGame extends Sprite FlxCameraView.totalDrawCalls = 0; - FlxG.cameras.lock(); + FlxG.cameras.clear(); if (FlxG.plugins.drawOnTop) { @@ -818,17 +818,15 @@ class FlxGame extends Sprite _state.draw(); } + FlxG.cameras.render(); + if (FlxG.renderTile) { - FlxG.cameras.render(); - #if FLX_DEBUG debugger.stats.drawCalls(FlxCameraView.totalDrawCalls); #end } - FlxG.cameras.unlock(); - FlxG.signals.postDraw.dispatch(); #if FLX_DEBUG diff --git a/flixel/system/frontEnds/CameraFrontEnd.hx b/flixel/system/frontEnds/CameraFrontEnd.hx index c334b6b849..0afc7fd36c 100644 --- a/flixel/system/frontEnds/CameraFrontEnd.hx +++ b/flixel/system/frontEnds/CameraFrontEnd.hx @@ -1,5 +1,6 @@ package flixel.system.frontEnds; +import flixel.system.render.blit.FlxBlitView; import openfl.geom.Rectangle; import flixel.FlxCamera; import flixel.FlxG; @@ -44,8 +45,11 @@ class CameraFrontEnd /** * Allows you to possibly slightly optimize the rendering process IF * you are not doing any pre-processing in your game state's draw() call. + * + * **NOTE**: Only works with the blitting renderer. */ - public var useBufferLocking:Bool = false; + @:deprecated("useBufferLocking is deprecated, use FlxBlitView.useBufferLocking, instead.") + public var useBufferLocking(get, set):Bool; /** * Internal helper variable for clearing the cameras each frame. @@ -253,45 +257,50 @@ class CameraFrontEnd * Called by the game object to lock all the camera buffers and clear them for the next draw pass. */ @:allow(flixel.FlxGame) + @:deprecated("lock() is deprecated, use clear() instead.") inline function lock():Void + { + clear(); + } + + /** + * Called by the game object to clear all the camera buffers for the next draw pass. + */ + @:allow(flixel.FlxGame) + inline function clear():Void { for (camera in list) { if ((camera != null) && camera.exists && camera.visible) { - camera.lock(useBufferLocking); + camera.clear(); } } } + /** + * Called by the game object to draw everything onto the screen. + */ @:allow(flixel.FlxGame) inline function render():Void { - if (FlxG.renderTile) + for (camera in list) { - for (camera in list) + if ((camera != null) && camera.exists && camera.visible) { - if ((camera != null) && camera.exists && camera.visible) - { - camera.render(); - } + camera.render(); } } } /** - * Called by the game object to draw the special FX and unlock all the camera buffers. + * Called by the game object to draw everything onto the screen. */ @:allow(flixel.FlxGame) + @:deprecated("unlock() is deprecated, use render() instead.") inline function unlock():Void { - for (camera in list) - { - if ((camera != null) && camera.exists && camera.visible) - { - camera.unlock(useBufferLocking); - } - } + render(); } /** @@ -335,4 +344,20 @@ class CameraFrontEnd return Color; } + + function get_useBufferLocking():Bool + { + if (FlxG.renderBlit) + return FlxBlitView.useBufferLocking; + + return false; + } + + function set_useBufferLocking(value:Bool):Bool + { + if (FlxG.renderBlit) + return FlxBlitView.useBufferLocking = value; + + return value; + } } diff --git a/flixel/system/render/FlxCameraView.hx b/flixel/system/render/FlxCameraView.hx index 7e1de9eae0..f3422c64f1 100644 --- a/flixel/system/render/FlxCameraView.hx +++ b/flixel/system/render/FlxCameraView.hx @@ -95,13 +95,17 @@ class FlxCameraView implements IFlxDestroyable { _flashOffset = FlxDestroyUtil.put(_flashOffset); } - - public function lock(?useBufferLocking:Bool):Void {} - + + /** + * Called prior to the rendering call, clears the screen and prepares everything needed. + */ + public function clear():Void {} + + /** + * The actual rendering call where everything gets drawn. + */ public function render():Void {} - public function unlock(?useBufferLocking:Bool):Void {} - public function drawPixels(?frame:FlxFrame, ?pixels:BitmapData, matrix:FlxMatrix, ?transform:ColorTransform, ?blend:BlendMode, smoothing:Bool = false, ?shader:FlxShader):Void {} diff --git a/flixel/system/render/blit/FlxBlitView.hx b/flixel/system/render/blit/FlxBlitView.hx index 7b626aafd5..e38bdbb1f7 100644 --- a/flixel/system/render/blit/FlxBlitView.hx +++ b/flixel/system/render/blit/FlxBlitView.hx @@ -28,6 +28,14 @@ import flixel.util.FlxSpriteUtil; class FlxBlitView extends FlxCameraView { + /** + * Whether the camera's buffer should be locked and unlocked during render calls. + * + * Allows you to possibly slightly optimize the rendering process IF + * you are not doing any pre-processing in your game state's draw() call. + */ + public static var useBufferLocking:Bool = false; + /** * Internal variable, used in blit render mode to render triangles (`drawTriangles()`) on camera's buffer. */ @@ -162,7 +170,7 @@ class FlxBlitView extends FlxCameraView _bounds = FlxDestroyUtil.put(_bounds); } - override function lock(?useBufferLocking:Bool) + override function clear():Void { checkResize(); @@ -175,7 +183,7 @@ class FlxBlitView extends FlxCameraView screen.dirty = true; } - override function unlock(?useBufferLocking:Bool):Void + override function render():Void { camera.drawFX(); diff --git a/flixel/system/render/quad/FlxQuadView.hx b/flixel/system/render/quad/FlxQuadView.hx index 5c188814fe..f7004f4e91 100644 --- a/flixel/system/render/quad/FlxQuadView.hx +++ b/flixel/system/render/quad/FlxQuadView.hx @@ -118,7 +118,7 @@ class FlxQuadView extends FlxCameraView _bounds = FlxDestroyUtil.put(_bounds); } - override function lock(?useBufferLocking:Bool):Void + override function clear():Void { clearDrawStack(); @@ -141,10 +141,7 @@ class FlxQuadView extends FlxCameraView currItem.render(camera); currItem = currItem.next; } - } - - override function unlock(?useBufferLocking:Bool):Void - { + camera.drawFX(); } From 1998f39bd4fd7ebef17d69da21b39a374fba2427 Mon Sep 17 00:00:00 2001 From: ACrazyTown <47027981+ACrazyTown@users.noreply.github.com> Date: Wed, 24 Dec 2025 17:58:38 +0100 Subject: [PATCH 11/28] A bunch of deprecations --- flixel/FlxCamera.hx | 238 ++++++++++++++++++++++++-------------------- 1 file changed, 130 insertions(+), 108 deletions(-) diff --git a/flixel/FlxCamera.hx b/flixel/FlxCamera.hx index bc29a043ef..062b40c828 100644 --- a/flixel/FlxCamera.hx +++ b/flixel/FlxCamera.hx @@ -44,16 +44,10 @@ using flixel.util.FlxColorTransformUtil; * The camera class is used to display the game's visuals. * By default one camera is created automatically, that is the same size as window. * You can add more cameras or even replace the main camera using utilities in `FlxG.cameras`. - * - * Every camera has following display list: - * `flashSprite:Sprite` (which is a container for everything else in the camera, it's added to FlxG.game sprite) - * |-> `_scrollRect:Sprite` (which is used for cropping camera's graphic, mostly in tile render mode) - * |-> `_flashBitmap:Bitmap` (its bitmapData property is buffer BitmapData, this var is used in blit render mode. - * Everything is rendered on buffer in blit render mode) - * |-> `canvas:Sprite` (its graphics is used for rendering objects in tile render mode) - * |-> `debugLayer:Sprite` (this sprite is used in tile render mode for rendering debug info, like bounding boxes) */ @:allow(flixel.system.render.FlxCameraView) +@:access(flixel.system.render.blit.FlxBlitView) +@:access(flixel.system.render.quad.FlxQuadView) class FlxCamera extends FlxBasic { /** @@ -117,14 +111,14 @@ class FlxCamera extends FlxBasic public var view(default, null):FlxCameraView; /** - * This camera's `view`, but typed as a `FlxQuadView`. + * This camera's `view`, typed as a `FlxQuadView`. * * **NOTE**: May be null depending on the render implementation used. */ public var viewQuad(default, null):Null; /** - * This camera's `view`, but typed as a `FlxBlitView`. + * This camera's `view`, typed as a `FlxBlitView`. * * **NOTE**: May be null depending on the render implementation used. */ @@ -193,8 +187,10 @@ class FlxCamera extends FlxBasic * The actual `BitmapData` of the camera display itself. * Used in blit render mode, where you can manipulate its pixels for achieving some visual effects. */ - @:deprecated("buffer is deprecated, avoid referencing it directly and use the methods from camera.view instead") + @:deprecated("buffer is deprecated, use camera.viewBlit.buffer, instead") public var buffer(get, set):BitmapData; + inline function set_buffer(value:BitmapData):BitmapData return viewBlit.buffer = value; + inline function get_buffer():BitmapData return viewBlit.buffer; /** * The natural background color of the camera, in `AARRGGBB` format. Defaults to `FlxG.cameras.bgColor`. @@ -209,8 +205,10 @@ class FlxCamera extends FlxBasic * * **NOTE:** This field is only used in blit render mode. */ - @:deprecated("screen is deprecated, avoid referencing it directly and use the methods from camera.view instead") + @:deprecated("screen is deprecated, use camera.viewBlit.screen, instead") public var screen(get, set):FlxSprite; + inline function set_screen(value:FlxSprite):FlxSprite return viewBlit.screen = value; + inline function get_screen():FlxSprite return viewBlit.screen; /** * Whether to use alpha blending for the camera's background fill or not. @@ -231,8 +229,17 @@ class FlxCamera extends FlxBasic * * Its position is modified by `updateFlashSpritePosition()` which is called every frame. */ - @:deprecated("flashSprite is deprecated, avoid referencing it directly and use the methods from camera.view instead") + @:deprecated("flashSprite is deprecated, use camera.viewQuad.flashSprite/camera.viewBlit.flashSprite, instead") public var flashSprite(get, set):Sprite; + inline function set_flashSprite(value:Sprite):Sprite + { + var sprite = FlxG.renderTile ? viewQuad.flashSprite : viewBlit.flashSprite; + return sprite = value; + } + inline function get_flashSprite():Sprite + { + return FlxG.renderTile ? viewQuad.flashSprite : viewBlit.flashSprite; + } /** * Whether the positions of the objects rendered on this camera are rounded. @@ -362,14 +369,18 @@ class FlxCamera extends FlxBasic * Helper matrix object. Used in blit render mode when camera's zoom is less than initialZoom * (it is applied to all objects rendered on the camera at such circumstances). */ - @:deprecated("depblit") - var _blitMatrix:FlxMatrix = new FlxMatrix(); + @:deprecated("_blitMatrix is deprecated, use camera.viewBlit.blitMatrix, instead") + var _blitMatrix(get, set):FlxMatrix; + inline function get__blitMatrix():FlxMatrix return viewBlit._blitMatrix; + inline function set__blitMatrix(value:FlxMatrix) return viewBlit._blitMatrix = value; /** * Logical flag for tracking whether to apply _blitMatrix transformation to objects or not. */ - @:deprecated("depblit") - var _useBlitMatrix:Bool = false; + @:deprecated("_useBlitMatrix is deprecated, use camera.viewBlit._useBlitMatrix, instead") + var _useBlitMatrix(get, set):Bool; + inline function get__useBlitMatrix():Bool return viewBlit._useBlitMatrix; + inline function set__useBlitMatrix(value:Bool) return viewBlit._useBlitMatrix = value; /** * The alpha value of this camera display (a number between `0.0` and `1.0`). @@ -408,16 +419,20 @@ class FlxCamera extends FlxBasic * (the area of camera's buffer which should be filled with `bgColor`). * Do not modify it unless you know what are you doing. */ - @:deprecated("depblit") + @:deprecated("_flashRect is deprecated, use camera.viewBlit._flashRect, instead") var _flashRect:Rectangle; + inline function get__flashRect():Rectangle return viewBlit._flashRect; + inline function set__flashRect(value:Rectangle) return viewBlit._flashRect = value; /** * Internal, used in blit render mode in camera's `fill()` method for less garbage creation: * Its coordinates are always `(0,0)`, where camera's buffer filling should start. * Do not modify it unless you know what are you doing. */ - @:deprecated("depblit") + @:deprecated("_flashPoint is deprecated, use camera.viewBlit._flashPoint, instead") var _flashPoint:Point = new Point(); + inline function get__flashPoint():Point return viewBlit._flashPoint; + inline function set__flashPoint(value:Point) return viewBlit._flashPoint = value; /** * Internal, used for positioning camera's `flashSprite` on screen. @@ -426,7 +441,10 @@ class FlxCamera extends FlxBasic * Its value depends on camera's size (`width` and `height`), game's `scale` and camera's initial zoom factor. * Do not modify it unless you know what are you doing. */ - var _flashOffset:FlxPoint = FlxPoint.get(); + @:deprecated("_flashOffset is deprecated, use camera.view._flashOffset, instead") + var _flashOffset(get, set):FlxPoint; + inline function get__flashOffset():FlxPoint return view._flashOffset; + inline function set__flashOffset(value:FlxPoint) return view._flashOffset = value; /** * Internal, represents the color of `flash()` special effect. @@ -524,8 +542,10 @@ class FlxCamera extends FlxBasic * Internal helper variable for doing better wipes/fills between renders. * Used it blit render mode only (in `fill()` method). */ - @:deprecated("depblit") - var _fill:BitmapData; + @:deprecated("_fill is deprecated, use camera.viewBlit._fill, instead") + var _fill(get, set):BitmapData; + inline function get__fill():BitmapData return viewBlit._fill; + inline function set__fill(value:BitmapData):BitmapData return viewBlit._fill = value; /** * Internal, used to render buffer to screen space. Used it blit render mode only. @@ -533,22 +553,42 @@ class FlxCamera extends FlxBasic * Its position is modified by `updateInternalSpritePositions()`, which is called on camera's resize and scale events. * It is a child of the `_scrollRect` `Sprite`. */ - @:deprecated("depblit") - var _flashBitmap:Bitmap; + @:deprecated("_flashBitmap is deprecated, use camera.viewBlit._flashBitmap, instead") + var _flashBitmap(get, set):Bitmap; + inline function get__flashBitmap():Bitmap return viewBlit._flashBitmap; + inline function set__flashBitmap(value:Bitmap):Bitmap return viewBlit._flashBitmap = value; /** * Internal sprite, used for correct trimming of camera viewport. * It is a child of `flashSprite`. * Its position is modified by `updateScrollRect()` method, which is called on camera's resize and scale events. */ - @:deprecated("depshared") - var _scrollRect:Sprite; + @:deprecated("_scrollRect is deprecated, use camera.viewQuad._scrollRect/camera.viewBlit._scrollRect, instead") + var _scrollRect(get, set):Sprite; + inline function get__scrollRect():Sprite + { + return FlxG.renderTile ? viewQuad._scrollRect : viewBlit._scrollRect; + } + inline function set__scrollRect(value:Sprite):Sprite + { + var scrollRect = FlxG.renderTile ? viewQuad._scrollRect : viewBlit._scrollRect; + return scrollRect = value; + } /** * Helper rect for `drawTriangles()` visibility checks */ - @:deprecated("depblit") - var _bounds:FlxRect; + @:deprecated("_bounds is deprecated, use camera.viewQuad._bounds/camera.viewBlit._bounds, instead") + var _bounds(get, set):FlxRect; + inline function get__bounds():FlxRect + { + return FlxG.renderTile ? viewQuad._bounds : viewBlit._bounds; + } + inline function set__bounds(value:FlxRect):FlxRect + { + var bounds = FlxG.renderTile ? viewQuad._bounds : viewBlit._bounds; + return bounds = value; + } /** * Sprite used for actual rendering in tile render mode (instead of `_flashBitmap` for blitting). @@ -556,8 +596,10 @@ class FlxCamera extends FlxBasic * It is a child of `_scrollRect` `Sprite` (which trims graphics that should be invisible). * Its position is modified by `updateInternalSpritePositions()`, which is called on camera's resize and scale events. */ - @:deprecated("canvas is deprecated, avoid referencing it directly and use the methods from camera.view instead") + @:deprecated("canvas is deprecated, use camera.viewQuad.canvas, instead") public var canvas(get, set):Sprite; + inline function set_canvas(value:Sprite):Sprite return viewQuad.canvas = value; + inline function get_canvas():Sprite return viewQuad.canvas; #if FLX_DEBUG /** @@ -566,73 +608,106 @@ class FlxCamera extends FlxBasic * It is a child of `_scrollRect` `Sprite` (which trims graphics that should be invisible). * Its position is modified by `updateInternalSpritePositions()`, which is called on camera's resize and scale events. */ - @:deprecated("debugLayer is deprecated, avoid referencing it directly and use the methods from camera.view instead") + @:deprecated("debugLayer is deprecated, use camera.viewQuad.debugLayer, instead") public var debugLayer(get, set):Sprite; + inline function set_debugLayer(value:Sprite):Sprite return viewQuad.debugLayer; + inline function get_debugLayer():Sprite return viewQuad.debugLayer; #end - @:deprecated("depshared") - var _helperMatrix:FlxMatrix = new FlxMatrix(); + @:deprecated("_helperMatrix is deprecated, use camera.viewQuad._helperMatrix/camera.viewBlit._helperMatrix, instead") + var _helperMatrix(get, set):FlxMatrix; + inline function get__helperMatrix():FlxMatrix + { + return FlxG.renderTile ? viewQuad._helperMatrix : viewBlit._helperMatrix; + } + inline function set__helperMatrix(value:FlxMatrix):FlxMatrix + { + var mat = FlxG.renderTile ? viewQuad._helperMatrix : viewBlit._helperMatrix; + return mat = value; + } - @:deprecated("depblit") - var _helperPoint:Point = new Point(); + @:deprecated("_helperPoint is deprecated, use camera.viewBlit._helperPoint, instead") + var _helperPoint(get, set):Point; + inline function get__helperPoint():Point return viewBlit._helperPoint; + inline function set__helperPoint(value:Point):Point return viewBlit._helperPoint = value; /** * Currently used draw stack item */ - @:deprecated("depquad") - var _currentDrawItem:FlxDrawBaseItem; + @:deprecated("_currentDrawItem is deprecated, use camera.viewQuad._currentDrawItem, instead") + var _currentDrawItem(get, set):FlxDrawBaseItem; + inline function get__currentDrawItem():FlxDrawBaseItem return viewQuad._currentDrawItem; + inline function set__currentDrawItem(value:FlxDrawBaseItem):FlxDrawBaseItem return viewQuad._currentDrawItem = value; /** * Pointer to head of stack with draw items */ - @:deprecated("depquad") - var _headOfDrawStack:FlxDrawBaseItem; + @:deprecated("_headOfDrawStack is deprecated, use camera.viewQuad._headOfDrawStack, instead") + var _headOfDrawStack(get, set):FlxDrawBaseItem; + inline function get__headOfDrawStack():FlxDrawBaseItem return viewQuad._headOfDrawStack; + inline function set__headOfDrawStack(value:FlxDrawBaseItem):FlxDrawBaseItem return viewQuad._headOfDrawStack = value; /** * Last draw tiles item */ - @:deprecated("depquad") - var _headTiles:FlxDrawQuadsItem; + @:deprecated("_headTiles is deprecated, use camera.viewQuad._headTiles, instead") + var _headTiles(get, set):FlxDrawQuadsItem; + inline function get__headTiles():FlxDrawQuadsItem return viewQuad._headTiles; + inline function set__headTiles(value:FlxDrawQuadsItem):FlxDrawQuadsItem return viewQuad._headTiles = value; /** * Last draw triangles item */ - @:deprecated("depquad") - var _headTriangles:FlxDrawTrianglesItem; + @:deprecated("_headTriangles is deprecated, use camera.viewQuad._headTriangles, instead") + var _headTriangles(get, set):FlxDrawTrianglesItem; + inline function get__headTriangles():FlxDrawTrianglesItem return viewQuad._headTriangles; + inline function set__headTriangles(value:FlxDrawTrianglesItem):FlxDrawTrianglesItem return viewQuad._headTriangles = value; /** * Draw tiles stack items that can be reused */ - @:deprecated("depquad") - static var _storageTilesHead:FlxDrawQuadsItem; + @:deprecated("_storageTilesHead is deprecated, use FlxQuadView._storageTilesHead, instead") + static var _storageTilesHead(get, set):FlxDrawQuadsItem; + static inline function get__storageTilesHead():FlxDrawQuadsItem return FlxQuadView._storageTilesHead; + static inline function set__storageTilesHead(value:FlxDrawQuadsItem):FlxDrawQuadsItem return FlxQuadView._storageTilesHead = value; /** * Draw triangles stack items that can be reused */ - @:deprecated("depquad") - static var _storageTrianglesHead:FlxDrawTrianglesItem; + @:deprecated("_storageTrianglesHead is deprecated, use FlxQuadView._storageTrianglesHead, instead") + static var _storageTrianglesHead(get, set):FlxDrawTrianglesItem; + static inline function get__storageTrianglesHead():FlxDrawTrianglesItem return FlxQuadView._storageTrianglesHead; + static inline function set__storageTrianglesHead(value:FlxDrawTrianglesItem):FlxDrawTrianglesItem return FlxQuadView._storageTrianglesHead = value; /** * Internal variable, used for visibility checks to minimize `drawTriangles()` calls. */ - @:deprecated("depblit") - static var drawVertices:Vector = new Vector(); + @:deprecated("drawVertices is deprecated, use FlxBlitView.drawVertices, instead") + static var drawVertices(get, set):Vector; + static inline function get_drawVertices():Vector return FlxBlitView.drawVertices; + static inline function set_drawVertices(value:Vector):Vector return FlxBlitView.drawVertices = value; /** * Internal variable, used in blit render mode to render triangles (`drawTriangles()`) on camera's buffer. */ - @:deprecated("depblit") - static var trianglesSprite:Sprite = new Sprite(); + @:deprecated("trianglesSprite is deprecated, use FlxBlitView.trianglesSprite, instead") + static var trianglesSprite(get, set):Sprite; + static inline function get_trianglesSprite():Sprite return FlxBlitView.trianglesSprite; + static inline function set_trianglesSprite(value:Sprite):Sprite return FlxBlitView.trianglesSprite = value; /** * Internal variables, used in blit render mode to draw trianglesSprite on camera's buffer. * Added for less garbage creation. */ - @:deprecated("depblit") - static var renderPoint:FlxPoint = FlxPoint.get(); + @:deprecated("renderPoint is deprecated, use FlxBlitView.renderPoint, instead") + static var renderPoint(get, set):FlxPoint; + static inline function get_renderPoint():FlxPoint return FlxBlitView.renderPoint; + static inline function set_renderPoint(value:FlxPoint):FlxPoint return FlxBlitView.renderPoint = value; - @:deprecated("depblit") - static var renderRect:FlxRect = FlxRect.get(); + @:deprecated("renderRect is deprecated, use FlxBlitView.renderRect, instead") + static var renderRect(get, set):FlxRect; + static inline function get_renderRect():FlxRect return FlxBlitView.renderRect; + static inline function set_renderRect(value:FlxRect):FlxRect return FlxBlitView.renderRect = value; @:noCompletion public function startQuadBatch(graphic:FlxGraphic, colored:Bool, hasColorOffsets:Bool = false, ?blend:BlendMode, smooth:Bool = false, ?shader:FlxShader) @@ -669,7 +744,7 @@ class FlxCamera extends FlxBasic { view.render(); } - + public function beginDrawDebug():Void { view.beginDrawDebug(); @@ -2013,59 +2088,6 @@ class FlxCamera extends FlxBasic { return view.display; } - - inline function set_flashSprite(value:Sprite):Sprite - { - var sprite = FlxG.renderTile ? viewQuad.flashSprite : viewBlit.flashSprite; - return sprite = value; - } - - inline function get_flashSprite():Sprite - { - return FlxG.renderTile ? viewQuad.flashSprite : viewBlit.flashSprite; - } - - inline function set_screen(value:FlxSprite):FlxSprite - { - return viewBlit.screen = value; - } - - inline function get_screen():FlxSprite - { - return viewBlit.screen; - } - - inline function set_buffer(value:BitmapData):BitmapData - { - return viewBlit.buffer = value; - } - - inline function get_buffer():BitmapData - { - return viewBlit.buffer; - } - - inline function set_canvas(value:Sprite):Sprite - { - return viewQuad.canvas = value; - } - - inline function get_canvas():Sprite - { - return viewQuad.canvas; - } - - #if FLX_DEBUG - inline function set_debugLayer(value:Sprite):Sprite - { - return viewQuad.debugLayer; - } - - inline function get_debugLayer():Sprite - { - return viewQuad.debugLayer; - } - #end /** * Do not use the following fields! They only exists because FlxCamera extends FlxBasic, From d7c4f9e38d27cad7fe9c58c266cfacb3b02a5f1e Mon Sep 17 00:00:00 2001 From: ACrazyTown <47027981+ACrazyTown@users.noreply.github.com> Date: Wed, 24 Dec 2025 18:08:57 +0100 Subject: [PATCH 12/28] missed this deprecation --- flixel/FlxCamera.hx | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/flixel/FlxCamera.hx b/flixel/FlxCamera.hx index 062b40c828..04fa23db4b 100644 --- a/flixel/FlxCamera.hx +++ b/flixel/FlxCamera.hx @@ -1448,14 +1448,10 @@ class FlxCamera extends FlxBasic view.checkResize(); } - @:deprecated("depblit") + @:deprecated("updateBlitMatrix() is deprecated, use camera.viewBlit.updateBlitMatrix(), instead") inline function updateBlitMatrix():Void { - _blitMatrix.identity(); - _blitMatrix.translate(-viewMarginLeft, -viewMarginTop); - _blitMatrix.scale(scaleX, scaleY); - - _useBlitMatrix = (scaleX < initialZoom) || (scaleY < initialZoom); + viewBlit.updateBlitMatrix(); } /** From 50357c79365310f8c69a756f5af241b31d1486bb Mon Sep 17 00:00:00 2001 From: ACrazyTown <47027981+ACrazyTown@users.noreply.github.com> Date: Wed, 24 Dec 2025 21:02:48 +0100 Subject: [PATCH 13/28] checkResize() shouldn't be a global thing --- flixel/FlxCamera.hx | 14 +++----------- flixel/system/render/FlxCameraView.hx | 2 -- flixel/system/render/blit/FlxBlitView.hx | 2 +- flixel/system/render/quad/FlxQuadView.hx | 15 ++++++++++----- 4 files changed, 14 insertions(+), 19 deletions(-) diff --git a/flixel/FlxCamera.hx b/flixel/FlxCamera.hx index 04fa23db4b..41a091be5c 100644 --- a/flixel/FlxCamera.hx +++ b/flixel/FlxCamera.hx @@ -1,13 +1,5 @@ package flixel; -import openfl.display.Bitmap; -import openfl.display.BitmapData; -import openfl.display.DisplayObject; -import openfl.display.Graphics; -import openfl.display.Sprite; -import openfl.geom.ColorTransform; -import openfl.geom.Point; -import openfl.geom.Rectangle; import flixel.graphics.FlxGraphic; import flixel.graphics.frames.FlxFrame; import flixel.graphics.tile.FlxDrawBaseItem; @@ -24,7 +16,6 @@ import flixel.system.render.blit.FlxBlitView; import flixel.util.FlxAxes; import flixel.util.FlxColor; import flixel.util.FlxDestroyUtil; -import flixel.util.FlxSpriteUtil; import openfl.Vector; import openfl.display.Bitmap; import openfl.display.BitmapData; @@ -1442,10 +1433,11 @@ class FlxCamera extends FlxBasic } } - @:allow(flixel.system.frontEnds.CameraFrontEnd) + @:deprecated("checkResize() is deprecated") function checkResize():Void { - view.checkResize(); + if (FlxG.renderBlit) + viewBlit.checkResize(); } @:deprecated("updateBlitMatrix() is deprecated, use camera.viewBlit.updateBlitMatrix(), instead") diff --git a/flixel/system/render/FlxCameraView.hx b/flixel/system/render/FlxCameraView.hx index f3422c64f1..90e3ad3c74 100644 --- a/flixel/system/render/FlxCameraView.hx +++ b/flixel/system/render/FlxCameraView.hx @@ -202,8 +202,6 @@ class FlxCameraView implements IFlxDestroyable return object; } - function checkResize():Void {} - function get_display():DisplayObjectContainer { return null; diff --git a/flixel/system/render/blit/FlxBlitView.hx b/flixel/system/render/blit/FlxBlitView.hx index e38bdbb1f7..30a1c07607 100644 --- a/flixel/system/render/blit/FlxBlitView.hx +++ b/flixel/system/render/blit/FlxBlitView.hx @@ -429,7 +429,7 @@ class FlxBlitView extends FlxCameraView } } - override function checkResize() + function checkResize():Void { if (camera.width != buffer.width || camera.height != buffer.height) { diff --git a/flixel/system/render/quad/FlxQuadView.hx b/flixel/system/render/quad/FlxQuadView.hx index f7004f4e91..2c4ddfde5e 100644 --- a/flixel/system/render/quad/FlxQuadView.hx +++ b/flixel/system/render/quad/FlxQuadView.hx @@ -1,5 +1,6 @@ package flixel.system.render.quad; +import openfl.display.Graphics; import flixel.math.FlxRect; import openfl.display.DisplayObjectContainer; import flixel.system.render.FlxCameraView; @@ -67,8 +68,10 @@ class FlxQuadView extends FlxCameraView * Helper rect for `drawTriangles()` visibility checks */ var _bounds:FlxRect = FlxRect.get(); - + var _helperMatrix:FlxMatrix = new FlxMatrix(); + + var targetGraphics:Graphics; @:allow(flixel.system.render.FlxCameraView) function new(camera:FlxCamera) @@ -85,6 +88,8 @@ class FlxQuadView extends FlxCameraView debugLayer = new Sprite(); _scrollRect.addChild(debugLayer); #end + + targetGraphics = canvas.graphics; } override function destroy():Void @@ -224,12 +229,12 @@ class FlxQuadView extends FlxCameraView override function fill(color:FlxColor, blendAlpha:Bool = true):Void { - canvas.graphics.overrideBlendMode(null); - canvas.graphics.beginFill(color.rgb, color.alphaFloat); + targetGraphics.overrideBlendMode(null); + targetGraphics.beginFill(color.rgb, color.alphaFloat); // i'm drawing rect with these parameters to avoid light lines at the top and left of the camera, // which could appear while cameras fading - canvas.graphics.drawRect(camera.viewMarginLeft - 1, camera.viewMarginTop - 1, camera.viewWidth + 2, camera.viewHeight + 2); - canvas.graphics.endFill(); + targetGraphics.drawRect(camera.viewMarginLeft - 1, camera.viewMarginTop - 1, camera.viewWidth + 2, camera.viewHeight + 2); + targetGraphics.endFill(); } override function offsetView(x:Float, y:Float):Void From ac364da622199672e622f91e78cc0800cefe7052 Mon Sep 17 00:00:00 2001 From: ACrazyTown <47027981+ACrazyTown@users.noreply.github.com> Date: Thu, 22 Jan 2026 22:02:13 +0100 Subject: [PATCH 14/28] FlxRenderer draft WIP; debug drawing is not functional yet and there's a bunch of temporary code that needs to be cleaned up --- flixel/FlxCamera.hx | 71 +++-- flixel/FlxG.hx | 63 ++-- flixel/FlxGame.hx | 6 +- flixel/graphics/tile/FlxDrawBaseItem.hx | 10 +- flixel/system/frontEnds/BitmapFrontEnd.hx | 18 +- flixel/system/frontEnds/CameraFrontEnd.hx | 14 +- flixel/system/render/FlxCameraView.hx | 53 +--- flixel/system/render/FlxRenderer.hx | 186 ++++++++++++ flixel/system/render/blit/FlxBlitRenderer.hx | 300 +++++++++++++++++++ flixel/system/render/blit/FlxBlitView.hx | 228 +------------- flixel/system/render/quad/FlxQuadRenderer.hx | 179 +++++++++++ flixel/system/render/quad/FlxQuadView.hx | 114 ------- 12 files changed, 757 insertions(+), 485 deletions(-) create mode 100644 flixel/system/render/FlxRenderer.hx create mode 100644 flixel/system/render/blit/FlxBlitRenderer.hx create mode 100644 flixel/system/render/quad/FlxQuadRenderer.hx diff --git a/flixel/FlxCamera.hx b/flixel/FlxCamera.hx index 41a091be5c..f38d91ef95 100644 --- a/flixel/FlxCamera.hx +++ b/flixel/FlxCamera.hx @@ -13,6 +13,7 @@ import flixel.system.FlxAssets.FlxShader; import flixel.system.render.FlxCameraView; import flixel.system.render.quad.FlxQuadView; import flixel.system.render.blit.FlxBlitView; +import flixel.system.render.blit.FlxBlitRenderer; import flixel.util.FlxAxes; import flixel.util.FlxColor; import flixel.util.FlxDestroyUtil; @@ -36,9 +37,8 @@ using flixel.util.FlxColorTransformUtil; * By default one camera is created automatically, that is the same size as window. * You can add more cameras or even replace the main camera using utilities in `FlxG.cameras`. */ -@:allow(flixel.system.render.FlxCameraView) -@:access(flixel.system.render.blit.FlxBlitView) -@:access(flixel.system.render.quad.FlxQuadView) +@:allow(flixel.system.render) +@:access(flixel.system.render) class FlxCamera extends FlxBasic { /** @@ -675,16 +675,16 @@ class FlxCamera extends FlxBasic */ @:deprecated("drawVertices is deprecated, use FlxBlitView.drawVertices, instead") static var drawVertices(get, set):Vector; - static inline function get_drawVertices():Vector return FlxBlitView.drawVertices; - static inline function set_drawVertices(value:Vector):Vector return FlxBlitView.drawVertices = value; + static inline function get_drawVertices():Vector return FlxBlitRenderer.drawVertices; + static inline function set_drawVertices(value:Vector):Vector return FlxBlitRenderer.drawVertices = value; /** * Internal variable, used in blit render mode to render triangles (`drawTriangles()`) on camera's buffer. */ @:deprecated("trianglesSprite is deprecated, use FlxBlitView.trianglesSprite, instead") static var trianglesSprite(get, set):Sprite; - static inline function get_trianglesSprite():Sprite return FlxBlitView.trianglesSprite; - static inline function set_trianglesSprite(value:Sprite):Sprite return FlxBlitView.trianglesSprite = value; + static inline function get_trianglesSprite():Sprite return FlxBlitRenderer.trianglesSprite; + static inline function set_trianglesSprite(value:Sprite):Sprite return FlxBlitRenderer.trianglesSprite = value; /** * Internal variables, used in blit render mode to draw trianglesSprite on camera's buffer. @@ -692,13 +692,13 @@ class FlxCamera extends FlxBasic */ @:deprecated("renderPoint is deprecated, use FlxBlitView.renderPoint, instead") static var renderPoint(get, set):FlxPoint; - static inline function get_renderPoint():FlxPoint return FlxBlitView.renderPoint; - static inline function set_renderPoint(value:FlxPoint):FlxPoint return FlxBlitView.renderPoint = value; + static inline function get_renderPoint():FlxPoint return FlxBlitRenderer.renderPoint; + static inline function set_renderPoint(value:FlxPoint):FlxPoint return FlxBlitRenderer.renderPoint = value; @:deprecated("renderRect is deprecated, use FlxBlitView.renderRect, instead") static var renderRect(get, set):FlxRect; - static inline function get_renderRect():FlxRect return FlxBlitView.renderRect; - static inline function set_renderRect(value:FlxRect):FlxRect return FlxBlitView.renderRect = value; + static inline function get_renderRect():FlxRect return FlxBlitRenderer.renderRect; + static inline function set_renderRect(value:FlxRect):FlxRect return FlxBlitRenderer.renderRect = value; @:noCompletion public function startQuadBatch(graphic:FlxGraphic, colored:Bool, hasColorOffsets:Bool = false, ?blend:BlendMode, smooth:Bool = false, ?shader:FlxShader) @@ -724,64 +724,59 @@ class FlxCamera extends FlxBasic viewQuad.clearDrawStack(); } - @:allow(flixel.system.frontEnds.CameraFrontEnd) - inline function clear():Void - { - view.clear(); - } - - @:allow(flixel.system.frontEnds.CameraFrontEnd) - function render():Void - { - view.render(); - } - public function beginDrawDebug():Void { - view.beginDrawDebug(); + // view.beginDrawDebug(); } public function endDrawDebug(?matrix:FlxMatrix):Void { - view.endDrawDebug(matrix); + // view.endDrawDebug(matrix); } public function drawDebugRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor, thickness:Float = 1.0):Void { - view.drawDebugRect(x, y, width, height, color, thickness); + // FlxG.renderer.begin(this); + // view.drawDebugRect(x, y, width, height, color, thickness); } public function drawDebugFilledRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor):Void { - view.drawDebugFilledRect(x, y, width, height, color); + // FlxG.renderer.begin(this); + // view.drawDebugFilledRect(x, y, width, height, color); } public function drawDebugFilledCircle(x:Float, y:Float, radius:Float, color:FlxColor):Void { - view.drawDebugFilledCircle(x, y, radius, color); + // FlxG.renderer.begin(this); + // view.drawDebugFilledCircle(x, y, radius, color); } public function drawDebugLine(x1:Float, y1:Float, x2:Float, y2:Float, color:FlxColor, thickness:Float = 1.0):Void { - view.drawDebugLine(x1, y1, x2, y2, color, thickness); + // FlxG.renderer.begin(this); + // view.drawDebugLine(x1, y1, x2, y2, color, thickness); } public function drawPixels(?frame:FlxFrame, ?pixels:BitmapData, matrix:FlxMatrix, ?transform:ColorTransform, ?blend:BlendMode, ?smoothing:Bool = false, ?shader:FlxShader):Void { - view.drawPixels(frame, pixels, matrix, transform, blend, smoothing, shader); + FlxG.renderer.begin(this); + FlxG.renderer.drawPixels(frame, pixels, matrix, transform, blend, smoothing, shader); } public function copyPixels(?frame:FlxFrame, ?pixels:BitmapData, ?sourceRect:Rectangle, destPoint:Point, ?transform:ColorTransform, ?blend:BlendMode, ?smoothing:Bool = false, ?shader:FlxShader):Void { - view.copyPixels(frame, pixels, sourceRect, destPoint, transform, blend, smoothing, shader); + FlxG.renderer.begin(this); + FlxG.renderer.copyPixels(frame, pixels, sourceRect, destPoint, transform, blend, smoothing, shader); } public function drawTriangles(graphic:FlxGraphic, vertices:DrawData, indices:DrawData, uvtData:DrawData, ?colors:DrawData, ?position:FlxPoint, ?blend:BlendMode, repeat:Bool = false, smoothing:Bool = false, ?transform:ColorTransform, ?shader:FlxShader):Void { - view.drawTriangles(graphic, vertices, indices, uvtData, colors, position, blend, repeat, smoothing, transform, shader); + FlxG.renderer.begin(this); + FlxG.renderer.drawTriangles(graphic, vertices, indices, uvtData, colors, position, blend, repeat, smoothing, transform, shader); } /** @@ -1396,7 +1391,9 @@ class FlxCamera extends FlxBasic overload public inline extern function fill(color:FlxColor, blendAlpha:Bool = true, fxAlpha:Float = 1.0, ?graphics:Graphics):Void { color.alphaFloat = fxAlpha; - view.fill(color, blendAlpha); + + FlxG.renderer.begin(this); + FlxG.renderer.fill(color, blendAlpha); } /** @@ -1407,7 +1404,7 @@ class FlxCamera extends FlxBasic */ overload public inline extern function fill(color:FlxColor, blendAlpha:Bool = true):Void { - view.fill(color, blendAlpha); + FlxG.renderer.fill(color, blendAlpha); } /** @@ -1416,12 +1413,14 @@ class FlxCamera extends FlxBasic @:allow(flixel.system.render.FlxCameraView) function drawFX():Void { + FlxG.renderer.begin(this); + // Draw the "flash" special effect onto the buffer if (_fxFlashAlpha > 0.0) { var color = _fxFlashColor; color.alphaFloat *= _fxFlashAlpha; - view.fill(color); + FlxG.renderer.fill(color); } // Draw the "fade" special effect onto the buffer @@ -1429,7 +1428,7 @@ class FlxCamera extends FlxBasic { var color = _fxFadeColor; color.alphaFloat *= _fxFadeAlpha; - view.fill(color); + FlxG.renderer.fill(color); } } diff --git a/flixel/FlxG.hx b/flixel/FlxG.hx index 99559cddc7..493c381123 100644 --- a/flixel/FlxG.hx +++ b/flixel/FlxG.hx @@ -1,5 +1,6 @@ package flixel; +import flixel.system.render.FlxRenderer; import flixel.math.FlxMath; import flixel.math.FlxRandom; import flixel.math.FlxRect; @@ -143,10 +144,31 @@ class FlxG */ public static var onMobile(get, never):Bool; - public static var renderMethod(default, null):FlxRenderMethod; + @:deprecated("renderMethod is deprecated, use FlxG.render.method, instead.") + public static var renderMethod(get, null):FlxRenderMethod; + static inline function get_renderMethod():FlxRenderMethod + { + return FlxG.renderer.method; + } + + @:deprecated("renderBlit is deprecated, compare against FlxG.render.method, instead.") + public static var renderBlit(get, never):Bool; + @:noCompletion static inline function get_renderBlit():Bool + { + return FlxG.renderer.method == BLITTING; + } + + @:deprecated("renderTile is deprecated, compare against FlxG.render.method, instead.") + public static var renderTile(get, never):Bool; + @:noCompletion static inline function get_renderTile():Bool + { + return FlxG.renderer.method == DRAW_TILES; + } - public static var renderBlit(default, null):Bool; - public static var renderTile(default, null):Bool; + /** + * The global renderer instance. + */ + public static var renderer(default, null):FlxRenderer; /** * Represents the amount of time in seconds that passed since last frame. @@ -541,10 +563,6 @@ class FlxG FlxG.height = height; initRenderMethod(); - #if FLX_OPENGL_AVAILABLE - // Query once when window is created and cache for later - bitmap.get_maxTextureSize(); - #end FlxG.initialWidth = width; FlxG.initialHeight = height; @@ -590,28 +608,10 @@ class FlxG static function initRenderMethod():Void { - #if !flash - renderMethod = switch (stage.window.context.type) - { - case OPENGL, OPENGLES, WEBGL: DRAW_TILES; - default: BLITTING; - } - #else - #if web - renderMethod = BLITTING; - #else - renderMethod = DRAW_TILES; - #end - #end + renderer = FlxRenderer.create(); + renderer.init(); - #if air - renderMethod = BLITTING; - #end - - renderBlit = renderMethod == BLITTING; - renderTile = renderMethod == DRAW_TILES; - - FlxObject.defaultPixelPerfectPosition = renderBlit; + FlxObject.defaultPixelPerfectPosition = FlxG.renderer.method == BLITTING; } #if FLX_SAVE @@ -750,8 +750,5 @@ class FlxG } } -enum FlxRenderMethod -{ - DRAW_TILES; - BLITTING; -} +@:deprecated("FlxG.FlxRenderMethod is deprecated, use FlxRenderer.FlxRenderMethod instead") +typedef FlxRenderMethod = flixel.system.render.FlxRenderer.FlxRenderMethod; diff --git a/flixel/FlxGame.hx b/flixel/FlxGame.hx index a71d34cfa7..ba020c62d9 100644 --- a/flixel/FlxGame.hx +++ b/flixel/FlxGame.hx @@ -1,6 +1,6 @@ package flixel; -import flixel.system.render.FlxCameraView; +import flixel.system.render.FlxRenderer; import flixel.system.FlxSplash; import flixel.util.FlxArrayUtil; import flixel.util.FlxDestroyUtil; @@ -803,7 +803,7 @@ class FlxGame extends Sprite FlxG.signals.preDraw.dispatch(); - FlxCameraView.totalDrawCalls = 0; + FlxRenderer.totalDrawCalls = 0; FlxG.cameras.clear(); @@ -823,7 +823,7 @@ class FlxGame extends Sprite if (FlxG.renderTile) { #if FLX_DEBUG - debugger.stats.drawCalls(FlxCameraView.totalDrawCalls); + debugger.stats.drawCalls(FlxRenderer.totalDrawCalls); #end } diff --git a/flixel/graphics/tile/FlxDrawBaseItem.hx b/flixel/graphics/tile/FlxDrawBaseItem.hx index d89be00aef..6127ce907a 100644 --- a/flixel/graphics/tile/FlxDrawBaseItem.hx +++ b/flixel/graphics/tile/FlxDrawBaseItem.hx @@ -2,7 +2,7 @@ package flixel.graphics.tile; import flixel.FlxCamera; import flixel.graphics.frames.FlxFrame; -import flixel.system.render.FlxCameraView; +import flixel.system.render.FlxRenderer; import flixel.math.FlxMatrix; import openfl.display.BlendMode; import openfl.geom.ColorTransform; @@ -15,17 +15,17 @@ class FlxDrawBaseItem /** * Tracks the total number of draw calls made each frame. */ - @:deprecated("drawCalls is deprecated, use FlxCameraView.totalDrawCalls instead") + @:deprecated("drawCalls is deprecated, use FlxRenderer.totalDrawCalls instead") public static var drawCalls(get, set):Int; static function set_drawCalls(value:Int):Int { - return FlxCameraView.totalDrawCalls = value; + return FlxRenderer.totalDrawCalls = value; } static function get_drawCalls():Int { - return FlxCameraView.totalDrawCalls; + return FlxRenderer.totalDrawCalls; } @:noCompletion @@ -75,7 +75,7 @@ class FlxDrawBaseItem public function render(camera:FlxCamera):Void { - FlxCameraView.totalDrawCalls++; + FlxRenderer.totalDrawCalls++; } public function addQuad(frame:FlxFrame, matrix:FlxMatrix, ?transform:ColorTransform):Void {} diff --git a/flixel/system/frontEnds/BitmapFrontEnd.hx b/flixel/system/frontEnds/BitmapFrontEnd.hx index 8e17339206..02b9b34a12 100644 --- a/flixel/system/frontEnds/BitmapFrontEnd.hx +++ b/flixel/system/frontEnds/BitmapFrontEnd.hx @@ -8,9 +8,6 @@ import flixel.system.FlxAssets; import flixel.util.FlxColor; import openfl.Assets; import openfl.display.BitmapData; -#if FLX_OPENGL_AVAILABLE -import lime.graphics.opengl.GL; -#end /** * Internal storage system to prevent graphics from being used repeatedly in memory. @@ -19,7 +16,6 @@ import lime.graphics.opengl.GL; */ class BitmapFrontEnd { - #if FLX_OPENGL_AVAILABLE /** * Returns the maximum allowed width and height (in pixels) for a texture. * This value is only available on hardware-accelerated targets that use OpenGL. @@ -27,8 +23,8 @@ class BitmapFrontEnd * * @see https://opengl.gpuinfo.org/displaycapability.php?name=GL_MAX_TEXTURE_SIZE */ + @:deprecated("maxTextureSize is deprecated, use FlxG.renderer.maxTextureSize instead.") public var maxTextureSize(get, never):Int; - #end /** * Helper FlxFrame object. Containing only one frame. @@ -341,18 +337,10 @@ class BitmapFrontEnd } } - #if FLX_OPENGL_AVAILABLE - static var _maxTextureSize = -1; - - @:allow(flixel.FlxG) - function get_maxTextureSize():Int + inline function get_maxTextureSize():Int { - if (_maxTextureSize < 0) - _maxTextureSize = FlxG.renderTile ? cast GL.getParameter(GL.MAX_TEXTURE_SIZE) : 0; - - return _maxTextureSize; + return FlxG.renderer.maxTextureSize; } - #end function get_whitePixel():FlxFrame { diff --git a/flixel/system/frontEnds/CameraFrontEnd.hx b/flixel/system/frontEnds/CameraFrontEnd.hx index 0afc7fd36c..50477396a1 100644 --- a/flixel/system/frontEnds/CameraFrontEnd.hx +++ b/flixel/system/frontEnds/CameraFrontEnd.hx @@ -1,6 +1,6 @@ package flixel.system.frontEnds; -import flixel.system.render.blit.FlxBlitView; +import flixel.system.render.blit.FlxBlitRenderer; import openfl.geom.Rectangle; import flixel.FlxCamera; import flixel.FlxG; @@ -48,7 +48,7 @@ class CameraFrontEnd * * **NOTE**: Only works with the blitting renderer. */ - @:deprecated("useBufferLocking is deprecated, use FlxBlitView.useBufferLocking, instead.") + @:deprecated("useBufferLocking is deprecated, use FlxBlitRenderer.useBufferLocking, instead.") public var useBufferLocking(get, set):Bool; /** @@ -273,7 +273,8 @@ class CameraFrontEnd { if ((camera != null) && camera.exists && camera.visible) { - camera.clear(); + FlxG.renderer.begin(camera); + FlxG.renderer.clear(); } } } @@ -288,7 +289,8 @@ class CameraFrontEnd { if ((camera != null) && camera.exists && camera.visible) { - camera.render(); + FlxG.renderer.begin(camera); + FlxG.renderer.render(); } } } @@ -348,7 +350,7 @@ class CameraFrontEnd function get_useBufferLocking():Bool { if (FlxG.renderBlit) - return FlxBlitView.useBufferLocking; + return FlxBlitRenderer.useBufferLocking; return false; } @@ -356,7 +358,7 @@ class CameraFrontEnd function set_useBufferLocking(value:Bool):Bool { if (FlxG.renderBlit) - return FlxBlitView.useBufferLocking = value; + return FlxBlitRenderer.useBufferLocking = value; return value; } diff --git a/flixel/system/render/FlxCameraView.hx b/flixel/system/render/FlxCameraView.hx index 90e3ad3c74..476e1b154b 100644 --- a/flixel/system/render/FlxCameraView.hx +++ b/flixel/system/render/FlxCameraView.hx @@ -21,33 +21,27 @@ import openfl.display.DisplayObject; import openfl.display.BitmapData; /** - * A `FlxCameraView` is the base class for all rendering functionality. - * It does not contain any rendering logic by itself, rather it is extended by the various renderer implementations. + * A `FlxCameraView` is a helper added to cameras, that holds some rendering-related objects */ @:allow(flixel.FlxCamera) class FlxCameraView implements IFlxDestroyable -{ - /** - * The number of total draw calls in a frame. - */ - public static var totalDrawCalls:Int = 0; - +{ /** * Creates a `FlxCameraView` object tied to a camera, based on the target and project configuration. * @param camera The camera to create the view for */ public static inline function create(camera:FlxCamera):FlxCameraView { - if (FlxG.renderTile) + if (!FlxG.renderer.isHardware) { - return cast new flixel.system.render.quad.FlxQuadView(camera); + return cast new flixel.system.render.blit.FlxBlitView(camera); } else { - return cast new flixel.system.render.blit.FlxBlitView(camera); + return cast new flixel.system.render.quad.FlxQuadView(camera); } } - + /** * Display object which is used as a container for all of the camera's graphics. * This object is added to the display tree. @@ -95,41 +89,6 @@ class FlxCameraView implements IFlxDestroyable { _flashOffset = FlxDestroyUtil.put(_flashOffset); } - - /** - * Called prior to the rendering call, clears the screen and prepares everything needed. - */ - public function clear():Void {} - - /** - * The actual rendering call where everything gets drawn. - */ - public function render():Void {} - - public function drawPixels(?frame:FlxFrame, ?pixels:BitmapData, matrix:FlxMatrix, ?transform:ColorTransform, ?blend:BlendMode, smoothing:Bool = false, - ?shader:FlxShader):Void {} - - public function copyPixels(?frame:FlxFrame, ?pixels:BitmapData, ?sourceRect:Rectangle, destPoint:Point, ?transform:ColorTransform, ?blend:BlendMode, - smoothing:Bool = false, ?shader:FlxShader):Void {} - - public function drawTriangles(graphic:FlxGraphic, vertices:DrawData, indices:DrawData, uvtData:DrawData, ?colors:DrawData, - ?position:FlxPoint, ?blend:BlendMode, repeat:Bool = false, smoothing:Bool = false, ?transform:ColorTransform, ?shader:FlxShader):Void {} - - public function beginDrawDebug():Void {} - - public function endDrawDebug(?matrix:FlxMatrix):Void {} - - public function drawDebugRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor, thickness:Float = 1.0):Void {} - - public function drawDebugFilledRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor):Void {} - - public function drawDebugFilledCircle(x:Float, y:Float, radius:Float, color:FlxColor):Void {} - - public function drawDebugLine(x1:Float, y1:Float, x2:Float, y2:Float, color:FlxColor, thickness:Float = 1.0):Void {} - - public function fill(color:FlxColor, blendAlpha:Bool = true):Void {} - - function drawFX():Void {} function updateScale():Void { diff --git a/flixel/system/render/FlxRenderer.hx b/flixel/system/render/FlxRenderer.hx new file mode 100644 index 0000000000..6c887ce27e --- /dev/null +++ b/flixel/system/render/FlxRenderer.hx @@ -0,0 +1,186 @@ +package flixel.system.render; + +import flixel.util.FlxDestroyUtil.IFlxDestroyable; +import flixel.math.FlxPoint; +import openfl.geom.Point; +import openfl.geom.Rectangle; +import flixel.system.FlxAssets.FlxShader; +import openfl.display.BitmapData; +import openfl.geom.ColorTransform; +import openfl.display.BlendMode; +import flixel.math.FlxMatrix; +import flixel.util.FlxColor; +import flixel.graphics.tile.FlxDrawTrianglesItem.DrawData; +import flixel.graphics.frames.FlxFrame; +import flixel.graphics.FlxGraphic; + +/** + * A `FlxRenderer` is the base class for all rendering functionality. + * It does not contain any rendering logic by itself, rather it is extended by the various renderer implementations. + */ +class FlxRenderer implements IFlxDestroyable +{ + /** + * The number of total draw calls in the current frame. + */ + public static var totalDrawCalls:Int = 0; + + /** + * Creates a renderer instance, based on the used rendering backend. + * This function is dynamic, which means that you can change the return value yourself. + * + * @return FlxRenderer + */ + public static dynamic function create():FlxRenderer + { + if (!FlxG.renderer.isHardware) + { + return new flixel.system.render.blit.FlxBlitRenderer(); + } + else + { + return new flixel.system.render.quad.FlxQuadRenderer(); + } + } + + /** + * Returns the current render method as an enum. + */ + public var method(default, null):FlxRenderMethod; + + /** + * Returns whether the current renderer is hardware accelerated. + */ + public var isHardware(get, never):Bool; + @:noCompletion inline function get_isHardware():Bool + { + return FlxG.stage.window.context.attributes.hardware; + } + + /** + * Returns whether OpenGL access is available for the current renderer. + */ + public var isGL(get, never):Bool; + @:noCompletion inline function get_isGL():Bool + { + #if FLX_OPENGL_AVAILABLE + return isHardware && method == DRAW_TILES; + #else + return false; + #end + } + + /** + * Returns the maximum allowed width and height (in pixels) for a texture. + * This value is only available on hardware-accelerated targets that use OpenGL. + * On unsupported targets, the returned value will always be -1. + * + * @see https://opengl.gpuinfo.org/displaycapability.php?name=GL_MAX_TEXTURE_SIZE + */ + public var maxTextureSize(default, null):Int; + + /** + * The current camera in use. + */ + public var camera(default, null):FlxCamera; + + /** + * Shortcut to `currentCamera.view`. + * Renderer implementations may override this to cast the return value to the + * corresponding type for the implementation. + */ + // public var currentView(get, never):FlxCameraView; + // @:noCompletion function get_currentView():T + // { + // return currentCamera.view; + // } + + + public function new() {} + + public function destroy():Void + { + camera = null; + } + + /** + * Called internally when it's safe to initialize rendering related properties. + */ + @:allow(flixel.FlxG) + function init():Void {} + + // ------------------------ RENDERING ------------------------ + + /** + * Sets `camera` as the current render target. + * Any drawing commands will be executed on the camera. + * + * **NOTE:** Manually calling this during the draw phase could mess things up. + * If you must, please remember to reset the state back to where it was + * + * @param camera The camera to draw to. + */ + public function begin(camera:FlxCamera):Void + { + if (this.camera == camera) + return; + + this.camera = camera; + } + + /** + * Called before a new rendering frame, clears all previously drawn graphics. + */ + public function clear():Void {} + + /** + * Flushes any remaining graphics and renders everything to the screen. + */ + public function render():Void {} + + public function drawPixels(?frame:FlxFrame, ?pixels:BitmapData, matrix:FlxMatrix, ?transform:ColorTransform, ?blend:BlendMode, smoothing:Bool = false, + ?shader:FlxShader):Void {} + + public function copyPixels(?frame:FlxFrame, ?pixels:BitmapData, ?sourceRect:Rectangle, destPoint:Point, ?transform:ColorTransform, ?blend:BlendMode, + smoothing:Bool = false, ?shader:FlxShader):Void {} + + public function drawTriangles(graphic:FlxGraphic, vertices:DrawData, indices:DrawData, uvtData:DrawData, ?colors:DrawData, + ?position:FlxPoint, ?blend:BlendMode, repeat:Bool = false, smoothing:Bool = false, ?transform:ColorTransform, ?shader:FlxShader):Void {} + + public function fill(color:FlxColor, blendAlpha:Bool = true):Void {} + + // ------------------------ DEBUG DRAW ------------------------ + + /** + * Begins debug draw on the current (or optionally specified) camera. + * Any debug drawing commands will be executed on the camera. + * + * @param camera Optional, the camera to draw to. + */ + public function beginDrawDebug(?camera:FlxCamera):Void + { + if (camera != null) + { + if (this.camera == camera) + return; + + this.camera = camera; + } + } + + public function endDrawDebug():Void {} + + public function drawDebugRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor, thickness:Float = 1.0):Void {} + + public function drawDebugFilledRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor):Void {} + + public function drawDebugFilledCircle(x:Float, y:Float, radius:Float, color:FlxColor):Void {} + + public function drawDebugLine(x1:Float, y1:Float, x2:Float, y2:Float, color:FlxColor, thickness:Float = 1.0):Void {} +} + +enum FlxRenderMethod +{ + DRAW_TILES; + BLITTING; +} diff --git a/flixel/system/render/blit/FlxBlitRenderer.hx b/flixel/system/render/blit/FlxBlitRenderer.hx new file mode 100644 index 0000000000..11ebd38d02 --- /dev/null +++ b/flixel/system/render/blit/FlxBlitRenderer.hx @@ -0,0 +1,300 @@ +package flixel.system.render.blit; + +import flixel.graphics.tile.FlxDrawTrianglesItem; +import openfl.display.Graphics; +import openfl.display.BitmapData; +import openfl.geom.Rectangle; +import openfl.geom.Point; +import openfl.display.BlendMode; +import openfl.display.Sprite; +import openfl.Vector; +import flixel.math.FlxPoint; +import flixel.math.FlxRect; +import flixel.util.FlxColor; +import flixel.util.FlxSpriteUtil; +import flixel.graphics.frames.FlxFrame; +import flixel.math.FlxMatrix; +import openfl.geom.ColorTransform; +import flixel.system.FlxAssets.FlxShader; +import flixel.graphics.FlxGraphic; +import flixel.graphics.tile.FlxDrawTrianglesItem.DrawData; + +@:access(flixel.FlxCamera) +@:access(flixel.system.render.blit) +class FlxBlitRenderer extends FlxRenderer +{ + /** + * Whether the camera's buffer should be locked and unlocked during render calls. + * + * Allows you to possibly slightly optimize the rendering process IF + * you are not doing any pre-processing in your game state's draw() call. + */ + public static var useBufferLocking:Bool = false; + + /** + * Internal variable, used in blit render mode to render triangles (`drawTriangles()`) on camera's buffer. + */ + static var trianglesSprite:Sprite = new Sprite(); + + /** + * Internal variables, used in blit render mode to draw trianglesSprite on camera's buffer. + * Added for less garbage creation. + */ + static var renderPoint:FlxPoint = FlxPoint.get(); + static var renderRect:FlxRect = FlxRect.get(); + + /** + * Internal variable, used for visibility checks to minimize `drawTriangles()` calls. + */ + static var drawVertices:Vector = new Vector(); + + @:deprecated("temp") + var buffer(get, never):BitmapData; + inline function get_buffer() return camera.viewBlit.buffer; + + @:deprecated("temp") + var _flashPoint(get, never):Point; + inline function get__flashPoint() return camera.viewBlit._flashPoint; + + @:deprecated("temp") + var _flashRect(get, never):Rectangle; + inline function get__flashRect() return camera.viewBlit._flashRect; + + @:deprecated("temp") + var _fill(get, never):BitmapData; + inline function get__fill() return camera.viewBlit._fill; + + @:deprecated("temp") + var screen(get, never):FlxSprite; + inline function get_screen() return camera.viewBlit.screen; + + @:deprecated("temp") + var _helperMatrix(get, never):FlxMatrix; + inline function get__helperMatrix() return camera.viewBlit._helperMatrix; + + @:deprecated("temp") + var _blitMatrix(get, never):FlxMatrix; + inline function get__blitMatrix() return camera.viewBlit._blitMatrix; + + @:deprecated("temp") + var _useBlitMatrix(get, never):Bool; + inline function get__useBlitMatrix() return camera.viewBlit._useBlitMatrix; + + @:deprecated("temp") + var _helperPoint(get, never):Point; + inline function get__helperPoint() return camera.viewBlit._helperPoint; + + @:deprecated("temp") + var _bounds(get, never):FlxRect; + inline function get__bounds() return camera.viewBlit._bounds; + + public function new() + { + super(); + method = BLITTING; + } + + override function clear():Void + { + camera.viewBlit.checkResize(); + + if (useBufferLocking) + { + buffer.lock(); + } + + fill(camera.bgColor, camera.useBgAlphaBlending); + screen.dirty = true; + } + + override function render():Void + { + camera.drawFX(); + + if (useBufferLocking) + { + buffer.unlock(); + } + + screen.dirty = true; + } + + override function drawPixels(?frame:FlxFrame, ?pixels:BitmapData, matrix:FlxMatrix, ?transform:ColorTransform, ?blend:BlendMode, smoothing:Bool = false, + ?shader:FlxShader):Void + { + _helperMatrix.copyFrom(matrix); + + if (_useBlitMatrix) + { + _helperMatrix.concat(_blitMatrix); + buffer.draw(pixels, _helperMatrix, null, null, null, (smoothing || camera.antialiasing)); + } + else + { + _helperMatrix.translate(-camera.viewMarginLeft, -camera.viewMarginTop); + buffer.draw(pixels, _helperMatrix, null, blend, null, (smoothing || camera.antialiasing)); + } + } + + override function copyPixels(?frame:FlxFrame, ?pixels:BitmapData, ?sourceRect:Rectangle, destPoint:Point, ?transform:ColorTransform, ?blend:BlendMode, + smoothing:Bool = false, ?shader:FlxShader) + { + if (pixels != null) + { + if (_useBlitMatrix) + { + _helperMatrix.identity(); + _helperMatrix.translate(destPoint.x, destPoint.y); + _helperMatrix.concat(_blitMatrix); + buffer.draw(pixels, _helperMatrix, null, null, null, (smoothing || camera.antialiasing)); + } + else + { + _helperPoint.x = destPoint.x - Std.int(camera.viewMarginLeft); + _helperPoint.y = destPoint.y - Std.int(camera.viewMarginTop); + buffer.copyPixels(pixels, sourceRect, _helperPoint, null, null, true); + } + } + else if (frame != null) + { + // TODO: fix this case for zoom less than initial zoom... + frame.paint(buffer, destPoint, true); + } + } + + override function drawTriangles(graphic:FlxGraphic, vertices:DrawData, indices:DrawData, uvtData:DrawData, ?colors:DrawData, + ?position:FlxPoint, ?blend:BlendMode, repeat:Bool = false, smoothing:Bool = false, ?transform:ColorTransform, ?shader:FlxShader) + { + final cameraBounds = _bounds.set(camera.viewMarginLeft, camera.viewMarginTop, camera.viewWidth, camera.viewHeight); + + if (position == null) + position = renderPoint.set(); + + var verticesLength:Int = vertices.length; + var currentVertexPosition:Int = 0; + + var tempX:Float, tempY:Float; + var i:Int = 0; + var bounds = renderRect.set(); + drawVertices.splice(0, drawVertices.length); + + while (i < verticesLength) + { + tempX = position.x + vertices[i]; + tempY = position.y + vertices[i + 1]; + + drawVertices[currentVertexPosition++] = tempX; + drawVertices[currentVertexPosition++] = tempY; + + if (i == 0) + { + bounds.set(tempX, tempY, 0, 0); + } + else + { + FlxDrawTrianglesItem.inflateBounds(bounds, tempX, tempY); + } + + i += 2; + } + + position.putWeak(); + + if (!cameraBounds.overlaps(bounds)) + { + drawVertices.splice(drawVertices.length - verticesLength, verticesLength); + } + else + { + trianglesSprite.graphics.clear(); + trianglesSprite.graphics.beginBitmapFill(graphic.bitmap, null, repeat, smoothing); + trianglesSprite.graphics.drawTriangles(drawVertices, indices, uvtData); + trianglesSprite.graphics.endFill(); + + // TODO: check this block of code for cases, when zoom < 1 (or initial zoom?)... + if (_useBlitMatrix) + _helperMatrix.copyFrom(_blitMatrix); + else + { + _helperMatrix.identity(); + _helperMatrix.translate(-camera.viewMarginLeft, -camera.viewMarginTop); + } + + buffer.draw(trianglesSprite, _helperMatrix, transform); + + #if FLX_DEBUG + if (FlxG.debugger.drawDebug) + { + // TODO: add a drawDebugTriangles method + var gfx:Graphics = FlxSpriteUtil.flashGfx; + gfx.clear(); + gfx.lineStyle(1, FlxColor.BLUE, 0.5); + gfx.drawTriangles(drawVertices, indices); + buffer.draw(FlxSpriteUtil.flashGfxSprite, _helperMatrix); + } + #end + // End of TODO... + } + + bounds.put(); + } + + override function fill(color:FlxColor, blendAlpha:Bool = true) + { + if (blendAlpha) + { + _fill.fillRect(_flashRect, color); + buffer.copyPixels(_fill, _flashRect, _flashPoint, null, null, blendAlpha); + } + else + { + buffer.fillRect(_flashRect, color); + } + } + + override function beginDrawDebug(?camera:FlxCamera):Void + { + super.beginDrawDebug(camera); + + FlxSpriteUtil.flashGfx.clear(); + } + + override function endDrawDebug():Void + { + camera.viewBlit.buffer.draw(FlxSpriteUtil.flashGfxSprite); + } + + #if FLX_DEBUG + override public function drawDebugRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor, thickness:Float = 1.0):Void + { + final gfx = FlxSpriteUtil.flashGfx; + gfx.lineStyle(thickness, color.rgb, color.alphaFloat, false, null, null, MITER, 255); + gfx.drawRect(x, y, width, height); + } + + override public function drawDebugFilledRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor):Void + { + final gfx = FlxSpriteUtil.flashGfx; + gfx.lineStyle(); + gfx.beginFill(color.rgb, color.alphaFloat); + gfx.drawRect(x, y, width, height); + gfx.endFill(); + } + + override public function drawDebugFilledCircle(x:Float, y:Float, radius:Float, color:FlxColor):Void + { + final gfx = FlxSpriteUtil.flashGfx; + gfx.beginFill(color.rgb, color.alphaFloat); + gfx.drawCircle(x, y, radius); + gfx.endFill(); + } + + override public function drawDebugLine(x1:Float, y1:Float, x2:Float, y2:Float, color:FlxColor, thickness:Float = 1.0):Void + { + final gfx = FlxSpriteUtil.flashGfx; + gfx.lineStyle(thickness, color.rgb, color.alphaFloat, false, null, null, MITER, 255); + gfx.moveTo(x1, x2); + gfx.lineTo(x2, y2); + } + #end +} diff --git a/flixel/system/render/blit/FlxBlitView.hx b/flixel/system/render/blit/FlxBlitView.hx index 30a1c07607..193dbcb64a 100644 --- a/flixel/system/render/blit/FlxBlitView.hx +++ b/flixel/system/render/blit/FlxBlitView.hx @@ -27,33 +27,7 @@ import openfl.display.Graphics; import flixel.util.FlxSpriteUtil; class FlxBlitView extends FlxCameraView -{ - /** - * Whether the camera's buffer should be locked and unlocked during render calls. - * - * Allows you to possibly slightly optimize the rendering process IF - * you are not doing any pre-processing in your game state's draw() call. - */ - public static var useBufferLocking:Bool = false; - - /** - * Internal variable, used in blit render mode to render triangles (`drawTriangles()`) on camera's buffer. - */ - static var trianglesSprite:Sprite = new Sprite(); - - /** - * Internal variables, used in blit render mode to draw trianglesSprite on camera's buffer. - * Added for less garbage creation. - */ - static var renderPoint:FlxPoint = FlxPoint.get(); - - static var renderRect:FlxRect = FlxRect.get(); - - /** - * Internal variable, used for visibility checks to minimize `drawTriangles()` calls. - */ - static var drawVertices:Vector = new Vector(); - +{ /** * Used to render buffer to screen space. * NOTE: We don't recommend modifying this directly unless you are fairly experienced. @@ -131,6 +105,7 @@ class FlxBlitView extends FlxCameraView */ var _blitMatrix:FlxMatrix = new FlxMatrix(); + // TODO: destroy var _helperMatrix:FlxMatrix = new FlxMatrix(); var _helperPoint:Point = new Point(); @@ -170,205 +145,6 @@ class FlxBlitView extends FlxCameraView _bounds = FlxDestroyUtil.put(_bounds); } - override function clear():Void - { - checkResize(); - - if (useBufferLocking) - { - buffer.lock(); - } - - fill(camera.bgColor, camera.useBgAlphaBlending); - screen.dirty = true; - } - - override function render():Void - { - camera.drawFX(); - - if (useBufferLocking) - { - buffer.unlock(); - } - - screen.dirty = true; - } - - override function beginDrawDebug():Void - { - FlxSpriteUtil.flashGfx.clear(); - } - - override function endDrawDebug(?matrix:FlxMatrix):Void - { - buffer.draw(FlxSpriteUtil.flashGfxSprite); - } - - override public function drawDebugRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor, thickness:Float = 1.0):Void - { - final gfx = FlxSpriteUtil.flashGfx; - gfx.lineStyle(thickness, color.rgb, color.alphaFloat, false, null, null, MITER, 255); - gfx.drawRect(x, y, width, height); - } - - override public function drawDebugFilledRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor):Void - { - final gfx = FlxSpriteUtil.flashGfx; - gfx.lineStyle(); - gfx.beginFill(color.rgb, color.alphaFloat); - gfx.drawRect(x, y, width, height); - gfx.endFill(); - } - - override public function drawDebugFilledCircle(x:Float, y:Float, radius:Float, color:FlxColor):Void - { - final gfx = FlxSpriteUtil.flashGfx; - gfx.beginFill(color.rgb, color.alphaFloat); - gfx.drawCircle(x, y, radius); - gfx.endFill(); - } - - override public function drawDebugLine(x1:Float, y1:Float, x2:Float, y2:Float, color:FlxColor, thickness:Float = 1.0):Void - { - final gfx = FlxSpriteUtil.flashGfx; - gfx.lineStyle(thickness, color.rgb, color.alphaFloat, false, null, null, MITER, 255); - gfx.moveTo(x1, x2); - gfx.lineTo(x2, y2); - } - - override function drawPixels(?frame:FlxFrame, ?pixels:BitmapData, matrix:FlxMatrix, ?transform:ColorTransform, ?blend:BlendMode, smoothing:Bool = false, - ?shader:FlxShader):Void - { - _helperMatrix.copyFrom(matrix); - - if (_useBlitMatrix) - { - _helperMatrix.concat(_blitMatrix); - buffer.draw(pixels, _helperMatrix, null, null, null, (smoothing || antialiasing)); - } - else - { - _helperMatrix.translate(-camera.viewMarginLeft, -camera.viewMarginTop); - buffer.draw(pixels, _helperMatrix, null, blend, null, (smoothing || antialiasing)); - } - } - - override function copyPixels(?frame:FlxFrame, ?pixels:BitmapData, ?sourceRect:Rectangle, destPoint:Point, ?transform:ColorTransform, ?blend:BlendMode, - smoothing:Bool = false, ?shader:FlxShader) - { - if (pixels != null) - { - if (_useBlitMatrix) - { - _helperMatrix.identity(); - _helperMatrix.translate(destPoint.x, destPoint.y); - _helperMatrix.concat(_blitMatrix); - buffer.draw(pixels, _helperMatrix, null, null, null, (smoothing || antialiasing)); - } - else - { - _helperPoint.x = destPoint.x - Std.int(camera.viewMarginLeft); - _helperPoint.y = destPoint.y - Std.int(camera.viewMarginTop); - buffer.copyPixels(pixels, sourceRect, _helperPoint, null, null, true); - } - } - else if (frame != null) - { - // TODO: fix this case for zoom less than initial zoom... - frame.paint(buffer, destPoint, true); - } - } - - override function drawTriangles(graphic:FlxGraphic, vertices:DrawData, indices:DrawData, uvtData:DrawData, ?colors:DrawData, - ?position:FlxPoint, ?blend:BlendMode, repeat:Bool = false, smoothing:Bool = false, ?transform:ColorTransform, ?shader:FlxShader) - { - final cameraBounds = _bounds.set(camera.viewMarginLeft, camera.viewMarginTop, camera.viewWidth, camera.viewHeight); - - if (position == null) - position = renderPoint.set(); - - var verticesLength:Int = vertices.length; - var currentVertexPosition:Int = 0; - - var tempX:Float, tempY:Float; - var i:Int = 0; - var bounds = renderRect.set(); - drawVertices.splice(0, drawVertices.length); - - while (i < verticesLength) - { - tempX = position.x + vertices[i]; - tempY = position.y + vertices[i + 1]; - - drawVertices[currentVertexPosition++] = tempX; - drawVertices[currentVertexPosition++] = tempY; - - if (i == 0) - { - bounds.set(tempX, tempY, 0, 0); - } - else - { - FlxDrawTrianglesItem.inflateBounds(bounds, tempX, tempY); - } - - i += 2; - } - - position.putWeak(); - - if (!cameraBounds.overlaps(bounds)) - { - drawVertices.splice(drawVertices.length - verticesLength, verticesLength); - } - else - { - trianglesSprite.graphics.clear(); - trianglesSprite.graphics.beginBitmapFill(graphic.bitmap, null, repeat, smoothing); - trianglesSprite.graphics.drawTriangles(drawVertices, indices, uvtData); - trianglesSprite.graphics.endFill(); - - // TODO: check this block of code for cases, when zoom < 1 (or initial zoom?)... - if (_useBlitMatrix) - _helperMatrix.copyFrom(_blitMatrix); - else - { - _helperMatrix.identity(); - _helperMatrix.translate(-camera.viewMarginLeft, -camera.viewMarginTop); - } - - buffer.draw(trianglesSprite, _helperMatrix, transform); - - #if FLX_DEBUG - if (FlxG.debugger.drawDebug) - { - var gfx:Graphics = FlxSpriteUtil.flashGfx; - gfx.clear(); - gfx.lineStyle(1, FlxColor.BLUE, 0.5); - gfx.drawTriangles(drawVertices, indices); - buffer.draw(FlxSpriteUtil.flashGfxSprite, _helperMatrix); - } - #end - // End of TODO... - } - - bounds.put(); - } - - override function fill(color:FlxColor, blendAlpha:Bool = true) - { - if (blendAlpha) - { - _fill.fillRect(_flashRect, color); - buffer.copyPixels(_fill, _flashRect, _flashPoint, null, null, blendAlpha); - } - else - { - buffer.fillRect(_flashRect, color); - } - } - override function offsetView(x:Float, y:Float):Void { flashSprite.x += x; diff --git a/flixel/system/render/quad/FlxQuadRenderer.hx b/flixel/system/render/quad/FlxQuadRenderer.hx new file mode 100644 index 0000000000..5907d85f56 --- /dev/null +++ b/flixel/system/render/quad/FlxQuadRenderer.hx @@ -0,0 +1,179 @@ +package flixel.system.render.quad; + +import flixel.graphics.tile.FlxDrawQuadsItem; +import openfl.display.BitmapData; +import openfl.geom.Rectangle; +import openfl.geom.Point; +import openfl.display.BlendMode; +import flixel.math.FlxPoint; +import flixel.graphics.frames.FlxFrame; +import flixel.math.FlxMatrix; +import openfl.geom.ColorTransform; +import flixel.system.FlxAssets.FlxShader; +import flixel.graphics.tile.FlxDrawTrianglesItem.DrawData; +import flixel.graphics.FlxGraphic; +import flixel.graphics.tile.FlxDrawBaseItem; +import openfl.display.Graphics; +import flixel.util.FlxColor; +import openfl.display.Sprite; +#if FLX_OPENGL_AVAILABLE +import lime.graphics.opengl.GL; +#end + +using flixel.util.FlxColorTransformUtil; + +@:access(flixel.FlxCamera) +@:access(flixel.system.render.quad) +class FlxQuadRenderer extends FlxRenderer +{ + @:deprecated("temp") + var flashSprite(get, never):Sprite; + function get_flashSprite():Sprite + return camera.viewQuad.flashSprite; + + @:deprecated("temp") + var canvas(get, never):Sprite; + function get_canvas():Sprite + return camera.viewQuad.canvas; + + @:deprecated("temp") + var debugLayer(get, never):Sprite; + function get_debugLayer():Sprite + return camera.viewQuad.debugLayer; + + @:deprecated("temp") + var targetGraphics(get, never):Graphics; + function get_targetGraphics():Graphics + return camera.viewQuad.targetGraphics; + + public function new() + { + super(); + method = DRAW_TILES; + } + + override function init():Void + { + if (isGL) + maxTextureSize = cast GL.getParameter(GL.MAX_TEXTURE_SIZE); + } + + override function clear():Void + { + camera.viewQuad.clearDrawStack(); + + canvas.graphics.clear(); + // Clearing camera's debug sprite + #if FLX_DEBUG + debugLayer.graphics.clear(); + #end + + fill(camera.bgColor, camera.useBgAlphaBlending); + } + + override function render():Void + { + flashSprite.filters = camera.filtersEnabled ? camera.filters : null; + + var currItem:FlxDrawBaseItem = camera.viewQuad._headOfDrawStack; + while (currItem != null) + { + currItem.render(camera); + currItem = currItem.next; + } + + camera.drawFX(); + } + + override function drawPixels(?frame:FlxFrame, ?pixels:BitmapData, matrix:FlxMatrix, ?transform:ColorTransform, ?blend:BlendMode, smoothing:Bool = false, + ?shader:FlxShader) + { + var isColored = (transform != null #if !html5 && transform.hasRGBMultipliers() #end); + var hasColorOffsets:Bool = (transform != null && transform.hasRGBAOffsets()); + + #if FLX_RENDER_TRIANGLE + final drawItem:FlxDrawTrianglesItem = camera.viewQuad.startTrianglesBatch(frame.parent, smoothing, isColored, blend, hasColorOffsets, shader); + #else + final drawItem:FlxDrawQuadsItem = camera.viewQuad.startQuadBatch(frame.parent, isColored, hasColorOffsets, blend, smoothing, shader); + #end + drawItem.addQuad(frame, matrix, transform); + } + + override function copyPixels(?frame:FlxFrame, ?pixels:BitmapData, ?sourceRect:Rectangle, destPoint:Point, ?transform:ColorTransform, ?blend:BlendMode, + smoothing:Bool = false, ?shader:FlxShader) + { + camera.viewQuad._helperMatrix.identity(); + camera.viewQuad._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()); + + #if FLX_RENDER_TRIANGLE + final drawItem:FlxDrawTrianglesItem = camera.viewQuad.startTrianglesBatch(frame.parent, smoothing, isColored, blend, hasColorOffsets, shader); + #else + final drawItem:FlxDrawQuadsItem = camera.viewQuad.startQuadBatch(frame.parent, isColored, hasColorOffsets, blend, smoothing, shader); + #end + drawItem.addQuad(frame, camera.viewQuad._helperMatrix, transform); + } + + override function drawTriangles(graphic:FlxGraphic, vertices:DrawData, indices:DrawData, uvtData:DrawData, ?colors:DrawData, + ?position:FlxPoint, ?blend:BlendMode, repeat:Bool = false, smoothing:Bool = false, ?transform:ColorTransform, ?shader:FlxShader) + { + final cameraBounds = camera.viewQuad._bounds.set(camera.viewMarginLeft, camera.viewMarginTop, camera.viewWidth, camera.viewHeight); + + final isColored = (colors != null && colors.length != 0) || (transform != null && transform.hasRGBMultipliers()); + final hasColorOffsets = (transform != null && transform.hasRGBAOffsets()); + + final drawItem = camera.viewQuad.startTrianglesBatch(graphic, smoothing, isColored, blend, hasColorOffsets, shader); + drawItem.addTriangles(vertices, indices, uvtData, colors, position, cameraBounds, transform); + } + + override function fill(color:FlxColor, blendAlpha:Bool = true):Void + { + targetGraphics.overrideBlendMode(null); + targetGraphics.beginFill(color.rgb, color.alphaFloat); + // i'm drawing rect with these parameters to avoid light lines at the top and left of the camera, + // which could appear while cameras fading + targetGraphics.drawRect(camera.viewMarginLeft - 1, camera.viewMarginTop - 1, camera.viewWidth + 2, camera.viewHeight + 2); + targetGraphics.endFill(); + } + + #if FLX_DEBUG + override function drawDebugRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor, thickness:Float = 1.0):Void + { + final gfx = debugLayer.graphics; + gfx.lineStyle(thickness, color.rgb, color.alphaFloat, false, null, null, MITER, 255); + gfx.drawRect(x, y, width, height); + } + + override function drawDebugFilledRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor):Void + { + final gfx = debugLayer.graphics; + gfx.lineStyle(); + gfx.beginFill(color.rgb, color.alphaFloat); + gfx.drawRect(x, y, width, height); + gfx.endFill(); + } + + override function drawDebugFilledCircle(x:Float, y:Float, radius:Float, color:FlxColor):Void + { + final gfx = debugLayer.graphics; + gfx.beginFill(color.rgb, color.alphaFloat); + gfx.drawCircle(x, y, radius); + gfx.endFill(); + } + + override function drawDebugLine(x1:Float, y1:Float, x2:Float, y2:Float, color:FlxColor, thickness:Float = 1.0):Void + { + final gfx = debugLayer.graphics; + gfx.lineStyle(thickness, color.rgb, color.alphaFloat, false, null, null, MITER, 255); + gfx.moveTo(x1, x2); + gfx.lineTo(x2, y2); + } + #end + + // override function get_currentView():T + // { + // return camera.viewQuad; + // } +} diff --git a/flixel/system/render/quad/FlxQuadView.hx b/flixel/system/render/quad/FlxQuadView.hx index 2c4ddfde5e..9929f93263 100644 --- a/flixel/system/render/quad/FlxQuadView.hx +++ b/flixel/system/render/quad/FlxQuadView.hx @@ -123,120 +123,6 @@ class FlxQuadView extends FlxCameraView _bounds = FlxDestroyUtil.put(_bounds); } - override function clear():Void - { - clearDrawStack(); - - canvas.graphics.clear(); - // Clearing camera's debug sprite - #if FLX_DEBUG - debugLayer.graphics.clear(); - #end - - fill(camera.bgColor, camera.useBgAlphaBlending); - } - - override function render():Void - { - flashSprite.filters = camera.filtersEnabled ? camera.filters : null; - - var currItem:FlxDrawBaseItem = _headOfDrawStack; - while (currItem != null) - { - currItem.render(camera); - currItem = currItem.next; - } - - camera.drawFX(); - } - - #if FLX_DEBUG - override function drawDebugRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor, thickness:Float = 1.0):Void - { - final gfx = debugLayer.graphics; - gfx.lineStyle(thickness, color.rgb, color.alphaFloat, false, null, null, MITER, 255); - gfx.drawRect(x, y, width, height); - } - - override function drawDebugFilledRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor):Void - { - final gfx = debugLayer.graphics; - gfx.lineStyle(); - gfx.beginFill(color.rgb, color.alphaFloat); - gfx.drawRect(x, y, width, height); - gfx.endFill(); - } - - override function drawDebugFilledCircle(x:Float, y:Float, radius:Float, color:FlxColor):Void - { - final gfx = debugLayer.graphics; - gfx.beginFill(color.rgb, color.alphaFloat); - gfx.drawCircle(x, y, radius); - gfx.endFill(); - } - - override function drawDebugLine(x1:Float, y1:Float, x2:Float, y2:Float, color:FlxColor, thickness:Float = 1.0):Void - { - final gfx = debugLayer.graphics; - gfx.lineStyle(thickness, color.rgb, color.alphaFloat, false, null, null, MITER, 255); - gfx.moveTo(x1, x2); - gfx.lineTo(x2, y2); - } - #end - - override function drawPixels(?frame:FlxFrame, ?pixels:BitmapData, matrix:FlxMatrix, ?transform:ColorTransform, ?blend:BlendMode, smoothing:Bool = false, - ?shader:FlxShader) - { - var isColored = (transform != null #if !html5 && transform.hasRGBMultipliers() #end); - var hasColorOffsets:Bool = (transform != null && transform.hasRGBAOffsets()); - - #if FLX_RENDER_TRIANGLE - final drawItem:FlxDrawTrianglesItem = startTrianglesBatch(frame.parent, smoothing, isColored, blend, hasColorOffsets, shader); - #else - final drawItem:FlxDrawQuadsItem = startQuadBatch(frame.parent, isColored, hasColorOffsets, blend, smoothing, shader); - #end - drawItem.addQuad(frame, matrix, transform); - } - - override function copyPixels(?frame:FlxFrame, ?pixels:BitmapData, ?sourceRect:Rectangle, destPoint:Point, ?transform:ColorTransform, ?blend:BlendMode, - smoothing:Bool = false, ?shader:FlxShader) - { - _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()); - - #if FLX_RENDER_TRIANGLE - final drawItem:FlxDrawTrianglesItem = startTrianglesBatch(frame.parent, smoothing, isColored, blend, hasColorOffsets, shader); - #else - final drawItem:FlxDrawQuadsItem = startQuadBatch(frame.parent, isColored, hasColorOffsets, blend, smoothing, shader); - #end - drawItem.addQuad(frame, _helperMatrix, transform); - } - - override function drawTriangles(graphic:FlxGraphic, vertices:DrawData, indices:DrawData, uvtData:DrawData, ?colors:DrawData, - ?position:FlxPoint, ?blend:BlendMode, repeat:Bool = false, smoothing:Bool = false, ?transform:ColorTransform, ?shader:FlxShader) - { - final cameraBounds = _bounds.set(camera.viewMarginLeft, camera.viewMarginTop, camera.viewWidth, camera.viewHeight); - - final isColored = (colors != null && colors.length != 0) || (transform != null && transform.hasRGBMultipliers()); - final hasColorOffsets = (transform != null && transform.hasRGBAOffsets()); - - final drawItem = startTrianglesBatch(graphic, smoothing, isColored, blend, hasColorOffsets, shader); - drawItem.addTriangles(vertices, indices, uvtData, colors, position, cameraBounds, transform); - } - - override function fill(color:FlxColor, blendAlpha:Bool = true):Void - { - targetGraphics.overrideBlendMode(null); - targetGraphics.beginFill(color.rgb, color.alphaFloat); - // i'm drawing rect with these parameters to avoid light lines at the top and left of the camera, - // which could appear while cameras fading - targetGraphics.drawRect(camera.viewMarginLeft - 1, camera.viewMarginTop - 1, camera.viewWidth + 2, camera.viewHeight + 2); - targetGraphics.endFill(); - } - override function offsetView(x:Float, y:Float):Void { flashSprite.x += x; From 08b09932721e569e0a582b88b0915a9f699f0b3b Mon Sep 17 00:00:00 2001 From: ACrazyTown <47027981+ACrazyTown@users.noreply.github.com> Date: Fri, 23 Jan 2026 23:23:53 +0100 Subject: [PATCH 15/28] some polishing in progress --- flixel/FlxCamera.hx | 53 ++--- flixel/FlxG.hx | 2 - flixel/system/render/FlxCameraView.hx | 21 +- flixel/system/render/FlxRenderer.hx | 38 +-- flixel/system/render/blit/FlxBlitRenderer.hx | 231 +++++++++---------- flixel/system/render/blit/FlxBlitView.hx | 48 +--- flixel/system/render/quad/FlxQuadRenderer.hx | 119 +++++----- flixel/system/render/quad/FlxQuadView.hx | 33 +-- 8 files changed, 230 insertions(+), 315 deletions(-) diff --git a/flixel/FlxCamera.hx b/flixel/FlxCamera.hx index f38d91ef95..cd67801b0c 100644 --- a/flixel/FlxCamera.hx +++ b/flixel/FlxCamera.hx @@ -96,8 +96,7 @@ class FlxCamera extends FlxBasic public var totalScaleY(default, null):Float; /** - * Render view for this camera. - * All rendering related commands (like draw rectangle or fill camera view with specified color) are handled by this object. + * Holds various rendering related objects */ public var view(default, null):FlxCameraView; @@ -220,17 +219,15 @@ class FlxCamera extends FlxBasic * * Its position is modified by `updateFlashSpritePosition()` which is called every frame. */ - @:deprecated("flashSprite is deprecated, use camera.viewQuad.flashSprite/camera.viewBlit.flashSprite, instead") + @:deprecated("flashSprite is deprecated, use camera.display, instead") public var flashSprite(get, set):Sprite; - inline function set_flashSprite(value:Sprite):Sprite + inline function set_flashSprite(value:Sprite):Sprite { var sprite = FlxG.renderTile ? viewQuad.flashSprite : viewBlit.flashSprite; return sprite = value; } - inline function get_flashSprite():Sprite - { - return FlxG.renderTile ? viewQuad.flashSprite : viewBlit.flashSprite; - } + + inline function get_flashSprite():Sprite return cast view.display; /** * Whether the positions of the objects rendered on this camera are rounded. @@ -420,10 +417,10 @@ class FlxCamera extends FlxBasic * Its coordinates are always `(0,0)`, where camera's buffer filling should start. * Do not modify it unless you know what are you doing. */ - @:deprecated("_flashPoint is deprecated, use camera.viewBlit._flashPoint, instead") + @:deprecated("_flashPoint is deprecated, use FlxBlitRenderer._flashPoint, instead") var _flashPoint:Point = new Point(); - inline function get__flashPoint():Point return viewBlit._flashPoint; - inline function set__flashPoint(value:Point) return viewBlit._flashPoint = value; + inline function get__flashPoint():Point return cast (FlxG.renderer, FlxBlitRenderer)._flashPoint; + inline function set__flashPoint(value:Point) return cast (FlxG.renderer, FlxBlitRenderer)._flashPoint = value; /** * Internal, used for positioning camera's `flashSprite` on screen. @@ -569,16 +566,15 @@ class FlxCamera extends FlxBasic /** * Helper rect for `drawTriangles()` visibility checks */ - @:deprecated("_bounds is deprecated, use camera.viewQuad._bounds/camera.viewBlit._bounds, instead") + @:deprecated("_bounds is deprecated, use FlxBlitRenderer/FlxQuadRender._bounds, instead") var _bounds(get, set):FlxRect; inline function get__bounds():FlxRect { - return FlxG.renderTile ? viewQuad._bounds : viewBlit._bounds; + return untyped FlxG.renderer._bounds; } inline function set__bounds(value:FlxRect):FlxRect { - var bounds = FlxG.renderTile ? viewQuad._bounds : viewBlit._bounds; - return bounds = value; + return untyped FlxG.renderer._bounds = value; } /** @@ -605,22 +601,27 @@ class FlxCamera extends FlxBasic inline function get_debugLayer():Sprite return viewQuad.debugLayer; #end - @:deprecated("_helperMatrix is deprecated, use camera.viewQuad._helperMatrix/camera.viewBlit._helperMatrix, instead") + @:deprecated("_helperMatrix is deprecated, use FlxBlitRenderer/FlxQuadRenderer._helperMatrix, instead") var _helperMatrix(get, set):FlxMatrix; inline function get__helperMatrix():FlxMatrix { - return FlxG.renderTile ? viewQuad._helperMatrix : viewBlit._helperMatrix; + return untyped FlxG.renderer._helperMatrix; } inline function set__helperMatrix(value:FlxMatrix):FlxMatrix { - var mat = FlxG.renderTile ? viewQuad._helperMatrix : viewBlit._helperMatrix; - return mat = value; + return untyped FlxG.renderer._helperMatrix = value; } - @:deprecated("_helperPoint is deprecated, use camera.viewBlit._helperPoint, instead") + @:deprecated("_helperPoint is deprecated, use FlxBlitRenderer._helperPoint, instead") var _helperPoint(get, set):Point; - inline function get__helperPoint():Point return viewBlit._helperPoint; - inline function set__helperPoint(value:Point):Point return viewBlit._helperPoint = value; + inline function get__helperPoint():Point + { + return cast(FlxG.renderer, FlxBlitRenderer)._helperPoint; + } + inline function set__helperPoint(value:Point):Point + { + return cast(FlxG.renderer, FlxBlitRenderer)._helperPoint = value; + } /** * Currently used draw stack item @@ -673,7 +674,7 @@ class FlxCamera extends FlxBasic /** * Internal variable, used for visibility checks to minimize `drawTriangles()` calls. */ - @:deprecated("drawVertices is deprecated, use FlxBlitView.drawVertices, instead") + @:deprecated("drawVertices is deprecated, use FlxBlitRenderer.drawVertices, instead") static var drawVertices(get, set):Vector; static inline function get_drawVertices():Vector return FlxBlitRenderer.drawVertices; static inline function set_drawVertices(value:Vector):Vector return FlxBlitRenderer.drawVertices = value; @@ -681,7 +682,7 @@ class FlxCamera extends FlxBasic /** * Internal variable, used in blit render mode to render triangles (`drawTriangles()`) on camera's buffer. */ - @:deprecated("trianglesSprite is deprecated, use FlxBlitView.trianglesSprite, instead") + @:deprecated("trianglesSprite is deprecated, use FlxBlitRenderer.trianglesSprite, instead") static var trianglesSprite(get, set):Sprite; static inline function get_trianglesSprite():Sprite return FlxBlitRenderer.trianglesSprite; static inline function set_trianglesSprite(value:Sprite):Sprite return FlxBlitRenderer.trianglesSprite = value; @@ -690,12 +691,12 @@ class FlxCamera extends FlxBasic * Internal variables, used in blit render mode to draw trianglesSprite on camera's buffer. * Added for less garbage creation. */ - @:deprecated("renderPoint is deprecated, use FlxBlitView.renderPoint, instead") + @:deprecated("renderPoint is deprecated, use FlxBlitRenderer.renderPoint, instead") static var renderPoint(get, set):FlxPoint; static inline function get_renderPoint():FlxPoint return FlxBlitRenderer.renderPoint; static inline function set_renderPoint(value:FlxPoint):FlxPoint return FlxBlitRenderer.renderPoint = value; - @:deprecated("renderRect is deprecated, use FlxBlitView.renderRect, instead") + @:deprecated("renderRect is deprecated, use FlxBlitRenderer.renderRect, instead") static var renderRect(get, set):FlxRect; static inline function get_renderRect():FlxRect return FlxBlitRenderer.renderRect; static inline function set_renderRect(value:FlxRect):FlxRect return FlxBlitRenderer.renderRect = value; diff --git a/flixel/FlxG.hx b/flixel/FlxG.hx index 493c381123..dacb389b52 100644 --- a/flixel/FlxG.hx +++ b/flixel/FlxG.hx @@ -609,8 +609,6 @@ class FlxG static function initRenderMethod():Void { renderer = FlxRenderer.create(); - renderer.init(); - FlxObject.defaultPixelPerfectPosition = FlxG.renderer.method == BLITTING; } diff --git a/flixel/system/render/FlxCameraView.hx b/flixel/system/render/FlxCameraView.hx index 476e1b154b..9d0fe92429 100644 --- a/flixel/system/render/FlxCameraView.hx +++ b/flixel/system/render/FlxCameraView.hx @@ -1,24 +1,13 @@ package flixel.system.render; -import flixel.math.FlxRect; import openfl.display.DisplayObjectContainer; +import openfl.display.DisplayObject; +import flixel.math.FlxRect; import flixel.FlxG; import flixel.FlxCamera; import flixel.util.FlxDestroyUtil; -import flixel.graphics.FlxGraphic; -import flixel.system.FlxAssets.FlxShader; -import flixel.graphics.frames.FlxFrame; import flixel.math.FlxPoint; -import flixel.math.FlxMatrix; -import flixel.graphics.tile.FlxDrawTrianglesItem.DrawData; import flixel.util.FlxColor; -import openfl.filters.BitmapFilter; -import openfl.geom.ColorTransform; -import openfl.geom.Point; -import openfl.geom.Rectangle; -import openfl.display.BlendMode; -import openfl.display.DisplayObject; -import openfl.display.BitmapData; /** * A `FlxCameraView` is a helper added to cameras, that holds some rendering-related objects @@ -47,7 +36,7 @@ class FlxCameraView implements IFlxDestroyable * This object is added to the display tree. */ public var display(get, never):DisplayObjectContainer; - + /** * The parent camera for this view. */ @@ -90,6 +79,8 @@ class FlxCameraView implements IFlxDestroyable _flashOffset = FlxDestroyUtil.put(_flashOffset); } + public function offsetView(x:Float, y:Float):Void {} + function updateScale():Void { camera.calcMarginX(); @@ -106,8 +97,6 @@ class FlxCameraView implements IFlxDestroyable _flashOffset.y = camera.height * 0.5 * FlxG.scaleMode.scale.y * camera.initialZoom; } - public function offsetView(x:Float, y:Float):Void {} - function updateScrollRect():Void {} /** diff --git a/flixel/system/render/FlxRenderer.hx b/flixel/system/render/FlxRenderer.hx index 6c887ce27e..4b70280998 100644 --- a/flixel/system/render/FlxRenderer.hx +++ b/flixel/system/render/FlxRenderer.hx @@ -1,18 +1,18 @@ package flixel.system.render; -import flixel.util.FlxDestroyUtil.IFlxDestroyable; +import flixel.graphics.FlxGraphic; +import flixel.graphics.frames.FlxFrame; +import flixel.graphics.tile.FlxDrawTrianglesItem.DrawData; +import flixel.math.FlxMatrix; import flixel.math.FlxPoint; -import openfl.geom.Point; -import openfl.geom.Rectangle; import flixel.system.FlxAssets.FlxShader; +import flixel.util.FlxColor; +import flixel.util.FlxDestroyUtil.IFlxDestroyable; import openfl.display.BitmapData; -import openfl.geom.ColorTransform; import openfl.display.BlendMode; -import flixel.math.FlxMatrix; -import flixel.util.FlxColor; -import flixel.graphics.tile.FlxDrawTrianglesItem.DrawData; -import flixel.graphics.frames.FlxFrame; -import flixel.graphics.FlxGraphic; +import openfl.geom.ColorTransform; +import openfl.geom.Point; +import openfl.geom.Rectangle; /** * A `FlxRenderer` is the base class for all rendering functionality. @@ -64,7 +64,7 @@ class FlxRenderer implements IFlxDestroyable @:noCompletion inline function get_isGL():Bool { #if FLX_OPENGL_AVAILABLE - return isHardware && method == DRAW_TILES; + return isHardware && method != BLITTING; #else return false; #end @@ -84,18 +84,6 @@ class FlxRenderer implements IFlxDestroyable */ public var camera(default, null):FlxCamera; - /** - * Shortcut to `currentCamera.view`. - * Renderer implementations may override this to cast the return value to the - * corresponding type for the implementation. - */ - // public var currentView(get, never):FlxCameraView; - // @:noCompletion function get_currentView():T - // { - // return currentCamera.view; - // } - - public function new() {} public function destroy():Void @@ -103,12 +91,6 @@ class FlxRenderer implements IFlxDestroyable camera = null; } - /** - * Called internally when it's safe to initialize rendering related properties. - */ - @:allow(flixel.FlxG) - function init():Void {} - // ------------------------ RENDERING ------------------------ /** diff --git a/flixel/system/render/blit/FlxBlitRenderer.hx b/flixel/system/render/blit/FlxBlitRenderer.hx index 11ebd38d02..03d4840ad2 100644 --- a/flixel/system/render/blit/FlxBlitRenderer.hx +++ b/flixel/system/render/blit/FlxBlitRenderer.hx @@ -1,138 +1,135 @@ package flixel.system.render.blit; +import flixel.graphics.FlxGraphic; +import flixel.graphics.frames.FlxFrame; +import flixel.graphics.tile.FlxDrawTrianglesItem.DrawData; import flixel.graphics.tile.FlxDrawTrianglesItem; -import openfl.display.Graphics; -import openfl.display.BitmapData; -import openfl.geom.Rectangle; -import openfl.geom.Point; -import openfl.display.BlendMode; -import openfl.display.Sprite; -import openfl.Vector; +import flixel.math.FlxMatrix; import flixel.math.FlxPoint; import flixel.math.FlxRect; +import flixel.system.FlxAssets.FlxShader; import flixel.util.FlxColor; +import flixel.util.FlxDestroyUtil; import flixel.util.FlxSpriteUtil; -import flixel.graphics.frames.FlxFrame; -import flixel.math.FlxMatrix; +import openfl.Vector; +import openfl.display.BitmapData; +import openfl.display.BlendMode; +import openfl.display.Graphics; +import openfl.display.Sprite; import openfl.geom.ColorTransform; -import flixel.system.FlxAssets.FlxShader; -import flixel.graphics.FlxGraphic; -import flixel.graphics.tile.FlxDrawTrianglesItem.DrawData; +import openfl.geom.Point; +import openfl.geom.Rectangle; @:access(flixel.FlxCamera) @:access(flixel.system.render.blit) class FlxBlitRenderer extends FlxRenderer { - /** - * Whether the camera's buffer should be locked and unlocked during render calls. + /** + * Whether the camera's view.buffer should be locked and unlocked during render calls. * * Allows you to possibly slightly optimize the rendering process IF * you are not doing any pre-processing in your game state's draw() call. + * + * This property only has effects when targeting Flash. */ public static var useBufferLocking:Bool = false; - - /** - * Internal variable, used in blit render mode to render triangles (`drawTriangles()`) on camera's buffer. + + /** + * Internal variable, used in blit render mode to render triangles (`drawTriangles()`) on camera's view.buffer. */ static var trianglesSprite:Sprite = new Sprite(); /** - * Internal variables, used in blit render mode to draw trianglesSprite on camera's buffer. + * Internal variables, used in blit render mode to draw trianglesSprite on camera's view.buffer. * Added for less garbage creation. */ static var renderPoint:FlxPoint = FlxPoint.get(); + static var renderRect:FlxRect = FlxRect.get(); /** * Internal variable, used for visibility checks to minimize `drawTriangles()` calls. */ static var drawVertices:Vector = new Vector(); - - @:deprecated("temp") - var buffer(get, never):BitmapData; - inline function get_buffer() return camera.viewBlit.buffer; - - @:deprecated("temp") - var _flashPoint(get, never):Point; - inline function get__flashPoint() return camera.viewBlit._flashPoint; - - @:deprecated("temp") - var _flashRect(get, never):Rectangle; - inline function get__flashRect() return camera.viewBlit._flashRect; - - @:deprecated("temp") - var _fill(get, never):BitmapData; - inline function get__fill() return camera.viewBlit._fill; - - @:deprecated("temp") - var screen(get, never):FlxSprite; - inline function get_screen() return camera.viewBlit.screen; - - @:deprecated("temp") - var _helperMatrix(get, never):FlxMatrix; - inline function get__helperMatrix() return camera.viewBlit._helperMatrix; - - @:deprecated("temp") - var _blitMatrix(get, never):FlxMatrix; - inline function get__blitMatrix() return camera.viewBlit._blitMatrix; - - @:deprecated("temp") - var _useBlitMatrix(get, never):Bool; - inline function get__useBlitMatrix() return camera.viewBlit._useBlitMatrix; - - @:deprecated("temp") - var _helperPoint(get, never):Point; - inline function get__helperPoint() return camera.viewBlit._helperPoint; - - @:deprecated("temp") - var _bounds(get, never):FlxRect; - inline function get__bounds() return camera.viewBlit._bounds; - - public function new() - { - super(); - method = BLITTING; - } - - override function clear():Void + + /** + * Helper rect for `drawTriangles()` visibility checks + */ + var _bounds:FlxRect = FlxRect.get(); + + var _helperMatrix:FlxMatrix = new FlxMatrix(); + var _helperPoint:Point = new Point(); + + /** + * Internal, used in blit render mode in camera's `fill()` method for less garbage creation: + * Its coordinates are always `(0,0)`, where camera's buffer filling should start. + * Do not modify it unless you know what are you doing. + */ + var _flashPoint:Point = new Point(); + + /** + * Convenience shortcut for `camera.viewBlit` + */ + var view(get, never):FlxBlitView; + + @:noCompletion inline function get_view():FlxBlitView + return camera.viewBlit; + + public function new() { - camera.viewBlit.checkResize(); + super(); + method = BLITTING; + maxTextureSize = -1; + } + + override function destroy():Void + { + super.destroy(); + _bounds = FlxDestroyUtil.put(_bounds); + _helperMatrix = null; + _helperPoint = null; + _flashPoint = null; + } + + override function clear():Void + { + view.checkResize(); if (useBufferLocking) { - buffer.lock(); + view.buffer.lock(); } fill(camera.bgColor, camera.useBgAlphaBlending); - screen.dirty = true; + view.screen.dirty = true; } - - override function render():Void + + override function render():Void { camera.drawFX(); if (useBufferLocking) { - buffer.unlock(); + view.buffer.unlock(); } - screen.dirty = true; + view.screen.dirty = true; } - - override function drawPixels(?frame:FlxFrame, ?pixels:BitmapData, matrix:FlxMatrix, ?transform:ColorTransform, ?blend:BlendMode, smoothing:Bool = false, - ?shader:FlxShader):Void + + override function drawPixels(?frame:FlxFrame, ?pixels:BitmapData, matrix:FlxMatrix, ?transform:ColorTransform, ?blend:BlendMode, smoothing:Bool = false, + ?shader:FlxShader):Void { _helperMatrix.copyFrom(matrix); - if (_useBlitMatrix) + if (view._useBlitMatrix) { - _helperMatrix.concat(_blitMatrix); - buffer.draw(pixels, _helperMatrix, null, null, null, (smoothing || camera.antialiasing)); + _helperMatrix.concat(view._blitMatrix); + view.buffer.draw(pixels, _helperMatrix, null, null, null, (smoothing || camera.antialiasing)); } else { _helperMatrix.translate(-camera.viewMarginLeft, -camera.viewMarginTop); - buffer.draw(pixels, _helperMatrix, null, blend, null, (smoothing || camera.antialiasing)); + view.buffer.draw(pixels, _helperMatrix, null, blend, null, (smoothing || camera.antialiasing)); } } @@ -141,24 +138,24 @@ class FlxBlitRenderer extends FlxRenderer { if (pixels != null) { - if (_useBlitMatrix) + if (view._useBlitMatrix) { _helperMatrix.identity(); _helperMatrix.translate(destPoint.x, destPoint.y); - _helperMatrix.concat(_blitMatrix); - buffer.draw(pixels, _helperMatrix, null, null, null, (smoothing || camera.antialiasing)); + _helperMatrix.concat(view._blitMatrix); + view.buffer.draw(pixels, _helperMatrix, null, null, null, (smoothing || camera.antialiasing)); } else { _helperPoint.x = destPoint.x - Std.int(camera.viewMarginLeft); _helperPoint.y = destPoint.y - Std.int(camera.viewMarginTop); - buffer.copyPixels(pixels, sourceRect, _helperPoint, null, null, true); + view.buffer.copyPixels(pixels, sourceRect, _helperPoint, null, null, true); } } else if (frame != null) { // TODO: fix this case for zoom less than initial zoom... - frame.paint(buffer, destPoint, true); + frame.paint(view.buffer, destPoint, true); } } @@ -212,25 +209,25 @@ class FlxBlitRenderer extends FlxRenderer trianglesSprite.graphics.endFill(); // TODO: check this block of code for cases, when zoom < 1 (or initial zoom?)... - if (_useBlitMatrix) - _helperMatrix.copyFrom(_blitMatrix); + if (view._useBlitMatrix) + _helperMatrix.copyFrom(view._blitMatrix); else { _helperMatrix.identity(); _helperMatrix.translate(-camera.viewMarginLeft, -camera.viewMarginTop); } - buffer.draw(trianglesSprite, _helperMatrix, transform); + view.buffer.draw(trianglesSprite, _helperMatrix, transform); #if FLX_DEBUG if (FlxG.debugger.drawDebug) { - // TODO: add a drawDebugTriangles method + // TODO: add a drawDebugTriangles method var gfx:Graphics = FlxSpriteUtil.flashGfx; gfx.clear(); gfx.lineStyle(1, FlxColor.BLUE, 0.5); gfx.drawTriangles(drawVertices, indices); - buffer.draw(FlxSpriteUtil.flashGfxSprite, _helperMatrix); + view.buffer.draw(FlxSpriteUtil.flashGfxSprite, _helperMatrix); } #end // End of TODO... @@ -238,40 +235,40 @@ class FlxBlitRenderer extends FlxRenderer bounds.put(); } - - override function fill(color:FlxColor, blendAlpha:Bool = true) - { - if (blendAlpha) + + override function fill(color:FlxColor, blendAlpha:Bool = true) + { + if (blendAlpha) { - _fill.fillRect(_flashRect, color); - buffer.copyPixels(_fill, _flashRect, _flashPoint, null, null, blendAlpha); + view._fill.fillRect(view._flashRect, color); + view.buffer.copyPixels(view._fill, view._flashRect, _flashPoint, null, null, blendAlpha); } else { - buffer.fillRect(_flashRect, color); + view.buffer.fillRect(view._flashRect, color); } - } - - override function beginDrawDebug(?camera:FlxCamera):Void - { - super.beginDrawDebug(camera); - - FlxSpriteUtil.flashGfx.clear(); - } - - override function endDrawDebug():Void - { - camera.viewBlit.buffer.draw(FlxSpriteUtil.flashGfxSprite); - } - - #if FLX_DEBUG - override public function drawDebugRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor, thickness:Float = 1.0):Void + } + + override function beginDrawDebug(?camera:FlxCamera):Void + { + super.beginDrawDebug(camera); + + FlxSpriteUtil.flashGfx.clear(); + } + + override function endDrawDebug():Void + { + view.buffer.draw(FlxSpriteUtil.flashGfxSprite); + } + + #if FLX_DEBUG + override public function drawDebugRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor, thickness:Float = 1.0):Void { final gfx = FlxSpriteUtil.flashGfx; gfx.lineStyle(thickness, color.rgb, color.alphaFloat, false, null, null, MITER, 255); gfx.drawRect(x, y, width, height); } - + override public function drawDebugFilledRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor):Void { final gfx = FlxSpriteUtil.flashGfx; @@ -280,7 +277,7 @@ class FlxBlitRenderer extends FlxRenderer gfx.drawRect(x, y, width, height); gfx.endFill(); } - + override public function drawDebugFilledCircle(x:Float, y:Float, radius:Float, color:FlxColor):Void { final gfx = FlxSpriteUtil.flashGfx; @@ -288,7 +285,7 @@ class FlxBlitRenderer extends FlxRenderer gfx.drawCircle(x, y, radius); gfx.endFill(); } - + override public function drawDebugLine(x1:Float, y1:Float, x2:Float, y2:Float, color:FlxColor, thickness:Float = 1.0):Void { final gfx = FlxSpriteUtil.flashGfx; @@ -296,5 +293,5 @@ class FlxBlitRenderer extends FlxRenderer gfx.moveTo(x1, x2); gfx.lineTo(x2, y2); } - #end + #end } diff --git a/flixel/system/render/blit/FlxBlitView.hx b/flixel/system/render/blit/FlxBlitView.hx index 193dbcb64a..d35df84630 100644 --- a/flixel/system/render/blit/FlxBlitView.hx +++ b/flixel/system/render/blit/FlxBlitView.hx @@ -1,33 +1,23 @@ package flixel.system.render.blit; -import flixel.math.FlxRect; -import openfl.display.Bitmap; -import openfl.display.DisplayObjectContainer; -import flixel.system.render.FlxCameraView; -import flixel.FlxG; import flixel.FlxCamera; -import flixel.util.FlxDestroyUtil; +import flixel.FlxG; import flixel.graphics.FlxGraphic; -import flixel.system.FlxAssets.FlxShader; -import flixel.graphics.frames.FlxFrame; -import flixel.math.FlxPoint; +import flixel.math.FlxRect; import flixel.math.FlxMatrix; -import flixel.graphics.tile.FlxDrawTrianglesItem; +import flixel.math.FlxPoint; +import flixel.system.render.FlxCameraView; import flixel.util.FlxColor; -import openfl.filters.BitmapFilter; -import openfl.geom.ColorTransform; -import openfl.geom.Point; -import openfl.geom.Rectangle; -import openfl.display.BlendMode; -import openfl.display.DisplayObject; +import flixel.util.FlxDestroyUtil; +import openfl.display.Bitmap; import openfl.display.BitmapData; +import openfl.display.DisplayObjectContainer; import openfl.display.Sprite; -import openfl.Vector; -import openfl.display.Graphics; -import flixel.util.FlxSpriteUtil; +import openfl.geom.Rectangle; +import openfl.geom.ColorTransform; class FlxBlitView extends FlxCameraView -{ +{ /** * Used to render buffer to screen space. * NOTE: We don't recommend modifying this directly unless you are fairly experienced. @@ -68,13 +58,6 @@ class FlxBlitView extends FlxCameraView */ var _flashRect:Rectangle; - /** - * Internal, used in blit render mode in camera's `fill()` method for less garbage creation: - * Its coordinates are always `(0,0)`, where camera's buffer filling should start. - * Do not modify it unless you know what are you doing. - */ - var _flashPoint:Point = new Point(); - /** * Internal, used to render buffer to screen space. Used it blit render mode only. * This Bitmap used for rendering camera's buffer (`_flashBitmap.bitmapData = buffer;`) @@ -89,11 +72,6 @@ class FlxBlitView extends FlxCameraView */ var _fill:BitmapData; - /** - * Helper rect for `drawTriangles()` visibility checks - */ - var _bounds:FlxRect = FlxRect.get(); - /** * Logical flag for tracking whether to apply _blitMatrix transformation to objects or not. */ @@ -105,10 +83,6 @@ class FlxBlitView extends FlxCameraView */ var _blitMatrix:FlxMatrix = new FlxMatrix(); - // TODO: destroy - var _helperMatrix:FlxMatrix = new FlxMatrix(); - var _helperPoint:Point = new Point(); - @:allow(flixel.system.render.FlxCameraView) function new(camera:FlxCamera) { @@ -141,8 +115,6 @@ class FlxBlitView extends FlxCameraView flashSprite = null; _scrollRect = null; _flashRect = null; - _flashPoint = null; - _bounds = FlxDestroyUtil.put(_bounds); } override function offsetView(x:Float, y:Float):Void diff --git a/flixel/system/render/quad/FlxQuadRenderer.hx b/flixel/system/render/quad/FlxQuadRenderer.hx index 5907d85f56..7f4cfc46ee 100644 --- a/flixel/system/render/quad/FlxQuadRenderer.hx +++ b/flixel/system/render/quad/FlxQuadRenderer.hx @@ -1,21 +1,21 @@ package flixel.system.render.quad; -import flixel.graphics.tile.FlxDrawQuadsItem; -import openfl.display.BitmapData; -import openfl.geom.Rectangle; import openfl.geom.Point; -import openfl.display.BlendMode; -import flixel.math.FlxPoint; +import flixel.graphics.FlxGraphic; import flixel.graphics.frames.FlxFrame; +import flixel.graphics.tile.FlxDrawBaseItem; +import flixel.graphics.tile.FlxDrawQuadsItem; +import flixel.graphics.tile.FlxDrawTrianglesItem.DrawData; import flixel.math.FlxMatrix; -import openfl.geom.ColorTransform; +import flixel.math.FlxPoint; +import flixel.math.FlxRect; import flixel.system.FlxAssets.FlxShader; -import flixel.graphics.tile.FlxDrawTrianglesItem.DrawData; -import flixel.graphics.FlxGraphic; -import flixel.graphics.tile.FlxDrawBaseItem; -import openfl.display.Graphics; import flixel.util.FlxColor; -import openfl.display.Sprite; +import flixel.util.FlxDestroyUtil; +import openfl.display.BitmapData; +import openfl.display.BlendMode; +import openfl.geom.ColorTransform; +import openfl.geom.Rectangle; #if FLX_OPENGL_AVAILABLE import lime.graphics.opengl.GL; #end @@ -26,46 +26,44 @@ using flixel.util.FlxColorTransformUtil; @:access(flixel.system.render.quad) class FlxQuadRenderer extends FlxRenderer { - @:deprecated("temp") - var flashSprite(get, never):Sprite; - function get_flashSprite():Sprite - return camera.viewQuad.flashSprite; - - @:deprecated("temp") - var canvas(get, never):Sprite; - function get_canvas():Sprite - return camera.viewQuad.canvas; - - @:deprecated("temp") - var debugLayer(get, never):Sprite; - function get_debugLayer():Sprite - return camera.viewQuad.debugLayer; - - @:deprecated("temp") - var targetGraphics(get, never):Graphics; - function get_targetGraphics():Graphics - return camera.viewQuad.targetGraphics; + /** + * Convenience shortcut for `camera.viewQuad` + */ + var view(get, never):FlxQuadView; + @:noCompletion inline function get_view():FlxQuadView + return camera.viewQuad; + + var _helperMatrix:FlxMatrix = new FlxMatrix(); + + /** + * Helper rect for `drawTriangles()` visibility checks + */ + var _bounds:FlxRect = FlxRect.get(); public function new() { super(); method = DRAW_TILES; - } - override function init():Void - { if (isGL) maxTextureSize = cast GL.getParameter(GL.MAX_TEXTURE_SIZE); } + override function destroy():Void + { + super.destroy(); + _bounds = FlxDestroyUtil.put(_bounds); + _helperMatrix = null; + } + override function clear():Void { - camera.viewQuad.clearDrawStack(); + view.clearDrawStack(); - canvas.graphics.clear(); - // Clearing camera's debug sprite + view.canvas.graphics.clear(); #if FLX_DEBUG - debugLayer.graphics.clear(); + // Clearing camera's debug sprite + view.debugLayer.graphics.clear(); #end fill(camera.bgColor, camera.useBgAlphaBlending); @@ -73,9 +71,9 @@ class FlxQuadRenderer extends FlxRenderer override function render():Void { - flashSprite.filters = camera.filtersEnabled ? camera.filters : null; + view.flashSprite.filters = camera.filtersEnabled ? camera.filters : null; - var currItem:FlxDrawBaseItem = camera.viewQuad._headOfDrawStack; + var currItem:FlxDrawBaseItem = view._headOfDrawStack; while (currItem != null) { currItem.render(camera); @@ -85,16 +83,16 @@ class FlxQuadRenderer extends FlxRenderer camera.drawFX(); } - override function drawPixels(?frame:FlxFrame, ?pixels:BitmapData, matrix:FlxMatrix, ?transform:ColorTransform, ?blend:BlendMode, smoothing:Bool = false, - ?shader:FlxShader) + override function drawPixels(?frame:FlxFrame, ?pixels:BitmapData, matrix:FlxMatrix, ?transform:ColorTransform, ?blend:BlendMode, smoothing:Bool = false, + ?shader:FlxShader) { var isColored = (transform != null #if !html5 && transform.hasRGBMultipliers() #end); var hasColorOffsets:Bool = (transform != null && transform.hasRGBAOffsets()); #if FLX_RENDER_TRIANGLE - final drawItem:FlxDrawTrianglesItem = camera.viewQuad.startTrianglesBatch(frame.parent, smoothing, isColored, blend, hasColorOffsets, shader); + final drawItem:FlxDrawTrianglesItem = view.startTrianglesBatch(frame.parent, smoothing, isColored, blend, hasColorOffsets, shader); #else - final drawItem:FlxDrawQuadsItem = camera.viewQuad.startQuadBatch(frame.parent, isColored, hasColorOffsets, blend, smoothing, shader); + final drawItem:FlxDrawQuadsItem = view.startQuadBatch(frame.parent, isColored, hasColorOffsets, blend, smoothing, shader); #end drawItem.addQuad(frame, matrix, transform); } @@ -102,53 +100,53 @@ class FlxQuadRenderer extends FlxRenderer override function copyPixels(?frame:FlxFrame, ?pixels:BitmapData, ?sourceRect:Rectangle, destPoint:Point, ?transform:ColorTransform, ?blend:BlendMode, smoothing:Bool = false, ?shader:FlxShader) { - camera.viewQuad._helperMatrix.identity(); - camera.viewQuad._helperMatrix.translate(destPoint.x + frame.offset.x, destPoint.y + frame.offset.y); + _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()); #if FLX_RENDER_TRIANGLE - final drawItem:FlxDrawTrianglesItem = camera.viewQuad.startTrianglesBatch(frame.parent, smoothing, isColored, blend, hasColorOffsets, shader); + final drawItem:FlxDrawTrianglesItem = view.startTrianglesBatch(frame.parent, smoothing, isColored, blend, hasColorOffsets, shader); #else - final drawItem:FlxDrawQuadsItem = camera.viewQuad.startQuadBatch(frame.parent, isColored, hasColorOffsets, blend, smoothing, shader); + final drawItem:FlxDrawQuadsItem = view.startQuadBatch(frame.parent, isColored, hasColorOffsets, blend, smoothing, shader); #end - drawItem.addQuad(frame, camera.viewQuad._helperMatrix, transform); + drawItem.addQuad(frame, _helperMatrix, transform); } override function drawTriangles(graphic:FlxGraphic, vertices:DrawData, indices:DrawData, uvtData:DrawData, ?colors:DrawData, ?position:FlxPoint, ?blend:BlendMode, repeat:Bool = false, smoothing:Bool = false, ?transform:ColorTransform, ?shader:FlxShader) { - final cameraBounds = camera.viewQuad._bounds.set(camera.viewMarginLeft, camera.viewMarginTop, camera.viewWidth, camera.viewHeight); + final cameraBounds = _bounds.set(camera.viewMarginLeft, camera.viewMarginTop, camera.viewWidth, camera.viewHeight); final isColored = (colors != null && colors.length != 0) || (transform != null && transform.hasRGBMultipliers()); final hasColorOffsets = (transform != null && transform.hasRGBAOffsets()); - final drawItem = camera.viewQuad.startTrianglesBatch(graphic, smoothing, isColored, blend, hasColorOffsets, shader); + final drawItem = view.startTrianglesBatch(graphic, smoothing, isColored, blend, hasColorOffsets, shader); drawItem.addTriangles(vertices, indices, uvtData, colors, position, cameraBounds, transform); } override function fill(color:FlxColor, blendAlpha:Bool = true):Void { - targetGraphics.overrideBlendMode(null); - targetGraphics.beginFill(color.rgb, color.alphaFloat); + view.targetGraphics.overrideBlendMode(null); + view.targetGraphics.beginFill(color.rgb, color.alphaFloat); // i'm drawing rect with these parameters to avoid light lines at the top and left of the camera, // which could appear while cameras fading - targetGraphics.drawRect(camera.viewMarginLeft - 1, camera.viewMarginTop - 1, camera.viewWidth + 2, camera.viewHeight + 2); - targetGraphics.endFill(); + view.targetGraphics.drawRect(camera.viewMarginLeft - 1, camera.viewMarginTop - 1, camera.viewWidth + 2, camera.viewHeight + 2); + view.targetGraphics.endFill(); } #if FLX_DEBUG override function drawDebugRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor, thickness:Float = 1.0):Void { - final gfx = debugLayer.graphics; + final gfx = view.debugLayer.graphics; gfx.lineStyle(thickness, color.rgb, color.alphaFloat, false, null, null, MITER, 255); gfx.drawRect(x, y, width, height); } override function drawDebugFilledRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor):Void { - final gfx = debugLayer.graphics; + final gfx = view.debugLayer.graphics; gfx.lineStyle(); gfx.beginFill(color.rgb, color.alphaFloat); gfx.drawRect(x, y, width, height); @@ -157,7 +155,7 @@ class FlxQuadRenderer extends FlxRenderer override function drawDebugFilledCircle(x:Float, y:Float, radius:Float, color:FlxColor):Void { - final gfx = debugLayer.graphics; + final gfx = view.debugLayer.graphics; gfx.beginFill(color.rgb, color.alphaFloat); gfx.drawCircle(x, y, radius); gfx.endFill(); @@ -165,15 +163,10 @@ class FlxQuadRenderer extends FlxRenderer override function drawDebugLine(x1:Float, y1:Float, x2:Float, y2:Float, color:FlxColor, thickness:Float = 1.0):Void { - final gfx = debugLayer.graphics; + final gfx = view.debugLayer.graphics; gfx.lineStyle(thickness, color.rgb, color.alphaFloat, false, null, null, MITER, 255); gfx.moveTo(x1, x2); gfx.lineTo(x2, y2); } #end - - // override function get_currentView():T - // { - // return camera.viewQuad; - // } } diff --git a/flixel/system/render/quad/FlxQuadView.hx b/flixel/system/render/quad/FlxQuadView.hx index 9929f93263..5d8713562b 100644 --- a/flixel/system/render/quad/FlxQuadView.hx +++ b/flixel/system/render/quad/FlxQuadView.hx @@ -1,29 +1,21 @@ package flixel.system.render.quad; -import openfl.display.Graphics; -import flixel.math.FlxRect; -import openfl.display.DisplayObjectContainer; -import flixel.system.render.FlxCameraView; -import flixel.FlxG; import flixel.FlxCamera; -import flixel.util.FlxDestroyUtil; +import flixel.FlxG; import flixel.graphics.FlxGraphic; -import flixel.system.FlxAssets.FlxShader; -import flixel.graphics.frames.FlxFrame; -import flixel.math.FlxPoint; -import flixel.math.FlxMatrix; import flixel.graphics.tile.FlxDrawBaseItem; import flixel.graphics.tile.FlxDrawQuadsItem; import flixel.graphics.tile.FlxDrawTrianglesItem; +import flixel.system.FlxAssets.FlxShader; +import flixel.system.render.FlxCameraView; import flixel.util.FlxColor; -import openfl.filters.BitmapFilter; -import openfl.geom.ColorTransform; -import openfl.geom.Point; -import openfl.geom.Rectangle; +import flixel.util.FlxDestroyUtil; import openfl.display.BlendMode; -import openfl.display.DisplayObject; -import openfl.display.BitmapData; +import openfl.display.DisplayObjectContainer; +import openfl.display.Graphics; import openfl.display.Sprite; +import openfl.geom.ColorTransform; +import openfl.geom.Rectangle; using flixel.util.FlxColorTransformUtil; @@ -63,13 +55,6 @@ class FlxQuadView extends FlxCameraView * Its position is modified by `updateScrollRect()` method, which is called on camera's resize and scale events. */ var _scrollRect:Sprite = new Sprite(); - - /** - * Helper rect for `drawTriangles()` visibility checks - */ - var _bounds:FlxRect = FlxRect.get(); - - var _helperMatrix:FlxMatrix = new FlxMatrix(); var targetGraphics:Graphics; @@ -119,8 +104,6 @@ class FlxQuadView extends FlxCameraView flashSprite = null; _scrollRect = null; - _helperMatrix = null; - _bounds = FlxDestroyUtil.put(_bounds); } override function offsetView(x:Float, y:Float):Void From af8a67a5b35ebdb5ea7c11bd24378e1b84c83e22 Mon Sep 17 00:00:00 2001 From: ACrazyTown <47027981+ACrazyTown@users.noreply.github.com> Date: Fri, 23 Jan 2026 23:25:02 +0100 Subject: [PATCH 16/28] oops --- flixel/system/render/blit/FlxBlitRenderer.hx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flixel/system/render/blit/FlxBlitRenderer.hx b/flixel/system/render/blit/FlxBlitRenderer.hx index 03d4840ad2..95f21fdd37 100644 --- a/flixel/system/render/blit/FlxBlitRenderer.hx +++ b/flixel/system/render/blit/FlxBlitRenderer.hx @@ -25,7 +25,7 @@ import openfl.geom.Rectangle; class FlxBlitRenderer extends FlxRenderer { /** - * Whether the camera's view.buffer should be locked and unlocked during render calls. + * Whether the camera's buffer should be locked and unlocked during render calls. * * Allows you to possibly slightly optimize the rendering process IF * you are not doing any pre-processing in your game state's draw() call. @@ -35,12 +35,12 @@ class FlxBlitRenderer extends FlxRenderer public static var useBufferLocking:Bool = false; /** - * Internal variable, used in blit render mode to render triangles (`drawTriangles()`) on camera's view.buffer. + * Internal variable, used in blit render mode to render triangles (`drawTriangles()`) on camera's buffer. */ static var trianglesSprite:Sprite = new Sprite(); /** - * Internal variables, used in blit render mode to draw trianglesSprite on camera's view.buffer. + * Internal variables, used in blit render mode to draw trianglesSprite on camera's buffer. * Added for less garbage creation. */ static var renderPoint:FlxPoint = FlxPoint.get(); From 5cf309cab31cdebd58f5b98f2d65f1133930c707 Mon Sep 17 00:00:00 2001 From: ACrazyTown <47027981+ACrazyTown@users.noreply.github.com> Date: Sat, 24 Jan 2026 14:33:28 +0100 Subject: [PATCH 17/28] fixes and a whole lot of docs --- flixel/FlxCamera.hx | 54 ++------ flixel/FlxObject.hx | 13 +- flixel/FlxSprite.hx | 6 +- flixel/system/FlxBGSprite.hx | 4 +- flixel/system/render/FlxRenderer.hx | 124 +++++++++++++++++-- flixel/system/render/quad/FlxQuadRenderer.hx | 1 + flixel/text/FlxBitmapText.hx | 4 +- flixel/tile/FlxTilemapBuffer.hx | 6 +- flixel/ui/FlxBar.hx | 4 +- 9 files changed, 146 insertions(+), 70 deletions(-) diff --git a/flixel/FlxCamera.hx b/flixel/FlxCamera.hx index cd67801b0c..7d492bd6ff 100644 --- a/flixel/FlxCamera.hx +++ b/flixel/FlxCamera.hx @@ -725,40 +725,7 @@ class FlxCamera extends FlxBasic viewQuad.clearDrawStack(); } - public function beginDrawDebug():Void - { - // view.beginDrawDebug(); - } - - public function endDrawDebug(?matrix:FlxMatrix):Void - { - // view.endDrawDebug(matrix); - } - - public function drawDebugRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor, thickness:Float = 1.0):Void - { - // FlxG.renderer.begin(this); - // view.drawDebugRect(x, y, width, height, color, thickness); - } - - public function drawDebugFilledRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor):Void - { - // FlxG.renderer.begin(this); - // view.drawDebugFilledRect(x, y, width, height, color); - } - - public function drawDebugFilledCircle(x:Float, y:Float, radius:Float, color:FlxColor):Void - { - // FlxG.renderer.begin(this); - // view.drawDebugFilledCircle(x, y, radius, color); - } - - public function drawDebugLine(x1:Float, y1:Float, x2:Float, y2:Float, color:FlxColor, thickness:Float = 1.0):Void - { - // FlxG.renderer.begin(this); - // view.drawDebugLine(x1, y1, x2, y2, color, thickness); - } - + @:deprecated("camera.drawPixels() is deprecated, use FlxG.renderer.drawPixels() instead.") public function drawPixels(?frame:FlxFrame, ?pixels:BitmapData, matrix:FlxMatrix, ?transform:ColorTransform, ?blend:BlendMode, ?smoothing:Bool = false, ?shader:FlxShader):Void { @@ -766,6 +733,7 @@ class FlxCamera extends FlxBasic FlxG.renderer.drawPixels(frame, pixels, matrix, transform, blend, smoothing, shader); } + @:deprecated("camera.copyPixels() is deprecated, use FlxG.renderer.copyPixels() instead.") public function copyPixels(?frame:FlxFrame, ?pixels:BitmapData, ?sourceRect:Rectangle, destPoint:Point, ?transform:ColorTransform, ?blend:BlendMode, ?smoothing:Bool = false, ?shader:FlxShader):Void { @@ -773,6 +741,7 @@ class FlxCamera extends FlxBasic FlxG.renderer.copyPixels(frame, pixels, sourceRect, destPoint, transform, blend, smoothing, shader); } + @:deprecated("camera.drawTriangles() is deprecated, use FlxG.renderer.drawTriangles() instead.") public function drawTriangles(graphic:FlxGraphic, vertices:DrawData, indices:DrawData, uvtData:DrawData, ?colors:DrawData, ?position:FlxPoint, ?blend:BlendMode, repeat:Bool = false, smoothing:Bool = false, ?transform:ColorTransform, ?shader:FlxShader):Void { @@ -1388,23 +1357,16 @@ class FlxCamera extends FlxBasic * @param color The color to fill with in `0xAARRGGBB` hex format. * @param blendAlpha Whether to blend the alpha value or just wipe the previous contents. Default is `true`. */ - @:deprecated("The 4-arg fill(color, blendAlpha, fxAlpha, ?graphics) is deprecated, use the 2-arg fill(color, blendAlpha) instead.") - overload public inline extern function fill(color:FlxColor, blendAlpha:Bool = true, fxAlpha:Float = 1.0, ?graphics:Graphics):Void + @:deprecated("camera.fill() is deprecated, use FlxG.renderer.fill() instead.") + public function fill(color:FlxColor, blendAlpha:Bool = true, fxAlpha:Float = 1.0, ?graphics:Graphics):Void { color.alphaFloat = fxAlpha; FlxG.renderer.begin(this); - FlxG.renderer.fill(color, blendAlpha); - } - /** - * Fill the camera with the specified color. - * - * @param color The color to fill with in `0xAARRGGBB` hex format. - * @param blendAlpha Whether to blend the alpha value or just wipe the previous contents. Default is `true`. - */ - overload public inline extern function fill(color:FlxColor, blendAlpha:Bool = true):Void - { + if (viewQuad != null && graphics != null) + viewQuad.targetGraphics = graphics; + FlxG.renderer.fill(color, blendAlpha); } diff --git a/flixel/FlxObject.hx b/flixel/FlxObject.hx index 4647ac5cf8..cd38db88f1 100644 --- a/flixel/FlxObject.hx +++ b/flixel/FlxObject.hx @@ -1287,6 +1287,7 @@ class FlxObject extends FlxBasic for (camera in getCamerasLegacy()) { + FlxG.renderer.begin(camera); drawDebugOnCamera(camera); if (drawPath) @@ -1318,9 +1319,7 @@ class FlxObject extends FlxBasic if (rect.width > 0 && rect.height > 0) { - camera.beginDrawDebug(); drawDebugBoundingBox(camera, rect, allowCollisions); - camera.endDrawDebug(); } } @@ -1365,13 +1364,13 @@ class FlxObject extends FlxBasic overload extern inline function drawDebugBoundingBoxColor(camera:FlxCamera, rect:FlxRect, color:FlxColor) { - camera.drawDebugRect(rect.x + 0.5, rect.y + 0.5, rect.width - 1.0, rect.height - 1.0, color); + FlxG.renderer.drawDebugRect(rect.x + 0.5, rect.y + 0.5, rect.width - 1.0, rect.height - 1.0, color); } - @:deprecated("use object.beginDrawDebug(camera) is deprecated, camera.beginDrawDebug() instead") + @:deprecated("use object.beginDrawDebug(camera) is deprecated, FlxG.renderer.beginDrawDebug(camera) instead") inline function beginDrawDebug(camera:FlxCamera):Graphics { - camera.beginDrawDebug(); + FlxG.renderer.beginDrawDebug(camera); if (FlxG.renderBlit) { @@ -1383,10 +1382,10 @@ class FlxObject extends FlxBasic } } - @:deprecated("use object.endDrawDebug(camera) is deprecated, camera.endDrawDebug() instead") + @:deprecated("use object.endDrawDebug(camera) is deprecated, FlxG.renderer.endDrawDebug() instead") inline function endDrawDebug(camera:FlxCamera) { - camera.endDrawDebug(); + FlxG.renderer.endDrawDebug(); } #end diff --git a/flixel/FlxSprite.hx b/flixel/FlxSprite.hx index 3894e93e40..c53bebc7cb 100644 --- a/flixel/FlxSprite.hx +++ b/flixel/FlxSprite.hx @@ -963,6 +963,8 @@ class FlxSprite extends FlxObject for (camera in getCamerasLegacy()) { + FlxG.renderer.begin(camera); + if (!camera.visible || !camera.exists || !isOnScreen(camera)) continue; @@ -1009,7 +1011,7 @@ class FlxSprite extends FlxObject _point.floor(); _point.copyTo(_flashPoint); - camera.copyPixels(_frame, framePixels, _flashRect, _flashPoint, colorTransform, blend, antialiasing); + FlxG.renderer.copyPixels(_frame, framePixels, _flashRect, _flashPoint, colorTransform, blend, antialiasing); } @:noCompletion @@ -1025,7 +1027,7 @@ class FlxSprite extends FlxObject final matrix = drawComplexMatrix; // TODO: Just use local? prepareComplexMatrix(matrix, frame, camera); - camera.drawPixels(frame, framePixels, matrix, colorTransform, blend, antialiasing, shader); + FlxG.renderer.drawPixels(frame, framePixels, matrix, colorTransform, blend, antialiasing, shader); } function prepareComplexMatrix(matrix:FlxMatrix, frame:FlxFrame, camera:FlxCamera) diff --git a/flixel/system/FlxBGSprite.hx b/flixel/system/FlxBGSprite.hx index b5608493ab..b3928322dc 100644 --- a/flixel/system/FlxBGSprite.hx +++ b/flixel/system/FlxBGSprite.hx @@ -28,10 +28,12 @@ class FlxBGSprite extends FlxSprite continue; } + FlxG.renderer.begin(camera); + _matrix.identity(); _matrix.scale(camera.viewWidth + 1, camera.viewHeight + 1); _matrix.translate(camera.viewMarginLeft, camera.viewMarginTop); - camera.drawPixels(frame, _matrix, colorTransform); + FlxG.renderer.drawPixels(frame, _matrix, colorTransform); #if FLX_DEBUG FlxBasic.visibleCount++; diff --git a/flixel/system/render/FlxRenderer.hx b/flixel/system/render/FlxRenderer.hx index 4b70280998..c9b2315e6c 100644 --- a/flixel/system/render/FlxRenderer.hx +++ b/flixel/system/render/FlxRenderer.hx @@ -15,8 +15,16 @@ import openfl.geom.Point; import openfl.geom.Rectangle; /** - * A `FlxRenderer` is the base class for all rendering functionality. + * `FlxRenderer` is the base class for all rendering functionality. * It does not contain any rendering logic by itself, rather it is extended by the various renderer implementations. + * + * You can access a global renderer instance via `FlxG.renderer`. + * + * The `FlxRenderer` API replaces the previous renderer implementation in `FlxCamera`. + * Because it's not tied to a camera, it also works slightly differently. + * Before any drawing commands are executed, `FlxG.renderer.begin(camera);` is called to use the camera as a render target. + * This is called internally by Flixel during a sprite's draw phase, so you shouldn't worry about calling it yourself unless + * you have a reason to. */ class FlxRenderer implements IFlxDestroyable { @@ -29,7 +37,7 @@ class FlxRenderer implements IFlxDestroyable * Creates a renderer instance, based on the used rendering backend. * This function is dynamic, which means that you can change the return value yourself. * - * @return FlxRenderer + * @return A `FlxRenderer` instance. */ public static dynamic function create():FlxRenderer { @@ -104,9 +112,6 @@ class FlxRenderer implements IFlxDestroyable */ public function begin(camera:FlxCamera):Void { - if (this.camera == camera) - return; - this.camera = camera; } @@ -120,15 +125,62 @@ class FlxRenderer implements IFlxDestroyable */ public function render():Void {} + /** + * Draws `frame` or `pixels` (depends on the renderer backend) onto the current render target. + * + * @param frame The frame to draw (used only with the DRAW_TILES renderer). + * @param pixels The pixels to draw (used only with the BLITTING renderer). + * @param matrix The transformation matrix to use. + * @param transform The color transform to use, optional. + * @param blend The blend mode to use, optional. + * @param smoothing Whether to use smoothing (anti-aliasing) when drawing. + * @param shader The shader to use, optional (used only with the DRAW_TILES renderer). + */ public function drawPixels(?frame:FlxFrame, ?pixels:BitmapData, matrix:FlxMatrix, ?transform:ColorTransform, ?blend:BlendMode, smoothing:Bool = false, ?shader:FlxShader):Void {} - + + /** + * Draws `frame` or `pixels` (depends on the renderer backend) onto the current render target. + * + * Unlike `drawPixels()`, this method does not use a matrix. This means that complex transformations + * are not supported with this method. The `destPoint` argument is used to determine the position to draw to. + * + * @param frame The frame to draw (used only with the DRAW_TILES renderer). + * @param pixels The pixels to draw (used only with the BLITTING renderer). + * @param sourceRect A rectangle that defines the area of the pixels to use (used only with the BLITTING renderer). + * @param destPoint A point representing the top-left position to draw to. + * @param transform The color transform to use, optional. + * @param blend The blend mode to use, optional. + * @param smoothing Whether to use smoothing (anti-aliasing) when drawing. + * @param shader The shader to use, optional (used only with the DRAW_TILES renderer). + */ public function copyPixels(?frame:FlxFrame, ?pixels:BitmapData, ?sourceRect:Rectangle, destPoint:Point, ?transform:ColorTransform, ?blend:BlendMode, smoothing:Bool = false, ?shader:FlxShader):Void {} - + + /** + * Draws a set of triangles onto the current render target. + * + * @param graphic The graphic to use for the triangles. + * @param vertices A vector where each element is a coordinate location. 2 elements make up an (x, y) pair. + * @param indices A vector containing the indices of the triangles' vertices. + * @param uvtData A vector containing the UV data for the graphic. + * @param colors A vector containing the colors to use per vertex. Currently does not work with any renderer. + * @param position A point representing the top-left position to draw to. + * @param blend The blend mode to use, optional. + * @param repeat Whether the graphic should repeat. + * @param smoothing Whether to use smoothing (anti-aliasing) when drawing. + * @param transform The color transform to use, optional. + * @param shader The shader to use, optional (used only with the DRAW_TILES renderer). + */ public function drawTriangles(graphic:FlxGraphic, vertices:DrawData, indices:DrawData, uvtData:DrawData, ?colors:DrawData, ?position:FlxPoint, ?blend:BlendMode, repeat:Bool = false, smoothing:Bool = false, ?transform:ColorTransform, ?shader:FlxShader):Void {} + /** + * Fills the current render target with `color`. + * + * @param color The color (in 0xAARRGGBB format) to fill the screen with. + * @param blendAlpha Whether to blend the alpha value or just wipe the previous contents. + */ public function fill(color:FlxColor, blendAlpha:Bool = true):Void {} // ------------------------ DEBUG DRAW ------------------------ @@ -143,26 +195,78 @@ class FlxRenderer implements IFlxDestroyable { if (camera != null) { - if (this.camera == camera) - return; - this.camera = camera; } } + /** + * Cleans up and finalizes the debug draw. + */ public function endDrawDebug():Void {} + /** + * Draws a rectangle with an outline. + * + * @param x The x position of the rectangle. + * @param y The y position of the rectangle. + * @param width The width of the rectangle (in pixels). + * @param height The height of the rectangle (in pixels). + * @param color The color (in 0xAARRGGBB hex format) of the rectangle's outline. + * @param thickness The thickness of the rectangle's outline. + */ public function drawDebugRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor, thickness:Float = 1.0):Void {} + /** + * Draws a filled rectangle. + * + * @param x The x position of the rectangle. + * @param y The y position of the rectangle. + * @param width The width of the rectangle (in pixels). + * @param height The height of the rectangle (in pixels). + * @param color The color (in 0xAARRGGBB hex format) of the rectangle's fill. + */ public function drawDebugFilledRect(x:Float, y:Float, width:Float, height:Float, color:FlxColor):Void {} + /** + * Draws a filled circle. + * + * @param x The x position of the circle. + * @param y The y position of the circle. + * @param radius The radius of the circle. + * @param color The color (in 0xAARRGGBB hex format) of the circle's fill. + */ public function drawDebugFilledCircle(x:Float, y:Float, radius:Float, color:FlxColor):Void {} + /** + * Draws a line. + * + * @param x1 The start x position of the line. + * @param y1 The start y position of the line. + * @param x2 The end x position of the line. + * @param y2 The end y position of the line. + * @param color The color (in 0xAARRGGBB hex format) of the line. + * @param thickness The thickness of the line. + */ public function drawDebugLine(x1:Float, y1:Float, x2:Float, y2:Float, color:FlxColor, thickness:Float = 1.0):Void {} } +/** + * An enum represnting the implemented rendering methods. + */ enum FlxRenderMethod { + /** + * Uses the `drawQuads()` method from OpenFL's Graphics API to achieve hardware accelerated rendering. + * + * This method is the default and is used on all targets (when hardware acceleration is available) except for Flash. + */ DRAW_TILES; + + /** + * Draws sprites directly onto bitmaps using a software renderer. + * + * This method is mainly used by the Flash target, though other targets will use it too if + * hardware acceleration is unavailable. + */ BLITTING; } diff --git a/flixel/system/render/quad/FlxQuadRenderer.hx b/flixel/system/render/quad/FlxQuadRenderer.hx index 7f4cfc46ee..600bbf87ab 100644 --- a/flixel/system/render/quad/FlxQuadRenderer.hx +++ b/flixel/system/render/quad/FlxQuadRenderer.hx @@ -66,6 +66,7 @@ class FlxQuadRenderer extends FlxRenderer view.debugLayer.graphics.clear(); #end + view.targetGraphics = view.canvas.graphics; fill(camera.bgColor, camera.useBgAlphaBlending); } diff --git a/flixel/text/FlxBitmapText.hx b/flixel/text/FlxBitmapText.hx index e6f5ead1a2..2b2d3ed8a6 100644 --- a/flixel/text/FlxBitmapText.hx +++ b/flixel/text/FlxBitmapText.hx @@ -374,6 +374,8 @@ class FlxBitmapText extends FlxSprite continue; } + FlxG.renderer.begin(camera); + getScreenPosition(screenPos, camera).subtract(offset); if (isPixelPerfectRender(camera)) @@ -400,7 +402,7 @@ class FlxBitmapText extends FlxSprite matrix.translate(screenPos.x + originX, screenPos.y + originY); final colorTransform = bgColorTransformDrawHelper.reset(); colorTransform.setMultipliers(colorHelper).scaleMultipliers(backgroundColor); - camera.drawPixels(FlxG.bitmap.whitePixel, null, matrix, colorTransform, blend, antialiasing); + FlxG.renderer.drawPixels(FlxG.bitmap.whitePixel, null, matrix, colorTransform, blend, antialiasing); } final hasColorOffsets = (colorTransform != null && colorTransform.hasRGBAOffsets()); diff --git a/flixel/tile/FlxTilemapBuffer.hx b/flixel/tile/FlxTilemapBuffer.hx index e5593b3d7c..de43add469 100644 --- a/flixel/tile/FlxTilemapBuffer.hx +++ b/flixel/tile/FlxTilemapBuffer.hx @@ -175,6 +175,8 @@ class FlxTilemapBuffer implements IFlxDestroyable */ public function draw(camera:FlxCamera, flashPoint:Point, scaleX = 1.0, scaleY = 1.0):Void { + FlxG.renderer.begin(camera); + if (isPixelPerfectRender(camera)) { flashPoint.x = Math.floor(flashPoint.x); @@ -183,14 +185,14 @@ class FlxTilemapBuffer implements IFlxDestroyable if (isPixelPerfectRender(camera) && (scaleX == 1.0 && scaleY == 1.0) && blend == null) { - camera.copyPixels(pixels, _flashRect, flashPoint, null, null, true); + FlxG.renderer.copyPixels(pixels, _flashRect, flashPoint, null, null, true); } else { _matrix.identity(); _matrix.scale(scaleX, scaleY); _matrix.translate(flashPoint.x, flashPoint.y); - camera.drawPixels(pixels, _matrix, null, blend, antialiasing); + FlxG.renderer.drawPixels(pixels, _matrix, null, blend, antialiasing); } } diff --git a/flixel/ui/FlxBar.hx b/flixel/ui/FlxBar.hx index dcc0ac13d1..c486681085 100644 --- a/flixel/ui/FlxBar.hx +++ b/flixel/ui/FlxBar.hx @@ -866,6 +866,8 @@ class FlxBar extends FlxSprite { continue; } + + FlxG.renderer.begin(camera); _frontFrame.prepareMatrix(_matrix, FlxFrameAngle.ANGLE_0, checkFlipX(), checkFlipY()); _matrix.translate(-origin.x, -origin.y); @@ -890,7 +892,7 @@ class FlxBar extends FlxSprite _matrix.ty = Math.floor(_matrix.ty); } - camera.drawPixels(_frontFrame, _matrix, colorTransform, blend, antialiasing, shader); + FlxG.renderer.drawPixels(_frontFrame, _matrix, colorTransform, blend, antialiasing, shader); } } } From 552bdb76fbcc7d9628f352b72865b2545a24559b Mon Sep 17 00:00:00 2001 From: ACrazyTown <47027981+ACrazyTown@users.noreply.github.com> Date: Sat, 24 Jan 2026 14:41:26 +0100 Subject: [PATCH 18/28] fix debug drawing --- flixel/path/FlxBasePath.hx | 8 ++++---- flixel/system/debug/interaction/Interaction.hx | 6 +++--- flixel/system/debug/interaction/tools/Pointer.hx | 6 +++--- .../system/debug/interaction/tools/Transform.hx | 15 ++++++++------- flixel/system/render/FlxRenderer.hx | 4 ++-- 5 files changed, 20 insertions(+), 19 deletions(-) diff --git a/flixel/path/FlxBasePath.hx b/flixel/path/FlxBasePath.hx index b993c338f3..3ab5d9a717 100644 --- a/flixel/path/FlxBasePath.hx +++ b/flixel/path/FlxBasePath.hx @@ -318,7 +318,7 @@ class FlxTypedBasePath extends FlxBasic implements IFlxDestroy */ public function drawDebugOnCamera(camera:FlxCamera):Void { - camera.beginDrawDebug(); + FlxG.renderer.beginDrawDebug(camera); final length = nodes.length; // Then fill up the object with node and path graphics @@ -358,7 +358,7 @@ class FlxTypedBasePath extends FlxBasic implements IFlxDestroy prevNodeScreen.put(); } - camera.endDrawDebug(); + FlxG.renderer.endDrawDebug(); } @:access(flixel.FlxCamera) @@ -385,7 +385,7 @@ class FlxTypedBasePath extends FlxBasic implements IFlxDestroy inline function drawNode(camera:FlxCamera, node:FlxPoint, size:Int, color:FlxColor) { final offset = Math.floor(size * 0.5); - camera.drawDebugFilledRect(node.x - offset, node.y - offset, size, size, color); + FlxG.renderer.drawDebugFilledRect(node.x - offset, node.y - offset, size, size, color); } @:deprecated("drawLine(gfx, node1, node2) is deprecated. Use drawLine(camera, node1, node2) instead.") @@ -408,7 +408,7 @@ class FlxTypedBasePath extends FlxBasic implements IFlxDestroy final size = debugDrawData.lineSize; final lineOffset = debugDrawData.lineSize / 2; - camera.drawDebugLine(node1.x + lineOffset, node1.y + lineOffset, node2.x + lineOffset, node2.y + lineOffset, color, size); + FlxG.renderer.drawDebugLine(node1.x + lineOffset, node1.y + lineOffset, node2.x + lineOffset, node2.y + lineOffset, color, size); } #end } diff --git a/flixel/system/debug/interaction/Interaction.hx b/flixel/system/debug/interaction/Interaction.hx index 9c68f03c05..ee6e5e3353 100644 --- a/flixel/system/debug/interaction/Interaction.hx +++ b/flixel/system/debug/interaction/Interaction.hx @@ -397,7 +397,7 @@ class Interaction extends Window function drawItemsSelection():Void { final camera = FlxG.camera; - camera.beginDrawDebug(); + FlxG.renderer.beginDrawDebug(camera); for (member in selectedItems) { @@ -408,11 +408,11 @@ class Interaction extends Window // Render a white rectangle centered at the selected item final color:FlxColor = FlxColor.fromRGBFloat(1, 1, 1, 0.75); - camera.drawDebugRect(member.x - scroll.x - margin, member.y - scroll.y - margin, member.width + margin*2, member.height + margin*2, color); + FlxG.renderer.drawDebugRect(member.x - scroll.x - margin, member.y - scroll.y - margin, member.width + margin*2, member.height + margin*2, color); } } - camera.endDrawDebug(); + FlxG.renderer.endDrawDebug(); } /** diff --git a/flixel/system/debug/interaction/tools/Pointer.hx b/flixel/system/debug/interaction/tools/Pointer.hx index e11a070126..050ffb3814 100644 --- a/flixel/system/debug/interaction/tools/Pointer.hx +++ b/flixel/system/debug/interaction/tools/Pointer.hx @@ -134,7 +134,7 @@ class Pointer extends Tool override public function draw():Void { - FlxG.camera.beginDrawDebug(); + FlxG.renderer.beginDrawDebug(FlxG.camera); switch state { @@ -145,11 +145,11 @@ class Pointer extends Tool // Render the selection rectangle var color:FlxColor = 0xbb0000; color.alphaFloat = 0.9; - FlxG.camera.drawDebugRect(FlxG.camera.scroll.x + rect.x, FlxG.camera.scroll.y + rect.y, rect.width, rect.height, color); + FlxG.renderer.drawDebugRect(FlxG.camera.scroll.x + rect.x, FlxG.camera.scroll.y + rect.y, rect.width, rect.height, color); rect.put(); } - FlxG.camera.endDrawDebug(); + FlxG.renderer.endDrawDebug(); } static function setAbsRect(rect:FlxRect, x1:Float, y1:Float, x2:Float, y2:Float) diff --git a/flixel/system/debug/interaction/tools/Transform.hx b/flixel/system/debug/interaction/tools/Transform.hx index 44b050492d..0c3bf0a3d3 100644 --- a/flixel/system/debug/interaction/tools/Transform.hx +++ b/flixel/system/debug/interaction/tools/Transform.hx @@ -233,13 +233,12 @@ class Transform extends Tool target; } - FlxG.camera.beginDrawDebug(); - final camera = target.getDefaultCamera(); + + FlxG.renderer.beginDrawDebug(camera); drawSelection(camera); Marker.draw(target.x + target.origin.x, target.y + target.origin.y, false, camera); - - FlxG.camera.endDrawDebug(); + FlxG.renderer.endDrawDebug(); } function drawSelection(camera:FlxCamera) @@ -249,7 +248,7 @@ class Transform extends Tool var prevY = markers[3].y; for (marker in markers) { - camera.drawDebugLine(prevX, prevY, marker.x, marker.y, FlxColor.MAGENTA); + FlxG.renderer.drawDebugLine(prevX, prevY, marker.x, marker.y, FlxColor.MAGENTA); prevX = marker.x; prevY = marker.y; @@ -301,10 +300,12 @@ private class Marker public static function draw(screenX:Float, screenY:Float, circle:Bool, camera:FlxCamera) { + FlxG.renderer.begin(camera); + if (circle) - camera.drawDebugFilledCircle(screenX, screenY, CIRCLE_RADIUS, FlxColor.MAGENTA); + FlxG.renderer.drawDebugFilledCircle(screenX, screenY, CIRCLE_RADIUS, FlxColor.MAGENTA); else - camera.drawDebugFilledRect(screenX - RECT_MARGIN, screenY - RECT_MARGIN, RECT_SIZE, RECT_SIZE, FlxColor.MAGENTA); + FlxG.renderer.drawDebugFilledRect(screenX - RECT_MARGIN, screenY - RECT_MARGIN, RECT_SIZE, RECT_SIZE, FlxColor.MAGENTA); } } diff --git a/flixel/system/render/FlxRenderer.hx b/flixel/system/render/FlxRenderer.hx index c9b2315e6c..8f4b12233f 100644 --- a/flixel/system/render/FlxRenderer.hx +++ b/flixel/system/render/FlxRenderer.hx @@ -162,8 +162,8 @@ class FlxRenderer implements IFlxDestroyable * * @param graphic The graphic to use for the triangles. * @param vertices A vector where each element is a coordinate location. 2 elements make up an (x, y) pair. - * @param indices A vector containing the indices of the triangles' vertices. - * @param uvtData A vector containing the UV data for the graphic. + * @param indices A vector where each element is an index to a vertex (x, y) pair. 3 indices make up a triangle. + * @param uvtData A vector where each element is a normalized coordinate (from 0.0 to 1.0), per vertex, used to apply texture mapping. * @param colors A vector containing the colors to use per vertex. Currently does not work with any renderer. * @param position A point representing the top-left position to draw to. * @param blend The blend mode to use, optional. From f4775d5965b0e388dff605f817a4fe0d3fa8cb42 Mon Sep 17 00:00:00 2001 From: ACrazyTown <47027981+ACrazyTown@users.noreply.github.com> Date: Sat, 24 Jan 2026 14:59:01 +0100 Subject: [PATCH 19/28] fix flash --- flixel/system/render/FlxRenderer.hx | 5 ++++- flixel/system/render/blit/FlxBlitRenderer.hx | 1 - flixel/system/render/quad/FlxQuadRenderer.hx | 2 ++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/flixel/system/render/FlxRenderer.hx b/flixel/system/render/FlxRenderer.hx index 8f4b12233f..df954e8ed0 100644 --- a/flixel/system/render/FlxRenderer.hx +++ b/flixel/system/render/FlxRenderer.hx @@ -92,7 +92,10 @@ class FlxRenderer implements IFlxDestroyable */ public var camera(default, null):FlxCamera; - public function new() {} + public function new() + { + maxTextureSize = -1; + } public function destroy():Void { diff --git a/flixel/system/render/blit/FlxBlitRenderer.hx b/flixel/system/render/blit/FlxBlitRenderer.hx index 95f21fdd37..823c12d21f 100644 --- a/flixel/system/render/blit/FlxBlitRenderer.hx +++ b/flixel/system/render/blit/FlxBlitRenderer.hx @@ -79,7 +79,6 @@ class FlxBlitRenderer extends FlxRenderer { super(); method = BLITTING; - maxTextureSize = -1; } override function destroy():Void diff --git a/flixel/system/render/quad/FlxQuadRenderer.hx b/flixel/system/render/quad/FlxQuadRenderer.hx index 600bbf87ab..464a2e5d31 100644 --- a/flixel/system/render/quad/FlxQuadRenderer.hx +++ b/flixel/system/render/quad/FlxQuadRenderer.hx @@ -45,8 +45,10 @@ class FlxQuadRenderer extends FlxRenderer super(); method = DRAW_TILES; + #if FLX_OPENGL_AVAILBLE if (isGL) maxTextureSize = cast GL.getParameter(GL.MAX_TEXTURE_SIZE); + #end } override function destroy():Void From 79fd40f8eec31d275cfbf5c97850566d6957754e Mon Sep 17 00:00:00 2001 From: ACrazyTown <47027981+ACrazyTown@users.noreply.github.com> Date: Sat, 24 Jan 2026 22:14:49 +0100 Subject: [PATCH 20/28] fix deprecation warnings --- flixel/FlxCamera.hx | 10 ++-- flixel/FlxG.hx | 6 ++- flixel/FlxGame.hx | 2 +- flixel/FlxObject.hx | 4 +- flixel/FlxSprite.hx | 26 +++++------ flixel/FlxStrip.hx | 3 +- flixel/FlxSubState.hx | 11 +++-- flixel/effects/FlxMatrixSprite.hx | 4 +- flixel/effects/particles/FlxEmitter.hx | 2 +- flixel/graphics/FlxGraphic.hx | 2 +- flixel/graphics/frames/FlxFrame.hx | 6 +-- flixel/path/FlxBasePath.hx | 2 +- flixel/system/FlxBGSprite.hx | 4 +- .../system/debug/interaction/Interaction.hx | 6 +-- flixel/system/debug/stats/Stats.hx | 13 ++++-- flixel/system/frontEnds/CameraFrontEnd.hx | 6 +-- flixel/system/render/FlxRenderer.hx | 8 ++-- flixel/text/FlxBitmapText.hx | 46 +++++++++---------- flixel/text/FlxText.hx | 2 +- flixel/tile/FlxTilemap.hx | 30 ++++++------ flixel/tile/FlxTilemapBuffer.hx | 10 ++-- flixel/ui/FlxBar.hx | 37 ++++++++------- 22 files changed, 124 insertions(+), 116 deletions(-) diff --git a/flixel/FlxCamera.hx b/flixel/FlxCamera.hx index 7d492bd6ff..70ea2a2293 100644 --- a/flixel/FlxCamera.hx +++ b/flixel/FlxCamera.hx @@ -223,7 +223,7 @@ class FlxCamera extends FlxBasic public var flashSprite(get, set):Sprite; inline function set_flashSprite(value:Sprite):Sprite { - var sprite = FlxG.renderTile ? viewQuad.flashSprite : viewBlit.flashSprite; + var sprite = FlxG.renderer.method == DRAW_TILES ? viewQuad.flashSprite : viewBlit.flashSprite; return sprite = value; } @@ -555,11 +555,11 @@ class FlxCamera extends FlxBasic var _scrollRect(get, set):Sprite; inline function get__scrollRect():Sprite { - return FlxG.renderTile ? viewQuad._scrollRect : viewBlit._scrollRect; + return FlxG.renderer.method == DRAW_TILES ? viewQuad._scrollRect : viewBlit._scrollRect; } inline function set__scrollRect(value:Sprite):Sprite { - var scrollRect = FlxG.renderTile ? viewQuad._scrollRect : viewBlit._scrollRect; + var scrollRect = FlxG.renderer.method == DRAW_TILES ? viewQuad._scrollRect : viewBlit._scrollRect; return scrollRect = value; } @@ -826,7 +826,7 @@ class FlxCamera extends FlxBasic else if (view is FlxBlitView) viewBlit = cast view; - pixelPerfectRender = FlxG.renderBlit; + pixelPerfectRender = FlxG.renderer.method == BLITTING; set_color(FlxColor.WHITE); @@ -1398,7 +1398,7 @@ class FlxCamera extends FlxBasic @:deprecated("checkResize() is deprecated") function checkResize():Void { - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) viewBlit.checkResize(); } diff --git a/flixel/FlxG.hx b/flixel/FlxG.hx index dacb389b52..b505b52d20 100644 --- a/flixel/FlxG.hx +++ b/flixel/FlxG.hx @@ -145,8 +145,8 @@ class FlxG public static var onMobile(get, never):Bool; @:deprecated("renderMethod is deprecated, use FlxG.render.method, instead.") - public static var renderMethod(get, null):FlxRenderMethod; - static inline function get_renderMethod():FlxRenderMethod + public static var renderMethod(get, null):flixel.system.render.FlxRenderer.FlxRenderMethod; + static inline function get_renderMethod():flixel.system.render.FlxRenderer.FlxRenderMethod { return FlxG.renderer.method; } @@ -167,6 +167,8 @@ class FlxG /** * The global renderer instance. + * + * @see `FlxRenderer` */ public static var renderer(default, null):FlxRenderer; diff --git a/flixel/FlxGame.hx b/flixel/FlxGame.hx index ba020c62d9..dcf7dda1d2 100644 --- a/flixel/FlxGame.hx +++ b/flixel/FlxGame.hx @@ -820,7 +820,7 @@ class FlxGame extends Sprite FlxG.cameras.render(); - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) { #if FLX_DEBUG debugger.stats.drawCalls(FlxRenderer.totalDrawCalls); diff --git a/flixel/FlxObject.hx b/flixel/FlxObject.hx index cd38db88f1..1d8838a2ce 100644 --- a/flixel/FlxObject.hx +++ b/flixel/FlxObject.hx @@ -1309,7 +1309,7 @@ class FlxObject extends FlxBasic return; final rect = getBoundingBox(camera); - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) { final view = camera.getViewMarginRect(); view.pad(2); @@ -1372,7 +1372,7 @@ class FlxObject extends FlxBasic { FlxG.renderer.beginDrawDebug(camera); - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { return FlxSpriteUtil.flashGfx; } diff --git a/flixel/FlxSprite.hx b/flixel/FlxSprite.hx index c53bebc7cb..d9afabfcc1 100644 --- a/flixel/FlxSprite.hx +++ b/flixel/FlxSprite.hx @@ -384,7 +384,7 @@ class FlxSprite extends FlxObject { super(X, Y); - useFramePixels = FlxG.renderBlit; + useFramePixels = FlxG.renderer.method == BLITTING; if (SimpleGraphic != null) loadGraphic(SimpleGraphic); } @@ -908,7 +908,7 @@ class FlxSprite extends FlxObject centerOrigin(); - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { dirty = true; updateFramePixels(); @@ -1097,7 +1097,7 @@ class FlxSprite extends FlxObject graphic.bitmap.draw(bitmapData, _matrix, null, brushBlend, null, Brush.antialiasing); } - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { dirty = true; calcFrame(); @@ -1112,7 +1112,7 @@ class FlxSprite extends FlxObject */ public function drawFrame(Force:Bool = false):Void { - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { if (Force || dirty) { @@ -1566,7 +1566,7 @@ class FlxSprite extends FlxObject { checkEmptyFrame(); - if (FlxG.renderTile && !force) + if (FlxG.renderer.method == DRAW_TILES && !force) return; updateFramePixels(); @@ -1582,7 +1582,7 @@ class FlxSprite extends FlxObject // don't try to regenerate frame pixels if _frame already uses it as source of graphics // if you'll try then it will clear framePixels and you won't see anything - if (FlxG.renderTile && _frameGraphic != null) + if (FlxG.renderer.method == DRAW_TILES && _frameGraphic != null) { dirty = false; return framePixels; @@ -1600,12 +1600,12 @@ class FlxSprite extends FlxObject framePixels = _frame.paintRotatedAndFlipped(framePixels, _flashPointZero, FlxFrameAngle.ANGLE_0, doFlipX, doFlipY, false, true); } - if (FlxG.renderBlit && hasColorTransform()) + if (FlxG.renderer.method == BLITTING && hasColorTransform()) { framePixels.colorTransform(_flashRect, colorTransform); } - if (FlxG.renderTile && useFramePixels) + if (FlxG.renderer.method == DRAW_TILES && useFramePixels) { // recreate _frame for native target, so it will use modified framePixels _frameGraphic = FlxDestroyUtil.destroy(_frameGraphic); @@ -1679,7 +1679,7 @@ class FlxSprite extends FlxObject */ public function isSimpleRender(?camera:FlxCamera):Bool { - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) return false; return isSimpleRenderBlit(camera); @@ -1848,7 +1848,7 @@ class FlxSprite extends FlxObject return null; } - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) { _frameGraphic = FlxDestroyUtil.destroy(_frameGraphic); } @@ -2006,7 +2006,7 @@ class FlxSprite extends FlxObject @:noCompletion function set_flipX(Value:Bool):Bool { - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) { _facingHorizontalMult = Value ? -1 : 1; } @@ -2017,7 +2017,7 @@ class FlxSprite extends FlxObject @:noCompletion function set_flipY(Value:Bool):Bool { - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) { _facingVerticalMult = Value ? -1 : 1; } @@ -2034,7 +2034,7 @@ class FlxSprite extends FlxObject @:noCompletion function set_useFramePixels(value:Bool):Bool { - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) { if (value != useFramePixels) { diff --git a/flixel/FlxStrip.hx b/flixel/FlxStrip.hx index 6696952a97..3fa1d58ddf 100644 --- a/flixel/FlxStrip.hx +++ b/flixel/FlxStrip.hx @@ -58,7 +58,8 @@ class FlxStrip extends FlxSprite getScreenPosition(_point, camera); _point -= offset; - camera.drawTriangles(graphic, vertices, indices, uvtData, colors, _point, blend, repeat, antialiasing, colorTransform, shader); + FlxG.renderer.begin(camera); + FlxG.renderer.drawTriangles(graphic, vertices, indices, uvtData, colors, _point, blend, repeat, antialiasing, colorTransform, shader); } } } diff --git a/flixel/FlxSubState.hx b/flixel/FlxSubState.hx index e7cca132f6..e39a509331 100644 --- a/flixel/FlxSubState.hx +++ b/flixel/FlxSubState.hx @@ -53,7 +53,7 @@ class FlxSubState extends FlxState closeCallback = null; openCallback = null; - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) { _bgSprite = new FlxBGSprite(); } @@ -63,14 +63,15 @@ class FlxSubState extends FlxState override public function draw():Void { // Draw background - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { for (camera in getCamerasLegacy()) { - camera.fill(bgColor); + FlxG.renderer.begin(camera); + FlxG.renderer.fill(bgColor); } } - else // FlxG.renderTile + else // FlxG.renderer.method == DRAW_TILES { if (_bgSprite != null && _bgSprite.visible) { @@ -110,7 +111,7 @@ class FlxSubState extends FlxState @:noCompletion override function set_bgColor(value:FlxColor):FlxColor { - if (FlxG.renderTile && _bgSprite != null) + if (FlxG.renderer.method == DRAW_TILES && _bgSprite != null) { _bgSprite.alpha = value.alphaFloat; _bgSprite.visible = _bgSprite.alpha > 0; diff --git a/flixel/effects/FlxMatrixSprite.hx b/flixel/effects/FlxMatrixSprite.hx index 67676a32f3..96ca1652db 100644 --- a/flixel/effects/FlxMatrixSprite.hx +++ b/flixel/effects/FlxMatrixSprite.hx @@ -23,7 +23,7 @@ class FlxMatrixSprite extends FlxSprite super(x, y, simpleGraphic); - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) FlxG.log.warn("FlxMatrixSprites do not work on blit targets"); } @@ -59,4 +59,4 @@ class FlxMatrixSprite extends FlxSprite matrix.ty = Math.floor(matrix.ty); } } -} \ No newline at end of file +} diff --git a/flixel/effects/particles/FlxEmitter.hx b/flixel/effects/particles/FlxEmitter.hx index 53021ab8ab..1538b97a29 100644 --- a/flixel/effects/particles/FlxEmitter.hx +++ b/flixel/effects/particles/FlxEmitter.hx @@ -264,7 +264,7 @@ class FlxTypedEmitter extends FlxTypedGroup var particle:T = Type.createInstance(particleClass, []); var frame = Multiple ? FlxG.random.int(0, totalFrames - 1) : -1; - if (FlxG.renderBlit && bakedRotationAngles > 0) + if (FlxG.renderer.method == BLITTING && bakedRotationAngles > 0) particle.loadRotatedGraphic(Graphics, bakedRotationAngles, frame, false, AutoBuffer); else particle.loadGraphic(Graphics, Multiple); diff --git a/flixel/graphics/FlxGraphic.hx b/flixel/graphics/FlxGraphic.hx index 656a0ace93..a668ab0b11 100644 --- a/flixel/graphics/FlxGraphic.hx +++ b/flixel/graphics/FlxGraphic.hx @@ -609,7 +609,7 @@ class FlxGraphic implements IFlxDestroyable height = bitmap.height; #if FLX_OPENGL_AVAILABLE - var max:Int = FlxG.bitmap.maxTextureSize; + var max:Int = FlxG.renderer.maxTextureSize; if (max > 0) { if (width > max || height > max) diff --git a/flixel/graphics/frames/FlxFrame.hx b/flixel/graphics/frames/FlxFrame.hx index 40f2cf87b6..5435b01bce 100644 --- a/flixel/graphics/frames/FlxFrame.hx +++ b/flixel/graphics/frames/FlxFrame.hx @@ -159,7 +159,7 @@ class FlxFrame implements IFlxDestroyable offset = FlxPoint.get(); blitMatrix = new MatrixVector(); - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) tileMatrix = new MatrixVector(); } @@ -169,7 +169,7 @@ class FlxFrame implements IFlxDestroyable { blitMatrix.copyFrom(this, true); - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) tileMatrix.copyFrom(this, false); } @@ -279,7 +279,7 @@ class FlxFrame implements IFlxDestroyable */ public function prepareMatrix(mat:FlxMatrix, rotation:FlxFrameAngle = FlxFrameAngle.ANGLE_0, flipX:Bool = false, flipY:Bool = false):FlxMatrix { - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { mat.identity(); return mat; diff --git a/flixel/path/FlxBasePath.hx b/flixel/path/FlxBasePath.hx index 3ab5d9a717..a84e621fda 100644 --- a/flixel/path/FlxBasePath.hx +++ b/flixel/path/FlxBasePath.hx @@ -372,7 +372,7 @@ class FlxTypedBasePath extends FlxBasic implements IFlxDestroy result.y -= camera.scroll.y * object.scrollFactor.y; } - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { result.x -= camera.viewMarginX; result.y -= camera.viewMarginY; diff --git a/flixel/system/FlxBGSprite.hx b/flixel/system/FlxBGSprite.hx index b3928322dc..25a6f55050 100644 --- a/flixel/system/FlxBGSprite.hx +++ b/flixel/system/FlxBGSprite.hx @@ -28,11 +28,11 @@ class FlxBGSprite extends FlxSprite continue; } - FlxG.renderer.begin(camera); - _matrix.identity(); _matrix.scale(camera.viewWidth + 1, camera.viewHeight + 1); _matrix.translate(camera.viewMarginLeft, camera.viewMarginTop); + + FlxG.renderer.begin(camera); FlxG.renderer.drawPixels(frame, _matrix, colorTransform); #if FLX_DEBUG diff --git a/flixel/system/debug/interaction/Interaction.hx b/flixel/system/debug/interaction/Interaction.hx index ee6e5e3353..f0663f4b33 100644 --- a/flixel/system/debug/interaction/Interaction.hx +++ b/flixel/system/debug/interaction/Interaction.hx @@ -381,7 +381,7 @@ class Interaction extends Window @:deprecated("getDebugGraphics() is deprecated. Use the debug draw functions from FlxCamera instead.") public function getDebugGraphics():Graphics { - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { FlxSpriteUtil.flashGfx.clear(); return FlxSpriteUtil.flashGfx; @@ -790,7 +790,7 @@ class Interaction extends Window public function toDebugX(worldX:Float, camera:FlxCamera) { - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) return camera.viewQuad.canvas.localToGlobal(new Point(worldX, 0)).x; else @:privateAccess @@ -799,7 +799,7 @@ class Interaction extends Window public function toDebugY(worldY:Float, camera:FlxCamera) { - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) return camera.viewQuad.canvas.localToGlobal(new Point(0, worldY)).y; else @:privateAccess diff --git a/flixel/system/debug/stats/Stats.hx b/flixel/system/debug/stats/Stats.hx index c76b12963b..4293798c3c 100644 --- a/flixel/system/debug/stats/Stats.hx +++ b/flixel/system/debug/stats/Stats.hx @@ -88,7 +88,7 @@ class Stats extends Window { super("Stats", Icon.stats, 0, 0, false); - var minHeight = if (FlxG.renderTile) 200 else 185; + var minHeight = if (FlxG.renderer.method == DRAW_TILES) 200 else 185; minSize.y = minHeight; resize(INITIAL_WIDTH, minHeight); @@ -130,7 +130,7 @@ class Stats extends Window _leftTextField.multiline = _rightTextField.multiline = true; var drawMethod = ""; - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) { drawMethod = #if FLX_RENDER_TRIANGLE @@ -267,7 +267,7 @@ class Stats extends Window } visibleCount = Std.int(divide(visibleCount, _visibleObjectMarker)); - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) { for (i in 0..._drawCallsMarker) { @@ -280,7 +280,7 @@ class Stats extends Window _drawMarker = 0; _activeObjectMarker = 0; _visibleObjectMarker = 0; - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) { _drawCallsMarker = 0; } @@ -298,7 +298,10 @@ class Stats extends Window updateTimeGraph.update(updTime); _rightTextField.text = activeCount + " (" + updTime + "ms)\n" + visibleCount + " (" + drwTime + "ms)\n" - + (FlxG.renderTile ? (drawCallsCount + "\n") : "") + FlxQuadTree._NUM_CACHED_QUAD_TREES + "\n" + FlxLinkedList._NUM_CACHED_FLX_LIST; + + (FlxG.renderer.method == DRAW_TILES ? (drawCallsCount + "\n") : "") + + FlxQuadTree._NUM_CACHED_QUAD_TREES + + "\n" + + FlxLinkedList._NUM_CACHED_FLX_LIST; } function divide(f1:Float, f2:Float):Float diff --git a/flixel/system/frontEnds/CameraFrontEnd.hx b/flixel/system/frontEnds/CameraFrontEnd.hx index 50477396a1..833a31408b 100644 --- a/flixel/system/frontEnds/CameraFrontEnd.hx +++ b/flixel/system/frontEnds/CameraFrontEnd.hx @@ -136,7 +136,7 @@ class CameraFrontEnd return; } - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) { for (i in 0...list.length) { @@ -349,7 +349,7 @@ class CameraFrontEnd function get_useBufferLocking():Bool { - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) return FlxBlitRenderer.useBufferLocking; return false; @@ -357,7 +357,7 @@ class CameraFrontEnd function set_useBufferLocking(value:Bool):Bool { - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) return FlxBlitRenderer.useBufferLocking = value; return value; diff --git a/flixel/system/render/FlxRenderer.hx b/flixel/system/render/FlxRenderer.hx index df954e8ed0..2d0036c47f 100644 --- a/flixel/system/render/FlxRenderer.hx +++ b/flixel/system/render/FlxRenderer.hx @@ -72,7 +72,9 @@ class FlxRenderer implements IFlxDestroyable @:noCompletion inline function get_isGL():Bool { #if FLX_OPENGL_AVAILABLE - return isHardware && method != BLITTING; + return FlxG.stage.window.context.type == OPENGL + || FlxG.stage.window.context.type == OPENGLES + || FlxG.stage.window.context.type == WEBGL; #else return false; #end @@ -254,14 +256,14 @@ class FlxRenderer implements IFlxDestroyable } /** - * An enum represnting the implemented rendering methods. + * An enum representing the available rendering methods. */ enum FlxRenderMethod { /** * Uses the `drawQuads()` method from OpenFL's Graphics API to achieve hardware accelerated rendering. * - * This method is the default and is used on all targets (when hardware acceleration is available) except for Flash. + * This method is the default and is used on all targets (when hardware acceleration is available), except for Flash. */ DRAW_TILES; diff --git a/flixel/text/FlxBitmapText.hx b/flixel/text/FlxBitmapText.hx index 2b2d3ed8a6..a814eab587 100644 --- a/flixel/text/FlxBitmapText.hx +++ b/flixel/text/FlxBitmapText.hx @@ -235,7 +235,7 @@ class FlxBitmapText extends FlxSprite this.font = (font == null) ? FlxBitmapFont.getDefaultFont() : font; - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { pixels = new BitmapData(1, 1, true, FlxColor.TRANSPARENT); } @@ -264,7 +264,7 @@ class FlxBitmapText extends FlxSprite _colorParams = null; - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) { textData = null; textDrawData = null; @@ -278,13 +278,13 @@ class FlxBitmapText extends FlxSprite */ override public function drawFrame(Force:Bool = false):Void { - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) { Force = true; } pendingTextBitmapChange = pendingTextBitmapChange || Force; checkPendingChanges(false); - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { super.drawFrame(Force); } @@ -298,7 +298,7 @@ class FlxBitmapText extends FlxSprite function checkPendingChanges(useTiles:Bool = false):Void { - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { useTiles = false; } @@ -329,7 +329,7 @@ class FlxBitmapText extends FlxSprite static final frameDrawHelper = new ReusableFrame(); override function draw() { - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { checkPendingChanges(false); super.draw(); @@ -454,7 +454,7 @@ class FlxBitmapText extends FlxSprite override function set_clipRect(Rect:FlxRect):FlxRect { super.set_clipRect(Rect); - if (!FlxG.renderBlit) + if (FlxG.renderer.method != BLITTING) { pendingTextBitmapChange = true; } @@ -464,7 +464,7 @@ class FlxBitmapText extends FlxSprite override function set_color(Color:FlxColor):FlxColor { super.set_color(Color); - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { pendingTextBitmapChange = true; } @@ -474,7 +474,7 @@ class FlxBitmapText extends FlxSprite override function set_alpha(value:Float):Float { super.set_alpha(value); - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { pendingTextBitmapChange = true; } @@ -486,7 +486,7 @@ class FlxBitmapText extends FlxSprite if (textColor != value) { textColor = value; - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { pendingPixelsChange = true; } @@ -500,7 +500,7 @@ class FlxBitmapText extends FlxSprite if (useTextColor != value) { useTextColor = value; - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { pendingPixelsChange = true; } @@ -511,7 +511,7 @@ class FlxBitmapText extends FlxSprite override function calcFrame(RunOnCpp:Bool = false):Void { - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) { drawFrame(RunOnCpp); } @@ -1003,7 +1003,7 @@ class FlxBitmapText extends FlxSprite { computeTextSize(); - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { useTiles = false; } @@ -1023,7 +1023,7 @@ class FlxBitmapText extends FlxSprite textBitmap.lock(); } - else if (FlxG.renderTile) + else if (FlxG.renderer.method == DRAW_TILES) { textData.clear(); } @@ -1071,7 +1071,7 @@ class FlxBitmapText extends FlxSprite function drawLine(line:UnicodeString, posX:Int, posY:Int, useTiles:Bool = false):Void { - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { useTiles = false; } @@ -1101,7 +1101,7 @@ class FlxBitmapText extends FlxSprite function tileLine(line:UnicodeString, startX:Int, startY:Int) { - if (!FlxG.renderTile) + if (FlxG.renderer.method != DRAW_TILES) return; addLineData(line, startX, startY, textData); @@ -1174,7 +1174,7 @@ class FlxBitmapText extends FlxSprite var colorForFill:Int = background ? backgroundColor : FlxColor.TRANSPARENT; var bitmap:BitmapData = null; - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { if (pixels == null || (frameWidth != pixels.width || frameHeight != pixels.height)) { @@ -1226,7 +1226,7 @@ class FlxBitmapText extends FlxSprite bitmap.unlock(); } - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { dirty = true; } @@ -1321,7 +1321,7 @@ class FlxBitmapText extends FlxSprite function drawText(posX:Int, posY:Int, isFront:Bool = true, ?bitmap:BitmapData, useTiles:Bool = false):Void { - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { useTiles = false; } @@ -1368,7 +1368,7 @@ class FlxBitmapText extends FlxSprite function tileText(posX:Int, posY:Int, isFront:Bool = true):Void { - if (!FlxG.renderTile) + if (FlxG.renderer.method != DRAW_TILES) return; final data:CharList = isFront ? textDrawData : borderDrawData; @@ -1555,7 +1555,7 @@ class FlxBitmapText extends FlxSprite if (background != value) { background = value; - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { pendingPixelsChange = true; } @@ -1569,7 +1569,7 @@ class FlxBitmapText extends FlxSprite if (backgroundColor != value) { backgroundColor = value; - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { pendingPixelsChange = true; } @@ -1594,7 +1594,7 @@ class FlxBitmapText extends FlxSprite if (borderColor != value) { borderColor = value; - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { pendingPixelsChange = true; } diff --git a/flixel/text/FlxText.hx b/flixel/text/FlxText.hx index b3dad3d00f..3ecc41a7f0 100644 --- a/flixel/text/FlxText.hx +++ b/flixel/text/FlxText.hx @@ -1071,7 +1071,7 @@ class FlxText extends FlxSprite if (textField == null) return; - if (FlxG.renderTile && !RunOnCpp) + if (FlxG.renderer.method == DRAW_TILES && !RunOnCpp) return; regenGraphic(); diff --git a/flixel/tile/FlxTilemap.hx b/flixel/tile/FlxTilemap.hx index bca2cc2548..202af69d82 100644 --- a/flixel/tile/FlxTilemap.hx +++ b/flixel/tile/FlxTilemap.hx @@ -286,7 +286,7 @@ class FlxTypedTilemap extends FlxBaseTilemap { super(); - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) { _helperPoint = new Point(); _matrix = new FlxMatrix(); @@ -305,7 +305,7 @@ class FlxTypedTilemap extends FlxBaseTilemap debugBoundingBoxColorPartial = FlxColor.PINK; debugBoundingBoxColorNotSolid = FlxColor.TRANSPARENT; - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) FlxG.debugger.drawDebugChanged.add(onDrawDebugChanged); #end } @@ -321,7 +321,7 @@ class FlxTypedTilemap extends FlxBaseTilemap _tileObjects = FlxDestroyUtil.destroyArray(_tileObjects); _buffers = FlxDestroyUtil.destroyArray(_buffers); - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { #if FLX_DEBUG _debugRect = null; @@ -351,7 +351,7 @@ class FlxTypedTilemap extends FlxBaseTilemap FlxG.cameras.cameraResized.remove(onCameraChanged); #if FLX_DEBUG - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) FlxG.debugger.drawDebugChanged.remove(onDrawDebugChanged); #end @@ -499,7 +499,7 @@ class FlxTypedTilemap extends FlxBaseTilemap function updateDebugTile(tileBitmap:BitmapData, color:FlxColor):BitmapData { - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) return null; if (tileWidth <= 0 || tileHeight <= 0) @@ -530,7 +530,7 @@ class FlxTypedTilemap extends FlxBaseTilemap override function updateMap():Void { #if FLX_DEBUG - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) _debugRect = new Rectangle(0, 0, tileWidth, tileHeight); #end @@ -542,7 +542,7 @@ class FlxTypedTilemap extends FlxBaseTilemap #if FLX_DEBUG override function drawDebugOnCamera(camera:FlxCamera):Void { - if (!FlxG.renderTile) + if (FlxG.renderer.method != DRAW_TILES) return; var buffer:FlxTilemapBuffer = null; @@ -656,7 +656,7 @@ class FlxTypedTilemap extends FlxBaseTilemap buffer = _buffers[i]; - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { if (buffer.isDirty(this, camera)) drawTilemap(buffer, camera); @@ -704,7 +704,7 @@ class FlxTypedTilemap extends FlxBaseTilemap */ override function setDirty(dirty:Bool = true):Void { - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) return; for (buffer in _buffers) @@ -1214,7 +1214,7 @@ class FlxTypedTilemap extends FlxBaseTilemap var scaledHeight:Float = 0; var drawItem = null; - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { buffer.fill(); } @@ -1268,7 +1268,7 @@ class FlxTypedTilemap extends FlxBaseTilemap { frame = tile.frame; - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { frame.paint(buffer.pixels, _flashPoint, true); @@ -1316,13 +1316,13 @@ class FlxTypedTilemap extends FlxBaseTilemap } } - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) _flashPoint.x += tileWidth; columnIndex++; } - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) _flashPoint.y += tileHeight; rowIndex += widthInTiles; } @@ -1330,7 +1330,7 @@ class FlxTypedTilemap extends FlxBaseTilemap buffer.x = screenXInTiles * scaledTileWidth; buffer.y = screenYInTiles * scaledTileHeight; - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { if (isColored) buffer.colorTransform(colorTransform); @@ -1347,7 +1347,7 @@ class FlxTypedTilemap extends FlxBaseTilemap #if FLX_DEBUG function makeDebugTile(color:FlxColor):BitmapData { - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) return null; var debugTile = new BitmapData(tileWidth, tileHeight, true, 0); diff --git a/flixel/tile/FlxTilemapBuffer.hx b/flixel/tile/FlxTilemapBuffer.hx index de43add469..a29485f2c4 100644 --- a/flixel/tile/FlxTilemapBuffer.hx +++ b/flixel/tile/FlxTilemapBuffer.hx @@ -117,7 +117,7 @@ class FlxTilemapBuffer implements IFlxDestroyable updateColumns(tileWidth, widthInTiles, scaleX, camera); updateRows(tileHeight, heightInTiles, scaleY, camera); - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { final newWidth = Std.int(columns * tileWidth); final newHeight = Std.int(rows * tileHeight); @@ -144,7 +144,7 @@ class FlxTilemapBuffer implements IFlxDestroyable */ public function destroy():Void { - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { pixels = FlxDestroyUtil.dispose(pixels); blend = null; @@ -161,7 +161,7 @@ class FlxTilemapBuffer implements IFlxDestroyable */ public function fill(color = FlxColor.TRANSPARENT):Void { - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { pixels.fillRect(_flashRect, color); } @@ -175,13 +175,13 @@ class FlxTilemapBuffer implements IFlxDestroyable */ public function draw(camera:FlxCamera, flashPoint:Point, scaleX = 1.0, scaleY = 1.0):Void { - FlxG.renderer.begin(camera); - if (isPixelPerfectRender(camera)) { flashPoint.x = Math.floor(flashPoint.x); flashPoint.y = Math.floor(flashPoint.y); } + + FlxG.renderer.begin(camera); if (isPixelPerfectRender(camera) && (scaleX == 1.0 && scaleY == 1.0) && blend == null) { diff --git a/flixel/ui/FlxBar.hx b/flixel/ui/FlxBar.hx index c486681085..e4804c1bbc 100644 --- a/flixel/ui/FlxBar.hx +++ b/flixel/ui/FlxBar.hx @@ -172,7 +172,7 @@ class FlxBar extends FlxSprite _filledBarPoint = new Point(); _filledBarRect = new Rectangle(); - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { _zeroOffset = new Point(); _emptyBarRect = new Rectangle(); @@ -198,7 +198,7 @@ class FlxBar extends FlxSprite { positionOffset = FlxDestroyUtil.put(positionOffset); - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) { frontFrames = null; _filledFlxRect = FlxDestroyUtil.put(_filledFlxRect); @@ -352,7 +352,7 @@ class FlxBar extends FlxSprite */ public function createColoredEmptyBar(empty:FlxColor, showBorder:Bool = false, border:FlxColor = FlxColor.WHITE, borderSize:Int = 1):FlxBar { - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) { var emptyKey:String = "empty: " + barWidth + "x" + barHeight + ":" + empty.toHexString(); if (showBorder) @@ -406,7 +406,7 @@ class FlxBar extends FlxSprite */ public function createColoredFilledBar(fill:FlxColor, showBorder:Bool = false, border:FlxColor = FlxColor.WHITE, borderSize:Int = 1):FlxBar { - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) { var filledKey:String = "filled: " + barWidth + "x" + barHeight + ":" + fill.toHexString(); if (showBorder) @@ -484,7 +484,7 @@ class FlxBar extends FlxSprite public function createGradientEmptyBar(empty:Array, chunkSize:Int = 1, rotation:Int = 180, showBorder:Bool = false, border:FlxColor = FlxColor.WHITE, borderSize:Int = 1):FlxBar { - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) { var emptyKey:String = "Gradient:" + barWidth + "x" + barHeight + ",colors:["; for (col in empty) @@ -552,7 +552,7 @@ class FlxBar extends FlxSprite public function createGradientFilledBar(fill:Array, chunkSize:Int = 1, rotation:Int = 180, showBorder:Bool = false, border:FlxColor = FlxColor.WHITE, borderSize:Int = 1):FlxBar { - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) { var filledKey:String = "Gradient:" + barWidth + "x" + barHeight + ",colors:["; for (col in fill) @@ -639,7 +639,7 @@ class FlxBar extends FlxSprite { var emptyGraphic:FlxGraphic = FlxG.bitmap.add(empty); - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) { frames = emptyGraphic.imageFrame; } @@ -681,7 +681,7 @@ class FlxBar extends FlxSprite { var filledGraphic:FlxGraphic = FlxG.bitmap.add(fill); - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) { frontFrames = filledGraphic.imageFrame; } @@ -744,7 +744,7 @@ class FlxBar extends FlxSprite */ public function updateEmptyBar():Void { - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { pixels.copyPixels(_emptyBar, _emptyBarRect, _zeroOffset); dirty = true; @@ -806,7 +806,7 @@ class FlxBar extends FlxSprite _filledBarPoint.y = Std.int((barHeight - _filledBarRect.height) / 2); } - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { pixels.copyPixels(_filledBar, _filledBarRect, _filledBarPoint, null, null, true); } @@ -823,7 +823,7 @@ class FlxBar extends FlxSprite } } - if (FlxG.renderBlit) + if (FlxG.renderer.method == BLITTING) { dirty = true; } @@ -852,7 +852,7 @@ class FlxBar extends FlxSprite { super.draw(); - if (!FlxG.renderTile) + if (FlxG.renderer.method != DRAW_TILES) return; if (alpha == 0) @@ -866,8 +866,6 @@ class FlxBar extends FlxSprite { continue; } - - FlxG.renderer.begin(camera); _frontFrame.prepareMatrix(_matrix, FlxFrameAngle.ANGLE_0, checkFlipX(), checkFlipY()); _matrix.translate(-origin.x, -origin.y); @@ -892,6 +890,7 @@ class FlxBar extends FlxSprite _matrix.ty = Math.floor(_matrix.ty); } + FlxG.renderer.begin(camera); FlxG.renderer.drawPixels(_frontFrame, _matrix, colorTransform, blend, antialiasing, shader); } } @@ -899,7 +898,7 @@ class FlxBar extends FlxSprite override function set_pixels(pixels:BitmapData):BitmapData { - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) { return pixels; // hack } @@ -984,7 +983,7 @@ class FlxBar extends FlxSprite function get_frontFrames():FlxImageFrame { - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) { return frontFrames; } @@ -993,7 +992,7 @@ class FlxBar extends FlxSprite function set_frontFrames(value:FlxImageFrame):FlxImageFrame { - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) { if (value != null) value.parent.incrementUseCount(); @@ -1013,7 +1012,7 @@ class FlxBar extends FlxSprite function get_backFrames():FlxImageFrame { - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) { return cast frames; } @@ -1022,7 +1021,7 @@ class FlxBar extends FlxSprite function set_backFrames(value:FlxImageFrame):FlxImageFrame { - if (FlxG.renderTile) + if (FlxG.renderer.method == DRAW_TILES) { frames = value; } From 468f65edd2ba225b890018429feffeedb5631052 Mon Sep 17 00:00:00 2001 From: ACrazyTown <47027981+ACrazyTown@users.noreply.github.com> Date: Sat, 24 Jan 2026 22:19:48 +0100 Subject: [PATCH 21/28] update some more docs --- flixel/FlxCamera.hx | 2 +- flixel/FlxSprite.hx | 10 +++++----- flixel/system/frontEnds/BitmapFrontEnd.hx | 2 +- flixel/tile/FlxTilemapBuffer.hx | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/flixel/FlxCamera.hx b/flixel/FlxCamera.hx index 70ea2a2293..4d236ec0b6 100644 --- a/flixel/FlxCamera.hx +++ b/flixel/FlxCamera.hx @@ -232,7 +232,7 @@ class FlxCamera extends FlxBasic /** * Whether the positions of the objects rendered on this camera are rounded. * If set on individual objects, they ignore the global camera setting. - * Defaults to `false` with `FlxG.renderTile` and to `true` with `FlxG.renderBlit`. + * Defaults to `true` with the blitting renderer and `false` elsewhere. * WARNING: setting this to `false` on blitting targets is very expensive. */ public var pixelPerfectRender:Bool; diff --git a/flixel/FlxSprite.hx b/flixel/FlxSprite.hx index d9afabfcc1..7d147cc8af 100644 --- a/flixel/FlxSprite.hx +++ b/flixel/FlxSprite.hx @@ -149,7 +149,7 @@ class FlxSprite extends FlxObject public var framePixels:BitmapData; /** - * Always `true` on `FlxG.renderBlit`. On `FlxG.renderTile` it determines whether + * Always `true` when using the blitting renderer. On other renderers it determines whether * `framePixels` is used and defaults to `false` for performance reasons. */ public var useFramePixels(default, set):Bool = true; @@ -248,7 +248,7 @@ class FlxSprite extends FlxObject /** * Change the size of your sprite's graphic. * NOTE: The hitbox is not automatically adjusted, use `updateHitbox()` for that. - * **WARNING:** With `FlxG.renderBlit`, scaling sprites decreases rendering performance by a factor of about x10! + * **WARNING:** With `the blitting renderer, scaling sprites decreases rendering performance by a factor of about x10! * @see https://snippets.haxeflixel.com/sprites/scale/ */ public var scale(default, null):FlxPoint; @@ -1171,7 +1171,7 @@ class FlxSprite extends FlxObject /** * Sets the sprite's color transformation with control over color offsets. - * With `FlxG.renderTile`, offsets are only supported on OpenFL Next version 3.6.0 or higher. + * With the DRAW_TILES renderer, offsets are only supported on OpenFL Next version 3.6.0 or higher. * * @param redMultiplier The value for the red multiplier, in the range from `0` to `1`. * @param greenMultiplier The value for the green multiplier, in the range from `0` to `1`. @@ -1674,8 +1674,8 @@ class FlxSprite extends FlxObject } /** - * Returns the result of `isSimpleRenderBlit()` if `FlxG.renderBlit` is - * `true`, or `false` if `FlxG.renderTile` is `true`. + * Returns the result of `isSimpleRenderBlit()` if the blitting renderer is used, + * or `false` elsewhere. */ public function isSimpleRender(?camera:FlxCamera):Bool { diff --git a/flixel/system/frontEnds/BitmapFrontEnd.hx b/flixel/system/frontEnds/BitmapFrontEnd.hx index 02b9b34a12..cd8bf697f8 100644 --- a/flixel/system/frontEnds/BitmapFrontEnd.hx +++ b/flixel/system/frontEnds/BitmapFrontEnd.hx @@ -28,7 +28,7 @@ class BitmapFrontEnd /** * Helper FlxFrame object. Containing only one frame. - * Useful for drawing colored rectangles of all sizes in FlxG.renderTile mode. + * Useful for drawing colored rectangles of all sizes when not using the blitting renderer. */ public var whitePixel(get, never):FlxFrame; diff --git a/flixel/tile/FlxTilemapBuffer.hx b/flixel/tile/FlxTilemapBuffer.hx index a29485f2c4..454650fb2a 100644 --- a/flixel/tile/FlxTilemapBuffer.hx +++ b/flixel/tile/FlxTilemapBuffer.hx @@ -61,7 +61,7 @@ class FlxTilemapBuffer implements IFlxDestroyable public var pixelPerfectRender:Null; /** - * The actual buffer BitmapData. (Only used if FlxG.renderBlit == true) + * The actual buffer BitmapData. (Only used with the blitting renderer) */ public var pixels(default, null):BitmapData; @@ -182,7 +182,7 @@ class FlxTilemapBuffer implements IFlxDestroyable } FlxG.renderer.begin(camera); - + if (isPixelPerfectRender(camera) && (scaleX == 1.0 && scaleY == 1.0) && blend == null) { FlxG.renderer.copyPixels(pixels, _flashRect, flashPoint, null, null, true); From 726c0be602da08a2e3b4b7357a9653d734e7877a Mon Sep 17 00:00:00 2001 From: ACrazyTown <47027981+ACrazyTown@users.noreply.github.com> Date: Sun, 25 Jan 2026 16:10:22 +0100 Subject: [PATCH 22/28] change `method == DRAW_TILES` checks into `method != BLITTING` the code hidden by this check is generally valid for any other non-blitting renderer like opengl --- flixel/FlxCamera.hx | 6 ++--- flixel/FlxG.hx | 2 +- flixel/FlxGame.hx | 2 +- flixel/FlxObject.hx | 2 +- flixel/FlxSprite.hx | 16 ++++++------- flixel/FlxSubState.hx | 6 ++--- flixel/graphics/frames/FlxFrame.hx | 4 ++-- .../system/debug/interaction/Interaction.hx | 4 ++-- flixel/system/debug/stats/Stats.hx | 10 ++++---- flixel/system/frontEnds/CameraFrontEnd.hx | 2 +- flixel/text/FlxBitmapText.hx | 8 +++---- flixel/text/FlxText.hx | 2 +- flixel/tile/FlxTilemap.hx | 8 +++---- flixel/ui/FlxBar.hx | 24 +++++++++---------- 14 files changed, 48 insertions(+), 48 deletions(-) diff --git a/flixel/FlxCamera.hx b/flixel/FlxCamera.hx index 4d236ec0b6..2610aa9875 100644 --- a/flixel/FlxCamera.hx +++ b/flixel/FlxCamera.hx @@ -223,7 +223,7 @@ class FlxCamera extends FlxBasic public var flashSprite(get, set):Sprite; inline function set_flashSprite(value:Sprite):Sprite { - var sprite = FlxG.renderer.method == DRAW_TILES ? viewQuad.flashSprite : viewBlit.flashSprite; + var sprite = FlxG.renderer.method != BLITTING ? viewQuad.flashSprite : viewBlit.flashSprite; return sprite = value; } @@ -555,11 +555,11 @@ class FlxCamera extends FlxBasic var _scrollRect(get, set):Sprite; inline function get__scrollRect():Sprite { - return FlxG.renderer.method == DRAW_TILES ? viewQuad._scrollRect : viewBlit._scrollRect; + return FlxG.renderer.method != BLITTING ? viewQuad._scrollRect : viewBlit._scrollRect; } inline function set__scrollRect(value:Sprite):Sprite { - var scrollRect = FlxG.renderer.method == DRAW_TILES ? viewQuad._scrollRect : viewBlit._scrollRect; + var scrollRect = FlxG.renderer.method != BLITTING ? viewQuad._scrollRect : viewBlit._scrollRect; return scrollRect = value; } diff --git a/flixel/FlxG.hx b/flixel/FlxG.hx index b505b52d20..61900b7c91 100644 --- a/flixel/FlxG.hx +++ b/flixel/FlxG.hx @@ -162,7 +162,7 @@ class FlxG public static var renderTile(get, never):Bool; @:noCompletion static inline function get_renderTile():Bool { - return FlxG.renderer.method == DRAW_TILES; + return FlxG.renderer.method != BLITTING; } /** diff --git a/flixel/FlxGame.hx b/flixel/FlxGame.hx index dcf7dda1d2..9a6af108ce 100644 --- a/flixel/FlxGame.hx +++ b/flixel/FlxGame.hx @@ -820,7 +820,7 @@ class FlxGame extends Sprite FlxG.cameras.render(); - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) { #if FLX_DEBUG debugger.stats.drawCalls(FlxRenderer.totalDrawCalls); diff --git a/flixel/FlxObject.hx b/flixel/FlxObject.hx index 1d8838a2ce..34f9452501 100644 --- a/flixel/FlxObject.hx +++ b/flixel/FlxObject.hx @@ -1309,7 +1309,7 @@ class FlxObject extends FlxBasic return; final rect = getBoundingBox(camera); - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) { final view = camera.getViewMarginRect(); view.pad(2); diff --git a/flixel/FlxSprite.hx b/flixel/FlxSprite.hx index 7d147cc8af..d9a67b2a93 100644 --- a/flixel/FlxSprite.hx +++ b/flixel/FlxSprite.hx @@ -1566,7 +1566,7 @@ class FlxSprite extends FlxObject { checkEmptyFrame(); - if (FlxG.renderer.method == DRAW_TILES && !force) + if (FlxG.renderer.method != BLITTING && !force) return; updateFramePixels(); @@ -1582,7 +1582,7 @@ class FlxSprite extends FlxObject // don't try to regenerate frame pixels if _frame already uses it as source of graphics // if you'll try then it will clear framePixels and you won't see anything - if (FlxG.renderer.method == DRAW_TILES && _frameGraphic != null) + if (FlxG.renderer.method != BLITTING && _frameGraphic != null) { dirty = false; return framePixels; @@ -1605,7 +1605,7 @@ class FlxSprite extends FlxObject framePixels.colorTransform(_flashRect, colorTransform); } - if (FlxG.renderer.method == DRAW_TILES && useFramePixels) + if (FlxG.renderer.method != BLITTING && useFramePixels) { // recreate _frame for native target, so it will use modified framePixels _frameGraphic = FlxDestroyUtil.destroy(_frameGraphic); @@ -1679,7 +1679,7 @@ class FlxSprite extends FlxObject */ public function isSimpleRender(?camera:FlxCamera):Bool { - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) return false; return isSimpleRenderBlit(camera); @@ -1848,7 +1848,7 @@ class FlxSprite extends FlxObject return null; } - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) { _frameGraphic = FlxDestroyUtil.destroy(_frameGraphic); } @@ -2006,7 +2006,7 @@ class FlxSprite extends FlxObject @:noCompletion function set_flipX(Value:Bool):Bool { - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) { _facingHorizontalMult = Value ? -1 : 1; } @@ -2017,7 +2017,7 @@ class FlxSprite extends FlxObject @:noCompletion function set_flipY(Value:Bool):Bool { - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) { _facingVerticalMult = Value ? -1 : 1; } @@ -2034,7 +2034,7 @@ class FlxSprite extends FlxObject @:noCompletion function set_useFramePixels(value:Bool):Bool { - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) { if (value != useFramePixels) { diff --git a/flixel/FlxSubState.hx b/flixel/FlxSubState.hx index e39a509331..0edb330869 100644 --- a/flixel/FlxSubState.hx +++ b/flixel/FlxSubState.hx @@ -53,7 +53,7 @@ class FlxSubState extends FlxState closeCallback = null; openCallback = null; - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) { _bgSprite = new FlxBGSprite(); } @@ -71,7 +71,7 @@ class FlxSubState extends FlxState FlxG.renderer.fill(bgColor); } } - else // FlxG.renderer.method == DRAW_TILES + else // FlxG.renderer.method != BLITTING { if (_bgSprite != null && _bgSprite.visible) { @@ -111,7 +111,7 @@ class FlxSubState extends FlxState @:noCompletion override function set_bgColor(value:FlxColor):FlxColor { - if (FlxG.renderer.method == DRAW_TILES && _bgSprite != null) + if (FlxG.renderer.method != BLITTING && _bgSprite != null) { _bgSprite.alpha = value.alphaFloat; _bgSprite.visible = _bgSprite.alpha > 0; diff --git a/flixel/graphics/frames/FlxFrame.hx b/flixel/graphics/frames/FlxFrame.hx index 5435b01bce..24ee97351e 100644 --- a/flixel/graphics/frames/FlxFrame.hx +++ b/flixel/graphics/frames/FlxFrame.hx @@ -159,7 +159,7 @@ class FlxFrame implements IFlxDestroyable offset = FlxPoint.get(); blitMatrix = new MatrixVector(); - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) tileMatrix = new MatrixVector(); } @@ -169,7 +169,7 @@ class FlxFrame implements IFlxDestroyable { blitMatrix.copyFrom(this, true); - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) tileMatrix.copyFrom(this, false); } diff --git a/flixel/system/debug/interaction/Interaction.hx b/flixel/system/debug/interaction/Interaction.hx index f0663f4b33..200c379f20 100644 --- a/flixel/system/debug/interaction/Interaction.hx +++ b/flixel/system/debug/interaction/Interaction.hx @@ -790,7 +790,7 @@ class Interaction extends Window public function toDebugX(worldX:Float, camera:FlxCamera) { - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) return camera.viewQuad.canvas.localToGlobal(new Point(worldX, 0)).x; else @:privateAccess @@ -799,7 +799,7 @@ class Interaction extends Window public function toDebugY(worldY:Float, camera:FlxCamera) { - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) return camera.viewQuad.canvas.localToGlobal(new Point(0, worldY)).y; else @:privateAccess diff --git a/flixel/system/debug/stats/Stats.hx b/flixel/system/debug/stats/Stats.hx index 4293798c3c..8b82b00dac 100644 --- a/flixel/system/debug/stats/Stats.hx +++ b/flixel/system/debug/stats/Stats.hx @@ -88,7 +88,7 @@ class Stats extends Window { super("Stats", Icon.stats, 0, 0, false); - var minHeight = if (FlxG.renderer.method == DRAW_TILES) 200 else 185; + var minHeight = if (FlxG.renderer.method != BLITTING) 200 else 185; minSize.y = minHeight; resize(INITIAL_WIDTH, minHeight); @@ -130,7 +130,7 @@ class Stats extends Window _leftTextField.multiline = _rightTextField.multiline = true; var drawMethod = ""; - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) { drawMethod = #if FLX_RENDER_TRIANGLE @@ -267,7 +267,7 @@ class Stats extends Window } visibleCount = Std.int(divide(visibleCount, _visibleObjectMarker)); - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) { for (i in 0..._drawCallsMarker) { @@ -280,7 +280,7 @@ class Stats extends Window _drawMarker = 0; _activeObjectMarker = 0; _visibleObjectMarker = 0; - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) { _drawCallsMarker = 0; } @@ -298,7 +298,7 @@ class Stats extends Window updateTimeGraph.update(updTime); _rightTextField.text = activeCount + " (" + updTime + "ms)\n" + visibleCount + " (" + drwTime + "ms)\n" - + (FlxG.renderer.method == DRAW_TILES ? (drawCallsCount + "\n") : "") + + (FlxG.renderer.method != BLITTING ? (drawCallsCount + "\n") : "") + FlxQuadTree._NUM_CACHED_QUAD_TREES + "\n" + FlxLinkedList._NUM_CACHED_FLX_LIST; diff --git a/flixel/system/frontEnds/CameraFrontEnd.hx b/flixel/system/frontEnds/CameraFrontEnd.hx index 833a31408b..eb28bcb776 100644 --- a/flixel/system/frontEnds/CameraFrontEnd.hx +++ b/flixel/system/frontEnds/CameraFrontEnd.hx @@ -136,7 +136,7 @@ class CameraFrontEnd return; } - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) { for (i in 0...list.length) { diff --git a/flixel/text/FlxBitmapText.hx b/flixel/text/FlxBitmapText.hx index a814eab587..8610f60560 100644 --- a/flixel/text/FlxBitmapText.hx +++ b/flixel/text/FlxBitmapText.hx @@ -264,7 +264,7 @@ class FlxBitmapText extends FlxSprite _colorParams = null; - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) { textData = null; textDrawData = null; @@ -278,7 +278,7 @@ class FlxBitmapText extends FlxSprite */ override public function drawFrame(Force:Bool = false):Void { - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) { Force = true; } @@ -511,7 +511,7 @@ class FlxBitmapText extends FlxSprite override function calcFrame(RunOnCpp:Bool = false):Void { - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) { drawFrame(RunOnCpp); } @@ -1023,7 +1023,7 @@ class FlxBitmapText extends FlxSprite textBitmap.lock(); } - else if (FlxG.renderer.method == DRAW_TILES) + else if (FlxG.renderer.method != BLITTING) { textData.clear(); } diff --git a/flixel/text/FlxText.hx b/flixel/text/FlxText.hx index 3ecc41a7f0..b608b7f57f 100644 --- a/flixel/text/FlxText.hx +++ b/flixel/text/FlxText.hx @@ -1071,7 +1071,7 @@ class FlxText extends FlxSprite if (textField == null) return; - if (FlxG.renderer.method == DRAW_TILES && !RunOnCpp) + if (FlxG.renderer.method != BLITTING && !RunOnCpp) return; regenGraphic(); diff --git a/flixel/tile/FlxTilemap.hx b/flixel/tile/FlxTilemap.hx index 202af69d82..09e17d4d87 100644 --- a/flixel/tile/FlxTilemap.hx +++ b/flixel/tile/FlxTilemap.hx @@ -286,7 +286,7 @@ class FlxTypedTilemap extends FlxBaseTilemap { super(); - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) { _helperPoint = new Point(); _matrix = new FlxMatrix(); @@ -499,7 +499,7 @@ class FlxTypedTilemap extends FlxBaseTilemap function updateDebugTile(tileBitmap:BitmapData, color:FlxColor):BitmapData { - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) return null; if (tileWidth <= 0 || tileHeight <= 0) @@ -704,7 +704,7 @@ class FlxTypedTilemap extends FlxBaseTilemap */ override function setDirty(dirty:Bool = true):Void { - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) return; for (buffer in _buffers) @@ -1347,7 +1347,7 @@ class FlxTypedTilemap extends FlxBaseTilemap #if FLX_DEBUG function makeDebugTile(color:FlxColor):BitmapData { - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) return null; var debugTile = new BitmapData(tileWidth, tileHeight, true, 0); diff --git a/flixel/ui/FlxBar.hx b/flixel/ui/FlxBar.hx index e4804c1bbc..fa26277b06 100644 --- a/flixel/ui/FlxBar.hx +++ b/flixel/ui/FlxBar.hx @@ -198,7 +198,7 @@ class FlxBar extends FlxSprite { positionOffset = FlxDestroyUtil.put(positionOffset); - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) { frontFrames = null; _filledFlxRect = FlxDestroyUtil.put(_filledFlxRect); @@ -352,7 +352,7 @@ class FlxBar extends FlxSprite */ public function createColoredEmptyBar(empty:FlxColor, showBorder:Bool = false, border:FlxColor = FlxColor.WHITE, borderSize:Int = 1):FlxBar { - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) { var emptyKey:String = "empty: " + barWidth + "x" + barHeight + ":" + empty.toHexString(); if (showBorder) @@ -406,7 +406,7 @@ class FlxBar extends FlxSprite */ public function createColoredFilledBar(fill:FlxColor, showBorder:Bool = false, border:FlxColor = FlxColor.WHITE, borderSize:Int = 1):FlxBar { - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) { var filledKey:String = "filled: " + barWidth + "x" + barHeight + ":" + fill.toHexString(); if (showBorder) @@ -484,7 +484,7 @@ class FlxBar extends FlxSprite public function createGradientEmptyBar(empty:Array, chunkSize:Int = 1, rotation:Int = 180, showBorder:Bool = false, border:FlxColor = FlxColor.WHITE, borderSize:Int = 1):FlxBar { - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) { var emptyKey:String = "Gradient:" + barWidth + "x" + barHeight + ",colors:["; for (col in empty) @@ -552,7 +552,7 @@ class FlxBar extends FlxSprite public function createGradientFilledBar(fill:Array, chunkSize:Int = 1, rotation:Int = 180, showBorder:Bool = false, border:FlxColor = FlxColor.WHITE, borderSize:Int = 1):FlxBar { - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) { var filledKey:String = "Gradient:" + barWidth + "x" + barHeight + ",colors:["; for (col in fill) @@ -639,7 +639,7 @@ class FlxBar extends FlxSprite { var emptyGraphic:FlxGraphic = FlxG.bitmap.add(empty); - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) { frames = emptyGraphic.imageFrame; } @@ -681,7 +681,7 @@ class FlxBar extends FlxSprite { var filledGraphic:FlxGraphic = FlxG.bitmap.add(fill); - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) { frontFrames = filledGraphic.imageFrame; } @@ -898,7 +898,7 @@ class FlxBar extends FlxSprite override function set_pixels(pixels:BitmapData):BitmapData { - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) { return pixels; // hack } @@ -983,7 +983,7 @@ class FlxBar extends FlxSprite function get_frontFrames():FlxImageFrame { - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) { return frontFrames; } @@ -992,7 +992,7 @@ class FlxBar extends FlxSprite function set_frontFrames(value:FlxImageFrame):FlxImageFrame { - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) { if (value != null) value.parent.incrementUseCount(); @@ -1012,7 +1012,7 @@ class FlxBar extends FlxSprite function get_backFrames():FlxImageFrame { - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) { return cast frames; } @@ -1021,7 +1021,7 @@ class FlxBar extends FlxSprite function set_backFrames(value:FlxImageFrame):FlxImageFrame { - if (FlxG.renderer.method == DRAW_TILES) + if (FlxG.renderer.method != BLITTING) { frames = value; } From 9441d8c45e35e49310a049a8c700b52f6014177c Mon Sep 17 00:00:00 2001 From: ACrazyTown <47027981+ACrazyTown@users.noreply.github.com> Date: Sun, 25 Jan 2026 16:11:50 +0100 Subject: [PATCH 23/28] Make `FlxCameraView.create()` dynamic --- flixel/system/render/FlxCameraView.hx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/flixel/system/render/FlxCameraView.hx b/flixel/system/render/FlxCameraView.hx index 9d0fe92429..05cad513a0 100644 --- a/flixel/system/render/FlxCameraView.hx +++ b/flixel/system/render/FlxCameraView.hx @@ -17,9 +17,11 @@ class FlxCameraView implements IFlxDestroyable { /** * Creates a `FlxCameraView` object tied to a camera, based on the target and project configuration. - * @param camera The camera to create the view for + * This function is dynamic, which means that you can change the return value yourself. + * + * @param camera The camera to create the view for */ - public static inline function create(camera:FlxCamera):FlxCameraView + public static dynamic function create(camera:FlxCamera):FlxCameraView { if (!FlxG.renderer.isHardware) { From 181cec83f0dedd783aefab9da5d3d38d0b79daac Mon Sep 17 00:00:00 2001 From: George Kurelic Date: Sun, 25 Jan 2026 19:27:43 -0600 Subject: [PATCH 24/28] change import --- flixel/system/render/quad/FlxQuadRenderer.hx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flixel/system/render/quad/FlxQuadRenderer.hx b/flixel/system/render/quad/FlxQuadRenderer.hx index 464a2e5d31..32c6f44d2f 100644 --- a/flixel/system/render/quad/FlxQuadRenderer.hx +++ b/flixel/system/render/quad/FlxQuadRenderer.hx @@ -5,7 +5,7 @@ import flixel.graphics.FlxGraphic; import flixel.graphics.frames.FlxFrame; import flixel.graphics.tile.FlxDrawBaseItem; import flixel.graphics.tile.FlxDrawQuadsItem; -import flixel.graphics.tile.FlxDrawTrianglesItem.DrawData; +import flixel.graphics.tile.FlxDrawTrianglesItem; import flixel.math.FlxMatrix; import flixel.math.FlxPoint; import flixel.math.FlxRect; From fb9d27cea9cb9c18889ef8baa1f56e4456657962 Mon Sep 17 00:00:00 2001 From: ACrazyTown <47027981+ACrazyTown@users.noreply.github.com> Date: Mon, 26 Jan 2026 10:37:17 +0100 Subject: [PATCH 25/28] Bring back accidentally removed method --- flixel/FlxCamera.hx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/flixel/FlxCamera.hx b/flixel/FlxCamera.hx index 2610aa9875..c45ebb893d 100644 --- a/flixel/FlxCamera.hx +++ b/flixel/FlxCamera.hx @@ -719,6 +719,14 @@ class FlxCamera extends FlxBasic return viewQuad.getNewDrawTrianglesItem(graphic, smoothing, isColored, blend, hasColorOffsets, shader); } + @:allow(flixel.system.frontEnds.CameraFrontEnd) + @:deprecated("camera.render() is deprecated, use FlxG.renderer.render() instead.") + function render():Void + { + FlxG.renderer.begin(this); + FlxG.renderer.render(); + } + @:allow(flixel.system.frontEnds.CameraFrontEnd) function clearDrawStack():Void { From f45c61e9862353769dd0c585440aa3b2737dd928 Mon Sep 17 00:00:00 2001 From: ACrazyTown <47027981+ACrazyTown@users.noreply.github.com> Date: Mon, 26 Jan 2026 12:16:28 +0100 Subject: [PATCH 26/28] fix line debug draw --- flixel/FlxG.hx | 2 +- flixel/FlxObject.hx | 15 ++++++++------- flixel/system/render/blit/FlxBlitRenderer.hx | 2 +- flixel/system/render/quad/FlxQuadRenderer.hx | 2 +- flixel/tile/FlxTilemap.hx | 4 +++- 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/flixel/FlxG.hx b/flixel/FlxG.hx index 61900b7c91..7229b2fa6a 100644 --- a/flixel/FlxG.hx +++ b/flixel/FlxG.hx @@ -146,7 +146,7 @@ class FlxG @:deprecated("renderMethod is deprecated, use FlxG.render.method, instead.") public static var renderMethod(get, null):flixel.system.render.FlxRenderer.FlxRenderMethod; - static inline function get_renderMethod():flixel.system.render.FlxRenderer.FlxRenderMethod + @:noCompletion static inline function get_renderMethod():flixel.system.render.FlxRenderer.FlxRenderMethod { return FlxG.renderer.method; } diff --git a/flixel/FlxObject.hx b/flixel/FlxObject.hx index 34f9452501..936875fc43 100644 --- a/flixel/FlxObject.hx +++ b/flixel/FlxObject.hx @@ -1287,7 +1287,6 @@ class FlxObject extends FlxBasic for (camera in getCamerasLegacy()) { - FlxG.renderer.begin(camera); drawDebugOnCamera(camera); if (drawPath) @@ -1319,11 +1318,13 @@ class FlxObject extends FlxBasic if (rect.width > 0 && rect.height > 0) { - drawDebugBoundingBox(camera, rect, allowCollisions); + FlxG.renderer.beginDrawDebug(camera); + drawDebugBoundingBox(rect, allowCollisions); + FlxG.renderer.endDrawDebug(); } } - @:deprecated("drawDebugBoundingBox(gfx, rect, allowCollisions, partial) is deprecated. Use drawDebugBoundingBox(camera, rect, allowCollisions) instead.") + @:deprecated("drawDebugBoundingBox(gfx, rect, allowCollisions, partial) is deprecated. Use drawDebugBoundingBox(rect, allowCollisions) instead.") overload extern inline function drawDebugBoundingBox(gfx:Graphics, rect:FlxRect, allowCollisions:FlxDirectionFlags, partial:Bool) { // Find the color to use @@ -1331,12 +1332,12 @@ class FlxObject extends FlxBasic drawDebugBoundingBoxColor(gfx, rect, color); } - overload extern inline function drawDebugBoundingBox(camera:FlxCamera, rect:FlxRect, allowCollisions:FlxDirectionFlags) + overload extern inline function drawDebugBoundingBox(rect:FlxRect, allowCollisions:FlxDirectionFlags) { // Find the color to use var color = getDebugBoundingBoxColor(allowCollisions); color.alphaFloat = 0.75; - drawDebugBoundingBoxColor(camera, rect, color); + drawDebugBoundingBoxColor(rect, color); } function getDebugBoundingBoxColor(allowCollisions:FlxDirectionFlags) @@ -1354,7 +1355,7 @@ class FlxObject extends FlxBasic } - @:deprecated("drawDebugBoundingBoxColor(gfx, rect, color) is deprecated, use drawDebugBoundingBoxColor(camera, rect, color) instead") + @:deprecated("drawDebugBoundingBoxColor(gfx, rect, color) is deprecated, use drawDebugBoundingBoxColor(rect, color) instead") overload extern inline function drawDebugBoundingBoxColor(gfx:Graphics, rect:FlxRect, color:FlxColor) { // fill static graphics object with square shape @@ -1362,7 +1363,7 @@ class FlxObject extends FlxBasic gfx.drawRect(rect.x + 0.5, rect.y + 0.5, rect.width - 1.0, rect.height - 1.0); } - overload extern inline function drawDebugBoundingBoxColor(camera:FlxCamera, rect:FlxRect, color:FlxColor) + overload extern inline function drawDebugBoundingBoxColor(rect:FlxRect, color:FlxColor) { FlxG.renderer.drawDebugRect(rect.x + 0.5, rect.y + 0.5, rect.width - 1.0, rect.height - 1.0, color); } diff --git a/flixel/system/render/blit/FlxBlitRenderer.hx b/flixel/system/render/blit/FlxBlitRenderer.hx index 823c12d21f..3fb13042c3 100644 --- a/flixel/system/render/blit/FlxBlitRenderer.hx +++ b/flixel/system/render/blit/FlxBlitRenderer.hx @@ -289,7 +289,7 @@ class FlxBlitRenderer extends FlxRenderer { final gfx = FlxSpriteUtil.flashGfx; gfx.lineStyle(thickness, color.rgb, color.alphaFloat, false, null, null, MITER, 255); - gfx.moveTo(x1, x2); + gfx.moveTo(x1, y1); gfx.lineTo(x2, y2); } #end diff --git a/flixel/system/render/quad/FlxQuadRenderer.hx b/flixel/system/render/quad/FlxQuadRenderer.hx index 32c6f44d2f..b21d2d4ccb 100644 --- a/flixel/system/render/quad/FlxQuadRenderer.hx +++ b/flixel/system/render/quad/FlxQuadRenderer.hx @@ -168,7 +168,7 @@ class FlxQuadRenderer extends FlxRenderer { final gfx = view.debugLayer.graphics; gfx.lineStyle(thickness, color.rgb, color.alphaFloat, false, null, null, MITER, 255); - gfx.moveTo(x1, x2); + gfx.moveTo(x1, y1); gfx.lineTo(x2, y2); } #end diff --git a/flixel/tile/FlxTilemap.hx b/flixel/tile/FlxTilemap.hx index 09e17d4d87..2694519df5 100644 --- a/flixel/tile/FlxTilemap.hx +++ b/flixel/tile/FlxTilemap.hx @@ -545,6 +545,8 @@ class FlxTypedTilemap extends FlxBaseTilemap if (FlxG.renderer.method != DRAW_TILES) return; + FlxG.renderer.beginDrawDebug(camera); + var buffer:FlxTilemapBuffer = null; var l:Int = FlxG.cameras.list.length; @@ -595,7 +597,7 @@ class FlxTypedTilemap extends FlxBaseTilemap if (color != null) { final colStr = color.toHexString(); - drawDebugBoundingBoxColor(camera, rect, color); + drawDebugBoundingBoxColor(rect, color); } } } From b4c0c8a82a7f53294644a20513562f055756227d Mon Sep 17 00:00:00 2001 From: ACrazyTown <47027981+ACrazyTown@users.noreply.github.com> Date: Tue, 27 Jan 2026 15:33:44 +0100 Subject: [PATCH 27/28] Fix C++ CI --- flixel/text/FlxBitmapText.hx | 7 ++++++- tests/unit/src/flixel/FlxGTest.hx | 3 +++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/flixel/text/FlxBitmapText.hx b/flixel/text/FlxBitmapText.hx index 8610f60560..39a1536eb5 100644 --- a/flixel/text/FlxBitmapText.hx +++ b/flixel/text/FlxBitmapText.hx @@ -247,6 +247,11 @@ class FlxBitmapText extends FlxSprite } this.text = text; + + // initialize at runtime instead of statically to avoid a crash + // because FlxG.renderer(.method) is null + if (frameDrawHelper == null) + frameDrawHelper = new ReusableFrame(); } /** @@ -326,7 +331,7 @@ class FlxBitmapText extends FlxSprite static final borderColorTransformDrawHelper = new ColorTransform(); static final textColorTransformDrawHelper = new ColorTransform(); static final matrixDrawHelper = new FlxMatrix(); - static final frameDrawHelper = new ReusableFrame(); + static var frameDrawHelper:Null; override function draw() { if (FlxG.renderer.method == BLITTING) diff --git a/tests/unit/src/flixel/FlxGTest.hx b/tests/unit/src/flixel/FlxGTest.hx index 58d3daac76..1db3789e96 100644 --- a/tests/unit/src/flixel/FlxGTest.hx +++ b/tests/unit/src/flixel/FlxGTest.hx @@ -23,6 +23,9 @@ class FlxGTest extends FlxTest @Test function testSaveNull():Void Assert.isNotNull(FlxG.save); + @Test function testRendererNull():Void + Assert.isNotNull(FlxG.renderer); + #if FLX_MOUSE @Test function testMouseNull():Void Assert.isNotNull(FlxG.mouse); From 39b08cea5f9d75a12f329381af1a2020957c2a55 Mon Sep 17 00:00:00 2001 From: ACrazyTown <47027981+ACrazyTown@users.noreply.github.com> Date: Tue, 27 Jan 2026 20:17:12 +0100 Subject: [PATCH 28/28] no longer need to recreate MatrixVector in ReusableFrame --- flixel/text/FlxBitmapText.hx | 2 -- 1 file changed, 2 deletions(-) diff --git a/flixel/text/FlxBitmapText.hx b/flixel/text/FlxBitmapText.hx index 39a1536eb5..f1ab0b7b8d 100644 --- a/flixel/text/FlxBitmapText.hx +++ b/flixel/text/FlxBitmapText.hx @@ -1800,8 +1800,6 @@ private class ReusableFrame extends FlxFrame public function new () { super(null); - // We need to define this now, since it's created before renderTile is set - tileMatrix = new MatrixVector(); } override function destroy() {}