diff --git a/apps/opencs/view/render/cellborder.cpp b/apps/opencs/view/render/cellborder.cpp index 6073807ce0..88de12ca5a 100644 --- a/apps/opencs/view/render/cellborder.cpp +++ b/apps/opencs/view/render/cellborder.cpp @@ -19,9 +19,12 @@ const int CSVRender::CellBorder::VertexCount = (ESM::Land::LAND_SIZE * 4) - 3; CSVRender::CellBorder::CellBorder(osg::Group* cellNode, const CSMWorld::CellCoordinates& coords) : mParentNode(cellNode) { + mBorderGeode = new osg::Geode(); + mBaseNode = new osg::PositionAttitudeTransform(); mBaseNode->setNodeMask(Mask_CellBorder); mBaseNode->setPosition(osg::Vec3f(coords.getX() * CellSize, coords.getY() * CellSize, 10)); + mBaseNode->addChild(mBorderGeode); mParentNode->addChild(mBaseNode); } @@ -79,10 +82,8 @@ void CSVRender::CellBorder::buildShape(const ESM::Land& esmLand) geometry->addPrimitiveSet(primitives); geometry->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF); - - osg::ref_ptr geode = new osg::Geode(); - geode->addDrawable(geometry); - mBaseNode->addChild(geode); + mBorderGeode->removeDrawables(0); + mBorderGeode->addDrawable(geometry); } size_t CSVRender::CellBorder::landIndex(int x, int y) diff --git a/apps/opencs/view/render/cellborder.hpp b/apps/opencs/view/render/cellborder.hpp index c91aa46c69..c7e47a00f4 100644 --- a/apps/opencs/view/render/cellborder.hpp +++ b/apps/opencs/view/render/cellborder.hpp @@ -7,6 +7,7 @@ namespace osg { + class Geode; class Group; class PositionAttitudeTransform; } @@ -47,7 +48,7 @@ namespace CSVRender osg::Group* mParentNode; osg::ref_ptr mBaseNode; - + osg::ref_ptr mBorderGeode; }; } diff --git a/apps/opencs/view/render/commands.cpp b/apps/opencs/view/render/commands.cpp new file mode 100644 index 0000000000..40634acec3 --- /dev/null +++ b/apps/opencs/view/render/commands.cpp @@ -0,0 +1,20 @@ +#include "commands.hpp" + +#include + +#include "cell.hpp" +#include "terrainselection.hpp" + +CSVRender::DrawTerrainSelectionCommand::DrawTerrainSelectionCommand(TerrainSelection& terrainSelection, QUndoCommand* parent) + : mTerrainSelection(terrainSelection) +{ } + +void CSVRender::DrawTerrainSelectionCommand::redo() +{ + mTerrainSelection.update(); +} + +void CSVRender::DrawTerrainSelectionCommand::undo() +{ + mTerrainSelection.update(); +} diff --git a/apps/opencs/view/render/commands.hpp b/apps/opencs/view/render/commands.hpp new file mode 100644 index 0000000000..f11a764612 --- /dev/null +++ b/apps/opencs/view/render/commands.hpp @@ -0,0 +1,30 @@ +#ifndef CSV_RENDER_COMMANDS_HPP +#define CSV_RENDER_COMMANDS_HPP + +#include + +namespace ESM +{ + struct Land; +} + +namespace CSVRender +{ + class Cell; + class TerrainSelection; + + + class DrawTerrainSelectionCommand : public QUndoCommand + { + private: + TerrainSelection& mTerrainSelection; + + public: + DrawTerrainSelectionCommand(TerrainSelection& terrainSelection, QUndoCommand* parent = nullptr); + + void redo() override; + void undo() override; + }; +} + +#endif diff --git a/apps/opencs/view/render/terrainshapemode.cpp b/apps/opencs/view/render/terrainshapemode.cpp index 6209e161e9..418655f2f2 100644 --- a/apps/opencs/view/render/terrainshapemode.cpp +++ b/apps/opencs/view/render/terrainshapemode.cpp @@ -34,6 +34,7 @@ #include "../../model/world/universalid.hpp" #include "brushdraw.hpp" +#include "commands.hpp" #include "editmode.hpp" #include "pagedworldspacewidget.hpp" #include "mask.hpp" @@ -284,6 +285,7 @@ void CSVRender::TerrainShapeMode::applyTerrainEditChanges() sortAndLimitAlteredCells(); undoStack.beginMacro ("Edit shape and normal records"); + undoStack.push(new DrawTerrainSelectionCommand(*mTerrainShapeSelection)); for(CSMWorld::CellCoordinates cellCoordinates: mAlteredCells) { @@ -353,6 +355,7 @@ void CSVRender::TerrainShapeMode::applyTerrainEditChanges() } pushNormalsEditToCommand(landNormalsNew, document, landTable, cellId); } + undoStack.push(new DrawTerrainSelectionCommand(*mTerrainShapeSelection)); undoStack.endMacro(); clearTransientEdits(); }