From 6f7a8cc3d2826e36e40d36d18ed1b1a5cfdb5582 Mon Sep 17 00:00:00 2001 From: Peaceultime Date: Tue, 18 Jun 2024 14:11:23 +0200 Subject: [PATCH] Update asset to add shear to matrix --- src/assets/asset.class.ts | 48 +++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/src/assets/asset.class.ts b/src/assets/asset.class.ts index 2e7b322..f163d8c 100644 --- a/src/assets/asset.class.ts +++ b/src/assets/asset.class.ts @@ -29,7 +29,7 @@ export default class Asset #index: number; #quad?: number; - static instance: Three.InstancedMesh = new Three.InstancedMesh(CONST.QUAD, new Three.MeshBasicMaterial({ color: new Three.Color(0xffffff) }), 1000000); + static instance: Three.InstancedMesh = new Three.InstancedMesh(CONST.QUAD, new Three.MeshBasicMaterial({ color: new Three.Color(0xffffff), side: Three.DoubleSide }), 1000000); static quadtree: Quadtree = new Quadtree({ x1: -CONST.RESOLUTION_X / 2, x2: CONST.RESOLUTION_X / 2, y1: -CONST.RESOLUTION_Y / 2, y2: CONST.RESOLUTION_Y / 2 }, 6, 10); static assets: FreeList = new FreeList(); @@ -45,8 +45,8 @@ export default class Asset this.#scaleX = _scale.x; this.#scaleY = _scale.y; - this.#shearX = 1; - this.#shearY = 1; + this.#shearX = 0; + this.#shearY = 0; this.#updateAABB(); this.layer = layer ?? 0; @@ -137,10 +137,10 @@ export default class Asset const e = this.mat.elements; const cos = Math.cos(rad), sin = Math.sin(rad), tanX = Math.tan(this.#shearX), tanY = Math.tan(this.#shearY); - e[0] = cos * this.#scaleX; - e[1] = -sin * this.#scaleX; - e[4] = sin * this.#scaleY; - e[5] = cos * this.#scaleY; + e[0] = cos * this.#scaleX + -sin * this.#shearY; + e[1] = sin * this.#scaleX + cos * this.#shearX; + e[4] = cos * this.#shearX + -sin * this.#scaleY; + e[5] = sin * this.#shearX + cos * this.#scaleY; return this; } @@ -155,10 +155,28 @@ export default class Asset const e = this.mat.elements; const cos = Math.cos(this.#rot), sin = Math.sin(this.#rot); - e[0] = cos * this.#scaleX; - e[1] = -sin * this.#shearX; - e[4] = sin * this.#shearY; - e[5] = cos * this.#scaleY; + e[0] = cos * this.#scaleX + -sin * this.#shearY; + e[1] = sin * this.#scaleX + cos * this.#shearX; + e[4] = cos * this.#shearX + -sin * this.#scaleY; + e[5] = sin * this.#shearX + cos * this.#scaleY; + + return this; + } + shearTo(x: number, y: number): Asset + { + x = clamp(x, 0.1, CONST.RESOLUTION_X); + y = clamp(y, 0.1, CONST.RESOLUTION_Y); + + this.#shearX = x; + this.#shearY = y; + + const e = this.mat.elements; + const cos = Math.cos(this.#rot), sin = Math.sin(this.#rot); + + e[0] = cos * this.#scaleX + -sin * this.#shearY; + e[1] = sin * this.#scaleX + cos * this.#shearX; + e[4] = cos * this.#shearX + -sin * this.#scaleY; + e[5] = sin * this.#shearX + cos * this.#scaleY; return this; } @@ -175,10 +193,10 @@ export default class Asset const e = this.mat.elements; const cos = Math.cos(this.#rot), sin = Math.sin(this.#rot); - e[0] = cos * this.#scaleX; - e[1] = -sin * this.#shearX; - e[4] = sin * this.#shearY; - e[5] = cos * this.#scaleY; + e[0] = cos * this.#scaleX + -sin * this.#shearY; + e[1] = sin * this.#scaleX + cos * this.#shearX; + e[4] = cos * this.#shearX + -sin * this.#scaleY; + e[5] = sin * this.#shearX + cos * this.#scaleY; e[12] = this.#posX; e[13] = this.#posY;