@@ -259,15 +259,15 @@ void SceneManager::AddAnimation(std::shared_ptr<Animation> animation, const std:
259259 animations[lastAdded] = animation;
260260}
261261
262- void SceneManager::AddLight (Light* light, const std::string& name)
262+ void SceneManager::AddLight (std::shared_ptr< Light> light, const std::string& name)
263263{
264264 int nameCount = std::count_if (lights.begin (), lights.end (), [&](auto & p)
265265 { return p.first .find (name) != std::string::npos; });
266266
267267 lastAdded = name + (nameCount ? std::to_string (nameCount) : " " );
268- nodes[lastAdded] = (Node*)(light);
268+ nodes[lastAdded] = (Node*)(light. get () );
269269 lights[lastAdded] = light;
270- lightsVector.push_back (light);
270+ lightsVector.push_back (light. get () );
271271}
272272
273273void SceneManager::StoreBones (std::shared_ptr<Model> model, Bone* bone)
@@ -325,6 +325,21 @@ std::shared_ptr<Model> SceneManager::CreateModel(const std::string& name, Args&&
325325 return ret;
326326}
327327
328+ template <class ... Args>
329+ std::shared_ptr<Light> SceneManager::CreateLight (const std::string& name, Args&&... args)
330+ {
331+ auto ret = std::make_shared<Light>(args...);
332+ AddLight (ret, name);
333+ return ret;
334+ }
335+
336+ std::shared_ptr<Material> SceneManager::CreateMaterial (const std::string& name)
337+ {
338+ auto ret = std::make_shared<Material>();
339+ AddMaterial (ret, name);
340+ return ret;
341+ }
342+
328343void SceneManager::RemoveModel (std::shared_ptr<Model> model)
329344{
330345 auto it = std::find_if (models.begin (), models.end (), [&](auto & p) { return p.second == model; });
@@ -354,15 +369,15 @@ void SceneManager::RemoveAnimation(std::shared_ptr<Animation> animation)
354369 animations.erase (it);
355370}
356371
357- void SceneManager::RemoveLight (Light* light)
372+ void SceneManager::RemoveLight (std::shared_ptr< Light> light)
358373{
359374 auto it = std::find_if (lights.begin (), lights.end (), [&](auto & p) { return p.second == light; });
360- auto itn = std::find_if (nodes.begin (), nodes.end (), [&](auto & p) { return p.second == light; });
375+ auto itn = std::find_if (nodes.begin (), nodes.end (), [&](auto & p) { return p.second == light. get () ; });
361376 if (it != lights.end ())
362377 {
363378 lights.erase (it);
364379 nodes.erase (itn);
365- lightsVector.erase (std::find (lightsVector.begin (), lightsVector.end (), it->second ));
380+ lightsVector.erase (std::find (lightsVector.begin (), lightsVector.end (), it->second . get () ));
366381 }
367382}
368383
@@ -544,10 +559,10 @@ void SceneManager::Load(const std::string& filename, bool loadEverything)
544559 while (!data[" lights" ][counter].empty ())
545560 {
546561 auto name = data[" lights" ][counter][" name" ].asString ();
547- lights[name] = new Light (rp3d::Vector3::zero (), rp3d::Vector3::zero ());
562+ lights[name] = std::make_shared< Light> (rp3d::Vector3::zero (), rp3d::Vector3::zero ());
548563 lights[name]->Deserialize (data[" lights" ][counter]);
549- nodes[name] = lights[name];
550- lightsVector.push_back (lights[name]);
564+ nodes[name] = lights[name]. get () ;
565+ lightsVector.push_back (lights[name]. get () );
551566
552567 counter++;
553568 }
@@ -592,7 +607,7 @@ void SceneManager::Load(const std::string& filename, bool loadEverything)
592607 {
593608 light->SetParent (GetNode (parent));
594609 if (bones.find (parent) != bones.end ())
595- GetNode (parent)->AddChild (light);
610+ GetNode (parent)->AddChild (light. get () );
596611 }
597612
598613 counter++;
@@ -700,6 +715,15 @@ std::shared_ptr<Model> SceneManager::GetModel(const std::string& name)
700715 return nullptr ;
701716}
702717
718+ std::shared_ptr<Light> SceneManager::GetLight (const std::string& name)
719+ {
720+ if (lights.find (name) != lights.end ())
721+ return lights[name];
722+ Log::Write (" Could not find a light with name \" "
723+ + name + " \" , function will return nullptr" , Log::Type::Warning);
724+ return nullptr ;
725+ }
726+
703727std::shared_ptr<Material> SceneManager::GetMaterial (const std::string& name)
704728{
705729 if (materials.find (name) != materials.end ())
@@ -792,6 +816,15 @@ Model* SceneManager::GetModelPtr(const std::string& name)
792816 return nullptr ;
793817}
794818
819+ Light* SceneManager::GetLightPtr (const std::string& name)
820+ {
821+ if (lights.find (name) != lights.end ())
822+ return lights[name].get ();
823+ Log::Write (" Could not find a light with name \" "
824+ + name + " \" , function will return nullptr" , Log::Type::Warning);
825+ return nullptr ;
826+ }
827+
795828Material* SceneManager::GetMaterialPtr (const std::string& name)
796829{
797830 if (materials.find (name) != materials.end ())
@@ -820,6 +853,39 @@ SoundManager* SceneManager::GetSoundManagerPtr()
820853 return sManager .get ();
821854}
822855
856+ Model* SceneManager::CreateModelPtr (const std::string& filename, bool isTemporary, const std::string& name)
857+ {
858+ std::shared_ptr<Model> ret;
859+ if (filename.empty ())
860+ {
861+ ret = CreateModel (name, true );
862+ ret->SetMaterial ({ materials.begin ()->second .get () });
863+ }
864+ else ret = CreateModel (name, filename, std::vector<Material*>{ materials.begin ()->second .get () });
865+
866+ ret->SetPhysicsManager (pManager.get ());
867+ ret->CreateRigidBody ();
868+ if (filename.empty ())
869+ ret->CreateBoxShape ();
870+ if (isTemporary)
871+ temporaryModelCopies.push_back (GetLastAdded ());
872+
873+ return ret.get ();
874+ }
875+
876+ Light* SceneManager::CreateLightPtr (bool isTemporary, const std::string& name)
877+ {
878+ auto ret = CreateLight (name, rp3d::Vector3::zero (), rp3d::Vector3::zero ());
879+ if (isTemporary)
880+ temporaryLightCopies.push_back (GetLastAdded ());
881+ return ret.get ();
882+ }
883+
884+ Material* SceneManager::CreateMaterialPtr (const std::string& name)
885+ {
886+ return CreateMaterial (name).get ();
887+ }
888+
823889void SceneManager::RemoveModelPtr (Model* model)
824890{
825891 auto it = std::find_if (models.begin (), models.end (), [&](auto & p) { return p.second .get () == model; });
@@ -835,6 +901,18 @@ void SceneManager::RemoveModelPtr(Model* model)
835901 }
836902}
837903
904+ void SceneManager::RemoveLightPtr (Light* light)
905+ {
906+ auto it = std::find_if (lights.begin (), lights.end (), [&](auto & p) { return p.second .get () == light; });
907+ auto itn = std::find_if (nodes.begin (), nodes.end (), [&](auto & p) { return p.second == light; });
908+ if (it != lights.end ())
909+ {
910+ lights.erase (it);
911+ nodes.erase (itn);
912+ lightsVector.erase (std::find (lightsVector.begin (), lightsVector.end (), it->second .get ()));
913+ }
914+ }
915+
838916void SceneManager::RemoveMaterialPtr (Material* material)
839917{
840918 auto it = std::find_if (materials.begin (), materials.end (), [&](auto & p) { return p.second .get () == material; });
@@ -882,11 +960,11 @@ Model* SceneManager::CloneModel(Model* model, bool isTemporary, const std::strin
882960
883961Light* SceneManager::CloneLight (Light* light, bool isTemporary, const std::string& name)
884962{
885- auto ret = new Light (light);
963+ auto ret = std::make_shared< Light> (light);
886964 AddLight (ret, name);
887965 if (isTemporary)
888966 temporaryLightCopies.push_back (GetLastAdded ());
889- return ret;
967+ return ret. get () ;
890968}
891969
892970std::vector<Model*> SceneManager::GetModelPtrGroup (const std::string& name)
@@ -902,15 +980,6 @@ Camera* SceneManager::GetCamera()
902980 return camera;
903981}
904982
905- Light* SceneManager::GetLight (const std::string& name)
906- {
907- if (lights.find (name) != lights.end ())
908- return lights[name];
909- Log::Write (" Could not find a light with name \" "
910- + name + " \" , function will return nullptr" , Log::Type::Warning);
911- return nullptr ;
912- }
913-
914983Bone* SceneManager::GetBone (const std::string& name)
915984{
916985 if (bones.find (name) != bones.end ())
@@ -925,7 +994,7 @@ std::vector<Light*> SceneManager::GetShadowCastingLights()
925994 std::vector<Light*> ret;
926995 for (auto & i : lights)
927996 if (i.second ->IsCastingShadows ())
928- ret.push_back (i.second );
997+ ret.push_back (i.second . get () );
929998 return ret;
930999}
9311000
0 commit comments