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
#Sun Dec 01 16:56:17 EST 2024
buildNumber=480
#Sun Dec 01 17:42:04 EST 2024
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 chunk indexing from java side
Memory pooling for chunk buffer allocations
Server homogenous fluid chunk declarations

View File

@ -58,25 +58,26 @@ public class FluidChunkData {
*/
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
*/
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);
}
/**
* 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
*/
@ -192,4 +183,41 @@ public class FluidChunkData {
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
FluidChunkData currentChunk = Globals.clientFluidManager.getChunkDataAtWorldPoint(worldPos);
for(int x = ServerFluidChunk.TRUE_DATA_OFFSET; x < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; x++){
for(int y = ServerFluidChunk.TRUE_DATA_OFFSET; y < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; y++){
for(int z = ServerFluidChunk.TRUE_DATA_OFFSET; z < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE; 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;
if(!currentChunk.isHomogenous()){
for(int x = ServerFluidChunk.TRUE_DATA_OFFSET; x < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE + ServerFluidChunk.TRUE_DATA_OFFSET; x++){
for(int y = ServerFluidChunk.TRUE_DATA_OFFSET; y < ServerFluidChunk.TRUE_DATA_GENERATOR_SIZE + ServerFluidChunk.TRUE_DATA_OFFSET; y++){
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);
}
}
}
} 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
//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){
String targetKey = updateable.iterator().next();
updateable.remove(targetKey);
Vector3i worldPos = getVectorFromKey(targetKey);
Vector3i worldPos = this.getVectorFromKey(targetKey);
if(
worldPos.x >= 0 &&
worldPos.x < Globals.clientWorldData.getWorldDiscreteSize() &&
@ -208,8 +208,10 @@ public class FluidCellManager {
// while(commonWorldData.getDynamicInterpolationRatio() % stride != 0){
// stride = stride + 1;
// }
keyCellMap.get(targetKey).destroy();
keyCellMap.get(targetKey).generateDrawableEntity();
if(keyCellMap.get(targetKey) != null){
keyCellMap.get(targetKey).destroy();
keyCellMap.get(targetKey).generateDrawableEntity();
}
}
drawable.add(targetKey);
}

View File

@ -19,6 +19,7 @@ import electrosphere.logger.LoggerInterface;
import electrosphere.net.parser.net.message.TerrainMessage;
import electrosphere.renderer.meshgen.FluidChunkModelGeneration;
import electrosphere.renderer.model.Model;
import electrosphere.server.fluid.manager.ServerFluidChunk;
import electrosphere.server.terrain.manager.ServerTerrainManager;
/**
@ -179,38 +180,44 @@ public class ClientFluidManager {
private FluidChunkData parseFluidDataBuffer(ByteBuffer buffer){
FluidChunkData data = new FluidChunkData();
FloatBuffer floatBuffer = buffer.asFloatBuffer();
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);
float homogenous = buffer.getFloat();
if(homogenous == ServerFluidChunk.IS_HOMOGENOUS){
data.setHomogenous(true);
} else {
data.setHomogenous(false);
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;
}

View File

@ -396,42 +396,51 @@ public class TerrainProtocol implements ServerProtocolTemplate<TerrainMessage> {
* @return the buffer
*/
public static ByteBuffer constructFluidByteBuffer(ServerFluidChunk chunk){
ByteBuffer buffer = ByteBuffer.allocate(ServerFluidChunk.BUFFER_SIZE*(4+4+4+4));
FloatBuffer floatView = buffer.asFloatBuffer();
ByteBuffer rVal = null;
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++){
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));
floatView.put(ServerFluidChunk.IS_NOT_HOMOGENOUS);
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.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++){
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;
return rVal;
}
}

View File

@ -50,6 +50,20 @@ public class ServerFluidChunk {
*/
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
@ -142,11 +156,26 @@ public class ServerFluidChunk {
*/
public boolean asleep = false;
/**
* Tracks whether this chunk is homogenous or not
*/
public boolean isHomogenous = true;
/**
* The total density of the chunk
*/
public float totalDensity = 0;
/**
* Allocates the central arrays for this chunk
*/
private native void allocate();
/**
* Frees all native memory
*/
private native void free();
/**
* Constructor
* @param worldX The world x coordinate
@ -489,16 +518,6 @@ public class ServerFluidChunk {
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
*/
@ -506,4 +525,20 @@ public class ServerFluidChunk {
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();
ServerFluidChunk fluidChunk = this.getChunk(worldPos.x, worldPos.y, worldPos.z);
fluidChunk.setAsleep(false);
fluidChunk.setWeight(voxelPos.x, voxelPos.y, voxelPos.z, weight);
lock.unlock();
}