@luma.gl/engine 9.0.0-alpha.23 → 9.0.0-alpha.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/dist/animation/key-frames.d.ts +1 -1
  2. package/dist/animation/key-frames.d.ts.map +1 -1
  3. package/dist/animation/timeline.d.ts +4 -4
  4. package/dist/animation/timeline.d.ts.map +1 -1
  5. package/dist/animation/timeline.js.map +1 -1
  6. package/dist/animation-loop/animation-loop.d.ts +2 -4
  7. package/dist/animation-loop/animation-loop.d.ts.map +1 -1
  8. package/dist/animation-loop/animation-loop.js +7 -7
  9. package/dist/animation-loop/animation-loop.js.map +1 -1
  10. package/dist/animation-loop/animation-props.d.ts +1 -3
  11. package/dist/animation-loop/animation-props.d.ts.map +1 -1
  12. package/dist/animation-loop/make-animation-loop.d.ts +1 -1
  13. package/dist/animation-loop/make-animation-loop.d.ts.map +1 -1
  14. package/dist/animation-loop/make-animation-loop.js.map +1 -1
  15. package/dist/dist.dev.js +1539 -105
  16. package/dist/geometries/cone-geometry.d.ts +1 -1
  17. package/dist/geometries/cone-geometry.d.ts.map +1 -1
  18. package/dist/geometries/cube-geometry.d.ts +1 -1
  19. package/dist/geometries/cube-geometry.d.ts.map +1 -1
  20. package/dist/geometries/cylinder-geometry.d.ts +1 -1
  21. package/dist/geometries/cylinder-geometry.d.ts.map +1 -1
  22. package/dist/geometries/ico-sphere-geometry.d.ts +1 -1
  23. package/dist/geometries/ico-sphere-geometry.d.ts.map +1 -1
  24. package/dist/geometries/ico-sphere-geometry.js.map +1 -1
  25. package/dist/geometries/plane-geometry.d.ts +1 -1
  26. package/dist/geometries/plane-geometry.d.ts.map +1 -1
  27. package/dist/geometries/plane-geometry.js.map +1 -1
  28. package/dist/geometries/sphere-geometry.d.ts +1 -1
  29. package/dist/geometries/sphere-geometry.d.ts.map +1 -1
  30. package/dist/geometries/truncated-cone-geometry.d.ts +1 -1
  31. package/dist/geometries/truncated-cone-geometry.d.ts.map +1 -1
  32. package/dist/geometry/geometry-table.d.ts +1 -1
  33. package/dist/geometry/geometry-table.d.ts.map +1 -1
  34. package/dist/geometry/geometry.d.ts +5 -5
  35. package/dist/geometry/geometry.d.ts.map +1 -1
  36. package/dist/geometry/geometry.js +1 -1
  37. package/dist/geometry/geometry.js.map +1 -1
  38. package/dist/index.cjs +305 -47
  39. package/dist/index.d.ts +3 -0
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +3 -0
  42. package/dist/index.js.map +1 -1
  43. package/dist/lib/clip-space.js +1 -1
  44. package/dist/lib/clip-space.js.map +1 -1
  45. package/dist/lib/pipeline-factory.d.ts +3 -3
  46. package/dist/lib/pipeline-factory.d.ts.map +1 -1
  47. package/dist/lib/pipeline-factory.js.map +1 -1
  48. package/dist/model/model-utils.js.map +1 -1
  49. package/dist/model/model.d.ts +1 -1
  50. package/dist/model/model.d.ts.map +1 -1
  51. package/dist/model/model.js.map +1 -1
  52. package/dist/scenegraph/group-node.d.ts +21 -0
  53. package/dist/scenegraph/group-node.d.ts.map +1 -0
  54. package/dist/scenegraph/group-node.js +95 -0
  55. package/dist/scenegraph/group-node.js.map +1 -0
  56. package/dist/scenegraph/model-node.d.ts +18 -0
  57. package/dist/scenegraph/model-node.d.ts.map +1 -0
  58. package/dist/scenegraph/model-node.js +29 -0
  59. package/dist/scenegraph/model-node.js.map +1 -0
  60. package/dist/scenegraph/scenegraph-node.d.ts +56 -0
  61. package/dist/scenegraph/scenegraph-node.d.ts.map +1 -0
  62. package/dist/scenegraph/scenegraph-node.js +142 -0
  63. package/dist/scenegraph/scenegraph-node.js.map +1 -0
  64. package/dist/transform/transform.d.ts +5 -5
  65. package/dist/transform/transform.d.ts.map +1 -1
  66. package/dist/transform/transform.js +1 -1
  67. package/dist/transform/transform.js.map +1 -1
  68. package/dist.min.js +77 -76
  69. package/package.json +6 -6
  70. package/src/geometry/geometry.ts +1 -1
  71. package/src/index.ts +5 -0
  72. package/src/lib/clip-space.ts +1 -1
  73. package/src/scenegraph/group-node.ts +103 -0
  74. package/src/scenegraph/model-node.ts +50 -0
  75. package/src/scenegraph/scenegraph-node.ts +204 -0
  76. package/src/transform/transform.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline-factory.js","names":["assembleShaders","DEFAULT_RENDER_PIPELINE_OPTIONS","vs","fs","modules","defines","inject","transpileToGLSL100","layout","varyings","bufferMode","topology","parameters","PipelineFactory","getDefaultPipelineFactory","device","defaultPipelineFactory","constructor","_defineProperty","addDefaultModule","module","_defaultModules","find","m","name","push","stateHash","removeDefaultModule","moduleName","filter","addShaderHook","hook","opts","Object","assign","_hookFunctions","createRenderPipeline","options","props","_getModuleList","hash","_hashRenderPipeline","_pipelineCache","pipeline","getUniforms","_createRenderPipeline","_getUniforms","x","_useCounts","release","destroy","platformInfo","gpu","info","features","Error","assembled","hookFunctions","createShader","stage","source","vsHash","_getHash","fsHash","moduleHashes","map","sort","varyingHashes","v","defineKeys","keys","injectKeys","defineHashes","injectHashes","key","String","parameterHash","JSON","stringify","concat","join","_hashes","undefined","_hashCounter","appModules","arguments","length","Array","seen","count","i","len"],"sources":["../../src/lib/pipeline-factory.ts"],"sourcesContent":["import type {RenderPipelineParameters, PrimitiveTopology, ShaderLayout} from '@luma.gl/api';\nimport {Device, RenderPipeline} from '@luma.gl/api';\nimport type { ShaderModule } from '@luma.gl/shadertools';\nimport {assembleShaders} from '@luma.gl/shadertools';\n\nexport type GetRenderPipelineOptions = {\n vs: string;\n fs: string | null;\n topology: PrimitiveTopology;\n layout?: ShaderLayout | null;\n parameters?: RenderPipelineParameters;\n\n modules?: ShaderModule[];\n defines?: Record<string, string | number | boolean>;\n inject?: Record<string, string>;\n transpileToGLSL100?: boolean;\n\n varyings?: string[];\n bufferMode?: number, \n};\n\nexport type GetComputePipelineOptions = {\n cs: string;\n parameters?: RenderPipelineParameters;\n\n modules?: ShaderModule[];\n defines?: Record<string, string>;\n inject?: Record<string, string>;\n transpileToGLSL100?: boolean;\n\n varyings?: string[];\n bufferMode?: number;\n};\n\nconst DEFAULT_RENDER_PIPELINE_OPTIONS: Required<GetRenderPipelineOptions> = {\n vs: '',\n fs: '',\n modules: [],\n defines: {},\n inject: {},\n transpileToGLSL100: false,\n layout: null,\n\n varyings: [],\n bufferMode: 0x8c8d, // // varyings/bufferMode for xform feedback, 0x8c8d: SEPARATE_ATTRIBS\n topology: 'triangle-list',\n parameters: {} \n};\n\ntype GetUniformsFunc = (props?: Record<string, any>) => Record<string, any>;\n\n/** Efficiently create shared pipelines with varying parameters */\nexport class PipelineFactory {\n readonly device: Device;\n\n stateHash: number = 0; // Used to change hashing if hooks are modified\n private _hashCounter: number = 0;\n private readonly _hashes: Record<string, number> = {};\n private readonly _useCounts: Record<string, number> = {};\n\n private readonly _pipelineCache: Record<string, RenderPipeline> = {};\n\n private readonly _getUniforms: Record<string, GetUniformsFunc> = {};\n private readonly _hookFunctions: any[] = [];\n private _defaultModules: any[] = [];\n // private readonly _registeredModules = {}; // TODO: Remove? This isn't used anywhere in luma.gl\n\n static getDefaultPipelineFactory(device: Device): PipelineFactory {\n // @ts-expect-error Add to device\n device.defaultPipelineFactory = device.defaultPipelineFactory || new PipelineFactory(device);\n // @ts-expect-error Add to device\n return device.defaultPipelineFactory;\n }\n\n constructor(device: Device) {\n this.device = device;\n }\n\n addDefaultModule(module: ShaderModule): void {\n if (!this._defaultModules.find((m) => m.name === (typeof module === 'string' ? module : module.name))) {\n this._defaultModules.push(module);\n }\n this.stateHash++;\n }\n\n removeDefaultModule(module: ShaderModule): void {\n const moduleName = typeof module === 'string' ? module : module.name;\n this._defaultModules = this._defaultModules.filter((m) => m.name !== moduleName);\n this.stateHash++;\n }\n\n addShaderHook(hook: string, opts?: any): void {\n if (opts) {\n hook = Object.assign(opts, {hook});\n }\n this._hookFunctions.push(hook);\n this.stateHash++;\n }\n\n createRenderPipeline(options: GetRenderPipelineOptions): {\n pipeline: RenderPipeline;\n getUniforms: GetUniformsFunc;\n } {\n const props: Required<GetRenderPipelineOptions> = {...DEFAULT_RENDER_PIPELINE_OPTIONS, ...options};\n\n const modules = this._getModuleList(props.modules); // Combine with default modules\n\n const hash = this._hashRenderPipeline({...props, modules});\n\n if (!this._pipelineCache[hash]) {\n const {pipeline, getUniforms} = this._createRenderPipeline({...props, modules});\n pipeline.hash = hash;\n this._pipelineCache[hash] = pipeline;\n this._getUniforms[hash] = getUniforms || ((x?: unknown) => ({}));\n this._useCounts[hash] = 0;\n }\n\n this._useCounts[hash]++;\n\n return {\n pipeline: this._pipelineCache[hash],\n getUniforms: this._getUniforms[hash]\n };\n }\n\n release(pipeline: RenderPipeline): void {\n const hash = pipeline.hash;\n this._useCounts[hash]--;\n if (this._useCounts[hash] === 0) {\n this._pipelineCache[hash].destroy();\n delete this._pipelineCache[hash];\n delete this._getUniforms[hash];\n delete this._useCounts[hash];\n }\n }\n\n getUniforms(pipeline: RenderPipeline) {\n return this._getUniforms[pipeline.hash] || null;\n }\n\n // PRIVATE\n\n _createRenderPipeline(props: GetRenderPipelineOptions): {\n pipeline: RenderPipeline,\n getUniforms: GetUniformsFunc\n } {\n const platformInfo = {\n gpu: this.device.info.gpu,\n features: this.device.features\n };\n\n if (!props.fs) {\n throw new Error('fs');\n }\n\n const assembled = assembleShaders(platformInfo, {...props, fs: props.fs, hookFunctions: this._hookFunctions});\n\n const pipeline = this.device.createRenderPipeline({\n ...props,\n vs: this.device.createShader({stage: 'vertex', source: assembled.vs}),\n fs: assembled.fs ? this.device.createShader({stage: 'fragment', source: assembled.fs}) : null,\n });\n\n return {pipeline, getUniforms: assembled.getUniforms};\n }\n\n /** Calculate a hash based on all the inputs for a render pipeline */\n _hashRenderPipeline(props: GetRenderPipelineOptions): string {\n const {modules = [], varyings = [], defines = {}, inject = {}, parameters = {}} = props;\n const vsHash = this._getHash(props.vs);\n const fsHash = props.fs ? this._getHash(props.fs) : 0;\n\n const moduleHashes = modules.map((m) => this._getHash(typeof m === 'string' ? m : m.name)).sort();\n const varyingHashes = varyings.map((v) => this._getHash(v));\n\n const defineKeys = Object.keys(defines).sort();\n const injectKeys = Object.keys(inject).sort();\n const defineHashes: number[] = [];\n const injectHashes: number[] = [];\n\n for (const key of defineKeys) {\n defineHashes.push(this._getHash(key));\n defineHashes.push(this._getHash(String(defines[key])));\n }\n\n for (const key of injectKeys) {\n injectHashes.push(this._getHash(key));\n injectHashes.push(this._getHash(inject[key]));\n }\n\n // TODO - hash parameters!\n const parameterHash = JSON.stringify(parameters);\n\n return `${vsHash}/${fsHash}D${defineHashes.join('/')}M${moduleHashes.join(\n '/'\n )}I${injectHashes.join('/')}V${varyingHashes.join('/')}H${this.stateHash}B${props.bufferMode}${\n props.transpileToGLSL100 ? 'T' : ''\n }P${parameterHash}`;\n }\n\n _getHash(key: string): number {\n if (this._hashes[key] === undefined) {\n this._hashes[key] = this._hashCounter++;\n }\n return this._hashes[key];\n }\n\n // Dedupe and combine with default modules\n _getModuleList(appModules: ShaderModule[] = []): ShaderModule[] {\n const modules = new Array(this._defaultModules.length + appModules.length);\n const seen: Record<string, boolean> = {};\n let count = 0;\n\n for (let i = 0, len = this._defaultModules.length; i < len; ++i) {\n const module = this._defaultModules[i];\n const name = module.name;\n modules[count++] = module;\n seen[name] = true;\n }\n\n for (let i = 0, len = appModules.length; i < len; ++i) {\n const module = appModules[i];\n const name = module.name;\n if (!seen[name]) {\n modules[count++] = module;\n seen[name] = true;\n }\n }\n\n modules.length = count;\n\n return modules;\n }\n}\n"],"mappings":";AAGA,SAAQA,eAAe,QAAO,sBAAsB;AA+BpD,MAAMC,+BAAmE,GAAG;EAC1EC,EAAE,EAAE,EAAE;EACNC,EAAE,EAAE,EAAE;EACNC,OAAO,EAAE,EAAE;EACXC,OAAO,EAAE,CAAC,CAAC;EACXC,MAAM,EAAE,CAAC,CAAC;EACVC,kBAAkB,EAAE,KAAK;EACzBC,MAAM,EAAE,IAAI;EAEZC,QAAQ,EAAE,EAAE;EACZC,UAAU,EAAE,MAAM;EAClBC,QAAQ,EAAE,eAAe;EACzBC,UAAU,EAAE,CAAC;AACf,CAAC;AAKD,OAAO,MAAMC,eAAe,CAAC;EAe3B,OAAOC,yBAAyBA,CAACC,MAAc,EAAmB;IAEhEA,MAAM,CAACC,sBAAsB,GAAGD,MAAM,CAACC,sBAAsB,IAAI,IAAIH,eAAe,CAACE,MAAM,CAAC;IAE5F,OAAOA,MAAM,CAACC,sBAAsB;EACtC;EAEAC,WAAWA,CAACF,MAAc,EAAE;IAAAG,eAAA;IAAAA,eAAA,oBAnBR,CAAC;IAAAA,eAAA,uBACU,CAAC;IAAAA,eAAA,kBACmB,CAAC,CAAC;IAAAA,eAAA,qBACC,CAAC,CAAC;IAAAA,eAAA,yBAEU,CAAC,CAAC;IAAAA,eAAA,uBAEH,CAAC,CAAC;IAAAA,eAAA,yBAC1B,EAAE;IAAAA,eAAA,0BACV,EAAE;IAWjC,IAAI,CAACH,MAAM,GAAGA,MAAM;EACtB;EAEAI,gBAAgBA,CAACC,MAAoB,EAAQ;IAC3C,IAAI,CAAC,IAAI,CAACC,eAAe,CAACC,IAAI,CAAEC,CAAC,IAAKA,CAAC,CAACC,IAAI,MAAM,OAAOJ,MAAM,KAAK,QAAQ,GAAGA,MAAM,GAAGA,MAAM,CAACI,IAAI,CAAC,CAAC,EAAE;MACrG,IAAI,CAACH,eAAe,CAACI,IAAI,CAACL,MAAM,CAAC;IACnC;IACA,IAAI,CAACM,SAAS,EAAE;EAClB;EAEAC,mBAAmBA,CAACP,MAAoB,EAAQ;IAC9C,MAAMQ,UAAU,GAAG,OAAOR,MAAM,KAAK,QAAQ,GAAGA,MAAM,GAAGA,MAAM,CAACI,IAAI;IACpE,IAAI,CAACH,eAAe,GAAG,IAAI,CAACA,eAAe,CAACQ,MAAM,CAAEN,CAAC,IAAKA,CAAC,CAACC,IAAI,KAAKI,UAAU,CAAC;IAChF,IAAI,CAACF,SAAS,EAAE;EAClB;EAEAI,aAAaA,CAACC,IAAY,EAAEC,IAAU,EAAQ;IAC5C,IAAIA,IAAI,EAAE;MACRD,IAAI,GAAGE,MAAM,CAACC,MAAM,CAACF,IAAI,EAAE;QAACD;MAAI,CAAC,CAAC;IACpC;IACA,IAAI,CAACI,cAAc,CAACV,IAAI,CAACM,IAAI,CAAC;IAC9B,IAAI,CAACL,SAAS,EAAE;EAClB;EAEAU,oBAAoBA,CAACC,OAAiC,EAGpD;IACA,MAAMC,KAAyC,GAAG;MAAC,GAAGrC,+BAA+B;MAAE,GAAGoC;IAAO,CAAC;IAElG,MAAMjC,OAAO,GAAG,IAAI,CAACmC,cAAc,CAACD,KAAK,CAAClC,OAAO,CAAC;IAElD,MAAMoC,IAAI,GAAG,IAAI,CAACC,mBAAmB,CAAC;MAAC,GAAGH,KAAK;MAAElC;IAAO,CAAC,CAAC;IAE1D,IAAI,CAAC,IAAI,CAACsC,cAAc,CAACF,IAAI,CAAC,EAAE;MAC9B,MAAM;QAACG,QAAQ;QAAEC;MAAW,CAAC,GAAG,IAAI,CAACC,qBAAqB,CAAC;QAAC,GAAGP,KAAK;QAAElC;MAAO,CAAC,CAAC;MAC/EuC,QAAQ,CAACH,IAAI,GAAGA,IAAI;MACpB,IAAI,CAACE,cAAc,CAACF,IAAI,CAAC,GAAGG,QAAQ;MACpC,IAAI,CAACG,YAAY,CAACN,IAAI,CAAC,GAAGI,WAAW,KAAMG,CAAW,KAAM,CAAC,CAAC,CAAC,CAAC;MAChE,IAAI,CAACC,UAAU,CAACR,IAAI,CAAC,GAAG,CAAC;IAC3B;IAEA,IAAI,CAACQ,UAAU,CAACR,IAAI,CAAC,EAAE;IAEvB,OAAO;MACLG,QAAQ,EAAE,IAAI,CAACD,cAAc,CAACF,IAAI,CAAC;MACnCI,WAAW,EAAE,IAAI,CAACE,YAAY,CAACN,IAAI;IACrC,CAAC;EACH;EAEAS,OAAOA,CAACN,QAAwB,EAAQ;IACtC,MAAMH,IAAI,GAAGG,QAAQ,CAACH,IAAI;IAC1B,IAAI,CAACQ,UAAU,CAACR,IAAI,CAAC,EAAE;IACvB,IAAI,IAAI,CAACQ,UAAU,CAACR,IAAI,CAAC,KAAK,CAAC,EAAE;MAC/B,IAAI,CAACE,cAAc,CAACF,IAAI,CAAC,CAACU,OAAO,EAAE;MACnC,OAAO,IAAI,CAACR,cAAc,CAACF,IAAI,CAAC;MAChC,OAAO,IAAI,CAACM,YAAY,CAACN,IAAI,CAAC;MAC9B,OAAO,IAAI,CAACQ,UAAU,CAACR,IAAI,CAAC;IAC9B;EACF;EAEAI,WAAWA,CAACD,QAAwB,EAAE;IACpC,OAAO,IAAI,CAACG,YAAY,CAACH,QAAQ,CAACH,IAAI,CAAC,IAAI,IAAI;EACjD;EAIAK,qBAAqBA,CAACP,KAA+B,EAGnD;IACA,MAAMa,YAAY,GAAG;MACnBC,GAAG,EAAE,IAAI,CAACrC,MAAM,CAACsC,IAAI,CAACD,GAAG;MACzBE,QAAQ,EAAE,IAAI,CAACvC,MAAM,CAACuC;IACxB,CAAC;IAED,IAAI,CAAChB,KAAK,CAACnC,EAAE,EAAE;MACb,MAAM,IAAIoD,KAAK,CAAC,IAAI,CAAC;IACvB;IAEA,MAAMC,SAAS,GAAGxD,eAAe,CAACmD,YAAY,EAAE;MAAC,GAAGb,KAAK;MAAEnC,EAAE,EAAEmC,KAAK,CAACnC,EAAE;MAAEsD,aAAa,EAAE,IAAI,CAACtB;IAAc,CAAC,CAAC;IAE7G,MAAMQ,QAAQ,GAAG,IAAI,CAAC5B,MAAM,CAACqB,oBAAoB,CAAC;MAChD,GAAGE,KAAK;MACRpC,EAAE,EAAE,IAAI,CAACa,MAAM,CAAC2C,YAAY,CAAC;QAACC,KAAK,EAAE,QAAQ;QAAEC,MAAM,EAAEJ,SAAS,CAACtD;MAAE,CAAC,CAAC;MACrEC,EAAE,EAAEqD,SAAS,CAACrD,EAAE,GAAG,IAAI,CAACY,MAAM,CAAC2C,YAAY,CAAC;QAACC,KAAK,EAAE,UAAU;QAAEC,MAAM,EAAEJ,SAAS,CAACrD;MAAE,CAAC,CAAC,GAAG;IAC3F,CAAC,CAAC;IAEF,OAAO;MAACwC,QAAQ;MAAEC,WAAW,EAAEY,SAAS,CAACZ;IAAW,CAAC;EACvD;EAGAH,mBAAmBA,CAACH,KAA+B,EAAU;IAC3D,MAAM;MAAClC,OAAO,GAAG,EAAE;MAAEK,QAAQ,GAAG,EAAE;MAAEJ,OAAO,GAAG,CAAC,CAAC;MAAEC,MAAM,GAAG,CAAC,CAAC;MAAEM,UAAU,GAAG,CAAC;IAAC,CAAC,GAAG0B,KAAK;IACvF,MAAMuB,MAAM,GAAG,IAAI,CAACC,QAAQ,CAACxB,KAAK,CAACpC,EAAE,CAAC;IACtC,MAAM6D,MAAM,GAAGzB,KAAK,CAACnC,EAAE,GAAG,IAAI,CAAC2D,QAAQ,CAACxB,KAAK,CAACnC,EAAE,CAAC,GAAG,CAAC;IAErD,MAAM6D,YAAY,GAAG5D,OAAO,CAAC6D,GAAG,CAAE1C,CAAC,IAAK,IAAI,CAACuC,QAAQ,CAAC,OAAOvC,CAAC,KAAK,QAAQ,GAAGA,CAAC,GAAGA,CAAC,CAACC,IAAI,CAAC,CAAC,CAAC0C,IAAI,EAAE;IACjG,MAAMC,aAAa,GAAG1D,QAAQ,CAACwD,GAAG,CAAEG,CAAC,IAAK,IAAI,CAACN,QAAQ,CAACM,CAAC,CAAC,CAAC;IAE3D,MAAMC,UAAU,GAAGpC,MAAM,CAACqC,IAAI,CAACjE,OAAO,CAAC,CAAC6D,IAAI,EAAE;IAC9C,MAAMK,UAAU,GAAGtC,MAAM,CAACqC,IAAI,CAAChE,MAAM,CAAC,CAAC4D,IAAI,EAAE;IAC7C,MAAMM,YAAsB,GAAG,EAAE;IACjC,MAAMC,YAAsB,GAAG,EAAE;IAEjC,KAAK,MAAMC,GAAG,IAAIL,UAAU,EAAE;MAC5BG,YAAY,CAAC/C,IAAI,CAAC,IAAI,CAACqC,QAAQ,CAACY,GAAG,CAAC,CAAC;MACrCF,YAAY,CAAC/C,IAAI,CAAC,IAAI,CAACqC,QAAQ,CAACa,MAAM,CAACtE,OAAO,CAACqE,GAAG,CAAC,CAAC,CAAC,CAAC;IACxD;IAEA,KAAK,MAAMA,GAAG,IAAIH,UAAU,EAAE;MAC5BE,YAAY,CAAChD,IAAI,CAAC,IAAI,CAACqC,QAAQ,CAACY,GAAG,CAAC,CAAC;MACrCD,YAAY,CAAChD,IAAI,CAAC,IAAI,CAACqC,QAAQ,CAACxD,MAAM,CAACoE,GAAG,CAAC,CAAC,CAAC;IAC/C;IAGA,MAAME,aAAa,GAAGC,IAAI,CAACC,SAAS,CAAClE,UAAU,CAAC;IAEhD,UAAAmE,MAAA,CAAUlB,MAAM,OAAAkB,MAAA,CAAIhB,MAAM,OAAAgB,MAAA,CAAIP,YAAY,CAACQ,IAAI,CAAC,GAAG,CAAC,OAAAD,MAAA,CAAIf,YAAY,CAACgB,IAAI,CACvE,GAAG,CACJ,OAAAD,MAAA,CAAIN,YAAY,CAACO,IAAI,CAAC,GAAG,CAAC,OAAAD,MAAA,CAAIZ,aAAa,CAACa,IAAI,CAAC,GAAG,CAAC,OAAAD,MAAA,CAAI,IAAI,CAACrD,SAAS,OAAAqD,MAAA,CAAIzC,KAAK,CAAC5B,UAAU,EAAAqE,MAAA,CAC1FzC,KAAK,CAAC/B,kBAAkB,GAAG,GAAG,GAAG,EAAE,OAAAwE,MAAA,CACjCH,aAAa;EACnB;EAEAd,QAAQA,CAACY,GAAW,EAAU;IAC5B,IAAI,IAAI,CAACO,OAAO,CAACP,GAAG,CAAC,KAAKQ,SAAS,EAAE;MACnC,IAAI,CAACD,OAAO,CAACP,GAAG,CAAC,GAAG,IAAI,CAACS,YAAY,EAAE;IACzC;IACA,OAAO,IAAI,CAACF,OAAO,CAACP,GAAG,CAAC;EAC1B;EAGAnC,cAAcA,CAAA,EAAkD;IAAA,IAAjD6C,UAA0B,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAH,SAAA,GAAAG,SAAA,MAAG,EAAE;IAC5C,MAAMjF,OAAO,GAAG,IAAImF,KAAK,CAAC,IAAI,CAAClE,eAAe,CAACiE,MAAM,GAAGF,UAAU,CAACE,MAAM,CAAC;IAC1E,MAAME,IAA6B,GAAG,CAAC,CAAC;IACxC,IAAIC,KAAK,GAAG,CAAC;IAEb,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEC,GAAG,GAAG,IAAI,CAACtE,eAAe,CAACiE,MAAM,EAAEI,CAAC,GAAGC,GAAG,EAAE,EAAED,CAAC,EAAE;MAC/D,MAAMtE,MAAM,GAAG,IAAI,CAACC,eAAe,CAACqE,CAAC,CAAC;MACtC,MAAMlE,IAAI,GAAGJ,MAAM,CAACI,IAAI;MACxBpB,OAAO,CAACqF,KAAK,EAAE,CAAC,GAAGrE,MAAM;MACzBoE,IAAI,CAAChE,IAAI,CAAC,GAAG,IAAI;IACnB;IAEA,KAAK,IAAIkE,CAAC,GAAG,CAAC,EAAEC,GAAG,GAAGP,UAAU,CAACE,MAAM,EAAEI,CAAC,GAAGC,GAAG,EAAE,EAAED,CAAC,EAAE;MACrD,MAAMtE,MAAM,GAAGgE,UAAU,CAACM,CAAC,CAAC;MAC5B,MAAMlE,IAAI,GAAGJ,MAAM,CAACI,IAAI;MACxB,IAAI,CAACgE,IAAI,CAAChE,IAAI,CAAC,EAAE;QACfpB,OAAO,CAACqF,KAAK,EAAE,CAAC,GAAGrE,MAAM;QACzBoE,IAAI,CAAChE,IAAI,CAAC,GAAG,IAAI;MACnB;IACF;IAEApB,OAAO,CAACkF,MAAM,GAAGG,KAAK;IAEtB,OAAOrF,OAAO;EAChB;AACF"}
1
+ {"version":3,"file":"pipeline-factory.js","names":["assembleShaders","DEFAULT_RENDER_PIPELINE_OPTIONS","vs","fs","modules","defines","inject","transpileToGLSL100","layout","varyings","bufferMode","topology","parameters","PipelineFactory","getDefaultPipelineFactory","device","defaultPipelineFactory","constructor","_defineProperty","addDefaultModule","module","_defaultModules","find","m","name","push","stateHash","removeDefaultModule","moduleName","filter","addShaderHook","hook","opts","Object","assign","_hookFunctions","createRenderPipeline","options","props","_getModuleList","hash","_hashRenderPipeline","_pipelineCache","pipeline","getUniforms","_createRenderPipeline","_getUniforms","x","_useCounts","release","destroy","platformInfo","gpu","info","features","Error","assembled","hookFunctions","createShader","stage","source","vsHash","_getHash","fsHash","moduleHashes","map","sort","varyingHashes","v","defineKeys","keys","injectKeys","defineHashes","injectHashes","key","String","parameterHash","JSON","stringify","concat","join","_hashes","undefined","_hashCounter","appModules","arguments","length","Array","seen","count","i","len"],"sources":["../../src/lib/pipeline-factory.ts"],"sourcesContent":["import type {RenderPipelineParameters, PrimitiveTopology, ShaderLayout} from '@luma.gl/api';\nimport {Device, RenderPipeline} from '@luma.gl/api';\nimport type { ShaderModule } from '@luma.gl/shadertools';\nimport {assembleShaders} from '@luma.gl/shadertools';\n\nexport type GetRenderPipelineOptions = {\n vs: string;\n fs: string | null;\n topology: PrimitiveTopology;\n layout?: ShaderLayout | null;\n parameters?: RenderPipelineParameters;\n\n modules?: ShaderModule[];\n defines?: Record<string, string | number | boolean>;\n inject?: Record<string, string>;\n transpileToGLSL100?: boolean;\n\n varyings?: string[];\n bufferMode?: number, \n};\n\nexport type GetComputePipelineOptions = {\n cs: string;\n parameters?: RenderPipelineParameters;\n\n modules?: ShaderModule[];\n defines?: Record<string, string>;\n inject?: Record<string, string>;\n transpileToGLSL100?: boolean;\n\n varyings?: string[];\n bufferMode?: number;\n};\n\nconst DEFAULT_RENDER_PIPELINE_OPTIONS: Required<GetRenderPipelineOptions> = {\n vs: '',\n fs: '',\n modules: [],\n defines: {},\n inject: {},\n transpileToGLSL100: false,\n layout: null,\n\n varyings: [],\n bufferMode: 0x8c8d, // // varyings/bufferMode for xform feedback, 0x8c8d: SEPARATE_ATTRIBS\n topology: 'triangle-list',\n parameters: {} \n};\n\ntype GetUniformsFunc = (props?: Record<string, any>) => Record<string, any>;\n\n/** Efficiently create shared pipelines with varying parameters */\nexport class PipelineFactory {\n readonly device: Device;\n\n stateHash: number = 0; // Used to change hashing if hooks are modified\n private _hashCounter: number = 0;\n private readonly _hashes: Record<string, number> = {};\n private readonly _useCounts: Record<string, number> = {};\n\n private readonly _pipelineCache: Record<string, RenderPipeline> = {};\n\n private readonly _getUniforms: Record<string, GetUniformsFunc> = {};\n private readonly _hookFunctions: any[] = [];\n private _defaultModules: any[] = [];\n // private readonly _registeredModules = {}; // TODO: Remove? This isn't used anywhere in luma.gl\n\n static getDefaultPipelineFactory(device: Device): PipelineFactory {\n // @ts-expect-error Add to device\n device.defaultPipelineFactory = device.defaultPipelineFactory || new PipelineFactory(device);\n // @ts-expect-error Add to device\n return device.defaultPipelineFactory;\n }\n\n constructor(device: Device) {\n this.device = device;\n }\n\n addDefaultModule(module: ShaderModule): void {\n if (!this._defaultModules.find((m) => m.name === (typeof module === 'string' ? module : module.name))) {\n this._defaultModules.push(module);\n }\n this.stateHash++;\n }\n\n removeDefaultModule(module: ShaderModule): void {\n const moduleName = typeof module === 'string' ? module : module.name;\n this._defaultModules = this._defaultModules.filter((m) => m.name !== moduleName);\n this.stateHash++;\n }\n\n addShaderHook(hook: string, opts?: any): void {\n if (opts) {\n hook = Object.assign(opts, {hook});\n }\n this._hookFunctions.push(hook);\n this.stateHash++;\n }\n\n createRenderPipeline(options: GetRenderPipelineOptions): {\n pipeline: RenderPipeline;\n getUniforms: GetUniformsFunc;\n } {\n const props: Required<GetRenderPipelineOptions> = {...DEFAULT_RENDER_PIPELINE_OPTIONS, ...options};\n\n const modules = this._getModuleList(props.modules); // Combine with default modules\n\n const hash = this._hashRenderPipeline({...props, modules});\n\n if (!this._pipelineCache[hash]) {\n const {pipeline, getUniforms} = this._createRenderPipeline({...props, modules});\n pipeline.hash = hash;\n this._pipelineCache[hash] = pipeline;\n this._getUniforms[hash] = getUniforms || ((x?: unknown) => ({}));\n this._useCounts[hash] = 0;\n }\n\n this._useCounts[hash]++;\n\n return {\n pipeline: this._pipelineCache[hash],\n getUniforms: this._getUniforms[hash]\n };\n }\n\n release(pipeline: RenderPipeline): void {\n const hash = pipeline.hash;\n this._useCounts[hash]--;\n if (this._useCounts[hash] === 0) {\n this._pipelineCache[hash].destroy();\n delete this._pipelineCache[hash];\n delete this._getUniforms[hash];\n delete this._useCounts[hash];\n }\n }\n\n getUniforms(pipeline: RenderPipeline) {\n return this._getUniforms[pipeline.hash] || null;\n }\n\n // PRIVATE\n\n _createRenderPipeline(props: GetRenderPipelineOptions): {\n pipeline: RenderPipeline,\n getUniforms: GetUniformsFunc\n } {\n const platformInfo = {\n gpu: this.device.info.gpu,\n features: this.device.features\n };\n\n if (!props.fs) {\n throw new Error('fs');\n }\n\n const assembled = assembleShaders(platformInfo, {...props, fs: props.fs, hookFunctions: this._hookFunctions});\n\n const pipeline = this.device.createRenderPipeline({\n ...props,\n vs: this.device.createShader({stage: 'vertex', source: assembled.vs}),\n fs: assembled.fs ? this.device.createShader({stage: 'fragment', source: assembled.fs}) : null,\n });\n\n return {pipeline, getUniforms: assembled.getUniforms};\n }\n\n /** Calculate a hash based on all the inputs for a render pipeline */\n _hashRenderPipeline(props: GetRenderPipelineOptions): string {\n const {modules = [], varyings = [], defines = {}, inject = {}, parameters = {}} = props;\n const vsHash = this._getHash(props.vs);\n const fsHash = props.fs ? this._getHash(props.fs) : 0;\n\n const moduleHashes = modules.map((m) => this._getHash(typeof m === 'string' ? m : m.name)).sort();\n const varyingHashes = varyings.map((v) => this._getHash(v));\n\n const defineKeys = Object.keys(defines).sort();\n const injectKeys = Object.keys(inject).sort();\n const defineHashes: number[] = [];\n const injectHashes: number[] = [];\n\n for (const key of defineKeys) {\n defineHashes.push(this._getHash(key));\n defineHashes.push(this._getHash(String(defines[key])));\n }\n\n for (const key of injectKeys) {\n injectHashes.push(this._getHash(key));\n injectHashes.push(this._getHash(inject[key]));\n }\n\n // TODO - hash parameters!\n const parameterHash = JSON.stringify(parameters);\n\n return `${vsHash}/${fsHash}D${defineHashes.join('/')}M${moduleHashes.join(\n '/'\n )}I${injectHashes.join('/')}V${varyingHashes.join('/')}H${this.stateHash}B${props.bufferMode}${\n props.transpileToGLSL100 ? 'T' : ''\n }P${parameterHash}`;\n }\n\n _getHash(key: string): number {\n if (this._hashes[key] === undefined) {\n this._hashes[key] = this._hashCounter++;\n }\n return this._hashes[key];\n }\n\n // Dedupe and combine with default modules\n _getModuleList(appModules: ShaderModule[] = []): ShaderModule[] {\n const modules = new Array(this._defaultModules.length + appModules.length);\n const seen: Record<string, boolean> = {};\n let count = 0;\n\n for (let i = 0, len = this._defaultModules.length; i < len; ++i) {\n const module = this._defaultModules[i];\n const name = module.name;\n modules[count++] = module;\n seen[name] = true;\n }\n\n for (let i = 0, len = appModules.length; i < len; ++i) {\n const module = appModules[i];\n const name = module.name;\n if (!seen[name]) {\n modules[count++] = module;\n seen[name] = true;\n }\n }\n\n modules.length = count;\n\n return modules;\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"model-utils.js","names":["Buffer","assert","GLTF_TO_LUMA_ATTRIBUTE_MAP","POSITION","NORMAL","COLOR_0","TEXCOORD_0","TEXCOORD_1","TEXCOORD_2","getIndexBufferFromGeometry","device","geometry","indices","undefined","data","value","Uint16Array","Uint32Array","createBuffer","usage","INDEX","getAttributeBuffersFromGeometry","buffers","name","attribute","Object","entries","attributes","remappedName","mapAttributeName","constant","Error","typedArray","id","concat"],"sources":["../../src/model/model-utils.ts"],"sourcesContent":["import {Device, Buffer, assert} from '@luma.gl/api';\nimport type {Geometry} from '../geometry/geometry';\n\n// Support for mapping new geometries with glTF attribute names to \"classic\" luma.gl shader names\nconst GLTF_TO_LUMA_ATTRIBUTE_MAP = {\n POSITION: 'positions',\n NORMAL: 'normals',\n COLOR_0: 'colors',\n TEXCOORD_0: 'texCoords',\n TEXCOORD_1: 'texCoords1',\n TEXCOORD_2: 'texCoords2'\n};\n\n/*\nexport function getAttributeLayoutsFromGeometry(geometry: Geometry) {\n const layouts: Record<string, {}> = {};\n let indices = geometry.indices;\n\n for (const [name, attribute] of Object.entries(geometry.attributes)) {\n const remappedName = mapAttributeName(name);\n\n if (attribute.constant) {\n throw new Error('constant attributes not supported');\n } else {\n const typedArray = attribute.value;\n // Create accessor by copying the attribute and removing `value``\n const accessor = {...attribute};\n delete accessor.value;\n buffers[remappedName] = [device.createBuffer(typedArray), accessor];\n\n inferAttributeAccessor(name, accessor);\n }\n }\n}\n\nexport class Table {\n length: number;\n // columns: Record<string, TypedArray> = {};\n}\n\nexport class GPUTable {\n length: number;\n columns: Record<string, Buffer> = {};\n}\n\nexport function convertTableToGPUTable(table: Table) {\n // for (const ) {}\n}\n\nexport function renameTableColumns(table: Table, map: (name: string) => string) {\n const newColumns = table.columns.reduce()\n table.clone();\n}\n*/\n\nexport function getIndexBufferFromGeometry(device: Device, geometry: Geometry): Buffer | undefined {\n if (!geometry.indices) {\n return undefined;\n }\n\n // @ts-expect-error\n const data = geometry.indices.value || geometry.indices;\n assert(\n data instanceof Uint16Array || data instanceof Uint32Array,\n 'attribute array for \"indices\" must be of integer type'\n );\n return device.createBuffer({usage: Buffer.INDEX, data});\n}\n\nexport function getAttributeBuffersFromGeometry(device: Device, geometry: Geometry): Record<string, Buffer> {\n const buffers: Record<string, Buffer> = {};\n\n for (const [name, attribute] of Object.entries(geometry.attributes)) {\n const remappedName = mapAttributeName(name);\n if (attribute?.constant) {\n throw new Error('constant attributes not supported');\n } else {\n const typedArray = attribute?.value;\n buffers[remappedName] = device.createBuffer({data: typedArray, id: `${remappedName}-buffer`});\n }\n }\n\n return buffers;\n}\n\nfunction mapAttributeName(name: string): string {\n // @ts-ignore-error\n return GLTF_TO_LUMA_ATTRIBUTE_MAP[name] || name;\n}\n\n/*\n// Check for well known attribute names\n// eslint-disable-next-line complexity\nexport function inferAttributeAccessor(attributeName, attribute) {\n let category;\n switch (attributeName) {\n case 'texCoords':\n case 'texCoord1':\n case 'texCoord2':\n case 'texCoord3':\n category = 'uvs';\n break;\n case 'vertices':\n case 'positions':\n case 'normals':\n case 'pickingColors':\n category = 'vectors';\n break;\n default:\n }\n\n // Check for categorys\n switch (category) {\n case 'vectors':\n attribute.size = attribute.size || 3;\n break;\n case 'uvs':\n attribute.size = attribute.size || 2;\n break;\n default:\n }\n\n assert(Number.isFinite(attribute.size), `attribute ${attributeName} needs size`);\n}\n*/\n"],"mappings":"AAAA,SAAgBA,MAAM,EAAEC,MAAM,QAAO,cAAc;AAInD,MAAMC,0BAA0B,GAAG;EACjCC,QAAQ,EAAE,WAAW;EACrBC,MAAM,EAAE,SAAS;EACjBC,OAAO,EAAE,QAAQ;EACjBC,UAAU,EAAE,WAAW;EACvBC,UAAU,EAAE,YAAY;EACxBC,UAAU,EAAE;AACd,CAAC;AA4CD,OAAO,SAASC,0BAA0BA,CAACC,MAAc,EAAEC,QAAkB,EAAsB;EACjG,IAAI,CAACA,QAAQ,CAACC,OAAO,EAAE;IACrB,OAAOC,SAAS;EAClB;EAGA,MAAMC,IAAI,GAAGH,QAAQ,CAACC,OAAO,CAACG,KAAK,IAAIJ,QAAQ,CAACC,OAAO;EACvDX,MAAM,CACJa,IAAI,YAAYE,WAAW,IAAIF,IAAI,YAAYG,WAAW,EAC1D,uDAAuD,CACxD;EACD,OAAOP,MAAM,CAACQ,YAAY,CAAC;IAACC,KAAK,EAAEnB,MAAM,CAACoB,KAAK;IAAEN;EAAI,CAAC,CAAC;AACzD;AAEA,OAAO,SAASO,+BAA+BA,CAACX,MAAc,EAAEC,QAAkB,EAA0B;EAC1G,MAAMW,OAA+B,GAAG,CAAC,CAAC;EAE1C,KAAK,MAAM,CAACC,IAAI,EAAEC,SAAS,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACf,QAAQ,CAACgB,UAAU,CAAC,EAAE;IACnE,MAAMC,YAAY,GAAGC,gBAAgB,CAACN,IAAI,CAAC;IAC3C,IAAIC,SAAS,aAATA,SAAS,eAATA,SAAS,CAAEM,QAAQ,EAAE;MACvB,MAAM,IAAIC,KAAK,CAAC,mCAAmC,CAAC;IACtD,CAAC,MAAM;MACL,MAAMC,UAAU,GAAGR,SAAS,aAATA,SAAS,uBAATA,SAAS,CAAET,KAAK;MACnCO,OAAO,CAACM,YAAY,CAAC,GAAGlB,MAAM,CAACQ,YAAY,CAAC;QAACJ,IAAI,EAAEkB,UAAU;QAAEC,EAAE,KAAAC,MAAA,CAAKN,YAAY;MAAS,CAAC,CAAC;IAC/F;EACF;EAEA,OAAON,OAAO;AAChB;AAEA,SAASO,gBAAgBA,CAACN,IAAY,EAAU;EAE9C,OAAOrB,0BAA0B,CAACqB,IAAI,CAAC,IAAIA,IAAI;AACjD"}
1
+ {"version":3,"file":"model-utils.js","names":["Buffer","assert","GLTF_TO_LUMA_ATTRIBUTE_MAP","POSITION","NORMAL","COLOR_0","TEXCOORD_0","TEXCOORD_1","TEXCOORD_2","getIndexBufferFromGeometry","device","geometry","indices","undefined","data","value","Uint16Array","Uint32Array","createBuffer","usage","INDEX","getAttributeBuffersFromGeometry","buffers","name","attribute","Object","entries","attributes","remappedName","mapAttributeName","constant","Error","typedArray","id","concat"],"sources":["../../src/model/model-utils.ts"],"sourcesContent":["import {Device, Buffer, assert} from '@luma.gl/api';\nimport type {Geometry} from '../geometry/geometry';\n\n// Support for mapping new geometries with glTF attribute names to \"classic\" luma.gl shader names\nconst GLTF_TO_LUMA_ATTRIBUTE_MAP = {\n POSITION: 'positions',\n NORMAL: 'normals',\n COLOR_0: 'colors',\n TEXCOORD_0: 'texCoords',\n TEXCOORD_1: 'texCoords1',\n TEXCOORD_2: 'texCoords2'\n};\n\n/*\nexport function getAttributeLayoutsFromGeometry(geometry: Geometry) {\n const layouts: Record<string, {}> = {};\n let indices = geometry.indices;\n\n for (const [name, attribute] of Object.entries(geometry.attributes)) {\n const remappedName = mapAttributeName(name);\n\n if (attribute.constant) {\n throw new Error('constant attributes not supported');\n } else {\n const typedArray = attribute.value;\n // Create accessor by copying the attribute and removing `value``\n const accessor = {...attribute};\n delete accessor.value;\n buffers[remappedName] = [device.createBuffer(typedArray), accessor];\n\n inferAttributeAccessor(name, accessor);\n }\n }\n}\n\nexport class Table {\n length: number;\n // columns: Record<string, TypedArray> = {};\n}\n\nexport class GPUTable {\n length: number;\n columns: Record<string, Buffer> = {};\n}\n\nexport function convertTableToGPUTable(table: Table) {\n // for (const ) {}\n}\n\nexport function renameTableColumns(table: Table, map: (name: string) => string) {\n const newColumns = table.columns.reduce()\n table.clone();\n}\n*/\n\nexport function getIndexBufferFromGeometry(device: Device, geometry: Geometry): Buffer | undefined {\n if (!geometry.indices) {\n return undefined;\n }\n\n // @ts-expect-error\n const data = geometry.indices.value || geometry.indices;\n assert(\n data instanceof Uint16Array || data instanceof Uint32Array,\n 'attribute array for \"indices\" must be of integer type'\n );\n return device.createBuffer({usage: Buffer.INDEX, data});\n}\n\nexport function getAttributeBuffersFromGeometry(device: Device, geometry: Geometry): Record<string, Buffer> {\n const buffers: Record<string, Buffer> = {};\n\n for (const [name, attribute] of Object.entries(geometry.attributes)) {\n const remappedName = mapAttributeName(name);\n if (attribute?.constant) {\n throw new Error('constant attributes not supported');\n } else {\n const typedArray = attribute?.value;\n buffers[remappedName] = device.createBuffer({data: typedArray, id: `${remappedName}-buffer`});\n }\n }\n\n return buffers;\n}\n\nfunction mapAttributeName(name: string): string {\n // @ts-ignore-error\n return GLTF_TO_LUMA_ATTRIBUTE_MAP[name] || name;\n}\n\n/*\n// Check for well known attribute names\n// eslint-disable-next-line complexity\nexport function inferAttributeAccessor(attributeName, attribute) {\n let category;\n switch (attributeName) {\n case 'texCoords':\n case 'texCoord1':\n case 'texCoord2':\n case 'texCoord3':\n category = 'uvs';\n break;\n case 'vertices':\n case 'positions':\n case 'normals':\n case 'pickingColors':\n category = 'vectors';\n break;\n default:\n }\n\n // Check for categorys\n switch (category) {\n case 'vectors':\n attribute.size = attribute.size || 3;\n break;\n case 'uvs':\n attribute.size = attribute.size || 2;\n break;\n default:\n }\n\n assert(Number.isFinite(attribute.size), `attribute ${attributeName} needs size`);\n}\n*/\n"],"mappings":"AAAA,SAAgBA,MAAM,EAAEC,MAAM,QAAO,cAAc;AAInD,MAAMC,0BAA0B,GAAG;EACjCC,QAAQ,EAAE,WAAW;EACrBC,MAAM,EAAE,SAAS;EACjBC,OAAO,EAAE,QAAQ;EACjBC,UAAU,EAAE,WAAW;EACvBC,UAAU,EAAE,YAAY;EACxBC,UAAU,EAAE;AACd,CAAC;AA4CD,OAAO,SAASC,0BAA0BA,CAACC,MAAc,EAAEC,QAAkB,EAAsB;EACjG,IAAI,CAACA,QAAQ,CAACC,OAAO,EAAE;IACrB,OAAOC,SAAS;EAClB;EAGA,MAAMC,IAAI,GAAGH,QAAQ,CAACC,OAAO,CAACG,KAAK,IAAIJ,QAAQ,CAACC,OAAO;EACvDX,MAAM,CACJa,IAAI,YAAYE,WAAW,IAAIF,IAAI,YAAYG,WAAW,EAC1D,uDACF,CAAC;EACD,OAAOP,MAAM,CAACQ,YAAY,CAAC;IAACC,KAAK,EAAEnB,MAAM,CAACoB,KAAK;IAAEN;EAAI,CAAC,CAAC;AACzD;AAEA,OAAO,SAASO,+BAA+BA,CAACX,MAAc,EAAEC,QAAkB,EAA0B;EAC1G,MAAMW,OAA+B,GAAG,CAAC,CAAC;EAE1C,KAAK,MAAM,CAACC,IAAI,EAAEC,SAAS,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACf,QAAQ,CAACgB,UAAU,CAAC,EAAE;IACnE,MAAMC,YAAY,GAAGC,gBAAgB,CAACN,IAAI,CAAC;IAC3C,IAAIC,SAAS,aAATA,SAAS,eAATA,SAAS,CAAEM,QAAQ,EAAE;MACvB,MAAM,IAAIC,KAAK,CAAC,mCAAmC,CAAC;IACtD,CAAC,MAAM;MACL,MAAMC,UAAU,GAAGR,SAAS,aAATA,SAAS,uBAATA,SAAS,CAAET,KAAK;MACnCO,OAAO,CAACM,YAAY,CAAC,GAAGlB,MAAM,CAACQ,YAAY,CAAC;QAACJ,IAAI,EAAEkB,UAAU;QAAEC,EAAE,KAAAC,MAAA,CAAKN,YAAY;MAAS,CAAC,CAAC;IAC/F;EACF;EAEA,OAAON,OAAO;AAChB;AAEA,SAASO,gBAAgBA,CAACN,IAAY,EAAU;EAE9C,OAAOrB,0BAA0B,CAACqB,IAAI,CAAC,IAAIA,IAAI;AACjD"}
@@ -3,7 +3,7 @@ import { RenderPipeline } from '@luma.gl/api';
3
3
  import type { ShaderModule } from '@luma.gl/shadertools';
4
4
  import type { Geometry } from '../geometry/geometry';
5
5
  import { PipelineFactory } from '../lib/pipeline-factory';
6
- export declare type ModelProps = Omit<RenderPipelineProps, 'vs' | 'fs'> & {
6
+ export type ModelProps = Omit<RenderPipelineProps, 'vs' | 'fs'> & {
7
7
  vs?: {
8
8
  glsl?: string;
9
9
  wgsl?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/model/model.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE,UAAU,EAAE,OAAO,EAAE,iBAAiB,EAAC,MAAM,cAAc,CAAC;AAC9G,OAAO,EAAC,cAAc,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAEnD,OAAO,EAAC,eAAe,EAAC,MAAM,yBAAyB,CAAC;AAExD,oBAAY,UAAU,GAAG,IAAI,CAAC,mBAAmB,EAAE,IAAI,GAAG,IAAI,CAAC,GAAG;IAEhE,EAAE,CAAC,EAAE;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAC,GAAG,MAAM,GAAG,IAAI,CAAC;IACpD,EAAE,CAAC,EAAE;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAC,GAAG,MAAM,GAAG,IAAI,CAAC;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IACpD,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IACrD,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3B,mEAAmE;IACnE,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC,CAAC;AAgBF,aAAa;AACb,qBAAa,KAAK;IAChB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAQ;IAClC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,WAAW,SAAC;IAErB,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C,QAAQ,EAAE,cAAc,CAAC;IAEzB,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;IAE5B,OAAO,CAAC,kBAAkB,CAAuE;gBAErF,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU;IA4C7C,OAAO,IAAI,IAAI;IAIf,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IASlC,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAmBjC,oBAAoB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAMtD,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAMrC,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAMvD,uBAAuB;IACvB,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAMpD,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAMhD,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;CAWvC"}
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/model/model.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE,UAAU,EAAE,OAAO,EAAE,iBAAiB,EAAC,MAAM,cAAc,CAAC;AAC9G,OAAO,EAAC,cAAc,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAEnD,OAAO,EAAC,eAAe,EAAC,MAAM,yBAAyB,CAAC;AAExD,MAAM,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,EAAE,IAAI,GAAG,IAAI,CAAC,GAAG;IAEhE,EAAE,CAAC,EAAE;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAC,GAAG,MAAM,GAAG,IAAI,CAAC;IACpD,EAAE,CAAC,EAAE;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAC,GAAG,MAAM,GAAG,IAAI,CAAC;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IACpD,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IACrD,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3B,mEAAmE;IACnE,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC,CAAC;AAgBF,aAAa;AACb,qBAAa,KAAK;IAChB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAQ;IAClC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,WAAW,SAAC;IAErB,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C,QAAQ,EAAE,cAAc,CAAC;IAEzB,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;IAE5B,OAAO,CAAC,kBAAkB,CAAuE;gBAErF,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU;IA4C7C,OAAO,IAAI,IAAI;IAIf,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IASlC,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAmBjC,oBAAoB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAMtD,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAMrC,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAMvD,uBAAuB;IACvB,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAMpD,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAMhD,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;CAWvC"}
@@ -1 +1 @@
1
- {"version":3,"file":"model.js","names":["RenderPipeline","getAttributeBuffersFromGeometry","getIndexBufferFromGeometry","PipelineFactory","DEFAULT_MODEL_PROPS","_DEFAULT_PROPS","vs","fs","id","handle","undefined","userData","defines","modules","moduleSettings","geometry","pipelineFactory","Model","constructor","device","props","_defineProperty","Error","getShaderSource","vertexCount","topology","getDefaultPipelineFactory","pipeline","getUniforms","createRenderPipeline","parameters","layout","_getModuleUniforms","_setGeometry","setUniforms","setProps","destroy","release","draw","renderPass","instanceCount","indices","setIndexBuffer","attributes","setAttributes","bindings","setBindings","uniforms","updateModuleSettings","Object","assign","geometryBuffers","indexBuffer","shader","info","type","wgsl","glsl"],"sources":["../../src/model/model.ts"],"sourcesContent":["// luma.gl, MIT license\n\nimport type {Device, Buffer, RenderPipelineProps, RenderPass, Binding, PrimitiveTopology} from '@luma.gl/api';\nimport {RenderPipeline} from '@luma.gl/api';\nimport type { ShaderModule } from '@luma.gl/shadertools';\nimport type {Geometry} from '../geometry/geometry';\nimport {getAttributeBuffersFromGeometry, getIndexBufferFromGeometry} from './model-utils';\nimport {PipelineFactory} from '../lib/pipeline-factory';\n\nexport type ModelProps = Omit<RenderPipelineProps, 'vs' | 'fs'> & {\n // Model also accepts a string\n vs?: {glsl?: string; wgsl?: string} | string | null;\n fs?: {glsl?: string; wgsl?: string} | string | null;\n defines?: Record<string, string | number | boolean>;\n modules?: ShaderModule[];\n moduleSettings?: Record<string, Record<string, any>>;\n geometry?: Geometry | null;\n /** deprecated pipeline factory to use to create renderpipelines */\n pipelineFactory?: PipelineFactory;\n};\n\nconst DEFAULT_MODEL_PROPS: Required<ModelProps> = {\n ...RenderPipeline._DEFAULT_PROPS,\n vs: null,\n fs: null,\n id: 'unnamed',\n handle: undefined,\n userData: {},\n defines: {},\n modules: [],\n moduleSettings: {},\n geometry: null,\n pipelineFactory: undefined\n};\n\n/** v9 API */\nexport class Model {\n readonly device: Device;\n readonly id: string;\n readonly vs: string;\n readonly fs: string | null = null;\n readonly topology: PrimitiveTopology;\n readonly vertexCount;\n\n readonly pipelineFactory: PipelineFactory;\n pipeline: RenderPipeline;\n\n props: Required<ModelProps>;\n\n private _getModuleUniforms: (props?: Record<string, Record<string, any>>) => Record<string, any>;\n\n constructor(device: Device, props: ModelProps) {\n this.props = {...DEFAULT_MODEL_PROPS, ...props};\n props = this.props;\n this.id = this.props.id;\n this.device = device;\n\n // Create the pipeline\n if (!props.vs) {\n throw new Error('no vertex shader');\n }\n this.vs = getShaderSource(this.device, props.vs);\n if (props.fs) {\n this.fs = getShaderSource(this.device, props.fs);\n }\n\n this.vertexCount = this.props.vertexCount;\n this.topology = this.props.topology;\n\n if (this.props.geometry) {\n this.vertexCount = this.props.geometry.vertexCount;\n this.topology = this.props.geometry.topology || 'triangle-list';\n }\n\n this.pipelineFactory = this.props.pipelineFactory || PipelineFactory.getDefaultPipelineFactory(this.device);\n const {pipeline, getUniforms} = this.pipelineFactory.createRenderPipeline({\n ...this.props,\n vs: this.vs,\n fs: this.fs,\n topology: this.topology,\n defines: props.defines,\n parameters: props.parameters,\n layout: props.layout\n });\n\n this.pipeline = pipeline;\n this._getModuleUniforms = getUniforms;\n\n if (this.props.geometry) {\n this._setGeometry(this.props.geometry);\n }\n this.setUniforms(this._getModuleUniforms()) // Get all default module uniforms\n this.setProps(this.props);\n }\n\n destroy(): void {\n this.pipelineFactory.release(this.pipeline);\n }\n\n draw(renderPass: RenderPass): this {\n this.pipeline.draw({\n renderPass,\n vertexCount: this.vertexCount,\n instanceCount: this.props.instanceCount\n });\n return this;\n }\n\n setProps(props: ModelProps): this {\n if (props.indices) {\n this.setIndexBuffer(props.indices);\n }\n if (props.attributes) {\n this.setAttributes(props.attributes);\n }\n if (props.bindings) {\n this.setBindings(props.bindings);\n }\n if (props.uniforms) {\n this.setUniforms(props.uniforms);\n }\n if (props.moduleSettings) {\n this.updateModuleSettings(props.moduleSettings);\n }\n return this;\n }\n\n updateModuleSettings(props: Record<string, any>): this {\n const uniforms = this._getModuleUniforms(props);\n this.setUniforms(uniforms);\n return this;\n }\n\n setIndexBuffer(indices: Buffer): this {\n this.pipeline.setIndexBuffer(indices);\n // this._indices = indices;\n return this;\n }\n\n setAttributes(attributes: Record<string, Buffer>): this {\n this.pipeline.setAttributes(attributes);\n Object.assign(this.props.attributes, attributes);\n return this;\n }\n\n /** Set the bindings */\n setBindings(bindings: Record<string, Binding>): this {\n this.pipeline.setBindings(bindings);\n Object.assign(this.props.bindings, bindings);\n return this;\n }\n\n setUniforms(uniforms: Record<string, any>): this {\n this.pipeline.setUniforms(uniforms);\n Object.assign(this.props.uniforms, uniforms);\n return this;\n }\n\n _setGeometry(geometry: Geometry): void {\n // this._deleteGeometryBuffers();\n\n const geometryBuffers = getAttributeBuffersFromGeometry(this.device, geometry);\n this.setAttributes(geometryBuffers);\n\n const indexBuffer = getIndexBufferFromGeometry(this.device, geometry);\n if (indexBuffer) {\n this.setIndexBuffer(indexBuffer);\n }\n }\n}\n\n/** Create a shader from the different overloads */\nfunction getShaderSource(device: Device, shader: string | {glsl?: string; wgsl?: string}): string {\n // TODO - detect WGSL/GLSL and throw an error if not supported\n if (typeof shader === 'string') {\n return shader;\n }\n\n switch (device.info.type) {\n case 'webgpu':\n if (shader?.wgsl) {\n return shader.wgsl;\n }\n throw new Error('WebGPU does not support GLSL shaders');\n\n default:\n if (shader?.glsl) {\n return shader.glsl;\n }\n throw new Error('WebGL does not support WGSL shaders');\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"model.js","names":["RenderPipeline","getAttributeBuffersFromGeometry","getIndexBufferFromGeometry","PipelineFactory","DEFAULT_MODEL_PROPS","_DEFAULT_PROPS","vs","fs","id","handle","undefined","userData","defines","modules","moduleSettings","geometry","pipelineFactory","Model","constructor","device","props","_defineProperty","Error","getShaderSource","vertexCount","topology","getDefaultPipelineFactory","pipeline","getUniforms","createRenderPipeline","parameters","layout","_getModuleUniforms","_setGeometry","setUniforms","setProps","destroy","release","draw","renderPass","instanceCount","indices","setIndexBuffer","attributes","setAttributes","bindings","setBindings","uniforms","updateModuleSettings","Object","assign","geometryBuffers","indexBuffer","shader","info","type","wgsl","glsl"],"sources":["../../src/model/model.ts"],"sourcesContent":["// luma.gl, MIT license\n\nimport type {Device, Buffer, RenderPipelineProps, RenderPass, Binding, PrimitiveTopology} from '@luma.gl/api';\nimport {RenderPipeline} from '@luma.gl/api';\nimport type { ShaderModule } from '@luma.gl/shadertools';\nimport type {Geometry} from '../geometry/geometry';\nimport {getAttributeBuffersFromGeometry, getIndexBufferFromGeometry} from './model-utils';\nimport {PipelineFactory} from '../lib/pipeline-factory';\n\nexport type ModelProps = Omit<RenderPipelineProps, 'vs' | 'fs'> & {\n // Model also accepts a string\n vs?: {glsl?: string; wgsl?: string} | string | null;\n fs?: {glsl?: string; wgsl?: string} | string | null;\n defines?: Record<string, string | number | boolean>;\n modules?: ShaderModule[];\n moduleSettings?: Record<string, Record<string, any>>;\n geometry?: Geometry | null;\n /** deprecated pipeline factory to use to create renderpipelines */\n pipelineFactory?: PipelineFactory;\n};\n\nconst DEFAULT_MODEL_PROPS: Required<ModelProps> = {\n ...RenderPipeline._DEFAULT_PROPS,\n vs: null,\n fs: null,\n id: 'unnamed',\n handle: undefined,\n userData: {},\n defines: {},\n modules: [],\n moduleSettings: {},\n geometry: null,\n pipelineFactory: undefined\n};\n\n/** v9 API */\nexport class Model {\n readonly device: Device;\n readonly id: string;\n readonly vs: string;\n readonly fs: string | null = null;\n readonly topology: PrimitiveTopology;\n readonly vertexCount;\n\n readonly pipelineFactory: PipelineFactory;\n pipeline: RenderPipeline;\n\n props: Required<ModelProps>;\n\n private _getModuleUniforms: (props?: Record<string, Record<string, any>>) => Record<string, any>;\n\n constructor(device: Device, props: ModelProps) {\n this.props = {...DEFAULT_MODEL_PROPS, ...props};\n props = this.props;\n this.id = this.props.id;\n this.device = device;\n\n // Create the pipeline\n if (!props.vs) {\n throw new Error('no vertex shader');\n }\n this.vs = getShaderSource(this.device, props.vs);\n if (props.fs) {\n this.fs = getShaderSource(this.device, props.fs);\n }\n\n this.vertexCount = this.props.vertexCount;\n this.topology = this.props.topology;\n\n if (this.props.geometry) {\n this.vertexCount = this.props.geometry.vertexCount;\n this.topology = this.props.geometry.topology || 'triangle-list';\n }\n\n this.pipelineFactory = this.props.pipelineFactory || PipelineFactory.getDefaultPipelineFactory(this.device);\n const {pipeline, getUniforms} = this.pipelineFactory.createRenderPipeline({\n ...this.props,\n vs: this.vs,\n fs: this.fs,\n topology: this.topology,\n defines: props.defines,\n parameters: props.parameters,\n layout: props.layout\n });\n\n this.pipeline = pipeline;\n this._getModuleUniforms = getUniforms;\n\n if (this.props.geometry) {\n this._setGeometry(this.props.geometry);\n }\n this.setUniforms(this._getModuleUniforms()) // Get all default module uniforms\n this.setProps(this.props);\n }\n\n destroy(): void {\n this.pipelineFactory.release(this.pipeline);\n }\n\n draw(renderPass: RenderPass): this {\n this.pipeline.draw({\n renderPass,\n vertexCount: this.vertexCount,\n instanceCount: this.props.instanceCount\n });\n return this;\n }\n\n setProps(props: ModelProps): this {\n if (props.indices) {\n this.setIndexBuffer(props.indices);\n }\n if (props.attributes) {\n this.setAttributes(props.attributes);\n }\n if (props.bindings) {\n this.setBindings(props.bindings);\n }\n if (props.uniforms) {\n this.setUniforms(props.uniforms);\n }\n if (props.moduleSettings) {\n this.updateModuleSettings(props.moduleSettings);\n }\n return this;\n }\n\n updateModuleSettings(props: Record<string, any>): this {\n const uniforms = this._getModuleUniforms(props);\n this.setUniforms(uniforms);\n return this;\n }\n\n setIndexBuffer(indices: Buffer): this {\n this.pipeline.setIndexBuffer(indices);\n // this._indices = indices;\n return this;\n }\n\n setAttributes(attributes: Record<string, Buffer>): this {\n this.pipeline.setAttributes(attributes);\n Object.assign(this.props.attributes, attributes);\n return this;\n }\n\n /** Set the bindings */\n setBindings(bindings: Record<string, Binding>): this {\n this.pipeline.setBindings(bindings);\n Object.assign(this.props.bindings, bindings);\n return this;\n }\n\n setUniforms(uniforms: Record<string, any>): this {\n this.pipeline.setUniforms(uniforms);\n Object.assign(this.props.uniforms, uniforms);\n return this;\n }\n\n _setGeometry(geometry: Geometry): void {\n // this._deleteGeometryBuffers();\n\n const geometryBuffers = getAttributeBuffersFromGeometry(this.device, geometry);\n this.setAttributes(geometryBuffers);\n\n const indexBuffer = getIndexBufferFromGeometry(this.device, geometry);\n if (indexBuffer) {\n this.setIndexBuffer(indexBuffer);\n }\n }\n}\n\n/** Create a shader from the different overloads */\nfunction getShaderSource(device: Device, shader: string | {glsl?: string; wgsl?: string}): string {\n // TODO - detect WGSL/GLSL and throw an error if not supported\n if (typeof shader === 'string') {\n return shader;\n }\n\n switch (device.info.type) {\n case 'webgpu':\n if (shader?.wgsl) {\n return shader.wgsl;\n }\n throw new Error('WebGPU does not support GLSL shaders');\n\n default:\n if (shader?.glsl) {\n return shader.glsl;\n }\n throw new Error('WebGL does not support WGSL shaders');\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { Matrix4 } from '@math.gl/core';
2
+ import { ScenegraphNode, ScenegraphNodeProps } from './scenegraph-node';
3
+ export type GroupNodeProps = ScenegraphNodeProps & {
4
+ children?: ScenegraphNode[];
5
+ };
6
+ export declare class GroupNode extends ScenegraphNode {
7
+ children: ScenegraphNode[];
8
+ constructor(children: ScenegraphNode[]);
9
+ constructor(props?: GroupNodeProps);
10
+ getBounds(): [number[], number[]] | null;
11
+ destroy(): void;
12
+ add(...children: (ScenegraphNode | ScenegraphNode[])[]): this;
13
+ remove(child: ScenegraphNode): this;
14
+ removeAll(): this;
15
+ traverse(visitor: (node: ScenegraphNode, context: {
16
+ worldMatrix: Matrix4;
17
+ }) => void, { worldMatrix }?: {
18
+ worldMatrix?: Matrix4;
19
+ }): void;
20
+ }
21
+ //# sourceMappingURL=group-node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-node.d.ts","sourceRoot":"","sources":["../../src/scenegraph/group-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAU,MAAM,eAAe,CAAC;AAE/C,OAAO,EAAC,cAAc,EAAE,mBAAmB,EAAC,MAAM,mBAAmB,CAAC;AAEtE,MAAM,MAAM,cAAc,GAAG,mBAAmB,GAAG;IACjD,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;CAC7B,CAAA;AAED,qBAAa,SAAU,SAAQ,cAAc;IAC3C,QAAQ,EAAE,cAAc,EAAE,CAAC;gBAEf,QAAQ,EAAE,cAAc,EAAE;gBAC1B,KAAK,CAAC,EAAE,cAAc;IAazB,SAAS,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI;IAkCxC,OAAO,IAAI,IAAI;IAOxB,GAAG,CAAC,GAAG,QAAQ,EAAE,CAAC,cAAc,GAAG,cAAc,EAAE,CAAC,EAAE,GAAG,IAAI;IAW7D,MAAM,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IASnC,SAAS,IAAI,IAAI;IAKjB,QAAQ,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE;QAAC,WAAW,EAAE,OAAO,CAAA;KAAC,KAAK,IAAI,EAAE,EAAC,WAA2B,EAAC;;KAAK;CAWtH"}
@@ -0,0 +1,95 @@
1
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
+ import { Matrix4, Vector3 } from '@math.gl/core';
3
+ import { log } from '@luma.gl/api';
4
+ import { ScenegraphNode } from "./scenegraph-node.js";
5
+ export class GroupNode extends ScenegraphNode {
6
+ constructor() {
7
+ let props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
8
+ props = Array.isArray(props) ? {
9
+ children: props
10
+ } : props;
11
+ const {
12
+ children = []
13
+ } = props;
14
+ log.assert(children.every(child => child instanceof ScenegraphNode), 'every child must an instance of ScenegraphNode');
15
+ super(props);
16
+ _defineProperty(this, "children", void 0);
17
+ this.children = children;
18
+ }
19
+ getBounds() {
20
+ const result = [[Infinity, Infinity, Infinity], [-Infinity, -Infinity, -Infinity]];
21
+ this.traverse((node, _ref) => {
22
+ let {
23
+ worldMatrix
24
+ } = _ref;
25
+ const bounds = node.getBounds();
26
+ if (!bounds) {
27
+ return;
28
+ }
29
+ const [min, max] = bounds;
30
+ const center = new Vector3(min).add(max).divide([2, 2, 2]);
31
+ worldMatrix.transformAsPoint(center, center);
32
+ const halfSize = new Vector3(max).subtract(min).divide([2, 2, 2]);
33
+ worldMatrix.transformAsVector(halfSize, halfSize);
34
+ for (let v = 0; v < 8; v++) {
35
+ const position = new Vector3(v & 0b001 ? -1 : 1, v & 0b010 ? -1 : 1, v & 0b100 ? -1 : 1).multiply(halfSize).add(center);
36
+ for (let i = 0; i < 3; i++) {
37
+ result[0][i] = Math.min(result[0][i], position[i]);
38
+ result[1][i] = Math.max(result[1][i], position[i]);
39
+ }
40
+ }
41
+ });
42
+ if (!Number.isFinite(result[0][0])) {
43
+ return null;
44
+ }
45
+ return result;
46
+ }
47
+ destroy() {
48
+ this.children.forEach(child => child.destroy());
49
+ this.removeAll();
50
+ super.destroy();
51
+ }
52
+ add() {
53
+ for (var _len = arguments.length, children = new Array(_len), _key = 0; _key < _len; _key++) {
54
+ children[_key] = arguments[_key];
55
+ }
56
+ for (const child of children) {
57
+ if (Array.isArray(child)) {
58
+ this.add(...child);
59
+ } else {
60
+ this.children.push(child);
61
+ }
62
+ }
63
+ return this;
64
+ }
65
+ remove(child) {
66
+ const children = this.children;
67
+ const indexOf = children.indexOf(child);
68
+ if (indexOf > -1) {
69
+ children.splice(indexOf, 1);
70
+ }
71
+ return this;
72
+ }
73
+ removeAll() {
74
+ this.children = [];
75
+ return this;
76
+ }
77
+ traverse(visitor) {
78
+ let {
79
+ worldMatrix = new Matrix4()
80
+ } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
81
+ const modelMatrix = new Matrix4(worldMatrix).multiplyRight(this.matrix);
82
+ for (const child of this.children) {
83
+ if (child instanceof GroupNode) {
84
+ child.traverse(visitor, {
85
+ worldMatrix: modelMatrix
86
+ });
87
+ } else {
88
+ visitor(child, {
89
+ worldMatrix: modelMatrix
90
+ });
91
+ }
92
+ }
93
+ }
94
+ }
95
+ //# sourceMappingURL=group-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-node.js","names":["Matrix4","Vector3","log","ScenegraphNode","GroupNode","constructor","props","arguments","length","undefined","Array","isArray","children","assert","every","child","_defineProperty","getBounds","result","Infinity","traverse","node","_ref","worldMatrix","bounds","min","max","center","add","divide","transformAsPoint","halfSize","subtract","transformAsVector","v","position","multiply","i","Math","Number","isFinite","destroy","forEach","removeAll","_len","_key","push","remove","indexOf","splice","visitor","modelMatrix","multiplyRight","matrix"],"sources":["../../src/scenegraph/group-node.ts"],"sourcesContent":["import {Matrix4, Vector3} from '@math.gl/core';\nimport {log} from '@luma.gl/api';\nimport {ScenegraphNode, ScenegraphNodeProps} from './scenegraph-node';\n\nexport type GroupNodeProps = ScenegraphNodeProps & {\n children?: ScenegraphNode[];\n}\n\nexport class GroupNode extends ScenegraphNode {\n children: ScenegraphNode[];\n\n constructor(children: ScenegraphNode[]);\n constructor(props?: GroupNodeProps);\n\n constructor(props: ScenegraphNode[] | GroupNodeProps = {}) {\n props = Array.isArray(props) ? {children: props} : props;\n const {children = []} = props;\n log.assert(\n children.every((child) => child instanceof ScenegraphNode),\n 'every child must an instance of ScenegraphNode'\n );\n super(props);\n this.children = children;\n }\n\n override getBounds(): [number[], number[]] | null {\n const result: [number[], number[]] = [[Infinity, Infinity, Infinity], [-Infinity, -Infinity, -Infinity]];\n\n this.traverse((node, {worldMatrix}) => {\n const bounds = node.getBounds();\n if (!bounds) {\n return;\n }\n const [min, max] = bounds;\n const center = new Vector3(min).add(max).divide([2, 2, 2]);\n worldMatrix.transformAsPoint(center, center);\n const halfSize = new Vector3(max).subtract(min).divide([2, 2, 2]);\n worldMatrix.transformAsVector(halfSize, halfSize);\n\n for (let v = 0; v < 8; v++) {\n // Test all 8 corners of the box\n const position = new Vector3(\n v & 0b001 ? -1 : 1,\n v & 0b010 ? -1 : 1,\n v & 0b100 ? -1 : 1\n ).multiply(halfSize).add(center);\n\n for (let i = 0; i < 3; i++) {\n result[0][i] = Math.min(result[0][i], position[i]);\n result[1][i] = Math.max(result[1][i], position[i]);\n }\n }\n });\n if (!Number.isFinite(result[0][0])) {\n return null;\n }\n return result;\n }\n\n override destroy(): void {\n this.children.forEach((child) => child.destroy());\n this.removeAll();\n super.destroy();\n }\n\n // Unpacks arrays and nested arrays of children\n add(...children: (ScenegraphNode | ScenegraphNode[])[]): this {\n for (const child of children) {\n if (Array.isArray(child)) {\n this.add(...child);\n } else {\n this.children.push(child);\n }\n }\n return this;\n }\n\n remove(child: ScenegraphNode): this {\n const children = this.children;\n const indexOf = children.indexOf(child);\n if (indexOf > -1) {\n children.splice(indexOf, 1);\n }\n return this;\n }\n\n removeAll(): this {\n this.children = [];\n return this;\n }\n\n traverse(visitor: (node: ScenegraphNode, context: {worldMatrix: Matrix4}) => void, {worldMatrix = new Matrix4()} = {}) {\n const modelMatrix = new Matrix4(worldMatrix).multiplyRight(this.matrix);\n\n for (const child of this.children) {\n if (child instanceof GroupNode) {\n child.traverse(visitor, {worldMatrix: modelMatrix});\n } else {\n visitor(child, {worldMatrix: modelMatrix});\n }\n }\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { RenderPass } from '@luma.gl/api';
2
+ import { ScenegraphNode, ScenegraphNodeProps } from './scenegraph-node';
3
+ import { Model } from '../model/model';
4
+ export type ModelNodeProps = ScenegraphNodeProps & {
5
+ model: Model;
6
+ managedResources?: any[];
7
+ bounds?: [number[], number[]];
8
+ };
9
+ export declare class ModelNode extends ScenegraphNode {
10
+ readonly model: Model;
11
+ bounds: [number[], number[]] | null;
12
+ managedResources: any[];
13
+ constructor(props: ModelNodeProps);
14
+ getBounds(): [number[], number[]] | null;
15
+ destroy(): void;
16
+ draw(renderPass?: RenderPass): Model;
17
+ }
18
+ //# sourceMappingURL=model-node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-node.d.ts","sourceRoot":"","sources":["../../src/scenegraph/model-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,cAAc,CAAC;AACxC,OAAO,EAAC,cAAc,EAAE,mBAAmB,EAAC,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAC,KAAK,EAAC,MAAM,gBAAgB,CAAC;AAErC,MAAM,MAAM,cAAc,GAAG,mBAAmB,GAAG;IACjD,KAAK,EAAE,KAAK,CAAC;IACb,gBAAgB,CAAC,EAAE,GAAG,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;CAC/B,CAAA;AAED,qBAAa,SAAU,SAAQ,cAAc;IAC3C,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAQ;IAC3C,gBAAgB,EAAE,GAAG,EAAE,CAAC;gBAOZ,KAAK,EAAE,cAAc;IAUxB,SAAS,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI;IAIxC,OAAO,IAAI,IAAI;IAWxB,IAAI,CAAC,UAAU,CAAC,EAAE,UAAU;CAI7B"}
@@ -0,0 +1,29 @@
1
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
+ import { ScenegraphNode } from "./scenegraph-node.js";
3
+ export class ModelNode extends ScenegraphNode {
4
+ constructor(props) {
5
+ super(props);
6
+ _defineProperty(this, "model", void 0);
7
+ _defineProperty(this, "bounds", null);
8
+ _defineProperty(this, "managedResources", void 0);
9
+ this.model = props.model;
10
+ this.managedResources = props.managedResources || [];
11
+ this.bounds = props.bounds || null;
12
+ this.setProps(props);
13
+ }
14
+ getBounds() {
15
+ return this.bounds;
16
+ }
17
+ destroy() {
18
+ if (this.model) {
19
+ this.model.destroy();
20
+ this.model = null;
21
+ }
22
+ this.managedResources.forEach(resource => resource.destroy());
23
+ this.managedResources = [];
24
+ }
25
+ draw(renderPass) {
26
+ return this.model.draw(renderPass);
27
+ }
28
+ }
29
+ //# sourceMappingURL=model-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-node.js","names":["ScenegraphNode","ModelNode","constructor","props","_defineProperty","model","managedResources","bounds","setProps","getBounds","destroy","forEach","resource","draw","renderPass"],"sources":["../../src/scenegraph/model-node.ts"],"sourcesContent":["import {RenderPass} from '@luma.gl/api';\nimport {ScenegraphNode, ScenegraphNodeProps} from './scenegraph-node';\nimport {Model} from '../model/model';\n\nexport type ModelNodeProps = ScenegraphNodeProps & {\n model: Model;\n managedResources?: any[];\n bounds?: [number[], number[]];\n}\n\nexport class ModelNode extends ScenegraphNode {\n readonly model: Model;\n bounds: [number[], number[]] | null = null;\n managedResources: any[];\n\n // TODO - is this used? override callbacks to make sure we call them with this\n // onBeforeRender = null;\n // onAfterRender = null;\n // AfterRender = null;\n\n constructor(props: ModelNodeProps) {\n super(props);\n\n // Create new Model or used supplied Model\n this.model = props.model;\n this.managedResources = props.managedResources || [];\n this.bounds = props.bounds || null;\n this.setProps(props);\n }\n\n override getBounds(): [number[], number[]] | null {\n return this.bounds;\n }\n\n override destroy(): void {\n if (this.model) {\n this.model.destroy();\n // @ts-expect-error\n this.model = null;\n }\n this.managedResources.forEach((resource) => resource.destroy());\n this.managedResources = [];\n }\n\n // Expose model methods\n draw(renderPass?: RenderPass) {\n // Return value indicates if something was actually drawn\n return this.model.draw(renderPass);\n }\n}\n"],"mappings":";SACQA,cAAc;AAStB,OAAO,MAAMC,SAAS,SAASD,cAAc,CAAC;EAU5CE,WAAWA,CAACC,KAAqB,EAAE;IACjC,KAAK,CAACA,KAAK,CAAC;IAACC,eAAA;IAAAA,eAAA,iBATuB,IAAI;IAAAA,eAAA;IAYxC,IAAI,CAACC,KAAK,GAAGF,KAAK,CAACE,KAAK;IACxB,IAAI,CAACC,gBAAgB,GAAGH,KAAK,CAACG,gBAAgB,IAAI,EAAE;IACpD,IAAI,CAACC,MAAM,GAAGJ,KAAK,CAACI,MAAM,IAAI,IAAI;IAClC,IAAI,CAACC,QAAQ,CAACL,KAAK,CAAC;EACtB;EAESM,SAASA,CAAA,EAAgC;IAChD,OAAO,IAAI,CAACF,MAAM;EACpB;EAESG,OAAOA,CAAA,EAAS;IACvB,IAAI,IAAI,CAACL,KAAK,EAAE;MACd,IAAI,CAACA,KAAK,CAACK,OAAO,CAAC,CAAC;MAEpB,IAAI,CAACL,KAAK,GAAG,IAAI;IACnB;IACA,IAAI,CAACC,gBAAgB,CAACK,OAAO,CAAEC,QAAQ,IAAKA,QAAQ,CAACF,OAAO,CAAC,CAAC,CAAC;IAC/D,IAAI,CAACJ,gBAAgB,GAAG,EAAE;EAC5B;EAGAO,IAAIA,CAACC,UAAuB,EAAE;IAE5B,OAAO,IAAI,CAACT,KAAK,CAACQ,IAAI,CAACC,UAAU,CAAC;EACpC;AACF"}
@@ -0,0 +1,56 @@
1
+ import { NumericArray } from '@luma.gl/api';
2
+ import { Vector3, Matrix4 } from '@math.gl/core';
3
+ /** Properties for creating a new Scenegraph */
4
+ export type ScenegraphNodeProps = {
5
+ id?: string;
6
+ /** whether to display the object at all */
7
+ display?: boolean;
8
+ matrix?: NumericArray;
9
+ position?: NumericArray;
10
+ rotation?: NumericArray;
11
+ scale?: NumericArray;
12
+ update?: boolean;
13
+ };
14
+ export declare class ScenegraphNode {
15
+ readonly id: string;
16
+ matrix: Matrix4;
17
+ display: boolean;
18
+ position: Vector3;
19
+ rotation: Vector3;
20
+ scale: Vector3;
21
+ userData: Record<string, unknown>;
22
+ props: ScenegraphNodeProps;
23
+ constructor(props?: ScenegraphNodeProps);
24
+ getBounds(): [number[], number[]] | null;
25
+ destroy(): void;
26
+ /** @deprecated use .destroy() */
27
+ delete(): void;
28
+ setProps(props: ScenegraphNodeProps): this;
29
+ toString(): string;
30
+ setPosition(position: any): this;
31
+ setRotation(rotation: any): this;
32
+ setScale(scale: any): this;
33
+ setMatrix(matrix: any, copyMatrix?: boolean): void;
34
+ setMatrixComponents(components: {
35
+ position?: any;
36
+ rotation?: any;
37
+ scale?: any;
38
+ update?: boolean;
39
+ }): this;
40
+ updateMatrix(): this;
41
+ update(options?: {
42
+ position?: any;
43
+ rotation?: any;
44
+ scale?: any;
45
+ }): this;
46
+ getCoordinateUniforms(viewMatrix: any, modelMatrix?: any): {
47
+ viewMatrix: any;
48
+ modelMatrix: any;
49
+ objectMatrix: any;
50
+ worldMatrix: any;
51
+ worldInverseMatrix: any;
52
+ worldInverseTransposeMatrix: any;
53
+ };
54
+ _setScenegraphNodeProps(props: ScenegraphNodeProps): void;
55
+ }
56
+ //# sourceMappingURL=scenegraph-node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenegraph-node.d.ts","sourceRoot":"","sources":["../../src/scenegraph/scenegraph-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,YAAY,EAAC,MAAM,cAAc,CAAC;AACvD,OAAO,EAAC,OAAO,EAAE,OAAO,EAAC,MAAM,eAAe,CAAC;AAE/C,+CAA+C;AAC/C,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,2CAA2C;IAC3C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,CAAC;AAEF,qBAAa,cAAc;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAiB;IAEhC,OAAO,UAAQ;IACf,QAAQ,UAAiB;IACzB,QAAQ,UAAiB;IACzB,KAAK,UAAwB;IAC7B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM;IAEvC,KAAK,EAAE,mBAAmB,CAAM;gBAEpB,KAAK,GAAE,mBAAwB;IAQ3C,SAAS,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI;IAIxC,OAAO,IAAI,IAAI;IAEf,iCAAiC;IACjC,MAAM,IAAI,IAAI;IAGd,QAAQ,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI;IAK1C,QAAQ,IAAI,MAAM;IAIlB,WAAW,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI;IAMhC,WAAW,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI;IAMhC,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;IAM1B,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,UAAU,GAAE,OAAc,GAAG,IAAI;IAQxD,mBAAmB,CAAC,UAAU,EAAE;QAC9B,QAAQ,CAAC,EAAE,GAAG,CAAC;QACf,QAAQ,CAAC,EAAE,GAAG,CAAC;QACf,KAAK,CAAC,EAAE,GAAG,CAAC;QACZ,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,GAAG,IAAI;IAiBR,YAAY,IAAI,IAAI;IAYpB,MAAM,CAAC,OAAO,GAAE;QAAC,QAAQ,CAAC,EAAE,GAAG,CAAC;QAAC,QAAQ,CAAC,EAAE,GAAG,CAAC;QAAC,KAAK,CAAC,EAAE,GAAG,CAAA;KAAM,GAAG,IAAI;IAezE,qBAAqB,CACnB,UAAU,EAAE,GAAG,EACf,WAAW,CAAC,EAAE,GAAG,GAChB;QACD,UAAU,EAAE,GAAG,CAAC;QAChB,WAAW,EAAE,GAAG,CAAC;QACjB,YAAY,EAAE,GAAG,CAAC;QAClB,WAAW,EAAE,GAAG,CAAC;QACjB,kBAAkB,EAAE,GAAG,CAAC;QACxB,2BAA2B,EAAE,GAAG,CAAC;KAClC;IA0CD,uBAAuB,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI;CAsB1D"}
@@ -0,0 +1,142 @@
1
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
+ import { assert, uid } from '@luma.gl/api';
3
+ import { Vector3, Matrix4 } from '@math.gl/core';
4
+ export class ScenegraphNode {
5
+ constructor() {
6
+ let props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
7
+ _defineProperty(this, "id", void 0);
8
+ _defineProperty(this, "matrix", new Matrix4());
9
+ _defineProperty(this, "display", true);
10
+ _defineProperty(this, "position", new Vector3());
11
+ _defineProperty(this, "rotation", new Vector3());
12
+ _defineProperty(this, "scale", new Vector3(1, 1, 1));
13
+ _defineProperty(this, "userData", {});
14
+ _defineProperty(this, "props", {});
15
+ const {
16
+ id
17
+ } = props;
18
+ this.id = id || uid(this.constructor.name);
19
+ this._setScenegraphNodeProps(props);
20
+ }
21
+ getBounds() {
22
+ return null;
23
+ }
24
+ destroy() {}
25
+ delete() {
26
+ this.destroy();
27
+ }
28
+ setProps(props) {
29
+ this._setScenegraphNodeProps(props);
30
+ return this;
31
+ }
32
+ toString() {
33
+ return "{type: ScenegraphNode, id: ".concat(this.id, ")}");
34
+ }
35
+ setPosition(position) {
36
+ assert(position.length === 3, 'setPosition requires vector argument');
37
+ this.position = position;
38
+ return this;
39
+ }
40
+ setRotation(rotation) {
41
+ assert(rotation.length === 3, 'setRotation requires vector argument');
42
+ this.rotation = rotation;
43
+ return this;
44
+ }
45
+ setScale(scale) {
46
+ assert(scale.length === 3, 'setScale requires vector argument');
47
+ this.scale = scale;
48
+ return this;
49
+ }
50
+ setMatrix(matrix) {
51
+ let copyMatrix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
52
+ if (copyMatrix) {
53
+ this.matrix.copy(matrix);
54
+ } else {
55
+ this.matrix = matrix;
56
+ }
57
+ }
58
+ setMatrixComponents(components) {
59
+ const {
60
+ position,
61
+ rotation,
62
+ scale,
63
+ update = true
64
+ } = components;
65
+ if (position) {
66
+ this.setPosition(position);
67
+ }
68
+ if (rotation) {
69
+ this.setRotation(rotation);
70
+ }
71
+ if (scale) {
72
+ this.setScale(scale);
73
+ }
74
+ if (update) {
75
+ this.updateMatrix();
76
+ }
77
+ return this;
78
+ }
79
+ updateMatrix() {
80
+ const pos = this.position;
81
+ const rot = this.rotation;
82
+ const scale = this.scale;
83
+ this.matrix.identity();
84
+ this.matrix.translate(pos);
85
+ this.matrix.rotateXYZ(rot);
86
+ this.matrix.scale(scale);
87
+ return this;
88
+ }
89
+ update() {
90
+ let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
91
+ const {
92
+ position,
93
+ rotation,
94
+ scale
95
+ } = options;
96
+ if (position) {
97
+ this.setPosition(position);
98
+ }
99
+ if (rotation) {
100
+ this.setRotation(rotation);
101
+ }
102
+ if (scale) {
103
+ this.setScale(scale);
104
+ }
105
+ this.updateMatrix();
106
+ return this;
107
+ }
108
+ getCoordinateUniforms(viewMatrix, modelMatrix) {
109
+ assert(viewMatrix);
110
+ modelMatrix = modelMatrix || this.matrix;
111
+ const worldMatrix = new Matrix4(viewMatrix).multiplyRight(modelMatrix);
112
+ const worldInverse = worldMatrix.invert();
113
+ const worldInverseTranspose = worldInverse.transpose();
114
+ return {
115
+ viewMatrix,
116
+ modelMatrix,
117
+ objectMatrix: modelMatrix,
118
+ worldMatrix,
119
+ worldInverseMatrix: worldInverse,
120
+ worldInverseTransposeMatrix: worldInverseTranspose
121
+ };
122
+ }
123
+ _setScenegraphNodeProps(props) {
124
+ if ('display' in props) {
125
+ this.display = props.display;
126
+ }
127
+ if ('position' in props) {
128
+ this.setPosition(props.position);
129
+ }
130
+ if ('rotation' in props) {
131
+ this.setRotation(props.rotation);
132
+ }
133
+ if ('scale' in props) {
134
+ this.setScale(props.scale);
135
+ }
136
+ if ('matrix' in props) {
137
+ this.setMatrix(props.matrix);
138
+ }
139
+ Object.assign(this.props, props);
140
+ }
141
+ }
142
+ //# sourceMappingURL=scenegraph-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenegraph-node.js","names":["assert","uid","Vector3","Matrix4","ScenegraphNode","constructor","props","arguments","length","undefined","_defineProperty","id","name","_setScenegraphNodeProps","getBounds","destroy","delete","setProps","toString","concat","setPosition","position","setRotation","rotation","setScale","scale","setMatrix","matrix","copyMatrix","copy","setMatrixComponents","components","update","updateMatrix","pos","rot","identity","translate","rotateXYZ","options","getCoordinateUniforms","viewMatrix","modelMatrix","worldMatrix","multiplyRight","worldInverse","invert","worldInverseTranspose","transpose","objectMatrix","worldInverseMatrix","worldInverseTransposeMatrix","display","Object","assign"],"sources":["../../src/scenegraph/scenegraph-node.ts"],"sourcesContent":["import {assert, uid, NumericArray} from '@luma.gl/api';\nimport {Vector3, Matrix4} from '@math.gl/core';\n\n/** Properties for creating a new Scenegraph */\nexport type ScenegraphNodeProps = {\n id?: string;\n /** whether to display the object at all */\n display?: boolean;\n matrix?: NumericArray;\n position?: NumericArray;\n rotation?: NumericArray;\n scale?: NumericArray;\n update?: boolean\n};\n\nexport class ScenegraphNode {\n readonly id: string;\n matrix: Matrix4 = new Matrix4();\n\n display = true; \n position = new Vector3();\n rotation = new Vector3();\n scale = new Vector3(1, 1, 1);\n userData: Record<string, unknown> = {};\n\n props: ScenegraphNodeProps = {};\n\n constructor(props: ScenegraphNodeProps = {}) {\n const {id} = props;\n\n this.id = id || uid(this.constructor.name);\n\n this._setScenegraphNodeProps(props);\n }\n\n getBounds(): [number[], number[]] | null {\n return null;\n }\n\n destroy(): void {}\n\n /** @deprecated use .destroy() */\n delete(): void {\n this.destroy();\n }\n setProps(props: ScenegraphNodeProps): this {\n this._setScenegraphNodeProps(props);\n return this;\n }\n\n toString(): string {\n return `{type: ScenegraphNode, id: ${this.id})}`;\n }\n\n setPosition(position: any): this {\n assert(position.length === 3, 'setPosition requires vector argument');\n this.position = position;\n return this;\n }\n\n setRotation(rotation: any): this {\n assert(rotation.length === 3, 'setRotation requires vector argument');\n this.rotation = rotation;\n return this;\n }\n\n setScale(scale: any): this {\n assert(scale.length === 3, 'setScale requires vector argument');\n this.scale = scale;\n return this;\n }\n\n setMatrix(matrix: any, copyMatrix: boolean = true): void {\n if (copyMatrix) {\n this.matrix.copy(matrix);\n } else {\n this.matrix = matrix;\n }\n }\n\n setMatrixComponents(components: {\n position?: any;\n rotation?: any;\n scale?: any;\n update?: boolean;\n }): this {\n const {position, rotation, scale, update = true} = components;\n if (position) {\n this.setPosition(position);\n }\n if (rotation) {\n this.setRotation(rotation);\n }\n if (scale) {\n this.setScale(scale);\n }\n if (update) {\n this.updateMatrix();\n }\n return this;\n }\n\n updateMatrix(): this {\n const pos = this.position;\n const rot = this.rotation;\n const scale = this.scale;\n\n this.matrix.identity();\n this.matrix.translate(pos);\n this.matrix.rotateXYZ(rot);\n this.matrix.scale(scale);\n return this;\n }\n\n update(options: {position?: any; rotation?: any; scale?: any} = {}): this {\n const {position, rotation, scale} = options;\n if (position) {\n this.setPosition(position);\n }\n if (rotation) {\n this.setRotation(rotation);\n }\n if (scale) {\n this.setScale(scale);\n }\n this.updateMatrix();\n return this;\n }\n\n getCoordinateUniforms(\n viewMatrix: any,\n modelMatrix?: any\n ): {\n viewMatrix: any;\n modelMatrix: any;\n objectMatrix: any;\n worldMatrix: any;\n worldInverseMatrix: any;\n worldInverseTransposeMatrix: any;\n } {\n // TODO - solve multiple class problem\n // assert(viewMatrix instanceof Matrix4);\n assert(viewMatrix);\n modelMatrix = modelMatrix || this.matrix;\n const worldMatrix = new Matrix4(viewMatrix).multiplyRight(modelMatrix);\n const worldInverse = worldMatrix.invert();\n const worldInverseTranspose = worldInverse.transpose();\n\n return {\n viewMatrix,\n modelMatrix,\n objectMatrix: modelMatrix,\n worldMatrix,\n worldInverseMatrix: worldInverse,\n worldInverseTransposeMatrix: worldInverseTranspose\n };\n }\n\n // TODO - copied code, not yet vetted\n /*\n transform() {\n if (!this.parent) {\n this.endPosition.set(this.position);\n this.endRotation.set(this.rotation);\n this.endScale.set(this.scale);\n } else {\n const parent = this.parent;\n this.endPosition.set(this.position.add(parent.endPosition));\n this.endRotation.set(this.rotation.add(parent.endRotation));\n this.endScale.set(this.scale.add(parent.endScale));\n }\n\n const ch = this.children;\n for (let i = 0; i < ch.length; ++i) {\n ch[i].transform();\n }\n\n return this;\n }\n */\n\n _setScenegraphNodeProps(props: ScenegraphNodeProps): void {\n if ('display' in props) {\n this.display = props.display;\n }\n\n if ('position' in props) {\n this.setPosition(props.position);\n }\n if ('rotation' in props) {\n this.setRotation(props.rotation);\n }\n if ('scale' in props) {\n this.setScale(props.scale);\n }\n\n // Matrix overwrites other props\n if ('matrix' in props) {\n this.setMatrix(props.matrix);\n }\n\n Object.assign(this.props, props);\n }\n}\n"],"mappings":"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"}