From b85a8867198880cb2acdc1823a6813e3a39836f3 Mon Sep 17 00:00:00 2001 From: Jack Le Hamster Date: Thu, 29 Feb 2024 12:43:17 -0800 Subject: [PATCH] Revert "Revert "TEST"" This reverts commit b365ed98c52a728b655298730136fc1052e2a99d. --- bun.lockb | Bin 247302 -> 245877 bytes example/dist/index.js | 43 ++++++++++++++++++---------- package.json | 4 +-- src/demo/DemoGame.ts | 6 +++- src/world/sprite/body/BodyModel.ts | 5 +--- src/world/sprite/body/IBodyModel.ts | 1 - 6 files changed, 36 insertions(+), 23 deletions(-) diff --git a/bun.lockb b/bun.lockb index 859d0a25c303ce69d0ebbc3f1e7e9c48a09baa32..2e9629c6093253876940d20ff95b9b47d6f0e613 100755 GIT binary patch delta 49488 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 D3.informUpdate(Q3, J)); }; @@ -46463,7 +46463,8 @@ class H2 extends X2 { #D; #J = new Map; #K = new O3; - #Q = new $2({ informUpdate: this.informUpdate.bind(this), addElem: this.#R.bind(this), removeElem: this.#V.bind(this) }); + #Q = new $2({ informUpdate: this.informUpdate.bind(this), addElem: this.#V.bind(this), removeElem: this.#W.bind(this) }); + #R = false; constructor({ onChange: D3 } = {}) { super(); this.#D = new B3({ onChange: D3 }); @@ -46472,6 +46473,8 @@ class H2 extends X2 { return this.#D.length; } at(D3) { + if (!this.#R) + return; const J = this.#D.at(D3); return J?.elems.at(J.index); } @@ -46490,15 +46493,23 @@ class H2 extends X2 { this.#K.recycle(D3); }), this.#D.clear(); } + activate() { + if (!this.#R) + this.#R = true, this.updateFully(); + } + deactivate() { + if (this.#R) + this.#R = false, this.updateFully(); + } updateFully(D3) { for (let [J, K2] of this.#J) R3(J, (Q3, V22) => K2.onUpdate(V22, D3)); } - #R(D3, J) { + #V(D3, J) { const K2 = this.#D.addElem(this.#K.create(D3, J)); return this.informUpdate(K2), K2; } - #V(D3) { + #W(D3) { const J = this.#D.removeElem(D3); if (J) this.#K.recycle(J), this.informUpdate(D3); @@ -46518,7 +46529,7 @@ class O3 extends W2 { } } -class _3 { +class Y { i; f; warningLimit = 50000; @@ -46556,7 +46567,7 @@ class _3 { console.warn("ObjectPool already created", this.#D.size + this.#J.length, "in", this.constructor.name); } } -var Y = -1; +var _3 = -1; class UpdateRegistry extends X2 { applyUpdate; @@ -47842,7 +47853,7 @@ class b2 extends I { } var U = [3, 3, 3]; -class h2 { +class E3 { cellTags = new R4(""); cellTrack; cellPool = new Q3; @@ -47904,7 +47915,7 @@ class G4 { } } -class E3 { +class h2 { minX; maxX; minY; @@ -47949,7 +47960,7 @@ class M2 { this.#H.recycle(Y2); } activate() { - this.#w.addChangeListener(this.#K), this.#m.pos[0] = Number.NaN, this.#m.pos[1] = Number.NaN, this.#m.pos[2] = Number.NaN, this.#J(this.#w); + this.#m.pos[0] = Number.NaN, this.#m.pos[1] = Number.NaN, this.#m.pos[2] = Number.NaN, this.#w.addChangeListener(this.#K), this.#J(this.#w); } deactivate() { this.#w.removeChangeListener(this.#K); @@ -48055,13 +48066,12 @@ var updateBodyRecord = function(record, accumulator, id, elems) { }; class BodyModel { - transform; sprites = new H2; colliders = new H2; #bodies = new H2; #spritesPerId = {}; #collidersPerId = {}; - constructor({ sprites, colliders, bodies, transform } = {}) { + constructor({ sprites, colliders, bodies } = {}) { this.#bodies.addUpdateListener({ onUpdate: (bodyId) => { const body = this.#bodies.at(bodyId); @@ -48078,7 +48088,6 @@ class BodyModel { if (bodies) { this.#bodies.add(bodies); } - this.transform = transform ?? d.IDENTITY; } addSprites(sprites) { this.sprites.add(sprites); @@ -48203,6 +48212,7 @@ class DemoGame extends AuxiliaryHolder { constructor({ engine, motor, ui, keyboard, controls }) { super(); const mediaAccumulator = new H2; + this.addAuxiliary(mediaAccumulator); this.addAuxiliary(new MediaUpdater({ engine, motor, medias: mediaAccumulator })); const mediaItems = new ItemsGroup([{ id: Assets.DOBUKI, @@ -48412,6 +48422,7 @@ class DemoGame extends AuxiliaryHolder { } }); const animationAccumulator = new H2; + this.addAuxiliary(animationAccumulator); this.addAuxiliary(new AnimationUpdater({ engine, motor, animations: animationAccumulator })); const animationItems = new ItemsGroup([{ id: Anims.STILL, @@ -48435,6 +48446,7 @@ class DemoGame extends AuxiliaryHolder { const spritesAccumulator = new H2({ onChange: (value) => engine.setMaxSpriteCount(value) }); + this.addAuxiliary(spritesAccumulator); this.addAuxiliary({ deactivate() { engine.setMaxSpriteCount(0); @@ -48452,6 +48464,7 @@ class DemoGame extends AuxiliaryHolder { const exitCell = N3(0, 0, 0, CELLSIZE); const exitPosition = exitCell.worldPosition; const worldColliders = new H2; + this.addAuxiliary(worldColliders); const heroBox = { top: 1, bottom: -1, @@ -48580,7 +48593,7 @@ class DemoGame extends AuxiliaryHolder { const spritesMap = new Map; const collidersMap = new Map; cellTrackers.add(P({ - trackCell: function(cell) { + trackCell: (cell) => { const rng2 = import_seedrandom.alea(cell.tag); const sprites = arrayPool.create(); const cellPos = cell.pos; @@ -48649,7 +48662,7 @@ class DemoGame extends AuxiliaryHolder { } }); } - }, new E3({ yRange: [0, 0] }))); + }, new h2({ yRange: [0, 0] }))); } worldColliders.add([ ...blockPositions.map((blockPosition) => new CollisionDetector({ @@ -48746,7 +48759,7 @@ class DemoGame extends AuxiliaryHolder { heroSprites.setAnimationId(animId); shadowHeroSprites.setAnimationId(animId); })); - const surroundingTracker = new h2({ cellTrack: cellTrackers }, { + const surroundingTracker = new E3({ cellTrack: cellTrackers }, { cellLimit: 200, range: [7, 3, 7], cellSize: CELLSIZE diff --git a/package.json b/package.json index 6a2391f..f274dd8 100644 --- a/package.json +++ b/package.json @@ -54,9 +54,9 @@ "typescript": "^5.2.2" }, "dependencies": { - "cell-tracker": "^1.0.20", + "cell-tracker": "^1.0.22", "gl-texture-manager": "^1.0.14", - "list-accumulator": "^1.0.9", + "list-accumulator": "^1.0.11", "seedrandom": "^3.0.5", "uuid": "^9.0.1" }, diff --git a/src/demo/DemoGame.ts b/src/demo/DemoGame.ts index 2420586..631129f 100644 --- a/src/demo/DemoGame.ts +++ b/src/demo/DemoGame.ts @@ -96,6 +96,7 @@ export class DemoGame extends AuxiliaryHolder { // * Each media is a texture that can be shown on a sprite. // * You can show videos, images, or you can have instructions to draw on a canvas. const mediaAccumulator = new Accumulator(); + this.addAuxiliary(mediaAccumulator); this.addAuxiliary(new MediaUpdater({ engine, motor, medias: mediaAccumulator })); const mediaItems = new ItemsGroup([{ id: Assets.DOBUKI, @@ -316,6 +317,7 @@ export class DemoGame extends AuxiliaryHolder { }); const animationAccumulator = new Accumulator(); + this.addAuxiliary(animationAccumulator); this.addAuxiliary(new AnimationUpdater({ engine, motor, animations: animationAccumulator })); const animationItems = new ItemsGroup([{ id: Anims.STILL, @@ -340,6 +342,7 @@ export class DemoGame extends AuxiliaryHolder { const spritesAccumulator = new Accumulator({ onChange: (value) => engine.setMaxSpriteCount(value), }); + this.addAuxiliary(spritesAccumulator); this.addAuxiliary({ deactivate() { engine.setMaxSpriteCount(0); @@ -359,6 +362,7 @@ export class DemoGame extends AuxiliaryHolder { const exitPosition = exitCell.worldPosition; const worldColliders = new Accumulator(); + this.addAuxiliary(worldColliders); const heroBox = { top: 1, @@ -518,7 +522,7 @@ export class DemoGame extends AuxiliaryHolder { const spritesMap = new Map(); const collidersMap = new Map(); cellTrackers.add(filter({ - trackCell: function (cell: Cell): boolean { + trackCell: (cell: Cell): boolean => { const rng = alea(cell.tag); const sprites: Sprite[] = arrayPool.create(); const cellPos = cell.pos; diff --git a/src/world/sprite/body/BodyModel.ts b/src/world/sprite/body/BodyModel.ts index 5976fd9..187d16f 100644 --- a/src/world/sprite/body/BodyModel.ts +++ b/src/world/sprite/body/BodyModel.ts @@ -8,18 +8,16 @@ interface Props { sprites: IPotentiallyUpdatableList; colliders: IPotentiallyUpdatableList; bodies: IPotentiallyUpdatableList; - transform: IMatrix; } export class BodyModel implements IBodyModel { - readonly transform: IMatrix; readonly sprites = new Accumulator(); readonly colliders = new Accumulator(); readonly #bodies = new Accumulator(); readonly #spritesPerId: Record> = {}; readonly #collidersPerId: Record> = {}; - constructor({ sprites, colliders, bodies, transform }: Partial = {}) { + constructor({ sprites, colliders, bodies }: Partial = {}) { this.#bodies.addUpdateListener({ onUpdate: (bodyId: IdType): void => { const body = this.#bodies.at(bodyId); @@ -36,7 +34,6 @@ export class BodyModel implements IBodyModel { if (bodies) { this.#bodies.add(bodies); } - this.transform = transform ?? Matrix.IDENTITY; } addSprites(sprites: IPotentiallyUpdatableList): void { diff --git a/src/world/sprite/body/IBodyModel.ts b/src/world/sprite/body/IBodyModel.ts index 3645d6d..4104a15 100644 --- a/src/world/sprite/body/IBodyModel.ts +++ b/src/world/sprite/body/IBodyModel.ts @@ -5,5 +5,4 @@ import { ICollisionDetector, IMatrix } from "dok-matrix"; export interface IBodyModel { readonly sprites: IUpdatableList; readonly colliders: IUpdatableList; - readonly transform: IMatrix; }