mirror of
https://github.com/MonsterDruide1/OdysseyDecomp
synced 2026-04-30 04:24:17 +00:00
229 lines
7.6 KiB
C++
229 lines
7.6 KiB
C++
#include "Library/LiveActor/LiveActorKit.h"
|
|
|
|
#include "Library/Area/AreaObjDirector.h"
|
|
#include "Library/Area/SwitchAreaDirector.h"
|
|
#include "Library/Camera/CameraDirector.h"
|
|
#include "Library/Collision/CollisionDirector.h"
|
|
#include "Library/Controller/PadRumbleDirector.h"
|
|
#include "Library/Draw/GraphicsSystemInfo.h"
|
|
#include "Library/Effect/EffectSystem.h"
|
|
#include "Library/Execute/ExecuteDirector.h"
|
|
#include "Library/Execute/ExecuteTableHolderUpdate.h"
|
|
#include "Library/LiveActor/LiveActorGroup.h"
|
|
#include "Library/Model/ModelDisplayListController.h"
|
|
#include "Library/Model/ModelDrawBufferUpdater.h"
|
|
#include "Library/Model/ModelGroup.h"
|
|
#include "Library/Nature/NatureDirector.h"
|
|
#include "Library/Obj/DynamicDrawActor.h"
|
|
#include "Library/Player/PlayerHolder.h"
|
|
#include "Library/Resource/ActorResourceHolder.h"
|
|
#include "Library/Scene/ItemDirectorBase.h"
|
|
#include "Library/Screen/ScreenPointDirector.h"
|
|
#include "Library/Shader/ForwardRendering/ShaderHolder.h"
|
|
#include "Library/Shadow/ShadowDirector.h"
|
|
#include "Library/Shadow/ShadowKeeper.h"
|
|
#include "Library/Stage/StageSwitchDirector.h"
|
|
#include "Project/Clipping/ClippingDirector.h"
|
|
#include "Project/Execute/ExecuteAsyncExecutor.h"
|
|
#include "Project/Execute/ExecuteSystemInitInfo.h"
|
|
#include "Project/Gravity/GravityHolder.h"
|
|
#include "Project/HitSensor/HitSensorDirector.h"
|
|
|
|
namespace al {
|
|
|
|
LiveActorKit::LiveActorKit(s32 maxActors, s32 maxPlayers) : mMaxActors(maxActors) {
|
|
mLiveActorGroupAllActors = new LiveActorGroup("全てのアクター", maxActors);
|
|
mPlayerHolder = new PlayerHolder(maxPlayers);
|
|
mDynamicDrawActorGroup = new LiveActorGroup("独自描画グループ", 256);
|
|
}
|
|
|
|
LiveActorKit::~LiveActorKit() {
|
|
if (mExecuteDirector) {
|
|
delete mExecuteDirector;
|
|
mExecuteDirector = nullptr;
|
|
}
|
|
if (mCameraDirector) {
|
|
delete mCameraDirector;
|
|
mCameraDirector = nullptr;
|
|
}
|
|
if (mClippingDirector) {
|
|
#pragma clang diagnostic push
|
|
// in this case, mClippingDirector has the correct type,
|
|
// causing the destructor to be called correctly
|
|
#pragma clang diagnostic ignored "-Wdelete-non-virtual-dtor"
|
|
delete mClippingDirector;
|
|
#pragma clang diagnostic pop
|
|
mClippingDirector = nullptr;
|
|
}
|
|
if (mModelGroup) {
|
|
delete mModelGroup;
|
|
mModelGroup = nullptr;
|
|
}
|
|
if (mGraphicsSystemInfo)
|
|
delete mGraphicsSystemInfo;
|
|
if (mModelDrawBufferUpdater)
|
|
delete mModelDrawBufferUpdater;
|
|
|
|
if (mExecutorCore1)
|
|
delete mExecutorCore1;
|
|
if (mExecutorCore2)
|
|
delete mExecutorCore2;
|
|
|
|
if (mDynamicDrawActorGroup)
|
|
for (s32 i = 0; i < mDynamicDrawActorGroup->getActorCount(); i++)
|
|
((DynamicDrawActor*)mDynamicDrawActorGroup->getActor(i))->finalize();
|
|
|
|
if (mEffectSystem) {
|
|
mEffectSystem->endScene();
|
|
mEffectSystem->setCameraDirector(nullptr);
|
|
if (mEffectSystem)
|
|
mEffectSystem->setGraphicsSystemInfo(nullptr);
|
|
}
|
|
}
|
|
|
|
void LiveActorKit::init(s32 maxCameras) {
|
|
mModelDrawBufferCounter = new ModelDrawBufferCounter();
|
|
|
|
ExecuteSystemInitInfo info{};
|
|
mExecuteDirector = new ExecuteDirector(mMaxActors);
|
|
info.drawCtx = mSceneDrawContext;
|
|
mExecuteDirector->init(info);
|
|
|
|
mModelDrawBufferUpdater = new ModelDrawBufferUpdater(mExecuteDirector);
|
|
mExecutorCore1 = new ExecuteAsyncExecutorUpdate(mExecuteDirector, "ビュー更新(コア1)", 1);
|
|
mExecutorCore2 = new ExecuteAsyncExecutorUpdate(mExecuteDirector, "ビュー更新(コア2)", 2);
|
|
mAreaObjDirector = new AreaObjDirector();
|
|
mCollisionDirector = new CollisionDirector(mExecuteDirector);
|
|
mCameraDirector = new CameraDirector(maxCameras);
|
|
|
|
if (mEffectSystem) {
|
|
mEffectSystem->setCameraDirector(mCameraDirector);
|
|
mEffectSystem->initScene();
|
|
}
|
|
|
|
mPadRumbleDirector = new PadRumbleDirector(mPlayerHolder, mCameraDirector);
|
|
mClippingDirector = new ClippingDirector(mMaxActors, mAreaObjDirector, mPlayerHolder,
|
|
mCameraDirector->getSceneCameraInfo());
|
|
registerExecutorUser(mClippingDirector, mExecuteDirector, "クリッピング");
|
|
mStageSwitchDirector = new StageSwitchDirector(mExecuteDirector);
|
|
mScreenPointDirector = new ScreenPointDirector();
|
|
mModelGroup = new ModelGroup(mMaxActors);
|
|
mModelDisplayListController = new ModelDisplayListController(mModelGroup);
|
|
mActorResourceHolder = new ActorResourceHolder(mMaxActors);
|
|
}
|
|
|
|
void LiveActorKit::initGraphics(const GraphicsInitArg& graphics) {
|
|
mGraphicsSystemInfo = new (0x10) GraphicsSystemInfo();
|
|
mGraphicsSystemInfo->init(graphics, mAreaObjDirector, mExecuteDirector, mEffectSystem,
|
|
mPlayerHolder, mCameraDirector->getSceneCameraInfo(),
|
|
ShaderHolder::instance());
|
|
|
|
if (mModelDisplayListController)
|
|
mModelDisplayListController->setGraphicsSystemInfo(mGraphicsSystemInfo);
|
|
}
|
|
|
|
void LiveActorKit::initHitSensorDirector() {
|
|
mHitSensorDirector = new HitSensorDirector(mExecuteDirector);
|
|
}
|
|
|
|
void LiveActorKit::initGravityHolder() {
|
|
mGravityHolder = new GravityHolder();
|
|
mGravityHolder->init();
|
|
}
|
|
|
|
void LiveActorKit::initShadowDirector() {}
|
|
|
|
void LiveActorKit::initEffectSystem() {
|
|
mEffectSystem = EffectSystem::initializeSystem(mGraphicsSystemInfo->getDrawContext(), nullptr);
|
|
}
|
|
|
|
void LiveActorKit::initSwitchAreaDirector(s32 val1, s32 val2) {
|
|
mSwitchAreaDirector =
|
|
SwitchAreaDirector::tryCreate(mAreaObjDirector, mPlayerHolder, mCameraDirector, val1, val2);
|
|
}
|
|
|
|
void LiveActorKit::initNatureDirector() {
|
|
mNatureDirector = new NatureDirector();
|
|
mNatureDirector->init();
|
|
}
|
|
|
|
void LiveActorKit::endInit() {
|
|
mCollisionDirector->endInit();
|
|
mClippingDirector->endInit(mAreaObjDirector);
|
|
mAreaObjDirector->endInit();
|
|
mCameraDirector->endInit(mPlayerHolder);
|
|
|
|
if (mEffectSystem)
|
|
mEffectSystem->startScene(mExecuteDirector);
|
|
|
|
if (mSwitchAreaDirector)
|
|
mSwitchAreaDirector->endInit();
|
|
|
|
if (mItemDirector)
|
|
mItemDirector->endInit();
|
|
|
|
if (mShadowDirector)
|
|
mShadowDirector->endInit();
|
|
|
|
if (mNatureDirector && mAreaObjDirector) {
|
|
AreaObjGroup* waterArea = mAreaObjDirector->getAreaObjGroup("WaterArea");
|
|
mNatureDirector->setWaterAreaGroup(waterArea);
|
|
}
|
|
|
|
if (mEffectSystem)
|
|
mEffectSystem->setGraphicsSystemInfo(mGraphicsSystemInfo);
|
|
|
|
mGraphicsSystemInfo->endInit();
|
|
|
|
if (mEffectSystem)
|
|
mEffectSystem->endInit();
|
|
|
|
for (s32 i = 0; i < mLiveActorGroupAllActors->getActorCount(); i++) {
|
|
LiveActor* actor = mLiveActorGroupAllActors->getActor(i);
|
|
actor->initAfterPlacement();
|
|
if (actor->getShadowKeeper())
|
|
actor->getShadowKeeper()->initAfterPlacement(mGraphicsSystemInfo);
|
|
}
|
|
|
|
mGraphicsSystemInfo->initAfterPlacement();
|
|
mExecuteDirector->createExecutorListTable();
|
|
}
|
|
|
|
void LiveActorKit::update(const char* tableName) {
|
|
clearGraphicsRequest();
|
|
|
|
if (mPadRumbleDirector)
|
|
mPadRumbleDirector->update();
|
|
|
|
if (mExecuteDirector)
|
|
mExecuteDirector->execute(tableName);
|
|
|
|
updateGraphics();
|
|
|
|
if (mAreaObjDirector)
|
|
mAreaObjDirector->update();
|
|
|
|
if (mSwitchAreaDirector)
|
|
mSwitchAreaDirector->update();
|
|
}
|
|
|
|
void LiveActorKit::clearGraphicsRequest() {
|
|
if (mGraphicsSystemInfo)
|
|
mGraphicsSystemInfo->clearGraphicsRequest();
|
|
}
|
|
|
|
void LiveActorKit::updateGraphics() {
|
|
mExecutorCore1->executeAsync();
|
|
mExecutorCore2->executeAsync();
|
|
|
|
if (mGraphicsSystemInfo)
|
|
mGraphicsSystemInfo->updateGraphics();
|
|
}
|
|
|
|
void LiveActorKit::preDrawGraphics() {
|
|
if (mGraphicsSystemInfo)
|
|
mGraphicsSystemInfo->preDrawGraphics(mCameraDirector->getSceneCameraInfo());
|
|
}
|
|
|
|
} // namespace al
|