Browse Source

Rotate children of IK chain

* Add button to auto-bone shapes
* Fix setting of bone start not setting pose start as well
* Add selected shape overlay
master
Macoy Madson 4 months ago
parent
commit
8b737ad387
  1. 358
      data/TestPuppet_skeleton.cakedata
  2. 125
      src/VectorPuppetShow.cake

358
data/TestPuppet_skeleton.cakedata

@ -3,63 +3,63 @@
:parent-shape-id "UpperBody"
:start-position (vec 435.000 255.000)
:end-position (vec 250.000 253.000)
:pose-start-position (vec 435.000 255.000)
:pose-end-position (vec 249.000 254.000)) (skeleton-bone :shape-id "Arm_Lower_Right"
:pose-start-position (vec 378.968 298.278)
:pose-end-position (vec 246.863 427.805)) (skeleton-bone :shape-id "Arm_Lower_Right"
:parent-shape-id "Arm_Upper_Right"
:start-position (vec 268.000 256.000)
:end-position (vec 110.000 255.000)
:pose-start-position (vec 268.000 256.000)
:pose-end-position (vec 115.000 254.000)) (skeleton-bone :shape-id "Arm_Upper_Left"
:pose-start-position (vec 261.702 417.184)
:pose-end-position (vec 373.288 529.048)) (skeleton-bone :shape-id "Arm_Upper_Left"
:parent-shape-id "UpperBody"
:start-position (vec 584.000 253.000)
:end-position (vec 772.000 254.000)
:pose-start-position (vec 584.000 253.000)
:pose-end-position (vec 770.000 255.000)) (skeleton-bone :shape-id "Arm_Lower_Left"
:pose-end-position (vec 772.000 254.000)) (skeleton-bone :shape-id "Arm_Lower_Left"
:parent-shape-id "Arm_Upper_Left"
:start-position (vec 758.000 256.000)
:end-position (vec 919.000 254.000)
:pose-start-position (vec 758.000 256.000)
:pose-end-position (vec 913.000 254.000)) (skeleton-bone :shape-id "Hand_Right"
:pose-end-position (vec 919.000 254.000)) (skeleton-bone :shape-id "Hand_Right"
:parent-shape-id "Arm_Lower_Right"
:start-position (vec 96.000 255.000)
:end-position (vec 63.000 256.000)
:pose-start-position (vec 96.000 255.000)
:pose-end-position (vec 63.000 256.000)) (skeleton-bone :shape-id "Hand_Left"
:pose-start-position (vec 383.238 538.897)
:pose-end-position (vec 387.230 506.125)) (skeleton-bone :shape-id "Hand_Left"
:parent-shape-id "Arm_Lower_Left"
:start-position (vec 922.000 255.000)
:end-position (vec 963.000 255.000)
:pose-start-position (vec 922.000 255.000)
:pose-end-position (vec 997.000 252.000)) (skeleton-bone :shape-id "Waist"
:pose-end-position (vec 963.000 255.000)) (skeleton-bone :shape-id "Waist"
:parent-shape-id "Hip"
:start-position (vec 511.000 449.000)
:end-position (vec 514.000 353.000)
:pose-start-position (vec 511.000 449.000)
:pose-end-position (vec 515.000 354.000)) (skeleton-bone :shape-id "UpperBody"
:pose-end-position (vec 497.275 353.939)) (skeleton-bone :shape-id "UpperBody"
:parent-shape-id "Waist"
:start-position (vec 507.000 372.000)
:end-position (vec 508.000 231.000)
:pose-start-position (vec 507.000 372.000)
:pose-end-position (vec 508.000 230.000)) (skeleton-bone :shape-id "Neck"
:pose-start-position (vec 493.683 373.866)
:pose-end-position (vec 434.976 245.665)) (skeleton-bone :shape-id "Neck"
:parent-shape-id "UpperBody"
:start-position (vec 509.000 223.000)
:end-position (vec 510.000 195.000)
:pose-start-position (vec 509.000 223.000)
:pose-end-position (vec 510.000 196.000)) (skeleton-bone :shape-id "Head"
:pose-end-position (vec 510.000 195.000)) (skeleton-bone :shape-id "Head"
:parent-shape-id "Neck"
:start-position (vec 509.000 177.000)
:end-position (vec 510.000 14.000)
:pose-start-position (vec 509.000 177.000)
:pose-end-position (vec 509.000 14.000)) (skeleton-bone :shape-id "Leg_Upper_Right"
:pose-end-position (vec 510.000 14.000)) (skeleton-bone :shape-id "Leg_Upper_Right"
:parent-shape-id "Hip"
:start-position (vec 437.000 484.000)
:end-position (vec 439.000 738.000)
:pose-start-position (vec 437.000 484.000)
:pose-end-position (vec 440.000 736.000)) (skeleton-bone :shape-id "Leg_Upper_Left"
:pose-end-position (vec 439.000 738.000)) (skeleton-bone :shape-id "Leg_Upper_Left"
:parent-shape-id "Hip"
:start-position (vec 579.000 474.000)
:end-position (vec 581.000 739.000)
:pose-start-position (vec 579.000 474.000)
:pose-end-position (vec 582.000 737.000)) (skeleton-bone :shape-id "Leg_Lower_Left"
:pose-end-position (vec 581.000 739.000)) (skeleton-bone :shape-id "Leg_Lower_Left"
:parent-shape-id "Leg_Upper_Left"
:start-position (vec 578.000 701.000)
:end-position (vec 580.000 944.000)
@ -69,12 +69,12 @@
:start-position (vec 439.000 705.000)
:end-position (vec 438.000 951.000)
:pose-start-position (vec 439.000 705.000)
:pose-end-position (vec 438.000 937.000)) (skeleton-bone :shape-id "Foot_Right"
:pose-end-position (vec 438.000 951.000)) (skeleton-bone :shape-id "Foot_Right"
:parent-shape-id "Leg_Lower_Right"
:start-position (vec 438.000 940.000)
:end-position (vec 438.000 1009.000)
:pose-start-position (vec 438.000 940.000)
:pose-end-position (vec 438.000 1008.000)) (skeleton-bone :shape-id "Foot_Left"
:pose-end-position (vec 438.000 1009.000)) (skeleton-bone :shape-id "Foot_Left"
:parent-shape-id "Leg_Lower_Left"
:start-position (vec 579.000 953.000)
:end-position (vec 577.000 1002.000)
@ -84,7 +84,327 @@
:start-position (vec 510.000 465.000)
:end-position (vec 593.000 463.000)
:pose-start-position (vec 510.000 465.000)
:pose-end-position (vec 593.000 465.000)) (skeleton-bone :shape-id ""
:pose-end-position (vec 593.000 463.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)
:pose-start-position (vec 0.000 0.000)
:pose-end-position (vec 0.000 0.000)) (skeleton-bone :shape-id ""
:parent-shape-id ""
:start-position (vec 0.000 0.000)
:end-position (vec 0.000 0.000)

125
src/VectorPuppetShow.cake

@ -253,6 +253,65 @@
(set (path bone > pose-start-position) (path bone > start-position))
(set (path bone > pose-end-position) (path bone > end-position))))
;; Does NOT rotate child bone
(defun-local reposition-child-bone-to-rotated-parent-end (parent-bone (addr skeleton-bone)
child-bone (addr skeleton-bone)
parent-rotation-matrix mat2)
;; Rotate the offset between the parent's end position and the child's start position, then
;; reposition the child's start (with now rotated offset) to the rotated parent's end pose
(var child-pose-start-position vec2
(vec2-add
(path parent-bone > pose-end-position)
(mat2-transform-vec2
parent-rotation-matrix
(vec2-subtract (path child-bone > start-position)
(path parent-bone > end-position)))))
;; Keep the exact relationship between start and end for the child bone (bone length and
;; angle at rest). It will rotate itself next loop when it becomes the parent bone.
(var child-pose-end-position vec2
(vec2-add
child-pose-start-position
(vec2-subtract (path child-bone > end-position)
(path child-bone > start-position))))
(set (path child-bone > pose-start-position) child-pose-start-position)
(set (path child-bone > pose-end-position) child-pose-end-position))
;; bone-to-ignore is going to be the next parent, e.g. a "primary" child in the bone IK chain. It
;; will rotate itself the parent way next iteration, so we want to filter it out.
;; TODO: Prevent infinite loops
(defun-local reposition-rotate-secondary-children (skeleton (addr skeleton-data)
parent-bone (addr skeleton-bone)
turns-parent-rotated float
bone-to-ignore (addr skeleton-bone))
(var parent-bone-id (unsigned int)
(id-from-string (addr g-string-table)
(path parent-bone > shape-id)
(strlen (path parent-bone > shape-id))))
(var rotation-matrix mat2 (mat2-rotate-turns turns-parent-rotated))
(each-item-addr-in-array (path skeleton > bones) i bone (addr skeleton-bone)
(unless (= parent-bone-id
(id-from-string (addr g-string-table)
(path bone > parent-shape-id)
(strlen (path bone > parent-shape-id))))
(continue))
(when (= bone-to-ignore bone)
(continue))
(reposition-child-bone-to-rotated-parent-end parent-bone bone rotation-matrix)
;; And now rotate the child bone
(var bone-pose-end-position vec2
(vec2-add
(path bone > pose-start-position)
(mat2-transform-vec2 rotation-matrix
(vec2-subtract (path bone > pose-end-position)
(path bone > pose-start-position)))))
(set (path bone > pose-end-position) bone-pose-end-position)
;; Recurse. Don't need to ignore any bones because we already ignored the primary child in the
;; very first call.
(reposition-rotate-secondary-children skeleton bone turns-parent-rotated null)))
(defun-local do-inverse-kinematics (skeleton (addr skeleton-data)
effectors (addr skeleton-effector)
num-effectors int)
@ -377,7 +436,10 @@
(var child-bone-index int (- turn-index 1))
(unless (>= child-bone-index 0)
;; If our IK target bone has children, rotate them too
(reposition-rotate-secondary-children skeleton parent-bone bone-turns null)
(break))
;; This makes the end effector get closer sometimes, but in other cases it gets further
;; Commenting this makes the end bone position no longer align with the working end bone pose
;; position, meaning this code is necessary to maintain synchronization between the expected
@ -386,25 +448,10 @@
(+ (at child-bone-index bone-rotations-turns) bone-turns))
(var child-bone (addr skeleton-bone) (at child-bone-index bone-chain))
;; Rotate the offset between the parent's end position and the child's start position, then
;; reposition the child's start (with now rotated offset) to the rotated parent's end pose
(var child-pose-start-position vec2
(vec2-add
(path parent-bone > pose-end-position)
(mat2-transform-vec2
rotation-matrix
(vec2-subtract (path child-bone > start-position)
(path parent-bone > end-position)))))
;; Keep the exact relationship between start and end for the child bone (bone length and
;; angle at rest). It will rotate itself next loop when it becomes the parent bone.
(var child-pose-end-position vec2
(vec2-add
child-pose-start-position
(vec2-subtract (path child-bone > end-position)
(path child-bone > start-position))))
(reposition-rotate-secondary-children skeleton parent-bone bone-turns child-bone)
(set (path child-bone > pose-start-position) child-pose-start-position)
(set (path child-bone > pose-end-position) child-pose-end-position)))))
;; We only reposition, not rotate
(reposition-child-bone-to-rotated-parent-end parent-bone child-bone rotation-matrix)))))
(defun-local get-bone-for-shape (shape (addr NSVGshape)
skeleton (addr skeleton-data)
@ -1030,7 +1077,9 @@
(set-fields (deref selected-bone)
shape selected-shape
(start-position X) mouse-x
(start-position Y) mouse-y))
(start-position Y) mouse-y
(pose-start-position X) mouse-x
(pose-start-position Y) mouse-y))
((bit-and mouse-button-state SDL_BUTTON_RMASK)
(set-fields (deref selected-bone)
shape selected-shape
@ -1097,20 +1146,50 @@
(when (do-button renderer
(addr (field (at body-font-index font-atlases) atlas))
(field (at body-font-index font-atlases) texture)
(+ start-ui-pane 260) 880 250 75 "Set IK target")
(+ start-ui-pane 5 (* 1 255)) 880 250 75 "Set IK target")
(set effector-target (path selected-shape > id)))
(when (do-button renderer
(addr (field (at body-font-index font-atlases) atlas))
(field (at body-font-index font-atlases) texture)
(+ start-ui-pane 515) 880 250 75 "(P)arent")
(set assigning-parent (not assigning-parent))))
(+ start-ui-pane 5 (* 2 255)) 880 250 75 "(P)arent")
(set assigning-parent (not assigning-parent)))
;; Set bone position to the min and max of the shape. Useful when the bone isn't important
(when (do-button renderer
(addr (field (at body-font-index font-atlases) atlas))
(field (at body-font-index font-atlases) texture)
(+ start-ui-pane 5 (* 3 255)) 880 250 75 "Auto bone")
(var sized-bounds (array 4 int) (array 0))
(nanosvg-get-shape-bounds-with-stroke-int selected-shape sized-bounds)
(set-fields (deref selected-bone)
(start-position X) (at 0 sized-bounds)
(start-position Y) (at 1 sized-bounds)
(pose-start-position X) (at 0 sized-bounds)
(pose-start-position Y) (at 1 sized-bounds)
(end-position X) (at 2 sized-bounds)
(end-position Y) (at 3 sized-bounds)
(pose-end-position X) (at 2 sized-bounds)
(pose-end-position Y) (at 3 sized-bounds))))
(when selected-shape
(render-string
renderer (addr (field (at body-font-index font-atlases) atlas))
(field (at body-font-index font-atlases) texture)
10 (- true-window-height 140)
"MMB: Start RMB: End C-MMB: Pose end"))
"MMB: Start RMB: End C-MMB: Pose end")
(var sized-bounds (array 4 int) (array 0))
(nanosvg-get-shape-bounds-with-stroke-int selected-shape sized-bounds)
(var shape-rect SDL_Rect
(array (at 0 sized-bounds)
(at 1 sized-bounds)
(type-cast (- (at 2 sized-bounds)
(at 0 sized-bounds))
int)
(type-cast (- (at 3 sized-bounds)
(at 1 sized-bounds))
int)))
(SDL_SetRenderDrawColor renderer 10 100 250 255)
(SDL_RenderDrawRect renderer (addr shape-rect)))
(SDL_RenderPresent renderer)
(SDL_UpdateWindowSurface window)

Loading…
Cancel
Save