@datamoc/mw_games 0.30.0 → 0.33.0

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.
Files changed (71) hide show
  1. package/CHANGELOG.md +86 -0
  2. package/README.md +1 -1
  3. package/api-surface.json +384 -0
  4. package/dist/assets/index.d.ts +2 -0
  5. package/dist/assets/index.d.ts.map +1 -1
  6. package/dist/assets/index.js +1 -0
  7. package/dist/assets/index.js.map +1 -1
  8. package/dist/assets/svg.d.ts +87 -0
  9. package/dist/assets/svg.d.ts.map +1 -0
  10. package/dist/assets/svg.js +162 -0
  11. package/dist/assets/svg.js.map +1 -0
  12. package/dist/index.d.ts +1 -0
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +1 -0
  15. package/dist/index.js.map +1 -1
  16. package/dist/mw_games.global.js +41 -41
  17. package/dist/mwl/fengari.d.ts +12 -6
  18. package/dist/mwl/fengari.d.ts.map +1 -1
  19. package/dist/mwl/fengari.js +56 -70
  20. package/dist/mwl/fengari.js.map +1 -1
  21. package/dist/mwl/runtime.d.ts +13 -0
  22. package/dist/mwl/runtime.d.ts.map +1 -1
  23. package/dist/mwl/runtime.js +72 -4
  24. package/dist/mwl/runtime.js.map +1 -1
  25. package/dist/mwl/schema.d.ts.map +1 -1
  26. package/dist/mwl/schema.js +4 -1
  27. package/dist/mwl/schema.js.map +1 -1
  28. package/dist/roguelike/Cave.d.ts +109 -0
  29. package/dist/roguelike/Cave.d.ts.map +1 -0
  30. package/dist/roguelike/Cave.js +192 -0
  31. package/dist/roguelike/Cave.js.map +1 -0
  32. package/dist/roguelike/Overworld.d.ts +82 -0
  33. package/dist/roguelike/Overworld.d.ts.map +1 -0
  34. package/dist/roguelike/Overworld.js +306 -0
  35. package/dist/roguelike/Overworld.js.map +1 -0
  36. package/dist/roguelike/index.d.ts +4 -0
  37. package/dist/roguelike/index.d.ts.map +1 -1
  38. package/dist/roguelike/index.js +2 -0
  39. package/dist/roguelike/index.js.map +1 -1
  40. package/dist/skeleton/index.d.ts +131 -0
  41. package/dist/skeleton/index.d.ts.map +1 -0
  42. package/dist/skeleton/index.js +206 -0
  43. package/dist/skeleton/index.js.map +1 -0
  44. package/dist/testing/SceneControls.d.ts +35 -0
  45. package/dist/testing/SceneControls.d.ts.map +1 -0
  46. package/dist/testing/SceneControls.js +49 -0
  47. package/dist/testing/SceneControls.js.map +1 -0
  48. package/dist/testing/index.d.ts +2 -0
  49. package/dist/testing/index.d.ts.map +1 -1
  50. package/dist/testing/index.js +1 -0
  51. package/dist/testing/index.js.map +1 -1
  52. package/dist/two-d/render/Camera.d.ts +13 -3
  53. package/dist/two-d/render/Camera.d.ts.map +1 -1
  54. package/dist/two-d/render/Camera.js +35 -25
  55. package/dist/two-d/render/Camera.js.map +1 -1
  56. package/dist/two-d/render/SkeletalSprite.d.ts +118 -0
  57. package/dist/two-d/render/SkeletalSprite.d.ts.map +1 -0
  58. package/dist/two-d/render/SkeletalSprite.js +189 -0
  59. package/dist/two-d/render/SkeletalSprite.js.map +1 -0
  60. package/dist/two-d/render/SpriteMotion.d.ts +121 -0
  61. package/dist/two-d/render/SpriteMotion.d.ts.map +1 -0
  62. package/dist/two-d/render/SpriteMotion.js +193 -0
  63. package/dist/two-d/render/SpriteMotion.js.map +1 -0
  64. package/dist/two-d/render/index.d.ts +4 -0
  65. package/dist/two-d/render/index.d.ts.map +1 -1
  66. package/dist/two-d/render/index.js +2 -0
  67. package/dist/two-d/render/index.js.map +1 -1
  68. package/dist/version.d.ts +1 -1
  69. package/dist/version.js +1 -1
  70. package/package.json +7 -2
  71. package/sbom.cdx.json +222 -222
@@ -29,6 +29,7 @@ export class Camera {
29
29
  /** centre of the view, in world units */
30
30
  this.x = 0;
31
31
  this.y = 0;
32
+ this.requestedZoom = 1;
32
33
  this.viewWidth = 0;
33
34
  this.viewHeight = 0;
34
35
  //where this camera's own rectangle starts on screen; 0,0 for an ordinary full-screen
@@ -58,7 +59,7 @@ export class Camera {
58
59
  this.stepsPerTurn = options.grid === 'hex' ? 6 : 4;
59
60
  this.deadzone = options.deadzone ?? 0;
60
61
  this.pixelPerfectTileSize = options.pixelPerfectTileSize;
61
- this._zoom = 1;
62
+ this.resolution = options.resolution ?? (() => 1);
62
63
  this.zoom = options.zoom ?? 1;
63
64
  }
64
65
  /** the rotation step this view is turned to, always in `0 .. stepsPerTurn - 1` */
@@ -117,12 +118,14 @@ export class Camera {
117
118
  const angle = this.rotation;
118
119
  return { cos: Math.cos(angle), sin: Math.sin(angle) };
119
120
  }
121
+ /** snapped on every read, not on set, so a resolution change (a `QualityScaler` step) is followed */
120
122
  get zoom() {
121
- return this._zoom;
123
+ return this.pixelPerfectTileSize
124
+ ? snapZoom(this.requestedZoom, this.pixelPerfectTileSize, this.resolution())
125
+ : this.requestedZoom;
122
126
  }
123
127
  set zoom(value) {
124
- const clamped = Math.max(0.01, value);
125
- this._zoom = this.pixelPerfectTileSize ? snapZoom(clamped, this.pixelPerfectTileSize) : clamped;
128
+ this.requestedZoom = Math.max(0.01, value);
126
129
  }
127
130
  /**
128
131
  * The framework calls this on resize; sizes are in screen pixels. `screenX`/`screenY`
@@ -145,8 +148,8 @@ export class Camera {
145
148
  * its exact numbers.
146
149
  */
147
150
  get view() {
148
- const width = this.viewWidth / this._zoom;
149
- const height = this.viewHeight / this._zoom;
151
+ const width = this.viewWidth / this.zoom;
152
+ const height = this.viewHeight / this.zoom;
150
153
  const { x: centreX, y: centreY } = this.clampedCentre(this.x, this.y);
151
154
  if (this._angle === 0)
152
155
  return { x: centreX - width / 2, y: centreY - height / 2, width, height };
@@ -207,14 +210,14 @@ export class Camera {
207
210
  * it starts, matching what a caller asked for rather than what world-space asked for.
208
211
  */
209
212
  shakeScreen(intensity, duration = 0.4) {
210
- this.shake(intensity / this._zoom, duration);
213
+ this.shake(intensity / this.zoom, duration);
211
214
  }
212
215
  update(dt) {
213
216
  if (this.followTarget && this.followIntensity > 0) {
214
217
  //half the view's world-unit size, not this.view itself: that getter also clamps to
215
218
  //bounds, which the deadzone has no use for and would cost an extra allocation here
216
- const deadX = ((this.viewWidth / this._zoom) * this.deadzone) / 2;
217
- const deadY = ((this.viewHeight / this._zoom) * this.deadzone) / 2;
219
+ const deadX = ((this.viewWidth / this.zoom) * this.deadzone) / 2;
220
+ const deadY = ((this.viewHeight / this.zoom) * this.deadzone) / 2;
218
221
  let dx = this.followTarget.x - this.x;
219
222
  let dy = this.followTarget.y - this.y;
220
223
  //inside the deadzone the camera simply does not move
@@ -260,16 +263,16 @@ export class Camera {
260
263
  const dx = x - centreX;
261
264
  const dy = y - centreY;
262
265
  return {
263
- x: (dx * cos - dy * sin) * this._zoom + this.screenX + this.viewWidth / 2,
264
- y: (dx * sin + dy * cos) * this._zoom + this.screenY + this.viewHeight / 2,
266
+ x: (dx * cos - dy * sin) * this.zoom + this.screenX + this.viewWidth / 2,
267
+ y: (dx * sin + dy * cos) * this.zoom + this.screenY + this.viewHeight / 2,
265
268
  };
266
269
  }
267
270
  /** screen pixels to world point, for turning a click into a tile; the inverse of `toScreen` */
268
271
  toWorld(x, y) {
269
272
  const { x: centreX, y: centreY } = this.clampedCentre(this.x + this.shakeX, this.y + this.shakeY);
270
273
  const { cos, sin } = this.spin;
271
- const rx = (x - this.screenX - this.viewWidth / 2) / this._zoom;
272
- const ry = (y - this.screenY - this.viewHeight / 2) / this._zoom;
274
+ const rx = (x - this.screenX - this.viewWidth / 2) / this.zoom;
275
+ const ry = (y - this.screenY - this.viewHeight / 2) / this.zoom;
273
276
  return {
274
277
  x: centreX + rx * cos + ry * sin,
275
278
  y: centreY - rx * sin + ry * cos,
@@ -280,8 +283,8 @@ export class Camera {
280
283
  clampedCentre(x, y) {
281
284
  if (!this.bounds)
282
285
  return { x, y };
283
- const halfWidth = this.viewWidth / this._zoom / 2;
284
- const halfHeight = this.viewHeight / this._zoom / 2;
286
+ const halfWidth = this.viewWidth / this.zoom / 2;
287
+ const halfHeight = this.viewHeight / this.zoom / 2;
285
288
  const { minX, minY, maxX, maxY } = this.bounds;
286
289
  //when the map is narrower than the view, centre it rather than clamping to an
287
290
  //edge, which would push the map against one side of the screen
@@ -292,22 +295,28 @@ export class Camera {
292
295
  }
293
296
  apply() {
294
297
  const { x: centreX, y: centreY } = this.clampedCentre(this.x + this.shakeX, this.y + this.shakeY);
295
- this.world.scale.set(this._zoom);
298
+ this.world.scale.set(this.zoom);
296
299
  if (this._angle === 0) {
297
300
  //unturned: rotate about the origin, the transform every existing camera had
298
301
  this.world.rotation = 0;
299
302
  this.world.pivot.set(0, 0);
300
303
  //rounding to whole screen pixels stops pixel art shimmering as the camera moves
301
- this.world.x = Math.round(this.screenX + this.viewWidth / 2 - centreX * this._zoom);
302
- this.world.y = Math.round(this.screenY + this.viewHeight / 2 - centreY * this._zoom);
304
+ this.world.x = this.snapToDevice(this.screenX + this.viewWidth / 2 - centreX * this.zoom);
305
+ this.world.y = this.snapToDevice(this.screenY + this.viewHeight / 2 - centreY * this.zoom);
303
306
  return;
304
307
  }
305
308
  //turned: pivot on the view centre so the layer turns about what the player is looking
306
309
  //at, and the centre lands on the same screen point the unturned camera would use
307
310
  this.world.rotation = this.rotation;
308
311
  this.world.pivot.set(centreX, centreY);
309
- this.world.x = Math.round(this.screenX + this.viewWidth / 2);
310
- this.world.y = Math.round(this.screenY + this.viewHeight / 2);
312
+ this.world.x = this.snapToDevice(this.screenX + this.viewWidth / 2);
313
+ this.world.y = this.snapToDevice(this.screenY + this.viewHeight / 2);
314
+ }
315
+ //a whole device pixel, not a whole CSS one: at a devicePixelRatio of 1.5 an odd CSS offset is
316
+ //half a device pixel, which puts every tile edge between pixels and leaves a seam
317
+ snapToDevice(value) {
318
+ const resolution = this.resolution();
319
+ return Math.round(value * resolution) / resolution;
311
320
  }
312
321
  }
313
322
  //the signed turn from `from` to `to`, in (-pi, pi], so easing always takes the shorter way
@@ -322,7 +331,8 @@ function angleDiff(from, to) {
322
331
  return diff;
323
332
  }
324
333
  /**
325
- * The nearest zoom to `zoom` at which `tileSize * zoom` is a whole number of screen pixels -
334
+ * The nearest zoom to `zoom` at which `tileSize * zoom` is a whole number of device pixels
335
+ * (`resolution` device pixels per screen pixel, default 1) -
326
336
  * the pure math behind `CameraOptions.pixelPerfectTileSize`, exported so a game can snap a
327
337
  * zoom value (from a slider, say) before ever handing it to a `Camera`.
328
338
  *
@@ -333,9 +343,9 @@ function angleDiff(from, to) {
333
343
  * console.log(snapZoom(2.4, 16)); // 2.375 - 16 * 2.375 = 38, a whole number of pixels
334
344
  * ```
335
345
  */
336
- export function snapZoom(zoom, tileSize) {
337
- const pixels = Math.max(1, Math.round(zoom * tileSize));
338
- return pixels / tileSize;
346
+ export function snapZoom(zoom, tileSize, resolution = 1) {
347
+ const pixels = Math.max(1, Math.round(zoom * tileSize * resolution));
348
+ return pixels / (tileSize * resolution);
339
349
  }
340
350
  /**
341
351
  * a camera sized to the running game's viewport, updated on every frame
@@ -348,8 +358,8 @@ export function snapZoom(zoom, tileSize) {
348
358
  * ```
349
359
  */
350
360
  export function createCamera(options = {}) {
351
- const camera = new Camera(options);
352
361
  const game = Game.current;
362
+ const camera = new Camera({ resolution: () => game.app.renderer.resolution, ...options });
353
363
  //the logical viewport, not the backing store, which is larger on a hidpi display
354
364
  camera.setViewport(game.width, game.height);
355
365
  return camera;
@@ -1 +1 @@
1
- {"version":3,"file":"Camera.js","sourceRoot":"","sources":["../../../src/two-d/render/Camera.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Camera.js","sourceRoot":"","sources":["../../../src/two-d/render/Camera.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,KAAK,MAAM,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAiF3C;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,OAAO,MAAM;IA6ClB,YAAY,OAAO,GAAkB,EAAE;QA5CvC,4CAA4C;QACnC,UAAK,GAAG,IAAI,SAAS,EAAE,CAAC;QAEjC,yCAAyC;QACzC,MAAC,GAAG,CAAC,CAAC;QACN,MAAC,GAAG,CAAC,CAAC;QAEE,kBAAa,GAAG,CAAC,CAAC;QAKlB,cAAS,GAAG,CAAC,CAAC;QACd,eAAU,GAAG,CAAC,CAAC;QACvB,qFAAqF;QACrF,uFAAuF;QAC/E,YAAO,GAAG,CAAC,CAAC;QACZ,YAAO,GAAG,CAAC,CAAC;QAEZ,iBAAY,GAAoC,IAAI,CAAC;QAC7D,kFAAkF;QAClF,kEAAkE;QAC1D,oBAAe,GAAG,CAAC,CAAC;QAEpB,mBAAc,GAAG,CAAC,CAAC;QACnB,mBAAc,GAAG,CAAC,CAAC;QACnB,kBAAa,GAAG,CAAC,CAAC;QAClB,WAAM,GAAG,CAAC,CAAC;QACX,WAAM,GAAG,CAAC,CAAC;QAEnB,yFAAyF;QACjF,WAAM,GAAsE,IAAI,CAAC;QAIjF,SAAI,GAAG,CAAC,CAAC;QAEjB,oFAAoF;QACpF,6EAA6E;QAC7E,sFAAsF;QAC9E,WAAM,GAAG,CAAC,CAAC;QACX,gBAAW,GAAkB,IAAI,CAAC;QAClC,mBAAc,GAAG,CAAC,CAAC;QAG1B,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK;YACpF,MAAM,IAAI,KAAK,CAAC,+CAA+C,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;QACjF,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC;QACzD,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,kFAAkF;IAClF,IAAI,aAAa;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC;IAClB,CAAC;IAED,oFAAoF;IACpF,IAAI,QAAQ;QACX,OAAO,IAAI,CAAC,MAAM,CAAC;IACpB,CAAC;IAED;;;;OAIG;IACH,IAAI,eAAe;QAClB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,kEAAkE;IAClE,eAAe,CAAC,IAAY;QAC3B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QACxF,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC;QACjF,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QAC5D,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,KAAK,EAAE,CAAC;IACd,CAAC;IAED,6FAA6F;IAC7F,MAAM,CAAC,KAAK,GAAG,CAAC;QACf,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;IACzC,CAAC;IAED;;;;;OAKG;IACH,QAAQ,CAAC,KAAa;QACrB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,KAAK,EAAE,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACH,iBAAiB,CAAC,KAAa,EAAE,SAAS,GAAG,CAAC;QAC7C,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;IACjC,CAAC;IAED,6FAA6F;IAC7F,IAAY,IAAI;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC5B,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;IACvD,CAAC;IAED,qGAAqG;IACrG,IAAI,IAAI;QACP,OAAO,IAAI,CAAC,oBAAoB;YAC/B,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;YAC5E,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC;IACvB,CAAC;IAED,IAAI,IAAI,CAAC,KAAa;QACrB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED;;;;;OAKG;IACH,WAAW,CAAC,KAAa,EAAE,MAAc,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC;QAClE,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACxB,CAAC;IAED;;;;;;;OAOG;IACH,IAAI,IAAI;QACP,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC;QAC3C,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QACtE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAEjG,MAAM,OAAO,GAAG;YACf,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC;YACxC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC;YACzD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC;YAC3E,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC;SAC1D,CAAC;QACF,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;QAC7B,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC;IAC5F,CAAC;IAED,oEAAoE;IACpE,SAAS,CAAC,MAAyE;QAClF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACtB,CAAC;IAED,wEAAwE;IACxE,MAAM,CAAC,CAAS,EAAE,CAAS;QAC1B,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,KAAK,EAAE,CAAC;IACd,CAAC;IAED,kCAAkC;IAClC,KAAK,CAAC,CAAS,EAAE,CAAS,EAAE,SAAS,GAAG,CAAC;QACxC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;IAClC,CAAC;IAED,oEAAoE;IACpE,MAAM,CAAC,MAAgC,EAAE,SAAS,GAAG,CAAC;QACrD,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;QAC3B,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;IAClC,CAAC;IAED,aAAa;QACZ,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,2DAA2D;IAC3D,KAAK,CAAC,SAAiB,EAAE,QAAQ,GAAG,GAAG;QACtC,oFAAoF;QACpF,IAAI,aAAa,EAAE;YAAE,OAAO;QAE5B,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;QAChC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC;IACrD,CAAC;IAED;;;;;;;;;OASG;IACH,WAAW,CAAC,SAAiB,EAAE,QAAQ,GAAG,GAAG;QAC5C,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,EAAU;QAChB,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;YACnD,mFAAmF;YACnF,mFAAmF;YACnF,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACjE,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAElE,IAAI,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YACtC,IAAI,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YAEtC,qDAAqD;YACrD,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5D,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAE5D,6EAA6E;YAC7E,2EAA2E;YAC3E,4EAA4E;YAC5E,yEAAyE;YACzE,uEAAuE;YACvE,4EAA4E;YAC5E,MAAM,CAAC,GAAG,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC,CAAC;YACzE,IAAI,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACjB,IAAI,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,IAAI,IAAI,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YACtD,kFAAkF;YAClF,4DAA4D;YAC5D,MAAM,CAAC,GAAG,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC,CAAC;YACxE,IAAI,CAAC,MAAM,IAAI,IAAI,GAAG,CAAC,CAAC;QACzB,CAAC;QAED,IAAI,IAAI,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC;YAC1B,iEAAiE;YACjE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;YACtE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC;YAChF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC;QACjF,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAC/B,CAAC;QAED,IAAI,CAAC,KAAK,EAAE,CAAC;IACd,CAAC;IAED,iEAAiE;IACjE,QAAQ,CAAC,CAAS,EAAE,CAAS;QAC5B,iFAAiF;QACjF,4EAA4E;QAC5E,gFAAgF;QAChF,wBAAwB;QACxB,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QAClG,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;QAC/B,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC;QACvB,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC;QACvB,OAAO;YACN,CAAC,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC;YACxE,CAAC,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC;SACzE,CAAC;IACH,CAAC;IAED,+FAA+F;IAC/F,OAAO,CAAC,CAAS,EAAE,CAAS;QAC3B,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QAClG,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;QAC/B,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;QAC/D,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;QAChE,OAAO;YACN,CAAC,EAAE,OAAO,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG;YAChC,CAAC,EAAE,OAAO,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG;SAChC,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,iFAAiF;IACzE,aAAa,CAAC,CAAS,EAAE,CAAS;QACzC,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QAElC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QACnD,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;QAE/C,8EAA8E;QAC9E,+DAA+D;QAC/D,OAAO;YACN,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,GAAG,SAAS,EAAE,IAAI,GAAG,SAAS,CAAC;YACjG,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,GAAG,UAAU,EAAE,IAAI,GAAG,UAAU,CAAC;SACpG,CAAC;IACH,CAAC;IAEO,KAAK;QACZ,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QAElG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,4EAA4E;YAC5E,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3B,gFAAgF;YAChF,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1F,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3F,OAAO;QACR,CAAC;QAED,sFAAsF;QACtF,iFAAiF;QACjF,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;QACpE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,8FAA8F;IAC9F,kFAAkF;IAC1E,YAAY,CAAC,KAAa;QACjC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,UAAU,CAAC;IACpD,CAAC;CACD;AAED,2FAA2F;AAC3F,kFAAkF;AAClF,SAAS,SAAS,CAAC,IAAY,EAAE,EAAU;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1B,IAAI,IAAI,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC;IAC/B,IAAI,IAAI,GAAG,IAAI,CAAC,EAAE;QAAE,IAAI,IAAI,KAAK,CAAC;IAClC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE;QAAE,IAAI,IAAI,KAAK,CAAC;IACnC,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,QAAgB,EAAE,UAAU,GAAG,CAAC;IACtE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC;IACrE,OAAO,MAAM,GAAG,CAAC,QAAQ,GAAG,UAAU,CAAC,CAAC;AACzC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAAC,OAAO,GAAkB,EAAE;IACvD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC;IAC1B,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAC1F,iFAAiF;IACjF,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO,MAAM,CAAC;AACf,CAAC"}
@@ -0,0 +1,118 @@
1
+ import { Container } from 'pixi.js';
2
+ import { type Mixer, type Pose, type SkeletonBones } from '../../skeleton/index.ts';
3
+ import { TintedSprite } from './TintedSprite.ts';
4
+ import type { Texture2D } from './Types2D.ts';
5
+ /**
6
+ * Bones driving drawn parts (roadmap 400), the drawing half of the `skeleton` module.
7
+ *
8
+ * A `SkeletalSprite` binds sprites or texture regions to bones by name; `update(dt)` advances
9
+ * the mixer (or applies a pose a game resolved itself) and places each part at its bone's
10
+ * world transform, so a character sheet, an SVG puppet split by groups or a mixed rig
11
+ * animate through the same bone tree. Walk, swing and look cycles are clips; the binding is
12
+ * the only rendering decision this side makes.
13
+ *
14
+ * An `ArticulatedChain` is the one articulated shape a keyframe cannot express: a long body
15
+ * (a dragon's neck and tail, a serpent's spine) drawn as a chain of segments that follows
16
+ * its head procedurally. Each segment eases toward its parent's previous position, with
17
+ * per-segment rotation limits so the body bends like a body and not like a rope of beads.
18
+ * This is deliberately not a clip - it is a follower rule, not authored motion - and
19
+ * composes with one: a clip drives the head and limbs, the chain does the rest of the body.
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * import * as Skeleton from '@datamoc/mw_games/skeleton';
24
+ * import { Texture, TextureSource } from 'pixi.js';
25
+ * import { SkeletalSprite } from '@datamoc/mw_games/two-d/render';
26
+ *
27
+ * const puppet = Skeleton.create([{ name: 'arm', length: 12 }]);
28
+ * const mixer = Skeleton.createMixer(puppet, {
29
+ * id: 'idle', duration: 1, loop: true,
30
+ * frames: [{ time: 0, rotations: { arm: 0 } }, { time: 1, rotations: { arm: 90 } }],
31
+ * });
32
+ * const rig = new SkeletalSprite(puppet, mixer);
33
+ * const armTexture = new Texture({ source: new TextureSource({ width: 8, height: 8 }) });
34
+ * rig.bind('arm', armTexture).anchor.set(0, 0.5);
35
+ * rig.update(1 / 60); // each part sits on its bone, every frame
36
+ * ```
37
+ */
38
+ export declare class SkeletalSprite extends Container {
39
+ private readonly skeleton;
40
+ private readonly parts;
41
+ private readonly mixer;
42
+ constructor(skeleton: SkeletonBones, mixer?: Mixer);
43
+ /** bind a drawn part to a bone by name; the sprite's own anchor decides how it hangs */
44
+ bind(bone: string, texture: Texture2D): TintedSprite;
45
+ /** the sprite bound to a bone, or undefined for an unbound one */
46
+ part(bone: string): TintedSprite | undefined;
47
+ /** apply a pose directly; `update` does this itself when a mixer was given */
48
+ apply(pose: Pose): void;
49
+ /** advance the mixer and place every part; needs a mixer, refuses without one */
50
+ update(_dt: number): void;
51
+ }
52
+ export interface ChainOptions {
53
+ /** how many segments the body has */
54
+ segments: number;
55
+ /** how far each segment sits from the one before it */
56
+ length: number;
57
+ /** 0..1, how fast a segment eases toward its parent's previous position; defaults to 1 */
58
+ stiffness?: number;
59
+ /** degrees, the sharpest bend two consecutive segments may make; defaults to 90 */
60
+ bendLimit?: number;
61
+ }
62
+ /**
63
+ * A serpent's spine as pure positions: the head is pulled by the game, every segment eases
64
+ * toward where its parent just was, and no two segments may bend past `bendLimit`. The
65
+ * positions are the contract; drawing them is a `ChainRig`.
66
+ */
67
+ /**
68
+ * A serpent's spine as pure positions.
69
+ *
70
+ * @example
71
+ * ```ts
72
+ * import { ArticulatedChain } from '@datamoc/mw_games/two-d/render';
73
+ *
74
+ * const spine = new ArticulatedChain({ segments: 8, length: 12, bendLimit: 45 });
75
+ * spine.pull(100, 0);
76
+ * spine.update(1); // the body starts following the head
77
+ * ```
78
+ */
79
+ export declare class ArticulatedChain {
80
+ readonly points: Array<{
81
+ x: number;
82
+ y: number;
83
+ }>;
84
+ private readonly previous;
85
+ private readonly length;
86
+ private readonly stiffness;
87
+ private readonly bendLimit;
88
+ constructor(options: ChainOptions);
89
+ /** move the head; the body follows on the next `update` */
90
+ pull(x: number, y: number): void;
91
+ /** one tick of the follower rule: ease toward the parent's previous position, then bend-limit */
92
+ update(_dt: number): void;
93
+ }
94
+ /**
95
+ * The drawing half of a chain: one sprite per segment, placed on `update`. The chain is the
96
+ * motion; this only positions what the game handed over.
97
+ */
98
+ /**
99
+ * The drawing half of a chain: one sprite per segment.
100
+ *
101
+ * @example
102
+ * ```ts
103
+ * import { Texture, TextureSource } from 'pixi.js';
104
+ * import { ArticulatedChain, ChainRig } from '@datamoc/mw_games/two-d/render';
105
+ *
106
+ * const skin = new Texture({ source: new TextureSource({ width: 8, height: 8 }) });
107
+ * const spine = new ArticulatedChain({ segments: 3, length: 10 });
108
+ * const rig = new ChainRig(spine, [skin, skin, skin]); // one Texture per segment
109
+ * rig.update(1); // segments sit on the chain's points
110
+ * ```
111
+ */
112
+ export declare class ChainRig extends Container {
113
+ private readonly chain;
114
+ private readonly segments;
115
+ constructor(chain: ArticulatedChain, textures: readonly Texture2D[]);
116
+ update(dt: number): void;
117
+ }
118
+ //# sourceMappingURL=SkeletalSprite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkeletalSprite.d.ts","sourceRoot":"","sources":["../../../src/two-d/render/SkeletalSprite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAIN,KAAK,KAAK,EACV,KAAK,IAAI,EACT,KAAK,aAAa,EAClB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,qBAAa,cAAe,SAAQ,SAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IACzC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmC;IACzD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoB;IAE1C,YAAY,QAAQ,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,KAAK,EAIjD;IAED,wFAAwF;IACxF,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,GAAG,YAAY,CAKnD;IAED,kEAAkE;IAClE,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAE3C;IAED,8EAA8E;IAC9E,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAQtB;IAED,iFAAiF;IACjF,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAGxB;CACD;AAED,MAAM,WAAW,YAAY;IAC5B,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAC;IACf,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mFAAmF;IACnF,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH;;;;;;;;;;;GAWG;AACH,qBAAa,gBAAgB;IAC5B,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAM;IACtD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuC;IAChE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC,YAAY,OAAO,EAAE,YAAY,EAUhC;IAED,2DAA2D;IAC3D,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAG/B;IAED,iGAAiG;IACjG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CA+BxB;CACD;AAED;;;GAGG;AACH;;;;;;;;;;;;;GAaG;AACH,qBAAa,QAAS,SAAQ,SAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmB;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAE1C,YAAY,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,SAAS,SAAS,EAAE,EAUlE;IAED,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAQvB;CACD"}
@@ -0,0 +1,189 @@
1
+ import { Container } from 'pixi.js';
2
+ import { advance as advanceMixer, resolve, } from '../../skeleton/index.js';
3
+ import { TintedSprite } from './TintedSprite.js';
4
+ /**
5
+ * Bones driving drawn parts (roadmap 400), the drawing half of the `skeleton` module.
6
+ *
7
+ * A `SkeletalSprite` binds sprites or texture regions to bones by name; `update(dt)` advances
8
+ * the mixer (or applies a pose a game resolved itself) and places each part at its bone's
9
+ * world transform, so a character sheet, an SVG puppet split by groups or a mixed rig
10
+ * animate through the same bone tree. Walk, swing and look cycles are clips; the binding is
11
+ * the only rendering decision this side makes.
12
+ *
13
+ * An `ArticulatedChain` is the one articulated shape a keyframe cannot express: a long body
14
+ * (a dragon's neck and tail, a serpent's spine) drawn as a chain of segments that follows
15
+ * its head procedurally. Each segment eases toward its parent's previous position, with
16
+ * per-segment rotation limits so the body bends like a body and not like a rope of beads.
17
+ * This is deliberately not a clip - it is a follower rule, not authored motion - and
18
+ * composes with one: a clip drives the head and limbs, the chain does the rest of the body.
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * import * as Skeleton from '@datamoc/mw_games/skeleton';
23
+ * import { Texture, TextureSource } from 'pixi.js';
24
+ * import { SkeletalSprite } from '@datamoc/mw_games/two-d/render';
25
+ *
26
+ * const puppet = Skeleton.create([{ name: 'arm', length: 12 }]);
27
+ * const mixer = Skeleton.createMixer(puppet, {
28
+ * id: 'idle', duration: 1, loop: true,
29
+ * frames: [{ time: 0, rotations: { arm: 0 } }, { time: 1, rotations: { arm: 90 } }],
30
+ * });
31
+ * const rig = new SkeletalSprite(puppet, mixer);
32
+ * const armTexture = new Texture({ source: new TextureSource({ width: 8, height: 8 }) });
33
+ * rig.bind('arm', armTexture).anchor.set(0, 0.5);
34
+ * rig.update(1 / 60); // each part sits on its bone, every frame
35
+ * ```
36
+ */
37
+ export class SkeletalSprite extends Container {
38
+ constructor(skeleton, mixer) {
39
+ super();
40
+ this.parts = new Map();
41
+ this.skeleton = skeleton;
42
+ this.mixer = mixer;
43
+ }
44
+ /** bind a drawn part to a bone by name; the sprite's own anchor decides how it hangs */
45
+ bind(bone, texture) {
46
+ const sprite = new TintedSprite(texture);
47
+ this.parts.set(bone, sprite);
48
+ this.addChild(sprite);
49
+ return sprite;
50
+ }
51
+ /** the sprite bound to a bone, or undefined for an unbound one */
52
+ part(bone) {
53
+ return this.parts.get(bone);
54
+ }
55
+ /** apply a pose directly; `update` does this itself when a mixer was given */
56
+ apply(pose) {
57
+ const transforms = new Map(resolve(this.skeleton, pose).map((bone) => [bone.name, bone]));
58
+ for (const [bone, sprite] of this.parts) {
59
+ const transform = transforms.get(bone);
60
+ if (!transform)
61
+ throw new Error(`skeletal sprite binds no bone named ${bone}`);
62
+ sprite.position.set(transform.x, transform.y);
63
+ sprite.rotation = (transform.angle * Math.PI) / 180;
64
+ }
65
+ }
66
+ /** advance the mixer and place every part; needs a mixer, refuses without one */
67
+ update(_dt) {
68
+ if (!this.mixer)
69
+ throw new Error('a skeletal sprite without a mixer needs apply(pose)');
70
+ this.apply(advanceMixer(this.mixer, _dt));
71
+ }
72
+ }
73
+ /**
74
+ * A serpent's spine as pure positions: the head is pulled by the game, every segment eases
75
+ * toward where its parent just was, and no two segments may bend past `bendLimit`. The
76
+ * positions are the contract; drawing them is a `ChainRig`.
77
+ */
78
+ /**
79
+ * A serpent's spine as pure positions.
80
+ *
81
+ * @example
82
+ * ```ts
83
+ * import { ArticulatedChain } from '@datamoc/mw_games/two-d/render';
84
+ *
85
+ * const spine = new ArticulatedChain({ segments: 8, length: 12, bendLimit: 45 });
86
+ * spine.pull(100, 0);
87
+ * spine.update(1); // the body starts following the head
88
+ * ```
89
+ */
90
+ export class ArticulatedChain {
91
+ constructor(options) {
92
+ this.points = [];
93
+ this.previous = [];
94
+ if (options.segments < 2)
95
+ throw new Error('an articulated chain needs at least two segments');
96
+ if (options.length <= 0)
97
+ throw new Error('an articulated chain needs a positive length');
98
+ this.length = options.length;
99
+ this.stiffness = Math.max(0, Math.min(1, options.stiffness ?? 1));
100
+ this.bendLimit = (options.bendLimit ?? 90) * (Math.PI / 180);
101
+ for (let index = 0; index < options.segments; index++) {
102
+ this.points.push({ x: -index * options.length, y: 0 });
103
+ this.previous.push({ x: -index * options.length, y: 0 });
104
+ }
105
+ }
106
+ /** move the head; the body follows on the next `update` */
107
+ pull(x, y) {
108
+ this.points[0].x = x;
109
+ this.points[0].y = y;
110
+ }
111
+ /** one tick of the follower rule: ease toward the parent's previous position, then bend-limit */
112
+ update(_dt) {
113
+ for (let index = 0; index < this.points.length; index++)
114
+ this.previous[index] = { x: this.points[index].x, y: this.points[index].y };
115
+ for (let index = 1; index < this.points.length; index++) {
116
+ const parent = this.previous[index - 1];
117
+ const segment = this.points[index];
118
+ const dx = parent.x - segment.x;
119
+ const dy = parent.y - segment.y;
120
+ const distance = Math.hypot(dx, dy);
121
+ if (distance > this.length) {
122
+ const slack = distance > 0 ? (distance - this.length) / distance : 0;
123
+ segment.x += dx * slack * this.stiffness;
124
+ segment.y += dy * slack * this.stiffness;
125
+ }
126
+ }
127
+ //rotation limits: each segment may bend no further than bendLimit from the
128
+ //direction of the segment before it, so the body bends like a body
129
+ for (let index = 2; index < this.points.length; index++) {
130
+ const before = this.points[index - 2];
131
+ const parent = this.points[index - 1];
132
+ const segment = this.points[index];
133
+ const base = Math.atan2(parent.y - before.y, parent.x - before.x);
134
+ const bend = Math.atan2(segment.y - parent.y, segment.x - parent.x);
135
+ let delta = bend - base;
136
+ while (delta > Math.PI)
137
+ delta -= 2 * Math.PI;
138
+ while (delta < -Math.PI)
139
+ delta += 2 * Math.PI;
140
+ if (Math.abs(delta) <= this.bendLimit)
141
+ continue;
142
+ const clamped = base + Math.sign(delta) * this.bendLimit;
143
+ segment.x = parent.x + Math.cos(clamped) * this.length;
144
+ segment.y = parent.y + Math.sin(clamped) * this.length;
145
+ }
146
+ }
147
+ }
148
+ /**
149
+ * The drawing half of a chain: one sprite per segment, placed on `update`. The chain is the
150
+ * motion; this only positions what the game handed over.
151
+ */
152
+ /**
153
+ * The drawing half of a chain: one sprite per segment.
154
+ *
155
+ * @example
156
+ * ```ts
157
+ * import { Texture, TextureSource } from 'pixi.js';
158
+ * import { ArticulatedChain, ChainRig } from '@datamoc/mw_games/two-d/render';
159
+ *
160
+ * const skin = new Texture({ source: new TextureSource({ width: 8, height: 8 }) });
161
+ * const spine = new ArticulatedChain({ segments: 3, length: 10 });
162
+ * const rig = new ChainRig(spine, [skin, skin, skin]); // one Texture per segment
163
+ * rig.update(1); // segments sit on the chain's points
164
+ * ```
165
+ */
166
+ export class ChainRig extends Container {
167
+ constructor(chain, textures) {
168
+ super();
169
+ if (textures.length !== chain.points.length)
170
+ throw new Error('a chain rig needs one texture per segment');
171
+ this.chain = chain;
172
+ this.segments = textures.map((texture) => {
173
+ const sprite = new TintedSprite(texture);
174
+ sprite.anchor.set(0, 0.5);
175
+ this.addChild(sprite);
176
+ return sprite;
177
+ });
178
+ }
179
+ update(dt) {
180
+ this.chain.update(dt);
181
+ for (let index = 0; index < this.segments.length; index++) {
182
+ const point = this.chain.points[index];
183
+ const next = this.chain.points[index + 1] ?? point;
184
+ this.segments[index].position.set(point.x, point.y);
185
+ this.segments[index].rotation = Math.atan2(next.y - point.y, next.x - point.x);
186
+ }
187
+ }
188
+ }
189
+ //# sourceMappingURL=SkeletalSprite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkeletalSprite.js","sourceRoot":"","sources":["../../../src/two-d/render/SkeletalSprite.ts"],"names":[],"mappings":"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"}