#pragma once #include "pipeline/adt_loader.hpp" #include #include #include namespace wowee { namespace editor { struct ChunkSnapshot { int chunkIndex; std::array heights; std::vector alphaMap; std::vector layers; }; struct EditCommand { std::vector before; std::vector after; }; class EditorHistory { public: void beginEdit(const pipeline::ADTTerrain& terrain, const std::vector& affectedChunks); void endEdit(const pipeline::ADTTerrain& terrain); bool canUndo() const { return !undoStack_.empty(); } bool canRedo() const { return !redoStack_.empty(); } void undo(pipeline::ADTTerrain& terrain); void redo(pipeline::ADTTerrain& terrain); void clear(); size_t undoCount() const { return undoStack_.size(); } size_t redoCount() const { return redoStack_.size(); } const std::vector& lastAffectedChunks() const { return lastAffected_; } private: static ChunkSnapshot captureChunk(const pipeline::ADTTerrain& terrain, int idx); static void restoreChunk(pipeline::ADTTerrain& terrain, const ChunkSnapshot& snap); static bool snapshotChanged(const ChunkSnapshot& a, const ChunkSnapshot& b); std::vector undoStack_; std::vector redoStack_; EditCommand pending_; std::vector lastAffected_; static constexpr size_t MAX_UNDO = 100; }; } // namespace editor } // namespace wowee