feat(physics): add runtime physics scaffolding
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
#include "Scene/SceneRuntime.h"
|
||||
|
||||
#include <XCEngine/Physics/PhysicsWorld.h>
|
||||
#include "Scripting/ScriptEngine.h"
|
||||
#include <XCEngine/UI/Runtime/UISceneRuntimeContext.h>
|
||||
|
||||
@@ -28,6 +29,7 @@ void SceneRuntime::Start(Scene* scene) {
|
||||
}
|
||||
|
||||
m_scene = scene;
|
||||
CreatePhysicsWorldForScene(scene);
|
||||
m_running = true;
|
||||
m_uiRuntime->Reset();
|
||||
Scripting::ScriptEngine::Get().OnRuntimeStart(scene);
|
||||
@@ -35,12 +37,14 @@ void SceneRuntime::Start(Scene* scene) {
|
||||
|
||||
void SceneRuntime::Stop() {
|
||||
if (!m_running) {
|
||||
DestroyPhysicsWorld();
|
||||
m_uiRuntime->Reset();
|
||||
m_scene = nullptr;
|
||||
return;
|
||||
}
|
||||
|
||||
Scripting::ScriptEngine::Get().OnRuntimeStop();
|
||||
DestroyPhysicsWorld();
|
||||
m_uiRuntime->Reset();
|
||||
m_running = false;
|
||||
m_scene = nullptr;
|
||||
@@ -48,12 +52,14 @@ void SceneRuntime::Stop() {
|
||||
|
||||
void SceneRuntime::ReplaceScene(Scene* scene) {
|
||||
if (!m_running) {
|
||||
DestroyPhysicsWorld();
|
||||
m_scene = scene;
|
||||
m_uiRuntime->Reset();
|
||||
return;
|
||||
}
|
||||
|
||||
m_scene = scene;
|
||||
CreatePhysicsWorldForScene(scene);
|
||||
m_uiRuntime->Reset();
|
||||
Scripting::ScriptEngine::Get().OnRuntimeSceneReplaced(scene);
|
||||
}
|
||||
@@ -66,6 +72,9 @@ void SceneRuntime::FixedUpdate(float fixedDeltaTime) {
|
||||
// Scripts run first so their state changes are visible to native components in the same frame.
|
||||
Scripting::ScriptEngine::Get().OnFixedUpdate(fixedDeltaTime);
|
||||
m_scene->FixedUpdate(fixedDeltaTime);
|
||||
if (m_physicsWorld) {
|
||||
m_physicsWorld->Step(fixedDeltaTime);
|
||||
}
|
||||
}
|
||||
|
||||
void SceneRuntime::Update(float deltaTime) {
|
||||
@@ -115,5 +124,29 @@ void SceneRuntime::ClearQueuedUIInputEvents() {
|
||||
m_uiRuntime->ClearQueuedInputEvents();
|
||||
}
|
||||
|
||||
void SceneRuntime::CreatePhysicsWorldForScene(Scene* scene) {
|
||||
if (!scene) {
|
||||
DestroyPhysicsWorld();
|
||||
return;
|
||||
}
|
||||
|
||||
DestroyPhysicsWorld();
|
||||
|
||||
auto physicsWorld = std::make_unique<Physics::PhysicsWorld>();
|
||||
Physics::PhysicsWorldCreateInfo createInfo = {};
|
||||
createInfo.scene = scene;
|
||||
physicsWorld->Initialize(createInfo);
|
||||
m_physicsWorld = std::move(physicsWorld);
|
||||
}
|
||||
|
||||
void SceneRuntime::DestroyPhysicsWorld() {
|
||||
if (!m_physicsWorld) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_physicsWorld->Shutdown();
|
||||
m_physicsWorld.reset();
|
||||
}
|
||||
|
||||
} // namespace Components
|
||||
} // namespace XCEngine
|
||||
|
||||
Reference in New Issue
Block a user