@woosh/meep-engine 2.118.1 → 2.118.3

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 (27) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/build/meep.cjs +30 -5
  3. package/build/meep.min.js +1 -1
  4. package/build/meep.module.js +30 -5
  5. package/package.json +1 -1
  6. package/src/core/collection/table/RowFirstTable.d.ts.map +1 -1
  7. package/src/core/collection/table/RowFirstTable.js +2 -0
  8. package/src/core/geom/3d/topology/struct/TopoMesh.d.ts +22 -2
  9. package/src/core/geom/3d/topology/struct/TopoMesh.d.ts.map +1 -1
  10. package/src/core/geom/3d/topology/struct/TopoMesh.js +92 -29
  11. package/src/engine/animation/async/TimeSeries.d.ts +5 -1
  12. package/src/engine/animation/async/TimeSeries.d.ts.map +1 -1
  13. package/src/engine/animation/async/TimeSeries.js +14 -2
  14. package/src/engine/asset/loaders/material/computeTextureHash.d.ts.map +1 -1
  15. package/src/engine/asset/loaders/material/computeTextureHash.js +5 -0
  16. package/src/engine/graphics/canvas/computeHtmlCanvasElementHash.d.ts +7 -0
  17. package/src/engine/graphics/canvas/computeHtmlCanvasElementHash.d.ts.map +1 -0
  18. package/src/engine/graphics/canvas/computeHtmlCanvasElementHash.js +12 -0
  19. package/src/engine/graphics/canvas/computeImageCanvasEquality.js +3 -1
  20. package/src/engine/graphics/geometry/optimization/geometry_optimize_uv_tension.d.ts +2 -2
  21. package/src/engine/graphics/geometry/optimization/geometry_optimize_uv_tension.d.ts.map +1 -1
  22. package/src/engine/graphics/geometry/optimization/geometry_optimize_uv_tension.js +1 -1
  23. package/src/engine/graphics/texture/html_canvas_to_rendering_context2d_cached.d.ts +7 -0
  24. package/src/engine/graphics/texture/html_canvas_to_rendering_context2d_cached.d.ts.map +1 -0
  25. package/src/engine/graphics/texture/html_canvas_to_rendering_context2d_cached.js +20 -0
  26. package/src/engine/graphics/texture/html_canvas_to_sampler2d.d.ts.map +1 -1
  27. package/src/engine/graphics/texture/html_canvas_to_sampler2d.js +2 -11
@@ -51201,18 +51201,28 @@ const context_cache = new WeakMap();
51201
51201
  /**
51202
51202
  *
51203
51203
  * @param {HTMLCanvasElement} canvas
51204
- * @returns {Sampler2D}
51204
+ * @returns {CanvasRenderingContext2D}
51205
51205
  */
51206
- function html_canvas_to_sampler2d(canvas) {
51207
- const width = canvas.width;
51208
- const height = canvas.height;
51209
-
51206
+ function html_canvas_to_rendering_context2d_cached(canvas) {
51210
51207
  let context = context_cache.get(canvas);
51211
51208
 
51212
51209
  if (context === undefined) {
51213
51210
  context = canvas.getContext("2d");
51214
51211
  context_cache.set(canvas, context);
51215
51212
  }
51213
+ return context;
51214
+ }
51215
+
51216
+ /**
51217
+ *
51218
+ * @param {HTMLCanvasElement} canvas
51219
+ * @returns {Sampler2D}
51220
+ */
51221
+ function html_canvas_to_sampler2d(canvas) {
51222
+ const width = canvas.width;
51223
+ const height = canvas.height;
51224
+
51225
+ const context = html_canvas_to_rendering_context2d_cached(canvas);
51216
51226
 
51217
51227
  const imageData = context.getImageData(0, 0, width, height);
51218
51228
 
@@ -76449,6 +76459,17 @@ function murmur3_32(key, seed) {
76449
76459
  return h1 >>> 0;
76450
76460
  }
76451
76461
 
76462
+ /**
76463
+ *
76464
+ * @param {HTMLCanvasElement} canvas
76465
+ * @returns {number}
76466
+ */
76467
+ function computeHtmlCanvasElementHash(canvas) {
76468
+ const sampler = html_canvas_to_sampler2d(canvas);
76469
+
76470
+ return sampler.hash();
76471
+ }
76472
+
76452
76473
  /**
76453
76474
  * Guards against cases where ImageBitmap doesn't exist
76454
76475
  * @param {*} image
@@ -76693,6 +76714,10 @@ function computeImageDataHash(image) {
76693
76714
 
76694
76715
  result = computeStringHash(image.src);
76695
76716
 
76717
+ }else if(image instanceof HTMLCanvasElement) {
76718
+
76719
+ result = computeHtmlCanvasElementHash(image);
76720
+
76696
76721
  }
76697
76722
 
76698
76723
  let width = 0;
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "description": "Fully featured ECS game engine written in JavaScript",
6
6
  "type": "module",
7
7
  "author": "Alexander Goldring",
8
- "version": "2.118.1",
8
+ "version": "2.118.3",
9
9
  "main": "build/meep.module.js",
10
10
  "module": "build/meep.module.js",
11
11
  "exports": {
@@ -1 +1 @@
1
- {"version":3,"file":"RowFirstTable.d.ts","sourceRoot":"","sources":["../../../../../src/core/collection/table/RowFirstTable.js"],"names":[],"mappings":"AA+BA;;;;GAIG;AACH;IACI;;;;;OAKG;IACH,oDAHW,OAAO,EAiDjB;IAzCG;;;OAGG;IACH,wBAAgB;IAEhB;;;OAGG;IACH,MAFU,WAAW,CAE4D;IAEjF;;;OAGG;IACH,QAFU,MAAM,CAED;IAEf;;;OAGG;IACH,UAFU,MAAM,CAEgB;IAEhC;;;OAGG;IACH,UAFU,QAAQ,CAEqB;IAEvC;;;OAGG;IACH,IAFU;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAOxB;IAIL;;;OAGG;IACH,8BAEC;IAED;;;OAGG;IACH,6BAEC;IAED;;;OAGG;IACH,4BAFqB,QAAQ,QAAE,MAAM,QAAE,MAAM,EAAE,KAAG,IAAI,CAIrD;IAED;;;OAGG;IACH,6BAFqB,QAAQ,QAAE,MAAM,QAAE,MAAM,EAAE,KAAG,IAAI,CAIrD;IAGD;;;;OAIG;IACH,uDAMC;IAED;;;OAGG;IACH,QAFa,MAAM,CA+BlB;IAED;;;OAGG;IACH,sBAFW,MAAM,QAgDhB;IAED;;OAEG;IACH,aAEC;IAED;;;OAGG;IACH,kBAFW,MAAM,QAsBhB;IAED;;;;;OAKG;IACH,0BAJW,MAAM,gBACN,MAAM,SACN,MAAM,QAmBhB;IAED;;;;;OAKG;IACH,yBAJW,MAAM,gBACN,MAAM,GACJ,MAAM,CAmBlB;IAED;;;;OAIG;IACH,kBAHW,MAAM,aACN,MAAM,QAyBhB;IAED;;;;;;OAMG;IACH,kBAHW,MAAM,aACN,MAAM,QAwBhB;IAED;;;;;OAKG;IACH,kBAFY,MAAM,CAYjB;IAED;;;;OAIG;IACH,eAHW,MAAO,MAAM,CAAC,GACZ,MAAM,CAUlB;IAED;;;;OAIG;IACH,eAHW,MAAM,4BA8ChB;IAED;;;;OAIG;IACH,gBAHW,MAAM,UACN,MAAM,QAwBhB;IAED;;;;OAIG;IACH,YAFW,aAAa,QAmBvB;IAED;;;OAGG;IACH,cAHW,aAAa,GACX,OAAO,CAmCnB;IAED;;;;;OAKG;IACH,eAJW,MAAM,WACN,MAAM,EAAE,GACN,MAAM,EAAE,CAUpB;IAED;;;;OAIG;IACH,gBAHW,MAAM,UACN,MAAM,EAAE,QAUlB;IAED;;OAEG;IACH,qBA4BC;IAED;;OAEG;IACH,cAIC;IAED;;;OAGG;IACH,iBAFa,MAAM,CAIlB;IAED;;;OAGG;IACH,cAFa,MAAM,EAAE,EAAE,CAetB;IAED;;OAEG;IACH,uBAIC;IAED;;OAEG;IACH,mBAEC;IAGL;;OAEG;IACH,gBAtHe,MAAM,WACN,MAAM,EAAE,KACN,MAAM,EAAE,CAoHK;IAC9B;;OAEG;IACH,gBA1Ge,MAAM,UACN,MAAM,EAAE,UAyGO;CAT7B;mBAhpBkB,+BAA+B"}
1
+ {"version":3,"file":"RowFirstTable.d.ts","sourceRoot":"","sources":["../../../../../src/core/collection/table/RowFirstTable.js"],"names":[],"mappings":"AA+BA;;;;GAIG;AACH;IACI;;;;;OAKG;IACH,oDAHW,OAAO,EAiDjB;IAzCG;;;OAGG;IACH,wBAAgB;IAEhB;;;OAGG;IACH,MAFU,WAAW,CAE4D;IAEjF;;;OAGG;IACH,QAFU,MAAM,CAED;IAEf;;;OAGG;IACH,UAFU,MAAM,CAEgB;IAEhC;;;OAGG;IACH,UAFU,QAAQ,CAEqB;IAEvC;;;OAGG;IACH,IAFU;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAOxB;IAIL;;;OAGG;IACH,8BAEC;IAED;;;OAGG;IACH,6BAEC;IAED;;;OAGG;IACH,4BAFqB,QAAQ,QAAE,MAAM,QAAE,MAAM,EAAE,KAAG,IAAI,CAIrD;IAED;;;OAGG;IACH,6BAFqB,QAAQ,QAAE,MAAM,QAAE,MAAM,EAAE,KAAG,IAAI,CAIrD;IAGD;;;;OAIG;IACH,uDAMC;IAED;;;OAGG;IACH,QAFa,MAAM,CA+BlB;IAED;;;OAGG;IACH,sBAFW,MAAM,QAgDhB;IAED;;OAEG;IACH,aAEC;IAED;;;OAGG;IACH,kBAFW,MAAM,QAsBhB;IAED;;;;;OAKG;IACH,0BAJW,MAAM,gBACN,MAAM,SACN,MAAM,QAmBhB;IAED;;;;;OAKG;IACH,yBAJW,MAAM,gBACN,MAAM,GACJ,MAAM,CAmBlB;IAED;;;;OAIG;IACH,kBAHW,MAAM,aACN,MAAM,QAyBhB;IAED;;;;;;OAMG;IACH,kBAHW,MAAM,aACN,MAAM,QAwBhB;IAED;;;;;OAKG;IACH,kBAFY,MAAM,CAYjB;IAED;;;;OAIG;IACH,eAHW,MAAO,MAAM,CAAC,GACZ,MAAM,CAYlB;IAED;;;;OAIG;IACH,eAHW,MAAM,4BA8ChB;IAED;;;;OAIG;IACH,gBAHW,MAAM,UACN,MAAM,QAwBhB;IAED;;;;OAIG;IACH,YAFW,aAAa,QAmBvB;IAED;;;OAGG;IACH,cAHW,aAAa,GACX,OAAO,CAmCnB;IAED;;;;;OAKG;IACH,eAJW,MAAM,WACN,MAAM,EAAE,GACN,MAAM,EAAE,CAUpB;IAED;;;;OAIG;IACH,gBAHW,MAAM,UACN,MAAM,EAAE,QAUlB;IAED;;OAEG;IACH,qBA4BC;IAED;;OAEG;IACH,cAIC;IAED;;;OAGG;IACH,iBAFa,MAAM,CAIlB;IAED;;;OAGG;IACH,cAFa,MAAM,EAAE,EAAE,CAetB;IAED;;OAEG;IACH,uBAIC;IAED;;OAEG;IACH,mBAEC;IAGL;;OAEG;IACH,gBAtHe,MAAM,WACN,MAAM,EAAE,KACN,MAAM,EAAE,CAoHK;IAC9B;;OAEG;IACH,gBA1Ge,MAAM,UACN,MAAM,EAAE,UAyGO;CAT7B;mBAlpBkB,+BAA+B"}
@@ -390,6 +390,8 @@ export class RowFirstTable {
390
390
  * @returns {number} index of newly added row
391
391
  */
392
392
  addRow(values) {
393
+ assert.isArrayLike(values, 'values');
394
+
393
395
  const rowIndex = this.createEmptyRow();
394
396
 
395
397
  this.spec.writeRowMethod(this.dataView, this.spec.bytesPerRecord * rowIndex, values);
@@ -154,9 +154,29 @@ export class TopoMesh {
154
154
  /**
155
155
  *
156
156
  * @param {Float32Array} vertices
157
- * @param {Uint32Array|Uint16Array|Uint8Array|number[]} faces
158
157
  */
159
- build(vertices: Float32Array, faces: Uint32Array | Uint16Array | Uint8Array | number[]): void;
158
+ setVerticesFromArray(vertices: Float32Array): void;
159
+ /**
160
+ *
161
+ * @param {Uint16Array|Uint32Array|number[]} faces
162
+ */
163
+ setFacesFromIndexArray(faces: Uint16Array | Uint32Array | number[]): void;
164
+ setFacedUnindexed(): void;
165
+ /**
166
+ *
167
+ * @param {Float64Array|Float32Array|number[]} vertices
168
+ * @param {Uint32Array|Uint16Array|Uint8Array|number[]} [faces]
169
+ */
170
+ build(vertices: Float64Array | Float32Array | number[], faces?: Uint32Array | Uint16Array | Uint8Array | number[]): void;
171
+ /**
172
+ *
173
+ * @param {number} index
174
+ * @param {TopoVertex} v0
175
+ * @param {TopoVertex} v1
176
+ * @param {TopoVertex} v2
177
+ * @returns {TopoTriangle}
178
+ */
179
+ createTriangle(index: number, v0: TopoVertex, v1: TopoVertex, v2: TopoVertex): TopoTriangle;
160
180
  toString(): string;
161
181
  /**
162
182
  * @readonly
@@ -1 +1 @@
1
- {"version":3,"file":"TopoMesh.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/geom/3d/topology/struct/TopoMesh.js"],"names":[],"mappings":"AAcA;IAEI;;;OAGG;IACH,UAFU,UAAU,EAAE,CAER;IAEd;;;;OAIG;IACH,gBAAoB;IAGpB;;;;OAIG;IACH,gBAAoB;IAEpB;;;;OAIG;IACH,uBAkBC;IAED;;;OAGG;IACH,YAFa,IAAI,QAAQ,CAAC,CAIzB;IAED;;;OAGG;IACH,YAFa,IAAI,YAAY,CAAC,CAI7B;IAED;;;;OAIG;IACH,sBAHW,MAAM,GACL,SAAS,GAAC,YAAY,CAYjC;IAED;;;;OAIG;IACH,wCAFa,OAAO,CA0GnB;IAED,kBAMC;IAED;;;OAGG;IACH,sBAFa,IAAI,MAAM,EAAE,UAAU,CAAC,CAoBnC;IAED;;;;OAIG;IACH,yBAHW,QAAQ,cACR,IAAI,MAAM,EAAE,UAAU,CAAC,QAYjC;IAED;;;;OAIG;IACH,kBAHW,YAAY,cACZ,IAAI,MAAM,EAAC,UAAU,CAAC,QAqChC;IAED;;;;OAIG;IACH,qBAFW,YAAY,QAsBtB;IAED;;;OAGG;IACH,WAFW,QAAQ,QAclB;IAED;;;OAGG;IACH,aAFW,UAAU,QAKpB;IAED;;;OAGG;IACH,mBAFW,UAAU,QAMpB;IAED;;;OAGG;IACH,gBAFW,UAAU,QAIpB;IAED;;;;OAIG;IACH,kBAHW,UAAU,GACR,OAAO,CAKnB;IAGD;;;OAGG;IACH,WAFW,QAAQ,QAKlB;IAED;;;OAGG;IACH,iBAFW,QAAQ,QAMlB;IAED;;;OAGG;IACH,cAFW,QAAQ,QAIlB;IAED;;;;OAIG;IACH,gBAHW,QAAQ,GACN,OAAO,CAKnB;IAED;;;OAGG;IACH,WAFW,YAAY,QAUtB;IAED;;;OAGG;IACH,uBAFW,SAAS,YAAY,CAAC,QAMhC;IAED;;;OAGG;IACH,cAFW,YAAY,QAwBtB;IAED;;;OAGG;IACH,cAFW,YAAY,QAItB;IAED;;;;OAIG;IACH,gBAHW,YAAY,GACV,OAAO,CAKnB;IAED;;;;;;OAMG;IACH,cALW,UAAU,KACV,UAAU,GAER,QAAQ,CAoCpB;IAED,mBAsCC;IAED,kCAQC;IAED;;;;OAIG;IACH,gBAHW,YAAY,SACZ,WAAW,GAAC,WAAW,GAAC,UAAU,GAAC,MAAM,EAAE,QAmErD;IAED,mBAEC;IAIL;;;OAGG;IACH,qBAFU,OAAO,CAEY;CAP5B;2BAnoB0B,iBAAiB;yBAFnB,eAAe;6BACX,mBAAmB;qBAR3B,8BAA8B"}
1
+ {"version":3,"file":"TopoMesh.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/geom/3d/topology/struct/TopoMesh.js"],"names":[],"mappings":"AAcA;IAEI;;;OAGG;IACH,UAFU,UAAU,EAAE,CAER;IAEd;;;;OAIG;IACH,gBAAoB;IAGpB;;;;OAIG;IACH,gBAAoB;IAEpB;;;;OAIG;IACH,uBAkBC;IAED;;;OAGG;IACH,YAFa,IAAI,QAAQ,CAAC,CAIzB;IAED;;;OAGG;IACH,YAFa,IAAI,YAAY,CAAC,CAI7B;IAED;;;;OAIG;IACH,sBAHW,MAAM,GACL,SAAS,GAAC,YAAY,CAYjC;IAED;;;;OAIG;IACH,wCAFa,OAAO,CA0GnB;IAED,kBAMC;IAED;;;OAGG;IACH,sBAFa,IAAI,MAAM,EAAE,UAAU,CAAC,CAoBnC;IAED;;;;OAIG;IACH,yBAHW,QAAQ,cACR,IAAI,MAAM,EAAE,UAAU,CAAC,QAYjC;IAED;;;;OAIG;IACH,kBAHW,YAAY,cACZ,IAAI,MAAM,EAAC,UAAU,CAAC,QAqChC;IAED;;;;OAIG;IACH,qBAFW,YAAY,QAsBtB;IAED;;;OAGG;IACH,WAFW,QAAQ,QAclB;IAED;;;OAGG;IACH,aAFW,UAAU,QAKpB;IAED;;;OAGG;IACH,mBAFW,UAAU,QAMpB;IAED;;;OAGG;IACH,gBAFW,UAAU,QAIpB;IAED;;;;OAIG;IACH,kBAHW,UAAU,GACR,OAAO,CAKnB;IAGD;;;OAGG;IACH,WAFW,QAAQ,QAKlB;IAED;;;OAGG;IACH,iBAFW,QAAQ,QAMlB;IAED;;;OAGG;IACH,cAFW,QAAQ,QAIlB;IAED;;;;OAIG;IACH,gBAHW,QAAQ,GACN,OAAO,CAKnB;IAED;;;OAGG;IACH,WAFW,YAAY,QAUtB;IAED;;;OAGG;IACH,uBAFW,SAAS,YAAY,CAAC,QAMhC;IAED;;;OAGG;IACH,cAFW,YAAY,QAwBtB;IAED;;;OAGG;IACH,cAFW,YAAY,QAItB;IAED;;;;OAIG;IACH,gBAHW,YAAY,GACV,OAAO,CAKnB;IAED;;;;;;OAMG;IACH,cALW,UAAU,KACV,UAAU,GAER,QAAQ,CAoCpB;IAED,mBAsCC;IAED,kCAQC;IAED;;;OAGG;IACH,+BAFW,YAAY,QA6BtB;IAED;;;OAGG;IACH,8BAFW,WAAW,GAAC,WAAW,GAAC,MAAM,EAAE,QA4B1C;IAED,0BAiBC;IAED;;;;OAIG;IACH,gBAHW,YAAY,GAAC,YAAY,GAAC,MAAM,EAAE,UAClC,WAAW,GAAC,WAAW,GAAC,UAAU,GAAC,MAAM,EAAE,QAYrD;IAED;;;;;;;OAOG;IACH,sBANW,MAAM,MACN,UAAU,MACV,UAAU,MACV,UAAU,GACR,YAAY,CA0BxB;IAED,mBAEC;IAIL;;;OAGG;IACH,qBAFU,OAAO,CAEY;CAP5B;2BAlsB0B,iBAAiB;yBAFnB,eAAe;6BACX,mBAAmB;qBAR3B,8BAA8B"}
@@ -581,22 +581,20 @@ export class TopoMesh {
581
581
  /**
582
582
  *
583
583
  * @param {Float32Array} vertices
584
- * @param {Uint32Array|Uint16Array|Uint8Array|number[]} faces
585
584
  */
586
- build(vertices, faces) {
585
+ setVerticesFromArray(vertices) {
586
+ assert.defined(vertices, 'vertices');
587
587
 
588
- const face_array_size = faces.length;
589
588
  const vertex_array_size = vertices.length;
590
589
 
591
- assert.equal(face_array_size % 3, 0, `Face array size must be multiple of 3, instead was ${face_array_size}`)
592
590
  assert.equal(vertex_array_size % 3, 0, `Vertex array size must be multiple of 3, instead was ${vertex_array_size}`)
593
591
 
594
- const nVertices = vertex_array_size / 3;
592
+ const vertex_count = vertex_array_size / 3;
595
593
 
596
594
  //populate vertices
597
- const topoVertices = this.vertices;
595
+ const topo_vertices = this.vertices;
598
596
 
599
- for (let i = 0; i < nVertices; i++) {
597
+ for (let i = 0; i < vertex_count; i++) {
600
598
 
601
599
  const i3 = i * 3;
602
600
 
@@ -608,46 +606,111 @@ export class TopoMesh {
608
606
  v.y = vertices[i3 + 1];
609
607
  v.z = vertices[i3 + 2];
610
608
 
611
- topoVertices[i] = v;
609
+ topo_vertices[i] = v;
612
610
  }
613
611
 
614
- const nFaces = face_array_size / 3;
612
+ }
613
+
614
+ /**
615
+ *
616
+ * @param {Uint16Array|Uint32Array|number[]} faces
617
+ */
618
+ setFacesFromIndexArray(faces) {
619
+ const face_array_size = faces.length;
620
+
621
+ assert.equal(face_array_size % 3, 0, `Face array size must be multiple of 3, instead was ${face_array_size}`)
622
+
623
+ //populate vertices
624
+ const topo_vertices = this.vertices;
625
+
626
+ const face_count = face_array_size / 3;
615
627
 
616
628
  // populate faces
617
- const topoFaces = this.getFaces();
618
629
 
619
- for (let i = 0; i < nFaces; i++) {
630
+ for (let i = 0; i < face_count; i++) {
620
631
  const i3 = i * 3;
621
632
 
622
633
  const a = faces[i3];
623
634
  const b = faces[i3 + 1];
624
635
  const c = faces[i3 + 2];
625
636
 
626
- const vA = topoVertices[a];
627
- const vB = topoVertices[b];
628
- const vC = topoVertices[c];
637
+ this.createTriangle(
638
+ i,
639
+ topo_vertices[a],
640
+ topo_vertices[b],
641
+ topo_vertices[c]
642
+ );
643
+ }
644
+ }
645
+
646
+ setFacedUnindexed() {
647
+ const topo_vertices = this.vertices;
629
648
 
630
- const f = new TopoTriangle();
631
- f.index = i;
649
+ const face_count = topo_vertices.length / 3;
632
650
 
633
- const eAB = this.ensureEdge(vA, vB);
634
- const eBC = this.ensureEdge(vB, vC);
635
- const eCA = this.ensureEdge(vC, vA);
651
+ // populate faces
652
+ for (let i = 0; i < face_count; i++) {
636
653
 
637
- //link primitives
638
- eAB.faces.push(f);
639
- eBC.faces.push(f);
640
- eCA.faces.push(f);
654
+ const offset = i * 3;
655
+
656
+ this.createTriangle(
657
+ i,
658
+ topo_vertices[offset],
659
+ topo_vertices[offset + 1],
660
+ topo_vertices[offset + 2]
661
+ );
662
+ }
663
+ }
641
664
 
642
- f.vertices.push(vA, vB, vC);
643
- f.edges.push(eAB, eBC, eCA);
665
+ /**
666
+ *
667
+ * @param {Float64Array|Float32Array|number[]} vertices
668
+ * @param {Uint32Array|Uint16Array|Uint8Array|number[]} [faces]
669
+ */
670
+ build(vertices, faces) {
644
671
 
645
- vA.faces.push(f);
646
- vB.faces.push(f);
647
- vC.faces.push(f);
672
+ this.setVerticesFromArray(vertices);
648
673
 
649
- topoFaces.add(f);
674
+ if (faces === undefined || faces === null) {
675
+ this.setFacedUnindexed();
676
+ } else {
677
+ this.setFacesFromIndexArray(faces);
650
678
  }
679
+
680
+ }
681
+
682
+ /**
683
+ *
684
+ * @param {number} index
685
+ * @param {TopoVertex} v0
686
+ * @param {TopoVertex} v1
687
+ * @param {TopoVertex} v2
688
+ * @returns {TopoTriangle}
689
+ */
690
+ createTriangle(index, v0, v1, v2) {
691
+ const f = new TopoTriangle();
692
+
693
+ f.index = index;
694
+
695
+ const e01 = this.ensureEdge(v0, v1);
696
+ const e12 = this.ensureEdge(v1, v2);
697
+ const e20 = this.ensureEdge(v2, v0);
698
+
699
+ //link primitives
700
+ e01.faces.push(f);
701
+ e12.faces.push(f);
702
+ e20.faces.push(f);
703
+
704
+ f.vertices.push(v0, v1, v2);
705
+ f.edges.push(e01, e12, e20);
706
+
707
+ v0.faces.push(f);
708
+ v1.faces.push(f);
709
+ v2.faces.push(f);
710
+
711
+ this.__faces.add(f);
712
+
713
+ return f;
651
714
  }
652
715
 
653
716
  toString() {
@@ -33,7 +33,11 @@ export class TimeSeries<T> {
33
33
  * @returns {number}
34
34
  */
35
35
  get last_timestamp(): number;
36
- validateNextSample(data: any): void;
36
+ /**
37
+ *
38
+ * @param {number[]} data
39
+ */
40
+ validateNextSample(data: number[]): void;
37
41
  /**
38
42
  *
39
43
  * @param {number[]} data
@@ -1 +1 @@
1
- {"version":3,"file":"TimeSeries.d.ts","sourceRoot":"","sources":["../../../../../src/engine/animation/async/TimeSeries.js"],"names":[],"mappings":"AAiBA;;GAEG;AACH;IA+BI;;;;OAIG;IACH,4CAFW,MAAM,EAuChB;IAxED;;OAEG;IACH,MAFU,iBAAiB,CAEvB;IAEJ;;OAEG;IACH,OAFU,aAAa,CAElB;IAEL,0BAAsB;IAyHtB;;;;OAIG;IACH,8BAHW,MAAM,OAOhB;IAED;;;OAGG;IACH,2BAEC;IAED;;;OAGG;IACH,6BAWC;IAED,oCAcC;IAED;;;OAGG;IACH,gBAFW,MAAM,EAAE,QAQlB;IAED;;;OAGG;IACH,mCAIC;IAED;;;;OAIG;IACH,yBAHW,MAAM,EAAE,SACR,MAAM,QAIhB;IAED;;;;OAIG;IACH,+BAHW,MAAM,GACJ,MAAM,CAMlB;IAED;;;;;OAKG;IACH,qBAJW,MAAM,EAAE,iBACR,MAAM,QACN,MAAM,QAuBhB;IAED;;;;OAIG;IACH,yBAHW,MAAM,OAShB;;CAEJ;kCA7RiC,qDAAqD;8BADzD,iDAAiD"}
1
+ {"version":3,"file":"TimeSeries.d.ts","sourceRoot":"","sources":["../../../../../src/engine/animation/async/TimeSeries.js"],"names":[],"mappings":"AAiBA;;GAEG;AACH;IA+BI;;;;OAIG;IACH,4CAFW,MAAM,EAuChB;IAxED;;OAEG;IACH,MAFU,iBAAiB,CAEvB;IAEJ;;OAEG;IACH,OAFU,aAAa,CAElB;IAEL,0BAAsB;IAyHtB;;;;OAIG;IACH,8BAHW,MAAM,OAOhB;IAED;;;OAGG;IACH,2BAEC;IAED;;;OAGG;IACH,6BAWC;IAED;;;OAGG;IACH,yBAFW,MAAM,EAAE,QAwBlB;IAED;;;OAGG;IACH,gBAFW,MAAM,EAAE,QAQlB;IAED;;;OAGG;IACH,mCAIC;IAED;;;;OAIG;IACH,yBAHW,MAAM,EAAE,SACR,MAAM,QAIhB;IAED;;;;OAIG;IACH,+BAHW,MAAM,GACJ,MAAM,CAMlB;IAED;;;;;OAKG;IACH,qBAJW,MAAM,EAAE,iBACR,MAAM,QACN,MAAM,QAuBhB;IAED;;;;OAIG;IACH,yBAHW,MAAM,OAShB;;CAEJ;kCAzSiC,qDAAqD;8BADzD,iDAAiD"}
@@ -186,8 +186,14 @@ export class TimeSeries {
186
186
  return table.readCellValue(record_count - 1, time_column);
187
187
  }
188
188
 
189
+ /**
190
+ *
191
+ * @param {number[]} data
192
+ */
189
193
  validateNextSample(data) {
190
194
 
195
+ assert.isArrayLike(data, 'data');
196
+
191
197
  const table = this.table;
192
198
  const record_count = table.length;
193
199
 
@@ -195,8 +201,14 @@ export class TimeSeries {
195
201
  const time_column = this.time_column_index;
196
202
  const last_time = table.readCellValue(record_count - 1, time_column);
197
203
 
198
- if (data[time_column] <= last_time) {
199
- throw new Error(`Sample.time[${time_column}] = ${data[time_column]}, which is <= to previous time stamp(=${last_time}). Each sample's time stamp must be strictly greater than the previous one`);
204
+ const record = data[time_column];
205
+
206
+ assert.isNumber(record, `data[${time_column}](time)`);
207
+ assert.notNaN(record, `data[${time_column}](time)`);
208
+ assert.isFiniteNumber(record, `data[${time_column}](time)`);
209
+
210
+ if (record <= last_time) {
211
+ throw new Error(`Sample.time[${time_column}] = ${record}, which is <= to previous time stamp(=${last_time}). Each sample's time stamp must be strictly greater than the previous one`);
200
212
  }
201
213
  }
202
214
 
@@ -1 +1 @@
1
- {"version":3,"file":"computeTextureHash.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/asset/loaders/material/computeTextureHash.js"],"names":[],"mappings":"AAwBA;;;;GAIG;AACH;;WAHoD,MAAM;YAAQ,MAAM;IAC5D,MAAM,CAsCjB;AA4CD;;;;GAIG;AACH,sCAHW,UAAQ,MAAM,OAAO,GACnB,MAAM,CAqClB"}
1
+ {"version":3,"file":"computeTextureHash.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/asset/loaders/material/computeTextureHash.js"],"names":[],"mappings":"AAyBA;;;;GAIG;AACH;;WAHoD,MAAM;YAAQ,MAAM;IAC5D,MAAM,CA0CjB;AA4CD;;;;GAIG;AACH,sCAHW,UAAQ,MAAM,OAAO,GACnB,MAAM,CAqClB"}
@@ -2,6 +2,7 @@ import { combine_hash } from "../../../../core/collection/array/combine_hash.js"
2
2
  import { murmur3_32 } from "../../../../core/math/hash/murmur3_32.js";
3
3
  import { computeHashFloat } from "../../../../core/primitives/numbers/computeHashFloat.js";
4
4
  import { computeStringHash } from "../../../../core/primitives/strings/computeStringHash.js";
5
+ import { computeHtmlCanvasElementHash } from "../../../graphics/canvas/computeHtmlCanvasElementHash.js";
5
6
  import { isImageBitmap } from "../../../graphics/texture/isImageBitmap.js";
6
7
  import { computeImageBitmapHash } from "./computeImageBitmapHash.js";
7
8
 
@@ -44,6 +45,10 @@ export function computeImageDataHash(image) {
44
45
 
45
46
  result = computeStringHash(image.src);
46
47
 
48
+ }else if(image instanceof HTMLCanvasElement) {
49
+
50
+ result = computeHtmlCanvasElementHash(image);
51
+
47
52
  }
48
53
 
49
54
  let width = 0;
@@ -0,0 +1,7 @@
1
+ /**
2
+ *
3
+ * @param {HTMLCanvasElement} canvas
4
+ * @returns {number}
5
+ */
6
+ export function computeHtmlCanvasElementHash(canvas: HTMLCanvasElement): number;
7
+ //# sourceMappingURL=computeHtmlCanvasElementHash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computeHtmlCanvasElementHash.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics/canvas/computeHtmlCanvasElementHash.js"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,qDAHW,iBAAiB,GACf,MAAM,CAMlB"}
@@ -0,0 +1,12 @@
1
+ import html_canvas_to_sampler2d from "../texture/html_canvas_to_sampler2d.js";
2
+
3
+ /**
4
+ *
5
+ * @param {HTMLCanvasElement} canvas
6
+ * @returns {number}
7
+ */
8
+ export function computeHtmlCanvasElementHash(canvas) {
9
+ const sampler = html_canvas_to_sampler2d(canvas);
10
+
11
+ return sampler.hash();
12
+ }
@@ -28,4 +28,6 @@ export function computeImageCanvasEquality(a, b) {
28
28
  }
29
29
 
30
30
  return true;
31
- }
31
+ }
32
+
33
+
@@ -3,8 +3,8 @@
3
3
  *
4
4
  * @param {Float64Array|Float32Array|number[]} positions
5
5
  * @param {Float64Array|Float32Array|number[]} uvs
6
- * @param {Uint16Array|Uint32Array|number[]} faces
6
+ * @param {Uint16Array|Uint32Array|number[]|undefined} faces
7
7
  * @param {number} [steps] Number of optimization passes to perform
8
8
  */
9
- export function geometry_optimize_uv_tension(positions: Float64Array | Float32Array | number[], uvs: Float64Array | Float32Array | number[], faces: Uint16Array | Uint32Array | number[], steps?: number): void;
9
+ export function geometry_optimize_uv_tension(positions: Float64Array | Float32Array | number[], uvs: Float64Array | Float32Array | number[], faces: Uint16Array | Uint32Array | number[] | undefined, steps?: number): void;
10
10
  //# sourceMappingURL=geometry_optimize_uv_tension.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"geometry_optimize_uv_tension.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/graphics/geometry/optimization/geometry_optimize_uv_tension.js"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AACH,wDALW,YAAY,GAAC,YAAY,GAAC,MAAM,EAAE,OAClC,YAAY,GAAC,YAAY,GAAC,MAAM,EAAE,SAClC,WAAW,GAAC,WAAW,GAAC,MAAM,EAAE,UAChC,MAAM,QA0EhB"}
1
+ {"version":3,"file":"geometry_optimize_uv_tension.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/graphics/geometry/optimization/geometry_optimize_uv_tension.js"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AACH,wDALW,YAAY,GAAC,YAAY,GAAC,MAAM,EAAE,OAClC,YAAY,GAAC,YAAY,GAAC,MAAM,EAAE,SAClC,WAAW,GAAC,WAAW,GAAC,MAAM,EAAE,GAAC,SAAS,UAC1C,MAAM,QA0EhB"}
@@ -7,7 +7,7 @@ import { TopoMesh } from "../../../../core/geom/3d/topology/struct/TopoMesh.js";
7
7
  *
8
8
  * @param {Float64Array|Float32Array|number[]} positions
9
9
  * @param {Float64Array|Float32Array|number[]} uvs
10
- * @param {Uint16Array|Uint32Array|number[]} faces
10
+ * @param {Uint16Array|Uint32Array|number[]|undefined} faces
11
11
  * @param {number} [steps] Number of optimization passes to perform
12
12
  */
13
13
  export function geometry_optimize_uv_tension(
@@ -0,0 +1,7 @@
1
+ /**
2
+ *
3
+ * @param {HTMLCanvasElement} canvas
4
+ * @returns {CanvasRenderingContext2D}
5
+ */
6
+ export function html_canvas_to_rendering_context2d_cached(canvas: HTMLCanvasElement): CanvasRenderingContext2D;
7
+ //# sourceMappingURL=html_canvas_to_rendering_context2d_cached.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html_canvas_to_rendering_context2d_cached.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics/texture/html_canvas_to_rendering_context2d_cached.js"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,kEAHW,iBAAiB,GACf,wBAAwB,CAUpC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ *
3
+ * @type {WeakMap<HTMLCanvasElement, CanvasRenderingContext2D>}
4
+ */
5
+ const context_cache = new WeakMap();
6
+
7
+ /**
8
+ *
9
+ * @param {HTMLCanvasElement} canvas
10
+ * @returns {CanvasRenderingContext2D}
11
+ */
12
+ export function html_canvas_to_rendering_context2d_cached(canvas) {
13
+ let context = context_cache.get(canvas);
14
+
15
+ if (context === undefined) {
16
+ context = canvas.getContext("2d");
17
+ context_cache.set(canvas, context);
18
+ }
19
+ return context;
20
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"html_canvas_to_sampler2d.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics/texture/html_canvas_to_sampler2d.js"],"names":[],"mappings":";AAQA;;;;GAIG;AACH,kDAHW,iBAAiB,GACf,SAAS,CAmBrB;0BA9ByB,wBAAwB"}
1
+ {"version":3,"file":"html_canvas_to_sampler2d.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics/texture/html_canvas_to_sampler2d.js"],"names":[],"mappings":";AAIA;;;;GAIG;AACH,kDAHW,iBAAiB,GACf,SAAS,CAcrB;0BApByB,wBAAwB"}
@@ -1,10 +1,6 @@
1
+ import { html_canvas_to_rendering_context2d_cached } from "./html_canvas_to_rendering_context2d_cached.js";
1
2
  import { Sampler2D } from './sampler/Sampler2D.js';
2
3
 
3
- /**
4
- *
5
- * @type {WeakMap<HTMLCanvasElement, CanvasRenderingContext2D>}
6
- */
7
- const context_cache = new WeakMap();
8
4
 
9
5
  /**
10
6
  *
@@ -15,12 +11,7 @@ function html_canvas_to_sampler2d(canvas) {
15
11
  const width = canvas.width;
16
12
  const height = canvas.height;
17
13
 
18
- let context = context_cache.get(canvas);
19
-
20
- if (context === undefined) {
21
- context = canvas.getContext("2d");
22
- context_cache.set(canvas, context);
23
- }
14
+ const context = html_canvas_to_rendering_context2d_cached(canvas);
24
15
 
25
16
  const imageData = context.getImageData(0, 0, width, height);
26
17