shader-code.ts 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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. export type DefineKind = 'boolean' | 'string'
  8. export type DefineType = boolean | string
  9. export type DefineValues = { [k: string]: ValueCell<DefineType> }
  10. export interface ShaderCode {
  11. vert: string
  12. frag: string
  13. }
  14. export const PointShaderCode: ShaderCode = {
  15. vert: require('mol-gl/shader/point.vert'),
  16. frag: require('mol-gl/shader/point.frag')
  17. }
  18. export const MeshShaderCode: ShaderCode = {
  19. vert: require('mol-gl/shader/mesh.vert'),
  20. frag: require('mol-gl/shader/mesh.frag')
  21. }
  22. export type ShaderDefines = {
  23. [k: string]: ValueCell<DefineType>
  24. }
  25. function getDefinesCode (defines: ShaderDefines) {
  26. if (defines === undefined) return ''
  27. const lines = []
  28. for (const name in defines) {
  29. const define = defines[name]
  30. const v = define.ref.value
  31. if (v) {
  32. if (typeof v === 'string') {
  33. lines.push(`#define ${name}_${v}`)
  34. } else {
  35. lines.push(`#define ${name}`)
  36. }
  37. }
  38. }
  39. return lines.join('\n') + '\n'
  40. }
  41. export function addShaderDefines(defines: ShaderDefines, shaders: ShaderCode) {
  42. const header = getDefinesCode(defines)
  43. return {
  44. vert: `${header}${shaders.vert}`,
  45. frag: `${header}${shaders.frag}`
  46. }
  47. }