{"version":3,"file":"Light.mjs","sources":["../../../src/lights/light/Light.ts"],"sourcesContent":["import { Geometry, Renderer, BLEND_MODES, DRAW_MODES } from '@pixi/core';\nimport { Layer } from '@pixi/layers';\nimport { Mesh } from '@pixi/mesh';\nimport { LayerFinder, lightGroup } from '../../LayerFinder';\nimport { LightShader } from './LightShader';\nimport { ViewportQuad } from './ViewportQuad';\n\n/**\n * Base light class.\n * @extends PIXI.Mesh\n * @memberof PIXI.lights\n */\nexport class Light extends Mesh\n{\n    /** Light height */\n    lightHeight: number;\n    /** Brightness */\n    brightness: number;\n    /** Shader name */\n    shaderName: string | null = null;\n    /** Use Viewport Quad */\n    readonly useViewportQuad: boolean;\n\n    /**\n     * @param {number} [color=0xFFFFFF] - The color of the light.\n     * @param {number} [brightness=1] - The brightness of the light, in range [0, 1].\n     * @param {PIXI.lights.LightShader} [material] -\n     * @param {Float32Array} [vertices] -\n     * @param {Uint16Array} [indices] -\n     */\n    constructor(color = 0x4d4d59, brightness = 0.8, material: LightShader,\n        vertices? : Float32Array, indices?: Uint16Array)\n    {\n        super(!vertices ? ViewportQuad._instance : new Geometry()\n            .addAttribute('aVertexPosition', vertices).addIndex(indices), material);\n\n        this.blendMode = BLEND_MODES.ADD;\n        const useViewportQuad = !vertices;\n\n        this.drawMode = useViewportQuad ? DRAW_MODES.TRIANGLE_STRIP : DRAW_MODES.TRIANGLES;\n\n        /**\n         * The height of the light from the viewport.\n         *\n         * @default 0.075\n         */\n        this.lightHeight = 0.075;\n\n        /**\n         * The falloff attenuation coeficients.\n         *\n         * @member {number[]}\n         * @default [0.75, 3, 20]\n         */\n        this.falloff = [0.75, 3, 20];\n\n        /**\n         * By default the light uses a viewport sized quad as the mesh.\n         *\n         * @member {boolean}\n         */\n        this.useViewportQuad = useViewportQuad;\n\n        // color and brightness are exposed through setters\n        this.tint = color ?? 0x4d4d59;\n        this.brightness = brightness;\n        this.parentGroup = lightGroup;\n    }\n\n    /**\n     * The color of the lighting.\n     */\n    get color(): number\n    {\n        return this.tint;\n    }\n    set color(val: number)\n    {\n        this.tint = val;\n    }\n\n    /**\n     * Falloff\n     * @member {number[]}\n     */\n    get falloff(): ArrayLike<number>\n    {\n        return this.material.uniforms.uLightFalloff;\n    }\n\n    set falloff(value: ArrayLike<number>)\n    {\n        this.material.uniforms.uLightFalloff[0] = value[0];\n        this.material.uniforms.uLightFalloff[1] = value[1];\n        this.material.uniforms.uLightFalloff[2] = value[2];\n    }\n\n    /**\n     * Last layer\n     * @type {PIXI.layers.Layer}\n     */\n    lastLayer: Layer | null = null;\n\n    /**\n     * Sync Shader\n     * @param {PIXI.Renderer} renderer - Renderer\n     */\n    syncShader(renderer: Renderer): void\n    {\n        const { uniforms } = this.shader;\n\n        // TODO: actually pass UV's of screen instead of size\n        uniforms.uViewSize[0] = renderer.screen.width;\n        uniforms.uViewSize[1] = renderer.screen.height;\n        uniforms.uViewPixels[0] = renderer.view.width;\n        uniforms.uViewPixels[1] = renderer.view.height;\n        uniforms.uFlipY = !renderer.framebuffer.current;\n        uniforms.uSampler = LayerFinder._instance.diffuseTexture;\n        uniforms.uNormalSampler = LayerFinder._instance.normalTexture;\n        uniforms.uUseViewportQuad = this.useViewportQuad;\n        uniforms.uBrightness = this.brightness;\n    }\n\n    _renderDefault(renderer: Renderer): void\n    {\n        if (!this._activeParentLayer)\n        {\n            return;\n        }\n        LayerFinder._instance.check(this._activeParentLayer);\n\n        const shader = this.shader as unknown as LightShader;\n\n        shader.alpha = this.worldAlpha;\n        if (shader.update)\n        {\n            shader.update();\n        }\n\n        renderer.batch.flush();\n\n        shader.uniforms.translationMatrix = this.transform.worldTransform.toArray(true);\n        if (this.useViewportQuad)\n        {\n            // TODO: pass the viewport (translated screen) instead\n            (this.geometry as ViewportQuad).update(renderer.screen);\n        }\n\n        this.syncShader(renderer);\n\n        renderer.shader.bind(shader);\n\n        renderer.state.set(this.state);\n\n        renderer.geometry.bind(this.geometry, shader);\n\n        renderer.geometry.draw(this.drawMode, this.size, this.start, this.geometry.instanceCount);\n    }\n}\n"],"names":[],"mappings":"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"}