diff --git a/src/ModelExtrasAPI.cpp b/src/ModelExtrasAPI.cpp index d5a9449f..dc7e3397 100755 --- a/src/ModelExtrasAPI.cpp +++ b/src/ModelExtrasAPI.cpp @@ -152,6 +152,18 @@ void ME_SetFogLights(CVehicle *pVeh, bool on) { } } +bool ME_GetHighBeam(CVehicle *pVeh) { + if (!pVeh) return false; + auto &data = LightManager::m_VehData.Get(pVeh); + return data.bLongLightsOn; +} + +void ME_SetHighBeam(CVehicle *pVeh, bool on) { + if (!pVeh) return; + auto &data = LightManager::m_VehData.Get(pVeh); + data.bLongLightsOn = on; + data.fHighBeamFactor = on ? 1.0f : 0.0f; +} float ME_GetLightInertia(CVehicle *pVeh, ME_LightID lightId) { if (!pVeh) return 0.0f; @@ -211,10 +223,10 @@ bool ME_IsLightDamaged(CVehicle *pVeh, ME_LightID lightId, int dummyIndex) { if (dummyIndex >= 0 && dummyIndex < static_cast(data.dummies[matType].size())) { return CarUtil::IsDummyDamaged(pVeh, data.dummies[matType][dummyIndex]->GetRef()); } - if (matType == eMaterialType::HeadLightLeft) return CarUtil::IsLightDamaged(pVeh, eLights::LIGHT_FRONT_LEFT); - if (matType == eMaterialType::HeadLightRight) return CarUtil::IsLightDamaged(pVeh, eLights::LIGHT_FRONT_RIGHT); - if (matType == eMaterialType::TailLightLeft || matType == eMaterialType::BrakeLightLeft) return CarUtil::IsLightDamaged(pVeh, eLights::LIGHT_REAR_LEFT); - if (matType == eMaterialType::TailLightRight || matType == eMaterialType::BrakeLightRight) return CarUtil::IsLightDamaged(pVeh, eLights::LIGHT_REAR_RIGHT); + if (matType == eMaterialType::HeadLightLeft || matType == eMaterialType::HighBeamLeft) return CarUtil::IsLightDamaged(pVeh, eLights::LIGHT_FRONT_LEFT) || CarUtil::IsPanelDamaged(pVeh, ePanels::WING_FRONT_LEFT); + if (matType == eMaterialType::HeadLightRight || matType == eMaterialType::HighBeamRight) return CarUtil::IsLightDamaged(pVeh, eLights::LIGHT_FRONT_RIGHT) || CarUtil::IsPanelDamaged(pVeh, ePanels::WING_FRONT_RIGHT); + if (matType == eMaterialType::TailLightLeft || matType == eMaterialType::BrakeLightLeft || matType == eMaterialType::ReverseLightLeft) return CarUtil::IsLightDamaged(pVeh, eLights::LIGHT_REAR_LEFT) || CarUtil::IsPanelDamaged(pVeh, ePanels::WING_REAR_LEFT); + if (matType == eMaterialType::TailLightRight || matType == eMaterialType::BrakeLightRight || matType == eMaterialType::ReverseLightRight) return CarUtil::IsLightDamaged(pVeh, eLights::LIGHT_REAR_RIGHT) || CarUtil::IsPanelDamaged(pVeh, ePanels::WING_REAR_RIGHT); return false; } @@ -956,6 +968,9 @@ float ME_GetLightShadowDistance() { return RenderUtil::GetLightShadowDistance(); } +float ME_GetHighBeamPointLightMul() { + return LightsConfig::Get().fHighBeamPointLightMul; +} float ME_GetSirenPointLightMul() { return LightsConfig::Get().fSirenPointLightMul; diff --git a/src/ModelExtrasAPI.h b/src/ModelExtrasAPI.h index cca228d2..c423af04 100755 --- a/src/ModelExtrasAPI.h +++ b/src/ModelExtrasAPI.h @@ -89,6 +89,8 @@ enum ME_LightID ME_ReverseLightRight, ME_BrakeLightLeft, ME_BrakeLightRight, + ME_HighBeamLeft, + ME_HighBeamRight, ME_AllDayLight, ME_DayLight, ME_NightLight, @@ -162,6 +164,8 @@ extern "C" ME_WRAPPER void ME_SetLightOverride(CVehicle *pVeh, int overrideMode); ME_WRAPPER bool ME_GetFogLights(CVehicle *pVeh); ME_WRAPPER void ME_SetFogLights(CVehicle *pVeh, bool on); + ME_WRAPPER bool ME_GetHighBeam(CVehicle *pVeh); + ME_WRAPPER void ME_SetHighBeam(CVehicle *pVeh, bool on); ME_WRAPPER float ME_GetLightInertia(CVehicle *pVeh, ME_LightID lightId); ME_WRAPPER bool ME_GetLightColor(CVehicle *pVeh, ME_LightID lightId, ME_Color *onColor, ME_Color *offColor); ME_WRAPPER float ME_GetLightFactor(CVehicle *pVeh, ME_LightID lightId); @@ -301,6 +305,7 @@ extern "C" ME_WRAPPER float ME_GetCoronaDistanceMul(); ME_WRAPPER float ME_GetCoronaNearClip(); ME_WRAPPER float ME_GetLightShadowDistance(); + ME_WRAPPER float ME_GetHighBeamPointLightMul(); ME_WRAPPER float ME_GetSirenPointLightMul(); ME_WRAPPER float ME_GetPointLightIntensity(); ME_WRAPPER bool ME_IsAutoIndicatorsOnSteerEnabled(); diff --git a/src/enums/materialtype.h b/src/enums/materialtype.h index be6aded0..600abe81 100755 --- a/src/enums/materialtype.h +++ b/src/enums/materialtype.h @@ -15,6 +15,8 @@ enum eMaterialType ReverseLightRight, BrakeLightLeft, BrakeLightRight, + HighBeamLeft, + HighBeamRight, AllDayLight, DayLight, NightLight, diff --git a/src/features/core/colors.h b/src/features/core/colors.h index 2eef02f5..36d8565d 100755 --- a/src/features/core/colors.h +++ b/src/features/core/colors.h @@ -9,6 +9,9 @@ #define VEHCOL_HEADLIGHT_LEFT CRGBA(255, 175, 0, 255) #define VEHCOL_HEADLIGHT_RIGHT CRGBA(0, 255, 200, 255) +#define VEHCOL_HIGHBEAM_LEFT CRGBA(255, 172, 0, 255) +#define VEHCOL_HIGHBEAM_RIGHT CRGBA(0, 255, 197, 255) + #define VEHCOL_TAILLIGHT_LEFT CRGBA(185, 255, 0, 255) #define VEHCOL_TAILLIGHT_RIGHT CRGBA(255, 60, 0, 255) diff --git a/src/features/lights/components/headlight.cpp b/src/features/lights/components/headlight.cpp index 19979916..ec1a2af0 100644 --- a/src/features/lights/components/headlight.cpp +++ b/src/features/lights/components/headlight.cpp @@ -5,6 +5,7 @@ #include "utils/audiomgr.h" #include "utils/render.h" #include "../damage.h" +#include "defines.h" #include extern bool gbProperShadersDetected; @@ -12,11 +13,15 @@ extern bool gbProperShadersDetected; void HeadlightComponent::RegisterMaterials(std::unordered_map& matMap) { matMap[VEHCOL_HEADLIGHT_LEFT.ToInt()] = eMaterialType::HeadLightLeft; matMap[VEHCOL_HEADLIGHT_RIGHT.ToInt()] = eMaterialType::HeadLightRight; + matMap[VEHCOL_HIGHBEAM_LEFT.ToInt()] = eMaterialType::HighBeamLeft; + matMap[VEHCOL_HIGHBEAM_RIGHT.ToInt()] = eMaterialType::HighBeamRight; } eMaterialType HeadlightComponent::GetMatType(CRGBA matCol) { if (matCol == VEHCOL_HEADLIGHT_LEFT) return eMaterialType::HeadLightLeft; if (matCol == VEHCOL_HEADLIGHT_RIGHT) return eMaterialType::HeadLightRight; + if (matCol == VEHCOL_HIGHBEAM_LEFT) return eMaterialType::HighBeamLeft; + if (matCol == VEHCOL_HIGHBEAM_RIGHT) return eMaterialType::HighBeamRight; return eMaterialType::UnknownMaterial; } @@ -61,7 +66,6 @@ bool HeadlightComponent::TryRegisterDummy(CVehicle* pVeh, RwFrame* pFrame, const } DummyConfig c = LightManager::CreateBaseConfig(pVeh, pFrame); c.dummyPos = eDummyPos::Front; - c.lightType = eMaterialType::HeadLightLeft; c.corona.size = LightsConfig::Get().gfHeadLightCoronaSize; c.corona.color = {250, 250, 250, static_cast(LightsConfig::Get().gHeadLightCoronaIntensity)}; c.shadow.color = {250, 250, 250, static_cast(LightsConfig::Get().gHeadLightShadowIntensity)}; @@ -77,13 +81,13 @@ bool HeadlightComponent::TryRegisterDummy(CVehicle* pVeh, RwFrame* pFrame, const data.dummies[c.lightType].push_back(VehicleDummy(c)); } else { bool dummyIsLeft = (c.frame->modelling.pos.x < 0.0f); - c.mirroredX = dummyIsLeft; + c.mirroredX = !dummyIsLeft; c.lightType = eMaterialType::HeadLightLeft; - data.dummies[c.lightType].push_back(VehicleDummy(c)); + data.dummies[eMaterialType::HeadLightLeft].push_back(VehicleDummy(c)); - c.mirroredX = !dummyIsLeft; + c.mirroredX = dummyIsLeft; c.lightType = eMaterialType::HeadLightRight; - data.dummies[c.lightType].push_back(VehicleDummy(c)); + data.dummies[eMaterialType::HeadLightRight].push_back(VehicleDummy(c)); } return true; } @@ -108,6 +112,58 @@ bool HeadlightComponent::TryRegisterDummy(CVehicle* pVeh, RwFrame* pFrame, const return true; } + if (name == "highbeam_l" || name == "highbeam_r" || name == "highbeams_l" || name == "highbeams_r") { + if (pFrame && !rwLinkListEmpty(&pFrame->objectList)) { + return false; + } + DummyConfig c = LightManager::CreateBaseConfig(pVeh, pFrame); + c.dummyPos = eDummyPos::Front; + bool isLeft = (name == "highbeam_l" || name == "highbeams_l"); + c.lightType = isLeft ? eMaterialType::HighBeamLeft : eMaterialType::HighBeamRight; + c.corona.size = LightsConfig::Get().gfHeadLightCoronaSize; + c.corona.color = {250, 250, 250, static_cast(LightsConfig::Get().gHeadLightCoronaIntensity)}; + c.shadow.color = {250, 250, 250, static_cast(LightsConfig::Get().gHeadLightShadowIntensity)}; + c.shadow.size = LightsConfig::Get().gfHeadLightShadowSize; + c.corona.lightingType = eLightingMode::Directional; + c.shadow.render = false; + c.mirroredX = false; + + data.dummies[c.lightType].push_back(VehicleDummy(c)); + return true; + } + + if (name == "highbeam" || name == "highbeams") { + if (pFrame && !rwLinkListEmpty(&pFrame->objectList)) { + return false; + } + DummyConfig c = LightManager::CreateBaseConfig(pVeh, pFrame); + c.dummyPos = eDummyPos::Front; + c.corona.size = LightsConfig::Get().gfHeadLightCoronaSize; + c.corona.color = {250, 250, 250, static_cast(LightsConfig::Get().gHeadLightCoronaIntensity)}; + c.shadow.color = {250, 250, 250, static_cast(LightsConfig::Get().gHeadLightShadowIntensity)}; + c.shadow.size = LightsConfig::Get().gfHeadLightShadowSize; + c.corona.lightingType = eLightingMode::Directional; + c.shadow.render = false; + + bool isBike = (pVeh->m_nVehicleSubClass == VEHICLE_BIKE); + + if (isBike) { + c.mirroredX = false; + c.lightType = eMaterialType::HighBeamLeft; + data.dummies[c.lightType].push_back(VehicleDummy(c)); + } else { + bool dummyIsLeft = (c.frame->modelling.pos.x < 0.0f); + c.mirroredX = !dummyIsLeft; + c.lightType = eMaterialType::HighBeamLeft; + data.dummies[eMaterialType::HighBeamLeft].push_back(VehicleDummy(c)); + + c.mirroredX = dummyIsLeft; + c.lightType = eMaterialType::HighBeamRight; + data.dummies[eMaterialType::HighBeamRight].push_back(VehicleDummy(c)); + } + return true; + } + std::string lowerName; lowerName.reserve(name.size()); for (char ch : name) { @@ -171,26 +227,6 @@ void HeadlightComponent::Process(CVehicle* pVeh, VehLightData& data) { data.bLongLightsOn = !data.bLongLightsOn; AudioMgr::PlaySwitchSound(pVeh); } - } else if (pVeh->m_fHealth > 0.0f) { - if (CarUtil::IsLightsForcedOff(pVeh) || (Util::IsEngineOff(pVeh) && !CarUtil::IsLightsForcedOn(pVeh) && !pVeh->bLightsOn && !isAlarmActive)) { - return; - } - - if (CVector::Distance(pVeh->GetPosition(), TheCamera.GetPosition()) < 300.0f || pVeh->GetIsOnScreen()) { - bool isLeftFrontOk = !Util::IsLightDamaged(pVeh, eLights::LIGHT_FRONT_LEFT); - bool isRightFrontOk = !Util::IsLightDamaged(pVeh, eLights::LIGHT_FRONT_RIGHT); - - if (isHeadlightsActive && AreHeadlightsOpen(pVeh, data)) { - bool isFoggy = Util::IsFoggy(); - std::string texName = data.bLongLightsOn ? "headlight_long" : "headlight_short"; - bool shadow = !gbProperShadersDetected; - bool highlight = isFoggy || data.bLongLightsOn; - - LightManager::RenderLight(pVeh, data, eMaterialType::HeadLightLeft, isLeftFrontOk, shadow ? texName : "", LightsConfig::Get().headlightSz, highlight); - LightManager::RenderLight(pVeh, data, eMaterialType::HeadLightRight, isRightFrontOk, shadow ? texName : "", LightsConfig::Get().headlightSz, highlight); - data.nHeadlightTickFrame = CTimer::m_FrameCounter; - } - } } } @@ -205,9 +241,8 @@ void HeadlightComponent::Render(CVehicle* pControlVeh, CVehicle* pTowedVeh, VehL bool isNightOrOn = (CarUtil::AreLightsOn(pControlVeh) || isAlarmLightOn); if (isAlarmActive && !isAlarmLightOn) { isNightOrOn = false; - pControlVeh->m_renderLights.m_bLeftFront = false; - pControlVeh->m_renderLights.m_bRightFront = false; } + bool isOpen = AreHeadlightsOpen(pControlVeh, data); auto damage = LightDamageState::Get(pControlVeh, pTowedVeh); @@ -219,20 +254,21 @@ void HeadlightComponent::Render(CVehicle* pControlVeh, CVehicle* pTowedVeh, VehL if (!isNightOrOn || !isOpen) return; - bool bTickRegistered = (data.nHeadlightTickFrame == CTimer::m_FrameCounter); bool isFoggy = Util::IsFoggy(); std::string texName = data.bLongLightsOn ? "headlight_long" : "headlight_short"; bool shadow = !gbProperShadersDetected; bool highlight = isFoggy || data.bLongLightsOn; - if (isHeadlightLeftOk || isHeadlightRightOk) { - pControlVeh->m_renderLights.m_bLeftFront = isHeadlightLeftOk; - pControlVeh->m_renderLights.m_bRightFront = isHeadlightRightOk; - if (isHeadlightLeftOk) { - LightManager::RenderLights(pControlVeh, pTowedVeh, data, eMaterialType::HeadLightLeft, true, shadow ? texName : "", LightsConfig::Get().headlightSz, highlight, true, bTickRegistered); + if (isHeadlightLeftOk) { + LightManager::RenderLights(pControlVeh, pTowedVeh, data, eMaterialType::HeadLightLeft, true, shadow ? texName : "", LightsConfig::Get().headlightSz, highlight, true); + if (data.bLongLightsOn) { + LightManager::RenderLights(pControlVeh, pTowedVeh, data, eMaterialType::HighBeamLeft, true, "", LightsConfig::Get().headlightSz, isFoggy, true); } - if (isHeadlightRightOk) { - LightManager::RenderLights(pControlVeh, pTowedVeh, data, eMaterialType::HeadLightRight, true, shadow ? texName : "", LightsConfig::Get().headlightSz, highlight, true, bTickRegistered); + } + if (isHeadlightRightOk) { + LightManager::RenderLights(pControlVeh, pTowedVeh, data, eMaterialType::HeadLightRight, true, shadow ? texName : "", LightsConfig::Get().headlightSz, highlight, true); + if (data.bLongLightsOn) { + LightManager::RenderLights(pControlVeh, pTowedVeh, data, eMaterialType::HighBeamRight, true, "", LightsConfig::Get().headlightSz, isFoggy, true); } } } @@ -267,6 +303,26 @@ void HeadlightComponent::ProcessPointLights(CVehicle* pVeh, VehLightData& data) RenderUtil::RegisterHeadlightPointLight(&e->Get(), rangeMul); } } + + if (data.bLongLightsOn) { + for (eMaterialType type : {eMaterialType::HighBeamLeft, eMaterialType::HighBeamRight}) { + if (!LightManager::IsDummyAvailable(data, type) || !data.bLightStates[type]) { + continue; + } + + bool isLeft = (type == eMaterialType::HighBeamLeft); + eLights lightEnum = isLeft ? eLights::LIGHT_FRONT_LEFT : eLights::LIGHT_FRONT_RIGHT; + ePanels wingEnum = isLeft ? ePanels::WING_FRONT_LEFT : ePanels::WING_FRONT_RIGHT; + if (Util::IsLightDamaged(pVeh, lightEnum) || Util::IsPanelDamaged(pVeh, wingEnum)) { + continue; + } + + for (auto& e : data.dummies[type]) { + e->Update(); + RenderUtil::RegisterHeadlightPointLight(&e->Get(), rangeMul); + } + } + } } } diff --git a/src/features/lights/damage.h b/src/features/lights/damage.h index 6fdce7ff..0cc5932f 100644 --- a/src/features/lights/damage.h +++ b/src/features/lights/damage.h @@ -15,12 +15,12 @@ struct LightDamageState { static LightDamageState Get(CVehicle* pControlVeh, CVehicle* pTowedVeh) { LightDamageState state; - state.isHeadlightLeftOk = !(Util::IsLightDamaged(pControlVeh, eLights::LIGHT_FRONT_LEFT) || Util::IsPanelDamaged(pControlVeh, ePanels::WING_FRONT_LEFT)); - state.isHeadlightRightOk = !(Util::IsLightDamaged(pControlVeh, eLights::LIGHT_FRONT_RIGHT) || Util::IsPanelDamaged(pControlVeh, ePanels::WING_FRONT_RIGHT)); + state.isHeadlightLeftOk = !Util::IsLightDamaged(pControlVeh, eLights::LIGHT_FRONT_LEFT) && !Util::IsPanelDamaged(pControlVeh, ePanels::WING_FRONT_LEFT); + state.isHeadlightRightOk = !Util::IsLightDamaged(pControlVeh, eLights::LIGHT_FRONT_RIGHT) && !Util::IsPanelDamaged(pControlVeh, ePanels::WING_FRONT_RIGHT); state.isFrontLeftOk = state.isHeadlightLeftOk || pControlVeh->bSirenOrAlarm; state.isFrontRightOk = state.isHeadlightRightOk || pControlVeh->bSirenOrAlarm; - state.isRearLeftOk = !(Util::IsLightDamaged(pTowedVeh, eLights::LIGHT_REAR_LEFT) || Util::IsPanelDamaged(pTowedVeh, ePanels::WING_REAR_LEFT)); - state.isRearRightOk = !(Util::IsLightDamaged(pTowedVeh, eLights::LIGHT_REAR_RIGHT) || Util::IsPanelDamaged(pTowedVeh, ePanels::WING_REAR_RIGHT)); + state.isRearLeftOk = !Util::IsLightDamaged(pTowedVeh, eLights::LIGHT_REAR_LEFT) && !Util::IsPanelDamaged(pTowedVeh, ePanels::WING_REAR_LEFT); + state.isRearRightOk = !Util::IsLightDamaged(pTowedVeh, eLights::LIGHT_REAR_RIGHT) && !Util::IsPanelDamaged(pTowedVeh, ePanels::WING_REAR_RIGHT); state.isMiddleLeftOk = !Util::IsPanelDamaged(pControlVeh, ePanels::WING_FRONT_LEFT); state.isMiddleRightOk = !Util::IsPanelDamaged(pControlVeh, ePanels::WING_FRONT_RIGHT); state.isFrontBumperOk = !Util::IsPanelDamaged(pControlVeh, ePanels::BUMP_FRONT); diff --git a/src/features/lights/data.h b/src/features/lights/data.h index 175db3ae..67ec764f 100644 --- a/src/features/lights/data.h +++ b/src/features/lights/data.h @@ -138,7 +138,6 @@ struct VehLightData { std::array, eMaterialType::TotalMaterial> dummies; bool bLightStates[eMaterialType::TotalMaterial]; - unsigned int nHeadlightTickFrame = 0; bool bHasVehFuncsPopUp = false; bool bAutoNightLights = false; unsigned int nHeadlightsTurnedOnTime = 0; @@ -179,7 +178,6 @@ struct VehLightData { vec.clear(); } std::copy(std::begin(other.bLightStates), std::end(other.bLightStates), std::begin(bLightStates)); - nHeadlightTickFrame = other.nHeadlightTickFrame; } return *this; } diff --git a/src/features/lights/manager.cpp b/src/features/lights/manager.cpp index 5e955c36..ca6a76d0 100644 --- a/src/features/lights/manager.cpp +++ b/src/features/lights/manager.cpp @@ -151,6 +151,22 @@ void LightManager::Render(CVehicle* pControlVeh, CVehicle* pTowedVeh) { for (int t = 0; t < eMaterialType::TotalMaterial; ++t) { eMaterialType type = static_cast(t); if (!vData.bLightRenderedThisFrame[type] && vData.fLightFactor[type] > 0.001f) { + bool isDamagedLight = false; + if (type == eMaterialType::HeadLightLeft || type == eMaterialType::HighBeamLeft) { + isDamagedLight = Util::IsLightDamaged(pVeh, eLights::LIGHT_FRONT_LEFT) || Util::IsPanelDamaged(pVeh, ePanels::WING_FRONT_LEFT); + } else if (type == eMaterialType::HeadLightRight || type == eMaterialType::HighBeamRight) { + isDamagedLight = Util::IsLightDamaged(pVeh, eLights::LIGHT_FRONT_RIGHT) || Util::IsPanelDamaged(pVeh, ePanels::WING_FRONT_RIGHT); + } else if (type == eMaterialType::TailLightLeft || type == eMaterialType::BrakeLightLeft || type == eMaterialType::ReverseLightLeft) { + isDamagedLight = Util::IsLightDamaged(pVeh, eLights::LIGHT_REAR_LEFT) || Util::IsPanelDamaged(pVeh, ePanels::WING_REAR_LEFT); + } else if (type == eMaterialType::TailLightRight || type == eMaterialType::BrakeLightRight || type == eMaterialType::ReverseLightRight) { + isDamagedLight = Util::IsLightDamaged(pVeh, eLights::LIGHT_REAR_RIGHT) || Util::IsPanelDamaged(pVeh, ePanels::WING_REAR_RIGHT); + } + + if (isDamagedLight) { + vData.fLightFactor[type] = 0.0f; + continue; + } + float inertia = GetLightInertia(pVeh, vData, type); if (inertia > 0.0001f) { float step = (CTimer::ms_fTimeStep / 50.0f) / inertia; @@ -170,12 +186,14 @@ void LightManager::Render(CVehicle* pControlVeh, CVehicle* pTowedVeh) { RwFrame *parent = RwFrameGetParent(dummy->Get().frame); bool isBike = pVeh->m_nVehicleSubClass == VEHICLE_BIKE; bool isDamaged = Util::IsFrameDamaged(pVeh, parent) || !FrameUtil::IsOkAtomicVisible(parent); - bool atomicCheck = !isBike && pVeh->GetIsOnScreen() && type != eMaterialType::HeadLightLeft && type != eMaterialType::HeadLightRight && isDamaged; + bool atomicCheck = !isBike && pVeh->GetIsOnScreen() && isDamaged; if (atomicCheck || (c.dummyPos == eDummyPos::Rear && pVeh->m_pTrailer)) continue; float szMul = 1.0f; if (type == eMaterialType::HeadLightLeft || type == eMaterialType::HeadLightRight) { - szMul = 1.0f + 2.0f * vData.fHighBeamFactor; + if (!LightManager::IsDummyAvailable(vData, {eMaterialType::HighBeamLeft, eMaterialType::HighBeamRight})) { + szMul = 1.0f + 2.0f * vData.fHighBeamFactor; + } } EnableDummy((int)pVeh + 42 + id++, &dummy, pVeh, szMul, factor); @@ -188,7 +206,9 @@ void LightManager::Render(CVehicle* pControlVeh, CVehicle* pTowedVeh) { } } } else { - if (type == eMaterialType::HeadLightLeft || type == eMaterialType::HeadLightRight) { + if ((type == eMaterialType::HeadLightLeft || type == eMaterialType::HeadLightRight) && + vData.fLightFactor[eMaterialType::HeadLightLeft] <= 0.001f && + vData.fLightFactor[eMaterialType::HeadLightRight] <= 0.001f) { vData.fHighBeamFactor = 0.0f; vData.bLongLightsOn = false; } @@ -204,7 +224,7 @@ void LightManager::Render(CVehicle* pControlVeh, CVehicle* pTowedVeh) { } static float GetCoronaDistanceMulForLight(eMaterialType lightType) { - if (lightType == eMaterialType::HeadLightLeft || lightType == eMaterialType::HeadLightRight) { + if (lightType == eMaterialType::HeadLightLeft || lightType == eMaterialType::HeadLightRight || lightType == eMaterialType::HighBeamLeft || lightType == eMaterialType::HighBeamRight) { return RenderUtil::GetHeadLightCoronaDistanceMul(); } if (lightType == eMaterialType::TailLightLeft || lightType == eMaterialType::TailLightRight || @@ -247,7 +267,7 @@ void LightManager::RenderLight(CVehicle* pVeh, VehLightData& data, eMaterialType } bool isAvailable = IsDummyAvailable(data, type); - if (type == eMaterialType::HeadLightLeft) { + if (type == eMaterialType::HeadLightLeft || type == eMaterialType::HeadLightRight) { float target = (data.bLongLightsOn && isOn) ? 1.0f : 0.0f; if (inertia > 0.0001f) { float hbStep = (CTimer::ms_fTimeStep / 50.0f) / inertia; @@ -280,7 +300,7 @@ void LightManager::RenderLight(CVehicle* pVeh, VehLightData& data, eMaterialType if (!isDamaged && parent) { isDamaged = !FrameUtil::IsOkAtomicVisible(parent); } - bool atomicCheck = !isBike && pVeh->GetIsOnScreen() && type != eMaterialType::HeadLightLeft && type != eMaterialType::HeadLightRight && isDamaged; + bool atomicCheck = !isBike && pVeh->GetIsOnScreen() && isDamaged; if (atomicCheck || (c.dummyPos == eDummyPos::Rear && pVeh->m_pTrailer) || !isDummyOk) { continue; @@ -308,7 +328,9 @@ void LightManager::RenderLight(CVehicle* pVeh, VehLightData& data, eMaterialType float szMul = 1.0f; if (type == eMaterialType::HeadLightLeft || type == eMaterialType::HeadLightRight) { - szMul = 1.0f + 2.0f * data.fHighBeamFactor; + if (!LightManager::IsDummyAvailable(data, {eMaterialType::HighBeamLeft, eMaterialType::HighBeamRight})) { + szMul = 1.0f + 2.0f * data.fHighBeamFactor; + } if (highlight && !data.bLongLightsOn) { szMul = std::max(szMul, 3.00f); } @@ -454,6 +476,8 @@ const char* LightManager::GetLightGroupKey(eMaterialType type) { switch (type) { case eMaterialType::HeadLightLeft: case eMaterialType::HeadLightRight: + case eMaterialType::HighBeamLeft: + case eMaterialType::HighBeamRight: return "headlights"; case eMaterialType::TailLightLeft: case eMaterialType::TailLightRight: @@ -513,6 +537,8 @@ const char* LightManager::GetLightSpecificKey(eMaterialType type) { switch (type) { case eMaterialType::HeadLightLeft: return "headlight_l"; case eMaterialType::HeadLightRight: return "headlight_r"; + case eMaterialType::HighBeamLeft: return "highbeam_l"; + case eMaterialType::HighBeamRight: return "highbeam_r"; case eMaterialType::TailLightLeft: return "taillight_l"; case eMaterialType::TailLightRight: return "taillight_r"; case eMaterialType::STTLightLeft: return "sttlight_l"; @@ -664,6 +690,9 @@ MatStateColor LightManager::GetMaterialColor(CVehicle* pVeh, eMaterialType type) if (type == eMaterialType::FogLightRight) checkSec(lights, "fogl_r"); if (type == eMaterialType::ReverseLightLeft) { checkSec(lights, "revl_l"); checkSec(lights, "rev_l"); } if (type == eMaterialType::ReverseLightRight) { checkSec(lights, "revl_r"); checkSec(lights, "rev_r"); } + if (type == eMaterialType::HighBeamLeft || type == eMaterialType::HighBeamRight) { + checkSec(lights, "highbeam"); + } if (type == eMaterialType::SpotLight) { checkSec(lights, "spotlights"); checkSec(lights, "spot_light"); } if (type == eMaterialType::StrobeLight) { checkSec(lights, "strobes"); checkSec(lights, "strobe"); checkSec(lights, "strobe_light"); } if (grpKey) checkSec(lights, grpKey); diff --git a/src/utils/render.cpp b/src/utils/render.cpp index 85cca01a..a00213d5 100755 --- a/src/utils/render.cpp +++ b/src/utils/render.cpp @@ -196,7 +196,7 @@ void RenderUtil::RegisterHeadlightPointLight(const DummyConfig *pConfig, float r } } - bool isLeft = (pConfig->lightType == eMaterialType::HeadLightLeft || pConfig->position.x < 0.0f); + bool isLeft = (pConfig->lightType == eMaterialType::HeadLightLeft || pConfig->lightType == eMaterialType::HighBeamLeft || pConfig->position.x < 0.0f); eLights lightEnum = isLeft ? eLights::LIGHT_FRONT_LEFT : eLights::LIGHT_FRONT_RIGHT; ePanels wingEnum = isLeft ? ePanels::WING_FRONT_LEFT : ePanels::WING_FRONT_RIGHT; if (Util::IsLightDamaged(pConfig->pVeh, lightEnum) || Util::IsPanelDamaged(pConfig->pVeh, wingEnum)) @@ -281,7 +281,7 @@ void RenderUtil::RegisterPointLight(const DummyConfig *pConfig, CRGBA col, float bool isSirenFlashing = pConfig->pVeh->bSirenOrAlarm; // Front Left - if (pConfig->lightType == eMaterialType::HeadLightLeft || pConfig->lightType == eMaterialType::FogLightLeft) + if (pConfig->lightType == eMaterialType::HeadLightLeft || pConfig->lightType == eMaterialType::HighBeamLeft || pConfig->lightType == eMaterialType::FogLightLeft) { if (Util::IsLightDamaged(pConfig->pVeh, eLights::LIGHT_FRONT_LEFT) || Util::IsPanelDamaged(pConfig->pVeh, ePanels::WING_FRONT_LEFT)) return; @@ -292,7 +292,7 @@ void RenderUtil::RegisterPointLight(const DummyConfig *pConfig, CRGBA col, float return; } // Front Right - else if (pConfig->lightType == eMaterialType::HeadLightRight || pConfig->lightType == eMaterialType::FogLightRight) + else if (pConfig->lightType == eMaterialType::HeadLightRight || pConfig->lightType == eMaterialType::HighBeamRight || pConfig->lightType == eMaterialType::FogLightRight) { if (Util::IsLightDamaged(pConfig->pVeh, eLights::LIGHT_FRONT_RIGHT) || Util::IsPanelDamaged(pConfig->pVeh, ePanels::WING_FRONT_RIGHT)) return; @@ -442,6 +442,7 @@ void RenderUtil::RegisterCoronaDirectional(const DummyConfig *pConfig, float ang { float targetAngle = angle; if (pConfig->lightType == eMaterialType::HeadLightLeft || pConfig->lightType == eMaterialType::HeadLightRight + || pConfig->lightType == eMaterialType::HighBeamLeft || pConfig->lightType == eMaterialType::HighBeamRight || pConfig->lightType == eMaterialType::IndicatorLightLeftFront || pConfig->lightType == eMaterialType::IndicatorLightRightFront) targetAngle = 0.0f; else if (pConfig->lightType == eMaterialType::TailLightLeft || pConfig->lightType == eMaterialType::TailLightRight @@ -481,7 +482,7 @@ void RenderUtil::RegisterCoronaDirectional(const DummyConfig *pConfig, float ang float distMul = coronaDistMul; if (distMul < 0.0f && pConfig) { - if (pConfig->lightType == eMaterialType::HeadLightLeft || pConfig->lightType == eMaterialType::HeadLightRight) { + if (pConfig->lightType == eMaterialType::HeadLightLeft || pConfig->lightType == eMaterialType::HeadLightRight || pConfig->lightType == eMaterialType::HighBeamLeft || pConfig->lightType == eMaterialType::HighBeamRight) { distMul = gfHeadLightCoronaDistanceMul; } else if (pConfig->lightType == eMaterialType::TailLightLeft || pConfig->lightType == eMaterialType::TailLightRight || pConfig->lightType == eMaterialType::BrakeLightLeft || pConfig->lightType == eMaterialType::BrakeLightRight || @@ -503,6 +504,8 @@ static int GetShadowIntensity(eMaterialType lightType) { case eMaterialType::HeadLightLeft: case eMaterialType::HeadLightRight: + case eMaterialType::HighBeamLeft: + case eMaterialType::HighBeamRight: intensity = gnHeadLightShadowIntensity; break; case eMaterialType::TailLightLeft: @@ -541,7 +544,7 @@ void RenderUtil::RegisterShadowDirectional(const DummyConfig *pConfig, const std extern bool gbProperShadersDetected; extern bool gbLightPointLights; - if (gbProperShadersDetected && (gbLightPointLights || pConfig->lightType == eMaterialType::HeadLightLeft || pConfig->lightType == eMaterialType::HeadLightRight)) + if (gbProperShadersDetected && (gbLightPointLights || pConfig->lightType == eMaterialType::HeadLightLeft || pConfig->lightType == eMaterialType::HeadLightRight || pConfig->lightType == eMaterialType::HighBeamLeft || pConfig->lightType == eMaterialType::HighBeamRight)) { return; }