diff --git a/source/funkin/editors/stage/StageEditor.hx b/source/funkin/editors/stage/StageEditor.hx index 83419c9c..d8b9cd31 100644 --- a/source/funkin/editors/stage/StageEditor.hx +++ b/source/funkin/editors/stage/StageEditor.hx @@ -2,7 +2,9 @@ package funkin.editors.stage; import flixel.math.FlxAngle; import flixel.math.FlxPoint; +import flixel.math.FlxRect; import flixel.util.FlxColor; +import flixel.util.FlxSort; import funkin.backend.system.framerate.Framerate; import funkin.backend.utils.XMLUtil.AnimData; import funkin.editors.stage.elements.*; @@ -18,6 +20,8 @@ class StageEditor extends UIState { static var __stage:String; public var stage:Stage; + private var _point:FlxPoint = new FlxPoint(); + public static var instance(get, null):StageEditor; private static inline function get_instance() @@ -255,7 +259,9 @@ class StageEditor extends UIState { if(xml != null) { if(sprite is FunkinSprite) { var type = sprite.extra.get(exID("type")); - stageSpritesWindow.add((type == "box" || type == "solid") ? new StageSolidButton(0,0, sprite, xml) : new StageSpriteButton(0,0, sprite, xml)); + var button:StageElementButton = (type == "box" || type == "solid") ? new StageSolidButton(0,0, sprite, xml) : new StageSpriteButton(0,0, sprite, xml); + sprite.extra.set(exID("button"), button); + stageSpritesWindow.add(button); } else if(sprite is StageCharPos) { var char = charMap[sprite.name]; @@ -311,6 +317,59 @@ class StageEditor extends UIState { updateZoom(); } + /*if(FlxG.mouse.justPressed) { + var bounds:Array = []; + var sprites = stageSpritesWindow.buttons.members.map((o) -> o.getSprite()).filter((o) -> o != null && o.animateAtlas == null); + for(sprite in sprites) { + if(sprite is FunkinSprite) { + var sprite:FunkinSprite = cast sprite; + if(sprite.extra.exists(exID("bounds"))) { + bounds.push(cast(sprite.extra.get(exID("bounds")), FlxRect)); + } + } + } + + // sort by area + bounds.sort((a, b) -> FlxSort.byValues(FlxSort.ASCENDING, a.width * a.height, b.width * b.height)); + + Logs.trace("------------------------"); + for(bounds in bounds) { + Logs.trace(bounds.width + "x" + bounds.height); + } + }*/ + + /*if(FlxG.mouse.justPressed) { + //var sprites = Lambda.array(stage.stageSprites); + var sprites = stageSpritesWindow.buttons.members.map((o) -> o.getSprite()).filter((o) -> o != null && o.animateAtlas == null); + trace(sprites.map((o) -> cast(o, FunkinSprite).name)); + var length = sprites.length; + // Reset selected sprites + for(i in 0...length) { + var sprite = sprites[i]; + if(sprite is FunkinSprite) { + var sprite:FunkinSprite = cast sprite; + sprite.extra.set(exID("selected"), false); + } + } + for(i in 0...length) { + var idx = length - i - 1; + var sprite = sprites[idx]; + if(sprite is FunkinSprite) { + var sprite:FunkinSprite = cast sprite; + if(!sprite.extra.exists(exID("bounds"))) continue; + trace(idx, sprite.name); + var bounds = cast(sprite.extra.get(exID("bounds")), FlxRect); + var pos = FlxG.mouse.getWorldPosition(stageCamera, _point); + trace(sprite.name, bounds, pos); + if(bounds.containsPoint(pos)) { + sprite.extra.set(exID("selected"), true); + trace("Selected " + sprite.name); + break; + } + } + } + }*/ + //if (FlxG.mouse.justReleasedRight) { // closeCurrentContextMenu(); // openContextMenu(topMenu[2].childs); @@ -334,6 +393,22 @@ class StageEditor extends UIState { SaveWarning.showWarning = undos.unsaved; } + public function selectSprite(_sprite:FunkinSprite) { + var sprites = stageSpritesWindow.buttons.members.map((o) -> o.getSprite()).filter((o) -> o != null);// && o.animateAtlas == null); + for(sprite in sprites) { + if(sprite is FunkinSprite) { + var sprite:FunkinSprite = cast sprite; + sprite.extra.set(exID("selected"), false); + sprite.extra.get(exID("button")).selected = false; + } + } + if(_sprite is FunkinSprite) { + var sprite:FunkinSprite = cast _sprite; + sprite.extra.set(exID("selected"), true); + sprite.extra.get(exID("button")).selected = true; + } + } + // TOP MENU OPTIONS #if REGION function _file_exit(_) { @@ -519,7 +594,7 @@ class StageEditor extends UIState { if(!showOutlines) return; if(dot == null) { - dot = new FlxSprite().makeGraphic(10, 10, FlxColor.RED); + dot = new FlxSprite().makeGraphic(10, 10, FlxColor.WHITE); dot.camera = stageCamera; dot.forceIsOnScreen = true; } @@ -565,6 +640,27 @@ class StageEditor extends UIState { //Logs.trace("Guide at " + corners[0].x + ", " + corners[0].y + " sprite at " + sprite.x + ", " + sprite.y); + if(sprite is FunkinSprite) { + var sprite:FunkinSprite = cast sprite; + var maxX = Math.max(Math.max(corners[0].x, corners[1].x), Math.max(corners[2].x, corners[3].x)); + var maxY = Math.max(Math.max(corners[0].y, corners[1].y), Math.max(corners[2].y, corners[3].y)); + var minX = Math.min(Math.min(corners[0].x, corners[1].x), Math.min(corners[2].x, corners[3].x)); + var minY = Math.min(Math.min(corners[0].y, corners[1].y), Math.min(corners[2].y, corners[3].y)); + + if(!sprite.extra.exists(exID("bounds"))) { + sprite.extra.set(exID("bounds"), new FlxRect()); + } + cast(sprite.extra.get(exID("bounds")), FlxRect).set(minX, minY, maxX - minX, maxY - minY); + } + + dot.color = FlxColor.RED; + if(sprite is FunkinSprite) { + var sprite:FunkinSprite = cast sprite; + if(sprite.extra.get(exID("selected")) == true) { + dot.color = FlxColor.GREEN; + } + } + for(corner in corners) { drawDot(corner.x, corner.y); corner.put(); diff --git a/source/funkin/editors/stage/elements/StageElementButton.hx b/source/funkin/editors/stage/elements/StageElementButton.hx index dc21dcc5..c2df186a 100644 --- a/source/funkin/editors/stage/elements/StageElementButton.hx +++ b/source/funkin/editors/stage/elements/StageElementButton.hx @@ -3,6 +3,8 @@ package funkin.editors.stage.elements; import haxe.xml.Access; import flixel.util.FlxColor; +using flixel.util.FlxColorTransformUtil; + class StageElementButton extends UIButton { public var xml:Access; @@ -17,6 +19,8 @@ class StageElementButton extends UIButton { public var isHidden:Bool = false; + public var selected:Bool = false; + public function new(x:Float,y:Float, xml:Access) { this.xml = xml; super(x,y, getInfoText(), function () { @@ -64,6 +68,8 @@ class StageElementButton extends UIButton { members.push(deleteIcon); } + var _lastSelected:Bool = false; + public override function update(elapsed:Float) { editButton.selectable = ghostButton.selectable = deleteButton.selectable = selectable; editButton.shouldPress = ghostButton.shouldPress = deleteButton.shouldPress = shouldPress; @@ -71,6 +77,22 @@ class StageElementButton extends UIButton { hovered = !deleteButton.hovered; updatePos(); super.update(elapsed); + + if(selected != _lastSelected) { + _lastSelected = selected; + updateColorTransform(); + } + } + + public override function updateColorTransform() { + super.updateColorTransform(); + + if (selected) { + useColorTransform = true; + colorTransform.setOffsets(70, 70, 70, 0); + } else { + colorTransform.setOffsets(0, 0, 0, 0); + } } public function updateInfo(sprite:Dynamic) { diff --git a/source/funkin/editors/stage/elements/StageSpriteButton.hx b/source/funkin/editors/stage/elements/StageSpriteButton.hx index 0c759e06..96a9981e 100644 --- a/source/funkin/editors/stage/elements/StageSpriteButton.hx +++ b/source/funkin/editors/stage/elements/StageSpriteButton.hx @@ -33,6 +33,10 @@ class StageSpriteButton extends StageElementButton { return sprite; } + public override function onSelect() { + StageEditor.instance.selectSprite(sprite); + } + public override function onGhostClick() { isHidden = !isHidden; updateInfo(this.sprite);