1 line
9.1 KiB
Plaintext
1 line
9.1 KiB
Plaintext
{"version":3,"file":"TextureMatrix.mjs","sources":["../../../../../src/rendering/renderers/shared/texture/TextureMatrix.ts"],"sourcesContent":["import { Matrix } from '../../../../maths/matrix/Matrix';\n\nimport type { Texture } from './Texture';\n\nconst tempMat = new Matrix();\n\n/**\n * Class controls uv mapping from Texture normal space to BaseTexture normal space.\n *\n * Takes `trim` and `rotate` into account. May contain clamp settings for Meshes and TilingSprite.\n *\n * Can be used in Texture `uvMatrix` field, or separately, you can use different clamp settings on the same texture.\n * If you want to add support for texture region of certain feature or filter, that's what you're looking for.\n *\n * Takes track of Texture changes through `_lastTextureID` private field.\n * Use `update()` method call to track it from outside.\n * @see Texture\n * @see Mesh\n * @see TilingSprite\n * @memberof rendering\n */\nexport class TextureMatrix\n{\n /**\n * Matrix operation that converts texture region coords to texture coords\n * @readonly\n */\n public mapCoord: Matrix;\n\n /**\n * Changes frame clamping\n * Works with TilingSprite and Mesh\n * Change to 1.5 if you texture has repeated right and bottom lines, that leads to smoother borders\n * @default 0\n */\n public clampOffset: number;\n\n /**\n * Changes frame clamping\n * Works with TilingSprite and Mesh\n * Change to -0.5 to add a pixel to the edge, recommended for transparent trimmed textures in atlas\n * @default 0.5\n */\n public clampMargin: number;\n\n /**\n * Clamp region for normalized coords, left-top pixel center in xy , bottom-right in zw.\n * Calculated based on clampOffset.\n */\n public readonly uClampFrame: Float32Array;\n\n /** Normalized clamp offset. Calculated based on clampOffset. */\n public readonly uClampOffset: Float32Array;\n\n /**\n * Tracks Texture frame changes.\n * @ignore\n */\n public _updateID: number;\n\n /**\n * Tracks Texture frame changes.\n * @protected\n */\n protected _textureID: number;\n\n protected _texture: Texture;\n\n /**\n * If texture size is the same as baseTexture.\n * @default false\n * @readonly\n */\n public isSimple: boolean;\n\n /**\n * @param texture - observed texture\n * @param clampMargin - Changes frame clamping, 0.5 by default. Use -0.5 for extra border.\n */\n constructor(texture: Texture, clampMargin?: number)\n {\n this.mapCoord = new Matrix();\n this.uClampFrame = new Float32Array(4);\n this.uClampOffset = new Float32Array(2);\n this._textureID = -1;\n this._updateID = 0;\n\n this.clampOffset = 0;\n\n if ((typeof clampMargin === 'undefined'))\n {\n this.clampMargin = (texture.width < 10) ? 0 : 0.5;\n }\n else\n {\n this.clampMargin = clampMargin;\n }\n\n this.isSimple = false;\n\n this.texture = texture;\n }\n\n /** Texture property. */\n get texture(): Texture\n {\n return this._texture;\n }\n\n set texture(value: Texture)\n {\n if (this.texture === value) return;\n\n this._texture?.removeListener('update', this.update, this);\n this._texture = value;\n this._texture.addListener('update', this.update, this);\n\n this.update();\n }\n\n /**\n * Multiplies uvs array to transform\n * @param uvs - mesh uvs\n * @param [out=uvs] - output\n * @returns - output\n */\n public multiplyUvs(uvs: Float32Array, out?: Float32Array): Float32Array\n {\n if (out === undefined)\n {\n out = uvs;\n }\n\n const mat = this.mapCoord;\n\n for (let i = 0; i < uvs.length; i += 2)\n {\n const x = uvs[i];\n const y = uvs[i + 1];\n\n out[i] = (x * mat.a) + (y * mat.c) + mat.tx;\n out[i + 1] = (x * mat.b) + (y * mat.d) + mat.ty;\n }\n\n return out;\n }\n\n /**\n * Updates matrices if texture was changed\n * @returns - whether or not it was updated\n */\n public update(): boolean\n {\n const tex = this._texture;\n\n this._updateID++;\n\n const uvs = tex.uvs;\n\n this.mapCoord.set(uvs.x1 - uvs.x0, uvs.y1 - uvs.y0, uvs.x3 - uvs.x0, uvs.y3 - uvs.y0, uvs.x0, uvs.y0);\n\n const orig = tex.orig;\n const trim = tex.trim;\n\n if (trim)\n {\n tempMat.set(\n orig.width / trim.width,\n 0, 0, orig.height / trim.height,\n -trim.x / trim.width,\n -trim.y / trim.height\n );\n\n this.mapCoord.append(tempMat);\n }\n\n const texBase = tex.source;\n const frame = this.uClampFrame;\n const margin = this.clampMargin / texBase._resolution;\n const offset = this.clampOffset / texBase._resolution;\n\n frame[0] = (tex.frame.x + margin + offset) / texBase.width;\n frame[1] = (tex.frame.y + margin + offset) / texBase.height;\n frame[2] = (tex.frame.x + tex.frame.width - margin + offset) / texBase.width;\n frame[3] = (tex.frame.y + tex.frame.height - margin + offset) / texBase.height;\n\n this.uClampOffset[0] = this.clampOffset / texBase.pixelWidth;\n this.uClampOffset[1] = this.clampOffset / texBase.pixelHeight;\n\n this.isSimple = tex.frame.width === texBase.width\n && tex.frame.height === texBase.height\n && tex.rotate === 0;\n\n return true;\n }\n}\n"],"names":[],"mappings":"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"} |