mani-game-engine 1.0.0-pre.58 → 1.0.0-pre.59
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/gameEngine.d.ts +4 -2
- package/lib/gameEngine.js +23 -3
- package/lib/gameEngine.js.map +1 -1
- package/package.json +1 -1
- package/src/gameEngine.ts +445 -421
package/lib/gameEngine.d.ts
CHANGED
|
@@ -44,8 +44,9 @@ export declare class GameEngine {
|
|
|
44
44
|
private readonly onAddEntitySet;
|
|
45
45
|
private readonly onRemoveEntitySet;
|
|
46
46
|
private readonly entitySystemMap;
|
|
47
|
-
private readonly
|
|
47
|
+
private readonly registeredServices;
|
|
48
48
|
private readonly services;
|
|
49
|
+
private readonly systemChildInjectors;
|
|
49
50
|
private framePromise;
|
|
50
51
|
private resolveFrame;
|
|
51
52
|
private addQueue;
|
|
@@ -60,7 +61,8 @@ export declare class GameEngine {
|
|
|
60
61
|
constructor(injector: EcsInjector<Class<System>>, clock: Clock);
|
|
61
62
|
static createDefault(options?: GameEngineOptions): GameEngine;
|
|
62
63
|
static createDefaultWithInjector(injector: EcsInjector<Class<System>>, options?: GameEngineOptions): GameEngine;
|
|
63
|
-
|
|
64
|
+
addServiceClass(serviceClass: Class<Service>, mapping?: (injector: EcsInjector) => void): Service;
|
|
65
|
+
private addService;
|
|
64
66
|
removeService(service: Service): void;
|
|
65
67
|
installPlugins(plugins: GameEnginePlugin[]): void;
|
|
66
68
|
registerSystem(systemClass: Class<System>): void;
|
package/lib/gameEngine.js
CHANGED
|
@@ -32,8 +32,9 @@ class GameEngine {
|
|
|
32
32
|
this.onAddEntitySet = new Set();
|
|
33
33
|
this.onRemoveEntitySet = new Set();
|
|
34
34
|
this.entitySystemMap = new Map();
|
|
35
|
-
this.
|
|
35
|
+
this.registeredServices = new Set();
|
|
36
36
|
this.services = [];
|
|
37
|
+
this.systemChildInjectors = new Map();
|
|
37
38
|
this.resolveFrame = () => undefined;
|
|
38
39
|
this.addQueue = [];
|
|
39
40
|
this.removeQueue = [];
|
|
@@ -81,6 +82,20 @@ class GameEngine {
|
|
|
81
82
|
engine.installPlugins(opts.plugins);
|
|
82
83
|
return engine;
|
|
83
84
|
}
|
|
85
|
+
addServiceClass(serviceClass, mapping) {
|
|
86
|
+
let childInjector;
|
|
87
|
+
if (mapping) {
|
|
88
|
+
childInjector = this.injector.createChild();
|
|
89
|
+
mapping(childInjector);
|
|
90
|
+
}
|
|
91
|
+
this.mapStaticAnnotatedSignals(serviceClass);
|
|
92
|
+
const service = (childInjector === null || childInjector === void 0 ? void 0 : childInjector.get(serviceClass)) || this.injector.get(serviceClass);
|
|
93
|
+
this.addService(service);
|
|
94
|
+
if (childInjector) {
|
|
95
|
+
this.systemChildInjectors.set(service, childInjector);
|
|
96
|
+
}
|
|
97
|
+
return service;
|
|
98
|
+
}
|
|
84
99
|
addService(service) {
|
|
85
100
|
this.mapAnnotatedSignals(service);
|
|
86
101
|
service.onStart && service.onStart();
|
|
@@ -115,6 +130,11 @@ class GameEngine {
|
|
|
115
130
|
service.onAddEntity && this.onAddEntitySet.delete(service);
|
|
116
131
|
service.onRemoveEntity && this.onRemoveEntitySet.delete(service);
|
|
117
132
|
service.onEnd && service.onEnd();
|
|
133
|
+
const childInjector = this.systemChildInjectors.get(service);
|
|
134
|
+
if (childInjector) {
|
|
135
|
+
childInjector.dispose();
|
|
136
|
+
this.systemChildInjectors.delete(service);
|
|
137
|
+
}
|
|
118
138
|
}
|
|
119
139
|
installPlugins(plugins) {
|
|
120
140
|
plugins.forEach(plugin => {
|
|
@@ -135,14 +155,14 @@ class GameEngine {
|
|
|
135
155
|
if (this._started)
|
|
136
156
|
throw new Error('Register Services before engine is started');
|
|
137
157
|
this.injector.map(serviceClass).toSingleton();
|
|
138
|
-
this.
|
|
158
|
+
this.registeredServices.add(serviceClass);
|
|
139
159
|
}
|
|
140
160
|
getService(serviceClass) {
|
|
141
161
|
return this.injector.get(serviceClass);
|
|
142
162
|
}
|
|
143
163
|
start() {
|
|
144
164
|
this._started = true;
|
|
145
|
-
for (const serviceClass of this.
|
|
165
|
+
for (const serviceClass of this.registeredServices) {
|
|
146
166
|
const service = this.injector.get(serviceClass);
|
|
147
167
|
this.addService(service);
|
|
148
168
|
}
|
package/lib/gameEngine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gameEngine.js","sourceRoot":"","sources":["../src/gameEngine.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"gameEngine.js","sourceRoot":"","sources":["../src/gameEngine.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/gameEngine.ts
CHANGED
|
@@ -10,15 +10,15 @@ type AddEntry = [Entity, () => void];
|
|
|
10
10
|
type RemoveEntry = [Entity, () => void];
|
|
11
11
|
|
|
12
12
|
const defaultOptions = {
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
fixedDeltaTime: 1 / 60,
|
|
14
|
+
plugins: [] as GameEnginePlugin[],
|
|
15
15
|
};
|
|
16
16
|
|
|
17
17
|
export type GameEngineOptions = Partial<typeof defaultOptions>;
|
|
18
18
|
declare global {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
interface GameEngineActions {
|
|
20
|
+
'testAction': string;
|
|
21
|
+
}
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
type GameEngineActionParams<K extends keyof GameEngineActions> = GameEngineActions[K];
|
|
@@ -26,455 +26,479 @@ type GameAction<K extends keyof GameEngineActions> = (engine: GameEngine, params
|
|
|
26
26
|
|
|
27
27
|
let id = 0;
|
|
28
28
|
export class GameEngine {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
private readonly onEarlyUpdateSet = new Set<System>();
|
|
45
|
-
private readonly onUpdateSet = new Set<System>();
|
|
46
|
-
private readonly onFixedUpdateSet = new Set<System>();
|
|
47
|
-
private readonly onPreFixedUpdateSet = new Set<System>();
|
|
48
|
-
private readonly onPhysicsUpdateSet = new Set<System>();
|
|
49
|
-
private readonly onPrePhysicsUpdateSet = new Set<System>();
|
|
50
|
-
private readonly onPostPhysicsUpdateSet = new Set<System>();
|
|
51
|
-
private readonly onLateFixedUpdateSet = new Set<System>();
|
|
52
|
-
private readonly onLateUpdateSet = new Set<System>();
|
|
53
|
-
private readonly onRenderUpdateSet = new Set<System>();
|
|
54
|
-
private readonly onAddEntitySet = new Set<System>();
|
|
55
|
-
private readonly onRemoveEntitySet = new Set<System>();
|
|
56
|
-
|
|
57
|
-
// TODO: for performance, we could store the systems directly in the entity
|
|
58
|
-
private readonly entitySystemMap = new Map<Entity, Set<SystemContext>>();
|
|
59
|
-
|
|
60
|
-
private readonly serviceClasses = new Set<Class<Service>>();
|
|
61
|
-
private readonly services: Service[] = [];
|
|
62
|
-
|
|
63
|
-
private framePromise!: Promise<any>;
|
|
64
|
-
private resolveFrame: () => void = () => undefined;
|
|
65
|
-
|
|
66
|
-
private addQueue: AddEntry[] = [];
|
|
67
|
-
private removeQueue: RemoveEntry[] = [];
|
|
68
|
-
|
|
69
|
-
private _started = false;
|
|
70
|
-
|
|
71
|
-
get started(): boolean { return this._started; }
|
|
72
|
-
|
|
73
|
-
private _frameCount = 0;
|
|
74
|
-
get frameCount(): number { return this._frameCount; }
|
|
75
|
-
|
|
76
|
-
private _fixedFrameCount = 0;
|
|
77
|
-
get fixedFrameCount(): number { return this._fixedFrameCount; }
|
|
78
|
-
|
|
79
|
-
get numEntities(): number { return this.entitySystemMap.size;}
|
|
29
|
+
readonly id = id++;
|
|
30
|
+
readonly onPrepare: Signal;
|
|
31
|
+
readonly onStart: Signal;
|
|
32
|
+
readonly onEnd: Signal;
|
|
33
|
+
readonly onRender: Signal<OnUpdateParams>;
|
|
34
|
+
readonly onUpdate: Signal<OnUpdateParams>;
|
|
35
|
+
readonly onFixedUpdate: Signal<OnFixedUpdateParams>;
|
|
36
|
+
readonly onPrePhysicsUpdate: Signal<OnFixedUpdateParams>;
|
|
37
|
+
readonly onPhysicsUpdate: Signal<OnFixedUpdateParams>;
|
|
38
|
+
readonly onPostPhysicsUpdate: Signal<OnFixedUpdateParams>;
|
|
39
|
+
readonly onLateFixedUpdate: Signal<OnFixedUpdateParams>;
|
|
40
|
+
readonly onLateUpdate: Signal<OnUpdateParams>;
|
|
41
|
+
readonly onAddEntity: Signal<Entity>;
|
|
42
|
+
readonly onRemoveEntity: Signal<Entity>;
|
|
80
43
|
|
|
81
|
-
|
|
82
|
-
|
|
44
|
+
private readonly onEarlyUpdateSet = new Set<System>();
|
|
45
|
+
private readonly onUpdateSet = new Set<System>();
|
|
46
|
+
private readonly onFixedUpdateSet = new Set<System>();
|
|
47
|
+
private readonly onPreFixedUpdateSet = new Set<System>();
|
|
48
|
+
private readonly onPhysicsUpdateSet = new Set<System>();
|
|
49
|
+
private readonly onPrePhysicsUpdateSet = new Set<System>();
|
|
50
|
+
private readonly onPostPhysicsUpdateSet = new Set<System>();
|
|
51
|
+
private readonly onLateFixedUpdateSet = new Set<System>();
|
|
52
|
+
private readonly onLateUpdateSet = new Set<System>();
|
|
53
|
+
private readonly onRenderUpdateSet = new Set<System>();
|
|
54
|
+
private readonly onAddEntitySet = new Set<System>();
|
|
55
|
+
private readonly onRemoveEntitySet = new Set<System>();
|
|
83
56
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
readonly clock: Clock,
|
|
87
|
-
) {
|
|
88
|
-
this.injector.map(GameEngine).toValue(this);
|
|
89
|
-
|
|
90
|
-
this.onPrepare = this.injector.getSignal(EngineSignals.OnPrepare);
|
|
91
|
-
this.onStart = this.injector.getSignal(EngineSignals.OnStart);
|
|
92
|
-
this.onEnd = this.injector.getSignal(EngineSignals.OnEnd);
|
|
93
|
-
this.onRender = this.injector.getSignal(EngineSignals.OnRender);
|
|
94
|
-
this.onFixedUpdate = this.injector.getSignal(EngineSignals.OnFixedUpdate);
|
|
95
|
-
this.onUpdate = this.injector.getSignal(EngineSignals.OnUpdate);
|
|
96
|
-
this.onLateUpdate = this.injector.getSignal(EngineSignals.OnLateUpdate);
|
|
97
|
-
this.onPrePhysicsUpdate = this.injector.getSignal(EngineSignals.OnPrePhysicsUpdate);
|
|
98
|
-
this.onPhysicsUpdate = this.injector.getSignal(EngineSignals.OnPhysicsUpdate);
|
|
99
|
-
this.onPostPhysicsUpdate = this.injector.getSignal(EngineSignals.OnPostPhysicsUpdate);
|
|
100
|
-
this.onLateFixedUpdate = this.injector.getSignal(EngineSignals.onLateFixedUpdate);
|
|
101
|
-
|
|
102
|
-
this.onAddEntity = this.injector.getSignal(EngineSignals.OnAddEntity);
|
|
103
|
-
this.onRemoveEntity = this.injector.getSignal(EngineSignals.OnRemoveEntity);
|
|
104
|
-
|
|
105
|
-
this.setupClock();
|
|
106
|
-
this.prepareFrame();
|
|
107
|
-
}
|
|
57
|
+
// TODO: for performance, we could store the systems directly in the entity
|
|
58
|
+
private readonly entitySystemMap = new Map<Entity, Set<SystemContext>>();
|
|
108
59
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
fixedDeltaTime: opts.fixedDeltaTime,
|
|
113
|
-
autoStart: false,
|
|
114
|
-
});
|
|
115
|
-
const injector = new EcsInjector<Class<System>>();
|
|
116
|
-
const engine = new GameEngine(injector, clock);
|
|
117
|
-
engine.installPlugins(opts.plugins);
|
|
118
|
-
return engine;
|
|
119
|
-
}
|
|
60
|
+
private readonly registeredServices = new Set<Class<Service>>();
|
|
61
|
+
private readonly services: Service[] = [];
|
|
62
|
+
private readonly systemChildInjectors = new Map<object, EcsInjector>();
|
|
120
63
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
const clock = new GameClock({
|
|
124
|
-
fixedDeltaTime: opts.fixedDeltaTime,
|
|
125
|
-
autoStart: false,
|
|
126
|
-
});
|
|
127
|
-
const engine = new GameEngine(injector, clock);
|
|
128
|
-
engine.installPlugins(opts.plugins);
|
|
129
|
-
return engine;
|
|
130
|
-
}
|
|
64
|
+
private framePromise!: Promise<any>;
|
|
65
|
+
private resolveFrame: () => void = () => undefined;
|
|
131
66
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
service.onStart && service.onStart();
|
|
135
|
-
service.onPreFixedUpdate && this.onPreFixedUpdateSet.add(service);
|
|
136
|
-
service.onFixedUpdate && this.onFixedUpdateSet.add(service);
|
|
137
|
-
service.onUpdate && this.onUpdateSet.add(service);
|
|
138
|
-
service.onLateUpdate && this.onLateUpdateSet.add(service);
|
|
139
|
-
service.onPrePhysicsUpdate && this.onPrePhysicsUpdateSet.add(service);
|
|
140
|
-
service.onPhysicsUpdate && this.onPhysicsUpdateSet.add(service);
|
|
141
|
-
service.onPostPhysicsUpdate && this.onPostPhysicsUpdateSet.add(service);
|
|
142
|
-
service.onLateFixedUpdate && this.onLateFixedUpdateSet.add(service);
|
|
143
|
-
service.onRender && this.onRenderUpdateSet.add(service);
|
|
144
|
-
service.onAddEntity && this.onAddEntitySet.add(service);
|
|
145
|
-
service.onRemoveEntity && this.onRemoveEntitySet.add(service);
|
|
146
|
-
this.services.push(service);
|
|
147
|
-
}
|
|
67
|
+
private addQueue: AddEntry[] = [];
|
|
68
|
+
private removeQueue: RemoveEntry[] = [];
|
|
148
69
|
|
|
149
|
-
|
|
150
|
-
const index = this.services.indexOf(service);
|
|
151
|
-
if (index === -1) return;
|
|
152
|
-
this.services.splice(index, 1);
|
|
153
|
-
this.unmapAnnotatedSignals(service);
|
|
154
|
-
service.onPreFixedUpdate && this.onPreFixedUpdateSet.delete(service);
|
|
155
|
-
service.onFixedUpdate && this.onFixedUpdateSet.delete(service);
|
|
156
|
-
service.onUpdate && this.onUpdateSet.delete(service);
|
|
157
|
-
service.onLateUpdate && this.onLateUpdateSet.delete(service);
|
|
158
|
-
service.onPrePhysicsUpdate && this.onPrePhysicsUpdateSet.delete(service);
|
|
159
|
-
service.onPhysicsUpdate && this.onPhysicsUpdateSet.delete(service);
|
|
160
|
-
service.onPostPhysicsUpdate && this.onPostPhysicsUpdateSet.delete(service);
|
|
161
|
-
service.onLateFixedUpdate && this.onLateFixedUpdateSet.delete(service);
|
|
162
|
-
service.onRender && this.onRenderUpdateSet.delete(service);
|
|
163
|
-
service.onAddEntity && this.onAddEntitySet.delete(service);
|
|
164
|
-
service.onRemoveEntity && this.onRemoveEntitySet.delete(service);
|
|
165
|
-
service.onEnd && service.onEnd();
|
|
166
|
-
}
|
|
70
|
+
private _started = false;
|
|
167
71
|
|
|
168
|
-
|
|
169
|
-
plugins.forEach(plugin => {
|
|
170
|
-
plugin.onPrepare && plugin.onPrepare(this);
|
|
171
|
-
});
|
|
172
|
-
plugins.forEach(plugin => {
|
|
173
|
-
plugin.onStart && plugin.onStart(this);
|
|
174
|
-
});
|
|
175
|
-
}
|
|
72
|
+
get started(): boolean { return this._started; }
|
|
176
73
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
if (this._started) throw new Error('Register Systems before engine is started');
|
|
180
|
-
this.injector.registerSystem(systemClass);
|
|
181
|
-
}
|
|
74
|
+
private _frameCount = 0;
|
|
75
|
+
get frameCount(): number { return this._frameCount; }
|
|
182
76
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
if (this._started) throw new Error('Register Services before engine is started');
|
|
186
|
-
this.injector.map(serviceClass).toSingleton();
|
|
187
|
-
this.serviceClasses.add(serviceClass);
|
|
188
|
-
}
|
|
77
|
+
private _fixedFrameCount = 0;
|
|
78
|
+
get fixedFrameCount(): number { return this._fixedFrameCount; }
|
|
189
79
|
|
|
190
|
-
|
|
191
|
-
return this.injector.get(serviceClass);
|
|
192
|
-
}
|
|
80
|
+
get numEntities(): number { return this.entitySystemMap.size;}
|
|
193
81
|
|
|
194
|
-
start() {
|
|
195
|
-
this._started = true;
|
|
196
|
-
//TODO: throw when registering services or systems when engine is running
|
|
197
|
-
for (const serviceClass of this.serviceClasses) {
|
|
198
|
-
const service = this.injector.get(serviceClass);
|
|
199
|
-
this.addService(service);
|
|
200
|
-
}
|
|
201
|
-
this.clock.start();
|
|
202
|
-
this.onStart.dispatch();
|
|
203
|
-
}
|
|
204
82
|
|
|
205
|
-
private setupClock() {
|
|
206
|
-
this.clock.onPrepare.add(this.prepareFrame, this);
|
|
207
|
-
|
|
208
|
-
this.clock.onEarlyUpdate.add(({time, deltaTime}) => {
|
|
209
|
-
for (const system of this.onEarlyUpdateSet) {
|
|
210
|
-
system.onEarlyUpdate!(time, deltaTime);
|
|
211
|
-
}
|
|
212
|
-
});
|
|
213
|
-
|
|
214
|
-
this.clock.onFixedUpdate.add((params) => {
|
|
215
|
-
const {time, deltaTime} = params;
|
|
216
|
-
for (const system of this.onPreFixedUpdateSet) {
|
|
217
|
-
system.onPreFixedUpdate!(time, deltaTime);
|
|
218
|
-
}
|
|
219
|
-
for (const system of this.onFixedUpdateSet) {
|
|
220
|
-
system.onFixedUpdate!(time, deltaTime);
|
|
221
|
-
}
|
|
222
|
-
this.onFixedUpdate.dispatch(params);
|
|
223
|
-
for (const system of this.onPhysicsUpdateSet) {
|
|
224
|
-
system.onPhysicsUpdate!(time, deltaTime);
|
|
225
|
-
}
|
|
226
|
-
this.onPhysicsUpdate.dispatch(params);
|
|
227
|
-
this.onPostPhysicsUpdate.dispatch(params);
|
|
228
|
-
for (const system of this.onPostPhysicsUpdateSet) {
|
|
229
|
-
system.onPostPhysicsUpdate!(time, deltaTime);
|
|
230
|
-
}
|
|
231
|
-
this.onLateFixedUpdate.dispatch(params);
|
|
232
|
-
for (const system of this.onLateFixedUpdateSet) {
|
|
233
|
-
system.onLateFixedUpdate!(time, deltaTime);
|
|
234
|
-
}
|
|
235
|
-
this._fixedFrameCount++;
|
|
236
|
-
});
|
|
237
|
-
|
|
238
|
-
// TODO: update from outside
|
|
239
|
-
this.clock.onUpdate.add(onUpdateParams => {
|
|
240
|
-
const {time, deltaTime, alpha} = onUpdateParams;
|
|
241
|
-
for (const system of this.onUpdateSet) {
|
|
242
|
-
system.onUpdate!(time, deltaTime, alpha);
|
|
243
|
-
}
|
|
244
|
-
//TODO: merge with framerate to single signal?
|
|
245
|
-
|
|
246
|
-
this.onUpdate.dispatch(onUpdateParams);
|
|
247
|
-
for (const system of this.onLateUpdateSet) {
|
|
248
|
-
system.onLateUpdate!(time, deltaTime, alpha);
|
|
249
|
-
}
|
|
250
|
-
this.onLateUpdate.dispatch(onUpdateParams);
|
|
251
|
-
|
|
252
|
-
for (const system of this.onRenderUpdateSet) {
|
|
253
|
-
system.onRender!(time, deltaTime, alpha);
|
|
254
|
-
}
|
|
255
|
-
this.onRender.dispatch(onUpdateParams);
|
|
256
|
-
this._frameCount++;
|
|
257
|
-
});
|
|
258
|
-
}
|
|
259
83
|
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
}
|
|
84
|
+
// TODO inject clock into game engine
|
|
85
|
+
// TODO inject space into game engine
|
|
263
86
|
|
|
264
|
-
|
|
265
|
-
|
|
87
|
+
constructor(
|
|
88
|
+
readonly injector: EcsInjector<Class<System>>,
|
|
89
|
+
readonly clock: Clock,
|
|
90
|
+
) {
|
|
91
|
+
this.injector.map(GameEngine).toValue(this);
|
|
92
|
+
|
|
93
|
+
this.onPrepare = this.injector.getSignal(EngineSignals.OnPrepare);
|
|
94
|
+
this.onStart = this.injector.getSignal(EngineSignals.OnStart);
|
|
95
|
+
this.onEnd = this.injector.getSignal(EngineSignals.OnEnd);
|
|
96
|
+
this.onRender = this.injector.getSignal(EngineSignals.OnRender);
|
|
97
|
+
this.onFixedUpdate = this.injector.getSignal(EngineSignals.OnFixedUpdate);
|
|
98
|
+
this.onUpdate = this.injector.getSignal(EngineSignals.OnUpdate);
|
|
99
|
+
this.onLateUpdate = this.injector.getSignal(EngineSignals.OnLateUpdate);
|
|
100
|
+
this.onPrePhysicsUpdate = this.injector.getSignal(EngineSignals.OnPrePhysicsUpdate);
|
|
101
|
+
this.onPhysicsUpdate = this.injector.getSignal(EngineSignals.OnPhysicsUpdate);
|
|
102
|
+
this.onPostPhysicsUpdate = this.injector.getSignal(EngineSignals.OnPostPhysicsUpdate);
|
|
103
|
+
this.onLateFixedUpdate = this.injector.getSignal(EngineSignals.onLateFixedUpdate);
|
|
104
|
+
|
|
105
|
+
this.onAddEntity = this.injector.getSignal(EngineSignals.OnAddEntity);
|
|
106
|
+
this.onRemoveEntity = this.injector.getSignal(EngineSignals.OnRemoveEntity);
|
|
107
|
+
|
|
108
|
+
this.setupClock();
|
|
109
|
+
this.prepareFrame();
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
static createDefault(options?: GameEngineOptions) {
|
|
113
|
+
const opts = {...defaultOptions, ...options};
|
|
114
|
+
const clock = new GameClock({
|
|
115
|
+
fixedDeltaTime: opts.fixedDeltaTime,
|
|
116
|
+
autoStart: false,
|
|
117
|
+
});
|
|
118
|
+
const injector = new EcsInjector<Class<System>>();
|
|
119
|
+
const engine = new GameEngine(injector, clock);
|
|
120
|
+
engine.installPlugins(opts.plugins);
|
|
121
|
+
return engine;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
static createDefaultWithInjector(injector: EcsInjector<Class<System>>, options?: GameEngineOptions) {
|
|
125
|
+
const opts = {...defaultOptions, ...options};
|
|
126
|
+
const clock = new GameClock({
|
|
127
|
+
fixedDeltaTime: opts.fixedDeltaTime,
|
|
128
|
+
autoStart: false,
|
|
129
|
+
});
|
|
130
|
+
const engine = new GameEngine(injector, clock);
|
|
131
|
+
engine.installPlugins(opts.plugins);
|
|
132
|
+
return engine;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// TODO: test
|
|
136
|
+
addServiceClass(serviceClass: Class<Service>, mapping?: (injector: EcsInjector) => void) {
|
|
137
|
+
let childInjector: EcsInjector | undefined;
|
|
138
|
+
if (mapping) {
|
|
139
|
+
childInjector = this.injector.createChild();
|
|
140
|
+
mapping(childInjector);
|
|
266
141
|
}
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
142
|
+
this.mapStaticAnnotatedSignals(serviceClass);
|
|
143
|
+
const service = childInjector?.get(serviceClass) || this.injector.get(serviceClass);
|
|
144
|
+
this.addService(service);
|
|
145
|
+
if (childInjector) {
|
|
146
|
+
this.systemChildInjectors.set(service, childInjector);
|
|
272
147
|
}
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
148
|
+
return service;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
private addService(service: Service): void {
|
|
152
|
+
this.mapAnnotatedSignals(service);
|
|
153
|
+
service.onStart && service.onStart();
|
|
154
|
+
service.onPreFixedUpdate && this.onPreFixedUpdateSet.add(service);
|
|
155
|
+
service.onFixedUpdate && this.onFixedUpdateSet.add(service);
|
|
156
|
+
service.onUpdate && this.onUpdateSet.add(service);
|
|
157
|
+
service.onLateUpdate && this.onLateUpdateSet.add(service);
|
|
158
|
+
service.onPrePhysicsUpdate && this.onPrePhysicsUpdateSet.add(service);
|
|
159
|
+
service.onPhysicsUpdate && this.onPhysicsUpdateSet.add(service);
|
|
160
|
+
service.onPostPhysicsUpdate && this.onPostPhysicsUpdateSet.add(service);
|
|
161
|
+
service.onLateFixedUpdate && this.onLateFixedUpdateSet.add(service);
|
|
162
|
+
service.onRender && this.onRenderUpdateSet.add(service);
|
|
163
|
+
service.onAddEntity && this.onAddEntitySet.add(service);
|
|
164
|
+
service.onRemoveEntity && this.onRemoveEntitySet.add(service);
|
|
165
|
+
this.services.push(service);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
removeService(service: Service): void {
|
|
169
|
+
const index = this.services.indexOf(service);
|
|
170
|
+
if (index === -1) return;
|
|
171
|
+
this.services.splice(index, 1);
|
|
172
|
+
this.unmapAnnotatedSignals(service);
|
|
173
|
+
service.onPreFixedUpdate && this.onPreFixedUpdateSet.delete(service);
|
|
174
|
+
service.onFixedUpdate && this.onFixedUpdateSet.delete(service);
|
|
175
|
+
service.onUpdate && this.onUpdateSet.delete(service);
|
|
176
|
+
service.onLateUpdate && this.onLateUpdateSet.delete(service);
|
|
177
|
+
service.onPrePhysicsUpdate && this.onPrePhysicsUpdateSet.delete(service);
|
|
178
|
+
service.onPhysicsUpdate && this.onPhysicsUpdateSet.delete(service);
|
|
179
|
+
service.onPostPhysicsUpdate && this.onPostPhysicsUpdateSet.delete(service);
|
|
180
|
+
service.onLateFixedUpdate && this.onLateFixedUpdateSet.delete(service);
|
|
181
|
+
service.onRender && this.onRenderUpdateSet.delete(service);
|
|
182
|
+
service.onAddEntity && this.onAddEntitySet.delete(service);
|
|
183
|
+
service.onRemoveEntity && this.onRemoveEntitySet.delete(service);
|
|
184
|
+
service.onEnd && service.onEnd();
|
|
185
|
+
const childInjector = this.systemChildInjectors.get(service);
|
|
186
|
+
if (childInjector) {
|
|
187
|
+
childInjector.dispose();
|
|
188
|
+
this.systemChildInjectors.delete(service);
|
|
277
189
|
}
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
installPlugins(plugins: GameEnginePlugin[]) {
|
|
193
|
+
plugins.forEach(plugin => {
|
|
194
|
+
plugin.onPrepare && plugin.onPrepare(this);
|
|
195
|
+
});
|
|
196
|
+
plugins.forEach(plugin => {
|
|
197
|
+
plugin.onStart && plugin.onStart(this);
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
registerSystem(systemClass: Class<System>): void {
|
|
202
|
+
this.mapStaticAnnotatedSignals(systemClass);
|
|
203
|
+
if (this._started) throw new Error('Register Systems before engine is started');
|
|
204
|
+
this.injector.registerSystem(systemClass);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
registerService(serviceClass: Class<Service>): void {
|
|
208
|
+
this.mapStaticAnnotatedSignals(serviceClass);
|
|
209
|
+
if (this._started) throw new Error('Register Services before engine is started');
|
|
210
|
+
this.injector.map(serviceClass).toSingleton();
|
|
211
|
+
this.registeredServices.add(serviceClass);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
getService<T extends Class<Service>>(serviceClass: T): InstanceType<T> {
|
|
215
|
+
return this.injector.get(serviceClass);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
start() {
|
|
219
|
+
this._started = true;
|
|
220
|
+
//TODO: throw when registering services or systems when engine is running
|
|
221
|
+
for (const serviceClass of this.registeredServices) {
|
|
222
|
+
const service = this.injector.get(serviceClass);
|
|
223
|
+
this.addService(service);
|
|
281
224
|
}
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
225
|
+
this.clock.start();
|
|
226
|
+
this.onStart.dispatch();
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
private setupClock() {
|
|
230
|
+
this.clock.onPrepare.add(this.prepareFrame, this);
|
|
231
|
+
|
|
232
|
+
this.clock.onEarlyUpdate.add(({time, deltaTime}) => {
|
|
233
|
+
for (const system of this.onEarlyUpdateSet) {
|
|
234
|
+
system.onEarlyUpdate!(time, deltaTime);
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
this.clock.onFixedUpdate.add((params) => {
|
|
239
|
+
const {time, deltaTime} = params;
|
|
240
|
+
for (const system of this.onPreFixedUpdateSet) {
|
|
241
|
+
system.onPreFixedUpdate!(time, deltaTime);
|
|
242
|
+
}
|
|
243
|
+
for (const system of this.onFixedUpdateSet) {
|
|
244
|
+
system.onFixedUpdate!(time, deltaTime);
|
|
245
|
+
}
|
|
246
|
+
this.onFixedUpdate.dispatch(params);
|
|
247
|
+
for (const system of this.onPhysicsUpdateSet) {
|
|
248
|
+
system.onPhysicsUpdate!(time, deltaTime);
|
|
249
|
+
}
|
|
250
|
+
this.onPhysicsUpdate.dispatch(params);
|
|
251
|
+
this.onPostPhysicsUpdate.dispatch(params);
|
|
252
|
+
for (const system of this.onPostPhysicsUpdateSet) {
|
|
253
|
+
system.onPostPhysicsUpdate!(time, deltaTime);
|
|
254
|
+
}
|
|
255
|
+
this.onLateFixedUpdate.dispatch(params);
|
|
256
|
+
for (const system of this.onLateFixedUpdateSet) {
|
|
257
|
+
system.onLateFixedUpdate!(time, deltaTime);
|
|
258
|
+
}
|
|
259
|
+
this._fixedFrameCount++;
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
// TODO: update from outside
|
|
263
|
+
this.clock.onUpdate.add(onUpdateParams => {
|
|
264
|
+
const {time, deltaTime, alpha} = onUpdateParams;
|
|
265
|
+
for (const system of this.onUpdateSet) {
|
|
266
|
+
system.onUpdate!(time, deltaTime, alpha);
|
|
267
|
+
}
|
|
268
|
+
//TODO: merge with framerate to single signal?
|
|
269
|
+
|
|
270
|
+
this.onUpdate.dispatch(onUpdateParams);
|
|
271
|
+
for (const system of this.onLateUpdateSet) {
|
|
272
|
+
system.onLateUpdate!(time, deltaTime, alpha);
|
|
273
|
+
}
|
|
274
|
+
this.onLateUpdate.dispatch(onUpdateParams);
|
|
275
|
+
|
|
276
|
+
for (const system of this.onRenderUpdateSet) {
|
|
277
|
+
system.onRender!(time, deltaTime, alpha);
|
|
278
|
+
}
|
|
279
|
+
this.onRender.dispatch(onUpdateParams);
|
|
280
|
+
this._frameCount++;
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
add(entity: Entity) {
|
|
285
|
+
return new Promise<void>(resolve => this.addQueue.push([entity, resolve]));
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
waitFrame() {
|
|
289
|
+
return this.framePromise;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
async remove(entity: Entity) {
|
|
293
|
+
if ((<any>entity).markRemoval) return;
|
|
294
|
+
(<any>entity).markRemoval = true;
|
|
295
|
+
return new Promise<void>(resolve => this.removeQueue.push([entity, resolve]));
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
stop() {
|
|
299
|
+
// this.injector.dispose();
|
|
300
|
+
this.clock.stop();
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
runAction<T extends Action>(action: T): ReturnType<T> {
|
|
304
|
+
return action(this);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
getSignal<T>(signalId: ID): Signal<T> {
|
|
308
|
+
return this.injector.getSignal<T>(signalId);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
private signalMappings = new Map<Class, [string, Signal][]>();
|
|
312
|
+
private staticSignalMappings = new Map<Class, [string, Signal][]>();
|
|
313
|
+
private signalMapBindings = new Map<Object, SignalBinding[]>();
|
|
314
|
+
|
|
315
|
+
// TODO: staticSignalMapBindings needed if we want to unregister Services or Systems
|
|
316
|
+
|
|
317
|
+
private mapStaticAnnotatedSignals(target: Class) {
|
|
318
|
+
let staticSignalMap = this.getStaticSignalMap(target);
|
|
319
|
+
if (staticSignalMap.length === 0) return;
|
|
320
|
+
|
|
321
|
+
const bindings = [];
|
|
322
|
+
for (const [key, signal] of staticSignalMap) {
|
|
323
|
+
bindings.push(signal.add((<any>target)[key], target));
|
|
285
324
|
}
|
|
325
|
+
// TODO: ignore bindings for now (store them if we implement unregister Service or Systems
|
|
326
|
+
}
|
|
286
327
|
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
328
|
+
private mapAnnotatedSignals(target: Object) {
|
|
329
|
+
const signalMap = this.getSignalMap(target.constructor);
|
|
330
|
+
if (signalMap.length === 0) return;
|
|
290
331
|
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
let staticSignalMap = this.getStaticSignalMap(target);
|
|
295
|
-
if (staticSignalMap.length === 0) return;
|
|
296
|
-
|
|
297
|
-
const bindings = [];
|
|
298
|
-
for (const [key, signal] of staticSignalMap) {
|
|
299
|
-
bindings.push(signal.add((<any>target)[key], target));
|
|
300
|
-
}
|
|
301
|
-
// TODO: ignore bindings for now (store them if we implement unregister Service or Systems
|
|
332
|
+
const bindings = [];
|
|
333
|
+
for (const [key, signal] of signalMap) {
|
|
334
|
+
bindings.push(signal.add((<any>target)[key], target));
|
|
302
335
|
}
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
}
|
|
312
|
-
this.signalMapBindings.set(target, bindings);
|
|
336
|
+
this.signalMapBindings.set(target, bindings);
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
private unmapAnnotatedSignals(target: Object) {
|
|
340
|
+
const signalBindings = this.signalMapBindings.get(target);
|
|
341
|
+
if (!signalBindings) return;
|
|
342
|
+
for (const binding of signalBindings) {
|
|
343
|
+
binding.detach();
|
|
313
344
|
}
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
private getSignalMap(target: Function) {
|
|
348
|
+
// TODO: we could speed thinks up by introducing "invisible" flags on the systems/services to avoid a map check
|
|
349
|
+
return putIfAbsent(this.signalMappings, target, (): [string, Signal][] => {
|
|
350
|
+
const handlers = signalHandlers.get(target);
|
|
351
|
+
if (!handlers) return [];
|
|
352
|
+
const result: [string, Signal][] = [];
|
|
353
|
+
for (const [key, signalId] of handlers) {
|
|
354
|
+
result.push([key, this.getSignal(signalId)]);
|
|
355
|
+
}
|
|
356
|
+
return result;
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
private getStaticSignalMap(target: Class) {
|
|
361
|
+
// TODO: we could speed thinks up by introducing "invisible" flags on the systems/services to avoid a map check
|
|
362
|
+
return putIfAbsent(this.staticSignalMappings, target, (): [string, Signal][] => {
|
|
363
|
+
const handlers = staticSignalHandlers.get(target);
|
|
364
|
+
if (!handlers) return [];
|
|
365
|
+
const result: [string, Signal][] = [];
|
|
366
|
+
for (const [key, signalId] of handlers) {
|
|
367
|
+
result.push([key, this.getSignal(signalId)]);
|
|
368
|
+
}
|
|
369
|
+
return result;
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
dispose() {
|
|
374
|
+
this.clock.stop();
|
|
375
|
+
this.clock.dispose();
|
|
376
|
+
for (const systems of this.entitySystemMap.values()) {
|
|
377
|
+
for (const system of systems) {
|
|
378
|
+
system.system.onEnd && system.system.onEnd();
|
|
379
|
+
}
|
|
321
380
|
}
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
// TODO: we could speed thinks up by introducing "invisible" flags on the systems/services to avoid a map check
|
|
325
|
-
return putIfAbsent(this.signalMappings, target, (): [string, Signal][] => {
|
|
326
|
-
const handlers = signalHandlers.get(target);
|
|
327
|
-
if (!handlers) return [];
|
|
328
|
-
const result: [string, Signal][] = [];
|
|
329
|
-
for (const [key, signalId] of handlers) {
|
|
330
|
-
result.push([key, this.getSignal(signalId)]);
|
|
331
|
-
}
|
|
332
|
-
return result;
|
|
333
|
-
});
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
private getStaticSignalMap(target: Class) {
|
|
337
|
-
// TODO: we could speed thinks up by introducing "invisible" flags on the systems/services to avoid a map check
|
|
338
|
-
return putIfAbsent(this.staticSignalMappings, target, (): [string, Signal][] => {
|
|
339
|
-
const handlers = staticSignalHandlers.get(target);
|
|
340
|
-
if (!handlers) return [];
|
|
341
|
-
const result: [string, Signal][] = [];
|
|
342
|
-
for (const [key, signalId] of handlers) {
|
|
343
|
-
result.push([key, this.getSignal(signalId)]);
|
|
344
|
-
}
|
|
345
|
-
return result;
|
|
346
|
-
});
|
|
381
|
+
for (const service of this.services) {
|
|
382
|
+
service.onEnd && service.onEnd();
|
|
347
383
|
}
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
384
|
+
this.onEnd.dispatch();
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
private prepareFrame() {
|
|
388
|
+
for (const [entity, resolve] of this.removeQueue) {
|
|
389
|
+
const entities = entity.getAllEntities();
|
|
390
|
+
for (const entity of entities) {
|
|
391
|
+
(<any>entity).markRemoval = false;
|
|
392
|
+
if (!(<any>entity).gameEngine) {
|
|
393
|
+
console.log('Entity not active', entity);
|
|
394
|
+
// throw new Error('Entity not active');
|
|
356
395
|
}
|
|
357
|
-
|
|
358
|
-
|
|
396
|
+
(<any>entity).gameEngine = undefined;
|
|
397
|
+
|
|
398
|
+
const systemContexts = this.entitySystemMap.get(entity);
|
|
399
|
+
this.entitySystemMap.delete(entity);
|
|
400
|
+
if (systemContexts) {
|
|
401
|
+
for (const context of systemContexts) {
|
|
402
|
+
this.disposeContext(context);
|
|
403
|
+
}
|
|
359
404
|
}
|
|
360
|
-
|
|
361
|
-
|
|
405
|
+
entity.onRemove.dispatch();
|
|
406
|
+
entity.onRemove.detachAll();
|
|
407
|
+
entity._signalMap.forEach(signal => signal.detachAll());
|
|
362
408
|
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
const entities = entity.getAllEntities();
|
|
366
|
-
for (const entity of entities) {
|
|
367
|
-
(<any>entity).markRemoval = false;
|
|
368
|
-
if (!(<any>entity).gameEngine) {
|
|
369
|
-
console.log('Entity not active', entity);
|
|
370
|
-
// throw new Error('Entity not active');
|
|
371
|
-
}
|
|
372
|
-
(<any>entity).gameEngine = undefined;
|
|
373
|
-
|
|
374
|
-
const systemContexts = this.entitySystemMap.get(entity);
|
|
375
|
-
this.entitySystemMap.delete(entity);
|
|
376
|
-
if (systemContexts) {
|
|
377
|
-
for (const context of systemContexts) {
|
|
378
|
-
this.disposeContext(context);
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
entity.onRemove.dispatch();
|
|
382
|
-
entity.onRemove.detachAll();
|
|
383
|
-
entity._signalMap.forEach(signal => signal.detachAll());
|
|
384
|
-
|
|
385
|
-
for (const system of this.onRemoveEntitySet) {
|
|
386
|
-
system.onRemoveEntity!(entity);
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
resolve();
|
|
391
|
-
}
|
|
392
|
-
this.removeQueue = [];
|
|
393
|
-
|
|
394
|
-
for (const [entity, resolve] of this.addQueue) {
|
|
395
|
-
|
|
396
|
-
const preparePromises = [];
|
|
397
|
-
const nextSystemContexts: SystemContext[] = [];
|
|
398
|
-
const entities = entity.getAllEntities();
|
|
399
|
-
for (const entity of entities) {
|
|
400
|
-
if ((<any>entity).gameEngine) throw new Error('Entity already added to a gameEngine');
|
|
401
|
-
(<any>entity).gameEngine = this;
|
|
402
|
-
const systemContexts = this.injector.createSystemsForEntity(entity);
|
|
403
|
-
for (const context of systemContexts) {
|
|
404
|
-
// TODO: implement synced mode where async onPrepares aren't allowed
|
|
405
|
-
context.system.onPrepare && preparePromises.push(context.system.onPrepare());
|
|
406
|
-
nextSystemContexts.push(context);
|
|
407
|
-
}
|
|
408
|
-
this.entitySystemMap.set(entity, systemContexts);
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
const entityWasAdded = () => {
|
|
412
|
-
for (const system of this.onAddEntitySet) {
|
|
413
|
-
system.onAddEntity!(entity);
|
|
414
|
-
}
|
|
415
|
-
resolve();
|
|
416
|
-
};
|
|
417
|
-
|
|
418
|
-
// Promise.all doesnt resolve immediately when there are no promises bu
|
|
419
|
-
if (preparePromises.length === 0) {
|
|
420
|
-
this.startSystems(nextSystemContexts, entityWasAdded);
|
|
421
|
-
} else {
|
|
422
|
-
Promise.all(preparePromises).then(() => this.startSystems(nextSystemContexts, entityWasAdded));
|
|
423
|
-
}
|
|
409
|
+
for (const system of this.onRemoveEntitySet) {
|
|
410
|
+
system.onRemoveEntity!(entity);
|
|
424
411
|
}
|
|
425
|
-
|
|
426
|
-
// create promise for next frame
|
|
427
|
-
this.resolveFrame();
|
|
428
|
-
this.framePromise = new Promise<void>(resolve => {
|
|
429
|
-
this.resolveFrame = resolve;
|
|
430
|
-
});
|
|
431
|
-
this.onPrepare.dispatch();
|
|
432
|
-
}
|
|
412
|
+
}
|
|
433
413
|
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
then?.();
|
|
452
|
-
};
|
|
453
|
-
|
|
454
|
-
private disposeContext(context: SystemContext<System>) {
|
|
455
|
-
const system = context.system;
|
|
456
|
-
|
|
457
|
-
// if onEnd returns a promise, we need to wait for it to finish before we can dispose the system
|
|
458
|
-
const onEndPromise = system.onEnd && system.onEnd();
|
|
459
|
-
if (onEndPromise instanceof Promise) {
|
|
460
|
-
onEndPromise.then(() => {
|
|
461
|
-
context.dispose();
|
|
462
|
-
});
|
|
463
|
-
} else {
|
|
464
|
-
context.dispose();
|
|
414
|
+
resolve();
|
|
415
|
+
}
|
|
416
|
+
this.removeQueue = [];
|
|
417
|
+
|
|
418
|
+
for (const [entity, resolve] of this.addQueue) {
|
|
419
|
+
|
|
420
|
+
const preparePromises = [];
|
|
421
|
+
const nextSystemContexts: SystemContext[] = [];
|
|
422
|
+
const entities = entity.getAllEntities();
|
|
423
|
+
for (const entity of entities) {
|
|
424
|
+
if ((<any>entity).gameEngine) throw new Error('Entity already added to a gameEngine');
|
|
425
|
+
(<any>entity).gameEngine = this;
|
|
426
|
+
const systemContexts = this.injector.createSystemsForEntity(entity);
|
|
427
|
+
for (const context of systemContexts) {
|
|
428
|
+
// TODO: implement synced mode where async onPrepares aren't allowed
|
|
429
|
+
context.system.onPrepare && preparePromises.push(context.system.onPrepare());
|
|
430
|
+
nextSystemContexts.push(context);
|
|
465
431
|
}
|
|
432
|
+
this.entitySystemMap.set(entity, systemContexts);
|
|
433
|
+
}
|
|
466
434
|
|
|
467
|
-
|
|
468
|
-
system
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
435
|
+
const entityWasAdded = () => {
|
|
436
|
+
for (const system of this.onAddEntitySet) {
|
|
437
|
+
system.onAddEntity!(entity);
|
|
438
|
+
}
|
|
439
|
+
resolve();
|
|
440
|
+
};
|
|
441
|
+
|
|
442
|
+
// Promise.all doesnt resolve immediately when there are no promises bu
|
|
443
|
+
if (preparePromises.length === 0) {
|
|
444
|
+
this.startSystems(nextSystemContexts, entityWasAdded);
|
|
445
|
+
} else {
|
|
446
|
+
Promise.all(preparePromises).then(() => this.startSystems(nextSystemContexts, entityWasAdded));
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
this.addQueue = [];
|
|
450
|
+
// create promise for next frame
|
|
451
|
+
this.resolveFrame();
|
|
452
|
+
this.framePromise = new Promise<void>(resolve => {
|
|
453
|
+
this.resolveFrame = resolve;
|
|
454
|
+
});
|
|
455
|
+
this.onPrepare.dispatch();
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
private startSystems(contexts: Iterable<SystemContext>, then?: () => void) {
|
|
459
|
+
for (const context of contexts) {
|
|
460
|
+
const system = context.system;
|
|
461
|
+
this.mapAnnotatedSignals(system);
|
|
462
|
+
system.onStart && system.onStart();
|
|
463
|
+
system.onPreFixedUpdate && this.onPreFixedUpdateSet.add(system);
|
|
464
|
+
system.onFixedUpdate && this.onFixedUpdateSet.add(system);
|
|
465
|
+
system.onUpdate && this.onUpdateSet.add(system);
|
|
466
|
+
system.onLateUpdate && this.onLateUpdateSet.add(system);
|
|
467
|
+
system.onPhysicsUpdate && this.onPhysicsUpdateSet.add(system);
|
|
468
|
+
system.onPrePhysicsUpdate && this.onPrePhysicsUpdateSet.add(system);
|
|
469
|
+
system.onPostPhysicsUpdate && this.onPostPhysicsUpdateSet.add(system);
|
|
470
|
+
system.onLateFixedUpdate && this.onLateFixedUpdateSet.add(system);
|
|
471
|
+
system.onRender && this.onRenderUpdateSet.add(system);
|
|
472
|
+
system.onAddEntity && this.onAddEntitySet.add(system);
|
|
473
|
+
system.onRemoveEntity && this.onRemoveEntitySet.add(system);
|
|
477
474
|
}
|
|
475
|
+
then?.();
|
|
476
|
+
};
|
|
477
|
+
|
|
478
|
+
private disposeContext(context: SystemContext<System>) {
|
|
479
|
+
const system = context.system;
|
|
480
|
+
|
|
481
|
+
// if onEnd returns a promise, we need to wait for it to finish before we can dispose the system
|
|
482
|
+
const onEndPromise = system.onEnd && system.onEnd();
|
|
483
|
+
if (onEndPromise instanceof Promise) {
|
|
484
|
+
onEndPromise.then(() => {
|
|
485
|
+
context.dispose();
|
|
486
|
+
});
|
|
487
|
+
} else {
|
|
488
|
+
context.dispose();
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
this.unmapAnnotatedSignals(system);
|
|
492
|
+
system.onPreFixedUpdate && this.onPreFixedUpdateSet.delete(system);
|
|
493
|
+
system.onFixedUpdate && this.onFixedUpdateSet.delete(system);
|
|
494
|
+
system.onUpdate && this.onUpdateSet.delete(system);
|
|
495
|
+
system.onLateUpdate && this.onLateUpdateSet.delete(system);
|
|
496
|
+
system.onPhysicsUpdate && this.onPhysicsUpdateSet.delete(system);
|
|
497
|
+
system.onPrePhysicsUpdate && this.onPrePhysicsUpdateSet.delete(system);
|
|
498
|
+
system.onPostPhysicsUpdate && this.onPostPhysicsUpdateSet.delete(system);
|
|
499
|
+
system.onLateFixedUpdate && this.onLateFixedUpdateSet.delete(system);
|
|
500
|
+
system.onRender && this.onRenderUpdateSet.delete(system);
|
|
501
|
+
}
|
|
478
502
|
}
|
|
479
503
|
//
|
|
480
504
|
// type RunSpread<T> = T extends undefined
|