Renderer/src/main/java/electrosphere/server/terrain/manager/ServerTerrainChunk.java
2024-11-11 11:08:22 -05:00

205 lines
5.3 KiB
Java

package electrosphere.server.terrain.manager;
import java.util.LinkedList;
import java.util.List;
import org.joml.Vector3i;
import electrosphere.server.terrain.models.TerrainModification;
/**
* Is a single chunk of terrain on the server
*/
public class ServerTerrainChunk {
/**
* All chunks are 16x16x16
*/
public static final int CHUNK_DIMENSION = 16;
/**
* The size of the data passed into marching cubes/transvoxel to generate a fully connected and seamless chunk
*/
public static final int CHUNK_DATA_GENERATOR_SIZE = CHUNK_DIMENSION + 1;
/**
* The units that should be used when placing chunks in the scene
*/
public static final int CHUNK_PLACEMENT_OFFSET = CHUNK_DATA_GENERATOR_SIZE - 1;
/**
* Gets the x coordinate of the world position of the chunk
*/
int worldX;
/**
* Gets the y coordinate of the world position of the chunk
*/
int worldY;
/**
* Gets the z coordinate of the world position of the chunk
*/
int worldZ;
/**
* The list of modifications applied to the chunk
*/
List<TerrainModification> modifications = new LinkedList<TerrainModification>();
/**
* The weights of the chunk
*/
float[][][] weights;
/**
* The values of the chunk
*/
int[][][] values;
/**
* The homogenous value of this data, or ChunkData.NOT_HOMOGENOUS if it is not homogenous
*/
int homogenousValue;
/**
* Constructor
* @param worldX The world position x coordinate
* @param worldY The world position y coordinate
* @param worldZ The world position z coordinate
* @param homogenousValue The homogenous value of the terrain chunk
* @param weights The weights of the chunk
* @param values The values of the chunk
*/
public ServerTerrainChunk(int worldX, int worldY, int worldZ, int homogenousValue, float[][][] weights, int[][][] values) {
this.worldX = worldX;
this.worldY = worldY;
this.worldZ = worldZ;
this.weights = weights;
this.values = values;
}
/**
* Gets the world position x coordinate
* @return The x coordinate
*/
public int getWorldX() {
return worldX;
}
/**
* Gets the world position y coordinate
* @return The y coordinate
*/
public int getWorldY() {
return worldY;
}
/**
* Gets the world position z coordinate
* @return The z coordinate
*/
public int getWorldZ() {
return worldZ;
}
/**
* Gets the world position of the chunk
* @return The world position
*/
public Vector3i getWorldPos(){
return new Vector3i(worldX,worldY,worldZ);
}
/**
* Gets the world position of this terrain chunk as a joml Vector
* @return The vector
*/
public Vector3i getWorldPosition(){
return new Vector3i(worldX,worldY,worldZ);
}
/**
* Gets the list of all modifications applied to the chunk
* @return THe list of all modifications
*/
public List<TerrainModification> getModifications() {
return modifications;
}
/**
* Gets the weights of the chunk
* @return The weights of the chunk
*/
public float[][][] getWeights() {
return weights;
}
/**
* Gets the values of the chunk
* @return The values of the chunk
*/
public int[][][] getValues() {
return values;
}
/**
* Adds a modification to the chunk
* @param modification The modification
*/
public void addModification(TerrainModification modification){
modifications.add(modification);
values[modification.getVoxelPos().x][modification.getVoxelPos().y][modification.getVoxelPos().z] = modification.getValue();
weights[modification.getVoxelPos().x][modification.getVoxelPos().y][modification.getVoxelPos().z] = modification.getWeight();
}
/**
* Gets the weight of a voxel at a poisiton
* @param localPosition The local position
* @return The weight of the specified voxel
*/
public float getWeight(Vector3i localPosition){
return getWeight(localPosition.x,localPosition.y,localPosition.z);
}
/**
* Gets the weight of a voxel at a poisiton
* @param x The x coordinate
* @param y The y coordinate
* @param z The z coordinate
* @return The weight of the specified voxel
*/
public float getWeight(int x, int y, int z){
return weights[x][y][z];
}
/**
* Gets the type of a voxel at a position
* @param localPosition The local position
* @return The type of the specified voxel
*/
public int getType(Vector3i localPosition){
return getType(localPosition.x,localPosition.y,localPosition.z);
}
/**
* Gets the type of a voxel at a position
* @param x The x coordinate
* @param y The y coordinate
* @param z The z coordinate
* @return The type of the specified voxel
*/
public int getType(int x, int y, int z){
return values[x][y][z];
}
/**
* Gets the homogenous value of the chunk
* @return The homogenous value of this data, or ChunkData.NOT_HOMOGENOUS if it is not homogenous
*/
public int getHomogenousValue(){
return homogenousValue;
}
}