90 lines
2.5 KiB
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);
|
|
} |