diff --git a/apps/opencs/view/render/terraintexturemode.cpp b/apps/opencs/view/render/terraintexturemode.cpp index 8933b5038f..79973b8068 100644 --- a/apps/opencs/view/render/terraintexturemode.cpp +++ b/apps/opencs/view/render/terraintexturemode.cpp @@ -1,7 +1,3 @@ -// To-do: Getting Texture Id and Texture Filenames to base class Terraintexturemode -// To-do: Better data handling options for mBrushTexture -// To-do: loading texture bitmaps from virtual file system (vfs) for texture overlay icon - #include "terraintexturemode.hpp" #include "editmode.hpp" @@ -23,35 +19,25 @@ #include "../widget/modebutton.hpp" #include "../widget/scenetoolbar.hpp" -#include "../../model/world/universalid.hpp" -#include "../../model/world/tablemimedata.hpp" -#include "../../model/world/idtable.hpp" - #include "pagedworldspacewidget.hpp" - +#include "mask.hpp" +#include "object.hpp" // Something small needed regarding pointers from here () +#include "worldspacewidget.hpp" #include "../../model/doc/document.hpp" +#include "../../model/world/columnbase.hpp" +#include "../../model/world/commandmacro.hpp" +#include "../../model/world/commands.hpp" +#include "../../model/world/data.hpp" +#include "../../model/world/idtable.hpp" #include "../../model/world/land.hpp" #include "../../model/world/landtexture.hpp" -//#include "../../model/world/universalid.hpp" -//#include "../../model/world/tablemimedata.hpp" -//#include "../../model/world/idtable.hpp" - -#include "../../model/world/columnbase.hpp" #include "../../model/world/resourcetable.hpp" -#include "../../model/world/commandmacro.hpp" -#include "../../model/world/data.hpp" -#include "../../model/world/commands.hpp" +#include "../../model/world/tablemimedata.hpp" +#include "../../model/world/universalid.hpp" -//#include -//#include -//#include #include -//#include -//#include -//#include - CSVRender::BrushSizeControls::BrushSizeControls(const QString &title, QWidget *parent) @@ -187,74 +173,7 @@ void CSVRender::TerrainTextureMode::deactivate(CSVWidget::SceneToolbar* toolbar) void CSVRender::TerrainTextureMode::primaryEditPressed(const WorldspaceHitResult& hit) // Apply changes here { - cellId = getWorldspaceWidget().getCellId (hit.worldPos); - std::string hash = "#"; - std::string space = " "; - std::size_t hashlocation = cellId.find(hash); - std::size_t spacelocation = cellId.find(space); - std::string slicedX = cellId.substr (hashlocation+1, spacelocation-hashlocation); - std::string slicedY = cellId.substr (spacelocation+1); - CSMWorld::CellCoordinates mCoordinates(stoi(slicedX), stoi(slicedY)); - - CSMDoc::Document& document = getWorldspaceWidget().getDocument(); - CSMWorld::IdTable& landTable = dynamic_cast ( -*document.getData().getTableModel (CSMWorld::UniversalId::Type_Land)); - CSMWorld::IdTable& ltexTable = dynamic_cast ( -*document.getData().getTableModel (CSMWorld::UniversalId::Type_LandTextures)); - - int textureColumn = landTable.findColumnIndex(CSMWorld::Columns::ColumnId_LandTexturesIndex); - CSMWorld::LandTexturesColumn::DataType mPointer = landTable.data(landTable.getModelIndex(cellId, textureColumn)).value(); - CSMWorld::LandTexturesColumn::DataType mNew(mPointer); - - int xInCell ((hit.worldPos.x() - (stoi(slicedX)* cellSize)) * landTextureSize / cellSize); - int yInCell ((hit.worldPos.y() - (stoi(slicedY)* cellSize)) * landTextureSize / cellSize); - - hashlocation = mBrushTexture.find(hash); - std::string mBrushTextureInt = mBrushTexture.substr (hashlocation+1); - int brushInt = stoi(mBrushTexture.substr (hashlocation+1))+1; // All indices are offset by +1 - - if (mBrushShape == 0) mNew[yInCell*landTextureSize+xInCell] = brushInt; - if (mBrushShape == 1) - { - for(int i=-mBrushSize/2;i= 0 && yInCell+j >= 0 && xInCell+i <= 15 && yInCell+j <= 15) - mNew[(yInCell+j)*landTextureSize+(xInCell+i)] = brushInt; - } - } - } - float distance = 0; - if (mBrushShape == 2) - { - float rf = mBrushSize/2; - int r = (mBrushSize/2)+1; - for(int i = -r; i < r; i++) - { - for(int j = -r; j < r; j++) - { - distance = std::round(sqrt(pow((xInCell+i)-xInCell, 2) + pow((yInCell+j)-yInCell, 2))); - if (xInCell+i >= 0 && yInCell+j >= 0 && xInCell+i <= 15 && yInCell+j <= 15 && distance <= rf) - mNew[(yInCell+j)*landTextureSize+(xInCell+i)] = brushInt; - } - } - } - if (mBrushShape == 3) - { - // Not implemented - } - - QVariant variant; - variant.setValue(mNew); - - CSMWorld::CommandMacro macro (document.getUndoStack(), "Edit texture records"); - QModelIndex index(landTable.getModelIndex (cellId, landTable.findColumnIndex (CSMWorld::Columns::ColumnId_LandTexturesIndex))); - - CSMWorld::TouchLandCommand* ltexTouch = new CSMWorld::TouchLandCommand(landTable, ltexTable, cellId); - CSMWorld::ModifyCommand* ltexModify = new CSMWorld::ModifyCommand(landTable, index, variant); - macro.push (ltexTouch); - macro.push (ltexModify); + editTerrainTextureGrid(hit); } void CSVRender::TerrainTextureMode::primarySelectPressed(const WorldspaceHitResult& hit) @@ -270,6 +189,8 @@ void CSVRender::TerrainTextureMode::secondarySelectPressed(const WorldspaceHitRe bool CSVRender::TerrainTextureMode::primaryEditStartDrag (const QPoint& pos) { + WorldspaceHitResult hit = getWorldspaceWidget().mousePick (pos, getWorldspaceWidget().getInteractionMask()); + editTerrainTextureGrid(hit); return false; } @@ -321,6 +242,78 @@ void CSVRender::TerrainTextureMode::handleDropEvent (QDropEvent *event) { } } +void CSVRender::TerrainTextureMode::editTerrainTextureGrid(const WorldspaceHitResult& hit) +{ + mCellId = getWorldspaceWidget().getCellId (hit.worldPos); + std::string hash = "#"; + std::string space = " "; + std::size_t hashlocation = mCellId.find(hash); + std::size_t spacelocation = mCellId.find(space); + std::string slicedX = mCellId.substr (hashlocation+1, spacelocation-hashlocation); + std::string slicedY = mCellId.substr (spacelocation+1); + CSMWorld::CellCoordinates mCoordinates(stoi(slicedX), stoi(slicedY)); + + CSMDoc::Document& document = getWorldspaceWidget().getDocument(); + CSMWorld::IdTable& landTable = dynamic_cast ( + *document.getData().getTableModel (CSMWorld::UniversalId::Type_Land)); + CSMWorld::IdTable& ltexTable = dynamic_cast ( + *document.getData().getTableModel (CSMWorld::UniversalId::Type_LandTextures)); + + int textureColumn = landTable.findColumnIndex(CSMWorld::Columns::ColumnId_LandTexturesIndex); + CSMWorld::LandTexturesColumn::DataType mPointer = landTable.data(landTable.getModelIndex(mCellId, textureColumn)).value(); + CSMWorld::LandTexturesColumn::DataType mNew(mPointer); + + int xInCell ((hit.worldPos.x() - (stoi(slicedX)* cellSize)) * landTextureSize / cellSize); + int yInCell ((hit.worldPos.y() - (stoi(slicedY)* cellSize)) * landTextureSize / cellSize); + + hashlocation = mBrushTexture.find(hash); + std::string mBrushTextureInt = mBrushTexture.substr (hashlocation+1); + int brushInt = stoi(mBrushTexture.substr (hashlocation+1))+1; // All indices are offset by +1 + + if (mBrushShape == 0) mNew[yInCell*landTextureSize+xInCell] = brushInt; + if (mBrushShape == 1) + { + for(int i=-mBrushSize/2;i= 0 && yInCell+j >= 0 && xInCell+i <= 15 && yInCell+j <= 15) + mNew[(yInCell+j)*landTextureSize+(xInCell+i)] = brushInt; + } + } + } + float distance = 0; + if (mBrushShape == 2) + { + float rf = mBrushSize/2; + int r = (mBrushSize/2)+1; + for(int i = -r; i < r; i++) + { + for(int j = -r; j < r; j++) + { + distance = std::round(sqrt(pow((xInCell+i)-xInCell, 2) + pow((yInCell+j)-yInCell, 2))); + if (xInCell+i >= 0 && yInCell+j >= 0 && xInCell+i <= 15 && yInCell+j <= 15 && distance <= rf) + mNew[(yInCell+j)*landTextureSize+(xInCell+i)] = brushInt; + } + } + } + if (mBrushShape == 3) + { + // Not implemented + } + + QVariant changedLand; + changedLand.setValue(mNew); + + CSMWorld::CommandMacro macro (document.getUndoStack(), "Edit texture records"); + QModelIndex index(landTable.getModelIndex (mCellId, landTable.findColumnIndex (CSMWorld::Columns::ColumnId_LandTexturesIndex))); + + CSMWorld::TouchLandCommand* ltexTouch = new CSMWorld::TouchLandCommand(landTable, ltexTable, mCellId); + CSMWorld::ModifyCommand* ltexModify = new CSMWorld::ModifyCommand(landTable, index, changedLand); + macro.push (ltexTouch); + macro.push (ltexModify); +} + void CSVRender::TerrainTextureMode::dragMoveEvent (QDragMoveEvent *event) { } diff --git a/apps/opencs/view/render/terraintexturemode.hpp b/apps/opencs/view/render/terraintexturemode.hpp index fff5b7daec..6b6eb6c632 100644 --- a/apps/opencs/view/render/terraintexturemode.hpp +++ b/apps/opencs/view/render/terraintexturemode.hpp @@ -108,9 +108,11 @@ namespace CSVRender virtual void dragWheel (int diff, double speedFactor); virtual void dragMoveEvent (QDragMoveEvent *event); + void editTerrainTextureGrid (const WorldspaceHitResult& hit); + private: TextureBrushWindow *textureBrushWindow; - std::string cellId; + std::string mCellId; std::string mBrushTexture = "#0"; int mBrushSize = 0; int mBrushShape = 0;