UNPKG

molstar

Version:

A comprehensive macromolecular library.

127 lines (126 loc) 4.27 kB
/** * Copyright (c) 2018-2025 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose <alexander.rose@weirdbyte.de> */ import { ValueCell } from '../../mol-util'; import { deepClone } from '../../mol-util/object'; export function getUniformType(gl, kind) { switch (kind) { case 'b': case 'b[]': return gl.BOOL; case 'f': case 'f[]': return gl.FLOAT; case 'i': case 'i[]': return gl.INT; case 'v2': case 'v2[]': return gl.FLOAT_VEC2; case 'v3': case 'v3[]': return gl.FLOAT_VEC3; case 'v4': case 'v4[]': return gl.FLOAT_VEC4; case 'q': case 'q[]': return gl.FLOAT_VEC4; case 'iv2': case 'iv2[]': return gl.INT_VEC2; case 'iv3': case 'iv3[]': return gl.INT_VEC3; case 'iv4': case 'iv4[]': return gl.INT_VEC4; case 'm3': case 'm3[]': return gl.FLOAT_MAT3; case 'm4': case 'm4[]': return gl.FLOAT_MAT4; default: console.error(`unknown uniform kind '${kind}'`); } } export function isArrayUniform(kind) { return kind.endsWith('[]'); } function uniform1f(gl, location, value) { gl.uniform1f(location, value); } function uniform1fv(gl, location, value) { gl.uniform1fv(location, value); } function uniform1i(gl, location, value) { gl.uniform1i(location, value); } function uniform1iv(gl, location, value) { gl.uniform1iv(location, value); } function uniform2fv(gl, location, value) { gl.uniform2fv(location, value); } function uniform3fv(gl, location, value) { gl.uniform3fv(location, value); } function uniform4fv(gl, location, value) { gl.uniform4fv(location, value); } function uniform2iv(gl, location, value) { gl.uniform2iv(location, value); } function uniform3iv(gl, location, value) { gl.uniform3iv(location, value); } function uniform4iv(gl, location, value) { gl.uniform4iv(location, value); } function uniformMatrix3fv(gl, location, value) { gl.uniformMatrix3fv(location, false, value); } function uniformMatrix4fv(gl, location, value) { gl.uniformMatrix4fv(location, false, value); } function getUniformSetter(kind) { switch (kind) { case 'f': return uniform1f; case 'f[]': return uniform1fv; case 'i': case 't': case 'b': return uniform1i; case 'i[]': case 't[]': case 'b[]': return uniform1iv; case 'v2': case 'v2[]': return uniform2fv; case 'v3': case 'v3[]': return uniform3fv; case 'v4': case 'v4[]': return uniform4fv; case 'q': case 'q[]': return uniform4fv; case 'iv2': case 'iv2[]': return uniform2iv; case 'iv3': case 'iv3[]': return uniform3iv; case 'iv4': case 'iv4[]': return uniform4iv; case 'm3': case 'm3[]': return uniformMatrix3fv; case 'm4': case 'm4[]': return uniformMatrix4fv; } } export function getUniformSetters(schema) { const setters = {}; Object.keys(schema).forEach(k => { const spec = schema[k]; if (spec.type === 'uniform') { setters[k] = getUniformSetter(spec.kind); } else if (spec.type === 'texture') { setters[k] = getUniformSetter('t'); } }); return setters; } export function getUniformGlslType(kind) { switch (kind) { case 'f': return 'float'; case 'i': return 'int'; case 't': return 'sampler2D'; case 'b': return 'bool'; case 'v2': return 'vec2'; case 'v3': return 'vec3'; case 'v4': return 'vec4'; case 'q': return 'vec4'; case 'm3': return 'mat3'; case 'm4': return 'mat4'; } throw new Error(`${kind} has no primitive GLSL type.`); } export function isUniformValueScalar(kind) { switch (kind) { case 'f': case 'i': case 'b': return true; default: return false; } } export function cloneUniformValues(uniformValues) { const clonedValues = {}; Object.keys(uniformValues).forEach(k => { clonedValues[k] = ValueCell.create(deepClone(uniformValues[k].ref.value)); }); return clonedValues; }