|
@@ -33,6 +33,19 @@ namespace KairoEngine.TerrainEngine
|
|
|
|
|
|
private bool initialized = false;
|
|
private bool initialized = false;
|
|
|
|
|
|
|
|
+ public class VoxelUpdateData
|
|
|
|
+ {
|
|
|
|
+ public Vector3 position;
|
|
|
|
+ public BlockBase block;
|
|
|
|
+
|
|
|
|
+ public VoxelUpdateData(Vector3 position, BlockBase block)
|
|
|
|
+ {
|
|
|
|
+ this.position = position;
|
|
|
|
+ this.block = block;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ private Dictionary<Vector3,List<VoxelUpdateData>> chunkUpdates = new Dictionary<Vector3, List<VoxelUpdateData>>();
|
|
|
|
+
|
|
public void Initialize ()
|
|
public void Initialize ()
|
|
{
|
|
{
|
|
chunkSystem = new ChunkSystem<BlockBase>(chunkSize,voxelSize, true);
|
|
chunkSystem = new ChunkSystem<BlockBase>(chunkSize,voxelSize, true);
|
|
@@ -116,6 +129,12 @@ namespace KairoEngine.TerrainEngine
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ chunkUpdates.TryGetValue(initialPos, out List<VoxelUpdateData> updates);
|
|
|
|
+ if(updates == null) return;
|
|
|
|
+ for (int i = 0; i < updates.Count; i++)
|
|
|
|
+ {
|
|
|
|
+ chunkSystem.SetBlock(updates[i].position, updates[i].block);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
public void GenerateChunkData(Vector3 position)
|
|
public void GenerateChunkData(Vector3 position)
|
|
@@ -306,9 +325,28 @@ namespace KairoEngine.TerrainEngine
|
|
block.code = code;
|
|
block.code = code;
|
|
block.value = (uint)targetHeigth;
|
|
block.value = (uint)targetHeigth;
|
|
chunkSystem.SetBlock(voxelPos, block);
|
|
chunkSystem.SetBlock(voxelPos, block);
|
|
|
|
+ // Get positions
|
|
Vector3Int localVoxelPos = chunkSystem.GetVoxelFromGlobalPosition(voxelPos);
|
|
Vector3Int localVoxelPos = chunkSystem.GetVoxelFromGlobalPosition(voxelPos);
|
|
- List<Vector3> chunks = new List<Vector3>();
|
|
|
|
Vector3 chunkPos = chunkSystem.GetChunkGlobalPositionFromGlobalPosition(voxelPos);
|
|
Vector3 chunkPos = chunkSystem.GetChunkGlobalPositionFromGlobalPosition(voxelPos);
|
|
|
|
+ // Save data update
|
|
|
|
+ VoxelUpdateData updateData = new VoxelUpdateData(voxelPos, block);
|
|
|
|
+ chunkUpdates.TryGetValue(chunkPos, out List<VoxelUpdateData> chunkUpdate);
|
|
|
|
+ if(chunkUpdate != null)
|
|
|
|
+ {
|
|
|
|
+ bool exists = false;
|
|
|
|
+ for (int h = 0; h < chunkUpdate.Count; h++)
|
|
|
|
+ {
|
|
|
|
+ if(chunkUpdate[h].position.Equals(updateData.position))
|
|
|
|
+ {
|
|
|
|
+ exists = true;
|
|
|
|
+ chunkUpdate[h].block = updateData.block;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if(!exists) chunkUpdate.Add(updateData);
|
|
|
|
+ }
|
|
|
|
+ else chunkUpdates.Add(chunkPos, new List<VoxelUpdateData>{updateData});
|
|
|
|
+ // Check if changed voxels are in the edge of the chunk and if true add the neightboring chunk to the update list
|
|
|
|
+ List<Vector3> chunks = new List<Vector3>();
|
|
chunks.Add(chunkPos);
|
|
chunks.Add(chunkPos);
|
|
if(localVoxelPos.x == 0) chunks.Add(new Vector3(chunkPos.x - chunkSize.x * voxelSize.x, chunkPos.y, chunkPos.z));
|
|
if(localVoxelPos.x == 0) chunks.Add(new Vector3(chunkPos.x - chunkSize.x * voxelSize.x, chunkPos.y, chunkPos.z));
|
|
if(localVoxelPos.x == 16) chunks.Add(new Vector3(chunkPos.x + chunkSize.x * voxelSize.x, chunkPos.y, chunkPos.z));
|
|
if(localVoxelPos.x == 16) chunks.Add(new Vector3(chunkPos.x + chunkSize.x * voxelSize.x, chunkPos.y, chunkPos.z));
|
|
@@ -351,5 +389,11 @@ namespace KairoEngine.TerrainEngine
|
|
terrainMeshes[chunkPosition] = meshObj;
|
|
terrainMeshes[chunkPosition] = meshObj;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ [Button("Save"), ButtonGroup("Buttons")]
|
|
|
|
+ public void SaveChunkUpdateData()
|
|
|
|
+ {
|
|
|
|
+
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|