Load engines from TOML and improve scenario audio and carb tuning
Migrate 32 engine definitions into validated startup-loaded TOML files and separate configuration and snapshots from scenario assembly. Add camera-based stereo propagation from shared pipe geometry, preserve exhaust character, tune carburetor mixtures and idle, use ignition cuts for carb engines, and support returning to the scenario menu. Validation: full Windows build and all 14 CTest checks passed.
This commit is contained in:
@@ -61,14 +61,31 @@ void Carburetor::step(float dt, float pedal, float slide, float rpm, float air_m
|
||||
const float pilot_area = circle_area(pilot_jet_diameter);
|
||||
const float main_area = circle_area(main_jet_diameter);
|
||||
const float needle_jet_area = circle_area(needle_jet_diameter);
|
||||
const float needle_lift = smoothstep((slide - 0.04f) / 0.86f);
|
||||
// Piecewise needle annulus area, interpolated continuously between configured
|
||||
// slide positions. A monotone area profile avoids artificial lean/rich holes
|
||||
// from interpolating a multiplier over a curved base taper.
|
||||
const std::array<float,10> positions{.04f,.045f,.05f,.07f,.1f,.15f,.25f,.5f,.75f,1.f};
|
||||
const std::array<float,10> scales{1.f,std::lerp(1.f,needle_low_scale,.005f/.11f),
|
||||
needle_off_idle_scale,needle_transition_scale,needle_tip_scale,needle_low_scale,needle_quarter_scale,
|
||||
needle_mid_scale,needle_upper_scale,1.f};
|
||||
float needle_lift=0;
|
||||
for(std::size_t i=1;i<positions.size();++i) {
|
||||
const float a=smoothstep((positions[i-1]-.04f)/.86f)*scales[i-1];
|
||||
const float b=smoothstep((positions[i]-.04f)/.86f)*scales[i];
|
||||
needle_lift=std::lerp(a,b,std::clamp((slide-positions[i-1])/(positions[i]-positions[i-1]),0.f,1.f));
|
||||
if(slide<=positions[i]) break;
|
||||
}
|
||||
const float needle_area = needle_jet_area * needle_lift;
|
||||
const float main_path_area = needle_area > 1e-12f ?
|
||||
1.0f / std::sqrt(1.0f / (main_area * main_area) + 1.0f / (needle_area * needle_area)) : 0.0f;
|
||||
const float pilot_depression = bowl_head_pressure + (0.62f * static_drop +
|
||||
0.25f * dynamic_pressure) * (1.0f + 0.25f * lift_enrichment_);
|
||||
const float main_depression = bowl_head_pressure + venturi_depression_;
|
||||
const float pilot_flow = pilot_discharge_coefficient * pilot_area *
|
||||
const float pilot_progression = slide<.05f ? std::lerp(1.f,pilot_transition_scale,
|
||||
std::clamp((slide-.03f)/.02f,0.f,1.f)) : slide<.1f ?
|
||||
std::lerp(pilot_transition_scale,pilot_tip_scale,(slide-.05f)/.05f) :
|
||||
std::lerp(pilot_tip_scale,1.f,std::clamp((slide-.1f)/.1f,0.f,1.f));
|
||||
const float pilot_flow = pilot_progression * pilot_discharge_coefficient * pilot_area *
|
||||
std::sqrt(2.0f * fuel_density * std::max(pilot_depression, 0.0f));
|
||||
const float main_flow = main_discharge_coefficient * main_path_area *
|
||||
std::sqrt(2.0f * fuel_density * std::max(main_depression, 0.0f));
|
||||
@@ -96,7 +113,7 @@ void Carburetor::step(float dt, float pedal, float slide, float rpm, float air_m
|
||||
const float fuel_alpha = -std::expm1(-dt / 0.025f);
|
||||
filtered_fuel_flow_ += (delivered_fuel_flow_ - filtered_fuel_flow_) * fuel_alpha;
|
||||
if (filtered_air_flow_ > 1e-7f && filtered_fuel_flow_ > 1e-9f)
|
||||
indicated_afr_ = std::clamp(filtered_air_flow_ / filtered_fuel_flow_, 4.0f, 40.0f);
|
||||
indicated_afr_ = filtered_air_flow_ / filtered_fuel_flow_;
|
||||
}
|
||||
|
||||
} // namespace fluidsim::port
|
||||
|
||||
Reference in New Issue
Block a user