angular-three-soba 3.7.2 → 4.0.0-next.10
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/abstractions/lib/billboard.d.ts +6 -6
- package/abstractions/lib/catmull-rom-line.d.ts +157 -547
- package/abstractions/lib/cubic-bezier-line.d.ts +7 -7
- package/abstractions/lib/edges.d.ts +155 -731
- package/abstractions/lib/gradient-texture.d.ts +8 -8
- package/abstractions/lib/grid.d.ts +24 -292
- package/abstractions/lib/helper.d.ts +5 -5
- package/abstractions/lib/line.d.ts +11 -12
- package/abstractions/lib/prism-geometry.d.ts +12 -12
- package/abstractions/lib/quadratic-bezier-line.d.ts +7 -7
- package/abstractions/lib/rounded-box.d.ts +8 -8
- package/abstractions/lib/text-3d.d.ts +14 -293
- package/abstractions/lib/text.d.ts +13 -13
- package/cameras/lib/camera-content.d.ts +2 -2
- package/cameras/lib/cube-camera.d.ts +12 -12
- package/cameras/lib/orthographic-camera.d.ts +11 -11
- package/cameras/lib/perspective-camera.d.ts +10 -10
- package/controls/lib/camera-controls.d.ts +1 -6
- package/controls/lib/orbit-controls.d.ts +6 -10
- package/controls/lib/scroll-controls.d.ts +8 -14
- package/fesm2022/angular-three-soba-abstractions.mjs +80 -57
- package/fesm2022/angular-three-soba-abstractions.mjs.map +1 -1
- package/fesm2022/angular-three-soba-cameras.mjs +18 -20
- package/fesm2022/angular-three-soba-cameras.mjs.map +1 -1
- package/fesm2022/angular-three-soba-controls.mjs +65 -65
- package/fesm2022/angular-three-soba-controls.mjs.map +1 -1
- package/fesm2022/angular-three-soba-gizmos.mjs +186 -194
- package/fesm2022/angular-three-soba-gizmos.mjs.map +1 -1
- package/fesm2022/angular-three-soba-loaders.mjs +21 -16
- package/fesm2022/angular-three-soba-loaders.mjs.map +1 -1
- package/fesm2022/angular-three-soba-materials.mjs +90 -93
- package/fesm2022/angular-three-soba-materials.mjs.map +1 -1
- package/fesm2022/angular-three-soba-misc.mjs +283 -280
- package/fesm2022/angular-three-soba-misc.mjs.map +1 -1
- package/fesm2022/angular-three-soba-performances.mjs +51 -56
- package/fesm2022/angular-three-soba-performances.mjs.map +1 -1
- package/fesm2022/angular-three-soba-shaders.mjs +5 -6
- package/fesm2022/angular-three-soba-shaders.mjs.map +1 -1
- package/fesm2022/angular-three-soba-staging.mjs +253 -277
- package/fesm2022/angular-three-soba-staging.mjs.map +1 -1
- package/fesm2022/angular-three-soba-stats.mjs +3 -4
- package/fesm2022/angular-three-soba-stats.mjs.map +1 -1
- package/gizmos/lib/gizmo-helper/gizmo-helper.d.ts +12 -15
- package/gizmos/lib/gizmo-helper/gizmo-viewcube.d.ts +5 -6
- package/gizmos/lib/gizmo-helper/gizmo-viewport.d.ts +8 -9
- package/gizmos/lib/pivot-controls/axis-arrow.d.ts +12 -14
- package/gizmos/lib/pivot-controls/axis-rotator.d.ts +12 -13
- package/gizmos/lib/pivot-controls/pivot-controls.d.ts +28 -29
- package/gizmos/lib/pivot-controls/plane-slider.d.ts +13 -14
- package/gizmos/lib/pivot-controls/scaling-sphere.d.ts +13 -15
- package/gizmos/lib/transform-controls.d.ts +15 -20
- package/loaders/lib/loader.d.ts +10 -11
- package/loaders/lib/texture-loader.d.ts +3 -3
- package/materials/lib/custom-shader-material.d.ts +3 -3
- package/materials/lib/mesh-distort-material.d.ts +3 -3
- package/materials/lib/mesh-portal-material.d.ts +19 -118
- package/materials/lib/mesh-reflector-material.d.ts +4 -5
- package/materials/lib/mesh-refraction-material.d.ts +13 -14
- package/materials/lib/mesh-transmission-material.d.ts +14 -14
- package/materials/lib/mesh-wobble-material.d.ts +4 -4
- package/materials/lib/point-material.d.ts +3 -3
- package/misc/lib/animations.d.ts +12 -12
- package/misc/lib/computed-attribute.d.ts +5 -48
- package/misc/lib/decal.d.ts +9 -9
- package/misc/lib/deprecated.d.ts +2 -2
- package/misc/lib/depth-buffer.d.ts +2 -2
- package/misc/lib/fbo.d.ts +9 -9
- package/misc/lib/html/html-content.d.ts +5 -7
- package/misc/lib/html/html.d.ts +15 -14
- package/misc/lib/html/utils.d.ts +9 -9
- package/misc/lib/intersect.d.ts +2 -2
- package/misc/lib/preload.d.ts +3 -6
- package/misc/lib/sampler.d.ts +22 -21
- package/misc/lib/scale-factor.d.ts +2 -2
- package/package.json +141 -141
- package/performances/lib/detailed.d.ts +5 -5
- package/performances/lib/instances/instances.d.ts +8 -96
- package/performances/lib/instances/position-mesh.d.ts +8 -8
- package/performances/lib/points/points.d.ts +10 -188
- package/performances/lib/points/position-point.d.ts +8 -8
- package/performances/lib/segments/segment-object.d.ts +6 -6
- package/performances/lib/segments/segments.d.ts +47 -48
- package/shaders/lib/grid-material.d.ts +16 -16
- package/shaders/lib/point-material.d.ts +5 -5
- package/staging/lib/accumulative-shadows.d.ts +22 -26
- package/staging/lib/backdrop.d.ts +8 -8
- package/staging/lib/bb-anchor.d.ts +5 -5
- package/staging/lib/bounds.d.ts +13 -17
- package/staging/lib/camera-shake.d.ts +0 -2
- package/staging/lib/caustics.d.ts +11 -11
- package/staging/lib/center.d.ts +10 -350
- package/staging/lib/contact-shadows.d.ts +17 -16
- package/staging/lib/environment/environment.d.ts +13 -15
- package/staging/lib/environment/inject-environment.d.ts +3 -3
- package/staging/lib/float.d.ts +5 -5
- package/staging/lib/lightformer.d.ts +11 -290
- package/staging/lib/mask.d.ts +8 -10
- package/staging/lib/matcap-texture.d.ts +5 -5
- package/staging/lib/normal-texture.d.ts +5 -5
- package/staging/lib/randomized-lights.d.ts +13 -13
- package/staging/lib/render-texture.d.ts +21 -17
- package/staging/lib/sky.d.ts +13 -13
- package/staging/lib/spot-light.d.ts +39 -39
- package/staging/lib/stage.d.ts +107 -277
- package/vanilla-exports/index.d.ts +6 -7
- package/LICENSE +0 -21
- package/metadata.json +0 -1
- package/web-types.json +0 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { injectLoader, pick, injectStore } from 'angular-three';
|
|
1
|
+
import { injectLoader, pick, injectStore, is } from 'angular-three';
|
|
2
2
|
import { assertInjector } from 'ngxtension/assert-injector';
|
|
3
3
|
import { FBXLoader, FontLoader, DRACOLoader, MeshoptDecoder, GLTFLoader } from 'three-stdlib';
|
|
4
4
|
import * as i0 from '@angular/core';
|
|
5
|
-
import { signal, effect, computed, inject,
|
|
5
|
+
import { signal, effect, computed, inject, DestroyRef, input, viewChild, untracked, Component, ChangeDetectionStrategy } from '@angular/core';
|
|
6
6
|
import { mergeInputs } from 'ngxtension/inject-inputs';
|
|
7
|
-
import
|
|
7
|
+
import * as THREE from 'three';
|
|
8
8
|
|
|
9
9
|
function _injectFBX(input, { injector } = {}) {
|
|
10
10
|
return assertInjector(_injectFBX, injector, () => {
|
|
@@ -109,10 +109,13 @@ const injectGLTF = _injectGLTF;
|
|
|
109
109
|
|
|
110
110
|
function injectProgress(injector) {
|
|
111
111
|
return assertInjector(injectProgress, injector, () => {
|
|
112
|
-
const cdr = inject(ChangeDetectorRef);
|
|
113
112
|
const progress = signal({ errors: [], active: false, progress: 0, item: '', loaded: 0, total: 0 });
|
|
113
|
+
const defaultOnStart = THREE.DefaultLoadingManager.onStart?.bind(THREE.DefaultLoadingManager);
|
|
114
|
+
const defaultOnLoad = THREE.DefaultLoadingManager.onLoad?.bind(THREE.DefaultLoadingManager);
|
|
115
|
+
const defaultOnError = THREE.DefaultLoadingManager.onError?.bind(THREE.DefaultLoadingManager);
|
|
116
|
+
const defaultOnProgress = THREE.DefaultLoadingManager.onProgress?.bind(THREE.DefaultLoadingManager);
|
|
114
117
|
let saveLastTotalLoaded = 0;
|
|
115
|
-
DefaultLoadingManager.onStart = (item, loaded, total) => {
|
|
118
|
+
THREE.DefaultLoadingManager.onStart = (item, loaded, total) => {
|
|
116
119
|
progress.update((prev) => ({
|
|
117
120
|
...prev,
|
|
118
121
|
active: true,
|
|
@@ -121,17 +124,14 @@ function injectProgress(injector) {
|
|
|
121
124
|
total,
|
|
122
125
|
progress: ((loaded - saveLastTotalLoaded) / (total - saveLastTotalLoaded)) * 100,
|
|
123
126
|
}));
|
|
124
|
-
cdr.detectChanges();
|
|
125
127
|
};
|
|
126
|
-
DefaultLoadingManager.onLoad = () => {
|
|
128
|
+
THREE.DefaultLoadingManager.onLoad = () => {
|
|
127
129
|
progress.update((prev) => ({ ...prev, active: false }));
|
|
128
|
-
cdr.detectChanges();
|
|
129
130
|
};
|
|
130
|
-
DefaultLoadingManager.onError = (url) => {
|
|
131
|
+
THREE.DefaultLoadingManager.onError = (url) => {
|
|
131
132
|
progress.update((prev) => ({ ...prev, errors: [...prev.errors, url] }));
|
|
132
|
-
cdr.detectChanges();
|
|
133
133
|
};
|
|
134
|
-
DefaultLoadingManager.onProgress = (item, loaded, total) => {
|
|
134
|
+
THREE.DefaultLoadingManager.onProgress = (item, loaded, total) => {
|
|
135
135
|
if (loaded === total)
|
|
136
136
|
saveLastTotalLoaded = total;
|
|
137
137
|
progress.update((prev) => ({
|
|
@@ -141,8 +141,13 @@ function injectProgress(injector) {
|
|
|
141
141
|
total,
|
|
142
142
|
progress: ((loaded - saveLastTotalLoaded) / (total - saveLastTotalLoaded)) * 100 || 100,
|
|
143
143
|
}));
|
|
144
|
-
cdr.detectChanges();
|
|
145
144
|
};
|
|
145
|
+
inject(DestroyRef).onDestroy(() => {
|
|
146
|
+
THREE.DefaultLoadingManager.onStart = defaultOnStart;
|
|
147
|
+
THREE.DefaultLoadingManager.onLoad = defaultOnLoad;
|
|
148
|
+
THREE.DefaultLoadingManager.onError = defaultOnError;
|
|
149
|
+
THREE.DefaultLoadingManager.onProgress = defaultOnProgress;
|
|
150
|
+
});
|
|
146
151
|
return progress.asReadonly();
|
|
147
152
|
});
|
|
148
153
|
}
|
|
@@ -248,16 +253,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImpor
|
|
|
248
253
|
function _injectTexture(input, { onLoad, injector } = {}) {
|
|
249
254
|
return assertInjector(_injectTexture, injector, () => {
|
|
250
255
|
const store = injectStore();
|
|
251
|
-
const result = injectLoader(() => TextureLoader, input);
|
|
256
|
+
const result = injectLoader(() => THREE.TextureLoader, input);
|
|
252
257
|
effect(() => {
|
|
253
258
|
const textures = result();
|
|
254
259
|
if (!textures)
|
|
255
260
|
return;
|
|
256
|
-
const gl = store.
|
|
261
|
+
const gl = store.snapshot.gl;
|
|
257
262
|
if ('initTexture' in gl) {
|
|
258
263
|
const array = Array.isArray(textures)
|
|
259
264
|
? textures
|
|
260
|
-
: textures
|
|
265
|
+
: is.three(textures, 'isTexture')
|
|
261
266
|
? [textures]
|
|
262
267
|
: Object.values(textures);
|
|
263
268
|
if (onLoad)
|
|
@@ -269,7 +274,7 @@ function _injectTexture(input, { onLoad, injector } = {}) {
|
|
|
269
274
|
});
|
|
270
275
|
}
|
|
271
276
|
_injectTexture.preload = (input) => {
|
|
272
|
-
injectLoader.preload(() => TextureLoader, input);
|
|
277
|
+
injectLoader.preload(() => THREE.TextureLoader, input);
|
|
273
278
|
};
|
|
274
279
|
const injectTexture = _injectTexture;
|
|
275
280
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"angular-three-soba-loaders.mjs","sources":["../../../../libs/soba/loaders/src/lib/fbx-loader.ts","../../../../libs/soba/loaders/src/lib/font-loader.ts","../../../../libs/soba/loaders/src/lib/gltf-loader.ts","../../../../libs/soba/loaders/src/lib/progress.ts","../../../../libs/soba/loaders/src/lib/loader.ts","../../../../libs/soba/loaders/src/lib/texture-loader.ts","../../../../libs/soba/loaders/src/angular-three-soba-loaders.ts"],"sourcesContent":["import { Injector } from '@angular/core';\nimport { injectLoader } from 'angular-three';\nimport { assertInjector } from 'ngxtension/assert-injector';\nimport { FBXLoader } from 'three-stdlib';\n\nfunction _injectFBX<TUrl extends string | string[] | Record<string, string>>(\n\tinput: () => TUrl,\n\t{ injector }: { injector?: Injector } = {},\n) {\n\treturn assertInjector(_injectFBX, injector, () => {\n\t\treturn injectLoader(() => FBXLoader, input);\n\t});\n}\n\n_injectFBX.preload = <TUrl extends string | string[] | Record<string, string>>(input: () => TUrl) => {\n\tinjectLoader.preload(() => FBXLoader, input);\n};\n\nexport type NgtsFBXLoader = typeof _injectFBX;\nexport const injectFBX: NgtsFBXLoader = _injectFBX;\n","import { effect, Injector, signal } from '@angular/core';\nimport { assertInjector } from 'ngxtension/assert-injector';\nimport { Font, FontLoader } from 'three-stdlib';\n\nexport type Glyph = {\n\t_cachedOutline: string[];\n\tha: number;\n\to: string;\n};\n\nexport type FontData = {\n\tboundingBox: {\n\t\tyMax: number;\n\t\tyMin: number;\n\t};\n\tfamilyName: string;\n\tglyphs: {\n\t\t[k: string]: Glyph;\n\t};\n\tresolution: number;\n\tunderlineThickness: number;\n};\n\nexport type NgtsFontInput = string | FontData;\n\nlet fontLoader: FontLoader | null = null;\n\nasync function loadFontData(font: NgtsFontInput): Promise<FontData> {\n\treturn typeof font === 'string' ? await (await fetch(font)).json() : font;\n}\n\nfunction parseFontData(fontData: FontData) {\n\tif (!fontLoader) {\n\t\tfontLoader = new FontLoader();\n\t}\n\treturn fontLoader.parse(fontData);\n}\n\nconst cache = new Map<NgtsFontInput, Font>();\n\nexport function injectFont(input: () => NgtsFontInput, { injector }: { injector?: Injector } = {}) {\n\treturn assertInjector(injectFont, injector, () => {\n\t\tconst font = signal<Font | null>(null);\n\n\t\teffect(() => {\n\t\t\tconst fontInput = input();\n\n\t\t\tif (cache.has(fontInput)) {\n\t\t\t\tfont.set(cache.get(fontInput) as Font);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tloadFontData(input()).then((data) => {\n\t\t\t\tconst parsed = parseFontData(data);\n\t\t\t\tcache.set(fontInput, parsed);\n\t\t\t\tfont.set(parsed);\n\t\t\t});\n\t\t});\n\n\t\treturn font.asReadonly();\n\t});\n}\n\ninjectFont.preload = (input: () => NgtsFontInput) => {\n\tloadFontData(input()).then((data) => {\n\t\tconst parsed = parseFontData(data);\n\t\tcache.set(input(), parsed);\n\t});\n};\ninjectFont.clear = (input?: () => NgtsFontInput) => {\n\tif (input) {\n\t\tcache.delete(input());\n\t} else {\n\t\tcache.clear();\n\t}\n};\n","import { computed, Injector, Signal } from '@angular/core';\nimport { injectLoader, NgtLoaderResults, NgtObjectMap } from 'angular-three';\nimport { assertInjector } from 'ngxtension/assert-injector';\nimport { Loader } from 'three';\nimport { DRACOLoader, GLTF, GLTFLoader, MeshoptDecoder } from 'three-stdlib';\n\nlet dracoLoader: DRACOLoader | null = null;\nlet decoderPath = 'https://www.gstatic.com/draco/versioned/decoders/1.5.5/';\n\nfunction _extensions(useDraco: boolean | string, useMeshOpt: boolean, extensions?: (loader: GLTFLoader) => void) {\n\treturn (loader: Loader) => {\n\t\tif (extensions) {\n\t\t\textensions(loader as GLTFLoader);\n\t\t}\n\n\t\tif (useDraco) {\n\t\t\tif (!dracoLoader) {\n\t\t\t\tdracoLoader = new DRACOLoader();\n\t\t\t}\n\n\t\t\tdracoLoader.setDecoderPath(typeof useDraco === 'string' ? useDraco : decoderPath);\n\t\t\t(loader as GLTFLoader).setDRACOLoader(dracoLoader);\n\t\t}\n\t\tif (useMeshOpt) {\n\t\t\t(loader as GLTFLoader).setMeshoptDecoder(\n\t\t\t\ttypeof MeshoptDecoder === 'function' ? MeshoptDecoder() : MeshoptDecoder,\n\t\t\t);\n\t\t}\n\t};\n}\n\ntype InjectGLTFUrl<TGltf extends GLTF | GLTF[] | Record<string, GLTF>> = TGltf extends GLTF\n\t? string\n\t: TGltf extends GLTF[]\n\t\t? string[]\n\t\t: TGltf extends Record<string, GLTF>\n\t\t\t? Record<string, string>\n\t\t\t: never;\ntype InjectGLTFObjectMap<TGltf extends GLTF | GLTF[] | Record<string, GLTF>> = TGltf extends GLTF\n\t? TGltf & NgtObjectMap\n\t: TGltf extends Array<infer _GLTF extends GLTF>\n\t\t? Array<_GLTF & NgtObjectMap>\n\t\t: TGltf extends Record<string, infer _GLTF extends GLTF>\n\t\t\t? Record<string, _GLTF & NgtObjectMap>\n\t\t\t: never;\n\nfunction _injectGLTF<\n\tTGltf extends GLTF | GLTF[] | Record<string, GLTF> = GLTF,\n\tTUrl extends string | string[] | Record<string, string> = InjectGLTFUrl<TGltf>,\n>(\n\tpath: () => TUrl,\n\t{\n\t\tuseDraco = true,\n\t\tuseMeshOpt = true,\n\t\tinjector,\n\t\textensions,\n\t\tonLoad,\n\t}: {\n\t\tuseDraco?: boolean | string;\n\t\tuseMeshOpt?: boolean;\n\t\tinjector?: Injector;\n\t\textensions?: (loader: GLTFLoader) => void;\n\t\tonLoad?: (data: InjectGLTFObjectMap<TGltf>) => void;\n\t} = {},\n): Signal<InjectGLTFObjectMap<TGltf> | null> & { scene: Signal<GLTF['scene'] | null> } {\n\treturn assertInjector(_injectGLTF, injector, () => {\n\t\tconst result = injectLoader(() => GLTFLoader, path, {\n\t\t\textensions: _extensions(useDraco, useMeshOpt, extensions),\n\t\t\t// @ts-expect-error - we know the type of the data\n\t\t\tonLoad,\n\t\t});\n\n\t\tObject.defineProperty(result, 'scene', {\n\t\t\tvalue: computed(() => {\n\t\t\t\tconst gltf = result() as unknown as GLTF;\n\t\t\t\tif (!gltf) return null;\n\t\t\t\treturn gltf.scene;\n\t\t\t}),\n\t\t});\n\n\t\treturn result;\n\t}) as Signal<InjectGLTFObjectMap<TGltf> | null> & { scene: Signal<GLTF['scene'] | null> };\n}\n\n_injectGLTF.preload = <TUrl extends string | string[] | Record<string, string>>(\n\tpath: () => TUrl,\n\t{\n\t\tuseDraco = true,\n\t\tuseMeshOpt = true,\n\t\textensions,\n\t\tonLoad,\n\t}: {\n\t\tuseDraco?: boolean | string;\n\t\tuseMeshOpt?: boolean;\n\t\textensions?: (loader: GLTFLoader) => void;\n\t\tonLoad?: (data: NgtLoaderResults<TUrl, GLTF & NgtObjectMap>) => void;\n\t} = {},\n) => {\n\tinjectLoader.preload(\n\t\t() => GLTFLoader,\n\t\tpath,\n\t\t_extensions(useDraco, useMeshOpt, extensions) as any,\n\t\t// @ts-expect-error - we know the type of the data\n\t\tonLoad,\n\t);\n};\n\n_injectGLTF.setDecoderPath = (path: string) => {\n\tdecoderPath = path;\n};\n\nexport type NgtsGLTFLoader = typeof _injectGLTF;\nexport const injectGLTF: NgtsGLTFLoader = _injectGLTF;\n","import { ChangeDetectorRef, Injector, inject, signal } from '@angular/core';\nimport { assertInjector } from 'ngxtension/assert-injector';\nimport { DefaultLoadingManager } from 'three';\n\nexport function injectProgress(injector?: Injector) {\n\treturn assertInjector(injectProgress, injector, () => {\n\t\tconst cdr = inject(ChangeDetectorRef);\n\n\t\tconst progress = signal<{\n\t\t\terrors: string[];\n\t\t\tactive: boolean;\n\t\t\tprogress: number;\n\t\t\titem: string;\n\t\t\tloaded: number;\n\t\t\ttotal: number;\n\t\t}>({ errors: [], active: false, progress: 0, item: '', loaded: 0, total: 0 });\n\n\t\tlet saveLastTotalLoaded = 0;\n\n\t\tDefaultLoadingManager.onStart = (item, loaded, total) => {\n\t\t\tprogress.update((prev) => ({\n\t\t\t\t...prev,\n\t\t\t\tactive: true,\n\t\t\t\titem,\n\t\t\t\tloaded,\n\t\t\t\ttotal,\n\t\t\t\tprogress: ((loaded - saveLastTotalLoaded) / (total - saveLastTotalLoaded)) * 100,\n\t\t\t}));\n\n\t\t\tcdr.detectChanges();\n\t\t};\n\n\t\tDefaultLoadingManager.onLoad = () => {\n\t\t\tprogress.update((prev) => ({ ...prev, active: false }));\n\t\t\tcdr.detectChanges();\n\t\t};\n\n\t\tDefaultLoadingManager.onError = (url) => {\n\t\t\tprogress.update((prev) => ({ ...prev, errors: [...prev.errors, url] }));\n\t\t\tcdr.detectChanges();\n\t\t};\n\n\t\tDefaultLoadingManager.onProgress = (item, loaded, total) => {\n\t\t\tif (loaded === total) saveLastTotalLoaded = total;\n\n\t\t\tprogress.update((prev) => ({\n\t\t\t\t...prev,\n\t\t\t\titem,\n\t\t\t\tloaded,\n\t\t\t\ttotal,\n\t\t\t\tprogress: ((loaded - saveLastTotalLoaded) / (total - saveLastTotalLoaded)) * 100 || 100,\n\t\t\t}));\n\n\t\t\tcdr.detectChanges();\n\t\t};\n\n\t\treturn progress.asReadonly();\n\t});\n}\n","import {\n\tChangeDetectionStrategy,\n\tComponent,\n\tElementRef,\n\tcomputed,\n\teffect,\n\tinput,\n\tsignal,\n\tuntracked,\n\tviewChild,\n} from '@angular/core';\nimport { pick } from 'angular-three';\nimport { mergeInputs } from 'ngxtension/inject-inputs';\nimport { injectProgress } from './progress';\n\nconst defaultDataInterpolation = (p: number) => `Loading ${p.toFixed(2)}%`;\n\nexport interface NgtsLoaderOptions {\n\tcontainerClass?: string;\n\tinnerClass?: string;\n\tbarClass?: string;\n\tdataClass?: string;\n\tdataInterpolation: (value: number) => string;\n\tinitialState: (value: boolean) => boolean;\n}\n\nconst defaultOptions: NgtsLoaderOptions = {\n\tcontainerClass: '',\n\tinnerClass: '',\n\tbarClass: '',\n\tdataClass: '',\n\tdataInterpolation: defaultDataInterpolation,\n\tinitialState: (value) => value,\n};\n\n@Component({\n\tselector: 'ngts-loader',\n\ttemplate: `\n\t\t@if (shown()) {\n\t\t\t<div\n\t\t\t\tclass=\"ngts-loader-container\"\n\t\t\t\t[class]=\"containerClass() || ''\"\n\t\t\t\t[style.--ngts-loader-container-opacity]=\"active() ? 1 : 0\"\n\t\t\t>\n\t\t\t\t<div>\n\t\t\t\t\t<div class=\"ngts-loader-inner\" [class]=\"innerClass() || ''\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"ngts-loader-bar\"\n\t\t\t\t\t\t\t[class]=\"barClass() || ''\"\n\t\t\t\t\t\t\t[style.--ngts-loader-bar-scale]=\"progress() / 100\"\n\t\t\t\t\t\t></div>\n\t\t\t\t\t\t<span #progressSpanRef class=\"ngts-loader-data\" [class]=\"dataClass() || ''\"></span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t}\n\t`,\n\tstyleUrls: ['./loader.css'],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgtsLoader {\n\tprivate progressState = injectProgress();\n\n\tactive = computed(() => this.progressState().active);\n\tprogress = computed(() => this.progressState().progress);\n\n\toptions = input(defaultOptions, { transform: mergeInputs(defaultOptions) });\n\n\tcontainerClass = pick(this.options, 'containerClass');\n\tinnerClass = pick(this.options, 'innerClass');\n\tbarClass = pick(this.options, 'barClass');\n\tdataClass = pick(this.options, 'dataClass');\n\tinitialState = pick(this.options, 'initialState');\n\tdataInterpolation = pick(this.options, 'dataInterpolation');\n\n\tprogressSpanRef = viewChild<ElementRef<HTMLSpanElement>>('progressSpanRef');\n\n\tshown = signal(this.initialState()(this.active()));\n\n\tconstructor() {\n\t\teffect((onCleanup) => {\n\t\t\tconst [active, lastShown] = [this.active(), untracked(this.shown)];\n\t\t\tif (lastShown !== active) {\n\t\t\t\tconst timeoutId = setTimeout(() => {\n\t\t\t\t\tthis.shown.set(active);\n\t\t\t\t}, 300);\n\t\t\t\tonCleanup(() => clearTimeout(timeoutId));\n\t\t\t}\n\t\t});\n\n\t\tlet progressRef = 0;\n\t\tlet rafId: ReturnType<typeof requestAnimationFrame>;\n\t\teffect((onCleanup) => {\n\t\t\tconst [dataInterpolation, progress] = [this.dataInterpolation(), this.progress()];\n\t\t\tconst updateProgress = () => {\n\t\t\t\tconst progressSpan = this.progressSpanRef()?.nativeElement;\n\t\t\t\tif (!progressSpan) return;\n\t\t\t\tprogressRef += (progress - progressRef) / 2;\n\t\t\t\tif (progressRef > 0.95 * progress || progress === 100) progressRef = progress;\n\t\t\t\tprogressSpan.innerText = dataInterpolation(progressRef);\n\t\t\t\tif (progressRef < progress) {\n\t\t\t\t\trafId = requestAnimationFrame(updateProgress);\n\t\t\t\t}\n\t\t\t};\n\t\t\tupdateProgress();\n\t\t\tonCleanup(() => cancelAnimationFrame(rafId));\n\t\t});\n\t}\n}\n","import { effect, Injector, Signal } from '@angular/core';\nimport { injectLoader, injectStore, NgtLoaderResults } from 'angular-three';\nimport { assertInjector } from 'ngxtension/assert-injector';\nimport { Texture, TextureLoader } from 'three';\n\nfunction _injectTexture<TInput extends string[] | string | Record<string, string>>(\n\tinput: () => TInput,\n\t{ onLoad, injector }: { onLoad?: (texture: Texture[]) => void; injector?: Injector } = {},\n): Signal<NgtLoaderResults<TInput, Texture> | null> {\n\treturn assertInjector(_injectTexture, injector, () => {\n\t\tconst store = injectStore();\n\t\tconst result = injectLoader(() => TextureLoader, input);\n\n\t\teffect(() => {\n\t\t\tconst textures = result();\n\t\t\tif (!textures) return;\n\t\t\tconst gl = store.get('gl');\n\t\t\tif ('initTexture' in gl) {\n\t\t\t\tconst array = Array.isArray(textures)\n\t\t\t\t\t? textures\n\t\t\t\t\t: textures instanceof Texture\n\t\t\t\t\t\t? [textures]\n\t\t\t\t\t\t: Object.values(textures);\n\t\t\t\tif (onLoad) onLoad(array);\n\t\t\t\tarray.forEach(gl.initTexture.bind(gl));\n\t\t\t}\n\t\t});\n\n\t\treturn result;\n\t});\n}\n\n_injectTexture.preload = <TInput extends string[] | string | Record<string, string>>(input: () => TInput) => {\n\tinjectLoader.preload(() => TextureLoader, input);\n};\n\nexport type NgtsTextureLoader = typeof _injectTexture;\nexport const injectTexture: NgtsTextureLoader = _injectTexture;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"angular-three-soba-loaders.mjs","sources":["../../../../libs/soba/loaders/src/lib/fbx-loader.ts","../../../../libs/soba/loaders/src/lib/font-loader.ts","../../../../libs/soba/loaders/src/lib/gltf-loader.ts","../../../../libs/soba/loaders/src/lib/progress.ts","../../../../libs/soba/loaders/src/lib/loader.ts","../../../../libs/soba/loaders/src/lib/texture-loader.ts","../../../../libs/soba/loaders/src/angular-three-soba-loaders.ts"],"sourcesContent":["import { Injector } from '@angular/core';\nimport { injectLoader } from 'angular-three';\nimport { assertInjector } from 'ngxtension/assert-injector';\nimport { FBXLoader } from 'three-stdlib';\n\nfunction _injectFBX<TUrl extends string | string[] | Record<string, string>>(\n\tinput: () => TUrl,\n\t{ injector }: { injector?: Injector } = {},\n) {\n\treturn assertInjector(_injectFBX, injector, () => {\n\t\treturn injectLoader(() => FBXLoader, input);\n\t});\n}\n\n_injectFBX.preload = <TUrl extends string | string[] | Record<string, string>>(input: () => TUrl) => {\n\tinjectLoader.preload(() => FBXLoader, input);\n};\n\nexport type NgtsFBXLoader = typeof _injectFBX;\nexport const injectFBX: NgtsFBXLoader = _injectFBX;\n","import { effect, Injector, signal } from '@angular/core';\nimport { assertInjector } from 'ngxtension/assert-injector';\nimport { Font, FontLoader } from 'three-stdlib';\n\nexport type Glyph = {\n\t_cachedOutline: string[];\n\tha: number;\n\to: string;\n};\n\nexport type FontData = {\n\tboundingBox: {\n\t\tyMax: number;\n\t\tyMin: number;\n\t};\n\tfamilyName: string;\n\tglyphs: {\n\t\t[k: string]: Glyph;\n\t};\n\tresolution: number;\n\tunderlineThickness: number;\n};\n\nexport type NgtsFontInput = string | FontData;\n\nlet fontLoader: FontLoader | null = null;\n\nasync function loadFontData(font: NgtsFontInput): Promise<FontData> {\n\treturn typeof font === 'string' ? await (await fetch(font)).json() : font;\n}\n\nfunction parseFontData(fontData: FontData) {\n\tif (!fontLoader) {\n\t\tfontLoader = new FontLoader();\n\t}\n\treturn fontLoader.parse(fontData);\n}\n\nconst cache = new Map<NgtsFontInput, Font>();\n\nexport function injectFont(input: () => NgtsFontInput, { injector }: { injector?: Injector } = {}) {\n\treturn assertInjector(injectFont, injector, () => {\n\t\tconst font = signal<Font | null>(null);\n\n\t\teffect(() => {\n\t\t\tconst fontInput = input();\n\n\t\t\tif (cache.has(fontInput)) {\n\t\t\t\tfont.set(cache.get(fontInput) as Font);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tloadFontData(input()).then((data) => {\n\t\t\t\tconst parsed = parseFontData(data);\n\t\t\t\tcache.set(fontInput, parsed);\n\t\t\t\tfont.set(parsed);\n\t\t\t});\n\t\t});\n\n\t\treturn font.asReadonly();\n\t});\n}\n\ninjectFont.preload = (input: () => NgtsFontInput) => {\n\tloadFontData(input()).then((data) => {\n\t\tconst parsed = parseFontData(data);\n\t\tcache.set(input(), parsed);\n\t});\n};\ninjectFont.clear = (input?: () => NgtsFontInput) => {\n\tif (input) {\n\t\tcache.delete(input());\n\t} else {\n\t\tcache.clear();\n\t}\n};\n","import { computed, Injector, Signal } from '@angular/core';\nimport { injectLoader, NgtLoaderResults, NgtObjectMap } from 'angular-three';\nimport { assertInjector } from 'ngxtension/assert-injector';\nimport * as THREE from 'three';\nimport { DRACOLoader, GLTF, GLTFLoader, MeshoptDecoder } from 'three-stdlib';\n\nlet dracoLoader: DRACOLoader | null = null;\nlet decoderPath = 'https://www.gstatic.com/draco/versioned/decoders/1.5.5/';\n\nfunction _extensions(useDraco: boolean | string, useMeshOpt: boolean, extensions?: (loader: GLTFLoader) => void) {\n\treturn (loader: THREE.Loader) => {\n\t\tif (extensions) {\n\t\t\textensions(loader as GLTFLoader);\n\t\t}\n\n\t\tif (useDraco) {\n\t\t\tif (!dracoLoader) {\n\t\t\t\tdracoLoader = new DRACOLoader();\n\t\t\t}\n\n\t\t\tdracoLoader.setDecoderPath(typeof useDraco === 'string' ? useDraco : decoderPath);\n\t\t\t(loader as GLTFLoader).setDRACOLoader(dracoLoader);\n\t\t}\n\t\tif (useMeshOpt) {\n\t\t\t(loader as GLTFLoader).setMeshoptDecoder(\n\t\t\t\ttypeof MeshoptDecoder === 'function' ? MeshoptDecoder() : MeshoptDecoder,\n\t\t\t);\n\t\t}\n\t};\n}\n\ntype InjectGLTFUrl<TGltf extends GLTF | GLTF[] | Record<string, GLTF>> = TGltf extends GLTF\n\t? string\n\t: TGltf extends GLTF[]\n\t\t? string[]\n\t\t: TGltf extends Record<string, GLTF>\n\t\t\t? Record<string, string>\n\t\t\t: never;\ntype InjectGLTFObjectMap<TGltf extends GLTF | GLTF[] | Record<string, GLTF>> = TGltf extends GLTF\n\t? TGltf & NgtObjectMap\n\t: TGltf extends Array<infer _GLTF extends GLTF>\n\t\t? Array<_GLTF & NgtObjectMap>\n\t\t: TGltf extends Record<string, infer _GLTF extends GLTF>\n\t\t\t? Record<string, _GLTF & NgtObjectMap>\n\t\t\t: never;\n\nfunction _injectGLTF<\n\tTGltf extends GLTF | GLTF[] | Record<string, GLTF> = GLTF,\n\tTUrl extends string | string[] | Record<string, string> = InjectGLTFUrl<TGltf>,\n>(\n\tpath: () => TUrl,\n\t{\n\t\tuseDraco = true,\n\t\tuseMeshOpt = true,\n\t\tinjector,\n\t\textensions,\n\t\tonLoad,\n\t}: {\n\t\tuseDraco?: boolean | string;\n\t\tuseMeshOpt?: boolean;\n\t\tinjector?: Injector;\n\t\textensions?: (loader: GLTFLoader) => void;\n\t\tonLoad?: (data: InjectGLTFObjectMap<TGltf>) => void;\n\t} = {},\n): Signal<InjectGLTFObjectMap<TGltf> | null> & { scene: Signal<GLTF['scene'] | null> } {\n\treturn assertInjector(_injectGLTF, injector, () => {\n\t\tconst result = injectLoader(() => GLTFLoader, path, {\n\t\t\textensions: _extensions(useDraco, useMeshOpt, extensions),\n\t\t\t// @ts-expect-error - we know the type of the data\n\t\t\tonLoad,\n\t\t});\n\n\t\tObject.defineProperty(result, 'scene', {\n\t\t\tvalue: computed(() => {\n\t\t\t\tconst gltf = result() as unknown as GLTF;\n\t\t\t\tif (!gltf) return null;\n\t\t\t\treturn gltf.scene;\n\t\t\t}),\n\t\t});\n\n\t\treturn result;\n\t}) as Signal<InjectGLTFObjectMap<TGltf> | null> & { scene: Signal<GLTF['scene'] | null> };\n}\n\n_injectGLTF.preload = <TUrl extends string | string[] | Record<string, string>>(\n\tpath: () => TUrl,\n\t{\n\t\tuseDraco = true,\n\t\tuseMeshOpt = true,\n\t\textensions,\n\t\tonLoad,\n\t}: {\n\t\tuseDraco?: boolean | string;\n\t\tuseMeshOpt?: boolean;\n\t\textensions?: (loader: GLTFLoader) => void;\n\t\tonLoad?: (data: NgtLoaderResults<TUrl, GLTF & NgtObjectMap>) => void;\n\t} = {},\n) => {\n\tinjectLoader.preload(\n\t\t() => GLTFLoader,\n\t\tpath,\n\t\t_extensions(useDraco, useMeshOpt, extensions) as any,\n\t\t// @ts-expect-error - we know the type of the data\n\t\tonLoad,\n\t);\n};\n\n_injectGLTF.setDecoderPath = (path: string) => {\n\tdecoderPath = path;\n};\n\nexport type NgtsGLTFLoader = typeof _injectGLTF;\nexport const injectGLTF: NgtsGLTFLoader = _injectGLTF;\n","import { DestroyRef, inject, Injector, signal } from '@angular/core';\nimport { assertInjector } from 'ngxtension/assert-injector';\nimport * as THREE from 'three';\n\nexport function injectProgress(injector?: Injector) {\n\treturn assertInjector(injectProgress, injector, () => {\n\t\tconst progress = signal<{\n\t\t\terrors: string[];\n\t\t\tactive: boolean;\n\t\t\tprogress: number;\n\t\t\titem: string;\n\t\t\tloaded: number;\n\t\t\ttotal: number;\n\t\t}>({ errors: [], active: false, progress: 0, item: '', loaded: 0, total: 0 });\n\n\t\tconst defaultOnStart = THREE.DefaultLoadingManager.onStart?.bind(THREE.DefaultLoadingManager);\n\t\tconst defaultOnLoad = THREE.DefaultLoadingManager.onLoad?.bind(THREE.DefaultLoadingManager);\n\t\tconst defaultOnError = THREE.DefaultLoadingManager.onError?.bind(THREE.DefaultLoadingManager);\n\t\tconst defaultOnProgress = THREE.DefaultLoadingManager.onProgress?.bind(THREE.DefaultLoadingManager);\n\n\t\tlet saveLastTotalLoaded = 0;\n\n\t\tTHREE.DefaultLoadingManager.onStart = (item, loaded, total) => {\n\t\t\tprogress.update((prev) => ({\n\t\t\t\t...prev,\n\t\t\t\tactive: true,\n\t\t\t\titem,\n\t\t\t\tloaded,\n\t\t\t\ttotal,\n\t\t\t\tprogress: ((loaded - saveLastTotalLoaded) / (total - saveLastTotalLoaded)) * 100,\n\t\t\t}));\n\t\t};\n\n\t\tTHREE.DefaultLoadingManager.onLoad = () => {\n\t\t\tprogress.update((prev) => ({ ...prev, active: false }));\n\t\t};\n\n\t\tTHREE.DefaultLoadingManager.onError = (url) => {\n\t\t\tprogress.update((prev) => ({ ...prev, errors: [...prev.errors, url] }));\n\t\t};\n\n\t\tTHREE.DefaultLoadingManager.onProgress = (item, loaded, total) => {\n\t\t\tif (loaded === total) saveLastTotalLoaded = total;\n\n\t\t\tprogress.update((prev) => ({\n\t\t\t\t...prev,\n\t\t\t\titem,\n\t\t\t\tloaded,\n\t\t\t\ttotal,\n\t\t\t\tprogress: ((loaded - saveLastTotalLoaded) / (total - saveLastTotalLoaded)) * 100 || 100,\n\t\t\t}));\n\t\t};\n\n\t\tinject(DestroyRef).onDestroy(() => {\n\t\t\tTHREE.DefaultLoadingManager.onStart = defaultOnStart;\n\t\t\tTHREE.DefaultLoadingManager.onLoad = defaultOnLoad;\n\t\t\tTHREE.DefaultLoadingManager.onError = defaultOnError;\n\t\t\tTHREE.DefaultLoadingManager.onProgress = defaultOnProgress;\n\t\t});\n\n\t\treturn progress.asReadonly();\n\t});\n}\n","import {\n\tChangeDetectionStrategy,\n\tComponent,\n\tElementRef,\n\tcomputed,\n\teffect,\n\tinput,\n\tsignal,\n\tuntracked,\n\tviewChild,\n} from '@angular/core';\nimport { pick } from 'angular-three';\nimport { mergeInputs } from 'ngxtension/inject-inputs';\nimport { injectProgress } from './progress';\n\nconst defaultDataInterpolation = (p: number) => `Loading ${p.toFixed(2)}%`;\n\nexport interface NgtsLoaderOptions {\n\tcontainerClass?: string;\n\tinnerClass?: string;\n\tbarClass?: string;\n\tdataClass?: string;\n\tdataInterpolation: (value: number) => string;\n\tinitialState: (value: boolean) => boolean;\n}\n\nconst defaultOptions: NgtsLoaderOptions = {\n\tcontainerClass: '',\n\tinnerClass: '',\n\tbarClass: '',\n\tdataClass: '',\n\tdataInterpolation: defaultDataInterpolation,\n\tinitialState: (value) => value,\n};\n\n@Component({\n\tselector: 'ngts-loader',\n\ttemplate: `\n\t\t@if (shown()) {\n\t\t\t<div\n\t\t\t\tclass=\"ngts-loader-container\"\n\t\t\t\t[class]=\"containerClass() || ''\"\n\t\t\t\t[style.--ngts-loader-container-opacity]=\"active() ? 1 : 0\"\n\t\t\t>\n\t\t\t\t<div>\n\t\t\t\t\t<div class=\"ngts-loader-inner\" [class]=\"innerClass() || ''\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"ngts-loader-bar\"\n\t\t\t\t\t\t\t[class]=\"barClass() || ''\"\n\t\t\t\t\t\t\t[style.--ngts-loader-bar-scale]=\"progress() / 100\"\n\t\t\t\t\t\t></div>\n\t\t\t\t\t\t<span #progressSpanRef class=\"ngts-loader-data\" [class]=\"dataClass() || ''\"></span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t}\n\t`,\n\tstyleUrls: ['./loader.css'],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgtsLoader {\n\tprivate progressState = injectProgress();\n\n\tprotected active = computed(() => this.progressState().active);\n\tprotected progress = computed(() => this.progressState().progress);\n\n\toptions = input(defaultOptions, { transform: mergeInputs(defaultOptions) });\n\n\tprotected containerClass = pick(this.options, 'containerClass');\n\tprotected innerClass = pick(this.options, 'innerClass');\n\tprotected barClass = pick(this.options, 'barClass');\n\tprotected dataClass = pick(this.options, 'dataClass');\n\tprivate initialState = pick(this.options, 'initialState');\n\tprivate dataInterpolation = pick(this.options, 'dataInterpolation');\n\n\tprivate progressSpanRef = viewChild<ElementRef<HTMLSpanElement>>('progressSpanRef');\n\n\tprotected shown = signal(this.initialState()(this.active()));\n\n\tconstructor() {\n\t\teffect((onCleanup) => {\n\t\t\tconst [active, lastShown] = [this.active(), untracked(this.shown)];\n\t\t\tif (lastShown !== active) {\n\t\t\t\tconst timeoutId = setTimeout(() => {\n\t\t\t\t\tthis.shown.set(active);\n\t\t\t\t}, 300);\n\t\t\t\tonCleanup(() => clearTimeout(timeoutId));\n\t\t\t}\n\t\t});\n\n\t\tlet progressRef = 0;\n\t\tlet rafId: ReturnType<typeof requestAnimationFrame>;\n\t\teffect((onCleanup) => {\n\t\t\tconst [dataInterpolation, progress] = [this.dataInterpolation(), this.progress()];\n\t\t\tconst updateProgress = () => {\n\t\t\t\tconst progressSpan = this.progressSpanRef()?.nativeElement;\n\t\t\t\tif (!progressSpan) return;\n\t\t\t\tprogressRef += (progress - progressRef) / 2;\n\t\t\t\tif (progressRef > 0.95 * progress || progress === 100) progressRef = progress;\n\t\t\t\tprogressSpan.innerText = dataInterpolation(progressRef);\n\t\t\t\tif (progressRef < progress) {\n\t\t\t\t\trafId = requestAnimationFrame(updateProgress);\n\t\t\t\t}\n\t\t\t};\n\t\t\tupdateProgress();\n\t\t\tonCleanup(() => cancelAnimationFrame(rafId));\n\t\t});\n\t}\n}\n","import { effect, Injector, Signal } from '@angular/core';\nimport { injectLoader, injectStore, is, NgtLoaderResults } from 'angular-three';\nimport { assertInjector } from 'ngxtension/assert-injector';\nimport * as THREE from 'three';\n\nfunction _injectTexture<TInput extends string[] | string | Record<string, string>>(\n\tinput: () => TInput,\n\t{ onLoad, injector }: { onLoad?: (texture: THREE.Texture[]) => void; injector?: Injector } = {},\n): Signal<NgtLoaderResults<TInput, THREE.Texture> | null> {\n\treturn assertInjector(_injectTexture, injector, () => {\n\t\tconst store = injectStore();\n\t\tconst result = injectLoader(() => THREE.TextureLoader, input);\n\n\t\teffect(() => {\n\t\t\tconst textures = result();\n\t\t\tif (!textures) return;\n\t\t\tconst gl = store.snapshot.gl;\n\t\t\tif ('initTexture' in gl) {\n\t\t\t\tconst array = Array.isArray(textures)\n\t\t\t\t\t? textures\n\t\t\t\t\t: is.three<THREE.Texture>(textures, 'isTexture')\n\t\t\t\t\t\t? [textures]\n\t\t\t\t\t\t: Object.values(textures);\n\t\t\t\tif (onLoad) onLoad(array);\n\t\t\t\tarray.forEach(gl.initTexture.bind(gl));\n\t\t\t}\n\t\t});\n\n\t\treturn result;\n\t});\n}\n\n_injectTexture.preload = <TInput extends string[] | string | Record<string, string>>(input: () => TInput) => {\n\tinjectLoader.preload(() => THREE.TextureLoader, input);\n};\n\nexport type NgtsTextureLoader = typeof _injectTexture;\nexport const injectTexture: NgtsTextureLoader = _injectTexture;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { input, computed, effect, Component, CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, inject, DestroyRef, Injector, Directive, viewChild, contentChild, TemplateRef, signal, untracked } from '@angular/core';
|
|
3
|
-
import { omit, is, pick, NgtArgs, injectBeforeRender, injectStore,
|
|
3
|
+
import { omit, is, pick, NgtArgs, injectBeforeRender, injectStore, getInstanceState, extend, applyProps } from 'angular-three';
|
|
4
4
|
import CustomShaderMaterial from 'three-custom-shader-material/vanilla';
|
|
5
5
|
import { MeshDistortMaterial, MeshPortalMaterial, meshPortalMaterialApplySDF, BlurPass, MeshReflectorMaterial, MeshDiscardMaterial, MeshTransmissionMaterial, MeshWobbleMaterial } from 'angular-three-soba/vanilla-exports';
|
|
6
6
|
import { mergeInputs } from 'ngxtension/inject-inputs';
|
|
7
7
|
import { NgTemplateOutlet } from '@angular/common';
|
|
8
8
|
import { injectFBO, getVersion, injectIntersect } from 'angular-three-soba/misc';
|
|
9
9
|
import { NgtsRenderTexture, NgtsRenderTextureContent } from 'angular-three-soba/staging';
|
|
10
|
-
import
|
|
10
|
+
import * as THREE from 'three';
|
|
11
11
|
import { FullScreenQuad } from 'three-stdlib';
|
|
12
12
|
import { MeshRefractionMaterial, PointMaterial } from 'angular-three-soba/shaders';
|
|
13
13
|
import { MeshBVHUniformStruct, MeshBVH, SAH } from 'three-mesh-bvh';
|
|
@@ -123,14 +123,12 @@ class ManagePortalScene {
|
|
|
123
123
|
this.worldUnits = input.required();
|
|
124
124
|
const injector = inject(Injector);
|
|
125
125
|
const renderTextureStore = injectStore();
|
|
126
|
-
const portalScene = renderTextureStore.select('scene');
|
|
127
|
-
const portalSetEvents = renderTextureStore.select('setEvents');
|
|
128
126
|
const buffer1 = injectFBO();
|
|
129
127
|
const buffer2 = injectFBO();
|
|
130
128
|
const fullScreenQuad = computed(() => {
|
|
131
129
|
// This fullscreen-quad is used to blend the two textures
|
|
132
130
|
const blend = { value: 0 };
|
|
133
|
-
const quad = new FullScreenQuad(new ShaderMaterial({
|
|
131
|
+
const quad = new FullScreenQuad(new THREE.ShaderMaterial({
|
|
134
132
|
uniforms: {
|
|
135
133
|
a: { value: buffer1().texture },
|
|
136
134
|
b: { value: buffer2().texture },
|
|
@@ -159,10 +157,10 @@ class ManagePortalScene {
|
|
|
159
157
|
return [quad, blend];
|
|
160
158
|
});
|
|
161
159
|
effect(() => {
|
|
162
|
-
|
|
160
|
+
renderTextureStore.scene().matrixAutoUpdate = false;
|
|
163
161
|
});
|
|
164
162
|
effect(() => {
|
|
165
|
-
const [events, setEvents] = [this.events(),
|
|
163
|
+
const [events, setEvents] = [this.events(), renderTextureStore.setEvents()];
|
|
166
164
|
if (!events)
|
|
167
165
|
return;
|
|
168
166
|
setEvents({ enabled: events });
|
|
@@ -172,25 +170,25 @@ class ManagePortalScene {
|
|
|
172
170
|
// we start the before render in effect because we need the priority input to be resolved
|
|
173
171
|
const sub = injectBeforeRender(({ gl, camera }) => {
|
|
174
172
|
const material = this.material();
|
|
175
|
-
const
|
|
176
|
-
if (!
|
|
173
|
+
const instanceState = getInstanceState(material);
|
|
174
|
+
if (!instanceState)
|
|
177
175
|
return;
|
|
178
|
-
const parent =
|
|
176
|
+
const parent = instanceState.parent();
|
|
179
177
|
if (!parent)
|
|
180
178
|
return;
|
|
181
179
|
const materialBlend = 'blend' in material && typeof material.blend === 'number' ? material.blend : 0;
|
|
182
180
|
const [worldUnits, rootScene, scene, [quad, blend]] = [
|
|
183
181
|
this.worldUnits(),
|
|
184
182
|
this.rootScene(),
|
|
185
|
-
|
|
183
|
+
renderTextureStore.snapshot.scene,
|
|
186
184
|
fullScreenQuad(),
|
|
187
185
|
];
|
|
188
186
|
// Move portal contents along with the parent if worldUnits is true
|
|
189
187
|
if (!worldUnits) {
|
|
190
188
|
// If the portal renders exclusively the original scene needs to be updated
|
|
191
189
|
if (priority && materialBlend === 1)
|
|
192
|
-
parent
|
|
193
|
-
scene.matrixWorld.copy(parent
|
|
190
|
+
parent['updateWorldMatrix'](true, false);
|
|
191
|
+
scene.matrixWorld.copy(parent['matrixWorld']);
|
|
194
192
|
}
|
|
195
193
|
else {
|
|
196
194
|
scene.matrixWorld.identity();
|
|
@@ -238,7 +236,14 @@ class NgtsMeshPortalMaterial {
|
|
|
238
236
|
constructor() {
|
|
239
237
|
this.attach = input('material');
|
|
240
238
|
this.options = input(defaultOptions$4, { transform: mergeInputs(defaultOptions$4) });
|
|
241
|
-
this.parameters = omit(this.options, [
|
|
239
|
+
this.parameters = omit(this.options, [
|
|
240
|
+
'blur',
|
|
241
|
+
'resolution',
|
|
242
|
+
'worldUnits',
|
|
243
|
+
'eventPriority',
|
|
244
|
+
'renderPriority',
|
|
245
|
+
'events',
|
|
246
|
+
]);
|
|
242
247
|
this.blur = pick(this.options, 'blur');
|
|
243
248
|
this.eventPriority = pick(this.options, 'eventPriority');
|
|
244
249
|
this.renderPriority = pick(this.options, 'renderPriority');
|
|
@@ -247,48 +252,42 @@ class NgtsMeshPortalMaterial {
|
|
|
247
252
|
this.materialRef = viewChild.required('material');
|
|
248
253
|
this.content = contentChild.required(TemplateRef);
|
|
249
254
|
this.store = injectStore();
|
|
250
|
-
this.
|
|
251
|
-
this.viewport = this.store.select('viewport');
|
|
252
|
-
this.gl = this.store.select('gl');
|
|
253
|
-
this.setEvents = this.store.select('setEvents');
|
|
254
|
-
this.rootScene = this.store.select('scene');
|
|
255
|
+
this.rootScene = this.store.scene;
|
|
255
256
|
this.materialResolution = computed(() => [
|
|
256
|
-
this.size()
|
|
257
|
-
this.size()
|
|
257
|
+
this.store.size.width() * this.store.viewport.dpr(),
|
|
258
|
+
this.store.size.height() * this.store.viewport.dpr(),
|
|
258
259
|
]);
|
|
259
260
|
this.resolution = pick(this.options, 'resolution');
|
|
260
261
|
this.parent = signal(null);
|
|
261
262
|
this.visible = injectIntersect(this.parent, { source: signal(true) });
|
|
262
263
|
this.renderTextureFrames = computed(() => (this.visible() ? Infinity : 0));
|
|
263
|
-
this.renderTextureCompute =
|
|
264
|
+
this.renderTextureCompute = (...args) => {
|
|
264
265
|
const [parent, material] = [this.parent(), this.materialRef().nativeElement];
|
|
265
|
-
|
|
266
|
-
|
|
266
|
+
if (!parent)
|
|
267
|
+
return false;
|
|
268
|
+
const [event, state] = args;
|
|
269
|
+
state.snapshot.pointer.set((event.offsetX / state.snapshot.size.width) * 2 - 1, -(event.offsetY / state.snapshot.size.height) * 2 + 1);
|
|
270
|
+
state.snapshot.raycaster.setFromCamera(state.snapshot.pointer, state.snapshot.camera);
|
|
271
|
+
if ('blend' in material && material.blend === 0) {
|
|
272
|
+
// We run a quick check against the parent, if it isn't hit there's no need to raycast at all
|
|
273
|
+
const [intersection] = state.snapshot.raycaster.intersectObject(parent);
|
|
274
|
+
if (!intersection) {
|
|
275
|
+
// Cancel out the raycast camera if the parent mesh isn't hit
|
|
276
|
+
Object.assign(state.snapshot.raycaster, { camera: undefined });
|
|
267
277
|
return false;
|
|
268
|
-
state.snapshot.pointer.set((event.offsetX / state.snapshot.size.width) * 2 - 1, -(event.offsetY / state.snapshot.size.height) * 2 + 1);
|
|
269
|
-
state.snapshot.raycaster.setFromCamera(state.snapshot.pointer, state.snapshot.camera);
|
|
270
|
-
if ('blend' in material && material.blend === 0) {
|
|
271
|
-
// We run a quick check against the parent, if it isn't hit there's no need to raycast at all
|
|
272
|
-
const [intersection] = state.snapshot.raycaster.intersectObject(parent);
|
|
273
|
-
if (!intersection) {
|
|
274
|
-
// Cancel out the raycast camera if the parent mesh isn't hit
|
|
275
|
-
Object.assign(state.snapshot.raycaster, { camera: undefined });
|
|
276
|
-
return false;
|
|
277
|
-
}
|
|
278
278
|
}
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
});
|
|
279
|
+
}
|
|
280
|
+
return;
|
|
281
|
+
};
|
|
283
282
|
this.priority = signal(0);
|
|
284
283
|
extend({ MeshPortalMaterial });
|
|
285
284
|
effect(() => {
|
|
286
285
|
const material = this.materialRef().nativeElement;
|
|
287
|
-
const
|
|
288
|
-
if (!
|
|
286
|
+
const instanceState = getInstanceState(material);
|
|
287
|
+
if (!instanceState)
|
|
289
288
|
return;
|
|
290
|
-
const materialParent =
|
|
291
|
-
if (!materialParent || !(materialParent
|
|
289
|
+
const materialParent = instanceState.parent();
|
|
290
|
+
if (!materialParent || !is.three(materialParent, 'isMesh'))
|
|
292
291
|
return;
|
|
293
292
|
// Since the ref above is not tied to a mesh directly (we're inside a material),
|
|
294
293
|
// it has to be tied to the parent mesh here
|
|
@@ -298,14 +297,14 @@ class NgtsMeshPortalMaterial {
|
|
|
298
297
|
const events = this.events();
|
|
299
298
|
if (!events)
|
|
300
299
|
return;
|
|
301
|
-
const setEvents = this.setEvents();
|
|
300
|
+
const setEvents = this.store.setEvents();
|
|
302
301
|
setEvents({ enabled: !events });
|
|
303
302
|
});
|
|
304
303
|
effect(() => {
|
|
305
304
|
const [material, parent] = [this.materialRef().nativeElement, this.parent()];
|
|
306
305
|
if (!parent)
|
|
307
306
|
return;
|
|
308
|
-
const [resolution, blur, gl] = [this.resolution(), this.blur(), this.gl()];
|
|
307
|
+
const [resolution, blur, gl] = [this.resolution(), this.blur(), this.store.gl()];
|
|
309
308
|
// apply the SDF mask once
|
|
310
309
|
if (blur && material.sdf == null) {
|
|
311
310
|
meshPortalMaterialApplySDF(parent, resolution, gl);
|
|
@@ -337,11 +336,11 @@ class NgtsMeshPortalMaterial {
|
|
|
337
336
|
frames: renderTextureFrames(),
|
|
338
337
|
eventPriority: eventPriority(),
|
|
339
338
|
renderPriority: renderPriority(),
|
|
340
|
-
compute: renderTextureCompute
|
|
339
|
+
compute: renderTextureCompute,
|
|
341
340
|
}"
|
|
342
341
|
>
|
|
343
342
|
<ng-template renderTextureContent let-injector="injector">
|
|
344
|
-
<ng-container
|
|
343
|
+
<ng-container [ngTemplateOutlet]="content()" [ngTemplateOutletInjector]="injector" />
|
|
345
344
|
<ngts-manage-portal-scene
|
|
346
345
|
[events]="events()"
|
|
347
346
|
[rootScene]="rootScene()"
|
|
@@ -372,11 +371,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImpor
|
|
|
372
371
|
frames: renderTextureFrames(),
|
|
373
372
|
eventPriority: eventPriority(),
|
|
374
373
|
renderPriority: renderPriority(),
|
|
375
|
-
compute: renderTextureCompute
|
|
374
|
+
compute: renderTextureCompute,
|
|
376
375
|
}"
|
|
377
376
|
>
|
|
378
377
|
<ng-template renderTextureContent let-injector="injector">
|
|
379
|
-
<ng-container
|
|
378
|
+
<ng-container [ngTemplateOutlet]="content()" [ngTemplateOutletInjector]="injector" />
|
|
380
379
|
<ngts-manage-portal-scene
|
|
381
380
|
[events]="events()"
|
|
382
381
|
[rootScene]="rootScene()"
|
|
@@ -428,7 +427,6 @@ class NgtsMeshReflectorMaterial {
|
|
|
428
427
|
'reflectorOffset',
|
|
429
428
|
]);
|
|
430
429
|
this.store = injectStore();
|
|
431
|
-
this.gl = this.store.select('gl');
|
|
432
430
|
this.materialRef = viewChild('material');
|
|
433
431
|
this.reflectOptions = pick(this.options, [
|
|
434
432
|
'distortionMap',
|
|
@@ -451,31 +449,31 @@ class NgtsMeshReflectorMaterial {
|
|
|
451
449
|
return Array.isArray(blur) ? blur : [blur, blur];
|
|
452
450
|
});
|
|
453
451
|
this.hasBlur = computed(() => this.normalizedBlur()[0] + this.normalizedBlur()[1] > 0);
|
|
454
|
-
this.reflectorPlane = new Plane();
|
|
455
|
-
this.normal = new Vector3();
|
|
456
|
-
this.reflectorWorldPosition = new Vector3();
|
|
457
|
-
this.cameraWorldPosition = new Vector3();
|
|
458
|
-
this.rotationMatrix = new Matrix4();
|
|
459
|
-
this.lookAtPosition = new Vector3(0, 0, -1);
|
|
460
|
-
this.clipPlane = new Vector4();
|
|
461
|
-
this.view = new Vector3();
|
|
462
|
-
this.target = new Vector3();
|
|
463
|
-
this.q = new Vector4();
|
|
464
|
-
this.textureMatrix = new Matrix4();
|
|
465
|
-
this.virtualCamera = new PerspectiveCamera();
|
|
452
|
+
this.reflectorPlane = new THREE.Plane();
|
|
453
|
+
this.normal = new THREE.Vector3();
|
|
454
|
+
this.reflectorWorldPosition = new THREE.Vector3();
|
|
455
|
+
this.cameraWorldPosition = new THREE.Vector3();
|
|
456
|
+
this.rotationMatrix = new THREE.Matrix4();
|
|
457
|
+
this.lookAtPosition = new THREE.Vector3(0, 0, -1);
|
|
458
|
+
this.clipPlane = new THREE.Vector4();
|
|
459
|
+
this.view = new THREE.Vector3();
|
|
460
|
+
this.target = new THREE.Vector3();
|
|
461
|
+
this.q = new THREE.Vector4();
|
|
462
|
+
this.textureMatrix = new THREE.Matrix4();
|
|
463
|
+
this.virtualCamera = new THREE.PerspectiveCamera();
|
|
466
464
|
this.reflectState = computed(() => {
|
|
467
|
-
const [gl, { resolution, minDepthThreshold, maxDepthThreshold, depthScale, depthToBlurRatioBias, mirror, mixBlur, mixStrength, distortion, distortionMap, mixContrast, }, blur, hasBlur,] = [this.gl(), this.reflectOptions(), this.normalizedBlur(), this.hasBlur()];
|
|
465
|
+
const [gl, { resolution, minDepthThreshold, maxDepthThreshold, depthScale, depthToBlurRatioBias, mirror, mixBlur, mixStrength, distortion, distortionMap, mixContrast, }, blur, hasBlur,] = [this.store.gl(), this.reflectOptions(), this.normalizedBlur(), this.hasBlur()];
|
|
468
466
|
const renderTargetParameters = {
|
|
469
|
-
minFilter: LinearFilter,
|
|
470
|
-
magFilter: LinearFilter,
|
|
471
|
-
type: HalfFloatType,
|
|
467
|
+
minFilter: THREE.LinearFilter,
|
|
468
|
+
magFilter: THREE.LinearFilter,
|
|
469
|
+
type: THREE.HalfFloatType,
|
|
472
470
|
};
|
|
473
|
-
const fbo1 = new WebGLRenderTarget(resolution, resolution, renderTargetParameters);
|
|
471
|
+
const fbo1 = new THREE.WebGLRenderTarget(resolution, resolution, renderTargetParameters);
|
|
474
472
|
fbo1.depthBuffer = true;
|
|
475
|
-
fbo1.depthTexture = new DepthTexture(resolution, resolution);
|
|
476
|
-
fbo1.depthTexture.format = DepthFormat;
|
|
477
|
-
fbo1.depthTexture.type = UnsignedShortType;
|
|
478
|
-
const fbo2 = new WebGLRenderTarget(resolution, resolution, renderTargetParameters);
|
|
473
|
+
fbo1.depthTexture = new THREE.DepthTexture(resolution, resolution);
|
|
474
|
+
fbo1.depthTexture.format = THREE.DepthFormat;
|
|
475
|
+
fbo1.depthTexture.type = THREE.UnsignedShortType;
|
|
476
|
+
const fbo2 = new THREE.WebGLRenderTarget(resolution, resolution, renderTargetParameters);
|
|
479
477
|
const blurPass = new BlurPass({
|
|
480
478
|
gl,
|
|
481
479
|
resolution,
|
|
@@ -550,10 +548,10 @@ class NgtsMeshReflectorMaterial {
|
|
|
550
548
|
const material = this.materialRef()?.nativeElement;
|
|
551
549
|
if (!material)
|
|
552
550
|
return;
|
|
553
|
-
const
|
|
554
|
-
if (!
|
|
551
|
+
const instanceState = getInstanceState(material);
|
|
552
|
+
if (!instanceState)
|
|
555
553
|
return;
|
|
556
|
-
const parent = Reflect.get(material, 'parent') ?? untracked(
|
|
554
|
+
const parent = Reflect.get(material, 'parent') ?? untracked(instanceState.parent);
|
|
557
555
|
if (!parent)
|
|
558
556
|
return;
|
|
559
557
|
const { fbo1, fbo2, blurPass } = this.reflectState();
|
|
@@ -581,10 +579,10 @@ class NgtsMeshReflectorMaterial {
|
|
|
581
579
|
const material = this.materialRef()?.nativeElement;
|
|
582
580
|
if (!material)
|
|
583
581
|
return;
|
|
584
|
-
const
|
|
585
|
-
if (!
|
|
582
|
+
const instanceState = getInstanceState(material);
|
|
583
|
+
if (!instanceState)
|
|
586
584
|
return;
|
|
587
|
-
const parent = Reflect.get(material, 'parent') ?? untracked(
|
|
585
|
+
const parent = Reflect.get(material, 'parent') ?? untracked(instanceState.parent);
|
|
588
586
|
if (!parent)
|
|
589
587
|
return;
|
|
590
588
|
const { camera } = this.store.snapshot;
|
|
@@ -669,9 +667,6 @@ const defaultOptions$2 = {
|
|
|
669
667
|
color: 'white',
|
|
670
668
|
fastChroma: true,
|
|
671
669
|
};
|
|
672
|
-
function isCubeTexture(def) {
|
|
673
|
-
return def && def.isCubeTexture;
|
|
674
|
-
}
|
|
675
670
|
class NgtsMeshRefractionMaterial {
|
|
676
671
|
constructor() {
|
|
677
672
|
this.envMap = input.required();
|
|
@@ -682,8 +677,7 @@ class NgtsMeshRefractionMaterial {
|
|
|
682
677
|
this.aberrationStrength = pick(this.options, 'aberrationStrength');
|
|
683
678
|
this.materialRef = viewChild('material');
|
|
684
679
|
this.store = injectStore();
|
|
685
|
-
this.
|
|
686
|
-
this.resolution = computed(() => [this.size().width, this.size().height]);
|
|
680
|
+
this.resolution = computed(() => [this.store.size.width(), this.store.size.height()]);
|
|
687
681
|
this.defines = computed(() => {
|
|
688
682
|
const _defines = {};
|
|
689
683
|
const [envMap, aberrationStrength, fastChroma] = [
|
|
@@ -691,7 +685,7 @@ class NgtsMeshRefractionMaterial {
|
|
|
691
685
|
this.aberrationStrength(),
|
|
692
686
|
this.fastChroma(),
|
|
693
687
|
];
|
|
694
|
-
const isCubeMap =
|
|
688
|
+
const isCubeMap = is.three(envMap, 'isCubeTexture');
|
|
695
689
|
const w = (isCubeMap ? envMap.image[0]?.width : envMap.image.width) ?? 1024;
|
|
696
690
|
const cubeSize = w / 4;
|
|
697
691
|
const _lodMax = Math.floor(Math.log2(cubeSize));
|
|
@@ -728,21 +722,24 @@ class NgtsMeshRefractionMaterial {
|
|
|
728
722
|
const material = this.materialRef()?.nativeElement;
|
|
729
723
|
if (!material)
|
|
730
724
|
return;
|
|
731
|
-
const
|
|
732
|
-
if (!
|
|
725
|
+
const instanceState = getInstanceState(material);
|
|
726
|
+
if (!instanceState)
|
|
733
727
|
return;
|
|
734
|
-
const parent = untracked(
|
|
728
|
+
const parent = untracked(instanceState.parent);
|
|
735
729
|
const geometry = parent.geometry;
|
|
736
730
|
if (geometry) {
|
|
737
|
-
|
|
738
|
-
|
|
731
|
+
const bvh = new MeshBVHUniformStruct();
|
|
732
|
+
bvh.updateFrom(new MeshBVH(geometry.clone().toNonIndexed(), { strategy: SAH }));
|
|
733
|
+
Object.assign(material, { bvh });
|
|
739
734
|
}
|
|
740
735
|
});
|
|
741
736
|
injectBeforeRender(({ camera }) => {
|
|
742
737
|
const material = this.materialRef()?.nativeElement;
|
|
743
738
|
if (material) {
|
|
744
|
-
material
|
|
745
|
-
|
|
739
|
+
Object.assign(material, {
|
|
740
|
+
viewMatrixInverse: camera.matrixWorld,
|
|
741
|
+
projectionMatrixInverse: camera.projectionMatrixInverse,
|
|
742
|
+
});
|
|
746
743
|
}
|
|
747
744
|
});
|
|
748
745
|
inject(DestroyRef).onDestroy(() => {
|
|
@@ -797,7 +794,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.4", ngImpor
|
|
|
797
794
|
const defaultOptions$1 = {
|
|
798
795
|
transmissionSampler: false,
|
|
799
796
|
backside: false,
|
|
800
|
-
side: FrontSide,
|
|
797
|
+
side: THREE.FrontSide,
|
|
801
798
|
transmission: 1,
|
|
802
799
|
thickness: 0,
|
|
803
800
|
backsideThickness: 0,
|
|
@@ -886,7 +883,7 @@ class NgtsMeshTransmissionMaterial {
|
|
|
886
883
|
// Render only if the buffer matches the built-in and no transmission sampler is set
|
|
887
884
|
// @ts-expect-error - we know material.buffer is not just undefined | null
|
|
888
885
|
if (material.buffer === fboMain.texture && !transmissionSampler) {
|
|
889
|
-
parent =
|
|
886
|
+
parent = getInstanceState(material)?.parent();
|
|
890
887
|
if (parent) {
|
|
891
888
|
// Save defaults
|
|
892
889
|
oldTone = gl.toneMapping;
|
|
@@ -895,7 +892,7 @@ class NgtsMeshTransmissionMaterial {
|
|
|
895
892
|
// Switch off tonemapping lest it double tone maps
|
|
896
893
|
// Save the current background and set the HDR as the new BG
|
|
897
894
|
// Use discardmaterial, the parent will be invisible, but it's shadows will still be cast
|
|
898
|
-
gl.toneMapping = NoToneMapping;
|
|
895
|
+
gl.toneMapping = THREE.NoToneMapping;
|
|
899
896
|
if (background)
|
|
900
897
|
scene.background = background;
|
|
901
898
|
parent.material = this.discardMaterial;
|
|
@@ -908,7 +905,7 @@ class NgtsMeshTransmissionMaterial {
|
|
|
908
905
|
Object.assign(parent.material, {
|
|
909
906
|
buffer: fboBack.texture,
|
|
910
907
|
thickness: backsideThickness,
|
|
911
|
-
side: BackSide,
|
|
908
|
+
side: THREE.BackSide,
|
|
912
909
|
envMapIntensity: backsideEnvMapIntensity,
|
|
913
910
|
});
|
|
914
911
|
}
|