molstar
Version:
A comprehensive macromolecular library.
192 lines (191 loc) • 8.77 kB
JavaScript
/**
* Copyright (c) 2018-2022 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
export function createState(gl) {
var enabledCapabilities = {};
var currentFrontFace = gl.getParameter(gl.FRONT_FACE);
var currentCullFace = gl.getParameter(gl.CULL_FACE_MODE);
var currentDepthMask = gl.getParameter(gl.DEPTH_WRITEMASK);
var currentClearDepth = gl.getParameter(gl.DEPTH_CLEAR_VALUE);
var currentDepthFunc = gl.getParameter(gl.DEPTH_FUNC);
var currentColorMask = gl.getParameter(gl.COLOR_WRITEMASK);
var currentClearColor = gl.getParameter(gl.COLOR_CLEAR_VALUE);
var currentBlendSrcRGB = gl.getParameter(gl.BLEND_SRC_RGB);
var currentBlendDstRGB = gl.getParameter(gl.BLEND_DST_RGB);
var currentBlendSrcAlpha = gl.getParameter(gl.BLEND_SRC_ALPHA);
var currentBlendDstAlpha = gl.getParameter(gl.BLEND_DST_ALPHA);
var currentBlendColor = gl.getParameter(gl.BLEND_COLOR);
var currentBlendEqRGB = gl.getParameter(gl.BLEND_EQUATION_RGB);
var currentBlendEqAlpha = gl.getParameter(gl.BLEND_EQUATION_ALPHA);
var maxVertexAttribs = gl.getParameter(gl.MAX_VERTEX_ATTRIBS);
var vertexAttribsState = [];
var currentViewport = gl.getParameter(gl.VIEWPORT);
var currentScissor = gl.getParameter(gl.SCISSOR_BOX);
var clearVertexAttribsState = function () {
for (var i = 0; i < maxVertexAttribs; ++i) {
vertexAttribsState[i] = 0;
}
};
clearVertexAttribsState();
return {
currentProgramId: -1,
currentMaterialId: -1,
currentRenderItemId: -1,
enable: function (cap) {
if (enabledCapabilities[cap] !== true) {
gl.enable(cap);
enabledCapabilities[cap] = true;
}
},
disable: function (cap) {
if (enabledCapabilities[cap] !== false) {
gl.disable(cap);
enabledCapabilities[cap] = false;
}
},
frontFace: function (mode) {
if (mode !== currentFrontFace) {
gl.frontFace(mode);
currentFrontFace = mode;
}
},
cullFace: function (mode) {
if (mode !== currentCullFace) {
gl.cullFace(mode);
currentCullFace = mode;
}
},
depthMask: function (flag) {
if (flag !== currentDepthMask) {
gl.depthMask(flag);
currentDepthMask = flag;
}
},
clearDepth: function (depth) {
if (depth !== currentClearDepth) {
gl.clearDepth(depth);
currentClearDepth = depth;
}
},
depthFunc: function (func) {
if (func !== currentDepthFunc) {
gl.depthFunc(func);
currentDepthFunc = func;
}
},
colorMask: function (red, green, blue, alpha) {
if (red !== currentColorMask[0] || green !== currentColorMask[1] || blue !== currentColorMask[2] || alpha !== currentColorMask[3]) {
gl.colorMask(red, green, blue, alpha);
currentColorMask[0] = red;
currentColorMask[1] = green;
currentColorMask[2] = blue;
currentColorMask[3] = alpha;
}
},
clearColor: function (red, green, blue, alpha) {
if (red !== currentClearColor[0] || green !== currentClearColor[1] || blue !== currentClearColor[2] || alpha !== currentClearColor[3]) {
gl.clearColor(red, green, blue, alpha);
currentClearColor[0] = red;
currentClearColor[1] = green;
currentClearColor[2] = blue;
currentClearColor[3] = alpha;
}
},
blendFunc: function (src, dst) {
if (src !== currentBlendSrcRGB || dst !== currentBlendDstRGB || src !== currentBlendSrcAlpha || dst !== currentBlendDstAlpha) {
gl.blendFunc(src, dst);
currentBlendSrcRGB = src;
currentBlendDstRGB = dst;
currentBlendSrcAlpha = src;
currentBlendDstAlpha = dst;
}
},
blendFuncSeparate: function (srcRGB, dstRGB, srcAlpha, dstAlpha) {
if (srcRGB !== currentBlendSrcRGB || dstRGB !== currentBlendDstRGB || srcAlpha !== currentBlendSrcAlpha || dstAlpha !== currentBlendDstAlpha) {
gl.blendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
currentBlendSrcRGB = srcRGB;
currentBlendDstRGB = dstRGB;
currentBlendSrcAlpha = srcAlpha;
currentBlendDstAlpha = dstAlpha;
}
},
blendEquation: function (mode) {
if (mode !== currentBlendEqRGB || mode !== currentBlendEqAlpha) {
gl.blendEquation(mode);
currentBlendEqRGB = mode;
currentBlendEqAlpha = mode;
}
},
blendEquationSeparate: function (modeRGB, modeAlpha) {
if (modeRGB !== currentBlendEqRGB || modeAlpha !== currentBlendEqAlpha) {
gl.blendEquationSeparate(modeRGB, modeAlpha);
currentBlendEqRGB = modeRGB;
currentBlendEqAlpha = modeAlpha;
}
},
blendColor: function (red, green, blue, alpha) {
if (red !== currentBlendColor[0] || green !== currentBlendColor[1] || blue !== currentBlendColor[2] || alpha !== currentBlendColor[3]) {
gl.blendColor(red, green, blue, alpha);
currentBlendColor[0] = red;
currentBlendColor[1] = green;
currentBlendColor[2] = blue;
currentBlendColor[3] = alpha;
}
},
enableVertexAttrib: function (index) {
gl.enableVertexAttribArray(index);
vertexAttribsState[index] = 1;
},
clearVertexAttribsState: clearVertexAttribsState,
disableUnusedVertexAttribs: function () {
for (var i = 0; i < maxVertexAttribs; ++i) {
if (vertexAttribsState[i] === 0)
gl.disableVertexAttribArray(i);
}
},
viewport: function (x, y, width, height) {
if (x !== currentViewport[0] || y !== currentViewport[1] || width !== currentViewport[2] || height !== currentViewport[3]) {
gl.viewport(x, y, width, height);
currentViewport[0] = x;
currentViewport[1] = y;
currentViewport[2] = width;
currentViewport[3] = height;
}
},
scissor: function (x, y, width, height) {
if (x !== currentScissor[0] || y !== currentScissor[1] || width !== currentScissor[2] || height !== currentScissor[3]) {
gl.scissor(x, y, width, height);
currentScissor[0] = x;
currentScissor[1] = y;
currentScissor[2] = width;
currentScissor[3] = height;
}
},
reset: function () {
enabledCapabilities = {};
currentFrontFace = gl.getParameter(gl.FRONT_FACE);
currentCullFace = gl.getParameter(gl.CULL_FACE_MODE);
currentDepthMask = gl.getParameter(gl.DEPTH_WRITEMASK);
currentClearDepth = gl.getParameter(gl.DEPTH_CLEAR_VALUE);
currentDepthFunc = gl.getParameter(gl.DEPTH_FUNC);
currentColorMask = gl.getParameter(gl.COLOR_WRITEMASK);
currentClearColor = gl.getParameter(gl.COLOR_CLEAR_VALUE);
currentBlendSrcRGB = gl.getParameter(gl.BLEND_SRC_RGB);
currentBlendDstRGB = gl.getParameter(gl.BLEND_DST_RGB);
currentBlendSrcAlpha = gl.getParameter(gl.BLEND_SRC_ALPHA);
currentBlendDstAlpha = gl.getParameter(gl.BLEND_DST_ALPHA);
currentBlendColor = gl.getParameter(gl.BLEND_COLOR);
currentBlendEqRGB = gl.getParameter(gl.BLEND_EQUATION_RGB);
currentBlendEqAlpha = gl.getParameter(gl.BLEND_EQUATION_ALPHA);
maxVertexAttribs = gl.getParameter(gl.MAX_VERTEX_ATTRIBS);
vertexAttribsState.length = 0;
for (var i = 0; i < maxVertexAttribs; ++i) {
vertexAttribsState[i] = 0;
}
currentViewport = gl.getParameter(gl.VIEWPORT);
currentScissor = gl.getParameter(gl.SCISSOR_BOX);
}
};
}