diff --git a/client/source/gui/InventoryCube.cpp b/client/source/gui/InventoryCube.cpp index 3c13dcb80..8eeff0e37 100644 --- a/client/source/gui/InventoryCube.cpp +++ b/client/source/gui/InventoryCube.cpp @@ -91,22 +91,21 @@ void InventoryCube::updateVertexBuffer(const Block &block) { blockTexCoords.x + blockTexCoords.width, blockTexCoords.y, blockTexCoords.x, blockTexCoords.y }; - for(u8 j = 0 ; j < 4 ; j++) { - vertices[j + i * 4].texCoord[0] = faceTexCoords[j * 2]; - vertices[j + i * 4].texCoord[1] = faceTexCoords[j * 2 + 1]; + for(u8 j = 0 ; j < 4 ; j++) { vertices[j + i * 4].coord3d[0] = vertices[j + i * 4].coord3d[0] * block.boundingBox().width + block.boundingBox().x; vertices[j + i * 4].coord3d[1] = vertices[j + i * 4].coord3d[1] * block.boundingBox().height + block.boundingBox().y; vertices[j + i * 4].coord3d[2] = vertices[j + i * 4].coord3d[2] * block.boundingBox().depth + block.boundingBox().z; - } - } - gk::Color color = gk::Color::White; - for (u8 i = 0 ; i < 6 * 4 ; ++i) { - vertices[i].color[0] = color.r; - vertices[i].color[1] = color.g; - vertices[i].color[2] = color.b; - vertices[i].color[3] = color.a; + vertices[j + i * 4].texCoord[0] = faceTexCoords[j * 2]; + vertices[j + i * 4].texCoord[1] = faceTexCoords[j * 2 + 1]; + + const gk::Color &colorMultiplier = block.colorMultiplier(); + vertices[j + i * 4].color[0] = colorMultiplier.r; + vertices[j + i * 4].color[1] = colorMultiplier.g; + vertices[j + i * 4].color[2] = colorMultiplier.b; + vertices[j + i * 4].color[3] = colorMultiplier.a; + } } gk::VertexBuffer::bind(&m_vbo); diff --git a/client/source/states/GameState.cpp b/client/source/states/GameState.cpp index b8a1267c9..6d2cbca14 100644 --- a/client/source/states/GameState.cpp +++ b/client/source/states/GameState.cpp @@ -150,9 +150,10 @@ void GameState::initShaders() { } void GameState::draw(gk::RenderTarget &target, gk::RenderStates states) const { - gk::Shader::bind(&m_shader); - m_shader.setUniform("u_time", gk::GameClock::getTicks()); - gk::Shader::bind(nullptr); + // FIXME: This uniform is not used anymore since water/leaves effects are disabled + // gk::Shader::bind(&m_shader); + // m_shader.setUniform("u_time", gk::GameClock::getTicks()); + // gk::Shader::bind(nullptr); states.shader = &m_shader; diff --git a/client/source/world/ChunkBuilder.cpp b/client/source/world/ChunkBuilder.cpp index 6d370a0a8..81a7df206 100644 --- a/client/source/world/ChunkBuilder.cpp +++ b/client/source/world/ChunkBuilder.cpp @@ -184,10 +184,11 @@ inline void ChunkBuilder::addFace(u8 x, u8 y, u8 z, u8 i, const ClientChunk &chu vertices[j].normal[1] = normal.y; vertices[j].normal[2] = normal.z; - vertices[j].color[0] = 1.0; - vertices[j].color[1] = 1.0; - vertices[j].color[2] = 1.0; - vertices[j].color[3] = 1.0; + const gk::Color colorMultiplier = block->colorMultiplier(); + vertices[j].color[0] = colorMultiplier.r; + vertices[j].color[1] = colorMultiplier.g; + vertices[j].color[2] = colorMultiplier.b; + vertices[j].color[3] = colorMultiplier.a; vertices[j].texCoord[0] = faceTexCoords[j * 2]; vertices[j].texCoord[1] = faceTexCoords[j * 2 + 1]; @@ -206,8 +207,6 @@ inline void ChunkBuilder::addFace(u8 x, u8 y, u8 z, u8 i, const ClientChunk &chu surroundingBlockPos[0], surroundingBlockPos[1], surroundingBlockPos[2]); vertices[j].ambientOcclusion = getAmbientOcclusion(x, y, z, i, j, chunk); - - vertices[j].blockType = block->id(); } auto addVertex = [&](u8 j) { @@ -262,10 +261,11 @@ inline void ChunkBuilder::addCross(u8 x, u8 y, u8 z, const ClientChunk &chunk, c vertices[j].normal[1] = normal.y; vertices[j].normal[2] = normal.z; - vertices[j].color[0] = 1.0; - vertices[j].color[1] = 1.0; - vertices[j].color[2] = 1.0; - vertices[j].color[3] = 1.0; + const gk::Color colorMultiplier = block->colorMultiplier(); + vertices[j].color[0] = colorMultiplier.r; + vertices[j].color[1] = colorMultiplier.g; + vertices[j].color[2] = colorMultiplier.b; + vertices[j].color[3] = colorMultiplier.a; vertices[j].texCoord[0] = faceTexCoords[j * 2]; vertices[j].texCoord[1] = faceTexCoords[j * 2 + 1]; @@ -274,8 +274,6 @@ inline void ChunkBuilder::addCross(u8 x, u8 y, u8 z, const ClientChunk &chunk, c vertices[j].lightValue[1] = chunk.lightmap().getTorchlight(x, y, z); vertices[j].ambientOcclusion = 5; - - vertices[j].blockType = block->id(); } m_vertices[Layer::Flora].emplace_back(vertices[0]); diff --git a/common/include/world/Block.hpp b/common/include/world/Block.hpp index 40e8668d7..6c0d40ddd 100644 --- a/common/include/world/Block.hpp +++ b/common/include/world/Block.hpp @@ -29,6 +29,7 @@ #include #include +#include #include "ItemStack.hpp" #include "ISerializable.hpp" @@ -93,6 +94,9 @@ class Block : public ISerializable { bool isLightSource() const { return m_isLightSource; } void setLightSource(bool isLightSource) { m_isLightSource = isLightSource; } + const gk::Color &colorMultiplier() const { return m_colorMultiplier; } + void setColorMultiplier(const gk::Color &colorMultiplier) { m_colorMultiplier = colorMultiplier; } + protected: glm::vec4 getTexCoordsFromID(int textureID) const; @@ -119,6 +123,8 @@ class Block : public ISerializable { bool m_isOpaque = true; bool m_isLightSource = false; + + gk::Color m_colorMultiplier = gk::Color::White; }; #endif // BLOCK_HPP_ diff --git a/common/source/world/Block.cpp b/common/source/world/Block.cpp index 55e806185..cfa2a3cbd 100644 --- a/common/source/world/Block.cpp +++ b/common/source/world/Block.cpp @@ -44,7 +44,8 @@ void Block::serialize(sf::Packet &packet) const { << m_hardness << m_harvestRequirements << m_itemDrop << m_itemDropAmount << m_tiles << m_boundingBox.x << m_boundingBox.y << m_boundingBox.z << m_boundingBox.width << m_boundingBox.height << m_boundingBox.depth - << m_isLightSource << m_canUpdate << m_canBeActivated; + << m_isLightSource << m_canUpdate << m_canBeActivated + << m_colorMultiplier.r << m_colorMultiplier.g << m_colorMultiplier.b << m_colorMultiplier.a; } void Block::deserialize(sf::Packet &packet) { @@ -55,7 +56,8 @@ void Block::deserialize(sf::Packet &packet) { >> m_harvestRequirements >> m_itemDrop >> m_itemDropAmount >> m_tiles >> m_boundingBox.x >> m_boundingBox.y >> m_boundingBox.z >> m_boundingBox.width >> m_boundingBox.height >> m_boundingBox.depth - >> m_isLightSource >> m_canUpdate >> m_canBeActivated; + >> m_isLightSource >> m_canUpdate >> m_canBeActivated + >> m_colorMultiplier.r >> m_colorMultiplier.g >> m_colorMultiplier.b >> m_colorMultiplier.a; m_id = id; m_drawType = BlockDrawType(drawType); diff --git a/mods/default/blocks.lua b/mods/default/blocks.lua index 21ace4d48..c4188069a 100644 --- a/mods/default/blocks.lua +++ b/mods/default/blocks.lua @@ -39,6 +39,8 @@ mod:block { id = "grass", name = "Grass", tiles = {"grass_block_top.png", "dirt.png", "grass_block_side.png"}, + color_multiplier = {129, 191, 91, 255}, + item_drop = { id = mod:id()..":dirt", amount = 1 @@ -49,6 +51,7 @@ mod:block { id = "leaves", name = "Leaves", tiles = "oak_leaves.png", + color_multiplier = {106, 173, 51, 255}, hardness = 0.5, draw_type = 2, -- FIXME: Use string instead -- is_opaque = false, -- FIXME @@ -83,6 +86,7 @@ mod:block { id = "water", name = "Water", tiles = "water.png", + color_multiplier = {51, 115, 255, 217}, draw_type = 3, -- FIXME: Use string instead is_opaque = false, } diff --git a/resources/shaders/basic.f.glsl b/resources/shaders/basic.f.glsl index 6883a255d..5e077e37e 100644 --- a/resources/shaders/basic.f.glsl +++ b/resources/shaders/basic.f.glsl @@ -1,7 +1,8 @@ #version 120 -varying vec4 v_color; +varying vec4 v_coord3d; varying vec2 v_texCoord; +varying vec4 v_color; varying float v_faceValue; uniform sampler2D u_tex; @@ -12,8 +13,11 @@ void main() { vec4 color = v_color; if (v_texCoord.x != -1 && v_texCoord.y != -1) { - vec4 texColor = texture2D(u_tex, v_texCoord); - color = vec4(texColor.rgb - (1 - color.rgb), min(texColor.a, color.a)); + color = texture2D(u_tex, v_texCoord); + + if (color.r == color.g && color.g == color.b) { + color *= v_color; + } } // if (u_renderType == -1) { diff --git a/resources/shaders/basic.v.glsl b/resources/shaders/basic.v.glsl index 88499bb5c..b7bd30b10 100644 --- a/resources/shaders/basic.v.glsl +++ b/resources/shaders/basic.v.glsl @@ -1,12 +1,12 @@ #version 120 -attribute vec4 color; attribute vec4 coord3d; attribute vec2 texCoord; +attribute vec4 color; -varying vec4 v_color; varying vec4 v_coord3d; varying vec2 v_texCoord; +varying vec4 v_color; varying float v_faceValue; uniform mat4 u_modelMatrix; diff --git a/resources/shaders/color.f.glsl b/resources/shaders/color.f.glsl index 0546a61cc..8b3ea4402 100644 --- a/resources/shaders/color.f.glsl +++ b/resources/shaders/color.f.glsl @@ -3,18 +3,12 @@ varying vec4 v_color; varying vec2 v_texCoord; -varying float v_blockID; - uniform sampler2D u_tex; vec4 getColor() { - vec4 color = v_color; - - // if(color == vec4(0, 0, 0, 1)) { if (v_texCoord.x != -1 && v_texCoord.y != -1) { - vec4 texColor = texture2D(u_tex, v_texCoord); - color = vec4(texColor.rgb - (1 - color.rgb), min(texColor.a, color.a)); + return texture2D(u_tex, v_texCoord); } - return color; + return v_color; } diff --git a/resources/shaders/game.f.glsl b/resources/shaders/game.f.glsl index 8df2ec141..3076e55e4 100644 --- a/resources/shaders/game.f.glsl +++ b/resources/shaders/game.f.glsl @@ -1,11 +1,11 @@ #version 120 varying vec4 v_coord3d; +varying vec4 v_color; varying vec2 v_lightValue; varying float v_ambientOcclusion; varying float v_blockFace; -varying float v_blockID; varying float v_dist; uniform int u_renderDistance; @@ -22,32 +22,20 @@ vec4 fog(vec4 color, float fogCoord, float fogStart, float fogEnd); void main() { // Needed to prevent bad interpolation on some systems // Refer to #23 for more informations - float blockID = floor(v_blockID + 0.5); float blockFace = floor(v_blockFace + 0.5); float lightCheck = floor(v_lightValue.x + 0.5); // Discard if the pixel is too far away - if(blockID != -1. && v_dist > u_renderDistance) discard; + if(v_blockFace != -1. && v_dist > u_renderDistance) discard; + // Get current pixel color and apply multiplier on grayscale textures vec4 color = getColor(); - if (blockID == 8.) { // Water - color.a = 0.85; - color += vec4(-0.8, -0.4, 0.2, 0); - } - else if (blockID == 4.) { // Leaves - color += vec4(-0.5, -0.15, -0.4, 0); - /* if (v_dist > 20 && color.a == 0) */ - /* color.a = 0.5; */ - } - else if (blockID == 3.) { // Grass - if (color.r == color.g && color.r == color.b) { - color += vec4(-0.3, -0.1, -0.25, 0); - /* color += vec4(-0.4, -0.15, -0.3, 0); */ - } + if (v_blockFace != -1 && color != v_color && color.r == color.g && color.g == color.b) { + color *= v_color; } // Very cheap "transparency": don't draw pixels with a low alpha value - if(color.a < 0.3 && blockID != -1.) discard; + if(color.a < 0.3 && v_blockFace != -1.) discard; // FIXME: FINISH THIS WITH PROPER CODE AND SUN BASIC DISPLAY // int maxTime = 5 * 1000; diff --git a/resources/shaders/game.v.glsl b/resources/shaders/game.v.glsl index 36b4086fa..5cce1e989 100644 --- a/resources/shaders/game.v.glsl +++ b/resources/shaders/game.v.glsl @@ -5,18 +5,16 @@ attribute vec4 coord3d; attribute vec3 normal; attribute vec2 texCoord; attribute vec2 lightValue; -attribute float blockType; attribute float ambientOcclusion; -varying vec4 v_color; varying vec4 v_coord3d; +varying vec4 v_color; varying vec4 v_normal; varying vec2 v_texCoord; varying vec2 v_lightValue; varying float v_ambientOcclusion; varying float v_blockFace; -varying float v_blockID; varying float v_dist; uniform mat4 u_modelMatrix; @@ -24,24 +22,27 @@ uniform mat4 u_projectionMatrix; uniform mat4 u_viewMatrix; uniform int u_renderDistance; -uniform int u_time; +// uniform int u_time; void main() { - vec3 finalPos = coord3d.xyz; - if (blockType == 8) { // Water - // finalPos.y += sin((u_time / 1000.0 + mod(finalPos.x, 16)) * 1.75) / 10.0; - // finalPos.y += cos((u_time / 1000.0 + mod(finalPos.z, 16)) * 1.75) / 10.0; - // finalPos.y -= 0.25; - // finalPos.y -= 1.0 / 16.0; - finalPos.y += sin(u_time / 1000.0) / 16.0 - 0.125; - } - else if (blockType == 4) { // Leaves - finalPos.xz += sin((u_time / 1000.0 + finalPos.x) * 2) / 30.0; - finalPos.xz += cos((u_time / 1000.0 + finalPos.z) * 2) / 30.0; - } + // FIXME: This code won't work anymore because of 'blockType' attibute removal + // One way to get those effects back would be to add another attribute 'effect' + // with values: 'NONE', 'LIQUID', 'LEAVES' + // vec3 finalPos = coord3d.xyz; + // if (blockType == 8) { // Water + // // finalPos.y += sin((u_time / 1000.0 + mod(finalPos.x, 16)) * 1.75) / 10.0; + // // finalPos.y += cos((u_time / 1000.0 + mod(finalPos.z, 16)) * 1.75) / 10.0; + // // finalPos.y -= 0.25; + // // finalPos.y -= 1.0 / 16.0; + // finalPos.y += sin(u_time / 1000.0) / 16.0 - 0.125; + // } + // else if (blockType == 4) { // Leaves + // finalPos.xz += sin((u_time / 1000.0 + finalPos.x) * 2) / 30.0; + // finalPos.xz += cos((u_time / 1000.0 + finalPos.z) * 2) / 30.0; + // } // Used for lighting - v_coord3d = u_modelMatrix * vec4(finalPos, 1.0); + v_coord3d = u_modelMatrix * vec4(coord3d.xyz, 1.0); v_normal = vec4(normal, 1.0); v_color = color; @@ -56,7 +57,6 @@ void main() { } v_blockFace = coord3d.w; - v_blockID = blockType; // Distance from eye v_dist = length(u_viewMatrix * v_coord3d); diff --git a/server/source/lua/LuaMod.cpp b/server/source/lua/LuaMod.cpp index 571305030..3268ea47e 100644 --- a/server/source/lua/LuaMod.cpp +++ b/server/source/lua/LuaMod.cpp @@ -71,6 +71,16 @@ void LuaMod::registerBlock(const sol::table &table) { block.setItemDrop(dropID, dropAmount); } + sol::optional colorMultiplier = table["color_multiplier"]; + if (colorMultiplier != sol::nullopt) { + block.setColorMultiplier(gk::Color{ + colorMultiplier.value().get(1), + colorMultiplier.value().get(2), + colorMultiplier.value().get(3), + colorMultiplier.value().get(4) + }); + } + Registry::getInstance().registerItem(block.tiles(), stringID, label).setIsBlock(true); }