Dawn/temp/src/world/map/chunk.c

90 lines
2.5 KiB
C

/**
* Copyright (c) 2021 Dominic Masters
*
* This software is released under the MIT License.
* https://opensource.org/licenses/MIT
*/
#include "chunk.h"
void chunkLoad(chunk_t *chunk, int32_t x, int32_t y, int32_t z) {
tileid_t tileId;
tiledef_t *tileDef;
int32_t i, indiceCount, verticeCount, tx, ty, tz;
for(ty = 0; ty < CHUNK_HEIGHT; ty++) {
for(tx = 0; tx < CHUNK_WIDTH; tx++) {
if(z != 0) break;
chunk->tiles[ty*CHUNK_WIDTH + tx] = ty == 5 ? 2 : 1;
}
}
// Start by loading the tiles and figuring out how big we need to make the
// primitive that the chunk uses.
indiceCount = 0, verticeCount = 0;
for(i = 0; i < CHUNK_TILE_COUNT; i++) {
//TODO: Actually load the tileId here
tileId = chunk->tiles[i];
if(tileId == TILE_NULL) continue;
// Increment the primitive size.
tileDef = MAP_STATE.tileDefinitions + tileId;
verticeCount += tileDef->verticeCount;
indiceCount += tileDef->indiceCount;
}
// Do we even need to create a primitive?
if(indiceCount == 0) return;
chunk->primitive = primitiveCreate(verticeCount, indiceCount);
// Render each tile. The ZYX order is important for ordering.
i = 0;
verticeCount = 0, indiceCount = 0;
for(tz = 0; tz < CHUNK_DEPTH; tz++) {
for(ty = 0; ty < CHUNK_HEIGHT; ty++) {
for(tx = 0; tx < CHUNK_WIDTH; tx++) {
tileId = chunk->tiles[i];
if(tileId == TILE_NULL) {
i++;
continue;
}
tileDef = MAP_STATE.tileDefinitions + tileId;
tileRender(
chunk, tileId, tileDef,
i, tx, ty, tz,
verticeCount, indiceCount
);
// Prepare for the next render.
verticeCount += tileDef->verticeCount;
indiceCount += tileDef->indiceCount;
i++;
}
}
}
}
void chunkUnload(chunk_t *chunk) {
// Load chunks to zero. TODO: Necessary?
memset(chunk->tiles, TILE_NULL, CHUNK_TILE_COUNT);
// Unload the primitive. TODO: Can we salvage this and resize instead?
if(chunk->primitive == NULL) return;
primitiveDispose(chunk->primitive);
chunk->primitive = NULL;
}
int32_t chunkGet(int32_t x, int32_t y, int32_t z) {
int32_t i = (
mathMod(x - MAP_STATE.x, MAP_WIDTH) +
(mathMod(y - MAP_STATE.y, MAP_HEIGHT) * MAP_WIDTH) +
(mathMod(z - MAP_STATE.z, MAP_DEPTH) * MAP_WIDTH * MAP_HEIGHT)
);
if(i < 0 || i > MAP_CHUNK_COUNT) return -1;
return i;
}
int32_t chunkGetTile(int32_t x, int32_t y, int32_t z) {
return x + (y * CHUNK_WIDTH) + (z * CHUNK_WIDTH * CHUNK_HEIGHT);
}