From cdbe3c5e5784b34e548c58b08579ff55b3096fb9 Mon Sep 17 00:00:00 2001 From: Danila Shutov Date: Sun, 19 Apr 2020 19:47:13 +0300 Subject: Reuse object_shader for "wielditem" and "item" entity drawtypes (#9537) --- src/client/wieldmesh.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'src/client/wieldmesh.cpp') diff --git a/src/client/wieldmesh.cpp b/src/client/wieldmesh.cpp index 2c6807fab..997eb1b5b 100644 --- a/src/client/wieldmesh.cpp +++ b/src/client/wieldmesh.cpp @@ -347,7 +347,7 @@ void WieldMeshSceneNode::setItem(const ItemStack &item, Client *client, bool che scene::SMesh *mesh = nullptr; if (m_enable_shaders) { - u32 shader_id = shdrsrc->getShader("wielded_shader", TILE_MATERIAL_BASIC, NDT_NORMAL); + u32 shader_id = shdrsrc->getShader("object_shader", TILE_MATERIAL_BASIC, NDT_NORMAL); m_material_type = shdrsrc->getShaderInfo(shader_id).material; } @@ -471,6 +471,21 @@ void WieldMeshSceneNode::setColor(video::SColor c) } } +void WieldMeshSceneNode::setNodeLightColor(video::SColor color) +{ + if (!m_meshnode) + return; + + if (m_enable_shaders) { + for (u32 i = 0; i < m_meshnode->getMaterialCount(); ++i) { + video::SMaterial &material = m_meshnode->getMaterial(i); + material.EmissiveColor = color; + } + } else { + setColor(color); + } +} + void WieldMeshSceneNode::render() { // note: if this method is changed to actually do something, -- cgit v1.2.3 From fe3e69eb4029626cd7ef3f7a1c2beaec13ba7364 Mon Sep 17 00:00:00 2001 From: Danila Shutov Date: Tue, 9 Jun 2020 22:38:09 +0300 Subject: Fix broken coloring of wielditems (#9969) Fixes a regression that appeared in 5.3.0-dev. --- client/shaders/object_shader/opengl_fragment.glsl | 4 +++- client/shaders/object_shader/opengl_vertex.glsl | 7 ++++++- src/client/wieldmesh.cpp | 10 +++++++--- 3 files changed, 16 insertions(+), 5 deletions(-) (limited to 'src/client/wieldmesh.cpp') diff --git a/client/shaders/object_shader/opengl_fragment.glsl b/client/shaders/object_shader/opengl_fragment.glsl index 32f3e974e..0534dc049 100644 --- a/client/shaders/object_shader/opengl_fragment.glsl +++ b/client/shaders/object_shader/opengl_fragment.glsl @@ -145,8 +145,10 @@ void main(void) vec4 col = vec4(color.rgb, base.a); + col.rgb *= gl_Color.rgb; + col.rgb *= emissiveColor.rgb * vIDiff; - + #ifdef ENABLE_TONE_MAPPING col = applyToneMapping(col); #endif diff --git a/client/shaders/object_shader/opengl_vertex.glsl b/client/shaders/object_shader/opengl_vertex.glsl index 488089392..59171145f 100644 --- a/client/shaders/object_shader/opengl_vertex.glsl +++ b/client/shaders/object_shader/opengl_vertex.glsl @@ -38,7 +38,12 @@ void main(void) lightVec = sunPosition - worldPosition; eyeVec = -(gl_ModelViewMatrix * gl_Vertex).xyz; - vIDiff = directional_ambient(normalize(gl_Normal)); + + // This is intentional comparison with zero without any margin. + // If normal is not equal to zero exactly, then we assume it's a valid, just not normalized vector + vIDiff = length(gl_Normal) == 0.0 + ? 1.0 + : directional_ambient(normalize(gl_Normal)); gl_FrontColor = gl_BackColor = gl_Color; } diff --git a/src/client/wieldmesh.cpp b/src/client/wieldmesh.cpp index 997eb1b5b..8cd3e29a9 100644 --- a/src/client/wieldmesh.cpp +++ b/src/client/wieldmesh.cpp @@ -467,7 +467,11 @@ void WieldMeshSceneNode::setColor(video::SColor c) bc.getGreen() * green / 255, bc.getBlue() * blue / 255); scene::IMeshBuffer *buf = mesh->getMeshBuffer(j); - colorizeMeshBuffer(buf, &buffercolor); + + if (m_enable_shaders) + setMeshBufferColor(buf, buffercolor); + else + colorizeMeshBuffer(buf, &buffercolor); } } @@ -481,9 +485,9 @@ void WieldMeshSceneNode::setNodeLightColor(video::SColor color) video::SMaterial &material = m_meshnode->getMaterial(i); material.EmissiveColor = color; } - } else { - setColor(color); } + + setColor(color); } void WieldMeshSceneNode::render() -- cgit v1.2.3