molstar
Version:
A comprehensive macromolecular library.
206 lines (205 loc) • 10 kB
JavaScript
/**
* 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') });