]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/client/wieldmesh.cpp
Remove unused ITextSceneNode header (#11476)
[dragonfireclient.git] / src / client / wieldmesh.cpp
index e76bbfa9ea7a43ef2d5f0b49b526e427661b96ab..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;
 }
@@ -307,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());
 
@@ -524,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)
@@ -536,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