@bitefoundry/retrieviewer 0.0.20 → 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.
package/README.ko.md CHANGED
@@ -148,6 +148,13 @@ JS 플러그인과 JSONL 브리지를 제공해요. 화면·입력·시간 제
148
148
  AI로 생성한 그림에 자세 정렬·접지·프레임 처리를 적용한 애니메이션입니다.
149
149
  실제 모션 캡처나 자의식이 있는 강아지라고 주장하지 않아요.
150
150
 
151
+ ## 0.0.21
152
+
153
+ 고양이가 앞뒤로 돌아서 걷는 자세를 연결하고, 점프 중간 그림과 작은 수면
154
+ 움직임을 추가했어요. 한 원화에 겹쳐 있던 고양이도 지웠어요. 강아지는
155
+ 공놀이 출발·복귀 자세와 입에 문 공의 연결을 다듬었습니다. 기존 두 프레임
156
+ 캐시는 유지해요. 코드는 MIT, 두 펫의 그림은 CC BY-SA4.0입니다.
157
+
151
158
  ## 0.0.20
152
159
 
153
160
  Windows에서 화면 일부가 깜빡이던 문제를 고쳤어요. 장면 전체를 창 하나로
package/README.md CHANGED
@@ -189,6 +189,14 @@ The puppy artwork was developed with AI-generated imagery and programmatic pose,
189
189
  grounding and frame processing. It is authored animation, not motion capture or
190
190
  a claim of sentience.
191
191
 
192
+ ## 0.0.21
193
+
194
+ Cat turns now connect through standing poses before walking or pouncing. Jump
195
+ breakdowns and small sleep-fur/ear changes add motion without enlarging the
196
+ two-frame cache. A stray duplicate cat in one drawing is removed. Dog departure
197
+ and return turns share standing endpoints, with the carried ball attached to
198
+ the visible muzzle. Code remains MIT; both pets’ artwork is CC BY-SA4.0.
199
+
192
200
  ## 0.0.20
193
201
 
194
202
  Fixes Windows flicker introduced by the split-window painter. The whole scene
package/RELEASING.md CHANGED
@@ -1,3 +1,20 @@
1
+ # Retrieviewer 0.0.21 release process
2
+
3
+ Current target: `@bitefoundry/retrieviewer@0.0.21`, public `latest`.
4
+ The owner accepted the local six-finding repair candidate and asked to proceed.
5
+ Ship the reviewed dog standing-turn/mouth repairs and77-key cat atlas, preserving
6
+ 64 original cat drawings exactly. Cat source pin: `79a47c2d618b91945997035e6c7502c43f471f62`.
7
+ Keep physics, bounded caches, the coherent native painter and existing licenses.
8
+
9
+ Run full tests and release/package checks, install and compare the exact archive,
10
+ exercise its Windows adapter, then push and wait for Windows/Linux CI. Publish
11
+ that same archive, verify registry integrity and a fresh consumer, and verify
12
+ the matching bilingual Pages deployment and pinned cat hashes. Current memory
13
+ evidence is4K35s basic-mode sampling, not a long-run ceiling; see
14
+ [repair evidence](research/pet-motion-repair-20261025.md). Raw sheets stay private.
15
+
16
+ ## Previous0.0.20 scope (historical)
17
+
1
18
  # Retrieviewer 0.0.20 release process
2
19
 
3
20
  Current target: `@bitefoundry/retrieviewer@0.0.20`, public `latest`.
@@ -3,8 +3,8 @@
3
3
  "platform": "win32-x64",
4
4
  "files": {
5
5
  "runtime.bundle.mjs": {
6
- "bytes": 235608,
7
- "sha256": "e9da942dbe57ac778c44ea8f300e2e868face5e73b00ffcd4399aeb7e94ee09c"
6
+ "bytes": 242314,
7
+ "sha256": "0ce3c30a1b23901510a6a794373b20dd0f2b69093382e9ecd29d9103bc8cba41"
8
8
  },
9
9
  "bin/win32-x64/retrieviewer-native.exe": {
10
10
  "bytes": 1562624,
@@ -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
  }
@@ -0,0 +1,16 @@
1
+ // Authored grounded yaw; each half-turn shares an exact standing endpoint.
2
+ // Mirroring changes only at the symmetric frontal endpoint, never mid-profile.
3
+ export function catFacingPath(from,fromMirror,to,toMirror){
4
+ const path=[];
5
+ const push=(clip,reverse,mirror,view)=>path.push({clip,reverse,mirror,view,seconds:.28});
6
+ if(from===to&&(from==='front'||fromMirror===toMirror))return path;
7
+ if(from==='rear'){push('turn-side-rear',true,fromMirror,'side');from='side';}
8
+ if(from==='side'){
9
+ if(to==='rear'&&fromMirror===toMirror){push('turn-side-rear',false,fromMirror,'rear');return path;}
10
+ push('turn-front-side',true,fromMirror,'front');
11
+ }
12
+ if(to==='front')return path;
13
+ push('turn-front-side',false,toMirror,'side');
14
+ if(to==='rear')push('turn-side-rear',false,toMirror,'rear');
15
+ return path;
16
+ }
@@ -274,7 +274,7 @@ export function createCatLife({seed = 731} = {}) {
274
274
  food: phase.clip.startsWith('feed-') ? {remaining: phase.clip === 'feed-lick' ? 1-phase.progress :
275
275
  ['feed-finish','feed-leave'].includes(phase.clip) ? 0 : 1} : null,
276
276
  mat: Boolean(phase.mat),facing:phase.facing??null,resting:['sleep','loaf-rest'].includes(phase.clip)&&!pending,
277
- sleeping: phase.clip === 'sleep'};
277
+ sleeping: phase.clip === 'sleep',restSeconds:phase.clip==='sleep'?phase.elapsed:0};
278
278
  }
279
279
  };
280
280
  }
@@ -3,21 +3,30 @@ import {createCatMotion,projectCat} from './world.mjs';
3
3
  import {createCatLife} from './life.mjs';
4
4
  import {createCatContacts,footSourcePoint} from './contact.mjs';
5
5
  import {paintHabitat} from './habitat.mjs';
6
+ import {catFacingPath} from './facing.mjs';
6
7
  export function createCatFromAssets({seed=731}={},lease,kernel=null){
7
8
  if(!Number.isInteger(seed)||seed<0||seed>0xffffffff)throw TypeError('Invalid cat seed');
8
9
  let asset=lease.data;const release=lease.release,motion=createCatMotion(),life=createCatLife({seed}),contacts=createCatContacts(asset.meta.walk),sourcePoint={x:0,y:0};
9
- 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;
10
+ 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;
10
11
  const alive=()=>{if(disposed)throw Error('Cat is disposed');};
11
12
  const direct=command=>{
12
13
  if(command.kind==='go')motion.go(command.x,command.z,{gait:command.gait});
13
14
  else if(command.kind==='pounce')motion.pounce(command.x,command.z,{height:command.height,landingY:command.landingY??0});
14
15
  else if(command.kind==='wheel'){view='side';mirror=false;settle=null;motion.wheel(command);}
15
- else if(command.kind==='stop'){prep=null;motion.stop();}
16
+ else if(command.kind==='stop'){motion.stop();}
16
17
  };
18
+ function prepare(targetView,targetMirror,{command=null,seated=false}={}){
19
+ const steps=[];
20
+ if(!standing)steps.push({clip:'rise-front',seconds:.3,view:'front',mirror:false});
21
+ steps.push(...catFacingPath(view,mirror,targetView,targetMirror));
22
+ if(seated)steps.push({clip:'sit-front',seconds:.32,view:'front',mirror:false,seated:true});
23
+ if(!steps.length){if(command)direct(command);return;}
24
+ prep={steps,index:0,age:0,command};mirror=steps[0].mirror;settle=null;
25
+ }
17
26
  function issue(command){
18
- if(command.kind==='go'&&view==='front'&&!motion.sample().moving){
27
+ if(command.kind==='go'&&!motion.sample().moving){
19
28
  const s=motion.sample(),dx=command.x-s.x,dz=command.z-s.z,length=Math.hypot(dx,dz);
20
- if(length>.01){const targetView=Math.abs(dz/length)>.8?(dz>0?'front':'rear'):'side';prep={age:0,seconds:.4,command,targetView,clip:targetView==='front'?'rise-front':'rise'};mirror=dx<0;settle=null;return;}
29
+ if(length>.01){const targetView=Math.abs(dz/length)>.8?(dz>0?'front':'rear'):'side';prepare(targetView,dx<0,{command});return;}
21
30
  }
22
31
  if(command.kind!=='stop')settle=null;
23
32
  direct(command);
@@ -26,28 +35,34 @@ export function createCatFromAssets({seed=731}={},lease,kernel=null){
26
35
  step(dt){
27
36
  alive();if(!Number.isFinite(dt)||dt<0||dt>.25)throw RangeError('Invalid cat dt');
28
37
  let left=dt;while(left>1e-10){const step=Math.min(1/60,left);left-=step;
29
- if(prep){prep.age+=step;if(prep.age>=prep.seconds){const cmd=prep.command;view=prep.targetView;prep=null;direct(cmd);}}
38
+ if(prep){
39
+ prep.age+=step;const part=prep.steps[prep.index];
40
+ if(prep.age>=part.seconds){view=part.view;mirror=part.mirror;standing=!part.seated;
41
+ prep.age=0;prep.index++;
42
+ if(prep.index===prep.steps.length){const cmd=prep.command;prep=null;if(cmd)direct(cmd);}
43
+ else mirror=prep.steps[prep.index].mirror;
44
+ }
45
+ // Life's authored contact/consumption holds start after this bridge,
46
+ // rather than being consumed while hidden behind it.
47
+ if(prep)continue;
48
+ }
30
49
  motion.step(step);const s=motion.sample();
31
50
  const command=life.step(step,s);if(command)issue(command);
32
51
  const report=life.report,clip=report.clip;
33
- if(s.moving&&!prep&&!s.exercising){const sx=Math.sin(s.heading),sz=Math.cos(s.heading);mirror=sx<0;view=s.airborne?'side':Math.abs(sz)>.8?(sz>0?'front':'rear'):'side';settle=null;}
52
+ if(s.moving&&!prep&&!s.exercising){if(s.airborne){mirror=Math.sin(s.heading)<0;view='side';}standing=true;settle=null;}
34
53
  if(clip!==lastLifeClip){
35
- if(clip==='stretch-enter'){view='front';mirror=false;settle=null;}
36
- if(clip==='knead-enter'){view='front';mirror=false;settle=null;}
37
- if(['tower-load','tower-land','wheel-enter','wheel-leave'].includes(clip)){view='side';settle=null;if(clip.startsWith('wheel'))mirror=false;}
38
- if(clip==='tower-load')mirror=report.facing<0;
54
+ if(['stretch-enter','knead-enter','feed-enter'].includes(clip)&&standing)prepare('front',false,{seated:true});
55
+ if(['tower-load','crouch','wheel-enter'].includes(clip))prepare('side',clip==='tower-load'?report.facing<0:clip==='wheel-enter'?false:mirror);
56
+ if(['tower-land','wheel-leave'].includes(clip)){view='side';standing=true;settle=null;if(clip.startsWith('wheel'))mirror=false;}
39
57
  if(clip==='stretch-reach'){view='side';mirror=false;settle=null;}
40
- if(clip==='feed-enter'){view='side';mirror=false;settle=null;}
58
+ if(clip==='feed-sniff'){view='side';mirror=false;standing=true;settle=null;}
41
59
  // These authored sequences already finish on the canonical front sit.
42
60
  // Replaying stand-to-sit here made the cat rise again after paw play.
43
- if(clip==='sit'&&['bat','stretch','stretch-leave','feed-leave','loaf-leave'].includes(lastLifeClip)){view='front';mirror=false;settle=null;}
61
+ if(clip==='sit'&&['bat','stretch','stretch-leave','feed-leave','loaf-leave'].includes(lastLifeClip)){view='front';mirror=false;standing=false;settle=null;}
44
62
  lastLifeClip=clip;
45
63
  }
46
64
  const quiet=['idle','sit','blink','eye-greeting','groom','loaf','sleep','tail-swish','tail-tip'].includes(clip);
47
- if(!s.moving&&!prep&&quiet){
48
- if(!settle&&(lastMoving||view!=='front'))settle={age:0,seconds:.45,clip:view==='front'?'sit-front':'sit-down'};
49
- if(settle){settle.age+=step;if(settle.age>=settle.seconds){view='front';mirror=false;settle=null;}}
50
- }else settle=null;
65
+ if(!s.moving&&!prep&&quiet&&standing)prepare('front',false,{seated:true});
51
66
  lastMoving=s.moving;
52
67
  if(s.moving&&!s.airborne&&!s.exercising&&s.supportY===0&&!prep&&view==='side')contacts.update(s,mirror);else contacts.reset();
53
68
  }
@@ -62,13 +77,21 @@ export function createCatFromAssets({seed=731}={},lease,kernel=null){
62
77
  }
63
78
  if(s.airborne){clip=r.clip==='tower-up'?'tower-flight':r.clip==='tower-down'?'tower-fall':'pounce';progress=s.flightProgress;}
64
79
  if(s.exercising||r.clip==='wheel-run'){clip='wheel-run';progress=((s.wheelPhase%1)+1)%1;}
65
- if(prep){clip=prep.clip;progress=Math.min(1,prep.age/prep.seconds);}
80
+ if(!s.moving&&['walk','creep'].includes(clip)){clip=view==='rear'?'stand-rear':view==='front'?'rise-front':'stand';progress=1;}
81
+ if(prep){const part=prep.steps[prep.index];clip=part.clip;progress=Math.min(1,prep.age/part.seconds);if(part.reverse)progress=1-progress;}
66
82
  if(settle){clip=settle.clip;progress=Math.min(1,settle.age/settle.seconds);}
67
83
  // Nine authored licking cycles in 3.6s. Rendering only samples simulation
68
84
  // progress; a hidden or sparse host cannot change eating cadence.
69
85
  if(clip==='feed-lick')progress=progress>=1?0:(progress*9)%1;
70
86
  if(clip==='knead')progress=progress>=1?0:(progress*4)%1;
71
- const keys=asset.meta.clips[clip]??asset.meta.clips.sit;
87
+ let keys=asset.meta.clips[clip]??asset.meta.clips.sit;
88
+ if(clip==='stand')keys=[asset.meta.clips['turn-front-side'].at(-1)];
89
+ if(clip==='sleep'){
90
+ // A slow fur breath and rare ear twitch, with exact curled endpoints.
91
+ // No body scaling/bobbing, no extra resident raster, no render-owned clock.
92
+ const t=r.restSeconds??0,phase=t%5.6;
93
+ 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]];progress=0;
94
+ }
72
95
  const pins=clip==='walk'?contacts.pins(s):[];
73
96
  // Every authored key needs a real hold, including the recovery/exit key.
74
97
  const key=keys[Math.min(keys.length-1,Math.floor(Math.max(0,Math.min(1,progress))*keys.length))];
@@ -122,7 +145,7 @@ export function createCatFromAssets({seed=731}={},lease,kernel=null){
122
145
  rasterizations++;lastPaintKey=paintKey;lastText=(kernel?.braille?kernel.braille(pixels,width,height,1.22,1.08):rgbaToBraille(pixels,width,height,{method:'stable',brightness:1.22,contrast:1.08})).text;
123
146
  return result(lastText);
124
147
  },
125
- interact(kind,options){alive();if(!['treat','toy','call','stretch','tail','greet','company','tower','wheel'].includes(kind))throw TypeError('Invalid cat interaction');const accepted=life.interact(kind,options);if(accepted&&prep){prep=null;}return accepted;},
148
+ interact(kind,options){alive();if(!['treat','toy','call','stretch','tail','greet','company','tower','wheel'].includes(kind))throw TypeError('Invalid cat interaction');const accepted=life.interact(kind,options);if(accepted&&prep)prep.command=null;return accepted;},
126
149
  get report(){alive();return life.report;},
127
150
  get stats(){alive();return {residentPixelBytes:asset.store.residentPixelBytes??asset.store.residentBytes,cachedFrames:asset.store.stats().cachedFrames,rgbaBytes:pixels?.byteLength??0,lastClip,lastFrame,leases:lease.users?.()??1,rasterizations,heldHits};},
128
151
  dispose(){if(disposed)return;disposed=true;pixels=null;prep=null;contacts.reset();asset=null;lastText=lastPaintKey='';release();}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bitefoundry/retrieviewer",
3
- "version": "0.0.20",
3
+ "version": "0.0.21",
4
4
  "description": "A fluffy Braille desktop pet for Windows and Linux X11, with experimental macOS support and an embeddable TUI engine.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "homepage": "https://bitefoundry.github.io/retrieviewer/",
@@ -185,6 +185,7 @@
185
185
  "integrations/purrviewer/art/ginger.json",
186
186
  "integrations/purrviewer/art/ginger.rvz",
187
187
  "integrations/purrviewer/src/contact.mjs",
188
+ "integrations/purrviewer/src/facing.mjs",
188
189
  "integrations/purrviewer/src/habitat.mjs",
189
190
  "integrations/purrviewer/src/life.mjs",
190
191
  "integrations/purrviewer/src/purrviewer-core.mjs",
@@ -1 +1 @@
1
- {"version":1,"canonical":320,"ballRadiusPx":17.5,"mouthOffsetPx":25.0,"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,0.991],[189.54,166.0,0.98,0.986],[191.7,168.3,1.0,1.0],[191.7,168.3,1.0,1.0],[190.78,168.33,1.0,0.999],[190.26,168.08,0.98,0.983],[189.46,169.24,1.0,0.994],[188.66,169.45,1.0,0.988],[187.9,169.62,1.0,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,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,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,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,0.967],[186.42,150.19,1.0,0.966],[188.41,150.46,1.0,0.966],[189.95,151.41,1.0,0.971],[191.61,152.4,1.0,0.971],[191.61,152.4,1.0,0.971],[189.01,151.48,1.0,0.971],[186.85,151.25,1.0,0.979],[184.64,150.57,1.0,0.975],[182.06,149.13,0.98,0.974],[179.48,149.48,1.0,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,0.983],[181.35,158.65,1.02,0.988],[184.96,160.94,1.0,0.987],[187.54,163.29,1.0,0.996],[189.22,166.33,1.02,0.992],[191.7,168.3,1.0,1.0],[191.7,168.3,1.0,1.0],[189.18,166.28,1.0,0.99],[186.95,164.07,0.98,0.991],[184.75,163.57,1.0,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,0.968],[198.92,167.34,1.0,0.966],[198.98,167.37,1.0,0.964],[199.06,167.41,1.0,0.962],[199.07,167.42,1.0,0.96],[199.07,167.42,1.0,0.96],[199.16,167.39,1.0,0.96],[199.43,167.35,1.0,0.96],[199.96,167.33,1.0,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.0,1.0],[192.77,168.21,1.0,0.999],[194.11,167.32,0.98,0.992],[195.54,167.92,1.0,0.986],[196.71,166.87,0.98,0.982],[197.88,167.48,1.0,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,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,0.963],[204.72,190.66,1.0,0.967],[204.91,194.05,1.0,0.954],[204.91,194.05,1.0,0.954],[203.9,194.08,1.0,0.956],[202.88,194.15,0.98,0.958],[201.8,195.0,1.0,0.958],[200.65,195.45,1.0,0.961],[199.66,196.08,1.0,0.957],[198.46,196.15,1.0,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,0.951],[190.53,196.01,1.0,0.951],[187.51,196.0,1.0,0.949],[184.08,194.32,0.98,0.952],[180.99,193.88,0.98,0.949],[177.81,194.62,1.0,0.949],[175.36,194.61,1.02,0.95],[171.67,193.62,1.0,0.944],[171.67,193.62,1.0,0.944],[174.59,193.5,1.02,0.952],[177.38,192.46,1.02,0.95],[180.43,190.38,1.0,0.957],[183.32,188.01,0.98,0.95],[186.05,187.0,0.98,0.954],[189.53,187.6,1.02,0.95],[192.59,185.84,1.0,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,0.963],[194.34,179.26,1.0,0.974],[193.93,177.12,1.0,0.982],[193.33,175.54,1.02,0.983],[192.7,173.2,1.0,0.996],[192.66,170.55,1.0,0.992],[191.7,168.3,1.0,1.0],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,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.0,1.0],[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]]}}}
1
+ {"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]}}}
@@ -1,14 +1,17 @@
1
1
  import {paperBehaviorPose} from './puppy-paper-behaviors.mjs';
2
+ import {paperActionPose} from './puppy-paper-actions.mjs';
2
3
 
3
4
  // Measured open-mouth centers per exact cached source sample (canonical 320px
4
- // source space, unflipped). Generated offline by prepare-mouth-anchors.py from
5
- // the drawn faces; never a root height, bob curve or runtime image analysis.
6
- // Families/frames missing here (side view, rear, actions, turned heads) are
5
+ // source space, unflipped). Base families came from offline face annotation;
6
+ // standing-turn samples are maintained by tools/update-turn-mouths.mjs.
7
+ // Never a root height, bob curve or runtime image analysis.
8
+ // Families/frames missing here (unmeasured side/rear poses and actions) are
7
9
  // unsupported: callers hide the carried ball rather than float it.
8
- export const MOUTH_ANCHORS=/*BEGIN GENERATED*/{"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,0.991],[189.54,166.0,0.98,0.986],[191.7,168.3,1.0,1.0],[191.7,168.3,1.0,1.0],[190.78,168.33,1.0,0.999],[190.26,168.08,0.98,0.983],[189.46,169.24,1.0,0.994],[188.66,169.45,1.0,0.988],[187.9,169.62,1.0,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,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,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,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,0.967],[186.42,150.19,1.0,0.966],[188.41,150.46,1.0,0.966],[189.95,151.41,1.0,0.971],[191.61,152.4,1.0,0.971],[191.61,152.4,1.0,0.971],[189.01,151.48,1.0,0.971],[186.85,151.25,1.0,0.979],[184.64,150.57,1.0,0.975],[182.06,149.13,0.98,0.974],[179.48,149.48,1.0,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,0.983],[181.35,158.65,1.02,0.988],[184.96,160.94,1.0,0.987],[187.54,163.29,1.0,0.996],[189.22,166.33,1.02,0.992],[191.7,168.3,1.0,1.0],[191.7,168.3,1.0,1.0],[189.18,166.28,1.0,0.99],[186.95,164.07,0.98,0.991],[184.75,163.57,1.0,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,0.968],[198.92,167.34,1.0,0.966],[198.98,167.37,1.0,0.964],[199.06,167.41,1.0,0.962],[199.07,167.42,1.0,0.96],[199.07,167.42,1.0,0.96],[199.16,167.39,1.0,0.96],[199.43,167.35,1.0,0.96],[199.96,167.33,1.0,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.0,1.0],[192.77,168.21,1.0,0.999],[194.11,167.32,0.98,0.992],[195.54,167.92,1.0,0.986],[196.71,166.87,0.98,0.982],[197.88,167.48,1.0,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,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,0.963],[204.72,190.66,1.0,0.967],[204.91,194.05,1.0,0.954],[204.91,194.05,1.0,0.954],[203.9,194.08,1.0,0.956],[202.88,194.15,0.98,0.958],[201.8,195.0,1.0,0.958],[200.65,195.45,1.0,0.961],[199.66,196.08,1.0,0.957],[198.46,196.15,1.0,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,0.951],[190.53,196.01,1.0,0.951],[187.51,196.0,1.0,0.949],[184.08,194.32,0.98,0.952],[180.99,193.88,0.98,0.949],[177.81,194.62,1.0,0.949],[175.36,194.61,1.02,0.95],[171.67,193.62,1.0,0.944],[171.67,193.62,1.0,0.944],[174.59,193.5,1.02,0.952],[177.38,192.46,1.02,0.95],[180.43,190.38,1.0,0.957],[183.32,188.01,0.98,0.95],[186.05,187.0,0.98,0.954],[189.53,187.6,1.02,0.95],[192.59,185.84,1.0,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,0.963],[194.34,179.26,1.0,0.974],[193.93,177.12,1.0,0.982],[193.33,175.54,1.02,0.983],[192.7,173.2,1.0,0.996],[192.66,170.55,1.0,0.992],[191.7,168.3,1.0,1.0],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,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.0,1.0],[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]]}}}/*END GENERATED*/;
10
+ export const MOUTH_ANCHORS=/*BEGIN GENERATED*/{"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]}}}/*END GENERATED*/;
9
11
 
10
12
  // Exact sample the renderer's samplers read for this state (same quantization).
11
13
  export function mouthSourceFrame(family,state,info){
14
+ if(family==='actions'){const p=paperActionPose(state.actionName,state.actionProgress,info);return p.pair*9+Math.round(p.blend*8);}
12
15
  if(family==='approach')return state.approachPair*9+Math.round(state.blend*8);
13
16
  if(family==='behaviors'){const p=paperBehaviorPose(state,info);return p.pair*9+Math.round(p.blend*8);}
14
17
  if(family==='seat'||family==='arrivalSeat'){const q=state.seatProgress*3,pair=Math.min(2,Math.floor(q));return pair*17+Math.round((q-pair)*16);}
package/puppy-paper.mjs CHANGED
@@ -315,8 +315,11 @@ export function createPaperActor(animal,info,{manualTricks=false,trickTimings=nu
315
315
  if(activeAction?.comfort)kind=activeAction.comfort;
316
316
  let actionName=activeAction?.name??(state==='run'&&movementMode==='walk'?'walk':null),actionProgress=activeAction?(activeAction.timing?activeAction.timing.progressAt(age):Math.min(1,age/activeAction.duration)):phase;
317
317
  if(manualDown&&state==='down'){actionName='lie-down';actionProgress=1;}
318
- if(walkTransitions&&state==='view-turn'&&turnView==='front'){
319
- actionName=view==='approach'?'walk-face-front':'walk-face-rear';actionProgress=Math.min(1,age/viewTurnSeconds());
318
+ if(walkTransitions&&state==='view-turn'){
319
+ // Both directions share the same standing endpoints. The old outbound
320
+ // material began crouched, so reversing a journey changed the dog's mass.
321
+ actionName=(view==='approach'||turnView==='approach')?'walk-face-front':'walk-face-rear';
322
+ const t=Math.min(1,age/viewTurnSeconds());actionProgress=turnView==='front'?t:1-t;
320
323
  }
321
324
  // This clip is a calibrated standing half-turn, not walk-specific motion.
322
325
  // The old turn's intro/outro added an unrelated squat to every reversal.
@@ -419,9 +422,9 @@ export function createPaperRenderer(cache,info,meta,width,height,{rear,approach,
419
422
  if(kernel?.clear)kernel.clear(out);else{out.fill(0);for(let i=3;i<out.length;i+=4)out[i]=255;}
420
423
  render.lastPlacement={left,top,side,sideX};
421
424
  // Measured drawn mouth of the EXACT sample above (same priority, quantization,
422
- // placement and mirror). Side/rear/action/interaction stay null: unsupported.
423
- const mouthFamily=isInteraction||isAction?null:isBehavior?'behaviors':isSeat?(state.seatVariant==='arrival'&&arrivalSeatSample?'arrivalSeat':'seat'):isApproach?'approach':null;
424
- const mouthInfo={behaviors:behaviors?.info,seat:seat?.info,arrivalSeat:arrivalSeat?.info,approach:approach?.info}[mouthFamily];
425
+ // placement and mirror). Unmeasured or occluded samples remain unsupported.
426
+ const mouthFamily=isInteraction?null:isAction?'actions':isBehavior?'behaviors':isSeat?(state.seatVariant==='arrival'&&arrivalSeatSample?'arrivalSeat':'seat'):isApproach?'approach':null;
427
+ const mouthInfo={actions:actions?.info,behaviors:behaviors?.info,seat:seat?.info,arrivalSeat:arrivalSeat?.info,approach:approach?.info}[mouthFamily];
425
428
  const mouthFrame=mouthFamily?mouthSourceFrame(mouthFamily,state,mouthInfo):null;
426
429
  render.lastMouth=projectMouth(mouthFamily?mouthAnchor(mouthFamily,mouthFrame,mouthInfo?.sha256):null,{left,top,side,sideX},state.flip,{family:mouthFamily,frame:mouthFrame});
427
430
  if(motion?.mouth){