mani-game-engine 1.0.0-pre.2 → 1.0.0-pre.20

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/lib/index.js CHANGED
@@ -1,6 +1,11 @@
1
- export * from './gameEngine';
2
- export * from './entity';
3
- export { EcsInjector, EntityComponent, GetComponent, GetEntity } from './ecsInjector';
4
- import { Inject, InjectId, Injector, InjectType } from 'mani-injector';
5
- export { Injector, InjectType, InjectId, Inject };
1
+ export * from './gameEngine';
2
+ export * from './entity';
3
+ export * from './types';
4
+ export * from './scope/scopeContext';
5
+ export * from './systemContext';
6
+ export { EcsInjector, EntityComponent, GetComponent, GetEntity, GetContext, GetSignal, OnSignal } from './ecsInjector';
7
+ import { Inject, InjectId, Injector, InjectType, putIfAbsent } from 'mani-injector';
8
+ import { Signal } from 'mani-signal';
9
+ export { Injector, InjectType, InjectId, Inject, putIfAbsent };
10
+ export { Signal };
6
11
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AAEzB,OAAO,EAAC,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,SAAS,EAAC,MAAM,eAAe,CAAC;AAGpF,OAAO,EAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAC,MAAM,eAAe,CAAC;AAErE,OAAO,EAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAC,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAC,MAAM,eAAe,CAAC;AAGrH,OAAO,EAAK,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAC,MAAM,eAAe,CAAC;AACtF,OAAO,EAAC,MAAM,EAAgC,MAAM,aAAa,CAAC;AAGlE,OAAO,EAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAK,CAAC;AAIjE,OAAO,EAAC,MAAM,EAAgC,CAAC"}
@@ -0,0 +1,54 @@
1
+ import { Class, EcsInjector, Signal, SignalCallback } from '../index';
2
+ import { ID } from 'mani-injector';
3
+ export declare type ScopeSignalOptions = {
4
+ keepAlive?: boolean | Scope[];
5
+ group?: string;
6
+ };
7
+ export declare const scopeSignalHandlers: Map<Object, [string, ID, (ScopeSignalOptions | undefined)?][]>;
8
+ export declare const OnScopeSignal: (id: ID, options?: ScopeSignalOptions | undefined) => (target: any, propertyKey: string, descriptor: PropertyDescriptor) => void;
9
+ export interface Scope {
10
+ [propName: string]: any;
11
+ onEnter?(): void;
12
+ onExit?(): void;
13
+ onSubReturn?(): void;
14
+ onSubExit?(): void;
15
+ onActivate?(): void;
16
+ onDeactivate?(): void;
17
+ }
18
+ export declare type ScopeMapping = (params: {
19
+ injector: EcsInjector;
20
+ registerScopeService: (serviceClass: Class) => void;
21
+ }) => void;
22
+ interface AddScopeSignalOptions extends ScopeSignalOptions {
23
+ context?: unknown;
24
+ }
25
+ export declare class ScopeContext {
26
+ private parent?;
27
+ readonly scope: Scope;
28
+ readonly injector: EcsInjector;
29
+ private readonly stack;
30
+ private readonly signalBindings;
31
+ private serviceBindings;
32
+ private closed;
33
+ private muteKeepAliveSignals;
34
+ constructor(injector: EcsInjector, scopeClass: Class, mapping?: ScopeMapping, parent?: ScopeContext | undefined);
35
+ get isRoot(): boolean;
36
+ get target(): Scope | undefined;
37
+ get isActive(): boolean;
38
+ get activeContext(): ScopeContext;
39
+ enterScope(scopeClass: Class, mapping?: ScopeMapping): ScopeContext | undefined;
40
+ exitScope(target?: Scope): void;
41
+ closeSubScopes(): void;
42
+ private logStack;
43
+ getStackClasses(): Scope[];
44
+ addScopeSignal<T>(signal: Signal<T>, callback: SignalCallback<T>, params?: AddScopeSignalOptions): void;
45
+ disableKeepAliveSignals(): void;
46
+ enableKeepAliveSignals(): void;
47
+ private updateSignalBindings;
48
+ private detachSignalBindings;
49
+ private mapScopeSignals;
50
+ private mapServiceSignals;
51
+ private detachServiceBindings;
52
+ private exitThis;
53
+ }
54
+ export {};
@@ -0,0 +1,245 @@
1
+ import { putIfAbsent } from 'mani-injector';
2
+ import { signalHandlers } from '../ecsInjector';
3
+ export const scopeSignalHandlers = new Map();
4
+ export const OnScopeSignal = (id, options) => (target, propertyKey, descriptor) => {
5
+ if (target instanceof Function) {
6
+ throw new Error('only allowed on non static methods');
7
+ }
8
+ else {
9
+ const mappingList = putIfAbsent(scopeSignalHandlers, target.constructor, () => []);
10
+ mappingList.push([propertyKey, id, options]);
11
+ }
12
+ };
13
+ class ScopeSignalBinding {
14
+ constructor(signalBinding, options) {
15
+ this.signalBinding = signalBinding;
16
+ this.keepAlive = options === null || options === void 0 ? void 0 : options.keepAlive;
17
+ this.group = options === null || options === void 0 ? void 0 : options.group;
18
+ }
19
+ activate() {
20
+ this.signalBinding.setActive(true);
21
+ }
22
+ deactivate() {
23
+ this.signalBinding.setActive(false);
24
+ }
25
+ detach() {
26
+ this.signalBinding.detach();
27
+ }
28
+ }
29
+ class ScopeStack {
30
+ constructor(rootScope) {
31
+ this.rootScope = rootScope;
32
+ this.stack = [];
33
+ this.queuedScopeChanges = [];
34
+ this.ongoingChange = false;
35
+ this.stack.push(rootScope);
36
+ }
37
+ get rootContext() {
38
+ return this.stack[0];
39
+ }
40
+ get activeContext() {
41
+ return this.stack[this.stack.length - 1];
42
+ }
43
+ }
44
+ export class ScopeContext {
45
+ constructor(injector, scopeClass, mapping, parent) {
46
+ var _a, _b, _c, _d;
47
+ this.parent = parent;
48
+ this.signalBindings = [];
49
+ this.serviceBindings = [];
50
+ this.closed = false;
51
+ this.muteKeepAliveSignals = false;
52
+ if (!parent) {
53
+ this.stack = new ScopeStack(this);
54
+ }
55
+ else {
56
+ this.stack = parent.stack;
57
+ this.stack.stack.push(this);
58
+ }
59
+ this.injector = injector.createChild();
60
+ this.injector.map(scopeClass).toSingleton();
61
+ this.injector.map(ScopeContext).toValue(this);
62
+ mapping === null || mapping === void 0 ? void 0 : mapping({
63
+ injector: this.injector,
64
+ registerScopeService: serviceClass => {
65
+ this.injector.map(serviceClass).toSingleton();
66
+ this.mapServiceSignals(this.injector.get(serviceClass));
67
+ },
68
+ });
69
+ this.scope = this.injector.get(scopeClass);
70
+ this.mapScopeSignals();
71
+ this.updateSignalBindings();
72
+ (_b = (_a = this.scope).onEnter) === null || _b === void 0 ? void 0 : _b.call(_a);
73
+ (_d = (_c = this.scope).onActivate) === null || _d === void 0 ? void 0 : _d.call(_c);
74
+ }
75
+ get isRoot() {
76
+ return this === this.stack.rootScope;
77
+ }
78
+ get target() {
79
+ return this.stack.target;
80
+ }
81
+ get isActive() {
82
+ return this === this.stack.activeContext;
83
+ }
84
+ get activeContext() { return this.stack.activeContext; }
85
+ enterScope(scopeClass, mapping) {
86
+ let newContext;
87
+ const doChange = () => {
88
+ var _a, _b, _c, _d;
89
+ (_b = (_a = this.activeContext.scope).onSubExit) === null || _b === void 0 ? void 0 : _b.call(_a);
90
+ (_d = (_c = this.activeContext.scope).onDeactivate) === null || _d === void 0 ? void 0 : _d.call(_c);
91
+ newContext = new ScopeContext(this.activeContext.injector, scopeClass, mapping, this.activeContext);
92
+ this.logStack();
93
+ const nextChange = this.stack.queuedScopeChanges.shift();
94
+ if (nextChange) {
95
+ nextChange();
96
+ }
97
+ else {
98
+ this.stack.ongoingChange = false;
99
+ }
100
+ };
101
+ if (!this.stack.ongoingChange) {
102
+ this.stack.ongoingChange = true;
103
+ doChange();
104
+ }
105
+ else {
106
+ this.stack.queuedScopeChanges.push(doChange);
107
+ }
108
+ return newContext;
109
+ }
110
+ exitScope(target) {
111
+ const doChange = () => {
112
+ if (this.closed)
113
+ throw new Error(`Scope already closed`);
114
+ this.stack.target = target || this.scope.constructor;
115
+ while (true) {
116
+ const ctx = this.stack.stack.pop();
117
+ if (!ctx) {
118
+ throw new Error('no scope in stack');
119
+ }
120
+ ctx.exitThis();
121
+ if (ctx.scope.constructor === this.stack.target) {
122
+ break;
123
+ }
124
+ }
125
+ this.stack.target = undefined;
126
+ const nextChange = this.stack.queuedScopeChanges.shift();
127
+ if (nextChange) {
128
+ nextChange();
129
+ }
130
+ else {
131
+ this.stack.ongoingChange = false;
132
+ }
133
+ };
134
+ if (!this.stack.ongoingChange) {
135
+ this.stack.ongoingChange = true;
136
+ doChange();
137
+ }
138
+ else {
139
+ this.stack.queuedScopeChanges.push(doChange);
140
+ }
141
+ }
142
+ closeSubScopes() {
143
+ this.stack.target = this.scope.constructor;
144
+ while (!this.isActive) {
145
+ const ctx = this.stack.stack.pop();
146
+ if (!ctx) {
147
+ throw new Error('no scope in stack');
148
+ }
149
+ ctx.exitThis();
150
+ }
151
+ this.stack.target = undefined;
152
+ }
153
+ logStack() {
154
+ console.debug('%c' + this.stack.stack.map(c => c.scope.constructor.name).join(' -> '), 'color:yellow');
155
+ }
156
+ getStackClasses() {
157
+ return this.stack.stack.map(context => context.scope.constructor);
158
+ }
159
+ addScopeSignal(signal, callback, params) {
160
+ const signalBinding = new ScopeSignalBinding(signal.add(callback, params === null || params === void 0 ? void 0 : params.context), params);
161
+ this.signalBindings.push(signalBinding);
162
+ }
163
+ disableKeepAliveSignals() {
164
+ this.muteKeepAliveSignals = true;
165
+ this.updateSignalBindings();
166
+ }
167
+ enableKeepAliveSignals() {
168
+ this.muteKeepAliveSignals = false;
169
+ this.updateSignalBindings();
170
+ }
171
+ updateSignalBindings(muteKeepAlive = false) {
172
+ var _a;
173
+ for (const binding of this.signalBindings) {
174
+ if (this.isActive) {
175
+ binding.activate();
176
+ }
177
+ else if (muteKeepAlive) {
178
+ binding.deactivate();
179
+ }
180
+ else if (binding.keepAlive === true) {
181
+ binding.activate();
182
+ }
183
+ else if (!!(binding.keepAlive)) {
184
+ if (binding.keepAlive.indexOf(this.activeContext.scope.constructor) != -1) {
185
+ binding.activate();
186
+ }
187
+ else {
188
+ binding.deactivate();
189
+ }
190
+ }
191
+ else {
192
+ binding.deactivate();
193
+ }
194
+ }
195
+ muteKeepAlive = muteKeepAlive || this.muteKeepAliveSignals;
196
+ (_a = this.parent) === null || _a === void 0 ? void 0 : _a.updateSignalBindings(muteKeepAlive);
197
+ }
198
+ detachSignalBindings() {
199
+ for (const signalBinding of this.signalBindings) {
200
+ signalBinding.detach();
201
+ }
202
+ }
203
+ mapScopeSignals() {
204
+ const handlers = scopeSignalHandlers.get(this.scope.constructor);
205
+ if (!handlers)
206
+ return;
207
+ for (const [field, id, options] of handlers) {
208
+ const signal = this.injector.getSignal(id);
209
+ const callback = this.scope[field];
210
+ this.addScopeSignal(signal, callback, Object.assign(Object.assign({}, options), { context: this.scope }));
211
+ }
212
+ }
213
+ mapServiceSignals(scopeService) {
214
+ const handlers = signalHandlers.get(scopeService.constructor);
215
+ if (!handlers)
216
+ return;
217
+ for (const [field, id] of handlers) {
218
+ const signal = this.injector.getSignal(id);
219
+ const signalBinding = signal.add(scopeService[field], scopeService);
220
+ this.serviceBindings.push(signalBinding);
221
+ }
222
+ }
223
+ detachServiceBindings() {
224
+ for (const binding of this.serviceBindings) {
225
+ binding.detach();
226
+ }
227
+ this.serviceBindings = [];
228
+ }
229
+ exitThis() {
230
+ var _a, _b, _c, _d, _e, _f, _g, _h;
231
+ if (!this.parent) {
232
+ throw new Error('can\'t exit root scope?!');
233
+ }
234
+ this.logStack();
235
+ this.detachSignalBindings();
236
+ this.detachServiceBindings();
237
+ (_b = (_a = this.scope).onDeactivate) === null || _b === void 0 ? void 0 : _b.call(_a);
238
+ (_d = (_c = this.scope).onExit) === null || _d === void 0 ? void 0 : _d.call(_c);
239
+ this.parent.updateSignalBindings();
240
+ (_f = (_e = this.parent.scope).onSubReturn) === null || _f === void 0 ? void 0 : _f.call(_e);
241
+ (_h = (_g = this.parent.scope).onActivate) === null || _h === void 0 ? void 0 : _h.call(_g);
242
+ this.closed = true;
243
+ }
244
+ }
245
+ //# sourceMappingURL=scopeContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scopeContext.js","sourceRoot":"","sources":["../../src/scope/scopeContext.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { System } from './types';
2
+ import { Signal, SignalCallback } from './index';
3
+ export declare class SystemContext<T extends System = System> {
4
+ readonly entity: Object;
5
+ readonly system: T;
6
+ private signalBindings;
7
+ constructor(entity: Object);
8
+ addSignalById<S>(signalId: string | symbol, callback: SignalCallback<S>, thisArg?: unknown): void;
9
+ addSignal<S>(signal: Signal<S>, callback: SignalCallback<S>, thisArg?: unknown): void;
10
+ addSignalOnce<S>(signal: Signal<S>, callback: SignalCallback<S>, thisArg?: unknown): void;
11
+ dispose(): void;
12
+ }
@@ -0,0 +1,20 @@
1
+ export class SystemContext {
2
+ constructor(entity) {
3
+ this.entity = entity;
4
+ this.signalBindings = [];
5
+ }
6
+ addSignalById(signalId, callback, thisArg) {
7
+ this.signalBindings.push(this.entity.gameEngine.getSignal(signalId).add(callback, thisArg));
8
+ }
9
+ addSignal(signal, callback, thisArg) {
10
+ this.signalBindings.push(signal.add(callback, thisArg));
11
+ }
12
+ addSignalOnce(signal, callback, thisArg) {
13
+ this.signalBindings.push(signal.addOnce(callback, thisArg));
14
+ }
15
+ dispose() {
16
+ for (const binding of this.signalBindings)
17
+ binding.detach();
18
+ }
19
+ }
20
+ //# sourceMappingURL=systemContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"systemContext.js","sourceRoot":"","sources":["../src/systemContext.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,aAAa;IAItB,YAAqB,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;QAF3B,mBAAc,GAAoB,EAAE,CAAC;IAG7C,CAAC;IAGD,aAAa,CAAI,QAAyB,EAAE,QAA2B,EAAE,OAAiB;QACtF,IAAI,CAAC,cAAc,CAAC,IAAI,CAAG,IAAI,CAAC,MAAc,CAAC,UAAyB,CAAC,SAAS,CAAI,QAAQ,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5H,CAAC;IAED,SAAS,CAAI,MAAiB,EAAE,QAA2B,EAAE,OAAiB;QAC1E,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,aAAa,CAAI,MAAiB,EAAE,QAA2B,EAAE,OAAiB;QAC9E,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,OAAO;QACH,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,cAAc;YAAE,OAAO,CAAC,MAAM,EAAE,CAAC;IAChE,CAAC;CACJ"}
package/lib/types.d.ts CHANGED
@@ -1,54 +1,70 @@
1
- import { GameEngine } from './gameEngine';
2
- export interface GameSystem {
3
- [propName: string]: any;
4
- onPrepare?(): Promise<void>;
5
- onStart?(): void;
6
- onEnd?(): void;
7
- onPreFixedUpdate?(): void;
8
- onEarlyUpdate?(time: number, deltaTime: number): void;
9
- onFixedUpdate?(time: number, deltaTime: number): void;
10
- onPrePhysicUpdate?(time: number, deltaTime: number): void;
11
- onPhysicsUpdate?(time: number, deltaTime: number): void;
12
- onUpdate?(time: number, deltaTime: number, alpha: number): void;
13
- onLateUpdate?(time: number, deltaTime: number, alpha: number): void;
14
- onPostPhysicsUpdate?(time: number, deltaTime: number): void;
15
- onRender?(): void;
16
- }
17
- export interface GameService {
18
- [propName: string]: any;
19
- onPrepare?(): Promise<void>;
20
- onStart?(): void;
21
- onEnd?(): void;
22
- onPreFixedUpdate?(): void;
23
- onPostPhysicsUpdate?(time: number, deltaTime: number): void;
24
- onFixedUpdate?(time: number, deltaTime: number): void;
25
- onPrePhysicUpdate?(time: number, deltaTime: number): void;
26
- onPhysicsUpdate?(time: number, deltaTime: number): void;
27
- onUpdate?(time: number, deltaTime: number, alpha: number): void;
28
- onLateUpdate?(time: number, deltaTime: number, alpha: number): void;
29
- onRender?(): void;
30
- }
31
- declare type GameEngineCallback = (gameEngine: GameEngine) => void;
32
- export interface GameEnginePlugin {
33
- onPrepare?: GameEngineCallback;
34
- onStart?: GameEngineCallback;
35
- }
36
- export interface CommandClass {
37
- name?: string;
38
- new (...args: any[]): any;
39
- }
40
- export declare type OnUpdateParams = {
41
- time: number;
42
- deltaTime: number;
43
- alpha: number;
44
- };
45
- export declare type OnFixedUpdateParams = {
46
- time: number;
47
- deltaTime: number;
48
- };
49
- export declare type AsyncAction<T = unknown> = (gameEngine: GameEngine) => Promise<T>;
50
- export declare type Action<T = any> = (gameEngine: GameEngine) => T;
51
- export declare type Class<T = any> = {
52
- new (...args: any[]): T;
53
- };
54
- export {};
1
+ import { GameEngine } from './gameEngine';
2
+ export interface System {
3
+ [propName: string]: any;
4
+ onPrepare?(): Promise<void>;
5
+ onStart?(): void;
6
+ onEnd?(): void;
7
+ onPreFixedUpdate?(time: number, deltaTime: number): void;
8
+ onEarlyUpdate?(time: number, deltaTime: number): void;
9
+ onFixedUpdate?(time: number, deltaTime: number): void;
10
+ onPhysicsUpdate?(time: number, deltaTime: number): void;
11
+ onUpdate?(time: number, deltaTime: number, alpha: number): void;
12
+ onLateUpdate?(time: number, deltaTime: number, alpha: number): void;
13
+ onPostPhysicsUpdate?(time: number, deltaTime: number): void;
14
+ onLateFixedUpdate?(time: number, deltaTime: number): void;
15
+ onRender?(time: number, deltaTime: number, alpha: number): void;
16
+ }
17
+ export interface Service {
18
+ [propName: string]: any;
19
+ onPrepare?(): Promise<void>;
20
+ onStart?(): void;
21
+ onEnd?(): void;
22
+ onPreFixedUpdate?(time: number, deltaTime: number): void;
23
+ onPostPhysicsUpdate?(time: number, deltaTime: number): void;
24
+ onLateFixedUpdate?(time: number, deltaTime: number): void;
25
+ onFixedUpdate?(time: number, deltaTime: number): void;
26
+ onPhysicsUpdate?(time: number, deltaTime: number): void;
27
+ onUpdate?(time: number, deltaTime: number, alpha: number): void;
28
+ onLateUpdate?(time: number, deltaTime: number, alpha: number): void;
29
+ onRender?(time: number, deltaTime: number, alpha: number): void;
30
+ }
31
+ declare type GameEngineCallback = (gameEngine: GameEngine) => void;
32
+ export interface GameEnginePlugin {
33
+ onPrepare?: GameEngineCallback;
34
+ onStart?: GameEngineCallback;
35
+ }
36
+ export interface CommandClass {
37
+ name?: string;
38
+ new (...args: any[]): any;
39
+ }
40
+ export declare type OnUpdateParams = {
41
+ time: number;
42
+ deltaTime: number;
43
+ alpha: number;
44
+ };
45
+ export declare type OnFixedUpdateParams = {
46
+ time: number;
47
+ deltaTime: number;
48
+ };
49
+ export declare type OnEarlyUpdateParams = {
50
+ time: number;
51
+ deltaTime: number;
52
+ };
53
+ export declare type AsyncAction<T = unknown> = (gameEngine: GameEngine) => Promise<T>;
54
+ export declare type Action<T = any> = (gameEngine: GameEngine) => T;
55
+ export declare type Class<T = any> = {
56
+ new (...args: any[]): T;
57
+ };
58
+ export declare const EngineSignals: {
59
+ OnStart: symbol;
60
+ OnEnd: symbol;
61
+ OnUpdate: symbol;
62
+ OnLateUpdate: symbol;
63
+ OnFixedUpdate: symbol;
64
+ OnPrePhysics: symbol;
65
+ OnPostPhysics: symbol;
66
+ onLateFixedUpdate: symbol;
67
+ OnRender: symbol;
68
+ OnPrepare: symbol;
69
+ };
70
+ export {};
package/lib/types.js CHANGED
@@ -1 +1,13 @@
1
+ export const EngineSignals = {
2
+ OnStart: Symbol('OnStart'),
3
+ OnEnd: Symbol('OnEnd'),
4
+ OnUpdate: Symbol('OnUpdate'),
5
+ OnLateUpdate: Symbol('OnLateUpdate'),
6
+ OnFixedUpdate: Symbol('OnFixedUpdate'),
7
+ OnPrePhysics: Symbol('OnPostPhysics'),
8
+ OnPostPhysics: Symbol('OnPostPhysics'),
9
+ onLateFixedUpdate: Symbol('OnPrepare'),
10
+ OnRender: Symbol('OnRender'),
11
+ OnPrepare: Symbol('OnPrepare'),
12
+ };
1
13
  //# sourceMappingURL=types.js.map
package/lib/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAwEA,MAAM,CAAC,MAAM,aAAa,GAAG;IACzB,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC,cAAc,CAAC;IACpC,aAAa,EAAE,MAAM,CAAC,eAAe,CAAC;IACtC,YAAY,EAAE,MAAM,CAAC,eAAe,CAAC;IACrC,aAAa,EAAE,MAAM,CAAC,eAAe,CAAC;IACtC,iBAAiB,EAAE,MAAM,CAAC,WAAW,CAAC;IACtC,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC;CACjC,CAAC"}
@@ -1,6 +1,6 @@
1
- export declare class Map2k<K, V> {
2
- map: Map<K, Map<K, V>>;
3
- set(key1: K, key2: K, value: V): void;
4
- get(key1: K, key2: K): V | undefined;
5
- delete(key1: K, key2: K): void;
6
- }
1
+ export declare class Map2k<K, V> {
2
+ map: Map<K, Map<K, V>>;
3
+ set(key1: K, key2: K, value: V): void;
4
+ get(key1: K, key2: K): V | undefined;
5
+ delete(key1: K, key2: K): void;
6
+ }
@@ -1,40 +1,40 @@
1
- export class Map2k {
2
- constructor() {
3
- this.map = new Map();
4
- }
5
- set(key1, key2, value) {
6
- let first = this.map.get(key1);
7
- if (!first) {
8
- first = new Map();
9
- this.map.set(key1, first);
10
- }
11
- let second = this.map.get(key2);
12
- if (!second) {
13
- second = new Map();
14
- this.map.set(key2, second);
15
- }
16
- first.set(key2, value);
17
- second.set(key1, value);
18
- }
19
- get(key1, key2) {
20
- const first = this.map.get(key1);
21
- return first && first.get(key2);
22
- }
23
- delete(key1, key2) {
24
- let first = this.map.get(key1);
25
- if (first) {
26
- first.delete(key2);
27
- if (first.size === 0) {
28
- this.map.delete(key1);
29
- }
30
- }
31
- let second = this.map.get(key2);
32
- if (second) {
33
- second.delete(key1);
34
- if (second.size === 0) {
35
- this.map.delete(key2);
36
- }
37
- }
38
- }
39
- }
1
+ export class Map2k {
2
+ constructor() {
3
+ this.map = new Map();
4
+ }
5
+ set(key1, key2, value) {
6
+ let first = this.map.get(key1);
7
+ if (!first) {
8
+ first = new Map();
9
+ this.map.set(key1, first);
10
+ }
11
+ let second = this.map.get(key2);
12
+ if (!second) {
13
+ second = new Map();
14
+ this.map.set(key2, second);
15
+ }
16
+ first.set(key2, value);
17
+ second.set(key1, value);
18
+ }
19
+ get(key1, key2) {
20
+ const first = this.map.get(key1);
21
+ return first && first.get(key2);
22
+ }
23
+ delete(key1, key2) {
24
+ let first = this.map.get(key1);
25
+ if (first) {
26
+ first.delete(key2);
27
+ if (first.size === 0) {
28
+ this.map.delete(key1);
29
+ }
30
+ }
31
+ let second = this.map.get(key2);
32
+ if (second) {
33
+ second.delete(key1);
34
+ if (second.size === 0) {
35
+ this.map.delete(key2);
36
+ }
37
+ }
38
+ }
39
+ }
40
40
  //# sourceMappingURL=map2k.js.map