diff --git a/src/jasper/modules/world/src/studio/worldeditor/commands/editsize.cpp b/src/jasper/modules/world/src/studio/worldeditor/commands/editsize.cpp index 69fd143..2131acf 100644 --- a/src/jasper/modules/world/src/studio/worldeditor/commands/editsize.cpp +++ b/src/jasper/modules/world/src/studio/worldeditor/commands/editsize.cpp @@ -7,24 +7,60 @@ namespace jasper::world { -EditWorldSize::EditWorldSize(WorldDoc &doc, ox::Size const&size): +EditWorldSizeCommand::EditWorldSizeCommand( + ObjectCache const&objCache, + WorldDoc &doc, + WorldStatic &worldStatic, + ox::Size const&size): + m_objCache(objCache), m_doc(doc), + m_worldStatic(worldStatic), m_oldSize(m_doc.columns, m_doc.rows), - m_newVal(size) { -} + m_newSize(size) {} -void EditWorldSize::redo() noexcept { +void EditWorldSizeCommand::redo() noexcept { m_oldMap = m_doc.tiles; - resize(m_doc, m_newVal); + resize(m_doc, m_newSize); + oxLogError(loadWorldStatic(m_objCache, m_doc).moveTo(m_worldStatic)); } -void EditWorldSize::undo() noexcept { +void EditWorldSizeCommand::undo() noexcept { resize(m_doc, m_oldSize); m_doc.tiles = std::move(m_oldMap); + oxLogError(loadWorldStatic(m_objCache, m_doc).moveTo(m_worldStatic)); } -int EditWorldSize::commandId() const noexcept { +bool EditWorldSizeCommand::mergeWith(studio::UndoCommand const&cmd) noexcept { + auto const es = dynamic_cast(&cmd); + if (!es || dimensionChanged() != es->dimensionChanged()) { + return false; + } + m_newSize = es->m_newSize; + // undo + resize(m_doc, m_oldSize); + m_doc.tiles = std::move(m_oldMap); + // redo + m_oldMap = m_doc.tiles; + resize(m_doc, m_newSize); + oxLogError(loadWorldStatic(m_objCache, m_doc).moveTo(m_worldStatic)); + return true; +} + +int EditWorldSizeCommand::commandId() const noexcept { return static_cast(WorldEditorCommand::EditWorldSize); } +EditWorldSizeCommand::Dimension EditWorldSizeCommand::dimensionChanged() const noexcept { + auto const xChanged = m_oldSize.width == m_newSize.width; + auto const yChanged = m_oldSize.height == m_newSize.height; + if (xChanged && !yChanged) { + return Dimension::X; + } else if (!xChanged && yChanged) { + return Dimension::Y; + } else if (xChanged && yChanged) { + return Dimension::Both; + } + return Dimension::Neither; +} + } diff --git a/src/jasper/modules/world/src/studio/worldeditor/commands/editsize.hpp b/src/jasper/modules/world/src/studio/worldeditor/commands/editsize.hpp index 56f473d..9998d9c 100644 --- a/src/jasper/modules/world/src/studio/worldeditor/commands/editsize.hpp +++ b/src/jasper/modules/world/src/studio/worldeditor/commands/editsize.hpp @@ -12,23 +12,36 @@ namespace jasper::world { -class EditWorldSize: public studio::UndoCommand { +class EditWorldSizeCommand: public studio::UndoCommand { private: + ObjectCache const&m_objCache; WorldDoc &m_doc; + WorldStatic &m_worldStatic; size_t m_insertIdx{}; ox::Size const m_oldSize; WorldDoc::TileMap m_oldMap; - ox::Size const m_newVal; + ox::Size m_newSize; public: - EditWorldSize(WorldDoc &doc, ox::Size const&size); + EditWorldSizeCommand( + ObjectCache const&objCache, + WorldDoc &doc, + WorldStatic &worldStatic, + ox::Size const&size); void redo() noexcept override; void undo() noexcept override; + bool mergeWith(studio::UndoCommand const&cmd) noexcept override; [[nodiscard]] int commandId() const noexcept override; [[nodiscard]] inline size_t insertIdx() const noexcept { return m_insertIdx; } + private: + enum class Dimension { + X, Y, Both, Neither, + }; + [[nodiscard]] + Dimension dimensionChanged() const noexcept; }; } diff --git a/src/jasper/modules/world/src/studio/worldeditor/worldeditor-imgui.cpp b/src/jasper/modules/world/src/studio/worldeditor/worldeditor-imgui.cpp index c38457e..f998cf3 100644 --- a/src/jasper/modules/world/src/studio/worldeditor/worldeditor-imgui.cpp +++ b/src/jasper/modules/world/src/studio/worldeditor/worldeditor-imgui.cpp @@ -54,7 +54,7 @@ static ox::Vec2 dropPos(ox::Vec2 dropPos) noexcept { return dropPos; } - [[nodiscard]] +[[nodiscard]] constexpr ox::Point fbPtToTileAddr( ox::Vec2 const&fbPt, ox::Vec2 const&mapSz) noexcept { @@ -159,10 +159,10 @@ void WorldEditorImGui::drawPropEditor() noexcept { int width{m_doc.columns}; int height{m_doc.rows}; if (ImGui::InputInt("Map Width", &width, 1)) { - pushCommand(m_doc, ox::Size{width, m_doc.rows}); + pushCommand(m_objCache, m_doc, m_worldStatic, ox::Size{width, m_doc.rows}); } if (ImGui::InputInt("Map Height", &height, 1)) { - pushCommand(m_doc, ox::Size{m_doc.columns, height}); + pushCommand(m_objCache, m_doc, m_worldStatic, ox::Size{m_doc.columns, height}); } } diff --git a/src/jasper/modules/world/src/studio/worldobjectseteditor/commands/editobject.cpp b/src/jasper/modules/world/src/studio/worldobjectseteditor/commands/editobject.cpp index a552abf..cdd328d 100644 --- a/src/jasper/modules/world/src/studio/worldobjectseteditor/commands/editobject.cpp +++ b/src/jasper/modules/world/src/studio/worldobjectseteditor/commands/editobject.cpp @@ -31,8 +31,8 @@ int EditObjectName::commandId() const noexcept { return static_cast(WorldObjCommand::EditObjectName); } -bool EditObjectName::mergeWith(UndoCommand const*cmd) noexcept { - auto const en = dynamic_cast(cmd); +bool EditObjectName::mergeWith(UndoCommand const&cmd) noexcept { + auto const en = dynamic_cast(&cmd); if (en && m_objIdx == en->m_objIdx) { m_newVal = en->m_newVal; return true; diff --git a/src/jasper/modules/world/src/studio/worldobjectseteditor/commands/editobject.hpp b/src/jasper/modules/world/src/studio/worldobjectseteditor/commands/editobject.hpp index bb62cd5..82ffe2d 100644 --- a/src/jasper/modules/world/src/studio/worldobjectseteditor/commands/editobject.hpp +++ b/src/jasper/modules/world/src/studio/worldobjectseteditor/commands/editobject.hpp @@ -24,7 +24,7 @@ class EditObjectName: public studio::UndoCommand { void undo() noexcept override; [[nodiscard]] int commandId() const noexcept override; - bool mergeWith(UndoCommand const*cmd) noexcept override; + bool mergeWith(UndoCommand const&cmd) noexcept override; }; class EditObjectSubSheet: public studio::UndoCommand { diff --git a/src/jasper/modules/world/src/world.cpp b/src/jasper/modules/world/src/world.cpp index 07d7499..d4eb17f 100644 --- a/src/jasper/modules/world/src/world.cpp +++ b/src/jasper/modules/world/src/world.cpp @@ -33,6 +33,7 @@ void World::setupLayer( ncore::Context &ctx, uint_t lyr, uint_t cbb) const noexcept { + ncore::clearBg(ctx, lyr); ncore::setBgStatus(ctx, lyr, true); ncore::setBgCbb(ctx, lyr, cbb); auto const rows = ox::min(m_worldStatic.rows, ncore::tileRows(ctx) / 2);