/** * Copyright (c) 2018-2019 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose */ import { Program } from './webgl/program'; import { RenderableValues, Values, RenderableSchema } from './renderable/schema'; import { GraphicsRenderItem, ComputeRenderItem, GraphicsRenderVariant } from './webgl/render-item'; import { ValueCell } from 'mol-util'; import { idFactory } from 'mol-util/id-factory'; import { clamp } from 'mol-math/interpolate'; const getNextRenderableId = idFactory() export type RenderableState = { visible: boolean alphaFactor: number pickable: boolean opaque: boolean } export interface Renderable { readonly id: number readonly materialId: number readonly values: T readonly state: RenderableState render: (variant: GraphicsRenderVariant) => void getProgram: (variant: GraphicsRenderVariant) => Program update: () => void dispose: () => void } export function createRenderable>(renderItem: GraphicsRenderItem, values: T, state: RenderableState): Renderable { return { id: getNextRenderableId(), materialId: renderItem.materialId, values, state, render: (variant: GraphicsRenderVariant) => { if (values.uAlpha && values.alpha) { ValueCell.updateIfChanged(values.uAlpha, clamp(values.alpha.ref.value * state.alphaFactor, 0, 1)) } if (values.uPickable) { ValueCell.updateIfChanged(values.uPickable, state.pickable ? 1 : 0) } renderItem.render(variant) }, getProgram: (variant: GraphicsRenderVariant) => renderItem.getProgram(variant), update: () => renderItem.update(), dispose: () => renderItem.destroy() } } // export interface ComputeRenderable { readonly id: number readonly values: T render: () => void update: () => void dispose: () => void } export function createComputeRenderable>(renderItem: ComputeRenderItem, values: T): ComputeRenderable { return { id: getNextRenderableId(), values, render: () => renderItem.render('compute'), update: () => renderItem.update(), dispose: () => renderItem.destroy() } }