`docs/BOURBON_SYNC.md`, beside the existing `UPSTREAM_SYNC.md`: what
tripleslash/benilla-bourbon is, measured rather than read off its README, and
the three things that decide what can be taken from it.
* It is published as **one squash commit** — one branch, no tags, 1,662 files
and 1,139,563 insertions in `b91c12e5` on samwhosung's `359eff416`. There is
no per-change history, so a pick is the whole fork or nothing.
* Its renderer is a **Bevy 0.18 -> 0.19 engine move**, not a file copy. Bevy
0.19 made the render graph systems: bourbon has 0 files implementing a
`Node` and this tree has 14, ten of them our own graphics. samwhosung is on
0.18.1/wgpu 27 at both that base and his head, so the move is bourbon's own
and lives inside the squash.
* Its Turtle WoW 1.18.1 support is **web-only** in its own tree, and this
chain is Turtle-derived rather than Turtle: no `patch-T`, instead
`patch-1`..`patch-5` and `patch-A`..`patch-Q`. The content and protocol
fixes inside that programme are the portable part; the layer switch cannot
fire here.
Also the file-set split (339 files only ours, 1,374 only theirs), what each side
holds that the other has no answer for — bourbon has no SuperWoW, nampower,
ClassicAPI, UnitXP_SP3, VanillaUtils or VanillaHelpers surface at all — the four
fixes this sync landed with the numbers measured over this install's chain, the
thirteen things refused with a reason each, and the three shapes a renderer take
could have, with their costs.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SgstFWtn1RxEJ5kVrpgYwn
11 KiB
Bourbon sync — tripleslash/benilla-bourbon
benilla-bourbon is a sibling fork, not an ancestor: it descends from samwhosung/benilla as this tree does, by way of its own work rather than the Everwood graphics fork. It is not a configured remote; fetch it by URL into its own ref namespace:
git fetch --no-tags https://github.com/tripleslash/benilla-bourbon.git 'refs/heads/*:refs/bourbon/*'
docs/UPSTREAM_SYNC.md covers the other direction, samwhosung's own main.
What it is, measured
Measured 2026-10-26 at bourbon b91c12e5.
The published repository has one branch, no tags, and the fork's entire work in a single squash
commit (b91c12e5, "benilla-bourbon: the fork's work on top of upstream benilla") sitting on
samwhosung's 359eff416. There is no per-change history to walk, so nothing can be cherry-picked
from it: a pick is the whole fork or nothing.
| merge base with this tree | 2af91704 (2026-10-12), the same base as our upstream sync |
| bourbon since that base | 290 — 289 of samwhosung's, then the one squash |
| ours since that base | 1013 |
| the squash commit | 1,662 files, 1,139,563 insertions, 14,733 deletions |
| files a full merge conflicts in | 685 (348 benilla-app, 218 benilla-ui, 44 benilla-world, 26 benilla-formats, 21 benilla-protocol, 11 benilla-assets) |
| its base against samwhosung's head | 60 commits behind 6354cd98, so it does not carry the Linux-audio or dismount-crash fixes this tree picked |
Where the squash's lines are:
| Area | Added | Files |
|---|---|---|
third_party/ (vendored wgpu 29, five Bevy crates, pfQuest) |
1,019,610 | 633 |
crates/benilla-world (the renderer) |
53,749 | 203 |
crates/benilla-app |
24,934 | 422 |
crates/benilla-ui |
6,602 | 206 |
crates/benilla-formats |
6,438 | 49 |
web/ + crates/wenilla* + crates/benilla-pack* (the browser build) |
12,714 | 49 |
crates/benilla-assets |
5,579 | 23 |
| docs, scripts, CI, root | 8,320 | 42 |
The exported folder benilla-bourbon-main/ beside this checkout was verified byte-identical to
that commit's tree (git archive | diff -r --brief: zero differences).
The renderer is an engine move, not a file copy
This is the thing to understand before any of it is planned.
| this tree | bourbon | |
|---|---|---|
| Bevy | 0.18.1 | 0.19.1 |
| wgpu | 27 (registry) | 29.0.4, vendored and patched |
| vendored Bevy crates | none | bevy_ecs, bevy_render, bevy_tasks, bevy_platform, bevy_winit |
files implementing a render-graph Node |
14 (40 ViewNode references, 14 add_render_graph_node calls) |
0 |
samwhosung's main is on Bevy 0.18.1 and wgpu 27 at both 359eff416 and his head 6354cd98, so
the 0.19.1 move is bourbon's own and lives inside that one squash commit.
Bevy 0.19 made the render graph systems: bourbon's passes are add_systems(Render, …) ordered
by RenderSystems::*, and it has no Node implementation anywhere. Ours are graph nodes. The two
renderers are written against incompatible architectures, so taking bourbon's means moving this
tree to Bevy 0.19.1 and converting the 14 node files — of which 10 are our own graphics
(post/bloom, post/grading, post/sun_shafts, ssao, volumetric_fog, volumetric_light,
opaque2d, liquid/scene_depth, static_gx/torch_depth, ui_gamma) and 4 are shared or
instruments (ffx_glow, static_gx/render, capture/depth_probe, perf/gpu).
Bourbon's own crates/benilla-world/src/modern/HOOKS.md records that the modern lighting model
did run on Bevy 0.18 behind a workaround (modern::tick_heal, for a PostUpdate specialization
panic that 0.19 removed), so it is not inherently 0.19-only — but the published tree is the 0.19
state and there is no earlier snapshot to take, since the repository has one branch and one commit.
The vendored libraries are mostly not a native requirement: the wgpu patch is "WebGPU backend
only", and bevy_tasks/bevy_platform/async-executor/event-listener/parking/web-task are
all browser threading. bevy_render mixes browser work with a few general changes
(RenderAsset::DEFERRABLE, Skip cameras keeping their view attachments, mesh slabs destroyed when
let go).
Turtle WoW 1.18.1 does not apply to this install
Bourbon's 1.18.1 support switches the client onto a Turtle data layer when a realm advertises the version tag. Two measurements say it cannot fire here:
- It is web-only.
benilla_formats::layers::turtle_available()is false on native in bourbon's own tree;flavor::playable()refuses a Turtle realm there, andflavor::turtle()is documented "Always false on native, which has no layer." The layer is a/data-turtlecontainer the browser build streams. - This chain is not Turtle's. OctoWoW ships no
patch-T; it shipspatch-1…patch-5andpatch-A…patch-Qof its own. It is Turtle-derived, not Turtle.
What is worth having out of that programme is the content and protocol fixes inside it, which
are not gated on the layer. Four of those landed (below); the rest are either already in this tree
or welded to upstream's deferred→inline campaign, the same wall docs/UPSTREAM_SYNC.md describes.
What each tree holds that the other does not
File sets, taken at 44c0b126 before this sync's own commits: ours 1,955 tracked files, bourbon's
2,990; 1,616 shared, 339 only ours, 1,374 only theirs.
Only ours, and nothing in bourbon answers for it:
- the whole addon-compat layer —
crates/benilla-ui/src/script/compat/is 63 files, 58 of them ClassicAPI namespaces, plussuperwow.rs,unitxp.rs,nampower.rsandvanilla_helpers.rs. Bourbon has no SuperWoW, nampower, ClassicAPI, UnitXP_SP3, VanillaUtils or VanillaHelpers surface at all — not one mention outside an unrelatedUnitXP(the stock XP getter). Seedocs/ADDON_COMPAT.md. - the login programme this realm needs:
autologin.rs,credential.rs,challenges.rs, and thechar_create/,char_select/,realm_select/,login/andglue/screens. - the nampower cast queue:
spell/np_press.rs,spell/queue.rs. - the instruments:
ui_script/{chunk_cache,cost_report,flash_trace,spell_rec,unit_rec}.rs,script/{verb,tick,event,raise}_prof.rs,gpu_errors.rs,world/sys_timing.rs. - the reference tables under
reference/(1.12-shapes.tsv, the event and global catalogs) and the generators that build them. - this fork's own graphics: 18 files in
benilla-world, ~30 inbenilla-app, sixbenilla-assetsshaders, fivebenilla-formatsmodules, andOptional/sky-and-grading/.
Only theirs is the renderer, the browser build, the vendored libraries, the BENPACK container and the Turtle layer.
Bourbon's FORK.md credits pkuzic's Everwood graphics fork for foliage wind, rain on surfaces,
lava light, the sky gradient, the preset ladder and the lamp-halo technique, and "the benilla-twow
and benilla-octo forks" for Turtle WoW fixes — so part of this fork's line is already inside it.
What landed
Each was measured against this install's own Data/ chain before and after, independently of the
reader being changed.
| Fix | Measured here |
|---|---|
| An encrypted or single-unit MPQ entry reads | 6 encrypted (listfile)s and 2 encrypted content files; Patch-Q.mpq's 93 single-unit files, 92 of them ITEM\TextureComponents\ armour art that is the winning copy |
| A BLP level past the file ends the chain | 316 copies declare one; 34 within the mip count; all 34 shadowed today, so nothing decodes differently — the layering stops being load-bearing |
| A group WMO's MOGP runs to EOF | 7 of 7,795 group files parsed to an empty group, now 0: six Shadowmoon Slagpit groups and a Westfall house, all winning copies |
| A creature-skin record fills its slot only where it holds a path | 26 records in 17 models bake a real .blp (the Crab, Scorpion, Crocodile, Thunder Lizard and RavenLord mounts, the WC2 Death Knight, the Wizard Frog…); 55 more carry unprintable leftovers, all in shadowed copies |
The single-unit half of the first is this tree's own: bourbon still refuses those.
What was refused, and why
| Taken from bourbon | Why not |
|---|---|
the MPQ nameless read (entries, read_block, name_key, is_encrypted) |
exists for its BENPACK container builder; this tree has no counterpart, so it would be dead API |
benilla_blp::dimensions |
the same — a packer and HD-upscale helper |
ADT MODF placement bounds |
its only consumer is the provisional-collider streamer (terrain_stream::provisional), which this tree does not have |
M2 tex_coords2 + stage_coord's UV-set-1 path |
needs a second UV attribute through the model pipeline and its shaders. Real, and it fixes the OctoWoW HD pack's UI_MainMenu.m2 pillar swirls — but it is renderer work, so it belongs to the renderer decision |
M2 texture_unit_lookup_past |
parsed but never read, even by bourbon's own stage_coord, which answers Some(stage) past the table |
Billboard::carriers |
part of the rigged-billboard programme (0x714260), which is renderer work |
m2_ready, redress_body_atlas, the BodyAtlas::Pending lane |
browser build: a synchronous read on the page thread is the thing they exist to avoid |
benilla-protocol/src/auth.rs |
almost entirely the async/ReadExactAsync conversion for WebSocket login |
the Turtle flavour switch (flavor.rs, layers.rs, the DataLoad rerun) |
web-only in bourbon, and this chain has no patch-T to mount |
| bourbon's junk-creature-skin fix as written | it drops the embedded-name fallback outright. Measured here that removes the skin from 17 models; the new corpus test fails exactly that way. The diagnosis is right and the patch is not, so this tree took the diagnosis and guarded the fallback instead |
baked_npc_url through texture_url (the extensionless bake name) |
already in this tree: benilla_formats::baked_atlas_path appends .blp |
UnitCanAssist, GetBattlefieldStatus, the unit-reaction and aura-duration fidelity fixes |
already in this tree, with tests. On the UI and API side this fork is ahead — 1013 commits against their 290, plus the compat layer |
The decision this leaves
Taking bourbon's renderer is a re-baseline onto a tree that has none of the addon-compat work, plus a Bevy 0.18 → 0.19 engine move, plus re-picking samwhosung's last 60 commits. Three shapes, in rising order of what they cost and what they deliver:
- Re-baseline onto bourbon — make its tree the base and re-apply what is only ours. The 339
only-ours files carry the compat layer, which is self-contained behind
install(lua)call sites and ports by copying. What does not survive is this fork's 1013 commits of edits inside shared files, which have to be re-identified from the test suite. Buys: the renderer as its author wrote it, the browser build, 289 upstream commits, Bevy 0.19. - Merge bourbon in — 685 conflicting files to resolve by hand, and the render architecture
still has to be converted. Keeps every shared-file fix. This is the shape with the highest risk
of the failure mode the last sync hit (
docs/UPSTREAM_SYNC.md, "what went wrong"). - Port the renderer onto Bevy 0.18 — rewrite 54k lines from systems back onto graph nodes. That is reimplementing his renderer, not taking it.
Nothing here decides between them: the renderer is what the player sees, and only a play-test of the result can judge it.