make chunk lightmap optional

This commit is contained in:
MihailRis 2025-11-23 15:22:18 +03:00
parent 64f7c19766
commit 5250c748be
12 changed files with 103 additions and 73 deletions

View file

@ -29,16 +29,21 @@ void Lighting::clear(){
const auto& chunks = this->chunks.getChunks();
for (size_t index = 0; index < chunks.size(); index++){
auto chunk = chunks[index];
if (chunk == nullptr)
if (chunk == nullptr) {
continue;
Lightmap& lightmap = chunk->lightmap;
for (int i = 0; i < CHUNK_VOL; i++){
lightmap.map[i] = 0;
}
auto& lightmap = chunk->lightmap;
if (lightmap == nullptr) {
continue;
}
std::memset(lightmap->map, 0, sizeof(Lightmap::map));
}
}
void Lighting::prebuildSkyLight(Chunk& chunk, const ContentIndices& indices){
void Lighting::prebuildSkyLight(Chunk& chunk, const ContentIndices& indices) {
assert(chunk.lightmap != nullptr);
auto& lightmap = *chunk.lightmap;
const auto* blockDefs = indices.blocks.getDefs();
int highestPoint = 0;
@ -49,17 +54,19 @@ void Lighting::prebuildSkyLight(Chunk& chunk, const ContentIndices& indices){
voxel& vox = chunk.voxels[index];
const Block* block = blockDefs[vox.id];
if (!block->skyLightPassing) {
if (highestPoint < y)
if (highestPoint < y) {
highestPoint = y;
}
break;
}
chunk.lightmap.setS(x,y,z, 15);
lightmap.setS(x, y, z, 15);
}
}
}
if (highestPoint < CHUNK_H-1)
if (highestPoint < CHUNK_H-1) {
highestPoint++;
chunk.lightmap.highestPoint = highestPoint;
}
lightmap.highestPoint = highestPoint;
}
void Lighting::buildSkyLight(int cx, int cz){
@ -70,15 +77,18 @@ void Lighting::buildSkyLight(int cx, int cz){
logger.error() << "attempted to build sky lights to chunk missing in local matrix";
return;
}
assert(chunk->lightmap != nullptr);
auto& lightmap = *chunk->lightmap;
for (int z = 0; z < CHUNK_D; z++){
for (int x = 0; x < CHUNK_W; x++){
int gx = x + cx * CHUNK_W;
int gz = z + cz * CHUNK_D;
for (int y = chunk->lightmap.highestPoint; y >= 0; y--){
for (int y = lightmap.highestPoint; y >= 0; y--){
while (y > 0 && !blockDefs[chunk->voxels[vox_index(x, y, z)].id]->lightPassing) {
y--;
}
if (chunk->lightmap.getS(x, y, z) != 15) {
if (lightmap.getS(x, y, z) != 15) {
solverS->add(gx,y+1,gz);
for (; y >= 0; y--){
solverS->add(gx+1,y,gz);
@ -106,6 +116,9 @@ void Lighting::onChunkLoaded(int cx, int cz, bool expand) {
logger.error() << "attempted to build lights to chunk missing in local matrix";
return;
}
assert(chunk->lightmap != nullptr);
auto& lightmap = *chunk->lightmap;
for (uint y = 0; y < CHUNK_H; y++){
for (uint z = 0; z < CHUNK_D; z++){
for (uint x = 0; x < CHUNK_W; x++){
@ -128,7 +141,7 @@ void Lighting::onChunkLoaded(int cx, int cz, bool expand) {
for (int z = 0; z < CHUNK_D; z++) {
int gx = x + cx * CHUNK_W;
int gz = z + cz * CHUNK_D;
int rgbs = chunk->lightmap.get(x, y, z);
int rgbs = lightmap.get(x, y, z);
if (rgbs){
solverR.add(gx,y,gz, Lightmap::extract(rgbs, 0));
solverG.add(gx,y,gz, Lightmap::extract(rgbs, 1));
@ -143,7 +156,7 @@ void Lighting::onChunkLoaded(int cx, int cz, bool expand) {
for (int x = 0; x < CHUNK_W; x++) {
int gx = x + cx * CHUNK_W;
int gz = z + cz * CHUNK_D;
int rgbs = chunk->lightmap.get(x, y, z);
int rgbs = lightmap.get(x, y, z);
if (rgbs){
solverR.add(gx,y,gz, Lightmap::extract(rgbs, 0));
solverG.add(gx,y,gz, Lightmap::extract(rgbs, 1));