Model Engine—Ultimate Entity Model Manager [1.19.4 - 26.2]

Model Engine—Ultimate Entity Model Manager [1.19.4 - 26.2] R4.1.0

Development builds

40 builds
Your account does not include development build access. Purchase ModelEngine to download these builds.
Get access

Latest builds

R4.1.1 Latest
ModelEngine-R4.1.1.jar
Build 2419

feat: add Disabled-Overlays to leave overlays out of the pack

View 8 more changes
  • - New Model-Generator > Disabled-Overlays, empty by default:
  • ```yaml
  • Model-Generator:
  • Disabled-Overlays:
  • - 1_19_4
  • - 1.21.2
  • ```
  • - Valid names: 1_19_4, 1_21_2, 1_21_5, 1_21_6, 26_1, 26_2 (dots or underscores).
Premium
R4.1.1
ModelEngine-R4.1.1.jar
Build 2418

feat: smaller pack zip and an option to merge item models

View 3 more changes
  • - Folder entries are no longer written to the zip. Generated files are unchanged, the zip is just smaller (~1.5% on a large pack, up to 13% on a small one).
  • - New Model-Generator > Merge-Item-Models, default false: writes one item file per model instead of one per bone. A 700 model pack got about a quarter smaller. (1.21.4+ only)
  • - Enabling it changes every bone's item model, so players on the old pack see nothing until they redownload it.
Premium
R4.1.1
ModelEngine-R4.1.1.jar
Build 2417

fix: bones dislocate for a tick after changeparent (#360)

Premium
R4.1.1
ModelEngine-R4.1.1.jar
Build 2416

fix: re-show the base entity when a player undisguises (#368)

Premium
R4.1.1
ModelEngine-R4.1.1.jar
Build 2415

perf: less per-tick allocation and fewer duplicate lookups

View 7 more changes
  • - Player tracking no longer builds a Location per online player, on both projectiles and dummies.
  • - The online player set is cached instead of copied on every read.
  • - Tracking changes are found by walking the two player sets instead of merging them each tick.
  • - Bone items bake once per update instead of once per item, and hash each item one time less.
  • - Registry lookups do one map probe, and adding a model resolves its blueprint once.
  • - Oriented bounding box tests compute their six scaled axes once instead of per axis.
  • - Hitbox UUID lookups skip an int round trip, and purging a hitbox now clears its UUID entry.
Premium
R4.1.1
ModelEngine-R4.1.1.jar
Build 2414

fix: set aura attachment glow after the model is attached

Premium
R4.1.1
ModelEngine-R4.1.1.jar
Build 2413

fix: pass scale value, not component index, to the scale callback

Premium
R4.1.1
ModelEngine-R4.1.1.jar
Build 2412

perf: generate user limb skins per limb instead of whole skins

View 5 more changes
  • User limbs used to cost 10 MineSkin uploads per skin per variant, even for limbs no loaded model used. Limbs are now uploaded on demand, and eager generation on join only covers the limb types that loaded blueprints reference.
  • - No limb[type=] bone loaded: 0 uploads per joining skin, was 10.
  • - Default skins: 0 uploads at startup, was 20. They fill in on first use.
  • - Head, body, arms and legs model: 5 uploads, was 10.
  • - A failed limb no longer discards the ones that succeeded, so a retry only re-sends what failed.
Premium
R4.1.1
ModelEngine-R4.1.1.jar
Build 2411

fix: dedupe concurrent user limb generation and avoid caching partial MineSkin failures

Premium
R4.1.1
ModelEngine-R4.1.1.jar
Build 2410

fix: track=false on pv=true

View 1 more changes
  • note from tai: i've spent 5+ hours on finding this, send help
Premium
R4.1.1
ModelEngine-R4.1.1.jar
Build 2409

feat: sub-tick bone transform sampling

View 33 more changes
  • Opt in per bone, then read by index, where `0` is the previous tick and `n` is the current one.
  • ```java
  • bone.setSubTickSamples(10); // ancestors are raised to match
  • Transform t = bone.getSubTickTransform(k); // model space, like getGlobalTransform()
  • Matrix4f m = bone.getSubTickMatrix(k); // like getTransformMatrix()
  • Location loc = bone.getSubTickLocation(k);
  • Location eye = bone.getSubTickLocation(k, OffsetMode.LOCAL, new Vector3f(0, 0.2f, 0), true);
  • ```
  • Samples go through the animation's own interpolators, so curved segments and step keyframes resolve exactly as they do at tick resolution. `isSubTickStep(k)` marks where a step keyframe landed.
  • ```java
  • for (int k = 1; k <= 10; k++) {
  • var t = bone.getSubTickTransform(k);
  • if (bone.isSubTickStep(k)) camera.snapTo(t);
  • else camera.lerp(bone.getSubTickTransform(k - 1), t, frac);
  • }
  • ```
  • Everything returns `null` (`false` for the step flag) when sampling is off, the index is out of range, or the buffer has not been filled yet, so callers fall back to `getGlobalTransform()`.
  • ## API
  • | Method | Returns |
  • | --- | --- |
  • | `setSubTickSamples(int)` / `getSubTickSamples()` | opt in, `0` disables |
  • | `getSubTickTransform(int)` | `Transform`, model space |
  • | `getSubTickMatrix(int)` | `Matrix4f` |
  • | `getSubTickLocation(int)` | `Location` |
  • | `getSubTickLocation(int, OffsetMode, Vector3f, boolean)` | `Location` |
  • | `isSubTickStep(int)` | `boolean` |
  • ## Notes
  • Bones the animation does not fully drive (bone behaviors, manual animators, procedural transforms) are detected each tick by composing the animation alone and comparing it against what the tick produced. Those interpolate their own two tick transforms instead, which still lands exactly on the tick values at both ends.
  • Off by default at one null check per bone per tick. When on, `n + 1` animation evaluations and decomposes per opted-in bone per tick.
  • Supporting changes:
  • - `SubTickProperty`, a time-shifted read-only view of an `IAnimationProperty`
  • - `AnimationHandler.updateBone(bone, propertyMapper)`, whose default ignores the mapper so third-party handlers degrade to tick resolution instead of breaking
  • - `Transform.set`
Premium
R4.1.1
ModelEngine-R4.1.1.jar
Build 2408

perf: block culling does far less work per player

View 3 more changes
  • - Block culling used to build the full list of a model's box corners before testing any of them. It now walks the visible faces directly and stops at the first corner that is in view. Same culling decisions, a small fraction of the memory churn, so the cull thread and the GC both get lighter.
  • - Bone item updates got the same treatment on a smaller scale.
  • - Fixes models more than 16.7 million blocks from spawn being culled while still visible. The old corner math lost precision that far out and ended up skipping half its checks.
Premium
R4.1.1
ModelEngine-R4.1.1.jar
Build 2407

perf: nuked main thread usage by 60%

Premium
R4.1.1
ModelEngine-R4.1.1.jar
Build 2406

fix: i do not like it but it's needed

Premium
R4.1.1
ModelEngine-R4.1.1.jar
Build 2405

fix: model max health froze after a plugin re-registered the attribute

Premium
R4.1.1
ModelEngine-R4.1.1.jar
Build 2404

perf: skip the tracking sweep when no viewer left

Premium
R4.1.1
ModelEngine-R4.1.1.jar
Build 2403

perf: skip repeated work in bone item and behaviour lookups

View 3 more changes
  • - Updating a bone's items copied a set that was already deduplicated, just to compare it against a set it could never match.
  • - On Java 21 and newer the copy is now skipped, making the update 14-48% faster when models spawn or change parts.
  • - Servers on Java 17 (1.19.4 to 1.20.4) keep the copy, since dropping it there would reorder a bone's sub-models.
Premium
R4.1.1
ModelEngine-R4.1.1.jar
Build 2402

perf: reduce per-entity overhead on the model tick

View 2 more changes
  • Every model does a few lookups per entity each tick to reach the entity behind it.
  • These took slower paths than they needed to, and one of them created a throwaway object on every call.
Premium
R4.1.1
ModelEngine-R4.1.1.jar
Build 2401

fix: seat pivot spawned 0.375 lower than its teleport position

Premium
R4.1.1
ModelEngine-R4.1.1.jar
Build 2400

api: add UserLimb#getLimbType and UserLimb#setStaticSkin to allow bypassing...

Premium
R4.1.0
ModelEngine-R4.1.0.jar
Build 2314

Brightness mech now affect nametag bones

Premium
R4.1.0
ModelEngine-R4.1.0.jar
Build 2313

Initial 26.1 & 26.1.1 support

View 4 more changes
  • Known bugged feature:
  • - Core share player model works, but causes some items in inventory to not render. Mineskin player model still works though.
  • - If your model has elements that has out of bound UV (i.e. UV starts under 0 or ends above the texture size,) the model will render as error cube. Since it is a modeling error, a warning message would be implemented later
  • 26.1+ requires Java 25. If there are any issues please tell Taiyou (cuz I will be gone for the week)
Premium
R4.1.0
ModelEngine-R4.1.0.jar
Build 2312

Fixed dummy sync location not syncing to body controller

Premium
R4.1.0
ModelEngine-R4.1.0.jar
Build 2311

clear force pair and hide api

Premium
R4.1.0
ModelEngine-R4.1.0.jar
Build 2310

Fixed ref animation not removable in state machines

Premium
R4.1.0
ModelEngine-R4.1.0.jar
Build 2309

Fixed projectile/aura taking priority over targeted entity when finding modeled entity

Premium
R4.1.0
ModelEngine-R4.1.0.jar
Build 2308

fix: read the bytes instead

Premium
R4.1.0
ModelEngine-R4.1.0.jar
Build 2307

perf: cache parsed bbmodels and improve I/O buffering

View 1 more changes
  • Cache BlockbenchModel between reloads using metadata+CRC32. Increase zip/read buffers from 1KB to 64KB. Import: 3.4s → 315ms, Zipping: 1.1s → 510ms.
Premium
R4.1.0
ModelEngine-R4.1.0.jar
Build 2306

perf: make pack generate faster

Premium
R4.1.0
ModelEngine-R4.1.0.jar
Build 2305

feat: meg client mod support

Premium
R4.1.0
ModelEngine-R4.1.0.jar
Build 2304

perf: reduce redundant metadata on spawn and cull transition

Premium
R4.1.0
ModelEngine-R4.1.0.jar
Build 2303

fix: guard interpolation delay with per-player snapshot check

View 1 more changes
  • Move snapshot computation before the interpolation delay condition so DISPLAY_INTERPOLATION_DELAY is only sent when the player actually has stale transform data. Previously, the delay was added based on the bone-level dirty flag alone, before the per-player snapshot was even computed. Also adds missing empty entity data guard to v1_20_R4.
Premium
R4.1.0
ModelEngine-R4.1.0.jar
Build 2302

fix: use UUID keys in SelectionManager to prevent watchdog hang

Premium
R4.1.0
ModelEngine-R4.1.0.jar
Build 2301

fix: reduce redundant metadata on cull transition

Premium
R4.1.0
ModelEngine-R4.1.0.jar
Build 2300

fix: Mount related desync issues

Premium
R4.1.0
ModelEngine-R4.1.0.jar
Build 2299

fix: OBB related issues

Premium
R4.1.0
ModelEngine-R4.1.0.jar
Build 2298

fix: re-do the folia bullshits

Premium
R4.1.0
ModelEngine-R4.1.0.jar
Build 2297

fix: Folia thread safety for mount system

Premium
R4.1.0
ModelEngine-R4.1.0.jar
Build 2296

fix: aura MEG attachment NPE - modeledEntity used before initialization

Premium
R4.1.0
ModelEngine-R4.1.0.jar
Build 2295

fix: forgot to commit these lol

Premium
Top