From 297c72975c1426e819cf7b2a148e062d21ee01e9 Mon Sep 17 00:00:00 2001 From: Eslam Mahmoud <41547778+Wanted9811@users.noreply.github.com> Date: Fri, 28 Oct 2022 02:21:59 +0200 Subject: [PATCH] Add GLASS and HEADLIGHT_SHADOW objects support --- src/handlers/feature_handlers.cpp | 67 +++++++++++++++++++++++++------ src/modules/vehicle/carmodel.h | 35 ++++++++++++++-- 2 files changed, 87 insertions(+), 15 deletions(-) diff --git a/src/handlers/feature_handlers.cpp b/src/handlers/feature_handlers.cpp index ec88e46..e37f6c3 100644 --- a/src/handlers/feature_handlers.cpp +++ b/src/handlers/feature_handlers.cpp @@ -5581,7 +5581,27 @@ void vehCarModelFeatureHandler::DrawShadow() { } } - if (MMSTATE->TimeOfDay == 3 || MMSTATE->WeatherType != 0 || + modStatic* headlightshadow = lvlInstance::GetGeomTableEntry(geomSetIdOffset + 112)->GetHighLOD(); + + if (headlightshadow != nullptr) + { + if (model->getHeadlightsState()) + { + Matrix34 shadowMatrix; + + if (lvlInstance::ComputeShadowMatrix(&shadowMatrix, roomId, carMatrix)) + { + RSTATE->SetBlendSet(0, 0x80); + + Matrix44::Convert(gfxRenderState::sm_World, shadowMatrix); + gfxRenderState::m_Touched = gfxRenderState::m_Touched | 0x88; + + headlightshadow->Draw(shaders); + } + } + } + + if (MMSTATE->TimeOfDay == 3 || MMSTATE->WeatherType != 0 || cfgMM1StyleShadows.Get() < 3 || lvlLevel::Singleton->GetRoomInfo(model->GetRoomId())->Flags & static_cast(RoomFlags::Subterranean)) return; @@ -6298,13 +6318,11 @@ void vehCarModelFeatureHandler::Install() { } ); - if (cfgMM1StyleShadows.Get() >= 3) { - InstallVTableHook("vehCarModel::DrawShadow", - &DrawShadow, { - 0x5B2CE0, - } - ); - } + InstallVTableHook("vehCarModel::DrawShadow", + &DrawShadow, { + 0x5B2CE0, + } + ); InstallVTableHook("vehCarModel::DrawGlow", &DrawGlow, { @@ -6786,6 +6804,8 @@ bool aiVehicleInstanceFeatureHandler::InitVehicleGeom(const char* basename, cons inst->AddGeom(basename, "breaklt2", 0); inst->AddGeom(basename, "breaklt3", 0); + inst->AddGeom(basename, "glass", 0); + inst->EndGeom(); } @@ -6999,18 +7019,41 @@ void aiVehicleInstanceFeatureHandler::Draw(int lod) //draw pop-up headlights if (lod >= 2) { - modStatic* plighton = lvlInstance::GetGeomTableEntry(geomSetIdOffset + 23)->GetHighLOD(); + modStatic* plighton = lvlInstance::GetGeomTableEntry(geomSetIdOffset + 23)->GetLOD(lod); if (plighton != nullptr) { if (aiMap::Instance->drawHeadlights) - DrawPart(plighton, carMatrix, shaders, vehCarModel::PartReflections); + DrawPart(plighton, carMatrix, shaders, lod == 3); } - modStatic* plightoff = lvlInstance::GetGeomTableEntry(geomSetIdOffset + 24)->GetHighLOD(); + modStatic* plightoff = lvlInstance::GetGeomTableEntry(geomSetIdOffset + 24)->GetLOD(lod); if (plightoff != nullptr) { if (!aiMap::Instance->drawHeadlights) - DrawPart(plightoff, carMatrix, shaders, vehCarModel::PartReflections); + DrawPart(plightoff, carMatrix, shaders, lod == 3); + } + } + + //draw glass + if (lod >= 1) + { + modStatic* glass = lvlInstance::GetGeomTableEntry(geomSetIdOffset + 41)->GetLOD(lod); + if (glass != nullptr) + { + bool zWriteEnable = RSTATE->Data.ZWriteEnable; + if (RSTATE->Data.ZWriteEnable != false) + { + RSTATE->Data.ZWriteEnable = false; + gfxRenderState::m_Touched = gfxRenderState::m_Touched | 1; + } + + DrawPart(glass, carMatrix, shaders, lod == 3); + + if (RSTATE->Data.ZWriteEnable != zWriteEnable) + { + RSTATE->Data.ZWriteEnable = zWriteEnable; + gfxRenderState::m_Touched = gfxRenderState::m_Touched | 1; + } } } diff --git a/src/modules/vehicle/carmodel.h b/src/modules/vehicle/carmodel.h index 53521d8..8b171b5 100644 --- a/src/modules/vehicle/carmodel.h +++ b/src/modules/vehicle/carmodel.h @@ -561,6 +561,12 @@ namespace MM2 lvlInstance::AddGeom(basename, "breaklt2", 0); lvlInstance::AddGeom(basename, "breaklt3", 0); + lvlInstance::AddGeom(basename, "glass", 0); + + gfxForceLVERTEX = true; + lvlInstance::AddGeom(basename, "headlight_shadow", 0); + gfxForceLVERTEX = false; + //add variants //supports up to 32 paintjobs for (int i = 0; i < 32; i++) @@ -797,7 +803,7 @@ namespace MM2 InitBreakable(this->genBreakableMgr, basename, "breaklt2", 109, 5); InitBreakable(this->genBreakableMgr, basename, "breaklt3", 110, 6); - int variantGeomId = this->variant + 111; + int variantGeomId = this->variant + 113; string_buf<16> buffer("variant%d", this->variant); InitBreakable(this->genBreakableMgr, basename, buffer, variantGeomId, 0); @@ -1120,10 +1126,10 @@ namespace MM2 { if (this->HeadlightsState) //plighton - DrawPart(lod, 53, this->getCarMatrix(), shaders, vehCarModel::PartReflections); + DrawPart(lod, 53, this->getCarMatrix(), shaders, lod == 3); else //plightoff - DrawPart(lod, 54, this->getCarMatrix(), shaders, vehCarModel::PartReflections); + DrawPart(lod, 54, this->getCarMatrix(), shaders, lod == 3); } Matrix34 dummyWhl4Matrix = Matrix34(); @@ -1512,6 +1518,29 @@ namespace MM2 } } + //draw glass + if (lod >= 1) + { + auto glassModel = lvlInstance::GetGeomTableEntry(geomSetIdOffset + 111)->GetLOD(lod); + if (glassModel != nullptr) + { + bool zWriteEnable = RSTATE->Data.ZWriteEnable; + if (RSTATE->Data.ZWriteEnable != false) + { + RSTATE->Data.ZWriteEnable = false; + gfxRenderState::m_Touched = gfxRenderState::m_Touched | 1; + } + + DrawPart(lod, 111, this->getCarMatrix(), shaders, lod == 3); + + if (RSTATE->Data.ZWriteEnable != zWriteEnable) + { + RSTATE->Data.ZWriteEnable = zWriteEnable; + gfxRenderState::m_Touched = gfxRenderState::m_Touched | 1; + } + } + } + //set alpha back if requireed if (oldAlphaRef != (&RSTATE->Data)->AlphaRef) {