AgustaWestland A109E and A119 corresponding source — GTLA, 2026-09-20

Covers the six GLB files published for two helicopters:
  N435AK  Agusta A109E   https://gtla.live/models/n435ak-a109e.glb (and -hd, and /mobile/)
  N119WG  Agusta A119    https://gtla.live/models/n119wg-a119.glb  (and -hd, and /mobile/)

WHERE THE SHAPE CAME FROM
FlightGear Brasil's AgustaWestland AW109 for the FlightGear flight simulator:
https://github.com/flightgearbrasil/AW109 , commit 45c4e5fb48842dfa01ece2114e09a4e02e05de46
(2020-03-17, the head of its master branch; downloaded 2026-09-19). We use one
file from it, the outside of the aircraft: Models/AW-109 xtended.ac, without its
rotor hub (see THE ROTOR HUBS ARE GTLA'S).

WHO MADE IT
The saved files name no author, so we read the repository's history on GitHub
(2026-09-20, through GitHub's commit and contributor listings):
  - The 3D model was made by KAITO. The commit that added it (518d3c4,
    2020-02-16) is titled "Add 3d model files made by Kaito". The FlightGear
    project's April 2020 newsletter, under "Aircraft models given to
    Flightgear by KAITO", lists the AgustaWestland AW109 among the models
    KAITO released for the project to use.
  - Every commit in the repository (nine) is by Renan, GitHub user RenanMsV,
    of FlightGear Brasil, the only listed contributor. He reworked the outside
    model twice (e901b85, 2020-02-20: passenger seats, landing light, open
    landing-gear bay, optimisation; 7c91dee, 2020-02-21: fuselage details) and
    added the licence (45c4e5f, 2020-03-17). The file here is byte-for-byte
    the 7c91dee version (Git blob 56e34cc024945ef9bb66f6bd783b5b885853a389).
Credit: KAITO (original model) and Renan (RenanMsV), FlightGear Brasil; GPL-3.0.
The rotor hubs, rotor blades and paint in the published files are GTLA's.

THE ROTOR HUBS ARE GTLA'S
The upstream file's rotor hub is not KAITO's or Renan's work. Its 20 hub parts
(the objects named axe, mainrotor1 to mainrotor4, tailrotor1 and tailrotor2)
came from other FlightGear aircraft:
  - 16 are copies (moved, mirrored or stretched) of the main and tail rotor
    hub of FlightGear's Bell 206, whose authors are Mojo and StuartC and whose
    licence is GPL version 2 only. We matched them point for point against the
    Bell 206's Models/MainRotor/mainrotor.ac, blade.ac and
    Models/TailRotor/tailrotor.ac.
  - 3 more name texture files in FlightGear's Bell 407 folder, and the last
    one belongs to the same hub group.
Version-2-only material cannot be passed on under version 3, so the build
leaves all 20 out (build.py, BELL_HUB) and draws its own hubs from plain
turned shapes (build.py, agusta_hubs): a mast, swashplate, pitch links, four
blade grips and a cap on the main rotor, and a drive shaft, pitch plate,
barrel and two grips on the tail rotor. The upstream rotor blades, also Bell
206 copies, are not used either; GTLA's own blades replace them. Nothing from the Bell 206 or Bell 407
is in the published files. We checked every other part the build keeps the
same way (against the Bell 206 and about 900 model files from 12 other
FlightGear aircraft): no copies, and no texture paths into other aircraft
folders.

LICENCE
GNU General Public License version 3. The repository ships the version 3 text
(LICENSE, the current FSF wording) and says nothing about later versions, so we
distribute under version 3. See COPYING (the same text). 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 operators, the
manufacturers or the upstream authors.

WHAT GTLA CHANGED
A data-only import of the outside model (no simulator scripts are run). For
N435AK: the Helinet white, navy and silver paint, drawn from a dated photo,
new level four-blade main and two-blade tail rotors at the certified sizes
with GTLA's own rotor hubs, a tail strobe, smoked glazing and a spinning-rotor animation. For N119WG, the
same plus an A119 conversion: skids, a single-engine cowling with exhausts and
louvers, and the High Performance Helicopters black-and-white paint. On
2026-09-19 we removed a floating pilot-door outline (build.py) and two
duplicate painted door rectangles (paint.py); that is the door correction.
On 2026-09-20 we removed the upstream rotor-hub parts and drew our own hubs
(build.py), as described above.

LAYOUT. Paths are the ones the scripts expect, relative to this folder:
  outputs/Agusta-S58-refresh/source/AW109-master/   the upstream files: the
      outside model, LICENSE and README.md, unmodified
  outputs/Agusta-S58-refresh/*.py, *.mjs           our scripts:
      ac_reader.py  reads AC3D files as data
      probe.py      imports the upstream model into Agusta-probe.blend
      paint.py      draws the two livery textures for each aircraft
      build.py      builds each 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/Agusta-inventory.json   list of the upstream model's
      parts with the numbers build.py uses to keep, drop or recolour them
  outputs/Agusta-S58-refresh/aircraft/<TAIL>/
      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-<tail>.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 these two aircraft's rows 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 N435AK N119WG
  2. Import the upstream model:
       blender -b --python outputs/Agusta-S58-refresh/probe.py
     It writes Agusta-probe.blend, then stops with a "No such file" error for the
     S-58 model. That is expected: the S-58 has its own archive.
  3. Build:
       blender -b --python outputs/Agusta-S58-refresh/build.py -- N435AK N119WG
  4. Finish and validate the three sizes:
       node outputs/Agusta-S58-refresh/finalize.mjs N435AK N119WG
  5. Check (optional):
       node outputs/Agusta-S58-refresh/verify.mjs
The GLBs land in outputs/Agusta-S58-refresh/aircraft/<TAIL>/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
    "KAITO (original model) and Renan (RenanMsV), FlightGear Brasil" and
    "GPL-3.0", the same credit as "WHO MADE IT" above.
  - 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 photos), the reference photographs, 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 (the interior model, textures
    and splash images).

REPRODUCIBILITY. Checked on 2026-09-20, after the rotor hub change, by
unpacking this archive into an empty folder and running steps 1 to 5 there
(Blender 5.2.0, Node 24):
  - paint.py redraws all four textures byte-for-byte, and geometry-build.json
    comes out byte-for-byte the same.
  - Both aircraft, all three sizes: geometry, materials, textures and
    animation are identical to the published files.
  - The files themselves differed by 64 to 80 bytes, all in one place:
    Blender writes the tail strobe's triangles in a different order from run
    to run, which changes that one compressed part. 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 adds
attribution, the licence 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.
