void interpolation_system::integrate_interpolated_transforms(const cosmos& cosm, const augs::delta variable_delta, const augs::delta fixed_delta_for_slowdowns) { if (!enabled) { return; } const auto seconds = variable_delta.in_seconds(); const float slowdown_multipliers_decrease = seconds / fixed_delta_for_slowdowns.in_seconds(); for (const auto e : cosm.get(processing_subjects::WITH_INTERPOLATION)) { const auto& actual = e.logic_transform(); const auto& info = e.get<components::interpolation>(); auto& integrated = get_interpolated(e); auto& cache = per_entity_cache[make_cache_id(e)]; const float considered_positional_speed = interpolation_speed / (sqrt(cache.positional_slowdown_multiplier)); const float considered_rotational_speed = interpolation_speed / (sqrt(cache.rotational_slowdown_multiplier)); if (cache.positional_slowdown_multiplier > 1.f) { cache.positional_slowdown_multiplier -= slowdown_multipliers_decrease / 4; if (cache.positional_slowdown_multiplier < 1.f) { cache.positional_slowdown_multiplier = 1.f; } } if (cache.rotational_slowdown_multiplier > 1.f) { cache.rotational_slowdown_multiplier -= slowdown_multipliers_decrease / 4; if (cache.rotational_slowdown_multiplier < 1.f) { cache.rotational_slowdown_multiplier = 1.f; } } const float positional_averaging_constant = 1.0f - static_cast<float>(pow(info.base_exponent, considered_positional_speed * seconds)); const float rotational_averaging_constant = 1.0f - static_cast<float>(pow(info.base_exponent, considered_rotational_speed * seconds)); auto& recorded_pob = cache.recorded_place_of_birth; auto& recorded_ver = cache.recorded_version; const auto& pob = info.place_of_birth; const auto& ver = e.get_id().pool.version; if (recorded_pob == pob && recorded_ver == ver) { integrated = actual.interpolated_separate(integrated, positional_averaging_constant, rotational_averaging_constant); } else { integrated = actual; recorded_pob = pob; recorded_ver = ver; } } }
short RasterBuffer::get_interpolated(unsigned lx, unsigned ly) const { // check x in range, and decompose fraction part const unsigned int ix = CombinedDivAndMod(lx); if (lx >= get_width()) return TERRAIN_INVALID; // check y in range, and decompose fraction part const unsigned int iy = CombinedDivAndMod(ly); if (ly >= get_height()) return TERRAIN_INVALID; return get_interpolated(lx, ly, ix, iy); }
void interpolation_system::integrate_interpolated_transforms( const interpolation_settings& settings, const cosmos& cosm, const augs::delta delta, const augs::delta fixed_delta_for_slowdowns ) { set_interpolation_enabled(settings.enabled); if (!enabled) { return; } const auto seconds = delta.in_seconds(); if (seconds < 0.00001f) { return; } const float slowdown_multipliers_decrease = seconds / fixed_delta_for_slowdowns.in_seconds(); cosm.for_each_having<components::interpolation>( [&](const auto e) { const auto info = e.template get<components::interpolation>(); const auto def = e.template get<invariants::interpolation>(); auto& integrated = get_interpolated(e); auto& cache = per_entity_cache[e]; const auto considered_positional_speed = settings.speed / (sqrt(cache.positional_slowdown_multiplier)); const auto considered_rotational_speed = settings.speed / (sqrt(cache.rotational_slowdown_multiplier)); if (cache.positional_slowdown_multiplier > 1.f) { cache.positional_slowdown_multiplier -= slowdown_multipliers_decrease / 4; if (cache.positional_slowdown_multiplier < 1.f) { cache.positional_slowdown_multiplier = 1.f; } } if (cache.rotational_slowdown_multiplier > 1.f) { cache.rotational_slowdown_multiplier -= slowdown_multipliers_decrease / 4; if (cache.rotational_slowdown_multiplier < 1.f) { cache.rotational_slowdown_multiplier = 1.f; } } const auto positional_averaging_constant = 1.0f - static_cast<float>(std::pow(def.base_exponent, considered_positional_speed * seconds)); const auto rotational_averaging_constant = 1.0f - static_cast<float>(std::pow(def.base_exponent, considered_rotational_speed * seconds)); auto& recorded_pob = cache.recorded_place_of_birth; auto& recorded_ver = cache.recorded_version; const auto pob = info.place_of_birth; const auto ver = e.get_id().raw.version; if (const auto actual = e.find_logic_transform()) { if (recorded_pob.compare(pob, 0.01f, 1.f) && recorded_ver == ver) { integrated = integrated.interp_separate(*actual, positional_averaging_constant, rotational_averaging_constant); } else { integrated = *actual; recorded_pob = pob; recorded_ver = ver; } } } ); }