shader-code.ts 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /**
  2. * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. */
  6. import { ValueCell } from 'mol-util';
  7. import { idFactory } from 'mol-util/id-factory';
  8. export type DefineKind = 'boolean' | 'string'
  9. export type DefineType = boolean | string
  10. export type DefineValues = { [k: string]: ValueCell<DefineType> }
  11. const shaderCodeId = idFactory()
  12. export interface ShaderCode {
  13. id: number
  14. vert: string
  15. frag: string
  16. }
  17. export function ShaderCode(vert: string, frag: string): ShaderCode {
  18. return { id: shaderCodeId(), vert, frag }
  19. }
  20. export const PointsShaderCode = ShaderCode(
  21. require('mol-gl/shader/points.vert'),
  22. require('mol-gl/shader/points.frag')
  23. )
  24. export const LinesShaderCode = ShaderCode(
  25. require('mol-gl/shader/lines.vert'),
  26. require('mol-gl/shader/lines.frag')
  27. )
  28. export const MeshShaderCode = ShaderCode(
  29. require('mol-gl/shader/mesh.vert'),
  30. require('mol-gl/shader/mesh.frag')
  31. )
  32. export const GaussianDensityShaderCode = ShaderCode(
  33. require('mol-gl/shader/gaussian-density.vert'),
  34. require('mol-gl/shader/gaussian-density.frag')
  35. )
  36. export const DirectVolumeShaderCode = ShaderCode(
  37. require('mol-gl/shader/direct-volume.vert'),
  38. require('mol-gl/shader/direct-volume.frag')
  39. )
  40. export type ShaderDefines = {
  41. [k: string]: ValueCell<DefineType>
  42. }
  43. function getDefinesCode (defines: ShaderDefines) {
  44. if (defines === undefined) return ''
  45. const lines = []
  46. for (const name in defines) {
  47. const define = defines[name]
  48. const v = define.ref.value
  49. if (v) {
  50. if (typeof v === 'string') {
  51. lines.push(`#define ${name}_${v}`)
  52. } else {
  53. lines.push(`#define ${name}`)
  54. }
  55. }
  56. }
  57. return lines.join('\n') + '\n'
  58. }
  59. export function addShaderDefines(defines: ShaderDefines, shaders: ShaderCode): ShaderCode {
  60. const header = getDefinesCode(defines)
  61. return {
  62. id: shaderCodeId(),
  63. vert: `${header}${shaders.vert}`,
  64. frag: `${header}${shaders.frag}`
  65. }
  66. }