add a pasteUp and pasteDown pallet

This commit is contained in:
AzaezelX 2025-02-17 23:42:19 -06:00
parent 561c201b88
commit 25ea164a1f
5 changed files with 118 additions and 5 deletions

View file

@ -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,