23
23
#include " OvCore/ECS/Components/CAmbientSphereLight.h"
24
24
#include " OvCore/ECS/Components/CPostProcessStack.h"
25
25
26
+ #include < OvDebug/Assertion.h>
27
+
26
28
OvTools::Eventing::Event<OvCore::ECS::Actor&> OvCore::ECS::Actor::DestroyedEvent;
27
29
OvTools::Eventing::Event<OvCore::ECS::Actor&> OvCore::ECS::Actor::CreatedEvent;
28
30
OvTools::Eventing::Event<OvCore::ECS::Actor&, OvCore::ECS::Actor&> OvCore::ECS::Actor::AttachEvent;
@@ -61,7 +63,7 @@ OvCore::ECS::Actor::~Actor()
61
63
DetachFromParent ();
62
64
63
65
std::for_each (m_components.begin (), m_components.end (), [&](std::shared_ptr<Components::AComponent> p_component) { ComponentRemovedEvent.Invoke (*p_component); });
64
- std::for_each (m_behaviours.begin (), m_behaviours.end (), [&](auto & p_behaviour) { BehaviourRemovedEvent.Invoke (std::ref (p_behaviour.second )); });
66
+ std::for_each (m_behaviours.begin (), m_behaviours.end (), [&](auto & p_behaviour) { BehaviourRemovedEvent.Invoke (std::ref (* p_behaviour.second )); });
65
67
std::for_each (m_children.begin (), m_children.end (), [](Actor* p_element) { delete p_element; });
66
68
}
67
69
@@ -207,40 +209,40 @@ void OvCore::ECS::Actor::OnAwake()
207
209
{
208
210
m_awaked = true ;
209
211
std::for_each (m_components.begin (), m_components.end (), [](auto element) { element->OnAwake (); });
210
- std::for_each (m_behaviours.begin (), m_behaviours.end (), [](auto & element) { element.second . OnAwake (); });
212
+ std::for_each (m_behaviours.begin (), m_behaviours.end (), [](auto & element) { element.second -> OnAwake (); });
211
213
}
212
214
213
215
void OvCore::ECS::Actor::OnStart ()
214
216
{
215
217
m_started = true ;
216
218
std::for_each (m_components.begin (), m_components.end (), [](auto element) { element->OnStart (); });
217
- std::for_each (m_behaviours.begin (), m_behaviours.end (), [](auto & element) { element.second . OnStart (); });
219
+ std::for_each (m_behaviours.begin (), m_behaviours.end (), [](auto & element) { element.second -> OnStart (); });
218
220
}
219
221
220
222
void OvCore::ECS::Actor::OnEnable ()
221
223
{
222
224
std::for_each (m_components.begin (), m_components.end (), [](auto element) { element->OnEnable (); });
223
- std::for_each (m_behaviours.begin (), m_behaviours.end (), [](auto & element) { element.second . OnEnable (); });
225
+ std::for_each (m_behaviours.begin (), m_behaviours.end (), [](auto & element) { element.second -> OnEnable (); });
224
226
}
225
227
226
228
void OvCore::ECS::Actor::OnDisable ()
227
229
{
228
230
std::for_each (m_components.begin (), m_components.end (), [](auto element) { element->OnDisable (); });
229
- std::for_each (m_behaviours.begin (), m_behaviours.end (), [](auto & element) { element.second . OnDisable (); });
231
+ std::for_each (m_behaviours.begin (), m_behaviours.end (), [](auto & element) { element.second -> OnDisable (); });
230
232
}
231
233
232
234
void OvCore::ECS::Actor::OnDestroy ()
233
235
{
234
236
std::for_each (m_components.begin (), m_components.end (), [](auto element) { element->OnDestroy (); });
235
- std::for_each (m_behaviours.begin (), m_behaviours.end (), [](auto & element) { element.second . OnDestroy (); });
237
+ std::for_each (m_behaviours.begin (), m_behaviours.end (), [](auto & element) { element.second -> OnDestroy (); });
236
238
}
237
239
238
240
void OvCore::ECS::Actor::OnUpdate (float p_deltaTime)
239
241
{
240
242
if (IsActive ())
241
243
{
242
244
std::for_each (m_components.begin (), m_components.end (), [&](auto element) { element->OnUpdate (p_deltaTime); });
243
- std::for_each (m_behaviours.begin (), m_behaviours.end (), [&](auto & element) { element.second . OnUpdate (p_deltaTime); });
245
+ std::for_each (m_behaviours.begin (), m_behaviours.end (), [&](auto & element) { element.second -> OnUpdate (p_deltaTime); });
244
246
}
245
247
}
246
248
@@ -249,7 +251,7 @@ void OvCore::ECS::Actor::OnFixedUpdate(float p_deltaTime)
249
251
if (IsActive ())
250
252
{
251
253
std::for_each (m_components.begin (), m_components.end (), [&](auto element) { element->OnFixedUpdate (p_deltaTime); });
252
- std::for_each (m_behaviours.begin (), m_behaviours.end (), [&](auto & element) { element.second . OnFixedUpdate (p_deltaTime); });
254
+ std::for_each (m_behaviours.begin (), m_behaviours.end (), [&](auto & element) { element.second -> OnFixedUpdate (p_deltaTime); });
253
255
}
254
256
}
255
257
@@ -258,44 +260,44 @@ void OvCore::ECS::Actor::OnLateUpdate(float p_deltaTime)
258
260
if (IsActive ())
259
261
{
260
262
std::for_each (m_components.begin (), m_components.end (), [&](auto element) { element->OnLateUpdate (p_deltaTime); });
261
- std::for_each (m_behaviours.begin (), m_behaviours.end (), [&](auto & element) { element.second . OnLateUpdate (p_deltaTime); });
263
+ std::for_each (m_behaviours.begin (), m_behaviours.end (), [&](auto & element) { element.second -> OnLateUpdate (p_deltaTime); });
262
264
}
263
265
}
264
266
265
267
void OvCore::ECS::Actor::OnCollisionEnter (Components::CPhysicalObject& p_otherObject)
266
268
{
267
269
std::for_each (m_components.begin (), m_components.end (), [&](auto element) { element->OnCollisionEnter (p_otherObject); });
268
- std::for_each (m_behaviours.begin (), m_behaviours.end (), [&](auto & element) { element.second . OnCollisionEnter (p_otherObject); });
270
+ std::for_each (m_behaviours.begin (), m_behaviours.end (), [&](auto & element) { element.second -> OnCollisionEnter (p_otherObject); });
269
271
}
270
272
271
273
void OvCore::ECS::Actor::OnCollisionStay (Components::CPhysicalObject& p_otherObject)
272
274
{
273
275
std::for_each (m_components.begin (), m_components.end (), [&](auto element) { element->OnCollisionStay (p_otherObject); });
274
- std::for_each (m_behaviours.begin (), m_behaviours.end (), [&](auto & element) { element.second . OnCollisionStay (p_otherObject); });
276
+ std::for_each (m_behaviours.begin (), m_behaviours.end (), [&](auto & element) { element.second -> OnCollisionStay (p_otherObject); });
275
277
}
276
278
277
279
void OvCore::ECS::Actor::OnCollisionExit (Components::CPhysicalObject& p_otherObject)
278
280
{
279
281
std::for_each (m_components.begin (), m_components.end (), [&](auto element) { element->OnCollisionExit (p_otherObject); });
280
- std::for_each (m_behaviours.begin (), m_behaviours.end (), [&](auto & element) { element.second . OnCollisionExit (p_otherObject); });
282
+ std::for_each (m_behaviours.begin (), m_behaviours.end (), [&](auto & element) { element.second -> OnCollisionExit (p_otherObject); });
281
283
}
282
284
283
285
void OvCore::ECS::Actor::OnTriggerEnter (Components::CPhysicalObject& p_otherObject)
284
286
{
285
287
std::for_each (m_components.begin (), m_components.end (), [&](auto element) { element->OnTriggerEnter (p_otherObject); });
286
- std::for_each (m_behaviours.begin (), m_behaviours.end (), [&](auto & element) { element.second . OnTriggerEnter (p_otherObject); });
288
+ std::for_each (m_behaviours.begin (), m_behaviours.end (), [&](auto & element) { element.second -> OnTriggerEnter (p_otherObject); });
287
289
}
288
290
289
291
void OvCore::ECS::Actor::OnTriggerStay (Components::CPhysicalObject& p_otherObject)
290
292
{
291
293
std::for_each (m_components.begin (), m_components.end (), [&](auto element) { element->OnTriggerStay (p_otherObject); });
292
- std::for_each (m_behaviours.begin (), m_behaviours.end (), [&](auto & element) { element.second . OnTriggerStay (p_otherObject); });
294
+ std::for_each (m_behaviours.begin (), m_behaviours.end (), [&](auto & element) { element.second -> OnTriggerStay (p_otherObject); });
293
295
}
294
296
295
297
void OvCore::ECS::Actor::OnTriggerExit (Components::CPhysicalObject& p_otherObject)
296
298
{
297
299
std::for_each (m_components.begin (), m_components.end (), [&](auto element) { element->OnTriggerExit (p_otherObject); });
298
- std::for_each (m_behaviours.begin (), m_behaviours.end (), [&](auto & element) { element.second . OnTriggerExit (p_otherObject); });
300
+ std::for_each (m_behaviours.begin (), m_behaviours.end (), [&](auto & element) { element.second -> OnTriggerExit (p_otherObject); });
299
301
}
300
302
301
303
bool OvCore::ECS::Actor::RemoveComponent (OvCore::ECS::Components::AComponent& p_component)
@@ -318,10 +320,13 @@ std::vector<std::shared_ptr<OvCore::ECS::Components::AComponent>>& OvCore::ECS::
318
320
return m_components;
319
321
}
320
322
321
- OvCore::ECS::Components::Behaviour & OvCore::ECS::Actor::AddBehaviour (const std::string & p_name )
323
+ OvCore::ECS::Components::Behaviour & OvCore::ECS::Actor::AddBehaviour (const std::string& p_scriptPath )
322
324
{
323
- m_behaviours.try_emplace (p_name, *this , p_name);
324
- Components::Behaviour& newInstance = m_behaviours.at (p_name);
325
+ auto behaviour = std::make_unique<Components::Behaviour>(*this , p_scriptPath);
326
+ const auto key = behaviour->GetScriptName ();
327
+ m_behaviours.try_emplace (key, std::move (behaviour));
328
+
329
+ Components::Behaviour& newInstance = *m_behaviours.at (key);
325
330
BehaviourAddedEvent.Invoke (newInstance);
326
331
if (m_playing && IsActive ())
327
332
{
@@ -338,42 +343,42 @@ bool OvCore::ECS::Actor::RemoveBehaviour(Components::Behaviour& p_behaviour)
338
343
339
344
for (auto & [name, behaviour] : m_behaviours)
340
345
{
341
- if (& behaviour == &p_behaviour)
346
+ if (behaviour. get () == &p_behaviour)
342
347
{
343
348
found = true ;
344
349
break ;
345
350
}
346
351
}
347
352
348
353
if (found)
349
- return RemoveBehaviour (p_behaviour.name );
354
+ return RemoveBehaviour (p_behaviour.GetScriptPath () );
350
355
else
351
356
return false ;
352
357
}
353
358
354
- bool OvCore::ECS::Actor::RemoveBehaviour (const std::string & p_name )
359
+ bool OvCore::ECS::Actor::RemoveBehaviour (const std::string& p_scriptName )
355
360
{
356
- Components::Behaviour* found = GetBehaviour (p_name );
361
+ Components::Behaviour* found = GetBehaviour (p_scriptName );
357
362
if (found)
358
363
{
359
364
BehaviourRemovedEvent.Invoke (*found);
360
- return m_behaviours.erase (p_name );
365
+ return m_behaviours.erase (p_scriptName );
361
366
}
362
367
else
363
368
{
364
369
return false ;
365
370
}
366
371
}
367
372
368
- OvCore::ECS::Components::Behaviour* OvCore::ECS::Actor::GetBehaviour (const std::string& p_name )
373
+ OvCore::ECS::Components::Behaviour* OvCore::ECS::Actor::GetBehaviour (const std::string& p_scriptName )
369
374
{
370
- if (auto result = m_behaviours.find (p_name ); result != m_behaviours.end ())
371
- return & result->second ;
375
+ if (auto result = m_behaviours.find (p_scriptName ); result != m_behaviours.end ())
376
+ return result->second . get () ;
372
377
else
373
378
return nullptr ;
374
379
}
375
380
376
- std::unordered_map<std::string, OvCore::ECS::Components::Behaviour>& OvCore::ECS::Actor::GetBehaviours ()
381
+ std::unordered_map<std::string, std::unique_ptr< OvCore::ECS::Components::Behaviour> >& OvCore::ECS::Actor::GetBehaviours ()
377
382
{
378
383
return m_behaviours;
379
384
}
@@ -426,7 +431,7 @@ void OvCore::ECS::Actor::OnSerialize(tinyxml2::XMLDocument & p_doc, tinyxml2::XM
426
431
behaviourNode->InsertEndChild (data);
427
432
428
433
/* Data serialization of the behaviour */
429
- behaviour.second . OnSerialize (p_doc, data);
434
+ behaviour.second -> OnSerialize (p_doc, data);
430
435
}
431
436
}
432
437
0 commit comments