From 25ea164a1feb040dd3c972bacee821383de2a2fc Mon Sep 17 00:00:00 2001 From: AzaezelX Date: Mon, 17 Feb 2025 23:42:19 -0600 Subject: [PATCH] add a pasteUp and pasteDown pallet --- .../source/gui/worldEditor/terrainActions.cpp | 86 +++++++++++++++++++ .../source/gui/worldEditor/terrainActions.h | 29 ++++++- .../source/gui/worldEditor/terrainEditor.cpp | 4 +- .../worldEditor/scripts/EditorGui.ed.tscript | 2 + .../worldEditor/scripts/buttonPalette.tscript | 2 +- 5 files changed, 118 insertions(+), 5 deletions(-) diff --git a/Engine/source/gui/worldEditor/terrainActions.cpp b/Engine/source/gui/worldEditor/terrainActions.cpp index d0726057e..2d143b3e5 100644 --- a/Engine/source/gui/worldEditor/terrainActions.cpp +++ b/Engine/source/gui/worldEditor/terrainActions.cpp @@ -858,6 +858,23 @@ void HydraulicErosionAction::process(Selection* sel, const Gui3DMouseEvent&, boo } +void TerrainScratchPad::addTile(F32 height, U8 material) +{ + mContents.push_back(new gridStub(height, material)); + + mBottom = mMin(height, mBottom); + mTop = mMax(height, mTop); +}; + +void TerrainScratchPad::clear() +{ + for (U32 i = 0; i < mContents.size(); i++) + delete(mContents[i]); + mContents.clear(); + mBottom = F32_MAX; + mTop = F32_MIN; +} + void copyAction::process(Selection* sel, const Gui3DMouseEvent&, bool selChanged, Type type) { gTerrainScratchPad.clear(); @@ -872,6 +889,15 @@ void copyAction::process(Selection* sel, const Gui3DMouseEvent&, bool selChanged void pasteAction::process(Selection* sel, const Gui3DMouseEvent&, bool selChanged, Type type) { + if (gTerrainScratchPad.size() == 0) + return; + + if (gTerrainScratchPad.size() != sel->size()) + return; + + if (type != Begin) + return; + for (U32 i = 0; i < sel->size(); i++) { if (isValid((*sel)[i])) @@ -886,6 +912,66 @@ void pasteAction::process(Selection* sel, const Gui3DMouseEvent&, bool selChange mTerrainEditor->scheduleMaterialUpdate(); } +void pasteUpAction::process(Selection* sel, const Gui3DMouseEvent&, bool selChanged, Type type) +{ + if (gTerrainScratchPad.size() == 0) + return; + + if (gTerrainScratchPad.size() != sel->size()) + return; + + if (type != Begin) + return; + F32 floor = F32_MAX; + for (U32 i = 0; i < sel->size(); i++) + { + floor = mMin((*sel)[i].mHeight, floor); + } + for (U32 i = 0; i < sel->size(); i++) + { + if (isValid((*sel)[i])) + { + mTerrainEditor->getUndoSel()->add((*sel)[i]); + (*sel)[i].mHeight = gTerrainScratchPad[i]->mHeight - gTerrainScratchPad.mBottom + floor; + (*sel)[i].mMaterial = gTerrainScratchPad[i]->mMaterial; + mTerrainEditor->setGridInfo((*sel)[i]); + } + } + mTerrainEditor->scheduleGridUpdate(); + mTerrainEditor->scheduleMaterialUpdate(); +} + +void pasteDownAction::process(Selection* sel, const Gui3DMouseEvent&, bool selChanged, Type type) +{ + if (gTerrainScratchPad.size() == 0) + return; + + if (gTerrainScratchPad.size() != sel->size()) + return; + + if (type != Begin) + return; + + F32 ceiling = F32_MIN; + for (U32 i = 0; i < sel->size(); i++) + { + ceiling = mMax((*sel)[i].mHeight, ceiling); + } + + for (U32 i = 0; i < sel->size(); i++) + { + if (isValid((*sel)[i])) + { + mTerrainEditor->getUndoSel()->add((*sel)[i]); + (*sel)[i].mHeight = gTerrainScratchPad[i]->mHeight - gTerrainScratchPad.mTop + ceiling; + (*sel)[i].mMaterial = gTerrainScratchPad[i]->mMaterial; + mTerrainEditor->setGridInfo((*sel)[i]); + } + } + mTerrainEditor->scheduleGridUpdate(); + mTerrainEditor->scheduleMaterialUpdate(); +} + IMPLEMENT_CONOBJECT( TerrainSmoothAction ); ConsoleDocClass( TerrainSmoothAction, diff --git a/Engine/source/gui/worldEditor/terrainActions.h b/Engine/source/gui/worldEditor/terrainActions.h index cd8e5fb2f..51ff989d0 100644 --- a/Engine/source/gui/worldEditor/terrainActions.h +++ b/Engine/source/gui/worldEditor/terrainActions.h @@ -354,9 +354,10 @@ public: class TerrainScratchPad { public: - TerrainScratchPad() {}; + F32 mBottom, mTop; + TerrainScratchPad(): mBottom(FLT_MAX), mTop(F32_MIN){}; ~TerrainScratchPad() { mContents.clear(); }; - void clear() { for (U32 i = 0; i < mContents.size(); i++) delete(mContents[i]); mContents.clear(); }; + void clear(); class gridStub { public: @@ -364,7 +365,8 @@ public: F32 mHeight; U8 mMaterial; }; - void addTile(F32 height, U8 material) { mContents.push_back(new gridStub(height, material)); }; + void addTile(F32 height, U8 material); + U32 size() { return(mContents.size()); }; gridStub* operator [](U32 index) { return mContents[index]; }; private: Vector mContents; @@ -392,6 +394,27 @@ public: void process(Selection* sel, const Gui3DMouseEvent& event, bool selChanged, Type type); }; +class pasteUpAction : public TerrainAction +{ +public: + pasteUpAction(TerrainEditor* editor) + : TerrainAction(editor) + { + } + StringTableEntry getName() { return("pasteUp"); } + void process(Selection* sel, const Gui3DMouseEvent& event, bool selChanged, Type type); +}; + +class pasteDownAction : public TerrainAction +{ +public: + pasteDownAction(TerrainEditor* editor) + : TerrainAction(editor) + { + } + StringTableEntry getName() { return("pasteDown"); } + void process(Selection* sel, const Gui3DMouseEvent& event, bool selChanged, Type type); +}; /// An undo action used to perform terrain wide smoothing. class TerrainSmoothAction : public UndoAction diff --git a/Engine/source/gui/worldEditor/terrainEditor.cpp b/Engine/source/gui/worldEditor/terrainEditor.cpp index 2ee3f3716..00b93b455 100644 --- a/Engine/source/gui/worldEditor/terrainEditor.cpp +++ b/Engine/source/gui/worldEditor/terrainEditor.cpp @@ -716,7 +716,9 @@ TerrainEditor::TerrainEditor() : mActions.push_back(new HydraulicErosionAction(this)); mActions.push_back(new copyAction(this)); mActions.push_back(new pasteAction(this)); - + mActions.push_back(new pasteUpAction(this)); + mActions.push_back(new pasteDownAction(this)); + // set the default action mCurrentAction = mActions[0]; diff --git a/Templates/BaseGame/game/tools/worldEditor/scripts/EditorGui.ed.tscript b/Templates/BaseGame/game/tools/worldEditor/scripts/EditorGui.ed.tscript index a2a6f3896..714e81b80 100644 --- a/Templates/BaseGame/game/tools/worldEditor/scripts/EditorGui.ed.tscript +++ b/Templates/BaseGame/game/tools/worldEditor/scripts/EditorGui.ed.tscript @@ -1259,6 +1259,8 @@ function EditorGui::SetTerrainPalletBar() EWToolsPaletteWindow.addButton("ClearEmpty", "ToolsModule:clearEmpty_n_image", "ETerrainEditor.switchAction( clearEmpty );", "", "Clear Empty", "shift 0"); EWToolsPaletteWindow.addButton("Copy", "ToolsModule:setHeight_n_image", "ETerrainEditor.switchAction( copy );", "", "copy", "ctrl C"); EWToolsPaletteWindow.addButton("Paste", "ToolsModule:setHeight_n_image", "ETerrainEditor.switchAction( paste );", "", "paste", "ctrl v"); + EWToolsPaletteWindow.addButton("pasteUp", "ToolsModule:setHeight_n_image", "ETerrainEditor.switchAction( pasteUp );", "", "pasteUp", "ctrl b"); + EWToolsPaletteWindow.addButton("PasteDown", "ToolsModule:setHeight_n_image", "ETerrainEditor.switchAction( pasteDown );", "", "pasteDown", "ctrl n"); EWToolsPaletteWindow.refresh(); } diff --git a/Templates/BaseGame/game/tools/worldEditor/scripts/buttonPalette.tscript b/Templates/BaseGame/game/tools/worldEditor/scripts/buttonPalette.tscript index f401f939d..fd2322925 100644 --- a/Templates/BaseGame/game/tools/worldEditor/scripts/buttonPalette.tscript +++ b/Templates/BaseGame/game/tools/worldEditor/scripts/buttonPalette.tscript @@ -148,7 +148,7 @@ function ButtonPalette::refresh(%this) variable = getField(%buttonInfo, 3); }; - %extents.y += 23; + %extents.y += 25; if(isObject(%this.actionMap)) %this.actionMap.bindCmd( keyboard, getField(%buttonInfo, 5), %paletteButton @ ".performClick();", "" );