From ef8e9e7f1b611f5565b9c9ba3e78162849c53d32 Mon Sep 17 00:00:00 2001 From: _AG Date: Thu, 20 Jun 2019 11:20:52 +0200 Subject: [PATCH] Update Radar.cpp --- src/Radar.cpp | 93 ++++++++++++++++++++++++++++++++++++------ src/Radar.h | 8 ++-- src/control/Script.cpp | 1 + src/control/Script.h | 1 + 4 files changed, 87 insertions(+), 16 deletions(-) diff --git a/src/Radar.cpp b/src/Radar.cpp index 58c9973b..abb4df99 100644 --- a/src/Radar.cpp +++ b/src/Radar.cpp @@ -9,24 +9,24 @@ #include "Vehicle.h" #include "Pools.h" #include "Script.h" -#include "Font.h" +//WRAPPER void CRadar::DrawMap () { EAXJMP(0x4A4200); } +//WRAPPER void CRadar::DrawRotatingRadarSprite(CSprite2d* sprite, float x, float y, float angle, int alpha) { EAXJMP(0x4A5D10); } +//WRAPPER void CRadar::TransformRealWorldPointToRadarSpace(CVector2D *out, CVector2D *in) { EAXJMP(0x4A50D0); } +//WRAPPER void CRadar::DrawRadarSprite(int sprite, float x, float y, int alpha) { EAXJMP(0x4A5EF0); } +//WRAPPER void CRadar::ShowRadarMarker(CVector pos, uint32 color, float radius) { EAXJMP(0x4A59C0); } +//WRAPPER void CRadar::DrawBlips() { EAXJMP(0x4A42F0); } WRAPPER void CRadar::ClearBlipForEntity(eBlipType type, int32 id) { EAXJMP(0x4A56C0); } WRAPPER void CRadar::Draw3dMarkers() { EAXJMP(0x4A4C70); } -//WRAPPER void CRadar::DrawMap () { EAXJMP(0x4A4200); } WRAPPER void CRadar::DrawRadarMap() { EAXJMP(0x4A6C20); } -//WRAPPER void CRadar::DrawRotatingRadarSprite(CSprite2d* sprite, float x, float y, float angle, int alpha) { EAXJMP(0x4A5D10); } -WRAPPER void CRadar::TransformRealWorldPointToRadarSpace(CVector2D *out, CVector2D *in) { EAXJMP(0x4A50D0); } WRAPPER float CRadar::LimitRadarPoint(CVector2D *point) { EAXJMP(0x4A4F30); } -//WRAPPER void CRadar::DrawRadarSprite(int sprite, float x, float y, int alpha) { EAXJMP(0x4A5EF0); } -WRAPPER void CRadar::ShowRadarMarker(CVector pos, uint32 color, float radius) { EAXJMP(0x4A59C0); } WRAPPER void CRadar::ShowRadarTrace(float x, float y, uint32 size, uint32 red, uint32 green, uint32 blue, uint32 alpha) { EAXJMP(0x4A5870); } -WRAPPER int CRadar::GetRadarTraceColour2(uint32 color, bool bright) { EAXJMP(0x4A5BB0); } -//WRAPPER void CRadar::DrawBlips() { EAXJMP(0x4A42F0); } float &CRadar::m_RadarRange = *(float*)0x8E281C; CVector2D &CRadar::vec2DRadarOrigin = *(CVector2D*)0x6299B8; CBlip *CRadar::ms_RadarTrace = (CBlip*)0x6ED5E0; +float CRadar::cachedSin; +float CRadar::cachedCos; CSprite2d *CRadar::AsukaSprite = (CSprite2d*)0x8F1A40; CSprite2d *CRadar::BombSprite = (CSprite2d*)0x8F5FB4; @@ -147,7 +147,7 @@ void CRadar::DrawBlips() if (e) { if (CRadar::ms_RadarTrace[i].m_eBlipDisplay == BLIP_DISPLAY_BOTH || CRadar::ms_RadarTrace[i].m_eBlipDisplay == BLIP_DISPLAY_MARKER_ONLY) { if (CTheScripts::DbgFlag) { - CRadar::ShowRadarMarker(e->GetPosition(), CRadar::GetRadarTraceColour2(CRadar::ms_RadarTrace[i].m_nColor, CRadar::ms_RadarTrace[i].m_bDim), CRadar::ms_RadarTrace->m_Radius); + CRadar::ShowRadarMarker(e->GetPosition(), CRadar::GetRadarTraceColour(CRadar::ms_RadarTrace[i].m_nColor, CRadar::ms_RadarTrace[i].m_bDim), CRadar::ms_RadarTrace->m_Radius); CRadar::ms_RadarTrace[i].m_Radius = CRadar::ms_RadarTrace[i].m_Radius - 0.1f; if (CRadar::ms_RadarTrace[i].m_Radius >= 1.0f) @@ -155,7 +155,7 @@ void CRadar::DrawBlips() } } if (CRadar::ms_RadarTrace[i].m_eBlipDisplay == BLIP_DISPLAY_BOTH || CRadar::ms_RadarTrace[i].m_eBlipDisplay == BLIP_DISPLAY_BLIP_ONLY) { - vec2d = { e->GetBoundCentre() }; + vec2d = e->GetPosition(); CRadar::TransformRealWorldPointToRadarSpace(&in, &vec2d); float dist = CRadar::LimitRadarPoint(&in); int a = CRadar::CalculateBlipAlpha(dist); @@ -179,10 +179,10 @@ void CRadar::DrawBlips() for (int i = 0; i < 32; i++) { if (CRadar::ms_RadarTrace[i].m_bInUse) { if (ms_RadarTrace[i].m_eBlipType >= BLIP_COORD) { - if (CRadar::DisplayThisBlip(ms_RadarTrace[i].m_IconID, i) && CRadar::ms_RadarTrace[i].m_eBlipType != BLIP_CONTACT_POINT || !CTheScripts::IsPlayerOnAMission()) { + if (CRadar::DisplayThisBlip(ms_RadarTrace[i].m_IconID) && CRadar::ms_RadarTrace[i].m_eBlipType != BLIP_CONTACT_POINT || !CTheScripts::IsPlayerOnAMission()) { if (CRadar::ms_RadarTrace[i].m_eBlipDisplay == BLIP_DISPLAY_BOTH || CRadar::ms_RadarTrace[i].m_eBlipDisplay == BLIP_DISPLAY_MARKER_ONLY) { if (CTheScripts::DbgFlag) { - CRadar::ShowRadarMarker(CRadar::ms_RadarTrace[i].m_vecPos, CRadar::GetRadarTraceColour2(CRadar::ms_RadarTrace[i].m_nColor, CRadar::ms_RadarTrace[i].m_bDim), CRadar::ms_RadarTrace->m_Radius); + CRadar::ShowRadarMarker(CRadar::ms_RadarTrace[i].m_vecPos, CRadar::GetRadarTraceColour(CRadar::ms_RadarTrace[i].m_nColor, CRadar::ms_RadarTrace[i].m_bDim), CRadar::ms_RadarTrace->m_Radius); CRadar::ms_RadarTrace[i].m_Radius = CRadar::ms_RadarTrace[i].m_Radius - 0.1f; if (CRadar::ms_RadarTrace[i].m_Radius >= 1.0f) CRadar::ms_RadarTrace[i].m_Radius = 5.0f; @@ -209,7 +209,7 @@ void CRadar::DrawBlips() } } -bool CRadar::DisplayThisBlip(int16 spriteid, int counter) +bool CRadar::DisplayThisBlip(int16 spriteid) { switch (spriteid) { case RADAR_SPRITE_NONE: @@ -316,6 +316,39 @@ void CRadar::TransformRadarPointToScreenSpace(CVector2D *out, CVector2D *in) out->y = (SCREEN_SCALE_Y(76.0f)) * 0.5f + SCREEN_HEIGHT - (SCREEN_SCALE_Y(123.0f)) - in->y * (SCREEN_SCALE_Y(76.0f)) * 0.5f; } +void CRadar::TransformRealWorldPointToRadarSpace(CVector2D *out, CVector2D *in) +{ + if (TheCamera.Cams->Mode != CCam::CamMode::MODE_TOPDOWN1 && TheCamera.Cams->Mode != CCam::CamMode::MODE_TOPDOWNPED) { + if (TheCamera.GetLookDirection() != LOOKING_FORWARD) { + cachedSin = sin(atan2(-TheCamera.Cams[TheCamera.ActiveCam].CamTargetEntity->m_matrix.m_matrix.up.x, TheCamera.Cams[TheCamera.ActiveCam].CamTargetEntity->m_matrix.m_matrix.up.y)); + cachedCos = cos(atan2(-TheCamera.Cams[TheCamera.ActiveCam].CamTargetEntity->m_matrix.m_matrix.up.x, TheCamera.Cams[TheCamera.ActiveCam].CamTargetEntity->m_matrix.m_matrix.up.y)); + } + else { + CVector vecCamera; + + if (TheCamera.Cams->Mode == CCam::CamMode::MODE_FIRSTPERSON) { + vecCamera = TheCamera.Cams[TheCamera.ActiveCam].CamTargetEntity->m_matrix.m_matrix.up; + vecCamera.Normalise(); + } + else + vecCamera = TheCamera.Cams[TheCamera.ActiveCam].CamTargetEntity->m_matrix.m_matrix.pos - TheCamera.Cams[TheCamera.ActiveCam].SourceBeforeLookBehind; + + cachedSin = sin(atan2(-vecCamera.x, vecCamera.y)); + cachedCos = cos(atan2(-vecCamera.x, vecCamera.y)); + } + } + else { + cachedSin = 0.0f; + cachedCos = 1.0f; + } + + float x = (in->x - vec2DRadarOrigin.x) * (1.0f / m_RadarRange); + float y = (in->y - vec2DRadarOrigin.y) * (1.0f / m_RadarRange); + + out->x = cachedSin * y + cachedCos * x; + out->y = cachedCos * y - cachedSin * x; +} + void CRadar::DrawRadarSprite(int sprite, float x, float y, int alpha) { float w = SCREEN_SCALE_X(8.0f); @@ -324,6 +357,40 @@ void CRadar::DrawRadarSprite(int sprite, float x, float y, int alpha) RadarSprites[sprite]->Draw(CRect(x - w, y - h, x + w, y + h), CRGBA(255, 255, 255, alpha)); } +void CRadar::ShowRadarMarker(CVector pos, CRGBA color, float radius) { + float z2 = pos.z + (0.5f * color.color32) * TheCamera.m_matrix.m_matrix.at.z; + float y2 = (0.5f * color.color32) * TheCamera.m_matrix.m_matrix.at.y + pos.y; + float x2 = (0.5f * color.color32) * TheCamera.m_matrix.m_matrix.at.x + pos.x; + float z1 = pos.z + (1.4f * color.color32) * TheCamera.m_matrix.m_matrix.at.z; + float y1 = (1.4f * color.color32) * TheCamera.m_matrix.m_matrix.at.y + pos.y; + float x1 = (1.4f * color.color32) * TheCamera.m_matrix.m_matrix.at.x + pos.x; + CTheScripts::ScriptDebugLine3D(x1, y1, z1, x2, y2, z2, color.color32, color.color32); + + z2 = pos.z - (0.5f * color.color32) * TheCamera.m_matrix.m_matrix.at.x; + y2 = pos.y - (0.5f * color.color32) * TheCamera.m_matrix.m_matrix.at.x; + x2 = pos.x - (0.5f * color.color32) * TheCamera.m_matrix.m_matrix.at.x; + z1 = pos.z - (1.4f * color.color32) * TheCamera.m_matrix.m_matrix.at.x; + y1 = pos.y - (1.4f * color.color32) * TheCamera.m_matrix.m_matrix.at.x; + x1 = pos.x - (1.4f * color.color32) * TheCamera.m_matrix.m_matrix.at.x; + CTheScripts::ScriptDebugLine3D(x1, y1, z1, x2, y2, z2, color.color32, color.color32); + + z2 = (0.5f * color.color32) * TheCamera.m_matrix.m_matrix.right.x + pos.z; + y2 = (0.5f * color.color32) * TheCamera.m_matrix.m_matrix.right.x + pos.y; + x2 = (0.5f * color.color32) * TheCamera.m_matrix.m_matrix.right.x + pos.x; + z1 = (1.4f * color.color32) * TheCamera.m_matrix.m_matrix.right.x + pos.z; + y1 = (1.4f * color.color32) * TheCamera.m_matrix.m_matrix.right.x + pos.y; + x1 = (1.4f * color.color32) * TheCamera.m_matrix.m_matrix.right.x + pos.x; + CTheScripts::ScriptDebugLine3D(x1, y1, z1, x2, y2, z2, color.color32, color.color32); + + z2 = pos.z - (0.5f * color.color32) * TheCamera.m_matrix.m_matrix.right.x; + y2 = pos.y - (0.5f * color.color32) * TheCamera.m_matrix.m_matrix.right.x; + x2 = pos.x - (0.5f * color.color32) * TheCamera.m_matrix.m_matrix.right.x; + z1 = pos.z - (1.4f * color.color32) * TheCamera.m_matrix.m_matrix.right.x; + y1 = pos.y - (1.4f * color.color32) * TheCamera.m_matrix.m_matrix.right.x; + x1 = pos.x - (1.4f * color.color32) * TheCamera.m_matrix.m_matrix.right.x; + CTheScripts::ScriptDebugLine3D(x1, y1, z1, x2, y2, z2, color.color32, color.color32); +} + void CRadar::DrawRotatingRadarSprite(CSprite2d* sprite, float x, float y, float angle, int alpha) { CVector curPosn[4]; diff --git a/src/Radar.h b/src/Radar.h index 57d21577..b71618f1 100644 --- a/src/Radar.h +++ b/src/Radar.h @@ -66,6 +66,9 @@ static_assert(sizeof(CBlip) == 0x30, "CBlip: error"); class CRadar { + static float cachedSin; + static float cachedCos; + public: static float &m_RadarRange; static CVector2D &vec2DRadarOrigin; @@ -98,15 +101,14 @@ public: static void DrawMap(); static void TransformRadarPointToScreenSpace(CVector2D * out, CVector2D * in); static void DrawBlips(); - static bool DisplayThisBlip(int16 spriteid, int counter); + static bool DisplayThisBlip(int16 spriteid); static int CalculateBlipAlpha(float dist); static CRGBA GetRadarTraceColour(uint32 color, bool bright); - static int GetRadarTraceColour2(uint32 color, bool bright); static void DrawRadarMap(); static void DrawRotatingRadarSprite(CSprite2d* sprite, float x, float y, float angle, int alpha); static void TransformRealWorldPointToRadarSpace(CVector2D *out, CVector2D *in); static float LimitRadarPoint(CVector2D *point); static void DrawRadarSprite(int sprite, float x, float y, int alpha); - static void ShowRadarMarker(CVector pos, uint32 color, float radius); + static void ShowRadarMarker(CVector pos, CRGBA color, float radius); static void ShowRadarTrace(float x, float y, uint32 size, uint32 red, uint32 green, uint32 blue, uint32 alpha); }; diff --git a/src/control/Script.cpp b/src/control/Script.cpp index 68212e2c..153e98b5 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -11,3 +11,4 @@ bool CTheScripts::DbgFlag = *(bool*)0x95CD87; uint32 CTheScripts::OnAMissionFlag = *(uint32*)0x8F1B64; WRAPPER bool CTheScripts::IsPlayerOnAMission() { EAXJMP(0x439410); } +WRAPPER void CTheScripts::ScriptDebugLine3D(float x1, float y1, float z1, float x2, float y2, float z2, int col, int col2) { EAXJMP(0x4534E0); } diff --git a/src/control/Script.h b/src/control/Script.h index cf428855..1eb02c1b 100644 --- a/src/control/Script.h +++ b/src/control/Script.h @@ -44,4 +44,5 @@ public: public: static bool IsPlayerOnAMission(); + static void ScriptDebugLine3D(float x1, float y1, float z1, float x2, float y2, float z2, int col, int col2); };