123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- /**
- * Copyright (c) 2019-2022 mol* contributors, licensed under MIT, See LICENSE file for more info.
- *
- * @author Alexander Rose <alexander.rose@weirdbyte.de>
- */
- import { Canvas3DProps } from '../../mol-canvas3d/canvas3d';
- import { BuiltInTrajectoryFormat } from '../../mol-plugin-state/formats/trajectory';
- import { createPluginUI } from '../../mol-plugin-ui/react18';
- import { PluginUIContext } from '../../mol-plugin-ui/context';
- import { DefaultPluginUISpec } from '../../mol-plugin-ui/spec';
- import { PluginCommands } from '../../mol-plugin/commands';
- import { Asset } from '../../mol-util/assets';
- import { Color } from '../../mol-util/color';
- import './index.html';
- require('mol-plugin-ui/skin/light.scss');
- type LoadParams = { url: string, format?: BuiltInTrajectoryFormat, isBinary?: boolean, assemblyId?: string }
- type _Preset = Pick<Canvas3DProps, 'postprocessing' | 'renderer'>
- type Preset = { [K in keyof _Preset]: Partial<_Preset[K]> }
- const Canvas3DPresets = {
- illustrative: {
- canvas3d: <Preset>{
- postprocessing: {
- occlusion: { name: 'on', params: { samples: 32, radius: 6, bias: 1.4, blurKernelSize: 15, resolutionScale: 1 } },
- outline: { name: 'on', params: { scale: 1, threshold: 0.33, color: Color(0x000000) } },
- shadow: { name: 'off', params: {} },
- },
- renderer: {
- ambientIntensity: 1.0,
- light: []
- }
- }
- },
- occlusion: {
- canvas3d: <Preset>{
- postprocessing: {
- occlusion: { name: 'on', params: { samples: 32, radius: 6, bias: 1.4, blurKernelSize: 15, resolutionScale: 1 } },
- outline: { name: 'off', params: {} },
- shadow: { name: 'off', params: {} },
- },
- renderer: {
- ambientIntensity: 0.4,
- light: [{ inclination: 180, azimuth: 0, color: Color.fromNormalizedRgb(1.0, 1.0, 1.0),
- intensity: 0.6 }]
- }
- }
- },
- standard: {
- canvas3d: <Preset>{
- postprocessing: {
- occlusion: { name: 'off', params: {} },
- outline: { name: 'off', params: {} },
- shadow: { name: 'off', params: {} },
- },
- renderer: {
- ambientIntensity: 0.4,
- light: [{ inclination: 180, azimuth: 0, color: Color.fromNormalizedRgb(1.0, 1.0, 1.0),
- intensity: 0.6 }]
- }
- }
- }
- };
- type Canvas3DPreset = keyof typeof Canvas3DPresets
- class LightingDemo {
- plugin: PluginUIContext;
- private radius = 5;
- private bias = 1.1;
- private preset: Canvas3DPreset = 'illustrative';
- async init(target: string | HTMLElement) {
- this.plugin = await createPluginUI(typeof target === 'string' ? document.getElementById(target)! : target, {
- ...DefaultPluginUISpec(),
- layout: {
- initial: {
- isExpanded: false,
- showControls: false
- },
- },
- components: {
- controls: { left: 'none', right: 'none', top: 'none', bottom: 'none' }
- }
- });
- this.setPreset('illustrative');
- }
- setPreset(preset: Canvas3DPreset) {
- const props = Canvas3DPresets[preset];
- if (props.canvas3d.postprocessing.occlusion?.name === 'on') {
- props.canvas3d.postprocessing.occlusion.params.radius = this.radius;
- props.canvas3d.postprocessing.occlusion.params.bias = this.bias;
- }
- PluginCommands.Canvas3D.SetSettings(this.plugin, {
- settings: {
- ...props,
- renderer: {
- ...this.plugin.canvas3d!.props.renderer,
- ...props.canvas3d.renderer
- },
- postprocessing: {
- ...this.plugin.canvas3d!.props.postprocessing,
- ...props.canvas3d.postprocessing
- },
- }
- });
- }
- async load({ url, format = 'mmcif', isBinary = true, assemblyId = '' }: LoadParams, radius: number, bias: number) {
- await this.plugin.clear();
- const data = await this.plugin.builders.data.download({ url: Asset.Url(url), isBinary }, { state: { isGhost: true } });
- const trajectory = await this.plugin.builders.structure.parseTrajectory(data, format);
- const model = await this.plugin.builders.structure.createModel(trajectory);
- const structure = await this.plugin.builders.structure.createStructure(model, assemblyId ? { name: 'assembly', params: { id: assemblyId } } : { name: 'model', params: {} });
- const polymer = await this.plugin.builders.structure.tryCreateComponentStatic(structure, 'polymer');
- if (polymer) await this.plugin.builders.structure.representation.addRepresentation(polymer, { type: 'spacefill', color: 'illustrative' });
- const ligand = await this.plugin.builders.structure.tryCreateComponentStatic(structure, 'ligand');
- if (ligand) await this.plugin.builders.structure.representation.addRepresentation(ligand, { type: 'ball-and-stick', color: 'element-symbol', colorParams: { carbonColor: { name: 'element-symbol', params: {} } } });
- this.radius = radius;
- this.bias = bias;
- this.setPreset(this.preset);
- }
- }
- (window as any).LightingDemo = new LightingDemo();
|