{"version":3,"file":"Mesh.mjs","sources":["../src/Mesh.ts"],"sourcesContent":["import { DRAW_MODES, Point, Polygon, settings, State } from 'pixijs/core';\nimport { Container } from 'pixijs/display';\nimport { MeshBatchUvs } from './MeshBatchUvs';\n\nimport type { BLEND_MODES, Buffer, Geometry, IPointData, Renderer, Shader, Texture } from 'pixijs/core';\nimport type { IDestroyOptions } from 'pixijs/display';\nimport type { MeshMaterial } from './MeshMaterial';\n\nconst tempPoint = new Point();\nconst tempPolygon = new Polygon();\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface Mesh extends GlobalMixins.Mesh {}\n\n/**\n * Base mesh class.\n *\n * This class empowers you to have maximum flexibility to render any kind of WebGL visuals you can think of.\n * This class assumes a certain level of WebGL knowledge.\n * If you know a bit this should abstract enough away to make your life easier!\n *\n * Pretty much ALL WebGL 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 * @memberof PIXI\n */\nexport class Mesh<T extends Shader = MeshMaterial> extends Container\n{\n    /**\n     * Used by the pixijs/mesh/canvas package to draw meshes using canvas.\n     * Added here because we cannot mixin a static property to Mesh type.\n     * @ignore\n     */\n    public static defaultCanvasPadding: number;\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     * @type {PIXI.Shader|PIXI.MeshMaterial}\n     */\n    public shader: T;\n\n    /**\n     * Represents the WebGL state the Mesh required to render, excludes shader and geometry. E.g.,\n     * blend mode, culling, depth testing, direction of rendering triangles, backface, etc.\n     */\n    public state: State;\n\n    /** The way the Mesh should be drawn, can be any of the {@link PIXI.DRAW_MODES} constants. */\n    public drawMode: DRAW_MODES;\n\n    /**\n     * Typically the index of the IndexBuffer where to start drawing.\n     * @default 0\n     */\n    public start: number;\n\n    /**\n     * How much of the geometry to draw, by default `0` renders everything.\n     * @default 0\n     */\n    public size: number;\n\n    private _geometry: Geometry;\n\n    /** This is the caching layer used by the batcher. */\n    private vertexData: Float32Array;\n\n    /** If geometry is changed used to decide to re-transform the vertexData. */\n    private vertexDirty: number;\n    private _transformID: number;\n\n    /** Internal roundPixels field. */\n    private _roundPixels: boolean;\n\n    /** Batched UV's are cached for atlas textures. */\n    private batchUvs: MeshBatchUvs;\n\n    // Internal-only properties\n    /**\n     * These are used as easy access for batching.\n     * @private\n     */\n    uvs: Float32Array;\n\n    /**\n     * These are used as easy access for batching.\n     * @private\n     */\n    indices: Uint16Array;\n    _tintRGB: number;\n    _texture: Texture;\n\n    /**\n     * @param geometry - The geometry the mesh will use.\n     * @param {PIXI.MeshMaterial} shader - The shader the mesh will use.\n     * @param state - The state that the WebGL context is required to be in to render the mesh\n     *        if no state is provided, uses {@link PIXI.State.for2d} to create a 2D state for PixiJS.\n     * @param drawMode - The drawMode, can be any of the {@link PIXI.DRAW_MODES} constants.\n     */\n    constructor(geometry: Geometry, shader: T, state?: State, drawMode: DRAW_MODES = DRAW_MODES.TRIANGLES)\n    {\n        super();\n\n        this.geometry = geometry;\n        this.shader = shader;\n        this.state = state || State.for2d();\n        this.drawMode = drawMode;\n        this.start = 0;\n        this.size = 0;\n\n        this.uvs = null;\n        this.indices = null;\n        this.vertexData = new Float32Array(1);\n        this.vertexDirty = -1;\n\n        this._transformID = -1;\n        this._roundPixels = settings.ROUND_PIXELS;\n        this.batchUvs = null;\n    }\n\n    /**\n     * Includes vertex positions, face indices, normals, 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    get geometry(): Geometry\n    {\n        return this._geometry;\n    }\n\n    set geometry(value: Geometry)\n    {\n        if (this._geometry === value)\n        {\n            return;\n        }\n\n        if (this._geometry)\n        {\n            this._geometry.refCount--;\n\n            if (this._geometry.refCount === 0)\n            {\n                this._geometry.dispose();\n            }\n        }\n\n        this._geometry = value;\n\n        if (this._geometry)\n        {\n            this._geometry.refCount++;\n        }\n\n        this.vertexDirty = -1;\n    }\n\n    /**\n     * To change mesh uv's, change its uvBuffer data and increment its _updateID.\n     * @readonly\n     */\n    get uvBuffer(): Buffer\n    {\n        return this.geometry.buffers[1];\n    }\n\n    /**\n     * To change mesh vertices, change its uvBuffer data and increment its _updateID.\n     * Incrementing _updateID is optional because most of Mesh objects do it anyway.\n     * @readonly\n     */\n    get verticesBuffer(): Buffer\n    {\n        return this.geometry.buffers[0];\n    }\n\n    /** Alias for {@link PIXI.Mesh#shader}. */\n    set material(value: T)\n    {\n        this.shader = value;\n    }\n\n    get material(): T\n    {\n        return this.shader;\n    }\n\n    /**\n     * The blend mode to be applied to the Mesh. Apply a value of\n     * `PIXI.BLEND_MODES.NORMAL` to reset the blend mode.\n     * @default PIXI.BLEND_MODES.NORMAL;\n     */\n    set blendMode(value: BLEND_MODES)\n    {\n        this.state.blendMode = value;\n    }\n\n    get blendMode(): BLEND_MODES\n    {\n        return this.state.blendMode;\n    }\n\n    /**\n     * If true PixiJS will Math.floor() x/y values when rendering, stopping pixel interpolation.\n     * Advantages can include sharper image quality (like text) and faster rendering on canvas.\n     * The main disadvantage is movement of objects may appear less smooth.\n     * To set the global default, change {@link PIXI.settings.ROUND_PIXELS}\n     * @default false\n     */\n    set roundPixels(value: boolean)\n    {\n        if (this._roundPixels !== value)\n        {\n            this._transformID = -1;\n        }\n        this._roundPixels = value;\n    }\n\n    get roundPixels(): boolean\n    {\n        return this._roundPixels;\n    }\n\n    /**\n     * The multiply tint applied to the Mesh. This is a hex value. A value of\n     * `0xFFFFFF` will remove any tint effect.\n     *\n     * Null for non-MeshMaterial shaders\n     * @default 0xFFFFFF\n     */\n    get tint(): number\n    {\n        return 'tint' in this.shader ? (this.shader as unknown as MeshMaterial).tint : null;\n    }\n\n    set tint(value: number)\n    {\n        (this.shader as unknown as MeshMaterial).tint = value;\n    }\n\n    /** The texture that the Mesh uses. Null for non-MeshMaterial shaders */\n    get texture(): Texture\n    {\n        return 'texture' in this.shader ? (this.shader as unknown as MeshMaterial).texture : null;\n    }\n\n    set texture(value: Texture)\n    {\n        (this.shader as unknown as MeshMaterial).texture = value;\n    }\n\n    /**\n     * Standard renderer draw.\n     * @param renderer - Instance to renderer.\n     */\n    protected _render(renderer: Renderer): void\n    {\n        // set properties for batching..\n        // TODO could use a different way to grab verts?\n        const vertices = this.geometry.buffers[0].data;\n        const shader = this.shader as unknown as MeshMaterial;\n\n        // TODO benchmark check for attribute size..\n        if (\n            shader.batchable\n            && this.drawMode === DRAW_MODES.TRIANGLES\n            && vertices.length < Mesh.BATCHABLE_SIZE * 2\n        )\n        {\n            this._renderToBatch(renderer);\n        }\n        else\n        {\n            this._renderDefault(renderer);\n        }\n    }\n\n    /**\n     * Standard non-batching way of rendering.\n     * @param renderer - Instance to renderer.\n     */\n    protected _renderDefault(renderer: Renderer): void\n    {\n        const shader = this.shader as unknown as MeshMaterial;\n\n        shader.alpha = this.worldAlpha;\n        if (shader.update)\n        {\n            shader.update();\n        }\n\n        renderer.batch.flush();\n\n        // bind and sync uniforms..\n        shader.uniforms.translationMatrix = this.transform.worldTransform.toArray(true);\n        renderer.shader.bind(shader);\n\n        // set state..\n        renderer.state.set(this.state);\n\n        // bind the geometry...\n        renderer.geometry.bind(this.geometry, shader);\n\n        // then render it\n        renderer.geometry.draw(this.drawMode, this.size, this.start, this.geometry.instanceCount);\n    }\n\n    /**\n     * Rendering by using the Batch system.\n     * @param renderer - Instance to renderer.\n     */\n    protected _renderToBatch(renderer: Renderer): void\n    {\n        const geometry = this.geometry;\n        const shader = this.shader as unknown as MeshMaterial;\n\n        if (shader.uvMatrix)\n        {\n            shader.uvMatrix.update();\n            this.calculateUvs();\n        }\n\n        // set properties for batching..\n        this.calculateVertices();\n        this.indices = geometry.indexBuffer.data as Uint16Array;\n        this._tintRGB = shader._tintRGB;\n        this._texture = shader.texture;\n\n        const pluginName = (this.material as unknown as MeshMaterial).pluginName;\n\n        renderer.batch.setObjectRenderer(renderer.plugins[pluginName]);\n        renderer.plugins[pluginName].render(this);\n    }\n\n    /** Updates vertexData field based on transform and vertices. */\n    public calculateVertices(): void\n    {\n        const geometry = this.geometry;\n        const verticesBuffer = geometry.buffers[0];\n        const vertices = verticesBuffer.data;\n        const vertexDirtyId = verticesBuffer._updateID;\n\n        if (vertexDirtyId === this.vertexDirty && this._transformID === this.transform._worldID)\n        {\n            return;\n        }\n\n        this._transformID = this.transform._worldID;\n\n        if (this.vertexData.length !== vertices.length)\n        {\n            this.vertexData = new Float32Array(vertices.length);\n        }\n\n        const wt = this.transform.worldTransform;\n        const a = wt.a;\n        const b = wt.b;\n        const c = wt.c;\n        const d = wt.d;\n        const tx = wt.tx;\n        const ty = wt.ty;\n\n        const vertexData = this.vertexData;\n\n        for (let i = 0; i < vertexData.length / 2; i++)\n        {\n            const x = vertices[(i * 2)];\n            const y = vertices[(i * 2) + 1];\n\n            vertexData[(i * 2)] = (a * x) + (c * y) + tx;\n            vertexData[(i * 2) + 1] = (b * x) + (d * y) + ty;\n        }\n\n        if (this._roundPixels)\n        {\n            const resolution = settings.RESOLUTION;\n\n            for (let i = 0; i < vertexData.length; ++i)\n            {\n                vertexData[i] = Math.round(vertexData[i] * resolution) / resolution;\n            }\n        }\n\n        this.vertexDirty = vertexDirtyId;\n    }\n\n    /** Updates uv field based on from geometry uv's or batchUvs. */\n    public calculateUvs(): void\n    {\n        const geomUvs = this.geometry.buffers[1];\n        const shader = this.shader as unknown as MeshMaterial;\n\n        if (!shader.uvMatrix.isSimple)\n        {\n            if (!this.batchUvs)\n            {\n                this.batchUvs = new MeshBatchUvs(geomUvs, shader.uvMatrix);\n            }\n            this.batchUvs.update();\n            this.uvs = this.batchUvs.data;\n        }\n        else\n        {\n            this.uvs = geomUvs.data as Float32Array;\n        }\n    }\n\n    /**\n     * Updates the bounds of the mesh as a rectangle. The bounds calculation takes the worldTransform into account.\n     * there must be a aVertexPosition attribute present in the geometry for bounds to be calculated correctly.\n     */\n    protected _calculateBounds(): void\n    {\n        this.calculateVertices();\n\n        this._bounds.addVertexData(this.vertexData, 0, this.vertexData.length);\n    }\n\n    /**\n     * Tests if a point is inside this mesh. Works only for PIXI.DRAW_MODES.TRIANGLES.\n     * @param point - The point to test.\n     * @returns - The result of the test.\n     */\n    public containsPoint(point: IPointData): boolean\n    {\n        if (!this.getBounds().contains(point.x, point.y))\n        {\n            return false;\n        }\n\n        this.worldTransform.applyInverse(point, tempPoint);\n\n        const vertices = this.geometry.getBuffer('aVertexPosition').data;\n\n        const points = tempPolygon.points;\n        const indices = this.geometry.getIndex().data;\n        const len = indices.length;\n        const step = this.drawMode === 4 ? 3 : 1;\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            points[0] = vertices[ind0];\n            points[1] = vertices[ind0 + 1];\n            points[2] = vertices[ind1];\n            points[3] = vertices[ind1 + 1];\n            points[4] = vertices[ind2];\n            points[5] = vertices[ind2 + 1];\n\n            if (tempPolygon.contains(tempPoint.x, tempPoint.y))\n            {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    public destroy(options?: IDestroyOptions | boolean): void\n    {\n        super.destroy(options);\n\n        if (this._cachedTexture)\n        {\n            this._cachedTexture.destroy();\n            this._cachedTexture = null;\n        }\n\n        this.geometry = null;\n        this.shader = null;\n        this.state = null;\n        this.uvs = null;\n        this.indices = null;\n        this.vertexData = null;\n    }\n\n    /** The maximum number of vertices to consider batchable. Generally, the complexity of the geometry. */\n    public static BATCHABLE_SIZE = 100;\n}\n"],"names":[],"mappings":"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"}