1#include "Library/LiveActor/LiveActorKit.h"
2
3#include "Library/Area/AreaObjDirector.h"
4#include "Library/Area/SwitchAreaDirector.h"
5#include "Library/Camera/CameraDirector.h"
6#include "Library/Collision/CollisionDirector.h"
7#include "Library/Controller/PadRumbleDirector.h"
8#include "Library/Draw/GraphicsSystemInfo.h"
9#include "Library/Effect/EffectSystem.h"
10#include "Library/Execute/ExecuteDirector.h"
11#include "Library/Execute/ExecuteSystemInitInfo.h"
12#include "Library/Execute/ExecuteTableHolderUpdate.h"
13#include "Library/LiveActor/LiveActorGroup.h"
14#include "Library/Model/ModelDisplayListController.h"
15#include "Library/Model/ModelDrawBufferUpdater.h"
16#include "Library/Model/ModelGroup.h"
17#include "Library/Nature/NatureDirector.h"
18#include "Library/Obj/DynamicDrawActor.h"
19#include "Library/Player/PlayerHolder.h"
20#include "Library/Resource/ActorResourceHolder.h"
21#include "Library/Scene/ItemDirectorBase.h"
22#include "Library/Screen/ScreenPointDirector.h"
23#include "Library/Shader/ForwardRendering/ShaderHolder.h"
24#include "Library/Shadow/ShadowDirector.h"
25#include "Library/Shadow/ShadowKeeper.h"
26#include "Library/Stage/StageSwitchDirector.h"
27#include "Project/Clipping/ClippingDirector.h"
28#include "Project/Execute/ExecuteAsyncExecutor.h"
29#include "Project/Gravity/GravityHolder.h"
30#include "Project/HitSensor/HitSensorDirector.h"
31
32namespace al {
33
34LiveActorKit::LiveActorKit(s32 maxActors, s32 maxPlayers) : mMaxActors(maxActors) {
35 mLiveActorGroupAllActors = new LiveActorGroup("全てのアクター", maxActors);
36 mPlayerHolder = new PlayerHolder(maxPlayers);
37 mDynamicDrawActorGroup = new LiveActorGroup("独自描画グループ", 256);
38}
39
40LiveActorKit::~LiveActorKit() {
41 if (mExecuteDirector) {
42 delete mExecuteDirector;
43 mExecuteDirector = nullptr;
44 }
45 if (mCameraDirector) {
46 delete mCameraDirector;
47 mCameraDirector = nullptr;
48 }
49 if (mClippingDirector) {
50 delete mClippingDirector;
51 mClippingDirector = nullptr;
52 }
53 if (mModelGroup) {
54 delete mModelGroup;
55 mModelGroup = nullptr;
56 }
57 if (mGraphicsSystemInfo)
58 delete mGraphicsSystemInfo;
59 if (mModelDrawBufferUpdater)
60 delete mModelDrawBufferUpdater;
61
62 if (mExecutorCore1)
63 delete mExecutorCore1;
64 if (mExecutorCore2)
65 delete mExecutorCore2;
66
67 if (mDynamicDrawActorGroup)
68 for (s32 i = 0; i < mDynamicDrawActorGroup->getActorCount(); i++)
69 ((DynamicDrawActor*)mDynamicDrawActorGroup->getActor(idx: i))->finalize();
70
71 if (mEffectSystem) {
72 mEffectSystem->endScene();
73 mEffectSystem->setCameraDirector(nullptr);
74 if (mEffectSystem)
75 mEffectSystem->setGraphicsSystemInfo(nullptr);
76 }
77}
78
79void LiveActorKit::init(s32 maxCameras) {
80 mModelDrawBufferCounter = new ModelDrawBufferCounter();
81
82 ExecuteSystemInitInfo info{};
83 mExecuteDirector = new ExecuteDirector(mMaxActors);
84 info.drawCtx = mSceneDrawContext;
85 mExecuteDirector->init(initInfo: info);
86
87 mModelDrawBufferUpdater = new ModelDrawBufferUpdater(mExecuteDirector);
88 mExecutorCore1 = new ExecuteAsyncExecutorUpdate(mExecuteDirector, "ビュー更新(コア1)", 1);
89 mExecutorCore2 = new ExecuteAsyncExecutorUpdate(mExecuteDirector, "ビュー更新(コア2)", 2);
90 mAreaObjDirector = new AreaObjDirector();
91 mCollisionDirector = new CollisionDirector(mExecuteDirector);
92 mCameraDirector = new CameraDirector(maxCameras);
93
94 if (mEffectSystem) {
95 mEffectSystem->setCameraDirector(mCameraDirector);
96 mEffectSystem->initScene();
97 }
98
99 mPadRumbleDirector = new PadRumbleDirector(mPlayerHolder, mCameraDirector);
100 mClippingDirector = new ClippingDirector(mMaxActors, mAreaObjDirector, mPlayerHolder,
101 mCameraDirector->getSceneCameraInfo());
102 registerExecutorUser(user: mClippingDirector, director: mExecuteDirector, listName: "クリッピング");
103 mStageSwitchDirector = new StageSwitchDirector(mExecuteDirector);
104 mScreenPointDirector = new ScreenPointDirector();
105 mModelGroup = new ModelGroup(mMaxActors);
106 mModelDisplayListController = new ModelDisplayListController(mModelGroup);
107 mActorResourceHolder = new ActorResourceHolder(mMaxActors);
108}
109
110void LiveActorKit::initGraphics(const GraphicsInitArg& graphics) {
111 mGraphicsSystemInfo = new (0x10) GraphicsSystemInfo();
112 mGraphicsSystemInfo->init(graphics, mAreaObjDirector, mExecuteDirector, mEffectSystem,
113 mPlayerHolder, mCameraDirector->getSceneCameraInfo(),
114 ShaderHolder::instance());
115
116 if (mModelDisplayListController)
117 mModelDisplayListController->setGraphicsSystemInfo(mGraphicsSystemInfo);
118}
119
120void LiveActorKit::initHitSensorDirector() {
121 mHitSensorDirector = new HitSensorDirector(mExecuteDirector);
122}
123
124void LiveActorKit::initGravityHolder() {
125 mGravityHolder = new GravityHolder();
126 mGravityHolder->init();
127}
128
129void LiveActorKit::initShadowDirector() {}
130
131void LiveActorKit::initEffectSystem() {
132 mEffectSystem = EffectSystem::initializeSystem(mGraphicsSystemInfo->getDrawContext(), nullptr);
133}
134
135void LiveActorKit::initSwitchAreaDirector(s32 val1, s32 val2) {
136 mSwitchAreaDirector =
137 SwitchAreaDirector::tryCreate(areaObjDirector: mAreaObjDirector, playerHolder: mPlayerHolder, cameraDirector: mCameraDirector, switchOnAreaGroupCount: val1, switchKeepOnAreaGroupCount: val2);
138}
139
140void LiveActorKit::initNatureDirector() {
141 mNatureDirector = new NatureDirector();
142 mNatureDirector->init();
143}
144
145void LiveActorKit::endInit() {
146 mCollisionDirector->endInit();
147 mClippingDirector->endInit(areaObjDirector: mAreaObjDirector);
148 mAreaObjDirector->endInit();
149 mCameraDirector->endInit(mPlayerHolder);
150
151 if (mEffectSystem)
152 mEffectSystem->startScene(mExecuteDirector);
153
154 if (mSwitchAreaDirector)
155 mSwitchAreaDirector->endInit();
156
157 if (mItemDirector)
158 mItemDirector->endInit();
159
160 if (mShadowDirector)
161 mShadowDirector->endInit();
162
163 if (mNatureDirector && mAreaObjDirector) {
164 AreaObjGroup* waterArea = mAreaObjDirector->getAreaObjGroup(name: "WaterArea");
165 mNatureDirector->setWaterAreaGroup(waterArea);
166 }
167
168 if (mEffectSystem)
169 mEffectSystem->setGraphicsSystemInfo(mGraphicsSystemInfo);
170
171 mGraphicsSystemInfo->endInit();
172
173 if (mEffectSystem)
174 mEffectSystem->endInit();
175
176 for (s32 i = 0; i < mLiveActorGroupAllActors->getActorCount(); i++) {
177 LiveActor* actor = mLiveActorGroupAllActors->getActor(idx: i);
178 actor->initAfterPlacement();
179 if (actor->getShadowKeeper())
180 actor->getShadowKeeper()->initAfterPlacement(mGraphicsSystemInfo);
181 }
182
183 mGraphicsSystemInfo->initAfterPlacement();
184 mExecuteDirector->createExecutorListTable();
185}
186
187void LiveActorKit::update(const char* unk) {
188 clearGraphicsRequest();
189
190 if (mPadRumbleDirector)
191 mPadRumbleDirector->update();
192
193 if (mExecuteDirector)
194 mExecuteDirector->execute(tableName: unk);
195
196 updateGraphics();
197
198 if (mAreaObjDirector)
199 mAreaObjDirector->update();
200
201 if (mSwitchAreaDirector)
202 mSwitchAreaDirector->update();
203}
204
205void LiveActorKit::clearGraphicsRequest() {
206 if (mGraphicsSystemInfo)
207 mGraphicsSystemInfo->clearGraphicsRequest();
208}
209
210void LiveActorKit::updateGraphics() {
211 mExecutorCore1->executeAsync();
212 mExecutorCore2->executeAsync();
213
214 if (mGraphicsSystemInfo)
215 mGraphicsSystemInfo->updateGraphics();
216}
217
218void LiveActorKit::preDrawGraphics() {
219 if (mGraphicsSystemInfo)
220 mGraphicsSystemInfo->preDrawGraphics(mCameraDirector->getSceneCameraInfo());
221}
222
223} // namespace al
224