@bitefoundry/retrieviewer 0.0.19 → 0.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1240,8 +1240,12 @@ function createComfortSpriteSampler(bytes, info, output) {
1240
1240
  }
1241
1241
 
1242
1242
  // puppy-mouth-anchor.mjs
1243
- var MOUTH_ANCHORS = { version: 1, ballRadiusPx: 17.5, families: { approach: { sha256: "f5558c57d5a445d396e06c060f9f8d64e6ce0ff5b9b92fa6d77ef9bb2984a2fe", frames: [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, [224.66, 147.5, 0.9, 0.904], [222.44, 147.33, 0.9, 0.915], [219.17, 148.34, 0.9, 0.934], [215.72, 149.59, 0.92, 0.945], [212.89, 150.36, 0.92, 0.957], [209.34, 151.71, 0.94, 0.966], [206.61, 152.52, 0.94, 0.972], [202.85, 153.49, 0.94, 0.965], [202.85, 153.49, 0.94, 0.965], [198.71, 154.18, 0.96, 0.966], [195.56, 154.22, 0.96, 0.97], [191.82, 155.11, 0.98, 0.967], [188.11, 155.2, 0.98, 0.966], [184.12, 154.72, 0.96, 0.966], [180.5, 154.77, 0.96, 0.968], [177.45, 154.9, 0.96, 0.97], [173.13, 154.91, 0.96, 0.965], [173.13, 154.91, 0.96, 0.965], [175.53, 155.91, 0.96, 0.974], [177.69, 157.9, 0.98, 0.976], [179.97, 159.24, 0.98, 0.983], [182.41, 161.16, 0.98, 0.988], [184.55, 162.2, 0.98, 0.987], [186.96, 165.39, 1, 0.991], [189.54, 166, 0.98, 0.986], [191.7, 168.3, 1, 1], [191.7, 168.3, 1, 1], [190.78, 168.33, 1, 0.999], [190.26, 168.08, 0.98, 0.983], [189.46, 169.24, 1, 0.994], [188.66, 169.45, 1, 0.988], [187.9, 169.62, 1, 0.977], [187.07, 168.92, 0.98, 0.971], [186.15, 171.37, 1.02, 0.964], [185.12, 171.44, 1.02, 0.959], [185.12, 171.44, 1.02, 0.959], [183.01, 167.4, 0.98, 0.967], [180.53, 166.1, 1, 0.965], [178.7, 163.98, 0.98, 0.962], [176.6, 160.9, 0.96, 0.958], [174.17, 158.89, 0.96, 0.958], [172.42, 158.03, 0.98, 0.948], [170.58, 155.84, 0.96, 0.945], [168.27, 154.8, 0.98, 0.932], [168.27, 154.8, 0.98, 0.932], [168.28, 154.25, 0.98, 0.941], [167.82, 153.76, 0.98, 0.938], [167.36, 153.07, 0.98, 0.941], [167.1, 151.76, 0.96, 0.941], [166.97, 152.2, 0.98, 0.947], [166.89, 151.46, 0.98, 0.944], [166.21, 151.32, 0.98, 0.944], [166.05, 150.38, 0.98, 0.943], [166.05, 150.38, 0.98, 0.943], [168.13, 148.79, 0.96, 0.945], [169.85, 149.25, 0.98, 0.951], [172.04, 147.99, 0.98, 0.948], [174.87, 146.91, 0.98, 0.947], [176.38, 147.11, 1, 0.947], [179.35, 146.95, 1.02, 0.941], [181.18, 146.19, 1.02, 0.943], [183.86, 145.25, 1.02, 0.942], [183.86, 145.25, 1.02, 0.942], [182.95, 145.34, 1.02, 0.946], [182.65, 145.38, 1.02, 0.953], [181.7, 145.7, 1.02, 0.948], [181.06, 145.96, 1.02, 0.949], [180.46, 145.26, 1, 0.954], [179.53, 146.46, 1.02, 0.949], [179.36, 146.51, 1.02, 0.948], [178.41, 146.53, 1.02, 0.947], [178.41, 146.53, 1.02, 0.947], [180.31, 147.47, 1.02, 0.952], [181.26, 147.72, 1.02, 0.954], [183.14, 147.04, 0.98, 0.957], [184.8, 149.17, 1, 0.967], [186.42, 150.19, 1, 0.966], [188.41, 150.46, 1, 0.966], [189.95, 151.41, 1, 0.971], [191.61, 152.4, 1, 0.971], [191.61, 152.4, 1, 0.971], [189.01, 151.48, 1, 0.971], [186.85, 151.25, 1, 0.979], [184.64, 150.57, 1, 0.975], [182.06, 149.13, 0.98, 0.974], [179.48, 149.48, 1, 0.976], [177.17, 149.61, 1.02, 0.976], [175.2, 149.27, 1.02, 0.979], [172.3, 148.6, 1.02, 0.975], [172.3, 148.6, 1.02, 0.975], [175.21, 151.35, 1.02, 0.979], [177.27, 153.34, 1.02, 0.982], [179.97, 155.12, 1, 0.983], [181.35, 158.65, 1.02, 0.988], [184.96, 160.94, 1, 0.987], [187.54, 163.29, 1, 0.996], [189.22, 166.33, 1.02, 0.992], [191.7, 168.3, 1, 1], [191.7, 168.3, 1, 1], [189.18, 166.28, 1, 0.99], [186.95, 164.07, 0.98, 0.991], [184.75, 163.57, 1, 0.987], [182.21, 160.91, 0.98, 0.986], [180.15, 158.8, 0.96, 0.98], [177.73, 156.71, 0.96, 0.974], [175.67, 155.87, 0.96, 0.97], [173.13, 154.91, 0.96, 0.965], [173.13, 154.91, 0.96, 0.965], [176.75, 154.83, 0.96, 0.966], [180.19, 154.77, 0.96, 0.966], [183.7, 154.69, 0.96, 0.966], [187.78, 153.74, 0.94, 0.965], [191.91, 155.07, 0.98, 0.968], [195.35, 154.27, 0.96, 0.969], [199.09, 154.17, 0.96, 0.968], [202.85, 153.49, 0.94, 0.965], [202.85, 153.49, 0.94, 0.965], [206.07, 152.72, 0.94, 0.968], [209.04, 152.89, 0.96, 0.962], [211.97, 151.51, 0.94, 0.959], [215.45, 150.92, 0.94, 0.941], [218.71, 149.41, 0.92, 0.933], [221.75, 148.5, 0.9, 0.92], [224.95, 147.58, 0.9, 0.903], null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] }, behaviors: { sha256: "7918261fb64c57a91739729841fd84c6dd53891196c7fb76ee9c27712ab6ef5d", frames: [[201.21, 166.15, 0.98, 0.959], [200.4, 166.14, 0.98, 0.961], [200.13, 166.16, 0.98, 0.963], [199.21, 166.15, 0.98, 0.964], [198.65, 166.13, 0.98, 0.964], [197.98, 166.12, 0.98, 0.967], [197.08, 166.1, 0.98, 0.966], [196.87, 166.13, 0.98, 0.966], [195.93, 166.1, 0.98, 0.965], [195.93, 166.1, 0.98, 0.965], [196.01, 166.1, 0.98, 0.967], [196.35, 166.05, 0.98, 0.96], [196.85, 166.1, 0.98, 0.966], [197.08, 166.07, 0.98, 0.964], [197.25, 166.07, 0.98, 0.96], [197.72, 166.12, 0.98, 0.963], [198.13, 166.05, 0.98, 0.957], [198.18, 166.04, 0.98, 0.954], [198.18, 166.04, 0.98, 0.954], [198.23, 166.06, 0.98, 0.957], [198.26, 166.09, 0.98, 0.957], [198.28, 166.12, 0.98, 0.958], [198.81, 167.29, 1, 0.968], [198.92, 167.34, 1, 0.966], [198.98, 167.37, 1, 0.964], [199.06, 167.41, 1, 0.962], [199.07, 167.42, 1, 0.96], [199.07, 167.42, 1, 0.96], [199.16, 167.39, 1, 0.96], [199.43, 167.35, 1, 0.96], [199.96, 167.33, 1, 0.965], [200.14, 166.34, 0.98, 0.965], [200.28, 166.27, 0.98, 0.963], [200.84, 166.24, 0.98, 0.965], [201.14, 166.17, 0.98, 0.962], [201.21, 166.15, 0.98, 0.959], [191.7, 168.3, 1, 1], [192.77, 168.21, 1, 0.999], [194.11, 167.32, 0.98, 0.992], [195.54, 167.92, 1, 0.986], [196.71, 166.87, 0.98, 0.982], [197.88, 167.48, 1, 0.978], [199.08, 166.37, 0.98, 0.973], [200.32, 166.2, 0.98, 0.965], [201.21, 166.15, 0.98, 0.959], [201.21, 166.15, 0.98, 0.959], [201.8, 170.56, 1, 0.964], [202.18, 172.74, 0.98, 0.965], [202.46, 176.13, 0.98, 0.966], [203.09, 179.85, 0.98, 0.968], [203.28, 183.55, 0.98, 0.961], [203.98, 187.56, 1, 0.963], [204.72, 190.66, 1, 0.967], [204.91, 194.05, 1, 0.954], [204.91, 194.05, 1, 0.954], [203.9, 194.08, 1, 0.956], [202.88, 194.15, 0.98, 0.958], [201.8, 195, 1, 0.958], [200.65, 195.45, 1, 0.961], [199.66, 196.08, 1, 0.957], [198.46, 196.15, 1, 0.953], [197.37, 196.24, 0.98, 0.95], [196.35, 196.3, 0.98, 0.947], [196.35, 196.3, 0.98, 0.947], [192.86, 196.11, 1, 0.951], [190.53, 196.01, 1, 0.951], [187.51, 196, 1, 0.949], [184.08, 194.32, 0.98, 0.952], [180.99, 193.88, 0.98, 0.949], [177.81, 194.62, 1, 0.949], [175.36, 194.61, 1.02, 0.95], [171.67, 193.62, 1, 0.944], [171.67, 193.62, 1, 0.944], [174.59, 193.5, 1.02, 0.952], [177.38, 192.46, 1.02, 0.95], [180.43, 190.38, 1, 0.957], [183.32, 188.01, 0.98, 0.95], [186.05, 187, 0.98, 0.954], [189.53, 187.6, 1.02, 0.95], [192.59, 185.84, 1, 0.945], [195.46, 183.93, 0.98, 0.942], [195.46, 183.93, 0.98, 0.942], [195.23, 182.08, 0.98, 0.958], [194.56, 180.73, 1, 0.963], [194.34, 179.26, 1, 0.974], [193.93, 177.12, 1, 0.982], [193.33, 175.54, 1.02, 0.983], [192.7, 173.2, 1, 0.996], [192.66, 170.55, 1, 0.992], [191.7, 168.3, 1, 1], null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] }, seat: { sha256: "613dbeeeaec11804e80db0216922c8f62294745514ee6283bdce61a6d784dd5e", frames: [[191.7, 168.3, 1, 1], [187.28, 167.83, 0.98, 0.992], [186.01, 168.11, 0.98, 0.997], [184.36, 167.85, 0.96, 0.997], [182.14, 168.27, 0.96, 0.99], [179.4, 167.97, 0.94, 0.989], [177.05, 167.47, 0.92, 0.991], [174.39, 167.11, 0.9, 0.982], [171.52, 167.84, 0.9, 0.977], [169.74, 168.03, 0.9, 0.978], [166.37, 168.27, 0.9, 0.98], [163.95, 166.65, 0.86, 0.975], [161.1, 167.16, 0.86, 0.973], [158.82, 167.1, 0.86, 0.97], [157.06, 167.85, 0.86, 0.97], [155.39, 167.09, 0.84, 0.966], [152.19, 167.86, 0.84, 0.951], [152.19, 167.86, 0.84, 0.951], [152.24, 167.87, 0.84, 0.952], [152.26, 167.86, 0.84, 0.953], [152.26, 167.85, 0.84, 0.953], [152.27, 167.85, 0.84, 0.953], [152.3, 167.84, 0.84, 0.954], [152.33, 167.83, 0.84, 0.954], [152.69, 166.08, 0.8, 0.956], [152.75, 166.06, 0.8, 0.956], [152.77, 166.04, 0.8, 0.957], [153.16, 166.03, 0.8, 0.957], [153.19, 166.03, 0.8, 0.956], [153.21, 166.02, 0.8, 0.955], [153.23, 166.02, 0.8, 0.955], [153.27, 166.02, 0.8, 0.953], [153.37, 166.03, 0.8, 0.952], [153.28, 166.02, 0.8, 0.952], [153.28, 166.02, 0.8, 0.952], [154.28, 166.02, 0.8, 0.954], [154.49, 166.87, 0.82, 0.951], [155.31, 165.99, 0.8, 0.953], [156.08, 165.96, 0.8, 0.956], [156.67, 166.83, 0.82, 0.958], [157.34, 166.82, 0.82, 0.955], [158.31, 166.73, 0.82, 0.956], [158.83, 166.62, 0.82, 0.96], [159.42, 166.54, 0.82, 0.958], [160.23, 166.48, 0.82, 0.952], [160.85, 166.5, 0.82, 0.954], [161.4, 166.49, 0.82, 0.954], [162.04, 166.45, 0.82, 0.947], [162.98, 166.47, 0.82, 0.947], [163.19, 166.46, 0.82, 0.946], [164.02, 166.47, 0.82, 0.945]] }, arrivalSeat: { sha256: "13acb62fd573ff7ef97bcf59be80757897fe9d1784f187ab278990ff94a643b9", frames: [[195.46, 183.93, 0.98, 0.942], [191.05, 182.87, 0.98, 0.955], [189.92, 182.76, 0.98, 0.95], [187.17, 181.29, 0.96, 0.954], [184.77, 179.89, 0.94, 0.954], [182.36, 179.93, 0.96, 0.955], [179.54, 177.85, 0.94, 0.96], [176.3, 176.4, 0.92, 0.959], [174.08, 175.36, 0.9, 0.966], [171.91, 174.25, 0.9, 0.958], [168.15, 172.23, 0.88, 0.953], [165.17, 170.82, 0.86, 0.963], [162.45, 171.28, 0.88, 0.959], [160.06, 170.01, 0.86, 0.965], [157.6, 169.78, 0.86, 0.959], [155.67, 167.31, 0.82, 0.96], [152.19, 167.86, 0.84, 0.951], [152.19, 167.86, 0.84, 0.951], [152.24, 167.87, 0.84, 0.952], [152.26, 167.86, 0.84, 0.953], [152.26, 167.85, 0.84, 0.953], [152.27, 167.85, 0.84, 0.953], [152.3, 167.84, 0.84, 0.954], [152.33, 167.83, 0.84, 0.954], [152.69, 166.08, 0.8, 0.956], [152.75, 166.06, 0.8, 0.956], [152.77, 166.04, 0.8, 0.957], [153.16, 166.03, 0.8, 0.957], [153.19, 166.03, 0.8, 0.956], [153.21, 166.02, 0.8, 0.955], [153.23, 166.02, 0.8, 0.955], [153.27, 166.02, 0.8, 0.953], [153.37, 166.03, 0.8, 0.952], [153.28, 166.02, 0.8, 0.952], [153.28, 166.02, 0.8, 0.952], [154.28, 166.02, 0.8, 0.954], [154.49, 166.87, 0.82, 0.951], [155.31, 165.99, 0.8, 0.953], [156.08, 165.96, 0.8, 0.956], [156.67, 166.83, 0.82, 0.958], [157.34, 166.82, 0.82, 0.955], [158.31, 166.73, 0.82, 0.956], [158.83, 166.62, 0.82, 0.96], [159.42, 166.54, 0.82, 0.958], [160.23, 166.48, 0.82, 0.952], [160.85, 166.5, 0.82, 0.954], [161.4, 166.49, 0.82, 0.954], [162.04, 166.45, 0.82, 0.947], [162.98, 166.47, 0.82, 0.947], [163.19, 166.46, 0.82, 0.946], [164.02, 166.47, 0.82, 0.945]] } } };
1243
+ var MOUTH_ANCHORS = { version: 1, canonical: 320, ballRadiusPx: 17.5, mouthOffsetPx: 25, minScore: 0.9, seed: { family: "approach", frame: 45, box: [158, 108, 68, 50], nose: [191.7, 143.3] }, method: "cv2 TM_CCOEFF_NORMED multi-scale match of measured eyes+nose seed; mouth = nose + scale*offset (down)", unsupported: "front side-view tween, rear, actions (incl. walk-enter/walk), interactions, behaviors watch/rest", families: { approach: { cache: "puppy-paper-approach.bin.gz", sha256: "f5558c57d5a445d396e06c060f9f8d64e6ce0ff5b9b92fa6d77ef9bb2984a2fe", samples: 9, covered: 124, frames: [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, [224.66, 147.5, 0.9, 0.904], [222.44, 147.33, 0.9, 0.915], [219.17, 148.34, 0.9, 0.934], [215.72, 149.59, 0.92, 0.945], [212.89, 150.36, 0.92, 0.957], [209.34, 151.71, 0.94, 0.966], [206.61, 152.52, 0.94, 0.972], [202.85, 153.49, 0.94, 0.965], [202.85, 153.49, 0.94, 0.965], [198.71, 154.18, 0.96, 0.966], [195.56, 154.22, 0.96, 0.97], [191.82, 155.11, 0.98, 0.967], [188.11, 155.2, 0.98, 0.966], [184.12, 154.72, 0.96, 0.966], [180.5, 154.77, 0.96, 0.968], [177.45, 154.9, 0.96, 0.97], [173.13, 154.91, 0.96, 0.965], [173.13, 154.91, 0.96, 0.965], [175.53, 155.91, 0.96, 0.974], [177.69, 157.9, 0.98, 0.976], [179.97, 159.24, 0.98, 0.983], [182.41, 161.16, 0.98, 0.988], [184.55, 162.2, 0.98, 0.987], [186.96, 165.39, 1, 0.991], [189.54, 166, 0.98, 0.986], [191.7, 168.3, 1, 1], [191.7, 168.3, 1, 1], [190.78, 168.33, 1, 0.999], [190.26, 168.08, 0.98, 0.983], [189.46, 169.24, 1, 0.994], [188.66, 169.45, 1, 0.988], [187.9, 169.62, 1, 0.977], [187.07, 168.92, 0.98, 0.971], [186.15, 171.37, 1.02, 0.964], [185.12, 171.44, 1.02, 0.959], [185.12, 171.44, 1.02, 0.959], [183.01, 167.4, 0.98, 0.967], [180.53, 166.1, 1, 0.965], [178.7, 163.98, 0.98, 0.962], [176.6, 160.9, 0.96, 0.958], [174.17, 158.89, 0.96, 0.958], [172.42, 158.03, 0.98, 0.948], [170.58, 155.84, 0.96, 0.945], [168.27, 154.8, 0.98, 0.932], [168.27, 154.8, 0.98, 0.932], [168.28, 154.25, 0.98, 0.941], [167.82, 153.76, 0.98, 0.938], [167.36, 153.07, 0.98, 0.941], [167.1, 151.76, 0.96, 0.941], [166.97, 152.2, 0.98, 0.947], [166.89, 151.46, 0.98, 0.944], [166.21, 151.32, 0.98, 0.944], [166.05, 150.38, 0.98, 0.943], [166.05, 150.38, 0.98, 0.943], [168.13, 148.79, 0.96, 0.945], [169.85, 149.25, 0.98, 0.951], [172.04, 147.99, 0.98, 0.948], [174.87, 146.91, 0.98, 0.947], [176.38, 147.11, 1, 0.947], [179.35, 146.95, 1.02, 0.941], [181.18, 146.19, 1.02, 0.943], [183.86, 145.25, 1.02, 0.942], [183.86, 145.25, 1.02, 0.942], [182.95, 145.34, 1.02, 0.946], [182.65, 145.38, 1.02, 0.953], [181.7, 145.7, 1.02, 0.948], [181.06, 145.96, 1.02, 0.949], [180.46, 145.26, 1, 0.954], [179.53, 146.46, 1.02, 0.949], [179.36, 146.51, 1.02, 0.948], [178.41, 146.53, 1.02, 0.947], [178.41, 146.53, 1.02, 0.947], [180.31, 147.47, 1.02, 0.952], [181.26, 147.72, 1.02, 0.954], [183.14, 147.04, 0.98, 0.957], [184.8, 149.17, 1, 0.967], [186.42, 150.19, 1, 0.966], [188.41, 150.46, 1, 0.966], [189.95, 151.41, 1, 0.971], [191.61, 152.4, 1, 0.971], [191.61, 152.4, 1, 0.971], [189.01, 151.48, 1, 0.971], [186.85, 151.25, 1, 0.979], [184.64, 150.57, 1, 0.975], [182.06, 149.13, 0.98, 0.974], [179.48, 149.48, 1, 0.976], [177.17, 149.61, 1.02, 0.976], [175.2, 149.27, 1.02, 0.979], [172.3, 148.6, 1.02, 0.975], [172.3, 148.6, 1.02, 0.975], [175.21, 151.35, 1.02, 0.979], [177.27, 153.34, 1.02, 0.982], [179.97, 155.12, 1, 0.983], [181.35, 158.65, 1.02, 0.988], [184.96, 160.94, 1, 0.987], [187.54, 163.29, 1, 0.996], [189.22, 166.33, 1.02, 0.992], [191.7, 168.3, 1, 1], [191.7, 168.3, 1, 1], [189.18, 166.28, 1, 0.99], [186.95, 164.07, 0.98, 0.991], [184.75, 163.57, 1, 0.987], [182.21, 160.91, 0.98, 0.986], [180.15, 158.8, 0.96, 0.98], [177.73, 156.71, 0.96, 0.974], [175.67, 155.87, 0.96, 0.97], [173.13, 154.91, 0.96, 0.965], [173.13, 154.91, 0.96, 0.965], [176.75, 154.83, 0.96, 0.966], [180.19, 154.77, 0.96, 0.966], [183.7, 154.69, 0.96, 0.966], [187.78, 153.74, 0.94, 0.965], [191.91, 155.07, 0.98, 0.968], [195.35, 154.27, 0.96, 0.969], [199.09, 154.17, 0.96, 0.968], [202.85, 153.49, 0.94, 0.965], [202.85, 153.49, 0.94, 0.965], [206.07, 152.72, 0.94, 0.968], [209.04, 152.89, 0.96, 0.962], [211.97, 151.51, 0.94, 0.959], [215.45, 150.92, 0.94, 0.941], [218.71, 149.41, 0.92, 0.933], [221.75, 148.5, 0.9, 0.92], [224.95, 147.58, 0.9, 0.903], null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] }, behaviors: { cache: "puppy-paper-behaviors.bin.gz", sha256: "7918261fb64c57a91739729841fd84c6dd53891196c7fb76ee9c27712ab6ef5d", samples: 9, covered: 90, frames: [[201.21, 166.15, 0.98, 0.959], [200.4, 166.14, 0.98, 0.961], [200.13, 166.16, 0.98, 0.963], [199.21, 166.15, 0.98, 0.964], [198.65, 166.13, 0.98, 0.964], [197.98, 166.12, 0.98, 0.967], [197.08, 166.1, 0.98, 0.966], [196.87, 166.13, 0.98, 0.966], [195.93, 166.1, 0.98, 0.965], [195.93, 166.1, 0.98, 0.965], [196.01, 166.1, 0.98, 0.967], [196.35, 166.05, 0.98, 0.96], [196.85, 166.1, 0.98, 0.966], [197.08, 166.07, 0.98, 0.964], [197.25, 166.07, 0.98, 0.96], [197.72, 166.12, 0.98, 0.963], [198.13, 166.05, 0.98, 0.957], [198.18, 166.04, 0.98, 0.954], [198.18, 166.04, 0.98, 0.954], [198.23, 166.06, 0.98, 0.957], [198.26, 166.09, 0.98, 0.957], [198.28, 166.12, 0.98, 0.958], [198.81, 167.29, 1, 0.968], [198.92, 167.34, 1, 0.966], [198.98, 167.37, 1, 0.964], [199.06, 167.41, 1, 0.962], [199.07, 167.42, 1, 0.96], [199.07, 167.42, 1, 0.96], [199.16, 167.39, 1, 0.96], [199.43, 167.35, 1, 0.96], [199.96, 167.33, 1, 0.965], [200.14, 166.34, 0.98, 0.965], [200.28, 166.27, 0.98, 0.963], [200.84, 166.24, 0.98, 0.965], [201.14, 166.17, 0.98, 0.962], [201.21, 166.15, 0.98, 0.959], [191.7, 168.3, 1, 1], [192.77, 168.21, 1, 0.999], [194.11, 167.32, 0.98, 0.992], [195.54, 167.92, 1, 0.986], [196.71, 166.87, 0.98, 0.982], [197.88, 167.48, 1, 0.978], [199.08, 166.37, 0.98, 0.973], [200.32, 166.2, 0.98, 0.965], [201.21, 166.15, 0.98, 0.959], [201.21, 166.15, 0.98, 0.959], [201.8, 170.56, 1, 0.964], [202.18, 172.74, 0.98, 0.965], [202.46, 176.13, 0.98, 0.966], [203.09, 179.85, 0.98, 0.968], [203.28, 183.55, 0.98, 0.961], [203.98, 187.56, 1, 0.963], [204.72, 190.66, 1, 0.967], [204.91, 194.05, 1, 0.954], [204.91, 194.05, 1, 0.954], [203.9, 194.08, 1, 0.956], [202.88, 194.15, 0.98, 0.958], [201.8, 195, 1, 0.958], [200.65, 195.45, 1, 0.961], [199.66, 196.08, 1, 0.957], [198.46, 196.15, 1, 0.953], [197.37, 196.24, 0.98, 0.95], [196.35, 196.3, 0.98, 0.947], [196.35, 196.3, 0.98, 0.947], [192.86, 196.11, 1, 0.951], [190.53, 196.01, 1, 0.951], [187.51, 196, 1, 0.949], [184.08, 194.32, 0.98, 0.952], [180.99, 193.88, 0.98, 0.949], [177.81, 194.62, 1, 0.949], [175.36, 194.61, 1.02, 0.95], [171.67, 193.62, 1, 0.944], [171.67, 193.62, 1, 0.944], [174.59, 193.5, 1.02, 0.952], [177.38, 192.46, 1.02, 0.95], [180.43, 190.38, 1, 0.957], [183.32, 188.01, 0.98, 0.95], [186.05, 187, 0.98, 0.954], [189.53, 187.6, 1.02, 0.95], [192.59, 185.84, 1, 0.945], [195.46, 183.93, 0.98, 0.942], [195.46, 183.93, 0.98, 0.942], [195.23, 182.08, 0.98, 0.958], [194.56, 180.73, 1, 0.963], [194.34, 179.26, 1, 0.974], [193.93, 177.12, 1, 0.982], [193.33, 175.54, 1.02, 0.983], [192.7, 173.2, 1, 0.996], [192.66, 170.55, 1, 0.992], [191.7, 168.3, 1, 1], null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] }, seat: { cache: "puppy-paper-seat.bin.gz", sha256: "613dbeeeaec11804e80db0216922c8f62294745514ee6283bdce61a6d784dd5e", samples: 17, covered: 51, frames: [[191.7, 168.3, 1, 1], [187.28, 167.83, 0.98, 0.992], [186.01, 168.11, 0.98, 0.997], [184.36, 167.85, 0.96, 0.997], [182.14, 168.27, 0.96, 0.99], [179.4, 167.97, 0.94, 0.989], [177.05, 167.47, 0.92, 0.991], [174.39, 167.11, 0.9, 0.982], [171.52, 167.84, 0.9, 0.977], [169.74, 168.03, 0.9, 0.978], [166.37, 168.27, 0.9, 0.98], [163.95, 166.65, 0.86, 0.975], [161.1, 167.16, 0.86, 0.973], [158.82, 167.1, 0.86, 0.97], [157.06, 167.85, 0.86, 0.97], [155.39, 167.09, 0.84, 0.966], [152.19, 167.86, 0.84, 0.951], [152.19, 167.86, 0.84, 0.951], [152.24, 167.87, 0.84, 0.952], [152.26, 167.86, 0.84, 0.953], [152.26, 167.85, 0.84, 0.953], [152.27, 167.85, 0.84, 0.953], [152.3, 167.84, 0.84, 0.954], [152.33, 167.83, 0.84, 0.954], [152.69, 166.08, 0.8, 0.956], [152.75, 166.06, 0.8, 0.956], [152.77, 166.04, 0.8, 0.957], [153.16, 166.03, 0.8, 0.957], [153.19, 166.03, 0.8, 0.956], [153.21, 166.02, 0.8, 0.955], [153.23, 166.02, 0.8, 0.955], [153.27, 166.02, 0.8, 0.953], [153.37, 166.03, 0.8, 0.952], [153.28, 166.02, 0.8, 0.952], [153.28, 166.02, 0.8, 0.952], [154.28, 166.02, 0.8, 0.954], [154.49, 166.87, 0.82, 0.951], [155.31, 165.99, 0.8, 0.953], [156.08, 165.96, 0.8, 0.956], [156.67, 166.83, 0.82, 0.958], [157.34, 166.82, 0.82, 0.955], [158.31, 166.73, 0.82, 0.956], [158.83, 166.62, 0.82, 0.96], [159.42, 166.54, 0.82, 0.958], [160.23, 166.48, 0.82, 0.952], [160.85, 166.5, 0.82, 0.954], [161.4, 166.49, 0.82, 0.954], [162.04, 166.45, 0.82, 0.947], [162.98, 166.47, 0.82, 0.947], [163.19, 166.46, 0.82, 0.946], [164.02, 166.47, 0.82, 0.945]] }, arrivalSeat: { cache: "puppy-paper-arrival-seat.bin.gz", sha256: "13acb62fd573ff7ef97bcf59be80757897fe9d1784f187ab278990ff94a643b9", samples: 17, covered: 51, frames: [[195.46, 183.93, 0.98, 0.942], [191.05, 182.87, 0.98, 0.955], [189.92, 182.76, 0.98, 0.95], [187.17, 181.29, 0.96, 0.954], [184.77, 179.89, 0.94, 0.954], [182.36, 179.93, 0.96, 0.955], [179.54, 177.85, 0.94, 0.96], [176.3, 176.4, 0.92, 0.959], [174.08, 175.36, 0.9, 0.966], [171.91, 174.25, 0.9, 0.958], [168.15, 172.23, 0.88, 0.953], [165.17, 170.82, 0.86, 0.963], [162.45, 171.28, 0.88, 0.959], [160.06, 170.01, 0.86, 0.965], [157.6, 169.78, 0.86, 0.959], [155.67, 167.31, 0.82, 0.96], [152.19, 167.86, 0.84, 0.951], [152.19, 167.86, 0.84, 0.951], [152.24, 167.87, 0.84, 0.952], [152.26, 167.86, 0.84, 0.953], [152.26, 167.85, 0.84, 0.953], [152.27, 167.85, 0.84, 0.953], [152.3, 167.84, 0.84, 0.954], [152.33, 167.83, 0.84, 0.954], [152.69, 166.08, 0.8, 0.956], [152.75, 166.06, 0.8, 0.956], [152.77, 166.04, 0.8, 0.957], [153.16, 166.03, 0.8, 0.957], [153.19, 166.03, 0.8, 0.956], [153.21, 166.02, 0.8, 0.955], [153.23, 166.02, 0.8, 0.955], [153.27, 166.02, 0.8, 0.953], [153.37, 166.03, 0.8, 0.952], [153.28, 166.02, 0.8, 0.952], [153.28, 166.02, 0.8, 0.952], [154.28, 166.02, 0.8, 0.954], [154.49, 166.87, 0.82, 0.951], [155.31, 165.99, 0.8, 0.953], [156.08, 165.96, 0.8, 0.956], [156.67, 166.83, 0.82, 0.958], [157.34, 166.82, 0.82, 0.955], [158.31, 166.73, 0.82, 0.956], [158.83, 166.62, 0.82, 0.96], [159.42, 166.54, 0.82, 0.958], [160.23, 166.48, 0.82, 0.952], [160.85, 166.5, 0.82, 0.954], [161.4, 166.49, 0.82, 0.954], [162.04, 166.45, 0.82, 0.947], [162.98, 166.47, 0.82, 0.947], [163.19, 166.46, 0.82, 0.946], [164.02, 166.47, 0.82, 0.945]] }, actions: { sha256: "1e0db7138d087292a3e70c246a1d56af590b3fb50928687a026e7080d7657c38", frames: [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, [192, 168, 1, null], [197, 167, 1, null], [203, 165, 1, null], [209, 165, 1, null], [224, 154, 1, null], [235, 150, 1, null], [242, 149, 1, null], [245, 149, 1, null], [252, 148, 1, null], null, null, null, null, null, [237, 150, 1, null], [245, 149, 1, null], [248, 149, 1, null], [252, 148, 1, null], null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] } } };
1244
1244
  function mouthSourceFrame(family, state, info) {
1245
+ if (family === "actions") {
1246
+ const p = paperActionPose(state.actionName, state.actionProgress, info);
1247
+ return p.pair * 9 + Math.round(p.blend * 8);
1248
+ }
1245
1249
  if (family === "approach")
1246
1250
  return state.approachPair * 9 + Math.round(state.blend * 8);
1247
1251
  if (family === "behaviors") {
@@ -2136,9 +2140,10 @@ function createPaperActor(animal, info, { manualTricks = false, trickTimings = n
2136
2140
  actionName = "lie-down";
2137
2141
  actionProgress = 1;
2138
2142
  }
2139
- if (walkTransitions && state === "view-turn" && turnView === "front") {
2140
- actionName = view === "approach" ? "walk-face-front" : "walk-face-rear";
2141
- actionProgress = Math.min(1, age / viewTurnSeconds());
2143
+ if (walkTransitions && state === "view-turn") {
2144
+ actionName = view === "approach" || turnView === "approach" ? "walk-face-front" : "walk-face-rear";
2145
+ const t = Math.min(1, age / viewTurnSeconds());
2146
+ actionProgress = turnView === "front" ? t : 1 - t;
2142
2147
  }
2143
2148
  if (walkTransitions && state === "turn") {
2144
2149
  actionName = "walk-turn";
@@ -2330,8 +2335,8 @@ function createPaperRenderer(cache, info, meta, width, height, { rear, approach,
2330
2335
  out[i] = 255;
2331
2336
  }
2332
2337
  render.lastPlacement = { left, top, side, sideX };
2333
- const mouthFamily = isInteraction || isAction ? null : isBehavior ? "behaviors" : isSeat ? state.seatVariant === "arrival" && arrivalSeatSample ? "arrivalSeat" : "seat" : isApproach ? "approach" : null;
2334
- const mouthInfo = { behaviors: behaviors?.info, seat: seat?.info, arrivalSeat: arrivalSeat?.info, approach: approach?.info }[mouthFamily];
2338
+ const mouthFamily = isInteraction ? null : isAction ? "actions" : isBehavior ? "behaviors" : isSeat ? state.seatVariant === "arrival" && arrivalSeatSample ? "arrivalSeat" : "seat" : isApproach ? "approach" : null;
2339
+ const mouthInfo = { actions: actions?.info, behaviors: behaviors?.info, seat: seat?.info, arrivalSeat: arrivalSeat?.info, approach: approach?.info }[mouthFamily];
2335
2340
  const mouthFrame = mouthFamily ? mouthSourceFrame(mouthFamily, state, mouthInfo) : null;
2336
2341
  render.lastMouth = projectMouth(mouthFamily ? mouthAnchor(mouthFamily, mouthFrame, mouthInfo?.sha256) : null, { left, top, side, sideX }, state.flip, { family: mouthFamily, frame: mouthFrame });
2337
2342
  if (motion?.mouth) {
@@ -4234,7 +4239,8 @@ function createCatLife({ seed = 731 } = {}) {
4234
4239
  mat: Boolean(phase.mat),
4235
4240
  facing: phase.facing ?? null,
4236
4241
  resting: ["sleep", "loaf-rest"].includes(phase.clip) && !pending,
4237
- sleeping: phase.clip === "sleep"
4242
+ sleeping: phase.clip === "sleep",
4243
+ restSeconds: phase.clip === "sleep" ? phase.elapsed : 0
4238
4244
  };
4239
4245
  }
4240
4246
  };
@@ -4314,13 +4320,38 @@ function footSourcePoint2(x, y, pins, out = {}) {
4314
4320
  return out;
4315
4321
  }
4316
4322
 
4323
+ // integrations/purrviewer/src/facing.mjs
4324
+ function catFacingPath(from, fromMirror, to, toMirror) {
4325
+ const path = [];
4326
+ const push = (clip, reverse, mirror, view) => path.push({ clip, reverse, mirror, view, seconds: 0.28 });
4327
+ if (from === to && (from === "front" || fromMirror === toMirror))
4328
+ return path;
4329
+ if (from === "rear") {
4330
+ push("turn-side-rear", true, fromMirror, "side");
4331
+ from = "side";
4332
+ }
4333
+ if (from === "side") {
4334
+ if (to === "rear" && fromMirror === toMirror) {
4335
+ push("turn-side-rear", false, fromMirror, "rear");
4336
+ return path;
4337
+ }
4338
+ push("turn-front-side", true, fromMirror, "front");
4339
+ }
4340
+ if (to === "front")
4341
+ return path;
4342
+ push("turn-front-side", false, toMirror, "side");
4343
+ if (to === "rear")
4344
+ push("turn-side-rear", false, toMirror, "rear");
4345
+ return path;
4346
+ }
4347
+
4317
4348
  // integrations/purrviewer/src/purrviewer-core.mjs
4318
4349
  function createCatFromAssets({ seed = 731 } = {}, lease, kernel = null) {
4319
4350
  if (!Number.isInteger(seed) || seed < 0 || seed > 4294967295)
4320
4351
  throw TypeError("Invalid cat seed");
4321
4352
  let asset = lease.data;
4322
4353
  const release = lease.release, motion = createCatMotion(), life = createCatLife({ seed }), contacts = createCatContacts(asset.meta.walk), sourcePoint = { x: 0, y: 0 };
4323
- let pixels = null, disposed = false, lastClip = "sit", lastFrame = null, prep = null, view = "front", mirror = false, settle = null, lastMoving = false, lastLifeClip = "sit", lastPaintKey = "", lastText = "", rasterizations = 0, heldHits = 0;
4354
+ let pixels = null, disposed = false, lastClip = "sit", lastFrame = null, prep = null, view = "front", mirror = false, standing = false, settle = null, lastMoving = false, lastLifeClip = "sit", lastPaintKey = "", lastText = "", rasterizations = 0, heldHits = 0;
4324
4355
  const alive = () => {
4325
4356
  if (disposed)
4326
4357
  throw Error("Cat is disposed");
@@ -4336,18 +4367,31 @@ function createCatFromAssets({ seed = 731 } = {}, lease, kernel = null) {
4336
4367
  settle = null;
4337
4368
  motion.wheel(command);
4338
4369
  } else if (command.kind === "stop") {
4339
- prep = null;
4340
4370
  motion.stop();
4341
4371
  }
4342
4372
  };
4373
+ function prepare(targetView, targetMirror, { command = null, seated = false } = {}) {
4374
+ const steps = [];
4375
+ if (!standing)
4376
+ steps.push({ clip: "rise-front", seconds: 0.3, view: "front", mirror: false });
4377
+ steps.push(...catFacingPath(view, mirror, targetView, targetMirror));
4378
+ if (seated)
4379
+ steps.push({ clip: "sit-front", seconds: 0.32, view: "front", mirror: false, seated: true });
4380
+ if (!steps.length) {
4381
+ if (command)
4382
+ direct(command);
4383
+ return;
4384
+ }
4385
+ prep = { steps, index: 0, age: 0, command };
4386
+ mirror = steps[0].mirror;
4387
+ settle = null;
4388
+ }
4343
4389
  function issue(command) {
4344
- if (command.kind === "go" && view === "front" && !motion.sample().moving) {
4390
+ if (command.kind === "go" && !motion.sample().moving) {
4345
4391
  const s3 = motion.sample(), dx = command.x - s3.x, dz2 = command.z - s3.z, length2 = Math.hypot(dx, dz2);
4346
4392
  if (length2 > 0.01) {
4347
4393
  const targetView = Math.abs(dz2 / length2) > 0.8 ? dz2 > 0 ? "front" : "rear" : "side";
4348
- prep = { age: 0, seconds: 0.4, command, targetView, clip: targetView === "front" ? "rise-front" : "rise" };
4349
- mirror = dx < 0;
4350
- settle = null;
4394
+ prepare(targetView, dx < 0, { command });
4351
4395
  return;
4352
4396
  }
4353
4397
  }
@@ -4366,12 +4410,23 @@ function createCatFromAssets({ seed = 731 } = {}, lease, kernel = null) {
4366
4410
  left -= step;
4367
4411
  if (prep) {
4368
4412
  prep.age += step;
4369
- if (prep.age >= prep.seconds) {
4370
- const cmd = prep.command;
4371
- view = prep.targetView;
4372
- prep = null;
4373
- direct(cmd);
4413
+ const part = prep.steps[prep.index];
4414
+ if (prep.age >= part.seconds) {
4415
+ view = part.view;
4416
+ mirror = part.mirror;
4417
+ standing = !part.seated;
4418
+ prep.age = 0;
4419
+ prep.index++;
4420
+ if (prep.index === prep.steps.length) {
4421
+ const cmd = prep.command;
4422
+ prep = null;
4423
+ if (cmd)
4424
+ direct(cmd);
4425
+ } else
4426
+ mirror = prep.steps[prep.index].mirror;
4374
4427
  }
4428
+ if (prep)
4429
+ continue;
4375
4430
  }
4376
4431
  motion.step(step);
4377
4432
  const s3 = motion.sample();
@@ -4380,61 +4435,47 @@ function createCatFromAssets({ seed = 731 } = {}, lease, kernel = null) {
4380
4435
  issue(command);
4381
4436
  const report = life.report, clip = report.clip;
4382
4437
  if (s3.moving && !prep && !s3.exercising) {
4383
- const sx = Math.sin(s3.heading), sz = Math.cos(s3.heading);
4384
- mirror = sx < 0;
4385
- view = s3.airborne ? "side" : Math.abs(sz) > 0.8 ? sz > 0 ? "front" : "rear" : "side";
4438
+ if (s3.airborne) {
4439
+ mirror = Math.sin(s3.heading) < 0;
4440
+ view = "side";
4441
+ }
4442
+ standing = true;
4386
4443
  settle = null;
4387
4444
  }
4388
4445
  if (clip !== lastLifeClip) {
4389
- if (clip === "stretch-enter") {
4390
- view = "front";
4391
- mirror = false;
4392
- settle = null;
4393
- }
4394
- if (clip === "knead-enter") {
4395
- view = "front";
4396
- mirror = false;
4397
- settle = null;
4398
- }
4399
- if (["tower-load", "tower-land", "wheel-enter", "wheel-leave"].includes(clip)) {
4446
+ if (["stretch-enter", "knead-enter", "feed-enter"].includes(clip) && standing)
4447
+ prepare("front", false, { seated: true });
4448
+ if (["tower-load", "crouch", "wheel-enter"].includes(clip))
4449
+ prepare("side", clip === "tower-load" ? report.facing < 0 : clip === "wheel-enter" ? false : mirror);
4450
+ if (["tower-land", "wheel-leave"].includes(clip)) {
4400
4451
  view = "side";
4452
+ standing = true;
4401
4453
  settle = null;
4402
4454
  if (clip.startsWith("wheel"))
4403
4455
  mirror = false;
4404
4456
  }
4405
- if (clip === "tower-load")
4406
- mirror = report.facing < 0;
4407
4457
  if (clip === "stretch-reach") {
4408
4458
  view = "side";
4409
4459
  mirror = false;
4410
4460
  settle = null;
4411
4461
  }
4412
- if (clip === "feed-enter") {
4462
+ if (clip === "feed-sniff") {
4413
4463
  view = "side";
4414
4464
  mirror = false;
4465
+ standing = true;
4415
4466
  settle = null;
4416
4467
  }
4417
4468
  if (clip === "sit" && ["bat", "stretch", "stretch-leave", "feed-leave", "loaf-leave"].includes(lastLifeClip)) {
4418
4469
  view = "front";
4419
4470
  mirror = false;
4471
+ standing = false;
4420
4472
  settle = null;
4421
4473
  }
4422
4474
  lastLifeClip = clip;
4423
4475
  }
4424
4476
  const quiet = ["idle", "sit", "blink", "eye-greeting", "groom", "loaf", "sleep", "tail-swish", "tail-tip"].includes(clip);
4425
- if (!s3.moving && !prep && quiet) {
4426
- if (!settle && (lastMoving || view !== "front"))
4427
- settle = { age: 0, seconds: 0.45, clip: view === "front" ? "sit-front" : "sit-down" };
4428
- if (settle) {
4429
- settle.age += step;
4430
- if (settle.age >= settle.seconds) {
4431
- view = "front";
4432
- mirror = false;
4433
- settle = null;
4434
- }
4435
- }
4436
- } else
4437
- settle = null;
4477
+ if (!s3.moving && !prep && quiet && standing)
4478
+ prepare("front", false, { seated: true });
4438
4479
  lastMoving = s3.moving;
4439
4480
  if (s3.moving && !s3.airborne && !s3.exercising && s3.supportY === 0 && !prep && view === "side")
4440
4481
  contacts.update(s3, mirror);
@@ -4466,9 +4507,16 @@ function createCatFromAssets({ seed = 731 } = {}, lease, kernel = null) {
4466
4507
  clip = "wheel-run";
4467
4508
  progress = (s3.wheelPhase % 1 + 1) % 1;
4468
4509
  }
4510
+ if (!s3.moving && ["walk", "creep"].includes(clip)) {
4511
+ clip = view === "rear" ? "stand-rear" : view === "front" ? "rise-front" : "stand";
4512
+ progress = 1;
4513
+ }
4469
4514
  if (prep) {
4470
- clip = prep.clip;
4471
- progress = Math.min(1, prep.age / prep.seconds);
4515
+ const part = prep.steps[prep.index];
4516
+ clip = part.clip;
4517
+ progress = Math.min(1, prep.age / part.seconds);
4518
+ if (part.reverse)
4519
+ progress = 1 - progress;
4472
4520
  }
4473
4521
  if (settle) {
4474
4522
  clip = settle.clip;
@@ -4478,7 +4526,14 @@ function createCatFromAssets({ seed = 731 } = {}, lease, kernel = null) {
4478
4526
  progress = progress >= 1 ? 0 : progress * 9 % 1;
4479
4527
  if (clip === "knead")
4480
4528
  progress = progress >= 1 ? 0 : progress * 4 % 1;
4481
- const keys = asset.meta.clips[clip] ?? asset.meta.clips.sit;
4529
+ let keys = asset.meta.clips[clip] ?? asset.meta.clips.sit;
4530
+ if (clip === "stand")
4531
+ keys = [asset.meta.clips["turn-front-side"].at(-1)];
4532
+ if (clip === "sleep") {
4533
+ const t = r.restSeconds ?? 0, phase = t % 5.6;
4534
+ keys = [Math.floor(t) % 23 === 17 ? asset.meta.clips.sleep[3] : phase > 1.4 && phase < 3.5 ? asset.meta.clips.sleep[1] : asset.meta.clips.sleep[0]];
4535
+ progress = 0;
4536
+ }
4482
4537
  const pins = clip === "walk" ? contacts.pins(s3) : [];
4483
4538
  const key = keys[Math.min(keys.length - 1, Math.floor(Math.max(0, Math.min(1, progress)) * keys.length))];
4484
4539
  const food = r.food ? Math.ceil(r.food.remaining * 16) / 16 : null;
@@ -4565,9 +4620,8 @@ function createCatFromAssets({ seed = 731 } = {}, lease, kernel = null) {
4565
4620
  if (!["treat", "toy", "call", "stretch", "tail", "greet", "company", "tower", "wheel"].includes(kind))
4566
4621
  throw TypeError("Invalid cat interaction");
4567
4622
  const accepted = life.interact(kind, options2);
4568
- if (accepted && prep) {
4569
- prep = null;
4570
- }
4623
+ if (accepted && prep)
4624
+ prep.command = null;
4571
4625
  return accepted;
4572
4626
  },
4573
4627
  get report() {
@@ -1,6 +1,6 @@
1
1
  # Cat art and motion review
2
2
 
3
- Current default: the owner-approved ginger identity and65-key ginger motion
3
+ Current default: the owner-approved ginger identity and77-key ginger motion
4
4
  atlas described below. The tuxedo material is retained as historical source
5
5
  and is not fetched by the default renderer.
6
6
 
@@ -287,3 +287,26 @@ keys, timings, anatomy or source pixels were changed. The owner explicitly
287
287
  chose CC BY-SA 4.0 for the bundled ginger artwork, including its metadata and
288
288
  alternative encodings; code remains MIT. Research photographs and raw source
289
289
  sheets are not included in the public package.
290
+
291
+ ## Motion repair candidate · 2026-10-25
292
+
293
+ The77-key candidate retains64 earlier drawings byte-exact and replaces only
294
+ the stray-cat lowering key8. Seven grounded orientation keys, three airborne
295
+ breakdowns and two local sleep variants are appended. The original curl2 is
296
+ unchanged, and sleep patches preserve every thresholded silhouette pixel.
297
+ Source sheets were generated with the built-in imagegen using the accepted
298
+ cat drawings as inputs; no new photos or video frames were used. Whole-body
299
+ registration uses a shared family scale and rigid offsets. The generated sleep
300
+ fur/ear patches are offline local edits, not runtime warps.
301
+
302
+ | Local source (ignored) | SHA-256 |
303
+ |---|---|
304
+ | ginger-lower-repair-v1.png | 5f8e22e17f08bb49d668ea1adf12938978bf7399eb03d851a0da140f27b34b07 |
305
+ | ginger-yaw-v1.png | e87554521d27eba2f97a5ec9ae411fdf224d69d5a1181d1880b70947777dbda2 |
306
+ | ginger-sleep-details-v1.png | 7e2c797ad3e510583af53da60c708a4b7e452491b2531ffe9167521536f70e21 |
307
+ | ginger-jump-breakdowns-v1.png | fa46905d52110a94eafaa75d9920d1c92d0991ddd42741a4cb1d12c593dbf54b |
308
+
309
+ Preparation: tools/prepare-motion-repairs.py and tools/rebuild-motion-repairs.mjs.
310
+ Metadata includes source hashes and registration. Final aesthetic approval is
311
+ separate from pixel-preservation and physical checks. Artwork remains under
312
+ CC BY-SA4.0; raw source sheets are not included in the public package.
@@ -2,7 +2,7 @@
2
2
  "version": 1,
3
3
  "width": 320,
4
4
  "height": 320,
5
- "frames": 65,
5
+ "frames": 77,
6
6
  "clips": {
7
7
  "idle": [
8
8
  0
@@ -31,12 +31,19 @@
31
31
  "tower-flight": [
32
32
  34,
33
33
  64,
34
- 36
34
+ 74,
35
+ 35,
36
+ 75,
37
+ 36,
38
+ 76
35
39
  ],
36
40
  "tower-fall": [
37
41
  34,
42
+ 74,
38
43
  35,
39
- 36
44
+ 75,
45
+ 36,
46
+ 76
40
47
  ],
41
48
  "tower-land": [
42
49
  37,
@@ -160,8 +167,11 @@
160
167
  ],
161
168
  "pounce": [
162
169
  34,
170
+ 74,
163
171
  35,
164
- 36
172
+ 75,
173
+ 36,
174
+ 76
165
175
  ],
166
176
  "land": [
167
177
  37,
@@ -232,6 +242,10 @@
232
242
  2
233
243
  ],
234
244
  "sleep": [
245
+ 2,
246
+ 72,
247
+ 2,
248
+ 73,
235
249
  2
236
250
  ],
237
251
  "curl": [
@@ -320,6 +334,23 @@
320
334
  14,
321
335
  15,
322
336
  0
337
+ ],
338
+ "turn-front-side": [
339
+ 5,
340
+ 65,
341
+ 66,
342
+ 67,
343
+ 1
344
+ ],
345
+ "turn-side-rear": [
346
+ 1,
347
+ 68,
348
+ 69,
349
+ 70,
350
+ 71
351
+ ],
352
+ "stand-rear": [
353
+ 71
323
354
  ]
324
355
  },
325
356
  "walk": {
@@ -589,7 +620,7 @@
589
620
  "evidence": "human-inspected visible toe proxies; .60m source canvas"
590
621
  },
591
622
  "color": "#f1b66b",
592
- "gzipBytes": 391476,
623
+ "gzipBytes": 476953,
593
624
  "sourceSha256": "af4322edb7d1f001d002b55535369f8dd067cd4621ddd453318251b0caa1d559",
594
625
  "registration": [
595
626
  {
@@ -718,18 +749,15 @@
718
749
  },
719
750
  {
720
751
  "name": "lower",
721
- "source": "ginger-rest-v1.png",
722
- "sourceBox": [
723
- 537,
724
- 313,
725
- 1030,
726
- 578
727
- ],
728
- "scale": 0.5780000000000001,
752
+ "source": "ginger-lower-repair-v1.png",
753
+ "sourceSha256": "5f8e22e17f08bb49d668ea1adf12938978bf7399eb03d851a0da140f27b34b07",
754
+ "scale": 0.25,
729
755
  "translation": [
730
- 52,
731
- 145
732
- ]
756
+ 11,
757
+ 8
758
+ ],
759
+ "registrationFamily": "motion-repair-v1",
760
+ "replaces": 8
733
761
  },
734
762
  {
735
763
  "name": "loaf",
@@ -1702,6 +1730,188 @@
1702
1730
  850
1703
1731
  ],
1704
1732
  "registrationFamily": "tower-v1"
1733
+ },
1734
+ {
1735
+ "name": "yaw-22",
1736
+ "source": "ginger-yaw-v1.png",
1737
+ "sourceSha256": "e87554521d27eba2f97a5ec9ae411fdf224d69d5a1181d1880b70947777dbda2",
1738
+ "scale": 0.61,
1739
+ "translation": [
1740
+ 29,
1741
+ 56
1742
+ ],
1743
+ "registrationFamily": "motion-repair-v1",
1744
+ "cell": 1
1745
+ },
1746
+ {
1747
+ "name": "yaw-45",
1748
+ "source": "ginger-yaw-v1.png",
1749
+ "sourceSha256": "e87554521d27eba2f97a5ec9ae411fdf224d69d5a1181d1880b70947777dbda2",
1750
+ "scale": 0.61,
1751
+ "translation": [
1752
+ 29,
1753
+ 56
1754
+ ],
1755
+ "registrationFamily": "motion-repair-v1",
1756
+ "cell": 2
1757
+ },
1758
+ {
1759
+ "name": "yaw-67",
1760
+ "source": "ginger-yaw-v1.png",
1761
+ "sourceSha256": "e87554521d27eba2f97a5ec9ae411fdf224d69d5a1181d1880b70947777dbda2",
1762
+ "scale": 0.61,
1763
+ "translation": [
1764
+ 29,
1765
+ 79
1766
+ ],
1767
+ "registrationFamily": "motion-repair-v1",
1768
+ "cell": 3
1769
+ },
1770
+ {
1771
+ "name": "yaw-112",
1772
+ "source": "ginger-yaw-v1.png",
1773
+ "sourceSha256": "e87554521d27eba2f97a5ec9ae411fdf224d69d5a1181d1880b70947777dbda2",
1774
+ "scale": 0.61,
1775
+ "translation": [
1776
+ 29,
1777
+ 77
1778
+ ],
1779
+ "registrationFamily": "motion-repair-v1",
1780
+ "cell": 5
1781
+ },
1782
+ {
1783
+ "name": "yaw-135",
1784
+ "source": "ginger-yaw-v1.png",
1785
+ "sourceSha256": "e87554521d27eba2f97a5ec9ae411fdf224d69d5a1181d1880b70947777dbda2",
1786
+ "scale": 0.61,
1787
+ "translation": [
1788
+ 29,
1789
+ 90
1790
+ ],
1791
+ "registrationFamily": "motion-repair-v1",
1792
+ "cell": 6
1793
+ },
1794
+ {
1795
+ "name": "yaw-157",
1796
+ "source": "ginger-yaw-v1.png",
1797
+ "sourceSha256": "e87554521d27eba2f97a5ec9ae411fdf224d69d5a1181d1880b70947777dbda2",
1798
+ "scale": 0.61,
1799
+ "translation": [
1800
+ 29,
1801
+ 92
1802
+ ],
1803
+ "registrationFamily": "motion-repair-v1",
1804
+ "cell": 7
1805
+ },
1806
+ {
1807
+ "name": "rear-stand",
1808
+ "source": "ginger-yaw-v1.png",
1809
+ "sourceSha256": "e87554521d27eba2f97a5ec9ae411fdf224d69d5a1181d1880b70947777dbda2",
1810
+ "scale": 0.61,
1811
+ "translation": [
1812
+ 29,
1813
+ 92
1814
+ ],
1815
+ "registrationFamily": "motion-repair-v1",
1816
+ "cell": 8
1817
+ },
1818
+ {
1819
+ "name": "sleep-breath",
1820
+ "source": "ginger-sleep-details-v1.png",
1821
+ "sourceSha256": "7e2c797ad3e510583af53da60c708a4b7e452491b2531ffe9167521536f70e21",
1822
+ "scale": 0.33,
1823
+ "translation": [
1824
+ 20,
1825
+ 10
1826
+ ],
1827
+ "registrationFamily": "motion-repair-v1",
1828
+ "cell": 0,
1829
+ "localPatch": [
1830
+ 100,
1831
+ 198,
1832
+ 157,
1833
+ 241
1834
+ ]
1835
+ },
1836
+ {
1837
+ "name": "sleep-ear",
1838
+ "source": "ginger-sleep-details-v1.png",
1839
+ "sourceSha256": "7e2c797ad3e510583af53da60c708a4b7e452491b2531ffe9167521536f70e21",
1840
+ "scale": 0.33,
1841
+ "translation": [
1842
+ 20,
1843
+ 10
1844
+ ],
1845
+ "registrationFamily": "motion-repair-v1",
1846
+ "cell": 1,
1847
+ "localPatch": [
1848
+ 172,
1849
+ 193,
1850
+ 199,
1851
+ 223
1852
+ ]
1853
+ },
1854
+ {
1855
+ "name": "jump-extend",
1856
+ "source": "ginger-jump-breakdowns-v1.png",
1857
+ "sourceSha256": "fa46905d52110a94eafaa75d9920d1c92d0991ddd42741a4cb1d12c593dbf54b",
1858
+ "scale": 0.36,
1859
+ "translation": [
1860
+ 16,
1861
+ 54
1862
+ ],
1863
+ "registrationFamily": "motion-repair-v1",
1864
+ "cell": 0,
1865
+ "sourceBox": [
1866
+ 0,
1867
+ 0,
1868
+ 780,
1869
+ 724
1870
+ ]
1871
+ },
1872
+ {
1873
+ "name": "jump-gather",
1874
+ "source": "ginger-jump-breakdowns-v1.png",
1875
+ "sourceSha256": "fa46905d52110a94eafaa75d9920d1c92d0991ddd42741a4cb1d12c593dbf54b",
1876
+ "scale": 0.36,
1877
+ "translation": [
1878
+ 16,
1879
+ 54
1880
+ ],
1881
+ "registrationFamily": "motion-repair-v1",
1882
+ "cell": 1,
1883
+ "sourceBox": [
1884
+ 780,
1885
+ 0,
1886
+ 1460,
1887
+ 724
1888
+ ]
1889
+ },
1890
+ {
1891
+ "name": "jump-descend",
1892
+ "source": "ginger-jump-breakdowns-v1.png",
1893
+ "sourceSha256": "fa46905d52110a94eafaa75d9920d1c92d0991ddd42741a4cb1d12c593dbf54b",
1894
+ "scale": 0.36,
1895
+ "translation": [
1896
+ 16,
1897
+ 54
1898
+ ],
1899
+ "registrationFamily": "motion-repair-v1",
1900
+ "cell": 2,
1901
+ "sourceBox": [
1902
+ 1460,
1903
+ 0,
1904
+ 2172,
1905
+ 724
1906
+ ]
1705
1907
  }
1706
- ]
1908
+ ],
1909
+ "repair": {
1910
+ "baseline": "5452da3",
1911
+ "unchangedOriginalKeys": 64,
1912
+ "replaced": [
1913
+ 8
1914
+ ],
1915
+ "appended": 12
1916
+ }
1707
1917
  }