Add ClipRect functionality to FunkinGroup

This commit is contained in:
Kade-gtihub
2026-05-09 04:39:16 -06:00
committed by Hundrec
parent b97012a10d
commit cf3e2e05bf
+46 -11
View File
@@ -3,6 +3,7 @@ package funkin.group;
import flixel.util.FlxColor;
import flixel.FlxG;
import flixel.FlxSprite;
import flixel.math.FlxRect;
import flixel.util.FlxSort;
import funkin.util.SortUtil;
import flixel.math.FlxPoint;
@@ -270,7 +271,51 @@ class FunkinGroup<T:FlxSprite> extends FlxSprite
{
for (child in children)
{
if (child != null && child.exists && child.visible) child.draw();
if (child == null || !child.exists || !child.visible) continue;
if (clipRect != null)
{
// Preserve the child's original clip so we can restore it after drawing.
var originalClip:Null<FlxRect> = child.clipRect;
// Convert this group's clipRect into the child's local space.
var groupClip:FlxRect = FlxRect.get(x + clipRect.x, y + clipRect.y, clipRect.width, clipRect.height);
var childClip:FlxRect = null;
if (Std.isOfType(child, FunkinGroup))
{
// Nested groups expect clipRect in group-local world units.
childClip = FlxRect.get(groupClip.x - child.x, groupClip.y - child.y, groupClip.width, groupClip.height);
}
else
{
// Sprites expect clipRect in texture-local units, so include scale.
var sx:Float = child.scale.x != 0 ? child.scale.x : 1.0;
var sy:Float = child.scale.y != 0 ? child.scale.y : 1.0;
childClip = FlxRect.get((groupClip.x - child.x) / sx, (groupClip.y - child.y) / sy, groupClip.width / sx, groupClip.height / sy);
}
// If the child already has its own clip, intersect it in the same local space.
if (originalClip != null)
{
var ix:Float = Math.max(childClip.x, originalClip.x);
var iy:Float = Math.max(childClip.y, originalClip.y);
var ir:Float = Math.min(childClip.right, originalClip.right);
var ib:Float = Math.min(childClip.bottom, originalClip.bottom);
childClip.set(ix, iy, Math.max(0, ir - ix), Math.max(0, ib - iy));
}
child.clipRect = childClip;
child.draw();
childClip.put();
// Restore the child's original clip object.
child.clipRect = originalClip;
}
else
{
child.draw();
}
}
}
@@ -717,16 +762,6 @@ class FunkinGroup<T:FlxSprite> extends FlxSprite
return this;
}
override function set_pixels(Value:openfl.display.BitmapData):openfl.display.BitmapData
{
return Value;
}
override function set_frame(Value:flixel.graphics.frames.FlxFrame):flixel.graphics.frames.FlxFrame
{
return Value;
}
override function get_pixels():openfl.display.BitmapData
{
return null;