@woosh/meep-engine 2.42.8 → 2.43.0

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 (136) hide show
  1. package/core/binary/BitSet.js +4 -4
  2. package/core/binary/ctz32.js +40 -0
  3. package/core/collection/ObservedMap.js +61 -57
  4. package/core/collection/heap/FastBinaryHeap.js +7 -1
  5. package/core/collection/heap/Uint32Heap.js +19 -0
  6. package/core/collection/map/AsyncLoadingCache.js +3 -1
  7. package/core/geom/2d/compute_polygon_area_2d.js +32 -0
  8. package/core/geom/2d/compute_polygon_area_2d.spec.js +10 -0
  9. package/core/geom/2d/compute_triangle_area_2d.js +15 -0
  10. package/core/geom/2d/compute_triangle_area_2d.spec.js +9 -0
  11. package/core/geom/2d/convex-hull/convex_hull_jarvis_2d.js +64 -0
  12. package/core/geom/2d/convex-hull/convex_hull_jarvis_2d.spec.js +33 -0
  13. package/core/geom/2d/convex-hull/convex_hull_monotone_2d.js +82 -0
  14. package/core/geom/2d/convex-hull/fixed_convex_hull_humus.js +135 -0
  15. package/core/geom/2d/convex-hull/fixed_convex_hull_relaxation.js +282 -0
  16. package/core/geom/2d/convex-hull/orientation3.js +444 -0
  17. package/core/geom/2d/convex-hull/orientation3_array.js +22 -0
  18. package/core/geom/2d/convex-hull/orientation3_v2.js +12 -0
  19. package/core/geom/2d/intersect_ray_2d.js +56 -0
  20. package/core/geom/2d/quad-tree/QuadTreeNode.js +0 -81
  21. package/core/geom/2d/quad-tree/qt_match_data_by_circle.js +70 -0
  22. package/core/geom/3d/matrix/m4_multiply_alphatensor.js +131 -0
  23. package/core/geom/3d/plane/orient3d_fast.js +2 -6
  24. package/core/geom/3d/tetrahedra/README.md +7 -0
  25. package/core/geom/3d/tetrahedra/compute_bounding_simplex_3d.js +3 -1
  26. package/core/geom/3d/tetrahedra/delaunay/Cavity.js +48 -0
  27. package/core/geom/3d/tetrahedra/{compute_delaunay_tetrahedral_mesh.js → delaunay/compute_delaunay_tetrahedral_mesh.js} +15 -7
  28. package/core/geom/3d/tetrahedra/{compute_delaunay_tetrahedral_mesh.spec.js → delaunay/compute_delaunay_tetrahedral_mesh.spec.js} +0 -0
  29. package/core/geom/3d/tetrahedra/delaunay/tetrahedral_mesh_compute_cavity.js +73 -0
  30. package/core/geom/3d/tetrahedra/delaunay/tetrahedral_mesh_walk_toward_cavity.js +48 -0
  31. package/core/geom/3d/tetrahedra/hxt/a.js +524 -0
  32. package/core/geom/3d/tetrahedra/hxt/hxt.js +140 -0
  33. package/core/geom/3d/tetrahedra/hxt/hxt.wasm +0 -0
  34. package/core/geom/3d/tetrahedra/point_in_tetrahedron_circumsphere.js +35 -20
  35. package/core/geom/3d/tetrahedra/prototypeTetrahedraBuilder.js +98 -0
  36. package/core/geom/3d/tetrahedra/tetrahedra_collection.js +60 -131
  37. package/core/geom/packing/{MaxRectangles.js → max-rect/MaxRectangles.js} +28 -124
  38. package/core/geom/packing/max-rect/removeRedundantBoxes.js +69 -0
  39. package/core/geom/packing/max-rect/removeRedundantBoxesArray.js +40 -0
  40. package/core/geom/v3_distance_above_plane.js +1 -1
  41. package/core/graph/layout/BoxLayouter.js +2 -88
  42. package/core/graph/layout/CircleLayout.js +2 -1
  43. package/core/graph/layout/box/forceIntoBox.js +45 -0
  44. package/core/graph/layout/box/pullBoxTowardsPoint.js +20 -0
  45. package/core/graph/layout/box/resolveAABB2Overlap.js +22 -0
  46. package/core/math/bessel_3.js +11 -0
  47. package/core/math/bessel_i0.js +26 -0
  48. package/core/process/executor/ConcurrentExecutor.spec.js +2 -1
  49. package/core/process/task/util/actionTask.js +19 -0
  50. package/core/process/task/util/countTask.js +62 -0
  51. package/core/process/task/util/delayTask.js +45 -0
  52. package/core/process/task/util/emptyTask.js +19 -0
  53. package/core/process/task/util/failingTask.js +17 -0
  54. package/core/process/task/util/futureTask.js +48 -0
  55. package/core/process/task/util/promiseTask.js +42 -0
  56. package/core/process/task/util/randomCountTask.js +64 -0
  57. package/core/process/task/util/wrapTaskIgnoreFailure.js +47 -0
  58. package/engine/Engine.js +8 -8
  59. package/engine/EngineBootstrapper.js +1 -1
  60. package/engine/asset/AssetManager.js +197 -53
  61. package/engine/asset/AssetRequest.js +32 -0
  62. package/engine/asset/loaders/ArrayBufferLoader.js +62 -50
  63. package/engine/asset/loaders/image/png/PNG.js +15 -1
  64. package/engine/asset/loaders/image/png/PNGReader.js +3 -2
  65. package/engine/ecs/foliage/ecs/InstancedMeshUtils.js +2 -1
  66. package/engine/ecs/storage/BinaryBufferDeSerializer.js +1 -1
  67. package/engine/ecs/storage/JSONDeSerializer.js +2 -1
  68. package/engine/ecs/terrain/ecs/splat/SplatMapOptimizer.js +2 -1
  69. package/engine/ecs/terrain/ecs/splat/SplatMapping.js +1 -1
  70. package/engine/graphics/camera/makeScreenScissorFrustum.js +1 -1
  71. package/engine/graphics/camera/testClippingPlaneComputation.js +4 -45
  72. package/engine/graphics/ecs/camera/FrustumProjector.js +6 -0
  73. package/engine/graphics/ecs/decal/v2/FPDecalSystem.js +5 -0
  74. package/engine/graphics/ecs/decal/v2/prototypeDecalSystem.js +23 -4
  75. package/engine/graphics/ecs/highlight/plugin/OutlineRenderPlugin.js +1 -1
  76. package/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +11 -0
  77. package/engine/graphics/geometry/FULL_SCREEN_TRIANGLE_GEOMETRY.js +1 -2
  78. package/engine/graphics/impostors/octahedral/ImpostorBaker.js +5 -2
  79. package/engine/graphics/impostors/octahedral/ImpostorDescription.js +18 -0
  80. package/engine/graphics/impostors/octahedral/bake/prepare_bake_material.js +15 -0
  81. package/engine/graphics/impostors/octahedral/prototypeBaker.js +66 -79
  82. package/engine/graphics/impostors/octahedral/shader/ImpostorShaderWireframeV0.js +134 -0
  83. package/engine/graphics/impostors/octahedral/util/build_cutout_from_atlas_by_alpha.js +128 -0
  84. package/engine/graphics/impostors/octahedral/util/build_geometry_from_cutout_shape.js +32 -0
  85. package/engine/graphics/impostors/octahedral/util/load_mesh_for_bake.js +31 -0
  86. package/engine/graphics/impostors/octahedral/util/makeImpostorAtlasPreview.js +107 -0
  87. package/engine/graphics/material/manager/ManagedMaterial.js +4 -0
  88. package/engine/graphics/material/manager/MaterialManager.js +1 -0
  89. package/engine/graphics/material/optimization/MaterialOptimizationContext.js +7 -3
  90. package/engine/graphics/particles/particular/engine/renderers/billboard/ParticleBillboardMaterial.js +2 -2
  91. package/engine/graphics/render/forward_plus/prototype/prototypeLightManager.js +2 -2
  92. package/engine/graphics/render/visibility/hiz/buildCanvasViewFromTexture.js +83 -27
  93. package/engine/graphics/shadows/ShadowMapRenderer.js +11 -4
  94. package/engine/graphics/texture/atlas/AbstractTextureAtlas.js +2 -1
  95. package/engine/graphics/texture/atlas/CachingTextureAtlas.js +208 -38
  96. package/engine/graphics/texture/atlas/TextureAtlas.js +31 -24
  97. package/engine/graphics/texture/atlas/gpu/WebGLTextureAtlas.js +1 -1
  98. package/engine/graphics/texture/sampler/filter/box.js +16 -0
  99. package/engine/graphics/texture/sampler/filter/cubic2.js +32 -0
  100. package/engine/graphics/texture/sampler/filter/gaussian.js +16 -0
  101. package/engine/graphics/texture/sampler/filter/kaiser_1.js +19 -0
  102. package/engine/graphics/texture/sampler/filter/kaiser_bessel_window.js +19 -0
  103. package/engine/graphics/texture/sampler/filter/mitchell.js +55 -0
  104. package/engine/graphics/texture/sampler/filter/sampler2d_scale_down_generic.js +109 -0
  105. package/engine/graphics/texture/sampler/filter/triangle.js +19 -0
  106. package/engine/graphics/texture/sampler/prototypeSamplerFiltering.js +187 -86
  107. package/engine/graphics/texture/sampler/sampler2_d_scale_down_lanczos.js +77 -25
  108. package/engine/graphics/texture/sampler/search/make_edge_condition_channel_threshold.js +34 -0
  109. package/engine/graphics/texture/sampler/search/sampler2d_find_pixels.js +24 -0
  110. package/engine/graphics/texture/sprite/prototypeSpriteCutoutGeometry.js +212 -0
  111. package/engine/knowledge/database/StaticKnowledgeDataTable.js +1 -1
  112. package/engine/navigation/grid/AStar.js +1 -1
  113. package/engine/scene/Scene.js +1 -1
  114. package/engine/scene/SerializedScene.js +1 -1
  115. package/engine/scene/transitionToScene.js +3 -1
  116. package/generation/example/main.js +1 -1
  117. package/generation/grid/generation/GridTaskApplyActionToCells.js +1 -1
  118. package/generation/grid/generation/GridTaskDensityMarkerDistribution.js +1 -1
  119. package/generation/grid/generation/GridTaskExecuteRuleTimes.js +1 -1
  120. package/generation/grid/generation/NoopGridTaskGenerator.js +1 -1
  121. package/generation/grid/generation/discrete/GridTaskCellularAutomata.js +2 -1
  122. package/generation/grid/generation/discrete/GridTaskConnectRooms.js +1 -1
  123. package/generation/grid/generation/discrete/layer/GridTaskBuildSourceDistanceMap.js +3 -2
  124. package/generation/grid/generation/discrete/layer/GridTaskDistanceToMarkers.js +1 -1
  125. package/generation/grid/generation/grid/GridTaskAddNodesFixed.js +1 -1
  126. package/generation/grid/generation/road/GridTaskGenerateRoads.js +3 -2
  127. package/generation/grid/generation/util/buildDistanceMapToObjective.js +1 -1
  128. package/generation/markers/GridActionRuleSet.js +2 -1
  129. package/generation/placement/GridCellActionTransformNearbyMarkers.js +2 -4
  130. package/generation/theme/ThemeEngine.js +4 -1
  131. package/package.json +1 -1
  132. package/view/asset/AssetLoaderStatusView.js +5 -5
  133. package/view/minimap/gl/MinimapTerrainGL.js +1 -2
  134. package/view/renderModel.js +1 -1
  135. package/view/tooltip/TooltipView.js +5 -5
  136. package/core/process/task/TaskUtils.js +0 -352
@@ -0,0 +1,45 @@
1
+ import Task from "../Task.js";
2
+ import { TaskSignal } from "../TaskSignal.js";
3
+ import { clamp01 } from "../../../math/clamp01.js";
4
+
5
+ /**
6
+ *
7
+ * @param {number} delay in milliseconds
8
+ * @param {string} [name]
9
+ * @returns {Task}
10
+ */
11
+ export function delayTask(delay, name = "unnamed") {
12
+ let startTime = -1;
13
+
14
+ const estimatedDuration = delay / 1000;
15
+ return new Task({
16
+ name: `delay (${delay}ms): ${name}`,
17
+ initializer() {
18
+ startTime = Date.now();
19
+ },
20
+ cycleFunction() {
21
+ if (Date.now() >= startTime + delay) {
22
+ return TaskSignal.EndSuccess;
23
+ } else {
24
+ return TaskSignal.Yield;
25
+ }
26
+ },
27
+ computeProgress() {
28
+ if (startTime === -1) {
29
+ return 0;
30
+ }
31
+
32
+ const currentTime = Date.now();
33
+ const remainingTime = currentTime - startTime;
34
+
35
+ let fraction = remainingTime / delay;
36
+
37
+ if (Number.isNaN(fraction)) {
38
+ fraction = 0;
39
+ }
40
+
41
+ return clamp01(fraction);
42
+ },
43
+ estimatedDuration
44
+ });
45
+ }
@@ -0,0 +1,19 @@
1
+ import Task from "../Task.js";
2
+ import { TaskSignal } from "../TaskSignal.js";
3
+
4
+ /**
5
+ * Does nothing, useful when a task is required but no work is needed
6
+ * @param {string} [name="no-operation"]
7
+ * @returns {Task}
8
+ */
9
+ export function emptyTask(name = "no-operation") {
10
+ return new Task({
11
+ name,
12
+ cycleFunction: function () {
13
+ return TaskSignal.EndSuccess;
14
+ },
15
+ computeProgress: function () {
16
+ return 1;
17
+ }
18
+ });
19
+ }
@@ -0,0 +1,17 @@
1
+ import Task from "../Task.js";
2
+
3
+ /**
4
+ * Always fails by throwing an object that was given (typically an Error instance)
5
+ * @param {*} e value to be thrown
6
+ */
7
+ export function failingTask(e) {
8
+ return new Task({
9
+ name: "Failing Task",
10
+ cycleFunction: function () {
11
+ throw e;
12
+ },
13
+ computeProgress: function () {
14
+ return 0;
15
+ }
16
+ });
17
+ }
@@ -0,0 +1,48 @@
1
+ import { TaskSignal } from "../TaskSignal.js";
2
+ import Task from "../Task.js";
3
+
4
+ /**
5
+ *
6
+ * @param {Future} future
7
+ * @param {String} name
8
+ * @returns {Task}
9
+ */
10
+ export function futureTask(future, name) {
11
+ if (typeof future.resolve !== 'function') {
12
+ // Not a future
13
+ throw new Error("No resolve function on the supplied object");
14
+ }
15
+
16
+ let resolved = false;
17
+ let rejected = false;
18
+ let error = null;
19
+
20
+ future.then(function () {
21
+ resolved = true;
22
+ }, function (e) {
23
+ rejected = true;
24
+ error = e;
25
+ });
26
+
27
+ function cycle() {
28
+ future.resolve();
29
+ if (resolved) {
30
+ return TaskSignal.EndSuccess;
31
+ } else if (rejected) {
32
+ throw error;
33
+ } else {
34
+ //give up CPU share
35
+ return TaskSignal.Yield;
36
+ }
37
+ }
38
+
39
+ function progress() {
40
+ return resolved ? 1 : 0;
41
+ }
42
+
43
+ return new Task({
44
+ name: name,
45
+ cycleFunction: cycle,
46
+ computeProgress: progress
47
+ });
48
+ }
@@ -0,0 +1,42 @@
1
+ import { TaskSignal } from "../TaskSignal.js";
2
+ import Task from "../Task.js";
3
+
4
+ /**
5
+ *
6
+ * @param {Promise} promise
7
+ * @param {string} name
8
+ * @returns {Task}
9
+ */
10
+ export function promiseTask(promise, name) {
11
+ let resolved = false;
12
+ let rejected = false;
13
+ let error = null;
14
+
15
+ promise.then(function () {
16
+ resolved = true;
17
+ }, function (e) {
18
+ rejected = true;
19
+ error = e;
20
+ });
21
+
22
+ function cycle() {
23
+ if (resolved) {
24
+ return TaskSignal.EndSuccess;
25
+ } else if (rejected) {
26
+ throw error;
27
+ } else {
28
+ //give up CPU share
29
+ return TaskSignal.Yield;
30
+ }
31
+ }
32
+
33
+ function progress() {
34
+ return resolved ? 1 : 0;
35
+ }
36
+
37
+ return new Task({
38
+ name: name,
39
+ cycleFunction: cycle,
40
+ computeProgress: progress
41
+ });
42
+ }
@@ -0,0 +1,64 @@
1
+ import { seededRandom } from "../../../math/random/seededRandom.js";
2
+ import { TaskSignal } from "../TaskSignal.js";
3
+ import Task from "../Task.js";
4
+ import { randomizeArrayElementOrder } from "../../../collection/ArrayUtils.js";
5
+
6
+ /**
7
+ *
8
+ * @param {number} seed RNG seed
9
+ * @param {number|function(*):number} initial
10
+ * @param {number|function(*):number} limit
11
+ * @param {function(index:int)} callback
12
+ * @returns {Task}
13
+ */
14
+ export function randomCountTask(seed, initial, limit, callback) {
15
+
16
+ const random = seededRandom(seed);
17
+
18
+ const span = limit - initial;
19
+
20
+ const sequence = new Uint16Array(span);
21
+
22
+ let i = 0;
23
+
24
+ function cycle() {
25
+ if (i >= span) {
26
+ return TaskSignal.EndSuccess;
27
+ }
28
+
29
+ const order = sequence[i];
30
+
31
+ const index = order + initial;
32
+
33
+ callback(index);
34
+
35
+ i++;
36
+
37
+ return TaskSignal.Continue;
38
+ }
39
+
40
+ return new Task({
41
+ name: `Count ${initial} -> ${limit}`,
42
+ initializer() {
43
+
44
+ i = 0;
45
+
46
+ //generate sequence
47
+ for (let i = 0; i < span; i++) {
48
+ sequence[i] = i;
49
+ }
50
+
51
+ //shuffle
52
+ randomizeArrayElementOrder(random, sequence);
53
+ },
54
+ cycleFunction: cycle,
55
+ computeProgress: function () {
56
+
57
+ if (span === 0) {
58
+ return 0;
59
+ }
60
+
61
+ return i / span;
62
+ }
63
+ });
64
+ }
@@ -0,0 +1,47 @@
1
+ import Task from "../Task.js";
2
+ import { TaskSignal } from "../TaskSignal.js";
3
+
4
+ /**
5
+ *
6
+ * @param {Task} task
7
+ * @returns {Task}
8
+ */
9
+ export function wrapTaskIgnoreFailure(task) {
10
+ let initializationFailed = false;
11
+
12
+ const wrapper = new Task({
13
+ name: `Ignore Failure of [${task.name}]`,
14
+ initializer() {
15
+ try {
16
+ task.initialize();
17
+ } catch (e) {
18
+ initializationFailed = true;
19
+ console.warn(e);
20
+ }
21
+ },
22
+ estimatedDuration: task.estimatedDuration,
23
+ cycleFunction() {
24
+
25
+ task.__executedCpuTime = wrapper.__executedCpuTime;
26
+ task.__executedCycleCount = wrapper.__executedCycleCount;
27
+
28
+ if (initializationFailed) {
29
+ //initializer failed, don't execute the source task
30
+ return TaskSignal.EndSuccess;
31
+ }
32
+
33
+ const c = task.cycle();
34
+
35
+ if (c === TaskSignal.EndFailure) {
36
+ return TaskSignal.EndSuccess;
37
+ }
38
+
39
+ return c;
40
+ },
41
+ computeProgress() {
42
+ return task.computeProgress();
43
+ }
44
+ });
45
+
46
+ return wrapper;
47
+ }
package/engine/Engine.js CHANGED
@@ -11,10 +11,8 @@ import SoundEngine from './sound/SoundEngine.js';
11
11
  import { PerspectiveCamera as ThreePerspectiveCamera } from 'three';
12
12
  import { PointerDevice } from "./input/devices/PointerDevice.js";
13
13
  import KeyboardDevice from "./input/devices/KeyboardDevice.js";
14
- import Grid from './grid/Grid.js';
15
14
  import Preloader from "./asset/preloader/Preloader.js";
16
15
  import SceneManager from "./scene/SceneManager.js";
17
- import CompressionService from "./compression/CompressionService.js";
18
16
 
19
17
  import GUIEngine from './ui/GUIEngine.js';
20
18
  import { EntityManager } from "./ecs/EntityManager.js";
@@ -189,9 +187,10 @@ class Engine {
189
187
  this.settings = new EngineSettings();
190
188
 
191
189
 
192
- this.services = {
193
- compression: new CompressionService()
194
- };
190
+ /**
191
+ * @deprecated use plugins instead
192
+ */
193
+ this.services = {};
195
194
 
196
195
  /**
197
196
  *
@@ -251,9 +250,6 @@ class Engine {
251
250
  */
252
251
  this.sceneManager = new SceneManager(this.entityManager, this.ticker.clock);
253
252
 
254
- //
255
- this.grid = new Grid(this);
256
-
257
253
  this.initializeViews();
258
254
 
259
255
  this.devices = {
@@ -281,6 +277,10 @@ class Engine {
281
277
  this.plugins.initialize(this);
282
278
  }
283
279
 
280
+ get grid() {
281
+ throw new Error('Deprecated, use systems/components to achieve the same functionality as before');
282
+ }
283
+
284
284
  initializeViews() {
285
285
 
286
286
  const viewport = this.graphics.viewport;
@@ -41,7 +41,7 @@ export class EngineBootstrapper {
41
41
 
42
42
  const frameRunner = new FrameRunner(() => {
43
43
  vExecutionEngineState.updateText(`Executor: ${engine.executor.queueReady.length} ready, ${engine.executor.queueUnresolved.length} unresolved`);
44
- vAssetManagerState.updateText(`Assets: ${engine.assetManager.assets.size} loaded, ${engine.assetManager.requestMap.size} pending`);
44
+ vAssetManagerState.updateText(`Assets: ${engine.assetManager.assets.size} loaded, ${engine.assetManager.request_map.size} pending`);
45
45
  });
46
46
 
47
47
  frameRunner.startup();