From 764e5acf1212397cca39732f292ba38f0c6b0846 Mon Sep 17 00:00:00 2001 From: SrtHero278 Date: Mon, 22 Apr 2024 07:23:01 -0700 Subject: [PATCH] sprite transform is undoable still need a lot more undos to make tho --- assets/data/states/StageEditor.hx | 17 +++- source/funkin/editors/stage/StageEditor.hx | 90 +++++++++++++--------- 2 files changed, 70 insertions(+), 37 deletions(-) diff --git a/assets/data/states/StageEditor.hx b/assets/data/states/StageEditor.hx index 140e31d5..b0644601 100644 --- a/assets/data/states/StageEditor.hx +++ b/assets/data/states/StageEditor.hx @@ -226,7 +226,22 @@ var lastRelative = FlxPoint.get(); function SKEW_LEFT(sprite, relative) {} -function SKEW_BOTTOM(sprite, relative) {} +function SKEW_BOTTOM(sprite, relative) { + preRotBullshit(sprite, relative); + if (!FlxG.keys.pressed.SHIFT) + genericScale(sprite, relative, false, true); + + var topLeft = sprite.extra.get(exID("buttonBoxes"))[0]; + var bottomLeft = sprite.extra.get(exID("buttonBoxes"))[2]; + + sprite.skew.x = Math.atan2( + topLeft.x - (bottomLeft.x + (lastRelative.x - relative.x) * 2), + topLeft.y - (bottomLeft.y + (FlxG.keys.pressed.SHIFT ? 0 : lastRelative.y - relative.y)) + ) * FlxAngle.TO_DEG; + + lastRelative.set(relative.x, (FlxG.keys.pressed.SHIFT ? lastRelative.y : relative.y)); + postRotBullshit(sprite, relative); +} function SKEW_TOP(sprite, relative) { preRotBullshit(sprite, relative); diff --git a/source/funkin/editors/stage/StageEditor.hx b/source/funkin/editors/stage/StageEditor.hx index a5590a69..2416f6ed 100644 --- a/source/funkin/editors/stage/StageEditor.hx +++ b/source/funkin/editors/stage/StageEditor.hx @@ -101,7 +101,7 @@ class StageEditor extends UIState { { label: "Edit", childs: [ - /*{ + { label: "Undo", keybind: [CONTROL, Z], onSelect: _edit_undo, @@ -111,7 +111,7 @@ class StageEditor extends UIState { keybind: [CONTROL, SHIFT, Z], onSelect: _edit_redo, }, - null,*/ + null, { label: "Edit Stage Info", onSelect: (_) -> { @@ -416,6 +416,7 @@ class StageEditor extends UIState { currentCursor = ARROW; + mousePoint = FlxG.mouse.getWorldPosition(stageCamera, mousePoint); if ((!stageSpritesWindow.hovered && !stageSpritesWindow.dragging) && !topMenuSpr.hovered) { if (FlxG.mouse.wheel != 0) { zoom += 0.25 * FlxG.mouse.wheel; @@ -722,31 +723,19 @@ class StageEditor extends UIState { return "\n" + Printer.print(xml, true); } - /*function _edit_undo(_) { + function _edit_undo(_) { var undo = undos.undo(); switch(undo) { case null: // do nothing case CEditInfo(oldInfo, newInfo): - editInfo(oldInfo, false); - case CCreateAnim(animID, animData): - deleteAnim(animData.name, false); - case CEditAnim(name, oldData, animData): - editAnim(name, oldData, false); - case CDeleteAnim(animID, animData): - createAnim(animData, animID, false); - case CChangeOffset(name, change): - changeOffset(name, change * -1, false); - case CResetOffsets(oldOffsets): - for (anim => offsets in oldOffsets) { - character.animOffsets.set(anim, offsets.clone()); - ghosts.setOffsets(anim, offsets.clone()); - } - - for (charButton in characterAnimsWindow.buttons.members) - charButton.updateInfo(charButton.anim, character.getAnimOffset(charButton.anim), ghosts.animGhosts[charButton.anim].visible); - - changeOffset(character.getAnimName(), FlxPoint.get(0, 0), false); // apply da new offsets + //editInfo(oldInfo, false); + case CTransform(sprite, oldInfo, newInfo): + sprite.setPosition(oldInfo.x, oldInfo.y); + sprite.scale.set(oldInfo.scaleX, oldInfo.scaleY); + sprite.skew.set(oldInfo.skewX, oldInfo.skewY); + sprite.angle = oldInfo.angle; + cast(sprite.extra.get(exID("button")), StageElementButton).updateInfo(); } } @@ -757,18 +746,14 @@ class StageEditor extends UIState { // do nothing case CEditInfo(oldInfo, newInfo): editInfo(newInfo, false); - case CCreateAnim(animID, animData): - createAnim(animData, animID, false); - case CEditAnim(name, oldData, animData): - editAnim(oldData.name, animData, false); - case CDeleteAnim(animID, animData): - deleteAnim(animData.name, false); - case CChangeOffset(name, change): - changeOffset(name, change, false); - case CResetOffsets(oldOffsets): - clearOffsets(false); + case CTransform(sprite, oldInfo, newInfo): + sprite.setPosition(newInfo.x, newInfo.y); + sprite.scale.set(newInfo.scaleX, newInfo.scaleY); + sprite.skew.set(newInfo.skewX, newInfo.skewY); + sprite.angle = newInfo.angle; + cast(sprite.extra.get(exID("button")), StageElementButton).updateInfo(); } - }*/ + } /*public function editInfoWithUI() { FlxG.state.openSubState(new StageInfoScreen(stage, (_) -> { @@ -910,7 +895,6 @@ class StageEditor extends UIState { override function draw() { super.draw(); - mousePoint = FlxG.mouse.getWorldPosition(stageCamera, mousePoint); if(dot == null) { dot = new FlxSprite().loadGraphic(Paths.image("editors/stage/selectionDot"), true, 32, 32); dot.antialiasing = true; @@ -1080,6 +1064,7 @@ class StageEditor extends UIState { dotCheckSize = dot.frameWidth / 0.7/stageCamera.zoom; // basically adjust it to the zoom. + var prevMode = mouseMode; if(FlxG.mouse.justPressed) { for (i in StageEditorMouseMode.SKEW_TOP...(StageEditorMouseMode.SKEW_BOTTOM + 1)) { var cappedI1 = Math.max(i - StageEditorMouseMode.SKEW_TOP - 1, 0); @@ -1156,10 +1141,32 @@ class StageEditor extends UIState { } mouseMode = (FlxG.mouse.justReleased) ? NONE : mouseMode; + + if (prevMode == NONE && mouseMode == NONE) return; + + if (prevMode != NONE && mouseMode == NONE) { + undos.addToUndo(CTransform(sprite, { + x: storedPos.x, + y: storedPos.y, + scaleX: storedScale.x, + scaleY: storedScale.y, + skewX: storedSkew.x, + skewY: storedSkew.y, + angle: storedAngle + }, { + x: sprite.x, + y: sprite.y, + scaleX: sprite.scale.x, + scaleY: sprite.scale.y, + skewX: sprite.skew.x, + skewY: sprite.skew.y, + angle: sprite.angle + })); + } + if(mouseMode == NONE) return; + var relative = clickPoint.subtractNew(mousePoint); - // todo: make this origin based - //relative.rotateByDegrees(sprite.angle); call(mouseMode.toString(), [sprite, relative]); cast(sprite.extra.get(exID("button")), StageElementButton).updateInfo(); relative.put(); @@ -1230,8 +1237,19 @@ class StageEditor extends UIState { var line:FlxSprite = null; } +typedef StageSprInfo = { + x:Float, + y:Float, + scaleX:Float, + scaleY:Float, + skewX:Float, + skewY:Float, // i dont wanna be cloning a bunch of FlxPoints. Theres a pool for a reason. + angle:Float +} + enum StageChange { CEditInfo(oldInfo:Xml, newInfo:Xml); + CTransform(sprite:FunkinSprite, oldInfo:StageSprInfo, newInfo:StageSprInfo); } @:forward abstract Selection(Array) from Array to Array {