mirror of
https://github.com/zeldaret/mm.git
synced 2026-06-02 10:09:58 -04:00
DynaPoly Docs Pass (#1194)
* dyna docs * init flags * more docs * cleanup * partial PR review * another bracket * hold to press * PR cleanup
This commit is contained in:
+5
-5
@@ -1559,7 +1559,7 @@ s32 func_800B7678(PlayState* play, Actor* actor, Vec3f* pos, s32 updBgCheckInfoF
|
||||
}
|
||||
|
||||
actor->bgCheckFlags |= BGCHECKFLAG_GROUND;
|
||||
BgCheck2_AttachToMesh(&play->colCtx, actor, (s32)actor->floorBgId);
|
||||
DynaPolyActor_AttachCarriedActor(&play->colCtx, actor, actor->floorBgId);
|
||||
}
|
||||
} else {
|
||||
return func_800B761C(actor, distToFloor, updBgCheckInfoFlags);
|
||||
@@ -1575,7 +1575,7 @@ void Actor_UpdateBgCheckInfo(PlayState* play, Actor* actor, f32 wallCheckHeight,
|
||||
Vec3f pos;
|
||||
|
||||
if ((actor->floorBgId != BGCHECK_SCENE) && (actor->bgCheckFlags & BGCHECKFLAG_GROUND)) {
|
||||
BgCheck2_UpdateActorAttachedToMesh(&play->colCtx, actor->floorBgId, actor);
|
||||
DynaPolyActor_TransformCarriedActor(&play->colCtx, actor->floorBgId, actor);
|
||||
}
|
||||
|
||||
if (updBgCheckInfoFlags & UPDBGCHECKINFO_FLAG_1) {
|
||||
@@ -2426,7 +2426,7 @@ Actor* Actor_UpdateActor(UpdateActor_Params* params) {
|
||||
}
|
||||
|
||||
actor->update(actor, play);
|
||||
BgCheck_ResetFlagsIfLoadedActor(play, &play->colCtx.dyna, actor);
|
||||
DynaPoly_UnsetAllInteractFlags(play, &play->colCtx.dyna, actor);
|
||||
}
|
||||
|
||||
CollisionCheck_ResetDamage(&actor->colChkInfo);
|
||||
@@ -2516,7 +2516,7 @@ void Actor_UpdateAll(PlayState* play, ActorContext* actorCtx) {
|
||||
}
|
||||
|
||||
if (i == ACTORCAT_BG) {
|
||||
DynaPoly_Setup(play, &play->colCtx.dyna);
|
||||
DynaPoly_UpdateContext(play, &play->colCtx.dyna);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3395,7 +3395,7 @@ void func_800BB604(GameState* gameState, ActorContext* actorCtx, Player* player,
|
||||
|
||||
if ((actor != targetedActor) || (actor->flags & ACTOR_FLAG_80000)) {
|
||||
temp_f0_2 = func_800B82EC(actor, player, D_801ED8DC);
|
||||
phi_s2_2 = (actor->flags & 1) != 0;
|
||||
phi_s2_2 = (actor->flags & ACTOR_FLAG_1) != 0;
|
||||
if (phi_s2_2) {
|
||||
phi_s2_2 = temp_f0_2 < D_801ED8C8;
|
||||
}
|
||||
|
||||
+60
-47
@@ -1,103 +1,116 @@
|
||||
#include "global.h"
|
||||
|
||||
void BgCheck2_UpdateActorPosition(CollisionContext* colCtx, s32 bgId, Actor* actor) {
|
||||
MtxF prevMatrix;
|
||||
MtxF prevMatrixInv;
|
||||
MtxF currMatrix;
|
||||
Vec3f newPos;
|
||||
Vec3f posWithInv;
|
||||
/**
|
||||
* Update the `carriedActor`'s position based on the dynapoly actor identified by `bgId`.
|
||||
*/
|
||||
void DynaPolyActor_UpdateCarriedActorPos(CollisionContext* colCtx, s32 bgId, Actor* carriedActor) {
|
||||
MtxF prevTransform;
|
||||
MtxF prevTransformInv;
|
||||
MtxF curTransform;
|
||||
Vec3f pos;
|
||||
Vec3f tempPos;
|
||||
|
||||
if (!DynaPoly_IsBgIdBgActor(bgId)) {
|
||||
return;
|
||||
}
|
||||
|
||||
SkinMatrix_SetScaleRotateYRPTranslate(
|
||||
&prevMatrix, colCtx->dyna.bgActors[bgId].prevTransform.scale.x,
|
||||
&prevTransform, colCtx->dyna.bgActors[bgId].prevTransform.scale.x,
|
||||
colCtx->dyna.bgActors[bgId].prevTransform.scale.y, colCtx->dyna.bgActors[bgId].prevTransform.scale.z,
|
||||
colCtx->dyna.bgActors[bgId].prevTransform.rot.x, colCtx->dyna.bgActors[bgId].prevTransform.rot.y,
|
||||
colCtx->dyna.bgActors[bgId].prevTransform.rot.z, colCtx->dyna.bgActors[bgId].prevTransform.pos.x,
|
||||
colCtx->dyna.bgActors[bgId].prevTransform.pos.y, colCtx->dyna.bgActors[bgId].prevTransform.pos.z);
|
||||
|
||||
if (SkinMatrix_Invert(&prevMatrix, &prevMatrixInv) == 2) {
|
||||
if (SkinMatrix_Invert(&prevTransform, &prevTransformInv) == 2) {
|
||||
return;
|
||||
}
|
||||
|
||||
SkinMatrix_SetScaleRotateYRPTranslate(
|
||||
&currMatrix, colCtx->dyna.bgActors[bgId].curTransform.scale.x, colCtx->dyna.bgActors[bgId].curTransform.scale.y,
|
||||
colCtx->dyna.bgActors[bgId].curTransform.scale.z, colCtx->dyna.bgActors[bgId].curTransform.rot.x,
|
||||
colCtx->dyna.bgActors[bgId].curTransform.rot.y, colCtx->dyna.bgActors[bgId].curTransform.rot.z,
|
||||
colCtx->dyna.bgActors[bgId].curTransform.pos.x, colCtx->dyna.bgActors[bgId].curTransform.pos.y,
|
||||
colCtx->dyna.bgActors[bgId].curTransform.pos.z);
|
||||
&curTransform, colCtx->dyna.bgActors[bgId].curTransform.scale.x,
|
||||
colCtx->dyna.bgActors[bgId].curTransform.scale.y, colCtx->dyna.bgActors[bgId].curTransform.scale.z,
|
||||
colCtx->dyna.bgActors[bgId].curTransform.rot.x, colCtx->dyna.bgActors[bgId].curTransform.rot.y,
|
||||
colCtx->dyna.bgActors[bgId].curTransform.rot.z, colCtx->dyna.bgActors[bgId].curTransform.pos.x,
|
||||
colCtx->dyna.bgActors[bgId].curTransform.pos.y, colCtx->dyna.bgActors[bgId].curTransform.pos.z);
|
||||
|
||||
SkinMatrix_Vec3fMtxFMultXYZ(&prevMatrixInv, &actor->world.pos, &posWithInv);
|
||||
SkinMatrix_Vec3fMtxFMultXYZ(&currMatrix, &posWithInv, &newPos);
|
||||
// Apply the movement of the dynapoly actor `bgId` over the last frame to the `carriedActor` position
|
||||
// pos = curTransform * prevTransformInv * pos
|
||||
// Note (curTransform * prevTransformInv) represents the transform relative to the previous frame
|
||||
SkinMatrix_Vec3fMtxFMultXYZ(&prevTransformInv, &carriedActor->world.pos, &tempPos);
|
||||
SkinMatrix_Vec3fMtxFMultXYZ(&curTransform, &tempPos, &pos);
|
||||
|
||||
actor->world.pos = newPos;
|
||||
carriedActor->world.pos = pos;
|
||||
}
|
||||
|
||||
void BgCheck2_UpdateActorYRotation(CollisionContext* colCtx, s32 bgId, Actor* actor) {
|
||||
s16 angleChange;
|
||||
/**
|
||||
* Update the `carriedActor`'s Y rotation based on the dynapoly actor identified by `bgId`.
|
||||
*/
|
||||
void DynaPolyActor_UpdateCarriedActorRotY(CollisionContext* colCtx, s32 bgId, Actor* carriedActor) {
|
||||
s16 rotY;
|
||||
|
||||
if (!DynaPoly_IsBgIdBgActor(bgId)) {
|
||||
return;
|
||||
}
|
||||
|
||||
angleChange = colCtx->dyna.bgActors[bgId].curTransform.rot.y - colCtx->dyna.bgActors[bgId].prevTransform.rot.y;
|
||||
rotY = colCtx->dyna.bgActors[bgId].curTransform.rot.y - colCtx->dyna.bgActors[bgId].prevTransform.rot.y;
|
||||
|
||||
if (actor->id == 0) {
|
||||
((Player*)actor)->currentYaw += angleChange;
|
||||
if (carriedActor->id == ACTOR_PLAYER) {
|
||||
((Player*)carriedActor)->currentYaw += rotY;
|
||||
}
|
||||
|
||||
actor->shape.rot.y += angleChange;
|
||||
actor->world.rot.y += angleChange;
|
||||
carriedActor->shape.rot.y += rotY;
|
||||
carriedActor->world.rot.y += rotY;
|
||||
}
|
||||
|
||||
void BgCheck2_AttachToMesh(CollisionContext* colCtx, Actor* actor, s32 bgId) {
|
||||
DynaPolyActor* meshActor;
|
||||
void DynaPolyActor_AttachCarriedActor(CollisionContext* colCtx, Actor* carriedActor, s32 bgId) {
|
||||
DynaPolyActor* dynaActor;
|
||||
|
||||
if (!DynaPoly_IsBgIdBgActor(bgId)) {
|
||||
return;
|
||||
}
|
||||
|
||||
meshActor = DynaPoly_GetActor(colCtx, bgId);
|
||||
if (meshActor != NULL) {
|
||||
DynaPolyActor_SetRidingFallingState(meshActor);
|
||||
dynaActor = DynaPoly_GetActor(colCtx, bgId);
|
||||
if (dynaActor != NULL) {
|
||||
DynaPolyActor_SetActorOnTop(dynaActor);
|
||||
|
||||
if ((actor->flags & 0x4000000) == 0x4000000) {
|
||||
DynaPolyActor_SetSwitchPressedState(meshActor);
|
||||
if (CHECK_FLAG_ALL(carriedActor->flags, ACTOR_FLAG_CAN_PRESS_SWITCH)) {
|
||||
DynaPolyActor_SetActorOnSwitch(dynaActor);
|
||||
}
|
||||
if ((actor->flags & 0x20000) == 0x20000) {
|
||||
DynaPolyActor_SetHeavySwitchPressedState(meshActor);
|
||||
if (CHECK_FLAG_ALL(carriedActor->flags, ACTOR_FLAG_CAN_PRESS_HEAVY_SWITCH)) {
|
||||
DynaPolyActor_SetActorOnHeavySwitch(dynaActor);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
u32 BgCheck2_UpdateActorAttachedToMesh(CollisionContext* colCtx, s32 bgId, Actor* actor) {
|
||||
u32 wasUpdated = 0;
|
||||
DynaPolyActor* meshActor;
|
||||
/**
|
||||
* Update the `carriedActor`'s position and Y rotation based on the dynapoly actor identified by `bgId`, according to
|
||||
* the dynapoly actor's move flags (see `DYNA_TRANSFORM_POS` and `DYNA_TRANSFORM_ROT_Y`).
|
||||
*/
|
||||
u32 DynaPolyActor_TransformCarriedActor(CollisionContext* colCtx, s32 bgId, Actor* carriedActor) {
|
||||
u32 wasUpdated = false;
|
||||
DynaPolyActor* dynaActor;
|
||||
|
||||
if (!DynaPoly_IsBgIdBgActor(bgId)) {
|
||||
return 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (colCtx->dyna.bgActorFlags[bgId] & 2 || !(colCtx->dyna.bgActorFlags[bgId] & 1)) {
|
||||
return 0;
|
||||
if ((colCtx->dyna.bgActorFlags[bgId] & BGACTOR_1) || !(colCtx->dyna.bgActorFlags[bgId] & BGACTOR_IN_USE)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
meshActor = DynaPoly_GetActor(colCtx, bgId);
|
||||
dynaActor = DynaPoly_GetActor(colCtx, bgId);
|
||||
|
||||
if (meshActor == NULL) {
|
||||
return 0;
|
||||
if (dynaActor == NULL) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (meshActor->flags & 1) {
|
||||
BgCheck2_UpdateActorPosition(colCtx, bgId, actor);
|
||||
wasUpdated = 1;
|
||||
if (dynaActor->transformFlags & DYNA_TRANSFORM_POS) {
|
||||
DynaPolyActor_UpdateCarriedActorPos(colCtx, bgId, carriedActor);
|
||||
wasUpdated = true;
|
||||
}
|
||||
|
||||
if (meshActor->flags & 2) {
|
||||
BgCheck2_UpdateActorYRotation(colCtx, bgId, actor);
|
||||
wasUpdated = 1;
|
||||
if (dynaActor->transformFlags & DYNA_TRANSFORM_ROT_Y) {
|
||||
DynaPolyActor_UpdateCarriedActorRotY(colCtx, bgId, carriedActor);
|
||||
wasUpdated = true;
|
||||
}
|
||||
|
||||
return wasUpdated;
|
||||
|
||||
+36
-36
@@ -1,18 +1,15 @@
|
||||
#include "global.h"
|
||||
|
||||
#define DYNAPOLY_STATE_NONE 0
|
||||
#define DYNAPOLY_STATE_RIDING_FALLING (1 << 0)
|
||||
#define DYNAPOLY_STATE_RIDING_MOVING (1 << 1)
|
||||
#define DYNAPOLY_STATE_RIDING_ROTATING (1 << 2)
|
||||
#define DYNAPOLY_STATE_SWITCH_PRESSED (1 << 3)
|
||||
#define DYNAPOLY_STATE_HEAVY_SWITCH_PRESSED (1 << 4)
|
||||
|
||||
void DynaPolyActor_Init(DynaPolyActor* dynaActor, s32 flags) {
|
||||
/**
|
||||
* @param transformFlags How other actors standing on the dynapoly actor's collision move when the dynapoly actor moves.
|
||||
* See `DYNA_TRANSFORM_POS`, `DYNA_TRANSFORM_ROT_Y`.
|
||||
*/
|
||||
void DynaPolyActor_Init(DynaPolyActor* dynaActor, s32 transformFlags) {
|
||||
dynaActor->bgId = -1;
|
||||
dynaActor->pushForce = 0.0f;
|
||||
dynaActor->unk14C = 0.0f;
|
||||
dynaActor->flags = flags;
|
||||
dynaActor->stateFlags = DYNAPOLY_STATE_NONE;
|
||||
dynaActor->transformFlags = transformFlags;
|
||||
dynaActor->interactFlags = 0;
|
||||
}
|
||||
|
||||
void DynaPolyActor_LoadMesh(PlayState* play, DynaPolyActor* dynaActor, CollisionHeader* meshHeader) {
|
||||
@@ -22,80 +19,80 @@ void DynaPolyActor_LoadMesh(PlayState* play, DynaPolyActor* dynaActor, Collision
|
||||
dynaActor->bgId = DynaPoly_SetBgActor(play, &play->colCtx.dyna, &dynaActor->actor, header);
|
||||
}
|
||||
|
||||
void DynaPolyActor_ResetState(DynaPolyActor* dynaActor) {
|
||||
dynaActor->stateFlags = DYNAPOLY_STATE_NONE;
|
||||
void DynaPolyActor_UnsetAllInteractFlags(DynaPolyActor* dynaActor) {
|
||||
dynaActor->interactFlags = 0;
|
||||
}
|
||||
|
||||
void DynaPolyActor_SetRidingFallingState(DynaPolyActor* dynaActor) {
|
||||
dynaActor->stateFlags |= DYNAPOLY_STATE_RIDING_FALLING;
|
||||
void DynaPolyActor_SetActorOnTop(DynaPolyActor* dynaActor) {
|
||||
dynaActor->interactFlags |= DYNA_INTERACT_ACTOR_ON_TOP;
|
||||
}
|
||||
|
||||
void DynaPolyActor_SetRidingMovingState(DynaPolyActor* dynaActor) {
|
||||
dynaActor->stateFlags |= DYNAPOLY_STATE_RIDING_MOVING;
|
||||
void DynaPolyActor_SetPlayerOnTop(DynaPolyActor* dynaActor) {
|
||||
dynaActor->interactFlags |= DYNA_INTERACT_PLAYER_ON_TOP;
|
||||
}
|
||||
|
||||
void DynaPolyActor_SetRidingMovingStateByIndex(CollisionContext* colCtx, s32 bgId) {
|
||||
void DynaPoly_SetPlayerOnTop(CollisionContext* colCtx, s32 bgId) {
|
||||
DynaPolyActor* dynaActor = DynaPoly_GetActor(colCtx, bgId);
|
||||
|
||||
if (dynaActor != NULL) {
|
||||
DynaPolyActor_SetRidingMovingState(dynaActor);
|
||||
DynaPolyActor_SetPlayerOnTop(dynaActor);
|
||||
}
|
||||
}
|
||||
|
||||
void DynaPolyActor_SetRidingRotatingState(DynaPolyActor* dynaActor) {
|
||||
dynaActor->stateFlags |= DYNAPOLY_STATE_RIDING_ROTATING;
|
||||
void DynaPolyActor_SetPlayerAbove(DynaPolyActor* dynaActor) {
|
||||
dynaActor->interactFlags |= DYNA_INTERACT_PLAYER_ABOVE;
|
||||
}
|
||||
|
||||
void DynaPolyActor_SetRidingRotatingStateByIndex(CollisionContext* colCtx, s32 bgId) {
|
||||
void DynaPoly_SetPlayerAbove(CollisionContext* colCtx, s32 bgId) {
|
||||
DynaPolyActor* dynaActor = DynaPoly_GetActor(colCtx, bgId);
|
||||
|
||||
if (dynaActor != NULL) {
|
||||
DynaPolyActor_SetRidingRotatingState(dynaActor);
|
||||
DynaPolyActor_SetPlayerAbove(dynaActor);
|
||||
}
|
||||
}
|
||||
|
||||
void DynaPolyActor_SetSwitchPressedState(DynaPolyActor* dynaActor) {
|
||||
dynaActor->stateFlags |= DYNAPOLY_STATE_SWITCH_PRESSED;
|
||||
void DynaPolyActor_SetActorOnSwitch(DynaPolyActor* dynaActor) {
|
||||
dynaActor->interactFlags |= DYNA_INTERACT_ACTOR_ON_SWITCH;
|
||||
}
|
||||
|
||||
void DynaPolyActor_SetHeavySwitchPressedState(DynaPolyActor* dynaActor) {
|
||||
dynaActor->stateFlags |= DYNAPOLY_STATE_HEAVY_SWITCH_PRESSED;
|
||||
void DynaPolyActor_SetActorOnHeavySwitch(DynaPolyActor* dynaActor) {
|
||||
dynaActor->interactFlags |= DYNA_INTERACT_ACTOR_ON_HEAVY_SWITCH;
|
||||
}
|
||||
|
||||
s32 DynaPolyActor_IsInRidingFallingState(DynaPolyActor* dynaActor) {
|
||||
if (dynaActor->stateFlags & DYNAPOLY_STATE_RIDING_FALLING) {
|
||||
s32 DynaPolyActor_IsActorOnTop(DynaPolyActor* dynaActor) {
|
||||
if (dynaActor->interactFlags & DYNA_INTERACT_ACTOR_ON_TOP) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
s32 DynaPolyActor_IsInRidingMovingState(DynaPolyActor* dynaActor) {
|
||||
if (dynaActor->stateFlags & DYNAPOLY_STATE_RIDING_MOVING) {
|
||||
s32 DynaPolyActor_IsPlayerOnTop(DynaPolyActor* dynaActor) {
|
||||
if (dynaActor->interactFlags & DYNA_INTERACT_PLAYER_ON_TOP) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
s32 DynaPolyActor_IsInRidingRotatingState(DynaPolyActor* dynaActor) {
|
||||
if (dynaActor->stateFlags & DYNAPOLY_STATE_RIDING_ROTATING) {
|
||||
s32 DynaPolyActor_IsPlayerAbove(DynaPolyActor* dynaActor) {
|
||||
if (dynaActor->interactFlags & DYNA_INTERACT_PLAYER_ABOVE) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
s32 DynaPolyActor_IsInSwitchPressedState(DynaPolyActor* dynaActor) {
|
||||
if (dynaActor->stateFlags & DYNAPOLY_STATE_SWITCH_PRESSED) {
|
||||
s32 DynaPolyActor_IsSwitchPressed(DynaPolyActor* dynaActor) {
|
||||
if (dynaActor->interactFlags & DYNA_INTERACT_ACTOR_ON_SWITCH) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
s32 DynaPolyActor_IsInHeavySwitchPressedState(DynaPolyActor* dynaActor) {
|
||||
if (dynaActor->stateFlags & DYNAPOLY_STATE_HEAVY_SWITCH_PRESSED) {
|
||||
s32 DynaPolyActor_IsHeavySwitchPressed(DynaPolyActor* dynaActor) {
|
||||
if (dynaActor->interactFlags & DYNA_INTERACT_ACTOR_ON_HEAVY_SWITCH) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
@@ -129,13 +126,16 @@ s32 DynaPolyActor_ValidateMove(PlayState* play, DynaPolyActor* dynaActor, s16 st
|
||||
&bgId, &dynaActor->actor, 0.0f)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
startPos.x = (dynaActor->actor.world.pos.x * 2.0f) - startPos.x;
|
||||
startPos.z = (dynaActor->actor.world.pos.z * 2.0f) - startPos.z;
|
||||
endPos.x = sign * adjustedEndRadius * sin + startPos.x;
|
||||
endPos.z = sign * adjustedEndRadius * cos + startPos.z;
|
||||
|
||||
if (BgCheck_EntityLineTest3(&play->colCtx, &startPos, &endPos, &intersectionPos, &poly, true, false, false, true,
|
||||
&bgId, &dynaActor->actor, 0.0f)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
+49
-46
@@ -1665,7 +1665,7 @@ CollisionHeader* BgCheck_GetCollisionHeader(CollisionContext* colCtx, s32 bgId)
|
||||
if ((bgId < 0) || (bgId > BG_ACTOR_MAX)) {
|
||||
return NULL;
|
||||
}
|
||||
if (!(colCtx->dyna.bgActorFlags[bgId] & 1)) {
|
||||
if (!(colCtx->dyna.bgActorFlags[bgId] & BGACTOR_IN_USE)) {
|
||||
return NULL;
|
||||
}
|
||||
return colCtx->dyna.bgActors[bgId].colHeader;
|
||||
@@ -2719,8 +2719,8 @@ s32 DynaPoly_SetBgActor(PlayState* play, DynaCollisionContext* dyna, Actor* acto
|
||||
s32 foundSlot = false;
|
||||
|
||||
for (bgId = 0; bgId < BG_ACTOR_MAX; bgId++) {
|
||||
if (!(dyna->bgActorFlags[bgId] & 1)) {
|
||||
dyna->bgActorFlags[bgId] |= 1;
|
||||
if (!(dyna->bgActorFlags[bgId] & BGACTOR_IN_USE)) {
|
||||
dyna->bgActorFlags[bgId] |= BGACTOR_IN_USE;
|
||||
foundSlot = true;
|
||||
break;
|
||||
}
|
||||
@@ -2733,7 +2733,7 @@ s32 DynaPoly_SetBgActor(PlayState* play, DynaCollisionContext* dyna, Actor* acto
|
||||
BgActor_SetActor(&dyna->bgActors[bgId], actor, colHeader);
|
||||
dyna->bitFlag |= DYNAPOLY_INVALIDATE_LOOKUP;
|
||||
|
||||
dyna->bgActorFlags[bgId] &= ~2;
|
||||
dyna->bgActorFlags[bgId] &= ~BGACTOR_1;
|
||||
return bgId;
|
||||
}
|
||||
|
||||
@@ -2741,51 +2741,51 @@ s32 DynaPoly_SetBgActor(PlayState* play, DynaCollisionContext* dyna, Actor* acto
|
||||
* Gets the actor assigned to `bgId`
|
||||
*/
|
||||
DynaPolyActor* DynaPoly_GetActor(CollisionContext* colCtx, s32 bgId) {
|
||||
if (!DynaPoly_IsBgIdBgActor(bgId) || !(colCtx->dyna.bgActorFlags[bgId] & 1) ||
|
||||
(colCtx->dyna.bgActorFlags[bgId] & 2)) {
|
||||
if (!DynaPoly_IsBgIdBgActor(bgId) || !(colCtx->dyna.bgActorFlags[bgId] & BGACTOR_IN_USE) ||
|
||||
(colCtx->dyna.bgActorFlags[bgId] & BGACTOR_1)) {
|
||||
return NULL;
|
||||
}
|
||||
return (DynaPolyActor*)colCtx->dyna.bgActors[bgId].actor;
|
||||
}
|
||||
|
||||
void func_800C62BC(PlayState* play, DynaCollisionContext* dyna, s32 bgId) {
|
||||
void DynaPoly_DisableCollision(PlayState* play, DynaCollisionContext* dyna, s32 bgId) {
|
||||
if (DynaPoly_IsBgIdBgActor(bgId)) {
|
||||
dyna->bgActorFlags[bgId] |= 4;
|
||||
dyna->bgActorFlags[bgId] |= BGACTOR_COLLISION_DISABLED;
|
||||
dyna->bitFlag |= DYNAPOLY_INVALIDATE_LOOKUP;
|
||||
}
|
||||
}
|
||||
|
||||
void func_800C6314(PlayState* play, DynaCollisionContext* dyna, s32 bgId) {
|
||||
void DynaPoly_EnableCollision(PlayState* play, DynaCollisionContext* dyna, s32 bgId) {
|
||||
if (DynaPoly_IsBgIdBgActor(bgId)) {
|
||||
dyna->bgActorFlags[bgId] &= ~4;
|
||||
dyna->bgActorFlags[bgId] &= ~BGACTOR_COLLISION_DISABLED;
|
||||
dyna->bitFlag |= DYNAPOLY_INVALIDATE_LOOKUP;
|
||||
}
|
||||
}
|
||||
|
||||
void func_800C636C(PlayState* play, DynaCollisionContext* dyna, s32 bgId) {
|
||||
void DynaPoly_DisableCeilingCollision(PlayState* play, DynaCollisionContext* dyna, s32 bgId) {
|
||||
if (DynaPoly_IsBgIdBgActor(bgId)) {
|
||||
dyna->bgActorFlags[bgId] |= 8;
|
||||
dyna->bgActorFlags[bgId] |= BGACTOR_CEILING_COLLISION_DISABLED;
|
||||
dyna->bitFlag |= DYNAPOLY_INVALIDATE_LOOKUP;
|
||||
}
|
||||
}
|
||||
|
||||
void func_800C63C4(PlayState* play, DynaCollisionContext* dyna, s32 bgId) {
|
||||
void DynaPoly_EnableCeilingCollision(PlayState* play, DynaCollisionContext* dyna, s32 bgId) {
|
||||
if (DynaPoly_IsBgIdBgActor(bgId)) {
|
||||
dyna->bgActorFlags[bgId] &= ~8;
|
||||
dyna->bgActorFlags[bgId] &= ~BGACTOR_CEILING_COLLISION_DISABLED;
|
||||
dyna->bitFlag |= DYNAPOLY_INVALIDATE_LOOKUP;
|
||||
}
|
||||
}
|
||||
|
||||
void func_800C641C(PlayState* play, DynaCollisionContext* dyna, s32 bgId) {
|
||||
void DynaPoly_DisableFloorCollision(PlayState* play, DynaCollisionContext* dyna, s32 bgId) {
|
||||
if (DynaPoly_IsBgIdBgActor(bgId)) {
|
||||
dyna->bgActorFlags[bgId] |= 0x20;
|
||||
dyna->bgActorFlags[bgId] |= BGACTOR_FLOOR_COLLISION_DISABLED;
|
||||
dyna->bitFlag |= DYNAPOLY_INVALIDATE_LOOKUP;
|
||||
}
|
||||
}
|
||||
|
||||
void func_800C6474(PlayState* play, DynaCollisionContext* dyna, s32 bgId) {
|
||||
void DynaPoly_EnableFloorCollision(PlayState* play, DynaCollisionContext* dyna, s32 bgId) {
|
||||
if (DynaPoly_IsBgIdBgActor(bgId)) {
|
||||
dyna->bgActorFlags[bgId] &= ~0x20;
|
||||
dyna->bgActorFlags[bgId] &= ~BGACTOR_FLOOR_COLLISION_DISABLED;
|
||||
dyna->bitFlag |= DYNAPOLY_INVALIDATE_LOOKUP;
|
||||
}
|
||||
}
|
||||
@@ -2804,11 +2804,11 @@ void DynaPoly_DeleteBgActor(PlayState* play, DynaCollisionContext* dyna, s32 bgI
|
||||
|
||||
actor->bgId = BGACTOR_NEG_ONE;
|
||||
dyna->bgActors[bgId].actor = NULL;
|
||||
dyna->bgActorFlags[bgId] |= 2;
|
||||
dyna->bgActorFlags[bgId] |= BGACTOR_1;
|
||||
}
|
||||
}
|
||||
|
||||
void func_800C6554(PlayState* play, DynaCollisionContext* dyna) {
|
||||
void DynaPoly_InvalidateLookup(PlayState* play, DynaCollisionContext* dyna) {
|
||||
dyna->bitFlag |= DYNAPOLY_INVALIDATE_LOOKUP;
|
||||
}
|
||||
|
||||
@@ -2865,8 +2865,8 @@ void BgCheck_CalcWaterboxDimensions(Vec3f* minPos, Vec3f* maxXPos, Vec3f* maxZPo
|
||||
/**
|
||||
* original name: DynaPolyInfo_expandSRT
|
||||
*/
|
||||
void DynaPoly_ExpandSRT(PlayState* play, DynaCollisionContext* dyna, s32 bgId, s32* vtxStartIndex, s32* polyStartIndex,
|
||||
s32* waterBoxStartIndex) {
|
||||
void DynaPoly_AddBgActorToLookup(PlayState* play, DynaCollisionContext* dyna, s32 bgId, s32* vtxStartIndex,
|
||||
s32* polyStartIndex, s32* waterBoxStartIndex) {
|
||||
Actor* actor;
|
||||
s32 i;
|
||||
s32 j;
|
||||
@@ -2899,7 +2899,7 @@ void DynaPoly_ExpandSRT(PlayState* play, DynaCollisionContext* dyna, s32 bgId, s
|
||||
|
||||
ScaleRotPos_SetValue(&dyna->bgActors[bgId].curTransform, &actor->scale, &actor->shape.rot, &pos);
|
||||
|
||||
if (dyna->bgActorFlags[bgId] & 4) {
|
||||
if (dyna->bgActorFlags[bgId] & BGACTOR_COLLISION_DISABLED) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2929,13 +2929,13 @@ void DynaPoly_ExpandSRT(PlayState* play, DynaCollisionContext* dyna, s32 bgId, s
|
||||
s16 normalY = poly->normal.y;
|
||||
|
||||
if (normalY > COLPOLY_SNORMAL(0.5f)) {
|
||||
if (!(dyna->bgActorFlags[bgId] & 0x20)) {
|
||||
if (!(dyna->bgActorFlags[bgId] & BGACTOR_FLOOR_COLLISION_DISABLED)) {
|
||||
s16 polyIndex = pi;
|
||||
|
||||
DynaSSNodeList_SetSSListHead(&dyna->polyNodes, &dyna->bgActors[bgId].dynaLookup.floor, &polyIndex);
|
||||
}
|
||||
} else if (normalY < COLPOLY_SNORMAL(-0.8f)) {
|
||||
if (!(dyna->bgActorFlags[bgId] & 8)) {
|
||||
if (!(dyna->bgActorFlags[bgId] & BGACTOR_CEILING_COLLISION_DISABLED)) {
|
||||
s16 polyIndex = pi;
|
||||
|
||||
DynaSSNodeList_SetSSListHead(&dyna->polyNodes, &dyna->bgActors[bgId].dynaLookup.ceiling,
|
||||
@@ -3091,16 +3091,16 @@ void DynaPoly_ExpandSRT(PlayState* play, DynaCollisionContext* dyna, s32 bgId, s
|
||||
*waterBoxStartIndex += pbgdata->numWaterBoxes;
|
||||
}
|
||||
|
||||
void BgCheck_ResetFlagsIfLoadedActor(PlayState* play, DynaCollisionContext* dyna, Actor* actor) {
|
||||
void DynaPoly_UnsetAllInteractFlags(PlayState* play, DynaCollisionContext* dyna, Actor* actor) {
|
||||
DynaPolyActor* dynaActor;
|
||||
s32 i;
|
||||
|
||||
for (i = 0; i < BG_ACTOR_MAX; i++) {
|
||||
if ((dyna->bgActorFlags[i] & 1)) {
|
||||
if ((dyna->bgActorFlags[i] & BGACTOR_IN_USE)) {
|
||||
dynaActor = DynaPoly_GetActor(&play->colCtx, i);
|
||||
if ((dynaActor != NULL) && (&dynaActor->actor == actor)) {
|
||||
DynaPolyActor_ResetState((DynaPolyActor*)actor);
|
||||
return;
|
||||
DynaPolyActor_UnsetAllInteractFlags((DynaPolyActor*)actor);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3109,7 +3109,7 @@ void BgCheck_ResetFlagsIfLoadedActor(PlayState* play, DynaCollisionContext* dyna
|
||||
/**
|
||||
* original name: DynaPolyInfo_setup
|
||||
*/
|
||||
void DynaPoly_Setup(PlayState* play, DynaCollisionContext* dyna) {
|
||||
void DynaPoly_UpdateContext(PlayState* play, DynaCollisionContext* dyna) {
|
||||
DynaPolyActor* actor;
|
||||
s32 vtxStartIndex;
|
||||
s32 polyStartIndex;
|
||||
@@ -3123,7 +3123,7 @@ void DynaPoly_Setup(PlayState* play, DynaCollisionContext* dyna) {
|
||||
}
|
||||
|
||||
for (i = 0; i < BG_ACTOR_MAX; i++) {
|
||||
if (dyna->bgActorFlags[i] & 2) {
|
||||
if (dyna->bgActorFlags[i] & BGACTOR_1) {
|
||||
// Initialize BgActor
|
||||
dyna->bgActorFlags[i] = 0;
|
||||
BgActor_Init(play, &dyna->bgActors[i]);
|
||||
@@ -3146,8 +3146,8 @@ void DynaPoly_Setup(PlayState* play, DynaCollisionContext* dyna) {
|
||||
polyStartIndex = 0;
|
||||
waterBoxStartIndex = 0;
|
||||
for (i = 0; i < BG_ACTOR_MAX; i++) {
|
||||
if ((dyna->bgActorFlags[i] & 1) && !(dyna->bgActorFlags[i] & 2)) {
|
||||
DynaPoly_ExpandSRT(play, dyna, i, &vtxStartIndex, &polyStartIndex, &waterBoxStartIndex);
|
||||
if ((dyna->bgActorFlags[i] & BGACTOR_IN_USE) && !(dyna->bgActorFlags[i] & BGACTOR_1)) {
|
||||
DynaPoly_AddBgActorToLookup(play, dyna, i, &vtxStartIndex, &polyStartIndex, &waterBoxStartIndex);
|
||||
}
|
||||
}
|
||||
dyna->bitFlag &= ~DYNAPOLY_INVALIDATE_LOOKUP;
|
||||
@@ -3165,7 +3165,8 @@ void func_800C756C(DynaCollisionContext* dyna, s32* numPolygons, s32* numVertice
|
||||
*numWaterBoxes = 0;
|
||||
|
||||
for (i = 0; i < BG_ACTOR_MAX; i++) {
|
||||
if ((dyna->bgActorFlags[i] & 1) && !(dyna->bgActorFlags[i] & 2) && !(dyna->bgActorFlags[i] & 4)) {
|
||||
if ((dyna->bgActorFlags[i] & BGACTOR_IN_USE) && !(dyna->bgActorFlags[i] & BGACTOR_1) &&
|
||||
!(dyna->bgActorFlags[i] & BGACTOR_COLLISION_DISABLED)) {
|
||||
colHeader = dyna->bgActors[i].colHeader;
|
||||
*numPolygons += colHeader->numPolygons;
|
||||
*numVertices += colHeader->numVertices;
|
||||
@@ -3181,7 +3182,7 @@ void DynaPoly_UpdateBgActorTransforms(PlayState* play, DynaCollisionContext* dyn
|
||||
s32 i;
|
||||
|
||||
for (i = 0; i < BG_ACTOR_MAX; i++) {
|
||||
if (dyna->bgActorFlags[i] & 1) {
|
||||
if (dyna->bgActorFlags[i] & BGACTOR_IN_USE) {
|
||||
DynaPoly_SetBgActorPrevTransform(play, &dyna->bgActors[i]);
|
||||
}
|
||||
}
|
||||
@@ -3275,7 +3276,8 @@ f32 BgCheck_RaycastFloorDyna(DynaRaycast* dynaRaycast) {
|
||||
*dynaRaycast->bgId = BGCHECK_SCENE;
|
||||
|
||||
for (i = 0; i < BG_ACTOR_MAX; i++) {
|
||||
if (!(dynaRaycast->colCtx->dyna.bgActorFlags[i] & 1) || (dynaRaycast->colCtx->dyna.bgActorFlags[i] & 2)) {
|
||||
if (!(dynaRaycast->colCtx->dyna.bgActorFlags[i] & BGACTOR_IN_USE) ||
|
||||
(dynaRaycast->colCtx->dyna.bgActorFlags[i] & BGACTOR_1)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -3328,7 +3330,7 @@ f32 BgCheck_RaycastFloorDyna(DynaRaycast* dynaRaycast) {
|
||||
if (!pauseState) {
|
||||
pauseState = dynaRaycast->play->pauseCtx.debugEditor != DEBUG_EDITOR_NONE;
|
||||
}
|
||||
if (!pauseState && (dynaRaycast->colCtx->dyna.bgActorFlags[*dynaRaycast->bgId] & 2)) {
|
||||
if (!pauseState && (dynaRaycast->colCtx->dyna.bgActorFlags[*dynaRaycast->bgId] & BGACTOR_1)) {
|
||||
curTransform = &dynaRaycast->dyna->bgActors[*dynaRaycast->bgId].curTransform;
|
||||
polyMin = &dynaRaycast->dyna
|
||||
->polyList[(u16)dynaRaycast->dyna->bgActors[*dynaRaycast->bgId].dynaLookup.polyStartIndex];
|
||||
@@ -3587,7 +3589,7 @@ s32 BgCheck_SphVsDynaWall(CollisionContext* colCtx, u16 xpFlags, f32* outX, f32*
|
||||
resultPos = *pos;
|
||||
|
||||
for (i = 0; i < BG_ACTOR_MAX; i++) {
|
||||
if (!(colCtx->dyna.bgActorFlags[i] & 1) || (colCtx->dyna.bgActorFlags[i] & 2)) {
|
||||
if (!(colCtx->dyna.bgActorFlags[i] & BGACTOR_IN_USE) || (colCtx->dyna.bgActorFlags[i] & BGACTOR_1)) {
|
||||
continue;
|
||||
}
|
||||
if ((colCtx->dyna.bgActors + i)->actor == actor) {
|
||||
@@ -3709,7 +3711,7 @@ s32 BgCheck_CheckDynaCeiling(CollisionContext* colCtx, u16 xpFlags, f32* outY, V
|
||||
resultY = tempY;
|
||||
|
||||
for (i = 0; i < BG_ACTOR_MAX; i++) {
|
||||
if (!(colCtx->dyna.bgActorFlags[i] & 1) || (colCtx->dyna.bgActorFlags[i] & 2)) {
|
||||
if (!(colCtx->dyna.bgActorFlags[i] & BGACTOR_IN_USE) || (colCtx->dyna.bgActorFlags[i] & BGACTOR_1)) {
|
||||
continue;
|
||||
}
|
||||
if (actor == colCtx->dyna.bgActors[i].actor) {
|
||||
@@ -3855,7 +3857,7 @@ s32 BgCheck_CheckLineAgainstDyna(CollisionContext* colCtx, u16 xpFlags, Vec3f* p
|
||||
f32 by;
|
||||
|
||||
for (i = 0; i < BG_ACTOR_MAX; i++) {
|
||||
if ((colCtx->dyna.bgActorFlags[i] & 1) && !(colCtx->dyna.bgActorFlags[i] & 2)) {
|
||||
if ((colCtx->dyna.bgActorFlags[i] & BGACTOR_IN_USE) && !(colCtx->dyna.bgActorFlags[i] & BGACTOR_1)) {
|
||||
if (actor != colCtx->dyna.bgActors[i].actor) {
|
||||
ay = posA->y;
|
||||
by = posB->y;
|
||||
@@ -3964,7 +3966,7 @@ s32 BgCheck_SphVsFirstDynaPoly(CollisionContext* colCtx, u16 xpFlags, CollisionP
|
||||
Sphere16 testSphere;
|
||||
|
||||
for (i = 0; i < BG_ACTOR_MAX; i++) {
|
||||
if (!(colCtx->dyna.bgActorFlags[i] & 1) || (colCtx->dyna.bgActorFlags[i] & 2)) {
|
||||
if (!(colCtx->dyna.bgActorFlags[i] & BGACTOR_IN_USE) || (colCtx->dyna.bgActorFlags[i] & BGACTOR_1)) {
|
||||
continue;
|
||||
}
|
||||
if (colCtx->dyna.bgActors[i].actor == actor) {
|
||||
@@ -4019,7 +4021,7 @@ void BgCheck_InitCollisionHeaders(CollisionContext* colCtx, PlayState* play) {
|
||||
|
||||
for (i = 0; i < BG_ACTOR_MAX; i++) {
|
||||
flag = dyna->bgActorFlags[i];
|
||||
if ((flag & 1) && !(flag & 2)) {
|
||||
if ((flag & BGACTOR_IN_USE) && !(flag & BGACTOR_1)) {
|
||||
Actor_SetObjectDependency(play, dyna->bgActors[i].actor);
|
||||
CollisionHeader_SegmentedToVirtual(dyna->bgActors[i].colHeader);
|
||||
}
|
||||
@@ -4399,7 +4401,8 @@ s32 WaterBox_GetSurfaceImpl(PlayState* play, CollisionContext* colCtx, f32 x, f3
|
||||
}
|
||||
|
||||
for (i = 0; i < BG_ACTOR_MAX; i++) {
|
||||
if (!(colCtx->dyna.bgActorFlags[i] & 1) || (colCtx->dyna.bgActorFlags[i] & 4)) {
|
||||
if (!(colCtx->dyna.bgActorFlags[i] & BGACTOR_IN_USE) ||
|
||||
(colCtx->dyna.bgActorFlags[i] & BGACTOR_COLLISION_DISABLED)) {
|
||||
continue;
|
||||
}
|
||||
bgActor = &colCtx->dyna.bgActors[i];
|
||||
@@ -4484,8 +4487,8 @@ s32 WaterBox_GetSurface2(PlayState* play, CollisionContext* colCtx, Vec3f* pos,
|
||||
|
||||
for (i = 0; i < BG_ACTOR_MAX; i++) {
|
||||
|
||||
if (!(colCtx->dyna.bgActorFlags[i] & 1) || (colCtx->dyna.bgActorFlags[i] & 4) ||
|
||||
(colCtx->dyna.bgActorFlags[i] & 2)) {
|
||||
if (!(colCtx->dyna.bgActorFlags[i] & BGACTOR_IN_USE) ||
|
||||
(colCtx->dyna.bgActorFlags[i] & BGACTOR_COLLISION_DISABLED) || (colCtx->dyna.bgActorFlags[i] & BGACTOR_1)) {
|
||||
continue;
|
||||
}
|
||||
bgActor = &colCtx->dyna.bgActors[i];
|
||||
@@ -4618,7 +4621,7 @@ s32 func_800CA6F0(PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32*
|
||||
}
|
||||
}
|
||||
for (i = 0; i < BG_ACTOR_MAX; i++) {
|
||||
if (!(colCtx->dyna.bgActorFlags[i] & 1) || (colCtx->dyna.bgActorFlags[i] & 2)) {
|
||||
if (!(colCtx->dyna.bgActorFlags[i] & BGACTOR_IN_USE) || (colCtx->dyna.bgActorFlags[i] & BGACTOR_1)) {
|
||||
continue;
|
||||
}
|
||||
bgActor = &colCtx->dyna.bgActors[i];
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
#define FLAGS \
|
||||
(ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_200000 | ACTOR_FLAG_2000000 | \
|
||||
ACTOR_FLAG_4000000 | ACTOR_FLAG_80000000)
|
||||
ACTOR_FLAG_CAN_PRESS_SWITCH | ACTOR_FLAG_80000000)
|
||||
|
||||
ActorFunc sPlayerCallInitFunc;
|
||||
ActorFunc sPlayerCallDestroyFunc;
|
||||
|
||||
Reference in New Issue
Block a user