@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.
- package/editor/actions/concrete/WriteGridValueAction.js +1 -1
- package/editor/ecs/component/prototypeObjectEditor.js +1 -1
- package/editor/process/ObstacleGridDisplayProcess.js +2 -2
- package/editor/process/symbolic/makeGridPositionSymbolDisplay.js +1 -1
- package/editor/tools/GridPaintTool.js +2 -2
- package/package.json +4 -3
- package/samples/generation/SampleGenerator0.js +1 -1
- package/samples/generation/generators/interactive/mir_generator_place_buff_objects.js +1 -1
- package/samples/generation/generators/mir_generator_place_bases.js +1 -1
- package/samples/generation/generators/mir_generator_place_road_decorators.js +1 -1
- package/samples/generation/generators/mir_generator_place_starting_point.js +1 -1
- package/samples/generation/main.js +2 -2
- package/samples/generation/rules/matcher_play_area.js +1 -1
- package/samples/generation/rules/matcher_tag_occupied.js +1 -1
- package/samples/generation/rules/matcher_tag_traversable.js +1 -1
- package/samples/generation/themes/SampleTheme0.js +5 -5
- package/src/core/NumberFormat.js +0 -71
- package/src/core/bvh2/bvh3/ExplicitBinaryBoundingVolumeHierarchy.js +1 -0
- package/src/core/bvh2/bvh3/query/BVHQueryAny.js +16 -0
- package/src/core/bvh2/bvh3/query/bvh_collect_user_data.js +5 -5
- package/src/core/bvh2/bvh3/query/bvh_query_leaves_generic.js +2 -3
- package/src/core/bvh2/bvh3/query/bvh_query_leaves_generic.spec.js +22 -0
- package/src/core/bvh2/bvh3/query/bvh_query_leaves_ray.js +2 -2
- package/src/core/bvh2/bvh3/query/bvh_query_leaves_ray.spec.js +64 -0
- package/src/core/bvh2/bvh3/query/bvh_query_user_data_generic.js +2 -3
- package/src/core/collection/table/RowFirstTableSpec.js +8 -4
- package/src/core/geom/3d/aabb/aabb3_from_threejs_geometry.js +41 -0
- package/src/core/geom/3d/matrix/MATRIX_4_IDENTITY.spec.js +10 -0
- package/src/core/geom/3d/topology/struct/TopoMesh.js +3 -2
- package/src/core/geom/3d/topology/struct/prototypeBinaryTopology.js +4 -4
- package/src/core/geom/Vector2.d.ts +9 -0
- package/src/core/geom/Vector2.js +8 -22
- package/src/core/geom/Vector2.spec.js +153 -0
- package/src/core/model/ModuleRegistry.js +2 -4
- package/src/core/model/ModuleRegistry.spec.js +31 -0
- package/src/core/model/reactive/js/compileReactiveToJS.spec.js +14 -0
- package/src/core/model/reactive/model/logic/ReactiveAnd.spec.js +31 -1
- package/src/core/model/reactive/model/logic/ReactiveOr.spec.js +53 -0
- package/src/core/model/stat/LinearModifier.js +2 -2
- package/src/core/model/stat/LinearModifier.spec.js +62 -0
- package/src/core/model/stat/Stat.js +12 -0
- package/src/core/model/stat/Stat.spec.js +36 -0
- package/src/core/primitives/array/computeStridedIntegerArrayHash.spec.js +28 -0
- package/src/core/primitives/numbers/number_format_by_thousands.js +14 -0
- package/src/core/primitives/numbers/number_pretty_print.js +49 -0
- package/src/core/primitives/strings/computeStringHash.spec.js +12 -5
- package/src/core/process/BaseProcess.js +8 -8
- package/src/engine/Clock.js +30 -29
- package/src/engine/Clock.spec.js +26 -0
- package/src/engine/Engine.spec.js +4 -0
- package/src/engine/ecs/EntityBuilder.js +3 -1
- package/src/engine/ecs/EntityBuilder.spec.js +21 -0
- package/src/engine/ecs/EntityComponentDataset.js +1 -1
- package/src/engine/ecs/EntityObserver.spec.js +1 -1
- package/src/engine/ecs/dynamic_actions/actions/definition/{WhiteToBlackboardActionDescription.js → WriteToBlackboardActionDescription.js} +2 -2
- package/src/engine/ecs/dynamic_actions/actions/definition/deserializeActionFromJSON.js +2 -2
- package/src/engine/ecs/gui/GUIElement.js +1 -1
- package/src/engine/ecs/gui/position/ViewportPosition.js +3 -3
- package/src/engine/ecs/guid/GUIDSerializationAdapter.spec.js +21 -0
- package/src/engine/ecs/parent/EntityNode.js +1 -1
- package/src/engine/ecs/parent/EntityNode.spec.js +104 -0
- package/src/engine/ecs/speaker/Voice.js +4 -0
- package/src/engine/ecs/team/Team.js +0 -44
- package/src/engine/ecs/team/TeamSerializationAdapter.js +46 -0
- package/src/engine/ecs/terrain/ecs/TerrainClassifier.js +1 -1
- package/src/engine/ecs/terrain/ecs/layers/TerrainLayers.js +1 -1
- package/src/engine/ecs/transform/Transform.js +2 -1
- package/src/engine/ecs/transform/Transform.spec.js +24 -0
- package/src/engine/graphics/camera/testClippingPlaneComputation.js +2 -6
- package/src/engine/graphics/ecs/animation/animator/graph/AnimationGraph.spec.js +5 -0
- package/src/engine/graphics/ecs/animation/animator/graph/definition/AnimationGraphDefinition.js +24 -25
- package/src/engine/graphics/ecs/animation/animator/graph/definition/AnimationGraphDefinition.spec.js +5 -0
- package/src/engine/graphics/ecs/decal/DecalSystem.js +2 -20
- package/src/engine/graphics/ecs/decal/v2/Decal.js +32 -32
- package/src/engine/graphics/ecs/decal/v2/Decal.spec.js +5 -0
- package/src/engine/graphics/ecs/decal/v2/FPDecalSystem.js +4 -2
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +4 -33
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.js +8 -4
- package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMesh.spec.js +5 -0
- package/src/engine/graphics/ecs/mesh-v2/sample/prototypeShadedGeometry.js +0 -12
- package/src/engine/graphics/ecs/path/testPathDisplaySystem.js +0 -2
- package/src/engine/graphics/ecs/path/tube/prototypeAnimatedPathMask.js +2 -6
- package/src/engine/graphics/ecs/water2/shader/testWaterShader.js +2 -4
- package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.js +1 -1
- package/src/engine/graphics/particles/particular/engine/utils/volume/prototypeParticleVolume.js +0 -2
- package/src/engine/graphics/render/buffer/buffers/prototypeNormalFrameBuffer.js +2 -6
- package/src/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +2 -6
- package/src/engine/graphics/render/forward_plus/prototype/prototypeLightManager.js +2 -2
- package/src/engine/graphics/render/visibility/hiz/prototypeHiZ.js +4 -8
- package/src/engine/graphics/sh3/path_tracer/GeometryBVHBatched.js +2 -1
- package/src/engine/graphics/sh3/path_tracer/PathTracer.js +6 -1
- package/src/engine/graphics/sh3/path_tracer/prototypePathTracer.js +2 -2
- package/src/engine/graphics/shadows/testShadowMapRendering.js +0 -2
- package/src/engine/graphics/texture/TextureBackedMemoryRegion.js +4 -1
- package/src/engine/graphics/texture/sampler/Sampler2D.js +1 -1
- package/src/engine/graphics/texture/sampler/filter/filter_lanczos3.js +7 -2
- package/src/engine/graphics/three/expand_aabb_by_transformed_three_object.js +3 -23
- package/src/engine/grid/grid2transform/GridPosition2Transform.js +122 -0
- package/src/engine/grid/grid2transform/GridPosition2TransformSerializationAdapter.js +70 -0
- package/src/engine/grid/grid2transform/GridPosition2TransformSerializationUpgrader_0_1.js +40 -0
- package/src/engine/grid/{systems → grid2transform}/GridPosition2TransformSystem.js +3 -3
- package/src/engine/grid/{components → obstacle}/GridObstacle.js +45 -25
- package/src/engine/grid/obstacle/GridObstacle.spec.js +175 -0
- package/src/engine/grid/{components → position}/GridPosition.js +6 -14
- package/src/engine/grid/{systems → position}/GridPositionSystem.js +1 -1
- package/src/engine/grid/transform2grid/Transform2GridPositionSystem.js +1 -1
- package/src/engine/input/devices/PointerDevice.spec.js +5 -0
- package/src/engine/navigation/ecs/components/computeCatmullRomSpline.js +5 -1
- package/src/engine/navigation/ecs/path_following/PathFollower.js +40 -32
- package/src/engine/navigation/ecs/path_following/PathFollower.spec.js +27 -0
- package/src/engine/plugin/EnginePlugin.js +12 -14
- package/src/engine/plugin/EnginePlugin.spec.js +5 -0
- package/src/engine/plugin/EnginePluginManager.js +18 -22
- package/src/engine/scene/transitionToScene.js +12 -1
- package/src/engine/simulation/Ticker.js +1 -1
- package/src/generation/filtering/CellFilter.js +6 -9
- package/src/generation/filtering/boolean/CellFilterLiteralBoolean.js +1 -4
- package/src/generation/filtering/core/CellFilterBinaryOperation.js +12 -15
- package/src/generation/filtering/core/CellFilterOperationTertiary.js +15 -19
- package/src/generation/filtering/numeric/CellFilterLiteralFloat.js +6 -9
- package/src/generation/grid/actions/ContinuousGridCellActionSetTerrainObstacle.js +1 -1
- package/src/generation/grid/actions/ContinuousGridCellActionWriteObstacle.js +2 -2
- package/src/generation/grid/generation/road/GridTaskGenerateRoads.js +1 -1
- package/src/generation/markers/actions/MarkerNodeActionEntityPlacement.js +1 -1
- package/src/generation/theme/TerrainLayerDescription.js +1 -1
- package/src/view/common/LabelView.js +3 -3
- package/src/engine/ecs/components/AimController.js +0 -18
- package/src/engine/ecs/components/Attacker.js +0 -13
- package/src/engine/ecs/components/MeshCollider.js +0 -15
- package/src/engine/ecs/components/RangedAttack.js +0 -12
- package/src/engine/ecs/components/TargetAI.js +0 -11
- package/src/engine/ecs/components/ViewportMeshProjection.js +0 -18
- package/src/engine/ecs/systems/AimControllerSystem.js +0 -63
- package/src/engine/ecs/systems/AttackerSystem.js +0 -67
- package/src/engine/ecs/systems/MeshColliderSystem.js +0 -47
- package/src/engine/ecs/systems/MonsterAISystem.js +0 -163
- package/src/engine/ecs/systems/MortalitySystem.js +0 -46
- package/src/engine/ecs/systems/RangedAttackSystem.js +0 -132
- package/src/engine/ecs/systems/SerializationMetadataSystem.js +0 -10
- package/src/engine/ecs/systems/TargetAISystem.js +0 -107
- package/src/engine/ecs/systems/ViewportMeshProjectionSystem.js +0 -68
- package/src/engine/graphics/particles/ParticleEmitterLibrary.js +0 -87
- package/src/engine/graphics/texture/ExportCanvasAsPNG.js +0 -7
- package/src/engine/grid/components/GridObstacle.spec.js +0 -46
- package/src/engine/grid/components/GridPosition2Transform.js +0 -232
- package/src/engine/grid/components/ViewportGridProjection.js +0 -20
- package/src/engine/grid/systems/GridObstacleSystem.js +0 -58
- package/src/engine/grid/systems/ViewportGridProjectionSystem.js +0 -105
- package/src/engine/navigation/PathFinder.js +0 -172
- package/src/engine/navigation/PathWorker.js +0 -78
- package/src/engine/navigation/ecs/systems/PathFinderSystem.js +0 -63
- package/src/engine/navigation/ecs/systems/PathSystem.js +0 -19
- package/src/engine/navigation/funnel/Funnel.js +0 -196
- package/src/generation/ZoneNode.js +0 -9
- /package/{src/generation → samples/generation/grid}/GridTags.js +0 -0
- /package/src/{engine → core/primitives/array}/computeStridedIntegerArrayHash.js +0 -0
- /package/src/engine/grid/{components → grid2transform}/GridPosition2TransformFlags.js +0 -0
- /package/src/engine/grid/{components → obstacle}/GridObstacleSerializationAdapter.js +0 -0
- /package/src/engine/grid/{components → position}/GridPositionSerializationAdapter.js +0 -0
- /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
|
-
|
|
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
|
-
|
|
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 '../
|
|
7
|
-
import { GridPosition2Transform } from '
|
|
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 "
|
|
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
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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.
|
|
25
|
-
assert.
|
|
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.
|
|
65
|
-
assert.
|
|
66
|
-
assert.
|
|
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.
|
|
104
|
-
assert.
|
|
106
|
+
assert.isNumber(x, 'x');
|
|
107
|
+
assert.isNumber(y, 'y');
|
|
105
108
|
|
|
106
|
-
assert.
|
|
107
|
-
assert.
|
|
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.
|
|
133
|
-
assert.
|
|
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.
|
|
152
|
-
assert.
|
|
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.
|
|
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.
|
|
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(
|
|
207
|
-
|
|
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(
|
|
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.
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
* @
|
|
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 '
|
|
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 "../
|
|
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";
|