UNPKG

molstar

Version:

A comprehensive macromolecular library.

342 lines (341 loc) 17.2 kB
"use strict"; /** * Copyright (c) 2018-2024 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose <alexander.rose@weirdbyte.de> */ Object.defineProperty(exports, "__esModule", { value: true }); exports.createState = createState; function createState(gl, e) { let enabledCapabilities = {}; let currentFrontFace = gl.getParameter(gl.FRONT_FACE); let currentCullFace = gl.getParameter(gl.CULL_FACE_MODE); let currentDepthMask = gl.getParameter(gl.DEPTH_WRITEMASK); let currentClearDepth = gl.getParameter(gl.DEPTH_CLEAR_VALUE); let currentDepthFunc = gl.getParameter(gl.DEPTH_FUNC); let currentColorMask = gl.getParameter(gl.COLOR_WRITEMASK); let currentClearColor = gl.getParameter(gl.COLOR_CLEAR_VALUE); let currentBlendSrcRGB = gl.getParameter(gl.BLEND_SRC_RGB); let currentBlendDstRGB = gl.getParameter(gl.BLEND_DST_RGB); let currentBlendSrcAlpha = gl.getParameter(gl.BLEND_SRC_ALPHA); let currentBlendDstAlpha = gl.getParameter(gl.BLEND_DST_ALPHA); let currentBlendColor = gl.getParameter(gl.BLEND_COLOR); let currentBlendEqRGB = gl.getParameter(gl.BLEND_EQUATION_RGB); let currentBlendEqAlpha = gl.getParameter(gl.BLEND_EQUATION_ALPHA); let currentStencilFunc = gl.getParameter(gl.STENCIL_FUNC); let currentStencilValueMask = gl.getParameter(gl.STENCIL_VALUE_MASK); let currentStencilRef = gl.getParameter(gl.STENCIL_REF); let currentStencilBackFunc = gl.getParameter(gl.STENCIL_BACK_FUNC); let currentStencilBackValueMask = gl.getParameter(gl.STENCIL_BACK_VALUE_MASK); let currentStencilBackRef = gl.getParameter(gl.STENCIL_BACK_REF); let currentStencilWriteMask = gl.getParameter(gl.STENCIL_WRITEMASK); let currentStencilBackWriteMask = gl.getParameter(gl.STENCIL_BACK_WRITEMASK); let currentStencilFail = gl.getParameter(gl.STENCIL_FAIL); let currentStencilPassDepthPass = gl.getParameter(gl.STENCIL_PASS_DEPTH_PASS); let currentStencilPassDepthFail = gl.getParameter(gl.STENCIL_PASS_DEPTH_FAIL); let currentStencilBackFail = gl.getParameter(gl.STENCIL_BACK_FAIL); let currentStencilBackPassDepthPass = gl.getParameter(gl.STENCIL_BACK_PASS_DEPTH_PASS); let currentStencilBackPassDepthFail = gl.getParameter(gl.STENCIL_BACK_PASS_DEPTH_FAIL); let maxVertexAttribs = gl.getParameter(gl.MAX_VERTEX_ATTRIBS); const vertexAttribsState = []; let currentViewport = gl.getParameter(gl.VIEWPORT); let currentScissor = gl.getParameter(gl.SCISSOR_BOX); let currentClipOrigin = e.clipControl ? gl.getParameter(e.clipControl.CLIP_ORIGIN) : -1; let currentClipDepthMode = e.clipControl ? gl.getParameter(e.clipControl.CLIP_DEPTH_MODE) : -1; const clearVertexAttribsState = () => { for (let i = 0; i < maxVertexAttribs; ++i) { vertexAttribsState[i] = 0; } }; clearVertexAttribsState(); return { currentProgramId: -1, currentMaterialId: -1, currentRenderItemId: -1, enable: (cap) => { if (enabledCapabilities[cap] !== true) { gl.enable(cap); enabledCapabilities[cap] = true; } }, disable: (cap) => { if (enabledCapabilities[cap] !== false) { gl.disable(cap); enabledCapabilities[cap] = false; } }, frontFace: (mode) => { if (mode !== currentFrontFace) { gl.frontFace(mode); currentFrontFace = mode; } }, cullFace: (mode) => { if (mode !== currentCullFace) { gl.cullFace(mode); currentCullFace = mode; } }, depthMask: (flag) => { if (flag !== currentDepthMask) { gl.depthMask(flag); currentDepthMask = flag; } }, clearDepth: (depth) => { if (depth !== currentClearDepth) { gl.clearDepth(depth); currentClearDepth = depth; } }, depthFunc: (func) => { if (func !== currentDepthFunc) { gl.depthFunc(func); currentDepthFunc = func; } }, colorMask: (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: (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: (src, dst) => { if (src !== currentBlendSrcRGB || dst !== currentBlendDstRGB || src !== currentBlendSrcAlpha || dst !== currentBlendDstAlpha) { gl.blendFunc(src, dst); currentBlendSrcRGB = src; currentBlendDstRGB = dst; currentBlendSrcAlpha = src; currentBlendDstAlpha = dst; } }, blendFuncSeparate: (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: (mode) => { if (mode !== currentBlendEqRGB || mode !== currentBlendEqAlpha) { gl.blendEquation(mode); currentBlendEqRGB = mode; currentBlendEqAlpha = mode; } }, blendEquationSeparate: (modeRGB, modeAlpha) => { if (modeRGB !== currentBlendEqRGB || modeAlpha !== currentBlendEqAlpha) { gl.blendEquationSeparate(modeRGB, modeAlpha); currentBlendEqRGB = modeRGB; currentBlendEqAlpha = modeAlpha; } }, blendColor: (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; } }, stencilFunc: (func, ref, mask) => { if (func !== currentStencilFunc || ref !== currentStencilRef || mask !== currentStencilValueMask || func !== currentStencilBackFunc || ref !== currentStencilBackRef || mask !== currentStencilBackValueMask) { gl.stencilFunc(func, ref, mask); currentStencilFunc = func; currentStencilRef = ref; currentStencilValueMask = mask; currentStencilBackFunc = func; currentStencilBackRef = ref; currentStencilBackValueMask = mask; } }, stencilFuncSeparate: (face, func, ref, mask) => { if (face === gl.FRONT) { if (func !== currentStencilFunc || ref !== currentStencilRef || mask !== currentStencilValueMask) { gl.stencilFuncSeparate(face, func, ref, mask); currentStencilFunc = func; currentStencilRef = ref; currentStencilValueMask = mask; } } else if (face === gl.BACK) { if (func !== currentStencilBackFunc || ref !== currentStencilBackRef || mask !== currentStencilBackValueMask) { gl.stencilFuncSeparate(face, func, ref, mask); currentStencilBackFunc = func; currentStencilBackRef = ref; currentStencilBackValueMask = mask; } } else if (face === gl.FRONT_AND_BACK) { if (func !== currentStencilFunc || ref !== currentStencilRef || mask !== currentStencilValueMask || func !== currentStencilBackFunc || ref !== currentStencilBackRef || mask !== currentStencilBackValueMask) { gl.stencilFuncSeparate(face, func, ref, mask); currentStencilFunc = func; currentStencilRef = ref; currentStencilValueMask = mask; currentStencilBackFunc = func; currentStencilBackRef = ref; currentStencilBackValueMask = mask; } } }, stencilMask: (mask) => { if (mask !== currentStencilWriteMask || mask !== currentStencilBackWriteMask) { gl.stencilMask(mask); currentStencilWriteMask = mask; currentStencilBackWriteMask = mask; } }, stencilMaskSeparate: (face, mask) => { if (face === gl.FRONT) { if (mask !== currentStencilWriteMask) { gl.stencilMaskSeparate(face, mask); currentStencilWriteMask = mask; } } else if (face === gl.BACK) { if (mask !== currentStencilBackWriteMask) { gl.stencilMaskSeparate(face, mask); currentStencilBackWriteMask = mask; } } else if (face === gl.FRONT_AND_BACK) { if (mask !== currentStencilWriteMask || mask !== currentStencilBackWriteMask) { gl.stencilMaskSeparate(face, mask); currentStencilWriteMask = mask; currentStencilBackWriteMask = mask; } } }, stencilOp: (fail, zfail, zpass) => { if (fail !== currentStencilFail || zfail !== currentStencilPassDepthFail || zpass !== currentStencilPassDepthPass || fail !== currentStencilBackFail || zfail !== currentStencilBackPassDepthFail || zpass !== currentStencilBackPassDepthPass) { gl.stencilOp(fail, zfail, zpass); currentStencilFail = fail; currentStencilPassDepthFail = zfail; currentStencilPassDepthPass = zpass; currentStencilBackFail = fail; currentStencilBackPassDepthFail = zfail; currentStencilBackPassDepthPass = zpass; } }, stencilOpSeparate: (face, fail, zfail, zpass) => { if (face === gl.FRONT) { if (fail !== currentStencilFail || zfail !== currentStencilPassDepthFail || zpass !== currentStencilPassDepthPass) { gl.stencilOpSeparate(face, fail, zfail, zpass); currentStencilFail = fail; currentStencilPassDepthFail = zfail; currentStencilPassDepthPass = zpass; } } else if (face === gl.BACK) { if (fail !== currentStencilBackFail || zfail !== currentStencilBackPassDepthFail || zpass !== currentStencilBackPassDepthPass) { gl.stencilOpSeparate(face, fail, zfail, zpass); currentStencilBackFail = fail; currentStencilBackPassDepthFail = zfail; currentStencilBackPassDepthPass = zpass; } } else if (face === gl.FRONT_AND_BACK) { if (fail !== currentStencilFail || zfail !== currentStencilPassDepthFail || zpass !== currentStencilPassDepthPass || fail !== currentStencilBackFail || zfail !== currentStencilBackPassDepthFail || zpass !== currentStencilBackPassDepthPass) { gl.stencilOpSeparate(face, fail, zfail, zpass); currentStencilFail = fail; currentStencilPassDepthFail = zfail; currentStencilPassDepthPass = zpass; currentStencilBackFail = fail; currentStencilBackPassDepthFail = zfail; currentStencilBackPassDepthPass = zpass; } } }, enableVertexAttrib: (index) => { gl.enableVertexAttribArray(index); vertexAttribsState[index] = 1; }, clearVertexAttribsState, disableUnusedVertexAttribs: () => { for (let i = 0; i < maxVertexAttribs; ++i) { if (vertexAttribsState[i] === 0) gl.disableVertexAttribArray(i); } }, viewport: (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: (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; } }, clipControl: e.clipControl ? (origin, depth) => { if (origin !== currentClipOrigin || depth !== currentClipDepthMode) { e.clipControl.clipControl(origin, depth); currentClipOrigin = origin; currentClipDepthMode = depth; } } : undefined, reset: () => { 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); currentStencilFunc = gl.getParameter(gl.STENCIL_FUNC); currentStencilValueMask = gl.getParameter(gl.STENCIL_VALUE_MASK); currentStencilRef = gl.getParameter(gl.STENCIL_REF); currentStencilBackFunc = gl.getParameter(gl.STENCIL_BACK_FUNC); currentStencilBackValueMask = gl.getParameter(gl.STENCIL_BACK_VALUE_MASK); currentStencilBackRef = gl.getParameter(gl.STENCIL_BACK_REF); currentStencilWriteMask = gl.getParameter(gl.STENCIL_WRITEMASK); currentStencilBackWriteMask = gl.getParameter(gl.STENCIL_BACK_WRITEMASK); currentStencilFail = gl.getParameter(gl.STENCIL_FAIL); currentStencilPassDepthPass = gl.getParameter(gl.STENCIL_PASS_DEPTH_PASS); currentStencilPassDepthFail = gl.getParameter(gl.STENCIL_PASS_DEPTH_FAIL); currentStencilBackFail = gl.getParameter(gl.STENCIL_BACK_FAIL); currentStencilBackPassDepthPass = gl.getParameter(gl.STENCIL_BACK_PASS_DEPTH_PASS); currentStencilBackPassDepthFail = gl.getParameter(gl.STENCIL_BACK_PASS_DEPTH_FAIL); maxVertexAttribs = gl.getParameter(gl.MAX_VERTEX_ATTRIBS); vertexAttribsState.length = 0; for (let i = 0; i < maxVertexAttribs; ++i) { vertexAttribsState[i] = 0; } currentViewport = gl.getParameter(gl.VIEWPORT); currentScissor = gl.getParameter(gl.SCISSOR_BOX); currentClipOrigin = e.clipControl ? gl.getParameter(e.clipControl.CLIP_ORIGIN) : -1; currentClipDepthMode = e.clipControl ? gl.getParameter(e.clipControl.CLIP_DEPTH_MODE) : -1; } }; }