From 315f05ea47dadea6ba11f1d783ac560341ea08de Mon Sep 17 00:00:00 2001 From: AzaezelX Date: Mon, 17 Feb 2025 19:55:23 -0600 Subject: [PATCH] revert portions to a previously demonstrated to work state... --- .../source/gui/worldEditor/terrainActions.cpp | 61 +++++-------------- .../source/gui/worldEditor/terrainActions.h | 6 -- Engine/source/util/noise2d.cpp | 2 +- 3 files changed, 15 insertions(+), 54 deletions(-) diff --git a/Engine/source/gui/worldEditor/terrainActions.cpp b/Engine/source/gui/worldEditor/terrainActions.cpp index fb2ab86a7..f7c6101f1 100644 --- a/Engine/source/gui/worldEditor/terrainActions.cpp +++ b/Engine/source/gui/worldEditor/terrainActions.cpp @@ -752,49 +752,22 @@ void ThermalErosionAction::process(Selection * sel, const Gui3DMouseEvent &, boo // If this is the ending // mouse down event, then // update the noise values. - U32 shift = getBinLog2(mNoiseSize); - TerrainBlock* tblock = mTerrainEditor->getActiveTerrain(); - if (!tblock) - return; - - mSelectionOrigin = Point2I(S32_MAX, S32_MAX); - - F32 height = 0; - F32 maxHeight = 0; - U32 i = 0; - for (i=0; i < sel->size(); i++) + if (type == Begin) { - mSelectionOrigin.x = S32(mMin(F32((*sel)[i].mGridPoint.gridPos.x), F32(mSelectionOrigin.x))); - mSelectionOrigin.y = S32(mMin(F32((*sel)[i].mGridPoint.gridPos.y), F32(mSelectionOrigin.y))); - height = fixedToFloat(tblock->getHeight((*sel)[i].mGridPoint.gridPos)); - if (height > maxHeight) - maxHeight = height; + mNoise.setSeed(Sim::getCurrentTime()); + mNoise.fBm(&mNoiseData, mNoiseSize, 12, 1.0f, 5.0f); + Vector scratch = mNoiseData; + mNoise.rigidMultiFractal(&mNoiseData, &scratch, mNoiseSize, 12, 1.0f, 5.0f); + //erodeThermal(Vector *src, Vector *dst, F32 slope, F32 materialLoss, U32 iterations, U32 size, U32 squareSize, F32 maxHeight ); + mNoise.erodeThermal(&mNoiseData, &mNoiseData, 30.0f, 5.0f, 5, mNoiseSize, 1, 2000.0f); + mNoise.getMinMax(&mNoiseData, &mMinMaxNoise.x, &mMinMaxNoise.y, mNoiseSize); + + mScale = 1.5f / (mMinMaxNoise.x - mMinMaxNoise.y); } - for (i = 0; i < mTerrainHeights.size(); i++) - { - mTerrainHeights[i] = 0; - } - - for (i = 0; i < sel->size(); i++) - { - mTerrainHeights[((*sel)[i].mGridPoint.gridPos.x - mSelectionOrigin.x) + (((*sel)[i].mGridPoint.gridPos.y - mSelectionOrigin.y) << shift)] = (*sel)[i].mHeight; - } - - mNoise.setSeed(Sim::getCurrentTime()); - //mNoise.fBm(&mNoiseData, mNoiseSize, 12, 1.0f, 5.0f); - //generate noise based on terrain hieghts - mNoise.rigidMultiFractal( &mNoiseData, &mTerrainHeights, mNoiseSize, 12, 1.0f, 5.0f ); - //erode the noise - mNoise.erodeThermal(&mNoiseData, &mTerrainHeights, 45.0f, 0.5f, 12, mNoiseSize, 1, maxHeight); - - mNoise.getMinMax(&mTerrainHeights, &mMinMaxNoise.x, &mMinMaxNoise.y, mNoiseSize); - mScale = (mMinMaxNoise.x - mMinMaxNoise.y) / maxHeight; - if (selChanged) { - F32 heightDiff = 0; - for (i = 0; i < sel->size(); i++) + for (U32 i = 0; i < sel->size(); i++) { if (!isValid((*sel)[i])) continue; @@ -803,27 +776,21 @@ void ThermalErosionAction::process(Selection * sel, const Gui3DMouseEvent &, boo const Point2I& gridPos = (*sel)[i].mGridPoint.gridPos; - // Need to get the height difference - // between the current height and the - // erosion height to properly apply the - // softness and pressure settings of the brush - // for this selection. - heightDiff = ((*sel)[i].mHeight - mTerrainHeights[(gridPos.x - mSelectionOrigin.x) + ((gridPos.y-mSelectionOrigin.y) << shift)]) * mScale; + const F32 noiseVal = mNoiseData[(gridPos.x % mNoiseSize) + + ((gridPos.y % mNoiseSize) * mNoiseSize)]; - (*sel)[i].mHeight += heightDiff * (*sel)[i].mWeight * mTerrainEditor->getBrushPressure(); + (*sel)[i].mHeight -= (noiseVal - mMinMaxNoise.y * mScale) * (*sel)[i].mWeight * mTerrainEditor->mNoiseFactor; if ((*sel)[i].mHeight > mTerrainEditor->mTileMaxHeight) (*sel)[i].mHeight = mTerrainEditor->mTileMaxHeight; if ((*sel)[i].mHeight < mTerrainEditor->mTileMinHeight) (*sel)[i].mHeight = mTerrainEditor->mTileMinHeight; - mTerrainEditor->setGridInfo((*sel)[i]); } mTerrainEditor->scheduleGridUpdate(); } - } void HydraulicErosionAction::process(Selection* sel, const Gui3DMouseEvent&, bool selChanged, Type type) diff --git a/Engine/source/gui/worldEditor/terrainActions.h b/Engine/source/gui/worldEditor/terrainActions.h index 844e04d3d..9ac286ed6 100644 --- a/Engine/source/gui/worldEditor/terrainActions.h +++ b/Engine/source/gui/worldEditor/terrainActions.h @@ -312,12 +312,8 @@ class ThermalErosionAction : public TerrainAction { mNoise.setSeed( 1 );//Sim::getCurrentTime() ); mNoiseData.setSize(mNoiseSize * mNoiseSize); - mTerrainHeights.setSize(mNoiseSize * mNoiseSize); mNoise.fBm(&mNoiseData, mNoiseSize, 12, 1.0f, 5.0f); - //Vector scratch = mNoiseData; - //mNoise.rigidMultiFractal( &mNoiseData, &scratch, TerrainBlock::BlockSize, 12, 1.0f, 5.0f ); mNoise.getMinMax(&mNoiseData, &mMinMaxNoise.x, &mMinMaxNoise.y, mNoiseSize); - mScale = 1.5f / (mMinMaxNoise.x - mMinMaxNoise.y); } @@ -328,9 +324,7 @@ class ThermalErosionAction : public TerrainAction const U32 mNoiseSize; Noise2D mNoise; Vector mNoiseData; - Vector mTerrainHeights; Point2F mMinMaxNoise; - Point2I mSelectionOrigin; F32 mScale; }; diff --git a/Engine/source/util/noise2d.cpp b/Engine/source/util/noise2d.cpp index 34405bd56..24c1579dd 100644 --- a/Engine/source/util/noise2d.cpp +++ b/Engine/source/util/noise2d.cpp @@ -345,7 +345,7 @@ bool Noise2D::erodeThermal(Vector *src, Vector *dst, F32 slope, F32 ma //dMemset( r.address(), 0, r.memSize() ); F32 conservation = 1.0f - mClampF(materialLoss, 0.0f, 100.0f)/100.0f; - slope = mMin(slope, mClampF(conservation, 0.0f, 89.0f)); // clamp to 0-89 degrees + slope = mClampF(conservation, 0.0f, 89.0f); // clamp to 0-89 degrees F32 talusConst = mTan(mDegToRad(slope)) * squareSize; // in world units talusConst = talusConst * (fmax-fmin) / maxHeight; // scale to current height units