1#include "Library/Scene/Scene.h"
2
3#include "Library/Audio/AudioDirector.h"
4#include "Library/Draw/GraphicsSystemInfo.h"
5#include "Library/Layout/LayoutSystem.h"
6#include "Library/LiveActor/LiveActorKit.h"
7#include "Library/Model/ModelDisplayListController.h"
8#include "Library/Model/ModelOcclusionCullingDirector.h"
9#include "Library/Model/SkyDirector.h"
10#include "Library/Scene/DemoDirector.h"
11#include "Library/Scene/SceneMsgCtrl.h"
12#include "Library/Scene/SceneObjHolder.h"
13#include "Library/Scene/SceneStopCtrl.h"
14#include "Library/Scene/SceneUtil.h"
15#include "Library/Screen/ScreenCoverCtrl.h"
16#include "Library/Stage/StageResourceKeeper.h"
17#include "Library/System/GameSystemInfo.h"
18#include "Project/LiveActor/ActorExecuteFunction.h"
19
20namespace al {
21
22Scene::Scene(const char* name) : NerveExecutor(name), mName(name) {}
23
24Scene::~Scene() {
25 if (mAudioDirector)
26 mAudioDirector->finalize();
27 if (mStageResourceKeeper)
28 delete mStageResourceKeeper;
29 mStageResourceKeeper = nullptr;
30 if (mLiveActorKit)
31 delete mLiveActorKit;
32 mLiveActorKit = nullptr;
33 if (mLayoutKit)
34 delete mLayoutKit;
35 mLayoutKit = nullptr;
36}
37
38void Scene::appear() {
39 mIsAlive = true;
40 if (mLiveActorKit)
41 executeUpdateDrawBuffer(mLiveActorKit);
42}
43
44void Scene::kill() {
45 mIsAlive = false;
46}
47
48void Scene::movement() {
49 if (mLiveActorKit)
50 incrementDrawBufferCounter(mLiveActorKit);
51 if (mSceneStopCtrl)
52 mSceneStopCtrl->update();
53 if (mScreenCoverCtrl)
54 mScreenCoverCtrl->update();
55 if (mLiveActorKit)
56 waitUpdateDrawBuffer(mLiveActorKit);
57 if (mAudioDirector)
58 mAudioDirector->updatePre();
59
60 updateNerve();
61 control();
62
63 if (mAudioDirector)
64 mAudioDirector->updatePost();
65 if (mLiveActorKit) {
66 waitUpdateCalcView(mLiveActorKit);
67 if (mLiveActorKit->getModelDisplayListController())
68 mLiveActorKit->getModelDisplayListController()->update();
69 executeUpdateDrawBuffer(mLiveActorKit);
70 ModelOcclusionCullingDirector* modelOcclusionCullingDirector =
71 mLiveActorKit->getGraphicsSystemInfo()->getModelOcclusionCullingDirector();
72 if (modelOcclusionCullingDirector)
73 modelOcclusionCullingDirector->calc();
74 }
75}
76
77CameraDirector* Scene::getCameraDirector() const {
78 return mLiveActorKit->getCameraDirector();
79}
80
81void Scene::initializeAsync(const SceneInitInfo& initInfo) {
82 init(initInfo);
83}
84
85void Scene::initDrawSystemInfo(const SceneInitInfo& initInfo) {
86 mDrawSystemInfo = initInfo.gameSysInfo->drawSystemInfo;
87}
88
89void Scene::initSceneObjHolder(SceneObjHolder* sceneObjHolder) {
90 mSceneObjHolder = sceneObjHolder;
91}
92
93void Scene::initAndLoadStageResource(const char* stageName, s32 scenarioNo) {
94 mStageResourceKeeper = new StageResourceKeeper();
95 mStageResourceKeeper->initAndLoadResource(stageName, scenarioNo);
96}
97
98void Scene::initLiveActorKit(const SceneInitInfo& initInfo, s32 maxActors, s32 maxPlayers,
99 s32 maxCameras) {
100 initLiveActorKitImpl(initInfo, maxActors, maxPlayers, maxCameras);
101
102 DrawSystemInfo* drawSystemInfo = initInfo.gameSysInfo->drawSystemInfo;
103 GraphicsInitArg graphicsInitArg = {getSceneDrawContext(scene: this),
104 drawSystemInfo->dockedRenderBuffer};
105 graphicsInitArg._3c = maxCameras;
106 graphicsInitArg._10 = maxCameras << graphicsInitArg.atmosScatterViewNum;
107 mLiveActorKit->initGraphics(graphics: graphicsInitArg);
108
109 mLiveActorKit->getGraphicsSystemInfo()->setApplicationMessageReceiver(
110 initInfo.gameSysInfo->applicationMessageReciever);
111}
112
113void Scene::initLiveActorKitImpl(const SceneInitInfo& initInfo, s32 maxActors, s32 maxPlayers,
114 s32 maxCameras) {
115 mLiveActorKit = new LiveActorKit(maxActors, maxPlayers);
116 mLiveActorKit->setSceneDrawContext(getSceneDrawContext(scene: this));
117 mLiveActorKit->setGamePadSystem(initInfo.gameSysInfo->gamePadSystem);
118 mLiveActorKit->setEffectSystem(initInfo.gameSysInfo->effectSystem);
119 mLiveActorKit->init(maxCameras);
120}
121
122void Scene::initLiveActorKitWithGraphics(const GraphicsInitArg& graphicsInitArg,
123 const SceneInitInfo& initInfo, s32 maxActors,
124 s32 maxPlayers, s32 maxCameras) {
125 initLiveActorKitImpl(initInfo, maxActors, maxPlayers, maxCameras);
126 mLiveActorKit->initGraphics(graphics: graphicsInitArg);
127 mLiveActorKit->getGraphicsSystemInfo()->setApplicationMessageReceiver(
128 initInfo.gameSysInfo->applicationMessageReciever);
129}
130
131void Scene::initLayoutKit(const SceneInitInfo& initInfo) {
132 mLayoutKit = new LayoutKit(initInfo.gameSysInfo->fontHolder);
133 mLayoutKit->setEffectSystem(initInfo.gameSysInfo->effectSystem);
134 mLayoutKit->setLayoutSystem(initInfo.gameSysInfo->layoutSystem);
135 mLayoutKit->setDrawContext(getSceneDrawContext(scene: this));
136}
137
138void Scene::initSceneStopCtrl() {
139 mSceneStopCtrl = new SceneStopCtrl();
140}
141
142void Scene::initSceneMsgCtrl() {
143 mSceneMsgCtrl = new SceneMsgCtrl();
144}
145
146void Scene::initScreenCoverCtrl() {
147 mScreenCoverCtrl = new ScreenCoverCtrl();
148}
149
150void Scene::endInit(const ActorInitInfo& initInfo) {
151 if (mAudioDirector)
152 mAudioDirector->initAfterInitPlacement();
153 if (mSceneObjHolder)
154 mSceneObjHolder->initAfterPlacementSceneObj(initInfo);
155 if (mLiveActorKit) {
156 GraphicsSystemInfo* graphicsSystemInfo = mLiveActorKit->getGraphicsSystemInfo();
157 if (graphicsSystemInfo && graphicsSystemInfo->getSkyDirector())
158 graphicsSystemInfo->getSkyDirector()->init(initInfo);
159 if (mLiveActorKit) {
160 if (mLiveActorKit->getDemoDirector())
161 mLiveActorKit->getDemoDirector()->endInit(initInfo);
162 mLiveActorKit->endInit();
163 }
164 }
165 if (mLayoutKit)
166 mLayoutKit->endInit();
167}
168
169} // namespace al
170