pixi.js
Version:
<p align="center"> <a href="https://pixijs.com" target="_blank" rel="noopener noreferrer"> <img height="150" src="https://files.pixijs.download/branding/pixijs-logo-transparent-dark.svg?v=1" alt="PixiJS logo"> </a> </p> <br/> <p align="center">
1 lines • 16.9 kB
Source Map (JSON)
{"version":3,"file":"Mesh.mjs","sources":["../../../../src/scene/mesh/shared/Mesh.ts"],"sourcesContent":["import { pointInTriangle } from '../../../maths/point/pointInTriangle';\nimport { Geometry } from '../../../rendering/renderers/shared/geometry/Geometry';\nimport { State } from '../../../rendering/renderers/shared/state/State';\nimport { Texture } from '../../../rendering/renderers/shared/texture/Texture';\nimport { deprecation, v8_0_0 } from '../../../utils/logging/deprecation';\nimport { ViewContainer } from '../../view/ViewContainer';\nimport { MeshGeometry } from './MeshGeometry';\nimport { type MeshGpuData } from './MeshPipe';\nimport '../init';\n\nimport type { PointData } from '../../../maths/point/PointData';\nimport type { Topology } from '../../../rendering/renderers/shared/geometry/const';\nimport type { Instruction } from '../../../rendering/renderers/shared/instructions/Instruction';\nimport type { Shader } from '../../../rendering/renderers/shared/shader/Shader';\nimport type { View } from '../../../rendering/renderers/shared/view/View';\nimport type { ContainerOptions } from '../../container/Container';\nimport type { DestroyOptions } from '../../container/destroyTypes';\n\n/**\n * Shader that uses a texture.\n * This is the default shader used by `Mesh` when no shader is provided.\n * It is a simple shader that samples a texture and applies it to the geometry.\n * @category scene\n * @advanced\n */\nexport interface TextureShader extends Shader\n{\n /** The texture that the shader uses. */\n texture: Texture;\n}\n\n/**\n * Constructor options used for `Mesh` instances. Extends {@link MeshViewOptions}\n * ```js\n * const mesh = new Mesh({\n * texture: Texture.from('assets/image.png'),\n * geometry: new PlaneGeometry(),\n * shader: Shader.from(VERTEX, FRAGMENT),\n * });\n * ```\n * @see {@link Mesh}\n * @see {@link MeshViewOptions}\n * @category scene\n */\n\n/**\n * Options for creating a Mesh instance.\n * @category scene\n * @advanced\n * @noInheritDoc\n */\nexport interface MeshOptions<\n GEOMETRY extends Geometry = MeshGeometry,\n SHADER extends Shader = TextureShader\n> extends PixiMixins.MeshOptions, ContainerOptions\n{\n /**\n * Includes vertex positions, face indices, colors, UVs, and\n * custom attributes within buffers, reducing the cost of passing all\n * this data to the GPU. Can be shared between multiple Mesh objects.\n */\n geometry: GEOMETRY;\n /**\n * Represents the vertex and fragment shaders that processes the geometry and runs on the GPU.\n * Can be shared between multiple Mesh objects.\n */\n shader?: SHADER | null;\n /** The state of WebGL required to render the mesh. */\n state?: State;\n /** The texture that the Mesh uses. Null for non-MeshMaterial shaders */\n texture?: Texture;\n /** Whether or not to round the x/y position. */\n roundPixels?: boolean;\n}\n// eslint-disable-next-line requireExport/require-export-jsdoc, requireMemberAPI/require-member-api-doc\nexport interface Mesh extends PixiMixins.Mesh, ViewContainer<MeshGpuData> {}\n\n/**\n * Base mesh class.\n *\n * This class empowers you to have maximum flexibility to render any kind of WebGL/WebGPU visuals you can think of.\n * This class assumes a certain level of WebGL/WebGPU knowledge.\n * If you know a bit this should abstract enough away to make your life easier!\n *\n * Pretty much ALL WebGL/WebGPU can be broken down into the following:\n * - Geometry - The structure and data for the mesh. This can include anything from positions, uvs, normals, colors etc..\n * - Shader - This is the shader that PixiJS will render the geometry with (attributes in the shader must match the geometry)\n * - State - This is the state of WebGL required to render the mesh.\n *\n * Through a combination of the above elements you can render anything you want, 2D or 3D!\n * @category scene\n * @advanced\n */\nexport class Mesh<\n GEOMETRY extends Geometry = MeshGeometry,\n SHADER extends Shader = TextureShader\n> extends ViewContainer<MeshGpuData> implements View, Instruction\n{\n /** @internal */\n public override readonly renderPipeId: string = 'mesh';\n public state: State;\n\n /** @internal */\n public _texture: Texture;\n /** @internal */\n public _geometry: GEOMETRY;\n /** @internal */\n public _shader: SHADER | null = null;\n /**\n * @param {MeshOptions} options - options for the mesh instance\n */\n constructor(options: MeshOptions<GEOMETRY, SHADER>);\n /** @deprecated since 8.0.0 */\n constructor(geometry: GEOMETRY, shader: SHADER, state?: State, drawMode?: Topology);\n constructor(...args: [MeshOptions<GEOMETRY, SHADER>] | [GEOMETRY, SHADER, State?, Topology?])\n {\n let options = args[0];\n\n if (options instanceof Geometry)\n {\n // #if _DEBUG\n deprecation(v8_0_0, 'Mesh: use new Mesh({ geometry, shader }) instead');\n // #endif\n\n options = {\n geometry: options,\n shader: args[1],\n } as MeshOptions<GEOMETRY, SHADER>;\n\n if (args[3])\n {\n // #if _DEBUG\n deprecation(v8_0_0, 'Mesh: drawMode argument has been removed, use geometry.topology instead');\n // #endif\n\n options.geometry.topology = args[3];\n }\n }\n\n const { geometry, shader, texture, roundPixels, state, ...rest } = options;\n\n super({\n label: 'Mesh',\n ...rest\n });\n\n this.allowChildren = false;\n\n this.shader = shader ?? null;\n this.texture = texture ?? (shader as unknown as TextureShader)?.texture ?? Texture.WHITE;\n this.state = state ?? State.for2d();\n\n this._geometry = geometry;\n this._geometry.on('update', this.onViewUpdate, this);\n\n this.roundPixels = roundPixels ?? false;\n }\n\n /** Alias for {@link Mesh#shader}. */\n get material()\n {\n // #if _DEBUG\n deprecation(v8_0_0, 'mesh.material property has been removed, use mesh.shader instead');\n // #endif\n\n return this._shader;\n }\n\n /**\n * Represents the vertex and fragment shaders that processes the geometry and runs on the GPU.\n * Can be shared between multiple Mesh objects.\n */\n set shader(value: SHADER | null)\n {\n if (this._shader === value) return;\n\n this._shader = value;\n this.onViewUpdate();\n }\n\n get shader(): SHADER | null\n {\n return this._shader;\n }\n\n /**\n * Includes vertex positions, face indices, colors, UVs, and\n * custom attributes within buffers, reducing the cost of passing all\n * this data to the GPU. Can be shared between multiple Mesh objects.\n */\n set geometry(value: GEOMETRY)\n {\n if (this._geometry === value) return;\n\n this._geometry?.off('update', this.onViewUpdate, this);\n value.on('update', this.onViewUpdate, this);\n\n this._geometry = value;\n this.onViewUpdate();\n }\n\n get geometry()\n {\n return this._geometry;\n }\n\n /** The texture that the Mesh uses. Null for non-MeshMaterial shaders */\n set texture(value: Texture)\n {\n value ||= Texture.EMPTY;\n\n const currentTexture = this._texture;\n\n if (currentTexture === value) return;\n\n if (currentTexture && currentTexture.dynamic) currentTexture.off('update', this.onViewUpdate, this);\n if (value.dynamic) value.on('update', this.onViewUpdate, this);\n\n if (this.shader)\n {\n (this.shader as unknown as TextureShader).texture = value;\n }\n\n this._texture = value;\n this.onViewUpdate();\n }\n\n get texture()\n {\n return this._texture;\n }\n\n get batched()\n {\n if (this._shader) return false;\n\n // The state must be compatible with the batcher pipe.\n // It isn't compatible if depth test or culling is enabled.\n if ((this.state.data & 0b001100) !== 0) return false;\n\n if (this._geometry instanceof MeshGeometry)\n {\n if (this._geometry.batchMode === 'auto')\n {\n return this._geometry.positions.length / 2 <= 100;\n }\n\n return this._geometry.batchMode === 'batch';\n }\n\n return false;\n }\n\n /**\n * The local bounds of the mesh.\n * @type {Bounds}\n */\n override get bounds()\n {\n return this._geometry.bounds;\n }\n\n /**\n * Update local bounds of the mesh.\n * @private\n */\n protected updateBounds()\n {\n this._bounds = this._geometry.bounds;\n }\n\n /**\n * Checks if the object contains the given point.\n * @param point - The point to check\n */\n public override containsPoint(point: PointData)\n {\n const { x, y } = point;\n\n if (!this.bounds.containsPoint(x, y)) return false;\n\n const vertices = this.geometry.getBuffer('aPosition').data;\n\n const step = this.geometry.topology === 'triangle-strip' ? 3 : 1;\n\n if (this.geometry.getIndex())\n {\n const indices = this.geometry.getIndex().data;\n const len = indices.length;\n\n for (let i = 0; i + 2 < len; i += step)\n {\n const ind0 = indices[i] * 2;\n const ind1 = indices[i + 1] * 2;\n const ind2 = indices[i + 2] * 2;\n\n if (pointInTriangle(\n x, y,\n vertices[ind0],\n vertices[ind0 + 1],\n vertices[ind1],\n vertices[ind1 + 1],\n vertices[ind2],\n vertices[ind2 + 1],\n ))\n {\n return true;\n }\n }\n }\n else\n {\n const len = vertices.length / 2; // Each vertex has 2 coordinates, x and y\n\n for (let i = 0; i + 2 < len; i += step)\n {\n const ind0 = i * 2;\n const ind1 = (i + 1) * 2;\n const ind2 = (i + 2) * 2;\n\n if (pointInTriangle(\n x, y,\n vertices[ind0],\n vertices[ind0 + 1],\n vertices[ind1],\n vertices[ind1 + 1],\n vertices[ind2],\n vertices[ind2 + 1],\n ))\n {\n return true;\n }\n }\n }\n\n return false;\n }\n\n /**\n * Destroys this sprite renderable and optionally its texture.\n * @param options - Options parameter. A boolean will act as if all options\n * have been set to that value\n * @example\n * mesh.destroy();\n * mesh.destroy(true);\n * mesh.destroy({ texture: true, textureSource: true });\n */\n public override destroy(options?: DestroyOptions): void\n {\n super.destroy(options);\n\n const destroyTexture = typeof options === 'boolean' ? options : options?.texture;\n\n if (destroyTexture)\n {\n const destroyTextureSource = typeof options === 'boolean' ? options : options?.textureSource;\n\n this._texture.destroy(destroyTextureSource);\n }\n\n this._geometry?.off('update', this.onViewUpdate, this);\n\n this._texture = null;\n this._geometry = null;\n this._shader = null;\n }\n}\n"],"names":[],"mappings":"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"}