mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-10-02 18:33:24 -04:00
Make block lighting a little bit faster
This commit is contained in:
parent
f7dbfbadcc
commit
f6ce731246
@ -357,77 +357,67 @@ static void CalcBlockLight(cc_uint8 blockLight, int x, int y, int z, cc_bool sun
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
BlockID thisBlock = World_GetBlock(curNode.X, curNode.Y, curNode.Z);
|
BlockID thisBlock = World_GetBlock(curNode.X, curNode.Y, curNode.Z);
|
||||||
|
curBlockLight--; // 1 level less in each neighbour
|
||||||
|
if (curBlockLight == 0) continue;
|
||||||
|
|
||||||
|
|
||||||
curNode.X--;
|
curNode.X--;
|
||||||
if (curNode.X > 0 &&
|
if (curNode.X > 0 &&
|
||||||
curBlockLight - 1 > 0 &&
|
|
||||||
CanLightPass(thisBlock, FACE_XMAX) &&
|
CanLightPass(thisBlock, FACE_XMAX) &&
|
||||||
CanLightPass(World_GetBlock(curNode.X, curNode.Y, curNode.Z), FACE_XMIN) &&
|
CanLightPass(World_GetBlock(curNode.X, curNode.Y, curNode.Z), FACE_XMIN) &&
|
||||||
GetBlocklight(curNode.X, curNode.Y, curNode.Z, sun) < curBlockLight - 1
|
GetBlocklight(curNode.X, curNode.Y, curNode.Z, sun) < curBlockLight
|
||||||
) {
|
) {
|
||||||
SetBlocklight(curBlockLight - 1, curNode.X, curNode.Y, curNode.Z, sun);
|
SetBlocklight(curBlockLight, curNode.X, curNode.Y, curNode.Z, sun);
|
||||||
IVec3 entry = { curNode.X, curNode.Y, curNode.Z };
|
LightQueue_Enqueue(&lightQueue, curNode);
|
||||||
LightQueue_Enqueue(&lightQueue, entry);
|
|
||||||
}
|
}
|
||||||
curNode.X += 2;
|
curNode.X += 2;
|
||||||
if (curNode.X < World.MaxX &&
|
if (curNode.X < World.MaxX &&
|
||||||
curBlockLight - 1 > 0 &&
|
|
||||||
CanLightPass(thisBlock, FACE_XMIN) &&
|
CanLightPass(thisBlock, FACE_XMIN) &&
|
||||||
CanLightPass(World_GetBlock(curNode.X, curNode.Y, curNode.Z), FACE_XMAX) &&
|
CanLightPass(World_GetBlock(curNode.X, curNode.Y, curNode.Z), FACE_XMAX) &&
|
||||||
GetBlocklight(curNode.X, curNode.Y, curNode.Z, sun) < curBlockLight - 1
|
GetBlocklight(curNode.X, curNode.Y, curNode.Z, sun) < curBlockLight
|
||||||
) {
|
) {
|
||||||
SetBlocklight(curBlockLight - 1, curNode.X, curNode.Y, curNode.Z, sun);
|
SetBlocklight(curBlockLight, curNode.X, curNode.Y, curNode.Z, sun);
|
||||||
IVec3 entry = { curNode.X, curNode.Y, curNode.Z };
|
LightQueue_Enqueue(&lightQueue, curNode);
|
||||||
LightQueue_Enqueue(&lightQueue, entry);
|
|
||||||
}
|
}
|
||||||
curNode.X--;
|
curNode.X--;
|
||||||
|
|
||||||
curNode.Y--;
|
curNode.Y--;
|
||||||
if (curNode.Y > 0 &&
|
if (curNode.Y > 0 &&
|
||||||
curBlockLight - 1 > 0 &&
|
|
||||||
CanLightPass(thisBlock, FACE_YMAX) &&
|
CanLightPass(thisBlock, FACE_YMAX) &&
|
||||||
CanLightPass(World_GetBlock(curNode.X, curNode.Y, curNode.Z), FACE_YMIN) &&
|
CanLightPass(World_GetBlock(curNode.X, curNode.Y, curNode.Z), FACE_YMIN) &&
|
||||||
GetBlocklight(curNode.X, curNode.Y, curNode.Z, sun) < curBlockLight - 1
|
GetBlocklight(curNode.X, curNode.Y, curNode.Z, sun) < curBlockLight
|
||||||
) {
|
) {
|
||||||
SetBlocklight(curBlockLight - 1, curNode.X, curNode.Y, curNode.Z, sun);
|
SetBlocklight(curBlockLight, curNode.X, curNode.Y, curNode.Z, sun);
|
||||||
IVec3 entry = { curNode.X, curNode.Y, curNode.Z };
|
LightQueue_Enqueue(&lightQueue, curNode);
|
||||||
LightQueue_Enqueue(&lightQueue, entry);
|
|
||||||
}
|
}
|
||||||
curNode.Y += 2;
|
curNode.Y += 2;
|
||||||
if (curNode.Y < World.MaxY &&
|
if (curNode.Y < World.MaxY &&
|
||||||
curBlockLight - 1 > 0 &&
|
|
||||||
CanLightPass(thisBlock, FACE_YMIN) &&
|
CanLightPass(thisBlock, FACE_YMIN) &&
|
||||||
CanLightPass(World_GetBlock(curNode.X, curNode.Y, curNode.Z), FACE_YMAX) &&
|
CanLightPass(World_GetBlock(curNode.X, curNode.Y, curNode.Z), FACE_YMAX) &&
|
||||||
GetBlocklight(curNode.X, curNode.Y, curNode.Z, sun) < curBlockLight - 1
|
GetBlocklight(curNode.X, curNode.Y, curNode.Z, sun) < curBlockLight
|
||||||
) {
|
) {
|
||||||
SetBlocklight(curBlockLight - 1, curNode.X, curNode.Y, curNode.Z, sun);
|
SetBlocklight(curBlockLight, curNode.X, curNode.Y, curNode.Z, sun);
|
||||||
IVec3 entry = { curNode.X, curNode.Y, curNode.Z };
|
LightQueue_Enqueue(&lightQueue, curNode);
|
||||||
LightQueue_Enqueue(&lightQueue, entry);
|
|
||||||
}
|
}
|
||||||
curNode.Y--;
|
curNode.Y--;
|
||||||
|
|
||||||
curNode.Z--;
|
curNode.Z--;
|
||||||
if (curNode.Z > 0 &&
|
if (curNode.Z > 0 &&
|
||||||
curBlockLight - 1 > 0 &&
|
|
||||||
CanLightPass(thisBlock, FACE_ZMAX) &&
|
CanLightPass(thisBlock, FACE_ZMAX) &&
|
||||||
CanLightPass(World_GetBlock(curNode.X, curNode.Y, curNode.Z), FACE_ZMIN) &&
|
CanLightPass(World_GetBlock(curNode.X, curNode.Y, curNode.Z), FACE_ZMIN) &&
|
||||||
GetBlocklight(curNode.X, curNode.Y, curNode.Z, sun) < curBlockLight - 1
|
GetBlocklight(curNode.X, curNode.Y, curNode.Z, sun) < curBlockLight
|
||||||
) {
|
) {
|
||||||
SetBlocklight(curBlockLight - 1, curNode.X, curNode.Y, curNode.Z, sun);
|
SetBlocklight(curBlockLight, curNode.X, curNode.Y, curNode.Z, sun);
|
||||||
IVec3 entry = { curNode.X, curNode.Y, curNode.Z };
|
LightQueue_Enqueue(&lightQueue, curNode);
|
||||||
LightQueue_Enqueue(&lightQueue, entry);
|
|
||||||
}
|
}
|
||||||
curNode.Z += 2;
|
curNode.Z += 2;
|
||||||
if (curNode.Z < World.MaxZ &&
|
if (curNode.Z < World.MaxZ &&
|
||||||
curBlockLight - 1 > 0 &&
|
|
||||||
CanLightPass(thisBlock, FACE_ZMIN) &&
|
CanLightPass(thisBlock, FACE_ZMIN) &&
|
||||||
CanLightPass(World_GetBlock(curNode.X, curNode.Y, curNode.Z), FACE_ZMAX) &&
|
CanLightPass(World_GetBlock(curNode.X, curNode.Y, curNode.Z), FACE_ZMAX) &&
|
||||||
GetBlocklight(curNode.X, curNode.Y, curNode.Z, sun) < curBlockLight - 1
|
GetBlocklight(curNode.X, curNode.Y, curNode.Z, sun) < curBlockLight
|
||||||
) {
|
) {
|
||||||
SetBlocklight(curBlockLight - 1, curNode.X, curNode.Y, curNode.Z, sun);
|
SetBlocklight(curBlockLight, curNode.X, curNode.Y, curNode.Z, sun);
|
||||||
IVec3 entry = { curNode.X, curNode.Y, curNode.Z };
|
LightQueue_Enqueue(&lightQueue, curNode);
|
||||||
LightQueue_Enqueue(&lightQueue, entry);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -586,6 +576,8 @@ static void CalculateChunkLightingAll(int chunkIndex, int cx, int cy, int cz) {
|
|||||||
|
|
||||||
cc_string msg; char msgBuffer[STRING_SIZE * 2];
|
cc_string msg; char msgBuffer[STRING_SIZE * 2];
|
||||||
|
|
||||||
|
//cc_uint64 BEG = Stopwatch_Measure();
|
||||||
|
|
||||||
for (y = chunkStartY; y <= chunkEndY; y++) {
|
for (y = chunkStartY; y <= chunkEndY; y++) {
|
||||||
for (z = chunkStartZ; z <= chunkEndZ; z++) {
|
for (z = chunkStartZ; z <= chunkEndZ; z++) {
|
||||||
for (x = chunkStartX; x <= chunkEndX; x++) {
|
for (x = chunkStartX; x <= chunkEndX; x++) {
|
||||||
@ -605,6 +597,11 @@ static void CalculateChunkLightingAll(int chunkIndex, int cx, int cy, int cz) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//cc_uint64 END = Stopwatch_Measure();
|
||||||
|
|
||||||
|
//static float ELAPSED;
|
||||||
|
//ELAPSED += Stopwatch_ElapsedMicroseconds(BEG, END) / 1000.0;
|
||||||
|
//Platform_Log1("CALC TIME: %f3", &ELAPSED);
|
||||||
chunkLightingDataFlags[chunkIndex] = CHUNK_ALL_CALCULATED;
|
chunkLightingDataFlags[chunkIndex] = CHUNK_ALL_CALCULATED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user