summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/control/Replay.cpp24
-rw-r--r--src/control/Replay.h17
-rw-r--r--src/math/Matrix.h34
3 files changed, 71 insertions, 4 deletions
diff --git a/src/control/Replay.cpp b/src/control/Replay.cpp
index a8d87302..d9cd2a80 100644
--- a/src/control/Replay.cpp
+++ b/src/control/Replay.cpp
@@ -132,7 +132,6 @@ void CReplay::Update(void)
#if 0
WRAPPER void CReplay::RecordThisFrame(void) { EAXJMP(0x5932B0); }
#else
-
void CReplay::RecordThisFrame(void)
{
tGeneralPacket* general = (tGeneralPacket*)&Record.m_pBase[Record.m_nOffset];
@@ -182,7 +181,7 @@ void CReplay::RecordThisFrame(void)
if (!CBulletTraces::aTraces[i].m_bInUse)
continue;
tBulletTracePacket* bt = (tBulletTracePacket*)&Record.m_pBase[Record.m_nOffset];
- bt->type = REPLAYPACKET_BULLETTRACES;
+ bt->type = REPLAYPACKET_BULLET_TRACES;
bt->index = i;
bt->frames = CBulletTraces::aTraces[i].m_bFramesInUse;
bt->lifetime = CBulletTraces::aTraces[i].m_bLifeTime;
@@ -210,7 +209,28 @@ void CReplay::RecordThisFrame(void)
MarkEverythingAsNew();
}
#endif
+
+#if 0
WRAPPER void CReplay::StorePedUpdate(CPed *ped, int id) { EAXJMP(0x5935B0); }
+#else
+void CReplay::StorePedUpdate(CPed *ped, int id)
+{
+ tPedUpdatePacket* pp = (tPedUpdatePacket*)&Record.m_pBase[Record.m_nOffset];
+ pp->type = REPLAYPACKET_PED_UPDATE;
+ pp->index = id;
+ pp->heading = 128.0f / M_PI * ped->m_fRotationCur;
+ pp->matrix.CompressFromFullMatrix(ped->GetMatrix());
+ pp->assoc_group_id = ped->m_animGroup;
+ /* Would be more sane to use GetJustIndex(ped->m_pMyVehicle) in following assignment */
+ if (ped->bInVehicle && ped->m_pMyVehicle)
+ pp->vehicle_index = (CPools::GetVehiclePool()->GetIndex(ped->m_pMyVehicle) >> 8) + 1;
+ else
+ pp->vehicle_index = 0;
+ pp->weapon_model = ped->m_wepModelID;
+ StorePedAnimation(ped, &pp->anim_state);
+ Record.m_nOffset += sizeof(tPedUpdatePacket);
+}
+#endif
WRAPPER void CReplay::StorePedAnimation(CPed *ped, CStoredAnimationState *state) { EAXJMP(0x593670); }
WRAPPER void CReplay::StoreDetailedPedAnimation(CPed *ped, CStoredDetailedAnimationState *state) { EAXJMP(0x593BB0); }
WRAPPER void CReplay::ProcessPedUpdate(CPed *ped, float interpolation, CAddressInReplayBuffer *buffer) { EAXJMP(0x594050); }
diff --git a/src/control/Replay.h b/src/control/Replay.h
index b37bd29f..b73b249c 100644
--- a/src/control/Replay.h
+++ b/src/control/Replay.h
@@ -65,13 +65,13 @@ class CReplay
REPLAYPACKET_END = 0,
REPLAYPACKET_VEHICLE = 1,
REPLAYPACKET_PED_HEADER = 2,
- REPLAYPACKET_PED = 3,
+ REPLAYPACKET_PED_UPDATE = 3,
REPLAYPACKET_GENERAL = 4,
REPLAYPACKET_CLOCK = 5,
REPLAYPACKET_WEATHER = 6,
REPLAYPACKET_ENDOFFRAME = 7,
REPLAYPACKET_TIMER = 8,
- REPLAYPACKET_BULLETTRACES = 9
+ REPLAYPACKET_BULLET_TRACES = 9
};
enum {
@@ -146,6 +146,19 @@ class CReplay
};
static_assert(sizeof(tEndOfFramePacket) == 4, "tEndOfFramePacket: error");
+ struct tPedUpdatePacket
+ {
+ uint8 type;
+ uint8 index;
+ int8 heading;
+ int8 vehicle_index;
+ CStoredAnimationState anim_state;
+ CCompressedMatrixNotAligned matrix;
+ uint8 assoc_group_id;
+ uint8 weapon_model;
+ };
+ static_assert(sizeof(tPedUpdatePacket) == 40, "tPedUpdatePacket: error");
+
private:
static uint8 &Mode;
static CAddressInReplayBuffer &Record;
diff --git a/src/math/Matrix.h b/src/math/Matrix.h
index a93de636..2ee3863f 100644
--- a/src/math/Matrix.h
+++ b/src/math/Matrix.h
@@ -246,3 +246,37 @@ Multiply3x3(const CMatrix &mat, const CVector &vec)
mat.m_matrix.right.y * vec.x + mat.m_matrix.up.y * vec.y + mat.m_matrix.at.y * vec.z,
mat.m_matrix.right.z * vec.x + mat.m_matrix.up.z * vec.y + mat.m_matrix.at.z * vec.z);
}
+
+class CCompressedMatrixNotAligned
+{
+ CVector m_vecPos;
+ int8 m_rightX;
+ int8 m_rightY;
+ int8 m_rightZ;
+ int8 m_upX;
+ int8 m_upY;
+ int8 m_upZ;
+public:
+ void CompressFromFullMatrix(CMatrix &other)
+ {
+ m_rightX = 127.0f * other.GetRight()->x;
+ m_rightY = 127.0f * other.GetRight()->y;
+ m_rightZ = 127.0f * other.GetRight()->z;
+ m_upX = 127.0f * other.GetForward()->x;
+ m_upY = 127.0f * other.GetForward()->y;
+ m_upZ = 127.0f * other.GetForward()->z;
+ m_vecPos = *other.GetPosition();
+ }
+ void DecompressIntoFullMatrix(CMatrix &other)
+ {
+ other.GetRight()->x = m_rightX / 127.0f;
+ other.GetRight()->y = m_rightY / 127.0f;
+ other.GetRight()->z = m_rightZ / 127.0f;
+ other.GetForward()->x = m_upX / 127.0f;
+ other.GetForward()->y = m_upY / 127.0f;
+ other.GetForward()->z = m_upZ / 127.0f;
+ *other.GetUp() = CrossProduct(*other.GetRight(), *other.GetForward());
+ *other.GetPosition() = m_vecPos;
+ other.Reorthogonalise();
+ }
+}; \ No newline at end of file