Extra2D/src/scene/director.cpp

155 lines
3.2 KiB
C++
Raw Normal View History

#include <scene/director.h>
#include <scene/components/camera_component.h>
#include <event/events.h>
#include <utils/logger.h>
namespace extra2d {
Director::Director() {
}
Director::~Director() {
shutdown();
}
bool Director::init() {
return true;
}
void Director::shutdown() {
// 结束当前场景
if (runningScene_) {
runningScene_->onExit();
runningScene_.reset();
}
// 清空场景栈
while (!sceneStack_.empty()) {
sceneStack_.pop();
}
running_ = false;
}
void Director::runScene(Ptr<Scene> scene) {
if (!scene) return;
// 结束当前场景
if (runningScene_) {
runningScene_->onExit();
}
// 清空场景栈
while (!sceneStack_.empty()) {
sceneStack_.pop();
}
// 运行新场景
runningScene_ = scene;
runningScene_->onEnter();
running_ = true;
needEnd_ = false;
}
void Director::replaceScene(Ptr<Scene> scene) {
if (!scene) return;
// 结束当前场景
if (runningScene_) {
runningScene_->onExit();
}
// 替换场景
runningScene_ = scene;
runningScene_->onEnter();
}
void Director::pushScene(Ptr<Scene> scene) {
if (!scene) return;
// 暂停当前场景
if (runningScene_) {
// 可以在这里添加暂停逻辑
sceneStack_.push(runningScene_);
}
// 运行新场景
runningScene_ = scene;
runningScene_->onEnter();
}
void Director::popScene() {
if (sceneStack_.empty()) {
// 没有场景可以弹出,结束运行
end();
return;
}
// 结束当前场景
if (runningScene_) {
runningScene_->onExit();
}
// 弹出栈顶场景
runningScene_ = sceneStack_.top();
sceneStack_.pop();
// 恢复场景
// 可以在这里添加恢复逻辑
}
void Director::end() {
needEnd_ = true;
running_ = false;
if (runningScene_) {
runningScene_->onExit();
runningScene_.reset();
}
}
Scene* Director::getRunningScene() const {
return runningScene_.get();
}
CameraComponent* Director::getMainCamera() const {
if (runningScene_) {
return runningScene_->getMainCamera();
}
return nullptr;
}
void Director::update(float dt) {
if (!running_ || !runningScene_) return;
runningScene_->update(dt);
}
void Director::render() {
if (!running_ || !runningScene_) return;
// 从场景获取相机并上传矩阵
CameraComponent* camera = runningScene_->getMainCamera();
if (camera) {
Mat4 viewProj = camera->getViewProjectionMatrix();
// 调试输出:打印视图投影矩阵
static bool logged = false;
if (!logged) {
const float* m = glm::value_ptr(viewProj);
E2D_LOG_INFO("ViewProjection Matrix:");
E2D_LOG_INFO(" {:.4f} {:.4f} {:.4f} {:.4f}", m[0], m[4], m[8], m[12]);
E2D_LOG_INFO(" {:.4f} {:.4f} {:.4f} {:.4f}", m[1], m[5], m[9], m[13]);
E2D_LOG_INFO(" {:.4f} {:.4f} {:.4f} {:.4f}", m[2], m[6], m[10], m[14]);
E2D_LOG_INFO(" {:.4f} {:.4f} {:.4f} {:.4f}", m[3], m[7], m[11], m[15]);
logged = true;
}
events::OnRenderSetCamera::emit(viewProj);
}
runningScene_->render();
}
} // namespace extra2d