]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/client/content_cao.cpp
Remove unused ITextSceneNode header (#11476)
[dragonfireclient.git] / src / client / content_cao.cpp
index c52bc62c52d2e554c5bcebbf9b61c9ff13b5e5bb..c3ac613a5777c92227f3ee755222ac8cb4860a76 100644 (file)
@@ -20,7 +20,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "content_cao.h"
 #include <IBillboardSceneNode.h>
 #include <ICameraSceneNode.h>
-#include <ITextSceneNode.h>
 #include <IMeshManipulator.h>
 #include <IAnimatedMeshSceneNode.h>
 #include "client/client.h"
@@ -189,7 +188,7 @@ class TestCAO : public ClientActiveObject
 
        static ClientActiveObject* create(Client *client, ClientEnvironment *env);
 
-       void addToScene(ITextureSource *tsrc);
+       void addToScene(ITextureSource *tsrc, scene::ISceneManager *smgr);
        void removeFromScene(bool permanent);
        void updateLight(u32 day_night_ratio);
        void updateNodePos();
@@ -220,7 +219,7 @@ ClientActiveObject* TestCAO::create(Client *client, ClientEnvironment *env)
        return new TestCAO(client, env);
 }
 
-void TestCAO::addToScene(ITextureSource *tsrc)
+void TestCAO::addToScene(ITextureSource *tsrc, scene::ISceneManager *smgr)
 {
        if(m_node != NULL)
                return;
@@ -249,7 +248,7 @@ void TestCAO::addToScene(ITextureSource *tsrc)
        // Add to mesh
        mesh->addMeshBuffer(buf);
        buf->drop();
-       m_node = RenderingEngine::get_scene_manager()->addMeshSceneNode(mesh, NULL);
+       m_node = smgr->addMeshSceneNode(mesh, NULL);
        mesh->drop();
        updateNodePos();
 }
@@ -347,18 +346,6 @@ void GenericCAO::initialize(const std::string &data)
        infostream<<"GenericCAO: Got init data"<<std::endl;
        processInitData(data);
 
-       if (m_is_player) {
-               // Check if it's the current player
-               LocalPlayer *player = m_env->getLocalPlayer();
-               if (player && strcmp(player->getName(), m_name.c_str()) == 0) {
-                       m_is_local_player = true;
-                       m_is_visible = false;
-                       player->setCAO(this);
-
-                       m_prop.show_on_minimap = false;
-               }
-       }
-
        m_enable_shaders = g_settings->getBool("enable_shaders");
 }
 
@@ -381,6 +368,16 @@ void GenericCAO::processInitData(const std::string &data)
        m_rotation = readV3F32(is);
        m_hp = readU16(is);
 
+       if (m_is_player) {
+               // Check if it's the current player
+               LocalPlayer *player = m_env->getLocalPlayer();
+               if (player && strcmp(player->getName(), m_name.c_str()) == 0) {
+                       m_is_local_player = true;
+                       m_is_visible = false;
+                       player->setCAO(this);
+               }
+       }
+
        const u8 num_messages = readU8(is);
 
        for (int i = 0; i < num_messages; i++) {
@@ -558,6 +555,9 @@ void GenericCAO::removeFromScene(bool permanent)
                clearParentAttachment();
        }
 
+       if (auto shadow = RenderingEngine::get_shadow_renderer())
+               shadow->removeNodeFromShadowList(getSceneNode());
+
        if (m_meshnode) {
                m_meshnode->remove();
                m_meshnode->drop();
@@ -591,9 +591,9 @@ void GenericCAO::removeFromScene(bool permanent)
                m_client->getMinimap()->removeMarker(&m_marker);
 }
 
-void GenericCAO::addToScene(ITextureSource *tsrc)
+void GenericCAO::addToScene(ITextureSource *tsrc, scene::ISceneManager *smgr)
 {
-       m_smgr = RenderingEngine::get_scene_manager();
+       m_smgr = smgr;
 
        if (getSceneNode() != NULL) {
                return;
@@ -625,8 +625,7 @@ void GenericCAO::addToScene(ITextureSource *tsrc)
        }
 
        auto grabMatrixNode = [this] {
-               m_matrixnode = RenderingEngine::get_scene_manager()->
-                               addDummyTransformationSceneNode();
+               m_matrixnode = m_smgr->addDummyTransformationSceneNode();
                m_matrixnode->grab();
        };
 
@@ -644,7 +643,7 @@ void GenericCAO::addToScene(ITextureSource *tsrc)
 
        if (m_prop.visual == "sprite") {
                grabMatrixNode();
-               m_spritenode = RenderingEngine::get_scene_manager()->addBillboardSceneNode(
+               m_spritenode = m_smgr->addBillboardSceneNode(
                                m_matrixnode, v2f(1, 1), v3f(0,0,0), -1);
                m_spritenode->grab();
                m_spritenode->setMaterialTexture(0,
@@ -729,8 +728,7 @@ void GenericCAO::addToScene(ITextureSource *tsrc)
                        mesh->addMeshBuffer(buf);
                        buf->drop();
                }
-               m_meshnode = RenderingEngine::get_scene_manager()->
-                       addMeshSceneNode(mesh, m_matrixnode);
+               m_meshnode = m_smgr->addMeshSceneNode(mesh, m_matrixnode);
                m_meshnode->grab();
                mesh->drop();
                // Set it to use the materials of the meshbuffers directly.
@@ -739,8 +737,7 @@ void GenericCAO::addToScene(ITextureSource *tsrc)
        } else if (m_prop.visual == "cube") {
                grabMatrixNode();
                scene::IMesh *mesh = createCubeMesh(v3f(BS,BS,BS));
-               m_meshnode = RenderingEngine::get_scene_manager()->
-                       addMeshSceneNode(mesh, m_matrixnode);
+               m_meshnode = m_smgr->addMeshSceneNode(mesh, m_matrixnode);
                m_meshnode->grab();
                mesh->drop();
 
@@ -753,8 +750,7 @@ void GenericCAO::addToScene(ITextureSource *tsrc)
                grabMatrixNode();
                scene::IAnimatedMesh *mesh = m_client->getMesh(m_prop.mesh, true);
                if (mesh) {
-                       m_animated_meshnode = RenderingEngine::get_scene_manager()->
-                               addAnimatedMeshSceneNode(mesh, m_matrixnode);
+                       m_animated_meshnode = m_smgr->addAnimatedMeshSceneNode(mesh, m_matrixnode);
                        m_animated_meshnode->grab();
                        mesh->drop(); // The scene node took hold of it
 
@@ -795,8 +791,7 @@ void GenericCAO::addToScene(ITextureSource *tsrc)
                        infostream << "serialized form: " << m_prop.wield_item << std::endl;
                        item.deSerialize(m_prop.wield_item, m_client->idef());
                }
-               m_wield_meshnode = new WieldMeshSceneNode(
-                       RenderingEngine::get_scene_manager(), -1);
+               m_wield_meshnode = new WieldMeshSceneNode(m_smgr, -1);
                m_wield_meshnode->setItem(item, m_client,
                        (m_prop.visual == "wielditem"));
 
@@ -811,10 +806,13 @@ void GenericCAO::addToScene(ITextureSource *tsrc)
        if (m_reset_textures_timer < 0)
                updateTextures(m_current_texture_modifier);
 
-       scene::ISceneNode *node = getSceneNode();
+       if (scene::ISceneNode *node = getSceneNode()) {
+               if (m_matrixnode)
+                       node->setParent(m_matrixnode);
 
-       if (node && m_matrixnode)
-               node->setParent(m_matrixnode);
+               if (auto shadow = RenderingEngine::get_shadow_renderer())
+                       shadow->addNodeToShadowList(node);
+       }
 
        updateNametag();
        updateMarker();
@@ -934,7 +932,7 @@ void GenericCAO::updateNametag()
        if (m_is_local_player) // No nametag for local player
                return;
 
-       if (m_prop.nametag.empty()) {
+       if (m_prop.nametag.empty() || m_prop.nametag_color.getAlpha() == 0) {
                // Delete nametag
                if (m_nametag) {
                        m_client->getCamera()->removeNametag(m_nametag);
@@ -952,12 +950,14 @@ void GenericCAO::updateNametag()
        if (!m_nametag) {
                // Add nametag
                m_nametag = m_client->getCamera()->addNametag(node,
-                       m_prop.nametag, m_prop.nametag_color, pos);
+                       m_prop.nametag, m_prop.nametag_color,
+                       m_prop.nametag_bgcolor, pos);
        } else {
                // Update nametag
-               m_nametag->nametag_text = m_prop.nametag;
-               m_nametag->nametag_color = m_prop.nametag_color;
-               m_nametag->nametag_pos = pos;
+               m_nametag->text = m_prop.nametag;
+               m_nametag->textcolor = m_prop.nametag_color;
+               m_nametag->bgcolor = m_prop.nametag_bgcolor;
+               m_nametag->pos = pos;
        }
 }
 
@@ -1072,7 +1072,7 @@ void GenericCAO::step(float dtime, ClientEnvironment *env)
                }
 
                removeFromScene(false);
-               addToScene(m_client->tsrc());
+               addToScene(m_client->tsrc(), m_smgr);
 
                // Attachments, part 2: Now that the parent has been refreshed, put its attachments back
                for (u16 cao_id : m_attachment_child_ids) {
@@ -1165,7 +1165,7 @@ void GenericCAO::step(float dtime, ClientEnvironment *env)
                }
        }
 
-       if (!getParent() && std::fabs(m_prop.automatic_rotate) > 0.001) {
+       if (!getParent() && node && fabs(m_prop.automatic_rotate) > 0.001f) {
                // This is the child node's rotation. It is only used for automatic_rotate.
                v3f local_rot = node->getRotation();
                local_rot.Y = modulo360f(local_rot.Y - dtime * core::RADTODEG *
@@ -1174,7 +1174,7 @@ void GenericCAO::step(float dtime, ClientEnvironment *env)
        }
 
        if (!getParent() && m_prop.automatic_face_movement_dir &&
-                       (fabs(m_velocity.Z) > 0.001 || fabs(m_velocity.X) > 0.001)) {
+                       (fabs(m_velocity.Z) > 0.001f || fabs(m_velocity.X) > 0.001f)) {
                float target_yaw = atan2(m_velocity.Z, m_velocity.X) * 180 / M_PI
                                + m_prop.automatic_face_movement_dir_offset;
                float max_rotation_per_sec =
@@ -1471,11 +1471,8 @@ void GenericCAO::updateAnimation()
        if (m_animated_meshnode->getAnimationSpeed() != m_animation_speed)
                m_animated_meshnode->setAnimationSpeed(m_animation_speed);
        m_animated_meshnode->setTransitionTime(m_animation_blend);
-// Requires Irrlicht 1.8 or greater
-#if (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR >= 8) || IRRLICHT_VERSION_MAJOR > 1
        if (m_animated_meshnode->getLoopMode() != m_animation_loop)
                m_animated_meshnode->setLoopMode(m_animation_loop);
-#endif
 }
 
 void GenericCAO::updateAnimationSpeed()
@@ -1491,10 +1488,10 @@ void GenericCAO::updateBonePosition()
        if (m_bone_position.empty() || !m_animated_meshnode)
                return;
 
-       m_animated_meshnode->setJointMode(irr::scene::EJUOR_CONTROL); // To write positions to the mesh on render
+       m_animated_meshnode->setJointMode(scene::EJUOR_CONTROL); // To write positions to the mesh on render
        for (auto &it : m_bone_position) {
                std::string bone_name = it.first;
-               irr::scene::IBoneSceneNode* bone = m_animated_meshnode->getJointNode(bone_name.c_str());
+               scene::IBoneSceneNode* bone = m_animated_meshnode->getJointNode(bone_name.c_str());
                if (bone) {
                        bone->setPosition(it.second.X);
                        bone->setRotation(it.second.Y);
@@ -1503,7 +1500,7 @@ void GenericCAO::updateBonePosition()
 
        // search through bones to find mistakenly rotated bones due to bug in Irrlicht
        for (u32 i = 0; i < m_animated_meshnode->getJointCount(); ++i) {
-               irr::scene::IBoneSceneNode *bone = m_animated_meshnode->getJointNode(i);
+               scene::IBoneSceneNode *bone = m_animated_meshnode->getJointNode(i);
                if (!bone)
                        continue;
 
@@ -1919,13 +1916,23 @@ void GenericCAO::updateMeshCulling()
        if (!m_is_local_player)
                return;
 
-       // Grab the active player scene node so we know there's
-       // at least a mesh to occlude from the camera.
-       irr::scene::ISceneNode *node = getSceneNode();
+       const bool hidden = m_client->getCamera()->getCameraMode() == CAMERA_MODE_FIRST;
+
+       if (m_meshnode && m_prop.visual == "upright_sprite") {
+               u32 buffers = m_meshnode->getMesh()->getMeshBufferCount();
+               for (u32 i = 0; i < buffers; i++) {
+                       video::SMaterial &mat = m_meshnode->getMesh()->getMeshBuffer(i)->getMaterial();
+                       // upright sprite has no backface culling
+                       mat.setFlag(video::EMF_FRONT_FACE_CULLING, hidden);
+               }
+               return;
+       }
+
+       scene::ISceneNode *node = getSceneNode();
        if (!node)
                return;
 
-       if (m_client->getCamera()->getCameraMode() == CAMERA_MODE_FIRST) {
+       if (hidden) {
                // Hide the mesh by culling both front and
                // back faces. Serious hackyness but it works for our
                // purposes. This also preserves the skeletal armature.