From 077cffa2e27c16e42724644a301f5b0b2b52988c Mon Sep 17 00:00:00 2001 From: austin Date: Wed, 20 Mar 2024 08:50:32 -0400 Subject: [PATCH] smooth fluid voxel animation --- .../highlevel-design/locations/biomeideas.md | 3 + .../client/fluid/cells/FluidCell.java | 60 ++++++++++++++----- .../fluid/manager/ClientFluidManager.java | 3 +- .../meshgen/FluidChunkModelGeneration.java | 2 +- 4 files changed, 52 insertions(+), 16 deletions(-) diff --git a/docs/src/highlevel-design/locations/biomeideas.md b/docs/src/highlevel-design/locations/biomeideas.md index 88f6ee78..258ff409 100644 --- a/docs/src/highlevel-design/locations/biomeideas.md +++ b/docs/src/highlevel-design/locations/biomeideas.md @@ -303,3 +303,6 @@ Constant Thunderstorms and lots of lightning strikes ## Sky Reefs Full of kelp dangling from island, lots of sea-themed flying creatures +## Ghost Water in the Sky +Idk what this means but I just came up with it and it sounds cool + diff --git a/src/main/java/electrosphere/client/fluid/cells/FluidCell.java b/src/main/java/electrosphere/client/fluid/cells/FluidCell.java index 23fbde3d..5e3fb33a 100644 --- a/src/main/java/electrosphere/client/fluid/cells/FluidCell.java +++ b/src/main/java/electrosphere/client/fluid/cells/FluidCell.java @@ -37,6 +37,9 @@ public class FluidCell { static Texture groundTextureTwo = new Texture("/Textures/Ground/Dirt1.png"); static Texture groundTextureThree = new Texture("/Textures/Ground/Dirt1.png"); static Texture groundTextureFour = new Texture("/Textures/Ground/Dirt1.png"); + + //the value of an empty fluid cell weight that is not neighbored by a fluid value + public static final float ISO_SURFACE_EMPTY = -1; static { // groundTextureOne = new Texture("/Textures/Ground/GrassTileable.png"); @@ -137,14 +140,14 @@ public class FluidCell { } else { for(int i = 0; i < ServerTerrainChunk.CHUNK_DIMENSION; i++){ for(int j = 0; j < ServerTerrainChunk.CHUNK_DIMENSION; j++){ - weights[ServerTerrainChunk.CHUNK_DIMENSION][i][j] = -1; + weights[ServerTerrainChunk.CHUNK_DIMENSION][i][j] = ISO_SURFACE_EMPTY; } } } } else { for(int i = 0; i < ServerTerrainChunk.CHUNK_DIMENSION; i++){ for(int j = 0; j < ServerTerrainChunk.CHUNK_DIMENSION; j++){ - weights[ServerTerrainChunk.CHUNK_DIMENSION][i][j] = -1; + weights[ServerTerrainChunk.CHUNK_DIMENSION][i][j] = ISO_SURFACE_EMPTY; } } } @@ -160,14 +163,14 @@ public class FluidCell { } else { for(int i = 0; i < ServerTerrainChunk.CHUNK_DIMENSION; i++){ for(int j = 0; j < ServerTerrainChunk.CHUNK_DIMENSION; j++){ - weights[i][ServerTerrainChunk.CHUNK_DIMENSION][j] = -1; + weights[i][ServerTerrainChunk.CHUNK_DIMENSION][j] = ISO_SURFACE_EMPTY; } } } } else { for(int i = 0; i < ServerTerrainChunk.CHUNK_DIMENSION; i++){ for(int j = 0; j < ServerTerrainChunk.CHUNK_DIMENSION; j++){ - weights[i][ServerTerrainChunk.CHUNK_DIMENSION][j] = -1; + weights[i][ServerTerrainChunk.CHUNK_DIMENSION][j] = ISO_SURFACE_EMPTY; } } } @@ -183,14 +186,14 @@ public class FluidCell { } else { for(int i = 0; i < ServerTerrainChunk.CHUNK_DIMENSION; i++){ for(int j = 0; j < ServerTerrainChunk.CHUNK_DIMENSION; j++){ - weights[i][j][ServerTerrainChunk.CHUNK_DIMENSION] = -1; + weights[i][j][ServerTerrainChunk.CHUNK_DIMENSION] = ISO_SURFACE_EMPTY; } } } } else { for(int i = 0; i < ServerTerrainChunk.CHUNK_DIMENSION; i++){ for(int j = 0; j < ServerTerrainChunk.CHUNK_DIMENSION; j++){ - weights[i][j][ServerTerrainChunk.CHUNK_DIMENSION] = -1; + weights[i][j][ServerTerrainChunk.CHUNK_DIMENSION] = ISO_SURFACE_EMPTY; } } } @@ -206,12 +209,12 @@ public class FluidCell { } } else { for(int i = 0; i < ServerTerrainChunk.CHUNK_DIMENSION; i++){ - weights[ServerTerrainChunk.CHUNK_DIMENSION][ServerTerrainChunk.CHUNK_DIMENSION][i] = -1; + weights[ServerTerrainChunk.CHUNK_DIMENSION][ServerTerrainChunk.CHUNK_DIMENSION][i] = ISO_SURFACE_EMPTY; } } } else { for(int i = 0; i < ServerTerrainChunk.CHUNK_DIMENSION; i++){ - weights[ServerTerrainChunk.CHUNK_DIMENSION][ServerTerrainChunk.CHUNK_DIMENSION][i] = -1; + weights[ServerTerrainChunk.CHUNK_DIMENSION][ServerTerrainChunk.CHUNK_DIMENSION][i] = ISO_SURFACE_EMPTY; } } //edge X-Z @@ -226,12 +229,12 @@ public class FluidCell { } } else { for(int i = 0; i < ServerTerrainChunk.CHUNK_DIMENSION; i++){ - weights[ServerTerrainChunk.CHUNK_DIMENSION][i][ServerTerrainChunk.CHUNK_DIMENSION] = -1; + weights[ServerTerrainChunk.CHUNK_DIMENSION][i][ServerTerrainChunk.CHUNK_DIMENSION] = ISO_SURFACE_EMPTY; } } } else { for(int i = 0; i < ServerTerrainChunk.CHUNK_DIMENSION; i++){ - weights[ServerTerrainChunk.CHUNK_DIMENSION][i][ServerTerrainChunk.CHUNK_DIMENSION] = -1; + weights[ServerTerrainChunk.CHUNK_DIMENSION][i][ServerTerrainChunk.CHUNK_DIMENSION] = ISO_SURFACE_EMPTY; } } //edge Y-Z @@ -246,12 +249,12 @@ public class FluidCell { } } else { for(int i = 0; i < ServerTerrainChunk.CHUNK_DIMENSION; i++){ - weights[i][ServerTerrainChunk.CHUNK_DIMENSION][ServerTerrainChunk.CHUNK_DIMENSION] = -1; + weights[i][ServerTerrainChunk.CHUNK_DIMENSION][ServerTerrainChunk.CHUNK_DIMENSION] = ISO_SURFACE_EMPTY; } } } else { for(int i = 0; i < ServerTerrainChunk.CHUNK_DIMENSION; i++){ - weights[i][ServerTerrainChunk.CHUNK_DIMENSION][ServerTerrainChunk.CHUNK_DIMENSION] = -1; + weights[i][ServerTerrainChunk.CHUNK_DIMENSION][ServerTerrainChunk.CHUNK_DIMENSION] = ISO_SURFACE_EMPTY; } } if( @@ -263,10 +266,39 @@ public class FluidCell { if(currentChunk != null){ weights[ServerTerrainChunk.CHUNK_DIMENSION][ServerTerrainChunk.CHUNK_DIMENSION][ServerTerrainChunk.CHUNK_DIMENSION] = currentChunk.getWeight(0, 0, 0); } else { - weights[ServerTerrainChunk.CHUNK_DIMENSION][ServerTerrainChunk.CHUNK_DIMENSION][ServerTerrainChunk.CHUNK_DIMENSION] = -1; + weights[ServerTerrainChunk.CHUNK_DIMENSION][ServerTerrainChunk.CHUNK_DIMENSION][ServerTerrainChunk.CHUNK_DIMENSION] = ISO_SURFACE_EMPTY; } } else { - weights[ServerTerrainChunk.CHUNK_DIMENSION][ServerTerrainChunk.CHUNK_DIMENSION][ServerTerrainChunk.CHUNK_DIMENSION] = -1; + weights[ServerTerrainChunk.CHUNK_DIMENSION][ServerTerrainChunk.CHUNK_DIMENSION][ServerTerrainChunk.CHUNK_DIMENSION] = ISO_SURFACE_EMPTY; + } + + //now set neighboring air weights based on nearby fluid count + //idea being that we dont have the snapping behavior from iso surface jumping from -1->0.01 + int[] neighborIndexX = new int[]{-1,1,0,0,0,0}; + int[] neighborIndexY = new int[]{0,0,-1,1,0,0}; + int[] neighborIndexZ = new int[]{0,0,0,0,-1,1}; + for(int x = 0; x < ServerTerrainChunk.CHUNK_DATA_GENERATOR_SIZE; x++){ + for(int y = 0; y < ServerTerrainChunk.CHUNK_DATA_GENERATOR_SIZE; y++){ + for(int z = 0; z < ServerTerrainChunk.CHUNK_DATA_GENERATOR_SIZE; z++){ + if(weights[x][y][z] > 0){ + continue; + } + for(int i = 0; i < 6; i++){ + int currX = x + neighborIndexX[i]; + int currY = y + neighborIndexY[i]; + int currZ = z + neighborIndexZ[i]; + if( + currX >= 0 && currX < ServerTerrainChunk.CHUNK_DATA_GENERATOR_SIZE && + currY >= 0 && currY < ServerTerrainChunk.CHUNK_DATA_GENERATOR_SIZE && + currZ >= 0 && currZ < ServerTerrainChunk.CHUNK_DATA_GENERATOR_SIZE && + (1 + weights[x][y][z]) < weights[currX][currY][currZ] + ){ + System.out.println("set neighbor weight"); + weights[x][y][z] = -(1 - weights[currX][currY][currZ]); + } + } + } + } } } diff --git a/src/main/java/electrosphere/client/fluid/manager/ClientFluidManager.java b/src/main/java/electrosphere/client/fluid/manager/ClientFluidManager.java index 91eb6671..de329246 100644 --- a/src/main/java/electrosphere/client/fluid/manager/ClientFluidManager.java +++ b/src/main/java/electrosphere/client/fluid/manager/ClientFluidManager.java @@ -12,6 +12,7 @@ import org.joml.Vector3i; import electrosphere.client.fluid.cache.ClientFluidCache; import electrosphere.client.fluid.cache.FluidChunkData; +import electrosphere.client.fluid.cells.FluidCell; import electrosphere.client.scene.ClientWorldData; import electrosphere.engine.Globals; import electrosphere.entity.types.fluid.FluidChunkModelData; @@ -166,7 +167,7 @@ public class ClientFluidManager { for(int z = 0; z < FluidChunkData.CHUNK_SIZE; z++){ weights[x][y][z] = floatBuffer.get(); if(weights[x][y][z] <= 0){ - weights[x][y][z] = -1f; + weights[x][y][z] = FluidCell.ISO_SURFACE_EMPTY; } } } diff --git a/src/main/java/electrosphere/renderer/meshgen/FluidChunkModelGeneration.java b/src/main/java/electrosphere/renderer/meshgen/FluidChunkModelGeneration.java index 09eaca3d..ade0e2c0 100644 --- a/src/main/java/electrosphere/renderer/meshgen/FluidChunkModelGeneration.java +++ b/src/main/java/electrosphere/renderer/meshgen/FluidChunkModelGeneration.java @@ -602,7 +602,7 @@ public class FluidChunkModelGeneration { weightGrid[x+0][y+1][z+0], weightGrid[x+0][y+1][z+1], weightGrid[x+1][y+1][z+1], weightGrid[x+1][y+1][z+0] ); //polygonize the current gridcell - polygonize(currentCell, 0.0f, triangles, vertMap, verts, normals, trianglesSharingVert); + polygonize(currentCell, 0.01f, triangles, vertMap, verts, normals, trianglesSharingVert); } } }