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.
Files changed (108) hide show
  1. package/abstractions/lib/billboard.d.ts +6 -6
  2. package/abstractions/lib/catmull-rom-line.d.ts +157 -547
  3. package/abstractions/lib/cubic-bezier-line.d.ts +7 -7
  4. package/abstractions/lib/edges.d.ts +155 -731
  5. package/abstractions/lib/gradient-texture.d.ts +8 -8
  6. package/abstractions/lib/grid.d.ts +24 -292
  7. package/abstractions/lib/helper.d.ts +5 -5
  8. package/abstractions/lib/line.d.ts +11 -12
  9. package/abstractions/lib/prism-geometry.d.ts +12 -12
  10. package/abstractions/lib/quadratic-bezier-line.d.ts +7 -7
  11. package/abstractions/lib/rounded-box.d.ts +8 -8
  12. package/abstractions/lib/text-3d.d.ts +14 -293
  13. package/abstractions/lib/text.d.ts +13 -13
  14. package/cameras/lib/camera-content.d.ts +2 -2
  15. package/cameras/lib/cube-camera.d.ts +12 -12
  16. package/cameras/lib/orthographic-camera.d.ts +11 -11
  17. package/cameras/lib/perspective-camera.d.ts +10 -10
  18. package/controls/lib/camera-controls.d.ts +1 -6
  19. package/controls/lib/orbit-controls.d.ts +6 -10
  20. package/controls/lib/scroll-controls.d.ts +8 -14
  21. package/fesm2022/angular-three-soba-abstractions.mjs +80 -57
  22. package/fesm2022/angular-three-soba-abstractions.mjs.map +1 -1
  23. package/fesm2022/angular-three-soba-cameras.mjs +18 -20
  24. package/fesm2022/angular-three-soba-cameras.mjs.map +1 -1
  25. package/fesm2022/angular-three-soba-controls.mjs +65 -65
  26. package/fesm2022/angular-three-soba-controls.mjs.map +1 -1
  27. package/fesm2022/angular-three-soba-gizmos.mjs +186 -194
  28. package/fesm2022/angular-three-soba-gizmos.mjs.map +1 -1
  29. package/fesm2022/angular-three-soba-loaders.mjs +21 -16
  30. package/fesm2022/angular-three-soba-loaders.mjs.map +1 -1
  31. package/fesm2022/angular-three-soba-materials.mjs +90 -93
  32. package/fesm2022/angular-three-soba-materials.mjs.map +1 -1
  33. package/fesm2022/angular-three-soba-misc.mjs +283 -280
  34. package/fesm2022/angular-three-soba-misc.mjs.map +1 -1
  35. package/fesm2022/angular-three-soba-performances.mjs +51 -56
  36. package/fesm2022/angular-three-soba-performances.mjs.map +1 -1
  37. package/fesm2022/angular-three-soba-shaders.mjs +5 -6
  38. package/fesm2022/angular-three-soba-shaders.mjs.map +1 -1
  39. package/fesm2022/angular-three-soba-staging.mjs +253 -277
  40. package/fesm2022/angular-three-soba-staging.mjs.map +1 -1
  41. package/fesm2022/angular-three-soba-stats.mjs +3 -4
  42. package/fesm2022/angular-three-soba-stats.mjs.map +1 -1
  43. package/gizmos/lib/gizmo-helper/gizmo-helper.d.ts +12 -15
  44. package/gizmos/lib/gizmo-helper/gizmo-viewcube.d.ts +5 -6
  45. package/gizmos/lib/gizmo-helper/gizmo-viewport.d.ts +8 -9
  46. package/gizmos/lib/pivot-controls/axis-arrow.d.ts +12 -14
  47. package/gizmos/lib/pivot-controls/axis-rotator.d.ts +12 -13
  48. package/gizmos/lib/pivot-controls/pivot-controls.d.ts +28 -29
  49. package/gizmos/lib/pivot-controls/plane-slider.d.ts +13 -14
  50. package/gizmos/lib/pivot-controls/scaling-sphere.d.ts +13 -15
  51. package/gizmos/lib/transform-controls.d.ts +15 -20
  52. package/loaders/lib/loader.d.ts +10 -11
  53. package/loaders/lib/texture-loader.d.ts +3 -3
  54. package/materials/lib/custom-shader-material.d.ts +3 -3
  55. package/materials/lib/mesh-distort-material.d.ts +3 -3
  56. package/materials/lib/mesh-portal-material.d.ts +19 -118
  57. package/materials/lib/mesh-reflector-material.d.ts +4 -5
  58. package/materials/lib/mesh-refraction-material.d.ts +13 -14
  59. package/materials/lib/mesh-transmission-material.d.ts +14 -14
  60. package/materials/lib/mesh-wobble-material.d.ts +4 -4
  61. package/materials/lib/point-material.d.ts +3 -3
  62. package/misc/lib/animations.d.ts +12 -12
  63. package/misc/lib/computed-attribute.d.ts +5 -48
  64. package/misc/lib/decal.d.ts +9 -9
  65. package/misc/lib/deprecated.d.ts +2 -2
  66. package/misc/lib/depth-buffer.d.ts +2 -2
  67. package/misc/lib/fbo.d.ts +9 -9
  68. package/misc/lib/html/html-content.d.ts +5 -7
  69. package/misc/lib/html/html.d.ts +15 -14
  70. package/misc/lib/html/utils.d.ts +9 -9
  71. package/misc/lib/intersect.d.ts +2 -2
  72. package/misc/lib/preload.d.ts +3 -6
  73. package/misc/lib/sampler.d.ts +22 -21
  74. package/misc/lib/scale-factor.d.ts +2 -2
  75. package/package.json +141 -141
  76. package/performances/lib/detailed.d.ts +5 -5
  77. package/performances/lib/instances/instances.d.ts +8 -96
  78. package/performances/lib/instances/position-mesh.d.ts +8 -8
  79. package/performances/lib/points/points.d.ts +10 -188
  80. package/performances/lib/points/position-point.d.ts +8 -8
  81. package/performances/lib/segments/segment-object.d.ts +6 -6
  82. package/performances/lib/segments/segments.d.ts +47 -48
  83. package/shaders/lib/grid-material.d.ts +16 -16
  84. package/shaders/lib/point-material.d.ts +5 -5
  85. package/staging/lib/accumulative-shadows.d.ts +22 -26
  86. package/staging/lib/backdrop.d.ts +8 -8
  87. package/staging/lib/bb-anchor.d.ts +5 -5
  88. package/staging/lib/bounds.d.ts +13 -17
  89. package/staging/lib/camera-shake.d.ts +0 -2
  90. package/staging/lib/caustics.d.ts +11 -11
  91. package/staging/lib/center.d.ts +10 -350
  92. package/staging/lib/contact-shadows.d.ts +17 -16
  93. package/staging/lib/environment/environment.d.ts +13 -15
  94. package/staging/lib/environment/inject-environment.d.ts +3 -3
  95. package/staging/lib/float.d.ts +5 -5
  96. package/staging/lib/lightformer.d.ts +11 -290
  97. package/staging/lib/mask.d.ts +8 -10
  98. package/staging/lib/matcap-texture.d.ts +5 -5
  99. package/staging/lib/normal-texture.d.ts +5 -5
  100. package/staging/lib/randomized-lights.d.ts +13 -13
  101. package/staging/lib/render-texture.d.ts +21 -17
  102. package/staging/lib/sky.d.ts +13 -13
  103. package/staging/lib/spot-light.d.ts +39 -39
  104. package/staging/lib/stage.d.ts +107 -277
  105. package/vanilla-exports/index.d.ts +6 -7
  106. package/LICENSE +0 -21
  107. package/metadata.json +0 -1
  108. 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, ChangeDetectorRef, input, viewChild, untracked, Component, ChangeDetectionStrategy } from '@angular/core';
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 { DefaultLoadingManager, TextureLoader, Texture } from 'three';
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.get('gl');
261
+ const gl = store.snapshot.gl;
257
262
  if ('initTexture' in gl) {
258
263
  const array = Array.isArray(textures)
259
264
  ? textures
260
- : textures instanceof Texture
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, getLocalState, extend, applyProps } from 'angular-three';
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 { ShaderMaterial, Mesh, Plane, Vector3, Matrix4, Vector4, PerspectiveCamera, LinearFilter, HalfFloatType, WebGLRenderTarget, DepthTexture, DepthFormat, UnsignedShortType, FrontSide, NoToneMapping, BackSide } from 'three';
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
- portalScene().matrixAutoUpdate = false;
160
+ renderTextureStore.scene().matrixAutoUpdate = false;
163
161
  });
164
162
  effect(() => {
165
- const [events, setEvents] = [this.events(), portalSetEvents()];
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 localState = getLocalState(material);
176
- if (!localState)
173
+ const instanceState = getInstanceState(material);
174
+ if (!instanceState)
177
175
  return;
178
- const parent = localState.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
- portalScene(),
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.updateWorldMatrix(true, false);
193
- scene.matrixWorld.copy(parent.matrixWorld);
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, ['blur', 'resolution', 'worldUnits', 'eventPriority', 'renderPriority', 'events']);
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.size = this.store.select('size');
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().width * this.viewport().dpr,
257
- this.size().height * this.viewport().dpr,
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 = computed(() => {
264
+ this.renderTextureCompute = (...args) => {
264
265
  const [parent, material] = [this.parent(), this.materialRef().nativeElement];
265
- const computeFn = (event, state) => {
266
- if (!parent)
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
- return;
280
- };
281
- return computeFn;
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 localState = getLocalState(material);
288
- if (!localState)
286
+ const instanceState = getInstanceState(material);
287
+ if (!instanceState)
289
288
  return;
290
- const materialParent = localState.parent();
291
- if (!materialParent || !(materialParent instanceof Mesh))
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 *ngTemplateOutlet="content(); injector: injector" />
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 *ngTemplateOutlet="content(); injector: injector" />
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 localState = getLocalState(material);
554
- if (!localState)
551
+ const instanceState = getInstanceState(material);
552
+ if (!instanceState)
555
553
  return;
556
- const parent = Reflect.get(material, 'parent') ?? untracked(localState.parent);
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 localState = getLocalState(material);
585
- if (!localState)
582
+ const instanceState = getInstanceState(material);
583
+ if (!instanceState)
586
584
  return;
587
- const parent = Reflect.get(material, 'parent') ?? untracked(localState.parent);
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.size = this.store.select('size');
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 = isCubeTexture(envMap);
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 localState = getLocalState(material);
732
- if (!localState)
725
+ const instanceState = getInstanceState(material);
726
+ if (!instanceState)
733
727
  return;
734
- const parent = untracked(localState.parent);
728
+ const parent = untracked(instanceState.parent);
735
729
  const geometry = parent.geometry;
736
730
  if (geometry) {
737
- material.bvh = new MeshBVHUniformStruct();
738
- material.bvh.updateFrom(new MeshBVH(geometry.clone().toNonIndexed(), { strategy: SAH }));
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.viewMatrixInverse = camera.matrixWorld;
745
- material.projectionMatrixInverse = camera.projectionMatrixInverse;
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 = getLocalState(material)?.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
  }