@datamoc/mw_games 0.37.0 → 0.39.1

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 (113) hide show
  1. package/CHANGELOG.md +79 -0
  2. package/README.md +26 -0
  3. package/api-surface.json +650 -2
  4. package/dist/assets/SvgParts.d.ts +31 -0
  5. package/dist/assets/SvgParts.d.ts.map +1 -0
  6. package/dist/assets/SvgParts.js +54 -0
  7. package/dist/assets/SvgParts.js.map +1 -0
  8. package/dist/assets/SvgSource.d.ts +3 -0
  9. package/dist/assets/SvgSource.d.ts.map +1 -0
  10. package/dist/assets/SvgSource.js +22 -0
  11. package/dist/assets/SvgSource.js.map +1 -0
  12. package/dist/assets/index.d.ts +2 -0
  13. package/dist/assets/index.d.ts.map +1 -1
  14. package/dist/assets/index.js +1 -0
  15. package/dist/assets/index.js.map +1 -1
  16. package/dist/assets/svg.d.ts.map +1 -1
  17. package/dist/assets/svg.js +9 -5
  18. package/dist/assets/svg.js.map +1 -1
  19. package/dist/mw_games.global.js +110 -110
  20. package/dist/mwl/presentation.d.ts +70 -0
  21. package/dist/mwl/presentation.d.ts.map +1 -0
  22. package/dist/mwl/presentation.js +419 -0
  23. package/dist/mwl/presentation.js.map +1 -0
  24. package/dist/physics/PhysicsWorld.d.ts +49 -17
  25. package/dist/physics/PhysicsWorld.d.ts.map +1 -1
  26. package/dist/physics/PhysicsWorld.js +297 -59
  27. package/dist/physics/PhysicsWorld.js.map +1 -1
  28. package/dist/physics/XpbdWorld.d.ts +1 -1
  29. package/dist/physics/XpbdWorld.js +1 -1
  30. package/dist/physics/cloth/index.d.ts +98 -0
  31. package/dist/physics/cloth/index.d.ts.map +1 -0
  32. package/dist/physics/cloth/index.js +207 -0
  33. package/dist/physics/cloth/index.js.map +1 -0
  34. package/dist/physics/index.d.ts +4 -0
  35. package/dist/physics/index.d.ts.map +1 -1
  36. package/dist/physics/index.js +2 -0
  37. package/dist/physics/index.js.map +1 -1
  38. package/dist/physics/spring/index.d.ts +90 -0
  39. package/dist/physics/spring/index.d.ts.map +1 -0
  40. package/dist/physics/spring/index.js +97 -0
  41. package/dist/physics/spring/index.js.map +1 -0
  42. package/dist/skeleton/index.d.ts +94 -13
  43. package/dist/skeleton/index.d.ts.map +1 -1
  44. package/dist/skeleton/index.js +192 -73
  45. package/dist/skeleton/index.js.map +1 -1
  46. package/dist/two-d/presentation/MwlPresentation.d.ts +110 -0
  47. package/dist/two-d/presentation/MwlPresentation.d.ts.map +1 -0
  48. package/dist/two-d/presentation/MwlPresentation.js +755 -0
  49. package/dist/two-d/presentation/MwlPresentation.js.map +1 -0
  50. package/dist/two-d/presentation/index.d.ts +3 -0
  51. package/dist/two-d/presentation/index.d.ts.map +1 -0
  52. package/dist/two-d/presentation/index.js +2 -0
  53. package/dist/two-d/presentation/index.js.map +1 -0
  54. package/dist/two-d/render/ClothSprite.d.ts +83 -0
  55. package/dist/two-d/render/ClothSprite.d.ts.map +1 -0
  56. package/dist/two-d/render/ClothSprite.js +105 -0
  57. package/dist/two-d/render/ClothSprite.js.map +1 -0
  58. package/dist/two-d/render/HazeLayer.d.ts +112 -0
  59. package/dist/two-d/render/HazeLayer.d.ts.map +1 -0
  60. package/dist/two-d/render/HazeLayer.js +185 -0
  61. package/dist/two-d/render/HazeLayer.js.map +1 -0
  62. package/dist/two-d/render/NeonGlow.d.ts +100 -0
  63. package/dist/two-d/render/NeonGlow.d.ts.map +1 -0
  64. package/dist/two-d/render/NeonGlow.js +183 -0
  65. package/dist/two-d/render/NeonGlow.js.map +1 -0
  66. package/dist/two-d/render/SkeletalSprite.d.ts +5 -2
  67. package/dist/two-d/render/SkeletalSprite.d.ts.map +1 -1
  68. package/dist/two-d/render/SkeletalSprite.js +27 -3
  69. package/dist/two-d/render/SkeletalSprite.js.map +1 -1
  70. package/dist/two-d/render/SpringSprite.d.ts +40 -0
  71. package/dist/two-d/render/SpringSprite.d.ts.map +1 -0
  72. package/dist/two-d/render/SpringSprite.js +39 -0
  73. package/dist/two-d/render/SpringSprite.js.map +1 -0
  74. package/dist/two-d/render/SpriteDeform.d.ts +156 -0
  75. package/dist/two-d/render/SpriteDeform.d.ts.map +1 -0
  76. package/dist/two-d/render/SpriteDeform.js +278 -0
  77. package/dist/two-d/render/SpriteDeform.js.map +1 -0
  78. package/dist/two-d/render/SvgSkeleton.d.ts +54 -0
  79. package/dist/two-d/render/SvgSkeleton.d.ts.map +1 -0
  80. package/dist/two-d/render/SvgSkeleton.js +112 -0
  81. package/dist/two-d/render/SvgSkeleton.js.map +1 -0
  82. package/dist/two-d/render/index.d.ts +12 -0
  83. package/dist/two-d/render/index.d.ts.map +1 -1
  84. package/dist/two-d/render/index.js +6 -0
  85. package/dist/two-d/render/index.js.map +1 -1
  86. package/dist/two-d/ui/Bar.d.ts +3 -1
  87. package/dist/two-d/ui/Bar.d.ts.map +1 -1
  88. package/dist/two-d/ui/Bar.js +5 -0
  89. package/dist/two-d/ui/Bar.js.map +1 -1
  90. package/dist/two-d/ui/Button.d.ts +12 -0
  91. package/dist/two-d/ui/Button.d.ts.map +1 -1
  92. package/dist/two-d/ui/Button.js +16 -4
  93. package/dist/two-d/ui/Button.js.map +1 -1
  94. package/dist/two-d/ui/Window.d.ts +10 -0
  95. package/dist/two-d/ui/Window.d.ts.map +1 -1
  96. package/dist/two-d/ui/Window.js +17 -6
  97. package/dist/two-d/ui/Window.js.map +1 -1
  98. package/dist/two-d/ui/index.d.ts +2 -0
  99. package/dist/two-d/ui/index.d.ts.map +1 -1
  100. package/dist/two-d/ui/index.js.map +1 -1
  101. package/dist/version.d.ts +1 -1
  102. package/dist/version.js +1 -1
  103. package/package.json +24 -7
  104. package/sbom.cdx.json +6 -58
  105. package/tools/asset-report.d.mts +37 -0
  106. package/tools/asset-report.mjs +157 -0
  107. package/tools/compile-resources.d.mts +2 -0
  108. package/tools/compile-resources.mjs +23 -2
  109. package/tools/emit-page.d.mts +2 -0
  110. package/tools/emit-page.mjs +11 -1
  111. package/tools/verify-scenarios.d.mts +15 -0
  112. package/tools/verify-scenarios.mjs +129 -0
  113. package/tools/vite.mjs +4 -1
@@ -0,0 +1,100 @@
1
+ import { Sprite } from 'pixi.js';
2
+ import { type MotionIntent } from '../../core/Motion.ts';
3
+ /**
4
+ * How much light a soft glow still carries at `distance` from its centre: 1 at the
5
+ * centre, easing to exactly 0 at `radius`, 0 past it. Pure, so a sign's falloff is
6
+ * checkable as arithmetic: the middle of a tube is always brighter than its rim.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { glowFalloff } from '@datamoc/mw_games/two-d/render';
11
+ *
12
+ * console.log(glowFalloff(0, 24)); // 1 - the centre burns full
13
+ * console.log(glowFalloff(24, 24)); // 0 - the rim carries nothing
14
+ * console.log(glowFalloff(48, 24)); // 0 - past the rim stays dark
15
+ * ```
16
+ */
17
+ export declare function glowFalloff(distance: number, radius: number): number;
18
+ export interface GlowPaint {
19
+ /** glow colour as a hex number */
20
+ color: number;
21
+ /** light radius in pixels; must be above 0 */
22
+ radius: number;
23
+ /** peak strength, 0 (dark) to 1 (full); validated */
24
+ intensity: number;
25
+ }
26
+ /**
27
+ * Paint a `size * size` radial glow (the sprite is square, `size` is odd) into `pixels`
28
+ * as RGBA bytes. Centre pixels carry the colour at full intensity, rim pixels fade to
29
+ * transparent, and intensity scales every channel linearly, so doubling it doubles the
30
+ * light. Pure, like `paintFogPixels`.
31
+ *
32
+ * @example
33
+ * ```ts
34
+ * import { paintGlowPixels } from '@datamoc/mw_games/two-d/render';
35
+ *
36
+ * const size = 5;
37
+ * const pixels = new Uint8ClampedArray(size * size * 4);
38
+ * paintGlowPixels(pixels, size, { color: 0xff0000, radius: 2, intensity: 1 });
39
+ * console.log(pixels[0] > pixels[pixels.length - 4]); // true - the centre burns redder than the rim
40
+ * ```
41
+ */
42
+ export declare function paintGlowPixels(pixels: Uint8ClampedArray | Uint8Array, size: number, paint: GlowPaint): void;
43
+ export interface NeonGlowOptions {
44
+ /** glow colour as a hex number */
45
+ color: number;
46
+ /** light radius in world pixels; must be above 0 */
47
+ radius: number;
48
+ /** peak strength, 0 to 1; default 1 */
49
+ intensity?: number;
50
+ /** slow breathing of the light; default none (a steady sign) */
51
+ flicker?: {
52
+ amount: number;
53
+ frequency: number;
54
+ };
55
+ /** what the flicker is for under reduced motion; default `decorative`, which holds the light steady */
56
+ intent?: MotionIntent;
57
+ }
58
+ /**
59
+ * A soft neon glow from a shape or mask: a radial sprite drawn additively, the overlay
60
+ * `Halo` already provides, with colour, radius, intensity and flicker (roadmap 426). A
61
+ * global bloom stays out on purpose: one sprite per sign is cheaper, composes with
62
+ * z-order like any other sprite, and never washes the whole scene. Mask a glow by
63
+ * parenting it under the shape it lights, or leave it bare for a free halo around a sign.
64
+ * Needs a DOM canvas; `paintGlowPixels` is the same falloff without one.
65
+ *
66
+ * @example
67
+ * ```ts
68
+ * import { NeonGlow } from '@datamoc/mw_games/two-d/render';
69
+ *
70
+ * const sign = new NeonGlow({ color: 0x37e0ff, radius: 48, flicker: { amount: 0.15, frequency: 2 } });
71
+ * sign.position.set(200, 120);
72
+ * sign.update(1 / 60); // the tube breathes; under reduced motion it holds steady instead
73
+ * ```
74
+ */
75
+ export declare class NeonGlow extends Sprite {
76
+ private canvas;
77
+ private color;
78
+ private radius;
79
+ private peak;
80
+ private readonly flickerAmount;
81
+ private readonly flickerFrequency;
82
+ private readonly intent;
83
+ private clock;
84
+ constructor(options: NeonGlowOptions);
85
+ /** seconds of flicker accumulated so far */
86
+ get elapsed(): number;
87
+ /** swap the colour; repaints once */
88
+ setColor(color: number): void;
89
+ /** swap the radius; repaints once */
90
+ setRadius(radius: number): void;
91
+ /** swap the peak strength; applies on the next `update` without a repaint */
92
+ setIntensity(intensity: number): void;
93
+ /** advance the flicker; under reduced motion a decorative glow holds its peak instead */
94
+ update(dt: number): void;
95
+ private static paintCanvas;
96
+ private repaint;
97
+ /** the texture is generated for this glow alone, so it goes with it */
98
+ destroy(): void;
99
+ }
100
+ //# sourceMappingURL=NeonGlow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NeonGlow.d.ts","sourceRoot":"","sources":["../../../src/two-d/render/NeonGlow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAW,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAUxE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAUpE;AAED,MAAM,WAAW,SAAS;IACzB,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,iBAAiB,GAAG,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CAwB5G;AAED,MAAM,WAAW,eAAe;IAC/B,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,MAAM,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,OAAO,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD,uGAAuG;IACvG,MAAM,CAAC,EAAE,YAAY,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,QAAS,SAAQ,MAAM;IACnC,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,KAAK,CAAK;IAElB,YAAY,OAAO,EAAE,eAAe,EA8BnC;IAED,4CAA4C;IAC5C,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,qCAAqC;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAI5B;IAED,qCAAqC;IACrC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAM9B;IAED,6EAA6E;IAC7E,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAKpC;IAED,yFAAyF;IACzF,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAOvB;IAED,OAAO,CAAC,MAAM,CAAC,WAAW;IAa1B,OAAO,CAAC,OAAO;IAQf,uEAAuE;IAC9D,OAAO,IAAI,IAAI,CAEvB;CACD"}
@@ -0,0 +1,183 @@
1
+ import { Sprite, Texture } from 'pixi.js';
2
+ import { reducedMotion } from '../../core/Motion.js';
3
+ /** split a hex colour number into 0..255 channels; throws a RangeError outside `0x000000`-`0xffffff` */
4
+ function splitColor(color) {
5
+ if (!Number.isInteger(color) || color < 0 || color > 0xffffff) {
6
+ throw new RangeError(`a glow needs an integer color between 0x000000 and 0xffffff, saw ${color}`);
7
+ }
8
+ return [(color >> 16) & 0xff, (color >> 8) & 0xff, color & 0xff];
9
+ }
10
+ /**
11
+ * How much light a soft glow still carries at `distance` from its centre: 1 at the
12
+ * centre, easing to exactly 0 at `radius`, 0 past it. Pure, so a sign's falloff is
13
+ * checkable as arithmetic: the middle of a tube is always brighter than its rim.
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * import { glowFalloff } from '@datamoc/mw_games/two-d/render';
18
+ *
19
+ * console.log(glowFalloff(0, 24)); // 1 - the centre burns full
20
+ * console.log(glowFalloff(24, 24)); // 0 - the rim carries nothing
21
+ * console.log(glowFalloff(48, 24)); // 0 - past the rim stays dark
22
+ * ```
23
+ */
24
+ export function glowFalloff(distance, radius) {
25
+ if (!Number.isFinite(distance) || !Number.isFinite(radius) || radius <= 0) {
26
+ throw new RangeError(`a glow falloff needs a finite distance and a radius above 0, saw (${distance}, ${radius})`);
27
+ }
28
+ if (distance <= 0)
29
+ return 1;
30
+ if (distance >= radius)
31
+ return 0;
32
+ const t = 1 - (distance / radius) * (distance / radius);
33
+ return t * t;
34
+ }
35
+ /**
36
+ * Paint a `size * size` radial glow (the sprite is square, `size` is odd) into `pixels`
37
+ * as RGBA bytes. Centre pixels carry the colour at full intensity, rim pixels fade to
38
+ * transparent, and intensity scales every channel linearly, so doubling it doubles the
39
+ * light. Pure, like `paintFogPixels`.
40
+ *
41
+ * @example
42
+ * ```ts
43
+ * import { paintGlowPixels } from '@datamoc/mw_games/two-d/render';
44
+ *
45
+ * const size = 5;
46
+ * const pixels = new Uint8ClampedArray(size * size * 4);
47
+ * paintGlowPixels(pixels, size, { color: 0xff0000, radius: 2, intensity: 1 });
48
+ * console.log(pixels[0] > pixels[pixels.length - 4]); // true - the centre burns redder than the rim
49
+ * ```
50
+ */
51
+ export function paintGlowPixels(pixels, size, paint) {
52
+ if (!Number.isInteger(size) || size < 1) {
53
+ throw new RangeError(`a glow needs an integer size of at least 1, saw ${size}`);
54
+ }
55
+ if (!(pixels instanceof Uint8Array || pixels instanceof Uint8ClampedArray) || pixels.length !== size * size * 4) {
56
+ throw new RangeError(`a glow needs a pixel buffer of ${size * size * 4} bytes`);
57
+ }
58
+ if (!Number.isFinite(paint.radius) || paint.radius <= 0) {
59
+ throw new RangeError(`a glow needs a radius above 0, saw ${paint.radius}`);
60
+ }
61
+ if (!Number.isFinite(paint.intensity) || paint.intensity < 0 || paint.intensity > 1) {
62
+ throw new RangeError(`a glow needs intensity between 0 and 1, saw ${paint.intensity}`);
63
+ }
64
+ const [r, g, b] = splitColor(paint.color);
65
+ const centre = (size - 1) / 2;
66
+ for (let y = 0; y < size; y++) {
67
+ for (let x = 0; x < size; x++) {
68
+ const light = glowFalloff(Math.hypot(x - centre, y - centre), paint.radius) * paint.intensity;
69
+ pixels.set([Math.round(r * light), Math.round(g * light), Math.round(b * light), Math.round(255 * light)], (y * size + x) * 4);
70
+ }
71
+ }
72
+ }
73
+ /**
74
+ * A soft neon glow from a shape or mask: a radial sprite drawn additively, the overlay
75
+ * `Halo` already provides, with colour, radius, intensity and flicker (roadmap 426). A
76
+ * global bloom stays out on purpose: one sprite per sign is cheaper, composes with
77
+ * z-order like any other sprite, and never washes the whole scene. Mask a glow by
78
+ * parenting it under the shape it lights, or leave it bare for a free halo around a sign.
79
+ * Needs a DOM canvas; `paintGlowPixels` is the same falloff without one.
80
+ *
81
+ * @example
82
+ * ```ts
83
+ * import { NeonGlow } from '@datamoc/mw_games/two-d/render';
84
+ *
85
+ * const sign = new NeonGlow({ color: 0x37e0ff, radius: 48, flicker: { amount: 0.15, frequency: 2 } });
86
+ * sign.position.set(200, 120);
87
+ * sign.update(1 / 60); // the tube breathes; under reduced motion it holds steady instead
88
+ * ```
89
+ */
90
+ export class NeonGlow extends Sprite {
91
+ constructor(options) {
92
+ if (!Number.isFinite(options.radius) || options.radius <= 0) {
93
+ throw new RangeError(`a glow needs a radius above 0, saw ${options.radius}`);
94
+ }
95
+ const intensity = options.intensity ?? 1;
96
+ if (!Number.isFinite(intensity) || intensity < 0 || intensity > 1) {
97
+ throw new RangeError(`a glow needs intensity between 0 and 1, saw ${intensity}`);
98
+ }
99
+ const flicker = options.flicker ?? { amount: 0, frequency: 1 };
100
+ if (!Number.isFinite(flicker.amount) || flicker.amount < 0 || flicker.amount > 1) {
101
+ throw new RangeError(`a glow needs a flicker amount between 0 and 1, saw ${flicker.amount}`);
102
+ }
103
+ if (!Number.isFinite(flicker.frequency) || flicker.frequency <= 0) {
104
+ throw new RangeError(`a glow needs a flicker frequency above 0, saw ${flicker.frequency}`);
105
+ }
106
+ //paintCanvas validates the colour through paintGlowPixels before super() runs
107
+ const canvas = NeonGlow.paintCanvas(options.color, options.radius);
108
+ super(Texture.from(canvas));
109
+ this.clock = 0;
110
+ this.canvas = canvas;
111
+ this.color = options.color;
112
+ this.radius = options.radius;
113
+ this.peak = intensity;
114
+ this.flickerAmount = flicker.amount;
115
+ this.flickerFrequency = flicker.frequency;
116
+ this.intent = options.intent ?? 'decorative';
117
+ //additive like Halo: light adds, never covers
118
+ this.blendMode = 'add';
119
+ this.anchor.set(0.5);
120
+ this.eventMode = 'none';
121
+ this.alpha = this.peak;
122
+ }
123
+ /** seconds of flicker accumulated so far */
124
+ get elapsed() {
125
+ return this.clock;
126
+ }
127
+ /** swap the colour; repaints once */
128
+ setColor(color) {
129
+ splitColor(color);
130
+ this.color = color;
131
+ this.repaint();
132
+ }
133
+ /** swap the radius; repaints once */
134
+ setRadius(radius) {
135
+ if (!Number.isFinite(radius) || radius <= 0) {
136
+ throw new RangeError(`a glow needs a radius above 0, saw ${radius}`);
137
+ }
138
+ this.radius = radius;
139
+ this.repaint();
140
+ }
141
+ /** swap the peak strength; applies on the next `update` without a repaint */
142
+ setIntensity(intensity) {
143
+ if (!Number.isFinite(intensity) || intensity < 0 || intensity > 1) {
144
+ throw new RangeError(`a glow needs intensity between 0 and 1, saw ${intensity}`);
145
+ }
146
+ this.peak = intensity;
147
+ }
148
+ /** advance the flicker; under reduced motion a decorative glow holds its peak instead */
149
+ update(dt) {
150
+ if (!Number.isFinite(dt) || dt < 0) {
151
+ throw new RangeError(`a glow update needs dt of at least 0, saw ${dt}`);
152
+ }
153
+ if (!reducedMotion() || this.intent !== 'decorative')
154
+ this.clock += dt;
155
+ const wave = 1 + this.flickerAmount * Math.sin(2 * Math.PI * this.flickerFrequency * this.clock);
156
+ this.alpha = Math.min(1, Math.max(0, this.peak * wave));
157
+ }
158
+ static paintCanvas(color, radius) {
159
+ const size = Math.ceil(radius) * 2 + 1;
160
+ const canvas = document.createElement('canvas');
161
+ canvas.width = size;
162
+ canvas.height = size;
163
+ const context = canvas.getContext('2d');
164
+ if (!context)
165
+ throw new Error('NeonGlow needs a 2D canvas context');
166
+ const image = context.createImageData(size, size);
167
+ paintGlowPixels(image.data, size, { color, radius, intensity: 1 });
168
+ context.putImageData(image, 0, 0);
169
+ return canvas;
170
+ }
171
+ repaint() {
172
+ //a radius change resizes the canvas, so the texture is rebuilt rather than updated
173
+ const old = this.texture;
174
+ this.canvas = NeonGlow.paintCanvas(this.color, this.radius);
175
+ this.texture = Texture.from(this.canvas);
176
+ old.destroy(true);
177
+ }
178
+ /** the texture is generated for this glow alone, so it goes with it */
179
+ destroy() {
180
+ super.destroy({ texture: true, textureSource: true });
181
+ }
182
+ }
183
+ //# sourceMappingURL=NeonGlow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NeonGlow.js","sourceRoot":"","sources":["../../../src/two-d/render/NeonGlow.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { Container } from 'pixi.js';
2
- import { type Mixer, type Pose, type SkeletonBones } from '../../skeleton/index.ts';
2
+ import { type Mixer, type Pose, type TransformPose, type SkeletonBones } from '../../skeleton/index.ts';
3
3
  import { TintedSprite } from './TintedSprite.ts';
4
4
  import type { Texture2D } from './Types2D.ts';
5
5
  /**
@@ -39,13 +39,16 @@ export declare class SkeletalSprite extends Container {
39
39
  private readonly skeleton;
40
40
  private readonly parts;
41
41
  private readonly mixer;
42
+ private diagnostics?;
42
43
  constructor(skeleton: SkeletonBones, mixer?: Mixer);
43
44
  /** bind a drawn part to a bone by name; the sprite's own anchor decides how it hangs */
44
45
  bind(bone: string, texture: Texture2D): TintedSprite;
45
46
  /** the sprite bound to a bone, or undefined for an unbound one */
46
47
  part(bone: string): TintedSprite | undefined;
47
48
  /** apply a pose directly; `update` does this itself when a mixer was given */
48
- apply(pose: Pose): void;
49
+ apply(pose: Pose | TransformPose): void;
50
+ /** Explicit development opt-in. Disabled rigs allocate no overlay and draw no diagnostics. */
51
+ setDiagnostics(enabled: boolean): void;
49
52
  /** advance the mixer and place every part; needs a mixer, refuses without one */
50
53
  update(_dt: number): void;
51
54
  }
@@ -1 +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"}
1
+ {"version":3,"file":"SkeletalSprite.d.ts","sourceRoot":"","sources":["../../../src/two-d/render/SkeletalSprite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAoB,MAAM,SAAS,CAAC;AACtD,OAAO,EAIN,KAAK,KAAK,EACV,KAAK,IAAI,EACT,KAAK,aAAa,EAClB,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;IAC1C,OAAO,CAAC,WAAW,CAAC,CAAW;IAE/B,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,aAAa,GAAG,IAAI,CAuBtC;IAED,8FAA8F;IAC9F,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAMrC;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"}
@@ -1,4 +1,4 @@
1
- import { Container } from 'pixi.js';
1
+ import { Container, Graphics, Matrix } from 'pixi.js';
2
2
  import { advance as advanceMixer, resolve, } from '../../skeleton/index.js';
3
3
  import { TintedSprite } from './TintedSprite.js';
4
4
  /**
@@ -59,8 +59,32 @@ export class SkeletalSprite extends Container {
59
59
  const transform = transforms.get(bone);
60
60
  if (!transform)
61
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;
62
+ const { a, b, c, d } = transform.matrix;
63
+ sprite.setFromMatrix(new Matrix(a, b, c, d, transform.x, transform.y));
64
+ }
65
+ if (this.diagnostics) {
66
+ this.setChildIndex(this.diagnostics, this.children.length - 1);
67
+ const graphics = this.diagnostics.clear();
68
+ for (const bone of transforms.values()) {
69
+ graphics.moveTo(bone.x, bone.y).lineTo(bone.tipX, bone.tipY).stroke({ color: 0x00ffff, width: 2 });
70
+ graphics.circle(bone.x, bone.y, 4).fill(0xffdd00);
71
+ graphics.circle(bone.tipX, bone.tipY, 2).fill(0xff4488);
72
+ graphics
73
+ .moveTo(bone.x - 7, bone.y)
74
+ .lineTo(bone.x + 7, bone.y)
75
+ .moveTo(bone.x, bone.y - 7)
76
+ .lineTo(bone.x, bone.y + 7)
77
+ .stroke({ color: 0xffdd00, width: 1 });
78
+ }
79
+ }
80
+ }
81
+ /** Explicit development opt-in. Disabled rigs allocate no overlay and draw no diagnostics. */
82
+ setDiagnostics(enabled) {
83
+ if (enabled && !this.diagnostics)
84
+ this.diagnostics = this.addChild(new Graphics());
85
+ if (!enabled && this.diagnostics) {
86
+ this.diagnostics.destroy();
87
+ this.diagnostics = undefined;
64
88
  }
65
89
  }
66
90
  /** advance the mixer and place every part; needs a mixer, refuses without one */
@@ -1 +1 @@
1
- {"version":3,"file":"SkeletalSprite.js","sourceRoot":"","sources":["../../../src/two-d/render/SkeletalSprite.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SkeletalSprite.js","sourceRoot":"","sources":["../../../src/two-d/render/SkeletalSprite.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { Graphics } from 'pixi.js';
2
+ import type { Spring } from '../../physics/spring/index.ts';
3
+ export interface SpringSpriteOptions {
4
+ /** the spring to draw */
5
+ spring: Spring;
6
+ /** line colour */
7
+ color?: number;
8
+ /** line opacity */
9
+ alpha?: number;
10
+ /** line width */
11
+ lineWidth?: number;
12
+ }
13
+ /**
14
+ * A debug line from a spring's anchor to its bob: one straight segment that stretches,
15
+ * overshoots and settles with the simulation. A game draws hair or hems by placing its
16
+ * own sprites with `Spring.place`, and keeps this around while tuning stiffness and
17
+ * damping. Call `sync` after stepping the spring; the line never steps anything itself.
18
+ *
19
+ * @example
20
+ * ```ts
21
+ * import { Spring } from '@datamoc/mw_games/physics';
22
+ * import { SpringSprite } from '@datamoc/mw_games/two-d/render';
23
+ *
24
+ * const spring = new Spring({ stiffness: 120, damping: 8 });
25
+ * const line = new SpringSprite({ spring });
26
+ * spring.setAnchor(10, 0);
27
+ * spring.update(1 / 60);
28
+ * line.sync(); // the segment now leans toward the anchor
29
+ * ```
30
+ */
31
+ export declare class SpringSprite extends Graphics {
32
+ private readonly spring;
33
+ private readonly color;
34
+ private readonly opacity;
35
+ private readonly lineWidth;
36
+ constructor(options: SpringSpriteOptions);
37
+ /** redraw the anchor-to-bob segment from the spring's current state */
38
+ sync(): void;
39
+ }
40
+ //# sourceMappingURL=SpringSprite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpringSprite.d.ts","sourceRoot":"","sources":["../../../src/two-d/render/SpringSprite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAE5D,MAAM,WAAW,mBAAmB;IACnC,yBAAyB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mBAAmB;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,YAAa,SAAQ,QAAQ;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC,YAAY,OAAO,EAAE,mBAAmB,EAOvC;IAED,uEAAuE;IACvE,IAAI,IAAI,IAAI,CAOX;CACD"}
@@ -0,0 +1,39 @@
1
+ import { Graphics } from 'pixi.js';
2
+ /**
3
+ * A debug line from a spring's anchor to its bob: one straight segment that stretches,
4
+ * overshoots and settles with the simulation. A game draws hair or hems by placing its
5
+ * own sprites with `Spring.place`, and keeps this around while tuning stiffness and
6
+ * damping. Call `sync` after stepping the spring; the line never steps anything itself.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { Spring } from '@datamoc/mw_games/physics';
11
+ * import { SpringSprite } from '@datamoc/mw_games/two-d/render';
12
+ *
13
+ * const spring = new Spring({ stiffness: 120, damping: 8 });
14
+ * const line = new SpringSprite({ spring });
15
+ * spring.setAnchor(10, 0);
16
+ * spring.update(1 / 60);
17
+ * line.sync(); // the segment now leans toward the anchor
18
+ * ```
19
+ */
20
+ export class SpringSprite extends Graphics {
21
+ constructor(options) {
22
+ super();
23
+ this.spring = options.spring;
24
+ this.color = options.color ?? 0xffffff;
25
+ this.opacity = options.alpha ?? 1;
26
+ this.lineWidth = options.lineWidth ?? 2;
27
+ this.sync();
28
+ }
29
+ /** redraw the anchor-to-bob segment from the spring's current state */
30
+ sync() {
31
+ const anchor = this.spring.anchorPosition;
32
+ const bob = this.spring.position;
33
+ this.clear();
34
+ this.moveTo(anchor.x, anchor.y)
35
+ .lineTo(bob.x, bob.y)
36
+ .stroke({ color: this.color, width: this.lineWidth, alpha: this.opacity });
37
+ }
38
+ }
39
+ //# sourceMappingURL=SpringSprite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpringSprite.js","sourceRoot":"","sources":["../../../src/two-d/render/SpringSprite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAcnC;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,YAAa,SAAQ,QAAQ;IAMzC,YAAY,OAA4B;QACvC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,QAAQ,CAAC;QACvC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,EAAE,CAAC;IACb,CAAC;IAED,uEAAuE;IACvE,IAAI;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;aAC7B,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;aACpB,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7E,CAAC;CACD"}