{"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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"}