Files
voxel/World.cs
2025-09-03 15:08:21 +02:00

102 lines
2.8 KiB
C#

using OpenTK.Mathematics;
using System.Collections.Generic;
namespace Voxel
{
public class World
{
private Dictionary<(int, int), Chunk> _chunks;
public World()
{
_chunks = new Dictionary<(int, int), Chunk>();
}
// Get a chunk at world coordinates, returns null if not loaded
public Chunk GetChunk(int chunkX, int chunkZ)
{
_chunks.TryGetValue((chunkX, chunkZ), out Chunk chunk);
return chunk;
}
// Add a chunk
public void AddChunk(Chunk chunk)
{
_chunks[(chunk.X, chunk.Y)] = chunk;
}
// Remove a chunk
public void RemoveChunk(int chunkX, int chunkZ)
{
_chunks.Remove((chunkX, chunkZ));
}
// Iterate over all chunks
public IEnumerable<Chunk> GetAllChunks()
{
return _chunks.Values;
}
// Optional: get a block at world coordinates
public Blocks GetBlock(int worldX, int worldY, int worldZ)
{
int chunkX = worldX / Chunk.Size;
int chunkZ = worldZ / Chunk.Size;
Chunk chunk = GetChunk(chunkX, chunkZ);
if (chunk == null) return 0; // air if chunk not loaded
int localX = worldX % Chunk.Size;
int localZ = worldZ % Chunk.Size;
return chunk.GetBlock(localX, worldY, localZ);
}
// Optional: set a block at world coordinates
public void SetBlock(int worldX, int worldY, int worldZ, Blocks block)
{
int chunkX = worldX / Chunk.Size;
int chunkZ = worldZ / Chunk.Size;
Chunk chunk = GetChunk(chunkX, chunkZ);
if (chunk == null) return;
int localX = worldX % Chunk.Size;
int localZ = worldZ % Chunk.Size;
chunk.SetBlock(localX, worldY, localZ, block);
}
public (Blocks block, int x, int y, int z) Raycast(float length)
{
Vector3 start = Camera.Position;
Vector3 dir = Camera.Front.Normalized();
float stepSize = 0.01f;
float distanceTraveled = 0f;
while (distanceTraveled < length)
{
Vector3 point = start + dir * distanceTraveled;
int bx = (int)MathF.Floor(point.X);
int by = (int)MathF.Floor(point.Y);
int bz = (int)MathF.Floor(point.Z);
Blocks block = GetBlock(bx, by, bz);
if (block != Blocks.Air)
{
return (block, bx, by, bz);
}
distanceTraveled += stepSize;
}
return (Blocks.Air, 0, 0, 0);
}
public void Update()
{
}
}
}