OdysseyDecomp/lib/al/Library/LiveActor/LiveActorKit.cpp

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