Files
EscapistsReintroduced/docs/native-flight-footprint.md

70 lines
4.9 KiB
Markdown

# Powered-flight fixture footprint gate
This WORKBENCH-only addition measures the existing fixture-owned stock Mi8 before
its single normal engine request. It is test safety, not production flight or HQ
support implementation. No flight gain, axis, engine, health, fuel, or actor
creation behavior is substituted.
The previous 15 m clearance column did not cover the allowed 22 m centre drift.
Even a 15 m footprint cannot be assumed from this airframe's simulation diameter:
installed `VehPart_Mi8_rotor_main_base.et` has a 12 m damage sweep radius and 1.5 m
thickness; `VehPart_Mi8_rotor_tail_base.et` has a 2.3 m sweep radius, 0.75 m
thickness, and a tail centre-of-mass authored near z=-13.6 m. Centre of mass is not
used as a substitute for the actual native bone/pivot position.
`ERR_NativeFlightFootprint.Measure` requires the exact unarmed transport resource,
a valid native simulation, exactly two simulation rotors, and one actual damage
sweep for each rotor. It traverses the actual entity hierarchy iteratively, with
limits of 256 entities, 16 levels and 512 unique hitzones; cycles, incomplete
enumeration, absent sweeps and invalid/non-finite extents fail closed. Every
renderable root/child model contributes all eight corners of its native world
bounding box. Their greatest distance from the physics origin encloses that
assembled hierarchy under any rigid orientation of the whole airframe.
Each real damage sweep contributes its native `PointInfo.GetWorldTransform`
pivot and public `GetRotorRadius`. Its known stock thickness is included; there
is no public thickness getter. The exact stock resource and expected public
radii are checked. The world transform's Frobenius norm bounds stretching even
without assuming an orthonormal basis. Distance to pivot plus transformed
radius plus transformed thickness conservatively encloses the full one-sided
rotor cylinder, including every rotor rotation. Native simulation rotor local
pivots and radii independently contribute another bound. The maximum of model,
damage-sweep and simulation bounds is the final measured sphere radius.
The pad's cylinder check and swept box now have 40 m horizontal radius/half-width;
the swept-box top moves from 35 to 60 m to contain the conservative sphere at the
existing maximum flight height. The unchanged 208 coarse/refinement candidates,
0.8 m terrain-height variation limit, and native collision rejection remain.
The drift abort tightens to 8 m. Qualification requires measured radius plus
initial settled drift from the selected pad plus 8 m travel plus 1 m margin to
fit inside 40 m; the measured radius must also be below 32 m. Initial height plus
18 m flight height plus radius plus 1 m must fit below 60 m. Thus an assumed
15 m footprint is never certified. Both engine-off state and actual qualification
are required before engine start. Home telemetry is then based on the measured
physics origin; no transform is changed.
## Limits and evidence
This is a bound on the measured assembled models and complete rotor envelopes,
independent of whole-aircraft yaw/pitch/roll and rotor rotation. It does not
certify future deformation, detached debris or other scene actors moving into
the corridor. No such condition is turned into successful flight evidence.
The native `TraceCilinderUtil` is only four diagonal traces, not a filled-volume
cylinder sweep. The actual `TraceBox` with ENTS|WORLD supplies the filled-volume
check from pad height2 m upwards. Near-ground terrain/objects below that height
retain the pre-existing slope/contact/diagonal-query limitations; this helper
does not claim comprehensive terrain or dynamic obstacle avoidance. Enlarging
the box can legitimately cause more pad refusals. Do not shrink the measured
bound, loosen the gate, or reuse a best-effort candidate to obtain a pass.
Four new local geometry/source tests pass, as do the existing four flight policy
tests and the 208-candidate pad geometry check. These execute extracted rule
bodies as C++ and verify source invariants. Native helper compilation, actual
hierarchy/hitzone enumeration, real footprint measurements and any powered flight
remain unverified until the parent runs the targeted native fixture.
## Coordinate correction after 100422
The measured center/basis now comes from the actual aircraft entity's `GetWorldTransform`, in the same world space as model bounds and damage-sweep PointInfo pivots. The simulation method documents internal physics space and returned identity/origin zero in 100422 despite physical placement at the airport. Using that return as a world center would correctly make the old guard refuse wildly separated bounds, but would measure incompatible coordinate spaces. The correction changes the read API, never the entity, and retains every footprint/clearance bound. Native simulation rotor transforms remain local as their API documents. Qualification of the complete measured envelope still awaits the next native run.