TaCZ Mesh Loader Direct Study - Herbertofury/Advent-of-Ascension GitHub Wiki
TacZ Mesh Loader · existing community route for the AoA sculpt upgrade
Priority: evaluate and improve the existing loader before building a second renderer. TML was already in the Minecraft Mods research collection; this study advances it from a source-listed candidate to an actual source/artifact review. It is still not native acceptance for our weapons.
Pinned inputs
- Official project, project ID
SnuAzTh0. - Inspected Forge 1.20.1 release: 0.1.8, published 30 September 2026. Archive: 204,663 bytes.
- Source repository, 1.20.1 branch pinned to
a3faaaf45ed956351278a5b6f86b4140f48439ea. Thirty-six source/resource/build/license files were downloaded for inspection. Bundled dependency binaries were not needed. - The GitHub releases endpoint was empty at review time. The branch pin and published artifact are separate authorities; no exact reproducible-build equivalence is claimed.
- Actual TaCZ comparison: 1.1.8-hotfix2 / Forge 1.20.1.
The published project also lists 1.20.1 Fabric and 1.21.1 NeoForge/Fabric variants. Those are separate artifacts with different TaCZ-port dependencies; this study does not certify them.
What the files actually establish
- The gun-model registration key is
mesh. The inspected source and released bytecode both register that value. A source example/log saysmeshy; do not copy that stale spelling into the display JSON. - The loader reads indexed
poly_meshpositions, normals, UVs and polygon corners, including normalized-UV handling. Guns use the opt-in model type; attachment/ammo/block paths have their own integration hooks. - Main and LOD gun model loading have dedicated hooks. The corresponding nine base-TaCZ target method declarations across five classes still exist in the inspected hotfix2 artifact. This is a static compatibility prerequisite, not proof that every Mixin injects or renders correctly.
- The source contains a VertexConsumer fallback, VBO caching and a separate optional Accelerated Rendering integration. It also tracks shader changes and invalidates relevant caches.
- The official guidance keeps actual hand models as cuboids. Do not convert the hand rig merely because the weapon body becomes a mesh.
This is a substantially more complete integration starting point than our small immutable quad dispatch experiment. Keep that original experiment as a diagnostic/guardrail reference, rather than starting a competing renderer without evidence of a gap.
Source-derived authoring gates
Triangles/quads only for our export
The inspected loader converts a source triangle into four submitted vertices by repeating its last corner, and otherwise uses the supplied polygon length. Its VBO path begins a QUADS buffer. Therefore an arbitrary five-or-more-corner polygon must not be assumed to be safely triangulated. Our preflight rejects n-gons and asks the authoring pipeline to triangulate them explicitly. This is a source-derived risk, not a claimed reproduced in-game failure.
The official Blockbench plugin catalogue currently lists Meshy 1.0.5 by Shadowkitten47. Its actual exporter pads a triangle by repeating the first corner into a four-corner polygon; the TML three-corner path instead repeats the last corner internally. Both are intentional triangle representations. Preflight v2 accepts these cases while still rejecting a collapsed first triangle, crossed quads and n-gons. The earlier v1 gate was too strict for Meshy's padded triangles and is superseded, with its archive preserved.
Official Meshy plugin source, inspected SHA-256 433929ab98d0855cbfaf084338396590cc37177f977943cd28bf0e009a310611. The author's separate repository head embeds version 1.0.4; use the official catalogue artifact when referring to 1.0.5.
Pivot, axes and normals
The reviewed source subtracts each bone's absolute pivot, divides model positions by 16, flips model Y and flips UV V. Its flat-shading switch is enabled in the reviewed source. The Meshy exporter also applies object origin/rotation and negates X before saving positions. A Blender export must check the combined coordinate conventions and normals against these transforms; simply renaming a file is not an exporter. Smooth-looking concept surfaces must be compared in game before accepting the resulting shading.
Cache and performance
The reviewed VBO cache is bounded to eight packed-light entries per mesh, with eviction notifications and closure of discarded buffers. Bounded per-mesh caches still need an aggregate budget across many bones, weapons and light changes. Test lighting transitions, shader toggles, inventory displays, dropped weapons and reloads. Do not equate a VBO path or an AR integration with a measured FPS gain or Hari/Vulkan compatibility.
Original preflight tool
Download the original offline preflight and tests. It checks the inspected indexed triangle/quad schema, unique bones, finite/representable values, positive texture dimensions, index bounds, selected degeneracy/winding cases and authoring budgets. It warns about hand-like mesh bones and nonplanar quads. Thirteen synthetic regression tests pass.
This tool reads data only. It does not execute TML, install a mod, run a game or certify all collisions, materials or UV seams. Its stricter authoring budgets are ours, not universal claims about every valid upstream asset.
Integration and contribution checklist
- Make one deliberately small AoA body-mesh fixture using the official Meshy/Blockbench route or a separately validated exporter; retain native cuboid hands.
- Check
model_type: mesh, exact resource paths, pivots and UV orientation using the pinned 0.1.8 release. - Native-test TaCZ hotfix2 with TML alone, then AR, shaders/Oculus, ModernFix and Hari/Vulkan individually before combined-pack testing.
- Exercise first/third-person, dropped/fixed/inventory, LOD, attachments, animated parts and interrupted inspections.
- Verify reload cleanup and cache eviction under changing packed light; measure memory, startup, frame-time tails and upload spikes.
- Prepare useful upstream fixes/tests for input validation, n-gon handling and documentation spelling if the maintainer wants them. Nothing has been submitted upstream by this study.
- Resolve the license metadata discrepancy before bundling third-party source: Modrinth reports GPL-3.0-or-later, the released JAR declares GPL-3.0-only, and the source build-property template says All Rights Reserved while LICENSE.txt contains GPLv3. Record the facts rather than silently choosing one label.
Evidence manifest, source/artifact hashes and exact target declarations.
Remaining boundary: no native TML run, accepted Soul Storm export, hand-rig validation or measured performance result has been produced here. Credit VellEagle and the TaCZ community; this study packages only original audit tooling and findings.
Editor verification boundary
The cloud Blockbench web app reported “Error creating WebGL context” on launch and one ordinary reload. No successful Blockbench GUI import/export or plugin execution is claimed. Blender/offline source and schema work can continue, but an actual editor and in-game round trip remain required.
Executed released mesh-baker checks
The exact released PolyMesh and PolyMesh$1 class files now pass an isolated constructor/data-baking harness on Java 17 and Java 21. A clean archive extraction also passes. The harness checks the official JAR SHA-512 and both class SHA-256 values before extraction; upstream bytecode and dependency binaries are not redistributed.
Verified: pivot subtraction, model-unit /16 scaling, Y/V flips, normalized and pixel UVs, triangle expansion, Meshy ABCA padding, retained five-corner input length (not automatic triangulation), and invalid-index rejection. Narrow graphics/logging stand-ins replace unavailable Minecraft classes. No mod entrypoint, GPU draw, native cache upload or game session was executed.
Reproducible isolated baker harness
Soul Storm static transport fixture
The corrected four-emitter LOD now exports 13 mesh bones / 20,288 triangles / 81,152 baked vertices. Running this actual geometry through the released baker on both runtimes verifies finite attribute arrays, bounded UVs and empty GPU caches. Animated/customizable emitter domains remain separate; eight authoring projectile meshes are excluded.
A 2048×2048 atlas preserves the original reservoir texture and all 15 flame cells pixel-for-pixel with four-pixel gutters. The static geometry currently maps flame frame zero. Palette colors derive from source linear base values; metallic/roughness shaders have not been translated. Source alpha-border cleanup remains open.
Static geometry, atlas, exporter and receipts · World-space geometry correction
This is not an installable gunpack. Winding/full normal correctness, native shading/transparency, hands/aim anchors, recoil and flame animation, gameplay/resource integration, mixins, shaders/Vulkan and frame-time acceptance remain unverified. Passing the data-baker is an integration checkpoint, not a rendered-game or FPS claim.
Released fallback emission and roundtrip preview
Expanded v2 harness also invokes the exact released compileConsumer method into a recording sink. Java 17/21 checks verify transformed positions, UVs, tint, light and overlay forwarding. It confirms that this fallback emits negated stored baked normals; the inspected VBO upload bytecode uses the stored normals directly. This is a native lighting/path-parity test target, not a proven visible bug. No GPU upload or draw was executed. All 20,288 exported faces have baked normal lengths at least 0.9999999 in this fixture; that still does not certify outward orientation or authored smooth shading.

This offline Blender roundtrip rebuilds meshes from the exported JSON and samples the packed atlas. It preserves recognizable component placement and textured core/flame, while clearly showing the flatter generic materials and faceting. It is not a native TML screenshot or visual acceptance. The import reverses the authoring coordinate transform; it does not emulate the complete Minecraft model stack. Reproduction script.
Separate emitter recoil clips

Four nonlooping clips now separately address each emitter’s body and illuminated mesh-bone pair. The actual released TaCZ 1.1.8-hotfix2 animation parser accepts 4 clips / 168 position keys on Java 17 and 21. Each clip starts/ends at zero and matches existing exported bone names; no root or unrelated emitter motion is included.
The clips sample the original Blender curves at quarter-frame intervals. Per-clip presentation duration is 5/60 seconds, peak displacement 1.12 model units, and maximum linear approximation error is below 0.012 model units over 201 comparison samples. This does not set the weapon’s firing rate. The preview reconstructs exported geometry and sequentially schedules these clips in Blender, with a pause at the end; core/flame animation and projectile effects are not part of this transport preview.
Integration gate: choose one emitter only after an authoritative successful shot, deduplicate repeated events, and retain authoritative resource cost/cadence. Do not trigger all four clips from a single shot or advance on blocked input. Native animation playback, hands, cancellation, shot networking and in-game QA remain open.
Recoil clips, source sampler and scoped evidence · Offline motion reconstruction script
Confirmed-shot emitter selection reference
Original Java helper and tests generalize the existing Baronator sequence concept for configurable emitter counts. Java 17/21 pass 60,000 sequential selections across 1/2/4/5/6/64 emitters, plus duplicate, stale, rejected, bonus, skipped-event, count-change, capacity and lifecycle cases.
Only an authenticated successful primary-shot sequence supplied by the future adapter may select a cosmetic clip. This helper never changes damage, ammo, Spirit or cadence. Explicit active-session registration avoids silently evicting still-needed duplicate history; capacity overflow is an error. Closed sessions reject delayed events, and each new session requires a fresh epoch-bearing key. Count changes retain the sequence high-water mark. Calls must remain on one presentation-update owner thread.
The helper itself provides no network authority or native integration. Tests do not certify Minecraft events, multiplayer, save migration, frame time or complete weapon behavior.
v15 full-detail/LOD export and float32 equivalence
The retained v15 sculpt has separate full-detail and world-LOD transport exports. Both are accepted by the actual released TML mesh baker in the isolated Java17/21 harness. Full transport: 44,264 triangles, 177,056 baked vertices, 13 mesh bones. World LOD: 20,584 triangles, 82,336 vertices, 13 bones. The eight-float vertex-array payload drops from 5,665,792 to 2,634,752 bytes; this excludes JSON, object headers, GPU allocation and caches. It is not an FPS result.
A targeted JSON compactor rewrites only poly_mesh position, normal and UV values using nine significant decimal digits of their float32 value. It preserves unrelated double-valued metadata and signed zero. The LOD JSON shrinks from 2,258,953 to 1,726,063 bytes (23.59%). The actual released baker produces bit-identical results for all 658,688 baked float values across thirteen meshes on Java17 and Java21. A separate 99,631-value finite edge/random fixture and metadata/nonfinite cases also pass.
These are transport and encoding results for v15, not the later v16/v17 authoring geometry or native visual acceptance. The packed palette is still a transport study rather than final weapon texture art.
- v15 full/LOD exports and source evidence
- Scoped checks
- Configurable actual-released-baker harness v3
- Float32 compactor and regression tests
First-person hands are a separate integration contract
Actual TaCZ 1.1.8-hotfix2 bytecode registers functional renderers at lefthand_pos and righthand_pos, then delegates to the local player arm renderer. The authoring placeholder cubes alone do not certify the displayed hand.
Display-file resolution identifies 54 referenced primary models and 54 referenced LODs in the pinned default pack. All 54 referenced primary models pass the structural anchor audit; LODs are not required to carry first-person anchors. Two extra hk416d files are unclassified by these display fields and are not claimed to be broken. The published Soul Storm v15 transport intentionally lacks both hand anchors and is not first-person-ready.
Do not add arbitrary zero-position bones to make the check green. Calibrate actual grip transforms, normal/slim player arms, sleeves, hands throughout every animation and attachment configuration, and separate third-person/GUI placement. Native fit, player-model compatibility and collisions remain open.
Direct released-file study and implementation checklist · Exact model-role evidence · Structural audit and regression fixtures
Corrected v19 hardware-only transport
Source and regression evidence rebuild the opaque hardware from the winding-corrected v19 source. This is not the old v15 geometry repackaged. It includes 46,316 triangles in 10 groups, and explicitly excludes vortex, reticle and living-fire surfaces pending their native material implementation. Six constant base-color swatches are technical placeholders, not finished texture art.
The actual released TML 0.1.8 baker produces 185,264 vertices. Original and compact JSON match in all 1,482,112 baked float values on Java17 and21. JSON shrank from5,119,795 to3,946,341 bytes without changing those consumed values. These are isolated data tests; no native rendering, animation, hands, gameplay or FPS acceptance is claimed.
2026-10-24: GPU rendering source recheck and no-loss prototype gates
Checked 24 October 2026. This additive update records source research and engineering recommendations, not an installed compatibility test, native visual acceptance or performance result.
Decision
Keep the existing consumer path as the comparison reference; the isolated checks above do not establish full native correctness. A same-geometry rigid-mesh GPU path is worth a measured prototype, but neither installing a performance mod nor enabling an existing VBO flag proves that custom materials, lighting, animation ownership or the target Hari/Vulkan renderer remain correct. Do not reduce detail or stretch hands to manufacture a gain.
Current primary sources and version boundaries
The official TML Forge 1.20.1 branch still resolves to a3faaaf45ed956351278a5b6f86b4140f48439ea, the revision already documented in this study. A recently updated project page can reflect another platform branch; it is not evidence of a newer Forge fix. The creator documents separate Forge/Fabric/NeoForge dependency families and requires hands to stay cube-based rather than becoming mesh geometry. TML source, creator documentation.
Accelerated Rendering's Forge 1.20.1 branch is pinned to 11f149ac716ec757907209dc77b04baaa3f915fc, committed 17 July 2026. Its declared version is 1.0.14-1.20.1-alpha, built against Forge 47.4.9 with a declared Forge range beginning at 47.3.19. That metadata is not full-stack compatibility proof. The author describes cached original vertex data transformed through GPU compute, followed by the original draw shader, and states an OpenGL 4.6 requirement. Pinned properties, pinned explanation.
This is not just a generic GPU recommendation: the inspected ComputeShader directly uses OpenGL compute-shader calls; MappedBuffer uses persistent/coherent mapping flags. A hari-vulkan compatibility claim therefore needs evidence for the actual integration and GL entry points. Do not automatically install this beside a Vulkan renderer because a gun mod recommends it for an ordinary OpenGL stack. No incompatible-runtime conclusion is claimed without that check either. Compute implementation, mapped buffer.
Useful design lesson
The inspected ClientMesh API separates retained geometry from per-draw color, light and overlay inputs and distinguishes reload-sensitive builders. That is a useful design boundary, not proof that another renderer can call it without integration work. The inspected source alone does not establish bounded lifetime, failure cleanup, shader compatibility or a speedup for our asset. ClientMesh.
For the original AoA weapon rendering work, keep these channels separate:
- Immutable complete vertex tuples: position, normal, UV and necessary material attributes. Never weld by position alone across UV/hard-normal seams.
- Dynamic bone transforms and visibility, including detached reload props with exactly one owner.
- Light, tint, overlay and custom material uniforms, with explicit coordinate spaces.
- Resource, shader and graphics-context generation/lifetime. A cache hit cannot justify reuse after invalidation.
An existing TML VBO path is not a drop-in substitute for the custom raw material path: its layer choice, normal correction, light-keyed geometry copies and fixed overlay contract differ. Preserve the reference path and verify a deliberately narrow opaque group first; hands, transparent glass and scope/stencil can remain on their existing paths until separately proven.
Small discriminating experiment
- Freeze source/export/texture hashes and renderer stack. Verify the actual backend rather than relying on a profile name.
- Use one opaque rigid group with unchanged authored geometry/UVs/normals. Compare a fixed camera and a rotating asymmetric object under fixed lights; this exposes wrong normal/light spaces.
- Measure CPU submission, frame-time distribution, uploads/cache misses and retained resources independently. Count draw calls: per-bone cached draws can increase them even while reducing CPU vertex work.
- Exercise missing/corrupt resources, reload, shader changes, interrupted ownership, multiple world items and clean disposal. Do not flush uncertain partial buffers or infer reclamation from dropping a Java reference.
- Reject on visual, ownership or lifecycle regression. A source-level reduction in operations is not a measured FPS result. Native results must identify the exact backend, stack, asset and workload.
Remaining scope
No new mod was installed, no upstream binary was executed and no game benchmark ran for this review. The target Forge TML branch was rechecked, not upgraded. The OpenGL-specific implementation is a compatibility checkpoint for hari-vulkan, not a reason to silently replace the target renderer. Separate geometry/render optimization from the ongoing texture-lifetime diagnostic and from final art acceptance.