Skip to content

Commit 6494755

Browse files
committed
Fixed reference not found when in game
1 parent 426a5c9 commit 6494755

File tree

6 files changed

+80
-51
lines changed

6 files changed

+80
-51
lines changed

Sources/Overload/OvCore/include/OvCore/ECS/Actor.h

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -273,9 +273,9 @@ namespace OvCore::ECS
273273

274274
/**
275275
* Add a behaviour to the actor
276-
* @param p_name
276+
* @param p_scriptPath
277277
*/
278-
Components::Behaviour& AddBehaviour(const std::string& p_name);
278+
Components::Behaviour& AddBehaviour(const std::string& p_scriptPath);
279279

280280
/**
281281
* Remove a behaviour by refering to the given instance
@@ -284,21 +284,22 @@ namespace OvCore::ECS
284284
bool RemoveBehaviour(Components::Behaviour& p_behaviour);
285285

286286
/**
287-
* Remove a behaviour by refering to his name
288-
* @param p_name
287+
* Remove a behaviour given its script name
288+
* @param p_scriptName
289289
*/
290-
bool RemoveBehaviour(const std::string& p_name);
290+
bool RemoveBehaviour(const std::string& p_scriptName);
291291

292292
/**
293-
* Try to get the given behaviour (Returns nullptr on failure)
294-
* @param p_name
293+
* Try to get the behaviour by refering to the given script name.
294+
* Returns nullptr on failure.
295+
* @param p_scriptName
295296
*/
296-
Components::Behaviour* GetBehaviour(const std::string& p_name);
297+
Components::Behaviour* GetBehaviour(const std::string& p_scriptName);
297298

298299
/**
299300
* Returns a reference to the vector of behaviours
300301
*/
301-
std::unordered_map<std::string, Components::Behaviour>& GetBehaviours();
302+
std::unordered_map<std::string, std::unique_ptr<Components::Behaviour>>& GetBehaviours();
302303

303304
/**
304305
* Serialize all the components
@@ -355,7 +356,7 @@ namespace OvCore::ECS
355356

356357
/* Actors components */
357358
std::vector<std::shared_ptr<Components::AComponent>> m_components;
358-
std::unordered_map<std::string, Components::Behaviour> m_behaviours;
359+
std::unordered_map<std::string, std::unique_ptr<Components::Behaviour>> m_behaviours;
359360

360361
public:
361362
Components::CTransform& transform;

Sources/Overload/OvCore/include/OvCore/ECS/Components/Behaviour.h

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,17 @@ namespace OvCore::ECS { class Actor; }
1515
namespace OvCore::ECS::Components
1616
{
1717
/**
18-
* ABehaviour is the base class for any behaviour.
19-
* A Behaviour is a script that is used to manipulate an actor over time
18+
* A Behaviour is a script that can be attached to an actor
2019
*/
2120
class Behaviour : public AComponent
2221
{
2322
public:
2423
/**
25-
* Constructor of a ABehaviour (Must be called by derived classes)
24+
* Constructor of a Behaviour
2625
* @param p_owner
26+
* @param p_scriptPath
2727
*/
28-
Behaviour(ECS::Actor& p_owner, const std::string& p_name);
28+
Behaviour(ECS::Actor& p_owner, const std::string& p_scriptPath);
2929

3030
/**
3131
* Destructor
@@ -37,6 +37,16 @@ namespace OvCore::ECS::Components
3737
*/
3838
virtual std::string GetName() override;
3939

40+
/**
41+
* Returns the script name associated with this behaviour
42+
*/
43+
std::string GetScriptName() const;
44+
45+
/**
46+
* Returns the path of the script associated with this behaviour
47+
*/
48+
std::string GetScriptPath() const;
49+
4050
/**
4151
* Sets the script associated with this behaviour
4252
* @param p_script
@@ -154,10 +164,9 @@ namespace OvCore::ECS::Components
154164
*/
155165
virtual void OnInspector(OvUI::Internal::WidgetContainer & p_root) override;
156166

157-
public:
158-
const std::string name;
159-
160167
private:
168+
const std::string m_scriptName;
169+
const std::string m_scriptPath;
161170
std::unique_ptr<Scripting::Script> m_script;
162171
};
163172
}

Sources/Overload/OvCore/src/OvCore/ECS/Actor.cpp

Lines changed: 33 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
#include "OvCore/ECS/Components/CAmbientSphereLight.h"
2424
#include "OvCore/ECS/Components/CPostProcessStack.h"
2525

26+
#include <OvDebug/Assertion.h>
27+
2628
OvTools::Eventing::Event<OvCore::ECS::Actor&> OvCore::ECS::Actor::DestroyedEvent;
2729
OvTools::Eventing::Event<OvCore::ECS::Actor&> OvCore::ECS::Actor::CreatedEvent;
2830
OvTools::Eventing::Event<OvCore::ECS::Actor&, OvCore::ECS::Actor&> OvCore::ECS::Actor::AttachEvent;
@@ -61,7 +63,7 @@ OvCore::ECS::Actor::~Actor()
6163
DetachFromParent();
6264

6365
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)); });
6567
std::for_each(m_children.begin(), m_children.end(), [](Actor* p_element) { delete p_element; });
6668
}
6769

@@ -207,40 +209,40 @@ void OvCore::ECS::Actor::OnAwake()
207209
{
208210
m_awaked = true;
209211
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(); });
211213
}
212214

213215
void OvCore::ECS::Actor::OnStart()
214216
{
215217
m_started = true;
216218
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(); });
218220
}
219221

220222
void OvCore::ECS::Actor::OnEnable()
221223
{
222224
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(); });
224226
}
225227

226228
void OvCore::ECS::Actor::OnDisable()
227229
{
228230
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(); });
230232
}
231233

232234
void OvCore::ECS::Actor::OnDestroy()
233235
{
234236
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(); });
236238
}
237239

238240
void OvCore::ECS::Actor::OnUpdate(float p_deltaTime)
239241
{
240242
if (IsActive())
241243
{
242244
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); });
244246
}
245247
}
246248

@@ -249,7 +251,7 @@ void OvCore::ECS::Actor::OnFixedUpdate(float p_deltaTime)
249251
if (IsActive())
250252
{
251253
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); });
253255
}
254256
}
255257

@@ -258,44 +260,44 @@ void OvCore::ECS::Actor::OnLateUpdate(float p_deltaTime)
258260
if (IsActive())
259261
{
260262
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); });
262264
}
263265
}
264266

265267
void OvCore::ECS::Actor::OnCollisionEnter(Components::CPhysicalObject& p_otherObject)
266268
{
267269
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); });
269271
}
270272

271273
void OvCore::ECS::Actor::OnCollisionStay(Components::CPhysicalObject& p_otherObject)
272274
{
273275
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); });
275277
}
276278

277279
void OvCore::ECS::Actor::OnCollisionExit(Components::CPhysicalObject& p_otherObject)
278280
{
279281
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); });
281283
}
282284

283285
void OvCore::ECS::Actor::OnTriggerEnter(Components::CPhysicalObject& p_otherObject)
284286
{
285287
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); });
287289
}
288290

289291
void OvCore::ECS::Actor::OnTriggerStay(Components::CPhysicalObject& p_otherObject)
290292
{
291293
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); });
293295
}
294296

295297
void OvCore::ECS::Actor::OnTriggerExit(Components::CPhysicalObject& p_otherObject)
296298
{
297299
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); });
299301
}
300302

301303
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::
318320
return m_components;
319321
}
320322

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)
322324
{
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);
325330
BehaviourAddedEvent.Invoke(newInstance);
326331
if (m_playing && IsActive())
327332
{
@@ -338,42 +343,42 @@ bool OvCore::ECS::Actor::RemoveBehaviour(Components::Behaviour& p_behaviour)
338343

339344
for (auto& [name, behaviour] : m_behaviours)
340345
{
341-
if (&behaviour == &p_behaviour)
346+
if (behaviour.get() == &p_behaviour)
342347
{
343348
found = true;
344349
break;
345350
}
346351
}
347352

348353
if (found)
349-
return RemoveBehaviour(p_behaviour.name);
354+
return RemoveBehaviour(p_behaviour.GetScriptPath());
350355
else
351356
return false;
352357
}
353358

354-
bool OvCore::ECS::Actor::RemoveBehaviour(const std::string & p_name)
359+
bool OvCore::ECS::Actor::RemoveBehaviour(const std::string& p_scriptName)
355360
{
356-
Components::Behaviour* found = GetBehaviour(p_name);
361+
Components::Behaviour* found = GetBehaviour(p_scriptName);
357362
if (found)
358363
{
359364
BehaviourRemovedEvent.Invoke(*found);
360-
return m_behaviours.erase(p_name);
365+
return m_behaviours.erase(p_scriptName);
361366
}
362367
else
363368
{
364369
return false;
365370
}
366371
}
367372

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)
369374
{
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();
372377
else
373378
return nullptr;
374379
}
375380

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()
377382
{
378383
return m_behaviours;
379384
}
@@ -426,7 +431,7 @@ void OvCore::ECS::Actor::OnSerialize(tinyxml2::XMLDocument & p_doc, tinyxml2::XM
426431
behaviourNode->InsertEndChild(data);
427432

428433
/* Data serialization of the behaviour */
429-
behaviour.second.OnSerialize(p_doc, data);
434+
behaviour.second->OnSerialize(p_doc, data);
430435
}
431436
}
432437

Sources/Overload/OvCore/src/OvCore/ECS/Components/Behaviour.cpp

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
* @licence: MIT
55
*/
66

7+
#include <filesystem>
8+
79
#include <OvUI/Widgets/Texts/TextColored.h>
810
#include <OvDebug/Logger.h>
911

@@ -12,8 +14,10 @@
1214
#include <OvCore/Global/ServiceLocator.h>
1315
#include <OvCore/Scripting/ScriptEngine.h>
1416

15-
OvCore::ECS::Components::Behaviour::Behaviour(ECS::Actor& p_owner, const std::string& p_name) :
16-
name(p_name), AComponent(p_owner)
17+
OvCore::ECS::Components::Behaviour::Behaviour(ECS::Actor& p_owner, const std::string& p_scriptPath) :
18+
m_scriptPath(p_scriptPath),
19+
m_scriptName(std::filesystem::path{ p_scriptPath }.stem().string()), // TODO: Ideally this could be returned by the script engine, so it would match the internal type name
20+
AComponent(p_owner)
1721
{
1822
OVSERVICE(Scripting::ScriptEngine).AddBehaviour(*this);
1923
}
@@ -28,6 +32,16 @@ std::string OvCore::ECS::Components::Behaviour::GetName()
2832
return "Behaviour";
2933
}
3034

35+
std::string OvCore::ECS::Components::Behaviour::GetScriptName() const
36+
{
37+
return m_scriptName;
38+
}
39+
40+
std::string OvCore::ECS::Components::Behaviour::GetScriptPath() const
41+
{
42+
return m_scriptPath;
43+
}
44+
3145
void OvCore::ECS::Components::Behaviour::SetScript(std::unique_ptr<Scripting::Script>&& p_scriptContext)
3246
{
3347
m_script = std::move(p_scriptContext);

Sources/Overload/OvCore/src/OvCore/Scripting/Lua/LuaScriptEngine.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ void OvCore::Scripting::LuaScriptEngine::CreateContext()
115115
std::for_each(m_context.behaviours.begin(), m_context.behaviours.end(),
116116
[this](std::reference_wrapper<OvCore::ECS::Components::Behaviour> behaviour)
117117
{
118-
if (!RegisterBehaviour(*m_context.luaState, behaviour.get(), m_context.scriptRootFolder + behaviour.get().name))
118+
if (!RegisterBehaviour(*m_context.luaState, behaviour.get(), m_context.scriptRootFolder + behaviour.get().GetScriptPath()))
119119
{
120120
++m_context.errorCount;
121121
}
@@ -180,7 +180,7 @@ void OvCore::Scripting::LuaScriptEngineBase::AddBehaviour(OvCore::ECS::Component
180180

181181
m_context.behaviours.push_back(std::ref(p_toAdd));
182182

183-
if (!RegisterBehaviour(*m_context.luaState, p_toAdd, m_context.scriptRootFolder + p_toAdd.name))
183+
if (!RegisterBehaviour(*m_context.luaState, p_toAdd, m_context.scriptRootFolder + p_toAdd.GetScriptPath()))
184184
{
185185
++m_context.errorCount;
186186
}

Sources/Overload/OvEditor/src/OvEditor/Panels/Inspector.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ void OvEditor::Panels::Inspector::CreateActorInspector(OvCore::ECS::Actor& p_tar
281281
auto& behaviours = p_target.GetBehaviours();
282282

283283
for (auto&[name, behaviour] : behaviours)
284-
DrawBehaviour(behaviour);
284+
DrawBehaviour(*behaviour);
285285
}
286286

287287
void OvEditor::Panels::Inspector::DrawComponent(OvCore::ECS::Components::AComponent& p_component)
@@ -305,7 +305,7 @@ void OvEditor::Panels::Inspector::DrawBehaviour(OvCore::ECS::Components::Behavio
305305
{
306306
if (auto inspectorItem = dynamic_cast<OvCore::API::IInspectorItem*>(&p_behaviour); inspectorItem)
307307
{
308-
auto& header = m_actorInfo->CreateWidget<OvUI::Widgets::Layout::GroupCollapsable>(p_behaviour.name);
308+
auto& header = m_actorInfo->CreateWidget<OvUI::Widgets::Layout::GroupCollapsable>(p_behaviour.GetName());
309309
header.closable = true;
310310
header.CloseEvent += [this, &header, &p_behaviour]
311311
{

0 commit comments

Comments
 (0)