mani-game-engine 1.0.0-pre.24 → 1.0.0-pre.29
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/ecsInjector.d.ts +1 -1
- package/lib/ecsInjector.js +1 -1
- package/lib/ecsInjector.js.map +1 -1
- package/lib/gameEngine.d.ts +3 -1
- package/lib/gameEngine.js +9 -5
- package/lib/gameEngine.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/injector.d.ts +121 -0
- package/lib/injector.js +282 -0
- package/lib/injector.js.map +1 -0
- package/lib/scope/scopeContext.d.ts +1 -1
- package/lib/scope/scopeContext.js +1 -1
- package/lib/scope/scopeContext.js.map +1 -1
- package/lib/types.d.ts +6 -3
- package/lib/types.js +5 -3
- package/lib/types.js.map +1 -1
- package/package.json +2 -4
- package/src/ecsInjector.ts +1 -1
- package/src/gameEngine.ts +10 -5
- package/src/index.ts +2 -1
- package/src/injector.ts +363 -0
- package/src/scope/scopeContext.ts +1 -1
- package/src/types.ts +7 -4
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { putIfAbsent } from 'mani-injector';
|
|
2
1
|
import { signalHandlers } from '../ecsInjector';
|
|
2
|
+
import { putIfAbsent } from '../injector';
|
|
3
3
|
export const scopeSignalHandlers = new Map();
|
|
4
4
|
export const OnScopeSignal = (id, options) => (target, propertyKey, descriptor) => {
|
|
5
5
|
if (target instanceof Function) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scopeContext.js","sourceRoot":"","sources":["../../src/scope/scopeContext.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"scopeContext.js","sourceRoot":"","sources":["../../src/scope/scopeContext.ts"],"names":[],"mappings":"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"}
|
package/lib/types.d.ts
CHANGED
|
@@ -5,11 +5,11 @@ export interface System {
|
|
|
5
5
|
onStart?(): void;
|
|
6
6
|
onEnd?(): void;
|
|
7
7
|
onPreFixedUpdate?(time: number, deltaTime: number): void;
|
|
8
|
-
onEarlyUpdate?(time: number, deltaTime: number): void;
|
|
9
8
|
onFixedUpdate?(time: number, deltaTime: number): void;
|
|
10
9
|
onPhysicsUpdate?(time: number, deltaTime: number): void;
|
|
11
10
|
onUpdate?(time: number, deltaTime: number, alpha: number): void;
|
|
12
11
|
onLateUpdate?(time: number, deltaTime: number, alpha: number): void;
|
|
12
|
+
onPrePhysicsUpdate?(time: number, deltaTime: number): void;
|
|
13
13
|
onPostPhysicsUpdate?(time: number, deltaTime: number): void;
|
|
14
14
|
onLateFixedUpdate?(time: number, deltaTime: number): void;
|
|
15
15
|
onRender?(time: number, deltaTime: number, alpha: number): void;
|
|
@@ -24,6 +24,7 @@ export interface Service {
|
|
|
24
24
|
onLateFixedUpdate?(time: number, deltaTime: number): void;
|
|
25
25
|
onFixedUpdate?(time: number, deltaTime: number): void;
|
|
26
26
|
onPhysicsUpdate?(time: number, deltaTime: number): void;
|
|
27
|
+
onPrePhysicsUpdate?(time: number, deltaTime: number): void;
|
|
27
28
|
onUpdate?(time: number, deltaTime: number, alpha: number): void;
|
|
28
29
|
onLateUpdate?(time: number, deltaTime: number, alpha: number): void;
|
|
29
30
|
onRender?(time: number, deltaTime: number, alpha: number): void;
|
|
@@ -61,8 +62,10 @@ export declare const EngineSignals: {
|
|
|
61
62
|
OnUpdate: symbol;
|
|
62
63
|
OnLateUpdate: symbol;
|
|
63
64
|
OnFixedUpdate: symbol;
|
|
64
|
-
|
|
65
|
-
|
|
65
|
+
OnPreFixedUpdate: symbol;
|
|
66
|
+
OnPrePhysicsUpdate: symbol;
|
|
67
|
+
OnPhysicsUpdate: symbol;
|
|
68
|
+
OnPostPhysicsUpdate: symbol;
|
|
66
69
|
onLateFixedUpdate: symbol;
|
|
67
70
|
OnRender: symbol;
|
|
68
71
|
OnPrepare: symbol;
|
package/lib/types.js
CHANGED
|
@@ -4,9 +4,11 @@ export const EngineSignals = {
|
|
|
4
4
|
OnUpdate: Symbol('OnUpdate'),
|
|
5
5
|
OnLateUpdate: Symbol('OnLateUpdate'),
|
|
6
6
|
OnFixedUpdate: Symbol('OnFixedUpdate'),
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
OnPreFixedUpdate: Symbol('OnPreFixedUpdate'),
|
|
8
|
+
OnPrePhysicsUpdate: Symbol('OnPrePhysicsUpdate'),
|
|
9
|
+
OnPhysicsUpdate: Symbol('OnPhysicsUpdate'),
|
|
10
|
+
OnPostPhysicsUpdate: Symbol('OnPostPhysicsUpdate'),
|
|
11
|
+
onLateFixedUpdate: Symbol('onLateFixedUpdate'),
|
|
10
12
|
OnRender: Symbol('OnRender'),
|
|
11
13
|
OnPrepare: Symbol('OnPrepare'),
|
|
12
14
|
};
|
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":"AAyEA,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,gBAAgB,EAAE,MAAM,CAAC,kBAAkB,CAAC;IAC5C,kBAAkB,EAAE,MAAM,CAAC,oBAAoB,CAAC;IAChD,eAAe,EAAE,MAAM,CAAC,iBAAiB,CAAC;IAC1C,mBAAmB,EAAE,MAAM,CAAC,qBAAqB,CAAC;IAClD,iBAAiB,EAAE,MAAM,CAAC,mBAAmB,CAAC;IAC9C,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC;CACjC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mani-game-engine",
|
|
3
3
|
"author": "Jan Mankopf",
|
|
4
|
-
"version": "1.0.0-pre.
|
|
4
|
+
"version": "1.0.0-pre.29",
|
|
5
5
|
"description": "entity component system game engine for typescript",
|
|
6
6
|
"private": false,
|
|
7
7
|
"scripts": {
|
|
@@ -30,12 +30,10 @@
|
|
|
30
30
|
"ts-node": "^9.1.1",
|
|
31
31
|
"tslib": "^2.2.0",
|
|
32
32
|
"typescript": "^4.2.4",
|
|
33
|
-
"mani-
|
|
34
|
-
"mani-signal": "^1.0.6"
|
|
33
|
+
"mani-signal": "1.x"
|
|
35
34
|
},
|
|
36
35
|
"peerDependencies": {
|
|
37
36
|
"reflect-metadata": "0.x",
|
|
38
|
-
"mani-injector": "0.x",
|
|
39
37
|
"mani-signal": "1.x"
|
|
40
38
|
}
|
|
41
39
|
}
|
package/src/ecsInjector.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// TODO: what if systems for entity without components are created?
|
|
2
|
-
import {Class, createDependencyAnnotation, Dependency, ID, Injector, putIfAbsent, ResolverContext, ResolverFunction} from 'mani-injector';
|
|
3
2
|
import {Signal} from 'mani-signal';
|
|
3
|
+
import {Class, createDependencyAnnotation, Dependency, ID, Injector, putIfAbsent, ResolverContext, ResolverFunction} from './injector';
|
|
4
4
|
import {SystemContext} from './systemContext';
|
|
5
5
|
|
|
6
6
|
type ComponentClass = Class;
|
package/src/gameEngine.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {Action, Class, EngineSignals, GameEnginePlugin, OnFixedUpdateParams, OnUpdateParams, Service, System} from './types';
|
|
2
2
|
import {Signal, SignalBinding} from 'mani-signal';
|
|
3
3
|
import {Entity} from './entity';
|
|
4
|
-
import {ID, putIfAbsent} from 'mani-injector';
|
|
5
4
|
import {EcsInjector, signalHandlers, staticSignalHandlers} from './ecsInjector';
|
|
6
5
|
import {Clock, GameClock} from './clock';
|
|
7
6
|
import {SystemContext} from './systemContext';
|
|
7
|
+
import {ID, putIfAbsent} from './injector';
|
|
8
8
|
|
|
9
9
|
type AddEntry = [Entity, () => void];
|
|
10
10
|
type RemoveEntry = [Entity, () => void];
|
|
@@ -33,6 +33,7 @@ export class GameEngine {
|
|
|
33
33
|
readonly onUpdate: Signal<OnUpdateParams>;
|
|
34
34
|
readonly onFixedUpdate: Signal<OnFixedUpdateParams>;
|
|
35
35
|
readonly onPrePhysicsUpdate: Signal<OnFixedUpdateParams>;
|
|
36
|
+
readonly onPhysicsUpdate: Signal<OnFixedUpdateParams>;
|
|
36
37
|
readonly onPostPhysicsUpdate: Signal<OnFixedUpdateParams>;
|
|
37
38
|
readonly onLateFixedUpdate: Signal<OnFixedUpdateParams>;
|
|
38
39
|
readonly onLateUpdate: Signal<OnUpdateParams>;
|
|
@@ -42,6 +43,7 @@ export class GameEngine {
|
|
|
42
43
|
private readonly onFixedUpdateSet = new Set<System>();
|
|
43
44
|
private readonly onPreFixedUpdateSet = new Set<System>();
|
|
44
45
|
private readonly onPhysicsUpdateSet = new Set<System>();
|
|
46
|
+
private readonly onPrePhysicsUpdateSet = new Set<System>();
|
|
45
47
|
private readonly onPostPhysicsUpdateSet = new Set<System>();
|
|
46
48
|
private readonly onLateFixedUpdateSet = new Set<System>();
|
|
47
49
|
private readonly onLateUpdateSet = new Set<System>();
|
|
@@ -86,8 +88,9 @@ export class GameEngine {
|
|
|
86
88
|
this.onFixedUpdate = this.injector.getSignal(EngineSignals.OnFixedUpdate);
|
|
87
89
|
this.onUpdate = this.injector.getSignal(EngineSignals.OnUpdate);
|
|
88
90
|
this.onLateUpdate = this.injector.getSignal(EngineSignals.OnLateUpdate);
|
|
89
|
-
this.onPrePhysicsUpdate = this.injector.getSignal(EngineSignals.
|
|
90
|
-
this.
|
|
91
|
+
this.onPrePhysicsUpdate = this.injector.getSignal(EngineSignals.OnPrePhysicsUpdate);
|
|
92
|
+
this.onPhysicsUpdate = this.injector.getSignal(EngineSignals.OnPhysicsUpdate);
|
|
93
|
+
this.onPostPhysicsUpdate = this.injector.getSignal(EngineSignals.OnPostPhysicsUpdate);
|
|
91
94
|
this.onLateFixedUpdate = this.injector.getSignal(EngineSignals.onLateFixedUpdate);
|
|
92
95
|
|
|
93
96
|
this.setupClock();
|
|
@@ -124,6 +127,7 @@ export class GameEngine {
|
|
|
124
127
|
service.onFixedUpdate && this.onFixedUpdateSet.add(service);
|
|
125
128
|
service.onUpdate && this.onUpdateSet.add(service);
|
|
126
129
|
service.onLateUpdate && this.onLateUpdateSet.add(service);
|
|
130
|
+
service.onPrePhysicsUpdate && this.onPrePhysicsUpdateSet.add(service);
|
|
127
131
|
service.onPhysicsUpdate && this.onPhysicsUpdateSet.add(service);
|
|
128
132
|
service.onPostPhysicsUpdate && this.onPostPhysicsUpdateSet.add(service);
|
|
129
133
|
service.onLateFixedUpdate && this.onLateFixedUpdateSet.add(service);
|
|
@@ -189,6 +193,7 @@ export class GameEngine {
|
|
|
189
193
|
for (const system of this.onPhysicsUpdateSet) {
|
|
190
194
|
system.onPhysicsUpdate!(time, deltaTime);
|
|
191
195
|
}
|
|
196
|
+
this.onPhysicsUpdate.dispatch(params);
|
|
192
197
|
this.onPostPhysicsUpdate.dispatch(params);
|
|
193
198
|
for (const system of this.onPostPhysicsUpdateSet) {
|
|
194
199
|
system.onPostPhysicsUpdate!(time, deltaTime);
|
|
@@ -346,10 +351,10 @@ export class GameEngine {
|
|
|
346
351
|
system.onEnd && system.onEnd();
|
|
347
352
|
system.onPreFixedUpdate && this.onPreFixedUpdateSet.delete(system);
|
|
348
353
|
system.onFixedUpdate && this.onFixedUpdateSet.delete(system);
|
|
349
|
-
system.onEarlyUpdate && this.onEarlyUpdateSet.delete(system);
|
|
350
354
|
system.onUpdate && this.onUpdateSet.delete(system);
|
|
351
355
|
system.onLateUpdate && this.onLateUpdateSet.delete(system);
|
|
352
356
|
system.onPhysicsUpdate && this.onPhysicsUpdateSet.delete(system);
|
|
357
|
+
system.onPrePhysicsUpdate && this.onPrePhysicsUpdateSet.delete(system);
|
|
353
358
|
system.onPostPhysicsUpdate && this.onPostPhysicsUpdateSet.delete(system);
|
|
354
359
|
system.onLateFixedUpdate && this.onLateFixedUpdateSet.delete(system);
|
|
355
360
|
system.onRender && this.onRenderUpdateSet.delete(system);
|
|
@@ -387,10 +392,10 @@ export class GameEngine {
|
|
|
387
392
|
system.onStart && system.onStart();
|
|
388
393
|
system.onPreFixedUpdate && this.onPreFixedUpdateSet.add(system);
|
|
389
394
|
system.onFixedUpdate && this.onFixedUpdateSet.add(system);
|
|
390
|
-
system.onEarlyUpdate && this.onEarlyUpdateSet.add(system);
|
|
391
395
|
system.onUpdate && this.onUpdateSet.add(system);
|
|
392
396
|
system.onLateUpdate && this.onLateUpdateSet.add(system);
|
|
393
397
|
system.onPhysicsUpdate && this.onPhysicsUpdateSet.add(system);
|
|
398
|
+
system.onPrePhysicsUpdate && this.onPrePhysicsUpdateSet.add(system);
|
|
394
399
|
system.onPostPhysicsUpdate && this.onPostPhysicsUpdateSet.add(system);
|
|
395
400
|
system.onLateFixedUpdate && this.onLateFixedUpdateSet.add(system);
|
|
396
401
|
system.onRender && this.onRenderUpdateSet.add(system);
|
package/src/index.ts
CHANGED
|
@@ -6,7 +6,8 @@ export * from './systemContext';
|
|
|
6
6
|
export {EcsInjector, EntityComponent, GetComponent, GetEntity, GetContext, GetSignal, OnSignal} from './ecsInjector';
|
|
7
7
|
|
|
8
8
|
// intellij doesnt auto resolve imports if we just export * from an external dependency
|
|
9
|
-
|
|
9
|
+
|
|
10
|
+
import {ID, Inject, InjectId, Injector, InjectType, putIfAbsent} from './injector';
|
|
10
11
|
import {Signal, SignalBinding, SignalCallback} from 'mani-signal';
|
|
11
12
|
import {Clock} from './clock';
|
|
12
13
|
|
package/src/injector.ts
ADDED
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
|
|
3
|
+
export type Class<T = any> = { name: string, new(...args: any[]): T; }
|
|
4
|
+
|
|
5
|
+
type ProviderFunction = () => unknown;
|
|
6
|
+
export type ResolverFunction = (context?: any) => unknown;
|
|
7
|
+
|
|
8
|
+
export type ID = string | symbol;
|
|
9
|
+
|
|
10
|
+
export type Dependency = { kind: string; index: number };
|
|
11
|
+
type TypeDependency = Dependency & { kind: 'type'; index: number; id: ID; };
|
|
12
|
+
type InjectDependency = Dependency & { kind: 'inject'; index: number; id: ID; type: Class; };
|
|
13
|
+
|
|
14
|
+
const enum TypeMappingKind { CLASS, SINGLETON, VALUE, PROVIDER}
|
|
15
|
+
|
|
16
|
+
type ClassTypeMapping = { kind: TypeMappingKind.CLASS; type: Class };
|
|
17
|
+
type SingletonTypeMapping = { kind: TypeMappingKind.SINGLETON; type: Class; injector: Injector };
|
|
18
|
+
type ValueTypeMapping = { kind: TypeMappingKind.VALUE; value: unknown; };
|
|
19
|
+
type ProviderTypeMapping = { kind: TypeMappingKind.PROVIDER; provider: ProviderFunction; };
|
|
20
|
+
// undefined kind is needed because there is no default mapping for types
|
|
21
|
+
type TypeMapping = ClassTypeMapping | SingletonTypeMapping | ValueTypeMapping | ProviderTypeMapping | { kind: undefined };
|
|
22
|
+
|
|
23
|
+
const enum ClassMappingKind { INSTANCE, VALUE, SINGLETON, PROVIDER}
|
|
24
|
+
|
|
25
|
+
type InstanceClassMapping = { kind: ClassMappingKind.INSTANCE; };
|
|
26
|
+
type ValueClassMapping = { kind: ClassMappingKind.VALUE; value: unknown; };
|
|
27
|
+
type SingletonClassMapping = { kind: ClassMappingKind.SINGLETON; injector: Injector };
|
|
28
|
+
type ProviderClassMapping = { kind: ClassMappingKind.PROVIDER; provider: ProviderFunction; };
|
|
29
|
+
type ClassMapping = InstanceClassMapping | ValueClassMapping | SingletonClassMapping | ProviderClassMapping;
|
|
30
|
+
|
|
31
|
+
// most of the class mappings are done with the default id, store them in the def field so we eliminate a second map lookup
|
|
32
|
+
type MapContainer = { map: Map<ID, ClassMapping>; def?: ClassMapping; };
|
|
33
|
+
type SingletonContainer = { map: Map<ID, Object>; def?: Object; };
|
|
34
|
+
type ClassResolverContainer = { map: Map<ID, ResolverFunction>; def?: ResolverFunction; };
|
|
35
|
+
|
|
36
|
+
export type ResolverContext = {
|
|
37
|
+
[propName: string]: any;
|
|
38
|
+
type: Class
|
|
39
|
+
kind: string;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const isInjectDependency = (dep: Dependency): dep is InjectDependency => dep.kind === 'inject';
|
|
43
|
+
const isTypeDependency = (dep: Dependency): dep is TypeDependency => dep.kind === 'type';
|
|
44
|
+
|
|
45
|
+
interface ClassMapper<T extends Class> {
|
|
46
|
+
toValue(value: InstanceType<T>): void;
|
|
47
|
+
toSingleton(): void;
|
|
48
|
+
toProvider(provider: () => InstanceType<T>): void;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
interface TypeMapper<T> {
|
|
52
|
+
toClass<C extends Class<T>>(classValue: C): void;
|
|
53
|
+
toSingleton<C extends Class<T>>(classValue: C): void;
|
|
54
|
+
toValue(value: T): void;
|
|
55
|
+
toProvider(provider: () => T): void;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// why is this not in javascript?! ...
|
|
59
|
+
export const putIfAbsent = <T extends Map<K, V>, K, V>(map: T, key: K, value: () => V) => {
|
|
60
|
+
let v = map.get(key);
|
|
61
|
+
if (!v) {
|
|
62
|
+
v = value();
|
|
63
|
+
map.set(key, v);
|
|
64
|
+
}
|
|
65
|
+
return v;
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
// helper method to create annotation functions
|
|
69
|
+
export const createDependencyAnnotation = (cb: (type: any, index: number, dependantType: Class) => Dependency) => (dependantType: Class, _propertyKey: string | symbol, index: number): any => {
|
|
70
|
+
const metadata = Reflect.getMetadata('design:paramtypes', dependantType);
|
|
71
|
+
const type = metadata[index];
|
|
72
|
+
if (type === dependantType) {
|
|
73
|
+
throw new Error('Could not inject class in itself.');
|
|
74
|
+
}
|
|
75
|
+
const depList = putIfAbsent(Injector.dependencyMap, dependantType, (): Dependency[] => []);
|
|
76
|
+
depList.push(cb(type, index, dependantType));
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
// Default DependencyAnnotations
|
|
80
|
+
export const Inject = createDependencyAnnotation((type, index) => ({kind: 'inject', index, type, id: ''}));
|
|
81
|
+
export const InjectId = (id: ID) => createDependencyAnnotation((type, index) => ({kind: 'inject', index, type, id}));
|
|
82
|
+
export const InjectType = (id: ID) => createDependencyAnnotation((_type, index) => ({kind: 'type', index, id}));
|
|
83
|
+
|
|
84
|
+
type DependencyExtensionResolver = (context: ResolverContext, dependency: Dependency) => ResolverFunction;
|
|
85
|
+
|
|
86
|
+
export class Injector {
|
|
87
|
+
static readonly dependencyMap = new Map<Class, Dependency[]>();
|
|
88
|
+
|
|
89
|
+
protected readonly typeMappings = new Map<ID, TypeMapping>();
|
|
90
|
+
protected readonly classMappings = new Map<Class, MapContainer>();
|
|
91
|
+
protected readonly parameterResolverArrays = new Map<Class, ResolverFunction[]>();
|
|
92
|
+
|
|
93
|
+
protected readonly classResolvers = new Map<Class, ClassResolverContainer>();
|
|
94
|
+
protected readonly typeResolvers = new Map<ID, ResolverFunction>();
|
|
95
|
+
|
|
96
|
+
protected readonly singletons = new Map<Class, SingletonContainer>();
|
|
97
|
+
protected readonly typeSingletons = new Map<ID, Object>();
|
|
98
|
+
|
|
99
|
+
protected readonly dependencyResolverExtensions: Map<string, DependencyExtensionResolver>;
|
|
100
|
+
|
|
101
|
+
constructor(readonly parent?: Injector) {
|
|
102
|
+
this.dependencyResolverExtensions = parent ? parent.dependencyResolverExtensions : new Map<string, DependencyExtensionResolver>();
|
|
103
|
+
this.map(Injector).toValue(this);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
createChild(): this {
|
|
107
|
+
return new (<typeof Injector>this.constructor)(this) as this;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
addExtensionResolver(kind: string, resolver: DependencyExtensionResolver) {
|
|
111
|
+
this.dependencyResolverExtensions.set(kind, resolver);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
map<T extends Class>(type: T, id: ID = ''): ClassMapper<T> {
|
|
115
|
+
const mapper = new InternalClassMapper<T>(this);
|
|
116
|
+
const idMappings = putIfAbsent(this.classMappings, type as Class, (): MapContainer => ({map: new Map<ID, ClassMapping>()}));
|
|
117
|
+
if (id === '') {
|
|
118
|
+
idMappings.def = mapper.mapping;
|
|
119
|
+
} else {
|
|
120
|
+
idMappings.map.set(id, mapper.mapping);
|
|
121
|
+
}
|
|
122
|
+
return mapper;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
mapType<T>(id: ID): TypeMapper<T> {
|
|
126
|
+
const typeMapper = new InternalTypeMapper<T>(this);
|
|
127
|
+
this.typeMappings.set(id, typeMapper.mapping);
|
|
128
|
+
return typeMapper;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
getType<T>(id: ID): T {
|
|
132
|
+
const typeResolver = this.getTypeResolver(id);
|
|
133
|
+
if (!typeResolver) {
|
|
134
|
+
throw new Error(`No Mapping for Type with id: '${String(id)}'`);
|
|
135
|
+
}
|
|
136
|
+
return typeResolver() as T;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
get<T extends Class>(type: T, id: ID = ''): InstanceType<T> {
|
|
140
|
+
const resolver = this.getClassIdResolver(type, id);
|
|
141
|
+
if (!resolver) {
|
|
142
|
+
throw new Error(`No Mapping for Type ${type.name}` + String(id === '' ? '' : ` with id: '${String(id)}'`));
|
|
143
|
+
}
|
|
144
|
+
return resolver() as InstanceType<T>;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
protected createInstance<T extends Class>(type: T) {
|
|
148
|
+
return this.getCreateInstanceResolver(type)();
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
protected createResolverArray(resolverContext: ResolverContext) {
|
|
152
|
+
const {type} = resolverContext;
|
|
153
|
+
const result: ResolverFunction[] = [];
|
|
154
|
+
const dependencies = Injector.dependencyMap.get(resolverContext.type);
|
|
155
|
+
if (!dependencies) {
|
|
156
|
+
return [];
|
|
157
|
+
}
|
|
158
|
+
for (const dependency of dependencies) {
|
|
159
|
+
let resolver: ResolverFunction;
|
|
160
|
+
if (isInjectDependency(dependency)) {
|
|
161
|
+
if (!dependency.type) throw new Error(`Undefined dependency type for ${type.name}. Check for circular dependency.`);
|
|
162
|
+
const classIdResolver = this.getClassIdResolver(dependency.type, dependency.id);
|
|
163
|
+
if (!classIdResolver) {
|
|
164
|
+
throw new Error(`Could not inject ${dependency.type.name} into ${resolverContext.type.name}`);
|
|
165
|
+
}
|
|
166
|
+
resolver = classIdResolver;
|
|
167
|
+
} else if (isTypeDependency(dependency)) {
|
|
168
|
+
const typeResolver = this.getTypeResolver(dependency.id);
|
|
169
|
+
if (!typeResolver) {
|
|
170
|
+
throw new Error(`Could not inject type with id '${String(dependency.id)}' into ${resolverContext.type.name}`);
|
|
171
|
+
}
|
|
172
|
+
resolver = typeResolver;
|
|
173
|
+
} else {
|
|
174
|
+
const extensionResolver = this.dependencyResolverExtensions.get(dependency.kind);
|
|
175
|
+
if (!extensionResolver) {
|
|
176
|
+
throw new Error(`no dependency resolver for '${dependency.kind}'`);
|
|
177
|
+
}
|
|
178
|
+
resolver = extensionResolver(resolverContext, dependency);
|
|
179
|
+
}
|
|
180
|
+
result[dependency.index] = resolver;
|
|
181
|
+
}
|
|
182
|
+
return result;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
protected getClassMapping(type: Class, id: ID): ClassMapping | undefined {
|
|
186
|
+
const idMapping = this.classMappings.get(type);
|
|
187
|
+
if (!idMapping) {
|
|
188
|
+
if (!this.parent) return undefined;
|
|
189
|
+
return this.parent.getClassMapping(type, id);
|
|
190
|
+
}
|
|
191
|
+
const mapping = id === '' ? idMapping.def : idMapping.map.get(id);
|
|
192
|
+
if (!mapping) {
|
|
193
|
+
if (!this.parent) return undefined;
|
|
194
|
+
return this.parent.getClassMapping(type, id);
|
|
195
|
+
}
|
|
196
|
+
return mapping;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
protected getClassIdResolver(dependencyType: Class, id: ID) {
|
|
200
|
+
const getResolver = (): ResolverFunction | undefined => {
|
|
201
|
+
const mapping = this.getClassMapping(dependencyType, id);
|
|
202
|
+
if (!mapping) return undefined;
|
|
203
|
+
switch (mapping.kind) {
|
|
204
|
+
case ClassMappingKind.INSTANCE:
|
|
205
|
+
return this.getCreateInstanceResolver(dependencyType);
|
|
206
|
+
case ClassMappingKind.VALUE:
|
|
207
|
+
// we can cache the value for values
|
|
208
|
+
const instance = mapping.value;
|
|
209
|
+
return () => instance;
|
|
210
|
+
case ClassMappingKind.SINGLETON:
|
|
211
|
+
let singleton: unknown;
|
|
212
|
+
// use the injector defined in the mapping to get the right injector
|
|
213
|
+
const singletonContainer = putIfAbsent(mapping.injector.singletons, dependencyType, (): SingletonContainer => ({map: new Map<ID, Object>()}));
|
|
214
|
+
if (id === '') {
|
|
215
|
+
if (singletonContainer.def) {
|
|
216
|
+
singleton = singletonContainer.def;
|
|
217
|
+
} else {
|
|
218
|
+
singletonContainer.def = mapping.injector.createInstance(dependencyType);
|
|
219
|
+
singleton = singletonContainer.def;
|
|
220
|
+
}
|
|
221
|
+
} else {
|
|
222
|
+
singleton = putIfAbsent(singletonContainer.map, id, () => mapping.injector.createInstance(dependencyType));
|
|
223
|
+
}
|
|
224
|
+
return () => singleton;
|
|
225
|
+
case ClassMappingKind.PROVIDER:
|
|
226
|
+
// we can directly set the provider function as resolver
|
|
227
|
+
return mapping.provider;
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
const container = putIfAbsent(this.classResolvers, dependencyType, (): ClassResolverContainer => ({
|
|
232
|
+
def: undefined,
|
|
233
|
+
map: new Map<ID, ResolverFunction>(),
|
|
234
|
+
}));
|
|
235
|
+
|
|
236
|
+
if (id === '') {
|
|
237
|
+
if (container.def) {
|
|
238
|
+
return container.def;
|
|
239
|
+
}
|
|
240
|
+
const resolver = getResolver();
|
|
241
|
+
container.def = resolver;
|
|
242
|
+
return resolver;
|
|
243
|
+
} else {
|
|
244
|
+
return putIfAbsent(container.map, id, () => getResolver());
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
protected getTypeResolver(id: ID): ResolverFunction | undefined {
|
|
249
|
+
return putIfAbsent(this.typeResolvers, id, () => {
|
|
250
|
+
const mapping = this.getTypeMapping(id);
|
|
251
|
+
if (!mapping) return undefined;
|
|
252
|
+
if (mapping.kind === undefined) {
|
|
253
|
+
// mapping.kind is undefined if there is a type mapping without a target (toClass, toSingleton, toValue)
|
|
254
|
+
throw new Error(`No TypeMapping for id ${String(id)}.`);
|
|
255
|
+
}
|
|
256
|
+
if (mapping.kind === TypeMappingKind.VALUE) {
|
|
257
|
+
const instance = mapping.value;
|
|
258
|
+
return () => instance;
|
|
259
|
+
} else if (mapping.kind === TypeMappingKind.CLASS) {
|
|
260
|
+
return this.getCreateInstanceResolver(mapping.type);
|
|
261
|
+
} else if (mapping.kind === TypeMappingKind.SINGLETON) {
|
|
262
|
+
// use the injector defined in the mapping to get the right injector
|
|
263
|
+
const instance = putIfAbsent(mapping.injector.typeSingletons, id, () => mapping.injector.createInstance(mapping.type));
|
|
264
|
+
return () => instance;
|
|
265
|
+
} else {
|
|
266
|
+
// mapping kind has to be provider
|
|
267
|
+
return mapping.provider;
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
protected getCreateInstanceResolver(type: Class) {
|
|
273
|
+
const resolvers = putIfAbsent(this.parameterResolverArrays, type as Class, () => this.createResolverArray({
|
|
274
|
+
kind: 'class',
|
|
275
|
+
type: type,
|
|
276
|
+
}));
|
|
277
|
+
if (resolvers.length === 0) {
|
|
278
|
+
return () => new type();
|
|
279
|
+
}
|
|
280
|
+
const args = new Array(resolvers.length);
|
|
281
|
+
return () => {
|
|
282
|
+
for (let i = 0; i < args.length; i++) {
|
|
283
|
+
args[i] = resolvers[i]();
|
|
284
|
+
}
|
|
285
|
+
return new type(...args);
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
protected getTypeMapping(id: ID): TypeMapping | undefined {
|
|
290
|
+
const mapping = this.typeMappings.get(id);
|
|
291
|
+
if (!mapping) {
|
|
292
|
+
if (!this.parent) return undefined;
|
|
293
|
+
return this.parent.getTypeMapping(id);
|
|
294
|
+
}
|
|
295
|
+
return mapping;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
class InternalTypeMapper<T> implements TypeMapper<T> {
|
|
300
|
+
mapping: TypeMapping = {kind: undefined};
|
|
301
|
+
|
|
302
|
+
constructor(private readonly injector: Injector) {
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
toClass<C extends Class<T>>(classValue: C): void {
|
|
306
|
+
Object.assign<TypeMapping, ClassTypeMapping>(this.mapping, {
|
|
307
|
+
kind: TypeMappingKind.CLASS,
|
|
308
|
+
type: classValue,
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
toSingleton<C extends Class<T>>(classValue: C): void {
|
|
313
|
+
Object.assign<TypeMapping, SingletonTypeMapping>(this.mapping, {
|
|
314
|
+
kind: TypeMappingKind.SINGLETON,
|
|
315
|
+
type: classValue,
|
|
316
|
+
injector: this.injector,
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
toValue(value: T): void {
|
|
321
|
+
Object.assign<TypeMapping, ValueTypeMapping>(this.mapping, {
|
|
322
|
+
kind: TypeMappingKind.VALUE,
|
|
323
|
+
value: value,
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
toProvider(provider: () => T): void {
|
|
328
|
+
Object.assign<TypeMapping, ProviderTypeMapping>(this.mapping, {
|
|
329
|
+
kind: TypeMappingKind.PROVIDER,
|
|
330
|
+
provider: provider,
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
class InternalClassMapper<T extends Class> implements ClassMapper<T> {
|
|
336
|
+
// instance is the default class mapping
|
|
337
|
+
mapping: ClassMapping = {kind: ClassMappingKind.INSTANCE};
|
|
338
|
+
|
|
339
|
+
constructor(private readonly injector: Injector) {}
|
|
340
|
+
|
|
341
|
+
toValue(value: InstanceType<T>) {
|
|
342
|
+
Object.assign<ClassMapping, ValueClassMapping>(this.mapping, {
|
|
343
|
+
kind: ClassMappingKind.VALUE,
|
|
344
|
+
value: value,
|
|
345
|
+
});
|
|
346
|
+
return value;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
toSingleton(): void {
|
|
350
|
+
Object.assign<ClassMapping, SingletonClassMapping>(this.mapping, {
|
|
351
|
+
kind: ClassMappingKind.SINGLETON,
|
|
352
|
+
injector: this.injector,
|
|
353
|
+
});
|
|
354
|
+
this.mapping.kind = ClassMappingKind.SINGLETON;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
toProvider(provider: () => InstanceType<T>): void {
|
|
358
|
+
Object.assign<ClassMapping, ProviderClassMapping>(this.mapping, {
|
|
359
|
+
kind: ClassMappingKind.PROVIDER,
|
|
360
|
+
provider: provider,
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {Class, EcsInjector, Signal, SignalBinding, SignalCallback} from '../index';
|
|
2
|
-
import {ID, putIfAbsent} from 'mani-injector';
|
|
3
2
|
import {signalHandlers} from '../ecsInjector';
|
|
3
|
+
import {ID, putIfAbsent} from '../injector';
|
|
4
4
|
|
|
5
5
|
export type ScopeSignalOptions = { keepAlive?: boolean | Scope[], group?: string }
|
|
6
6
|
|
package/src/types.ts
CHANGED
|
@@ -6,11 +6,11 @@ export interface System {
|
|
|
6
6
|
onStart?(): void;
|
|
7
7
|
onEnd?(): void;
|
|
8
8
|
onPreFixedUpdate?(time: number, deltaTime: number): void;
|
|
9
|
-
onEarlyUpdate?(time: number, deltaTime: number): void;
|
|
10
9
|
onFixedUpdate?(time: number, deltaTime: number): void;
|
|
11
10
|
onPhysicsUpdate?(time: number, deltaTime: number): void;
|
|
12
11
|
onUpdate?(time: number, deltaTime: number, alpha: number): void;
|
|
13
12
|
onLateUpdate?(time: number, deltaTime: number, alpha: number): void;
|
|
13
|
+
onPrePhysicsUpdate?(time: number, deltaTime: number): void;
|
|
14
14
|
onPostPhysicsUpdate?(time: number, deltaTime: number): void;
|
|
15
15
|
onLateFixedUpdate?(time: number, deltaTime: number): void;
|
|
16
16
|
onRender?(time: number, deltaTime: number, alpha: number): void;
|
|
@@ -31,6 +31,7 @@ export interface Service {
|
|
|
31
31
|
onLateFixedUpdate?(time: number, deltaTime: number): void;
|
|
32
32
|
onFixedUpdate?(time: number, deltaTime: number): void;
|
|
33
33
|
onPhysicsUpdate?(time: number, deltaTime: number): void;
|
|
34
|
+
onPrePhysicsUpdate?(time: number, deltaTime: number): void;
|
|
34
35
|
onUpdate?(time: number, deltaTime: number, alpha: number): void;
|
|
35
36
|
onLateUpdate?(time: number, deltaTime: number, alpha: number): void;
|
|
36
37
|
onRender?(time: number, deltaTime: number, alpha: number): void;
|
|
@@ -76,9 +77,11 @@ export const EngineSignals = {
|
|
|
76
77
|
OnUpdate: Symbol('OnUpdate'),
|
|
77
78
|
OnLateUpdate: Symbol('OnLateUpdate'),
|
|
78
79
|
OnFixedUpdate: Symbol('OnFixedUpdate'),
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
80
|
+
OnPreFixedUpdate: Symbol('OnPreFixedUpdate'),
|
|
81
|
+
OnPrePhysicsUpdate: Symbol('OnPrePhysicsUpdate'),
|
|
82
|
+
OnPhysicsUpdate: Symbol('OnPhysicsUpdate'),
|
|
83
|
+
OnPostPhysicsUpdate: Symbol('OnPostPhysicsUpdate'),
|
|
84
|
+
onLateFixedUpdate: Symbol('onLateFixedUpdate'),
|
|
82
85
|
OnRender: Symbol('OnRender'),
|
|
83
86
|
OnPrepare: Symbol('OnPrepare'),
|
|
84
87
|
};
|