Sikorsky S-58ET corresponding source — GTLA, 2026-09-20

Covers the three GLB files published for one helicopter:
  N58AH  Sikorsky S-58ET   https://gtla.live/models/n58ah-s58et.glb (and -hd, and /mobile/)

WHERE THE SHAPE CAME FROM
The FlightGear Sikorsky S-58:
https://mirrors.ibiblio.org/flightgear/ftp/Aircraft-trunk/Sikorsky-S58.zip
(downloaded 2026-09-19; SHA-256 of that zip
a6c96d89b345f61e32036afd7afc137b830dc3df203c0de342282bbb34c58b70). We use three
files from it: the outside of the aircraft (Models/s58.ac) and the main and
tail rotor hubs (Models/Externals/MainRotor/mainrotor.ac and
Models/Externals/TailRotor/tailrotor.ac).

WHO MADE IT
The authors listed in the aircraft's own s58-set.xml (included):
  BARANGER Emmanuel (3D/FDM), Reagan Thomas, Maik Justus (FDM),
  Slowmans (instruments/FDM).
Its Read-Me.txt (included) also thanks Heiko Schulz for flight-model work.
The 3D model this build uses is Emmanuel Baranger's. We checked the three
files the build reads for parts taken from other aircraft (texture paths into
other aircraft folders, and point-for-point mesh comparison against
FlightGear's Bell 206 and about 900 model files from 12 other FlightGear
aircraft) and found none.

LICENCE
GNU General Public License version 2. The aircraft's COPYING file is the
unmodified FSF version 2 text, and none of the aircraft files grants "or any
later version" (only a shared rain-effect file, Systems/glass-rain.xml, does;
this build does not use it). So we distribute under version 2. See COPYING.
GTLA's changes are distributed on the same terms. No warranty. Aircraft names
and registrations identify the depicted aircraft and imply no endorsement by
the operator, the manufacturer or the upstream authors.

WHAT GTLA CHANGED
A data-only import of the outside model and rotor hubs (no simulator scripts
are run). The piston S-58's nose, low exhaust and grille were reshaped into a
turbine S-58ET nose with twin exhaust outlets; the fuselage nose was rebuilt as
one continuous surface and the glazing fitted to it; cabin ladders and wipers
were added. New level four-blade main and four-blade tail rotors at the
published sizes, a tail strobe, and a spinning-rotor animation. The ARIS navy
paint, arrow mark, registration and "Big Dawg" lettering were drawn from a
dated photo.

LAYOUT. Paths are the ones the scripts expect, relative to this folder:
  outputs/Agusta-S58-refresh/source/Sikorsky-S58/   the upstream files: the
      three models above, COPYING, Read-Me.txt, SlowmansREADME.txt and
      s58-set.xml, unmodified
  outputs/Agusta-S58-refresh/*.py, *.mjs           our scripts:
      ac_reader.py  reads AC3D files as data
      probe.py      imports the upstream model into S58-probe.blend
      paint.py      draws the two livery textures
      build.py      builds the aircraft in Blender and writes raw.glb
      finalize.mjs  adds the animation, sizes textures, simplifies, compresses,
                    validates and writes the standard, mobile and HD files
      verify.mjs    checks rotors, blade counts, animation and identity
      package-source.py  wrote this archive
  outputs/Agusta-S58-refresh/S58-inventory.json   list of the upstream model's
      parts with the numbers build.py uses to keep, drop or reshape them
  outputs/Agusta-S58-refresh/aircraft/N58AH/
      config.json, wiring.json, geometry-build.json   build settings and records
          (config.json and wiring.json with GTLA's internal review notes
          removed; see NOTES)
      references/faa-n58ah.txt   the FAA registry record build.py and
                                 finalize.mjs check by SHA-256
      textures/port.png, starboard.png   the livery textures we drew
  data/rotorcraft-roster.json   only this aircraft's row from GTLA's aircraft
      list, so verify.mjs can check the Mode S code. Not a build input.

REBUILD. Tools used: Blender 5.2, Python 3 with Pillow, Node 22 or later. From
this folder, run `npm install` first. Then:
  1. Textures (optional; the finished ones are included):
       python3 outputs/Agusta-S58-refresh/paint.py N58AH
  2. Import the upstream model. probe.py converts two families in one run and
     this archive carries only the S-58, so first delete this entry from the
     list at the start of its loop (line 5):
       ('Agusta',R/'source/AW109-master/Models/AW-109 xtended.ac',(-4,2)),
     then run:
       blender -b --python outputs/Agusta-S58-refresh/probe.py
     It writes S58-probe.blend.
  3. Build:
       blender -b --python outputs/Agusta-S58-refresh/build.py -- N58AH
  4. Finish and validate the three sizes:
       node outputs/Agusta-S58-refresh/finalize.mjs N58AH
  5. Check (optional):
       node outputs/Agusta-S58-refresh/verify.mjs
The GLBs land in outputs/Agusta-S58-refresh/aircraft/N58AH/exports/.

FONT. paint.py loads Arial, Arial Bold and Arial Bold Italic from
/System/Library/Fonts/Supplemental/ — proprietary macOS fonts that are not
redistributed here. Point those three names at any fonts you have, or skip
step 1 and use the textures already provided.

NOTES FOR ANYONE EDITING
  - The credit and licence text a rebuild writes into each GLB come from
    config.json (sourceCopyright, sourceAuthor, sourceLicense). They say
    "Emmanuel Baranger and FlightGear contributors", "GPL v2" and "GPL-2.0",
    matching LICENCE above. The published N58AH files were built before that
    line was corrected, so the unstamped build still says "GPL-2.0-or-later";
    GTLA's publishing step corrects it in the served copies, and a rebuild
    writes the right text.
  - GTLA's internal review notes were removed from the config.json and
    wiring.json copies in this archive: who signed off, whether public release
    was approved, the review status and the "local review build" note. No
    script reads them, so the build inputs are unchanged.
  - build.py and finalize.mjs refuse to run if the FAA record's SHA-256 no
    longer matches config.json.
  - Not needed to rebuild, so not included: prepare.py and report.py (they
    write identity paperwork and review reports from GTLA's private data and
    the reference photo), the reference photograph, the fonts, Blender .blend
    files (build.py writes them; nothing reads them), raw and rollback exports,
    the downloaded upstream zip, renders and logs, and the parts of the
    upstream aircraft this build does not read (interior, cockpit, AI model,
    blades, lights, textures, Nasal, sounds, systems).

REPRODUCIBILITY. Checked on 2026-09-20 by unpacking this archive into an
empty folder and running steps 1 to 5 there (Blender 5.2.0, Node 24):
  - paint.py redraws both textures byte-for-byte.
  - raw.glb has identical geometry, materials, textures and animation, but
    Blender writes the rebuilt nose's triangles in a different order from run
    to run (two runs on the same inputs differ in the same way).
  - HD: identical geometry, materials, textures and animation.
  - Standard and mobile: the simplifier's choices depend on that order, so a
    rebuild can differ from the published files by a few triangles (1 of about
    28,500 and 3 of about 25,100 in our check). finalize.mjs itself is exact:
    given the same raw.glb it reproduces the published build byte-for-byte.

THE PUBLISHED FILES are not duplicated here. SHA256SUMS-published.txt lists
the SHA-256 of each file as served. The served copies differ from a fresh
build only in the glTF JSON's asset block, where GTLA's publishing step
corrects the licence line and adds attribution and a link to this archive.
Geometry, textures and animation (the binary chunk) are byte-identical to the
build, and that file lists the binary chunk's SHA-256 too.
