canvasengine 2.0.0-beta.6 → 2.0.0-beta.60
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/dist/DebugRenderer-DkjTAc48.js +1384 -0
- package/dist/DebugRenderer-DkjTAc48.js.map +1 -0
- package/dist/components/Button.d.ts +185 -0
- package/dist/components/Button.d.ts.map +1 -0
- package/dist/components/Canvas.d.ts +17 -0
- package/dist/components/Canvas.d.ts.map +1 -0
- package/dist/components/DOMElement.d.ts +54 -0
- package/dist/components/DOMElement.d.ts.map +1 -0
- package/dist/components/DOMSprite.d.ts +127 -0
- package/dist/components/DOMSprite.d.ts.map +1 -0
- package/dist/components/FocusContainer.d.ts +129 -0
- package/dist/components/FocusContainer.d.ts.map +1 -0
- package/dist/components/Graphic.d.ts +64 -0
- package/dist/components/Graphic.d.ts.map +1 -0
- package/dist/components/Joystick.d.ts +36 -0
- package/dist/components/Joystick.d.ts.map +1 -0
- package/dist/components/NineSliceSprite.d.ts +16 -0
- package/dist/components/NineSliceSprite.d.ts.map +1 -0
- package/dist/components/ParticleEmitter.d.ts +4 -0
- package/dist/components/ParticleEmitter.d.ts.map +1 -0
- package/dist/components/Scene.d.ts +2 -0
- package/dist/components/Scene.d.ts.map +1 -0
- package/dist/components/Text.d.ts +25 -0
- package/dist/components/Text.d.ts.map +1 -0
- package/dist/components/TilingSprite.d.ts +17 -0
- package/dist/components/TilingSprite.d.ts.map +1 -0
- package/dist/components/Video.d.ts +14 -0
- package/dist/components/Video.d.ts.map +1 -0
- package/dist/components/index.d.ts +20 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/types/DisplayObject.d.ts +118 -0
- package/dist/components/types/DisplayObject.d.ts.map +1 -0
- package/dist/components/types/MouseEvent.d.ts +4 -0
- package/dist/components/types/MouseEvent.d.ts.map +1 -0
- package/dist/components/types/Spritesheet.d.ts +248 -0
- package/dist/components/types/Spritesheet.d.ts.map +1 -0
- package/dist/components/types/index.d.ts +4 -0
- package/dist/components/types/index.d.ts.map +1 -0
- package/dist/directives/Controls.d.ts +112 -0
- package/dist/directives/Controls.d.ts.map +1 -0
- package/dist/directives/ControlsBase.d.ts +199 -0
- package/dist/directives/ControlsBase.d.ts.map +1 -0
- package/dist/directives/Drag.d.ts +69 -0
- package/dist/directives/Drag.d.ts.map +1 -0
- package/dist/directives/Flash.d.ts +116 -0
- package/dist/directives/Flash.d.ts.map +1 -0
- package/dist/directives/FocusNavigation.d.ts +52 -0
- package/dist/directives/FocusNavigation.d.ts.map +1 -0
- package/dist/directives/FogVisibility.d.ts +47 -0
- package/dist/directives/FogVisibility.d.ts.map +1 -0
- package/dist/directives/GamepadControls.d.ts +224 -0
- package/dist/directives/GamepadControls.d.ts.map +1 -0
- package/dist/directives/JoystickControls.d.ts +171 -0
- package/dist/directives/JoystickControls.d.ts.map +1 -0
- package/dist/directives/KeyboardControls.d.ts +219 -0
- package/dist/directives/KeyboardControls.d.ts.map +1 -0
- package/dist/directives/Scheduler.d.ts +35 -0
- package/dist/directives/Scheduler.d.ts.map +1 -0
- package/dist/directives/Shake.d.ts +98 -0
- package/dist/directives/Shake.d.ts.map +1 -0
- package/dist/directives/Sound.d.ts +25 -0
- package/dist/directives/Sound.d.ts.map +1 -0
- package/dist/directives/Transition.d.ts +10 -0
- package/dist/directives/Transition.d.ts.map +1 -0
- package/dist/directives/ViewportCull.d.ts +11 -0
- package/dist/directives/ViewportCull.d.ts.map +1 -0
- package/dist/directives/ViewportFollow.d.ts +18 -0
- package/dist/directives/ViewportFollow.d.ts.map +1 -0
- package/dist/directives/index.d.ts +14 -0
- package/dist/directives/index.d.ts.map +1 -0
- package/dist/dist-BOOc43Qm.js +778 -0
- package/dist/dist-BOOc43Qm.js.map +1 -0
- package/dist/engine/FocusManager.d.ts +174 -0
- package/dist/engine/FocusManager.d.ts.map +1 -0
- package/dist/engine/animation.d.ts +72 -0
- package/dist/engine/animation.d.ts.map +1 -0
- package/dist/engine/bootstrap.d.ts +48 -0
- package/dist/engine/bootstrap.d.ts.map +1 -0
- package/dist/engine/directive.d.ts +13 -0
- package/dist/engine/directive.d.ts.map +1 -0
- package/dist/engine/reactive.d.ts +134 -0
- package/dist/engine/reactive.d.ts.map +1 -0
- package/dist/engine/signal.d.ts +71 -0
- package/dist/engine/signal.d.ts.map +1 -0
- package/dist/engine/trigger.d.ts +54 -0
- package/dist/engine/trigger.d.ts.map +1 -0
- package/dist/engine/utils.d.ts +89 -0
- package/dist/engine/utils.d.ts.map +1 -0
- package/dist/hooks/addContext.d.ts +2 -0
- package/dist/hooks/addContext.d.ts.map +1 -0
- package/dist/hooks/useFocus.d.ts +60 -0
- package/dist/hooks/useFocus.d.ts.map +1 -0
- package/dist/hooks/useProps.d.ts +42 -0
- package/dist/hooks/useProps.d.ts.map +1 -0
- package/dist/hooks/useRef.d.ts +4 -0
- package/dist/hooks/useRef.d.ts.map +1 -0
- package/dist/index.d.ts +19 -1107
- package/dist/index.d.ts.map +1 -0
- package/dist/index.global.js +5 -0
- package/dist/index.global.js.map +1 -0
- package/dist/index.js +9768 -3135
- package/dist/index.js.map +1 -1
- package/dist/utils/Ease.d.ts +17 -0
- package/dist/utils/Ease.d.ts.map +1 -0
- package/dist/utils/GlobalAssetLoader.d.ts +141 -0
- package/dist/utils/GlobalAssetLoader.d.ts.map +1 -0
- package/dist/utils/RadialGradient.d.ts +57 -0
- package/dist/utils/RadialGradient.d.ts.map +1 -0
- package/dist/utils/functions.d.ts +2 -0
- package/dist/utils/functions.d.ts.map +1 -0
- package/dist/utils/tabindex.d.ts +16 -0
- package/dist/utils/tabindex.d.ts.map +1 -0
- package/package.json +15 -9
- package/src/components/Button.ts +399 -0
- package/src/components/Canvas.ts +62 -46
- package/src/components/Container.ts +21 -2
- package/src/components/DOMContainer.ts +379 -0
- package/src/components/DOMElement.ts +556 -0
- package/src/components/DOMSprite.ts +1040 -0
- package/src/components/DisplayObject.ts +419 -201
- package/src/components/FocusContainer.ts +368 -0
- package/src/components/Graphic.ts +227 -66
- package/src/components/Joystick.ts +363 -0
- package/src/components/Mesh.ts +222 -0
- package/src/components/NineSliceSprite.ts +4 -1
- package/src/components/ParticleEmitter.ts +12 -8
- package/src/components/Sprite.ts +418 -52
- package/src/components/Text.ts +125 -18
- package/src/components/Viewport.ts +122 -63
- package/src/components/index.ts +9 -2
- package/src/components/types/DisplayObject.ts +53 -5
- package/src/components/types/Spritesheet.ts +0 -118
- package/src/directives/Controls.ts +254 -0
- package/src/directives/ControlsBase.ts +267 -0
- package/src/directives/Drag.ts +357 -52
- package/src/directives/Flash.ts +419 -0
- package/src/directives/FocusNavigation.ts +113 -0
- package/src/directives/FogVisibility.ts +273 -0
- package/src/directives/GamepadControls.ts +537 -0
- package/src/directives/JoystickControls.ts +396 -0
- package/src/directives/KeyboardControls.ts +85 -430
- package/src/directives/Scheduler.ts +12 -4
- package/src/directives/Shake.ts +298 -0
- package/src/directives/Sound.ts +94 -31
- package/src/directives/ViewportFollow.ts +40 -9
- package/src/directives/index.ts +13 -6
- package/src/engine/FocusManager.ts +510 -0
- package/src/engine/animation.ts +175 -21
- package/src/engine/bootstrap.ts +93 -3
- package/src/engine/directive.ts +4 -4
- package/src/engine/reactive.ts +979 -176
- package/src/engine/signal.ts +113 -25
- package/src/engine/trigger.ts +34 -7
- package/src/engine/utils.ts +19 -3
- package/src/hooks/useFocus.ts +91 -0
- package/src/hooks/useProps.ts +1 -1
- package/src/index.ts +8 -2
- package/src/types/pixi-cull.d.ts +7 -0
- package/src/utils/GlobalAssetLoader.ts +257 -0
- package/src/utils/functions.ts +7 -0
- package/src/utils/tabindex.ts +70 -0
- package/testing/index.ts +35 -4
- package/tsconfig.json +18 -0
- package/vite.config.ts +39 -0
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import { isSignal } from "@signe/reactive";
|
|
2
|
+
import { Container } from "pixi.js";
|
|
3
|
+
import { Subscription } from "rxjs";
|
|
4
|
+
import { SignalOrPrimitive } from "../components/types";
|
|
5
|
+
import { Directive, registerDirective } from "../engine/directive";
|
|
6
|
+
import { Element } from "../engine/reactive";
|
|
7
|
+
|
|
8
|
+
export type FogVisibilityState = "visible" | "explored" | "unknown";
|
|
9
|
+
export type FogVisibilityMode = "visible" | "explored";
|
|
10
|
+
export type FogVisibilityHideAs = "visible" | "alpha";
|
|
11
|
+
|
|
12
|
+
export type FogVisibilityController = {
|
|
13
|
+
version?: () => number;
|
|
14
|
+
clarityAt?: (x: number, y: number) => number;
|
|
15
|
+
isVisibleAt?: (x: number, y: number, threshold?: number) => boolean;
|
|
16
|
+
isExploredAt?: (x: number, y: number) => boolean;
|
|
17
|
+
stateAt?: (x: number, y: number, clearThreshold?: number) => FogVisibilityState | string;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export type FogVisibilityPoint = {
|
|
21
|
+
x: SignalOrPrimitive<number>;
|
|
22
|
+
y: SignalOrPrimitive<number>;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export type FogVisibilityProps = {
|
|
26
|
+
controller?: SignalOrPrimitive<FogVisibilityController | null | undefined>;
|
|
27
|
+
mode?: SignalOrPrimitive<FogVisibilityMode>;
|
|
28
|
+
threshold?: SignalOrPrimitive<number>;
|
|
29
|
+
point?: SignalOrPrimitive<FogVisibilityPoint>;
|
|
30
|
+
hideAs?: SignalOrPrimitive<FogVisibilityHideAs>;
|
|
31
|
+
hiddenAlpha?: SignalOrPrimitive<number>;
|
|
32
|
+
sampleHz?: SignalOrPrimitive<number>;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
type NormalizedFogVisibilityProps = {
|
|
36
|
+
controller: FogVisibilityController | null;
|
|
37
|
+
mode: FogVisibilityMode;
|
|
38
|
+
threshold: number;
|
|
39
|
+
hideAs: FogVisibilityHideAs;
|
|
40
|
+
hiddenAlpha: number;
|
|
41
|
+
sampleHz: number;
|
|
42
|
+
point?: FogVisibilityPoint;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const clamp = (value: number, min: number, max: number) =>
|
|
46
|
+
Math.max(min, Math.min(max, value));
|
|
47
|
+
|
|
48
|
+
export class FogVisibility extends Directive {
|
|
49
|
+
private elementRef: Element<Container> | null = null;
|
|
50
|
+
private tickSubscription: Subscription | null = null;
|
|
51
|
+
private sampleAccumulatorMs = 0;
|
|
52
|
+
private managesAlpha = false;
|
|
53
|
+
|
|
54
|
+
onInit(element: Element<Container>) {
|
|
55
|
+
this.elementRef = element;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
onMount(element: Element<Container>) {
|
|
59
|
+
this.elementRef = element;
|
|
60
|
+
this.evaluateVisibility();
|
|
61
|
+
this.bindTick();
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
onUpdate() {
|
|
65
|
+
this.sampleAccumulatorMs = 0;
|
|
66
|
+
this.evaluateVisibility();
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
onDestroy() {
|
|
70
|
+
const instance = this.elementRef?.componentInstance as any;
|
|
71
|
+
if (instance) {
|
|
72
|
+
const baseVisible = this.readBaseVisible();
|
|
73
|
+
instance.visible = baseVisible;
|
|
74
|
+
if (this.managesAlpha) {
|
|
75
|
+
instance.alpha = this.readBaseAlpha();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
this.tickSubscription?.unsubscribe();
|
|
80
|
+
this.tickSubscription = null;
|
|
81
|
+
this.sampleAccumulatorMs = 0;
|
|
82
|
+
this.managesAlpha = false;
|
|
83
|
+
this.elementRef = null;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
private bindTick() {
|
|
87
|
+
this.tickSubscription?.unsubscribe();
|
|
88
|
+
this.tickSubscription = null;
|
|
89
|
+
|
|
90
|
+
const tick = this.elementRef?.props?.context?.tick;
|
|
91
|
+
if (!tick?.observable) return;
|
|
92
|
+
|
|
93
|
+
this.tickSubscription = tick.observable.subscribe((payload: any) => {
|
|
94
|
+
const tickValue = payload?.value ?? payload;
|
|
95
|
+
const deltaTime = Number(tickValue?.deltaTime);
|
|
96
|
+
const options = this.readOptions();
|
|
97
|
+
const intervalMs = 1000 / options.sampleHz;
|
|
98
|
+
|
|
99
|
+
this.sampleAccumulatorMs += Number.isFinite(deltaTime) ? deltaTime : intervalMs;
|
|
100
|
+
if (this.sampleAccumulatorMs < intervalMs) return;
|
|
101
|
+
|
|
102
|
+
this.sampleAccumulatorMs = 0;
|
|
103
|
+
this.evaluateVisibility(options);
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
private resolveSignalValue<T>(value: SignalOrPrimitive<T> | undefined, fallback: T): T {
|
|
108
|
+
if (value === undefined || value === null) return fallback;
|
|
109
|
+
if (isSignal(value as any)) {
|
|
110
|
+
const signalValue = (value as any)();
|
|
111
|
+
return signalValue === undefined || signalValue === null ? fallback : signalValue;
|
|
112
|
+
}
|
|
113
|
+
return value as T;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
private readOptions(): NormalizedFogVisibilityProps {
|
|
117
|
+
const fogVisibility = this.elementRef?.props?.fogVisibility;
|
|
118
|
+
const raw = (fogVisibility as any)?.value ?? fogVisibility ?? {};
|
|
119
|
+
|
|
120
|
+
const controller = this.resolveSignalValue(
|
|
121
|
+
raw.controller as SignalOrPrimitive<FogVisibilityController | null | undefined>,
|
|
122
|
+
null
|
|
123
|
+
);
|
|
124
|
+
const mode = this.resolveSignalValue(raw.mode as SignalOrPrimitive<FogVisibilityMode>, "visible");
|
|
125
|
+
const threshold = clamp(
|
|
126
|
+
Number(this.resolveSignalValue(raw.threshold as SignalOrPrimitive<number>, 0.65)),
|
|
127
|
+
0,
|
|
128
|
+
1
|
|
129
|
+
);
|
|
130
|
+
const hideAs = this.resolveSignalValue(
|
|
131
|
+
raw.hideAs as SignalOrPrimitive<FogVisibilityHideAs>,
|
|
132
|
+
"visible"
|
|
133
|
+
);
|
|
134
|
+
const hiddenAlpha = clamp(
|
|
135
|
+
Number(this.resolveSignalValue(raw.hiddenAlpha as SignalOrPrimitive<number>, 0)),
|
|
136
|
+
0,
|
|
137
|
+
1
|
|
138
|
+
);
|
|
139
|
+
const sampleHz = clamp(
|
|
140
|
+
Number(this.resolveSignalValue(raw.sampleHz as SignalOrPrimitive<number>, 30)),
|
|
141
|
+
1,
|
|
142
|
+
240
|
|
143
|
+
);
|
|
144
|
+
const point = raw.point
|
|
145
|
+
? this.resolveSignalValue(raw.point as SignalOrPrimitive<FogVisibilityPoint>, undefined as any)
|
|
146
|
+
: undefined;
|
|
147
|
+
|
|
148
|
+
return {
|
|
149
|
+
controller: controller && typeof controller === "object" ? controller : null,
|
|
150
|
+
mode,
|
|
151
|
+
threshold,
|
|
152
|
+
hideAs,
|
|
153
|
+
hiddenAlpha,
|
|
154
|
+
sampleHz,
|
|
155
|
+
point,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
private readBaseVisible() {
|
|
160
|
+
const visibleSource = (this.elementRef?.propObservables as any)?.visible ?? this.elementRef?.props?.visible;
|
|
161
|
+
return !!this.resolveSignalValue(visibleSource as SignalOrPrimitive<boolean>, true);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
private readBaseAlpha() {
|
|
165
|
+
const alphaSource = (this.elementRef?.propObservables as any)?.alpha ?? this.elementRef?.props?.alpha;
|
|
166
|
+
const value = Number(this.resolveSignalValue(alphaSource as SignalOrPrimitive<number>, 1));
|
|
167
|
+
if (!Number.isFinite(value)) return 1;
|
|
168
|
+
return clamp(value, 0, 1);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
private samplePoint(options: NormalizedFogVisibilityProps) {
|
|
172
|
+
if (options.point && typeof options.point === "object") {
|
|
173
|
+
const x = Number(this.resolveSignalValue(options.point.x, NaN));
|
|
174
|
+
const y = Number(this.resolveSignalValue(options.point.y, NaN));
|
|
175
|
+
if (Number.isFinite(x) && Number.isFinite(y)) {
|
|
176
|
+
return { x, y };
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
const instance = this.elementRef?.componentInstance as any;
|
|
181
|
+
return {
|
|
182
|
+
x: Number(instance?.x ?? 0),
|
|
183
|
+
y: Number(instance?.y ?? 0),
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
private resolveVisibleState(
|
|
188
|
+
controller: FogVisibilityController,
|
|
189
|
+
x: number,
|
|
190
|
+
y: number,
|
|
191
|
+
threshold: number
|
|
192
|
+
) {
|
|
193
|
+
if (typeof controller.isVisibleAt === "function") {
|
|
194
|
+
return !!controller.isVisibleAt(x, y, threshold);
|
|
195
|
+
}
|
|
196
|
+
if (typeof controller.clarityAt === "function") {
|
|
197
|
+
const clarity = Number(controller.clarityAt(x, y));
|
|
198
|
+
if (!Number.isFinite(clarity)) return true;
|
|
199
|
+
return clarity >= threshold;
|
|
200
|
+
}
|
|
201
|
+
if (typeof controller.stateAt === "function") {
|
|
202
|
+
const state = controller.stateAt(x, y, threshold);
|
|
203
|
+
return state === "visible";
|
|
204
|
+
}
|
|
205
|
+
return true;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
private resolveExploredState(
|
|
209
|
+
controller: FogVisibilityController,
|
|
210
|
+
x: number,
|
|
211
|
+
y: number,
|
|
212
|
+
threshold: number
|
|
213
|
+
) {
|
|
214
|
+
if (typeof controller.isExploredAt === "function") {
|
|
215
|
+
return !!controller.isExploredAt(x, y);
|
|
216
|
+
}
|
|
217
|
+
if (typeof controller.stateAt === "function") {
|
|
218
|
+
const state = controller.stateAt(x, y, threshold);
|
|
219
|
+
return state !== "unknown";
|
|
220
|
+
}
|
|
221
|
+
return this.resolveVisibleState(controller, x, y, threshold);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
private evaluateVisibility(explicitOptions?: NormalizedFogVisibilityProps) {
|
|
225
|
+
const element = this.elementRef;
|
|
226
|
+
const instance = element?.componentInstance as any;
|
|
227
|
+
if (!instance) return;
|
|
228
|
+
|
|
229
|
+
const options = explicitOptions ?? this.readOptions();
|
|
230
|
+
const baseVisible = this.readBaseVisible();
|
|
231
|
+
const baseAlpha = this.readBaseAlpha();
|
|
232
|
+
|
|
233
|
+
if (!options.controller) {
|
|
234
|
+
instance.visible = baseVisible;
|
|
235
|
+
if (this.managesAlpha) {
|
|
236
|
+
instance.alpha = baseAlpha;
|
|
237
|
+
this.managesAlpha = false;
|
|
238
|
+
}
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// Link directive reactivity to FogOfWar controller internal revision.
|
|
243
|
+
if (typeof options.controller.version === "function") {
|
|
244
|
+
options.controller.version();
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
const { x, y } = this.samplePoint(options);
|
|
248
|
+
let fogAllowsVisibility = true;
|
|
249
|
+
|
|
250
|
+
if (options.mode === "explored") {
|
|
251
|
+
fogAllowsVisibility = this.resolveExploredState(options.controller, x, y, options.threshold);
|
|
252
|
+
} else {
|
|
253
|
+
fogAllowsVisibility = this.resolveVisibleState(options.controller, x, y, options.threshold);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
if (options.hideAs === "alpha") {
|
|
257
|
+
instance.visible = baseVisible;
|
|
258
|
+
instance.alpha = fogAllowsVisibility
|
|
259
|
+
? baseAlpha
|
|
260
|
+
: Math.min(baseAlpha, options.hiddenAlpha);
|
|
261
|
+
this.managesAlpha = true;
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
instance.visible = baseVisible && fogAllowsVisibility;
|
|
266
|
+
if (this.managesAlpha) {
|
|
267
|
+
instance.alpha = baseAlpha;
|
|
268
|
+
this.managesAlpha = false;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
registerDirective("fogVisibility", FogVisibility);
|