mirror of
https://github.com/MonsterDruide1/OdysseyDecomp
synced 2026-05-07 07:48:28 +00:00
196 lines
8 KiB
C++
196 lines
8 KiB
C++
#include "Library/Obj/PartsFunction.h"
|
|
|
|
#include <math/seadMatrix.h>
|
|
|
|
#include "Library/Area/AreaObjGroup.h"
|
|
#include "Library/Base/StringUtil.h"
|
|
#include "Library/Execute/ExecuteTableHolderUpdate.h"
|
|
#include "Library/LiveActor/ActorAreaFunction.h"
|
|
#include "Library/LiveActor/ActorClippingFunction.h"
|
|
#include "Library/LiveActor/ActorFlagFunction.h"
|
|
#include "Library/LiveActor/ActorInitUtil.h"
|
|
#include "Library/LiveActor/ActorModelFunction.h"
|
|
#include "Library/LiveActor/ActorMovementFunction.h"
|
|
#include "Library/LiveActor/ActorResourceFunction.h"
|
|
#include "Library/Math/MathUtil.h"
|
|
#include "Library/Obj/BreakModel.h"
|
|
#include "Library/Obj/CollisionObj.h"
|
|
#include "Library/Obj/HostSyncTowerCamera.h"
|
|
#include "Library/Obj/KeyMoveCameraObj.h"
|
|
#include "Library/Obj/PartsModel.h"
|
|
#include "Library/Placement/PlacementFunction.h"
|
|
#include "Library/Shadow/ActorShadowUtil.h"
|
|
#include "Library/Yaml/ByamlUtil.h"
|
|
|
|
namespace al {
|
|
|
|
static const sead::Matrix34f* getJointMtx(const LiveActor* parent, const char* jointMtxName) {
|
|
return jointMtxName ? getJointMtxPtr(parent, jointMtxName) : parent->getBaseMtx();
|
|
}
|
|
|
|
CollisionObj* createCollisionObj(const LiveActor* parent, const ActorInitInfo& info,
|
|
const char* collisionFileName, HitSensor* hitSensor,
|
|
const char* jointMtxName, const char* suffix) {
|
|
return new CollisionObj(info, getModelResource(parent), collisionFileName, hitSensor,
|
|
getJointMtx(parent, jointMtxName), suffix);
|
|
}
|
|
|
|
CollisionObj* createCollisionObjMtx(const LiveActor* parent, const ActorInitInfo& info,
|
|
const char* collisionFileName, HitSensor* hitSensor,
|
|
const sead::Matrix34f* jointMtx, const char* suffix) {
|
|
return new CollisionObj(info, getModelResource(parent), collisionFileName, hitSensor, jointMtx,
|
|
suffix);
|
|
}
|
|
|
|
PartsModel* createPartsModel(LiveActor* parent, const ActorInitInfo& info, const char* name,
|
|
const char* arcName, const sead::Matrix34f* jointMtx) {
|
|
PartsModel* partsModel = new PartsModel(name);
|
|
if (!jointMtx)
|
|
jointMtx = parent->getBaseMtx();
|
|
partsModel->initPartsMtx(parent, info, arcName, jointMtx, false);
|
|
return partsModel;
|
|
}
|
|
|
|
PartsModel* createPartsModelFile(LiveActor* parent, const ActorInitInfo& info, const char* name,
|
|
const char* arcName, const char* suffix) {
|
|
return createPartsModelFileSuffix(parent, info, name, arcName, nullptr, suffix);
|
|
}
|
|
|
|
PartsModel* createPartsModelFileSuffix(LiveActor* parent, const ActorInitInfo& info,
|
|
const char* name, const char* arcName, const char* arcSuffix,
|
|
const char* suffix) {
|
|
PartsModel* partsModel = new PartsModel(name);
|
|
partsModel->initPartsFixFile(parent, info, arcName, arcSuffix, suffix);
|
|
StringTmp<128>("[PartsModel] %s", partsModel->getName()).cstr();
|
|
return partsModel;
|
|
}
|
|
|
|
PartsModel* createSimplePartsModel(LiveActor* parent, const ActorInitInfo& info, const char* name,
|
|
const char* arcName, const char* suffix) {
|
|
return createPartsModelFileSuffix(parent, info, name, arcName, nullptr, suffix);
|
|
}
|
|
|
|
PartsModel* createSimplePartsModelSuffix(LiveActor* parent, const ActorInitInfo& info,
|
|
const char* name, const char* arcName,
|
|
const char* arcSuffix, const char* suffix) {
|
|
return createPartsModelFileSuffix(parent, info, name, arcName, arcSuffix, suffix);
|
|
}
|
|
|
|
PartsModel* createPartsModelSuffix(LiveActor* parent, const ActorInitInfo& info, const char* name,
|
|
const char* arcName, const char* suffix,
|
|
const sead::Matrix34f* jointMtx) {
|
|
PartsModel* partsModel = new PartsModel(name);
|
|
if (!jointMtx)
|
|
jointMtx = parent->getBaseMtx();
|
|
partsModel->initPartsSuffix(parent, info, arcName, suffix, jointMtx, false);
|
|
return partsModel;
|
|
}
|
|
|
|
PartsModel* createPartsModelJoint(LiveActor* parent, const ActorInitInfo& info, const char* name,
|
|
const char* arcName, const char* jointMtxName) {
|
|
PartsModel* partsModel = new PartsModel(name);
|
|
partsModel->initPartsMtx(parent, info, arcName, getJointMtxPtr(parent, jointMtxName), false);
|
|
return partsModel;
|
|
}
|
|
|
|
PartsModel* createPartsModelSuffixJoint(LiveActor* parent, const ActorInitInfo& info,
|
|
const char* name, const char* arcName,
|
|
const char* arcSuffix, const char* jointMtxName) {
|
|
PartsModel* partsModel = new PartsModel(name);
|
|
partsModel->initPartsSuffix(parent, info, arcName, arcSuffix,
|
|
getJointMtxPtr(parent, jointMtxName), false);
|
|
return partsModel;
|
|
}
|
|
|
|
void appearBreakModelRandomRotateY(LiveActor* actor) {
|
|
actor->appear();
|
|
addRotateAndRepeatY(actor, getRandomDegree());
|
|
}
|
|
|
|
bool updateSyncHostVisible(bool* isChildHidden, LiveActor* actor, const LiveActor* host, bool unk) {
|
|
if (isDead(host) || isClipped(host) || isHideModel(host) || unk) {
|
|
if (!*isChildHidden) {
|
|
if (isExistModel(actor))
|
|
alActorSystemFunction::removeFromExecutorDraw(actor);
|
|
|
|
if (isExistShadow(actor))
|
|
hideShadow(actor);
|
|
|
|
*isChildHidden = true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
if (*isChildHidden) {
|
|
if (isExistModel(actor))
|
|
alActorSystemFunction::addToExecutorDraw(actor);
|
|
|
|
if (isExistShadow(actor))
|
|
showShadow(actor);
|
|
|
|
*isChildHidden = false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool isTraceModelRandomRotate(const LiveActor* actor) {
|
|
if (!isExistModelResourceYaml(actor, "InitTraceModel", nullptr))
|
|
return false;
|
|
|
|
return tryGetByamlKeyBoolOrFalse(getModelResourceYaml(actor, "InitTraceModel", nullptr),
|
|
"IsRandomRotate");
|
|
}
|
|
|
|
BreakModel* createBreakModel(const LiveActor* parent, const ActorInitInfo& info,
|
|
const char* objName, const char* modelName, const char* fileSuffixName,
|
|
const sead::Matrix34f* rootMtx, const char* breakActionName) {
|
|
BreakModel* breakModel =
|
|
new BreakModel(parent, objName, modelName, fileSuffixName, rootMtx, breakActionName);
|
|
initCreateActorWithPlacementInfo(breakModel, info);
|
|
return breakModel;
|
|
}
|
|
|
|
HostSyncTowerCamera* createHostSyncTowerCamera(LiveActor* actor, const ActorInitInfo& info) {
|
|
AreaObjGroup* areaObjGroup = createLinkAreaGroup(
|
|
actor, info, "HostSyncTowerCameraArea", "アクター追従塔カメラ起動エリア", "子供エリア");
|
|
return new HostSyncTowerCamera(actor, areaObjGroup, info);
|
|
}
|
|
|
|
void activateHostSyncTowerCamera(HostSyncTowerCamera* camera) {
|
|
camera->activate();
|
|
}
|
|
|
|
void deactivateHostSyncTowerCamera(HostSyncTowerCamera* camera) {
|
|
camera->deactivate();
|
|
}
|
|
|
|
void updateHostSyncTowerCamera(HostSyncTowerCamera* camera) {
|
|
camera->update();
|
|
}
|
|
|
|
KeyMoveCameraObj* tryCreateLinksKeyMoveCameraObj(const ActorInitInfo& info, const char* childName) {
|
|
if (!isExistLinkChild(info, childName, 0))
|
|
return nullptr;
|
|
|
|
KeyMoveCameraObj* cameraObj = new KeyMoveCameraObj("キー移動カメラオブジェ");
|
|
initLinksActor(cameraObj, info, childName, 0);
|
|
cameraObj->validateStartAtNearestPosition();
|
|
cameraObj->makeActorDead();
|
|
return cameraObj;
|
|
}
|
|
|
|
KeyMoveCameraObj* tryCreateLinksKeyMoveCameraObjWithInterpole(const ActorInitInfo& info,
|
|
const char* childName) {
|
|
if (!isExistLinkChild(info, childName, 0))
|
|
return nullptr;
|
|
|
|
KeyMoveCameraObj* cameraObj = new KeyMoveCameraObj("キー移動カメラオブジェ");
|
|
initLinksActor(cameraObj, info, childName, 0);
|
|
cameraObj->validateStartAtNearestPosition();
|
|
cameraObj->makeActorDead();
|
|
cameraObj->setFirstCameraStartInterpoleStepDefault();
|
|
return cameraObj;
|
|
}
|
|
|
|
} // namespace al
|