@luma.gl/engine 8.6.0-alpha.5 → 9.0.0-alpha.10

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 (129) hide show
  1. package/dist/animation/key-frames.d.ts +1 -0
  2. package/dist/animation/key-frames.d.ts.map +1 -1
  3. package/dist/animation/key-frames.js.map +1 -1
  4. package/dist/animation/timeline.d.ts +2 -2
  5. package/dist/animation/timeline.d.ts.map +1 -1
  6. package/dist/animation/timeline.js.map +1 -1
  7. package/dist/geometries/cone-geometry.d.ts.map +1 -1
  8. package/dist/geometries/cone-geometry.js +1 -1
  9. package/dist/geometries/cone-geometry.js.map +1 -1
  10. package/dist/geometries/cube-geometry.d.ts +4 -0
  11. package/dist/geometries/cube-geometry.d.ts.map +1 -1
  12. package/dist/geometries/cube-geometry.js +31 -7
  13. package/dist/geometries/cube-geometry.js.map +1 -1
  14. package/dist/geometries/cylinder-geometry.d.ts.map +1 -1
  15. package/dist/geometries/cylinder-geometry.js +1 -1
  16. package/dist/geometries/cylinder-geometry.js.map +1 -1
  17. package/dist/geometries/ico-sphere-geometry.d.ts.map +1 -1
  18. package/dist/geometries/ico-sphere-geometry.js +1 -1
  19. package/dist/geometries/ico-sphere-geometry.js.map +1 -1
  20. package/dist/geometries/plane-geometry.d.ts.map +1 -1
  21. package/dist/geometries/plane-geometry.js +1 -1
  22. package/dist/geometries/plane-geometry.js.map +1 -1
  23. package/dist/geometries/sphere-geometry.d.ts.map +1 -1
  24. package/dist/geometries/sphere-geometry.js +1 -1
  25. package/dist/geometries/sphere-geometry.js.map +1 -1
  26. package/dist/geometries/truncated-cone-geometry.d.ts +15 -3
  27. package/dist/geometries/truncated-cone-geometry.d.ts.map +1 -1
  28. package/dist/geometries/truncated-cone-geometry.js +29 -15
  29. package/dist/geometries/truncated-cone-geometry.js.map +1 -1
  30. package/dist/geometry/geometry-table.d.ts +15 -0
  31. package/dist/geometry/geometry-table.d.ts.map +1 -0
  32. package/dist/geometry/geometry-table.js +2 -0
  33. package/dist/{transform/transform-types.js.map → geometry/geometry-table.js.map} +1 -1
  34. package/dist/geometry/geometry-utils.js.map +1 -1
  35. package/dist/geometry/geometry.d.ts +32 -14
  36. package/dist/geometry/geometry.d.ts.map +1 -1
  37. package/dist/geometry/geometry.js +57 -34
  38. package/dist/geometry/geometry.js.map +1 -1
  39. package/dist/geometry/primitive-utils.d.ts +1 -0
  40. package/dist/geometry/primitive-utils.d.ts.map +1 -0
  41. package/dist/geometry/primitive-utils.js +2 -0
  42. package/dist/geometry/primitive-utils.js.map +1 -0
  43. package/dist/index.d.ts +6 -7
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +4 -6
  46. package/dist/index.js.map +1 -1
  47. package/dist/lib/animation-loop.d.ts +23 -84
  48. package/dist/lib/animation-loop.d.ts.map +1 -1
  49. package/dist/lib/animation-loop.js +106 -193
  50. package/dist/lib/animation-loop.js.map +1 -1
  51. package/dist/lib/animation-props.d.ts +24 -0
  52. package/dist/lib/animation-props.d.ts.map +1 -0
  53. package/dist/lib/animation-props.js +2 -0
  54. package/dist/lib/animation-props.js.map +1 -0
  55. package/dist/lib/clip-space.d.ts +1 -0
  56. package/dist/lib/clip-space.d.ts.map +1 -0
  57. package/dist/lib/clip-space.js +2 -0
  58. package/dist/lib/clip-space.js.map +1 -0
  59. package/dist/lib/model-utils.d.ts +4 -3
  60. package/dist/lib/model-utils.d.ts.map +1 -1
  61. package/dist/lib/model-utils.js +24 -70
  62. package/dist/lib/model-utils.js.map +1 -1
  63. package/dist/lib/model.d.ts +34 -104
  64. package/dist/lib/model.d.ts.map +1 -1
  65. package/dist/lib/model.js +111 -502
  66. package/dist/lib/model.js.map +1 -1
  67. package/dist/lib/pipeline-factory.d.ts +60 -0
  68. package/dist/lib/pipeline-factory.d.ts.map +1 -0
  69. package/dist/lib/pipeline-factory.js +219 -0
  70. package/dist/lib/pipeline-factory.js.map +1 -0
  71. package/dist/lib/render-loop.d.ts +5 -18
  72. package/dist/lib/render-loop.d.ts.map +1 -1
  73. package/dist/lib/render-loop.js +16 -23
  74. package/dist/lib/render-loop.js.map +1 -1
  75. package/package.json +6 -6
  76. package/src/animation/key-frames.ts +1 -0
  77. package/src/animation/timeline.ts +2 -2
  78. package/src/geometries/cone-geometry.ts +1 -1
  79. package/src/geometries/cube-geometry.ts +160 -8
  80. package/src/geometries/cylinder-geometry.ts +1 -1
  81. package/src/geometries/ico-sphere-geometry.ts +2 -2
  82. package/src/geometries/plane-geometry.ts +1 -1
  83. package/src/geometries/sphere-geometry.ts +2 -2
  84. package/src/geometries/truncated-cone-geometry.ts +30 -12
  85. package/src/geometry/geometry-table.ts +16 -0
  86. package/src/geometry/geometry-utils.ts +1 -1
  87. package/src/geometry/geometry.ts +97 -47
  88. package/src/geometry/primitive-utils.ts +30 -0
  89. package/src/index.ts +13 -12
  90. package/src/lib/animation-loop.ts +136 -314
  91. package/src/lib/animation-props.ts +31 -0
  92. package/src/{utils → lib}/clip-space.ts +5 -2
  93. package/src/lib/model-utils.ts +60 -32
  94. package/src/lib/model.ts +127 -639
  95. package/src/lib/pipeline-factory.ts +234 -0
  96. package/src/lib/render-loop.ts +24 -22
  97. package/dist/lib/program-manager.d.ts +0 -39
  98. package/dist/lib/program-manager.d.ts.map +0 -1
  99. package/dist/lib/program-manager.js +0 -175
  100. package/dist/lib/program-manager.js.map +0 -1
  101. package/dist/transform/buffer-transform.d.ts +0 -36
  102. package/dist/transform/buffer-transform.d.ts.map +0 -1
  103. package/dist/transform/buffer-transform.js +0 -255
  104. package/dist/transform/buffer-transform.js.map +0 -1
  105. package/dist/transform/texture-transform.d.ts +0 -57
  106. package/dist/transform/texture-transform.d.ts.map +0 -1
  107. package/dist/transform/texture-transform.js +0 -412
  108. package/dist/transform/texture-transform.js.map +0 -1
  109. package/dist/transform/transform-shader-utils.d.ts +0 -26
  110. package/dist/transform/transform-shader-utils.d.ts.map +0 -1
  111. package/dist/transform/transform-shader-utils.js +0 -149
  112. package/dist/transform/transform-shader-utils.js.map +0 -1
  113. package/dist/transform/transform-types.d.ts +0 -44
  114. package/dist/transform/transform-types.d.ts.map +0 -1
  115. package/dist/transform/transform-types.js +0 -2
  116. package/dist/transform/transform.d.ts +0 -47
  117. package/dist/transform/transform.d.ts.map +0 -1
  118. package/dist/transform/transform.js +0 -198
  119. package/dist/transform/transform.js.map +0 -1
  120. package/dist/utils/clip-space.d.ts +0 -5
  121. package/dist/utils/clip-space.d.ts.map +0 -1
  122. package/dist/utils/clip-space.js +0 -34
  123. package/dist/utils/clip-space.js.map +0 -1
  124. package/src/lib/program-manager.ts +0 -187
  125. package/src/transform/buffer-transform.ts +0 -214
  126. package/src/transform/texture-transform.ts +0 -344
  127. package/src/transform/transform-shader-utils.ts +0 -169
  128. package/src/transform/transform-types.ts +0 -42
  129. package/src/transform/transform.ts +0 -189
package/dist/lib/model.js CHANGED
@@ -1,573 +1,182 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
- import GL from '@luma.gl/constants';
3
- import { WebGLDevice, Program, VertexArray, clear, TransformFeedback, Buffer, log, isObjectEmpty, uid, assert } from '@luma.gl/webgl';
4
- import { getDebugTableForUniforms, getDebugTableForVertexArray, getDebugTableForProgramConfiguration } from '@luma.gl/webgl';
5
- import ProgramManager from './program-manager';
6
- import { getBuffersFromGeometry } from './model-utils';
7
- const LOG_DRAW_PRIORITY = 2;
8
- const LOG_DRAW_TIMEOUT = 10000;
9
- const ERR_MODEL_PARAMS = 'Model needs drawMode and vertexCount';
10
-
11
- const NOOP = () => {};
12
-
13
- const DRAW_PARAMS = {};
2
+ import { RenderPipeline } from '@luma.gl/api';
3
+ import { getAttributeBuffersFromGeometry, getIndexBufferFromGeometry } from './model-utils';
4
+ import { PipelineFactory } from './pipeline-factory';
5
+ const DEFAULT_MODEL_PROPS = { ...RenderPipeline._DEFAULT_PROPS,
6
+ vs: null,
7
+ fs: null,
8
+ id: 'unnamed',
9
+ handle: undefined,
10
+ userData: {},
11
+ modules: [],
12
+ moduleSettings: {},
13
+ geometry: null
14
+ };
14
15
  export default class Model {
15
- constructor(device, props = {}) {
16
+ constructor(device, props) {
16
17
  _defineProperty(this, "device", void 0);
17
18
 
18
- _defineProperty(this, "gl", void 0);
19
+ _defineProperty(this, "pipeline", void 0);
19
20
 
20
21
  _defineProperty(this, "id", void 0);
21
22
 
22
- _defineProperty(this, "animated", false);
23
+ _defineProperty(this, "vs", void 0);
23
24
 
24
- _defineProperty(this, "programManager", void 0);
25
+ _defineProperty(this, "fs", null);
25
26
 
26
- _defineProperty(this, "vertexCount", void 0);
27
+ _defineProperty(this, "topology", void 0);
27
28
 
28
- _defineProperty(this, "lastLogTime", 0);
29
+ _defineProperty(this, "vertexCount", void 0);
29
30
 
30
31
  _defineProperty(this, "props", void 0);
31
32
 
32
- _defineProperty(this, "userData", {});
33
-
34
- _defineProperty(this, "needsRedraw", true);
35
-
36
- _defineProperty(this, "attributes", {});
37
-
38
- _defineProperty(this, "_attributes", {});
39
-
40
- _defineProperty(this, "uniforms", {});
41
-
42
- _defineProperty(this, "drawMode", void 0);
43
-
44
- _defineProperty(this, "instanceCount", void 0);
45
-
46
- _defineProperty(this, "pickable", true);
47
-
48
- _defineProperty(this, "programProps", void 0);
49
-
50
- _defineProperty(this, "vertexArray", void 0);
51
-
52
- _defineProperty(this, "program", void 0);
53
-
54
- _defineProperty(this, "transformFeedback", void 0);
55
-
56
- _defineProperty(this, "_programDirty", true);
57
-
58
- _defineProperty(this, "_programManagerState", void 0);
59
-
60
- _defineProperty(this, "_managedProgram", void 0);
61
-
62
- _defineProperty(this, "geometryBuffers", {});
63
-
64
- _defineProperty(this, "isInstanced", void 0);
65
-
66
- _defineProperty(this, "geometry", {});
33
+ _defineProperty(this, "_getModuleUniforms", void 0);
67
34
 
68
- const {
69
- id = uid('model')
70
- } = props;
71
- this.id = id;
72
- const webglDevice = WebGLDevice.attach(device);
73
- this.device = webglDevice;
74
- this.gl = webglDevice.gl;
75
- this.id = props.id || uid('Model');
76
- this.initialize(props);
77
- }
78
-
79
- initialize(props) {
80
- this.props = {};
81
- this.programManager = props.programManager || ProgramManager.getDefaultProgramManager(this.device);
82
- this._programManagerState = -1;
83
- this._managedProgram = false;
84
- const {
85
- program = null,
86
- vs,
87
- fs,
88
- modules,
89
- defines,
90
- inject,
91
- varyings,
92
- bufferMode,
93
- transpileToGLSL100
94
- } = props;
95
- this.programProps = {
96
- program,
97
- modules,
98
- vs,
99
- fs,
100
- defines,
101
- inject,
102
- varyings,
103
- bufferMode,
104
- transpileToGLSL100
35
+ this.props = { ...DEFAULT_MODEL_PROPS,
36
+ ...props
105
37
  };
106
- this.program = null;
107
- this.vertexArray = null;
108
- this._programDirty = true;
109
- this.userData = {};
110
- this.needsRedraw = true;
111
- this._attributes = {};
112
- this.attributes = {};
113
- this.uniforms = {};
114
- this.pickable = true;
115
-
116
- this._checkProgram();
117
-
118
- this.setUniforms(Object.assign({}, this.getModuleUniforms(props.moduleSettings)));
119
- this.drawMode = props.drawMode !== undefined ? props.drawMode : GL.TRIANGLES;
120
- this.vertexCount = props.vertexCount || 0;
121
- this.geometryBuffers = {};
122
- this.isInstanced = props.isInstanced || props.instanced || props.instanceCount > 0;
123
-
124
- this._setModelProps(props);
125
-
126
- this.geometry = {};
127
- assert(this.drawMode !== undefined && Number.isFinite(this.vertexCount), ERR_MODEL_PARAMS);
128
- }
129
-
130
- setProps(props) {
131
- this._setModelProps(props);
132
- }
133
-
134
- destroy() {
135
- for (const key in this._attributes) {
136
- if (this._attributes[key] !== this.attributes[key]) {
137
- this._attributes[key].delete();
138
- }
139
- }
38
+ props = this.props;
39
+ this.id = this.props.id;
40
+ this.device = device;
140
41
 
141
- if (this._managedProgram) {
142
- this.programManager.release(this.program);
143
- this._managedProgram = false;
42
+ if (!props.vs) {
43
+ throw new Error('no vertex shader');
144
44
  }
145
45
 
146
- this.vertexArray.delete();
147
-
148
- this._deleteGeometryBuffers();
149
- }
150
-
151
- delete() {
152
- this.destroy();
153
- }
154
-
155
- getDrawMode() {
156
- return this.drawMode;
157
- }
158
-
159
- getVertexCount() {
160
- return this.vertexCount;
161
- }
162
-
163
- getInstanceCount() {
164
- return this.instanceCount;
165
- }
166
-
167
- getAttributes() {
168
- return this.attributes;
169
- }
170
-
171
- getProgram() {
172
- return this.program;
173
- }
46
+ this.vs = getShaderSource(this.device, props.vs);
174
47
 
175
- setProgram(props) {
176
- const {
177
- program,
178
- vs,
179
- fs,
180
- modules,
181
- defines,
182
- inject,
183
- varyings,
184
- bufferMode,
185
- transpileToGLSL100
186
- } = props;
187
- this.programProps = {
188
- program,
189
- vs,
190
- fs,
191
- modules,
192
- defines,
193
- inject,
194
- varyings,
195
- bufferMode,
196
- transpileToGLSL100
197
- };
198
- this._programDirty = true;
199
- }
200
-
201
- getUniforms() {
202
- return this.uniforms;
203
- }
204
-
205
- setDrawMode(drawMode) {
206
- this.drawMode = drawMode;
207
- return this;
208
- }
209
-
210
- setVertexCount(vertexCount) {
211
- assert(Number.isFinite(vertexCount));
212
- this.vertexCount = vertexCount;
213
- return this;
214
- }
215
-
216
- setInstanceCount(instanceCount) {
217
- assert(Number.isFinite(instanceCount));
218
- this.instanceCount = instanceCount;
219
- return this;
220
- }
221
-
222
- setGeometry(geometry) {
223
- this.drawMode = geometry.drawMode;
224
- this.vertexCount = geometry.getVertexCount();
225
-
226
- this._deleteGeometryBuffers();
227
-
228
- this.geometryBuffers = getBuffersFromGeometry(this.gl, geometry);
229
- this.vertexArray.setAttributes(this.geometryBuffers);
230
- return this;
231
- }
232
-
233
- setAttributes(attributes = {}) {
234
- if (isObjectEmpty(attributes)) {
235
- return this;
48
+ if (props.fs) {
49
+ this.fs = getShaderSource(this.device, props.fs);
236
50
  }
237
51
 
238
- const normalizedAttributes = {};
52
+ this.vertexCount = this.props.vertexCount;
53
+ this.topology = this.props.topology;
239
54
 
240
- for (const name in attributes) {
241
- const attribute = attributes[name];
242
- normalizedAttributes[name] = attribute.getValue ? attribute.getValue() : attribute;
55
+ if (this.props.geometry) {
56
+ this.vertexCount = this.props.geometry.vertexCount;
57
+ this.topology = this.props.geometry.topology || 'triangle-list';
243
58
  }
244
59
 
245
- this.vertexArray.setAttributes(normalizedAttributes);
246
- return this;
247
- }
248
-
249
- setUniforms(uniforms = {}) {
250
- Object.assign(this.uniforms, uniforms);
251
- return this;
252
- }
253
-
254
- getModuleUniforms(opts) {
255
- this._checkProgram();
256
-
257
- const getUniforms = this.programManager.getUniforms(this.program);
60
+ const pipelineFactory = PipelineFactory.getDefaultPipelineFactory(this.device);
61
+ const {
62
+ pipeline,
63
+ getUniforms
64
+ } = pipelineFactory.createRenderPipeline({ ...this.props,
65
+ vs: this.vs,
66
+ fs: this.fs,
67
+ topology: this.topology,
68
+ parameters: props.parameters,
69
+ layout: props.layout
70
+ });
71
+ this.pipeline = pipeline;
72
+ this._getModuleUniforms = getUniforms;
258
73
 
259
- if (getUniforms) {
260
- return getUniforms(opts);
74
+ if (this.props.geometry) {
75
+ this._setGeometry(this.props.geometry);
261
76
  }
262
77
 
263
- return {};
78
+ this.setUniforms(this._getModuleUniforms());
79
+ this.setProps(this.props);
264
80
  }
265
81
 
266
- updateModuleSettings(opts) {
267
- const uniforms = this.getModuleUniforms(opts || {});
268
- return this.setUniforms(uniforms);
82
+ destroy() {
83
+ this.pipeline.destroy();
269
84
  }
270
85
 
271
- clear(opts) {
272
- clear(this.program.gl, opts);
86
+ draw(renderPass) {
87
+ this.pipeline.draw({
88
+ renderPass,
89
+ vertexCount: this.vertexCount,
90
+ instanceCount: this.props.instanceCount
91
+ });
273
92
  return this;
274
93
  }
275
94
 
276
- draw(opts = {}) {
277
- this._checkProgram();
278
-
279
- const {
280
- moduleSettings = null,
281
- framebuffer,
282
- uniforms = {},
283
- attributes = {},
284
- transformFeedback = this.transformFeedback,
285
- parameters = {},
286
- vertexArray = this.vertexArray
287
- } = opts;
288
- this.setAttributes(attributes);
289
- this.updateModuleSettings(moduleSettings);
290
- this.setUniforms(uniforms);
291
- let logPriority;
292
-
293
- if (log.priority >= LOG_DRAW_PRIORITY) {
294
- logPriority = this._logDrawCallStart(LOG_DRAW_PRIORITY);
295
- }
296
-
297
- const drawParams = this.vertexArray.getDrawParams();
298
- const {
299
- isIndexed = drawParams.isIndexed,
300
- indexType = drawParams.indexType,
301
- indexOffset = drawParams.indexOffset,
302
- vertexArrayInstanced = drawParams.isInstanced
303
- } = this.props;
304
-
305
- if (vertexArrayInstanced && !this.isInstanced) {
306
- log.warn('Found instanced attributes on non-instanced model', this.id)();
95
+ setProps(props) {
96
+ if (props.indices) {
97
+ this.setIndexBuffer(props.indices);
307
98
  }
308
99
 
309
- const {
310
- isInstanced,
311
- instanceCount
312
- } = this;
313
- const {
314
- onBeforeRender = NOOP,
315
- onAfterRender = NOOP
316
- } = this.props;
317
- onBeforeRender();
318
- this.program.setUniforms(this.uniforms);
319
- const didDraw = this.program.draw(Object.assign(DRAW_PARAMS, opts, {
320
- logPriority,
321
- uniforms: null,
322
- framebuffer,
323
- parameters,
324
- drawMode: this.getDrawMode(),
325
- vertexCount: this.getVertexCount(),
326
- vertexArray,
327
- transformFeedback,
328
- isIndexed,
329
- indexType,
330
- isInstanced,
331
- instanceCount,
332
- offset: isIndexed ? indexOffset : 0
333
- }));
334
- onAfterRender();
335
-
336
- if (log.priority >= LOG_DRAW_PRIORITY) {
337
- this._logDrawCallEnd(logPriority, vertexArray, framebuffer);
100
+ if (props.attributes) {
101
+ this.setAttributes(props.attributes);
338
102
  }
339
103
 
340
- return didDraw;
341
- }
342
-
343
- transform(opts = {}) {
344
- const {
345
- discard = true,
346
- feedbackBuffers,
347
- unbindModels = []
348
- } = opts;
349
- let {
350
- parameters
351
- } = opts;
352
-
353
- if (feedbackBuffers) {
354
- this._setFeedbackBuffers(feedbackBuffers);
104
+ if (props.bindings) {
105
+ this.setBindings(props.bindings);
355
106
  }
356
107
 
357
- if (discard) {
358
- parameters = Object.assign({}, parameters, {
359
- [GL.RASTERIZER_DISCARD]: discard
360
- });
108
+ if (props.uniforms) {
109
+ this.setUniforms(props.uniforms);
361
110
  }
362
111
 
363
- unbindModels.forEach(model => model.vertexArray.unbindBuffers());
364
-
365
- try {
366
- this.draw(Object.assign({}, opts, {
367
- parameters
368
- }));
369
- } finally {
370
- unbindModels.forEach(model => model.vertexArray.bindBuffers());
112
+ if (props.moduleSettings) {
113
+ this.updateModuleSettings(props.moduleSettings);
371
114
  }
372
115
 
373
116
  return this;
374
117
  }
375
118
 
376
- render(uniforms = {}) {
377
- log.warn('Model.render() is deprecated. Use Model.setUniforms() and Model.draw()')();
378
- return this.setUniforms(uniforms).draw();
379
- }
119
+ updateModuleSettings(props) {
120
+ const uniforms = this._getModuleUniforms(props);
380
121
 
381
- _setModelProps(props) {
382
- Object.assign(this.props, props);
383
-
384
- if ('uniforms' in props) {
385
- this.setUniforms(props.uniforms);
386
- }
387
-
388
- if ('pickable' in props) {
389
- this.pickable = props.pickable;
390
- }
391
-
392
- if ('instanceCount' in props) {
393
- this.instanceCount = props.instanceCount;
394
- }
395
-
396
- if ('geometry' in props) {
397
- this.setGeometry(props.geometry);
398
- }
399
-
400
- if ('attributes' in props) {
401
- this.setAttributes(props.attributes);
402
- }
403
-
404
- if ('_feedbackBuffers' in props) {
405
- this._setFeedbackBuffers(props._feedbackBuffers);
406
- }
122
+ this.setUniforms(uniforms);
123
+ return this;
407
124
  }
408
125
 
409
- _checkProgram() {
410
- const needsUpdate = this._programDirty || this.programManager.stateHash !== this._programManagerState;
411
-
412
- if (!needsUpdate) {
413
- return;
414
- }
415
-
416
- let {
417
- program
418
- } = this.programProps;
419
-
420
- if (program) {
421
- this._managedProgram = false;
422
- } else {
423
- const {
424
- vs,
425
- fs,
426
- modules,
427
- inject,
428
- defines,
429
- varyings,
430
- bufferMode,
431
- transpileToGLSL100
432
- } = this.programProps;
433
- program = this.programManager.get({
434
- vs,
435
- fs,
436
- modules,
437
- inject,
438
- defines,
439
- varyings,
440
- bufferMode,
441
- transpileToGLSL100
442
- });
443
-
444
- if (this.program && this._managedProgram) {
445
- this.programManager.release(this.program);
446
- }
447
-
448
- this._programManagerState = this.programManager.stateHash;
449
- this._managedProgram = true;
450
- }
451
-
452
- assert(program instanceof Program, 'Model needs a program');
453
- this._programDirty = false;
454
-
455
- if (program === this.program) {
456
- return;
457
- }
458
-
459
- this.program = program;
460
-
461
- if (this.vertexArray) {
462
- this.vertexArray.setProps({
463
- program: this.program,
464
- attributes: this.vertexArray.attributes
465
- });
466
- } else {
467
- this.vertexArray = new VertexArray(this.gl, {
468
- program: this.program
469
- });
470
- }
471
-
472
- this.setUniforms(Object.assign({}, this.getModuleUniforms()));
126
+ setIndexBuffer(indices) {
127
+ this.pipeline.setIndexBuffer(indices);
128
+ return this;
473
129
  }
474
130
 
475
- _deleteGeometryBuffers() {
476
- for (const name in this.geometryBuffers) {
477
- const buffer = this.geometryBuffers[name][0] || this.geometryBuffers[name];
478
-
479
- if (buffer instanceof Buffer) {
480
- buffer.destroy();
481
- }
482
- }
131
+ setAttributes(attributes) {
132
+ this.pipeline.setAttributes(attributes);
133
+ Object.assign(this.props.attributes, attributes);
134
+ return this;
483
135
  }
484
136
 
485
- _setAnimationProps(animationProps) {
486
- if (this.animated) {
487
- assert(animationProps, 'Model.draw(): animated uniforms but no animationProps');
488
- }
137
+ setBindings(bindings) {
138
+ this.pipeline.setBindings(bindings);
139
+ Object.assign(this.props.bindings, bindings);
140
+ return this;
489
141
  }
490
142
 
491
- _setFeedbackBuffers(feedbackBuffers = {}) {
492
- if (isObjectEmpty(feedbackBuffers)) {
493
- return this;
494
- }
495
-
496
- const {
497
- gl
498
- } = this.program;
499
- this.transformFeedback = this.transformFeedback || new TransformFeedback(gl, {
500
- program: this.program
501
- });
502
- this.transformFeedback.setBuffers(feedbackBuffers);
143
+ setUniforms(uniforms) {
144
+ this.pipeline.setUniforms(uniforms);
145
+ Object.assign(this.props.uniforms, uniforms);
503
146
  return this;
504
147
  }
505
148
 
506
- _logDrawCallStart(logLevel) {
507
- const logDrawTimeout = logLevel > 3 ? 0 : LOG_DRAW_TIMEOUT;
149
+ _setGeometry(geometry) {
150
+ const geometryBuffers = getAttributeBuffersFromGeometry(this.device, geometry);
151
+ this.setAttributes(geometryBuffers);
152
+ const indexBuffer = getIndexBufferFromGeometry(this.device, geometry);
508
153
 
509
- if (Date.now() - this.lastLogTime < logDrawTimeout) {
510
- return undefined;
154
+ if (indexBuffer) {
155
+ this.setIndexBuffer(indexBuffer);
511
156
  }
512
-
513
- this.lastLogTime = Date.now();
514
- log.group(LOG_DRAW_PRIORITY, ">>> DRAWING MODEL ".concat(this.id), {
515
- collapsed: log.level <= 2
516
- })();
517
- return logLevel;
518
157
  }
519
158
 
520
- _logDrawCallEnd(logLevel, vertexArray, uniforms, framebuffer) {
521
- if (logLevel === undefined) {
522
- return;
523
- }
524
-
525
- const attributeTable = getDebugTableForVertexArray({
526
- vertexArray,
527
- header: "".concat(this.id, " attributes"),
528
- attributes: this._attributes
529
- });
530
- const {
531
- table: uniformTable,
532
- unusedTable,
533
- unusedCount
534
- } = getDebugTableForUniforms({
535
- header: "".concat(this.id, " uniforms"),
536
- program: this.program,
537
- uniforms: Object.assign({}, this.program.uniforms, uniforms)
538
- });
539
- const {
540
- table: missingTable,
541
- count: missingCount
542
- } = getDebugTableForUniforms({
543
- header: "".concat(this.id, " uniforms"),
544
- program: this.program,
545
- uniforms: Object.assign({}, this.program.uniforms, uniforms),
546
- undefinedOnly: true
547
- });
159
+ }
548
160
 
549
- if (missingCount > 0) {
550
- log.log('MISSING UNIFORMS', Object.keys(missingTable))();
551
- }
161
+ function getShaderSource(device, shader) {
162
+ if (typeof shader === 'string') {
163
+ return shader;
164
+ }
552
165
 
553
- if (unusedCount > 0) {
554
- log.log('UNUSED UNIFORMS', Object.keys(unusedTable))();
555
- }
166
+ switch (device.info.type) {
167
+ case 'webgpu':
168
+ if (shader !== null && shader !== void 0 && shader.wgsl) {
169
+ return shader.wgsl;
170
+ }
556
171
 
557
- const configTable = getDebugTableForProgramConfiguration(this.vertexArray.configuration);
558
- log.table(logLevel, attributeTable)();
559
- log.table(logLevel, uniformTable)();
560
- log.table(logLevel + 1, configTable)();
172
+ throw new Error('WebGPU does not support GLSL shaders');
561
173
 
562
- if (framebuffer) {
563
- framebuffer.log({
564
- logLevel: LOG_DRAW_PRIORITY,
565
- message: "Rendered to ".concat(framebuffer.id)
566
- });
567
- }
174
+ default:
175
+ if (shader !== null && shader !== void 0 && shader.glsl) {
176
+ return shader.glsl;
177
+ }
568
178
 
569
- log.groupEnd(LOG_DRAW_PRIORITY)();
179
+ throw new Error('WebGL does not support WGSL shaders');
570
180
  }
571
-
572
181
  }
573
182
  //# sourceMappingURL=model.js.map