17
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-11-08 10:31:01 +01:00

Merge pull request #257 from MaSzyna-EU07/fix/vehicle-removal-smoke

fix(gfx): a vehicle taken off the tracks stops smoking (#90)
This commit is contained in:
2026-11-07 13:28:31 +00:00
committed by GitHub
6 changed files with 188 additions and 46 deletions

85
tests/unit/test_smoke.cpp Normal file
View File

@@ -0,0 +1,85 @@
#include "stdafx.h"
#include "doctest.h"
#include "vehicle.h"
#include "vehicle/smoke.h"
// the smoke of a vehicle's engine: how many particles the smoke source of the vehicle's model spawns in an update
namespace {
// a source of 20 particles per second, with room for 100
smoke::spawn_rate const source{0.f, 20.f, 1.f, 100.f};
double const update{0.1}; // s
// a diesel at work, its engine in the state of one of the cases below
test::vehicle diesel() {
test::vehicle vehicle{test::definition::load("wagon")};
vehicle->MainCtrlPosNo = 1;
vehicle->DElist[1].RPM = 1500.0;
vehicle->enrot = 300.0;
vehicle->EnginePower = 400.0;
return vehicle;
}
} // namespace
TEST_CASE("smoke: a vehicle taken off the tracks puffs no more (#90)") {
auto vehicle{diesel()};
SUBCASE("engine starting") { vehicle->dizel_spinup = true; }
SUBCASE("engine idling") { vehicle->DirAbsolute = 0; }
SUBCASE("engine under load") {
vehicle->DirAbsolute = 1;
vehicle->Im = 400.0;
}
// on the tracks the engine puffs
REQUIRE(smoke::vehicle_spawn_count(vehicle.mover(), true, source, update) >= 1.f);
// gone through a portal, the pending particles are dropped too
auto pending{source};
pending.pending = 5.f;
CHECK(smoke::vehicle_spawn_count(vehicle.mover(), false, pending, update) == 0.f);
}
TEST_CASE("smoke: a road vehicle back on the road from the pool puffs again") {
auto vehicle{diesel()};
// waiting in the pool, the count stays at zero update after update
auto rate{source};
for (auto i{0}; i < 10; ++i) {
rate.pending = smoke::vehicle_spawn_count(vehicle.mover(), false, rate, update);
}
REQUIRE(rate.pending == 0.f);
CHECK(smoke::vehicle_spawn_count(vehicle.mover(), true, rate, update) >= 1.f);
}
TEST_CASE("smoke: the engine adds to the steady rate of the source") {
auto vehicle{diesel()};
vehicle->DirAbsolute = 0;
auto const steady{source.rate * update}; // the rate of a source of the scenery
vehicle->EnginePower = 0.0;
CHECK(smoke::vehicle_spawn_count(vehicle.mover(), true, source, update) == doctest::Approx(steady));
vehicle->EnginePower = 400.0;
auto const working{smoke::vehicle_spawn_count(vehicle.mover(), true, source, update)};
CHECK(working > steady);
// the faster the starting engine turns, the more it puffs
vehicle->dizel_spinup = true;
vehicle->enrot = 100.0;
auto const slow{smoke::vehicle_spawn_count(vehicle.mover(), true, source, update)};
vehicle->enrot = 400.0;
CHECK(smoke::vehicle_spawn_count(vehicle.mover(), true, source, update) > slow);
}
TEST_CASE("smoke: the pending particles never outgrow the room of the source") {
auto vehicle{diesel()};
vehicle->dizel_spinup = true;
vehicle->enrot = 100000.0;
auto rate{source};
rate.pending = 99.f;
CHECK(smoke::vehicle_spawn_count(vehicle.mover(), true, rate, 10.0) == rate.limit);
}