in seriously.js [1401:1508]
function draw(shader, model, uniforms, frameBuffer, node, options) {
var numTextures = 0,
name, value, shaderUniform,
width, height,
nodeGl = (node && node.gl) || gl,
srcRGB, srcAlpha,
dstRGB, dstAlpha;
if (!nodeGl) {
return;
}
if (node) {
width = options && options.width || node.width || nodeGl.canvas.width;
height = options && options.height || node.height || nodeGl.canvas.height;
} else {
width = options && options.width || nodeGl.canvas.width;
height = options && options.height || nodeGl.canvas.height;
}
shader.use();
nodeGl.viewport(0, 0, width, height);
nodeGl.bindFramebuffer(nodeGl.FRAMEBUFFER, frameBuffer);
/* todo: do this all only once at the beginning, since we only have one model? */
nodeGl.enableVertexAttribArray(shader.location.position);
nodeGl.enableVertexAttribArray(shader.location.texCoord);
if (model.texCoord) {
nodeGl.bindBuffer(nodeGl.ARRAY_BUFFER, model.texCoord);
nodeGl.vertexAttribPointer(shader.location.texCoord, model.texCoord.size, nodeGl.FLOAT, false, 0, 0);
}
nodeGl.bindBuffer(nodeGl.ARRAY_BUFFER, model.vertex);
nodeGl.vertexAttribPointer(shader.location.position, model.vertex.size, nodeGl.FLOAT, false, 0, 0);
nodeGl.bindBuffer(nodeGl.ELEMENT_ARRAY_BUFFER, model.index);
//default for depth is disable
if (options && options.depth) {
gl.enable(gl.DEPTH_TEST);
} else {
gl.disable(gl.DEPTH_TEST);
}
//default for blend is enabled
if (!options) {
gl.enable(gl.BLEND);
gl.blendFunc(
gl.ONE,
gl.ZERO
);
gl.blendEquation(gl.FUNC_ADD);
} else if (options.blend === undefined || options.blend) {
gl.enable(gl.BLEND);
srcRGB = options.srcRGB === undefined ? gl.ONE : options.srcRGB;
dstRGB = options.dstRGB || gl.ZERO;
srcAlpha = options.srcAlpha === undefined ? srcRGB : options.srcAlpha;
dstAlpha = options.dstAlpha === undefined ? dstRGB : options.dstAlpha;
gl.blendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
gl.blendEquation(options.blendEquation || gl.FUNC_ADD);
} else {
gl.disable(gl.BLEND);
}
/* set uniforms to current values */
for (name in uniforms) {
if (uniforms.hasOwnProperty(name)) {
value = uniforms[name];
shaderUniform = shader.uniforms[name];
if (shaderUniform) {
if (value instanceof WebGLTexture) {
nodeGl.activeTexture(nodeGl.TEXTURE0 + numTextures);
nodeGl.bindTexture(nodeGl.TEXTURE_2D, value);
shaderUniform.set(numTextures);
numTextures++;
} else if (value instanceof SourceNode ||
value instanceof EffectNode ||
value instanceof TransformNode) {
if (value.texture) {
nodeGl.activeTexture(nodeGl.TEXTURE0 + numTextures);
nodeGl.bindTexture(nodeGl.TEXTURE_2D, value.texture);
shaderUniform.set(numTextures);
numTextures++;
}
} else if(value !== undefined && value !== null) {
shaderUniform.set(value);
}
}
}
}
//default for clear is true
if (!options || options.clear === undefined || options.clear) {
nodeGl.clearColor(0.0, 0.0, 0.0, 0.0);
nodeGl.clear(nodeGl.COLOR_BUFFER_BIT | nodeGl.DEPTH_BUFFER_BIT);
}
// draw!
nodeGl.drawElements(model.mode, model.length, nodeGl.UNSIGNED_SHORT, 0);
//to protect other 3D libraries that may not remember to turn their depth tests on
gl.enable(gl.DEPTH_TEST);
}