From 85ddc90883ea270596b3043b6441ad2c7e64b0dd Mon Sep 17 00:00:00 2001 From: milkwx3 Date: Wed, 24 Jun 2026 20:25:11 +0300 Subject: [PATCH] Colored block lighting --- .gitea/workflows/autobuild.yaml | 2 +- data/resources/terrain.png | Bin 5239 -> 5300 bytes src/helpers/chunks.cpp | 214 ++++++++++++++++++++++++++++++-- src/helpers/common.hpp | 13 +- src/helpers/inlines.hpp | 11 +- src/helpers/vars.hpp | 2 +- 6 files changed, 217 insertions(+), 25 deletions(-) diff --git a/.gitea/workflows/autobuild.yaml b/.gitea/workflows/autobuild.yaml index 7cb7028..dcd4b53 100644 --- a/.gitea/workflows/autobuild.yaml +++ b/.gitea/workflows/autobuild.yaml @@ -19,7 +19,7 @@ jobs: # echo "deb [signed-by=/usr/share/keyrings/ubuntu-archive-keyring.gpg] http://archive.ubuntu.com/ubuntu noble main" | sudo tee /tmp/only.list # sudo apt-get update -o Dir::Etc::sourcelist=/tmp/only.list -o Dir::Etc::sourceparts="-" -qq sudo apt update - sudo apt install -y build-essential cmake zip unzip make libxrandr-dev g++-mingw-w64-x86-64 gcc-mingw-w64-x86-64 g++-mingw-i686-x86-64 gcc-mingw-i686-x86-64 libxinerama-dev libxcursor-dev libxi-dev libgl-dev + sudo apt install -y build-essential cmake zip unzip make libxrandr-dev g++-mingw-w64-x86-64 gcc-mingw-w64-x86-64 g++-mingw-w64-i686 gcc-mingw-w64-i686 libxinerama-dev libxcursor-dev libxi-dev libgl-dev - name: Build makeheaders run: | diff --git a/data/resources/terrain.png b/data/resources/terrain.png index b95140c4af9b4c6e943f92ef97c8890391d3884b..0ac03da7edbfdc6dbbf210d7be62a94569355133 100644 GIT binary patch delta 5005 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 P^}zCm?e#h{&-niXM5Jf( delta 4935 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 diff --git a/src/helpers/chunks.cpp b/src/helpers/chunks.cpp index ee9dd79..079f53d 100644 --- a/src/helpers/chunks.cpp +++ b/src/helpers/chunks.cpp @@ -42,10 +42,10 @@ const BlockDef BLOCKS[] = { BlockDef{ "workbench", R_TranslucentAllSides, B_Stone, 3, 0, 23, 22, 23}, BlockDef{ "blue_block", R_Normal, B_Stone, 5, 0, 22}, BlockDef{ "yellow_block", R_Normal, B_Stone, 5, 0, 23}, - BlockDef{ "cyan_block", R_Normal, B_Stone, 5, 0, 24}, - BlockDef{ "magenta_block", R_Normal, B_Stone, 5, 0, 25}, - BlockDef{ "white_block", R_Normal, B_Stone, 5, 0, 26}, - BlockDef{ "black_block", R_Normal, B_Stone, 5, 0, 27}, + BlockDef{ "red_block", R_Normal, B_Stone, 5, 0, 24}, + BlockDef{ "green_block", R_Normal, B_Stone, 5, 0, 25}, + BlockDef{ "blue_block", R_Normal, B_Stone, 5, 0, 26}, + BlockDef{ "white_block", R_Normal, B_Stone, 5, 0, 27}, BlockDef{ "leaves", R_TranslucentAllSides, B_Grass, 1, 0, 28}, BlockDef{ "copper_ore", R_Normal, B_Stone, 7, 1, 5}, BlockDef{ "silver_ore", R_Normal, B_Stone, 7, 2, 6}, @@ -127,6 +127,36 @@ int GetSkyLight(World &world, int x, int y, int z) { int skyLight = (light >> 12) & 0xF; return skyLight; } +int GetRLight(World &world, int x, int y, int z) { + if(CheckOOBWorld(x, y, z)) return 0; + int locX = x % CHUNK_SIZE; + int locZ = z % CHUNK_SIZE; + int cx = x / CHUNK_SIZE; + int cz = z / CHUNK_SIZE; + uint16_t light = world.chunks[GetIndexWorld(cx, cz)].light[GetIndexChunk(locX, y, locZ)]; + int skyLight = (light >> 8) & 0xF; + return skyLight; +} +int GetGLight(World &world, int x, int y, int z) { + if(CheckOOBWorld(x, y, z)) return 0; + int locX = x % CHUNK_SIZE; + int locZ = z % CHUNK_SIZE; + int cx = x / CHUNK_SIZE; + int cz = z / CHUNK_SIZE; + uint16_t light = world.chunks[GetIndexWorld(cx, cz)].light[GetIndexChunk(locX, y, locZ)]; + int skyLight = (light >> 4) & 0xF; + return skyLight; +} +int GetBLight(World &world, int x, int y, int z) { + if(CheckOOBWorld(x, y, z)) return 0; + int locX = x % CHUNK_SIZE; + int locZ = z % CHUNK_SIZE; + int cx = x / CHUNK_SIZE; + int cz = z / CHUNK_SIZE; + uint16_t light = world.chunks[GetIndexWorld(cx, cz)].light[GetIndexChunk(locX, y, locZ)]; + int skyLight = light & 0xF; + return skyLight; +} Color GetLight(World &world, int x, int y, int z) { if(CheckOOBWorld(x, y, z)) return {0, 0, 0, 0}; int locX = x % CHUNK_SIZE; @@ -135,8 +165,19 @@ Color GetLight(World &world, int x, int y, int z) { int cz = z / CHUNK_SIZE; uint16_t light = world.chunks[GetIndexWorld(cx, cz)].light[GetIndexChunk(locX, y, locZ)]; int skyLight = ((light >> 12) & 0xF) * 16; - //return {((light >> 8) & 0xF) * 16 + skyLight, (light >> 4) * 16 + skyLight, (light & 0xF) * 16 + skyLight, 255}; - return {skyLight, skyLight, skyLight, 255}; + Color sky = {skyLight, skyLight, skyLight, 255}; + Color r = {((light >> 8) & 0xF) * 16 + skyLight, 0, 0, 255}; + Color g = {0, ((light >> 4) & 0xF) * 16 + skyLight, 0, 255}; + Color b = {0, 0, ((light >> 0) & 0xF) * 16 + skyLight, 255}; + Color f = ColorTint(sky, r); + f = ColorTint(f, g); + f = ColorTint(f, b); + return { + fmin((int)sky.r + (int)r.r, 255), + fmin((int)sky.g + (int)g.g, 255), + fmin((int)sky.b + (int)b.b, 255), + 255 + }; } bool CanTick(int blockType) { // TODO: make smarter in case other blocks can tick too! return blockType == BLOCK_SAND; @@ -244,7 +285,20 @@ void SetBlock(World &world, int x, int y, int z, int t) { } void SetLightChunk(Chunk *c, int x, int y, int z, uint8_t sky, uint8_t r, uint8_t g, uint8_t b) { - c->light[GetIndexChunk(x,y,z)] = sky << 12 | r << 8 | g << 4 | b; + int target = c->light[GetIndexChunk(x,y,z)]; + if(sky > 0) { + target |= sky << 12; + } + if(r > 0) { + target |= r << 8; + } + if(g > 0) { + target |= g << 4; + } + if(b > 0) { + target |= b; + } + c->light[GetIndexChunk(x,y,z)] = target; } void SetLight(World &world, int x, int y, int z, uint8_t sky, uint8_t r, uint8_t g, uint8_t b) { if(CheckOOBWorld(x, y, z)) { return; } @@ -553,6 +607,9 @@ void RebuildOpaqueMask(Chunk &chunk) { } void RebuildLighting(World &world, int startX, int startZ) { + const Vector3I dirs[6] = { (Vector3I){ 1, 0, 0 }, (Vector3I){ -1, 0, 0 }, (Vector3I){ 0, 1, 0 }, (Vector3I){ 0,-1, 0 }, (Vector3I){ 0, 0, 1 }, (Vector3I){ 0, 0,-1 } }; + + // sky lighting std::queue nodes; for (int cx = -1; cx <= 1; cx++) @@ -566,24 +623,20 @@ void RebuildLighting(World &world, int startX, int startZ) { if (y < 0) continue; Vector3I pos = { x + chunk.x * CHUNK_SIZE, y + 1, z + chunk.z * CHUNK_SIZE }; if (CheckOOBWorld(pos.x, pos.y, pos.z)) continue; + for (int _y = WORLD_HEIGHT; _y >= y; _y--) { SetLight(world, pos.x, _y, pos.z, 15, 0, 0, 0); } LightNode node{pos, 15}; - SetLight(world, pos.x, pos.y, pos.z, 15, 0, 0, 0); nodes.push(node); } } } } - - const Vector3I dirs[6] = { (Vector3I){ 1, 0, 0 }, (Vector3I){ -1, 0, 0 }, (Vector3I){ 0, 1, 0 }, (Vector3I){ 0,-1, 0 }, (Vector3I){ 0, 0, 1 }, (Vector3I){ 0, 0,-1 } }; - while (!nodes.empty()) { - std::cout << nodes.size() << std::endl; LightNode node = nodes.front(); nodes.pop(); @@ -595,7 +648,7 @@ void RebuildLighting(World &world, int startX, int startZ) { }; if (CheckOOBWorld(newPos.x, newPos.y, newPos.z)) continue; - if (GetBlock(world, newPos.x, newPos.y, newPos.z) != BLOCK_AIR) continue; + if (TestOpaqueMaskWorld(world, newPos.x, newPos.y, newPos.z)) continue; int newValue = node.value - 1; if (newValue <= 0) continue; @@ -605,6 +658,141 @@ void RebuildLighting(World &world, int startX, int startZ) { nodes.push({ newPos, newValue }); } } + + // red lighting + std::queue nodesR; + + for (int cx = -1; cx <= 1; cx++) + { + for (int cz = -1; cz <= 1; cz++) { + Chunk &chunk = world.chunks[GetIndexWorld(startX+cx, startZ+cz)]; + for (int i = 0; i < CHUNK_DATA_SIZE; i++) + { + int x, y, z; + GetXYZFromIndex(i, &x, &y, &z); + if (CheckOOBWorld(x, y, z)) continue; + if(chunk.blocks[i] != 18 && chunk.blocks[i] != 21) continue; + Vector3I pos = { x + chunk.x * CHUNK_SIZE, y, z + chunk.z * CHUNK_SIZE }; + std::cout << pos.y << std::endl; + LightNode node{pos, 15}; + nodesR.push(node); + } + } + } + + while (!nodesR.empty()) { + std::cout << nodesR.size() << std::endl; + LightNode node = nodesR.front(); + nodesR.pop(); + + for (int i = 0; i < 6; i++) { + Vector3I newPos = { + node.position.x + dirs[i].x, + node.position.y + dirs[i].y, + node.position.z + dirs[i].z + }; + + if (CheckOOBWorld(newPos.x, newPos.y, newPos.z)) continue; + if (TestOpaqueMaskWorld(world, newPos.x, newPos.y, newPos.z)) continue; + int newValue = node.value - 1; + if (newValue <= 0) continue; + + if (GetRLight(world, newPos.x, newPos.y, newPos.z) >= newValue) continue; + + SetLight(world, newPos.x, newPos.y, newPos.z, 0, newValue, 0, 0); + nodesR.push({ newPos, newValue }); + } + } + + // green lighting + std::queue nodesG; + + for (int cx = -1; cx <= 1; cx++) + { + for (int cz = -1; cz <= 1; cz++) { + Chunk &chunk = world.chunks[GetIndexWorld(startX+cx, startZ+cz)]; + for (int i = 0; i < CHUNK_DATA_SIZE; i++) + { + int x, y, z; + GetXYZFromIndex(i, &x, &y, &z); + if (CheckOOBWorld(x, y, z)) continue; + if(chunk.blocks[i] != 19 && chunk.blocks[i] != 21) continue; + Vector3I pos = { x + chunk.x * CHUNK_SIZE, y, z + chunk.z * CHUNK_SIZE }; + std::cout << pos.y << std::endl; + LightNode node{pos, 15}; + nodesG.push(node); + } + } + } + + while (!nodesG.empty()) { + std::cout << nodesG.size() << std::endl; + LightNode node = nodesG.front(); + nodesG.pop(); + + for (int i = 0; i < 6; i++) { + Vector3I newPos = { + node.position.x + dirs[i].x, + node.position.y + dirs[i].y, + node.position.z + dirs[i].z + }; + + if (CheckOOBWorld(newPos.x, newPos.y, newPos.z)) continue; + if (TestOpaqueMaskWorld(world, newPos.x, newPos.y, newPos.z)) continue; + int newValue = node.value - 1; + if (newValue <= 0) continue; + + if (GetGLight(world, newPos.x, newPos.y, newPos.z) >= newValue) continue; + + SetLight(world, newPos.x, newPos.y, newPos.z, 0, 0, newValue, 0); + nodesG.push({ newPos, newValue }); + } + } + + // blue lighting + std::queue nodesB; + + for (int cx = -1; cx <= 1; cx++) + { + for (int cz = -1; cz <= 1; cz++) { + Chunk &chunk = world.chunks[GetIndexWorld(startX+cx, startZ+cz)]; + for (int i = 0; i < CHUNK_DATA_SIZE; i++) + { + int x, y, z; + GetXYZFromIndex(i, &x, &y, &z); + if (CheckOOBWorld(x, y, z)) continue; + if(chunk.blocks[i] != 20 && chunk.blocks[i] != 21) continue; + Vector3I pos = { x + chunk.x * CHUNK_SIZE, y, z + chunk.z * CHUNK_SIZE }; + std::cout << pos.y << std::endl; + LightNode node{pos, 15}; + nodesB.push(node); + } + } + } + + while (!nodesB.empty()) { + std::cout << nodesB.size() << std::endl; + LightNode node = nodesB.front(); + nodesB.pop(); + + for (int i = 0; i < 6; i++) { + Vector3I newPos = { + node.position.x + dirs[i].x, + node.position.y + dirs[i].y, + node.position.z + dirs[i].z + }; + + if (CheckOOBWorld(newPos.x, newPos.y, newPos.z)) continue; + if (TestOpaqueMaskWorld(world, newPos.x, newPos.y, newPos.z)) continue; + int newValue = node.value - 1; + if (newValue <= 0) continue; + + if (GetBLight(world, newPos.x, newPos.y, newPos.z) >= newValue) continue; + + SetLight(world, newPos.x, newPos.y, newPos.z, 0, 0, 0, newValue); + nodesB.push({ newPos, newValue }); + } + } } #ifndef SERVER //Generates an opaque CRD (ChunkRenderData). Outputs the CRD. diff --git a/src/helpers/common.hpp b/src/helpers/common.hpp index 96a7f61..41aa1fa 100644 --- a/src/helpers/common.hpp +++ b/src/helpers/common.hpp @@ -78,7 +78,7 @@ #define DEFAULT_FONT_SIZE 16 #define TPS 30.0 #define TPS_DIV 1.0 / TPS -#define RENDER_DISTANCE 2 +#define RENDER_DISTANCE 5 #define RENDER_DISTANCE_SQUARED RENDER_DISTANCE*RENDER_DISTANCE #define MAX_HP 100 #define PATH_APPEND "resources/" @@ -307,6 +307,9 @@ extern const BlockDef BLOCKS[]; int GetBlock(World&world,int x,int y,int z); int GetHighestBlock(World&world,int x,int z); int GetSkyLight(World&world,int x,int y,int z); +int GetRLight(World&world,int x,int y,int z); +int GetGLight(World&world,int x,int y,int z); +int GetBLight(World&world,int x,int y,int z); Color GetLight(World&world,int x,int y,int z); bool CanTick(int blockType); bool GetCloud(int x,int z); @@ -463,10 +466,10 @@ inline void unpack6(uint8_t v,bool *b0,bool *b1,bool *b2,bool *b3,bool *b4,bool *b5 = (v >> 5) & 1; }; inline void GetXYZFromIndex(int index,int *x,int *y,int *z){ - *x = index & 15; - int tmp = index << 4; - *z = tmp & 15; - *y = tmp << 4; + *y = index / (CHUNK_SIZE * CHUNK_SIZE); + int rem = index % (CHUNK_SIZE * CHUNK_SIZE); + *z = rem / CHUNK_SIZE; + *x = rem % CHUNK_SIZE; }; inline int GetIndexChunk(int x,int y,int z){ if(x < 0 || y < 0 || z < 0 || x >= CHUNK_SIZE || y >= WORLD_HEIGHT || z >= CHUNK_SIZE) return 0; diff --git a/src/helpers/inlines.hpp b/src/helpers/inlines.hpp index 87a7a9c..78e9649 100644 --- a/src/helpers/inlines.hpp +++ b/src/helpers/inlines.hpp @@ -20,14 +20,15 @@ inline void unpack6(uint8_t v, bool *b0, bool *b1, bool *b2, bool *b3, bool *b4, *b5 = (v >> 5) & 1; } -inline void GetXYZFromIndex(int index, int *x, int *y, int *z) { - *x = index & 15; - int tmp = index << 4; - *z = tmp & 15; - *y = tmp << 4; +inline void GetXYZFromIndex(int index, int* x, int* y, int* z) { + *y = index / (CHUNK_SIZE * CHUNK_SIZE); + int rem = index % (CHUNK_SIZE * CHUNK_SIZE); + *z = rem / CHUNK_SIZE; + *x = rem % CHUNK_SIZE; } + inline int GetIndexChunk(int x, int y, int z) { if(x < 0 || y < 0 || z < 0 || x >= CHUNK_SIZE || y >= WORLD_HEIGHT || z >= CHUNK_SIZE) return 0; return x + CHUNK_SIZE * (z + CHUNK_SIZE * y); diff --git a/src/helpers/vars.hpp b/src/helpers/vars.hpp index f3bd8e8..77f91c4 100644 --- a/src/helpers/vars.hpp +++ b/src/helpers/vars.hpp @@ -102,7 +102,7 @@ #define TPS 30.0 #define TPS_DIV 1.0 / TPS //Rendering -#define RENDER_DISTANCE 2 +#define RENDER_DISTANCE 5 #define RENDER_DISTANCE_SQUARED RENDER_DISTANCE*RENDER_DISTANCE //Game stuff