more bigendian fixes

This commit is contained in:
GaryOderNichts 2020-10-31 01:56:27 +01:00
parent 21b7895b61
commit 870c560bdb
4 changed files with 100 additions and 22 deletions

View File

@ -67,6 +67,12 @@ void CRecordDataForGame::SaveOrRetrieveDataForThisFrame(void)
uint8* pEndPtr = pController2;
if ((pDataBufferForFrame.m_nSizeOfPads[0] + pDataBufferForFrame.m_nSizeOfPads[1]) & 1)
pEndPtr += 2;
#ifdef BIGENDIAN
// save as LE
pDataBufferForFrame.m_fTimeStep = FLOATSWAP32(pDataBufferForFrame.m_fTimeStep);
pDataBufferForFrame.m_nTimeInMilliseconds = BSWAP32(pDataBufferForFrame.m_nTimeInMilliseconds);
pDataBufferForFrame.m_nChecksum = BSWAP32(pDataBufferForFrame.m_nChecksum);
#endif
CFileMgr::Write(FId, (char*)&pDataBufferForFrame, pEndPtr - (uint8*)&pDataBufferForFrame);
break;
}
@ -75,6 +81,11 @@ void CRecordDataForGame::SaveOrRetrieveDataForThisFrame(void)
CPad::GetPad(0)->NewState.Clear();
else {
tGameBuffer* pData = (tGameBuffer*)pDataBufferPointer;
#ifdef BIGENDIAN
pData->m_fTimeStep = FLOATSWAP32(pData->m_fTimeStep);
pData->m_nTimeInMilliseconds = BSWAP32(pData->m_nTimeInMilliseconds);
pData->m_nChecksum = BSWAP32(pData->m_nChecksum);
#endif
CTimer::SetTimeInMilliseconds(pData->m_nTimeInMilliseconds);
CTimer::SetTimeStep(pData->m_fTimeStep);
uint8 size1 = pData->m_nSizeOfPads[0];
@ -462,6 +473,15 @@ void CRecordDataForChase::StartChaseScene(float startTime)
pBaseMemForCar[i] = new CCarStateEachFrame[CHASE_SCENE_FRAMES_IN_RECORDING];
for (int j = 0; j < CHASE_SCENE_FRAMES_IN_RECORDING; j++) {
CFileMgr::Read(FId2, (char*)&pBaseMemForCar[i][j], sizeof(CCarStateEachFrame));
#ifdef BIGENDIAN
CCarStateEachFrame* state = &pBaseMemForCar[i][j];
state->velX = BSWAP16(state->velX);
state->velY = BSWAP16(state->velY);
state->velZ = BSWAP16(state->velZ);
state->pos.x = FLOATSWAP32(state->pos.x);
state->pos.y = FLOATSWAP32(state->pos.y);
state->pos.z = FLOATSWAP32(state->pos.z);
#endif
CFileMgr::Seek(FId2, sizeof(CCarStateEachFrame), 1);
}
CFileMgr::CloseFile(FId2);

View File

@ -295,6 +295,10 @@ void CReplay::RecordThisFrame(void)
general->camera_pos.CopyOnlyMatrix(&TheCamera.GetMatrix());
general->player_pos = FindPlayerCoors();
general->in_rcvehicle = CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle ? true : false;
#ifdef BIGENDIAN
BSWAP_MTX(general->camera_pos.m_matrix);
BSWAP_VECTOR(general->player_pos);
#endif
Record.m_nOffset += sizeof(*general);
tClockPacket* clock = (tClockPacket*)&Record.m_pBase[Record.m_nOffset];
clock->type = REPLAYPACKET_CLOCK;
@ -303,13 +307,13 @@ void CReplay::RecordThisFrame(void)
Record.m_nOffset += sizeof(*clock);
tWeatherPacket* weather = (tWeatherPacket*)&Record.m_pBase[Record.m_nOffset];
weather->type = REPLAYPACKET_WEATHER;
weather->old_weather = CWeather::OldWeatherType;
weather->new_weather = CWeather::NewWeatherType;
weather->interpolation = CWeather::InterpolationValue;
weather->old_weather = BSWAP32(CWeather::OldWeatherType);
weather->new_weather = BSWAP32(CWeather::NewWeatherType);
weather->interpolation = FLOATSWAP32(CWeather::InterpolationValue);
Record.m_nOffset += sizeof(*weather);
tTimerPacket* timer = (tTimerPacket*)&Record.m_pBase[Record.m_nOffset];
timer->type = REPLAYPACKET_TIMER;
timer->timer = CTimer::GetTimeInMilliseconds();
timer->timer = BSWAP32(CTimer::GetTimeInMilliseconds());
Record.m_nOffset += sizeof(*timer);
CVehiclePool* vehicles = CPools::GetVehiclePool();
for (int i = 0; i < vehicles->GetSize(); i++){
@ -326,7 +330,7 @@ void CReplay::RecordThisFrame(void)
tPedHeaderPacket* ph = (tPedHeaderPacket*)&Record.m_pBase[Record.m_nOffset];
ph->type = REPLAYPACKET_PED_HEADER;
ph->index = i;
ph->mi = p->GetModelIndex();
ph->mi = BSWAP32(p->GetModelIndex());
ph->pedtype = p->m_nPedType;
Record.m_nOffset += sizeof(*ph);
p->bHasAlreadyBeenRecorded = true;
@ -343,6 +347,10 @@ void CReplay::RecordThisFrame(void)
bt->lifetime = CBulletTraces::aTraces[i].m_lifeTime;
bt->inf = CBulletTraces::aTraces[i].m_vecCurrentPos;
bt->sup = CBulletTraces::aTraces[i].m_vecTargetPos;
#ifdef BIGENDIAN
BSWAP_VECTOR(bt->inf);
BSWAP_VECTOR(bt->sup);
#endif
Record.m_nOffset += sizeof(*bt);
}
tEndOfFramePacket* eof = (tEndOfFramePacket*)&Record.m_pBase[Record.m_nOffset];
@ -373,6 +381,9 @@ void CReplay::StorePedUpdate(CPed *ped, int id)
pp->index = id;
pp->heading = 128.0f / PI * ped->m_fRotationCur;
pp->matrix.CompressFromFullMatrix(ped->GetMatrix());
#ifdef BIGENDIAN
BSWAP_VECTOR(pp->matrix.m_vecPos);
#endif
pp->assoc_group_id = ped->m_animGroup;
/* Would be more sane to use GetJustIndex(ped->m_pMyVehicle) in following assignment */
if (ped->InVehicle())
@ -435,7 +446,7 @@ void CReplay::StoreDetailedPedAnimation(CPed *ped, CStoredDetailedAnimationState
#ifdef FIX_REPLAY_BUGS
state->aBlendDelta[i] = 127.0f / 32.0f * clamp(assoc->blendDelta, -16.0f, 16.0f);
#endif
state->aFlags[i] = assoc->flags;
state->aFlags[i] = BSWAP16(assoc->flags);
if (assoc->callbackType == CAnimBlendAssociation::CB_FINISH || assoc->callbackType == CAnimBlendAssociation::CB_DELETE) {
state->aFunctionCallbackID[i] = FindCBFunctionID(assoc->callback);
if (assoc->callbackType == CAnimBlendAssociation::CB_FINISH)
@ -461,7 +472,7 @@ void CReplay::StoreDetailedPedAnimation(CPed *ped, CStoredDetailedAnimationState
#ifdef FIX_REPLAY_BUGS
state->aBlendDelta2[i] = 127.0f / 16.0f * clamp(assoc->blendDelta, -16.0f, 16.0f);
#endif
state->aFlags2[i] = assoc->flags;
state->aFlags2[i] = BSWAP32(assoc->flags);
if (assoc->callbackType == CAnimBlendAssociation::CB_FINISH || assoc->callbackType == CAnimBlendAssociation::CB_DELETE) {
state->aFunctionCallbackID2[i] = FindCBFunctionID(assoc->callback);
if (assoc->callbackType == CAnimBlendAssociation::CB_FINISH)
@ -491,6 +502,9 @@ void CReplay::ProcessPedUpdate(CPed *ped, float interpolation, CAddressInReplayB
ped->m_fRotationCur = pp->heading * PI / 128.0f;
ped->m_fRotationDest = pp->heading * PI / 128.0f;
CMatrix ped_matrix;
#ifdef BIGENDIAN
BSWAP_VECTOR(pp->matrix.m_vecPos);
#endif
pp->matrix.DecompressIntoFullMatrix(ped_matrix);
ped->GetMatrix() = ped->GetMatrix() * CMatrix(1.0f - interpolation);
ped->GetMatrix().GetPosition() *= (1.0f - interpolation);
@ -678,13 +692,16 @@ void CReplay::StoreCarUpdate(CVehicle *vehicle, int id)
vp->type = REPLAYPACKET_VEHICLE;
vp->index = id;
vp->matrix.CompressFromFullMatrix(vehicle->GetMatrix());
#ifdef BIGENDIAN
BSWAP_VECTOR(vp->matrix.m_vecPos);
#endif
vp->health = vehicle->m_fHealth / 4.0f; /* Not anticipated that health can be > 1000. */
vp->acceleration = vehicle->m_fGasPedal * 100.0f;
vp->panels = vehicle->IsCar() ? ((CAutomobile*)vehicle)->Damage.m_panelStatus : 0;
vp->panels = BSWAP32(vehicle->IsCar() ? ((CAutomobile*)vehicle)->Damage.m_panelStatus : 0);
vp->velocityX = 8000.0f * Max(-4.0f, Min(4.0f, vehicle->GetMoveSpeed().x)); /* 8000!? */
vp->velocityY = 8000.0f * Max(-4.0f, Min(4.0f, vehicle->GetMoveSpeed().y));
vp->velocityZ = 8000.0f * Max(-4.0f, Min(4.0f, vehicle->GetMoveSpeed().z));
vp->mi = vehicle->GetModelIndex();
vp->mi = BSWAP32(vehicle->GetModelIndex());
vp->primary_color = vehicle->m_currentColour1;
vp->secondary_color = vehicle->m_currentColour2;
if (vehicle->GetModelIndex() == MI_RHINO)
@ -716,6 +733,9 @@ void CReplay::ProcessCarUpdate(CVehicle *vehicle, float interpolation, CAddressI
return;
}
CMatrix vehicle_matrix;
#ifdef BIGENDIAN
BSWAP_VECTOR(vp->matrix.m_vecPos);
#endif
vp->matrix.DecompressIntoFullMatrix(vehicle_matrix);
vehicle->GetMatrix() = vehicle->GetMatrix() * CMatrix(1.0f - interpolation);
vehicle->GetMatrix().GetPosition() *= (1.0f - interpolation);
@ -724,7 +744,7 @@ void CReplay::ProcessCarUpdate(CVehicle *vehicle, float interpolation, CAddressI
vehicle->m_fHealth = 4 * vp->health;
vehicle->m_fGasPedal = vp->acceleration / 100.0f;
if (vehicle->IsCar())
ApplyPanelDamageToCar(vp->panels, (CAutomobile*)vehicle, true);
ApplyPanelDamageToCar(BSWAP32(vp->panels), (CAutomobile*)vehicle, true);
vehicle->m_vecMoveSpeed = CVector(vp->velocityX / 8000.0f, vp->velocityY / 8000.0f, vp->velocityZ / 8000.0f);
if (vehicle->GetModelIndex() == MI_RHINO) {
((CAutomobile*)vehicle)->m_fCarGunLR = vp->car_gun * PI / 128.0f;
@ -830,7 +850,7 @@ bool CReplay::PlayBackThisFrameInterpolation(CAddressInReplayBuffer *buffer, flo
CVehicle* v = CPools::GetVehiclePool()->GetSlot(vp->index);
CVehicle* new_v;
if (!v) {
int mi = vp->mi;
int mi = BSWAP16(vp->mi);
if (CStreaming::ms_aInfoForModel[mi].m_loadState != 1) {
CStreaming::RequestModel(mi, 0);
}
@ -865,11 +885,11 @@ bool CReplay::PlayBackThisFrameInterpolation(CAddressInReplayBuffer *buffer, flo
{
tPedHeaderPacket* ph = (tPedHeaderPacket*)&ptr[offset];
if (!CPools::GetPedPool()->GetSlot(ph->index)) {
if (CStreaming::ms_aInfoForModel[ph->mi].m_loadState != 1) {
CStreaming::RequestModel(ph->mi, 0);
if (CStreaming::ms_aInfoForModel[BSWAP16(ph->mi)].m_loadState != 1) {
CStreaming::RequestModel(BSWAP16(ph->mi), 0);
}
else {
CPed* new_p = new(ph->index << 8) CCivilianPed((ePedType)ph->pedtype, ph->mi);
CPed* new_p = new(ph->index << 8) CCivilianPed((ePedType)ph->pedtype, BSWAP16(ph->mi));
new_p->SetStatus(STATUS_PLAYER_PLAYBACKFROMBUFFER);
new_p->GetMatrix().SetUnity();
CWorld::Add(new_p);
@ -896,6 +916,9 @@ bool CReplay::PlayBackThisFrameInterpolation(CAddressInReplayBuffer *buffer, flo
case REPLAYPACKET_GENERAL:
{
tGeneralPacket* pg = (tGeneralPacket*)&ptr[offset];
#ifdef BIGENDIAN
BSWAP_MTX(pg->camera_pos.m_matrix);
#endif
TheCamera.GetMatrix() = TheCamera.GetMatrix() * CMatrix(split);
TheCamera.GetMatrix().GetPosition() *= split;
TheCamera.GetMatrix() += CMatrix(interpolation) * pg->camera_pos;
@ -904,9 +927,9 @@ bool CReplay::PlayBackThisFrameInterpolation(CAddressInReplayBuffer *buffer, flo
pm->at = TheCamera.GetForward();
pm->up = TheCamera.GetUp();
pm->right = TheCamera.GetRight();
CameraFocusX = split * CameraFocusX + interpolation * pg->player_pos.x;
CameraFocusY = split * CameraFocusY + interpolation * pg->player_pos.y;
CameraFocusZ = split * CameraFocusZ + interpolation * pg->player_pos.z;
CameraFocusX = split * CameraFocusX + interpolation * FLOATSWAP32(pg->player_pos.x);
CameraFocusY = split * CameraFocusY + interpolation * FLOATSWAP32(pg->player_pos.y);
CameraFocusZ = split * CameraFocusZ + interpolation * FLOATSWAP32(pg->player_pos.z);
bPlayerInRCBuggy = pg->in_rcvehicle;
buffer->m_nOffset += sizeof(tGeneralPacket);
break;
@ -923,7 +946,7 @@ bool CReplay::PlayBackThisFrameInterpolation(CAddressInReplayBuffer *buffer, flo
tWeatherPacket* pw = (tWeatherPacket*)&ptr[offset];
CWeather::OldWeatherType = pw->old_weather;
CWeather::NewWeatherType = pw->new_weather;
CWeather::InterpolationValue = pw->interpolation;
CWeather::InterpolationValue = FLOATSWAP32(pw->interpolation);
buffer->m_nOffset += sizeof(tWeatherPacket);
break;
}
@ -938,14 +961,18 @@ bool CReplay::PlayBackThisFrameInterpolation(CAddressInReplayBuffer *buffer, flo
{
tTimerPacket* pt = (tTimerPacket*)&ptr[offset];
if (pTimer)
*pTimer = pt->timer;
CTimer::SetTimeInMilliseconds(pt->timer);
*pTimer = BSWAP32(pt->timer);
CTimer::SetTimeInMilliseconds(BSWAP32(pt->timer));
buffer->m_nOffset += sizeof(tTimerPacket);
break;
}
case REPLAYPACKET_BULLET_TRACES:
{
tBulletTracePacket* pb = (tBulletTracePacket*)&ptr[offset];
#ifdef BIGENDIAN
BSWAP_VECTOR(pb->inf);
BSWAP_VECTOR(pb->sup);
#endif
CBulletTraces::aTraces[pb->index].m_bInUse = true;
CBulletTraces::aTraces[pb->index].m_framesInUse = pb->frames;
CBulletTraces::aTraces[pb->index].m_lifeTime = pb->lifetime;
@ -1457,10 +1484,10 @@ void CReplay::StreamAllNecessaryCarsAndPeds(void)
for (size_t offset = 0; Buffers[slot][offset] != REPLAYPACKET_END; offset += FindSizeOfPacket(Buffers[slot][offset])) {
switch (Buffers[slot][offset]) {
case REPLAYPACKET_VEHICLE:
CStreaming::RequestModel(((tVehicleUpdatePacket*)&Buffers[slot][offset])->mi, 0);
CStreaming::RequestModel(BSWAP16(((tVehicleUpdatePacket*)&Buffers[slot][offset])->mi), 0);
break;
case REPLAYPACKET_PED_HEADER:
CStreaming::RequestModel(((tPedHeaderPacket*)&Buffers[slot][offset])->mi, 0);
CStreaming::RequestModel(BSWAP16(((tPedHeaderPacket*)&Buffers[slot][offset])->mi), 0);
break;
default:
break;
@ -1478,7 +1505,15 @@ void CReplay::FindFirstFocusCoordinate(CVector *coord)
continue;
for (size_t offset = 0; Buffers[slot][offset] != REPLAYPACKET_END; offset += FindSizeOfPacket(Buffers[slot][offset])) {
if (Buffers[slot][offset] == REPLAYPACKET_GENERAL) {
#ifndef BIGENDIAN
*coord = ((tGeneralPacket*)&Buffers[slot][offset])->player_pos;
#else
CVector* pos = &((tGeneralPacket*)&Buffers[slot][offset])->player_pos;
pos->x = FLOATSWAP32(pos->x);
pos->y = FLOATSWAP32(pos->y);
pos->z = FLOATSWAP32(pos->z);
*coord = *pos;
#endif
return;
}
}

View File

@ -88,6 +88,23 @@ inline float _floatswap32(float f)
#define BSWAP32(x) __builtin_bswap32(x)
#define BSWAP16(x) __builtin_bswap16(x)
#define FLOATSWAP32(x) _floatswap32(x)
#define BSWAP_VECTOR(v) \
do { \
v.x = FLOATSWAP32(v.x); \
v.y = FLOATSWAP32(v.y); \
v.z = FLOATSWAP32(v.z); \
} while(0)
#define BSWAP_MTX(m) \
do { \
BSWAP_VECTOR(m.right); \
BSWAP_VECTOR(m.up); \
BSWAP_VECTOR(m.at); \
BSWAP_VECTOR(m.pos); \
BSWAP32(m.flags); \
BSWAP32(m.pad1); \
BSWAP32(m.pad2); \
BSWAP32(m.pad3); \
} while(0)
#else
#define BSWAP32(x) (x)
#define BSWAP16(x) (x)

View File

@ -113,7 +113,9 @@ inline CVector MultiplyInverse(const CMatrix &mat, const CVector &vec)
class CCompressedMatrixNotAligned
{
#ifndef BIGENDIAN
CVector m_vecPos;
#endif
int8 m_rightX;
int8 m_rightY;
int8 m_rightZ;
@ -121,6 +123,10 @@ class CCompressedMatrixNotAligned
int8 m_upY;
int8 m_upZ;
public:
#ifdef BIGENDIAN
// needs to be public for bswapping
CVector m_vecPos;
#endif
void CompressFromFullMatrix(CMatrix &other);
void DecompressIntoFullMatrix(CMatrix &other);
};