)]}'
{
  "commit": "8ff564a3fcd233a316ac8c827b8aaf82674c5b80",
  "tree": "87b545bef4a45ed428f5ad79c3f47d9c05556e73",
  "parents": [
    "9b958d4703c905c90cb6f311c2a7365d9877d230"
  ],
  "author": {
    "name": "bodymovin",
    "email": "hello@rive.app",
    "time": "Tue Sep 29 16:16:23 2026 +0000"
  },
  "committer": {
    "name": "bodymovin",
    "email": "hello@rive.app",
    "time": "Tue Sep 29 16:16:23 2026 +0000"
  },
  "message": "fix(runtime): take a skinned path\u0027s winding from its bind pose (#14452) 89a770ce65\nA clockwise fill needs to know which way a bone bound path winds, so\nPointsPath::winding() measured the deformed path once and cached the answer,\nflipping it only when the bones mirror. It measured whatever pose the first\nframe happened to show. A rig that loads folded inside out -- a nested\nartboard whose data bound size starts narrow, say -- cached the folded\nwinding, and once the bones unfolded the path the composer added it\nbackwards: counter-clockwise, so the GPU renderer\u0027s clockwise fill drew\nnothing. Renderers without a clockwise rule (CG, the silver replay) filled it\nanyway, so only the editor and the GPU showed it.\n\nMeasure the path as bound instead. With every bone at its bind transform the\ntendons\u0027 inverse binds cancel, leaving each vertex at the skin\u0027s world\ntransform, so the bind pose is known without deforming anything and does not\ndepend on the pose a rig loads in. Mirroring is still followed as before, a\nfold without mirroring still keeps the reference (the pinned limitation), and a\npath bound with no area falls back to measuring its pose.\n\nAdds a regression test for a rig that loads folded. No committed silver\nchanges.\n\nCo-authored-by: hernan \u003chernan@rive.app\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "8f9790a9974d42dd6939fc21eb23be6180139fb2",
      "old_mode": 33188,
      "old_path": ".rive_head",
      "new_id": "134b7021e43c96a5be1207080c3359ce39300f46",
      "new_mode": 33188,
      "new_path": ".rive_head"
    },
    {
      "type": "modify",
      "old_id": "42c7760ac370ca726ed184ff614a710ea75950d8",
      "old_mode": 33188,
      "old_path": "include/rive/bones/skin.hpp",
      "new_id": "ff06b49029a1819f15353278d21f6d63d5653469",
      "new_mode": 33188,
      "new_path": "include/rive/bones/skin.hpp"
    },
    {
      "type": "modify",
      "old_id": "0aacfc7f294e449fb5c4624327b1a5e22e9ab47e",
      "old_mode": 33188,
      "old_path": "include/rive/shapes/points_path.hpp",
      "new_id": "33b0ac2be69e1fd2d227208b35e3f884d1b39f62",
      "new_mode": 33188,
      "new_path": "include/rive/shapes/points_path.hpp"
    },
    {
      "type": "modify",
      "old_id": "643037df9a2fe64dfdfed731a31e180cbc5e016f",
      "old_mode": 33188,
      "old_path": "src/shapes/points_path.cpp",
      "new_id": "fb148624edd1ce4e0fa40b231fe21a22cee8fede",
      "new_mode": 33188,
      "new_path": "src/shapes/points_path.cpp"
    },
    {
      "type": "modify",
      "old_id": "37106d7ef59c3c2529682ac859ef3c49e2075125",
      "old_mode": 33188,
      "old_path": "tests/unit_tests/runtime/skinned_winding_test.cpp",
      "new_id": "cdb224fc5a7eed6289bc3ce116add2cfb5d3080a",
      "new_mode": 33188,
      "new_path": "tests/unit_tests/runtime/skinned_winding_test.cpp"
    }
  ]
}
