/*
* 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;
};