Skip to content

Commit 63def22

Browse files
committed
Add a generic type to engine which informs the additional attributes, to help pass context throughout the game
1 parent cf37c26 commit 63def22

File tree

4 files changed

+41
-134
lines changed

4 files changed

+41
-134
lines changed

src/engine.ts

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,21 @@ export type EngineComputedValues = {
1919
projectionMatrix: number[];
2020
} & Record<string, any>;
2121

22-
export class Engine {
22+
export class Engine<T> {
2323
canvas: HTMLCanvasElement;
2424
gl: WebGLRenderingContext;
2525
id: number;
2626
lastTime: number;
27-
scenes: Scene[];
28-
activeScene: Scene;
27+
scenes: Scene<T>[];
28+
activeScene: Scene<T>;
2929
settings: {
3030
fov: number;
3131
zNear: number;
3232
zFar: number;
3333
fogColor: [number, number, number, number];
3434
fogDensity: number;
3535
};
36-
properties: Record<any, any>;
36+
properties: Partial<T>;
3737
readyState: ReadyState;
3838
onReadyChange?: (ready: ReadyState) => void;
3939
_debugLogs: string;
@@ -52,6 +52,8 @@ export class Engine {
5252
mousebutton: number;
5353
mousex: number;
5454
mousey: number;
55+
mouseClickDuration: number;
56+
private mouseClickStart: number;
5557

5658
// These need to be stored somewhere
5759
private keydownListener: any;
@@ -81,6 +83,8 @@ export class Engine {
8183
};
8284

8385
this.mousebutton = -1;
86+
this.mouseClickStart = -1;
87+
this.mouseClickDuration = 0;
8488
this.mousex = window.innerWidth / 2;
8589
this.mousey = window.innerHeight / 2;
8690
this.properties = {};
@@ -261,24 +265,34 @@ export class Engine {
261265

262266
_handleMouseDown(evt: MouseEvent) {
263267
if (this.activeScene) {
264-
this.activeScene.onClick?.call(this.activeScene);
268+
this.activeScene.onClick?.call(this.activeScene, this);
265269
}
266270

267271
if (evt.button === 2) {
268272
evt.preventDefault();
269273
evt.stopPropagation();
270274
this.keymap = {};
271275
}
276+
277+
this.mouseClickStart = new Date().getTime();
278+
this.mouseClickDuration = 0;
272279
}
273280

274-
_handleMouseUp(evt: MouseEvent) {}
281+
_handleMouseUp(evt: MouseEvent) {
282+
this.mouseClickDuration = new Date().getTime() - this.mouseClickStart;
283+
const { activeScene } = this;
284+
285+
if (activeScene && activeScene.onMouseUp) {
286+
activeScene.onMouseUp(this);
287+
}
288+
}
275289

276290
debug(str: string) {
277291
this._debugLogs += str;
278292
this._debugLogs += '\n';
279293
}
280294

281-
addScene(scene: Scene) {
295+
addScene(scene: Scene<T>) {
282296
scene.engine = this;
283297
this.scenes.push(scene);
284298
if (!this.activeScene) {

src/models.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ export type ProgramTemplate = {
1313
depthFunc: number;
1414
mode: number;
1515
};
16-
beforeDraw?: (engine: Engine) => void;
17-
afterDraw?: (engine: Engine) => void;
16+
beforeDraw?: (engine: Engine<unknown>) => void;
17+
afterDraw?: (engine: Engine<unknown>) => void;
1818
sceneDrawArgs?: {
1919
depthFunc: number;
2020
mode: number;
@@ -29,20 +29,20 @@ export type ProgramTemplate = {
2929
components: number;
3030
normalized: boolean;
3131
type: number;
32-
generateData: (engine: Engine) => BufferSource;
32+
generateData: (engine: Engine<unknown>) => BufferSource;
3333
}
3434
>;
3535
constantUniforms?: Record<
3636
string,
37-
(engine: Engine, loc: WebGLUniformLocation) => void
37+
(engine: Engine<unknown>, loc: WebGLUniformLocation) => void
3838
>;
3939
staticUniforms?: Record<
4040
string,
41-
(engine: Engine, loc: WebGLUniformLocation) => void
41+
(engine: Engine<unknown>, loc: WebGLUniformLocation) => void
4242
>;
4343
dynamicUniforms?: Record<
4444
string,
45-
(engine: Engine, loc: WebGLUniformLocation, obj: Obj3d) => void
45+
(engine: Engine<unknown>, loc: WebGLUniformLocation, obj: Obj3d) => void
4646
>;
4747
};
4848

@@ -70,8 +70,8 @@ export type Obj3d = {
7070
_computed?: {
7171
positionMatrix: number[];
7272
};
73-
update?: (time_t: number, engine: Engine) => void;
74-
beforeDraw?: (engine: Engine) => void;
73+
update?: (time_t: number, engine: Engine<unknown>) => void;
74+
beforeDraw?: (engine: Engine<unknown>) => void;
7575
} & Record<any, any>;
7676

7777
export type bbox = {

src/scene.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,18 @@ import type { Engine } from './engine';
33
import type { Obj3d, ProgramTemplate } from './models';
44

55
export type SceneStatus = 'initializing' | 'ready';
6-
export class Scene {
6+
export class Scene<T> {
77
title: string;
88
visible: boolean;
99
status: SceneStatus;
1010
shaders: ProgramTemplate[];
1111
objects: Obj3d[];
1212
camera: Camera;
13-
engine: Engine;
14-
init?: (engine: Engine) => void;
15-
update: (time_t: number, engine: Engine) => void;
16-
onClick?: () => void;
13+
engine: Engine<T>;
14+
init?: (engine: Engine<T>) => void;
15+
update: (time_t: number, engine: Engine<T>) => void;
16+
onClick?: (engine: Engine<T>) => void;
17+
onMouseUp?: (engine: Engine<T>) => void;
1718

1819
constructor({
1920
title,
@@ -22,11 +23,13 @@ export class Scene {
2223
shaders,
2324
status,
2425
onClick,
26+
onMouseUp,
2527
}: {
2628
title: string;
27-
init?: (engine: Engine) => void;
28-
update: (time_t: number, engine: Engine) => void;
29-
onClick?: () => void;
29+
init?: (engine: Engine<T>) => void;
30+
update: (time_t: number, engine: Engine<T>) => void;
31+
onClick?: (engine: Engine<T>) => void;
32+
onMouseUp?: (engine: Engine<T>) => void;
3033
status?: SceneStatus;
3134
shaders: ProgramTemplate[];
3235
}) {
@@ -35,6 +38,7 @@ export class Scene {
3538
this.objects = [];
3639
this.update = update;
3740
this.onClick = onClick;
41+
this.onMouseUp = onMouseUp;
3842
this.shaders = shaders;
3943
this.init = init;
4044
this.status = status;

src/shaders.ts

Lines changed: 0 additions & 111 deletions
This file was deleted.

0 commit comments

Comments
 (0)