{"version":3,"file":"TilingSpriteRenderer.mjs","sources":["../src/TilingSpriteRenderer.ts"],"sourcesContent":["import { extensions, ExtensionType, Matrix, ObjectRenderer, QuadUv, Shader, State, utils, WRAP_MODES } from 'pixijs/core';\nimport gl2FragmentSrc from './sprite-tiling.frag';\nimport gl2VertexSrc from './sprite-tiling.vert';\nimport gl1FragmentSrc from './sprite-tiling-fallback.frag';\nimport gl1VertexSrc from './sprite-tiling-fallback.vert';\nimport fragmentSimpleSrc from './sprite-tiling-simple.frag';\n\nimport type { ExtensionMetadata, Renderer } from 'pixijs/core';\nimport type { TilingSprite } from './TilingSprite';\n\nconst tempMat = new Matrix();\n\n/**\n * WebGL renderer plugin for tiling sprites\n * @class\n * @memberof PIXI\n * @extends PIXI.ObjectRenderer\n */\nexport class TilingSpriteRenderer extends ObjectRenderer\n{\n    /** @ignore */\n    static extension: ExtensionMetadata = {\n        name: 'tilingSprite',\n        type: ExtensionType.RendererPlugin,\n    };\n\n    public shader: Shader;\n    public simpleShader: Shader;\n    public quad: QuadUv;\n    public readonly state: State;\n\n    /**\n     * constructor for renderer\n     * @param {PIXI.Renderer} renderer - The renderer this tiling awesomeness works for.\n     */\n    constructor(renderer: Renderer)\n    {\n        super(renderer);\n\n        // WebGL version is not available during initialization!\n        renderer.runners.contextChange.add(this);\n\n        this.quad = new QuadUv();\n\n        /**\n         * The WebGL state in which this renderer will work.\n         * @member {PIXI.State}\n         * @readonly\n         */\n        this.state = State.for2d();\n    }\n\n    /** Creates shaders when context is initialized. */\n    contextChange(): void\n    {\n        const renderer = this.renderer;\n        const uniforms = { globals: renderer.globalUniforms };\n\n        this.simpleShader = Shader.from(gl1VertexSrc, fragmentSimpleSrc, uniforms);\n        this.shader = renderer.context.webGLVersion > 1\n            ? Shader.from(gl2VertexSrc, gl2FragmentSrc, uniforms)\n            : Shader.from(gl1VertexSrc, gl1FragmentSrc, uniforms);\n    }\n\n    /**\n     * @param {PIXI.TilingSprite} ts - tilingSprite to be rendered\n     */\n    public render(ts: TilingSprite): void\n    {\n        const renderer = this.renderer;\n        const quad = this.quad;\n\n        let vertices = quad.vertices;\n\n        vertices[0] = vertices[6] = (ts._width) * -ts.anchor.x;\n        vertices[1] = vertices[3] = ts._height * -ts.anchor.y;\n\n        vertices[2] = vertices[4] = (ts._width) * (1.0 - ts.anchor.x);\n        vertices[5] = vertices[7] = ts._height * (1.0 - ts.anchor.y);\n\n        const anchorX = ts.uvRespectAnchor ? ts.anchor.x : 0;\n        const anchorY = ts.uvRespectAnchor ? ts.anchor.y : 0;\n\n        vertices = quad.uvs;\n\n        vertices[0] = vertices[6] = -anchorX;\n        vertices[1] = vertices[3] = -anchorY;\n\n        vertices[2] = vertices[4] = 1.0 - anchorX;\n        vertices[5] = vertices[7] = 1.0 - anchorY;\n\n        quad.invalidate();\n\n        const tex = ts._texture;\n        const baseTex = tex.baseTexture;\n        const premultiplied = baseTex.alphaMode > 0;\n        const lt = ts.tileTransform.localTransform;\n        const uv = ts.uvMatrix;\n        let isSimple = baseTex.isPowerOfTwo\n            && tex.frame.width === baseTex.width && tex.frame.height === baseTex.height;\n\n        // auto, force repeat wrapMode for big tiling textures\n        if (isSimple)\n        {\n            if (!baseTex._glTextures[renderer.CONTEXT_UID])\n            {\n                if (baseTex.wrapMode === WRAP_MODES.CLAMP)\n                {\n                    baseTex.wrapMode = WRAP_MODES.REPEAT;\n                }\n            }\n            else\n            {\n                isSimple = baseTex.wrapMode !== WRAP_MODES.CLAMP;\n            }\n        }\n\n        const shader = isSimple ? this.simpleShader : this.shader;\n\n        const w = tex.width;\n        const h = tex.height;\n        const W = ts._width;\n        const H = ts._height;\n\n        tempMat.set(lt.a * w / W,\n            lt.b * w / H,\n            lt.c * h / W,\n            lt.d * h / H,\n            lt.tx / W,\n            lt.ty / H);\n\n        // that part is the same as above:\n        // tempMat.identity();\n        // tempMat.scale(tex.width, tex.height);\n        // tempMat.prepend(lt);\n        // tempMat.scale(1.0 / ts._width, 1.0 / ts._height);\n\n        tempMat.invert();\n        if (isSimple)\n        {\n            tempMat.prepend(uv.mapCoord);\n        }\n        else\n        {\n            shader.uniforms.uMapCoord = uv.mapCoord.toArray(true);\n            shader.uniforms.uClampFrame = uv.uClampFrame;\n            shader.uniforms.uClampOffset = uv.uClampOffset;\n        }\n\n        shader.uniforms.uTransform = tempMat.toArray(true);\n        shader.uniforms.uColor = utils.premultiplyTintToRgba(ts.tint, ts.worldAlpha,\n            shader.uniforms.uColor, premultiplied);\n        shader.uniforms.translationMatrix = ts.transform.worldTransform.toArray(true);\n        shader.uniforms.uSampler = tex;\n\n        renderer.shader.bind(shader);\n        renderer.geometry.bind(quad);\n\n        this.state.blendMode = utils.correctBlendMode(ts.blendMode, premultiplied);\n        renderer.state.set(this.state);\n        renderer.geometry.draw(this.renderer.gl.TRIANGLES, 6, 0);\n    }\n}\n\nextensions.add(TilingSpriteRenderer);\n"],"names":[],"mappings":"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"}