@needle-tools/engine 4.8.5 → 4.8.6-next.7fdd4fa
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/CHANGELOG.md +4 -1
- package/dist/{needle-engine.bundle-C-qzYkeq.umd.cjs → needle-engine.bundle-B1l8PaE0.umd.cjs} +92 -92
- package/dist/{needle-engine.bundle-fEU9eTH-.js → needle-engine.bundle-C6TN-zhq.js} +3172 -3193
- package/dist/{needle-engine.bundle-CKG2fLvO.min.js → needle-engine.bundle-D6OHYyGz.min.js} +81 -81
- package/dist/needle-engine.js +96 -95
- package/dist/needle-engine.min.js +1 -1
- package/dist/needle-engine.umd.cjs +1 -1
- package/lib/engine/api.d.ts +1 -0
- package/lib/engine/api.js +1 -0
- package/lib/engine/api.js.map +1 -1
- package/lib/engine/engine_pmrem.d.ts +6 -0
- package/lib/engine/engine_pmrem.js +9 -40
- package/lib/engine/engine_pmrem.js.map +1 -1
- package/lib/engine-components/Skybox.js +1 -1
- package/package.json +3 -3
- package/src/engine/api.ts +1 -0
- package/src/engine/engine_pmrem.ts +9 -44
- package/src/engine-components/Skybox.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine_pmrem.js","sourceRoot":"","sources":["../../src/engine/engine_pmrem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAW,aAAa,EAAiB,MAAM,OAAO,CAAC;AACvG,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AAEjE,OAAO,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"engine_pmrem.js","sourceRoot":"","sources":["../../src/engine/engine_pmrem.ts"],"names":[],"mappings":"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"}
|
|
@@ -247,7 +247,7 @@ export class RemoteSkybox extends Behaviour {
|
|
|
247
247
|
}
|
|
248
248
|
isValidTextureType(url) {
|
|
249
249
|
for (const type of this.validTextureTypes) {
|
|
250
|
-
if (url.
|
|
250
|
+
if (url.includes(type))
|
|
251
251
|
return true;
|
|
252
252
|
}
|
|
253
253
|
for (const protocol of this.validProtocols) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@needle-tools/engine",
|
|
3
|
-
"version": "4.8.
|
|
3
|
+
"version": "4.8.6-next.7fdd4fa",
|
|
4
4
|
"description": "Needle Engine is a web-based runtime for 3D apps. It runs on your machine for development with great integrations into editors like Unity or Blender - and can be deployed onto any device! It is flexible, extensible and networking and XR are built-in.",
|
|
5
5
|
"main": "dist/needle-engine.min.js",
|
|
6
6
|
"exports": {
|
|
@@ -102,7 +102,7 @@
|
|
|
102
102
|
"postprocessing": "^6.36.6",
|
|
103
103
|
"simplex-noise": "^4.0.1",
|
|
104
104
|
"stats.js": "^0.17.0",
|
|
105
|
-
"three": "npm:@needle-tools/three@0.169.
|
|
105
|
+
"three": "npm:@needle-tools/three@0.169.9",
|
|
106
106
|
"three-mesh-bvh": "^0.9.1",
|
|
107
107
|
"three-mesh-ui": "npm:@needle-tools/three-mesh-ui@^7.1.5-alpha.5",
|
|
108
108
|
"three.quarks": "0.15.6",
|
|
@@ -167,4 +167,4 @@
|
|
|
167
167
|
"module": "lib/needle-engine.js",
|
|
168
168
|
"typings": "lib/needle-engine.d.ts",
|
|
169
169
|
"types": "lib/needle-engine.d.ts"
|
|
170
|
-
}
|
|
170
|
+
}
|
package/src/engine/api.ts
CHANGED
|
@@ -59,6 +59,7 @@ export * from "./engine_physics.js";
|
|
|
59
59
|
export * from "./engine_physics.types.js";
|
|
60
60
|
export * from "./engine_physics_rapier.js";
|
|
61
61
|
export * from "./engine_playerview.js";
|
|
62
|
+
export { loadPMREM } from "./engine_pmrem.js";
|
|
62
63
|
export * from "./engine_scenelighting.js";
|
|
63
64
|
export * from "./engine_serialization.js";
|
|
64
65
|
export { type ISerializable } from "./engine_serialization_core.js";
|
|
@@ -3,12 +3,17 @@ import { CubeUVReflectionMapping, SRGBColorSpace, Texture, TextureLoader, WebGLR
|
|
|
3
3
|
import { EXRLoader } from "three/examples/jsm/loaders/EXRLoader";
|
|
4
4
|
import { KTX2Loader } from "three/examples/jsm/loaders/KTX2Loader";
|
|
5
5
|
import { RGBELoader } from "three/examples/jsm/loaders/RGBELoader";
|
|
6
|
-
import { disposeObjectResources, setDisposable } from "./engine_assetdatabase.js";
|
|
7
6
|
|
|
8
7
|
const running: Map<string, Promise<Texture | null>> = new Map();
|
|
9
8
|
|
|
10
9
|
// #region api
|
|
11
10
|
|
|
11
|
+
/**
|
|
12
|
+
* Loads a PMREM texture from the given URL. This also supports the ultra-fast preprocessed environment maps (PMREM) format.
|
|
13
|
+
* @param url The URL of the PMREM texture to load.
|
|
14
|
+
* @param renderer The WebGLRenderer to use for loading the texture.
|
|
15
|
+
* @returns A promise that resolves to the loaded texture or null if loading failed.
|
|
16
|
+
*/
|
|
12
17
|
export function loadPMREM(url: string, renderer: WebGLRenderer): Promise<Texture | null> {
|
|
13
18
|
if (running.has(url)) {
|
|
14
19
|
return running.get(url)!;
|
|
@@ -16,47 +21,13 @@ export function loadPMREM(url: string, renderer: WebGLRenderer): Promise<Texture
|
|
|
16
21
|
const actualUrl = new URL(url, window.location.href);
|
|
17
22
|
const promise = internalLoadPMREM(actualUrl, renderer);
|
|
18
23
|
running.set(url, promise);
|
|
24
|
+
promise.finally(() => {
|
|
25
|
+
running.delete(url);
|
|
26
|
+
});
|
|
19
27
|
return promise;
|
|
20
28
|
}
|
|
21
29
|
|
|
22
30
|
|
|
23
|
-
|
|
24
|
-
// #region Cache
|
|
25
|
-
|
|
26
|
-
declare type SkyboxCacheEntry = { src: string, texture: Promise<Texture | null> };
|
|
27
|
-
function ensureGlobalCache() {
|
|
28
|
-
if (!globalThis["NEEDLE_ENGINE_SKYBOX_TEXTURES"])
|
|
29
|
-
globalThis["NEEDLE_ENGINE_SKYBOX_TEXTURES"] = new Array<SkyboxCacheEntry>();
|
|
30
|
-
return globalThis["NEEDLE_ENGINE_SKYBOX_TEXTURES"] as Array<SkyboxCacheEntry>;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
function tryGetPreviouslyLoadedTexture(src: string) {
|
|
34
|
-
const cache = ensureGlobalCache();
|
|
35
|
-
const found = cache.find(x => x.src === src);
|
|
36
|
-
if (found) {
|
|
37
|
-
return found.texture;
|
|
38
|
-
}
|
|
39
|
-
return null;
|
|
40
|
-
}
|
|
41
|
-
async function disposeCachedTexture(tex: Promise<Texture | null>) {
|
|
42
|
-
const texture = await tex;
|
|
43
|
-
if (!texture) return;
|
|
44
|
-
setDisposable(texture, true);
|
|
45
|
-
disposeObjectResources(texture);
|
|
46
|
-
}
|
|
47
|
-
function registerPromise(src: string, texture: Promise<Texture | null>) {
|
|
48
|
-
const cache = ensureGlobalCache();
|
|
49
|
-
// Make sure the cache doesnt get too big
|
|
50
|
-
while (cache.length > 5) {
|
|
51
|
-
const entry = cache.shift();
|
|
52
|
-
if (entry) { disposeCachedTexture(entry.texture); }
|
|
53
|
-
}
|
|
54
|
-
texture.then(t => { return setDisposable(t, false) });
|
|
55
|
-
cache.push({ src, texture });
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
31
|
// #region loading
|
|
61
32
|
|
|
62
33
|
|
|
@@ -66,11 +37,6 @@ async function internalLoadPMREM(url: URL, renderer: WebGLRenderer) {
|
|
|
66
37
|
const pathname = url.pathname;
|
|
67
38
|
const isPMREM_URL: boolean = url.toString().toLowerCase().includes("pmrem") || url.searchParams.get("pmrem") != null;
|
|
68
39
|
|
|
69
|
-
const cached = tryGetPreviouslyLoadedTexture(pathname);
|
|
70
|
-
if (cached) {
|
|
71
|
-
const res = await cached;
|
|
72
|
-
if (res?.source?.data?.length > 0 || res?.source?.data?.data?.length) return res;
|
|
73
|
-
}
|
|
74
40
|
const isEXR = pathname.endsWith(".exr");
|
|
75
41
|
const isHdr = pathname.endsWith(".hdr");
|
|
76
42
|
const isKtx2 = pathname.endsWith(".ktx2");
|
|
@@ -109,7 +75,6 @@ async function internalLoadPMREM(url: URL, renderer: WebGLRenderer) {
|
|
|
109
75
|
return tex;
|
|
110
76
|
});
|
|
111
77
|
|
|
112
|
-
registerPromise(str, promise);
|
|
113
78
|
const texture = await promise.catch(_err => {
|
|
114
79
|
console.warn("Failed to load texture from url:", url);
|
|
115
80
|
return null;
|
|
@@ -273,7 +273,7 @@ export class RemoteSkybox extends Behaviour {
|
|
|
273
273
|
|
|
274
274
|
private isValidTextureType(url: string): boolean {
|
|
275
275
|
for (const type of this.validTextureTypes) {
|
|
276
|
-
if (url.
|
|
276
|
+
if (url.includes(type)) return true;
|
|
277
277
|
}
|
|
278
278
|
for (const protocol of this.validProtocols) {
|
|
279
279
|
if (url.startsWith(protocol)) return true;
|