@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.
- package/CHANGELOG.md +79 -0
- package/README.md +26 -0
- package/api-surface.json +650 -2
- package/dist/assets/SvgParts.d.ts +31 -0
- package/dist/assets/SvgParts.d.ts.map +1 -0
- package/dist/assets/SvgParts.js +54 -0
- package/dist/assets/SvgParts.js.map +1 -0
- package/dist/assets/SvgSource.d.ts +3 -0
- package/dist/assets/SvgSource.d.ts.map +1 -0
- package/dist/assets/SvgSource.js +22 -0
- package/dist/assets/SvgSource.js.map +1 -0
- package/dist/assets/index.d.ts +2 -0
- package/dist/assets/index.d.ts.map +1 -1
- package/dist/assets/index.js +1 -0
- package/dist/assets/index.js.map +1 -1
- package/dist/assets/svg.d.ts.map +1 -1
- package/dist/assets/svg.js +9 -5
- package/dist/assets/svg.js.map +1 -1
- package/dist/mw_games.global.js +110 -110
- package/dist/mwl/presentation.d.ts +70 -0
- package/dist/mwl/presentation.d.ts.map +1 -0
- package/dist/mwl/presentation.js +419 -0
- package/dist/mwl/presentation.js.map +1 -0
- package/dist/physics/PhysicsWorld.d.ts +49 -17
- package/dist/physics/PhysicsWorld.d.ts.map +1 -1
- package/dist/physics/PhysicsWorld.js +297 -59
- package/dist/physics/PhysicsWorld.js.map +1 -1
- package/dist/physics/XpbdWorld.d.ts +1 -1
- package/dist/physics/XpbdWorld.js +1 -1
- package/dist/physics/cloth/index.d.ts +98 -0
- package/dist/physics/cloth/index.d.ts.map +1 -0
- package/dist/physics/cloth/index.js +207 -0
- package/dist/physics/cloth/index.js.map +1 -0
- package/dist/physics/index.d.ts +4 -0
- package/dist/physics/index.d.ts.map +1 -1
- package/dist/physics/index.js +2 -0
- package/dist/physics/index.js.map +1 -1
- package/dist/physics/spring/index.d.ts +90 -0
- package/dist/physics/spring/index.d.ts.map +1 -0
- package/dist/physics/spring/index.js +97 -0
- package/dist/physics/spring/index.js.map +1 -0
- package/dist/skeleton/index.d.ts +94 -13
- package/dist/skeleton/index.d.ts.map +1 -1
- package/dist/skeleton/index.js +192 -73
- package/dist/skeleton/index.js.map +1 -1
- package/dist/two-d/presentation/MwlPresentation.d.ts +110 -0
- package/dist/two-d/presentation/MwlPresentation.d.ts.map +1 -0
- package/dist/two-d/presentation/MwlPresentation.js +755 -0
- package/dist/two-d/presentation/MwlPresentation.js.map +1 -0
- package/dist/two-d/presentation/index.d.ts +3 -0
- package/dist/two-d/presentation/index.d.ts.map +1 -0
- package/dist/two-d/presentation/index.js +2 -0
- package/dist/two-d/presentation/index.js.map +1 -0
- package/dist/two-d/render/ClothSprite.d.ts +83 -0
- package/dist/two-d/render/ClothSprite.d.ts.map +1 -0
- package/dist/two-d/render/ClothSprite.js +105 -0
- package/dist/two-d/render/ClothSprite.js.map +1 -0
- package/dist/two-d/render/HazeLayer.d.ts +112 -0
- package/dist/two-d/render/HazeLayer.d.ts.map +1 -0
- package/dist/two-d/render/HazeLayer.js +185 -0
- package/dist/two-d/render/HazeLayer.js.map +1 -0
- package/dist/two-d/render/NeonGlow.d.ts +100 -0
- package/dist/two-d/render/NeonGlow.d.ts.map +1 -0
- package/dist/two-d/render/NeonGlow.js +183 -0
- package/dist/two-d/render/NeonGlow.js.map +1 -0
- package/dist/two-d/render/SkeletalSprite.d.ts +5 -2
- package/dist/two-d/render/SkeletalSprite.d.ts.map +1 -1
- package/dist/two-d/render/SkeletalSprite.js +27 -3
- package/dist/two-d/render/SkeletalSprite.js.map +1 -1
- package/dist/two-d/render/SpringSprite.d.ts +40 -0
- package/dist/two-d/render/SpringSprite.d.ts.map +1 -0
- package/dist/two-d/render/SpringSprite.js +39 -0
- package/dist/two-d/render/SpringSprite.js.map +1 -0
- package/dist/two-d/render/SpriteDeform.d.ts +156 -0
- package/dist/two-d/render/SpriteDeform.d.ts.map +1 -0
- package/dist/two-d/render/SpriteDeform.js +278 -0
- package/dist/two-d/render/SpriteDeform.js.map +1 -0
- package/dist/two-d/render/SvgSkeleton.d.ts +54 -0
- package/dist/two-d/render/SvgSkeleton.d.ts.map +1 -0
- package/dist/two-d/render/SvgSkeleton.js +112 -0
- package/dist/two-d/render/SvgSkeleton.js.map +1 -0
- package/dist/two-d/render/index.d.ts +12 -0
- package/dist/two-d/render/index.d.ts.map +1 -1
- package/dist/two-d/render/index.js +6 -0
- package/dist/two-d/render/index.js.map +1 -1
- package/dist/two-d/ui/Bar.d.ts +3 -1
- package/dist/two-d/ui/Bar.d.ts.map +1 -1
- package/dist/two-d/ui/Bar.js +5 -0
- package/dist/two-d/ui/Bar.js.map +1 -1
- package/dist/two-d/ui/Button.d.ts +12 -0
- package/dist/two-d/ui/Button.d.ts.map +1 -1
- package/dist/two-d/ui/Button.js +16 -4
- package/dist/two-d/ui/Button.js.map +1 -1
- package/dist/two-d/ui/Window.d.ts +10 -0
- package/dist/two-d/ui/Window.d.ts.map +1 -1
- package/dist/two-d/ui/Window.js +17 -6
- package/dist/two-d/ui/Window.js.map +1 -1
- package/dist/two-d/ui/index.d.ts +2 -0
- package/dist/two-d/ui/index.d.ts.map +1 -1
- package/dist/two-d/ui/index.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +24 -7
- package/sbom.cdx.json +6 -58
- package/tools/asset-report.d.mts +37 -0
- package/tools/asset-report.mjs +157 -0
- package/tools/compile-resources.d.mts +2 -0
- package/tools/compile-resources.mjs +23 -2
- package/tools/emit-page.d.mts +2 -0
- package/tools/emit-page.mjs +11 -1
- package/tools/verify-scenarios.d.mts +15 -0
- package/tools/verify-scenarios.mjs +129 -0
- 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,
|
|
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
|
-
|
|
63
|
-
sprite.
|
|
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":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;
|
|
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"}
|