]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/client/wieldmesh.cpp
Remove unused ITextSceneNode header (#11476)
[dragonfireclient.git] / src / client / wieldmesh.cpp
index 387eb17c38d84fa28bdaa775da7bd7a86fa788a3..7597aaa88223c63dc7653c1f01c344803a3bb66c 100644 (file)
@@ -33,6 +33,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "util/numeric.h"
 #include <map>
 #include <IMeshManipulator.h>
+#include "client/renderingengine.h"
 
 #define WIELD_SCALE_FACTOR 30.0
 #define WIELD_SCALE_FACTOR_EXTRUDED 40.0
@@ -220,11 +221,18 @@ WieldMeshSceneNode::WieldMeshSceneNode(scene::ISceneManager *mgr, s32 id, bool l
        m_meshnode->setReadOnlyMaterials(false);
        m_meshnode->setVisible(false);
        dummymesh->drop(); // m_meshnode grabbed it
+
+       m_shadow = RenderingEngine::get_shadow_renderer();
 }
 
 WieldMeshSceneNode::~WieldMeshSceneNode()
 {
        sanity_check(g_extrusion_mesh_cache);
+
+       // Remove node from shadow casters
+       if (m_shadow)
+               m_shadow->removeNodeFromShadowList(m_meshnode);
+
        if (g_extrusion_mesh_cache->drop())
                g_extrusion_mesh_cache = nullptr;
 }
@@ -294,9 +302,7 @@ void WieldMeshSceneNode::setExtruded(const std::string &imagename,
                }
                material.setFlag(video::EMF_ANISOTROPIC_FILTER, m_anisotropic_filter);
                // mipmaps cause "thin black line" artifacts
-#if (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR >= 8) || IRRLICHT_VERSION_MAJOR >= 2
                material.setFlag(video::EMF_USE_MIP_MAPS, false);
-#endif
                if (m_enable_shaders) {
                        material.setTexture(2, tsrc->getShaderFlagsTexture(false));
                }
@@ -309,18 +315,21 @@ static scene::SMesh *createSpecialNodeMesh(Client *client, MapNode n,
        MeshMakeData mesh_make_data(client, false);
        MeshCollector collector;
        mesh_make_data.setSmoothLighting(false);
-       MapblockMeshGenerator gen(&mesh_make_data, &collector);
+       MapblockMeshGenerator gen(&mesh_make_data, &collector,
+               client->getSceneManager()->getMeshManipulator());
 
        if (n.getParam2()) {
                // keep it
        } else if (f.param_type_2 == CPT2_WALLMOUNTED ||
                        f.param_type_2 == CPT2_COLORED_WALLMOUNTED) {
-               if (f.drawtype == NDT_TORCHLIKE)
-                       n.setParam2(1);
-               else if (f.drawtype == NDT_SIGNLIKE ||
+               if (f.drawtype == NDT_TORCHLIKE ||
+                               f.drawtype == NDT_SIGNLIKE ||
                                f.drawtype == NDT_NODEBOX ||
-                               f.drawtype == NDT_MESH)
+                               f.drawtype == NDT_MESH) {
                        n.setParam2(4);
+               }
+       } else if (f.drawtype == NDT_SIGNLIKE || f.drawtype == NDT_TORCHLIKE) {
+               n.setParam2(1);
        }
        gen.renderSingle(n.getContent(), n.getParam2());
 
@@ -395,7 +404,6 @@ void WieldMeshSceneNode::setItem(const ItemStack &item, Client *client, bool che
                case NDT_TORCHLIKE:
                case NDT_RAILLIKE:
                case NDT_PLANTLIKE:
-               case NDT_PLANTLIKE_ROOTED:
                case NDT_FLOWINGLIQUID: {
                        v3f wscale = def.wield_scale;
                        if (f.drawtype == NDT_FLOWINGLIQUID)
@@ -411,6 +419,15 @@ void WieldMeshSceneNode::setItem(const ItemStack &item, Client *client, bool che
                        m_colors.emplace_back(l1.has_color, l1.color);
                        break;
                }
+               case NDT_PLANTLIKE_ROOTED: {
+                       setExtruded(tsrc->getTextureName(f.special_tiles[0].layers[0].texture_id),
+                               "", def.wield_scale, tsrc,
+                               f.special_tiles[0].layers[0].animation_frame_count);
+                       // Add color
+                       const TileLayer &l0 = f.special_tiles[0].layers[0];
+                       m_colors.emplace_back(l0.has_color, l0.color);
+                       break;
+               }
                case NDT_NORMAL:
                case NDT_ALLFACES:
                case NDT_LIQUID:
@@ -518,6 +535,10 @@ void WieldMeshSceneNode::changeToMesh(scene::IMesh *mesh)
        // need to normalize normals when lighting is enabled (because of setScale())
        m_meshnode->setMaterialFlag(video::EMF_NORMALIZE_NORMALS, m_lighting);
        m_meshnode->setVisible(true);
+
+       // Add mesh to shadow caster
+       if (m_shadow)
+               m_shadow->addNodeToShadowList(m_meshnode);
 }
 
 void getItemMesh(Client *client, const ItemStack &item, ItemMesh *result)
@@ -530,7 +551,7 @@ void getItemMesh(Client *client, const ItemStack &item, ItemMesh *result)
        content_t id = ndef->getId(def.name);
 
        FATAL_ERROR_IF(!g_extrusion_mesh_cache, "Extrusion mesh cache is not yet initialized");
-       
+
        scene::SMesh *mesh = nullptr;
 
        // Shading is on by default