/** * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose */ import { ValueCell } from 'mol-util'; import { ArrayKind, BufferItemSize, ElementsKind, AttributeValues } from '../webgl/buffer'; import { UniformKind, UniformValues } from '../webgl/uniform'; import { DefineKind, DefineValues } from '../shader-code'; import { Vec2, Vec3, Vec4, Mat3, Mat4 } from 'mol-math/linear-algebra'; import { TextureImage } from './util'; import { TextureValues, TextureType, TextureFormat, TextureFilter, TextureKind } from '../webgl/texture'; export type ValueKindType = { 'number': number 'string': string 'any': any } export type ValueKind = keyof ValueKindType // export type KindValue = { 'f': number 'i': number 'v2': Vec2 'v3': Vec3 'v4': Vec4 'm3': Mat3 'm4': Mat4 't2': number 'uint8': Uint8Array 'int8': Int8Array 'uint16': Uint16Array 'int16': Int16Array 'uint32': Uint32Array 'int32': Int32Array 'float32': Float32Array 'image-uint8': TextureImage 'image-float32': TextureImage 'number': number 'string': string 'boolean': boolean 'any': any } export type Values = { [k in keyof S]: ValueCell } export function splitValues(schema: RenderableSchema, values: RenderableValues) { const attributeValues: AttributeValues = {} const defineValues: DefineValues = {} const textureValues: TextureValues = {} const uniformValues: UniformValues = {} Object.keys(values).forEach(k => { if (schema[k].type === 'attribute') attributeValues[k] = values[k] if (schema[k].type === 'define') defineValues[k] = values[k] if (schema[k].type === 'texture') textureValues[k] = values[k] if (schema[k].type === 'uniform') uniformValues[k] = values[k] }) return { attributeValues, defineValues, textureValues, uniformValues } } export type Versions = { [k in keyof T]: number } export function getValueVersions(values: T) { const versions: Versions = {} Object.keys(values).forEach(k => { versions[k] = values[k].ref.version }) return versions as Versions } // export type AttributeSpec = { type: 'attribute', kind: K, itemSize: BufferItemSize, divisor: number } export function AttributeSpec(kind: K, itemSize: BufferItemSize, divisor: number): AttributeSpec { return { type: 'attribute', kind, itemSize, divisor } } export type UniformSpec = { type: 'uniform', kind: K } export function UniformSpec(kind: K): UniformSpec { return { type: 'uniform', kind } } export type TextureSpec = { type: 'texture', kind: K, format: TextureFormat, dataType: TextureType, filter: TextureFilter } export function TextureSpec(kind: K, format: TextureFormat, dataType: TextureType, filter: TextureFilter): TextureSpec { return { type: 'texture', kind, format, dataType, filter } } export type ElementsSpec = { type: 'elements', kind: K } export function ElementsSpec(kind: K): ElementsSpec { return { type: 'elements', kind } } export type DefineSpec = { type: 'define', kind: K, options?: string[] } export function DefineSpec(kind: K, options?: string[]): DefineSpec { return { type: 'define', kind, options } } export type ValueSpec = { type: 'value', kind: K } export function ValueSpec(kind: K): ValueSpec { return { type: 'value', kind } } // export type RenderableSchema = { [k: string]: ( AttributeSpec | UniformSpec | TextureSpec | ValueSpec | DefineSpec | ElementsSpec ) } export type RenderableValues = { [k: string]: ValueCell } // export const GlobalUniformSchema = { uModel: UniformSpec('m4'), uView: UniformSpec('m4'), uInvView: UniformSpec('m4'), uModelView: UniformSpec('m4'), uInvModelView: UniformSpec('m4'), uProjection: UniformSpec('m4'), // uLightPosition: Uniform('v3'), uLightColor: UniformSpec('v3'), uLightAmbient: UniformSpec('v3'), uPixelRatio: UniformSpec('f'), uViewportHeight: UniformSpec('f'), uHighlightColor: UniformSpec('v3'), uSelectColor: UniformSpec('v3'), uFogNear: UniformSpec('f'), uFogFar: UniformSpec('f'), uFogColor: UniformSpec('v3'), } export type GlobalUniformSchema = typeof GlobalUniformSchema export type GlobalUniformValues = { [k in keyof GlobalUniformSchema]: ValueCell } export const InternalSchema = { dWebGL2: DefineSpec('boolean'), uObjectId: UniformSpec('i'), } export type InternalSchema = typeof InternalSchema export type InternalValues = { [k in keyof InternalSchema]: ValueCell } export const ColorSchema = { aColor: AttributeSpec('float32', 3, 0), uColor: UniformSpec('v3'), uColorTexDim: UniformSpec('v2'), tColor: TextureSpec('image-uint8', 'rgb', 'ubyte', 'nearest'), dColorType: DefineSpec('string', ['uniform', 'attribute', 'instance', 'group', 'group_instance']), } export type ColorSchema = typeof ColorSchema export type ColorValues = Values export const SizeSchema = { aSize: AttributeSpec('float32', 1, 0), uSize: UniformSpec('f'), uSizeTexDim: UniformSpec('v2'), tSize: TextureSpec('image-uint8', 'alpha', 'ubyte', 'nearest'), dSizeType: DefineSpec('string', ['uniform', 'attribute', 'instance', 'group', 'group_instance']), } export type SizeSchema = typeof SizeSchema export type SizeValues = Values export const BaseSchema = { ...ColorSchema, aInstance: AttributeSpec('float32', 1, 1), aGroup: AttributeSpec('float32', 1, 0), aTransform: AttributeSpec('float32', 16, 1), uAlpha: UniformSpec('f'), uInstanceCount: UniformSpec('i'), uGroupCount: UniformSpec('i'), uMarkerTexDim: UniformSpec('v2'), tMarker: TextureSpec('image-uint8', 'alpha', 'ubyte', 'nearest'), drawCount: ValueSpec('number'), instanceCount: ValueSpec('number'), dUseFog: DefineSpec('boolean'), } export type BaseSchema = typeof BaseSchema export type BaseValues = Values