18 Commits
Author SHA1 Message Date
selimaj-dev 2aa740ba6c Merge pull request 'Build for Minecraft 26.1, 26.2 and 26.3' (#8) from mc-26 into master
Reviewed-on: #8
2026-09-30 16:41:02 +00:00
selimaj-devandclaude c92abd4401 Bump the version to 0.1.2
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-30 18:40:11 +02:00
selimaj-devandclaude 9d0fe6fb6b Build for Minecraft 26.1, 26.2 and 26.3
Adds the three drops as Stonecutter versions (26.1's jar also accepts
its hotfixes). loom-back-compat already picks the plain Loom for 26.x;
the testmod's remap configurations are only created where there's
something to remap, and the foojay resolver downloads the Java 25
toolchain these versions need.

- 26.3 renamed PoseStack.mulPose(Quaternionfc) to rotate.
- The testmod follows Fabric API's renames: ClientCommands (26.1),
  getClientLevel (26.1) and getConnection (26.2) for waiting on chunks.
- 26.2 replaced Options.hideGui with the HUD's toggle, so the gametest
  toggles it through a helper.

The screenshot gametest passes on 26.1, 26.2 and 26.3, and the bent
limbs match 1.21.11's.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-30 18:40:11 +02:00
selimaj-dev 8794f3fb65 Merge pull request 'Read binary Emotecraft emotes and fix the torso's bend direction' (#7) from emotecraft-binary into master
Reviewed-on: #7
2026-09-29 15:41:20 +00:00
selimaj-devandclaude 970e9aef51 Read binary Emotecraft emotes and fix the torso's bend direction
tools/emotecraft/convert.py turns Emotecraft's binary .emotecraft files (its network packet, with
the animation in player-animator's legacy format) into the Emotecraft JSON EmotecraftLoader reads.

Converting a few community emotes showed the loader bent the torso the wrong way: Get the Griddy,
which hunches forward, arched back. Emotecraft bends limbs the other way from us, but not the torso,
whose bend is anchored at the hips here and so already turned round. The loader now keeps the
torso's bend sign, and gives the whole player's bend to the torso, as Emotecraft does. fit.py writes
torso bends to match, so re-exported captures look the same.

Bumps the version to 0.1.1 for the fix.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-29 17:37:18 +02:00
selimaj-dev 0518a2793a Merge pull request 'Add a tool that measures emotes from a store's 3D preview' (#6) from capture-poc into master
Reviewed-on: #6
2026-09-29 14:59:41 +00:00
selimaj-devandclaude df9a2587e6 Add a tool that measures emotes from a store's 3D preview
tools/capture drives a store page's skin viewer in headless Firefox, stepping its clock one tick at
a time and taking every tick from ten fixed cameras. It then fits our own rig to the frames by
rendering the model (a Python port of LimbBend and PoseApplier) and matching outlines and colours,
and writes the result as Emotecraft JSON. It measures pixels only and never reads the page's
animation data. The README covers the steps, the checks and the limits.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-29 16:55:08 +02:00
selimaj-dev 7f8de39253 Merge pull request 'Load Emotecraft emotes into a registry and add a whole-player bone' (#5) from emote-loader into master
Reviewed-on: #5
2026-09-26 18:54:43 +00:00
selimaj-devandclaude e40aa1353b Load Emotecraft emotes into a registry and add a whole-player bone
- core: EmotecraftLoader reads Emotecraft / player-animation-lib JSON
  into a KeyframeAnimation (per-channel keyframes with Easing), following
  player-animation-lib's reader: absolute pivots become offsets, body
  (and torso before version 3) is the whole player in blocks, angles are
  degrees unless "degrees": false, turn adds whole turns, and loops jump
  back to returnTick after endTick. Emote and EmoteRegistry hold emotes
  by ID with their name, description and author. Animation.loopStart
  lets loops restart after an intro. Uses Jackson 2.17.0, the version
  Saturn Client ships.
- Bone.ROOT moves the whole player around its middle (0.7 blocks above
  the feet), through the model's root part, so armor and held items
  follow.
- fabric: Emotes.registry() and Emotes.play(uuid, id). Core and Jackson
  are bundled in the jar.
- testmod: loads Saturn's six emotes into the library's registry
  (/emotes play), and keeps its test animations in a separate registry
  (/emotes test). The gametest shoots the loaded emotes too.

Blending with the vanilla pose is issue #4.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-26 20:51:52 +02:00
selimaj-dev cf05623c54 Merge pull request 'Make held items follow bent arms and straighten the first-person arm' (#3) from held-items into master
Reviewed-on: #3
2026-09-26 18:31:22 +00:00
selimaj-devandclaude c3b0e86548 Make held items follow bent arms and straighten the first-person arm
- PlayerModelMixin: after translateToHand, move the item from the hand of
  the straight arm to the hand of the bent one (BendTransforms.attachAt,
  the same rigid move as the ring at the hand). PlayerModel overrides
  translateToHand for slim arms without calling HumanoidModel's, so the
  hook has to be on PlayerModel.
- FirstPersonHandMixin: the first-person arm is drawn from the shared
  model without setupAnim, so clear any bend left by the last
  third-person player.
- LimbBend.start()/end() getters.
- testmod: a hold animation, and gametest shots holding a sword and in
  first person.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-26 20:31:01 +02:00
selimaj-dev 7016405e5f Merge pull request 'Bend limbs and the torso along a Bézier spine' (#2) from limb-bending into master
Reviewed-on: #2
2026-09-26 18:10:27 +00:00
selimaj-devandclaude 09cfd0cc10 Arch the twerk's lower back instead of hunching it
The torso tips forward around the hips and bends backwards, so the lower
back curves in and the chest comes up. The head and arms get the tilt
themselves, since they only follow the torso's bend.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-26 20:04:08 +02:00
selimaj-devandclaude 34aba293b6 Bend the torso from the hips and add bow and twerk test animations
- LimbBend.anchoredAtEnd keeps the far end in place (the hips on the
  legs) and folds the other half, and angleAt/axis expose how far the
  limb has turned at a point.
- PoseApplier bends the body from the hips and carries the head and arms
  with it: their pivots follow the bent torso and they turn with its ring.
- Test animations: bow (torso only) and twerk. The gametest shoots the
  twerk at the top and bottom of its bounce, including from behind.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-26 19:57:50 +02:00
selimaj-devandclaude 8bac5eef64 Bend limbs along a single axis with a Bézier spine
- core: Bezier (any degree, De Casteljau), LimbBend (cubic spine through
  the rigid upper/joint/lower shape, one ring per texture row spaced by
  arc length, rigid rings so pieces share vertices) and QuadSplitter
  (cuts faces at the rings, interpolating UVs).
- fabric: ModelPartMixin draws parts that have a bend with
  BentCubeRenderer, which deforms vanilla's own cubes. Overlays and armor
  use the limb's spine so they stay attached. Bends are reset every
  setupAnim because models are shared between entities.
- testmod: flap and squat animations, and a client gametest that
  screenshots each animation from the front and side
  (runClientGameTest). The tester runs with the full Fabric API because
  single modules don't bring their version-specific dependencies.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-26 19:43:57 +02:00
selimaj-dev d5af8d65c2 Merge pull request 'Scaffold the emote library with a Stonecutter Fabric mod and tester' (#1) from stonecutter-scaffold into master
Reviewed-on: #1
2026-09-26 17:06:39 +00:00
selimaj-devandclaude 8641fc0afe Scaffold the emote library with a Stonecutter Fabric mod and tester
- core/: Minecraft-independent animation model (Bone, BoneTransform with
  bend fields, Pose, Animation, AnimationPlayer) with JUnit tests.
- src/main: Fabric mod built for 1.21.4-1.21.11 with Stonecutter on
  Mojang mappings. Samples each player's pose into its render state and
  applies it at the end of HumanoidModel.setupAnim (armor follows too).
- src/testmod: dev-only tester with /emotes play|stop|info and a mixin
  audit on startup.
- Publishing to the saturnclientmc Gitea Maven registry as
  org.saturnclient:emotes-core and emotes-fabric:<v>+<mc>.

Loom is pinned to 1.17 because 1.18 needs a Java 25 JVM.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-26 19:05:06 +02:00
selimaj-dev dda96c4acf Initial commit 2026-09-26 16:17:34 +00:00