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 modifications = new LinkedList(); /** * 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 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; } }