From 225c5ea912082a569ab7cfa193eb977539ce9199 Mon Sep 17 00:00:00 2001 From: Vitaliy Date: Wed, 16 Feb 2022 19:18:23 +0300 Subject: [PATCH] Fix wieldmesh transparency (#36) * Drop bumpmapping support * Internalize postProcessNodeMesh and drop unused parameters * Fix wieldmesh transparency --- src/client/mapblock_mesh.cpp | 9 ---- src/client/tile.h | 5 --- src/client/wieldmesh.cpp | 80 ++++++++++++++++++------------------ src/client/wieldmesh.h | 11 ----- src/nodedef.cpp | 5 --- 5 files changed, 41 insertions(+), 69 deletions(-) diff --git a/src/client/mapblock_mesh.cpp b/src/client/mapblock_mesh.cpp index 2da570c23..82d4e8f9e 100644 --- a/src/client/mapblock_mesh.cpp +++ b/src/client/mapblock_mesh.cpp @@ -1158,9 +1158,6 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset): material.MaterialType = m_shdrsrc->getShaderInfo( p.layer.shader_id).material; p.layer.applyMaterialOptionsWithShaders(material); - if (p.layer.normal_texture) - material.setTexture(1, p.layer.normal_texture); - material.setTexture(2, p.layer.flags_texture); } else { p.layer.applyMaterialOptions(material); } @@ -1263,12 +1260,6 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, const FrameSpec &animation_frame = (*tile.frames)[frame]; buf->getMaterial().setTexture(0, animation_frame.texture); - if (m_enable_shaders) { - if (animation_frame.normal_texture) - buf->getMaterial().setTexture(1, - animation_frame.normal_texture); - buf->getMaterial().setTexture(2, animation_frame.flags_texture); - } } // Day-night transition diff --git a/src/client/tile.h b/src/client/tile.h index aa462bb98..50e7c26ae 100644 --- a/src/client/tile.h +++ b/src/client/tile.h @@ -176,8 +176,6 @@ struct FrameSpec u32 texture_id = 0; video::ITexture *texture = nullptr; - video::ITexture *normal_texture = nullptr; - video::ITexture *flags_texture = nullptr; }; #define MAX_TILE_LAYERS 2 @@ -263,11 +261,8 @@ struct TileLayer // Ordered for size, please do not reorder video::ITexture *texture = nullptr; - video::ITexture *normal_texture = nullptr; - video::ITexture *flags_texture = nullptr; u32 shader_id = 0; - u32 texture_id = 0; u16 animation_frame_length_ms = 0; diff --git a/src/client/wieldmesh.cpp b/src/client/wieldmesh.cpp index e256bf604..c214413a1 100644 --- a/src/client/wieldmesh.cpp +++ b/src/client/wieldmesh.cpp @@ -40,6 +40,15 @@ with this program; if not, write to the Free Software Foundation, Inc., #define MIN_EXTRUSION_MESH_RESOLUTION 16 #define MAX_EXTRUSION_MESH_RESOLUTION 512 +/*! + * Applies overlays, textures and materials to the given mesh and + * extracts tile colors for colorization. + * \param colors returns the colors of the mesh buffers in the mesh. + */ +static void postProcessCubeMesh(scene::SMesh *mesh, const ContentFeatures &f, + IShaderSource *shader_source, std::string const &shader_name, + std::vector *colors); + static scene::IMesh *createExtrusionMesh(int resolution_x, int resolution_y) { const f32 r = 0.5; @@ -229,18 +238,6 @@ WieldMeshSceneNode::~WieldMeshSceneNode() g_extrusion_mesh_cache = nullptr; } -void WieldMeshSceneNode::setCube(const ContentFeatures &f, - v3f wield_scale) -{ - scene::IMesh *cubemesh = g_extrusion_mesh_cache->createCube(); - scene::SMesh *copy = cloneMesh(cubemesh); - cubemesh->drop(); - postProcessNodeMesh(copy, f, false, true, &m_material_type, &m_colors, true); - changeToMesh(copy); - copy->drop(); - m_meshnode->setScale(wield_scale * WIELD_SCALE_FACTOR); -} - void WieldMeshSceneNode::setExtruded(const std::string &imagename, const std::string &overlay_name, v3f wield_scale, ITextureSource *tsrc, u8 num_frames) @@ -303,7 +300,7 @@ void WieldMeshSceneNode::setExtruded(const std::string &imagename, } } -scene::SMesh *createSpecialNodeMesh(Client *client, content_t id, std::vector *colors, const ContentFeatures &f) +static scene::SMesh *createSpecialNodeMesh(Client *client, content_t id, std::vector *colors, const ContentFeatures &f, std::string const shader_name = {}) { MeshMakeData mesh_make_data(client, false); MeshCollector collector; @@ -321,6 +318,7 @@ scene::SMesh *createSpecialNodeMesh(Client *client, content_t id, std::vectorgetShaderSource(); colors->clear(); scene::SMesh *mesh = new scene::SMesh(); for (auto &prebuffers : collector.prebuffers) @@ -328,14 +326,20 @@ scene::SMesh *createSpecialNodeMesh(Client *client, content_t id, std::vectorMaterial.setTexture(0, p.layer.texture); - p.layer.applyMaterialOptions(buf->Material); + if (!shader_name.empty()) { + auto shader_id = shader_source->getShader(shader_name, (MaterialType)p.layer.material_type, f.drawtype); + buf->Material.MaterialType = shader_source->getShaderInfo(shader_id).material; + p.layer.applyMaterialOptionsWithShaders(buf->Material); + } else { + p.layer.applyMaterialOptions(buf->Material); + } + buf->Material.MaterialTypeParam = 0.0f; mesh->addMeshBuffer(buf); buf->append(&p.vertices[0], p.vertices.size(), &p.indices[0], p.indices.size()); @@ -410,12 +414,19 @@ void WieldMeshSceneNode::setItem(const ItemStack &item, Client *client, bool che } case NDT_NORMAL: case NDT_ALLFACES: - case NDT_LIQUID: - setCube(f, def.wield_scale); + case NDT_LIQUID: { + scene::IMesh *cubemesh = g_extrusion_mesh_cache->createCube(); + scene::SMesh *copy = cloneMesh(cubemesh); + cubemesh->drop(); + postProcessCubeMesh(copy, f, shdrsrc, "object_shader", &m_colors); + changeToMesh(copy); + copy->drop(); + m_meshnode->setScale(def.wield_scale * WIELD_SCALE_FACTOR); break; + } default: // Render non-trivial drawtypes like the actual node - mesh = createSpecialNodeMesh(client, id, &m_colors, f); + mesh = createSpecialNodeMesh(client, id, &m_colors, f, "object_shader"); changeToMesh(mesh); mesh->drop(); m_meshnode->setScale( @@ -427,8 +438,6 @@ void WieldMeshSceneNode::setItem(const ItemStack &item, Client *client, bool che u32 material_count = m_meshnode->getMaterialCount(); for (u32 i = 0; i < material_count; ++i) { video::SMaterial &material = m_meshnode->getMaterial(i); - material.MaterialType = m_material_type; - material.MaterialTypeParam = 0.5f; material.setFlag(video::EMF_BACK_FACE_CULLING, cull_backface); material.setFlag(video::EMF_BILINEAR_FILTER, m_bilinear_filter); material.setFlag(video::EMF_TRILINEAR_FILTER, m_trilinear_filter); @@ -513,6 +522,7 @@ void WieldMeshSceneNode::changeToMesh(scene::IMesh *mesh) m_meshnode->setVisible(true); } +// Only used for inventory images void getItemMesh(Client *client, const ItemStack &item, ItemMesh *result) { ITextureSource *tsrc = client->getTextureSource(); @@ -560,8 +570,7 @@ void getItemMesh(Client *client, const ItemStack &item, ItemMesh *result) } else scaleMesh(mesh, v3f(1.2, 1.2, 1.2)); // add overlays - postProcessNodeMesh(mesh, f, false, false, nullptr, - &result->buffer_colors, true); + postProcessCubeMesh(mesh, f, nullptr, {}, &result->buffer_colors); if (f.drawtype == NDT_ALLFACES) scaleMesh(mesh, v3f(f.visual_scale)); break; @@ -655,9 +664,9 @@ scene::SMesh *getExtrudedMesh(ITextureSource *tsrc, return mesh; } -void postProcessNodeMesh(scene::SMesh *mesh, const ContentFeatures &f, - bool use_shaders, bool set_material, const video::E_MATERIAL_TYPE *mattype, - std::vector *colors, bool apply_scale) +static void postProcessCubeMesh(scene::SMesh *mesh, const ContentFeatures &f, + IShaderSource *shader_source, std::string const &shader_name, + std::vector *colors) { u32 mc = mesh->getMeshBufferCount(); // Allocate colors for existing buffers @@ -684,28 +693,21 @@ void postProcessNodeMesh(scene::SMesh *mesh, const ContentFeatures &f, (*colors)[i] = ItemPartColor(layer->has_color, layer->color); } video::SMaterial &material = buf->getMaterial(); - if (set_material) + if (shader_source && !shader_name.empty()) { + auto shader_id = shader_source->getShader(shader_name, (MaterialType)layer->material_type, NDT_ALLFACES); + material.MaterialType = shader_source->getShaderInfo(shader_id).material; + layer->applyMaterialOptionsWithShaders(material); + } else { layer->applyMaterialOptions(material); - if (mattype) { - material.MaterialType = *mattype; } + material.MaterialTypeParam = 0.0f; if (layer->animation_frame_count > 1) { const FrameSpec &animation_frame = (*layer->frames)[0]; material.setTexture(0, animation_frame.texture); } else { material.setTexture(0, layer->texture); } - if (use_shaders) { - if (layer->normal_texture) { - if (layer->animation_frame_count > 1) { - const FrameSpec &animation_frame = (*layer->frames)[0]; - material.setTexture(1, animation_frame.normal_texture); - } else - material.setTexture(1, layer->normal_texture); - } - material.setTexture(2, layer->flags_texture); - } - if (apply_scale && tile->world_aligned) { + if (tile->world_aligned) { u32 n = buf->getVertexCount(); for (u32 k = 0; k != n; ++k) buf->getTCoords(k) /= layer->scale; diff --git a/src/client/wieldmesh.h b/src/client/wieldmesh.h index 11ce1b6b2..b98d3c815 100644 --- a/src/client/wieldmesh.h +++ b/src/client/wieldmesh.h @@ -130,14 +130,3 @@ void getItemMesh(Client *client, const ItemStack &item, ItemMesh *result); scene::SMesh *getExtrudedMesh(ITextureSource *tsrc, const std::string &imagename, const std::string &overlay_name); - -/*! - * Applies overlays, textures and optionally materials to the given mesh and - * extracts tile colors for colorization. - * \param mattype overrides the buffer's material type, but can also - * be NULL to leave the original material. - * \param colors returns the colors of the mesh buffers in the mesh. - */ -void postProcessNodeMesh(scene::SMesh *mesh, const ContentFeatures &f, bool use_shaders, - bool set_material, const video::E_MATERIAL_TYPE *mattype, - std::vector *colors, bool apply_scale = false); diff --git a/src/nodedef.cpp b/src/nodedef.cpp index fe5aa044c..019a96014 100644 --- a/src/nodedef.cpp +++ b/src/nodedef.cpp @@ -909,8 +909,6 @@ static void fillTileAttribs(ITextureSource *tsrc, TileLayer *layer, if (!tile.world_aligned) layer->scale = 1; - layer->flags_texture = tsrc->getShaderFlagsTexture(layer->normal_texture ? true : false); - // Material flags layer->material_flags = 0; if (backface_culling) @@ -958,9 +956,6 @@ static void fillTileAttribs(ITextureSource *tsrc, TileLayer *layer, layer->texture->getOriginalSize(), i); frame.texture = tsrc->getTextureForMesh(os.str(), &frame.texture_id); - if (layer->normal_texture) - frame.normal_texture = tsrc->getNormalTexture(os.str()); - frame.flags_texture = layer->flags_texture; (*layer->frames)[i] = frame; } }