Newer
Older
pixi.js / src / core / renderers / webgl / managers / NewTextureManager.js
@Mat Groves Mat Groves on 4 Mar 2017 4 KB Pass one
import WebGLManager from './WebGLManager';
import { GLFramebuffer, GLTexture } from 'pixi-gl-core';

/**
 * @class
 * @extends PIXI.WebGLManager
 * @memberof PIXI
 */
export default class TextureManager extends WebGLManager
{
    /**
     * @param {PIXI.WebGLRenderer} renderer - The renderer this manager works for.
     */
    constructor(renderer)
    {
        super(renderer);
        this.boundTextures = [
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null
        ];

    }

    /**
     * Sets up the renderer context and necessary buffers.
     *
     * @private
     */
    onContextChange()
    {
        this.gl = this.renderer.gl;
        this.CONTEXT_UID = this.renderer.CONTEXT_UID;
    }

    bindTexture(texture, location)
    {
        const gl = this.gl;

        location = location || 0;

        gl.activeTexture(gl.TEXTURE0 + location);

        if(texture)
        {
            const glTexture = texture.glTextures[this.CONTEXT_UID] || this.initTexture(texture);

            if(texture.isCube)
            {
                gl.bindTexture(gl.TEXTURE_CUBE_MAP, glTexture.texture);
            }
            else
            {
                gl.bindTexture(gl.TEXTURE_2D, glTexture.texture);
            }

            this.boundTextures[location] = texture;
        }
        else
        {
            gl.bindTexture(gl.TEXTURE_2D, null);
            this.boundTextures[location] = null;
        }
    }

    unbindTexture(texture)
    {
        for (var i = 0; i <  this.boundTextures.length; i++) {

            if(this.boundTextures[i] === texture)
            {
                gl.activeTexture(gl.TEXTURE0 + location);
                gl.bindTexture(gl.TEXTURE_2D, null);
                this.boundTextures[i] = null;
            }
        }
    }

    initTexture(texture)
    {
        const gl = this.gl;

        var glTexture = new GLTexture(this.gl);

        if(texture.isCube)
        {
            gl.bindTexture(gl.TEXTURE_CUBE_MAP, glTexture.texture);

            glTexture.width = texture.width;
            glTexture.height = texture.height;

            // upload the 6 faces..
            gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X, 0, glTexture.format,  glTexture.width, glTexture.height, 0, glTexture.format, glTexture.type, null);
            gl.texImage2D(gl.TEXTURE_CUBE_MAP_NEGATIVE_X, 0, glTexture.format,  glTexture.width, glTexture.height, 0, glTexture.format, glTexture.type, null);
            gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_Y, 0, glTexture.format,  glTexture.width, glTexture.height, 0, glTexture.format, glTexture.type, null);
            gl.texImage2D(gl.TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, glTexture.format,  glTexture.width, glTexture.height, 0, glTexture.format, glTexture.type, null);
            gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_Z, 0, glTexture.format,  glTexture.width, glTexture.height, 0, glTexture.format, glTexture.type, null);
            gl.texImage2D(gl.TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, glTexture.format,  glTexture.width, glTexture.height, 0, glTexture.format, glTexture.type, null);

            gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X, 0, glTexture.format, glTexture.format, glTexture.type, window.tex1);
            gl.texImage2D(gl.TEXTURE_CUBE_MAP_NEGATIVE_X, 0, glTexture.format, glTexture.format, glTexture.type, window.tex2);
            gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_Y, 0, glTexture.format, glTexture.format, glTexture.type, window.tex3);
            gl.texImage2D(gl.TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, glTexture.format, glTexture.format, glTexture.type, window.tex4);
            gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_Z, 0, glTexture.format, glTexture.format, glTexture.type, window.tex5);
            gl.texImage2D(gl.TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, glTexture.format, glTexture.format, glTexture.type, window.tex6);


            gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
            gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
        }
        else
        {
            glTexture.uploadData(null, texture.width, texture.height);

             // settings..
            glTexture.enableNearestScaling();
            glTexture.enableWrapClamp();
        }



        texture.glTextures[this.CONTEXT_UID] = glTexture;

        return glTexture;
    }
}