UNPKG

molstar

Version:

A comprehensive macromolecular library.

206 lines (205 loc) 10 kB
/** * Copyright (c) 2018-2022 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose <alexander.rose@weirdbyte.de> * @author Gianluca Tomasello <giagitom@gmail.com> */ import { __assign } from "tslib"; export function splitValues(schema, values) { var attributeValues = {}; var defineValues = {}; var textureValues = {}; var materialTextureValues = {}; var uniformValues = {}; var materialUniformValues = {}; var bufferedUniformValues = {}; Object.keys(schema).forEach(function (k) { var spec = schema[k]; if (spec.type === 'attribute') attributeValues[k] = values[k]; if (spec.type === 'define') defineValues[k] = values[k]; // check if k exists in values to exclude global textures if (spec.type === 'texture' && values[k] !== undefined) { if (spec.variant === 'material') materialTextureValues[k] = values[k]; else textureValues[k] = values[k]; } // check if k exists in values to exclude global uniforms if (spec.type === 'uniform' && values[k] !== undefined) { if (spec.variant === 'material') materialUniformValues[k] = values[k]; else if (spec.variant === 'buffered') bufferedUniformValues[k] = values[k]; else uniformValues[k] = values[k]; } }); return { attributeValues: attributeValues, defineValues: defineValues, textureValues: textureValues, materialTextureValues: materialTextureValues, uniformValues: uniformValues, materialUniformValues: materialUniformValues, bufferedUniformValues: bufferedUniformValues }; } export function getValueVersions(values) { var versions = {}; Object.keys(values).forEach(function (k) { versions[k] = values[k].ref.version; }); return versions; } export function AttributeSpec(kind, itemSize, divisor) { return { type: 'attribute', kind: kind, itemSize: itemSize, divisor: divisor }; } export function UniformSpec(kind, variant) { return { type: 'uniform', kind: kind, variant: variant }; } export function TextureSpec(kind, format, dataType, filter, variant) { return { type: 'texture', kind: kind, format: format, dataType: dataType, filter: filter, variant: variant }; } export function ElementsSpec(kind) { return { type: 'elements', kind: kind }; } export function DefineSpec(kind, options) { return { type: 'define', kind: kind, options: options }; } export function ValueSpec(kind) { return { type: 'value', kind: kind }; } // export var GlobalUniformSchema = { uModel: UniformSpec('m4'), uView: UniformSpec('m4'), uInvView: UniformSpec('m4'), uModelView: UniformSpec('m4'), uInvModelView: UniformSpec('m4'), uProjection: UniformSpec('m4'), uInvProjection: UniformSpec('m4'), uModelViewProjection: UniformSpec('m4'), uInvModelViewProjection: UniformSpec('m4'), uIsOrtho: UniformSpec('f'), uPixelRatio: UniformSpec('f'), uViewport: UniformSpec('v4'), uViewOffset: UniformSpec('v2'), uDrawingBufferSize: UniformSpec('v2'), uCameraPosition: UniformSpec('v3'), uCameraDir: UniformSpec('v3'), uNear: UniformSpec('f'), uFar: UniformSpec('f'), uFogNear: UniformSpec('f'), uFogFar: UniformSpec('f'), uFogColor: UniformSpec('v3'), uTransparentBackground: UniformSpec('b'), uLightDirection: UniformSpec('v3[]'), uLightColor: UniformSpec('v3[]'), uAmbientColor: UniformSpec('v3'), uPickingAlphaThreshold: UniformSpec('f'), uInteriorDarkening: UniformSpec('f'), uInteriorColorFlag: UniformSpec('b'), uInteriorColor: UniformSpec('v3'), uHighlightColor: UniformSpec('v3'), uSelectColor: UniformSpec('v3'), uHighlightStrength: UniformSpec('f'), uSelectStrength: UniformSpec('f'), uMarkerPriority: UniformSpec('i'), uXrayEdgeFalloff: UniformSpec('f'), uRenderMask: UniformSpec('i'), uMarkingDepthTest: UniformSpec('b'), uMarkingType: UniformSpec('i'), uPickType: UniformSpec('i'), }; export var GlobalTextureSchema = { tDepth: TextureSpec('texture', 'depth', 'ushort', 'nearest'), // dpoit tDpoitDepth: TextureSpec('texture', 'rg', 'float', 'nearest'), tDpoitFrontColor: TextureSpec('texture', 'rgba', 'float', 'nearest'), tDpoitBackColor: TextureSpec('texture', 'rgba', 'float', 'nearest') }; export var InternalSchema = { uObjectId: UniformSpec('i'), }; export var ColorSchema = { // aColor: AttributeSpec('float32', 3, 0), // TODO uColor: UniformSpec('v3', 'material'), uColorTexDim: UniformSpec('v2'), uColorGridDim: UniformSpec('v3'), uColorGridTransform: UniformSpec('v4'), tColor: TextureSpec('image-uint8', 'rgb', 'ubyte', 'nearest'), tPalette: TextureSpec('image-uint8', 'rgb', 'ubyte', 'nearest'), tColorGrid: TextureSpec('texture', 'rgb', 'ubyte', 'linear'), dColorType: DefineSpec('string', ['uniform', 'attribute', 'instance', 'group', 'groupInstance', 'vertex', 'vertexInstance', 'volume', 'volumeInstance', 'direct']), dUsePalette: DefineSpec('boolean'), }; export var SizeSchema = { // aSize: AttributeSpec('float32', 1, 0), // TODO uSize: UniformSpec('f', 'material'), uSizeTexDim: UniformSpec('v2'), tSize: TextureSpec('image-uint8', 'rgb', 'ubyte', 'nearest'), dSizeType: DefineSpec('string', ['uniform', 'attribute', 'instance', 'group', 'groupInstance']), uSizeFactor: UniformSpec('f', 'material'), }; export var MarkerSchema = { uMarker: UniformSpec('f'), uMarkerTexDim: UniformSpec('v2'), tMarker: TextureSpec('image-uint8', 'alpha', 'ubyte', 'nearest'), markerAverage: ValueSpec('number'), markerStatus: ValueSpec('number'), dMarkerType: DefineSpec('string', ['instance', 'groupInstance']), }; export var OverpaintSchema = { uOverpaintTexDim: UniformSpec('v2'), tOverpaint: TextureSpec('image-uint8', 'rgba', 'ubyte', 'nearest'), dOverpaint: DefineSpec('boolean'), uOverpaintGridDim: UniformSpec('v3'), uOverpaintGridTransform: UniformSpec('v4'), tOverpaintGrid: TextureSpec('texture', 'rgba', 'ubyte', 'linear'), dOverpaintType: DefineSpec('string', ['instance', 'groupInstance', 'volumeInstance']), }; export var TransparencySchema = { uTransparencyTexDim: UniformSpec('v2'), tTransparency: TextureSpec('image-uint8', 'alpha', 'ubyte', 'nearest'), dTransparency: DefineSpec('boolean'), transparencyAverage: ValueSpec('number'), uTransparencyGridDim: UniformSpec('v3'), uTransparencyGridTransform: UniformSpec('v4'), tTransparencyGrid: TextureSpec('texture', 'alpha', 'ubyte', 'linear'), dTransparencyType: DefineSpec('string', ['instance', 'groupInstance', 'volumeInstance']) }; export var SubstanceSchema = { uSubstanceTexDim: UniformSpec('v2'), tSubstance: TextureSpec('image-uint8', 'rgba', 'ubyte', 'nearest'), dSubstance: DefineSpec('boolean'), uSubstanceGridDim: UniformSpec('v3'), uSubstanceGridTransform: UniformSpec('v4'), tSubstanceGrid: TextureSpec('texture', 'rgba', 'ubyte', 'linear'), dSubstanceType: DefineSpec('string', ['instance', 'groupInstance', 'volumeInstance']), }; export var ClippingSchema = { uClippingTexDim: UniformSpec('v2'), tClipping: TextureSpec('image-uint8', 'alpha', 'ubyte', 'nearest'), dClipping: DefineSpec('boolean'), dClippingType: DefineSpec('string', ['instance', 'groupInstance']), }; export var BaseSchema = __assign(__assign(__assign(__assign(__assign(__assign(__assign({ dGeometryType: DefineSpec('string', ['cylinders', 'directVolume', 'image', 'lines', 'mesh', 'points', 'spheres', 'text', 'textureMesh']) }, ColorSchema), MarkerSchema), OverpaintSchema), TransparencySchema), SubstanceSchema), ClippingSchema), { dLightCount: DefineSpec('number'), dColorMarker: DefineSpec('boolean'), dClipObjectCount: DefineSpec('number'), dClipVariant: DefineSpec('string', ['instance', 'pixel']), uClipObjectType: UniformSpec('i[]', 'material'), uClipObjectInvert: UniformSpec('b[]', 'material'), uClipObjectPosition: UniformSpec('v3[]', 'material'), uClipObjectRotation: UniformSpec('v4[]', 'material'), uClipObjectScale: UniformSpec('v3[]', 'material'), aInstance: AttributeSpec('float32', 1, 1), /** * final per-instance transform calculated for instance `i` as * `aTransform[i] = matrix * transform[i] * extraTransform[i]` */ aTransform: AttributeSpec('float32', 16, 1), /** * final alpha, calculated as `values.alpha * state.alpha` */ uAlpha: UniformSpec('f', 'material'), uMetalness: UniformSpec('f', 'material'), uRoughness: UniformSpec('f', 'material'), uBumpiness: UniformSpec('f', 'material'), uVertexCount: UniformSpec('i'), uInstanceCount: UniformSpec('i'), uGroupCount: UniformSpec('i'), uInvariantBoundingSphere: UniformSpec('v4'), drawCount: ValueSpec('number'), instanceCount: ValueSpec('number'), /** base alpha, see uAlpha */ alpha: ValueSpec('number'), /** global transform, see aTransform */ matrix: ValueSpec('m4'), /** base per-instance transform, see aTransform */ transform: ValueSpec('float32'), /** additional per-instance transform, see aTransform */ extraTransform: ValueSpec('float32'), /** denotes reflection in transform */ hasReflection: ValueSpec('boolean'), /** use instance granularity for marker, transparency, clipping, overpaint, substance */ instanceGranularity: ValueSpec('boolean'), /** bounding sphere taking aTransform into account and encompases all instances */ boundingSphere: ValueSpec('sphere'), /** bounding sphere NOT taking aTransform into account */ invariantBoundingSphere: ValueSpec('sphere') });