/* * TSDGLFrameBuffer.js * Keynote HTML Player * * Created by Tungwei Cheng * Copyright (c) 2018 Apple Inc. All rights reserved. */ var TSDGLFrameBuffer = Class.create({ initialize: function(gl, size, textureCount) { this.gl = gl; // framebuffer size this.size = size; // number of framebuffer-attachable texture images this.textureCount = textureCount; // current texture index this.currentTextureIndex = 0; // create framebuffer-attachable texture images this.setupFramebuffer(gl, size, textureCount); }, setupFramebuffer: function(gl, size, textureCount) { // create and bind frame buffer object var buffer = this.buffer = gl.createFramebuffer(); gl.bindFramebuffer(gl.FRAMEBUFFER, buffer); var textures = this.textures = []; // set up framebuffer texture(s) for (var i = 0; i < textureCount; i++) { var texture = gl.createTexture(); // bind texture gl.bindTexture(gl.TEXTURE_2D, texture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); // setup texture parameters gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); // specify the texture size for memory allocation gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, size.width, size.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); // unbind texture gl.bindTexture(gl.TEXTURE_2D, null); textures.push(texture); } // bind current texture to the framebuffer gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textures[this.currentTextureIndex], 0); // unbind framebuffer gl.bindFramebuffer(gl.FRAMEBUFFER, null); }, currentGLTexture: function() { var texture = this.textures[this.currentTextureIndex]; return texture; }, setCurrentTextureToNext: function() { var textureCount = this.textureCount; if (this.textureCount > 0) { var currentTextureIndex = this.currentTextureIndex; var nextTextureIndex = (currentTextureIndex + 1) % textureCount; this.currentTextureIndex = nextTextureIndex; // bind the framebuffer to the next texture this.bindFramebuffer(); } }, bindFramebuffer: function() { var gl = this.gl; //bind framebuffer gl.bindFramebuffer(gl.FRAMEBUFFER, this.buffer); // bind current texture gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.textures[this.currentTextureIndex], 0); }, currentGLFramebuffer: function() { var gl = this.gl; var framebuffer = gl.getParameter(gl.FRAMEBUFFER_BINDING); return framebuffer; }, unbindFramebufferAndBindGLFramebuffer: function(currentGLFramebuffer) { var gl = this.gl; gl.bindFramebuffer(gl.FRAMEBUFFER, currentGLFramebuffer); } }); TSDGLFrameBuffer.currentGLFramebuffer = function(gl) { // use getParameter in WebGL as there is no getIntegerv implementation var framebuffer = gl.getParameter(gl.FRAMEBUFFER_BINDING); // this will return null if drawing buffer is the display default return framebuffer; };