From 870c560bdb69a15f8bb4f5c3f43af9deaf2b1489 Mon Sep 17 00:00:00 2001 From: GaryOderNichts <12049776+GaryOderNichts@users.noreply.github.com> Date: Sat, 31 Oct 2020 01:56:27 +0100 Subject: [PATCH] more bigendian fixes --- src/control/Record.cpp | 20 +++++++++++ src/control/Replay.cpp | 79 ++++++++++++++++++++++++++++++------------ src/core/common.h | 17 +++++++++ src/math/Matrix.h | 6 ++++ 4 files changed, 100 insertions(+), 22 deletions(-) diff --git a/src/control/Record.cpp b/src/control/Record.cpp index 8a23ffde..cd110756 100644 --- a/src/control/Record.cpp +++ b/src/control/Record.cpp @@ -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); diff --git a/src/control/Replay.cpp b/src/control/Replay.cpp index f21703ac..5f5d404d 100644 --- a/src/control/Replay.cpp +++ b/src/control/Replay.cpp @@ -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; } } diff --git a/src/core/common.h b/src/core/common.h index 5695bd98..7a578758 100644 --- a/src/core/common.h +++ b/src/core/common.h @@ -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) diff --git a/src/math/Matrix.h b/src/math/Matrix.h index d8f6388d..538bcc00 100644 --- a/src/math/Matrix.h +++ b/src/math/Matrix.h @@ -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); };