mirror of
https://github.com/MonsterDruide1/OdysseyDecomp
synced 2026-04-29 12:04:09 +00:00
345 lines
16 KiB
C++
345 lines
16 KiB
C++
#include "Library/Execute/ExecuteTableHolderDraw.h"
|
|
|
|
#include "Library/Base/StringUtil.h"
|
|
#include "Library/Execute/ExecuteOrder.h"
|
|
#include "Library/Execute/ExecutorListActorDraw.h"
|
|
#include "Library/Execute/ExecutorListActorModelDraw.h"
|
|
#include "Library/Execute/ExecutorListBase.h"
|
|
#include "Library/Execute/ExecutorListFunctor.h"
|
|
#include "Library/Execute/ExecutorListLayoutDraw.h"
|
|
#include "Library/Execute/ExecutorListUser.h"
|
|
#include "Project/Execute/ExecuteFunction.h"
|
|
|
|
namespace al {
|
|
ExecuteTableHolderDraw::ExecuteTableHolderDraw() = default;
|
|
|
|
ExecuteTableHolderDraw::~ExecuteTableHolderDraw() {
|
|
for (s32 i = 0; i < mExecutorsActorModelSize; i++)
|
|
if (mExecutorsActorModel[i])
|
|
delete mExecutorsActorModel[i];
|
|
};
|
|
|
|
void ExecuteTableHolderDraw::init(const char* name, const ExecuteSystemInitInfo& initInfo,
|
|
const ExecuteOrder* orders, s32 orderCount) {
|
|
mName = name;
|
|
mExecutorsAllCapacity = orderCount;
|
|
mExecutorsAll = new ExecutorListBase*[orderCount];
|
|
|
|
mExecutorsActorCapacity = alExecutorFunction::calcDrawListActorNumMax(orders, orderCount);
|
|
mExecutorsActor = new ExecutorListActorDraw*[mExecutorsActorCapacity];
|
|
|
|
mExecutorsActorModelCapacity =
|
|
alExecutorFunction::calcDrawListActorModelNumMax(orders, orderCount);
|
|
mExecutorsActorModel = new ExecutorListActorModelDrawBase*[mExecutorsActorModelCapacity];
|
|
|
|
mExecutorsLayoutCapacity = alExecutorFunction::calcDrawListLayoutNumMax(orders, orderCount);
|
|
mExecutorsLayout = new ExecutorListLayoutDrawBase*[mExecutorsLayoutCapacity];
|
|
|
|
mExecutorsUserCapacity = alExecutorFunction::calcExecutorListNumMax(orders, orderCount, "Draw");
|
|
mExecutorsUser = new ExecutorListIUseExecutorDraw*[mExecutorsUserCapacity];
|
|
|
|
mExecutorsFunctorCapacity =
|
|
alExecutorFunction::calcExecutorListNumMax(orders, orderCount, "Functor");
|
|
mExecutorsFunctor = new ExecutorListFunctor*[mExecutorsFunctorCapacity];
|
|
for (s64 i = 0; i < mExecutorsAllCapacity; i++) {
|
|
const ExecuteOrder& order = orders[i];
|
|
|
|
ExecutorListBase* list = nullptr;
|
|
if (alExecutorFunction::isListName(order, "ActorModelDraw")) {
|
|
list = registerExecutorListActorModel(
|
|
new ExecutorListActorModelDrawForward(order.listName, order.listMaxSize, initInfo));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "ActorModelDrawForwardOnly")) {
|
|
list = registerExecutorListActorModel(new ExecutorListActorModelDrawForwardOnly(
|
|
order.listName, order.listMaxSize, initInfo));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "ActorModelDrawForwardForce")) {
|
|
list = registerExecutorListActorModel(new ExecutorListActorModelDrawForwardForce(
|
|
order.listName, order.listMaxSize, initInfo));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "ActorModelDrawPostEffectMask")) {
|
|
list =
|
|
registerExecutorListActorModel(new ExecutorListActorModelDrawForwardPostEffectMask(
|
|
order.listName, order.listMaxSize, initInfo));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "ActorModelDrawIndirect")) {
|
|
list = registerExecutorListActorModel(new ExecutorListActorModelDrawIndirect(
|
|
order.listName, order.listMaxSize, initInfo));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "ActorModelDrawIndirectOnly")) {
|
|
list = registerExecutorListActorModel(new ExecutorListActorModelDrawIndirectOnly(
|
|
order.listName, order.listMaxSize, initInfo));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "ActorModelDrawDeferred")) {
|
|
list = registerExecutorListActorModel(new ExecutorListActorModelDrawDeferred(
|
|
order.listName, order.listMaxSize, initInfo));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "ActorModelDrawDeferredMarchingCube")) {
|
|
list =
|
|
registerExecutorListActorModel(new ExecutorListActorModelDrawDeferredMarchingCube(
|
|
order.listName, order.listMaxSize, initInfo));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "ActorModelDrawDeferredOnly")) {
|
|
list = registerExecutorListActorModel(new ExecutorListActorModelDrawDeferredOnly(
|
|
order.listName, order.listMaxSize, initInfo));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "ActorModelDrawDeferredOpa")) {
|
|
list = registerExecutorListActorModel(new ExecutorListActorModelDrawDeferredOpa(
|
|
order.listName, order.listMaxSize, initInfo));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "ActorModelDrawDeferredXlu")) {
|
|
list = registerExecutorListActorModel(new ExecutorListActorModelDrawDeferredXlu(
|
|
order.listName, order.listMaxSize, initInfo));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "ActorModelDrawDepthOnly")) {
|
|
list = registerExecutorListActorModel(new ExecutorListActorModelDrawDepthOnly(
|
|
order.listName, order.listMaxSize, initInfo));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "ActorModelDrawCulling")) {
|
|
list = registerExecutorListActorModel(
|
|
new ExecutorListActorModelDrawCulling(order.listName, order.listMaxSize, initInfo));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "ActorModelDrawDepthForce")) {
|
|
list = registerExecutorListActorModel(new ExecutorListActorModelDrawDepthForce(
|
|
order.listName, order.listMaxSize, initInfo));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "ActorModelDrawDepthXlu")) {
|
|
list = registerExecutorListActorModel(new ExecutorListActorModelDrawDepthXlu(
|
|
order.listName, order.listMaxSize, initInfo));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "ActorModelDrawDepthIndirect")) {
|
|
list = registerExecutorListActorModel(new ExecutorListActorModelDrawDepthIndirect(
|
|
order.listName, order.listMaxSize, initInfo));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "ActorModelDrawDepthDither")) {
|
|
list = registerExecutorListActorModel(new ExecutorListActorModelDrawDepthDither(
|
|
order.listName, order.listMaxSize, initInfo));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "ActorModelDrawDepthDitherIndirect")) {
|
|
list = registerExecutorListActorModel(new ExecutorListActorModelDrawDepthDitherIndirect(
|
|
order.listName, order.listMaxSize, initInfo));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "ActorModelDrawDepthShadow")) {
|
|
list = registerExecutorListActorModel(new ExecutorListActorModelDrawDepthShadow(
|
|
order.listName, order.listMaxSize, initInfo));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "ActorModelDrawDepthShadowMarchingCube")) {
|
|
list = registerExecutorListActorModel(
|
|
new ExecutorListActorModelDrawDepthShadowMarchingCube(order.listName,
|
|
order.listMaxSize, initInfo));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "ActorModelDrawStaticDepthShadow")) {
|
|
list = registerExecutorListActorModel(new ExecutorListActorModelDrawStaticDepthShadow(
|
|
order.listName, order.listMaxSize, initInfo));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "ActorModelDrawDeferredSilhouette")) {
|
|
list = registerExecutorListActorModel(new ExecutorListActorModelDrawDeferredSilhouette(
|
|
order.listName, order.listMaxSize, initInfo));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "ActorModelDrawDeferredSilhouetteRide")) {
|
|
list =
|
|
registerExecutorListActorModel(new ExecutorListActorModelDrawDeferredSilhouetteRide(
|
|
order.listName, order.listMaxSize, initInfo));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "ActorModelDrawDeferredFootPrint")) {
|
|
list = registerExecutorListActorModel(new ExecutorListActorModelDrawDeferredFootPrint(
|
|
order.listName, order.listMaxSize, initInfo));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "ActorModelDrawDeferredSky")) {
|
|
list = registerExecutorListActorModel(new ExecutorListActorModelDrawDeferredSky(
|
|
order.listName, order.listMaxSize, initInfo));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "ActorModelDrawWorldAo")) {
|
|
list = registerExecutorListActorModel(
|
|
new ExecutorListActorModelDrawWorldAo(order.listName, order.listMaxSize, initInfo));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "ActorModelDrawUpdate")) {
|
|
list = registerExecutorListActorModel(
|
|
new ExecutorListActorModelDrawUpdate(order.listName, order.listMaxSize, initInfo));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "ActorModelDrawPlayerChromakey")) {
|
|
list = registerExecutorListActorModel(new ExecutorListActorModelDrawPlayerChromakey(
|
|
order.listName, order.listMaxSize, initInfo));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "ActorModelDrawPlayerChromakeyOpa")) {
|
|
list = registerExecutorListActorModel(new ExecutorListActorModelDrawPlayerChromakeyOpa(
|
|
order.listName, order.listMaxSize, initInfo));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "ActorModelDrawPlayerChromakeyXlu")) {
|
|
list = registerExecutorListActorModel(new ExecutorListActorModelDrawPlayerChromakeyXlu(
|
|
order.listName, order.listMaxSize, initInfo));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "ActorModelDrawCharacterChromakey")) {
|
|
list = registerExecutorListActorModel(new ExecutorListActorModelDrawCharacterChromakey(
|
|
order.listName, order.listMaxSize, initInfo));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "ActorModelDrawDepthChromakey")) {
|
|
list = registerExecutorListActorModel(new ExecutorListActorModelDrawDepthChromakey(
|
|
order.listName, order.listMaxSize, initInfo));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "ActorModelDrawDitherChromakey")) {
|
|
list = registerExecutorListActorModel(new ExecutorListActorModelDrawDitherChromakey(
|
|
order.listName, order.listMaxSize, initInfo));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "ActorDraw")) {
|
|
list = registerExecutorListActor(
|
|
new ExecutorListActorDraw(order.listName, order.listMaxSize));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "LayoutDraw")) {
|
|
list = registerExecutorListLayout(
|
|
new ExecutorListLayoutDrawNormal(order.listName, order.listMaxSize, initInfo));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "Draw")) {
|
|
list = registerExecutorListUser(
|
|
new ExecutorListIUseExecutorDraw(order.listName, order.listMaxSize));
|
|
|
|
} else if (alExecutorFunction::isListName(order, "Functor")) {
|
|
list = registerExecutorListFunctor(
|
|
new ExecutorListFunctor(order.listName, order.listMaxSize));
|
|
}
|
|
|
|
registerExecutorListAll(list);
|
|
}
|
|
}
|
|
|
|
ExecutorListActorModelDrawBase* ExecuteTableHolderDraw::registerExecutorListActorModel(
|
|
ExecutorListActorModelDrawBase* listActorModel) {
|
|
mExecutorsActorModel[mExecutorsActorModelSize] = listActorModel;
|
|
mExecutorsActorModelSize++;
|
|
return listActorModel;
|
|
}
|
|
|
|
ExecutorListActorDraw*
|
|
ExecuteTableHolderDraw::registerExecutorListActor(ExecutorListActorDraw* listActor) {
|
|
mExecutorsActor[mExecutorsActorSize] = listActor;
|
|
mExecutorsActorSize++;
|
|
return listActor;
|
|
}
|
|
|
|
ExecutorListLayoutDrawBase*
|
|
ExecuteTableHolderDraw::registerExecutorListLayout(ExecutorListLayoutDrawBase* listLayout) {
|
|
mExecutorsLayout[mExecutorsLayoutSize] = listLayout;
|
|
mExecutorsLayoutSize++;
|
|
return listLayout;
|
|
}
|
|
|
|
ExecutorListIUseExecutorDraw*
|
|
ExecuteTableHolderDraw::registerExecutorListUser(ExecutorListIUseExecutorDraw* listUser) {
|
|
mExecutorsUser[mExecutorsUserSize] = listUser;
|
|
mExecutorsUserSize++;
|
|
return listUser;
|
|
}
|
|
|
|
ExecutorListFunctor*
|
|
ExecuteTableHolderDraw::registerExecutorListFunctor(ExecutorListFunctor* listFunctor) {
|
|
mExecutorsFunctor[mExecutorsFunctorSize] = listFunctor;
|
|
mExecutorsFunctorSize++;
|
|
return listFunctor;
|
|
}
|
|
|
|
void ExecuteTableHolderDraw::registerExecutorListAll(ExecutorListBase* list) {
|
|
mExecutorsAll[mExecutorsAllSize] = list;
|
|
mExecutorsAllSize++;
|
|
}
|
|
|
|
bool ExecuteTableHolderDraw::tryRegisterActor(LiveActor* actor, const char* listName) {
|
|
bool isRegistered = false;
|
|
for (s32 i = 0; i < mExecutorsActorSize; i++) {
|
|
ExecutorListActorDraw* listActor = mExecutorsActor[i];
|
|
if (isEqualString(listActor->getName(), listName)) {
|
|
listActor->registerActor(actor);
|
|
isRegistered = true;
|
|
}
|
|
}
|
|
return isRegistered;
|
|
}
|
|
|
|
bool ExecuteTableHolderDraw::tryRegisterActorModel(LiveActor* actor, const char* listName) {
|
|
bool isRegistered = false;
|
|
for (s32 i = 0; i < mExecutorsActorModelSize; i++) {
|
|
ExecutorListActorModelDrawBase* listActor = mExecutorsActorModel[i];
|
|
if (isEqualString(listActor->getName(), listName)) {
|
|
listActor->registerActorModel(actor);
|
|
isRegistered = true;
|
|
}
|
|
}
|
|
return isRegistered;
|
|
}
|
|
|
|
bool ExecuteTableHolderDraw::tryRegisterLayout(LayoutActor* layout, const char* listName) {
|
|
bool isRegistered = false;
|
|
for (s32 i = 0; i < mExecutorsLayoutSize; i++) {
|
|
ExecutorListLayoutDrawBase* listLayout = mExecutorsLayout[i];
|
|
if (isEqualString(listLayout->getName(), listName)) {
|
|
listLayout->registerLayout(layout);
|
|
isRegistered = true;
|
|
}
|
|
}
|
|
return isRegistered;
|
|
}
|
|
|
|
bool ExecuteTableHolderDraw::tryRegisterUser(IUseExecutor* user, const char* listName) {
|
|
bool isRegistered = false;
|
|
for (s32 i = 0; i < mExecutorsUserSize; i++) {
|
|
ExecutorListIUseExecutorBase* listLayout = mExecutorsUser[i];
|
|
if (isEqualString(listLayout->getName(), listName)) {
|
|
listLayout->registerUser(user);
|
|
isRegistered = true;
|
|
}
|
|
}
|
|
return isRegistered;
|
|
}
|
|
|
|
bool ExecuteTableHolderDraw::tryRegisterFunctor(const FunctorBase& functor, const char* listName) {
|
|
bool isRegistered = false;
|
|
for (s32 i = 0; i < mExecutorsFunctorSize; i++) {
|
|
ExecutorListFunctor* listLayout = mExecutorsFunctor[i];
|
|
if (isEqualString(listLayout->getName(), listName)) {
|
|
listLayout->registerFunctor(functor);
|
|
isRegistered = true;
|
|
}
|
|
}
|
|
return isRegistered;
|
|
}
|
|
|
|
void ExecuteTableHolderDraw::createExecutorListTable() {
|
|
for (s32 i = 0; i < mExecutorsActorSize; i++)
|
|
mExecutorsActor[i]->createList();
|
|
|
|
for (s32 i = 0; i < mExecutorsActorModelSize; i++)
|
|
mExecutorsActorModel[i]->createList();
|
|
|
|
mActiveExecutorsSize = 0;
|
|
for (s32 i = 0; i < mExecutorsAllSize; i++)
|
|
if (mExecutorsAll[i]->isActive())
|
|
mActiveExecutorsSize++;
|
|
|
|
s32 activeIndex = 0;
|
|
mActiveExecutors = new ExecutorListBase*[mActiveExecutorsSize];
|
|
for (s32 i = 0; i < mExecutorsAllSize; i++) {
|
|
ExecutorListBase* list = mExecutorsAll[i];
|
|
if (list->isActive())
|
|
mActiveExecutors[activeIndex++] = list;
|
|
}
|
|
}
|
|
|
|
void ExecuteTableHolderDraw::execute() const {
|
|
for (s32 i = 0; i < mActiveExecutorsSize; i++)
|
|
mActiveExecutors[i]->executeList();
|
|
}
|
|
|
|
void ExecuteTableHolderDraw::executeList(const char* listName) const {
|
|
for (s32 i = 0; i < mActiveExecutorsSize; i++)
|
|
if (isEqualString(mActiveExecutors[i]->getName(), listName))
|
|
mActiveExecutors[i]->executeList();
|
|
}
|
|
|
|
bool ExecuteTableHolderDraw::isActive() const {
|
|
for (s32 i = 0; i < mActiveExecutorsSize; i++)
|
|
if (!mActiveExecutors[i]->isActive())
|
|
return false;
|
|
|
|
return mActiveExecutorsSize > 0;
|
|
}
|
|
} // namespace al
|