]> git.lizzy.rs Git - minetest.git/commitdiff
refacto: don't use RenderingEngine singleton on CAO
authorLoic Blot <loic.blot@unix-experience.fr>
Thu, 29 Apr 2021 07:07:36 +0000 (09:07 +0200)
committerLoïc Blot <nerzhul@users.noreply.github.com>
Mon, 3 May 2021 17:49:19 +0000 (19:49 +0200)
* we don't need on CAO side more than SceneManager, and temporary. Pass only required SceneManager as a parameter to build CAO and add them to the current scene
* Use temporary the RenderingEngine singleton from ClientEnvironment, waitfor for better solution
* Make ClientActiveObject::addToScene virtual function mandatory to be defined by children to ensure we don't forget to properly define it

src/client/clientenvironment.cpp
src/client/clientobject.h
src/client/content_cao.cpp
src/client/content_cao.h
src/unittest/test_clientactiveobjectmgr.cpp

index 1bdf5390d2fe7ac06be900837fe31ccfeb4aa3f3..9c40484bfaf17c7fecb756ce5118ab2d55064dcc 100644 (file)
@@ -352,7 +352,7 @@ u16 ClientEnvironment::addActiveObject(ClientActiveObject *object)
        if (!m_ao_manager.registerObject(object))
                return 0;
 
-       object->addToScene(m_texturesource);
+       object->addToScene(m_texturesource, RenderingEngine::get_scene_manager());
 
        // Update lighting immediately
        object->updateLight(getDayNightRatio());
index ecd8059ef758c2a556fd18ae2396acc7a5d9bd3d..dbc2f22cfc1a5390ddb8bf87b4d151279ca4b9eb 100644 (file)
@@ -33,13 +33,17 @@ class LocalPlayer;
 struct ItemStack;
 class WieldMeshSceneNode;
 
+namespace irr { namespace scene {
+       class ISceneManager;
+}}
+
 class ClientActiveObject : public ActiveObject
 {
 public:
        ClientActiveObject(u16 id, Client *client, ClientEnvironment *env);
        virtual ~ClientActiveObject();
 
-       virtual void addToScene(ITextureSource *tsrc) {}
+       virtual void addToScene(ITextureSource *tsrc, irr::scene::ISceneManager *smgr) = 0;
        virtual void removeFromScene(bool permanent) {}
 
        virtual void updateLight(u32 day_night_ratio) {}
index 63b8821f4ccf2300557ff7ef08a6dd70e973fce0..a2fbbf001c9739f2a6936e750fe8bfeb542c1b23 100644 (file)
@@ -24,7 +24,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include <IMeshManipulator.h>
 #include <IAnimatedMeshSceneNode.h>
 #include "client/client.h"
-#include "client/renderingengine.h"
 #include "client/sound.h"
 #include "client/tile.h"
 #include "util/basic_macros.h"
@@ -189,7 +188,7 @@ class TestCAO : public ClientActiveObject
 
        static ClientActiveObject* create(Client *client, ClientEnvironment *env);
 
-       void addToScene(ITextureSource *tsrc);
+       void addToScene(ITextureSource *tsrc, irr::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, irr::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();
 }
@@ -591,9 +590,9 @@ void GenericCAO::removeFromScene(bool permanent)
                m_client->getMinimap()->removeMarker(&m_marker);
 }
 
-void GenericCAO::addToScene(ITextureSource *tsrc)
+void GenericCAO::addToScene(ITextureSource *tsrc, irr::scene::ISceneManager *smgr)
 {
-       m_smgr = RenderingEngine::get_scene_manager();
+       m_smgr = smgr;
 
        if (getSceneNode() != NULL) {
                return;
@@ -625,8 +624,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 +642,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 +727,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 +736,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 +749,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 +790,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"));
 
@@ -1074,7 +1068,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) {
index cc026d34edb31c463e89ad668c34e606b67fc956..32ec9c1c38b10f17a5b24c96f2408dfae1a93157 100644 (file)
@@ -236,7 +236,7 @@ class GenericCAO : public ClientActiveObject
 
        void removeFromScene(bool permanent);
 
-       void addToScene(ITextureSource *tsrc);
+       void addToScene(ITextureSource *tsrc, irr::scene::ISceneManager *smgr);
 
        inline void expireVisuals()
        {
index 4d2846c8dffd471169f9f7948cc28f7cc8b6de14..a43855c197aee700da6bf47350d8fefa4ffd3b7e 100644 (file)
@@ -29,6 +29,7 @@ class TestClientActiveObject : public ClientActiveObject
        TestClientActiveObject() : ClientActiveObject(0, nullptr, nullptr) {}
        ~TestClientActiveObject() = default;
        ActiveObjectType getType() const { return ACTIVEOBJECT_TYPE_TEST; }
+       virtual void addToScene(ITextureSource *tsrc, irr::scene::ISceneManager *smgr) {}
 };
 
 class TestClientActiveObjectMgr : public TestBase