diff --git a/rendering/opengl33renderer.cpp b/rendering/opengl33renderer.cpp index 5419bbcd..b9937816 100644 --- a/rendering/opengl33renderer.cpp +++ b/rendering/opengl33renderer.cpp @@ -3730,7 +3730,9 @@ void opengl33_renderer::Render(TSubModel *Submodel) case rendermode::shadows: { // skip if the shadow caster rank is too low for currently set threshold - if( Material( Submodel ).shadow_rank > Global.gfx_shadow_rank_cutoff ) + // or if the submodel is hidden (colour pass only fades it out, e.g. inactive seasonal variant) + if( ( Material( Submodel ).shadow_rank > Global.gfx_shadow_rank_cutoff ) + || ( Submodel->fVisible <= 0.f ) ) { --m_renderpass.draw_stats.submodels; --m_renderpass.draw_stats.drawcalls; @@ -4630,7 +4632,9 @@ void opengl33_renderer::Render_Alpha(TSubModel *Submodel) case rendermode::shadows: { // skip if the shadow caster rank is too low for currently set threshold - if( Material( Submodel ).shadow_rank > Global.gfx_shadow_rank_cutoff ) + // or if the submodel is hidden (colour pass only fades it out, e.g. inactive seasonal variant) + if( ( Material( Submodel ).shadow_rank > Global.gfx_shadow_rank_cutoff ) + || ( Submodel->fVisible <= 0.f ) ) { --m_renderpass.draw_stats.submodels; --m_renderpass.draw_stats.drawcalls; diff --git a/rendering/openglrenderer.cpp b/rendering/openglrenderer.cpp index 1da66ba5..6f06e9b3 100644 --- a/rendering/openglrenderer.cpp +++ b/rendering/openglrenderer.cpp @@ -2863,7 +2863,9 @@ opengl_renderer::Render( TSubModel *Submodel ) { } case rendermode::shadows: { // skip if the shadow caster rank is too low for currently set threshold - if( Material( Submodel ).shadow_rank > Global.gfx_shadow_rank_cutoff ) + // or if the submodel is hidden (colour pass only fades it out, e.g. inactive seasonal variant) + if( ( Material( Submodel ).shadow_rank > Global.gfx_shadow_rank_cutoff ) + || ( Submodel->fVisible <= 0.f ) ) { --m_renderpass.draw_stats.submodels; --m_renderpass.draw_stats.drawcalls; diff --git a/vehicle/DynObj.cpp b/vehicle/DynObj.cpp index 57cc8660..873cc4d3 100644 --- a/vehicle/DynObj.cpp +++ b/vehicle/DynObj.cpp @@ -800,6 +800,19 @@ TDynamicObject::set_cab_lights( int const Cab, float const Level ) { } } +// aktualizujemy submodele w zaleznosci od aktualnej pory roku +void TDynamicObject::on_season_update() +{ + if (sm_winter_variant != nullptr) // pokazujemy wariant zimowy + sm_winter_variant->SetVisibilityLevel(Global.Season == "winter:" ? 1 : 0, true, false); + if (sm_spring_variant != nullptr) // pokazujemy wariant wiosenny + sm_spring_variant->SetVisibilityLevel(Global.Season == "spring:" ? 1 : 0, true, false); + if (sm_summer_variant != nullptr) // pokazujemy wariant letni + sm_summer_variant->SetVisibilityLevel(Global.Season == "summer:" ? 1 : 0, true, false); + if (sm_autumn_variant != nullptr) // pokazujemy wariant jesienny + sm_autumn_variant->SetVisibilityLevel(Global.Season == "autumn:" ? 1 : 0, true, false); +} + // ABu 29.01.05 przeklejone z render i renderalpha: ********************* void TDynamicObject::ABuLittleUpdate(double ObjSqrDist) { // ABu290105: pozbierane i uporzadkowane powtarzajace @@ -814,6 +827,10 @@ void TDynamicObject::ABuLittleUpdate(double ObjSqrDist) if (vFloor.z > 0.0) mdLoad->GetSMRoot()->SetTranslate(modelShake + vFloor); + // model jest współdzielony przez pojazdy, a pora roku może się zmienić w trakcie symulacji + if (Global.UpdateMaterials) + on_season_update(); + if (ObjSqrDist < 400 * 400 ) // gdy bliżej niż 400m { for( auto &animation : pAnimations ) { @@ -2493,6 +2510,10 @@ TDynamicObject::Init(std::string Name, // nazwa pojazdu, np. "EU07-424" smBogie[0]->WillBeAnimated(); if (smBogie[1]) smBogie[1]->WillBeAnimated(); + sm_winter_variant = mdModel->GetFromName("winter_variant"); + sm_spring_variant = mdModel->GetFromName("spring_variant"); + sm_summer_variant = mdModel->GetFromName("summer_variant"); + sm_autumn_variant = mdModel->GetFromName("autumn_variant"); } // ABu: zainicjowanie zmiennej, zeby nic sie nie ruszylo w pierwszej klatce, // potem juz liczona prawidlowa wartosc masy diff --git a/vehicle/DynObj.h b/vehicle/DynObj.h index c48e40e1..36335a32 100644 --- a/vehicle/DynObj.h +++ b/vehicle/DynObj.h @@ -310,6 +310,10 @@ private: TSubModel *smWahacze[4]; // wahacze (np. nogi, dźwignia w drezynie) TSubModel *smBrakeMode; // Ra 15-01: nastawa hamulca też TSubModel *smLoadMode; // Ra 15-01: nastawa próżny/ładowny + TSubModel *sm_winter_variant {}; // submodel zimowego wariantu + TSubModel *sm_spring_variant {}; // submodel wiosennego wariantu + TSubModel *sm_summer_variant {}; // submodel letniego wariantu + TSubModel *sm_autumn_variant {}; // submodel jesiennego wariantu double fWahaczeAmp; // Winger 160204 - pantografy double pantspeedfactor; @@ -462,6 +466,7 @@ private: void ABuLittleUpdate(double ObjSqrDist); void ABuBogies(); void ABuModelRoll(); + void on_season_update(); void TurnOff(); // update state of load exchange operation void update_exchange( double const Deltatime );