mirror of https://github.com/PrimeDecomp/prime.git
Add CScriptActorRotate
This commit is contained in:
parent
f7623bd219
commit
521b2d5413
|
@ -3,8 +3,8 @@
|
|||
.section .data
|
||||
.balign 8
|
||||
|
||||
.global lbl_803E2D08
|
||||
lbl_803E2D08:
|
||||
.global __vt__18CScriptActorRotate
|
||||
__vt__18CScriptActorRotate:
|
||||
# ROM: 0x3DFD08
|
||||
.4byte 0
|
||||
.4byte 0
|
||||
|
@ -28,9 +28,9 @@ __dt__18CScriptActorRotateFv:
|
|||
/* 80153A40 001509A0 93 C1 00 18 */ stw r30, 0x18(r1)
|
||||
/* 80153A44 001509A4 7C 7E 1B 79 */ or. r30, r3, r3
|
||||
/* 80153A48 001509A8 41 82 00 74 */ beq lbl_80153ABC
|
||||
/* 80153A4C 001509AC 3C 60 80 3E */ lis r3, lbl_803E2D08@ha
|
||||
/* 80153A4C 001509AC 3C 60 80 3E */ lis r3, __vt__18CScriptActorRotate@ha
|
||||
/* 80153A50 001509B0 34 1E 00 48 */ addic. r0, r30, 0x48
|
||||
/* 80153A54 001509B4 38 03 2D 08 */ addi r0, r3, lbl_803E2D08@l
|
||||
/* 80153A54 001509B4 38 03 2D 08 */ addi r0, r3, __vt__18CScriptActorRotate@l
|
||||
/* 80153A58 001509B8 90 1E 00 00 */ stw r0, 0(r30)
|
||||
/* 80153A5C 001509BC 41 82 00 44 */ beq lbl_80153AA0
|
||||
/* 80153A60 001509C0 80 1E 00 4C */ lwz r0, 0x4c(r30)
|
||||
|
@ -458,7 +458,7 @@ lbl_80153EF8:
|
|||
/* 80154054 00150FB4 7F C3 F3 78 */ mr r3, r30
|
||||
/* 80154058 00150FB8 7F E6 FB 78 */ mr r6, r31
|
||||
/* 8015405C 00150FBC 38 A1 01 7C */ addi r5, r1, 0x17c
|
||||
/* 80154060 00150FC0 48 00 01 D1 */ bl sub_80154230
|
||||
/* 80154060 00150FC0 48 00 01 D1 */ bl UpdatePlatformRiders__18CScriptActorRotateFR15CScriptPlatformRC12CTransform4fR13CStateManager
|
||||
lbl_80154064:
|
||||
/* 80154064 00150FC4 3B BD 00 34 */ addi r29, r29, 0x34
|
||||
lbl_80154068:
|
||||
|
@ -592,8 +592,8 @@ lbl_80154214:
|
|||
/* 80154228 00151188 38 21 08 30 */ addi r1, r1, 0x830
|
||||
/* 8015422C 0015118C 4E 80 00 20 */ blr
|
||||
|
||||
.global sub_80154230
|
||||
sub_80154230:
|
||||
.global UpdatePlatformRiders__18CScriptActorRotateFR15CScriptPlatformRC12CTransform4fR13CStateManager
|
||||
UpdatePlatformRiders__18CScriptActorRotateFR15CScriptPlatformRC12CTransform4fR13CStateManager:
|
||||
/* 80154230 00151190 94 21 FF E0 */ stwu r1, -0x20(r1)
|
||||
/* 80154234 00151194 7C 08 02 A6 */ mflr r0
|
||||
/* 80154238 00151198 90 01 00 24 */ stw r0, 0x24(r1)
|
||||
|
@ -609,13 +609,13 @@ sub_80154230:
|
|||
/* 80154260 001511C0 93 81 00 10 */ stw r28, 0x10(r1)
|
||||
/* 80154264 001511C4 7C 7C 1B 78 */ mr r28, r3
|
||||
/* 80154268 001511C8 38 9D 03 28 */ addi r4, r29, 0x328
|
||||
/* 8015426C 001511CC 48 00 00 3D */ bl sub_801542a8
|
||||
/* 8015426C 001511CC 48 00 00 3D */ bl "UpdatePlatformRiders__18CScriptActorRotateFRQ24rstl43vector<7SRiders,Q24rstl17rmemory_allocator>R15CScriptPlatformRC12CTransform4fR13CStateManager"
|
||||
/* 80154270 001511D0 7F 83 E3 78 */ mr r3, r28
|
||||
/* 80154274 001511D4 7F A5 EB 78 */ mr r5, r29
|
||||
/* 80154278 001511D8 7F C6 F3 78 */ mr r6, r30
|
||||
/* 8015427C 001511DC 7F E7 FB 78 */ mr r7, r31
|
||||
/* 80154280 001511E0 38 9D 03 38 */ addi r4, r29, 0x338
|
||||
/* 80154284 001511E4 48 00 00 25 */ bl sub_801542a8
|
||||
/* 80154284 001511E4 48 00 00 25 */ bl "UpdatePlatformRiders__18CScriptActorRotateFRQ24rstl43vector<7SRiders,Q24rstl17rmemory_allocator>R15CScriptPlatformRC12CTransform4fR13CStateManager"
|
||||
/* 80154288 001511E8 80 01 00 24 */ lwz r0, 0x24(r1)
|
||||
/* 8015428C 001511EC 83 E1 00 1C */ lwz r31, 0x1c(r1)
|
||||
/* 80154290 001511F0 83 C1 00 18 */ lwz r30, 0x18(r1)
|
||||
|
@ -625,8 +625,8 @@ sub_80154230:
|
|||
/* 801542A0 00151200 38 21 00 20 */ addi r1, r1, 0x20
|
||||
/* 801542A4 00151204 4E 80 00 20 */ blr
|
||||
|
||||
.global sub_801542a8
|
||||
sub_801542a8:
|
||||
.global "UpdatePlatformRiders__18CScriptActorRotateFRQ24rstl43vector<7SRiders,Q24rstl17rmemory_allocator>R15CScriptPlatformRC12CTransform4fR13CStateManager"
|
||||
"UpdatePlatformRiders__18CScriptActorRotateFRQ24rstl43vector<7SRiders,Q24rstl17rmemory_allocator>R15CScriptPlatformRC12CTransform4fR13CStateManager":
|
||||
/* 801542A8 00151208 94 21 FF 40 */ stwu r1, -0xc0(r1)
|
||||
/* 801542AC 0015120C 7C 08 02 A6 */ mflr r0
|
||||
/* 801542B0 00151210 90 01 00 C4 */ stw r0, 0xc4(r1)
|
||||
|
@ -745,7 +745,7 @@ lbl_80154440:
|
|||
/* 8015446C 001513CC 7F 03 C3 78 */ mr r3, r24
|
||||
/* 80154470 001513D0 7F 65 DB 78 */ mr r5, r27
|
||||
/* 80154474 001513D4 7F 86 E3 78 */ mr r6, r28
|
||||
/* 80154478 001513D8 4B FF FD B9 */ bl sub_80154230
|
||||
/* 80154478 001513D8 4B FF FD B9 */ bl UpdatePlatformRiders__18CScriptActorRotateFR15CScriptPlatformRC12CTransform4fR13CStateManager
|
||||
lbl_8015447C:
|
||||
/* 8015447C 001513DC 3B FF 00 38 */ addi r31, r31, 0x38
|
||||
lbl_80154480:
|
||||
|
@ -785,9 +785,9 @@ lbl_80154480:
|
|||
/* 801544F8 00151458 7D 46 53 78 */ mr r6, r10
|
||||
/* 801544FC 0015145C 38 81 00 08 */ addi r4, r1, 8
|
||||
/* 80154500 00151460 4B EF CE 25 */ bl "__ct__7CEntityF9TUniqueIdRC11CEntityInfobRCQ24rstl66basic_string<c,Q24rstl14char_traits<c>,Q24rstl17rmemory_allocator>"
|
||||
/* 80154504 00151464 3C 60 80 3E */ lis r3, lbl_803E2D08@ha
|
||||
/* 80154504 00151464 3C 60 80 3E */ lis r3, __vt__18CScriptActorRotate@ha
|
||||
/* 80154508 00151468 C0 02 9D F8 */ lfs f0, lbl_805ABB18@sda21(r2)
|
||||
/* 8015450C 0015146C 38 03 2D 08 */ addi r0, r3, lbl_803E2D08@l
|
||||
/* 8015450C 0015146C 38 03 2D 08 */ addi r0, r3, __vt__18CScriptActorRotate@l
|
||||
/* 80154510 00151470 38 C0 00 00 */ li r6, 0
|
||||
/* 80154514 00151474 90 1C 00 00 */ stw r0, 0(r28)
|
||||
/* 80154518 00151478 7F 83 E3 78 */ mr r3, r28
|
||||
|
|
|
@ -196,7 +196,7 @@ LIBS = [
|
|||
["MetroidPrime/Enemies/CMetaree", False],
|
||||
["MetroidPrime/ScriptObjects/CScriptDockAreaChange", False],
|
||||
["MetroidPrime/ScriptObjects/CScriptSpecialFunction", False],
|
||||
"MetroidPrime/ScriptObjects/CScriptActorRotate",
|
||||
["MetroidPrime/ScriptObjects/CScriptActorRotate", False],
|
||||
["MetroidPrime/Player/CFidget", True],
|
||||
"MetroidPrime/Enemies/CSpankWeed",
|
||||
"MetroidPrime/Enemies/CParasite",
|
||||
|
|
|
@ -0,0 +1,40 @@
|
|||
#ifndef _CSCRIPTACTORROTATE
|
||||
#define _CSCRIPTACTORROTATE
|
||||
|
||||
#include "MetroidPrime/CEntity.hpp"
|
||||
|
||||
#include "rstl/map.hpp"
|
||||
|
||||
struct SRiders;
|
||||
class CScriptPlatform;
|
||||
|
||||
class CScriptActorRotate : public CEntity {
|
||||
public:
|
||||
CScriptActorRotate(TUniqueId, const rstl::string&, const CEntityInfo&, const CVector3f&, float,
|
||||
bool, bool, bool);
|
||||
~CScriptActorRotate();
|
||||
|
||||
void Accept(IVisitor& visitor) override;
|
||||
void AcceptScriptMsg(EScriptObjectMessage, TUniqueId, CStateManager&) override;
|
||||
void Think(float, CStateManager&) override;
|
||||
|
||||
private:
|
||||
CVector3f x34_rotation;
|
||||
float x40_maxTime;
|
||||
float x44_currentTime; // = 0.f;
|
||||
// rstl::map< TUniqueId, CTransform4f > x48_actors;
|
||||
rstl::vector< rstl::pair<TUniqueId, CTransform4f> > x48_actors;
|
||||
|
||||
bool x58_24_updateRotation : 1; // = false;
|
||||
bool x58_25_updateSpiderBallWaypoints : 1; // = false;
|
||||
bool x58_26_updateActors : 1;
|
||||
bool x58_27_updateOnCreation : 1;
|
||||
|
||||
void UpdateActors(bool, CStateManager&);
|
||||
void RebuildSpiderBallWaypoints(CStateManager&);
|
||||
void UpdatePlatformRiders(CScriptPlatform&, const CTransform4f&, CStateManager&);
|
||||
void UpdatePlatformRiders(rstl::vector< SRiders >&, CScriptPlatform&, const CTransform4f&,
|
||||
CStateManager&);
|
||||
};
|
||||
|
||||
#endif // _CSCRIPTACTORROTATE
|
|
@ -75,6 +75,9 @@ public:
|
|||
bool IsSlave(TUniqueId id) const;
|
||||
void BuildSlaveList(CStateManager& mgr);
|
||||
|
||||
rstl::vector< SRiders >& GetStaticSlaves() { return x328_slavesStatic; }
|
||||
rstl::vector< SRiders >& GetDynamicSlaves() { return x338_slavesDynamic; }
|
||||
|
||||
void SetControlledAnimation(bool controlled) { x356_25_controlledAnimation = controlled; }
|
||||
|
||||
static void AddRider(rstl::vector< SRiders >& riders, TUniqueId riderId,
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
#ifndef _CSCRIPTSPIDERBALLWAYPOINT
|
||||
#define _CSCRIPTSPIDERBALLWAYPOINT
|
||||
|
||||
#include "MetroidPrime/CActor.hpp"
|
||||
|
||||
class CScriptSpiderBallWaypoint : public CActor {
|
||||
public:
|
||||
void ClearWaypoints();
|
||||
void BuildWaypointListAndBounds(CStateManager& mgr);
|
||||
|
||||
private:
|
||||
enum ECheckActiveWaypoint { kCAW_Check, kCAW_SkipCheck };
|
||||
|
||||
uint xe8_;
|
||||
rstl::vector< TUniqueId > xec_waypoints;
|
||||
rstl::optional_object< CAABox > xfc_aabox;
|
||||
};
|
||||
|
||||
#endif // _CSCRIPTSPIDERBALLWAYPOINT
|
|
@ -0,0 +1,173 @@
|
|||
#include "MetroidPrime/ScriptObjects/CScriptActorRotate.hpp"
|
||||
|
||||
#include "MetroidPrime/CStateManager.hpp"
|
||||
#include "MetroidPrime/ScriptObjects/CScriptPlatform.hpp"
|
||||
#include "MetroidPrime/ScriptObjects/CScriptSpiderBallWaypoint.hpp"
|
||||
|
||||
#include "Kyoto/Math/CMath.hpp"
|
||||
#include "Kyoto/Math/CRelAngle.hpp"
|
||||
#include "Kyoto/Math/CTransform4f.hpp"
|
||||
|
||||
#include "rstl/algorithm.hpp"
|
||||
|
||||
CScriptActorRotate::CScriptActorRotate(TUniqueId uid, const rstl::string& name,
|
||||
const CEntityInfo& info, const CVector3f& rotation,
|
||||
float maxTime, bool updateActors, bool updateOnCreation,
|
||||
bool active)
|
||||
: CEntity(uid, info, active, name)
|
||||
, x34_rotation(rotation)
|
||||
, x40_maxTime(maxTime)
|
||||
, x44_currentTime(0.f)
|
||||
, x58_26_updateActors(updateActors)
|
||||
, x58_27_updateOnCreation(updateOnCreation)
|
||||
, x58_24_updateRotation(false)
|
||||
, x58_25_updateSpiderBallWaypoints(false) {}
|
||||
|
||||
void CScriptActorRotate::UpdatePlatformRiders(rstl::vector< SRiders >& riders,
|
||||
CScriptPlatform& plat, const CTransform4f& xf,
|
||||
CStateManager& mgr) {
|
||||
|
||||
for (rstl::vector< SRiders >::iterator rider = riders.begin(); rider != riders.end(); ++rider) {
|
||||
if (CActor* act = TCastToPtr< CActor >(mgr.ObjectById(rider->x0_uid))) {
|
||||
CTransform4f& riderXf = rider->x8_transform;
|
||||
act->SetTransform(xf * rider->x8_transform);
|
||||
act->SetTranslation(act->GetTranslation() + plat.GetTranslation());
|
||||
if (!x58_24_updateRotation) {
|
||||
riderXf = CTransform4f(act->GetTransform().BuildMatrix3f(),
|
||||
act->GetTranslation() - plat.GetTranslation());
|
||||
|
||||
if (TCastToConstPtr< CScriptSpiderBallWaypoint >(act)) {
|
||||
x58_25_updateSpiderBallWaypoints = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (CScriptPlatform* plat2 = TCastToPtr< CScriptPlatform >(mgr.ObjectById(rider->x0_uid))) {
|
||||
UpdatePlatformRiders(*plat2, xf, mgr);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CScriptActorRotate::UpdatePlatformRiders(CScriptPlatform& plat, const CTransform4f& xf,
|
||||
CStateManager& mgr) {
|
||||
UpdatePlatformRiders(plat.GetStaticSlaves(), plat, xf, mgr);
|
||||
UpdatePlatformRiders(plat.GetDynamicSlaves(), plat, xf, mgr);
|
||||
}
|
||||
|
||||
void CScriptActorRotate::RebuildSpiderBallWaypoints(CStateManager& mgr) {
|
||||
TEntityList waypointIds;
|
||||
CObjectList& objectList = mgr.ObjectListById(kOL_All);
|
||||
for (int i = 0; i != waypointIds.capacity(); ++i) {
|
||||
if (CScriptSpiderBallWaypoint* wp = TCastToPtr< CScriptSpiderBallWaypoint >(objectList[i])) {
|
||||
waypointIds.push_back(wp->GetUniqueId());
|
||||
wp->ClearWaypoints();
|
||||
}
|
||||
}
|
||||
|
||||
for (TEntityList::iterator it = waypointIds.begin(); it != waypointIds.end(); ++it) {
|
||||
CScriptSpiderBallWaypoint* wp = static_cast< CScriptSpiderBallWaypoint* >(mgr.ObjectById(*it));
|
||||
if (wp) {
|
||||
wp->BuildWaypointListAndBounds(mgr);
|
||||
wp->SetTransformDirty(false);
|
||||
}
|
||||
}
|
||||
|
||||
x58_25_updateSpiderBallWaypoints = false;
|
||||
}
|
||||
|
||||
void CScriptActorRotate::Think(float dt, CStateManager& mgr) {
|
||||
if (x58_24_updateRotation && GetActive()) {
|
||||
x44_currentTime += dt;
|
||||
if (x44_currentTime >= x40_maxTime) {
|
||||
x58_24_updateRotation = false;
|
||||
x44_currentTime = x40_maxTime;
|
||||
}
|
||||
|
||||
const float timeOffset = x44_currentTime / x40_maxTime;
|
||||
|
||||
rstl::vector< rstl::pair< TUniqueId, CTransform4f > >::const_iterator it = x48_actors.begin();
|
||||
for (; it != x48_actors.end(); ++it) {
|
||||
if (CActor* act = TCastToPtr< CActor >(mgr.ObjectById(it->first))) {
|
||||
const CTransform4f xf =
|
||||
CTransform4f::RotateX(CRelAngle::FromDegrees(timeOffset * x34_rotation.GetX())) *
|
||||
CTransform4f::RotateY(CRelAngle::FromDegrees(timeOffset * x34_rotation.GetY())) *
|
||||
CTransform4f::RotateZ(CRelAngle::FromDegrees(timeOffset * x34_rotation.GetZ()));
|
||||
CTransform4f localRot = it->second * xf;
|
||||
localRot.SetTranslation(localRot.GetTranslation() + act->GetTranslation());
|
||||
act->SetTransform(localRot);
|
||||
|
||||
if (CScriptPlatform* plat = TCastToPtr< CScriptPlatform >(mgr.ObjectById(it->first))) {
|
||||
UpdatePlatformRiders(*plat, xf, mgr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!x58_24_updateRotation) {
|
||||
if (x58_25_updateSpiderBallWaypoints) {
|
||||
RebuildSpiderBallWaypoints(mgr);
|
||||
}
|
||||
|
||||
if (x58_26_updateActors) {
|
||||
UpdateActors(false, mgr);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CScriptActorRotate::UpdateActors(bool next, CStateManager& mgr) {
|
||||
if (x58_24_updateRotation) {
|
||||
return;
|
||||
}
|
||||
x48_actors.clear();
|
||||
|
||||
rstl::vector< SConnection >::const_iterator conn = GetConnectionList().begin();
|
||||
for (; conn != GetConnectionList().end(); ++conn) {
|
||||
if (conn->x0_state != kSS_Play || conn->x4_msg != kSM_Play) {
|
||||
continue;
|
||||
}
|
||||
|
||||
CStateManager::TIdListResult search = mgr.GetIdListForScript(conn->x8_objId);
|
||||
for (CStateManager::TIdList::const_iterator it = search.first; it != search.second; ++it) {
|
||||
// TODO is this for loop real?
|
||||
for (int i = 0; i < x48_actors.size(); ++i) {
|
||||
if (x48_actors[i].first == it->second) {
|
||||
}
|
||||
}
|
||||
if (const CActor* act = TCastToConstPtr< CActor >(mgr.ObjectById(it->second))) {
|
||||
x48_actors.push_back(
|
||||
rstl::pair< TUniqueId, CTransform4f >(it->second, act->GetTransform().GetRotation()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SendScriptMsgs(kSS_Play, mgr, kSM_None);
|
||||
|
||||
if (!x48_actors.empty()) {
|
||||
x58_24_updateRotation = true;
|
||||
x44_currentTime = (next ? x40_maxTime : 0.f);
|
||||
}
|
||||
}
|
||||
|
||||
void CScriptActorRotate::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid,
|
||||
CStateManager& mgr) {
|
||||
switch (msg) {
|
||||
case kSM_Activate:
|
||||
CEntity::AcceptScriptMsg(msg, uid, mgr);
|
||||
break;
|
||||
|
||||
case kSM_Registered:
|
||||
if (!x58_27_updateOnCreation) {
|
||||
break;
|
||||
}
|
||||
case kSM_Action:
|
||||
case kSM_Next:
|
||||
UpdateActors(msg == kSM_Next, mgr);
|
||||
|
||||
CEntity::AcceptScriptMsg(msg, uid, mgr);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void CScriptActorRotate::Accept(IVisitor& visitor) { visitor.Visit(*this); }
|
||||
|
||||
CScriptActorRotate::~CScriptActorRotate() {}
|
Loading…
Reference in New Issue