@needle-tools/gltf-progressive 1.0.0-alpha.3 → 1.0.0-alpha.5
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 +1 -1
- package/{dist/@needle-tools-gltf-progressive.js → gltf-progressive.js} +57 -39
- package/gltf-progressive.min.js +3 -0
- package/gltf-progressive.umd.cjs +3 -0
- package/{types → lib}/extension.d.ts +109 -109
- package/lib/extension.js +673 -0
- package/lib/extension.js.map +1 -0
- package/lib/index.d.ts +26 -0
- package/lib/index.js +38 -0
- package/lib/index.js.map +1 -0
- package/{types → lib}/loaders.d.ts +4 -4
- package/lib/loaders.js +36 -0
- package/lib/loaders.js.map +1 -0
- package/{types → lib}/lods_manager.d.ts +69 -51
- package/lib/lods_manager.js +355 -0
- package/lib/lods_manager.js.map +1 -0
- package/{types → lib}/plugins/index.d.ts +2 -2
- package/lib/plugins/index.js +3 -0
- package/lib/plugins/index.js.map +1 -0
- package/lib/plugins/modelviewer.d.ts +4 -0
- package/lib/plugins/modelviewer.js +126 -0
- package/lib/plugins/modelviewer.js.map +1 -0
- package/{types → lib}/plugins/plugin.d.ts +24 -14
- package/lib/plugins/plugin.js +12 -0
- package/lib/plugins/plugin.js.map +1 -0
- package/{types → lib}/utils.d.ts +2 -2
- package/lib/utils.js +37 -0
- package/lib/utils.js.map +1 -0
- package/package.json +19 -3
- package/dist/@needle-tools-gltf-progressive.min.js +0 -3
- package/dist/@needle-tools-gltf-progressive.umd.cjs +0 -3
- package/types/index.d.ts +0 -10
- package/types/plugins/modelviewer.d.ts +0 -15
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lods_manager.js","sourceRoot":"","sources":["../../src/lods_manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { patchModelViewer } from "./modelviewer.js";
|
|
2
|
-
export { registerPlugin, type NEEDLE_progressive_plugin } from "./plugin.js";
|
|
1
|
+
export { patchModelViewer } from "./modelviewer.js";
|
|
2
|
+
export { registerPlugin, type NEEDLE_progressive_plugin } from "./plugin.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAkC,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { LODsManager } from "../lods_manager.js";
|
|
2
|
+
import { EXTENSION_NAME, NEEDLE_progressive } from "../extension.js";
|
|
3
|
+
const $meshLODSymbol = Symbol("NEEDLE_mesh_lod");
|
|
4
|
+
const $textureLODSymbol = Symbol("NEEDLE_texture_lod");
|
|
5
|
+
/** Patch modelviewer to support NEEDLE progressive system
|
|
6
|
+
* @returns a function to remove the patch
|
|
7
|
+
*/
|
|
8
|
+
export function patchModelViewer(modelviewer) {
|
|
9
|
+
if (!modelviewer)
|
|
10
|
+
return null;
|
|
11
|
+
let renderer = null;
|
|
12
|
+
let scene = null;
|
|
13
|
+
for (let p = modelviewer; p != null; p = Object.getPrototypeOf(p)) {
|
|
14
|
+
const privateAPI = Object.getOwnPropertySymbols(p);
|
|
15
|
+
const rendererSymbol = privateAPI.find((value) => value.toString() == 'Symbol(renderer)');
|
|
16
|
+
const sceneSymbol = privateAPI.find((value) => value.toString() == 'Symbol(scene)');
|
|
17
|
+
if (!renderer && rendererSymbol != null) {
|
|
18
|
+
renderer = modelviewer[rendererSymbol].threeRenderer;
|
|
19
|
+
}
|
|
20
|
+
if (!scene && sceneSymbol != null) {
|
|
21
|
+
scene = modelviewer[sceneSymbol];
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
if (renderer) {
|
|
25
|
+
console.log("Adding Needle LODs to modelviewer");
|
|
26
|
+
const lod = new LODsManager(renderer);
|
|
27
|
+
lod.plugins.push(new RegisterModelviewerDataPlugin(modelviewer));
|
|
28
|
+
lod.enable();
|
|
29
|
+
if (scene) {
|
|
30
|
+
const camera = scene["camera"] || scene.traverse((o) => o.type == "PerspectiveCamera")[0];
|
|
31
|
+
if (camera) {
|
|
32
|
+
renderer.render(scene, camera);
|
|
33
|
+
// setTimeout(() => {
|
|
34
|
+
// renderer.render(scene, camera);
|
|
35
|
+
// }, 100)
|
|
36
|
+
// setTimeout(() => {
|
|
37
|
+
// renderer.render(scene, camera);
|
|
38
|
+
// }, 1200)
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return () => {
|
|
42
|
+
lod.disable();
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* LODs manager plugin that registers LOD data to the NEEDLE progressive system
|
|
49
|
+
*/
|
|
50
|
+
class RegisterModelviewerDataPlugin {
|
|
51
|
+
modelviewer;
|
|
52
|
+
constructor(modelviewer) {
|
|
53
|
+
this.modelviewer = modelviewer;
|
|
54
|
+
}
|
|
55
|
+
onBeforeUpdateLOD(_renderer, scene, _camera, object) {
|
|
56
|
+
this.tryParseMeshLOD(scene, object);
|
|
57
|
+
this.tryParseTextureLOD(scene, object);
|
|
58
|
+
}
|
|
59
|
+
getUrl() {
|
|
60
|
+
return this.modelviewer.getAttribute("src");
|
|
61
|
+
}
|
|
62
|
+
tryGetCurrentGLTF(scene) {
|
|
63
|
+
return scene._currentGLTF;
|
|
64
|
+
}
|
|
65
|
+
tryParseTextureLOD(scene, object) {
|
|
66
|
+
if (object[$textureLODSymbol] == true)
|
|
67
|
+
return;
|
|
68
|
+
object[$textureLODSymbol] = true;
|
|
69
|
+
const currentGLTF = this.tryGetCurrentGLTF(scene);
|
|
70
|
+
const url = this.getUrl();
|
|
71
|
+
if (!url) {
|
|
72
|
+
console.error("No url found in modelviewer");
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (currentGLTF) {
|
|
76
|
+
if (object.material) {
|
|
77
|
+
const mat = object.material;
|
|
78
|
+
if (Array.isArray(mat))
|
|
79
|
+
for (const m of mat)
|
|
80
|
+
handleMaterial(m);
|
|
81
|
+
else
|
|
82
|
+
handleMaterial(mat);
|
|
83
|
+
function handleMaterial(mat) {
|
|
84
|
+
if (mat[$textureLODSymbol] == true)
|
|
85
|
+
return;
|
|
86
|
+
mat[$textureLODSymbol] = true;
|
|
87
|
+
// make sure to force the material to be updated
|
|
88
|
+
if (mat.userData)
|
|
89
|
+
mat.userData.LOD = -1;
|
|
90
|
+
const keys = Object.keys(mat);
|
|
91
|
+
for (let i = 0; i < keys.length; i++) {
|
|
92
|
+
const key = keys[i];
|
|
93
|
+
const value = mat[key];
|
|
94
|
+
if (value?.isTexture === true) {
|
|
95
|
+
const textureIndex = value.userData?.associations?.textures;
|
|
96
|
+
const textureData = currentGLTF.parser.json.textures[textureIndex];
|
|
97
|
+
if (textureData.extensions?.[EXTENSION_NAME]) {
|
|
98
|
+
const ext = textureData.extensions[EXTENSION_NAME];
|
|
99
|
+
if (ext && url) {
|
|
100
|
+
NEEDLE_progressive.registerTexture(url, value, ext.lods.length, ext);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
tryParseMeshLOD(_scene, object) {
|
|
110
|
+
if (object[$meshLODSymbol] == true)
|
|
111
|
+
return;
|
|
112
|
+
object[$meshLODSymbol] = true;
|
|
113
|
+
const url = this.getUrl();
|
|
114
|
+
if (!url) {
|
|
115
|
+
console.error("No url found in modelviewer");
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
// modelviewer has all the information we need in the userData (associations + gltfExtensions)
|
|
119
|
+
const ext = object.userData?.["gltfExtensions"]?.[EXTENSION_NAME];
|
|
120
|
+
if (ext && url) {
|
|
121
|
+
const lodKey = object.uuid;
|
|
122
|
+
NEEDLE_progressive.registerMesh(url, lodKey, object, 0, ext.lods.length, ext);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=modelviewer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modelviewer.js","sourceRoot":"","sources":["../../../src/plugins/modelviewer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,24 @@
|
|
|
1
|
-
import { WebGLRenderer, Scene, Camera, Mesh } from 'three';
|
|
2
|
-
import { NEEDLE_progressive_mesh_model } from '../extension.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
1
|
+
import { WebGLRenderer, Scene, Camera, Mesh } from 'three';
|
|
2
|
+
import { NEEDLE_progressive_mesh_model } from '../extension.js';
|
|
3
|
+
/**
|
|
4
|
+
* This interface is used to define a plugin for the progressive extension. It can be registered using the `registerPlugin` function.
|
|
5
|
+
*/
|
|
6
|
+
export interface NEEDLE_progressive_plugin {
|
|
7
|
+
/** Called before the LOD level will be requested/updated for a object */
|
|
8
|
+
onBeforeUpdateLOD?(renderer: WebGLRenderer, scene: Scene, camera: Camera, object: Mesh): void;
|
|
9
|
+
/** Called after the LOD level has been requested */
|
|
10
|
+
onAfterUpdatedLOD?(renderer: WebGLRenderer, scene: Scene, camera: Camera, object: Mesh, level: number): void;
|
|
11
|
+
/** Called when a new mesh is registered */
|
|
12
|
+
onRegisteredNewMesh?(mesh: Mesh, ext: NEEDLE_progressive_mesh_model): void;
|
|
13
|
+
/** Called before the LOD mesh is fetched */
|
|
14
|
+
onBeforeGetLODMesh?(mesh: Mesh, level: number): void;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* List of registered plugins for the progressive extension. Please use the `registerPlugin` function to add a plugin.
|
|
18
|
+
* @internal
|
|
19
|
+
*/
|
|
20
|
+
export declare const plugins: NEEDLE_progressive_plugin[];
|
|
21
|
+
/**
|
|
22
|
+
* Register a plugin for the progressive extension. The plugin callbacks will be called at different stages of the progressive extension.
|
|
23
|
+
*/
|
|
24
|
+
export declare function registerPlugin(plugin: NEEDLE_progressive_plugin): void;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* List of registered plugins for the progressive extension. Please use the `registerPlugin` function to add a plugin.
|
|
3
|
+
* @internal
|
|
4
|
+
*/
|
|
5
|
+
export const plugins = new Array();
|
|
6
|
+
/**
|
|
7
|
+
* Register a plugin for the progressive extension. The plugin callbacks will be called at different stages of the progressive extension.
|
|
8
|
+
*/
|
|
9
|
+
export function registerPlugin(plugin) {
|
|
10
|
+
plugins.push(plugin);
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/plugins/plugin.ts"],"names":[],"mappings":"AAoBA;;;GAGG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,KAAK,EAA6B,CAAC;AAE9D;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAiC;IAC5D,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACzB,CAAC"}
|
package/{types → lib}/utils.d.ts
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare function getParam(name: string): boolean | string;
|
|
2
|
-
export declare function resolveUrl(source: string | undefined, uri: string): string;
|
|
1
|
+
export declare function getParam(name: string): boolean | string;
|
|
2
|
+
export declare function resolveUrl(source: string | undefined, uri: string): string;
|
package/lib/utils.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export function getParam(name) {
|
|
2
|
+
const url = new URL(window.location.href);
|
|
3
|
+
const param = url.searchParams.get(name);
|
|
4
|
+
if (param == null || param === "0" || param === "false")
|
|
5
|
+
return false;
|
|
6
|
+
if (param === "")
|
|
7
|
+
return true;
|
|
8
|
+
return param;
|
|
9
|
+
}
|
|
10
|
+
export function resolveUrl(source, uri) {
|
|
11
|
+
if (uri === undefined) {
|
|
12
|
+
return uri;
|
|
13
|
+
}
|
|
14
|
+
if (uri.startsWith("./")) {
|
|
15
|
+
return uri;
|
|
16
|
+
}
|
|
17
|
+
if (uri.startsWith("http")) {
|
|
18
|
+
return uri;
|
|
19
|
+
}
|
|
20
|
+
if (source === undefined) {
|
|
21
|
+
return uri;
|
|
22
|
+
}
|
|
23
|
+
const pathIndex = source.lastIndexOf("/");
|
|
24
|
+
if (pathIndex >= 0) {
|
|
25
|
+
// Take the source uri as the base path
|
|
26
|
+
const basePath = source.substring(0, pathIndex + 1);
|
|
27
|
+
// make sure we don't have double slashes
|
|
28
|
+
while (basePath.endsWith("/") && uri.startsWith("/"))
|
|
29
|
+
uri = uri.substring(1);
|
|
30
|
+
// Append the relative uri
|
|
31
|
+
const newUri = basePath + uri;
|
|
32
|
+
// newUri = new URL(newUri, globalThis.location.href).href;
|
|
33
|
+
return newUri;
|
|
34
|
+
}
|
|
35
|
+
return uri;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=utils.js.map
|
package/lib/utils.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,QAAQ,CAAC,IAAY;IACjC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IACtE,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC9B,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAA0B,EAAE,GAAW;IAC9D,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACpB,OAAO,GAAG,CAAC;IACf,CAAC;IACD,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC;IACf,CAAC;IACD,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,OAAO,GAAG,CAAC;IACf,CAAC;IACD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC;IACf,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACjB,uCAAuC;QACvC,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;QACpD,yCAAyC;QACzC,OAAO,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC7E,0BAA0B;QAC1B,MAAM,MAAM,GAAG,QAAQ,GAAG,GAAG,CAAC;QAC9B,2DAA2D;QAC3D,OAAO,MAAM,CAAC;IAClB,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@needle-tools/gltf-progressive",
|
|
3
|
-
"version": "1.0.0-alpha.
|
|
3
|
+
"version": "1.0.0-alpha.5",
|
|
4
4
|
"description": "three.js support for loading glTF or GLB files that contain progressive loading data",
|
|
5
5
|
"homepage": "https://needle.tools",
|
|
6
6
|
"author": {
|
|
@@ -20,13 +20,29 @@
|
|
|
20
20
|
"webgl",
|
|
21
21
|
"optimization"
|
|
22
22
|
],
|
|
23
|
+
"main": "./lib/index.js",
|
|
24
|
+
"exports": {
|
|
25
|
+
".": {
|
|
26
|
+
"import": "./lib/index.js",
|
|
27
|
+
"require": "./gltf-progressive.js"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
23
30
|
"peerDependencies": {
|
|
24
31
|
"three": ">= 0.160.0"
|
|
25
32
|
},
|
|
26
33
|
"devDependencies": {
|
|
27
34
|
"@types/three": "0.162.0",
|
|
28
35
|
"three": ">= 0.160.0",
|
|
29
|
-
"vite": "<= 4.3.9"
|
|
36
|
+
"vite": "<= 4.3.9",
|
|
37
|
+
"@stylistic/eslint-plugin-ts": "^1.5.4",
|
|
38
|
+
"@typescript-eslint/eslint-plugin": "^6.2.0",
|
|
39
|
+
"@typescript-eslint/parser": "^6.2.0",
|
|
40
|
+
"eslint": "^8.56.0",
|
|
41
|
+
"eslint-plugin-import": "^2.29.1",
|
|
42
|
+
"eslint-plugin-no-secrets": "^0.8.9",
|
|
43
|
+
"eslint-plugin-no-unsanitized": "^4.0.2",
|
|
44
|
+
"eslint-plugin-promise": "^6.1.1",
|
|
45
|
+
"eslint-plugin-xss": "^0.1.12"
|
|
30
46
|
},
|
|
31
|
-
"types": "./
|
|
47
|
+
"types": "./lib/index.d.ts"
|
|
32
48
|
}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
var se=Object.defineProperty,ne=(r,e,t)=>e in r?se(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,u=(r,e,t)=>(ne(r,typeof e!="symbol"?e+"":e,t),t);import{Mesh as W,BufferGeometry as U,Material as oe,RawShaderMaterial as ie,Texture as C,TextureLoader as ae,Matrix4 as K,Frustum as le,Sphere as ue,Box3 as Y,Vector3 as E}from"three";import{GLTFLoader as ce}from"three/examples/jsm/loaders/GLTFLoader.js";import{MeshoptDecoder as de}from"three/examples/jsm/libs/meshopt_decoder.module.js";import{DRACOLoader as he}from"three/examples/jsm/loaders/DRACOLoader.js";import{KTX2Loader as fe}from"three/examples/jsm/loaders/KTX2Loader.js";let ge="https://www.gstatic.com/draco/versioned/decoders/1.4.1/",pe="https://www.gstatic.com/basis-universal/versioned/2021-04-15-ba1c3e4/",R,$,G;function J(r){R||(R=new he,R.setDecoderPath(ge),R.setDecoderConfig({type:"js"})),G||(G=new fe,G.setTranscoderPath(pe)),$||($=de),r?G.detectSupport(r):console.warn("No renderer provided to detect ktx2 support - loading KTX2 textures will probably fail")}function Q(r){r.dracoLoader||r.setDRACOLoader(R),r.ktx2Loader||r.setKTX2Loader(G),r.meshoptDecoder||r.setMeshoptDecoder($)}function q(r){let e=new URL(window.location.href).searchParams.get(r);return e==null||e==="0"||e==="false"?!1:e===""?!0:e}function me(r,e){if(e===void 0||e.startsWith("./")||e.startsWith("http")||r===void 0)return e;const t=r.lastIndexOf("/");if(t>=0){const n=r.substring(0,t+1);for(;n.endsWith("/")&&e.startsWith("/");)e=e.substring(1);return n+e}return e}const V=new Array;function ye(r){V.push(r)}const B="NEEDLE_progressive",L=q("debugprogressive"),X=Symbol("needle-progressive-texture"),F=new Map,H=new Set;if(L){let r=function(){e+=1,console.log("Toggle LOD level",e,F),F.forEach((o,s)=>{for(const i of o.keys){const a=s[i];if(a.isBufferGeometry===!0){const l=O.getMeshLODInformation(a),d=l?Math.min(e,l.lods.length):0;s["DEBUG:LOD"]=d,O.assignMeshLOD(s,d),l&&(t=Math.max(t,l.lods.length-1))}else if(s.isMaterial===!0){s["DEBUG:LOD"]=e,O.assignTextureLOD(s,e);break}}}),e>=t&&(e=-1)},e=-1,t=2,n=!1;window.addEventListener("keyup",o=>{o.key==="p"&&r(),o.key==="w"&&(n=!n,H&&H.forEach(s=>{s.name!="BackgroundCubeMaterial"&&"wireframe"in s&&(s.wireframe=n)}))})}function Z(r,e,t){var n;if(!L)return;F.has(r)||F.set(r,{keys:[],sourceId:t});const o=F.get(r);((n=o?.keys)==null?void 0:n.includes(e))==!1&&o.keys.push(e)}const v=class{constructor(r,e){u(this,"parser"),u(this,"url"),L&&console.log("Progressive extension registered for",e),this.parser=r,this.url=e}get name(){return B}static getMeshLODInformation(r){const e=this.getAssignedLODInformation(r);return e!=null&&e.key?this.lodInfos.get(e.key):null}static hasLODLevelAvailable(r,e){var t;if(r.isMaterial===!0){for(const s of Object.keys(r)){const i=r[s];if(i.isTexture&&this.hasLODLevelAvailable(i,e))return!0}return!1}else if(r.isGroup===!0){for(const s of r.children)if(s.isMesh===!0&&this.hasLODLevelAvailable(s,e))return!0}let n,o;if(r.isMesh?n=r.geometry:(r.isBufferGeometry||r.isTexture)&&(n=r),n&&(t=n?.userData)!=null&&t.LODS){const s=n.userData.LODS;if(o=this.lodInfos.get(s.key),e===void 0)return o!=null;if(o)return Array.isArray(o.lods)?e<o.lods.length:e===0}return!1}static assignMeshLOD(r,e){var t;if(!r)return Promise.resolve(null);if(r instanceof W||r.isMesh===!0){const n=r.geometry,o=this.getAssignedLODInformation(n);if(!o)return Promise.resolve(null);for(const s of V)(t=s.onBeforeGetLODMesh)==null||t.call(s,r,e);return r["LOD:requested level"]=e,v.getOrLoadLOD(n,e).then(s=>{if(r["LOD:requested level"]===e){if(delete r["LOD:requested level"],Array.isArray(s)){const i=o.index||0;s=s[i]}s&&n!=s&&s instanceof U&&(r.geometry=s,L&&Z(r,"geometry",o.url))}return s}).catch(s=>(console.error("Error loading mesh LOD",r,s),null))}else L&&console.error("Invalid call to assignMeshLOD: Request mesh LOD but the object is not a mesh",r);return Promise.resolve(null)}static assignTextureLOD(r,e=0){if(!r)return Promise.resolve(null);if(r instanceof oe||r.isMaterial===!0){const t=r,n=[],o=new Array;if(L&&H.add(t),t instanceof ie)for(const s of Object.keys(t.uniforms)){const i=t.uniforms[s].value;if(i?.isTexture===!0){const a=this.assignTextureLODForSlot(i,e,t,s);n.push(a),o.push(s)}}else for(const s of Object.keys(t)){const i=t[s];if(i?.isTexture===!0){const a=this.assignTextureLODForSlot(i,e,t,s);n.push(a),o.push(s)}}return Promise.all(n).then(s=>{const i=new Array;for(let a=0;a<s.length;a++){const l=s[a],d=o[a];l&&l.isTexture===!0?i.push({material:t,slot:d,texture:l,level:e}):i.push({material:t,slot:d,texture:null,level:e})}return i})}if(r instanceof C||r.isTexture===!0){const t=r;return this.assignTextureLODForSlot(t,e,null,null)}return Promise.resolve(null)}static assignTextureLODForSlot(r,e,t,n){return r?.isTexture!==!0?Promise.resolve(null):v.getOrLoadLOD(r,e).then(o=>{if(Array.isArray(o))return null;if(o?.isTexture===!0){if(o!=r&&(t&&n&&(t[n]=o),L&&n&&t)){const s=this.getAssignedLODInformation(r);s&&Z(t,n,s.url)}return o}else L=="verbose"&&console.warn("No LOD found for",r,e);return null}).catch(o=>(console.error("Error loading LOD",r,o),null))}afterRoot(r){var e,t;return L&&console.log("AFTER",this.url,r),(e=this.parser.json.textures)==null||e.forEach((n,o)=>{if(n!=null&&n.extensions){const s=n?.extensions[B];if(s){let i=!1;for(const a of this.parser.associations.keys())a.isTexture===!0&&this.parser.associations.get(a).textures===o&&(i=!0,v.registerTexture(this.url,a,o,s));i||this.parser.getDependency("texture",o).then(a=>{a&&v.registerTexture(this.url,a,o,s)})}}}),(t=this.parser.json.meshes)==null||t.forEach((n,o)=>{if(n!=null&&n.extensions){const s=n?.extensions[B];if(s&&s.lods){for(const i of this.parser.associations.keys())if(i.isMesh){const a=this.parser.associations.get(i);a.meshes===o&&v.registerMesh(this.url,i.uuid,i,s.lods.length,a.primitives,s)}}}}),null}static async getOrLoadLOD(r,e){var t,n,o;const s=L=="verbose",i=r.userData.LODS;if(!i)return null;const a=i?.key;let l;if(r.isTexture===!0){const d=r;d.source&&d.source[X]&&(l=d.source[X])}if(l||(l=v.lodInfos.get(a)),l){if(e>0){let g=!1;const M=Array.isArray(l.lods);if(M&&e>=l.lods.length?g=!0:M||(g=!0),g)return this.lowresCache.get(a)}const d=Array.isArray(l.lods)?l.lods[e].path:l.lods;if(!d)return L&&!l["missing:uri"]&&(l["missing:uri"]=!0,console.warn("Missing uri for progressive asset for LOD "+e,l)),null;const c=me(i.url,d);if(c.endsWith(".glb")||c.endsWith(".gltf")){if(!l.guid)return console.warn("missing pointer for glb/gltf texture",l),null;const g=c+"_"+l.guid,M=this.previouslyLoaded.get(g);if(M!==void 0){s&&console.log(`LOD ${e} was already loading/loaded: ${g}`);let m=await M.catch(p=>(console.error(`Error loading LOD ${e} from ${c}
|
|
2
|
-
`,p),null)),f=!1;if(m==null||(m instanceof C&&r instanceof C?(t=m.image)!=null&&t.data||(n=m.source)!=null&&n.data?m=this.copySettings(r,m):(f=!0,this.previouslyLoaded.delete(g)):m instanceof U&&r instanceof U&&((o=m.attributes.position)!=null&&o.array||(f=!0,this.previouslyLoaded.delete(g)))),!f)return m}const y=l,A=new Promise(async(m,f)=>{const p=new ce;Q(p),L&&(await new Promise(D=>setTimeout(D,1e3)),s&&console.warn("Start loading (delayed) "+c,y.guid));let b=c;if(y&&Array.isArray(y.lods)){const D=y.lods[e];D.hash&&(b+="?v="+D.hash)}const x=await p.loadAsync(b).catch(D=>(console.error(`Error loading LOD ${e} from ${c}
|
|
3
|
-
`,D),null));if(!x)return null;const S=x.parser;s&&console.log("Loading finished "+c,y.guid);let T=0;if(x.parser.json.textures){let D=!1;for(const h of x.parser.json.textures){if(h!=null&&h.extensions){const w=h?.extensions[B];if(w!=null&&w.guid&&w.guid===y.guid){D=!0;break}}T++}if(D){let h=await S.getDependency("texture",T);return s&&console.log('change "'+r.name+'" \u2192 "'+h.name+'"',c,T,h,g),r instanceof C&&(h=this.copySettings(r,h)),h&&(h.guid=y.guid),m(h)}}if(T=0,x.parser.json.meshes){let D=!1;for(const h of x.parser.json.meshes){if(h!=null&&h.extensions){const w=h?.extensions[B];if(w!=null&&w.guid&&w.guid===y.guid){D=!0;break}}T++}if(D){const h=await S.getDependency("mesh",T),w=y;if(s&&console.log(`Loaded Mesh "${h.name}"`,c,T,h,g),h.isMesh===!0){const _=h.geometry;return v.assignLODInformation(i.url,_,a,e,void 0,w.density),m(_)}else{const _=new Array;for(let I=0;I<h.children.length;I++){const z=h.children[I];if(z instanceof W){const j=z.geometry;v.assignLODInformation(i.url,j,a,e,I,w.density),_.push(j)}}return m(_)}}}return m(null)});return this.previouslyLoaded.set(g,A),await A}else if(r instanceof C){s&&console.log("Load texture from uri: "+c);const g=await new ae().loadAsync(c);return g?(g.guid=l.guid,g.flipY=!1,g.needsUpdate=!0,g.colorSpace=r.colorSpace,s&&console.log(l,g)):L&&console.warn("failed loading",c),g}}else L&&console.warn(`Can not load LOD ${e}: no LOD info found for "${a}" ${r.name}`,r.type);return null}static assignLODInformation(r,e,t,n,o,s){if(!e)return;e.userData||(e.userData={});const i=new xe(r,t,n,o,s);e.userData.LODS=i,e.userData.LOD=n}static getAssignedLODInformation(r){var e;return((e=r?.userData)==null?void 0:e.LODS)||null}static copySettings(r,e){return this._copiedTextures.get(r)||(e=e.clone(),this._copiedTextures.set(r,e),e.offset=r.offset,e.repeat=r.repeat,e.colorSpace=r.colorSpace,e)}};let O=v;u(O,"registerTexture",(r,e,t,n)=>{L&&console.log("> Progressive: register texture",t,e.name,e.uuid,e,n),e.source&&(e.source[X]=n);const o=e.uuid;v.assignLODInformation(r,e,o,0,0,void 0),v.lodInfos.set(o,n),v.lowresCache.set(o,e)}),u(O,"registerMesh",(r,e,t,n,o,s)=>{var i;L&&console.log("> Progressive: register mesh",o,t.name,s,t.uuid,t);const a=t.geometry;a.userData||(a.userData={}),v.assignLODInformation(r,a,e,n,o,s.density),v.lodInfos.set(e,s);let l=v.lowresCache.get(e);l?l.push(t.geometry):l=[t.geometry],v.lowresCache.set(e,l);for(const d of V)(i=d.onRegisteredNewMesh)==null||i.call(d,t,s)}),u(O,"lodInfos",new Map),u(O,"previouslyLoaded",new Map),u(O,"lowresCache",new Map),u(O,"_copiedTextures",new Map);class xe{constructor(e,t,n,o,s){u(this,"url"),u(this,"key"),u(this,"level"),u(this,"index"),u(this,"density"),this.url=e,this.key=t,this.level=n,o!=null&&(this.index=o),s!=null&&(this.density=s)}}let ee=q("debugprogressive");const De=q("noprogressive"),P=class{constructor(r){u(this,"renderer"),u(this,"projectionScreenMatrix",new K),u(this,"cameraFrustrum",new le),u(this,"updateInterval",0),u(this,"pause",!1),u(this,"plugins",[]),u(this,"_originalRender"),u(this,"_sphere",new ue),u(this,"_tempBox",new Y),u(this,"tempMatrix",new K),u(this,"_tempWorldPosition",new E),u(this,"_tempBoxSize",new E),u(this,"_tempBox2Size",new E),this.renderer=r}enable(){if(this._originalRender)return;let r=0;this._originalRender=this.renderer.render;const e=this;let t=0;J(this.renderer),this.renderer.render=function(n,o){const s=t++,i=r++;e.onBeforeRender(n,o,i,s),e._originalRender.call(this,n,o),e.onAfterRender(n,o,i,s),r--}}disable(){this._originalRender&&(this.renderer.render=this._originalRender,this._originalRender=void 0)}onBeforeRender(r,e,t,n){}onAfterRender(r,e,t,n){if(De||this.pause||this.updateInterval>0&&n%this.updateInterval!=0)return;this.projectionScreenMatrix.multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse),this.cameraFrustrum.setFromProjectionMatrix(this.projectionScreenMatrix,this.renderer.coordinateSystem);const o=1e5,s=this.renderer.renderLists.get(r,t).opaque;for(const i of s){const a=i.object;(a instanceof W||a.isMesh)&&this.updateLODs(r,e,a,o)}}static getObjectLODState(r){var e;return(e=r.userData)==null?void 0:e.LOD_state}updateLODs(r,e,t,n){var o,s;for(const d of this.plugins)(o=d.onBeforeUpdateLOD)==null||o.call(d,this.renderer,r,e,t);let i=t.userData.LOD_state;i||(i=new Le,t.userData.LOD_state=i);let a=this.calculateLodLevel(e,t,i,n);a=Math.round(a),a>=0&&this.loadProgressiveMeshes(t,a);let l=0;if(t.material){const d=t["DEBUG:LOD"];if(d!=null&&(l=d),Array.isArray(t.material))for(const c of t.material)this.loadProgressiveTextures(c,l);else this.loadProgressiveTextures(t.material,l)}for(const d of this.plugins)(s=d.onAfterUpdatedLOD)==null||s.call(d,this.renderer,r,e,t,a);i.lastLodLevel=a}loadProgressiveTextures(r,e){return r&&r.userData&&r.userData.LOD!==e?(r.userData.LOD=e,O.assignTextureLOD(r,e)):Promise.resolve(null)}loadProgressiveMeshes(r,e){if(!r)return Promise.resolve(null);if(r.userData||(r.userData={}),r.userData.LOD!==e){r.userData.LOD=e;const t=r.geometry;return O.assignMeshLOD(r,e).then(n=>(n&&r.userData.LOD==e&&t!=r.geometry,n))}return Promise.resolve(null)}calculateLodLevel(r,e,t,n){var o;if(!e)return-1;let s=10+1;if(r){if(ee&&e["DEBUG:LOD"]!=null)return e["DEBUG:LOD"];const i=O.getMeshLODInformation(e.geometry),a=i?.lods;if(!a||a.length<=0||!((o=this.cameraFrustrum)!=null&&o.intersectsObject(e)))return 99;const l=e.geometry.boundingBox;if(l&&r.isPerspectiveCamera){const d=r;if(e.geometry.attributes.color&&e.geometry.attributes.color.count<100&&e.geometry.boundingSphere){this._sphere.copy(e.geometry.boundingSphere),this._sphere.applyMatrix4(e.matrixWorld);const f=r.getWorldPosition(this._tempWorldPosition);if(this._sphere.containsPoint(f))return 0}if(this._tempBox.copy(l),this._tempBox.applyMatrix4(e.matrixWorld),this._tempBox.applyMatrix4(this.projectionScreenMatrix),this.renderer.xr.enabled&&d.fov>70){const f=this._tempBox.min,p=this._tempBox.max;let b=f.x,x=f.y,S=p.x,T=p.y;const D=2,h=1.5,w=(f.x+p.x)*.5,_=(f.y+p.y)*.5;b=(b-w)*D+w,x=(x-_)*D+_,S=(S-w)*D+w,T=(T-_)*D+_;const I=b<0&&S>0?0:Math.min(Math.abs(f.x),Math.abs(p.x)),z=x<0&&T>0?0:Math.min(Math.abs(f.y),Math.abs(p.y)),j=Math.max(I,z);t.lastCentrality=(h-j)*(h-j)*(h-j)}else t.lastCentrality=1;const c=this._tempBox.getSize(this._tempBoxSize);c.multiplyScalar(.5),screen.availHeight>0&&c.multiplyScalar(this.renderer.domElement.clientHeight/screen.availHeight),c.x*=d.aspect;const g=r.matrixWorldInverse,M=new Y;M.copy(l),M.applyMatrix4(e.matrixWorld),M.applyMatrix4(g);const y=M.getSize(this._tempBox2Size),A=Math.max(y.x,y.y);if(Math.max(c.x,c.y)!=0&&A!=0&&(c.z=y.z/Math.max(y.x,y.y)*Math.max(c.x,c.y)),t.lastScreenCoverage=Math.max(c.x,c.y,c.z),t.lastScreenspaceVolume.copy(c),t.lastScreenCoverage*=t.lastCentrality,ee&&P.debugDrawLine){const f=this.tempMatrix.copy(this.projectionScreenMatrix);f.invert();const p=P.corner0,b=P.corner1,x=P.corner2,S=P.corner3;p.copy(this._tempBox.min),b.copy(this._tempBox.max),b.x=p.x,x.copy(this._tempBox.max),x.y=p.y,S.copy(this._tempBox.max);const T=(p.z+S.z)*.5;p.z=b.z=x.z=S.z=T,p.applyMatrix4(f),b.applyMatrix4(f),x.applyMatrix4(f),S.applyMatrix4(f),P.debugDrawLine(p,b,255),P.debugDrawLine(p,x,255),P.debugDrawLine(b,S,255),P.debugDrawLine(x,S,255)}let m=999;if(a&&t.lastScreenCoverage>0){for(let f=0;f<a.length;f++)if(a[f].density/t.lastScreenCoverage<n){m=f;break}}m<s&&(s=m)}}return s}};let k=P;u(k,"corner0",new E),u(k,"corner1",new E),u(k,"corner2",new E),u(k,"corner3",new E),u(k,"debugDrawLine");class Le{constructor(){u(this,"lastLodLevel",0),u(this,"lastScreenCoverage",0),u(this,"lastScreenspaceVolume",new E),u(this,"lastCentrality",0)}}const re=Symbol("NEEDLE_mesh_lod"),N=Symbol("NEEDLE_texture_lod");function te(){const r=document.querySelector("model-viewer");if(!r)return;let e=null;for(let t=r;t!=null;t=Object.getPrototypeOf(t)){const n=Object.getOwnPropertySymbols(t).find(o=>o.toString()=="Symbol(renderer)");!e&&n!=null&&(e=r[n].threeRenderer)}if(e){console.log("Adding Needle LODs to modelviewer");const t=new k(e);t.plugins.push(new ve(r)),t.enable()}}class ve{constructor(e){u(this,"modelviewer"),this.modelviewer=e}onBeforeUpdateLOD(e,t,n,o){this.tryParseMeshLOD(t,o),this.tryParseTextureLOD(t,o)}getUrl(){return this.modelviewer.getAttribute("src")}tryGetCurrentGLTF(e){return e._currentGLTF}tryParseTextureLOD(e,t){if(t[N]==!0)return;t[N]=!0;const n=this.tryGetCurrentGLTF(e),o=this.getUrl();if(!o){console.error("No url found in modelviewer");return}if(n&&t.material){let s=function(a){var l,d,c;if(a[N]==!0)return;a[N]=!0,a.userData&&(a.userData.LOD=-1);const g=Object.keys(a);for(let M=0;M<g.length;M++){const y=g[M],A=a[y];if(A?.isTexture===!0){const m=(d=(l=A.userData)==null?void 0:l.associations)==null?void 0:d.textures,f=n.parser.json.textures[m];if((c=f.extensions)!=null&&c[B]){const p=f.extensions[B];p&&o&&O.registerTexture(o,A,p.lods.length,p)}}}};const i=t.material;if(Array.isArray(i))for(const a of i)s(a);else s(i)}}tryParseMeshLOD(e,t){var n,o;if(t[re]==!0)return;t[re]=!0;const s=this.getUrl();if(!s){console.error("No url found in modelviewer");return}const i=(o=(n=t.userData)==null?void 0:n.gltfExtensions)==null?void 0:o[B];if(i&&s){const a=t.uuid;O.registerMesh(s,a,t,0,i.lods.length,i)}}}function Oe(r,e,t){J(e),Q(t),t.register(o=>new O(o,r));const n=new k(e);return n.enable(),n}document.addEventListener("DOMContentLoaded",()=>{te()});export{B as EXTENSION_NAME,k as LODsManager,O as NEEDLE_progressive,te as patchModelViewer,ye as registerPlugin,Oe as useNeedleGLTFProgressive};
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
"use strict";var re=Object.defineProperty;var se=(l,e,t)=>e in l?re(l,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):l[e]=t;var u=(l,e,t)=>(se(l,typeof e!="symbol"?e+"":e,t),t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const h=require("three"),ie=require("three/examples/jsm/loaders/GLTFLoader.js"),oe=require("three/examples/jsm/libs/meshopt_decoder.module.js"),ne=require("three/examples/jsm/loaders/DRACOLoader.js"),ae=require("three/examples/jsm/loaders/KTX2Loader.js");let le="https://www.gstatic.com/draco/versioned/decoders/1.4.1/",ue="https://www.gstatic.com/basis-universal/versioned/2021-04-15-ba1c3e4/",z,$,I;function Z(l){z||(z=new ne.DRACOLoader,z.setDecoderPath(le),z.setDecoderConfig({type:"js"})),I||(I=new ae.KTX2Loader,I.setTranscoderPath(ue)),$||($=oe.MeshoptDecoder),l?I.detectSupport(l):console.warn("No renderer provided to detect ktx2 support - loading KTX2 textures will probably fail")}function j(l){l.dracoLoader||l.setDRACOLoader(z),l.ktx2Loader||l.setKTX2Loader(I),l.meshoptDecoder||l.setMeshoptDecoder($)}function Y(l){let t=new URL(window.location.href).searchParams.get(l);return t==null||t==="0"||t==="false"?!1:t===""?!0:t}function ce(l,e){if(e===void 0||e.startsWith("./")||e.startsWith("http")||l===void 0)return e;const t=l.lastIndexOf("/");if(t>=0){const r=l.substring(0,t+1);for(;r.endsWith("/")&&e.startsWith("/");)e=e.substring(1);return r+e}return e}const X=new Array;function fe(l){X.push(l)}const C="NEEDLE_progressive",T=Y("debugprogressive"),V=Symbol("needle-progressive-texture"),U=new Map,K=new Set;if(T){let l=function(){e+=1,console.log("Toggle LOD level",e,U),U.forEach((i,o)=>{for(const s of i.keys){const n=o[s];if(n.isBufferGeometry===!0){const a=O.getMeshLODInformation(n),d=a?Math.min(e,a.lods.length):0;o["DEBUG:LOD"]=d,O.assignMeshLOD(o,d),a&&(t=Math.max(t,a.lods.length-1))}else if(o.isMaterial===!0){o["DEBUG:LOD"]=e,O.assignTextureLOD(o,e);break}}}),e>=t&&(e=-1)},e=-1,t=2,r=!1;window.addEventListener("keyup",i=>{i.key==="p"&&l(),i.key==="w"&&(r=!r,K&&K.forEach(o=>{o.name!="BackgroundCubeMaterial"&&"wireframe"in o&&(o.wireframe=r)}))})}function H(l,e,t){var i;if(!T)return;U.has(l)||U.set(l,{keys:[],sourceId:t});const r=U.get(l);((i=r==null?void 0:r.keys)==null?void 0:i.includes(e))==!1&&r.keys.push(e)}const S=class{constructor(e,t){u(this,"parser");u(this,"url");T&&console.log("Progressive extension registered for",t),this.parser=e,this.url=t}get name(){return C}static getMeshLODInformation(e){const t=this.getAssignedLODInformation(e);return t!=null&&t.key?this.lodInfos.get(t.key):null}static hasLODLevelAvailable(e,t){var o;if(e.isMaterial===!0){for(const s of Object.keys(e)){const n=e[s];if(n.isTexture&&this.hasLODLevelAvailable(n,t))return!0}return!1}else if(e.isGroup===!0){for(const s of e.children)if(s.isMesh===!0&&this.hasLODLevelAvailable(s,t))return!0}let r,i;if(e.isMesh?r=e.geometry:(e.isBufferGeometry||e.isTexture)&&(r=e),r&&(o=r==null?void 0:r.userData)!=null&&o.LODS){const s=r.userData.LODS;if(i=this.lodInfos.get(s.key),t===void 0)return i!=null;if(i)return Array.isArray(i.lods)?t<i.lods.length:t===0}return!1}static assignMeshLOD(e,t){var r;if(!e)return Promise.resolve(null);if(e instanceof h.Mesh||e.isMesh===!0){const i=e.geometry,o=this.getAssignedLODInformation(i);if(!o)return Promise.resolve(null);for(const s of X)(r=s.onBeforeGetLODMesh)==null||r.call(s,e,t);return e["LOD:requested level"]=t,S.getOrLoadLOD(i,t).then(s=>{if(e["LOD:requested level"]===t){if(delete e["LOD:requested level"],Array.isArray(s)){const n=o.index||0;s=s[n]}s&&i!=s&&s instanceof h.BufferGeometry&&(e.geometry=s,T&&H(e,"geometry",o.url))}return s}).catch(s=>(console.error("Error loading mesh LOD",e,s),null))}else T&&console.error("Invalid call to assignMeshLOD: Request mesh LOD but the object is not a mesh",e);return Promise.resolve(null)}static assignTextureLOD(e,t=0){if(!e)return Promise.resolve(null);if(e instanceof h.Material||e.isMaterial===!0){const r=e,i=[],o=new Array;if(T&&K.add(r),r instanceof h.RawShaderMaterial)for(const s of Object.keys(r.uniforms)){const n=r.uniforms[s].value;if((n==null?void 0:n.isTexture)===!0){const a=this.assignTextureLODForSlot(n,t,r,s);i.push(a),o.push(s)}}else for(const s of Object.keys(r)){const n=r[s];if((n==null?void 0:n.isTexture)===!0){const a=this.assignTextureLODForSlot(n,t,r,s);i.push(a),o.push(s)}}return Promise.all(i).then(s=>{const n=new Array;for(let a=0;a<s.length;a++){const d=s[a],f=o[a];d&&d.isTexture===!0?n.push({material:r,slot:f,texture:d,level:t}):n.push({material:r,slot:f,texture:null,level:t})}return n})}if(e instanceof h.Texture||e.isTexture===!0){const r=e;return this.assignTextureLODForSlot(r,t,null,null)}return Promise.resolve(null)}static assignTextureLODForSlot(e,t,r,i){return(e==null?void 0:e.isTexture)!==!0?Promise.resolve(null):S.getOrLoadLOD(e,t).then(o=>{if(Array.isArray(o))return null;if((o==null?void 0:o.isTexture)===!0){if(o!=e&&(r&&i&&(r[i]=o),T&&i&&r)){const s=this.getAssignedLODInformation(e);s&&H(r,i,s.url)}return o}else T=="verbose"&&console.warn("No LOD found for",e,t);return null}).catch(o=>(console.error("Error loading LOD",e,o),null))}afterRoot(e){var t,r;return T&&console.log("AFTER",this.url,e),(t=this.parser.json.textures)==null||t.forEach((i,o)=>{if(i!=null&&i.extensions){const s=i==null?void 0:i.extensions[C];if(s){let n=!1;for(const a of this.parser.associations.keys())a.isTexture===!0&&this.parser.associations.get(a).textures===o&&(n=!0,S.registerTexture(this.url,a,o,s));n||this.parser.getDependency("texture",o).then(a=>{a&&S.registerTexture(this.url,a,o,s)})}}}),(r=this.parser.json.meshes)==null||r.forEach((i,o)=>{if(i!=null&&i.extensions){const s=i==null?void 0:i.extensions[C];if(s&&s.lods){for(const n of this.parser.associations.keys())if(n.isMesh){const a=this.parser.associations.get(n);a.meshes===o&&S.registerMesh(this.url,n.uuid,n,s.lods.length,a.primitives,s)}}}}),null}static async getOrLoadLOD(e,t){var n,a,d;const r=T=="verbose",i=e.userData.LODS;if(!i)return null;const o=i==null?void 0:i.key;let s;if(e.isTexture===!0){const f=e;f.source&&f.source[V]&&(s=f.source[V])}if(s||(s=S.lodInfos.get(o)),s){if(t>0){let g=!1;const v=Array.isArray(s.lods);if(v&&t>=s.lods.length?g=!0:v||(g=!0),g)return this.lowresCache.get(o)}const f=Array.isArray(s.lods)?s.lods[t].path:s.lods;if(!f)return T&&!s["missing:uri"]&&(s["missing:uri"]=!0,console.warn("Missing uri for progressive asset for LOD "+t,s)),null;const D=ce(i.url,f);if(D.endsWith(".glb")||D.endsWith(".gltf")){if(!s.guid)return console.warn("missing pointer for glb/gltf texture",s),null;const g=D+"_"+s.guid,v=this.previouslyLoaded.get(g);if(v!==void 0){r&&console.log(`LOD ${t} was already loading/loaded: ${g}`);let m=await v.catch(F=>(console.error(`Error loading LOD ${t} from ${D}
|
|
2
|
-
`,F),null)),R=!1;if(m==null||(m instanceof h.Texture&&e instanceof h.Texture?(n=m.image)!=null&&n.data||(a=m.source)!=null&&a.data?m=this.copySettings(e,m):(R=!0,this.previouslyLoaded.delete(g)):m instanceof h.BufferGeometry&&e instanceof h.BufferGeometry&&((d=m.attributes.position)!=null&&d.array||(R=!0,this.previouslyLoaded.delete(g)))),!R)return m}const x=s,b=new Promise(async(m,R)=>{const F=new ie.GLTFLoader;j(F),T&&(await new Promise(y=>setTimeout(y,1e3)),r&&console.warn("Start loading (delayed) "+D,x.guid));let L=D;if(x&&Array.isArray(x.lods)){const y=x.lods[t];y.hash&&(L+="?v="+y.hash)}const p=await F.loadAsync(L).catch(y=>(console.error(`Error loading LOD ${t} from ${D}
|
|
3
|
-
`,y),null));if(!p)return null;const P=p.parser;r&&console.log("Loading finished "+D,x.guid);let w=0;if(p.parser.json.textures){let y=!1;for(const c of p.parser.json.textures){if(c!=null&&c.extensions){const M=c==null?void 0:c.extensions[C];if(M!=null&&M.guid&&M.guid===x.guid){y=!0;break}}w++}if(y){let c=await P.getDependency("texture",w);return r&&console.log('change "'+e.name+'" → "'+c.name+'"',D,w,c,g),e instanceof h.Texture&&(c=this.copySettings(e,c)),c&&(c.guid=x.guid),m(c)}}if(w=0,p.parser.json.meshes){let y=!1;for(const c of p.parser.json.meshes){if(c!=null&&c.extensions){const M=c==null?void 0:c.extensions[C];if(M!=null&&M.guid&&M.guid===x.guid){y=!0;break}}w++}if(y){const c=await P.getDependency("mesh",w),M=x;if(r&&console.log(`Loaded Mesh "${c.name}"`,D,w,c,g),c.isMesh===!0){const B=c.geometry;return S.assignLODInformation(i.url,B,o,t,void 0,M.density),m(B)}else{const B=new Array;for(let k=0;k<c.children.length;k++){const E=c.children[k];if(E instanceof h.Mesh){const N=E.geometry;S.assignLODInformation(i.url,N,o,t,k,M.density),B.push(N)}}return m(B)}}}return m(null)});return this.previouslyLoaded.set(g,b),await b}else if(e instanceof h.Texture){r&&console.log("Load texture from uri: "+D);const v=await new h.TextureLoader().loadAsync(D);return v?(v.guid=s.guid,v.flipY=!1,v.needsUpdate=!0,v.colorSpace=e.colorSpace,r&&console.log(s,v)):T&&console.warn("failed loading",D),v}}else T&&console.warn(`Can not load LOD ${t}: no LOD info found for "${o}" ${e.name}`,e.type);return null}static assignLODInformation(e,t,r,i,o,s){if(!t)return;t.userData||(t.userData={});const n=new de(e,r,i,o,s);t.userData.LODS=n,t.userData.LOD=i}static getAssignedLODInformation(e){var t;return((t=e==null?void 0:e.userData)==null?void 0:t.LODS)||null}static copySettings(e,t){const r=this._copiedTextures.get(e);return r||(t=t.clone(),this._copiedTextures.set(e,t),t.offset=e.offset,t.repeat=e.repeat,t.colorSpace=e.colorSpace,t)}};let O=S;u(O,"registerTexture",(e,t,r,i)=>{T&&console.log("> Progressive: register texture",r,t.name,t.uuid,t,i),t.source&&(t.source[V]=i);const o=t.uuid;S.assignLODInformation(e,t,o,0,0,void 0),S.lodInfos.set(o,i),S.lowresCache.set(o,t)}),u(O,"registerMesh",(e,t,r,i,o,s)=>{var d;T&&console.log("> Progressive: register mesh",o,r.name,s,r.uuid,r);const n=r.geometry;n.userData||(n.userData={}),S.assignLODInformation(e,n,t,i,o,s.density),S.lodInfos.set(t,s);let a=S.lowresCache.get(t);a?a.push(r.geometry):a=[r.geometry],S.lowresCache.set(t,a);for(const f of X)(d=f.onRegisteredNewMesh)==null||d.call(f,r,s)}),u(O,"lodInfos",new Map),u(O,"previouslyLoaded",new Map),u(O,"lowresCache",new Map),u(O,"_copiedTextures",new Map);class de{constructor(e,t,r,i,o){u(this,"url");u(this,"key");u(this,"level");u(this,"index");u(this,"density");this.url=e,this.key=t,this.level=r,i!=null&&(this.index=i),o!=null&&(this.density=o)}}let J=Y("debugprogressive");const ge=Y("noprogressive"),A=class{constructor(e){u(this,"renderer");u(this,"projectionScreenMatrix",new h.Matrix4);u(this,"cameraFrustrum",new h.Frustum);u(this,"updateInterval",0);u(this,"pause",!1);u(this,"plugins",[]);u(this,"_originalRender");u(this,"_sphere",new h.Sphere);u(this,"_tempBox",new h.Box3);u(this,"tempMatrix",new h.Matrix4);u(this,"_tempWorldPosition",new h.Vector3);u(this,"_tempBoxSize",new h.Vector3);u(this,"_tempBox2Size",new h.Vector3);this.renderer=e}enable(){if(this._originalRender)return;let e=0;this._originalRender=this.renderer.render;const t=this;let r=0;Z(this.renderer),this.renderer.render=function(i,o){const s=r++,n=e++;t.onBeforeRender(i,o,n,s),t._originalRender.call(this,i,o),t.onAfterRender(i,o,n,s),e--}}disable(){this._originalRender&&(this.renderer.render=this._originalRender,this._originalRender=void 0)}onBeforeRender(e,t,r,i){}onAfterRender(e,t,r,i){if(ge||this.pause||this.updateInterval>0&&i%this.updateInterval!=0)return;this.projectionScreenMatrix.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),this.cameraFrustrum.setFromProjectionMatrix(this.projectionScreenMatrix,this.renderer.coordinateSystem);const o=1e5,n=this.renderer.renderLists.get(e,r).opaque;for(const a of n){const d=a.object;(d instanceof h.Mesh||d.isMesh)&&this.updateLODs(e,t,d,o)}}static getObjectLODState(e){var t;return(t=e.userData)==null?void 0:t.LOD_state}updateLODs(e,t,r,i){var a,d;for(const f of this.plugins)(a=f.onBeforeUpdateLOD)==null||a.call(f,this.renderer,e,t,r);let o=r.userData.LOD_state;o||(o=new he,r.userData.LOD_state=o);let s=this.calculateLodLevel(t,r,o,i);s=Math.round(s),s>=0&&this.loadProgressiveMeshes(r,s);let n=0;if(r.material){const f=r["DEBUG:LOD"];if(f!=null&&(n=f),Array.isArray(r.material))for(const D of r.material)this.loadProgressiveTextures(D,n);else this.loadProgressiveTextures(r.material,n)}for(const f of this.plugins)(d=f.onAfterUpdatedLOD)==null||d.call(f,this.renderer,e,t,r,s);o.lastLodLevel=s}loadProgressiveTextures(e,t){return e&&e.userData&&e.userData.LOD!==t?(e.userData.LOD=t,O.assignTextureLOD(e,t)):Promise.resolve(null)}loadProgressiveMeshes(e,t){if(!e)return Promise.resolve(null);if(e.userData||(e.userData={}),e.userData.LOD!==t){e.userData.LOD=t;const r=e.geometry;return O.assignMeshLOD(e,t).then(i=>(i&&e.userData.LOD==t&&r!=e.geometry,i))}return Promise.resolve(null)}calculateLodLevel(e,t,r,i){var n;if(!t)return-1;let s=10+1;if(e){if(J&&t["DEBUG:LOD"]!=null)return t["DEBUG:LOD"];const a=O.getMeshLODInformation(t.geometry),d=a==null?void 0:a.lods;if(!d||d.length<=0||!((n=this.cameraFrustrum)!=null&&n.intersectsObject(t)))return 99;const f=t.geometry.boundingBox;if(f&&e.isPerspectiveCamera){const D=e;if(t.geometry.attributes.color&&t.geometry.attributes.color.count<100&&t.geometry.boundingSphere){this._sphere.copy(t.geometry.boundingSphere),this._sphere.applyMatrix4(t.matrixWorld);const L=e.getWorldPosition(this._tempWorldPosition);if(this._sphere.containsPoint(L))return 0}if(this._tempBox.copy(f),this._tempBox.applyMatrix4(t.matrixWorld),this._tempBox.applyMatrix4(this.projectionScreenMatrix),this.renderer.xr.enabled&&D.fov>70){const L=this._tempBox.min,p=this._tempBox.max;let P=L.x,w=L.y,y=p.x,c=p.y;const M=2,B=1.5,k=(L.x+p.x)*.5,E=(L.y+p.y)*.5;P=(P-k)*M+k,w=(w-E)*M+E,y=(y-k)*M+k,c=(c-E)*M+E;const N=P<0&&y>0?0:Math.min(Math.abs(L.x),Math.abs(p.x)),te=w<0&&c>0?0:Math.min(Math.abs(L.y),Math.abs(p.y)),q=Math.max(N,te);r.lastCentrality=(B-q)*(B-q)*(B-q)}else r.lastCentrality=1;const g=this._tempBox.getSize(this._tempBoxSize);g.multiplyScalar(.5),screen.availHeight>0&&g.multiplyScalar(this.renderer.domElement.clientHeight/screen.availHeight),g.x*=D.aspect;const v=e.matrixWorldInverse,x=new h.Box3;x.copy(f),x.applyMatrix4(t.matrixWorld),x.applyMatrix4(v);const b=x.getSize(this._tempBox2Size),G=Math.max(b.x,b.y);if(Math.max(g.x,g.y)!=0&&G!=0&&(g.z=b.z/Math.max(b.x,b.y)*Math.max(g.x,g.y)),r.lastScreenCoverage=Math.max(g.x,g.y,g.z),r.lastScreenspaceVolume.copy(g),r.lastScreenCoverage*=r.lastCentrality,J&&A.debugDrawLine){const L=this.tempMatrix.copy(this.projectionScreenMatrix);L.invert();const p=A.corner0,P=A.corner1,w=A.corner2,y=A.corner3;p.copy(this._tempBox.min),P.copy(this._tempBox.max),P.x=p.x,w.copy(this._tempBox.max),w.y=p.y,y.copy(this._tempBox.max);const c=(p.z+y.z)*.5;p.z=P.z=w.z=y.z=c,p.applyMatrix4(L),P.applyMatrix4(L),w.applyMatrix4(L),y.applyMatrix4(L),A.debugDrawLine(p,P,255),A.debugDrawLine(p,w,255),A.debugDrawLine(P,y,255),A.debugDrawLine(w,y,255)}let R=999;if(d&&r.lastScreenCoverage>0){for(let L=0;L<d.length;L++)if(d[L].density/r.lastScreenCoverage<i){R=L;break}}R<s&&(s=R)}}return s}};let _=A;u(_,"corner0",new h.Vector3),u(_,"corner1",new h.Vector3),u(_,"corner2",new h.Vector3),u(_,"corner3",new h.Vector3),u(_,"debugDrawLine");class he{constructor(){u(this,"lastLodLevel",0);u(this,"lastScreenCoverage",0);u(this,"lastScreenspaceVolume",new h.Vector3);u(this,"lastCentrality",0)}}const Q=Symbol("NEEDLE_mesh_lod"),W=Symbol("NEEDLE_texture_lod");function ee(){const l=document.querySelector("model-viewer");if(!l)return;let e=null;for(let t=l;t!=null;t=Object.getPrototypeOf(t)){const i=Object.getOwnPropertySymbols(t).find(o=>o.toString()=="Symbol(renderer)");!e&&i!=null&&(e=l[i].threeRenderer)}if(e){console.log("Adding Needle LODs to modelviewer");const t=new _(e);t.plugins.push(new pe(l)),t.enable()}}class pe{constructor(e){u(this,"modelviewer");this.modelviewer=e}onBeforeUpdateLOD(e,t,r,i){this.tryParseMeshLOD(t,i),this.tryParseTextureLOD(t,i)}getUrl(){return this.modelviewer.getAttribute("src")}tryGetCurrentGLTF(e){return e._currentGLTF}tryParseTextureLOD(e,t){if(t[W]==!0)return;t[W]=!0;const r=this.tryGetCurrentGLTF(e),i=this.getUrl();if(!i){console.error("No url found in modelviewer");return}if(r&&t.material){let o=function(n){var d,f,D;if(n[W]==!0)return;n[W]=!0,n.userData&&(n.userData.LOD=-1);const a=Object.keys(n);for(let g=0;g<a.length;g++){const v=a[g],x=n[v];if((x==null?void 0:x.isTexture)===!0){const b=(f=(d=x.userData)==null?void 0:d.associations)==null?void 0:f.textures,G=r.parser.json.textures[b];if((D=G.extensions)!=null&&D[C]){const m=G.extensions[C];m&&i&&O.registerTexture(i,x,m.lods.length,m)}}}};const s=t.material;if(Array.isArray(s))for(const n of s)o(n);else o(s)}}tryParseMeshLOD(e,t){var o,s;if(t[Q]==!0)return;t[Q]=!0;const r=this.getUrl();if(!r){console.error("No url found in modelviewer");return}const i=(s=(o=t.userData)==null?void 0:o.gltfExtensions)==null?void 0:s[C];if(i&&r){const n=t.uuid;O.registerMesh(r,n,t,0,i.lods.length,i)}}}function ye(l,e,t){Z(e),j(t),t.register(i=>new O(i,l));const r=new _(e);return r.enable(),r}document.addEventListener("DOMContentLoaded",()=>{ee()});exports.EXTENSION_NAME=C;exports.LODsManager=_;exports.NEEDLE_progressive=O;exports.patchModelViewer=ee;exports.registerPlugin=fe;exports.useNeedleGLTFProgressive=ye;
|
package/types/index.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export * from "./extension.js";
|
|
2
|
-
export * from "./plugins/index.js";
|
|
3
|
-
export { LODsManager } from "./lods_manager.js";
|
|
4
|
-
import { WebGLRenderer } from "three";
|
|
5
|
-
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js";
|
|
6
|
-
/**
|
|
7
|
-
* Use this function to load a gltf model progressively.
|
|
8
|
-
*/
|
|
9
|
-
export declare function useNeedleGLTFProgressive(url: string, renderer: WebGLRenderer, loader: GLTFLoader): LODsManager;
|
|
10
|
-
import { LODsManager } from "./lods_manager.js";
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { Scene, Camera, Object3D, Object3DEventMap, WebGLRenderer } from "three";
|
|
2
|
-
import { NEEDLE_progressive_plugin } from "./plugin.js";
|
|
3
|
-
export declare function patchModelViewer(): void;
|
|
4
|
-
/**
|
|
5
|
-
* LODs manager plugin that registers LOD data to the NEEDLE progressive system
|
|
6
|
-
*/
|
|
7
|
-
export declare class RegisterModelviewerDataPlugin implements NEEDLE_progressive_plugin {
|
|
8
|
-
readonly modelviewer: HTMLElement;
|
|
9
|
-
constructor(modelviewer: HTMLElement);
|
|
10
|
-
onBeforeUpdateLOD(_renderer: WebGLRenderer, scene: Scene, _camera: Camera, object: Object3D<Object3DEventMap>): void;
|
|
11
|
-
private getUrl;
|
|
12
|
-
private tryGetCurrentGLTF;
|
|
13
|
-
private tryParseTextureLOD;
|
|
14
|
-
private tryParseMeshLOD;
|
|
15
|
-
}
|