Shaders don't use blockID anymore. Fixes #48.

This commit is contained in:
Quentin Bazin 2020-02-19 19:30:07 +09:00
parent a7ecdf1aa4
commit cb356b4a3b
12 changed files with 83 additions and 77 deletions

View File

@ -91,22 +91,21 @@ void InventoryCube::updateVertexBuffer(const Block &block) {
blockTexCoords.x + blockTexCoords.width, blockTexCoords.y, blockTexCoords.x + blockTexCoords.width, blockTexCoords.y,
blockTexCoords.x, 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[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[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; vertices[j + i * 4].coord3d[2] = vertices[j + i * 4].coord3d[2] * block.boundingBox().depth + block.boundingBox().z;
}
}
gk::Color color = gk::Color::White; vertices[j + i * 4].texCoord[0] = faceTexCoords[j * 2];
for (u8 i = 0 ; i < 6 * 4 ; ++i) { vertices[j + i * 4].texCoord[1] = faceTexCoords[j * 2 + 1];
vertices[i].color[0] = color.r;
vertices[i].color[1] = color.g; const gk::Color &colorMultiplier = block.colorMultiplier();
vertices[i].color[2] = color.b; vertices[j + i * 4].color[0] = colorMultiplier.r;
vertices[i].color[3] = color.a; 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); gk::VertexBuffer::bind(&m_vbo);

View File

@ -150,9 +150,10 @@ void GameState::initShaders() {
} }
void GameState::draw(gk::RenderTarget &target, gk::RenderStates states) const { void GameState::draw(gk::RenderTarget &target, gk::RenderStates states) const {
gk::Shader::bind(&m_shader); // FIXME: This uniform is not used anymore since water/leaves effects are disabled
m_shader.setUniform("u_time", gk::GameClock::getTicks()); // gk::Shader::bind(&m_shader);
gk::Shader::bind(nullptr); // m_shader.setUniform("u_time", gk::GameClock::getTicks());
// gk::Shader::bind(nullptr);
states.shader = &m_shader; states.shader = &m_shader;

View File

@ -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[1] = normal.y;
vertices[j].normal[2] = normal.z; vertices[j].normal[2] = normal.z;
vertices[j].color[0] = 1.0; const gk::Color colorMultiplier = block->colorMultiplier();
vertices[j].color[1] = 1.0; vertices[j].color[0] = colorMultiplier.r;
vertices[j].color[2] = 1.0; vertices[j].color[1] = colorMultiplier.g;
vertices[j].color[3] = 1.0; vertices[j].color[2] = colorMultiplier.b;
vertices[j].color[3] = colorMultiplier.a;
vertices[j].texCoord[0] = faceTexCoords[j * 2]; vertices[j].texCoord[0] = faceTexCoords[j * 2];
vertices[j].texCoord[1] = faceTexCoords[j * 2 + 1]; 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]); surroundingBlockPos[0], surroundingBlockPos[1], surroundingBlockPos[2]);
vertices[j].ambientOcclusion = getAmbientOcclusion(x, y, z, i, j, chunk); vertices[j].ambientOcclusion = getAmbientOcclusion(x, y, z, i, j, chunk);
vertices[j].blockType = block->id();
} }
auto addVertex = [&](u8 j) { 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[1] = normal.y;
vertices[j].normal[2] = normal.z; vertices[j].normal[2] = normal.z;
vertices[j].color[0] = 1.0; const gk::Color colorMultiplier = block->colorMultiplier();
vertices[j].color[1] = 1.0; vertices[j].color[0] = colorMultiplier.r;
vertices[j].color[2] = 1.0; vertices[j].color[1] = colorMultiplier.g;
vertices[j].color[3] = 1.0; vertices[j].color[2] = colorMultiplier.b;
vertices[j].color[3] = colorMultiplier.a;
vertices[j].texCoord[0] = faceTexCoords[j * 2]; vertices[j].texCoord[0] = faceTexCoords[j * 2];
vertices[j].texCoord[1] = faceTexCoords[j * 2 + 1]; 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].lightValue[1] = chunk.lightmap().getTorchlight(x, y, z);
vertices[j].ambientOcclusion = 5; vertices[j].ambientOcclusion = 5;
vertices[j].blockType = block->id();
} }
m_vertices[Layer::Flora].emplace_back(vertices[0]); m_vertices[Layer::Flora].emplace_back(vertices[0]);

View File

@ -29,6 +29,7 @@
#include <gk/core/Box.hpp> #include <gk/core/Box.hpp>
#include <gk/core/IntTypes.hpp> #include <gk/core/IntTypes.hpp>
#include <gk/graphics/Color.hpp>
#include "ItemStack.hpp" #include "ItemStack.hpp"
#include "ISerializable.hpp" #include "ISerializable.hpp"
@ -93,6 +94,9 @@ class Block : public ISerializable {
bool isLightSource() const { return m_isLightSource; } bool isLightSource() const { return m_isLightSource; }
void setLightSource(bool isLightSource) { m_isLightSource = 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: protected:
glm::vec4 getTexCoordsFromID(int textureID) const; glm::vec4 getTexCoordsFromID(int textureID) const;
@ -119,6 +123,8 @@ class Block : public ISerializable {
bool m_isOpaque = true; bool m_isOpaque = true;
bool m_isLightSource = false; bool m_isLightSource = false;
gk::Color m_colorMultiplier = gk::Color::White;
}; };
#endif // BLOCK_HPP_ #endif // BLOCK_HPP_

View File

@ -44,7 +44,8 @@ void Block::serialize(sf::Packet &packet) const {
<< m_hardness << m_harvestRequirements << m_itemDrop << m_itemDropAmount << m_tiles << m_hardness << m_harvestRequirements << m_itemDrop << m_itemDropAmount << m_tiles
<< m_boundingBox.x << m_boundingBox.y << m_boundingBox.z << m_boundingBox.x << m_boundingBox.y << m_boundingBox.z
<< m_boundingBox.width << m_boundingBox.height << m_boundingBox.depth << 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) { 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_harvestRequirements >> m_itemDrop >> m_itemDropAmount >> m_tiles
>> m_boundingBox.x >> m_boundingBox.y >> m_boundingBox.z >> m_boundingBox.x >> m_boundingBox.y >> m_boundingBox.z
>> m_boundingBox.width >> m_boundingBox.height >> m_boundingBox.depth >> 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_id = id;
m_drawType = BlockDrawType(drawType); m_drawType = BlockDrawType(drawType);

View File

@ -39,6 +39,8 @@ mod:block {
id = "grass", id = "grass",
name = "Grass", name = "Grass",
tiles = {"grass_block_top.png", "dirt.png", "grass_block_side.png"}, tiles = {"grass_block_top.png", "dirt.png", "grass_block_side.png"},
color_multiplier = {129, 191, 91, 255},
item_drop = { item_drop = {
id = mod:id()..":dirt", id = mod:id()..":dirt",
amount = 1 amount = 1
@ -49,6 +51,7 @@ mod:block {
id = "leaves", id = "leaves",
name = "Leaves", name = "Leaves",
tiles = "oak_leaves.png", tiles = "oak_leaves.png",
color_multiplier = {106, 173, 51, 255},
hardness = 0.5, hardness = 0.5,
draw_type = 2, -- FIXME: Use string instead draw_type = 2, -- FIXME: Use string instead
-- is_opaque = false, -- FIXME -- is_opaque = false, -- FIXME
@ -83,6 +86,7 @@ mod:block {
id = "water", id = "water",
name = "Water", name = "Water",
tiles = "water.png", tiles = "water.png",
color_multiplier = {51, 115, 255, 217},
draw_type = 3, -- FIXME: Use string instead draw_type = 3, -- FIXME: Use string instead
is_opaque = false, is_opaque = false,
} }

View File

@ -1,7 +1,8 @@
#version 120 #version 120
varying vec4 v_color; varying vec4 v_coord3d;
varying vec2 v_texCoord; varying vec2 v_texCoord;
varying vec4 v_color;
varying float v_faceValue; varying float v_faceValue;
uniform sampler2D u_tex; uniform sampler2D u_tex;
@ -12,8 +13,11 @@ void main() {
vec4 color = v_color; vec4 color = v_color;
if (v_texCoord.x != -1 && v_texCoord.y != -1) { if (v_texCoord.x != -1 && v_texCoord.y != -1) {
vec4 texColor = texture2D(u_tex, v_texCoord); color = texture2D(u_tex, v_texCoord);
color = vec4(texColor.rgb - (1 - color.rgb), min(texColor.a, color.a));
if (color.r == color.g && color.g == color.b) {
color *= v_color;
}
} }
// if (u_renderType == -1) { // if (u_renderType == -1) {

View File

@ -1,12 +1,12 @@
#version 120 #version 120
attribute vec4 color;
attribute vec4 coord3d; attribute vec4 coord3d;
attribute vec2 texCoord; attribute vec2 texCoord;
attribute vec4 color;
varying vec4 v_color;
varying vec4 v_coord3d; varying vec4 v_coord3d;
varying vec2 v_texCoord; varying vec2 v_texCoord;
varying vec4 v_color;
varying float v_faceValue; varying float v_faceValue;
uniform mat4 u_modelMatrix; uniform mat4 u_modelMatrix;

View File

@ -3,18 +3,12 @@
varying vec4 v_color; varying vec4 v_color;
varying vec2 v_texCoord; varying vec2 v_texCoord;
varying float v_blockID;
uniform sampler2D u_tex; uniform sampler2D u_tex;
vec4 getColor() { vec4 getColor() {
vec4 color = v_color;
// if(color == vec4(0, 0, 0, 1)) {
if (v_texCoord.x != -1 && v_texCoord.y != -1) { if (v_texCoord.x != -1 && v_texCoord.y != -1) {
vec4 texColor = texture2D(u_tex, v_texCoord); return texture2D(u_tex, v_texCoord);
color = vec4(texColor.rgb - (1 - color.rgb), min(texColor.a, color.a));
} }
return color; return v_color;
} }

View File

@ -1,11 +1,11 @@
#version 120 #version 120
varying vec4 v_coord3d; varying vec4 v_coord3d;
varying vec4 v_color;
varying vec2 v_lightValue; varying vec2 v_lightValue;
varying float v_ambientOcclusion; varying float v_ambientOcclusion;
varying float v_blockFace; varying float v_blockFace;
varying float v_blockID;
varying float v_dist; varying float v_dist;
uniform int u_renderDistance; uniform int u_renderDistance;
@ -22,32 +22,20 @@ vec4 fog(vec4 color, float fogCoord, float fogStart, float fogEnd);
void main() { void main() {
// Needed to prevent bad interpolation on some systems // Needed to prevent bad interpolation on some systems
// Refer to #23 for more informations // Refer to #23 for more informations
float blockID = floor(v_blockID + 0.5);
float blockFace = floor(v_blockFace + 0.5); float blockFace = floor(v_blockFace + 0.5);
float lightCheck = floor(v_lightValue.x + 0.5); float lightCheck = floor(v_lightValue.x + 0.5);
// Discard if the pixel is too far away // 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(); vec4 color = getColor();
if (blockID == 8.) { // Water if (v_blockFace != -1 && color != v_color && color.r == color.g && color.g == color.b) {
color.a = 0.85; color *= v_color;
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); */
}
} }
// Very cheap "transparency": don't draw pixels with a low alpha value // 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 // FIXME: FINISH THIS WITH PROPER CODE AND SUN BASIC DISPLAY
// int maxTime = 5 * 1000; // int maxTime = 5 * 1000;

View File

@ -5,18 +5,16 @@ attribute vec4 coord3d;
attribute vec3 normal; attribute vec3 normal;
attribute vec2 texCoord; attribute vec2 texCoord;
attribute vec2 lightValue; attribute vec2 lightValue;
attribute float blockType;
attribute float ambientOcclusion; attribute float ambientOcclusion;
varying vec4 v_color;
varying vec4 v_coord3d; varying vec4 v_coord3d;
varying vec4 v_color;
varying vec4 v_normal; varying vec4 v_normal;
varying vec2 v_texCoord; varying vec2 v_texCoord;
varying vec2 v_lightValue; varying vec2 v_lightValue;
varying float v_ambientOcclusion; varying float v_ambientOcclusion;
varying float v_blockFace; varying float v_blockFace;
varying float v_blockID;
varying float v_dist; varying float v_dist;
uniform mat4 u_modelMatrix; uniform mat4 u_modelMatrix;
@ -24,24 +22,27 @@ uniform mat4 u_projectionMatrix;
uniform mat4 u_viewMatrix; uniform mat4 u_viewMatrix;
uniform int u_renderDistance; uniform int u_renderDistance;
uniform int u_time; // uniform int u_time;
void main() { void main() {
vec3 finalPos = coord3d.xyz; // FIXME: This code won't work anymore because of 'blockType' attibute removal
if (blockType == 8) { // Water // One way to get those effects back would be to add another attribute 'effect'
// finalPos.y += sin((u_time / 1000.0 + mod(finalPos.x, 16)) * 1.75) / 10.0; // with values: 'NONE', 'LIQUID', 'LEAVES'
// finalPos.y += cos((u_time / 1000.0 + mod(finalPos.z, 16)) * 1.75) / 10.0; // vec3 finalPos = coord3d.xyz;
// finalPos.y -= 0.25; // if (blockType == 8) { // Water
// finalPos.y -= 1.0 / 16.0; // // finalPos.y += sin((u_time / 1000.0 + mod(finalPos.x, 16)) * 1.75) / 10.0;
finalPos.y += sin(u_time / 1000.0) / 16.0 - 0.125; // // finalPos.y += cos((u_time / 1000.0 + mod(finalPos.z, 16)) * 1.75) / 10.0;
} // // finalPos.y -= 0.25;
else if (blockType == 4) { // Leaves // // finalPos.y -= 1.0 / 16.0;
finalPos.xz += sin((u_time / 1000.0 + finalPos.x) * 2) / 30.0; // finalPos.y += sin(u_time / 1000.0) / 16.0 - 0.125;
finalPos.xz += cos((u_time / 1000.0 + finalPos.z) * 2) / 30.0; // }
} // 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 // 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_normal = vec4(normal, 1.0);
v_color = color; v_color = color;
@ -56,7 +57,6 @@ void main() {
} }
v_blockFace = coord3d.w; v_blockFace = coord3d.w;
v_blockID = blockType;
// Distance from eye // Distance from eye
v_dist = length(u_viewMatrix * v_coord3d); v_dist = length(u_viewMatrix * v_coord3d);

View File

@ -71,6 +71,16 @@ void LuaMod::registerBlock(const sol::table &table) {
block.setItemDrop(dropID, dropAmount); block.setItemDrop(dropID, dropAmount);
} }
sol::optional<sol::table> colorMultiplier = table["color_multiplier"];
if (colorMultiplier != sol::nullopt) {
block.setColorMultiplier(gk::Color{
colorMultiplier.value().get<u8>(1),
colorMultiplier.value().get<u8>(2),
colorMultiplier.value().get<u8>(3),
colorMultiplier.value().get<u8>(4)
});
}
Registry::getInstance().registerItem(block.tiles(), stringID, label).setIsBlock(true); Registry::getInstance().registerItem(block.tiles(), stringID, label).setIsBlock(true);
} }