@woosh/meep-engine 2.48.12 → 2.48.14
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/package.json +1 -1
- package/src/core/collection/queue/Deque.d.ts +9 -0
- package/src/core/collection/queue/Deque.js +3 -0
- package/src/core/collection/queue/Deque.spec.js +51 -0
- package/src/core/font/FontAssetLoader.js +2 -2
- package/src/core/math/bessel_3.js +3 -1
- package/src/core/math/noise/create_noise_2d.js +193 -0
- package/src/core/path/computeFileExtension.js +3 -2
- package/src/engine/Engine.js +14 -8
- package/src/engine/achievements/AchievementManager.js +16 -16
- package/src/engine/asset/AssetManager.d.ts +10 -5
- package/src/engine/asset/AssetManager.js +79 -24
- package/src/engine/asset/AssetManager.spec.js +1 -1
- package/src/engine/asset/AssetRequest.js +19 -1
- package/src/engine/asset/AssetRequestScope.d.ts +3 -0
- package/src/engine/asset/AssetRequestScope.js +64 -0
- package/src/engine/asset/PendingAsset.js +7 -7
- package/src/engine/asset/loaders/ArrayBufferLoader.js +1 -1
- package/src/engine/asset/loaders/AssetLoader.d.ts +9 -2
- package/src/engine/asset/loaders/AssetLoader.js +19 -16
- package/src/engine/asset/loaders/GLTFAssetLoader.d.ts +1 -1
- package/src/engine/asset/loaders/GLTFAssetLoader.js +2 -2
- package/src/engine/asset/loaders/JavascriptAssetLoader.js +17 -12
- package/src/engine/asset/loaders/JsonAssetLoader.js +1 -1
- package/src/engine/asset/loaders/LegacyThreeJSONAssetLoader.js +4 -1
- package/src/engine/asset/loaders/SVGAssetLoader.js +1 -1
- package/src/engine/asset/loaders/SoundAssetLoader.js +4 -6
- package/src/engine/asset/loaders/TextAssetLoader.js +1 -1
- package/src/engine/asset/loaders/image/ImageRGBADataLoader.js +24 -17
- package/src/engine/asset/loaders/texture/TextureAssetLoader.d.ts +1 -1
- package/src/engine/asset/loaders/texture/TextureAssetLoader.js +1 -1
- package/src/engine/asset/preloader/Preloader.js +1 -1
- package/src/engine/development/performance/MetricStatistics.js +7 -5
- package/src/engine/development/performance/RingBufferMetric.js +2 -2
- package/src/engine/ecs/foliage/ecs/Foliage2System.js +7 -5
- package/src/engine/ecs/foliage/ecs/InstancedMeshUtils.js +14 -1
- package/src/engine/ecs/gui/GUIElementSystem.d.ts +1 -1
- package/src/engine/ecs/sockets/serialization/AttachmentSocketsAssetLoader.js +2 -2
- package/src/engine/ecs/terrain/ecs/PromiseSamplerHeight.js +16 -9
- package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +3 -21
- package/src/engine/ecs/terrain/ecs/splat/SplatMapping.js +16 -11
- package/src/engine/ecs/terrain/serialization/TerrainSerializationAdapter.js +1 -1
- package/src/engine/graphics/ecs/animation/animator/graph/definition/serialization/AnimationGraphDefinitionAssetLoader.js +18 -15
- package/src/engine/graphics/ecs/camera/pp/PerfectPanner.js +4 -2
- package/src/engine/graphics/ecs/mesh/MeshSystem.js +1 -1
- package/src/engine/graphics/ecs/path/tube/build/TubePathBuilder.js +6 -4
- package/src/engine/graphics/material/getTextureImmediate.js +5 -3
- package/src/engine/graphics/texture/3d/SingleChannelSampler3D.js +146 -0
- package/src/engine/graphics/texture/3d/scs3d_read_2d_slice.js +26 -0
- package/src/engine/graphics/texture/atlas/ManagedTextureAtlas.js +1 -1
- package/src/engine/graphics/texture/sampler/Sampler2D.js +22 -13
- package/src/engine/graphics/texture/sampler/filter/box.js +3 -3
- package/src/engine/graphics/texture/sampler/filter/kaiser_bessel_window.js +2 -1
- package/src/engine/graphics/texture/sampler/genericResampleSampler2D.js +9 -8
- package/src/engine/graphics/texture/sampler/loadSampler2D.js +18 -16
- package/src/engine/graphics/texture/sampler/sampler2d_scale_down_linear.js +8 -11
- package/src/engine/graphics/texture/virtual/tile/TileLoader.js +1 -1
- package/src/engine/graphics/trail/x/RibbonXPlugin.js +5 -3
- package/src/engine/knowledge/database/StaticKnowledgeDataTable.js +1 -1
- package/src/engine/physics/fluid/FluidField.js +153 -1
- package/src/engine/physics/fluid/prototype.js +201 -0
- package/src/engine/physics/fluid/solver/v3_grid_apply_diffusion.js +67 -0
- package/src/engine/sound/ecs/emitter/loadSoundTrackAsset.js +1 -1
- package/src/generation/filtering/numeric/complex/CellFilterGaussianBlur.js +17 -12
- package/src/generation/filtering/numeric/complex/CellFilterSimplexNoise.js +14 -10
- package/src/view/elements/MeshPreview.js +66 -64
- package/src/view/elements/image/SvgImageView.js +8 -6
- package/src/view/renderModel.js +1 -1
|
@@ -38,7 +38,13 @@ export class AssetRequest {
|
|
|
38
38
|
* Higher priority requests should be handled first
|
|
39
39
|
* @type {number}
|
|
40
40
|
*/
|
|
41
|
-
this.priority =
|
|
41
|
+
this.priority = 1;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
*
|
|
45
|
+
* @type {AssetRequestScope}
|
|
46
|
+
*/
|
|
47
|
+
this.scope = null;
|
|
42
48
|
|
|
43
49
|
/**
|
|
44
50
|
*
|
|
@@ -47,6 +53,18 @@ export class AssetRequest {
|
|
|
47
53
|
this.flags = 0;
|
|
48
54
|
}
|
|
49
55
|
|
|
56
|
+
get scoped_priority() {
|
|
57
|
+
const _p = this.priority;
|
|
58
|
+
|
|
59
|
+
const scope = this.scope;
|
|
60
|
+
|
|
61
|
+
if (scope === null) {
|
|
62
|
+
return _p;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return _p * scope.final_priority;
|
|
66
|
+
}
|
|
67
|
+
|
|
50
68
|
/**
|
|
51
69
|
*
|
|
52
70
|
* @param {number|AssetRequestFlags} flag
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
let id_counter = 0;
|
|
2
|
+
|
|
3
|
+
export class AssetRequestScope {
|
|
4
|
+
id = id_counter++;
|
|
5
|
+
|
|
6
|
+
priority = 1
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
*
|
|
10
|
+
* @type {AssetRequestScope[]}
|
|
11
|
+
*/
|
|
12
|
+
sources = []
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
get final_priority() {
|
|
16
|
+
const sources = this.sources;
|
|
17
|
+
const n = sources.length;
|
|
18
|
+
|
|
19
|
+
if (n === 0) {
|
|
20
|
+
return this.priority;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
let max = sources[0].final_priority;
|
|
25
|
+
|
|
26
|
+
for (let i = 0; i < n; i++) {
|
|
27
|
+
const source = sources[i];
|
|
28
|
+
|
|
29
|
+
const source_priority = source.final_priority;
|
|
30
|
+
|
|
31
|
+
if (source_priority > max) {
|
|
32
|
+
max = source_priority;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return this.priority * max;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
*
|
|
41
|
+
* @param {AssetRequestScope[]} sources
|
|
42
|
+
* @return {AssetRequestScope}
|
|
43
|
+
*/
|
|
44
|
+
static from(sources) {
|
|
45
|
+
const r = new AssetRequestScope();
|
|
46
|
+
|
|
47
|
+
r.sources = sources;
|
|
48
|
+
|
|
49
|
+
return r;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
toString() {
|
|
53
|
+
const sources = this.sources.length > 0 ? `[ ${this.sources.join(', ')} ]` : 'none';
|
|
54
|
+
return `Scope{ id:${this.id}, sources:${sources} }`;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* @readonly
|
|
62
|
+
* @type {Readonly<AssetRequestScope>}
|
|
63
|
+
*/
|
|
64
|
+
AssetRequestScope.GLOBAL = Object.freeze(new AssetRequestScope());
|
|
@@ -38,18 +38,18 @@ export class PendingAsset {
|
|
|
38
38
|
* @return {number}
|
|
39
39
|
*/
|
|
40
40
|
get priority() {
|
|
41
|
-
let max_priority = 0;
|
|
42
|
-
|
|
43
41
|
const requests = this.requests;
|
|
44
|
-
const
|
|
42
|
+
const request_count = requests.length;
|
|
45
43
|
|
|
46
|
-
if (
|
|
47
|
-
|
|
44
|
+
if (request_count === 0) {
|
|
45
|
+
return 0;
|
|
48
46
|
}
|
|
49
47
|
|
|
50
|
-
|
|
48
|
+
let max_priority = requests[0].priority;
|
|
49
|
+
|
|
50
|
+
for (let i = 1; i < request_count; i++) {
|
|
51
51
|
const request = requests[i];
|
|
52
|
-
const priority = request.
|
|
52
|
+
const priority = request.scoped_priority;
|
|
53
53
|
|
|
54
54
|
if (priority > max_priority) {
|
|
55
55
|
max_priority = request;
|
|
@@ -22,7 +22,7 @@ export class ArrayBufferLoader extends AssetLoader {
|
|
|
22
22
|
this.__fetch_priority = fetch_priority;
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
load(path, success, failure = console.error, progress = noop) {
|
|
25
|
+
load(scope, path, success, failure = console.error, progress = noop) {
|
|
26
26
|
const coc = this.assetManager !== null ? this.assetManager.crossOriginConfig : CrossOriginConfig.default;
|
|
27
27
|
|
|
28
28
|
const headers = new Headers();
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import {Asset} from "../Asset";
|
|
2
|
+
import {AssetRequestScope} from "../AssetRequestScope";
|
|
2
3
|
|
|
3
|
-
export class AssetLoader<T> {
|
|
4
|
-
public load(
|
|
4
|
+
export declare class AssetLoader<T, CTX> {
|
|
5
|
+
public load(
|
|
6
|
+
scope: AssetRequestScope,
|
|
7
|
+
path: string,
|
|
8
|
+
success: (asset: Asset<T>) => void,
|
|
9
|
+
failure: (reason: any) => void,
|
|
10
|
+
progress: (current: number, total: number) => void
|
|
11
|
+
)
|
|
5
12
|
}
|
|
@@ -1,26 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @template CTX
|
|
3
|
+
* @template Asset
|
|
4
|
+
*/
|
|
1
5
|
export class AssetLoader {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
this.assetManager = null;
|
|
6
|
+
/**
|
|
7
|
+
*
|
|
8
|
+
* @type {AssetManager}
|
|
9
|
+
*/
|
|
10
|
+
assetManager = null;
|
|
8
11
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
12
|
+
/**
|
|
13
|
+
*
|
|
14
|
+
* @type {CTX}
|
|
15
|
+
*/
|
|
16
|
+
context = null;
|
|
15
17
|
|
|
16
18
|
/**
|
|
17
19
|
*
|
|
18
20
|
* @param {AssetManager} assetManager
|
|
19
|
-
* @param {
|
|
21
|
+
* @param {CTX} context
|
|
20
22
|
*/
|
|
21
|
-
async link(assetManager,
|
|
23
|
+
async link(assetManager, context) {
|
|
22
24
|
this.assetManager = assetManager;
|
|
23
|
-
this.
|
|
25
|
+
this.context = context;
|
|
24
26
|
}
|
|
25
27
|
|
|
26
28
|
/**
|
|
@@ -32,12 +34,13 @@ export class AssetLoader {
|
|
|
32
34
|
|
|
33
35
|
/**
|
|
34
36
|
*
|
|
37
|
+
* @param {AssetRequestScope} scope
|
|
35
38
|
* @param {string} path
|
|
36
39
|
* @param {function(Asset)} success
|
|
37
40
|
* @param {function} failure
|
|
38
41
|
* @param {function(current:number, total:number)} progress
|
|
39
42
|
*/
|
|
40
|
-
load(path, success, failure, progress) {
|
|
43
|
+
load(scope, path, success, failure, progress) {
|
|
41
44
|
failure('Not Implemented');
|
|
42
45
|
}
|
|
43
46
|
}
|
|
@@ -241,7 +241,7 @@ export class GLTFAssetLoader extends AssetLoader {
|
|
|
241
241
|
*
|
|
242
242
|
* @type {GraphicsEngine}
|
|
243
243
|
*/
|
|
244
|
-
const graphics = this.
|
|
244
|
+
const graphics = this.context.graphics;
|
|
245
245
|
|
|
246
246
|
/**
|
|
247
247
|
*
|
|
@@ -273,7 +273,7 @@ export class GLTFAssetLoader extends AssetLoader {
|
|
|
273
273
|
}
|
|
274
274
|
|
|
275
275
|
|
|
276
|
-
load(path, success, failure, progress) {
|
|
276
|
+
load(scope, path, success, failure, progress) {
|
|
277
277
|
const loader = this.loader;
|
|
278
278
|
const texture_cache = this.__texture_cache;
|
|
279
279
|
|
|
@@ -21,22 +21,27 @@ class JavascriptAsset extends Asset {
|
|
|
21
21
|
|
|
22
22
|
export class JavascriptAssetLoader extends AssetLoader {
|
|
23
23
|
|
|
24
|
-
load(path, success, failure, progress) {
|
|
25
|
-
this.assetManager.get(
|
|
24
|
+
load(scope, path, success, failure, progress) {
|
|
25
|
+
this.assetManager.get({
|
|
26
|
+
path: path,
|
|
27
|
+
scope,
|
|
28
|
+
type: GameAssetType.Text,
|
|
29
|
+
callback: (textAsset) => {
|
|
26
30
|
|
|
27
|
-
|
|
31
|
+
const text = textAsset.create();
|
|
28
32
|
|
|
29
|
-
|
|
33
|
+
let asset;
|
|
30
34
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
try {
|
|
36
|
+
asset = new JavascriptAsset(text);
|
|
37
|
+
} catch (e) {
|
|
38
|
+
failure(e);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
37
41
|
|
|
38
|
-
|
|
42
|
+
success(asset);
|
|
39
43
|
|
|
40
|
-
|
|
44
|
+
}, failure: failure, progress: progress
|
|
45
|
+
});
|
|
41
46
|
}
|
|
42
47
|
}
|
|
@@ -2,7 +2,7 @@ import xhr from "../../network/xhr.js";
|
|
|
2
2
|
import { AssetLoader } from "./AssetLoader.js";
|
|
3
3
|
|
|
4
4
|
export class JsonAssetLoader extends AssetLoader {
|
|
5
|
-
load(path, callback, failure, progress) {
|
|
5
|
+
load(scope, path, callback, failure, progress) {
|
|
6
6
|
xhr(path, function (data) {
|
|
7
7
|
let object;
|
|
8
8
|
try {
|
|
@@ -20,8 +20,11 @@ const placeholderTexture = checkerTexture.create();
|
|
|
20
20
|
|
|
21
21
|
const placeholderMaterial = new ThreeMeshLambertMaterial({ map: placeholderTexture });
|
|
22
22
|
|
|
23
|
+
/**
|
|
24
|
+
* @deprecated
|
|
25
|
+
*/
|
|
23
26
|
export class LegacyThreeJSONAssetLoader extends AssetLoader {
|
|
24
|
-
load(path, success, failure, progress) {
|
|
27
|
+
load(scope, path, success, failure, progress) {
|
|
25
28
|
|
|
26
29
|
console.warn(`JSON loader is deprecated. Attempting to load model '${path}'`);
|
|
27
30
|
|
|
@@ -13,10 +13,10 @@ export class SoundAssetLoader extends AssetLoader {
|
|
|
13
13
|
*
|
|
14
14
|
* @type {AudioContext}
|
|
15
15
|
*/
|
|
16
|
-
this.
|
|
16
|
+
this.audioContext = context;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
load(path, success, failure, progress) {
|
|
19
|
+
load(scope, path, success, failure, progress) {
|
|
20
20
|
// Load a sound file using an ArrayBuffer XMLHttpRequest.
|
|
21
21
|
const request = new XMLHttpRequest();
|
|
22
22
|
|
|
@@ -24,16 +24,14 @@ export class SoundAssetLoader extends AssetLoader {
|
|
|
24
24
|
|
|
25
25
|
request.responseType = "arraybuffer";
|
|
26
26
|
|
|
27
|
-
const context = this.
|
|
27
|
+
const context = this.audioContext;
|
|
28
28
|
|
|
29
29
|
request.onload = function (e) {
|
|
30
30
|
//decode works asynchronously, this is important to prevent lag in main thread
|
|
31
31
|
context.decodeAudioData(request.response, function (buffer) {
|
|
32
32
|
const byteSize = e.total;
|
|
33
33
|
|
|
34
|
-
const asset = new Asset(
|
|
35
|
-
return buffer;
|
|
36
|
-
}, byteSize);
|
|
34
|
+
const asset = new Asset(() => buffer, byteSize);
|
|
37
35
|
|
|
38
36
|
success(asset);
|
|
39
37
|
}, failure);
|
|
@@ -2,7 +2,7 @@ import xhr from "../../network/xhr.js";
|
|
|
2
2
|
import { AssetLoader } from "./AssetLoader.js";
|
|
3
3
|
|
|
4
4
|
export class TextAssetLoader extends AssetLoader {
|
|
5
|
-
load(path, callback, failure, progress) {
|
|
5
|
+
load(scope,path, callback, failure, progress) {
|
|
6
6
|
xhr(path, function (data) {
|
|
7
7
|
const asset = {
|
|
8
8
|
create: function () {
|
|
@@ -32,11 +32,12 @@ export class ImageRGBADataLoader extends AssetLoader {
|
|
|
32
32
|
/**
|
|
33
33
|
*
|
|
34
34
|
* @param {string} path
|
|
35
|
+
* @param {AssetRequestScope} scope
|
|
35
36
|
* @returns {Promise<{data:ArrayBuffer, width: number, height:number, itemSize: number, bitDepth:number}>}
|
|
36
37
|
* @private
|
|
37
38
|
*/
|
|
38
|
-
async __decode_via_worker(path) {
|
|
39
|
-
const asset = await this.assetManager.promise(path, ASSET_TYPE_ARRAY_BUFFER);
|
|
39
|
+
async __decode_via_worker(path, scope) {
|
|
40
|
+
const asset = await this.assetManager.promise(path, ASSET_TYPE_ARRAY_BUFFER, { scope });
|
|
40
41
|
|
|
41
42
|
/**
|
|
42
43
|
* @type {ArrayBuffer}
|
|
@@ -49,12 +50,13 @@ export class ImageRGBADataLoader extends AssetLoader {
|
|
|
49
50
|
/**
|
|
50
51
|
*
|
|
51
52
|
* @param {String} path
|
|
53
|
+
* @param {AssetRequestScope} scope
|
|
52
54
|
* @return {Promise<ImageRGBADataAsset>}
|
|
53
55
|
* @private
|
|
54
56
|
*/
|
|
55
|
-
async __standard(path) {
|
|
57
|
+
async __standard(path, scope) {
|
|
56
58
|
|
|
57
|
-
const bitmap = await this.__decode_via_worker(path);
|
|
59
|
+
const bitmap = await this.__decode_via_worker(path, scope);
|
|
58
60
|
|
|
59
61
|
|
|
60
62
|
let data;
|
|
@@ -75,32 +77,37 @@ export class ImageRGBADataLoader extends AssetLoader {
|
|
|
75
77
|
return new ImageRGBADataAsset(data, bitmap.width, bitmap.height, bitmap.itemSize);
|
|
76
78
|
}
|
|
77
79
|
|
|
78
|
-
load(path, success, failure, progress) {
|
|
80
|
+
load(scope, path, success, failure, progress) {
|
|
79
81
|
const extension = computeFileExtension(path);
|
|
80
82
|
|
|
81
83
|
if (extension === 'dds') {
|
|
82
84
|
//compressed texture
|
|
83
|
-
this.assetManager.get(
|
|
85
|
+
this.assetManager.get({
|
|
86
|
+
path: path,
|
|
87
|
+
scope,
|
|
88
|
+
type: GameAssetType.Texture,
|
|
89
|
+
callback: asset => {
|
|
84
90
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
91
|
+
/**
|
|
92
|
+
*
|
|
93
|
+
* @type {Texture}
|
|
94
|
+
*/
|
|
95
|
+
const texture = asset.create();
|
|
90
96
|
|
|
91
|
-
|
|
97
|
+
const sampler2D = convertTexture2Sampler2D(texture);
|
|
92
98
|
|
|
93
|
-
|
|
99
|
+
texture.dispose();
|
|
94
100
|
|
|
95
|
-
|
|
101
|
+
const f = new ImageRGBADataAsset(sampler2D.data, sampler2D.width, sampler2D.height, sampler2D.itemSize);
|
|
96
102
|
|
|
97
|
-
|
|
103
|
+
success(f);
|
|
98
104
|
|
|
99
|
-
|
|
105
|
+
}, failure: failure, progress: progress
|
|
106
|
+
});
|
|
100
107
|
|
|
101
108
|
} else {
|
|
102
109
|
|
|
103
|
-
this.__standard(path).then(success, failure);
|
|
110
|
+
this.__standard(path, scope).then(success, failure);
|
|
104
111
|
|
|
105
112
|
}
|
|
106
113
|
}
|
|
@@ -4,7 +4,7 @@ import { loadStandardImageTexture } from "./loadStandardImageTexture.js";
|
|
|
4
4
|
import { computeFileExtension } from "../../../../core/path/computeFileExtension.js";
|
|
5
5
|
|
|
6
6
|
export class TextureAssetLoader extends AssetLoader {
|
|
7
|
-
load(path, success, failure, progress) {
|
|
7
|
+
load(scope, path, success, failure, progress) {
|
|
8
8
|
//figure out what kind of a texture it is
|
|
9
9
|
let fileExtension = computeFileExtension(path);
|
|
10
10
|
|
|
@@ -158,7 +158,7 @@ Preloader.prototype.load = function (assetManager) {
|
|
|
158
158
|
});
|
|
159
159
|
|
|
160
160
|
batch.forEach(function (def) {
|
|
161
|
-
assetManager.get(def.uri, def.type, assetLoadSuccess, assetLoadFailed);
|
|
161
|
+
assetManager.get({ path: def.uri, type: def.type, callback: assetLoadSuccess, failure: assetLoadFailed });
|
|
162
162
|
});
|
|
163
163
|
}
|
|
164
164
|
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
export class MetricStatistics {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
mean = 0;
|
|
3
|
+
median = 0;
|
|
4
|
+
max = 0;
|
|
5
|
+
min = 0;
|
|
6
|
+
|
|
7
|
+
toString() {
|
|
8
|
+
return `{min:${this.min}, max:${this.max}, mean:${this.mean}, median:${this.median}`;
|
|
7
9
|
}
|
|
8
10
|
}
|
|
@@ -49,7 +49,7 @@ export class RingBufferMetric extends AbstractMetric {
|
|
|
49
49
|
|
|
50
50
|
// no data
|
|
51
51
|
result.mean = 0;
|
|
52
|
-
result.
|
|
52
|
+
result.median = 0;
|
|
53
53
|
result.min = 0;
|
|
54
54
|
result.max = 0;
|
|
55
55
|
|
|
@@ -58,7 +58,7 @@ export class RingBufferMetric extends AbstractMetric {
|
|
|
58
58
|
} else {
|
|
59
59
|
|
|
60
60
|
result.mean = computeStatisticalMean(array, 0, data_count);
|
|
61
|
-
result.
|
|
61
|
+
result.median = computeStatisticalPartialMedian(array, 0, data_count);
|
|
62
62
|
result.max = computeArrayMax(array, 0, data_count);
|
|
63
63
|
result.min = computeArrayMin(array, 0, data_count);
|
|
64
64
|
|
|
@@ -38,12 +38,14 @@ export function loadFoliageLayer(layer, assetManager) {
|
|
|
38
38
|
reject(`Undetermined asset type for url='${modelURL}'`);
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
-
assetManager.get(
|
|
42
|
-
|
|
43
|
-
|
|
41
|
+
assetManager.get({
|
|
42
|
+
path: modelURL, type: assetType, callback: function (asset) {
|
|
43
|
+
const mesh = asset.create();
|
|
44
|
+
instancedFoliage.setInstance(mesh.geometry, mesh.material);
|
|
44
45
|
|
|
45
|
-
|
|
46
|
-
|
|
46
|
+
resolve();
|
|
47
|
+
}, failure: reject
|
|
48
|
+
});
|
|
47
49
|
});
|
|
48
50
|
|
|
49
51
|
const result = mesh.then(function () {
|
|
@@ -78,6 +78,7 @@ export function convertInstancedMeshComponents2Entities(dataset, assetManager) {
|
|
|
78
78
|
export function optimizeIndividualMeshesEntitiesToInstances(dataset, threshold = 30) {
|
|
79
79
|
//get all entities that have a translation and mesh only
|
|
80
80
|
const candidates = {};
|
|
81
|
+
const not_loaded = {};
|
|
81
82
|
|
|
82
83
|
/**
|
|
83
84
|
*
|
|
@@ -99,7 +100,14 @@ export function optimizeIndividualMeshesEntitiesToInstances(dataset, threshold =
|
|
|
99
100
|
}
|
|
100
101
|
|
|
101
102
|
if (!mesh.getFlag(MeshFlags.Loaded)) {
|
|
102
|
-
|
|
103
|
+
let misses = not_loaded[model_url];
|
|
104
|
+
|
|
105
|
+
if (misses === undefined) {
|
|
106
|
+
misses = not_loaded[model_url] = [];
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
misses.push(entity);
|
|
110
|
+
|
|
103
111
|
return;
|
|
104
112
|
}
|
|
105
113
|
|
|
@@ -125,6 +133,11 @@ export function optimizeIndividualMeshesEntitiesToInstances(dataset, threshold =
|
|
|
125
133
|
// traverse entities that have only Mesh and a Transform
|
|
126
134
|
dataset.traverseEntitiesExact([Mesh, Transform], visitMeshTransformEntity);
|
|
127
135
|
|
|
136
|
+
for (const mesh_url in not_loaded) {
|
|
137
|
+
|
|
138
|
+
console.warn(`Mesh[${mesh_url}] not loaded, ${not_loaded[mesh_url].length} entities affected`);
|
|
139
|
+
}
|
|
140
|
+
|
|
128
141
|
const tasks = [];
|
|
129
142
|
|
|
130
143
|
const foliage2 = new InstancedMeshComponent();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {System} from "../System";
|
|
2
2
|
import Engine from "../../Engine";
|
|
3
3
|
import View from "../../../view/View";
|
|
4
|
-
import
|
|
4
|
+
import GUIElement from "./GUIElement";
|
|
5
5
|
|
|
6
6
|
export default class GUIElementSystem extends System<GUIElement> {
|
|
7
7
|
constructor(container: View, engine: Engine)
|
|
@@ -4,9 +4,9 @@ import { AttachmentSockets } from "../AttachmentSockets.js";
|
|
|
4
4
|
import { Asset } from "../../../asset/Asset.js";
|
|
5
5
|
|
|
6
6
|
export class AttachmentSocketsAssetLoader extends AssetLoader {
|
|
7
|
-
load(path, success, failure, progress) {
|
|
7
|
+
load(scope, path, success, failure, progress) {
|
|
8
8
|
|
|
9
|
-
this.assetManager.promise(path, GameAssetType.JSON)
|
|
9
|
+
this.assetManager.promise(path, GameAssetType.JSON, { scope })
|
|
10
10
|
.then(asset => {
|
|
11
11
|
|
|
12
12
|
const json = asset.create();
|
|
@@ -41,19 +41,26 @@ export function promiseSamplerHeight(zRange, heightMapURL, assetManager) {
|
|
|
41
41
|
fulfill(defaultSampler);
|
|
42
42
|
} else if (heightMapURL.endsWith('.bin')) {
|
|
43
43
|
//load texture from a binary file
|
|
44
|
-
assetManager.get(
|
|
44
|
+
assetManager.get({
|
|
45
|
+
path: heightMapURL,
|
|
46
|
+
type: GameAssetType.ArrayBuffer,
|
|
47
|
+
callback: assetObtained,
|
|
48
|
+
failure: reject
|
|
49
|
+
});
|
|
45
50
|
} else {
|
|
46
|
-
assetManager.get(
|
|
47
|
-
|
|
51
|
+
assetManager.get({
|
|
52
|
+
path: heightMapURL, type: GameAssetType.Image, callback: function (asset) {
|
|
53
|
+
const image = asset.create();
|
|
48
54
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
55
|
+
// plane
|
|
56
|
+
const imgWidth = image.width;
|
|
57
|
+
const imgHeight = image.height;
|
|
52
58
|
|
|
53
|
-
|
|
59
|
+
const samplerHeight = rgbaData2valueSampler2D(image.data, imgWidth, imgHeight, zRange, -zRange / 2);
|
|
54
60
|
|
|
55
|
-
|
|
56
|
-
|
|
61
|
+
fulfill(samplerHeight);
|
|
62
|
+
}, failure: reject
|
|
63
|
+
});
|
|
57
64
|
}
|
|
58
65
|
});
|
|
59
66
|
}
|