UNPKG

molstar

Version:

A comprehensive macromolecular library.

192 lines (191 loc) 8.77 kB
/** * 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); } }; }