mirror of
https://github.com/MonsterDruide1/OdysseyDecomp
synced 2026-04-28 03:24:35 +00:00
170 lines
5.7 KiB
C++
170 lines
5.7 KiB
C++
#include "Library/Scene/Scene.h"
|
|
|
|
#include "Library/Audio/AudioDirector.h"
|
|
#include "Library/Draw/GraphicsSystemInfo.h"
|
|
#include "Library/Layout/LayoutSystem.h"
|
|
#include "Library/LiveActor/LiveActorKit.h"
|
|
#include "Library/Model/ModelDisplayListController.h"
|
|
#include "Library/Model/ModelOcclusionCullingDirector.h"
|
|
#include "Library/Model/SkyDirector.h"
|
|
#include "Library/Scene/DemoDirector.h"
|
|
#include "Library/Scene/SceneMsgCtrl.h"
|
|
#include "Library/Scene/SceneObjHolder.h"
|
|
#include "Library/Scene/SceneStopCtrl.h"
|
|
#include "Library/Scene/SceneUtil.h"
|
|
#include "Library/Screen/ScreenCoverCtrl.h"
|
|
#include "Library/Stage/StageResourceKeeper.h"
|
|
#include "Library/System/GameSystemInfo.h"
|
|
#include "Project/LiveActor/ActorExecuteFunction.h"
|
|
|
|
namespace al {
|
|
|
|
Scene::Scene(const char* name) : NerveExecutor(name), mName(name) {}
|
|
|
|
Scene::~Scene() {
|
|
if (mAudioDirector)
|
|
mAudioDirector->finalize();
|
|
if (mStageResourceKeeper)
|
|
delete mStageResourceKeeper;
|
|
mStageResourceKeeper = nullptr;
|
|
if (mLiveActorKit)
|
|
delete mLiveActorKit;
|
|
mLiveActorKit = nullptr;
|
|
if (mLayoutKit)
|
|
delete mLayoutKit;
|
|
mLayoutKit = nullptr;
|
|
}
|
|
|
|
void Scene::appear() {
|
|
mIsAlive = true;
|
|
if (mLiveActorKit)
|
|
executeUpdateDrawBuffer(mLiveActorKit);
|
|
}
|
|
|
|
void Scene::kill() {
|
|
mIsAlive = false;
|
|
}
|
|
|
|
void Scene::movement() {
|
|
if (mLiveActorKit)
|
|
incrementDrawBufferCounter(mLiveActorKit);
|
|
if (mSceneStopCtrl)
|
|
mSceneStopCtrl->update();
|
|
if (mScreenCoverCtrl)
|
|
mScreenCoverCtrl->update();
|
|
if (mLiveActorKit)
|
|
waitUpdateDrawBuffer(mLiveActorKit);
|
|
if (mAudioDirector)
|
|
mAudioDirector->updatePre();
|
|
|
|
updateNerve();
|
|
control();
|
|
|
|
if (mAudioDirector)
|
|
mAudioDirector->updatePost();
|
|
if (mLiveActorKit) {
|
|
waitUpdateCalcView(mLiveActorKit);
|
|
if (mLiveActorKit->getModelDisplayListController())
|
|
mLiveActorKit->getModelDisplayListController()->update();
|
|
executeUpdateDrawBuffer(mLiveActorKit);
|
|
ModelOcclusionCullingDirector* modelOcclusionCullingDirector =
|
|
mLiveActorKit->getGraphicsSystemInfo()->getModelOcclusionCullingDirector();
|
|
if (modelOcclusionCullingDirector)
|
|
modelOcclusionCullingDirector->calc();
|
|
}
|
|
}
|
|
|
|
CameraDirector* Scene::getCameraDirector() const {
|
|
return mLiveActorKit->getCameraDirector();
|
|
}
|
|
|
|
void Scene::initializeAsync(const SceneInitInfo& info) {
|
|
init(info);
|
|
}
|
|
|
|
void Scene::initDrawSystemInfo(const SceneInitInfo& info) {
|
|
mDrawSystemInfo = info.gameSystemInfo->drawSystemInfo;
|
|
}
|
|
|
|
void Scene::initSceneObjHolder(SceneObjHolder* sceneObjHolder) {
|
|
mSceneObjHolder = sceneObjHolder;
|
|
}
|
|
|
|
void Scene::initAndLoadStageResource(const char* stageName, s32 scenarioNo) {
|
|
mStageResourceKeeper = new StageResourceKeeper();
|
|
mStageResourceKeeper->initAndLoadResource(stageName, scenarioNo);
|
|
}
|
|
|
|
void Scene::initLiveActorKit(const SceneInitInfo& info, s32 maxActors, s32 maxPlayers,
|
|
s32 maxCameras) {
|
|
initLiveActorKitImpl(info, maxActors, maxPlayers, maxCameras);
|
|
|
|
DrawSystemInfo* drawSystemInfo = info.gameSystemInfo->drawSystemInfo;
|
|
GraphicsInitArg graphicsInitArg = {getSceneDrawContext(this),
|
|
drawSystemInfo->dockedRenderBuffer};
|
|
graphicsInitArg._3c = maxCameras;
|
|
graphicsInitArg._10 = maxCameras << graphicsInitArg.atmosScatterViewNum;
|
|
mLiveActorKit->initGraphics(graphicsInitArg);
|
|
|
|
mLiveActorKit->getGraphicsSystemInfo()->setApplicationMessageReceiver(
|
|
info.gameSystemInfo->applicationMessageReciever);
|
|
}
|
|
|
|
void Scene::initLiveActorKitImpl(const SceneInitInfo& info, s32 maxActors, s32 maxPlayers,
|
|
s32 maxCameras) {
|
|
mLiveActorKit = new LiveActorKit(maxActors, maxPlayers);
|
|
mLiveActorKit->setSceneDrawContext(getSceneDrawContext(this));
|
|
mLiveActorKit->setGamePadSystem(info.gameSystemInfo->gamePadSystem);
|
|
mLiveActorKit->setEffectSystem(info.gameSystemInfo->effectSystem);
|
|
mLiveActorKit->init(maxCameras);
|
|
}
|
|
|
|
void Scene::initLiveActorKitWithGraphics(const GraphicsInitArg& graphicsInitArg,
|
|
const SceneInitInfo& info, s32 maxActors, s32 maxPlayers,
|
|
s32 maxCameras) {
|
|
initLiveActorKitImpl(info, maxActors, maxPlayers, maxCameras);
|
|
mLiveActorKit->initGraphics(graphicsInitArg);
|
|
mLiveActorKit->getGraphicsSystemInfo()->setApplicationMessageReceiver(
|
|
info.gameSystemInfo->applicationMessageReciever);
|
|
}
|
|
|
|
void Scene::initLayoutKit(const SceneInitInfo& info) {
|
|
mLayoutKit = new LayoutKit(info.gameSystemInfo->fontHolder);
|
|
mLayoutKit->setEffectSystem(info.gameSystemInfo->effectSystem);
|
|
mLayoutKit->setLayoutSystem(info.gameSystemInfo->layoutSystem);
|
|
mLayoutKit->setDrawContext(getSceneDrawContext(this));
|
|
}
|
|
|
|
void Scene::initSceneStopCtrl() {
|
|
mSceneStopCtrl = new SceneStopCtrl();
|
|
}
|
|
|
|
void Scene::initSceneMsgCtrl() {
|
|
mSceneMsgCtrl = new SceneMsgCtrl();
|
|
}
|
|
|
|
void Scene::initScreenCoverCtrl() {
|
|
mScreenCoverCtrl = new ScreenCoverCtrl();
|
|
}
|
|
|
|
void Scene::endInit(const ActorInitInfo& info) {
|
|
if (mAudioDirector)
|
|
mAudioDirector->initAfterInitPlacement();
|
|
if (mSceneObjHolder)
|
|
mSceneObjHolder->initAfterPlacementSceneObj(info);
|
|
if (mLiveActorKit) {
|
|
GraphicsSystemInfo* graphicsSystemInfo = mLiveActorKit->getGraphicsSystemInfo();
|
|
if (graphicsSystemInfo && graphicsSystemInfo->getSkyDirector())
|
|
graphicsSystemInfo->getSkyDirector()->init(info);
|
|
if (mLiveActorKit) {
|
|
if (mLiveActorKit->getDemoDirector())
|
|
mLiveActorKit->getDemoDirector()->endInit(info);
|
|
mLiveActorKit->endInit();
|
|
}
|
|
}
|
|
if (mLayoutKit)
|
|
mLayoutKit->endInit();
|
|
}
|
|
|
|
} // namespace al
|