@woosh/meep-engine 2.51.0 → 2.53.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 (160) hide show
  1. package/editor/actions/concrete/WriteGridValueAction.js +1 -1
  2. package/editor/ecs/component/prototypeObjectEditor.js +1 -1
  3. package/editor/process/ObstacleGridDisplayProcess.js +2 -2
  4. package/editor/process/symbolic/makeGridPositionSymbolDisplay.js +1 -1
  5. package/editor/tools/GridPaintTool.js +2 -2
  6. package/package.json +4 -3
  7. package/samples/generation/SampleGenerator0.js +1 -1
  8. package/samples/generation/generators/interactive/mir_generator_place_buff_objects.js +1 -1
  9. package/samples/generation/generators/mir_generator_place_bases.js +1 -1
  10. package/samples/generation/generators/mir_generator_place_road_decorators.js +1 -1
  11. package/samples/generation/generators/mir_generator_place_starting_point.js +1 -1
  12. package/samples/generation/main.js +2 -2
  13. package/samples/generation/rules/matcher_play_area.js +1 -1
  14. package/samples/generation/rules/matcher_tag_occupied.js +1 -1
  15. package/samples/generation/rules/matcher_tag_traversable.js +1 -1
  16. package/samples/generation/themes/SampleTheme0.js +5 -5
  17. package/src/core/NumberFormat.js +0 -71
  18. package/src/core/bvh2/bvh3/ExplicitBinaryBoundingVolumeHierarchy.js +1 -0
  19. package/src/core/bvh2/bvh3/query/BVHQueryAny.js +16 -0
  20. package/src/core/bvh2/bvh3/query/bvh_collect_user_data.js +5 -5
  21. package/src/core/bvh2/bvh3/query/bvh_query_leaves_generic.js +2 -3
  22. package/src/core/bvh2/bvh3/query/bvh_query_leaves_generic.spec.js +22 -0
  23. package/src/core/bvh2/bvh3/query/bvh_query_leaves_ray.js +2 -2
  24. package/src/core/bvh2/bvh3/query/bvh_query_leaves_ray.spec.js +64 -0
  25. package/src/core/bvh2/bvh3/query/bvh_query_user_data_generic.js +2 -3
  26. package/src/core/collection/table/RowFirstTableSpec.js +8 -4
  27. package/src/core/geom/3d/aabb/aabb3_from_threejs_geometry.js +41 -0
  28. package/src/core/geom/3d/matrix/MATRIX_4_IDENTITY.spec.js +10 -0
  29. package/src/core/geom/3d/topology/struct/TopoMesh.js +3 -2
  30. package/src/core/geom/3d/topology/struct/prototypeBinaryTopology.js +4 -4
  31. package/src/core/geom/Vector2.d.ts +9 -0
  32. package/src/core/geom/Vector2.js +8 -22
  33. package/src/core/geom/Vector2.spec.js +153 -0
  34. package/src/core/model/ModuleRegistry.js +2 -4
  35. package/src/core/model/ModuleRegistry.spec.js +31 -0
  36. package/src/core/model/reactive/js/compileReactiveToJS.spec.js +14 -0
  37. package/src/core/model/reactive/model/logic/ReactiveAnd.spec.js +31 -1
  38. package/src/core/model/reactive/model/logic/ReactiveOr.spec.js +53 -0
  39. package/src/core/model/stat/LinearModifier.js +2 -2
  40. package/src/core/model/stat/LinearModifier.spec.js +62 -0
  41. package/src/core/model/stat/Stat.js +12 -0
  42. package/src/core/model/stat/Stat.spec.js +36 -0
  43. package/src/core/primitives/array/computeStridedIntegerArrayHash.spec.js +28 -0
  44. package/src/core/primitives/numbers/number_format_by_thousands.js +14 -0
  45. package/src/core/primitives/numbers/number_pretty_print.js +49 -0
  46. package/src/core/primitives/strings/computeStringHash.spec.js +12 -5
  47. package/src/core/process/BaseProcess.js +8 -8
  48. package/src/engine/Clock.js +30 -29
  49. package/src/engine/Clock.spec.js +26 -0
  50. package/src/engine/Engine.spec.js +4 -0
  51. package/src/engine/ecs/EntityBuilder.js +3 -1
  52. package/src/engine/ecs/EntityBuilder.spec.js +21 -0
  53. package/src/engine/ecs/EntityComponentDataset.js +1 -1
  54. package/src/engine/ecs/EntityObserver.spec.js +1 -1
  55. package/src/engine/ecs/dynamic_actions/actions/definition/{WhiteToBlackboardActionDescription.js → WriteToBlackboardActionDescription.js} +2 -2
  56. package/src/engine/ecs/dynamic_actions/actions/definition/deserializeActionFromJSON.js +2 -2
  57. package/src/engine/ecs/gui/GUIElement.js +1 -1
  58. package/src/engine/ecs/gui/position/ViewportPosition.js +3 -3
  59. package/src/engine/ecs/guid/GUIDSerializationAdapter.spec.js +21 -0
  60. package/src/engine/ecs/parent/EntityNode.js +1 -1
  61. package/src/engine/ecs/parent/EntityNode.spec.js +104 -0
  62. package/src/engine/ecs/speaker/Voice.js +4 -0
  63. package/src/engine/ecs/team/Team.js +0 -44
  64. package/src/engine/ecs/team/TeamSerializationAdapter.js +46 -0
  65. package/src/engine/ecs/terrain/ecs/TerrainClassifier.js +1 -1
  66. package/src/engine/ecs/terrain/ecs/layers/TerrainLayers.js +1 -1
  67. package/src/engine/ecs/transform/Transform.js +2 -1
  68. package/src/engine/ecs/transform/Transform.spec.js +24 -0
  69. package/src/engine/graphics/camera/testClippingPlaneComputation.js +2 -6
  70. package/src/engine/graphics/ecs/animation/animator/graph/AnimationGraph.spec.js +5 -0
  71. package/src/engine/graphics/ecs/animation/animator/graph/definition/AnimationGraphDefinition.js +24 -25
  72. package/src/engine/graphics/ecs/animation/animator/graph/definition/AnimationGraphDefinition.spec.js +5 -0
  73. package/src/engine/graphics/ecs/decal/DecalSystem.js +2 -20
  74. package/src/engine/graphics/ecs/decal/v2/Decal.js +32 -32
  75. package/src/engine/graphics/ecs/decal/v2/Decal.spec.js +5 -0
  76. package/src/engine/graphics/ecs/decal/v2/FPDecalSystem.js +4 -2
  77. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +4 -33
  78. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.js +8 -4
  79. package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMesh.spec.js +5 -0
  80. package/src/engine/graphics/ecs/mesh-v2/sample/prototypeShadedGeometry.js +0 -12
  81. package/src/engine/graphics/ecs/path/testPathDisplaySystem.js +0 -2
  82. package/src/engine/graphics/ecs/path/tube/prototypeAnimatedPathMask.js +2 -6
  83. package/src/engine/graphics/ecs/water2/shader/testWaterShader.js +2 -4
  84. package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.js +1 -1
  85. package/src/engine/graphics/particles/particular/engine/utils/volume/prototypeParticleVolume.js +0 -2
  86. package/src/engine/graphics/render/buffer/buffers/prototypeNormalFrameBuffer.js +2 -6
  87. package/src/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +2 -6
  88. package/src/engine/graphics/render/forward_plus/prototype/prototypeLightManager.js +2 -2
  89. package/src/engine/graphics/render/visibility/hiz/prototypeHiZ.js +4 -8
  90. package/src/engine/graphics/sh3/path_tracer/GeometryBVHBatched.js +2 -1
  91. package/src/engine/graphics/sh3/path_tracer/PathTracer.js +6 -1
  92. package/src/engine/graphics/sh3/path_tracer/prototypePathTracer.js +2 -2
  93. package/src/engine/graphics/shadows/testShadowMapRendering.js +0 -2
  94. package/src/engine/graphics/texture/TextureBackedMemoryRegion.js +4 -1
  95. package/src/engine/graphics/texture/sampler/Sampler2D.js +1 -1
  96. package/src/engine/graphics/texture/sampler/filter/filter_lanczos3.js +7 -2
  97. package/src/engine/graphics/three/expand_aabb_by_transformed_three_object.js +3 -23
  98. package/src/engine/grid/grid2transform/GridPosition2Transform.js +122 -0
  99. package/src/engine/grid/grid2transform/GridPosition2TransformSerializationAdapter.js +70 -0
  100. package/src/engine/grid/grid2transform/GridPosition2TransformSerializationUpgrader_0_1.js +40 -0
  101. package/src/engine/grid/{systems → grid2transform}/GridPosition2TransformSystem.js +3 -3
  102. package/src/engine/grid/{components → obstacle}/GridObstacle.js +45 -25
  103. package/src/engine/grid/obstacle/GridObstacle.spec.js +175 -0
  104. package/src/engine/grid/{components → position}/GridPosition.js +6 -14
  105. package/src/engine/grid/{systems → position}/GridPositionSystem.js +1 -1
  106. package/src/engine/grid/transform2grid/Transform2GridPositionSystem.js +1 -1
  107. package/src/engine/input/devices/PointerDevice.spec.js +5 -0
  108. package/src/engine/navigation/ecs/components/computeCatmullRomSpline.js +5 -1
  109. package/src/engine/navigation/ecs/path_following/PathFollower.js +40 -32
  110. package/src/engine/navigation/ecs/path_following/PathFollower.spec.js +27 -0
  111. package/src/engine/plugin/EnginePlugin.js +12 -14
  112. package/src/engine/plugin/EnginePlugin.spec.js +5 -0
  113. package/src/engine/plugin/EnginePluginManager.js +18 -22
  114. package/src/engine/scene/transitionToScene.js +12 -1
  115. package/src/engine/simulation/Ticker.js +1 -1
  116. package/src/generation/filtering/CellFilter.js +6 -9
  117. package/src/generation/filtering/boolean/CellFilterLiteralBoolean.js +1 -4
  118. package/src/generation/filtering/core/CellFilterBinaryOperation.js +12 -15
  119. package/src/generation/filtering/core/CellFilterOperationTertiary.js +15 -19
  120. package/src/generation/filtering/numeric/CellFilterLiteralFloat.js +6 -9
  121. package/src/generation/grid/actions/ContinuousGridCellActionSetTerrainObstacle.js +1 -1
  122. package/src/generation/grid/actions/ContinuousGridCellActionWriteObstacle.js +2 -2
  123. package/src/generation/grid/generation/road/GridTaskGenerateRoads.js +1 -1
  124. package/src/generation/markers/actions/MarkerNodeActionEntityPlacement.js +1 -1
  125. package/src/generation/theme/TerrainLayerDescription.js +1 -1
  126. package/src/view/common/LabelView.js +3 -3
  127. package/src/engine/ecs/components/AimController.js +0 -18
  128. package/src/engine/ecs/components/Attacker.js +0 -13
  129. package/src/engine/ecs/components/MeshCollider.js +0 -15
  130. package/src/engine/ecs/components/RangedAttack.js +0 -12
  131. package/src/engine/ecs/components/TargetAI.js +0 -11
  132. package/src/engine/ecs/components/ViewportMeshProjection.js +0 -18
  133. package/src/engine/ecs/systems/AimControllerSystem.js +0 -63
  134. package/src/engine/ecs/systems/AttackerSystem.js +0 -67
  135. package/src/engine/ecs/systems/MeshColliderSystem.js +0 -47
  136. package/src/engine/ecs/systems/MonsterAISystem.js +0 -163
  137. package/src/engine/ecs/systems/MortalitySystem.js +0 -46
  138. package/src/engine/ecs/systems/RangedAttackSystem.js +0 -132
  139. package/src/engine/ecs/systems/SerializationMetadataSystem.js +0 -10
  140. package/src/engine/ecs/systems/TargetAISystem.js +0 -107
  141. package/src/engine/ecs/systems/ViewportMeshProjectionSystem.js +0 -68
  142. package/src/engine/graphics/particles/ParticleEmitterLibrary.js +0 -87
  143. package/src/engine/graphics/texture/ExportCanvasAsPNG.js +0 -7
  144. package/src/engine/grid/components/GridObstacle.spec.js +0 -46
  145. package/src/engine/grid/components/GridPosition2Transform.js +0 -232
  146. package/src/engine/grid/components/ViewportGridProjection.js +0 -20
  147. package/src/engine/grid/systems/GridObstacleSystem.js +0 -58
  148. package/src/engine/grid/systems/ViewportGridProjectionSystem.js +0 -105
  149. package/src/engine/navigation/PathFinder.js +0 -172
  150. package/src/engine/navigation/PathWorker.js +0 -78
  151. package/src/engine/navigation/ecs/systems/PathFinderSystem.js +0 -63
  152. package/src/engine/navigation/ecs/systems/PathSystem.js +0 -19
  153. package/src/engine/navigation/funnel/Funnel.js +0 -196
  154. package/src/generation/ZoneNode.js +0 -9
  155. /package/{src/generation → samples/generation/grid}/GridTags.js +0 -0
  156. /package/src/{engine → core/primitives/array}/computeStridedIntegerArrayHash.js +0 -0
  157. /package/src/engine/grid/{components → grid2transform}/GridPosition2TransformFlags.js +0 -0
  158. /package/src/engine/grid/{components → obstacle}/GridObstacleSerializationAdapter.js +0 -0
  159. /package/src/engine/grid/{components → position}/GridPositionSerializationAdapter.js +0 -0
  160. /package/src/engine/grid/{components → position}/GridPositionSerializationUpdater_0_1.js +0 -0
@@ -5,15 +5,20 @@ export function filter_lanczos3(x) {
5
5
  // x = -x;
6
6
  // }
7
7
 
8
- if (x > 3) {
8
+ const lobes = 3;
9
+
10
+ if (x > lobes) {
9
11
  return 0;
10
12
  }
11
13
 
12
14
  if (x < 1.1920929e-7) {
15
+ // distance is very close to 0
13
16
  return 1;
14
17
  }
15
18
 
16
- return (3 * Math.sin(Math.PI * x) * Math.sin(Math.PI * x / 3)) / (Math.PI * Math.PI * x * x);
19
+ const px = Math.PI * x;
20
+
21
+ return (lobes * Math.sin(px) * Math.sin(px / lobes)) / (px * px);
17
22
 
18
23
  }
19
24
 
@@ -2,6 +2,7 @@ import { ensureGeometryBoundingBox } from "../util/ensureGeometryBoundingBox.js"
2
2
  import { aabb3_matrix4_project } from "../../../core/geom/3d/aabb/aabb3_matrix4_project.js";
3
3
  import { aabb3_array_combine } from "../../../core/geom/3d/aabb/aabb3_array_combine.js";
4
4
  import { m4_multiply } from "../../../core/geom/3d/matrix/m4_multiply.js";
5
+ import { aabb3_from_threejs_geometry } from "../../../core/geom/3d/aabb/aabb3_from_threejs_geometry.js";
5
6
 
6
7
  const scratch_aabb3_array_0 = new Float32Array(6);
7
8
  const scratch_aabb3_array_1 = new Float32Array(6);
@@ -10,7 +11,7 @@ const scratch_aabb3_array_1 = new Float32Array(6);
10
11
  *
11
12
  * @param {number[]|Float32Array} result
12
13
  * @param {Object3D} object
13
- * @param {number[]|Float32Array} transform
14
+ * @param {number[]|Float32Array} transform 4x4 transform matrix to be used as a root transform instead of whatever is set on the object, this lets us compute local-space bounds without having to modify the source object
14
15
  */
15
16
  export function expand_aabb_by_transformed_three_object(result, object, transform) {
16
17
 
@@ -22,28 +23,7 @@ export function expand_aabb_by_transformed_three_object(result, object, transfor
22
23
  if (geometry !== undefined) {
23
24
 
24
25
  ensureGeometryBoundingBox(geometry);
25
-
26
- const gbb = geometry.boundingBox;
27
-
28
- const min = gbb.min;
29
-
30
- const x0 = min.x;
31
- const y0 = min.y;
32
- const z0 = min.z;
33
-
34
- const max = gbb.max;
35
-
36
- const x1 = max.x;
37
- const y1 = max.y;
38
- const z1 = max.z;
39
-
40
- scratch_aabb3_array_0[0] = x0;
41
- scratch_aabb3_array_0[1] = y0;
42
- scratch_aabb3_array_0[2] = z0;
43
-
44
- scratch_aabb3_array_0[3] = x1;
45
- scratch_aabb3_array_0[4] = y1;
46
- scratch_aabb3_array_0[5] = z1;
26
+ aabb3_from_threejs_geometry(scratch_aabb3_array_0,geometry);
47
27
 
48
28
  aabb3_matrix4_project(scratch_aabb3_array_1, scratch_aabb3_array_0, transform);
49
29
 
@@ -0,0 +1,122 @@
1
+ import Vector2 from "../../../core/geom/Vector2.js";
2
+ import { GridPosition2TransformFlags } from "./GridPosition2TransformFlags.js";
3
+
4
+ /**
5
+ * Created by Alex on 20/01/2015.
6
+ */
7
+
8
+
9
+ const DEFAULT_FLAGS = GridPosition2TransformFlags.Immediate;
10
+
11
+ export class GridPosition2Transform {
12
+ constructor() {
13
+ /**
14
+ *
15
+ * @type {Vector2}
16
+ */
17
+ this.offset = new Vector2(0, 0);
18
+
19
+ /**
20
+ *
21
+ * @type {GridPosition2TransformFlags|number}
22
+ */
23
+ this.flags = DEFAULT_FLAGS;
24
+ }
25
+
26
+ /**
27
+ *
28
+ * @param {number|GridPosition2TransformFlags} flag
29
+ * @returns {void}
30
+ */
31
+ setFlag(flag) {
32
+ this.flags |= flag;
33
+ }
34
+
35
+ /**
36
+ *
37
+ * @param {number|GridPosition2TransformFlags} flag
38
+ * @returns {void}
39
+ */
40
+ clearFlag(flag) {
41
+ this.flags &= ~flag;
42
+ }
43
+
44
+ /**
45
+ *
46
+ * @param {number|GridPosition2TransformFlags} flag
47
+ * @param {boolean} value
48
+ */
49
+ writeFlag(flag, value) {
50
+ if (value) {
51
+ this.setFlag(flag);
52
+ } else {
53
+ this.clearFlag(flag);
54
+ }
55
+ }
56
+
57
+ /**
58
+ *
59
+ * @param {number|GridPosition2TransformFlags} flag
60
+ * @returns {boolean}
61
+ */
62
+ getFlag(flag) {
63
+ return (this.flags & flag) === flag;
64
+ }
65
+
66
+ toJSON() {
67
+ return {
68
+ offset: this.offset.toJSON()
69
+ };
70
+ }
71
+
72
+ fromJSON(obj) {
73
+
74
+ if (typeof obj.offset === "object") {
75
+ this.offset.fromJSON(obj.offset);
76
+ } else {
77
+ this.offset.set(0, 0);
78
+ }
79
+
80
+ }
81
+
82
+ /**
83
+ *
84
+ * @param {GridPosition2Transform} other
85
+ */
86
+ copy(other) {
87
+ this.offset.copy(other.offset);
88
+
89
+ return this;
90
+ }
91
+
92
+ /**
93
+ *
94
+ * @returns {GridPosition2Transform}
95
+ */
96
+ clone() {
97
+ const clone = new GridPosition2Transform();
98
+
99
+ clone.copy(this);
100
+
101
+ return clone;
102
+ }
103
+
104
+ /**
105
+ *
106
+ * @param {GridPosition2Transform} other
107
+ * @returns {boolean}
108
+ */
109
+ equals(other) {
110
+ return this.offset.equals(other.offset);
111
+ }
112
+
113
+ /**
114
+ * @returns {number}
115
+ */
116
+ hash() {
117
+ return this.offset.hash();
118
+ }
119
+
120
+ }
121
+
122
+ GridPosition2Transform.typeName = "GridPosition2Transform";
@@ -0,0 +1,70 @@
1
+ import { BinaryClassSerializationAdapter } from "../../ecs/storage/binary/BinaryClassSerializationAdapter.js";
2
+ import { GridPosition2Transform } from "./GridPosition2Transform.js";
3
+
4
+ export class GridPosition2TransformSerializationAdapter extends BinaryClassSerializationAdapter {
5
+ constructor() {
6
+ super();
7
+
8
+ this.klass = GridPosition2Transform;
9
+ this.version = 1;
10
+ }
11
+
12
+ /**
13
+ *
14
+ * @param {BinaryBuffer} buffer
15
+ * @param {GridPosition2Transform} value
16
+ */
17
+ serialize(buffer, value) {
18
+ const offsetX = value.offset.x;
19
+ const offsetY = value.offset.y;
20
+
21
+ let header = 3;
22
+ if (offsetX === 0 && offsetY === 0) {
23
+ header = 0;
24
+ } else if (offsetX === 0) {
25
+ header = 2;
26
+ } else if (offsetY === 0) {
27
+ header = 1;
28
+ } else {
29
+ //both coordinates are present
30
+ header = 3;
31
+ }
32
+
33
+ buffer.writeUint8(header);
34
+
35
+ if ((header & 1) !== 0) {
36
+ //write X
37
+ buffer.writeFloat32(offsetX);
38
+ }
39
+
40
+ if ((header & 2) !== 0) {
41
+ //write Y
42
+ buffer.writeFloat32(offsetY);
43
+ }
44
+ }
45
+
46
+ /**
47
+ *
48
+ * @param {BinaryBuffer} buffer
49
+ * @param {GridPosition2Transform} value
50
+ */
51
+ deserialize(buffer, value) {
52
+ //read header
53
+ const header = buffer.readUint8();
54
+
55
+
56
+ let offsetX = 0, offsetY = 0;
57
+
58
+ if ((header & 1) !== 0) {
59
+ //write X
60
+ offsetX = buffer.readFloat32();
61
+ }
62
+
63
+ if ((header & 2) !== 0) {
64
+ //write Y
65
+ offsetY = buffer.readFloat32();
66
+ }
67
+
68
+ value.offset.set(offsetX, offsetY);
69
+ }
70
+ }
@@ -0,0 +1,40 @@
1
+ import { BinaryClassUpgrader } from "../../ecs/storage/binary/BinaryClassUpgrader.js";
2
+
3
+ export class GridPosition2TransformSerializationUpgrader_0_1 extends BinaryClassUpgrader {
4
+ constructor() {
5
+ super();
6
+
7
+ //
8
+ this.__startVersion = 0;
9
+ this.__targetVersion = 1;
10
+ }
11
+
12
+ upgrade(source, target) {
13
+ const offsetX = source.readFloat64();
14
+ const offsetY = source.readFloat64();
15
+
16
+ let header = 3;
17
+ if (offsetX === 0 && offsetY === 0) {
18
+ header = 0;
19
+ } else if (offsetX === 0) {
20
+ header = 2;
21
+ } else if (offsetY === 0) {
22
+ header = 1;
23
+ } else {
24
+ //both coordinates are present
25
+ header = 3;
26
+ }
27
+
28
+ target.writeUint8(header);
29
+
30
+ if ((header & 1) !== 0) {
31
+ //write X
32
+ target.writeFloat32(offsetX);
33
+ }
34
+
35
+ if ((header & 2) !== 0) {
36
+ //write Y
37
+ target.writeFloat32(offsetY);
38
+ }
39
+ }
40
+ }
@@ -3,10 +3,10 @@
3
3
  */
4
4
  import { System } from '../../ecs/System.js';
5
5
  import { Transform } from '../../ecs/transform/Transform.js';
6
- import GridPosition from '../components/GridPosition.js';
7
- import { GridPosition2Transform } from '../components/GridPosition2Transform.js';
6
+ import GridPosition from '../position/GridPosition.js';
7
+ import { GridPosition2Transform } from './GridPosition2Transform.js';
8
8
  import Vector3 from "../../../core/geom/Vector3.js";
9
- import { GridPosition2TransformFlags } from "../components/GridPosition2TransformFlags.js";
9
+ import { GridPosition2TransformFlags } from "./GridPosition2TransformFlags.js";
10
10
  import { obtainTerrain } from "../../ecs/terrain/util/obtainTerrain.js";
11
11
  import { ResourceAccessSpecification } from "../../../core/model/ResourceAccessSpecification.js";
12
12
  import { ResourceAccessKind } from "../../../core/model/ResourceAccessKind.js";
@@ -10,10 +10,13 @@ import { isArrayEqualStrict } from "../../../core/collection/array/isArrayEqualS
10
10
  import { computeHashIntegerArray } from "../../../core/collection/array/computeHashIntegerArray.js";
11
11
 
12
12
  class GridObstacle {
13
- constructor() {
14
- this.data = [1];
15
- this.size = new Vector2(1, 1);
16
- }
13
+ data = [1];
14
+
15
+ /**
16
+ * @readonly
17
+ * @type {Vector2}
18
+ */
19
+ size = new Vector2(1, 1);
17
20
 
18
21
  /**
19
22
  *
@@ -21,8 +24,8 @@ class GridObstacle {
21
24
  * @param {number} h
22
25
  */
23
26
  resize(w, h) {
24
- assert.ok(Number.isInteger(w) && w >= 0, `expected non-negative integer, got ${w}`);
25
- assert.ok(Number.isInteger(h) && h >= 0, `expected non-negative integer, got ${h}`);
27
+ assert.isNonNegativeInteger(w, 'w');
28
+ assert.isNonNegativeInteger(h, 'h');
26
29
 
27
30
  const x1 = this.size.x;
28
31
  const y1 = this.size.y;
@@ -61,9 +64,9 @@ class GridObstacle {
61
64
  * @param {*} [thisArg]
62
65
  */
63
66
  traverseMask(offsetX, offsetY, visitor, thisArg) {
64
- assert.typeOf(offsetX, 'number', 'offsetX');
65
- assert.typeOf(offsetY, 'number', 'offsetY');
66
- assert.typeOf(visitor, 'function', 'visitor');
67
+ assert.isNumber(offsetX, 'offsetX');
68
+ assert.isNumber(offsetY, 'offsetY');
69
+ assert.isFunction(visitor, 'visitor');
67
70
 
68
71
  const size = this.size;
69
72
  const sX = size.x;
@@ -100,11 +103,11 @@ class GridObstacle {
100
103
  * @returns {number}
101
104
  */
102
105
  readPoint(x, y) {
103
- assert.typeOf(x, 'number', 'x');
104
- assert.typeOf(y, 'number', 'y');
106
+ assert.isNumber(x, 'x');
107
+ assert.isNumber(y, 'y');
105
108
 
106
- assert.ok(Number.isInteger(x), `expected x to be an integer, got ${x} instead`);
107
- assert.ok(Number.isInteger(y), `expected y to be an integer, got ${y} instead`);
109
+ assert.isInteger(x, 'x');
110
+ assert.isInteger(y, 'y');
108
111
 
109
112
  const index = y * this.size.x + x;
110
113
  return this.data[index];
@@ -117,6 +120,9 @@ class GridObstacle {
117
120
  * @param {number} value
118
121
  */
119
122
  writePoint(x, y, value) {
123
+ assert.isNonNegativeInteger(value, 'value');
124
+ assert.lessThanOrEqual(value, 255);
125
+
120
126
  const index = y * this.size.x + x;
121
127
 
122
128
  this.data[index] = value;
@@ -129,8 +135,8 @@ class GridObstacle {
129
135
  * @returns {boolean}
130
136
  */
131
137
  isPointWithin(x, y) {
132
- assert.typeOf(x, 'number', 'x');
133
- assert.typeOf(y, 'number', 'y');
138
+ assert.isNumber(x, 'x');
139
+ assert.isNumber(y, 'y');
134
140
 
135
141
  const size = this.size;
136
142
 
@@ -141,18 +147,20 @@ class GridObstacle {
141
147
  }
142
148
 
143
149
  /**
144
- *
150
+ * Is a given point adjacent to a blocking cell?
145
151
  * @param {number} x Obstacle-Local X position
146
152
  * @param {number} y Obstacle-Local Y position
147
153
  * @param {number[]} adjacencyMask Mask that defines adjacency, contains pairs of number for each X,Y coordinate offset from obstacle point
148
154
  * @returns {boolean}
149
155
  */
150
156
  isPointAdjacent(x, y, adjacencyMask) {
151
- assert.typeOf(x, 'number', 'x');
152
- assert.typeOf(y, 'number', 'y');
157
+ assert.isNumber(x, 'x');
158
+ assert.isNumber(y, 'y');
159
+
160
+ assert.defined(adjacencyMask, 'mask');
161
+ assert.notNull(adjacencyMask, 'mask');
153
162
 
154
- assert.notEqual(adjacencyMask, undefined, 'mask is undefined');
155
- assert.notEqual(adjacencyMask, null, 'mask is null');
163
+ assert.isArrayLike(adjacencyMask, 'mask');
156
164
 
157
165
  const size = this.size;
158
166
 
@@ -163,7 +171,8 @@ class GridObstacle {
163
171
 
164
172
  const maskLength = adjacencyMask.length;
165
173
 
166
- assert.typeOf(maskLength, 'number', 'maskLength');
174
+ assert.isNonNegativeInteger(maskLength, 'maskLength');
175
+ assert.equal(maskLength % 2, 0, `maskLength must be a multiple of 2`);
167
176
 
168
177
 
169
178
  for (let k = 0; k < maskLength; k += 2) {
@@ -203,16 +212,27 @@ class GridObstacle {
203
212
  };
204
213
  }
205
214
 
206
- fromJSON(v) {
207
- const size = v.size;
215
+ fromJSON({ size, data }) {
216
+ assert.isArrayLike(data, 'data');
217
+
208
218
  this.size.fromJSON(size);
209
219
 
210
220
  const sX = this.size.x;
211
221
  const sY = this.size.y;
212
222
 
223
+ assert.equal(data.length, sX * sY, 'invalid array length');
224
+
213
225
  this.data = new Uint8Array(sX * sY);
214
226
 
215
- this.data.set(v.data, 0);
227
+ this.data.set(data, 0);
228
+ }
229
+
230
+ static fromJSON(j) {
231
+ const r = new GridObstacle();
232
+
233
+ r.fromJSON(j);
234
+
235
+ return r;
216
236
  }
217
237
 
218
238
  /**
@@ -221,7 +241,7 @@ class GridObstacle {
221
241
  */
222
242
  hash() {
223
243
  return computeHashIntegerArray(
224
- this.size.hashCode(),
244
+ this.size.hash(),
225
245
  computeIntegerArrayHash(this.data, 0, this.data.length)
226
246
  );
227
247
  }
@@ -0,0 +1,175 @@
1
+ import GridObstacle from "./GridObstacle.js";
2
+
3
+ test('resize 1x1 to 1x2', () => {
4
+ const g = new GridObstacle();
5
+
6
+ g.size.set(1, 1);
7
+ g.data = [7];
8
+
9
+ g.resize(1, 2);
10
+
11
+ expect(g.data[0]).toBe(7);
12
+ });
13
+
14
+ test('resize 1x1 to 2x1', () => {
15
+ const g = new GridObstacle();
16
+
17
+ g.size.set(1, 1);
18
+ g.data = [7];
19
+
20
+ g.resize(2, 1);
21
+
22
+ expect(g.data[0]).toBe(7);
23
+ });
24
+
25
+
26
+ test('resize 2x1 to 1x1', () => {
27
+ const g = new GridObstacle();
28
+
29
+ g.size.set(2, 1);
30
+ g.data = [3, 7];
31
+
32
+ g.resize(1, 1);
33
+
34
+ expect(g.data[0]).toBe(3);
35
+ });
36
+
37
+ test('resize 1x2 to 1x1', () => {
38
+ const g = new GridObstacle();
39
+
40
+ g.size.set(1, 2);
41
+ g.data = [3, 7];
42
+
43
+ g.resize(1, 1);
44
+
45
+ expect(g.data[0]).toBe(3);
46
+ });
47
+
48
+ test("readPoint", () => {
49
+ const g = new GridObstacle();
50
+
51
+ g.resize(2, 2);
52
+
53
+ g.data[0] = 1;
54
+ g.data[1] = 3;
55
+ g.data[2] = 5;
56
+ g.data[3] = 7;
57
+
58
+ expect(g.readPoint(0, 0)).toBe(1);
59
+ expect(g.readPoint(1, 0)).toBe(3);
60
+ expect(g.readPoint(0, 1)).toBe(5);
61
+ expect(g.readPoint(1, 1)).toBe(7);
62
+ });
63
+
64
+ test("writePoint", () => {
65
+
66
+ const g = new GridObstacle();
67
+
68
+ g.resize(2, 2);
69
+
70
+ g.writePoint(0, 0, 1);
71
+ g.writePoint(1, 0, 3);
72
+ g.writePoint(0, 1, 5);
73
+ g.writePoint(1, 1, 7);
74
+
75
+ expect(Array.from(g.data)).toEqual([1, 3, 5, 7]);
76
+ });
77
+
78
+
79
+ test("hash", () => {
80
+ const g = new GridObstacle();
81
+
82
+ const hash = g.hash();
83
+
84
+ expect(typeof hash).toEqual("number");
85
+ expect(Number.isInteger(hash)).toBe(true);
86
+ expect(g.hash()).toEqual(hash); // stability
87
+ });
88
+
89
+ test("to/from JSON consistency", () => {
90
+
91
+ const a = new GridObstacle();
92
+ a.resize(1, 3);
93
+
94
+ a.writePoint(0, 0, 1);
95
+ a.writePoint(0, 1, 3);
96
+ a.writePoint(0, 2, 7);
97
+
98
+ const b = new GridObstacle();
99
+
100
+ b.fromJSON(a.toJSON());
101
+
102
+ expect(b.size.x).toEqual(1);
103
+ expect(b.size.y).toEqual(3);
104
+
105
+ expect(b.readPoint(0, 0)).toEqual(1);
106
+ expect(b.readPoint(0, 1)).toEqual(3);
107
+ expect(b.readPoint(0, 2)).toEqual(7);
108
+ });
109
+
110
+ test("equals", () => {
111
+ const a = new GridObstacle();
112
+ const b = new GridObstacle();
113
+
114
+ const c = GridObstacle.fromJSON({
115
+ size: { x: 1, y: 1 },
116
+ data: [
117
+ 7
118
+ ]
119
+ });
120
+
121
+ const d = GridObstacle.fromJSON({
122
+ size: { x: 2, y: 3 },
123
+ data: [
124
+ 1, 3,
125
+ 5, 7,
126
+ 11, 13
127
+ ]
128
+ });
129
+
130
+ const f = GridObstacle.fromJSON({
131
+ size: { x: 2, y: 3 },
132
+ data: [
133
+ 1, 3,
134
+ 5, 7,
135
+ 11, 13
136
+ ]
137
+ });
138
+
139
+ const g = GridObstacle.fromJSON({
140
+ size: { x: 3, y: 2 },
141
+ data: [
142
+ 1, 3,
143
+ 5, 7,
144
+ 11, 13
145
+ ]
146
+ });
147
+
148
+ const h = GridObstacle.fromJSON({
149
+ size: { x: 3, y: 2 },
150
+ data: [
151
+ 1, 3,
152
+ 5, 7,
153
+ 17, 13
154
+ ]
155
+ });
156
+
157
+ expect(a.equals(b)).toBe(true);
158
+ expect(a.equals(c)).toBe(false);
159
+ expect(a.equals(d)).toBe(false);
160
+
161
+ expect(f.equals(g)).toBe(false);
162
+ expect(g.equals(h)).toBe(false);
163
+ });
164
+
165
+ test("isPointAdjacent", () => {
166
+ const grid = new GridObstacle();
167
+
168
+ grid.writePoint(0, 0, 7);
169
+
170
+ expect(grid.isPointAdjacent(0, 0, [0, 0])).toBe(true);
171
+
172
+ grid.writePoint(0, 0, 0);
173
+
174
+ expect(grid.isPointAdjacent(0, 0, [0, 0])).toBe(false);
175
+ });
@@ -4,24 +4,16 @@
4
4
 
5
5
  import Vector2 from '../../../core/geom/Vector2.js';
6
6
 
7
- class GridPosition extends Vector2{
8
- /**
9
- * @extends {Vector2}
10
- * @constructor
11
- */
12
- constructor() {
13
- super();
14
- }
7
+ /**
8
+ * @extends {Vector2}
9
+ * @class
10
+ */
11
+ class GridPosition extends Vector2 {
15
12
 
16
13
  /**
17
14
  *
18
- * @param {GridPosition|Vector2} other
15
+ * @return {GridPosition}
19
16
  */
20
- copy(other) {
21
- Vector2.prototype.copy.call(this, other);
22
- return this;
23
- }
24
-
25
17
  clone() {
26
18
  const clone = new GridPosition();
27
19
 
@@ -2,7 +2,7 @@
2
2
  * Created by Alex on 13/10/2014.
3
3
  */
4
4
  import { System } from '../../ecs/System.js';
5
- import GridPosition from '../components/GridPosition.js';
5
+ import GridPosition from './GridPosition.js';
6
6
  import { QuadTreeNode } from "../../../core/geom/2d/quad-tree/QuadTreeNode.js";
7
7
 
8
8
  class GridPositionSystem extends System {
@@ -1,6 +1,6 @@
1
1
  import { System } from "../../ecs/System.js";
2
2
  import { Transform2GridPosition } from "./Transform2GridPosition.js";
3
- import GridPosition from "../components/GridPosition.js";
3
+ import GridPosition from "../position/GridPosition.js";
4
4
  import { Transform } from "../../ecs/transform/Transform.js";
5
5
  import Vector2 from "../../../core/geom/Vector2.js";
6
6
  import { Transform2GridPositionMode } from "./Transform2GridPositionMode.js";