OdysseyDecomp/lib/al/Library/Execute/ExecuteTableHolderDraw.cpp

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