mirror of
https://github.com/DanielnetoDotCom/YouPHPTube
synced 2025-10-03 09:49:28 +02:00
105 lines
3.2 KiB
JavaScript
105 lines
3.2 KiB
JavaScript
function WGLUPreserveGLState(gl, bindings, callback) {
|
|
if (!bindings) {
|
|
callback(gl);
|
|
return;
|
|
}
|
|
|
|
var boundValues = [];
|
|
|
|
var activeTexture = null;
|
|
for (var i = 0; i < bindings.length; ++i) {
|
|
var binding = bindings[i];
|
|
switch (binding) {
|
|
case gl.TEXTURE_BINDING_2D:
|
|
case gl.TEXTURE_BINDING_CUBE_MAP:
|
|
var textureUnit = bindings[++i];
|
|
if (textureUnit < gl.TEXTURE0 || textureUnit > gl.TEXTURE31) {
|
|
console.error("TEXTURE_BINDING_2D or TEXTURE_BINDING_CUBE_MAP must be followed by a valid texture unit");
|
|
boundValues.push(null, null);
|
|
break;
|
|
}
|
|
if (!activeTexture) {
|
|
activeTexture = gl.getParameter(gl.ACTIVE_TEXTURE);
|
|
}
|
|
gl.activeTexture(textureUnit);
|
|
boundValues.push(gl.getParameter(binding), null);
|
|
break;
|
|
case gl.ACTIVE_TEXTURE:
|
|
activeTexture = gl.getParameter(gl.ACTIVE_TEXTURE);
|
|
boundValues.push(null);
|
|
break;
|
|
default:
|
|
boundValues.push(gl.getParameter(binding));
|
|
break;
|
|
}
|
|
}
|
|
|
|
callback(gl);
|
|
|
|
for (var i = 0; i < bindings.length; ++i) {
|
|
var binding = bindings[i];
|
|
var boundValue = boundValues[i];
|
|
switch (binding) {
|
|
case gl.ACTIVE_TEXTURE:
|
|
break; // Ignore this binding, since we special-case it to happen last.
|
|
case gl.ARRAY_BUFFER_BINDING:
|
|
gl.bindBuffer(gl.ARRAY_BUFFER, boundValue);
|
|
break;
|
|
case gl.COLOR_CLEAR_VALUE:
|
|
gl.clearColor(boundValue[0], boundValue[1], boundValue[2], boundValue[3]);
|
|
break;
|
|
case gl.COLOR_WRITEMASK:
|
|
gl.colorMask(boundValue[0], boundValue[1], boundValue[2], boundValue[3]);
|
|
break;
|
|
case gl.CURRENT_PROGRAM:
|
|
gl.useProgram(boundValue);
|
|
break;
|
|
case gl.ELEMENT_ARRAY_BUFFER_BINDING:
|
|
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, boundValue);
|
|
break;
|
|
case gl.FRAMEBUFFER_BINDING:
|
|
gl.bindFramebuffer(gl.FRAMEBUFFER, boundValue);
|
|
break;
|
|
case gl.RENDERBUFFER_BINDING:
|
|
gl.bindRenderbuffer(gl.RENDERBUFFER, boundValue);
|
|
break;
|
|
case gl.TEXTURE_BINDING_2D:
|
|
var textureUnit = bindings[++i];
|
|
if (textureUnit < gl.TEXTURE0 || textureUnit > gl.TEXTURE31)
|
|
break;
|
|
gl.activeTexture(textureUnit);
|
|
gl.bindTexture(gl.TEXTURE_2D, boundValue);
|
|
break;
|
|
case gl.TEXTURE_BINDING_CUBE_MAP:
|
|
var textureUnit = bindings[++i];
|
|
if (textureUnit < gl.TEXTURE0 || textureUnit > gl.TEXTURE31)
|
|
break;
|
|
gl.activeTexture(textureUnit);
|
|
gl.bindTexture(gl.TEXTURE_CUBE_MAP, boundValue);
|
|
break;
|
|
case gl.VIEWPORT:
|
|
gl.viewport(boundValue[0], boundValue[1], boundValue[2], boundValue[3]);
|
|
break;
|
|
case gl.BLEND:
|
|
case gl.CULL_FACE:
|
|
case gl.DEPTH_TEST:
|
|
case gl.SCISSOR_TEST:
|
|
case gl.STENCIL_TEST:
|
|
if (boundValue) {
|
|
gl.enable(binding);
|
|
} else {
|
|
gl.disable(binding);
|
|
}
|
|
break;
|
|
default:
|
|
console.log("No GL restore behavior for 0x" + binding.toString(16));
|
|
break;
|
|
}
|
|
|
|
if (activeTexture) {
|
|
gl.activeTexture(activeTexture);
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = WGLUPreserveGLState;
|