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

103 lines
3.3 KiB
C++

#include "Library/Execute/ExecuteRequestKeeper.h"
#include "Library/Execute/ActorExecuteInfo.h"
#include "Library/Execute/ExecutorActorExecuteBase.h"
#include "Library/LiveActor/LiveActor.h"
#include "Library/Model/ModelDrawerBase.h"
#include "Library/Model/ModelKeeper.h"
namespace al {
ExecuteRequestInfo::ExecuteRequestInfo() = default;
ExecuteRequestTable::ExecuteRequestTable(s32 maxSize) : mMaxSize{maxSize} {
LiveActor** actors = new LiveActor*[mMaxSize];
for (s64 i = 0; i != mMaxSize; i++)
actors[i] = nullptr;
mRequests = actors;
}
ExecuteRequestKeeper::ExecuteRequestKeeper(s32 maxSize) {
for (s32 i = 0; i < 4; i++)
mRequestTables[i] = new ExecuteRequestTable(maxSize);
}
void ExecuteRequestKeeper::executeRequestActorMovementAllOn() {
ExecuteRequestTable* movementOn = mRequestTables[Request_Movement];
for (s32 i = 0; i < movementOn->getSize(); i++) {
LiveActor* actor = movementOn->getRequest(i);
ActorExecuteInfo* info = actor->getExecuteInfo();
for (s32 j = 0; j < info->getUpdaterCount(); j++)
info->getUpdater(j)->addActor(actor);
}
movementOn->clear();
}
void ExecuteRequestKeeper::executeRequestActorMovementAllOff() {
ExecuteRequestTable* movementOff = mRequestTables[Request_RemoveFromMovement];
for (s32 i = 0; i < movementOff->getSize(); i++) {
LiveActor* actor = movementOff->getRequest(i);
ActorExecuteInfo* info = actor->getExecuteInfo();
for (s32 j = 0; j < info->getUpdaterCount(); j++)
info->getUpdater(j)->removeActor(actor);
}
movementOff->clear();
}
void ExecuteRequestKeeper::executeRequestActorDrawAllOn() {
ExecuteRequestTable* drawOn = mRequestTables[Request_Draw];
for (s32 i = 0; i < drawOn->getSize(); i++) {
LiveActor* actor = drawOn->getRequest(i);
ActorExecuteInfo* info = actor->getExecuteInfo();
for (s32 j = 0; j < info->getDrawerCount(); j++)
info->getDrawer(j)->addModel(actor->getModelKeeper()->getModelCtrl());
}
drawOn->clear();
}
void ExecuteRequestKeeper::executeRequestActorDrawAllOff() {
ExecuteRequestTable* drawOff = mRequestTables[Request_RemoveFromDraw];
for (s32 i = 0; i < drawOff->getSize(); i++) {
LiveActor* actor = drawOff->getRequest(i);
ActorExecuteInfo* info = actor->getExecuteInfo();
for (s32 j = 0; j < info->getDrawerCount(); j++)
info->getDrawer(j)->removeModel(actor->getModelKeeper()->getModelCtrl());
}
drawOff->clear();
}
void ExecuteRequestKeeper::request(LiveActor* actor, s32 requestType) {
ExecuteRequestTable* addRequestTable = mRequestTables[requestType];
ExecuteRequestTable* removeRequestTable = nullptr;
switch (requestType) {
case Request_Movement:
removeRequestTable = mRequestTables[Request_RemoveFromMovement];
break;
case Request_RemoveFromMovement:
removeRequestTable = mRequestTables[Request_Movement];
break;
case Request_Draw:
removeRequestTable = mRequestTables[Request_RemoveFromDraw];
break;
case Request_RemoveFromDraw:
removeRequestTable = mRequestTables[Request_Draw];
break;
}
removeRequestTable->removeRequest(actor);
addRequestTable->addRequest(actor);
}
} // namespace al