@woosh/meep-engine 2.33.60 → 2.33.64
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/core/geom/3d/SurfacePoint3.js +44 -5
- package/core/geom/Vector2.d.ts +2 -0
- package/core/geom/packing/MaxRectangles.js +13 -4
- package/core/math/hash/murmur3_32.js +3 -3
- package/ecs/grid/pick.js +44 -0
- package/editor/actions/concrete/PaintTerrainOverlayAction.js +1 -1
- package/editor/process/ObstacleGridDisplayProcess.js +1 -1
- package/editor/process/symbolic/makeGridPositionSymbolDisplay.js +1 -1
- package/editor/tools/FoliagePaintTool.js +1 -1
- package/editor/tools/GridPaintTool.js +2 -2
- package/editor/tools/paint/TerrainPaintTool.js +2 -2
- package/editor/tools/paint/TerrainTexturePaintTool.js +1 -1
- package/editor/view/EditorView.js +1 -1
- package/editor/view/GridPickCoordinateView.js +2 -2
- package/engine/asset/loaders/material/computeTextureHash.js +7 -13
- package/engine/ecs/animation/InverseKinematicsSystem.js +1 -1
- package/engine/ecs/attachment/AttachmentSystem.js +9 -56
- package/engine/ecs/evaluation/world/ReadTerrainLayerWeightPointFitness.js +1 -1
- package/engine/ecs/fow/FogOfWarRevealerSystem.js +2 -2
- package/engine/ecs/grid/HeightMap2NormalMap.js +1 -1
- package/engine/ecs/grid/NormalMap2AOMap.js +1 -1
- package/engine/ecs/gui/position/ViewportPositionSystem.js +5 -5
- package/engine/ecs/parent/EntityNode.d.ts +20 -0
- package/engine/ecs/parent/EntityNode.js +284 -0
- package/engine/ecs/parent/FaceEditor.js +137 -0
- package/engine/ecs/parent/testCompositionEntityNode.js +153 -0
- package/engine/ecs/parent/testHuDPerf.js +123 -0
- package/engine/ecs/team/Team.js +82 -0
- package/engine/ecs/terrain/ecs/ClingToTerrainSystem.js +2 -2
- package/engine/ecs/terrain/ecs/Terrain.js +14 -5
- package/engine/ecs/terrain/util/loadVisibleTerrainTiles.js +112 -0
- package/engine/ecs/terrain/util/obtainTerrain.js +23 -0
- package/engine/ecs/tooltip/TooltipComponentSystem.js +1 -1
- package/engine/graphics/GraphicsEngine.js +1 -2
- package/engine/graphics/camera/testClippingPlaneComputation.js +0 -4
- package/engine/graphics/ecs/camera/topdown/TopDownCameraLanderSystem.js +1 -1
- package/engine/graphics/ecs/light/LightSystem.js +1 -1
- package/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +29 -0
- package/engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.js +158 -1
- package/engine/graphics/ecs/path/testPathDisplaySystem.js +0 -2
- package/engine/graphics/ecs/water/WaterSystem.js +1 -1
- package/engine/graphics/ecs/water2/shader/testWaterShader.js +1 -1
- package/engine/graphics/geometry/AttributeSpec.d.ts +8 -0
- package/engine/graphics/geometry/VertexDataSpec.d.ts +15 -0
- package/engine/graphics/geometry/buffered/deinterleaveBufferAttribute.js +39 -0
- package/engine/graphics/geometry/buffered/deinterleaveBufferGeometry.js +50 -0
- package/engine/graphics/geometry/buffered/query/GeometrySpatialQueryAccelerator.js +55 -11
- package/engine/graphics/micron/build/buildMicronGeometryFromBufferGeometry.js +10 -7
- package/engine/graphics/micron/format/MicronGeometry.d.ts +4 -0
- package/engine/graphics/micron/render/v1/MaterialContext.js +1 -0
- package/engine/graphics/particles/particular/engine/simulator/SimulationStepFixedPhysics.js +19 -3
- package/engine/graphics/particles/particular/engine/utils/volume/prototypeParticleVolume.js +2 -4
- package/engine/graphics/render/buffer/buffers/prototypeNormalFrameBuffer.js +0 -2
- package/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +2 -4
- package/engine/graphics/render/frame_graph/FrameGraphBuilder.js +36 -0
- package/engine/graphics/render/frame_graph/IRenderContext.js +8 -0
- package/engine/graphics/render/frame_graph/RenderPass.js +32 -0
- package/engine/graphics/render/frame_graph/RenderPassFlags.js +6 -0
- package/engine/graphics/render/frame_graph/RenderPassResources.js +15 -0
- package/engine/graphics/render/frame_graph/Resource.js +21 -0
- package/engine/graphics/render/frame_graph/ResourceReference.js +14 -0
- package/engine/graphics/render/frame_graph/TextureDescriptor.js +30 -0
- package/engine/graphics/render/frame_graph/UsageModeType.js +5 -0
- package/engine/graphics/render/frame_graph/sample/deferred/GBufferDrawPass.js +27 -0
- package/engine/graphics/render/frame_graph/sample/deferred/PresentPass.js +17 -0
- package/engine/graphics/render/visibility/hiz/prototypeHiZ.js +0 -2
- package/engine/graphics/render/webgpu/sample/MeshInstance.js +108 -0
- package/engine/graphics/render/webgpu/sample/fragmentDeferredRendering.wgsl +71 -0
- package/engine/graphics/render/webgpu/sample/fragmentGBuffersDebugView.wgsl +39 -0
- package/engine/graphics/render/webgpu/sample/fragmentWriteGBuffers.wgsl +21 -0
- package/engine/graphics/render/webgpu/sample/lightUpdate.wgsl +41 -0
- package/engine/graphics/render/webgpu/sample/main.js +604 -0
- package/engine/graphics/render/webgpu/sample/vertexTextureQuad.wgsl +9 -0
- package/engine/graphics/render/webgpu/sample/vertexWriteGBuffers.wgsl +30 -0
- package/engine/graphics/shadows/testShadowMapRendering.js +0 -2
- package/engine/{ecs/grid → graphics/texture/sampler}/sampler2DToFloat32Texture.js +1 -1
- package/engine/graphics/util/modelHitTest.js +63 -0
- package/engine/grid/systems/GridPosition2TransformSystem.js +1 -1
- package/engine/grid/systems/ViewportGridProjectionSystem.js +1 -1
- package/engine/grid/transform2grid/Transform2GridPositionSystem.js +1 -1
- package/engine/scene/transitionToScene.js +1 -1
- package/generation/grid/actions/ContinuousGridCellActionSetTerrainHeight.js +1 -1
- package/generation/markers/actions/placement/MarkerNodeEntityProcessorClingToTerrain.js +1 -1
- package/generation/markers/debug/visualizeMarkers.js +1 -1
- package/generation/theme/ThemeEngine.js +1 -1
- package/package.json +1 -1
- package/samples/terrain/main.js +117 -0
- package/view/minimap/Minimap.js +1 -1
- package/engine/ecs/sockets/AttachmentSocketsSystem.js +0 -10
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import Vector2 from "../../../core/geom/Vector2.js";
|
|
2
|
+
import Mesh from "../ecs/mesh/Mesh.js";
|
|
3
|
+
|
|
4
|
+
const tempPoint = new Vector2();
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
*
|
|
8
|
+
* @param {SurfacePoint3} result
|
|
9
|
+
* @param {Array.<Number>} entities
|
|
10
|
+
* @param {EntityComponentDataset} ecd
|
|
11
|
+
* @param {GraphicsEngine} ge
|
|
12
|
+
* @param {Number} x
|
|
13
|
+
* @param {Number} y
|
|
14
|
+
* @returns {Number} entity number or -1 in case of failed test
|
|
15
|
+
*/
|
|
16
|
+
function modelHitTest(result, entities, ecd, ge, x, y) {
|
|
17
|
+
tempPoint.set(x, y);
|
|
18
|
+
|
|
19
|
+
ge.normalizeViewportPoint(tempPoint, tempPoint);
|
|
20
|
+
|
|
21
|
+
let i = 0;
|
|
22
|
+
const l = entities.length;
|
|
23
|
+
|
|
24
|
+
for (; i < l; i++) {
|
|
25
|
+
|
|
26
|
+
const entity = entities[i];
|
|
27
|
+
|
|
28
|
+
const model = ecd.getComponent(entity, Mesh);
|
|
29
|
+
|
|
30
|
+
if (model === null) {
|
|
31
|
+
//entity no longer exists most likely
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
*
|
|
37
|
+
* @type {Intersection[]}
|
|
38
|
+
*/
|
|
39
|
+
const hits = ge.intersectObjectUnderViewportPoint(tempPoint.x, tempPoint.y, model.mesh, true);
|
|
40
|
+
|
|
41
|
+
// get hit
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
if (hits.length > 0) {
|
|
45
|
+
/**
|
|
46
|
+
*
|
|
47
|
+
* @type {Intersection}
|
|
48
|
+
*/
|
|
49
|
+
const hit = hits[0];
|
|
50
|
+
|
|
51
|
+
result.position.copy(hit.point);
|
|
52
|
+
|
|
53
|
+
//TODO extract normal
|
|
54
|
+
|
|
55
|
+
return entity;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return -1;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export { modelHitTest };
|
|
@@ -6,8 +6,8 @@ import { Transform } from '../../ecs/transform/Transform.js';
|
|
|
6
6
|
import GridPosition from '../components/GridPosition.js';
|
|
7
7
|
import { GridPosition2Transform } from '../components/GridPosition2Transform.js';
|
|
8
8
|
import Vector3 from "../../../core/geom/Vector3.js";
|
|
9
|
-
import { obtainTerrain } from "../../../../model/game/scenes/SceneUtils.js";
|
|
10
9
|
import { GridPosition2TransformFlags } from "../components/GridPosition2TransformFlags.js";
|
|
10
|
+
import { obtainTerrain } from "../../ecs/terrain/util/obtainTerrain.js";
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
export class GridPosition2TransformSystem extends System {
|
|
@@ -5,9 +5,9 @@ import { System } from '../../ecs/System.js';
|
|
|
5
5
|
import GeometryBVH from '../../ecs/components/GeometryBVH.js';
|
|
6
6
|
import GridPosition from '../components/GridPosition.js';
|
|
7
7
|
import ViewportGridProjection from '../components/ViewportGridProjection.js';
|
|
8
|
-
import { obtainTerrain } from "../../../../model/game/scenes/SceneUtils.js";
|
|
9
8
|
import Vector2 from "../../../core/geom/Vector2.js";
|
|
10
9
|
import Vector3 from "../../../core/geom/Vector3.js";
|
|
10
|
+
import { obtainTerrain } from "../../ecs/terrain/util/obtainTerrain.js";
|
|
11
11
|
|
|
12
12
|
class ViewportGridProjectionSystem extends System {
|
|
13
13
|
constructor(grid, graphicsEngine) {
|
|
@@ -2,9 +2,9 @@ import { System } from "../../ecs/System.js";
|
|
|
2
2
|
import { Transform2GridPosition } from "./Transform2GridPosition.js";
|
|
3
3
|
import GridPosition from "../components/GridPosition.js";
|
|
4
4
|
import { Transform } from "../../ecs/transform/Transform.js";
|
|
5
|
-
import { obtainTerrain } from "../../../../model/game/scenes/SceneUtils.js";
|
|
6
5
|
import Vector2 from "../../../core/geom/Vector2.js";
|
|
7
6
|
import { Transform2GridPositionMode } from "./Transform2GridPositionMode.js";
|
|
7
|
+
import { obtainTerrain } from "../../ecs/terrain/util/obtainTerrain.js";
|
|
8
8
|
|
|
9
9
|
const v2 = new Vector2();
|
|
10
10
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { actionTask, delayTask, wrapTaskIgnoreFailure } from "../../core/process/task/TaskUtils.js";
|
|
2
|
-
import { loadVisibleTerrainTiles } from "../../../model/game/scenes/SceneUtils.js";
|
|
3
2
|
import TaskGroup from "../../core/process/task/TaskGroup.js";
|
|
4
3
|
import Task from "../../core/process/task/Task.js";
|
|
5
4
|
import TaskState from "../../core/process/task/TaskState.js";
|
|
6
5
|
import { noop } from "../../core/function/Functions.js";
|
|
7
6
|
import { compileAllMaterials } from "../graphics/ecs/compileAllMaterials.js";
|
|
8
7
|
import { createTaskWaitForMeshesToLoad } from "../graphics/ecs/mesh/createTaskWaitForMeshesToLoad.js";
|
|
8
|
+
import { loadVisibleTerrainTiles } from "../ecs/terrain/util/loadVisibleTerrainTiles.js";
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
/**
|
|
@@ -2,9 +2,9 @@ import { lerp } from "../../../core/math/lerp.js";
|
|
|
2
2
|
import { min2 } from "../../../core/math/min2.js";
|
|
3
3
|
import { ContinuousGridCellAction } from "./ContinuousGridCellAction.js";
|
|
4
4
|
import { Sampler2D } from "../../../engine/graphics/texture/sampler/Sampler2D.js";
|
|
5
|
-
import { obtainTerrain } from "../../../../model/game/scenes/SceneUtils.js";
|
|
6
5
|
import { assert } from "../../../core/assert.js";
|
|
7
6
|
import { CellFilterLiteralFloat } from "../../filtering/numeric/CellFilterLiteralFloat.js";
|
|
7
|
+
import { obtainTerrain } from "../../../engine/ecs/terrain/util/obtainTerrain.js";
|
|
8
8
|
|
|
9
9
|
export class ContinuousGridCellActionSetTerrainHeight extends ContinuousGridCellAction {
|
|
10
10
|
constructor() {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { MarkerNodeEntityProcessor } from "./MarkerNodeEntityProcessor.js";
|
|
2
|
-
import { obtainTerrain } from "../../../../../model/game/scenes/SceneUtils.js";
|
|
3
2
|
import { SurfacePoint3 } from "../../../../core/geom/3d/SurfacePoint3.js";
|
|
4
3
|
import { alignToVector } from "../../../../engine/ecs/terrain/ecs/ClingToTerrainSystem.js";
|
|
4
|
+
import { obtainTerrain } from "../../../../engine/ecs/terrain/util/obtainTerrain.js";
|
|
5
5
|
|
|
6
6
|
const p = new SurfacePoint3();
|
|
7
7
|
|
|
@@ -11,13 +11,13 @@ import {
|
|
|
11
11
|
import EntityBuilder from "../../../engine/ecs/EntityBuilder.js";
|
|
12
12
|
import Renderable from "../../../engine/ecs/components/Renderable.js";
|
|
13
13
|
import { Transform } from "../../../engine/ecs/transform/Transform.js";
|
|
14
|
-
import { obtainTerrain } from "../../../../model/game/scenes/SceneUtils.js";
|
|
15
14
|
import LabelView from "../../../view/common/LabelView.js";
|
|
16
15
|
import GUIElement from "../../../engine/ecs/gui/GUIElement.js";
|
|
17
16
|
import ViewportPosition from "../../../engine/ecs/gui/position/ViewportPosition.js";
|
|
18
17
|
import HeadsUpDisplay from "../../../engine/ecs/gui/hud/HeadsUpDisplay.js";
|
|
19
18
|
import Vector3 from "../../../core/geom/Vector3.js";
|
|
20
19
|
import { MarkerNodeMatcherAny } from "../matcher/MarkerNodeMatcherAny.js";
|
|
20
|
+
import { obtainTerrain } from "../../../engine/ecs/terrain/util/obtainTerrain.js";
|
|
21
21
|
|
|
22
22
|
function formatValue(v) {
|
|
23
23
|
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { QuadTreeNode } from "../../core/geom/2d/quad-tree/QuadTreeNode.js";
|
|
2
2
|
import { assert } from "../../core/assert.js";
|
|
3
|
-
import { obtainTerrain } from "../../../model/game/scenes/SceneUtils.js";
|
|
4
3
|
import { seededRandom } from "../../core/math/random/seededRandom.js";
|
|
5
4
|
import { TerrainLayerRuleAggregator } from "./TerrainLayerRuleAggregator.js";
|
|
6
5
|
import { actionTask, countTask, emptyTask, futureTask } from "../../core/process/task/TaskUtils.js";
|
|
@@ -17,6 +16,7 @@ import { TerrainLayer } from "../../engine/ecs/terrain/ecs/layers/TerrainLayer.j
|
|
|
17
16
|
import { TerrainFlags } from "../../engine/ecs/terrain/ecs/TerrainFlags.js";
|
|
18
17
|
import { binarySearchLowIndex } from "../../core/collection/array/binarySearchLowIndex.js";
|
|
19
18
|
import { randomFloatBetween } from "../../core/math/random/randomFloatBetween.js";
|
|
19
|
+
import { obtainTerrain } from "../../engine/ecs/terrain/util/obtainTerrain.js";
|
|
20
20
|
|
|
21
21
|
/**
|
|
22
22
|
*
|
package/package.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"productName": "Meep",
|
|
6
6
|
"description": "production-ready JavaScript game engine based on Entity Component System Architecture",
|
|
7
7
|
"author": "Alexander Goldring",
|
|
8
|
-
"version": "2.33.
|
|
8
|
+
"version": "2.33.64",
|
|
9
9
|
"dependencies": {
|
|
10
10
|
"gl-matrix": "3.4.3",
|
|
11
11
|
"fast-levenshtein": "2.0.6",
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { EngineConfiguration } from "../../engine/EngineConfiguration.js";
|
|
2
|
+
import { EngineHarness } from "../../engine/EngineHarness.js";
|
|
3
|
+
import { GameAssetType } from "../../engine/asset/GameAssetType.js";
|
|
4
|
+
import { TextureAssetLoader } from "../../engine/asset/loaders/texture/TextureAssetLoader.js";
|
|
5
|
+
import { ImprovedNoise } from "three/examples/jsm/math/ImprovedNoise.js";
|
|
6
|
+
import { lerp } from "../../core/math/lerp.js";
|
|
7
|
+
import Vector2 from "../../core/geom/Vector2.js";
|
|
8
|
+
import Vector3 from "../../core/geom/Vector3.js";
|
|
9
|
+
import { obtainTerrain } from "../../engine/ecs/terrain/util/obtainTerrain.js";
|
|
10
|
+
|
|
11
|
+
const eh = new EngineHarness();
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
*
|
|
15
|
+
* @param {Engine} engine
|
|
16
|
+
* @return {EngineConfiguration}
|
|
17
|
+
*/
|
|
18
|
+
function makeConfig(engine) {
|
|
19
|
+
const r = new EngineConfiguration();
|
|
20
|
+
|
|
21
|
+
// configure engine here, add systems, loaders etc.
|
|
22
|
+
r.addLoader(GameAssetType.Texture, new TextureAssetLoader());
|
|
23
|
+
|
|
24
|
+
return r;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
*
|
|
29
|
+
* @param {Terrain} terrain
|
|
30
|
+
* @param {number} resolution
|
|
31
|
+
* @param {number} heightMin
|
|
32
|
+
* @param {number} heightMax
|
|
33
|
+
*/
|
|
34
|
+
async function buildRandomTerrainHeights({
|
|
35
|
+
terrain,
|
|
36
|
+
resolution = 64,
|
|
37
|
+
heightMin = -5,
|
|
38
|
+
heightMax = 20
|
|
39
|
+
}) {
|
|
40
|
+
|
|
41
|
+
const terrain_height = terrain.samplerHeight;
|
|
42
|
+
|
|
43
|
+
terrain_height.resize(resolution, resolution);
|
|
44
|
+
|
|
45
|
+
const noise = new ImprovedNoise();
|
|
46
|
+
|
|
47
|
+
let x, y;
|
|
48
|
+
|
|
49
|
+
for (y = 0; y < resolution; y++) {
|
|
50
|
+
for (x = 0; x < resolution; x++) {
|
|
51
|
+
|
|
52
|
+
const u = x / (resolution - 1);
|
|
53
|
+
const v = y / (resolution - 1);
|
|
54
|
+
|
|
55
|
+
const noise_value = noise.noise(u * 13.456, v * 13.456, 0) * noise.noise(u * 3.71, v * 3.71, 0.8);
|
|
56
|
+
|
|
57
|
+
const height_value = lerp(heightMin, heightMax, noise_value);
|
|
58
|
+
|
|
59
|
+
terrain_height.set(x, y, [height_value]);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
await terrain.updateWorkerHeights();
|
|
64
|
+
terrain.updateHeightTexture();
|
|
65
|
+
terrain.buildLightMap();
|
|
66
|
+
|
|
67
|
+
terrain.tiles.rebuild();
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
*
|
|
72
|
+
* @param {Engine} engine
|
|
73
|
+
*/
|
|
74
|
+
async function main(engine) {
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
await EngineHarness.buildBasics({
|
|
78
|
+
engine,
|
|
79
|
+
enableWater: false,
|
|
80
|
+
terrainResolution: 4,
|
|
81
|
+
terrainSize: new Vector2(64, 64),
|
|
82
|
+
focus: new Vector3(64, 0, 54),
|
|
83
|
+
yaw: 0,
|
|
84
|
+
pitch: 0.909,
|
|
85
|
+
distance: 169
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
*
|
|
90
|
+
* @type {EntityComponentDataset}
|
|
91
|
+
*/
|
|
92
|
+
const ecd = engine.entityManager.dataset;
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
*
|
|
96
|
+
* @type {Terrain|null}
|
|
97
|
+
*/
|
|
98
|
+
const terrain = obtainTerrain(ecd);
|
|
99
|
+
|
|
100
|
+
buildRandomTerrainHeights({ terrain: terrain });
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
*
|
|
105
|
+
* @param {EngineHarness} harness
|
|
106
|
+
*/
|
|
107
|
+
async function init(harness) {
|
|
108
|
+
const engine = eh.engine;
|
|
109
|
+
|
|
110
|
+
await makeConfig(engine).apply(engine);
|
|
111
|
+
|
|
112
|
+
await eh.initialize();
|
|
113
|
+
|
|
114
|
+
main(engine);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
init(eh);
|
package/view/minimap/Minimap.js
CHANGED
|
@@ -19,7 +19,7 @@ import { MinimapWorldGL } from "./gl/MinimapWorldGL.js";
|
|
|
19
19
|
import { MinimapCameraView } from "./dom/MinimapCameraView.js";
|
|
20
20
|
import { MinimapFogOfWar } from "./gl/MinimapFogOfWar.js";
|
|
21
21
|
import { MinimapTerrainGL } from "./gl/MinimapTerrainGL.js";
|
|
22
|
-
import { obtainTerrain } from "
|
|
22
|
+
import { obtainTerrain } from "../../engine/ecs/terrain/util/obtainTerrain.js";
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
class MinimapView extends View {
|