Renderer/src/main/java/electrosphere/client/terrain/editing/TerrainEditing.java
2024-06-22 16:10:30 -04:00

70 lines
3.6 KiB
Java

package electrosphere.client.terrain.editing;
import org.joml.Vector3d;
import electrosphere.engine.Globals;
import electrosphere.net.parser.net.message.TerrainMessage;
/**
* Utilities for editing terrain from client side of things
*/
public class TerrainEditing {
/**
* Performs a terrain chunk edit. Basically has a sphere around the provided position that it attempts to add value to.
* @param position The position to perform the edit
* @param editMagnitude The magnitude of the edit to perform
* @param type The type of block to make all edited blocks
* @param weight The weight of the sphere to apply the edit to
*/
public static void editTerrain(Vector3d position, float editMagnitude, int type, float weight){
if(position != null){
Globals.clientConnection.queueOutgoingMessage(TerrainMessage.constructRequestUseTerrainPaletteMessage(position.x, position.y, position.z, editMagnitude, weight, type));
//calculate kernel size
// int numPlacesToCheck = (int)((editMagnitude * 2 + 1) * (editMagnitude * 2 + 1) * (editMagnitude * 2 + 1));
// //create and fill in kernel of positions to check
// int[] xOffsetSet = new int[numPlacesToCheck];
// int[] yOffsetSet = new int[numPlacesToCheck];
// int[] zOffsetSet = new int[numPlacesToCheck];
// int i = 0;
// for(int x = -(int)editMagnitude; x <= (int)editMagnitude; x++){
// for(int y = -(int)editMagnitude; y <= (int)editMagnitude; y++){
// for(int z = -(int)editMagnitude; z <= (int)editMagnitude; z++){
// xOffsetSet[i] = x;
// yOffsetSet[i] = y;
// zOffsetSet[i] = z;
// i++;
// }
// }
// }
// for(i = 0; i < numPlacesToCheck; i++){
// //calculate position of edit
// Vector3d offsetPos = new Vector3d(position).add(xOffsetSet[i],yOffsetSet[i],zOffsetSet[i]);
// Vector3i chunkPos = Globals.clientWorldData.convertRealToChunkSpace(offsetPos);
// Vector3i voxelPos = Globals.clientWorldData.convertRealToVoxelSpace(offsetPos);
// //get distance from true center point of sphere to current voxel position in world space
// float distance = (float)new Vector3d(Math.floor(offsetPos.x),Math.floor(offsetPos.y),Math.floor(offsetPos.z)).distance(position);
// float currentPositionMagnitude = editMagnitude - distance;
// ChunkData data = Globals.clientTerrainManager.getChunkDataAtWorldPoint(chunkPos.x, chunkPos.y, chunkPos.z);
// if(
// voxelPos.x < ChunkData.CHUNK_SIZE &&
// voxelPos.y < ChunkData.CHUNK_SIZE &&
// voxelPos.z < ChunkData.CHUNK_SIZE &&
// currentPositionMagnitude > 0 &&
// data != null
// ){
// float current = data.getVoxelWeight()[voxelPos.x][voxelPos.y][voxelPos.z];
// //hard clamp so it doesn't go over 1
// float finalValue = Math.max(Math.min(current + weight,1),-1);
// Globals.clientTerrainManager.updateChunk(
// chunkPos.x, chunkPos.y, chunkPos.z,
// voxelPos.x, voxelPos.y, voxelPos.z,
// finalValue, 1
// );
// }
// }
}
}
}