homogenous fluid chunk work
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good
This commit is contained in:
parent
c473805510
commit
391a727709
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user