homogenous fluid chunk work
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good

This commit is contained in:
austin 2024-12-01 17:43:18 -05:00
parent c473805510
commit 391a727709
9 changed files with 329 additions and 244 deletions

View File

@ -1,3 +1,3 @@
#maven.buildNumber.plugin properties file #maven.buildNumber.plugin properties file
#Sun Dec 01 16:56:17 EST 2024 #Sun Dec 01 17:42:04 EST 2024
buildNumber=480 buildNumber=481

View File

@ -1211,6 +1211,7 @@ Fix fluid sim null pointer bug with unallocated chunks
Fix fluid sim NP bug with skipped chunks Fix fluid sim NP bug with skipped chunks
Fix fluid chunk indexing from java side Fix fluid chunk indexing from java side
Memory pooling for chunk buffer allocations Memory pooling for chunk buffer allocations
Server homogenous fluid chunk declarations

View File

@ -58,25 +58,26 @@ public class FluidChunkData {
*/ */
public ByteBuffer bVelocityZ = null; public ByteBuffer bVelocityZ = null;
/**
* Tracks whether this is homogenous or not
*/
boolean homogenous = false;
/**
* Allocates the buffers for this chunk
*/
private native void allocate();
/**
* Frees all native memory
*/
private native void free();
/** /**
* Constructor * Constructor
*/ */
public FluidChunkData(){ public FluidChunkData(){
//allocate buffers
this.allocate();
//reorder
this.bWeights.order(ByteOrder.LITTLE_ENDIAN);
this.bVelocityX.order(ByteOrder.LITTLE_ENDIAN);
this.bVelocityY.order(ByteOrder.LITTLE_ENDIAN);
this.bVelocityZ.order(ByteOrder.LITTLE_ENDIAN);
//get float view
this.weights = this.bWeights.asFloatBuffer();
this.velocityX = this.bVelocityX.asFloatBuffer();
this.velocityY = this.bVelocityY.asFloatBuffer();
this.velocityZ = this.bVelocityZ.asFloatBuffer();
} }
/** /**
@ -175,16 +176,6 @@ public class FluidChunkData {
velocityZ.put(this.IX(x,y,z),vel); velocityZ.put(this.IX(x,y,z),vel);
} }
/**
* Allocates the buffers for this chunk
*/
private native void allocate();
/**
* Frees all native memory
*/
private native void free();
/** /**
* Frees the buffers contained within this chunk * Frees the buffers contained within this chunk
*/ */
@ -192,4 +183,41 @@ public class FluidChunkData {
this.free(); this.free();
} }
/**
* Allocates the buffers for this data
*/
public void allocateBuffs(){
this.allocate();
//reorder
this.bWeights.order(ByteOrder.LITTLE_ENDIAN);
this.bVelocityX.order(ByteOrder.LITTLE_ENDIAN);
this.bVelocityY.order(ByteOrder.LITTLE_ENDIAN);
this.bVelocityZ.order(ByteOrder.LITTLE_ENDIAN);
//get float view
this.weights = this.bWeights.asFloatBuffer();
this.velocityX = this.bVelocityX.asFloatBuffer();
this.velocityY = this.bVelocityY.asFloatBuffer();
this.velocityZ = this.bVelocityZ.asFloatBuffer();
}
/**
* Gets whether this chunk is homogenous or not
* @return true if it is homogenous, false otherwise
*/
public boolean isHomogenous() {
return homogenous;
}
/**
* Sets whether this chunk is homogenous or not
* @param homogenous true if it is homogenous, false otherwise
*/
public void setHomogenous(boolean homogenous) {
this.homogenous = homogenous;
}
} }

View File

@ -110,156 +110,158 @@ public class FluidCell {
// //
//main chunk //main chunk
FluidChunkData currentChunk = Globals.clientFluidManager.getChunkDataAtWorldPoint(worldPos); FluidChunkData currentChunk = Globals.clientFluidManager.getChunkDataAtWorldPoint(worldPos);
for(int x = ServerFluidChunk.TRUE_DATA_OFFSET; x < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; x++){ if(!currentChunk.isHomogenous()){
for(int y = ServerFluidChunk.TRUE_DATA_OFFSET; y < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; y++){ for(int x = ServerFluidChunk.TRUE_DATA_OFFSET; x < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE + ServerFluidChunk.TRUE_DATA_OFFSET; x++){
for(int z = ServerFluidChunk.TRUE_DATA_OFFSET; z < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; z++){ for(int y = ServerFluidChunk.TRUE_DATA_OFFSET; y < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE + ServerFluidChunk.TRUE_DATA_OFFSET; y++){
weights[x][y][z] = currentChunk.getWeight(x,y,z); for(int z = ServerFluidChunk.TRUE_DATA_OFFSET; z < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE + ServerFluidChunk.TRUE_DATA_OFFSET; z++){
} weights[x][y][z] = currentChunk.getWeight(x,y,z);
}
}
//face X
if(worldPos.x + 1 < Globals.clientWorldData.getWorldDiscreteSize()){
currentChunk = Globals.clientFluidManager.getChunkDataAtWorldPoint(worldPos.x + 1, worldPos.y, worldPos.z);
if(currentChunk != null){
for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){
weights[ServerFluidChunk.TRUE_DATA_DIM][i][j] = currentChunk.getWeight(0, i, j);
}
}
} else {
for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){
weights[ServerFluidChunk.TRUE_DATA_DIM][i][j] = ISO_SURFACE_EMPTY;
} }
} }
} }
} else {
for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){
weights[ServerFluidChunk.TRUE_DATA_DIM][i][j] = ISO_SURFACE_EMPTY;
}
}
}
//face Y
if(worldPos.y + 1 < Globals.clientWorldData.getWorldDiscreteSize()){
currentChunk = Globals.clientFluidManager.getChunkDataAtWorldPoint(worldPos.x, worldPos.y + 1, worldPos.z);
if(currentChunk != null){
for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){
weights[i][ServerFluidChunk.TRUE_DATA_DIM][j] = currentChunk.getWeight(i, 0, j);
}
}
} else {
for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){
weights[i][ServerFluidChunk.TRUE_DATA_DIM][j] = ISO_SURFACE_EMPTY;
}
}
}
} else {
for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){
weights[i][ServerFluidChunk.TRUE_DATA_DIM][j] = ISO_SURFACE_EMPTY;
}
}
}
//face Z
if(worldPos.z + 1 < Globals.clientWorldData.getWorldDiscreteSize()){
currentChunk = Globals.clientFluidManager.getChunkDataAtWorldPoint(worldPos.x, worldPos.y, worldPos.z + 1);
if(currentChunk != null){
for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){
weights[i][j][ServerFluidChunk.TRUE_DATA_DIM] = currentChunk.getWeight(i, j, 0);
}
}
} else {
for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){
weights[i][j][ServerFluidChunk.TRUE_DATA_DIM] = ISO_SURFACE_EMPTY;
}
}
}
} else {
for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){
weights[i][j][ServerFluidChunk.TRUE_DATA_DIM] = ISO_SURFACE_EMPTY;
}
}
}
//edge X-Y
if(
worldPos.x + 1 < Globals.clientWorldData.getWorldDiscreteSize() &&
worldPos.y + 1 < Globals.clientWorldData.getWorldDiscreteSize()
){
currentChunk = Globals.clientFluidManager.getChunkDataAtWorldPoint(worldPos.x + 1, worldPos.y + 1, worldPos.z);
if(currentChunk != null){
for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
weights[ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM][i] = currentChunk.getWeight(0, 0, i);
}
} else {
for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
weights[ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM][i] = ISO_SURFACE_EMPTY;
}
}
} else {
for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
weights[ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM][i] = ISO_SURFACE_EMPTY;
}
}
//edge X-Z
if(
worldPos.x + 1 < Globals.clientWorldData.getWorldDiscreteSize() &&
worldPos.z + 1 < Globals.clientWorldData.getWorldDiscreteSize()
){
currentChunk = Globals.clientFluidManager.getChunkDataAtWorldPoint(worldPos.x + 1, worldPos.y, worldPos.z + 1);
if(currentChunk != null){
for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
weights[ServerFluidChunk.TRUE_DATA_DIM][i][ServerFluidChunk.TRUE_DATA_DIM] = currentChunk.getWeight(0, i, 0);
}
} else {
for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
weights[ServerFluidChunk.TRUE_DATA_DIM][i][ServerFluidChunk.TRUE_DATA_DIM] = ISO_SURFACE_EMPTY;
}
}
} else {
for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
weights[ServerFluidChunk.TRUE_DATA_DIM][i][ServerFluidChunk.TRUE_DATA_DIM] = ISO_SURFACE_EMPTY;
}
}
//edge Y-Z
if(
worldPos.y + 1 < Globals.clientWorldData.getWorldDiscreteSize() &&
worldPos.z + 1 < Globals.clientWorldData.getWorldDiscreteSize()
){
currentChunk = Globals.clientFluidManager.getChunkDataAtWorldPoint(worldPos.x, worldPos.y + 1, worldPos.z + 1);
if(currentChunk != null){
for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
weights[i][ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM] = currentChunk.getWeight(i, 0, 0);
}
} else {
for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
weights[i][ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM] = ISO_SURFACE_EMPTY;
}
}
} else {
for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
weights[i][ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM] = ISO_SURFACE_EMPTY;
}
}
if(
worldPos.x + 1 < Globals.clientWorldData.getWorldDiscreteSize() &&
worldPos.y + 1 < Globals.clientWorldData.getWorldDiscreteSize() &&
worldPos.z + 1 < Globals.clientWorldData.getWorldDiscreteSize()
){
currentChunk = Globals.clientFluidManager.getChunkDataAtWorldPoint(worldPos.x + 1, worldPos.y + 1, worldPos.z + 1);
if(currentChunk != null){
weights[ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM] = currentChunk.getWeight(0, 0, 0);
} else {
weights[ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM] = ISO_SURFACE_EMPTY;
}
} else {
weights[ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM] = ISO_SURFACE_EMPTY;
} }
// //face X
// if(worldPos.x + 1 < Globals.clientWorldData.getWorldDiscreteSize()){
// currentChunk = Globals.clientFluidManager.getChunkDataAtWorldPoint(worldPos.x + 1, worldPos.y, worldPos.z);
// if(currentChunk != null && !currentChunk.isHomogenous()){
// for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
// for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){
// weights[ServerFluidChunk.TRUE_DATA_DIM][i][j] = currentChunk.getWeight(0, i, j);
// }
// }
// } else {
// for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
// for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){
// weights[ServerFluidChunk.TRUE_DATA_DIM][i][j] = ISO_SURFACE_EMPTY;
// }
// }
// }
// } else {
// for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
// for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){
// weights[ServerFluidChunk.TRUE_DATA_DIM][i][j] = ISO_SURFACE_EMPTY;
// }
// }
// }
// //face Y
// if(worldPos.y + 1 < Globals.clientWorldData.getWorldDiscreteSize()){
// currentChunk = Globals.clientFluidManager.getChunkDataAtWorldPoint(worldPos.x, worldPos.y + 1, worldPos.z);
// if(currentChunk != null && !currentChunk.isHomogenous()){
// for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
// for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){
// weights[i][ServerFluidChunk.TRUE_DATA_DIM][j] = currentChunk.getWeight(i, 0, j);
// }
// }
// } else {
// for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
// for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){
// weights[i][ServerFluidChunk.TRUE_DATA_DIM][j] = ISO_SURFACE_EMPTY;
// }
// }
// }
// } else {
// for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
// for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){
// weights[i][ServerFluidChunk.TRUE_DATA_DIM][j] = ISO_SURFACE_EMPTY;
// }
// }
// }
// //face Z
// if(worldPos.z + 1 < Globals.clientWorldData.getWorldDiscreteSize()){
// currentChunk = Globals.clientFluidManager.getChunkDataAtWorldPoint(worldPos.x, worldPos.y, worldPos.z + 1);
// if(currentChunk != null && !currentChunk.isHomogenous()){
// for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
// for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){
// weights[i][j][ServerFluidChunk.TRUE_DATA_DIM] = currentChunk.getWeight(i, j, 0);
// }
// }
// } else {
// for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
// for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){
// weights[i][j][ServerFluidChunk.TRUE_DATA_DIM] = ISO_SURFACE_EMPTY;
// }
// }
// }
// } else {
// for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
// for(int j = ServerFluidChunk.TRUE_DATA_OFFSET; j < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; j++){
// weights[i][j][ServerFluidChunk.TRUE_DATA_DIM] = ISO_SURFACE_EMPTY;
// }
// }
// }
// //edge X-Y
// if(
// worldPos.x + 1 < Globals.clientWorldData.getWorldDiscreteSize() &&
// worldPos.y + 1 < Globals.clientWorldData.getWorldDiscreteSize()
// ){
// currentChunk = Globals.clientFluidManager.getChunkDataAtWorldPoint(worldPos.x + 1, worldPos.y + 1, worldPos.z);
// if(currentChunk != null && !currentChunk.isHomogenous()){
// for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
// weights[ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM][i] = currentChunk.getWeight(0, 0, i);
// }
// } else {
// for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
// weights[ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM][i] = ISO_SURFACE_EMPTY;
// }
// }
// } else {
// for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
// weights[ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM][i] = ISO_SURFACE_EMPTY;
// }
// }
// //edge X-Z
// if(
// worldPos.x + 1 < Globals.clientWorldData.getWorldDiscreteSize() &&
// worldPos.z + 1 < Globals.clientWorldData.getWorldDiscreteSize()
// ){
// currentChunk = Globals.clientFluidManager.getChunkDataAtWorldPoint(worldPos.x + 1, worldPos.y, worldPos.z + 1);
// if(currentChunk != null && !currentChunk.isHomogenous()){
// for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
// weights[ServerFluidChunk.TRUE_DATA_DIM][i][ServerFluidChunk.TRUE_DATA_DIM] = currentChunk.getWeight(0, i, 0);
// }
// } else {
// for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
// weights[ServerFluidChunk.TRUE_DATA_DIM][i][ServerFluidChunk.TRUE_DATA_DIM] = ISO_SURFACE_EMPTY;
// }
// }
// } else {
// for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
// weights[ServerFluidChunk.TRUE_DATA_DIM][i][ServerFluidChunk.TRUE_DATA_DIM] = ISO_SURFACE_EMPTY;
// }
// }
// //edge Y-Z
// if(
// worldPos.y + 1 < Globals.clientWorldData.getWorldDiscreteSize() &&
// worldPos.z + 1 < Globals.clientWorldData.getWorldDiscreteSize()
// ){
// currentChunk = Globals.clientFluidManager.getChunkDataAtWorldPoint(worldPos.x, worldPos.y + 1, worldPos.z + 1);
// if(currentChunk != null && !currentChunk.isHomogenous()){
// for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
// weights[i][ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM] = currentChunk.getWeight(i, 0, 0);
// }
// } else {
// for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
// weights[i][ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM] = ISO_SURFACE_EMPTY;
// }
// }
// } else {
// for(int i = ServerFluidChunk.TRUE_DATA_OFFSET; i < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; i++){
// weights[i][ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM] = ISO_SURFACE_EMPTY;
// }
// }
// if(
// worldPos.x + 1 < Globals.clientWorldData.getWorldDiscreteSize() &&
// worldPos.y + 1 < Globals.clientWorldData.getWorldDiscreteSize() &&
// worldPos.z + 1 < Globals.clientWorldData.getWorldDiscreteSize()
// ){
// currentChunk = Globals.clientFluidManager.getChunkDataAtWorldPoint(worldPos.x + 1, worldPos.y + 1, worldPos.z + 1);
// if(currentChunk != null && !currentChunk.isHomogenous()){
// weights[ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM] = currentChunk.getWeight(0, 0, 0);
// } else {
// weights[ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM] = ISO_SURFACE_EMPTY;
// }
// } else {
// weights[ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM][ServerFluidChunk.TRUE_DATA_DIM] = ISO_SURFACE_EMPTY;
// }
//now set neighboring air weights based on nearby fluid count //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 //idea being that we dont have the snapping behavior from iso surface jumping from -1->0.01

View File

@ -191,7 +191,7 @@ public class FluidCellManager {
if(updateable.size() > 0){ if(updateable.size() > 0){
String targetKey = updateable.iterator().next(); String targetKey = updateable.iterator().next();
updateable.remove(targetKey); updateable.remove(targetKey);
Vector3i worldPos = getVectorFromKey(targetKey); Vector3i worldPos = this.getVectorFromKey(targetKey);
if( if(
worldPos.x >= 0 && worldPos.x >= 0 &&
worldPos.x < Globals.clientWorldData.getWorldDiscreteSize() && worldPos.x < Globals.clientWorldData.getWorldDiscreteSize() &&
@ -208,8 +208,10 @@ public class FluidCellManager {
// while(commonWorldData.getDynamicInterpolationRatio() % stride != 0){ // while(commonWorldData.getDynamicInterpolationRatio() % stride != 0){
// stride = stride + 1; // stride = stride + 1;
// } // }
keyCellMap.get(targetKey).destroy(); if(keyCellMap.get(targetKey) != null){
keyCellMap.get(targetKey).generateDrawableEntity(); keyCellMap.get(targetKey).destroy();
keyCellMap.get(targetKey).generateDrawableEntity();
}
} }
drawable.add(targetKey); drawable.add(targetKey);
} }

View File

@ -19,6 +19,7 @@ import electrosphere.logger.LoggerInterface;
import electrosphere.net.parser.net.message.TerrainMessage; import electrosphere.net.parser.net.message.TerrainMessage;
import electrosphere.renderer.meshgen.FluidChunkModelGeneration; import electrosphere.renderer.meshgen.FluidChunkModelGeneration;
import electrosphere.renderer.model.Model; import electrosphere.renderer.model.Model;
import electrosphere.server.fluid.manager.ServerFluidChunk;
import electrosphere.server.terrain.manager.ServerTerrainManager; import electrosphere.server.terrain.manager.ServerTerrainManager;
/** /**
@ -179,38 +180,44 @@ public class ClientFluidManager {
private FluidChunkData parseFluidDataBuffer(ByteBuffer buffer){ private FluidChunkData parseFluidDataBuffer(ByteBuffer buffer){
FluidChunkData data = new FluidChunkData(); FluidChunkData data = new FluidChunkData();
FloatBuffer floatBuffer = buffer.asFloatBuffer(); FloatBuffer floatBuffer = buffer.asFloatBuffer();
for(int x = 0; x < FluidChunkData.CHUNK_SIZE; x++){ float homogenous = buffer.getFloat();
for(int y = 0; y < FluidChunkData.CHUNK_SIZE; y++){ if(homogenous == ServerFluidChunk.IS_HOMOGENOUS){
for(int z = 0; z < FluidChunkData.CHUNK_SIZE; z++){ data.setHomogenous(true);
data.setWeight(x,y,z,floatBuffer.get()); } else {
if(data.getWeight(x, y, z) <= 0){ data.setHomogenous(false);
data.setWeight(x, y, z, FluidCell.ISO_SURFACE_EMPTY); data.allocateBuffs();
for(int x = 0; x < FluidChunkData.CHUNK_SIZE; x++){
for(int y = 0; y < FluidChunkData.CHUNK_SIZE; y++){
for(int z = 0; z < FluidChunkData.CHUNK_SIZE; z++){
data.setWeight(x,y,z,floatBuffer.get());
if(data.getWeight(x, y, z) <= 0){
data.setWeight(x, y, z, FluidCell.ISO_SURFACE_EMPTY);
}
}
}
}
for(int x = 0; x < FluidChunkData.CHUNK_SIZE; x++){
for(int y = 0; y < FluidChunkData.CHUNK_SIZE; y++){
for(int z = 0; z < FluidChunkData.CHUNK_SIZE; z++){
data.setVelocityX(x, y, z, floatBuffer.get());
}
}
}
for(int x = 0; x < FluidChunkData.CHUNK_SIZE; x++){
for(int y = 0; y < FluidChunkData.CHUNK_SIZE; y++){
for(int z = 0; z < FluidChunkData.CHUNK_SIZE; z++){
data.setVelocityY(x, y, z, floatBuffer.get());
}
}
}
for(int x = 0; x < FluidChunkData.CHUNK_SIZE; x++){
for(int y = 0; y < FluidChunkData.CHUNK_SIZE; y++){
for(int z = 0; z < FluidChunkData.CHUNK_SIZE; z++){
data.setVelocityZ(x, y, z, floatBuffer.get());
} }
} }
} }
} }
for(int x = 0; x < FluidChunkData.CHUNK_SIZE; x++){
for(int y = 0; y < FluidChunkData.CHUNK_SIZE; y++){
for(int z = 0; z < FluidChunkData.CHUNK_SIZE; z++){
data.setVelocityX(x, y, z, floatBuffer.get());
}
}
}
for(int x = 0; x < FluidChunkData.CHUNK_SIZE; x++){
for(int y = 0; y < FluidChunkData.CHUNK_SIZE; y++){
for(int z = 0; z < FluidChunkData.CHUNK_SIZE; z++){
data.setVelocityY(x, y, z, floatBuffer.get());
}
}
}
for(int x = 0; x < FluidChunkData.CHUNK_SIZE; x++){
for(int y = 0; y < FluidChunkData.CHUNK_SIZE; y++){
for(int z = 0; z < FluidChunkData.CHUNK_SIZE; z++){
data.setVelocityZ(x, y, z, floatBuffer.get());
}
}
}
// data.setVoxelWeight(weights);
return data; return data;
} }

View File

@ -396,42 +396,51 @@ public class TerrainProtocol implements ServerProtocolTemplate<TerrainMessage> {
* @return the buffer * @return the buffer
*/ */
public static ByteBuffer constructFluidByteBuffer(ServerFluidChunk chunk){ public static ByteBuffer constructFluidByteBuffer(ServerFluidChunk chunk){
ByteBuffer buffer = ByteBuffer.allocate(ServerFluidChunk.BUFFER_SIZE*(4+4+4+4)); ByteBuffer rVal = null;
FloatBuffer floatView = buffer.asFloatBuffer(); if(chunk.isHomogenous()){
rVal = ByteBuffer.allocate(ServerFluidChunk.HOMOGENOUS_BUFFER_SIZE);
FloatBuffer floatView = rVal.asFloatBuffer();
floatView.put(ServerFluidChunk.IS_HOMOGENOUS);
} else {
rVal = ByteBuffer.allocate(ServerFluidChunk.BUFFER_SIZE*(4+4+4+4) + ServerFluidChunk.HOMOGENOUS_BUFFER_SIZE);
FloatBuffer floatView = rVal.asFloatBuffer();
for(int x = 0; x < ServerFluidChunk.BUFFER_DIM; x++){ floatView.put(ServerFluidChunk.IS_NOT_HOMOGENOUS);
for(int y = 0; y < ServerFluidChunk.BUFFER_DIM; y++){
for(int z = 0; z < ServerFluidChunk.BUFFER_DIM; z++){ for(int x = 0; x < ServerFluidChunk.BUFFER_DIM; x++){
floatView.put(chunk.getWeight(x, y, z)); for(int y = 0; y < ServerFluidChunk.BUFFER_DIM; y++){
for(int z = 0; z < ServerFluidChunk.BUFFER_DIM; z++){
floatView.put(chunk.getWeight(x, y, z));
}
}
}
for(int x = 0; x < ServerFluidChunk.BUFFER_DIM; x++){
for(int y = 0; y < ServerFluidChunk.BUFFER_DIM; y++){
for(int z = 0; z < ServerFluidChunk.BUFFER_DIM; z++){
floatView.put(chunk.getVelocityX(x, y, z));
}
}
}
for(int x = 0; x < ServerFluidChunk.BUFFER_DIM; x++){
for(int y = 0; y < ServerFluidChunk.BUFFER_DIM; y++){
for(int z = 0; z < ServerFluidChunk.BUFFER_DIM; z++){
floatView.put(chunk.getVelocityY(x, y, z));
}
}
}
for(int x = 0; x < ServerFluidChunk.BUFFER_DIM; x++){
for(int y = 0; y < ServerFluidChunk.BUFFER_DIM; y++){
for(int z = 0; z < ServerFluidChunk.BUFFER_DIM; z++){
floatView.put(chunk.getVelocityZ(x, y, z));
}
} }
} }
} }
for(int x = 0; x < ServerFluidChunk.BUFFER_DIM; x++){ return rVal;
for(int y = 0; y < ServerFluidChunk.BUFFER_DIM; y++){
for(int z = 0; z < ServerFluidChunk.BUFFER_DIM; z++){
floatView.put(chunk.getVelocityX(x, y, z));
}
}
}
for(int x = 0; x < ServerFluidChunk.BUFFER_DIM; x++){
for(int y = 0; y < ServerFluidChunk.BUFFER_DIM; y++){
for(int z = 0; z < ServerFluidChunk.BUFFER_DIM; z++){
floatView.put(chunk.getVelocityY(x, y, z));
}
}
}
for(int x = 0; x < ServerFluidChunk.BUFFER_DIM; x++){
for(int y = 0; y < ServerFluidChunk.BUFFER_DIM; y++){
for(int z = 0; z < ServerFluidChunk.BUFFER_DIM; z++){
floatView.put(chunk.getVelocityZ(x, y, z));
}
}
}
return buffer;
} }
} }

View File

@ -50,6 +50,20 @@ public class ServerFluidChunk {
*/ */
public static final int BUFFER_SIZE = ServerFluidChunk.BUFFER_DIM * ServerFluidChunk.BUFFER_DIM * ServerFluidChunk.BUFFER_DIM; public static final int BUFFER_SIZE = ServerFluidChunk.BUFFER_DIM * ServerFluidChunk.BUFFER_DIM * ServerFluidChunk.BUFFER_DIM;
/**
* Fluid data dto value for homogenous chunk
*/
public static final float IS_HOMOGENOUS = 1;
/**
* Fluid data dto value for non-homogenous chunk
*/
public static final float IS_NOT_HOMOGENOUS = 0;
/**
* Size of the homogenous value at the front of the fluid chunk dto
*/
public static final int HOMOGENOUS_BUFFER_SIZE = 1 * 4;
/** /**
* The world x coordinate of this chunk * The world x coordinate of this chunk
@ -142,11 +156,26 @@ public class ServerFluidChunk {
*/ */
public boolean asleep = false; public boolean asleep = false;
/**
* Tracks whether this chunk is homogenous or not
*/
public boolean isHomogenous = true;
/** /**
* The total density of the chunk * The total density of the chunk
*/ */
public float totalDensity = 0; public float totalDensity = 0;
/**
* Allocates the central arrays for this chunk
*/
private native void allocate();
/**
* Frees all native memory
*/
private native void free();
/** /**
* Constructor * Constructor
* @param worldX The world x coordinate * @param worldX The world x coordinate
@ -489,16 +518,6 @@ public class ServerFluidChunk {
this.asleep = asleep; this.asleep = asleep;
} }
/**
* Allocates the central arrays for this chunk
*/
private native void allocate();
/**
* Frees all native memory
*/
private native void free();
/** /**
* Frees the buffers contained within this chunk * Frees the buffers contained within this chunk
*/ */
@ -506,4 +525,20 @@ public class ServerFluidChunk {
this.free(); this.free();
} }
/**
* Gets the total density of this chunk
* @return The total density
*/
public float getTotalDensity(){
return this.totalDensity;
}
/**
* Gets whether this chunk is homogenous or not
* @return true if it is homogenous, false otherwise
*/
public boolean isHomogenous(){
return this.isHomogenous;
}
} }

View File

@ -278,6 +278,7 @@ public class ServerFluidManager {
// } // }
lock.lock(); lock.lock();
ServerFluidChunk fluidChunk = this.getChunk(worldPos.x, worldPos.y, worldPos.z); ServerFluidChunk fluidChunk = this.getChunk(worldPos.x, worldPos.y, worldPos.z);
fluidChunk.setAsleep(false);
fluidChunk.setWeight(voxelPos.x, voxelPos.y, voxelPos.z, weight); fluidChunk.setWeight(voxelPos.x, voxelPos.y, voxelPos.z, weight);
lock.unlock(); lock.unlock();
} }