@woosh/meep-engine 2.37.16 → 2.37.19

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 (122) hide show
  1. package/core/assert.js +16 -2
  2. package/core/collection/array/typed/isTypedArray.js +20 -0
  3. package/core/collection/array/typedArrayToDataType.js +2 -1
  4. package/core/collection/table/RowFirstTable.js +34 -0
  5. package/core/collection/table/RowFirstTable.spec.js +59 -1
  6. package/core/color/Color.js +14 -0
  7. package/core/color/rgb2hex.js +1 -1
  8. package/core/events/signal/Signal.js +8 -8
  9. package/core/events/signal/Signal.spec.js +16 -0
  10. package/core/geom/Quaternion.d.ts +5 -0
  11. package/core/geom/Quaternion.js +152 -137
  12. package/core/geom/Quaternion.spec.js +47 -2
  13. package/core/geom/Vector3.schema.json +16 -0
  14. package/core/json/JsonUtils.js +2 -20
  15. package/core/model/ObservedEnum.js +8 -0
  16. package/editor/Editor.js +97 -1
  17. package/editor/actions/concrete/PatchTerrainHeightAction.js +1 -1
  18. package/editor/ecs/component/FieldDescriptor.js +34 -0
  19. package/editor/ecs/component/FieldValueAdapter.js +20 -0
  20. package/editor/ecs/component/TypeEditor.js +33 -0
  21. package/editor/ecs/component/TypeSchema.d.ts +38 -0
  22. package/editor/ecs/component/createFieldEditor.js +90 -0
  23. package/editor/ecs/component/createObjectEditor.js +242 -60
  24. package/editor/ecs/component/editors/ColorEditor.js +39 -0
  25. package/editor/ecs/component/editors/HTMLElementEditor.js +17 -0
  26. package/editor/ecs/component/editors/ImagePathEditor.js +50 -0
  27. package/editor/ecs/component/editors/NumericIntervalEditor.js +86 -0
  28. package/editor/ecs/component/editors/ObservedBooleanEditor.js +13 -0
  29. package/editor/ecs/component/editors/ObservedEnumEditor.js +32 -0
  30. package/editor/ecs/component/editors/ObservedIntegerEditor.js +43 -0
  31. package/editor/ecs/component/editors/ObservedStringEditor.js +51 -0
  32. package/editor/ecs/component/editors/Sampler2DEditor.js +60 -0
  33. package/editor/ecs/component/editors/collection/ListEditor.js +83 -0
  34. package/editor/ecs/component/editors/common/BitFlagsEditor.js +80 -0
  35. package/editor/ecs/component/editors/common/EnumEditor.js +41 -0
  36. package/editor/ecs/component/editors/common/makeV3_editor.js +85 -0
  37. package/editor/ecs/component/editors/common/noEditor.js +9 -0
  38. package/editor/ecs/component/editors/ecs/GridObstacleEditor.js +17 -0
  39. package/editor/ecs/component/editors/ecs/MinimapMarkerEditor.js +16 -0
  40. package/editor/ecs/component/editors/ecs/ParameterLookupTableEditor.js +44 -0
  41. package/editor/ecs/component/editors/ecs/ParameterTrackEditor.js +17 -0
  42. package/editor/ecs/component/editors/ecs/ParticleEmitterEditor.js +58 -0
  43. package/editor/ecs/component/editors/ecs/ParticleEmitterLayerEditor.js +54 -0
  44. package/editor/ecs/component/editors/ecs/SimulationStepDefinitionEditor.js +21 -0
  45. package/editor/ecs/component/editors/ecs/Trail2DEditor.js +33 -0
  46. package/editor/ecs/component/editors/ecs/TransformEditor.js +23 -0
  47. package/editor/ecs/component/editors/ecs/terrain/SplatMappingEditor.js +21 -0
  48. package/editor/ecs/component/editors/ecs/terrain/TerrainEditor.js +42 -0
  49. package/editor/ecs/component/editors/ecs/terrain/TerrainLayerEditor.js +18 -0
  50. package/editor/ecs/component/editors/ecs/terrain/TerrainLayersEditor.js +22 -0
  51. package/editor/ecs/component/editors/ecs/terrain/TerrainOverlayEditor.js +20 -0
  52. package/editor/ecs/component/editors/geom/QuaternionEditor.js +56 -0
  53. package/editor/ecs/component/editors/geom/Vector1Editor.js +57 -0
  54. package/editor/ecs/component/editors/geom/Vector2Editor.js +11 -0
  55. package/editor/ecs/component/editors/geom/Vector3Editor.js +13 -0
  56. package/editor/ecs/component/editors/geom/Vector4Editor.js +12 -0
  57. package/editor/ecs/component/editors/primitive/ArrayEditor.js +46 -0
  58. package/editor/ecs/component/editors/primitive/BooleanEditor.js +27 -0
  59. package/editor/ecs/component/editors/primitive/FunctionEditor.js +25 -0
  60. package/editor/ecs/component/editors/primitive/NumberEditor.js +60 -0
  61. package/editor/ecs/component/editors/primitive/ObjectEditor.js +12 -0
  62. package/editor/ecs/component/editors/primitive/StringEditor.js +31 -0
  63. package/editor/ecs/component/editors/three/BufferGeometryEditor.js +28 -0
  64. package/editor/ecs/component/editors/three/MaterialEditor.js +27 -0
  65. package/editor/ecs/component/editors/three/MeshEditor.js +35 -0
  66. package/editor/ecs/component/editors/three/TextureEditor.js +32 -0
  67. package/editor/ecs/component/findNearestRegisteredType.js +59 -0
  68. package/editor/ecs/component/prototypeObjectEditor.js +379 -0
  69. package/editor/view/EditorView.js +1 -1
  70. package/editor/view/ecs/ComponentControlView.js +2 -30
  71. package/editor/view/ecs/EntityEditor.js +61 -139
  72. package/editor/view/ecs/components/GridObstacleController.js +4 -4
  73. package/editor/view/ecs/components/TerrainController.js +1 -1
  74. package/editor/view/ecs/components/common/NumberController.js +19 -7
  75. package/engine/animation/keyed2/AnimationTrack.js +1 -1
  76. package/engine/asset/AssetManager.js +1 -1
  77. package/engine/ecs/EntityBlueprint.js +1 -1
  78. package/engine/ecs/EntityBuilder.js +2 -2
  79. package/engine/ecs/EntityManager.js +1 -1
  80. package/engine/ecs/components/TagEditor.js +15 -0
  81. package/engine/ecs/parent/EntityNode.js +3 -0
  82. package/engine/ecs/storage/binary/object/BinaryObjectSerializationAdapter.js +1 -1
  83. package/engine/ecs/terrain/ecs/Terrain.js +23 -42
  84. package/engine/ecs/terrain/ecs/TerrainSystem.js +2 -2
  85. package/engine/ecs/terrain/ecs/layers/TerrainLayer.js +1 -1
  86. package/engine/ecs/terrain/util/loadVisibleTerrainTiles.js +1 -1
  87. package/engine/ecs/transform/Transform.editor.schema.json +16 -0
  88. package/engine/ecs/transform/Transform.js +3 -0
  89. package/engine/ecs/util/hideEntityGracefully.js +4 -2
  90. package/engine/graphics/ecs/highlight/HighlightEditor.js +17 -0
  91. package/engine/graphics/ecs/mesh/MeshEditor.js +28 -0
  92. package/engine/graphics/ecs/mesh-v2/aggregate/prototypeSGMesh.js +3 -3
  93. package/engine/graphics/micron/render/instanced/shader/shader_rewrite_standard.js +15 -15
  94. package/engine/graphics/particles/particular/engine/ParticularEngine.js +5 -0
  95. package/engine/graphics/texture/sampler/Sampler2D.js +16 -0
  96. package/engine/graphics/util/ScaleObject3ToBox.js +14 -1
  97. package/engine/graphics/util/makeMeshPreviewScene.js +2 -1
  98. package/engine/grid/components/GridObstacle.js +0 -44
  99. package/engine/grid/components/GridObstacleSerializationAdapter.js +46 -0
  100. package/engine/knowledge/database/StaticKnowledgeDatabase.js +1 -1
  101. package/engine/navigation/ecs/components/Path.d.ts +2 -0
  102. package/engine/navigation/ecs/components/Path.js +6 -1
  103. package/engine/sound/material/concrete/json/serializeSoundMaterialToJSON.js +1 -1
  104. package/generation/example/SampleGenerator0.js +33 -29
  105. package/generation/example/generators/interactive/mir_generator_place_buff_objects.js +7 -6
  106. package/generation/example/generators/mir_generator_place_bases.js +7 -3
  107. package/generation/example/generators/mir_generator_place_road_decorators.js +3 -3
  108. package/generation/example/generators/mir_generator_place_starting_point.js +3 -2
  109. package/generation/markers/GridCellActionPlaceMarker.js +9 -3
  110. package/generation/markers/transform/MarkerNodeTransformerOffsetPosition.js +1 -1
  111. package/generation/placement/GridCellPlacementRule.js +22 -23
  112. package/generation/theme/ThemeEngine.js +1 -1
  113. package/package.json +1 -1
  114. package/samples/terrain/main.js +1 -1
  115. package/view/View.js +23 -1
  116. package/view/common/LabelView.js +1 -1
  117. package/view/compose3x3transform.js +32 -8
  118. package/view/controller/dat/DatGuiUtils.js +1 -1
  119. package/view/elements/DropDownSelectionView.js +11 -3
  120. package/view/elements/image/ImageView.js +3 -1
  121. package/core/model/ObservedReal.js +0 -55
  122. package/editor/ecs/component/ObjectEditor.js +0 -0
package/core/assert.js CHANGED
@@ -1,4 +1,5 @@
1
- import { isTypedArray } from "./json/JsonUtils.js";
1
+ import { isArrayEqualStrict } from "./collection/array/isArrayEqualStrict.js";
2
+ import { isTypedArray } from "./collection/array/typed/isTypedArray.js";
2
3
 
3
4
  function equal(a, b, m) {
4
5
  assert(a === b, m) // eslint-disable-line eqeqeq
@@ -164,6 +165,18 @@ function arrayHasNo(haystack, needle, message = 'Array contains the item') {
164
165
  assert.equal(haystack.indexOf(needle), -1, message);
165
166
  }
166
167
 
168
+ /**
169
+ * @template T
170
+ * @param {T[]|ArrayLike<T>|Float32Array} a
171
+ * @param {T[]|ArrayLike<T>|Float32Array} b
172
+ * @param {string} [message]
173
+ */
174
+ function arrayEqual(a, b, message = 'Arrays are not equal') {
175
+ if (!isArrayEqualStrict(a, b)) {
176
+ throw new Error(message);
177
+ }
178
+ }
179
+
167
180
  /**
168
181
  * @template T
169
182
  * @param {T} value
@@ -195,6 +208,7 @@ assert.lessThanOrEqual = lessThanOrEqual;
195
208
  assert.typeOf = typeOf;
196
209
  assert.arrayHas = arrayHas;
197
210
  assert.arrayHasNo = arrayHasNo;
211
+ assert.arrayEqual = arrayEqual;
198
212
 
199
213
  /**
200
214
  *
@@ -321,7 +335,7 @@ assert.defined = function (value, name = "value") {
321
335
  * @param {*} value
322
336
  * @param {String} [name]
323
337
  */
324
- assert.isNull = function (value, name){
338
+ assert.isNull = function (value, name) {
325
339
  if (value !== null) {
326
340
  throw new Error(`${name} is NOT null`);
327
341
  }
@@ -0,0 +1,20 @@
1
+ /**
2
+ *
3
+ * @param o
4
+ * @returns {boolean}
5
+ */
6
+ function isTypedArray(o) {
7
+ return (
8
+ o instanceof Int8Array ||
9
+ o instanceof Uint8Array ||
10
+ o instanceof Uint8ClampedArray ||
11
+ o instanceof Int16Array ||
12
+ o instanceof Uint16Array ||
13
+ o instanceof Int32Array ||
14
+ o instanceof Uint32Array ||
15
+ o instanceof Float32Array ||
16
+ o instanceof Float64Array
17
+ );
18
+ }
19
+
20
+ export { isTypedArray };
@@ -6,10 +6,11 @@ import { DataType } from "../table/DataType.js";
6
6
  * @returns {DataType}
7
7
  */
8
8
  export function typedArrayToDataType(v) {
9
- const ctor = v.__proto__.constructor;
9
+ const ctor = Object.getPrototypeOf(v).constructor;
10
10
 
11
11
  switch (ctor) {
12
12
  case Uint8Array:
13
+ case Uint8ClampedArray:
13
14
  return DataType.Uint8;
14
15
  case Uint16Array:
15
16
  return DataType.Uint16;
@@ -6,6 +6,7 @@
6
6
  import { assert } from "../../assert.js";
7
7
  import Signal from "../../events/signal/Signal.js";
8
8
  import { max2 } from "../../math/max2.js";
9
+ import { array_copy } from "../array/copyArray.js";
9
10
 
10
11
  /**
11
12
  *
@@ -414,6 +415,39 @@ RowFirstTable.prototype.setRow = function (index, record) {
414
415
  this.writeRowMethod(this.dataView, this.bytesPerRecord * index, record);
415
416
  }
416
417
 
418
+ /**
419
+ * Reverse order of rows, row-0 will end up at and previously last row will become the first row etc.
420
+ */
421
+ RowFirstTable.prototype.reverse_rows = function () {
422
+ const bpr = this.bytesPerRecord;
423
+ const copy_buffer = new Uint8Array(bpr);
424
+
425
+ const buffer = this.data;
426
+ const wrapper = new Uint8Array(buffer);
427
+
428
+ const length = this.length;
429
+
430
+ if (length <= 1) {
431
+ // need at least 2 rows for reversal to make any change
432
+ return;
433
+ }
434
+
435
+ const last_row_index = length - 1;
436
+
437
+
438
+ const traversal_limit = last_row_index >>> 1;
439
+ for (let i = 0; i <= traversal_limit; i++) {
440
+ const address = i * bpr;
441
+ array_copy(wrapper, address, copy_buffer, 0, bpr);
442
+
443
+ const swap_index = last_row_index - i;
444
+ const swap_address = swap_index * bpr;
445
+
446
+ wrapper.copyWithin(address, swap_address, swap_address + bpr)
447
+ wrapper.set(copy_buffer, swap_address);
448
+ }
449
+ };
450
+
417
451
  /**
418
452
  * clear out all the data and free memory
419
453
  */
@@ -223,7 +223,65 @@ test('copy', () => {
223
223
  a.addRow([-11.3, 13]);
224
224
 
225
225
  const b = new RowFirstTable(spec);
226
- b.copy(a);
226
+ b.copy(a);
227
227
 
228
228
 
229
229
  });
230
+
231
+
232
+ test('reverse_rows 3 rows (odd number)', () => {
233
+
234
+ const spec = new RowFirstTableSpec([DataType.Uint8]);
235
+
236
+ const a = new RowFirstTable(spec);
237
+ a.addRow([1]);
238
+ a.addRow([2]);
239
+ a.addRow([3]);
240
+
241
+ a.reverse_rows();
242
+
243
+ expect(a.readCellValue(0, 0)).toBeCloseTo(3);
244
+ expect(a.readCellValue(1, 0)).toBeCloseTo(2);
245
+ expect(a.readCellValue(2, 0)).toBeCloseTo(1);
246
+ });
247
+
248
+ test('reverse_rows 2 rows', () => {
249
+
250
+ const spec = new RowFirstTableSpec([DataType.Float64, DataType.Uint8]);
251
+
252
+ const a = new RowFirstTable(spec);
253
+ a.addRow([3.1, 7]);
254
+ a.addRow([-11.3, 13]);
255
+
256
+ a.reverse_rows();
257
+
258
+ expect(a.readCellValue(1, 0)).toBeCloseTo(3.1);
259
+ expect(a.readCellValue(1, 1)).toBeCloseTo(7);
260
+
261
+ expect(a.readCellValue(0, 0)).toBeCloseTo(-11.3);
262
+ expect(a.readCellValue(0, 1)).toBeCloseTo(13);
263
+ });
264
+
265
+ test('reverse_rows 1 row', () => {
266
+
267
+ const spec = new RowFirstTableSpec([DataType.Float64, DataType.Uint8]);
268
+
269
+ const a = new RowFirstTable(spec);
270
+
271
+ a.addRow([3.1, 7]);
272
+ a.reverse_rows();
273
+
274
+ expect(a.readCellValue(0, 0)).toBeCloseTo(3.1);
275
+ expect(a.readCellValue(0, 1)).toBeCloseTo(7);
276
+ });
277
+
278
+ test('reverse_rows empty', () => {
279
+
280
+ const spec = new RowFirstTableSpec([DataType.Float64, DataType.Uint8]);
281
+
282
+ const a = new RowFirstTable(spec);
283
+
284
+ a.reverse_rows();
285
+
286
+ expect(a.length).toBe(0);
287
+ });
@@ -9,6 +9,7 @@ import { computeHashFloat } from "../math/hash/computeHashFloat.js";
9
9
  import { rgb2hsv } from "./rgb2hsv.js";
10
10
  import { rgb2uint24 } from "./rgb2uint24.js";
11
11
  import { clamp01 } from "../math/clamp01.js";
12
+ import { rgb2hex } from "./rgb2hex.js";
12
13
 
13
14
  /**
14
15
  * @class
@@ -346,6 +347,19 @@ export class Color {
346
347
  this.setRGB(r / 255, g / 255, b / 255);
347
348
  }
348
349
 
350
+ /**
351
+ * Returns color in CSS hex color format
352
+ * @example #FF0000
353
+ * @returns {string}
354
+ */
355
+ toHex() {
356
+ return '#' + rgb2hex(
357
+ Math.round(this.r),
358
+ Math.round(this.g),
359
+ Math.round(this.b)
360
+ );
361
+ }
362
+
349
363
  /**
350
364
  *
351
365
  * @param {Color} other
@@ -1,5 +1,5 @@
1
1
  function dec2hex(c) {
2
- const hex = c.toString(16);
2
+ const hex = Math.round(c).toString(16);
3
3
  return hex.length === 1 ? "0" + hex : hex;
4
4
  }
5
5
 
@@ -240,7 +240,7 @@ export class Signal {
240
240
  // Copy handlers into a temp storage to preserve state during dispatch
241
241
  for (i = 0; i < length; i++) {
242
242
  //copy to proxy
243
- dispatch_stack[stack_pointer + i] = handlers[i];
243
+ dispatch_stack[stack_pointer + i] = handlers[length - (i + 1)];
244
244
  }
245
245
 
246
246
  // Dispatch phase
@@ -292,7 +292,7 @@ export class Signal {
292
292
  // Copy handlers into a temp storage to preserve state during dispatch
293
293
  for (i = 0; i < length; i++) {
294
294
  //copy to proxy
295
- dispatch_stack[stack_pointer + i] = handlers[i];
295
+ dispatch_stack[stack_pointer + i] = handlers[length - (i + 1)];
296
296
  }
297
297
 
298
298
  // Dispatch phase
@@ -343,7 +343,7 @@ export class Signal {
343
343
  // Copy handlers into a temp storage to preserve state during dispatch
344
344
  for (i = 0; i < length; i++) {
345
345
  //copy to proxy
346
- dispatch_stack[stack_pointer + i] = handlers[i];
346
+ dispatch_stack[stack_pointer + i] = handlers[length - (i + 1)];
347
347
  }
348
348
 
349
349
  // Dispatch phase
@@ -395,7 +395,7 @@ export class Signal {
395
395
  // Copy handlers into a temp storage to preserve state during dispatch
396
396
  for (i = 0; i < length; i++) {
397
397
  //copy to proxy
398
- dispatch_stack[stack_pointer + i] = handlers[i];
398
+ dispatch_stack[stack_pointer + i] = handlers[length - (i + 1)];
399
399
  }
400
400
 
401
401
  // Dispatch phase
@@ -448,7 +448,7 @@ export class Signal {
448
448
  // Copy handlers into a temp storage to preserve state during dispatch
449
449
  for (i = 0; i < length; i++) {
450
450
  //copy to proxy
451
- dispatch_stack[stack_pointer + i] = handlers[i];
451
+ dispatch_stack[stack_pointer + i] = handlers[length - (i + 1)];
452
452
  }
453
453
 
454
454
  // Dispatch phase
@@ -503,7 +503,7 @@ export class Signal {
503
503
  // Copy handlers into a temp storage to preserve state during dispatch
504
504
  for (i = 0; i < length; i++) {
505
505
  //copy to proxy
506
- dispatch_stack[stack_pointer + i] = handlers[i];
506
+ dispatch_stack[stack_pointer + i] = handlers[length - (i + 1)];
507
507
  }
508
508
 
509
509
  // Dispatch phase
@@ -560,7 +560,7 @@ export class Signal {
560
560
  // Copy handlers into a temp storage to preserve state during dispatch
561
561
  for (i = 0; i < length; i++) {
562
562
  //copy to proxy
563
- dispatch_stack[stack_pointer + i] = handlers[i];
563
+ dispatch_stack[stack_pointer + i] = handlers[length - (i + 1)];
564
564
  }
565
565
 
566
566
  // Dispatch phase
@@ -731,7 +731,7 @@ export function dispatchViaProxy(handlers, args) {
731
731
  let i, h;
732
732
  for (i = 0; i < length; i++) {
733
733
  //copy to proxy
734
- dispatch_stack[stack_pointer + i] = handlers[i];
734
+ dispatch_stack[stack_pointer + i] = handlers[length - (i + 1)];
735
735
  }
736
736
 
737
737
  for (i = stack_frame_end - 1; i >= stack_pointer; i--) {
@@ -147,3 +147,19 @@ test("handler context is properly setup during dispatch", () => {
147
147
 
148
148
  expect(handler).toHaveBeenCalled();
149
149
  });
150
+
151
+ test("handlers should be executed in the order in which they are added", () => {
152
+ const signal = new Signal();
153
+
154
+ const marks = [];
155
+
156
+ const write_1 = jest.fn(() => marks.push(1));
157
+ const write_2 = jest.fn(() => marks.push(2));
158
+
159
+ signal.add(write_1);
160
+ signal.add(write_2);
161
+
162
+ signal.send0();
163
+
164
+ expect(marks).toEqual([1, 2]);
165
+ });
@@ -24,4 +24,9 @@ export default class Quaternion {
24
24
  setFromRotationMatrix(m: Matrix4): void
25
25
 
26
26
  decodeFromUint32(uint: number): void
27
+
28
+
29
+ toEulerAnglesXYZ(v3: { set(x: number, y: number, z: number): any }): void
30
+
31
+ fromEulerAnglesXYZ(x: number, y: number, z: number): void
27
32
  }