/////////////////////////////////////////////////////////////////////////////// // // FILE: Checkpoints.cpp // BY : Mark Nicholson (Adapted from original by Obbe) // FOR : Rockstar North // ON : 01 Aug 2008 // WHAT: // /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // INCLUDES /////////////////////////////////////////////////////////////////////////////// #include "Checkpoints.h" // Rage headers #include "bank/bank.h" // Framework headers #include "grcore/debugdraw.h" #include "fwmaths/angle.h" #include "vfx/channel.h" #include "vfx/vfxwidget.h" // Game header #include "Camera/CamInterface.h" #include "Core/Game.h" #include "FrontEnd/MobilePhone.h" #include "Physics/WorldProbe/WorldProbe.h" #include "Renderer/PostProcessFXHelper.h" #include "Scene/World/GameWorld.h" #include "Vfx/VfxHelper.h" #include "Vfx/Misc/Markers.h" #include "Vfx/Decals/DecalManager.h" /////////////////////////////////////////////////////////////////////////////// // OPTIMISATIONS - TURN ON IN OPTIMISATIONS.H /////////////////////////////////////////////////////////////////////////////// VFX_MISC_OPTIMISATIONS() /////////////////////////////////////////////////////////////////////////////// // DEFINES /////////////////////////////////////////////////////////////////////////////// bank_float CHECKPOINT_INSIDE_RING_SCALE_CHEVRON = 0.5f; bank_float CHECKPOINT_INSIDE_RING_SCALE_LAP = 0.5f; bank_float CHECKPOINT_INSIDE_RING_SCALE_FLAG = 1.0f; bank_float CHECKPOINT_INSIDE_RING_SCALE_PLANE = 0.6f; bank_float CHECKPOINT_INSIDE_RING_SCALE_MONEY = 0.8f; bank_float CHECKPOINT_INSIDE_RING_SCALE_BEAST = 0.9f; bank_float CHECKPOINT_INSIDE_RING_SCALE_TRANSFORM = 0.6f; bank_float CHECKPOINT_INSIDE_RING_SCALE_WARP = 0.6f; bank_float CHECKPOINT_INSIDE_CYLINDER_SCALE_CHEVRON = 0.6f; bank_float CHECKPOINT_INSIDE_CYLINDER_SCALE_LAP = 0.6f; bank_float CHECKPOINT_INSIDE_CYLINDER_SCALE_FLAG = 0.6f; bank_float CHECKPOINT_INSIDE_CYLINDER_SCALE_PIT_LANE = 0.6f; bank_float CHECKPOINT_INSIDE_CYLINDER_SCALE_NUMBER = 0.35f; bank_float CHECKPOINT_CHEVRON_IN_CYLINDER_HEIGHT = 0.5f; bank_float CHECKPOINT_LAP_IN_CYLINDER_HEIGHT = 0.5f; bank_float CHECKPOINT_FLAG_IN_CYLINDER_HEIGHT = 0.5f; bank_float CHECKPOINT_PIT_LANE_IN_CYLINDER_HEIGHT = 0.5f; bank_float CHECKPOINT_NUMBER_IN_CYLINDER_HEIGHT = 0.5f; bank_float CHECKPOINT_NUMBER_SIDE_OFFSET = 0.35f; bank_float CHECKPOINT_CYLINDER_Z_MIN = 6.0f; bank_float CHECKPOINT_CYLINDER_Z_MAX = 30.0f; bank_float CHECKPOINT_CYLINDER_Z_DIST = 30.0f; bank_float CHECKPOINT_CYLINDER_XY_SCALE_RACES = 1.0f; bank_float CHECKPOINT_CYLINDER_ALPHA_MULT = 0.5f; bank_float CHECKPOINT_CYLINDER_ALPHA_MULT_GROUND_RACES = 0.65f; bank_bool CHECKPOINT_USE_ALTERNATE_CHEVRON_POINTING = true; bank_float CHECKPOINT_ALTERNATE_CHEVRON_CAM_TILT = 0.5f; #if __DEV || __BANK bank_u32 CHECKPOINT_DEFAULT_COL_R = 255; bank_u32 CHECKPOINT_DEFAULT_COL_G = 100; bank_u32 CHECKPOINT_DEFAULT_COL_B = 0; bank_u32 CHECKPOINT_DEFAULT_COL_A = 50; bank_u32 CHECKPOINT_DEFAULT_COL_R2 = 255; bank_u32 CHECKPOINT_DEFAULT_COL_G2 = 100; bank_u32 CHECKPOINT_DEFAULT_COL_B2 = 0; bank_u32 CHECKPOINT_DEFAULT_COL_A2 = 50; #endif /////////////////////////////////////////////////////////////////////////////// // GLOBAL VARIABLES /////////////////////////////////////////////////////////////////////////////// CCheckpoints g_checkpoints; #if __BANK const char* g_typeNames[CHECKPOINTTYPE_MAX] = { // ground races - positioned at base of cylinder "GROUND RACE CHEVRON 1 (BASE)", "GROUND RACE CHEVRON 2 (BASE)", "GROUND RACE CHEVRON 3 (BASE)", "GROUND RACE LAP (BASE)", "GROUND RACE FLAG (BASE)", "GROUND RACE PIT LANE (BASE)", // ground races - positioned at centre of chevron/flag etc "GROUND RACE CHEVRON 1", "GROUND RACE CHEVRON 2", "GROUND RACE CHEVRON 3", "GROUND RACE LAP", "GROUND RACE FLAG", "GROUND RACE PIT LANE", // air races "AIR RACE CHEVRON 1", "AIR RACE CHEVRON 2", "AIR RACE CHEVRON 3", "AIR RACE LAP", "AIR RACE FLAG", // water races "WATER RACE CHEVRON 1", "WATER RACE CHEVRON 2", "WATER RACE CHEVRON 3", "WATER RACE LAP", "WATER RACE FLAG", // triathlon running races "TRIATHLON RUNNING CHEVRON 1", "TRIATHLON RUNNING CHEVRON 2", "TRIATHLON RUNNING CHEVRON 3", "TRIATHLON RUNNING LAP", "TRIATHLON RUNNING FLAG", // triathlon swimming races "TRIATHLON SWIMMING CHEVRON 1", "TRIATHLON SWIMMING CHEVRON 2", "TRIATHLON SWIMMING CHEVRON 3", "TRIATHLON SWIMMING LAP", "TRIATHLON SWIMMING FLAG", // triathlon cycling races "TRIATHLON CYCLING CHEVRON 1", "TRIATHLON CYCLING CHEVRON 2", "TRIATHLON CYCLING CHEVRON 3", "TRIATHLON CYCLING LAP", "TRIATHLON CYCLING FLAG", // plane school "PLANE FLAT", "PLANE SIDE L", "PLANE SIDE R", "PLANE INVERTED", // heli "HELI LANDING", // parachute "PARACHUTE RING", "PARACHUTE LANDING", // gang locators "LOST GANG LOCATE", "VAGOS GANG LOCATE", "COPS GANG LOCATE", // race locators "GROUND RACE LOCATE", "AIR RACE LOCATE", "WATER RACE LOCATE", // mp locators "MP LOCATE 1", "MP LOCATE 2", "MP LOCATE 3", "MP CREATOR TRIGGER", // freemode "MONEY", // misc "BEAST", // transforms "TRANSFORM", "TRANSFORM_PLANE", "TRANSFORM_HELICOPTER", "TRANSFORM_BOAT", "TRANSFORM_CAR", "TRANSFORM_BIKE", "TRANSFORM_PUSH_BIKE", "TRANSFORM_TRUCK", "TRANSFORM_PARACHUTE", "TRANSFORM_THRUSTER", "WARP" }; #endif /////////////////////////////////////////////////////////////////////////////// // CODE /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // CLASS CCheckpoints /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // Init /////////////////////////////////////////////////////////////////////////////// void CCheckpoints::Init (unsigned initMode) { if(initMode == INIT_CORE) { #if __BANK m_pointAtPlayer = false; m_disableRender = false; m_debugRender = false; m_debugRenderId = -1; m_numActiveCheckpoints = 0; m_debugCheckpointType = CHECKPOINTTYPE_RACE_GROUND_CHEVRON_1_BASE; m_debugCheckpointScale = 1.0f; m_debugCheckpointInsideCylinderHeightScale = 1.0f; m_debugCheckpointInsideCylinderScale = 1.0f; m_debugCheckpointCylinderHeightMin = CHECKPOINT_CYLINDER_Z_MIN; m_debugCheckpointCylinderHeightMax = CHECKPOINT_CYLINDER_Z_MAX; m_debugCheckpointCylinderHeightDist = CHECKPOINT_CYLINDER_Z_DIST; m_debugCheckpointColR = (u8)CHECKPOINT_DEFAULT_COL_R; m_debugCheckpointColG = (u8)CHECKPOINT_DEFAULT_COL_G; m_debugCheckpointColB = (u8)CHECKPOINT_DEFAULT_COL_B; m_debugCheckpointColA = (u8)CHECKPOINT_DEFAULT_COL_A; m_debugCheckpointColR2 = (u8)CHECKPOINT_DEFAULT_COL_R2; m_debugCheckpointColG2 = (u8)CHECKPOINT_DEFAULT_COL_G2; m_debugCheckpointColB2 = (u8)CHECKPOINT_DEFAULT_COL_B2; m_debugCheckpointColA2 = (u8)CHECKPOINT_DEFAULT_COL_A2; m_debugCheckpointPlaneNormalX = 0.0f; m_debugCheckpointPlaneNormalY = 0.0f; m_debugCheckpointPlaneNormalZ = 1.0f; m_debugCheckpointPlanePosX = 0.0f; m_debugCheckpointPlanePosY = 0.0f; m_debugCheckpointPlanePosZ = 0.0f; m_debugCheckpointNum = 0; #endif } else if(initMode == INIT_AFTER_MAP_LOADED) { for (s32 i = 0; i < CHECKPOINTS_MAX; i++) { Delete(i); } #if __BANK m_numActiveCheckpoints = 0; #endif } } /////////////////////////////////////////////////////////////////////////////// // Shutdown /////////////////////////////////////////////////////////////////////////////// void CCheckpoints::Shutdown (unsigned UNUSED_PARAM(shutdownMode)) { } /////////////////////////////////////////////////////////////////////////////// // Update /////////////////////////////////////////////////////////////////////////////// void CCheckpoints::Update () { #if __BANK if (m_disableRender) { return; } #endif bool isTakingPhoto = CPhoneMgr::CamGetState(); if (isTakingPhoto) { return; } // go through the checkpoints and register them as markers for (s32 i=0; iisActive) { #if __BANK if (m_pointAtPlayer) { Vec3V vPlayerCoords = VECTOR3_TO_VEC3V(CGameWorld::FindLocalPlayerCoors()); pCurrCheckpoint->vLookAtPos = vPlayerCoords; } #endif // CHEVRON 1 if (pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_CHEVRON_1_BASE || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_CHEVRON_1 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_AIR_CHEVRON_1 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_WATER_CHEVRON_1 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_RUN_CHEVRON_1 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_SWIM_CHEVRON_1 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_CYCLE_CHEVRON_1) { float insideScale = 1.0f; if (pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_CHEVRON_1_BASE || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_CHEVRON_1 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_RUN_CHEVRON_1 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_SWIM_CHEVRON_1 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_CYCLE_CHEVRON_1) { insideScale = CHECKPOINT_INSIDE_CYLINDER_SCALE_CHEVRON * pCurrCheckpoint->insideCylinderScale; } else if (pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_AIR_CHEVRON_1) { insideScale = CHECKPOINT_INSIDE_RING_SCALE_CHEVRON; } // set up and register the marker MarkerInfo_t markerInfo; markerInfo.type = MARKERTYPE_CHEVRON_1; markerInfo.vPos = pCurrCheckpoint->vPos; markerInfo.vDir = pCurrCheckpoint->vLookAtPos - pCurrCheckpoint->vPos; markerInfo.vRot = Vec4V(HALF_PI, HALF_PI, 0.0f, 0.0f); markerInfo.vScale = Vec3V(pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale); markerInfo.col = pCurrCheckpoint->col2; markerInfo.clip = IsZeroAll(pCurrCheckpoint->vClippingPlane)==false; markerInfo.vClippingPlane = pCurrCheckpoint->vClippingPlane; if (CHECKPOINT_USE_ALTERNATE_CHEVRON_POINTING && pCurrCheckpoint->forceOldArrowPointing==false) { markerInfo.vDir.SetZf(0.0f); markerInfo.vRot = Vec4V(HALF_PI, 0.0f, 0.0f, CHECKPOINT_ALTERNATE_CHEVRON_CAM_TILT); } // adjust the position of the 'base' chevron so the input position defines the base of the chevron if (pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_CHEVRON_1_BASE || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_RUN_CHEVRON_1 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_SWIM_CHEVRON_1 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_CYCLE_CHEVRON_1) { float zOffset = (-g_markers.GetBBMinZ(MARKERTYPE_CHEVRON_1) + CHECKPOINT_CHEVRON_IN_CYLINDER_HEIGHT) * pCurrCheckpoint->scale * pCurrCheckpoint->insideCylinderHeightScale; markerInfo.vPos.SetZf(pCurrCheckpoint->vPos.GetZf() + zOffset); } g_markers.Register(markerInfo); } // CHEVRON_2 else if (pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_CHEVRON_2_BASE || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_CHEVRON_2 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_AIR_CHEVRON_2 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_WATER_CHEVRON_2 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_RUN_CHEVRON_2 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_SWIM_CHEVRON_2 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_CYCLE_CHEVRON_2) { float insideScale = 1.0f; if (pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_CHEVRON_2_BASE || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_CHEVRON_2 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_RUN_CHEVRON_2 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_SWIM_CHEVRON_2 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_CYCLE_CHEVRON_2) { insideScale = CHECKPOINT_INSIDE_CYLINDER_SCALE_CHEVRON * pCurrCheckpoint->insideCylinderScale; } else if (pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_AIR_CHEVRON_2) { insideScale = CHECKPOINT_INSIDE_RING_SCALE_CHEVRON; } // set up and register the marker MarkerInfo_t markerInfo; markerInfo.type = MARKERTYPE_CHEVRON_2; markerInfo.vPos = pCurrCheckpoint->vPos; markerInfo.vDir = pCurrCheckpoint->vLookAtPos - pCurrCheckpoint->vPos; markerInfo.vRot = Vec4V(HALF_PI, HALF_PI, 0.0f, 0.0f); markerInfo.vScale = Vec3V(pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale); markerInfo.col = pCurrCheckpoint->col2; markerInfo.clip = IsZeroAll(pCurrCheckpoint->vClippingPlane)==false; markerInfo.vClippingPlane = pCurrCheckpoint->vClippingPlane; if (CHECKPOINT_USE_ALTERNATE_CHEVRON_POINTING && pCurrCheckpoint->forceOldArrowPointing==false) { markerInfo.vDir.SetZf(0.0f); markerInfo.vRot = Vec4V(HALF_PI, 0.0f, 0.0f, CHECKPOINT_ALTERNATE_CHEVRON_CAM_TILT); } // adjust the position of the 'base' chevron so the input position defines the base of the chevron if (pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_CHEVRON_2_BASE || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_RUN_CHEVRON_2 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_SWIM_CHEVRON_2 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_CYCLE_CHEVRON_2) { float zOffset = (-g_markers.GetBBMinZ(MARKERTYPE_CHEVRON_2) + CHECKPOINT_CHEVRON_IN_CYLINDER_HEIGHT) * pCurrCheckpoint->scale * pCurrCheckpoint->insideCylinderHeightScale; markerInfo.vPos.SetZf(pCurrCheckpoint->vPos.GetZf() + zOffset); } g_markers.Register(markerInfo); } // CHEVRON_3 else if (pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_CHEVRON_3_BASE || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_CHEVRON_3 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_AIR_CHEVRON_3 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_WATER_CHEVRON_3 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_RUN_CHEVRON_3 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_SWIM_CHEVRON_3 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_CYCLE_CHEVRON_3) { float insideScale = 1.0f; if (pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_CHEVRON_3_BASE || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_CHEVRON_3 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_RUN_CHEVRON_3 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_SWIM_CHEVRON_3 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_CYCLE_CHEVRON_3) { insideScale = CHECKPOINT_INSIDE_CYLINDER_SCALE_CHEVRON * pCurrCheckpoint->insideCylinderScale; } else if (pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_AIR_CHEVRON_3) { insideScale = CHECKPOINT_INSIDE_RING_SCALE_CHEVRON; } // set up and register the marker MarkerInfo_t markerInfo; markerInfo.type = MARKERTYPE_CHEVRON_3; markerInfo.vPos = pCurrCheckpoint->vPos; markerInfo.vDir = pCurrCheckpoint->vLookAtPos - pCurrCheckpoint->vPos; markerInfo.vRot = Vec4V(HALF_PI, HALF_PI, 0.0f, 0.0f); markerInfo.vScale = Vec3V(pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale); markerInfo.col = pCurrCheckpoint->col2; markerInfo.clip = IsZeroAll(pCurrCheckpoint->vClippingPlane)==false; markerInfo.vClippingPlane = pCurrCheckpoint->vClippingPlane; if (CHECKPOINT_USE_ALTERNATE_CHEVRON_POINTING && pCurrCheckpoint->forceOldArrowPointing==false) { markerInfo.vDir.SetZf(0.0f); markerInfo.vRot = Vec4V(HALF_PI, 0.0f, 0.0f, CHECKPOINT_ALTERNATE_CHEVRON_CAM_TILT); } // adjust the position of the 'base' chevron so the input position defines the base of the chevron if (pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_CHEVRON_3_BASE || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_RUN_CHEVRON_3 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_SWIM_CHEVRON_3 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_CYCLE_CHEVRON_3) { float zOffset = (-g_markers.GetBBMinZ(MARKERTYPE_CHEVRON_3) + CHECKPOINT_CHEVRON_IN_CYLINDER_HEIGHT) * pCurrCheckpoint->scale * pCurrCheckpoint->insideCylinderHeightScale; markerInfo.vPos.SetZf(pCurrCheckpoint->vPos.GetZf() + zOffset); } g_markers.Register(markerInfo); } // LAP else if (pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_LAP_BASE || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_LAP || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_AIR_LAP || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_WATER_LAP || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_RUN_LAP || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_SWIM_LAP || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_CYCLE_LAP) { float insideScale = 1.0f; if (pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_LAP_BASE || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_LAP || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_RUN_LAP || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_SWIM_LAP || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_CYCLE_LAP) { insideScale = CHECKPOINT_INSIDE_CYLINDER_SCALE_LAP * pCurrCheckpoint->insideCylinderScale; } else if (pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_AIR_LAP) { insideScale = CHECKPOINT_INSIDE_RING_SCALE_LAP; } // set up and register the marker MarkerInfo_t markerInfo; markerInfo.type = MARKERTYPE_LAP; markerInfo.vPos = pCurrCheckpoint->vPos; markerInfo.vDir = Vec3V(V_ZERO); markerInfo.vRot = Vec4V(V_ZERO); markerInfo.vScale = Vec3V(pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale); markerInfo.col = pCurrCheckpoint->col2; markerInfo.faceCam = true; markerInfo.clip = IsZeroAll(pCurrCheckpoint->vClippingPlane)==false; markerInfo.vClippingPlane = pCurrCheckpoint->vClippingPlane; // adjust the position of the 'base' lap so the input position defines the base of the lap if (pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_LAP_BASE || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_RUN_LAP || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_SWIM_LAP || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_CYCLE_LAP) { float zOffset = (-g_markers.GetBBMinZ(MARKERTYPE_LAP) + CHECKPOINT_LAP_IN_CYLINDER_HEIGHT) * pCurrCheckpoint->scale * pCurrCheckpoint->insideCylinderHeightScale; markerInfo.vPos.SetZf(pCurrCheckpoint->vPos.GetZf() + zOffset); } g_markers.Register(markerInfo); } // FLAG else if (pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_FLAG_BASE || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_FLAG || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_AIR_FLAG || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_WATER_FLAG || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_RUN_FLAG || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_SWIM_FLAG || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_CYCLE_FLAG) { MarkerType_e markerType = MARKERTYPE_FLAG; float insideScale = 1.0f; if (pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_FLAG_BASE || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_FLAG || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_RUN_FLAG || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_SWIM_FLAG || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_CYCLE_FLAG) { markerType = MARKERTYPE_FLAG; insideScale = CHECKPOINT_INSIDE_CYLINDER_SCALE_FLAG * pCurrCheckpoint->insideCylinderScale; } else if (pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_AIR_FLAG) { markerType = MARKERTYPE_RING_FLAG; insideScale = CHECKPOINT_INSIDE_RING_SCALE_FLAG; } // set up and register the marker MarkerInfo_t markerInfo; markerInfo.type = markerType; markerInfo.vPos = pCurrCheckpoint->vPos; markerInfo.vScale = Vec3V(pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale); markerInfo.col = pCurrCheckpoint->col2; markerInfo.faceCam = true; markerInfo.clip = IsZeroAll(pCurrCheckpoint->vClippingPlane)==false; markerInfo.vClippingPlane = pCurrCheckpoint->vClippingPlane; // adjust the position of the 'base' flag so the input position defines the base of the flag if (pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_FLAG_BASE || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_RUN_FLAG || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_SWIM_FLAG || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_CYCLE_FLAG) { float zOffset = (-g_markers.GetBBMinZ(MARKERTYPE_FLAG) + CHECKPOINT_FLAG_IN_CYLINDER_HEIGHT) * pCurrCheckpoint->scale * pCurrCheckpoint->insideCylinderHeightScale; markerInfo.vPos.SetZf(pCurrCheckpoint->vPos.GetZf() + zOffset); } g_markers.Register(markerInfo); } // PIT LANE else if (pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_PIT_LANE || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_PIT_LANE_BASE) { MarkerType_e markerType = MARKERTYPE_PIT_LANE; float insideScale = CHECKPOINT_INSIDE_CYLINDER_SCALE_PIT_LANE * pCurrCheckpoint->insideCylinderScale; // set up and register the marker MarkerInfo_t markerInfo; markerInfo.type = markerType; markerInfo.vPos = pCurrCheckpoint->vPos; markerInfo.vScale = Vec3V(pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale); markerInfo.col = pCurrCheckpoint->col2; markerInfo.faceCam = true; markerInfo.clip = IsZeroAll(pCurrCheckpoint->vClippingPlane)==false; markerInfo.vClippingPlane = pCurrCheckpoint->vClippingPlane; if (pCurrCheckpoint->type == CHECKPOINTTYPE_RACE_GROUND_PIT_LANE_BASE) { float zOffset = (-g_markers.GetBBMinZ(MARKERTYPE_FLAG) + CHECKPOINT_PIT_LANE_IN_CYLINDER_HEIGHT) * pCurrCheckpoint->scale * pCurrCheckpoint->insideCylinderHeightScale; markerInfo.vPos.SetZf(pCurrCheckpoint->vPos.GetZf() + zOffset); } g_markers.Register(markerInfo); } // PLANE else if (pCurrCheckpoint->type==CHECKPOINTTYPE_PLANE_FLAT || pCurrCheckpoint->type==CHECKPOINTTYPE_PLANE_SIDE_L || pCurrCheckpoint->type==CHECKPOINTTYPE_PLANE_SIDE_R || pCurrCheckpoint->type==CHECKPOINTTYPE_PLANE_INVERTED) { float insideScale = CHECKPOINT_INSIDE_RING_SCALE_PLANE; // calc y rotation float yRot = 0.0f; if (pCurrCheckpoint->type==CHECKPOINTTYPE_PLANE_SIDE_L) { yRot = -HALF_PI; } else if (pCurrCheckpoint->type==CHECKPOINTTYPE_PLANE_SIDE_R) { yRot = HALF_PI; } else if (pCurrCheckpoint->type==CHECKPOINTTYPE_PLANE_INVERTED) { yRot = PI; } // set up and register the marker MarkerInfo_t markerInfo; markerInfo.type = MARKERTYPE_PLANE; markerInfo.vPos = pCurrCheckpoint->vPos; markerInfo.vRot = Vec4V(0.0f, yRot, PI, 0.0f); markerInfo.vScale = Vec3V(pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale); markerInfo.col = pCurrCheckpoint->col2; markerInfo.faceCam = true; markerInfo.clip = IsZeroAll(pCurrCheckpoint->vClippingPlane)==false; markerInfo.vClippingPlane = pCurrCheckpoint->vClippingPlane; if (pCurrCheckpoint->forceDirection) { markerInfo.faceCam = false; markerInfo.vDir = pCurrCheckpoint->vLookAtPos - pCurrCheckpoint->vPos; } g_markers.Register(markerInfo); } // NUMBERS else if (pCurrCheckpoint->type==CHECKPOINTTYPE_GANG_LOCATE_LOST || pCurrCheckpoint->type==CHECKPOINTTYPE_GANG_LOCATE_VAGOS || pCurrCheckpoint->type==CHECKPOINTTYPE_GANG_LOCATE_COPS) { float insideScale = CHECKPOINT_INSIDE_CYLINDER_SCALE_NUMBER * CHECKPOINT_INSIDE_CYLINDER_SCALE_NUMBER; float zOffset = CHECKPOINT_NUMBER_IN_CYLINDER_HEIGHT * pCurrCheckpoint->scale * pCurrCheckpoint->insideCylinderHeightScale; if (pCurrCheckpoint->num<10) { // set up and register the marker MarkerInfo_t markerInfo; markerInfo.type = (MarkerType_e)(MARKERTYPE_NUM_0+pCurrCheckpoint->num); markerInfo.vPos = pCurrCheckpoint->vPos; markerInfo.vPos.SetZf(pCurrCheckpoint->vPos.GetZf() + zOffset); markerInfo.vScale = Vec3V(pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale); markerInfo.col = pCurrCheckpoint->col2; markerInfo.faceCam = true; markerInfo.clip = IsZeroAll(pCurrCheckpoint->vClippingPlane)==false; markerInfo.vClippingPlane = pCurrCheckpoint->vClippingPlane; g_markers.Register(markerInfo); } else { Vec3V_ConstRef vCamPos = RCC_VEC3V(camInterface::GetPos()); Vec3V vCheckToCamVec = vCamPos-pCurrCheckpoint->vPos; vCheckToCamVec.SetZ(ScalarV(V_ZERO)); vCheckToCamVec = Normalize(vCheckToCamVec); Vec3V vCamSide = Vec3V(-vCheckToCamVec.GetY(), vCheckToCamVec.GetX(), ScalarV(V_ZERO)); Vec3V vSideOffset = vCamSide*ScalarVFromF32(pCurrCheckpoint->scale*insideScale*CHECKPOINT_NUMBER_SIDE_OFFSET); int numTens = pCurrCheckpoint->num/10; int numUnits = pCurrCheckpoint->num-(numTens*10); // set up and register the markers MarkerInfo_t markerInfo; markerInfo.type = (MarkerType_e)(MARKERTYPE_NUM_0+numTens); markerInfo.vPos = pCurrCheckpoint->vPos - vSideOffset; markerInfo.vPos.SetZf(pCurrCheckpoint->vPos.GetZf() + zOffset); markerInfo.vDir = vCheckToCamVec; markerInfo.vScale = Vec3V(pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale); markerInfo.col = pCurrCheckpoint->col2; markerInfo.clip = IsZeroAll(pCurrCheckpoint->vClippingPlane)==false; markerInfo.vClippingPlane = pCurrCheckpoint->vClippingPlane; MarkerInfo_t markerInfo2; markerInfo2.type = (MarkerType_e)(MARKERTYPE_NUM_0+numUnits); markerInfo2.vPos = pCurrCheckpoint->vPos + vSideOffset; markerInfo2.vPos.SetZf(pCurrCheckpoint->vPos.GetZf() + zOffset); markerInfo2.vDir = vCheckToCamVec; markerInfo2.vScale = Vec3V(pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale); markerInfo2.col = pCurrCheckpoint->col2; markerInfo.clip = IsZeroAll(pCurrCheckpoint->vClippingPlane)==false; markerInfo2.vClippingPlane = pCurrCheckpoint->vClippingPlane; g_markers.Register(markerInfo); g_markers.Register(markerInfo2); } } // MONEY else if (pCurrCheckpoint->type==CHECKPOINTTYPE_MONEY) { MarkerType_e markerType = MARKERTYPE_MONEY; float insideScale = CHECKPOINT_INSIDE_RING_SCALE_MONEY; // set up and register the marker MarkerInfo_t markerInfo; markerInfo.type = markerType; markerInfo.vPos = pCurrCheckpoint->vPos; markerInfo.vScale = Vec3V(pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale); markerInfo.col = pCurrCheckpoint->col2; markerInfo.faceCam = true; markerInfo.clip = IsZeroAll(pCurrCheckpoint->vClippingPlane)==false; markerInfo.vClippingPlane = pCurrCheckpoint->vClippingPlane; g_markers.Register(markerInfo); } // BEAST else if (pCurrCheckpoint->type==CHECKPOINTTYPE_BEAST) { MarkerType_e markerType = MARKERTYPE_BEAST; float insideScale = CHECKPOINT_INSIDE_RING_SCALE_BEAST; // set up and register the marker MarkerInfo_t markerInfo; markerInfo.type = markerType; markerInfo.vPos = pCurrCheckpoint->vPos; markerInfo.vScale = Vec3V(pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale); markerInfo.col = pCurrCheckpoint->col2; markerInfo.faceCam = true; markerInfo.clip = IsZeroAll(pCurrCheckpoint->vClippingPlane)==false; markerInfo.vClippingPlane = pCurrCheckpoint->vClippingPlane; g_markers.Register(markerInfo); } // TRANSFORM else if (pCurrCheckpoint->type==CHECKPOINTTYPE_TRANSFORM) { MarkerType_e markerType = MARKERTYPE_QUESTION_MARK; float insideScale = CHECKPOINT_INSIDE_RING_SCALE_TRANSFORM; // set up and register the marker MarkerInfo_t markerInfo; markerInfo.type = markerType; markerInfo.vPos = pCurrCheckpoint->vPos; markerInfo.vScale = Vec3V(pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale); markerInfo.col = pCurrCheckpoint->col2; markerInfo.faceCam = true; markerInfo.clip = IsZeroAll(pCurrCheckpoint->vClippingPlane)==false; markerInfo.vClippingPlane = pCurrCheckpoint->vClippingPlane; if (pCurrCheckpoint->forceDirection) { markerInfo.faceCam = false; markerInfo.vDir = pCurrCheckpoint->vLookAtPos - pCurrCheckpoint->vPos; } g_markers.Register(markerInfo); } // TRANSFORM_PLANE else if (pCurrCheckpoint->type==CHECKPOINTTYPE_TRANSFORM_PLANE) { MarkerType_e markerType = MARKERTYPE_TRANSFORM_PLANE; float insideScale = CHECKPOINT_INSIDE_RING_SCALE_TRANSFORM; // set up and register the marker MarkerInfo_t markerInfo; markerInfo.type = markerType; markerInfo.vPos = pCurrCheckpoint->vPos; markerInfo.vScale = Vec3V(pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale); markerInfo.col = pCurrCheckpoint->col2; markerInfo.faceCam = true; markerInfo.clip = IsZeroAll(pCurrCheckpoint->vClippingPlane)==false; markerInfo.vClippingPlane = pCurrCheckpoint->vClippingPlane; if (pCurrCheckpoint->forceDirection) { markerInfo.faceCam = false; markerInfo.vDir = pCurrCheckpoint->vLookAtPos - pCurrCheckpoint->vPos; } g_markers.Register(markerInfo); } // TRANSFORM_HELICOPTER else if (pCurrCheckpoint->type==CHECKPOINTTYPE_TRANSFORM_HELICOPTER) { MarkerType_e markerType = MARKERTYPE_TRANSFORM_HELICOPTER; float insideScale = CHECKPOINT_INSIDE_RING_SCALE_TRANSFORM; // set up and register the marker MarkerInfo_t markerInfo; markerInfo.type = markerType; markerInfo.vPos = pCurrCheckpoint->vPos; markerInfo.vScale = Vec3V(pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale); markerInfo.col = pCurrCheckpoint->col2; markerInfo.faceCam = true; markerInfo.clip = IsZeroAll(pCurrCheckpoint->vClippingPlane)==false; markerInfo.vClippingPlane = pCurrCheckpoint->vClippingPlane; if (pCurrCheckpoint->forceDirection) { markerInfo.faceCam = false; markerInfo.vDir = pCurrCheckpoint->vLookAtPos - pCurrCheckpoint->vPos; } g_markers.Register(markerInfo); } // TRANSFORM_BOAT else if (pCurrCheckpoint->type==CHECKPOINTTYPE_TRANSFORM_BOAT) { MarkerType_e markerType = MARKERTYPE_TRANSFORM_BOAT; float insideScale = CHECKPOINT_INSIDE_RING_SCALE_TRANSFORM; // set up and register the marker MarkerInfo_t markerInfo; markerInfo.type = markerType; markerInfo.vPos = pCurrCheckpoint->vPos; markerInfo.vScale = Vec3V(pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale); markerInfo.col = pCurrCheckpoint->col2; markerInfo.faceCam = true; markerInfo.clip = IsZeroAll(pCurrCheckpoint->vClippingPlane)==false; markerInfo.vClippingPlane = pCurrCheckpoint->vClippingPlane; if (pCurrCheckpoint->forceDirection) { markerInfo.faceCam = false; markerInfo.vDir = pCurrCheckpoint->vLookAtPos - pCurrCheckpoint->vPos; } g_markers.Register(markerInfo); } // TRANSFORM_CAR else if (pCurrCheckpoint->type==CHECKPOINTTYPE_TRANSFORM_CAR) { MarkerType_e markerType = MARKERTYPE_TRANSFORM_CAR; float insideScale = CHECKPOINT_INSIDE_RING_SCALE_TRANSFORM; // set up and register the marker MarkerInfo_t markerInfo; markerInfo.type = markerType; markerInfo.vPos = pCurrCheckpoint->vPos; markerInfo.vScale = Vec3V(pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale); markerInfo.col = pCurrCheckpoint->col2; markerInfo.faceCam = true; markerInfo.clip = IsZeroAll(pCurrCheckpoint->vClippingPlane)==false; markerInfo.vClippingPlane = pCurrCheckpoint->vClippingPlane; if (pCurrCheckpoint->forceDirection) { markerInfo.faceCam = false; markerInfo.vDir = pCurrCheckpoint->vLookAtPos - pCurrCheckpoint->vPos; } g_markers.Register(markerInfo); } // TRANSFORM_BIKE else if (pCurrCheckpoint->type==CHECKPOINTTYPE_TRANSFORM_BIKE) { MarkerType_e markerType = MARKERTYPE_TRANSFORM_BIKE; float insideScale = CHECKPOINT_INSIDE_RING_SCALE_TRANSFORM; // set up and register the marker MarkerInfo_t markerInfo; markerInfo.type = markerType; markerInfo.vPos = pCurrCheckpoint->vPos; markerInfo.vScale = Vec3V(pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale); markerInfo.col = pCurrCheckpoint->col2; markerInfo.faceCam = true; markerInfo.clip = IsZeroAll(pCurrCheckpoint->vClippingPlane)==false; markerInfo.vClippingPlane = pCurrCheckpoint->vClippingPlane; if (pCurrCheckpoint->forceDirection) { markerInfo.faceCam = false; markerInfo.vDir = pCurrCheckpoint->vLookAtPos - pCurrCheckpoint->vPos; } g_markers.Register(markerInfo); } // TRANSFORM_PUSH_BIKE else if (pCurrCheckpoint->type==CHECKPOINTTYPE_TRANSFORM_PUSH_BIKE) { MarkerType_e markerType = MARKERTYPE_TRANSFORM_PUSH_BIKE; float insideScale = CHECKPOINT_INSIDE_RING_SCALE_TRANSFORM; // set up and register the marker MarkerInfo_t markerInfo; markerInfo.type = markerType; markerInfo.vPos = pCurrCheckpoint->vPos; markerInfo.vScale = Vec3V(pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale); markerInfo.col = pCurrCheckpoint->col2; markerInfo.faceCam = true; markerInfo.clip = IsZeroAll(pCurrCheckpoint->vClippingPlane)==false; markerInfo.vClippingPlane = pCurrCheckpoint->vClippingPlane; if (pCurrCheckpoint->forceDirection) { markerInfo.faceCam = false; markerInfo.vDir = pCurrCheckpoint->vLookAtPos - pCurrCheckpoint->vPos; } g_markers.Register(markerInfo); } // TRANSFORM_TRUCK else if (pCurrCheckpoint->type==CHECKPOINTTYPE_TRANSFORM_TRUCK) { MarkerType_e markerType = MARKERTYPE_TRANSFORM_TRUCK; float insideScale = CHECKPOINT_INSIDE_RING_SCALE_TRANSFORM; // set up and register the marker MarkerInfo_t markerInfo; markerInfo.type = markerType; markerInfo.vPos = pCurrCheckpoint->vPos; markerInfo.vScale = Vec3V(pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale); markerInfo.col = pCurrCheckpoint->col2; markerInfo.faceCam = true; markerInfo.clip = IsZeroAll(pCurrCheckpoint->vClippingPlane)==false; markerInfo.vClippingPlane = pCurrCheckpoint->vClippingPlane; if (pCurrCheckpoint->forceDirection) { markerInfo.faceCam = false; markerInfo.vDir = pCurrCheckpoint->vLookAtPos - pCurrCheckpoint->vPos; } g_markers.Register(markerInfo); } // TRANSFORM_PARACHUTE else if (pCurrCheckpoint->type==CHECKPOINTTYPE_TRANSFORM_PARACHUTE) { MarkerType_e markerType = MARKERTYPE_TRANSFORM_PARACHUTE; float insideScale = CHECKPOINT_INSIDE_RING_SCALE_TRANSFORM; // set up and register the marker MarkerInfo_t markerInfo; markerInfo.type = markerType; markerInfo.vPos = pCurrCheckpoint->vPos; markerInfo.vScale = Vec3V(pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale); markerInfo.col = pCurrCheckpoint->col2; markerInfo.faceCam = true; markerInfo.clip = IsZeroAll(pCurrCheckpoint->vClippingPlane)==false; markerInfo.vClippingPlane = pCurrCheckpoint->vClippingPlane; if (pCurrCheckpoint->forceDirection) { markerInfo.faceCam = false; markerInfo.vDir = pCurrCheckpoint->vLookAtPos - pCurrCheckpoint->vPos; } g_markers.Register(markerInfo); } // CHECKPOINTTYPE_TRANSFORM_THRUSTER else if (pCurrCheckpoint->type==CHECKPOINTTYPE_TRANSFORM_THRUSTER) { MarkerType_e markerType = MARKERTYPE_TRANSFORM_THRUSTER; float insideScale = CHECKPOINT_INSIDE_RING_SCALE_TRANSFORM; // set up and register the marker MarkerInfo_t markerInfo; markerInfo.type = markerType; markerInfo.vPos = pCurrCheckpoint->vPos; markerInfo.vScale = Vec3V(pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale); markerInfo.col = pCurrCheckpoint->col2; markerInfo.faceCam = true; markerInfo.clip = IsZeroAll(pCurrCheckpoint->vClippingPlane)==false; markerInfo.vClippingPlane = pCurrCheckpoint->vClippingPlane; if (pCurrCheckpoint->forceDirection) { markerInfo.faceCam = false; markerInfo.vDir = pCurrCheckpoint->vLookAtPos - pCurrCheckpoint->vPos; } g_markers.Register(markerInfo); } // WARP else if (pCurrCheckpoint->type==CHECKPOINTTYPE_WARP) { MarkerType_e markerType = MARKERTYPE_WARP; float insideScale = CHECKPOINT_INSIDE_RING_SCALE_WARP; // set up and register the marker MarkerInfo_t markerInfo; markerInfo.type = markerType; markerInfo.vPos = pCurrCheckpoint->vPos; markerInfo.vScale = Vec3V(pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale, pCurrCheckpoint->scale*insideScale); markerInfo.col = pCurrCheckpoint->col2; markerInfo.faceCam = true; markerInfo.clip = IsZeroAll(pCurrCheckpoint->vClippingPlane)==false; markerInfo.vClippingPlane = pCurrCheckpoint->vClippingPlane; g_markers.Register(markerInfo); } // RING if (pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_AIR_CHEVRON_1 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_AIR_CHEVRON_2 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_AIR_CHEVRON_3 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_AIR_LAP || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_AIR_FLAG || pCurrCheckpoint->type==CHECKPOINTTYPE_PLANE_FLAT || pCurrCheckpoint->type==CHECKPOINTTYPE_PLANE_SIDE_L || pCurrCheckpoint->type==CHECKPOINTTYPE_PLANE_SIDE_R || pCurrCheckpoint->type==CHECKPOINTTYPE_PLANE_INVERTED || pCurrCheckpoint->type==CHECKPOINTTYPE_PARACHUTE_RING || pCurrCheckpoint->type==CHECKPOINTTYPE_MONEY || pCurrCheckpoint->type==CHECKPOINTTYPE_BEAST || pCurrCheckpoint->type==CHECKPOINTTYPE_TRANSFORM || pCurrCheckpoint->type==CHECKPOINTTYPE_TRANSFORM_PLANE || pCurrCheckpoint->type==CHECKPOINTTYPE_TRANSFORM_HELICOPTER || pCurrCheckpoint->type==CHECKPOINTTYPE_TRANSFORM_BOAT || pCurrCheckpoint->type==CHECKPOINTTYPE_TRANSFORM_CAR || pCurrCheckpoint->type==CHECKPOINTTYPE_TRANSFORM_BIKE || pCurrCheckpoint->type==CHECKPOINTTYPE_TRANSFORM_PUSH_BIKE || pCurrCheckpoint->type==CHECKPOINTTYPE_TRANSFORM_TRUCK || pCurrCheckpoint->type==CHECKPOINTTYPE_TRANSFORM_PARACHUTE || pCurrCheckpoint->type==CHECKPOINTTYPE_TRANSFORM_THRUSTER || pCurrCheckpoint->type==CHECKPOINTTYPE_WARP) { // set up and register the marker MarkerInfo_t markerInfo; markerInfo.type = MARKERTYPE_RING; markerInfo.vPos = pCurrCheckpoint->vPos; markerInfo.vScale = Vec3V(pCurrCheckpoint->scale, pCurrCheckpoint->scale, pCurrCheckpoint->scale); markerInfo.col = pCurrCheckpoint->col; markerInfo.faceCam = true; markerInfo.clip = IsZeroAll(pCurrCheckpoint->vClippingPlane)==false; markerInfo.vClippingPlane = pCurrCheckpoint->vClippingPlane; if (pCurrCheckpoint->type==CHECKPOINTTYPE_PARACHUTE_RING || pCurrCheckpoint->preventRingFacingCam) { markerInfo.faceCam = false; } if (pCurrCheckpoint->forceDirection) { markerInfo.faceCam = false; markerInfo.vDir = pCurrCheckpoint->vLookAtPos - pCurrCheckpoint->vPos; } g_markers.Register(markerInfo); } // CYLINDER else if (pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_CHEVRON_1_BASE || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_CHEVRON_2_BASE || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_CHEVRON_3_BASE || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_LAP_BASE || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_FLAG_BASE || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_PIT_LANE_BASE || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_CHEVRON_1 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_CHEVRON_2 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_CHEVRON_3 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_LAP || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_FLAG || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_PIT_LANE || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_RUN_CHEVRON_1 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_RUN_CHEVRON_2 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_RUN_CHEVRON_3 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_RUN_LAP || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_RUN_FLAG || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_SWIM_CHEVRON_1 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_SWIM_CHEVRON_2 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_SWIM_CHEVRON_3 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_SWIM_LAP || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_SWIM_FLAG || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_CYCLE_CHEVRON_1 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_CYCLE_CHEVRON_2 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_CYCLE_CHEVRON_3 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_CYCLE_LAP || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_CYCLE_FLAG || pCurrCheckpoint->type==CHECKPOINTTYPE_GANG_LOCATE_LOST || pCurrCheckpoint->type==CHECKPOINTTYPE_GANG_LOCATE_VAGOS || pCurrCheckpoint->type==CHECKPOINTTYPE_GANG_LOCATE_COPS || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_LOCATE_GROUND || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_LOCATE_AIR || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_LOCATE_WATER) { // calc the z scale depending on the distance from the camera to the checkpoint Vec3V_ConstRef vCamPos = RCC_VEC3V(camInterface::GetPos()); Vec3V vCheckToCamVec = vCamPos-pCurrCheckpoint->vPos; vCheckToCamVec.SetZ(ScalarV(V_ZERO)); float checkToCamDistSqr = MagSquared(vCheckToCamVec).Getf(); float distSqr = pCurrCheckpoint->cylinderHeightDist*pCurrCheckpoint->cylinderHeightDist; float zScale = pCurrCheckpoint->cylinderHeightMax; if (checkToCamDistSqr < distSqr) { zScale = (pCurrCheckpoint->cylinderHeightMax/distSqr) * checkToCamDistSqr; zScale = Max(zScale, pCurrCheckpoint->cylinderHeightMin); } // calc the xy scale - race checkpoints are fixed scale float xyScale = pCurrCheckpoint->scale; bool isRaceCheckpoint = pCurrCheckpoint->type <= CHECKPOINTTYPE_RACE_LAST; if (isRaceCheckpoint) { xyScale *= CHECKPOINT_CYLINDER_XY_SCALE_RACES; } // set up and register the marker MarkerInfo_t markerInfo; markerInfo.type = MARKERTYPE_CYLINDER; markerInfo.vPos = pCurrCheckpoint->vPos; markerInfo.vScale = Vec3V(xyScale, xyScale, zScale); markerInfo.col = pCurrCheckpoint->col; markerInfo.clip = IsZeroAll(pCurrCheckpoint->vClippingPlane)==false; markerInfo.vClippingPlane = pCurrCheckpoint->vClippingPlane; // different alpha for cylinders u8 alpha = 0; if (pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_CHEVRON_1_BASE || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_CHEVRON_2_BASE || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_CHEVRON_3_BASE || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_LAP_BASE || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_FLAG_BASE || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_PIT_LANE_BASE || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_CHEVRON_1 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_CHEVRON_2 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_CHEVRON_3 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_LAP || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_FLAG || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_PIT_LANE) { int alphaInt = (int)(markerInfo.col.GetAlpha()*CHECKPOINT_CYLINDER_ALPHA_MULT_GROUND_RACES); if (alphaInt>255) { alphaInt = 255; } alpha = static_cast(alphaInt); } else { alpha = static_cast(markerInfo.col.GetAlpha()*CHECKPOINT_CYLINDER_ALPHA_MULT); } markerInfo.col.SetAlpha(alpha); // offset the position z if this cylinder is placed relative to the chevron/flag inside it if (pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_CHEVRON_1 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_CHEVRON_2 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_CHEVRON_3) { float zOffset = (-g_markers.GetBBMinZ(MARKERTYPE_CHEVRON_1) + CHECKPOINT_CHEVRON_IN_CYLINDER_HEIGHT) * pCurrCheckpoint->scale * pCurrCheckpoint->insideCylinderHeightScale; markerInfo.vPos.SetZf(pCurrCheckpoint->vPos.GetZf() - zOffset); } else if (pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_LAP) { float zOffset = (-g_markers.GetBBMinZ(MARKERTYPE_LAP) + CHECKPOINT_LAP_IN_CYLINDER_HEIGHT) * pCurrCheckpoint->scale * pCurrCheckpoint->insideCylinderHeightScale; markerInfo.vPos.SetZf(pCurrCheckpoint->vPos.GetZf() - zOffset); } else if (pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_FLAG) { float zOffset = (-g_markers.GetBBMinZ(MARKERTYPE_FLAG) + CHECKPOINT_FLAG_IN_CYLINDER_HEIGHT) * pCurrCheckpoint->scale * pCurrCheckpoint->insideCylinderHeightScale; markerInfo.vPos.SetZf(pCurrCheckpoint->vPos.GetZf() - zOffset); } else if (pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_GROUND_PIT_LANE) { float zOffset = (-g_markers.GetBBMinZ(MARKERTYPE_PIT_LANE) + CHECKPOINT_PIT_LANE_IN_CYLINDER_HEIGHT) * pCurrCheckpoint->scale * pCurrCheckpoint->insideCylinderHeightScale; markerInfo.vPos.SetZf(pCurrCheckpoint->vPos.GetZf() - zOffset); } g_markers.Register(markerInfo); } // DECALS bool isLongRange = false; s32 decalRenderSettingIndex = -1; s32 decalRenderSettingCount = -1; if (pCurrCheckpoint->type==CHECKPOINTTYPE_GANG_LOCATE_LOST) { g_decalMan.FindRenderSettingInfo(DECALID_MARKER_GANG_LOST_WHITE, decalRenderSettingIndex, decalRenderSettingCount); } else if (pCurrCheckpoint->type==CHECKPOINTTYPE_GANG_LOCATE_VAGOS) { g_decalMan.FindRenderSettingInfo(DECALID_MARKER_GANG_VAGOS_WHITE, decalRenderSettingIndex, decalRenderSettingCount); } else if (pCurrCheckpoint->type==CHECKPOINTTYPE_GANG_LOCATE_COPS) { g_decalMan.FindRenderSettingInfo(DECALID_MARKER_GANG_COPS_WHITE, decalRenderSettingIndex, decalRenderSettingCount); } else if (pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_LOCATE_GROUND) { g_decalMan.FindRenderSettingInfo(DECALID_MARKER_RACE_GROUND, decalRenderSettingIndex, decalRenderSettingCount); } else if (pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_LOCATE_AIR) { g_decalMan.FindRenderSettingInfo(DECALID_MARKER_RACE_AIR, decalRenderSettingIndex, decalRenderSettingCount); } else if (pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_LOCATE_WATER) { g_decalMan.FindRenderSettingInfo(DECALID_MARKER_RACE_WATER, decalRenderSettingIndex, decalRenderSettingCount); } else if (pCurrCheckpoint->type==CHECKPOINTTYPE_MP_LOCATE_1) { g_decalMan.FindRenderSettingInfo(DECALID_MARKER_MP_LOCATE_1, decalRenderSettingIndex, decalRenderSettingCount); isLongRange = true; } else if (pCurrCheckpoint->type==CHECKPOINTTYPE_MP_LOCATE_2) { g_decalMan.FindRenderSettingInfo(DECALID_MARKER_MP_LOCATE_2, decalRenderSettingIndex, decalRenderSettingCount); isLongRange = true; } else if (pCurrCheckpoint->type==CHECKPOINTTYPE_MP_LOCATE_3) { g_decalMan.FindRenderSettingInfo(DECALID_MARKER_MP_LOCATE_3, decalRenderSettingIndex, decalRenderSettingCount); isLongRange = true; } else if (pCurrCheckpoint->type==CHECKPOINTTYPE_MP_CREATOR_TRIGGER) { g_decalMan.FindRenderSettingInfo(DECALID_MARKER_MP_CREATOR_TRIGGER, decalRenderSettingIndex, decalRenderSettingCount); isLongRange = true; } else if (pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_RUN_CHEVRON_1 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_RUN_CHEVRON_2 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_RUN_CHEVRON_3 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_RUN_LAP || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_RUN_FLAG) { g_decalMan.FindRenderSettingInfo(DECALID_MARKER_TRI_RUN, decalRenderSettingIndex, decalRenderSettingCount); } else if (pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_SWIM_CHEVRON_1 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_SWIM_CHEVRON_2 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_SWIM_CHEVRON_3 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_SWIM_LAP || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_SWIM_FLAG) { g_decalMan.FindRenderSettingInfo(DECALID_MARKER_TRI_SWIM, decalRenderSettingIndex, decalRenderSettingCount); } else if (pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_CYCLE_CHEVRON_1 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_CYCLE_CHEVRON_2 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_CYCLE_CHEVRON_3 || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_CYCLE_LAP || pCurrCheckpoint->type==CHECKPOINTTYPE_RACE_TRI_CYCLE_FLAG) { g_decalMan.FindRenderSettingInfo(DECALID_MARKER_TRI_CYCLE, decalRenderSettingIndex, decalRenderSettingCount); } else if (pCurrCheckpoint->type==CHECKPOINTTYPE_HELI_LANDING) { g_decalMan.FindRenderSettingInfo(DECALID_MARKER_HELI_LANDING, decalRenderSettingIndex, decalRenderSettingCount); isLongRange = true; } else if (pCurrCheckpoint->type==CHECKPOINTTYPE_PARACHUTE_LANDING) { g_decalMan.FindRenderSettingInfo(DECALID_MARKER_PARACHUTE_LANDING, decalRenderSettingIndex, decalRenderSettingCount); isLongRange = true; } if (decalRenderSettingIndex>=0) { // Vec3V vStartPos = pCurrCheckpoint->vPos; // Vec3V vEndPos = pCurrCheckpoint->vPos + Vec3V(0.0f, 0.0f, -2.0f); // // WorldProbe::CShapeTestHitPoint probeResult; // WorldProbe::CShapeTestResults probeResults(probeResult); // WorldProbe::CShapeTestProbeDesc probeDesc; // probeDesc.SetStartAndEnd(RCC_VECTOR3(vStartPos), RCC_VECTOR3(vEndPos)); // probeDesc.SetResultsStructure(&probeResults); // probeDesc.SetIncludeFlags(ArchetypeFlags::GTA_MAP_TYPE_WEAPON); // if (WorldProbe::GetShapeTestManager()->SubmitTest(probeDesc, WorldProbe::PERFORM_SYNCHRONOUS_TEST)) // { // Vec3V_ConstRef vCamPos = RCC_VEC3V(camInterface::GetPos()); // Vec3V vCheckToCamVec = vCamPos-pCurrCheckpoint->vPos; // vCheckToCamVec.SetZ(ScalarV(V_ZERO)); // vCheckToCamVec = Normalize(vCheckToCamVec); // // Vec3V vPos = probeResults[0].GetHitPositionV(); // Vec3V vDir = -probeResults[0].GetHitNormalV(); // Vec3V vTangent; // CVfxHelper::GetRandomTangentAlign(vTangent, vDir, -vCheckToCamVec); // g_decalMan.RegisterMarker(decalRenderSettingIndex, decalRenderSettingCount, vPos, vDir, vTangent, pCurrCheckpoint->scale, pCurrCheckpoint->scale, pCurrCheckpoint->col, isLongRange, true); // } Vec3V vPos = pCurrCheckpoint->vPos; Vec3V vDir = -Vec3V(V_Z_AXIS_WZERO); Vec3V vTangent; if (decalSettingsManager::GetRenderSettings(decalRenderSettingIndex)->shaderId == DECAL_STATIC_SHADER_ROTATE_TOWARDS_CAMERA) { vTangent = Vec3V(V_X_AXIS_WZERO); } else { if (pCurrCheckpoint->decalRotAlignedToCamRot) { Vec3V vCamDir = RCC_VEC3V(camInterface::GetFront()); vCamDir.SetZ(ScalarV(V_ZERO)); if (IsCloseAll(vCamDir, Vec3V(V_ZERO), Vec3V(V_FLT_SMALL_2))) { // the front vector is almost directly downwards - use the up vector instead vCamDir = RCC_VEC3V(camInterface::GetUp()); vCamDir.SetZ(ScalarV(V_ZERO)); } vCamDir = NormalizeSafe(vCamDir, Vec3V(V_X_AXIS_WZERO)); CVfxHelper::GetRandomTangentAlign(vTangent, vDir, vCamDir); } else { Vec3V_ConstRef vCamPos = RCC_VEC3V(camInterface::GetPos()); Vec3V vCheckToCamVec = vCamPos-pCurrCheckpoint->vPos; vCheckToCamVec.SetZ(ScalarV(V_ZERO)); vCheckToCamVec = NormalizeSafe(vCheckToCamVec, Vec3V(V_X_AXIS_WZERO)); CVfxHelper::GetRandomTangentAlign(vTangent, vDir, -vCheckToCamVec); } } g_decalMan.RegisterMarker(decalRenderSettingIndex, decalRenderSettingCount, vPos, vDir, vTangent, pCurrCheckpoint->scale, pCurrCheckpoint->scale, pCurrCheckpoint->col, isLongRange, false, pCurrCheckpoint->decalRotAlignedToCamRot); } } } } /////////////////////////////////////////////////////////////////////////////// // Add /////////////////////////////////////////////////////////////////////////////// int CCheckpoints::Add (CheckpointType_e type, Vec3V_In vPos, Vec3V_In vDir, float scale, u8 colR, u8 colG, u8 colB, u8 colA, u8 num) { s32 index = 0; bool foundFree = false; while ((index=CHECKPOINTS_MAX)) { vfxAssertf(0, "CCheckpoints::Delete - id is out of range"); return; } m_checkpoints[id].isActive = false; m_checkpoints[id].scriptRefIndex = 0; m_checkpoints[id].type = CHECKPOINTTYPE_INVALID; m_checkpoints[id].scale = 0.0f; m_checkpoints[id].insideCylinderHeightScale = 0.0f; m_checkpoints[id].insideCylinderScale = 1.0f; m_checkpoints[id].cylinderHeightMin = 0.0f; m_checkpoints[id].cylinderHeightMax = 0.0f; m_checkpoints[id].cylinderHeightDist = 0.0f; m_checkpoints[id].vPos = Vec3V(V_ZERO); m_checkpoints[id].vLookAtPos = Vec3V(V_ZERO); m_checkpoints[id].num = 0; m_checkpoints[id].vClippingPlane = Vec4V(V_ZERO); m_checkpoints[id].forceOldArrowPointing = false; m_checkpoints[id].decalRotAlignedToCamRot = false; m_checkpoints[id].preventRingFacingCam = false; m_checkpoints[id].forceDirection = false; #if __BANK m_numActiveCheckpoints--; #endif } /////////////////////////////////////////////////////////////////////////////// // SetInsideCylinderHeightScale /////////////////////////////////////////////////////////////////////////////// void CCheckpoints::SetInsideCylinderHeightScale (s32 id, float scale) { if (vfxVerifyf(id>=0 && id=0 && id=0 && id=0 && id=0 && id=0 && id=0 && id=0 && id=0 && id=0 && id=0 && id=0 && id=0 && idPushGroup("Checkpoints", false); { pVfxBank->AddTitle("INFO"); char txt[128]; sprintf(txt, "Num Active (%d)", CHECKPOINTTYPE_MAX); pVfxBank->AddSlider(txt, &m_numActiveCheckpoints, 0, CHECKPOINTTYPE_MAX, 0); pVfxBank->AddTitle(""); pVfxBank->AddTitle("CHECKPOINT SETTINGS"); pVfxBank->AddSlider("Inside Ring Scale (Chevron)", &CHECKPOINT_INSIDE_RING_SCALE_CHEVRON, 0.0f, 2.0f, 0.05f, NullCB, ""); pVfxBank->AddSlider("Inside Ring Scale (Lap)", &CHECKPOINT_INSIDE_RING_SCALE_LAP, 0.0f, 2.0f, 0.05f, NullCB, ""); pVfxBank->AddSlider("Inside Ring Scale (Flag)", &CHECKPOINT_INSIDE_RING_SCALE_FLAG, 0.0f, 2.0f, 0.05f, NullCB, ""); pVfxBank->AddSlider("Inside Ring Scale (Plane)", &CHECKPOINT_INSIDE_RING_SCALE_PLANE, 0.0f, 2.0f, 0.05f, NullCB, ""); pVfxBank->AddSlider("Inside Ring Scale (Money)", &CHECKPOINT_INSIDE_RING_SCALE_MONEY, 0.0f, 2.0f, 0.05f, NullCB, ""); pVfxBank->AddSlider("Inside Ring Scale (Beast)", &CHECKPOINT_INSIDE_RING_SCALE_BEAST, 0.0f, 2.0f, 0.05f, NullCB, ""); pVfxBank->AddSlider("Inside Ring Scale (Transform)", &CHECKPOINT_INSIDE_RING_SCALE_TRANSFORM, 0.0f, 2.0f, 0.05f, NullCB, ""); pVfxBank->AddSlider("Inside Ring Scale (Warp)", &CHECKPOINT_INSIDE_RING_SCALE_WARP, 0.0f, 2.0f, 0.05f, NullCB, ""); pVfxBank->AddSlider("Inside Cylinder Scale (Chevron)", &CHECKPOINT_INSIDE_CYLINDER_SCALE_CHEVRON, 0.0f, 2.0f, 0.05f, NullCB, ""); pVfxBank->AddSlider("Inside Cylinder Scale (Lap)", &CHECKPOINT_INSIDE_CYLINDER_SCALE_LAP, 0.0f, 2.0f, 0.05f, NullCB, ""); pVfxBank->AddSlider("Inside Cylinder Scale (Flag)", &CHECKPOINT_INSIDE_CYLINDER_SCALE_FLAG, 0.0f, 2.0f, 0.05f, NullCB, ""); pVfxBank->AddSlider("Inside Cylinder Scale (Pit Lane)", &CHECKPOINT_INSIDE_CYLINDER_SCALE_PIT_LANE, 0.0f, 2.0f, 0.05f, NullCB, ""); pVfxBank->AddSlider("Inside Cylinder Scale (Number)", &CHECKPOINT_INSIDE_CYLINDER_SCALE_NUMBER, 0.0f, 2.0f, 0.05f, NullCB, ""); pVfxBank->AddSlider("Chevron In Cylinder Height", &CHECKPOINT_CHEVRON_IN_CYLINDER_HEIGHT, 0.0f, 5.0f, 0.05f, NullCB, ""); pVfxBank->AddSlider("Lap In Cylinder Height", &CHECKPOINT_LAP_IN_CYLINDER_HEIGHT, 0.0f, 5.0f, 0.05f, NullCB, ""); pVfxBank->AddSlider("Flag In Cylinder Height", &CHECKPOINT_FLAG_IN_CYLINDER_HEIGHT, 0.0f, 5.0f, 0.05f, NullCB, ""); pVfxBank->AddSlider("Pit Lane In Cylinder Height", &CHECKPOINT_PIT_LANE_IN_CYLINDER_HEIGHT, 0.0f, 5.0f, 0.05f, NullCB, ""); pVfxBank->AddSlider("Number In Cylinder Height", &CHECKPOINT_NUMBER_IN_CYLINDER_HEIGHT, 0.0f, 5.0f, 0.05f, NullCB, ""); pVfxBank->AddSlider("Number Side Offset", &CHECKPOINT_NUMBER_SIDE_OFFSET, 0.0f, 5.0f, 0.05f, NullCB, ""); pVfxBank->AddSlider("Cylinder Height Min", &CHECKPOINT_CYLINDER_Z_MIN, 0.0f, 50.0f, 0.5f, NullCB, ""); pVfxBank->AddSlider("Cylinder Height Max", &CHECKPOINT_CYLINDER_Z_MAX, 0.0f, 50.0f, 0.5f, NullCB, ""); pVfxBank->AddSlider("Cylinder Height Dist", &CHECKPOINT_CYLINDER_Z_DIST, 0.0f, 5000.0f, 10.0f, NullCB, ""); pVfxBank->AddSlider("Cylinder XY Scale Races", &CHECKPOINT_CYLINDER_XY_SCALE_RACES, 0.0f, 5000.0f, 10.0f, NullCB, ""); pVfxBank->AddSlider("Cylinder Alpha Mult (Ground Races)", &CHECKPOINT_CYLINDER_ALPHA_MULT_GROUND_RACES, 0.0f, 10.0f, 0.01f, NullCB, ""); pVfxBank->AddSlider("Cylinder Alpha Mult (Generic)", &CHECKPOINT_CYLINDER_ALPHA_MULT, 0.0f, 1.0f, 0.01f, NullCB, ""); pVfxBank->AddToggle("Use Alternate Chevron Pointing", &CHECKPOINT_USE_ALTERNATE_CHEVRON_POINTING); pVfxBank->AddSlider("Alternate Chevron Cam Tilt", &CHECKPOINT_ALTERNATE_CHEVRON_CAM_TILT, -2.0f, 2.0f, 0.01f, NullCB, ""); pVfxBank->AddSlider("Col R", &CHECKPOINT_DEFAULT_COL_R, 0, 255, 1, NullCB, ""); pVfxBank->AddSlider("Col G", &CHECKPOINT_DEFAULT_COL_G, 0, 255, 1, NullCB, ""); pVfxBank->AddSlider("Col B", &CHECKPOINT_DEFAULT_COL_B, 0, 255, 1, NullCB, ""); pVfxBank->AddSlider("Col A", &CHECKPOINT_DEFAULT_COL_A, 0, 255, 1, NullCB, ""); pVfxBank->AddSlider("Col R2", &CHECKPOINT_DEFAULT_COL_R2, 0, 255, 1, NullCB, ""); pVfxBank->AddSlider("Col G2", &CHECKPOINT_DEFAULT_COL_G2, 0, 255, 1, NullCB, ""); pVfxBank->AddSlider("Col B2", &CHECKPOINT_DEFAULT_COL_B2, 0, 255, 1, NullCB, ""); pVfxBank->AddSlider("Col A2", &CHECKPOINT_DEFAULT_COL_A2, 0, 255, 1, NullCB, ""); pVfxBank->AddTitle(""); pVfxBank->AddTitle("DEBUG"); pVfxBank->AddToggle("Point At Player", &m_pointAtPlayer); pVfxBank->AddToggle("Disable Render", &m_disableRender); pVfxBank->AddToggle("Debug Render", &m_debugRender); pVfxBank->AddSlider("Debug Render Id", &m_debugRenderId, -1, CHECKPOINTS_MAX-1, 1); pVfxBank->AddCombo("Debug Checkpoint Type", (s32*)&m_debugCheckpointType, CHECKPOINTTYPE_MAX, g_typeNames); pVfxBank->AddSlider("Debug Checkpoint Scale", &m_debugCheckpointScale, 0.0, 10.0, 0.1f); pVfxBank->AddSlider("Debug Checkpoint Inside Cylinder Height Scale", &m_debugCheckpointInsideCylinderHeightScale, 0.0, 100.0, 0.1f); pVfxBank->AddSlider("Debug Checkpoint Inside Cylinder Scale", &m_debugCheckpointInsideCylinderScale, 0.0, 100.0, 0.1f); pVfxBank->AddSlider("Debug Checkpoint Cylinder Height Min", &m_debugCheckpointCylinderHeightMin, 0.0, 100.0, 0.1f); pVfxBank->AddSlider("Debug Checkpoint Cylinder Height Max", &m_debugCheckpointCylinderHeightMax, 0.0, 100.0, 0.1f); pVfxBank->AddSlider("Debug Checkpoint Cylinder Height Dist", &m_debugCheckpointCylinderHeightDist, 0.0, 100.0, 0.1f); pVfxBank->AddSlider("Debug Checkpoint Colour Red", &m_debugCheckpointColR, 0, 255, 1); pVfxBank->AddSlider("Debug Checkpoint Colour Green", &m_debugCheckpointColG, 0, 255, 1); pVfxBank->AddSlider("Debug Checkpoint Colour Blue", &m_debugCheckpointColB, 0, 255, 1); pVfxBank->AddSlider("Debug Checkpoint Colour Alpha", &m_debugCheckpointColA, 0, 255, 1); pVfxBank->AddSlider("Debug Checkpoint Colour Red2", &m_debugCheckpointColR2, 0, 255, 1); pVfxBank->AddSlider("Debug Checkpoint Colour Green2", &m_debugCheckpointColG2, 0, 255, 1); pVfxBank->AddSlider("Debug Checkpoint Colour Blue2", &m_debugCheckpointColB2, 0, 255, 1); pVfxBank->AddSlider("Debug Checkpoint Colour Alpha2", &m_debugCheckpointColA2, 0, 255, 1); pVfxBank->AddSlider("Debug Checkpoint Number", &m_debugCheckpointNum, 0, 99, 1); pVfxBank->AddSlider("Debug Checkpoint Clip Plane Pos X", &m_debugCheckpointPlanePosX, -16000.0f, 16000.0f, 0.01f); pVfxBank->AddSlider("Debug Checkpoint Clip Plane Pos Y", &m_debugCheckpointPlanePosY, -16000.0f, 16000.0f, 0.01f); pVfxBank->AddSlider("Debug Checkpoint Clip Plane Pos Z", &m_debugCheckpointPlanePosZ, -16000.0f, 16000.0f, 0.01f); pVfxBank->AddSlider("Debug Checkpoint Clip Plane Normal X", &m_debugCheckpointPlaneNormalX, -1.0f, 1.0f, 0.01f); pVfxBank->AddSlider("Debug Checkpoint Clip Plane Normal Y", &m_debugCheckpointPlaneNormalY, -1.0f, 1.0f, 0.01f); pVfxBank->AddSlider("Debug Checkpoint Clip Plane Normal Z", &m_debugCheckpointPlaneNormalZ, -1.0f, 1.0f, 0.01f); pVfxBank->AddToggle("Debug Checkpoint Force Direction", &m_debugCheckpointForceDirection); pVfxBank->AddButton("Debug Add At Player Pos", DebugAddAtPlayerPos); pVfxBank->AddButton("Debug Add At Ground Pos", DebugAddAtGroundPos); } pVfxBank->PopGroup(); } #endif /////////////////////////////////////////////////////////////////////////////// // DebugAddAtPlayerPos /////////////////////////////////////////////////////////////////////////////// #if __BANK void CCheckpoints::DebugAddAtPlayerPos () { Vec3V vPlayerCoords = VECTOR3_TO_VEC3V(CGameWorld::FindLocalPlayerCoors()); Vec3V vPlayerPos = vPlayerCoords + Vec3V(0.0f, 0.0f, 0.5f); Vec3V vLookAtPos = vPlayerPos + Vec3V(10.0f, 0.0f, 0.0f); int idx = g_checkpoints.Add(g_checkpoints.m_debugCheckpointType, vPlayerPos, vLookAtPos, g_checkpoints.m_debugCheckpointScale, g_checkpoints.m_debugCheckpointColR, g_checkpoints.m_debugCheckpointColG, g_checkpoints.m_debugCheckpointColB, g_checkpoints.m_debugCheckpointColA, g_checkpoints.m_debugCheckpointNum); if (idx>-1) { g_checkpoints.SetInsideCylinderHeightScale(idx, g_checkpoints.m_debugCheckpointInsideCylinderHeightScale); g_checkpoints.SetInsideCylinderScale(idx, g_checkpoints.m_debugCheckpointInsideCylinderScale); g_checkpoints.SetCylinderHeight(idx, g_checkpoints.m_debugCheckpointCylinderHeightMin, g_checkpoints.m_debugCheckpointCylinderHeightMax, g_checkpoints.m_debugCheckpointCylinderHeightDist); g_checkpoints.SetRGBA2(idx, g_checkpoints.m_debugCheckpointColR2, g_checkpoints.m_debugCheckpointColG2, g_checkpoints.m_debugCheckpointColB2, g_checkpoints.m_debugCheckpointColA2); if (g_checkpoints.m_debugCheckpointPlaneNormalX!=0.0f || g_checkpoints.m_debugCheckpointPlaneNormalY!=0.0f || g_checkpoints.m_debugCheckpointPlaneNormalZ!=0.0f) { Vec3V planeNormal = Normalize(Vec3V(g_checkpoints.m_debugCheckpointPlaneNormalX, g_checkpoints.m_debugCheckpointPlaneNormalY, g_checkpoints.m_debugCheckpointPlaneNormalZ)); Vec3V planePos = Vec3V(g_checkpoints.m_debugCheckpointPlanePosX, g_checkpoints.m_debugCheckpointPlanePosY, g_checkpoints.m_debugCheckpointPlanePosZ); ScalarV planeDist = Negate(Dot(planePos, planeNormal)); g_checkpoints.SetClipPlane(idx, Vec4V(planeNormal, planeDist)); } if (g_checkpoints.m_debugCheckpointForceDirection) { g_checkpoints.SetForceDirection(idx); } } } #endif /////////////////////////////////////////////////////////////////////////////// // DebugAddAtGroundPos /////////////////////////////////////////////////////////////////////////////// #if __BANK void CCheckpoints::DebugAddAtGroundPos () { Vec3V vPlayerCoords = VECTOR3_TO_VEC3V(CGameWorld::FindLocalPlayerCoors()); Vec3V vLookAtPos = vPlayerCoords + Vec3V(10.0f, 0.0f, 0.0f); Vec3V vStartPos = vPlayerCoords; Vec3V vEndPos = vPlayerCoords + Vec3V(0.0f, 0.0f, -2.0f); WorldProbe::CShapeTestHitPoint probeResult; WorldProbe::CShapeTestResults probeResults(probeResult); WorldProbe::CShapeTestProbeDesc probeDesc; probeDesc.SetStartAndEnd(RCC_VECTOR3(vStartPos), RCC_VECTOR3(vEndPos)); probeDesc.SetResultsStructure(&probeResults); probeDesc.SetIncludeFlags(ArchetypeFlags::GTA_MAP_TYPE_WEAPON); if (WorldProbe::GetShapeTestManager()->SubmitTest(probeDesc, WorldProbe::PERFORM_SYNCHRONOUS_TEST)) { int idx = g_checkpoints.Add(g_checkpoints.m_debugCheckpointType, probeResults[0].GetHitPositionV(), vLookAtPos, g_checkpoints.m_debugCheckpointScale, g_checkpoints.m_debugCheckpointColR, g_checkpoints.m_debugCheckpointColG, g_checkpoints.m_debugCheckpointColB, g_checkpoints.m_debugCheckpointColA, g_checkpoints.m_debugCheckpointNum); if (idx>-1) { g_checkpoints.SetInsideCylinderHeightScale(idx, g_checkpoints.m_debugCheckpointInsideCylinderHeightScale); g_checkpoints.SetInsideCylinderScale(idx, g_checkpoints.m_debugCheckpointInsideCylinderScale); g_checkpoints.SetCylinderHeight(idx, g_checkpoints.m_debugCheckpointCylinderHeightMin, g_checkpoints.m_debugCheckpointCylinderHeightMax, g_checkpoints.m_debugCheckpointCylinderHeightDist); g_checkpoints.SetRGBA2(idx, g_checkpoints.m_debugCheckpointColR2, g_checkpoints.m_debugCheckpointColG2, g_checkpoints.m_debugCheckpointColB2, g_checkpoints.m_debugCheckpointColA2); if (g_checkpoints.m_debugCheckpointPlaneNormalX!=0.0f || g_checkpoints.m_debugCheckpointPlaneNormalY!=0.0f || g_checkpoints.m_debugCheckpointPlaneNormalZ!=0.0f) { Vec3V planeNormal = Normalize(Vec3V(g_checkpoints.m_debugCheckpointPlaneNormalX, g_checkpoints.m_debugCheckpointPlaneNormalY, g_checkpoints.m_debugCheckpointPlaneNormalZ)); Vec3V planePos = Vec3V(g_checkpoints.m_debugCheckpointPlanePosX, g_checkpoints.m_debugCheckpointPlanePosY, g_checkpoints.m_debugCheckpointPlanePosZ); ScalarV planeDist = Negate(Dot(planePos, planeNormal)); g_checkpoints.SetClipPlane(idx, Vec4V(planeNormal, planeDist)); } } } } #endif