From 80a4d2d35a4cde0ac406492c2f5a91cd388742df Mon Sep 17 00:00:00 2001 From: IntegratedQuantum Date: Tue, 12 Mar 2024 11:42:35 +0100 Subject: [PATCH] The fog data is now part of the texture. This is not really optimal, as this doesn't ensure that all textures of a block have the same fog, but this is an important step towards not storing the block id on the GPU and additionally this allows changing the fog of a block in future resource packs. --- assets/cubyz/blocks/fog/blue.json | 5 +- assets/cubyz/blocks/fog/cyan.json | 5 +- assets/cubyz/blocks/fog/green.json | 5 +- assets/cubyz/blocks/fog/magenta.json | 5 +- assets/cubyz/blocks/fog/red.json | 5 +- assets/cubyz/blocks/fog/yellow.json | 5 +- .../blocks/textures/{fog.png => fog/blue.png} | Bin .../textures/fog/blue.png_textureInfo.json | 4 ++ assets/cubyz/blocks/textures/fog/cyan.png | Bin 0 -> 4794 bytes .../textures/fog/cyan.png_textureInfo.json | 4 ++ assets/cubyz/blocks/textures/fog/green.png | Bin 0 -> 4794 bytes .../textures/fog/green.png_textureInfo.json | 4 ++ assets/cubyz/blocks/textures/fog/magenta.png | Bin 0 -> 4794 bytes .../textures/fog/magenta.png_textureInfo.json | 4 ++ assets/cubyz/blocks/textures/fog/red.png | Bin 0 -> 4794 bytes .../textures/fog/red.png_textureInfo.json | 4 ++ assets/cubyz/blocks/textures/fog/yellow.png | Bin 0 -> 4794 bytes .../textures/fog/yellow.png_textureInfo.json | 4 ++ .../textures/water.png_textureInfo.json | 4 ++ .../textures/water_1.png_textureInfo.json | 4 ++ .../textures/water_2.png_textureInfo.json | 4 ++ assets/cubyz/blocks/water.json | 3 +- .../shaders/animation_pre_processing.glsl | 2 - assets/cubyz/shaders/chunks/chunk_fragment.fs | 12 +++- .../shaders/chunks/transparent_fragment.fs | 20 ++++--- assets/cubyz/shaders/item_drop.fs | 2 - src/blocks.zig | 54 ++++++++++++++---- src/graphics.zig | 14 ++--- 28 files changed, 121 insertions(+), 52 deletions(-) rename assets/cubyz/blocks/textures/{fog.png => fog/blue.png} (100%) create mode 100644 assets/cubyz/blocks/textures/fog/blue.png_textureInfo.json create mode 100644 assets/cubyz/blocks/textures/fog/cyan.png create mode 100644 assets/cubyz/blocks/textures/fog/cyan.png_textureInfo.json create mode 100644 assets/cubyz/blocks/textures/fog/green.png create mode 100644 assets/cubyz/blocks/textures/fog/green.png_textureInfo.json create mode 100644 assets/cubyz/blocks/textures/fog/magenta.png create mode 100644 assets/cubyz/blocks/textures/fog/magenta.png_textureInfo.json create mode 100644 assets/cubyz/blocks/textures/fog/red.png create mode 100644 assets/cubyz/blocks/textures/fog/red.png_textureInfo.json create mode 100644 assets/cubyz/blocks/textures/fog/yellow.png create mode 100644 assets/cubyz/blocks/textures/fog/yellow.png_textureInfo.json create mode 100644 assets/cubyz/blocks/textures/water.png_textureInfo.json create mode 100644 assets/cubyz/blocks/textures/water_1.png_textureInfo.json create mode 100644 assets/cubyz/blocks/textures/water_2.png_textureInfo.json diff --git a/assets/cubyz/blocks/fog/blue.json b/assets/cubyz/blocks/fog/blue.json index 21d969d29..13c4a86e6 100644 --- a/assets/cubyz/blocks/fog/blue.json +++ b/assets/cubyz/blocks/fog/blue.json @@ -6,10 +6,9 @@ ], "degradable" : true, "transparent" : true, + "hasBackFace" : true, "absorbedLight" : 0x010100, - "fogDensity" : 0.02, - "fogColor" : 0x0000ff, "model" : "cube", - "texture" : "cubyz:fog" + "texture" : "cubyz:fog/blue" } diff --git a/assets/cubyz/blocks/fog/cyan.json b/assets/cubyz/blocks/fog/cyan.json index a351e885e..d3cb2843f 100644 --- a/assets/cubyz/blocks/fog/cyan.json +++ b/assets/cubyz/blocks/fog/cyan.json @@ -6,10 +6,9 @@ ], "degradable" : true, "transparent" : true, + "hasBackFace" : true, "absorbedLight" : 0x010000, - "fogDensity" : 0.02, - "fogColor" : 0x00ffff, "model" : "cube", - "texture" : "cubyz:fog" + "texture" : "cubyz:fog/cyan" } diff --git a/assets/cubyz/blocks/fog/green.json b/assets/cubyz/blocks/fog/green.json index 1930fbf7b..47c51829d 100644 --- a/assets/cubyz/blocks/fog/green.json +++ b/assets/cubyz/blocks/fog/green.json @@ -6,10 +6,9 @@ ], "degradable" : true, "transparent" : true, + "hasBackFace" : true, "absorbedLight" : 0x010001, - "fogDensity" : 0.02, - "fogColor" : 0x00ff00, "model" : "cube", - "texture" : "cubyz:fog" + "texture" : "cubyz:fog/green" } diff --git a/assets/cubyz/blocks/fog/magenta.json b/assets/cubyz/blocks/fog/magenta.json index b199e7bd4..8a1f336c5 100644 --- a/assets/cubyz/blocks/fog/magenta.json +++ b/assets/cubyz/blocks/fog/magenta.json @@ -6,10 +6,9 @@ ], "degradable" : true, "transparent" : true, + "hasBackFace" : true, "absorbedLight" : 0x000100, - "fogDensity" : 0.02, - "fogColor" : 0xff00ff, "model" : "cube", - "texture" : "cubyz:fog" + "texture" : "cubyz:fog/magenta" } diff --git a/assets/cubyz/blocks/fog/red.json b/assets/cubyz/blocks/fog/red.json index c24cda30d..539f36f11 100644 --- a/assets/cubyz/blocks/fog/red.json +++ b/assets/cubyz/blocks/fog/red.json @@ -6,10 +6,9 @@ ], "degradable" : true, "transparent" : true, + "hasBackFace" : true, "absorbedLight" : 0x000101, - "fogDensity" : 0.02, - "fogColor" : 0xff0000, "model" : "cube", - "texture" : "cubyz:fog" + "texture" : "cubyz:fog/red" } diff --git a/assets/cubyz/blocks/fog/yellow.json b/assets/cubyz/blocks/fog/yellow.json index d520cf802..52baec257 100644 --- a/assets/cubyz/blocks/fog/yellow.json +++ b/assets/cubyz/blocks/fog/yellow.json @@ -6,10 +6,9 @@ ], "degradable" : true, "transparent" : true, + "hasBackFace" : true, "absorbedLight" : 0x000001, - "fogDensity" : 0.02, - "fogColor" : 0xffff00, "model" : "cube", - "texture" : "cubyz:fog" + "texture" : "cubyz:fog/yellow" } diff --git a/assets/cubyz/blocks/textures/fog.png b/assets/cubyz/blocks/textures/fog/blue.png similarity index 100% rename from assets/cubyz/blocks/textures/fog.png rename to assets/cubyz/blocks/textures/fog/blue.png diff --git a/assets/cubyz/blocks/textures/fog/blue.png_textureInfo.json b/assets/cubyz/blocks/textures/fog/blue.png_textureInfo.json new file mode 100644 index 000000000..1a05b5f41 --- /dev/null +++ b/assets/cubyz/blocks/textures/fog/blue.png_textureInfo.json @@ -0,0 +1,4 @@ +{ + "fogDensity" : 0.02, + "fogColor" : 0x0000ff, +} diff --git a/assets/cubyz/blocks/textures/fog/cyan.png b/assets/cubyz/blocks/textures/fog/cyan.png new file mode 100644 index 0000000000000000000000000000000000000000..7ea0bace6a51d4cd2532574a64e61206aba6c36c GIT binary patch literal 4794 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 tHDc5>7i3t*Q(&?W^7ob5w4qDJ#)45EG~_~*ek!