"highest" chose level 4 for every model, and render_model_parts draws
nothing for a permutation without geometry there, so those parts
disappeared; and a10's cryotube's top level (a cutoff of 3000) is its
inside only, which "highest", and "native" at 4K, showed from outside.
With display.model_detail other than "stock", each permutation now draws
its most detailed level at or below the model's that has geometry, and a
level with a cutoff over 1000 only while the camera is inside the model's
bounding sphere (port/linux/game/model_detail.c), from eltanschauung's
#282. "stock" draws the model's level as before; so does
rasterizer_debug_model_lod.
Checked: python -m pytest -q tools/harness (#282's lod-* cases in the
transparent enclosure test and its interior, bounds and permutation cases
in test_model_detail.py, with negative controls); models.c, d3d8_gl.c and
model_detail.c compile (-fsyntax-only) with the Linux, Android guest and
web commands.
The game chooses a model's level of detail by its size in pixels on the
Xbox's 480 lines, whatever the resolution, so at high resolutions distant
models drop to their simpler levels long before it would show.
display.model_detail (HALO_MODEL_DETAIL): "stock" (the default) chooses as
the Xbox did; "native" by the size on the display's lines (without
supersampling's factor); "highest" draws the models native does, each at its
most detailed level. The first-person weapon and the sky are unchanged.
Android draws 480 lines, so there native is stock.
Checked: the same b30 view at 854x480 and 2400x1315 gave the same sizes in
stock; at 1080p native measures 2.25 times as much and moves the corpses and
weapons up a level, highest puts everything drawn at its top level. The
level chosen is used only to draw (render_model's callers are the objects',
the first-person weapon's and the sky's drawing), so nothing a network game
agrees on changes; stock multiplies by exactly 1. Not checked with ssaa2x or
on a 4K display, nor built for Android or the web.
render_model_parts now follows a link whose previous part is 0, which retail did not: of the 10862 parts of the 24 stock maps' models none has one (the needler's 2 and 3 are their only links), so it changes nothing there. The comments say what the links are for, and the long conditions are wrapped.
The powerup bounds of #117 move from source/models/models.c to port/linux/game/powerup_render_bounds.c, called from scenario_tags_load beside the other tags-loaded hooks, so the game's models.c no longer takes <xtl.h> and D3D buffer locks. It uses square_root and a relative margin in place of sqrtf and nextafterf, which strict gnu89 does not declare, and the objects.h scale change is marked as the port's. tools/test_powerup_bounds.py is dropped: it redeclares the engine's types by hand and CI does not run it.
On bloodgulch the active camouflage's render radius grows from 0.1 to 0.23 and the overshield's from 0.1 to 0.21; no other equipment changes.
Recover transparent geometry submit (+1,285 meaningful code, zero exact losses); reconcile COMMON ownership and Q10 85+EXT1 credit, actions/main data, and separately disclosed denominator corrections. Preserve canonical-only repairs and all held research. C09 is ordinary disclosed cleanup, not a claim of proven scaffolding intent. Clean rebuild, 1,663 tests, parks, audits, provider links and independent EXT1 check pass. Local reconciliation only.
Import only independently reviewed production changes. Preserve canonical physics and virtual-keyboard repairs; keep B3 and all unresolved holds out.
Record exactly four approved canary debits (6987 meaningful bytes), six Halo admissions and two revocations. Keep vendor ioinit/storage work separate. Full build, 8252-row sweep, 1318 tests, park/admission/fake audits and 621-object binding pass within approved debit bounds.
Do not publish donor research dumps or private assets. README and unrelated user research remain untouched. See frontier_publication_reconciliation_20260927.md for complete evidence limits and accounting.
Merge verified source, data and owner corrections from 4e84c212. Resolve overlapping HS/path symbols against canonical, retain the dynavobgeom ownership rejection, document Layer 2/P7 source-shape decisions, and preserve held research. Verified 14 exact functions, 17 new Halo objects, zero regressions under objdiff 3.3.1.
Each of actor_types, recorded_animation_definitions,
model_animation_definitions, sound_classes and object_types had strict
exact functions and a .data section byte-identical to January's: same
payload, flags and resolved relocation destinations. But each also had
private symbols whose storage disagreed with January. cachebeta.pdb
publics are the independent truth: none of the corrected symbols is
public, and no other January object references them.
- actor_types: the address-named accessor and table become
actor_type_definition_get and actor_type_definitions, both static.
January's own assert strings name the table, and the Halo CE atlas
names the accessor at the same 0x140-byte span.
- recorded_animation_definitions: byte_swap_recording is static.
- model_animation_definitions: the seven *_animation_list_entries
arrays are static beside their public animation_list wrappers.
- sound_classes: _code_001b84c0 is sound_class_datum_get (static). The
atlas mapping is anchored on six exact sound_classes names.
- object_types: bss_00456e98 is processed_bsp_flags (static), the
object's only file static in HCEX.pdb.
- items: drop the hand-written NODUP valid_real_matrix4x3 and
valid_real_vector3d_axes3 copies (bodies identical to real_math.h).
items genuinely uses them, and all 18 items rows are unchanged. This
lets object_types' candidate-only copies pair-link. All eight
object_types helper COMDATs are byte-identical to January's selected
copies.
Five pinned entries in config/semantic_data_matches.json.
- Canonical scorer (objdiff 3.3.1): credits 6,656 data bytes and clears
5 more revoked admission rows (9 -> 4).
- Pinned objdiff 3.6.0: already fully matched (verified no-ops).
- No code bytes, no config status change.
Verification: full ninja; stable diff vs frozen 8,245-function
baseline 0 gained / 0 regressions; parks 103/0/0; whole-object audit
PASS, PDB-storage 0 disagreements and provider links PASS for all five;
fake-match scan unchanged (0 -> 0) on all six changed sources; pytest
1154 passed; git diff --check clean.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Integrate verified source and data progress; exclude unproven COMMON ownership, held UB/asm forms, and address-named data credit. Stable sweep: 23 exact functions gained, zero lost.
- _hs_compile_and_evaluate: calls the real static hs_compile_source_error
helper with no source file instead of a hand-written copy (January
inlines the helper here, leaving its dead loop's alignment pad), reuses
the expression parameter; formerly recorded as unreachable
- _inverse_kinematics_adjust_matrices: named squared upper-arm length and
consistent basis-row locals (park reopen)
- _actor_stimulus_prop_acknowledged: MAX clamps, DATUM_INDEX_TO_ABSOLUTE_INDEX,
January's ternary polarity (park reopen)
- _lrar_allocate: found-flag loop allocating inside the fitting arm, as the
sibling _lra_allocate (park reopen)
- _prop_add: reads the dead field back and binds the actor lookup
- _director_script_camera: real director_set_camera helper call and the
admitted bare director_get validation (park reopen)
Stable diff: 0 regressions; active parks 213 -> 209.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
January reads keyframe frame indices with movzx (word stream), refuting the parked signed-short premise; keyframe declaration/assignment order follows January load order; uncompressed overlay paths read-then-advance per stream, closing the structural 12-byte frame gap. Adversarially verified. 5 parks removed; +5 exact (4,288 padded). Full build of the combined reopen set: 0 regressions, parks 451/0/0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
January reads and forwards parameter 1 as a dword; the header owner and definition now agree. Full build: +1 exact (304 padded), 0 regressions, parks clean.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>