voxelThing/source/world.c

61 lines
1.6 KiB
C

// world.c
#include <stdlib.h>
#include "world.h"
#include "chunkGenerator.h"
#include "chunkRenderer.h"
#include "chunkStructures.h"
#include "chunkIO.h"
#include <stdio.h>
void InitWorld(World *world) {
for (int x = 0; x < WORLD_SIZE_X; x++) {
for (int z = 0; z < WORLD_SIZE_Z; z++) {
world->chunks[x][z] = malloc(sizeof(Chunk));
Chunk *chunk = world->chunks[x][z];
InitChunk(chunk, x, z);
if (!LoadChunk(chunk)) {
// Later
//GenerateChunkTerrain(chunk);
GenerateFlatChunk(chunk);
SaveChunk(chunk);
}
chunk->mesh = GenerateChunkMesh(chunk);
}
}
}
void FreeWorld(World *world) {
for (int x = 0; x < WORLD_SIZE_X; x++) {
for (int z = 0; z < WORLD_SIZE_Z; z++) {
Chunk *chunk = world->chunks[x][z];
if(chunk->hasChanged) SaveChunk(chunk);
if (chunk) {
UnloadMesh(chunk->mesh);
free(chunk);
}
}
}
}
Chunk *GetChunkContainingBlock(World *world, int wx, int wz) {
int chunkX = wx / CHUNK_SIZE_X;
int chunkZ = wz / CHUNK_SIZE_Z;
if (wx < 0) chunkX--;
if (wz < 0) chunkZ--;
return GetChunk(world, chunkX, chunkZ);
}
void UpdateWorld(World *world) {
// For now, stub function. Will handle streaming later.
}
Chunk *GetChunk(World *world, int chunkX, int chunkZ) {
if (chunkX >= 0 && chunkX < WORLD_SIZE_X && chunkZ >= 0 && chunkZ < WORLD_SIZE_Z) {
return world->chunks[chunkX][chunkZ];
}
return NULL;
}