155 lines
3.2 KiB
C++
155 lines
3.2 KiB
C++
|
|
#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
|