Skip to content

Commit 91bf3a7

Browse files
committed
Terrain demo + mesh build optimisation
1 parent 75dba01 commit 91bf3a7

File tree

2 files changed

+65
-59
lines changed

2 files changed

+65
-59
lines changed

NoiseTool/DemoNodeTrees.inl

+1
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@
22

33
inline const char* gDemoNodeTrees[][2] =
44
{
5+
{ "Simple Terrain", "EgACAAAAAAAgQBEAAAAAQBoAFADD9Sg/DQAEAAAAAAAgQAkAAAAAAD8BBAAAAAAAAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADNzEw+AJqZGT8=" },
56
{ "Cellular Caves", "FACamZk+GwABEgACAAAAAADgQBEAAACIQSAAFwABAAAACwADAAAAAgAAAAMAAAAEAAAAAAAAAD8BFQALAAMAAAACAAAAAwAAAAQAAAAAAAAAPwAAAAA/AAAAAD8AAAAAPwAAAAA/ARgAAACAvwAAgD89ChdAUrgeQBQAAACgQAYAAI/CdTwAmpmZPgDhehQ/" },
67
};

NoiseTool/MeshNoisePreview.cpp

+64-59
Original file line numberDiff line numberDiff line change
@@ -283,83 +283,88 @@ MeshNoisePreview::Chunk::MeshData MeshNoisePreview::Chunk::BuildMeshData( const
283283
vertexData.clear();
284284
indicies.clear();
285285

286-
Vector3 light = LIGHT_DIR.normalized() * (1.0f - AMBIENT_LIGHT) + Vector3( AMBIENT_LIGHT );
286+
#if FASTNOISE_CALC_MIN_MAX
287+
if( minMax.min <= buildData.isoSurface && minMax.max >= buildData.isoSurface )
288+
#endif
289+
{
290+
Vector3 light = LIGHT_DIR.normalized() * (1.0f - AMBIENT_LIGHT) + Vector3( AMBIENT_LIGHT );
287291

288-
float xLight = abs( light.x() );
289-
Color3 colorRight = buildData.color * xLight;
290-
Color3 colorLeft = buildData.color * (1.0f - xLight);
292+
float xLight = abs( light.x() );
293+
Color3 colorRight = buildData.color * xLight;
294+
Color3 colorLeft = buildData.color * (1.0f - xLight);
291295

292-
float yLight = abs( light.y() );
293-
Color3 colorUp = buildData.color * yLight;
294-
Color3 colorDown = buildData.color * (1.0f - yLight);
296+
float yLight = abs( light.y() );
297+
Color3 colorUp = buildData.color * yLight;
298+
Color3 colorDown = buildData.color * (1.0f - yLight);
295299

296-
float zLight = abs( light.z() );
297-
Color3 colorForward = buildData.color * zLight;
298-
Color3 colorBack = buildData.color * (1.0f - zLight);
300+
float zLight = abs( light.z() );
301+
Color3 colorForward = buildData.color * zLight;
302+
Color3 colorBack = buildData.color * (1.0f - zLight);
299303

300-
constexpr int32_t STEP_X = 1;
301-
constexpr int32_t STEP_Y = SIZE_GEN;
302-
constexpr int32_t STEP_Z = SIZE_GEN * SIZE_GEN;
304+
constexpr int32_t STEP_X = 1;
305+
constexpr int32_t STEP_Y = SIZE_GEN;
306+
constexpr int32_t STEP_Z = SIZE_GEN * SIZE_GEN;
303307

304-
int32_t noiseIdx = STEP_X + STEP_Y + STEP_Z;
308+
int32_t noiseIdx = STEP_X + STEP_Y + STEP_Z;
305309

306-
for( uint32_t z = 0; z < SIZE; z++ )
307-
{
308-
float zf = z + (float)buildData.pos.z();
309-
310-
for( uint32_t y = 0; y < SIZE; y++ )
310+
for( uint32_t z = 0; z < SIZE; z++ )
311311
{
312-
float yf = y + (float)buildData.pos.y();
312+
float zf = z + (float)buildData.pos.z();
313313

314-
for( uint32_t x = 0; x < SIZE; x++ )
314+
for( uint32_t y = 0; y < SIZE; y++ )
315315
{
316-
float xf = x + (float)buildData.pos.x();
316+
float yf = y + (float)buildData.pos.y();
317317

318-
if( densityValues[noiseIdx] <= buildData.isoSurface ) // isSolid
318+
for( uint32_t x = 0; x < SIZE; x++ )
319319
{
320-
if( densityValues[noiseIdx + STEP_X] > buildData.isoSurface ) // Right
321-
{
322-
AddQuadAO( vertexData, indicies, densityValues, buildData.isoSurface, noiseIdx, STEP_X, STEP_Y, STEP_Z, colorRight,
323-
Vector3( xf + 1, yf, zf ), Vector3( xf + 1, yf + 1, zf ), Vector3( xf + 1, yf + 1, zf + 1 ), Vector3( xf + 1, yf, zf + 1 ) );
324-
}
325-
326-
if( densityValues[noiseIdx - STEP_X] > buildData.isoSurface ) // Left
327-
{
328-
AddQuadAO( vertexData, indicies, densityValues, buildData.isoSurface, noiseIdx, -STEP_X, -STEP_Y, STEP_Z, colorLeft,
329-
Vector3( xf, yf + 1, zf ), Vector3( xf, yf, zf ), Vector3( xf, yf, zf + 1 ), Vector3( xf, yf + 1, zf + 1 ) );
330-
}
331-
332-
if( densityValues[noiseIdx + STEP_Y] > buildData.isoSurface ) // Up
333-
{
334-
AddQuadAO( vertexData, indicies, densityValues, buildData.isoSurface, noiseIdx, STEP_Y, STEP_Z, STEP_X, colorUp,
335-
Vector3( xf, yf + 1, zf ), Vector3( xf, yf + 1, zf + 1 ), Vector3( xf + 1, yf + 1, zf + 1 ), Vector3( xf + 1, yf + 1, zf ) );
336-
}
337-
338-
if( densityValues[noiseIdx - STEP_Y] > buildData.isoSurface ) // Down
339-
{
340-
AddQuadAO( vertexData, indicies, densityValues, buildData.isoSurface, noiseIdx, -STEP_Y, -STEP_Z, STEP_X, colorDown,
341-
Vector3( xf, yf, zf + 1 ), Vector3( xf, yf, zf ), Vector3( xf + 1, yf, zf ), Vector3( xf + 1, yf, zf + 1 ) );
342-
}
320+
float xf = x + (float)buildData.pos.x();
343321

344-
if( densityValues[noiseIdx + STEP_Z] > buildData.isoSurface ) // Forward
322+
if( densityValues[noiseIdx] <= buildData.isoSurface ) // isSolid
345323
{
346-
AddQuadAO( vertexData, indicies, densityValues, buildData.isoSurface, noiseIdx, STEP_Z, STEP_X, STEP_Y, colorForward,
347-
Vector3( xf, yf, zf + 1 ), Vector3( xf + 1, yf, zf + 1 ), Vector3( xf + 1, yf + 1, zf + 1 ), Vector3( xf, yf + 1, zf + 1 ) );
348-
}
349-
350-
if( densityValues[noiseIdx - STEP_Z] > buildData.isoSurface ) // Back
351-
{
352-
AddQuadAO( vertexData, indicies, densityValues, buildData.isoSurface, noiseIdx, -STEP_Z, -STEP_X, STEP_Y, colorBack,
353-
Vector3( xf + 1, yf, zf ), Vector3( xf, yf, zf ), Vector3( xf, yf + 1, zf ), Vector3( xf + 1, yf + 1, zf ) );
324+
if( densityValues[noiseIdx + STEP_X] > buildData.isoSurface ) // Right
325+
{
326+
AddQuadAO( vertexData, indicies, densityValues, buildData.isoSurface, noiseIdx, STEP_X, STEP_Y, STEP_Z, colorRight,
327+
Vector3( xf + 1, yf, zf ), Vector3( xf + 1, yf + 1, zf ), Vector3( xf + 1, yf + 1, zf + 1 ), Vector3( xf + 1, yf, zf + 1 ) );
328+
}
329+
330+
if( densityValues[noiseIdx - STEP_X] > buildData.isoSurface ) // Left
331+
{
332+
AddQuadAO( vertexData, indicies, densityValues, buildData.isoSurface, noiseIdx, -STEP_X, -STEP_Y, STEP_Z, colorLeft,
333+
Vector3( xf, yf + 1, zf ), Vector3( xf, yf, zf ), Vector3( xf, yf, zf + 1 ), Vector3( xf, yf + 1, zf + 1 ) );
334+
}
335+
336+
if( densityValues[noiseIdx + STEP_Y] > buildData.isoSurface ) // Up
337+
{
338+
AddQuadAO( vertexData, indicies, densityValues, buildData.isoSurface, noiseIdx, STEP_Y, STEP_Z, STEP_X, colorUp,
339+
Vector3( xf, yf + 1, zf ), Vector3( xf, yf + 1, zf + 1 ), Vector3( xf + 1, yf + 1, zf + 1 ), Vector3( xf + 1, yf + 1, zf ) );
340+
}
341+
342+
if( densityValues[noiseIdx - STEP_Y] > buildData.isoSurface ) // Down
343+
{
344+
AddQuadAO( vertexData, indicies, densityValues, buildData.isoSurface, noiseIdx, -STEP_Y, -STEP_Z, STEP_X, colorDown,
345+
Vector3( xf, yf, zf + 1 ), Vector3( xf, yf, zf ), Vector3( xf + 1, yf, zf ), Vector3( xf + 1, yf, zf + 1 ) );
346+
}
347+
348+
if( densityValues[noiseIdx + STEP_Z] > buildData.isoSurface ) // Forward
349+
{
350+
AddQuadAO( vertexData, indicies, densityValues, buildData.isoSurface, noiseIdx, STEP_Z, STEP_X, STEP_Y, colorForward,
351+
Vector3( xf, yf, zf + 1 ), Vector3( xf + 1, yf, zf + 1 ), Vector3( xf + 1, yf + 1, zf + 1 ), Vector3( xf, yf + 1, zf + 1 ) );
352+
}
353+
354+
if( densityValues[noiseIdx - STEP_Z] > buildData.isoSurface ) // Back
355+
{
356+
AddQuadAO( vertexData, indicies, densityValues, buildData.isoSurface, noiseIdx, -STEP_Z, -STEP_X, STEP_Y, colorBack,
357+
Vector3( xf + 1, yf, zf ), Vector3( xf, yf, zf ), Vector3( xf, yf + 1, zf ), Vector3( xf + 1, yf + 1, zf ) );
358+
}
354359
}
360+
noiseIdx++;
355361
}
356-
noiseIdx++;
362+
363+
noiseIdx += STEP_X * 2;
357364
}
358365

359-
noiseIdx += STEP_X * 2;
366+
noiseIdx += STEP_Y * 2;
360367
}
361-
362-
noiseIdx += STEP_Y * 2;
363368
}
364369

365370
MeshData meshData( buildData.pos, minMax, vertexData, indicies );

0 commit comments

Comments
 (0)