Skip to content

Commit 809e68f

Browse files
committedMay 3, 2021
refacto: don't use RenderingEngine singleton on CAO
* 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
1 parent 1bc8556 commit 809e68f

File tree

5 files changed

+20
-21
lines changed

5 files changed

+20
-21
lines changed
 

Diff for: ‎src/client/clientenvironment.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ u16 ClientEnvironment::addActiveObject(ClientActiveObject *object)
352352
if (!m_ao_manager.registerObject(object))
353353
return 0;
354354

355-
object->addToScene(m_texturesource);
355+
object->addToScene(m_texturesource, RenderingEngine::get_scene_manager());
356356

357357
// Update lighting immediately
358358
object->updateLight(getDayNightRatio());

Diff for: ‎src/client/clientobject.h

+5-1
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,17 @@ class LocalPlayer;
3333
struct ItemStack;
3434
class WieldMeshSceneNode;
3535

36+
namespace irr { namespace scene {
37+
class ISceneManager;
38+
}}
39+
3640
class ClientActiveObject : public ActiveObject
3741
{
3842
public:
3943
ClientActiveObject(u16 id, Client *client, ClientEnvironment *env);
4044
virtual ~ClientActiveObject();
4145

42-
virtual void addToScene(ITextureSource *tsrc) {}
46+
virtual void addToScene(ITextureSource *tsrc, irr::scene::ISceneManager *smgr) = 0;
4347
virtual void removeFromScene(bool permanent) {}
4448

4549
virtual void updateLight(u32 day_night_ratio) {}

Diff for: ‎src/client/content_cao.cpp

+12-18
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
2424
#include <IMeshManipulator.h>
2525
#include <IAnimatedMeshSceneNode.h>
2626
#include "client/client.h"
27-
#include "client/renderingengine.h"
2827
#include "client/sound.h"
2928
#include "client/tile.h"
3029
#include "util/basic_macros.h"
@@ -189,7 +188,7 @@ class TestCAO : public ClientActiveObject
189188

190189
static ClientActiveObject* create(Client *client, ClientEnvironment *env);
191190

192-
void addToScene(ITextureSource *tsrc);
191+
void addToScene(ITextureSource *tsrc, irr::scene::ISceneManager *smgr);
193192
void removeFromScene(bool permanent);
194193
void updateLight(u32 day_night_ratio);
195194
void updateNodePos();
@@ -220,7 +219,7 @@ ClientActiveObject* TestCAO::create(Client *client, ClientEnvironment *env)
220219
return new TestCAO(client, env);
221220
}
222221

223-
void TestCAO::addToScene(ITextureSource *tsrc)
222+
void TestCAO::addToScene(ITextureSource *tsrc, irr::scene::ISceneManager *smgr)
224223
{
225224
if(m_node != NULL)
226225
return;
@@ -249,7 +248,7 @@ void TestCAO::addToScene(ITextureSource *tsrc)
249248
// Add to mesh
250249
mesh->addMeshBuffer(buf);
251250
buf->drop();
252-
m_node = RenderingEngine::get_scene_manager()->addMeshSceneNode(mesh, NULL);
251+
m_node = smgr->addMeshSceneNode(mesh, NULL);
253252
mesh->drop();
254253
updateNodePos();
255254
}
@@ -591,9 +590,9 @@ void GenericCAO::removeFromScene(bool permanent)
591590
m_client->getMinimap()->removeMarker(&m_marker);
592591
}
593592

594-
void GenericCAO::addToScene(ITextureSource *tsrc)
593+
void GenericCAO::addToScene(ITextureSource *tsrc, irr::scene::ISceneManager *smgr)
595594
{
596-
m_smgr = RenderingEngine::get_scene_manager();
595+
m_smgr = smgr;
597596

598597
if (getSceneNode() != NULL) {
599598
return;
@@ -625,8 +624,7 @@ void GenericCAO::addToScene(ITextureSource *tsrc)
625624
}
626625

627626
auto grabMatrixNode = [this] {
628-
m_matrixnode = RenderingEngine::get_scene_manager()->
629-
addDummyTransformationSceneNode();
627+
m_matrixnode = m_smgr->addDummyTransformationSceneNode();
630628
m_matrixnode->grab();
631629
};
632630

@@ -644,7 +642,7 @@ void GenericCAO::addToScene(ITextureSource *tsrc)
644642

645643
if (m_prop.visual == "sprite") {
646644
grabMatrixNode();
647-
m_spritenode = RenderingEngine::get_scene_manager()->addBillboardSceneNode(
645+
m_spritenode = m_smgr->addBillboardSceneNode(
648646
m_matrixnode, v2f(1, 1), v3f(0,0,0), -1);
649647
m_spritenode->grab();
650648
m_spritenode->setMaterialTexture(0,
@@ -729,8 +727,7 @@ void GenericCAO::addToScene(ITextureSource *tsrc)
729727
mesh->addMeshBuffer(buf);
730728
buf->drop();
731729
}
732-
m_meshnode = RenderingEngine::get_scene_manager()->
733-
addMeshSceneNode(mesh, m_matrixnode);
730+
m_meshnode = m_smgr->addMeshSceneNode(mesh, m_matrixnode);
734731
m_meshnode->grab();
735732
mesh->drop();
736733
// Set it to use the materials of the meshbuffers directly.
@@ -739,8 +736,7 @@ void GenericCAO::addToScene(ITextureSource *tsrc)
739736
} else if (m_prop.visual == "cube") {
740737
grabMatrixNode();
741738
scene::IMesh *mesh = createCubeMesh(v3f(BS,BS,BS));
742-
m_meshnode = RenderingEngine::get_scene_manager()->
743-
addMeshSceneNode(mesh, m_matrixnode);
739+
m_meshnode = m_smgr->addMeshSceneNode(mesh, m_matrixnode);
744740
m_meshnode->grab();
745741
mesh->drop();
746742

@@ -753,8 +749,7 @@ void GenericCAO::addToScene(ITextureSource *tsrc)
753749
grabMatrixNode();
754750
scene::IAnimatedMesh *mesh = m_client->getMesh(m_prop.mesh, true);
755751
if (mesh) {
756-
m_animated_meshnode = RenderingEngine::get_scene_manager()->
757-
addAnimatedMeshSceneNode(mesh, m_matrixnode);
752+
m_animated_meshnode = m_smgr->addAnimatedMeshSceneNode(mesh, m_matrixnode);
758753
m_animated_meshnode->grab();
759754
mesh->drop(); // The scene node took hold of it
760755

@@ -795,8 +790,7 @@ void GenericCAO::addToScene(ITextureSource *tsrc)
795790
infostream << "serialized form: " << m_prop.wield_item << std::endl;
796791
item.deSerialize(m_prop.wield_item, m_client->idef());
797792
}
798-
m_wield_meshnode = new WieldMeshSceneNode(
799-
RenderingEngine::get_scene_manager(), -1);
793+
m_wield_meshnode = new WieldMeshSceneNode(m_smgr, -1);
800794
m_wield_meshnode->setItem(item, m_client,
801795
(m_prop.visual == "wielditem"));
802796

@@ -1074,7 +1068,7 @@ void GenericCAO::step(float dtime, ClientEnvironment *env)
10741068
}
10751069

10761070
removeFromScene(false);
1077-
addToScene(m_client->tsrc());
1071+
addToScene(m_client->tsrc(), m_smgr);
10781072

10791073
// Attachments, part 2: Now that the parent has been refreshed, put its attachments back
10801074
for (u16 cao_id : m_attachment_child_ids) {

Diff for: ‎src/client/content_cao.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ class GenericCAO : public ClientActiveObject
236236

237237
void removeFromScene(bool permanent);
238238

239-
void addToScene(ITextureSource *tsrc);
239+
void addToScene(ITextureSource *tsrc, irr::scene::ISceneManager *smgr);
240240

241241
inline void expireVisuals()
242242
{

Diff for: ‎src/unittest/test_clientactiveobjectmgr.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class TestClientActiveObject : public ClientActiveObject
2929
TestClientActiveObject() : ClientActiveObject(0, nullptr, nullptr) {}
3030
~TestClientActiveObject() = default;
3131
ActiveObjectType getType() const { return ACTIVEOBJECT_TYPE_TEST; }
32+
virtual void addToScene(ITextureSource *tsrc, irr::scene::ISceneManager *smgr) {}
3233
};
3334

3435
class TestClientActiveObjectMgr : public TestBase

0 commit comments

Comments
 (0)