120 lines
2.9 KiB
C++
120 lines
2.9 KiB
C++
#include "Scene/SceneRuntime.h"
|
|
|
|
#include "Scripting/ScriptEngine.h"
|
|
#include <XCEngine/UI/Runtime/UISceneRuntimeContext.h>
|
|
|
|
namespace XCEngine {
|
|
namespace Components {
|
|
|
|
SceneRuntime::SceneRuntime()
|
|
: m_uiRuntime(std::make_unique<UI::Runtime::UISceneRuntimeContext>()) {
|
|
}
|
|
|
|
SceneRuntime::~SceneRuntime() = default;
|
|
|
|
SceneRuntime::SceneRuntime(SceneRuntime&& other) noexcept = default;
|
|
|
|
SceneRuntime& SceneRuntime::operator=(SceneRuntime&& other) noexcept = default;
|
|
|
|
void SceneRuntime::Start(Scene* scene) {
|
|
if (m_running && m_scene == scene) {
|
|
return;
|
|
}
|
|
|
|
Stop();
|
|
|
|
if (!scene) {
|
|
return;
|
|
}
|
|
|
|
m_scene = scene;
|
|
m_running = true;
|
|
m_uiRuntime->Reset();
|
|
Scripting::ScriptEngine::Get().OnRuntimeStart(scene);
|
|
}
|
|
|
|
void SceneRuntime::Stop() {
|
|
if (!m_running) {
|
|
m_uiRuntime->Reset();
|
|
m_scene = nullptr;
|
|
return;
|
|
}
|
|
|
|
Scripting::ScriptEngine::Get().OnRuntimeStop();
|
|
m_uiRuntime->Reset();
|
|
m_running = false;
|
|
m_scene = nullptr;
|
|
}
|
|
|
|
void SceneRuntime::ReplaceScene(Scene* scene) {
|
|
if (!m_running) {
|
|
m_scene = scene;
|
|
m_uiRuntime->Reset();
|
|
return;
|
|
}
|
|
|
|
m_scene = scene;
|
|
m_uiRuntime->Reset();
|
|
Scripting::ScriptEngine::Get().OnRuntimeSceneReplaced(scene);
|
|
}
|
|
|
|
void SceneRuntime::FixedUpdate(float fixedDeltaTime) {
|
|
if (!m_running || !m_scene || !m_scene->IsActive()) {
|
|
return;
|
|
}
|
|
|
|
// 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);
|
|
}
|
|
|
|
void SceneRuntime::Update(float deltaTime) {
|
|
if (!m_running || !m_scene || !m_scene->IsActive()) {
|
|
return;
|
|
}
|
|
|
|
Scripting::ScriptEngine::Get().OnUpdate(deltaTime);
|
|
m_scene->Update(deltaTime);
|
|
m_uiRuntime->Update(deltaTime);
|
|
}
|
|
|
|
void SceneRuntime::LateUpdate(float deltaTime) {
|
|
if (!m_running || !m_scene || !m_scene->IsActive()) {
|
|
return;
|
|
}
|
|
|
|
Scripting::ScriptEngine::Get().OnLateUpdate(deltaTime);
|
|
m_scene->LateUpdate(deltaTime);
|
|
}
|
|
|
|
UI::Runtime::UISystem& SceneRuntime::GetUISystem() {
|
|
return m_uiRuntime->GetSystem();
|
|
}
|
|
|
|
UI::Runtime::UIScreenStackController& SceneRuntime::GetUIScreenStackController() {
|
|
return m_uiRuntime->GetStackController();
|
|
}
|
|
|
|
const UI::Runtime::UISystemFrameResult& SceneRuntime::GetLastUIFrame() const {
|
|
return m_uiRuntime->GetLastFrame();
|
|
}
|
|
|
|
void SceneRuntime::SetUIViewportRect(const UI::UIRect& viewportRect) {
|
|
m_uiRuntime->SetViewportRect(viewportRect);
|
|
}
|
|
|
|
void SceneRuntime::SetUIFocused(bool focused) {
|
|
m_uiRuntime->SetFocused(focused);
|
|
}
|
|
|
|
void SceneRuntime::QueueUIInputEvent(const UI::UIInputEvent& event) {
|
|
m_uiRuntime->QueueInputEvent(event);
|
|
}
|
|
|
|
void SceneRuntime::ClearQueuedUIInputEvents() {
|
|
m_uiRuntime->ClearQueuedInputEvents();
|
|
}
|
|
|
|
} // namespace Components
|
|
} // namespace XCEngine
|