angular-three 1.9.16 → 1.10.1

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 (72) hide show
  1. package/esm2022/lib/canvas.mjs +243 -0
  2. package/esm2022/lib/directives/args.mjs +36 -0
  3. package/esm2022/lib/directives/common.mjs +32 -0
  4. package/esm2022/lib/directives/parent.mjs +36 -0
  5. package/esm2022/lib/directives/repeat.mjs +18 -0
  6. package/esm2022/lib/loader.mjs +55 -0
  7. package/esm2022/lib/pipes/push.mjs +50 -0
  8. package/esm2022/lib/portal.mjs +240 -0
  9. package/esm2022/lib/renderer/renderer.mjs +361 -0
  10. package/esm2022/lib/routed-scene.mjs +29 -0
  11. package/esm2022/lib/stores/rx-store.mjs +108 -0
  12. package/esm2022/lib/stores/store.mjs +404 -0
  13. package/esm2022/lib/types.mjs +2 -0
  14. package/esm2022/lib/utils/apply-props.mjs +107 -0
  15. package/esm2022/lib/utils/is.mjs +51 -0
  16. package/{fesm2020 → fesm2022}/angular-three.mjs +78 -61
  17. package/fesm2022/angular-three.mjs.map +1 -0
  18. package/lib/canvas.d.ts +1 -1
  19. package/lib/directives/args.d.ts +1 -1
  20. package/lib/directives/parent.d.ts +1 -1
  21. package/lib/directives/repeat.d.ts +1 -1
  22. package/lib/loader.d.ts +3 -11
  23. package/lib/portal.d.ts +2 -2
  24. package/lib/types.d.ts +91 -120
  25. package/lib/utils/is.d.ts +6 -1
  26. package/metadata.json +1 -0
  27. package/package.json +13 -17
  28. package/plugin/package.json +1 -4
  29. package/plugin/src/generators/init/compat.js +1 -1
  30. package/plugin/src/generators/init/compat.js.map +1 -1
  31. package/plugin/src/generators/init/init.d.ts +3 -3
  32. package/plugin/src/generators/init/init.js +23 -3
  33. package/plugin/src/generators/init/init.js.map +1 -1
  34. package/web-types.json +1 -0
  35. package/esm2020/lib/canvas.mjs +0 -242
  36. package/esm2020/lib/directives/args.mjs +0 -35
  37. package/esm2020/lib/directives/common.mjs +0 -31
  38. package/esm2020/lib/directives/parent.mjs +0 -35
  39. package/esm2020/lib/directives/repeat.mjs +0 -17
  40. package/esm2020/lib/loader.mjs +0 -56
  41. package/esm2020/lib/pipes/push.mjs +0 -49
  42. package/esm2020/lib/portal.mjs +0 -237
  43. package/esm2020/lib/renderer/renderer.mjs +0 -360
  44. package/esm2020/lib/routed-scene.mjs +0 -28
  45. package/esm2020/lib/stores/rx-store.mjs +0 -107
  46. package/esm2020/lib/stores/store.mjs +0 -402
  47. package/esm2020/lib/types.mjs +0 -2
  48. package/esm2020/lib/utils/apply-props.mjs +0 -91
  49. package/esm2020/lib/utils/is.mjs +0 -50
  50. package/fesm2015/angular-three.mjs +0 -3051
  51. package/fesm2015/angular-three.mjs.map +0 -1
  52. package/fesm2020/angular-three.mjs.map +0 -1
  53. /package/{esm2020 → esm2022}/angular-three.mjs +0 -0
  54. /package/{esm2020 → esm2022}/index.mjs +0 -0
  55. /package/{esm2020 → esm2022}/lib/di/before-render.mjs +0 -0
  56. /package/{esm2020 → esm2022}/lib/di/catalogue.mjs +0 -0
  57. /package/{esm2020 → esm2022}/lib/di/destroy.mjs +0 -0
  58. /package/{esm2020 → esm2022}/lib/di/ref.mjs +0 -0
  59. /package/{esm2020 → esm2022}/lib/di/run-in-context.mjs +0 -0
  60. /package/{esm2020 → esm2022}/lib/events.mjs +0 -0
  61. /package/{esm2020 → esm2022}/lib/loop.mjs +0 -0
  62. /package/{esm2020 → esm2022}/lib/renderer/di.mjs +0 -0
  63. /package/{esm2020 → esm2022}/lib/renderer/enums.mjs +0 -0
  64. /package/{esm2020 → esm2022}/lib/renderer/provider.mjs +0 -0
  65. /package/{esm2020 → esm2022}/lib/renderer/store.mjs +0 -0
  66. /package/{esm2020 → esm2022}/lib/renderer/utils.mjs +0 -0
  67. /package/{esm2020 → esm2022}/lib/utils/attach.mjs +0 -0
  68. /package/{esm2020 → esm2022}/lib/utils/instance.mjs +0 -0
  69. /package/{esm2020 → esm2022}/lib/utils/make.mjs +0 -0
  70. /package/{esm2020 → esm2022}/lib/utils/safe-detect-changes.mjs +0 -0
  71. /package/{esm2020 → esm2022}/lib/utils/update.mjs +0 -0
  72. /package/{esm2020 → esm2022}/lib/web/events.mjs +0 -0
@@ -0,0 +1,107 @@
1
+ import * as THREE from 'three';
2
+ import { getLocalState, invalidateInstance } from './instance';
3
+ import { is } from './is';
4
+ import { checkUpdate } from './update';
5
+ function diffProps(instance, props) {
6
+ const propsEntries = Object.entries(props);
7
+ const changes = [];
8
+ for (const [propKey, propValue] of propsEntries) {
9
+ if (is.equ(propValue, instance[propKey]))
10
+ continue;
11
+ changes.push([propKey, propValue]);
12
+ }
13
+ return changes;
14
+ }
15
+ export function applyProps(instance, props) {
16
+ // if props is empty
17
+ if (!Object.keys(props).length)
18
+ return instance;
19
+ // filter equals, events , and reserved props
20
+ const localState = getLocalState(instance);
21
+ const rootState = localState.store?.get();
22
+ const changes = diffProps(instance, props);
23
+ for (let i = 0; i < changes.length; i++) {
24
+ let key = changes[i][0];
25
+ const currentInstance = instance;
26
+ const targetProp = currentInstance[key];
27
+ let value = changes[i][1];
28
+ if (is.colorSpaceExist(currentInstance)) {
29
+ const sRGBEncoding = 3001;
30
+ const SRGBColorSpace = 'srgb';
31
+ const LinearSRGBColorSpace = 'srgb-linear';
32
+ if (key === 'encoding') {
33
+ key = 'colorSpace';
34
+ value = value === sRGBEncoding ? SRGBColorSpace : LinearSRGBColorSpace;
35
+ }
36
+ else if (key === 'outputEncoding') {
37
+ key = 'outputColorSpace';
38
+ value = value === sRGBEncoding ? SRGBColorSpace : LinearSRGBColorSpace;
39
+ }
40
+ }
41
+ // special treatmen for objects with support for set/copy, and layers
42
+ if (targetProp && targetProp['set'] && (targetProp['copy'] || targetProp instanceof THREE.Layers)) {
43
+ const isColor = targetProp instanceof THREE.Color;
44
+ // if value is an array
45
+ if (Array.isArray(value)) {
46
+ if (targetProp['fromArray'])
47
+ targetProp['fromArray'](value);
48
+ else
49
+ targetProp['set'](...value);
50
+ }
51
+ // test again target.copy
52
+ else if (targetProp['copy'] &&
53
+ value &&
54
+ value.constructor &&
55
+ targetProp.constructor.name === value.constructor.name) {
56
+ targetProp['copy'](value);
57
+ if (!THREE.ColorManagement && !rootState.linear && isColor)
58
+ targetProp['convertSRGBToLinear']();
59
+ }
60
+ // if nothing else fits, just set the single value, ignore undefined
61
+ else if (value !== undefined) {
62
+ const isColor = targetProp instanceof THREE.Color;
63
+ // allow setting array scalars
64
+ if (!isColor && targetProp['setScalar'])
65
+ targetProp['setScalar'](value);
66
+ // layers have no copy function, copy the mask
67
+ else if (targetProp instanceof THREE.Layers && value instanceof THREE.Layers)
68
+ targetProp.mask = value.mask;
69
+ // otherwise just set ...
70
+ else
71
+ targetProp['set'](value);
72
+ // auto-convert srgb
73
+ if (!THREE.ColorManagement && !rootState?.linear && isColor)
74
+ targetProp.convertSRGBToLinear();
75
+ }
76
+ }
77
+ // else just overwrite the value
78
+ else {
79
+ currentInstance[key] = value;
80
+ // auto-convert srgb textures
81
+ if (currentInstance[key] instanceof THREE.Texture &&
82
+ currentInstance[key].format === THREE.RGBAFormat &&
83
+ currentInstance[key].type === THREE.UnsignedByteType) {
84
+ const texture = currentInstance[key];
85
+ if (is.colorSpaceExist(texture) && is.colorSpaceExist(rootState.gl))
86
+ texture.colorSpace = rootState.gl.outputColorSpace;
87
+ else
88
+ texture.encoding = rootState.gl.outputEncoding;
89
+ }
90
+ }
91
+ checkUpdate(targetProp);
92
+ invalidateInstance(instance);
93
+ }
94
+ const instanceHandlers = localState.eventCount;
95
+ if (localState.parent && rootState.internal && instance['raycast'] && instanceHandlers !== localState.eventCount) {
96
+ // pre-emptively remove the interaction from manager
97
+ rootState.removeInteraction(instance['uuid']);
98
+ // add the instance to the interaction manager only when it has handlers
99
+ if (localState.eventCount)
100
+ rootState.addInteraction(instance);
101
+ }
102
+ if (localState.parent && localState.afterUpdate && localState.afterUpdate.observed && changes.length) {
103
+ localState.afterUpdate.emit(instance);
104
+ }
105
+ return instance;
106
+ }
107
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbHktcHJvcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUvc3JjL2xpYi91dGlscy9hcHBseS1wcm9wcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUUvQixPQUFPLEVBQUUsYUFBYSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUV2QyxTQUFTLFNBQVMsQ0FBQyxRQUFzQixFQUFFLEtBQW1CO0lBQzFELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0MsTUFBTSxPQUFPLEdBQW9DLEVBQUUsQ0FBQztJQUVwRCxLQUFLLE1BQU0sQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLElBQUksWUFBWSxFQUFFO1FBQzdDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQUUsU0FBUztRQUNuRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7S0FDdEM7SUFFRCxPQUFPLE9BQU8sQ0FBQztBQUNuQixDQUFDO0FBRUQsTUFBTSxVQUFVLFVBQVUsQ0FBQyxRQUF5QixFQUFFLEtBQW1CO0lBQ3JFLG9CQUFvQjtJQUNwQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFFaEQsNkNBQTZDO0lBQzdDLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMzQyxNQUFNLFNBQVMsR0FBRyxVQUFVLENB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QUssVUFBVSxDQUFDLFVBQVUsRUFBRTtRQUM5RyxvREFBb0Q7UUFDcEQsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzlDLHdFQUF3RTtRQUN4RSxJQUFJLFVBQVUsQ0FBQyxVQUFVO1lBQUUsU0FBUyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUNqRTtJQUVELElBQUksVUFBVSxDQUFDLE1BQU0sSUFBSSxVQUFVLENBQUMsV0FBVyxJQUFJLFVBQVUsQ0FBQyxXQUFXLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7UUFDbEcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7S0FDekM7SUFFRCxPQUFPLFFBQVEsQ0FBQztBQUNwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHR5cGUgeyBOZ3RBbnlSZWNvcmQsIE5ndEluc3RhbmNlTm9kZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGdldExvY2FsU3RhdGUsIGludmFsaWRhdGVJbnN0YW5jZSB9IGZyb20gJy4vaW5zdGFuY2UnO1xuaW1wb3J0IHsgaXMgfSBmcm9tICcuL2lzJztcbmltcG9ydCB7IGNoZWNrVXBkYXRlIH0gZnJvbSAnLi91cGRhdGUnO1xuXG5mdW5jdGlvbiBkaWZmUHJvcHMoaW5zdGFuY2U6IE5ndEFueVJlY29yZCwgcHJvcHM6IE5ndEFueVJlY29yZCkge1xuICAgIGNvbnN0IHByb3BzRW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHByb3BzKTtcbiAgICBjb25zdCBjaGFuZ2VzOiBba2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duXVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFtwcm9wS2V5LCBwcm9wVmFsdWVdIG9mIHByb3BzRW50cmllcykge1xuICAgICAgICBpZiAoaXMuZXF1KHByb3BWYWx1ZSwgaW5zdGFuY2VbcHJvcEtleV0pKSBjb250aW51ZTtcbiAgICAgICAgY2hhbmdlcy5wdXNoKFtwcm9wS2V5LCBwcm9wVmFsdWVdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2hhbmdlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UHJvcHMoaW5zdGFuY2U6IE5ndEluc3RhbmNlTm9kZSwgcHJvcHM6IE5ndEFueVJlY29yZCk6IE5ndEluc3RhbmNlTm9kZSB7XG4gICAgLy8gaWYgcHJvcHMgaXMgZW1wdHlcbiAgICBpZiAoIU9iamVjdC5rZXlzKHByb3BzKS5sZW5ndGgpIHJldHVybiBpbnN0YW5jZTtcblxuICAgIC8vIGZpbHRlciBlcXVhbHMsIGV2ZW50cyAsIGFuZCByZXNlcnZlZCBwcm9wc1xuICAgIGNvbnN0IGxvY2FsU3RhdGUgPSBnZXRMb2NhbFN0YXRlKGluc3RhbmNlKTtcbiAgICBjb25zdCByb290U3RhdGUgPSBsb2NhbFN0YXRlLnN0b3JlPy5nZXQoKTtcbiAgICBjb25zdCBjaGFuZ2VzID0gZGlmZlByb3BzKGluc3RhbmNlLCBwcm9wcyk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGtleSA9IGNoYW5nZXNbaV1bMF07XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgICBjb25zdCB0YXJnZXRQcm9wID0gY3VycmVudEluc3RhbmNlW2tleV0gYXMgTmd0QW55UmVjb3JkO1xuICAgICAgICBsZXQgdmFsdWUgPSBjaGFuZ2VzW2ldWzFdO1xuXG4gICAgICAgIGlmIChpcy5jb2xvclNwYWNlRXhpc3QoY3VycmVudEluc3RhbmNlKSkge1xuICAgICAgICAgICAgY29uc3Qgc1JHQkVuY29kaW5nID0gMzAwMTtcbiAgICAgICAgICAgIGNvbnN0IFNSR0JDb2xvclNwYWNlID0gJ3NyZ2InO1xuICAgICAgICAgICAgY29uc3QgTGluZWFyU1JHQkNvbG9yU3BhY2UgPSAnc3JnYi1saW5lYXInO1xuXG4gICAgICAgICAgICBpZiAoa2V5ID09PSAnZW5jb2RpbmcnKSB7XG4gICAgICAgICAgICAgICAga2V5ID0gJ2NvbG9yU3BhY2UnO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgPT09IHNSR0JFbmNvZGluZyA/IFNSR0JDb2xvclNwYWNlIDogTGluZWFyU1JHQkNvbG9yU3BhY2U7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ291dHB1dEVuY29kaW5nJykge1xuICAgICAgICAgICAgICAgIGtleSA9ICdvdXRwdXRDb2xvclNwYWNlJztcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID09PSBzUkdCRW5jb2RpbmcgPyBTUkdCQ29sb3JTcGFjZSA6IExpbmVhclNSR0JDb2xvclNwYWNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gc3BlY2lhbCB0cmVhdG1lbiBmb3Igb2JqZWN0cyB3aXRoIHN1cHBvcnQgZm9yIHNldC9jb3B5LCBhbmQgbGF5ZXJzXG4gICAgICAgIGlmICh0YXJnZXRQcm9wICYmIHRhcmdldFByb3BbJ3NldCddICYmICh0YXJnZXRQcm9wWydjb3B5J10gfHwgdGFyZ2V0UHJvcCBpbnN0YW5jZW9mIFRIUkVFLkxheWVycykpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzQ29sb3IgPSB0YXJnZXRQcm9wIGluc3RhbmNlb2YgVEhSRUUuQ29sb3I7XG4gICAgICAgICAgICAvLyBpZiB2YWx1ZSBpcyBhbiBhcnJheVxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCh0YXJnZXRQcm9wIGFzIE5ndEFueVJlY29yZClbJ2Zyb21BcnJheSddKSAodGFyZ2V0UHJvcCBhcyBOZ3RBbnlSZWNvcmQpWydmcm9tQXJyYXknXSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgZWxzZSB0YXJnZXRQcm9wWydzZXQnXSguLi52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0ZXN0IGFnYWluIHRhcmdldC5jb3B5XG4gICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAodGFyZ2V0UHJvcCBhcyBOZ3RBbnlSZWNvcmQpWydjb3B5J10gJiZcbiAgICAgICAgICAgICAgICB2YWx1ZSAmJlxuICAgICAgICAgICAgICAgIHZhbHVlLmNvbnN0cnVjdG9yICYmXG4gICAgICAgICAgICAgICAgdGFyZ2V0UHJvcC5jb25zdHJ1Y3Rvci5uYW1lID09PSB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAodGFyZ2V0UHJvcCBhcyBOZ3RBbnlSZWNvcmQpWydjb3B5J10odmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmICghVEhSRUUuQ29sb3JNYW5hZ2VtZW50ICYmICFyb290U3RhdGUubGluZWFyICYmIGlzQ29sb3IpIHRhcmdldFByb3BbJ2NvbnZlcnRTUkdCVG9MaW5lYXInXSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWYgbm90aGluZyBlbHNlIGZpdHMsIGp1c3Qgc2V0IHRoZSBzaW5nbGUgdmFsdWUsIGlnbm9yZSB1bmRlZmluZWRcbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc0NvbG9yID0gdGFyZ2V0UHJvcCBpbnN0YW5jZW9mIFRIUkVFLkNvbG9yO1xuICAgICAgICAgICAgICAgIC8vIGFsbG93IHNldHRpbmcgYXJyYXkgc2NhbGFyc1xuICAgICAgICAgICAgICAgIGlmICghaXNDb2xvciAmJiAodGFyZ2V0UHJvcCBhcyBOZ3RBbnlSZWNvcmQpWydzZXRTY2FsYXInXSlcbiAgICAgICAgICAgICAgICAgICAgKHRhcmdldFByb3AgYXMgTmd0QW55UmVjb3JkKVsnc2V0U2NhbGFyJ10odmFsdWUpO1xuICAgICAgICAgICAgICAgIC8vIGxheWVycyBoYXZlIG5vIGNvcHkgZnVuY3Rpb24sIGNvcHkgdGhlIG1hc2tcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0YXJnZXRQcm9wIGluc3RhbmNlb2YgVEhSRUUuTGF5ZXJzICYmIHZhbHVlIGluc3RhbmNlb2YgVEhSRUUuTGF5ZXJzKVxuICAgICAgICAgICAgICAgICAgICB0YXJnZXRQcm9wLm1hc2sgPSB2YWx1ZS5tYXNrO1xuICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBqdXN0IHNldCAuLi5cbiAgICAgICAgICAgICAgICBlbHNlIHRhcmdldFByb3BbJ3NldCddKHZhbHVlKTtcblxuICAgICAgICAgICAgICAgIC8vIGF1dG8tY29udmVydCBzcmdiXG4gICAgICAgICAgICAgICAgaWYgKCFUSFJFRS5Db2xvck1hbmFnZW1lbnQgJiYgIXJvb3RTdGF0ZT8ubGluZWFyICYmIGlzQ29sb3IpIHRhcmdldFByb3AuY29udmVydFNSR0JUb0xpbmVhcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGVsc2UganVzdCBvdmVyd3JpdGUgdGhlIHZhbHVlXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY3VycmVudEluc3RhbmNlW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIC8vIGF1dG8tY29udmVydCBzcmdiIHRleHR1cmVzXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgY3VycmVudEluc3RhbmNlW2tleV0gaW5zdGFuY2VvZiBUSFJFRS5UZXh0dXJlICYmXG4gICAgICAgICAgICAgICAgY3VycmVudEluc3RhbmNlW2tleV0uZm9ybWF0ID09PSBUSFJFRS5SR0JBRm9ybWF0ICYmXG4gICAgICAgICAgICAgICAgY3VycmVudEluc3RhbmNlW2tleV0udHlwZSA9PT0gVEhSRUUuVW5zaWduZWRCeXRlVHlwZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dHVyZSA9IGN1cnJlbnRJbnN0YW5jZVtrZXldIGFzIFRIUkVFLlRleHR1cmU7XG4gICAgICAgICAgICAgICAgaWYgKGlzLmNvbG9yU3BhY2VFeGlzdCh0ZXh0dXJlKSAmJiBpcy5jb2xvclNwYWNlRXhpc3Qocm9vdFN0YXRlLmdsKSlcbiAgICAgICAgICAgICAgICAgICAgdGV4dHVyZS5jb2xvclNwYWNlID0gcm9vdFN0YXRlLmdsLm91dHB1dENvbG9yU3BhY2U7XG4gICAgICAgICAgICAgICAgZWxzZSB0ZXh0dXJlLmVuY29kaW5nID0gcm9vdFN0YXRlLmdsLm91dHB1dEVuY29kaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY2hlY2tVcGRhdGUodGFyZ2V0UHJvcCk7XG4gICAgICAgIGludmFsaWRhdGVJbnN0YW5jZShpbnN0YW5jZSk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5zdGFuY2VIYW5kbGVycyA9IGxvY2FsU3RhdGUuZXZlbnRDb3VudDtcblxuICAgIGlmIChsb2NhbFN0YXRlLnBhcmVudCAmJiByb290U3RhdGUuaW50ZXJuYWwgJiYgaW5zdGFuY2VbJ3JheWNhc3QnXSAmJiBpbnN0YW5jZUhhbmRsZXJzICE9PSBsb2NhbFN0YXRlLmV2ZW50Q291bnQpIHtcbiAgICAgICAgLy8gcHJlLWVtcHRpdmVseSByZW1vdmUgdGhlIGludGVyYWN0aW9uIGZyb20gbWFuYWdlclxuICAgICAgICByb290U3RhdGUucmVtb3ZlSW50ZXJhY3Rpb24oaW5zdGFuY2VbJ3V1aWQnXSk7XG4gICAgICAgIC8vIGFkZCB0aGUgaW5zdGFuY2UgdG8gdGhlIGludGVyYWN0aW9uIG1hbmFnZXIgb25seSB3aGVuIGl0IGhhcyBoYW5kbGVyc1xuICAgICAgICBpZiAobG9jYWxTdGF0ZS5ldmVudENvdW50KSByb290U3RhdGUuYWRkSW50ZXJhY3Rpb24oaW5zdGFuY2UpO1xuICAgIH1cblxuICAgIGlmIChsb2NhbFN0YXRlLnBhcmVudCAmJiBsb2NhbFN0YXRlLmFmdGVyVXBkYXRlICYmIGxvY2FsU3RhdGUuYWZ0ZXJVcGRhdGUub2JzZXJ2ZWQgJiYgY2hhbmdlcy5sZW5ndGgpIHtcbiAgICAgICAgbG9jYWxTdGF0ZS5hZnRlclVwZGF0ZS5lbWl0KGluc3RhbmNlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5zdGFuY2U7XG59XG4iXX0=
@@ -0,0 +1,51 @@
1
+ import { ElementRef } from '@angular/core';
2
+ import * as THREE from 'three';
3
+ export const is = {
4
+ obj: (a) => a === Object(a) && !Array.isArray(a) && typeof a !== 'function',
5
+ material: (a) => !!a && a.isMaterial,
6
+ geometry: (a) => !!a && a.isBufferGeometry,
7
+ orthographicCamera: (a) => !!a && a.isOrthographicCamera,
8
+ perspectiveCamera: (a) => !!a && a.isPerspectiveCamera,
9
+ camera: (a) => !!a && a.isCamera,
10
+ renderer: (a) => !!a && a instanceof THREE.WebGLRenderer,
11
+ scene: (a) => !!a && a.isScene,
12
+ object3D: (a) => !!a && a.isObject3D,
13
+ instance: (a) => !!a && !!a['__ngt__'],
14
+ ref: (a) => a instanceof ElementRef,
15
+ colorSpaceExist: (object) => 'colorSpace' in object || 'outputColorSpace' in object,
16
+ equ(a, b, { arrays = 'shallow', objects = 'reference', strict = true } = {}) {
17
+ // Wrong type or one of the two undefined, doesn't match
18
+ if (typeof a !== typeof b || !!a !== !!b)
19
+ return false;
20
+ // Atomic, just compare a against b
21
+ if (typeof a === 'string' || typeof a === 'number')
22
+ return a === b;
23
+ const isObj = is.obj(a);
24
+ if (isObj && objects === 'reference')
25
+ return a === b;
26
+ const isArr = Array.isArray(a);
27
+ if (isArr && arrays === 'reference')
28
+ return a === b;
29
+ // Array or Object, shallow compare first to see if it's a match
30
+ if ((isArr || isObj) && a === b)
31
+ return true;
32
+ // Last resort, go through keys
33
+ let i;
34
+ for (i in a)
35
+ if (!(i in b))
36
+ return false;
37
+ for (i in strict ? b : a)
38
+ if (a[i] !== b[i])
39
+ return false;
40
+ if (i === void 0) {
41
+ if (isArr && a.length === 0 && b.length === 0)
42
+ return true;
43
+ if (isObj && Object.keys(a).length === 0 && Object.keys(b).length === 0)
44
+ return true;
45
+ if (a !== b)
46
+ return false;
47
+ }
48
+ return true;
49
+ },
50
+ };
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUvc3JjL2xpYi91dGlscy9pcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRy9CLE1BQU0sQ0FBQyxNQUFNLEVBQUUsR0FBRztJQUNkLEdBQUcsRUFBRSxDQUFDLENBQVUsRUFBZSxFQUFFLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLEtBQUssVUFBVTtJQUNqRyxRQUFRLEVBQUUsQ0FBQyxDQUFVLEVBQXVCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFLLENBQW9CLENBQUMsVUFBVTtJQUN0RixRQUFRLEVBQUUsQ0FBQyxDQUFVLEVBQTZCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFLLENBQTBCLENBQUMsZ0JBQWdCO0lBQ3hHLGtCQUFrQixFQUFFLENBQUMsQ0FBVSxFQUFpQyxFQUFFLENBQzlELENBQUMsQ0FBQyxDQUFDLElBQUssQ0FBOEIsQ0FBQyxvQkFBb0I7SUFDL0QsaUJBQWlCLEVBQUUsQ0FBQyxDQUFVLEVBQWdDLEVBQUUsQ0FDNUQsQ0FBQyxDQUFDLENBQUMsSUFBSyxDQUE2QixDQUFDLG1CQUFtQjtJQUM3RCxNQUFNLEVBQUUsQ0FBQyxDQUFVLEVBQXFCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFLLENBQWtCLENBQUMsUUFBUTtJQUM5RSxRQUFRLEVBQUUsQ0FBQyxDQUFVLEVBQTRCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxLQUFLLENBQUMsYUFBYTtJQUMzRixLQUFLLEVBQUUsQ0FBQyxDQUFVLEVBQW9CLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFLLENBQWlCLENBQUMsT0FBTztJQUMxRSxRQUFRLEVBQUUsQ0FBQyxDQUFVLEVBQXVCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFLLENBQW9CLENBQUMsVUFBVTtJQUN0RixRQUFRLEVBQUUsQ0FBQyxDQUFVLEVBQXdCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBRSxDQUFrQixDQUFDLFNBQVMsQ0FBQztJQUN2RixHQUFHLEVBQUUsQ0FBQyxDQUFVLEVBQW1CLEVBQUUsQ0FBQyxDQUFDLFlBQVksVUFBVTtJQUM3RCxlQUFlLEVBQUUsQ0FJYixNQUFTLEVBQ00sRUFBRSxDQUFDLFlBQVksSUFBSSxNQUFNLElBQUksa0JBQWtCLElBQUksTUFBTTtJQUM1RSxHQUFHLENBQUMsQ0FBTSxFQUFFLENBQU0sRUFBRSxFQUFFLE1BQU0sR0FBRyxTQUFTLEVBQUUsT0FBTyxHQUFHLFdBQVcsRUFBRSxNQUFNLEdBQUcsSUFBSSxLQUFtQixFQUFFO1FBQy9GLHdEQUF3RDtRQUN4RCxJQUFJLE9BQU8sQ0FBQyxLQUFLLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUN2RCxtQ0FBbUM7UUFDbkMsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUTtZQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuRSxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxXQUFXO1lBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsSUFBSSxLQUFLLElBQUksTUFBTSxLQUFLLFdBQVc7WUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEQsZ0VBQWdFO1FBQ2hFLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUM3QywrQkFBK0I7UUFDL0IsSUFBSSxDQUFDLENBQUM7UUFDTixLQUFLLENBQUMsSUFBSSxDQUFDO1lBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFBRSxPQUFPLEtBQUssQ0FBQztRQUN6QyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQUUsT0FBTyxLQUFLLENBQUM7UUFDMUQsSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLEVBQUU7WUFDZCxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDM0QsSUFBSSxLQUFLLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDckYsSUFBSSxDQUFDLEtBQUssQ0FBQztnQkFBRSxPQUFPLEtBQUssQ0FBQztTQUM3QjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Q0FDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHR5cGUgeyBOZ3RBbnlSZWNvcmQsIE5ndEVxdUNvbmZpZywgTmd0R0xSZW5kZXJlciwgTmd0SW5zdGFuY2VOb2RlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgaXMgPSB7XG4gICAgb2JqOiAoYTogdW5rbm93bik6IGEgaXMgb2JqZWN0ID0+IGEgPT09IE9iamVjdChhKSAmJiAhQXJyYXkuaXNBcnJheShhKSAmJiB0eXBlb2YgYSAhPT0gJ2Z1bmN0aW9uJyxcbiAgICBtYXRlcmlhbDogKGE6IHVua25vd24pOiBhIGlzIFRIUkVFLk1hdGVyaWFsID0+ICEhYSAmJiAoYSBhcyBUSFJFRS5NYXRlcmlhbCkuaXNNYXRlcmlhbCxcbiAgICBnZW9tZXRyeTogKGE6IHVua25vd24pOiBhIGlzIFRIUkVFLkJ1ZmZlckdlb21ldHJ5ID0+ICEhYSAmJiAoYSBhcyBUSFJFRS5CdWZmZXJHZW9tZXRyeSkuaXNCdWZmZXJHZW9tZXRyeSxcbiAgICBvcnRob2dyYXBoaWNDYW1lcmE6IChhOiB1bmtub3duKTogYSBpcyBUSFJFRS5PcnRob2dyYXBoaWNDYW1lcmEgPT5cbiAgICAgICAgISFhICYmIChhIGFzIFRIUkVFLk9ydGhvZ3JhcGhpY0NhbWVyYSkuaXNPcnRob2dyYXBoaWNDYW1lcmEsXG4gICAgcGVyc3BlY3RpdmVDYW1lcmE6IChhOiB1bmtub3duKTogYSBpcyBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYSA9PlxuICAgICAgICAhIWEgJiYgKGEgYXMgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEpLmlzUGVyc3BlY3RpdmVDYW1lcmEsXG4gICAgY2FtZXJhOiAoYTogdW5rbm93bik6IGEgaXMgVEhSRUUuQ2FtZXJhID0+ICEhYSAmJiAoYSBhcyBUSFJFRS5DYW1lcmEpLmlzQ2FtZXJhLFxuICAgIHJlbmRlcmVyOiAoYTogdW5rbm93bik6IGEgaXMgVEhSRUUuV2ViR0xSZW5kZXJlciA9PiAhIWEgJiYgYSBpbnN0YW5jZW9mIFRIUkVFLldlYkdMUmVuZGVyZXIsXG4gICAgc2NlbmU6IChhOiB1bmtub3duKTogYSBpcyBUSFJFRS5TY2VuZSA9PiAhIWEgJiYgKGEgYXMgVEhSRUUuU2NlbmUpLmlzU2NlbmUsXG4gICAgb2JqZWN0M0Q6IChhOiB1bmtub3duKTogYSBpcyBUSFJFRS5PYmplY3QzRCA9PiAhIWEgJiYgKGEgYXMgVEhSRUUuT2JqZWN0M0QpLmlzT2JqZWN0M0QsXG4gICAgaW5zdGFuY2U6IChhOiB1bmtub3duKTogYSBpcyBOZ3RJbnN0YW5jZU5vZGUgPT4gISFhICYmICEhKGEgYXMgTmd0QW55UmVjb3JkKVsnX19uZ3RfXyddLFxuICAgIHJlZjogKGE6IHVua25vd24pOiBhIGlzIEVsZW1lbnRSZWYgPT4gYSBpbnN0YW5jZW9mIEVsZW1lbnRSZWYsXG4gICAgY29sb3JTcGFjZUV4aXN0OiA8XG4gICAgICAgIFQgZXh0ZW5kcyBOZ3RHTFJlbmRlcmVyIHwgVEhSRUUuVGV4dHVyZSB8IG9iamVjdCxcbiAgICAgICAgUCA9IFQgZXh0ZW5kcyBOZ3RHTFJlbmRlcmVyID8geyBvdXRwdXRDb2xvclNwYWNlOiBzdHJpbmcgfSA6IHsgY29sb3JTcGFjZTogc3RyaW5nIH1cbiAgICA+KFxuICAgICAgICBvYmplY3Q6IFRcbiAgICApOiBvYmplY3QgaXMgVCAmIFAgPT4gJ2NvbG9yU3BhY2UnIGluIG9iamVjdCB8fCAnb3V0cHV0Q29sb3JTcGFjZScgaW4gb2JqZWN0LFxuICAgIGVxdShhOiBhbnksIGI6IGFueSwgeyBhcnJheXMgPSAnc2hhbGxvdycsIG9iamVjdHMgPSAncmVmZXJlbmNlJywgc3RyaWN0ID0gdHJ1ZSB9OiBOZ3RFcXVDb25maWcgPSB7fSkge1xuICAgICAgICAvLyBXcm9uZyB0eXBlIG9yIG9uZSBvZiB0aGUgdHdvIHVuZGVmaW5lZCwgZG9lc24ndCBtYXRjaFxuICAgICAgICBpZiAodHlwZW9mIGEgIT09IHR5cGVvZiBiIHx8ICEhYSAhPT0gISFiKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIC8vIEF0b21pYywganVzdCBjb21wYXJlIGEgYWdhaW5zdCBiXG4gICAgICAgIGlmICh0eXBlb2YgYSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGEgPT09ICdudW1iZXInKSByZXR1cm4gYSA9PT0gYjtcbiAgICAgICAgY29uc3QgaXNPYmogPSBpcy5vYmooYSk7XG4gICAgICAgIGlmIChpc09iaiAmJiBvYmplY3RzID09PSAncmVmZXJlbmNlJykgcmV0dXJuIGEgPT09IGI7XG4gICAgICAgIGNvbnN0IGlzQXJyID0gQXJyYXkuaXNBcnJheShhKTtcbiAgICAgICAgaWYgKGlzQXJyICYmIGFycmF5cyA9PT0gJ3JlZmVyZW5jZScpIHJldHVybiBhID09PSBiO1xuICAgICAgICAvLyBBcnJheSBvciBPYmplY3QsIHNoYWxsb3cgY29tcGFyZSBmaXJzdCB0byBzZWUgaWYgaXQncyBhIG1hdGNoXG4gICAgICAgIGlmICgoaXNBcnIgfHwgaXNPYmopICYmIGEgPT09IGIpIHJldHVybiB0cnVlO1xuICAgICAgICAvLyBMYXN0IHJlc29ydCwgZ28gdGhyb3VnaCBrZXlzXG4gICAgICAgIGxldCBpO1xuICAgICAgICBmb3IgKGkgaW4gYSkgaWYgKCEoaSBpbiBiKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGkgaW4gc3RyaWN0ID8gYiA6IGEpIGlmIChhW2ldICE9PSBiW2ldKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChpID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGlmIChpc0FyciAmJiBhLmxlbmd0aCA9PT0gMCAmJiBiLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBpZiAoaXNPYmogJiYgT2JqZWN0LmtleXMoYSkubGVuZ3RoID09PSAwICYmIE9iamVjdC5rZXlzKGIpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBpZiAoYSAhPT0gYikgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG59O1xuIl19
@@ -85,8 +85,8 @@ function load(loaderConstructorFactory, input, extensions, onProgress) {
85
85
  urls.map((url) => {
86
86
  if (!cached.has(url)) {
87
87
  cached.set(url, from(loader.loadAsync(url, onProgress)).pipe(tap((data) => {
88
- if (data.scene)
89
- Object.assign(data, makeObjectGraph(data.scene));
88
+ if (data['scene'])
89
+ Object.assign(data, makeObjectGraph(data['scene']));
90
90
  }), retry(2), catchError((err) => {
91
91
  console.error(`[NGT] Error loading ${url}: ${err.message}`);
92
92
  return of([]);
@@ -98,7 +98,7 @@ function load(loaderConstructorFactory, input, extensions, onProgress) {
98
98
  ];
99
99
  }));
100
100
  }
101
- function injectLoader(loaderConstructorFactory, input, extensions, onProgress) {
101
+ function injectNgtLoader(loaderConstructorFactory, input, extensions, onProgress) {
102
102
  const cdr = inject(ChangeDetectorRef);
103
103
  return load(loaderConstructorFactory, input, extensions, onProgress).pipe(switchMap(([observables$, inputs]) => {
104
104
  return forkJoin(observables$).pipe(map((results) => {
@@ -116,13 +116,12 @@ function injectLoader(loaderConstructorFactory, input, extensions, onProgress) {
116
116
  }));
117
117
  }));
118
118
  }
119
- injectLoader.destroy = () => {
119
+ injectNgtLoader['destroy'] = () => {
120
120
  cached.clear();
121
121
  };
122
- injectLoader.preLoad = (loaderConstructorFactory, inputs, extensions) => {
122
+ injectNgtLoader['preLoad'] = (loaderConstructorFactory, inputs, extensions) => {
123
123
  load(loaderConstructorFactory, inputs, extensions).pipe(take(1)).subscribe();
124
124
  };
125
- const injectNgtLoader = injectLoader;
126
125
 
127
126
  function createSubs(callback, subs) {
128
127
  const sub = { callback };
@@ -273,6 +272,7 @@ const is = {
273
272
  object3D: (a) => !!a && a.isObject3D,
274
273
  instance: (a) => !!a && !!a['__ngt__'],
275
274
  ref: (a) => a instanceof ElementRef,
275
+ colorSpaceExist: (object) => 'colorSpace' in object || 'outputColorSpace' in object,
276
276
  equ(a, b, { arrays = 'shallow', objects = 'reference', strict = true } = {}) {
277
277
  // Wrong type or one of the two undefined, doesn't match
278
278
  if (typeof a !== typeof b || !!a !== !!b)
@@ -418,10 +418,23 @@ function applyProps(instance, props) {
418
418
  const rootState = localState.store?.get();
419
419
  const changes = diffProps(instance, props);
420
420
  for (let i = 0; i < changes.length; i++) {
421
- const key = changes[i][0];
421
+ let key = changes[i][0];
422
422
  const currentInstance = instance;
423
423
  const targetProp = currentInstance[key];
424
- const value = changes[i][1];
424
+ let value = changes[i][1];
425
+ if (is.colorSpaceExist(currentInstance)) {
426
+ const sRGBEncoding = 3001;
427
+ const SRGBColorSpace = 'srgb';
428
+ const LinearSRGBColorSpace = 'srgb-linear';
429
+ if (key === 'encoding') {
430
+ key = 'colorSpace';
431
+ value = value === sRGBEncoding ? SRGBColorSpace : LinearSRGBColorSpace;
432
+ }
433
+ else if (key === 'outputEncoding') {
434
+ key = 'outputColorSpace';
435
+ value = value === sRGBEncoding ? SRGBColorSpace : LinearSRGBColorSpace;
436
+ }
437
+ }
425
438
  // special treatmen for objects with support for set/copy, and layers
426
439
  if (targetProp && targetProp['set'] && (targetProp['copy'] || targetProp instanceof THREE.Layers)) {
427
440
  const isColor = targetProp instanceof THREE.Color;
@@ -462,11 +475,14 @@ function applyProps(instance, props) {
462
475
  else {
463
476
  currentInstance[key] = value;
464
477
  // auto-convert srgb textures
465
- if (!rootState?.linear &&
466
- currentInstance[key] instanceof THREE.Texture &&
478
+ if (currentInstance[key] instanceof THREE.Texture &&
467
479
  currentInstance[key].format === THREE.RGBAFormat &&
468
480
  currentInstance[key].type === THREE.UnsignedByteType) {
469
- currentInstance[key]['encoding'] = THREE.sRGBEncoding;
481
+ const texture = currentInstance[key];
482
+ if (is.colorSpaceExist(texture) && is.colorSpaceExist(rootState.gl))
483
+ texture.colorSpace = rootState.gl.outputColorSpace;
484
+ else
485
+ texture.encoding = rootState.gl.outputEncoding;
470
486
  }
471
487
  }
472
488
  checkUpdate(targetProp);
@@ -580,10 +596,10 @@ class NgtRxStore extends RxState {
580
596
  }
581
597
  this.hold($, () => void requestAnimationFrame(() => void safeDetectChanges(cdr)));
582
598
  }
599
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtRxStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
600
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtRxStore }); }
583
601
  }
584
- NgtRxStore.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: NgtRxStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
585
- NgtRxStore.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: NgtRxStore });
586
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: NgtRxStore, decorators: [{
602
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtRxStore, decorators: [{
587
603
  type: Injectable
588
604
  }], ctorParameters: function () { return []; } });
589
605
 
@@ -861,12 +877,13 @@ class NgtStore extends NgtRxStore {
861
877
  else if ('legacyMode' in ColorManagement)
862
878
  ColorManagement['legacyMode'] = legacy ?? true;
863
879
  }
864
- const outputEncoding = linear ? THREE.LinearEncoding : THREE.sRGBEncoding;
865
- const toneMapping = flat ? THREE.NoToneMapping : THREE.ACESFilmicToneMapping;
866
- if (gl.outputEncoding !== outputEncoding)
867
- gl.outputEncoding = outputEncoding;
868
- if (gl.toneMapping !== toneMapping)
869
- gl.toneMapping = toneMapping;
880
+ // set color space and tonemapping preferences
881
+ const LinearEncoding = 3000;
882
+ const sRGBEncoding = 3001;
883
+ applyProps(gl, {
884
+ outputEncoding: linear ? LinearEncoding : sRGBEncoding,
885
+ toneMapping: flat ? THREE.NoToneMapping : THREE.ACESFilmicToneMapping,
886
+ });
870
887
  // Update color management state
871
888
  if (state.legacy !== legacy)
872
889
  stateToUpdate.legacy = legacy;
@@ -953,10 +970,10 @@ class NgtStore extends NgtRxStore {
953
970
  invalidate() {
954
971
  this.hold(this.select(), () => invalidate(this));
955
972
  }
973
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtStore, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
974
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtStore }); }
956
975
  }
957
- NgtStore.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: NgtStore, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
958
- NgtStore.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: NgtStore });
959
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: NgtStore, decorators: [{
976
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtStore, decorators: [{
960
977
  type: Injectable
961
978
  }] });
962
979
  function computeInitialSize(canvas, defaultSize) {
@@ -1006,10 +1023,10 @@ class NgtCommonDirective {
1006
1023
  safeDetectChanges(this.view);
1007
1024
  }
1008
1025
  }
1026
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtCommonDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
1027
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.0", type: NgtCommonDirective, ngImport: i0 }); }
1009
1028
  }
1010
- NgtCommonDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: NgtCommonDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1011
- NgtCommonDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.6", type: NgtCommonDirective, ngImport: i0 });
1012
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: NgtCommonDirective, decorators: [{
1029
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtCommonDirective, decorators: [{
1013
1030
  type: Directive
1014
1031
  }], ctorParameters: function () { return []; } });
1015
1032
 
@@ -1035,10 +1052,10 @@ class NgtArgs extends NgtCommonDirective {
1035
1052
  validate() {
1036
1053
  return !this.injected && !!this.injectedArgs.length;
1037
1054
  }
1055
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtArgs, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
1056
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.0", type: NgtArgs, isStandalone: true, selector: "[args]", inputs: { args: "args" }, usesInheritance: true, ngImport: i0 }); }
1038
1057
  }
1039
- NgtArgs.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: NgtArgs, deps: null, target: i0.ɵɵFactoryTarget.Directive });
1040
- NgtArgs.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.6", type: NgtArgs, isStandalone: true, selector: "[args]", inputs: { args: "args" }, usesInheritance: true, ngImport: i0 });
1041
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: NgtArgs, decorators: [{
1058
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtArgs, decorators: [{
1042
1059
  type: Directive,
1043
1060
  args: [{ selector: '[args]', standalone: true }]
1044
1061
  }], propDecorators: { args: [{
@@ -1067,10 +1084,10 @@ class NgtParent extends NgtCommonDirective {
1067
1084
  validate() {
1068
1085
  return !this.injected && !!this.injectedParent;
1069
1086
  }
1087
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtParent, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
1088
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.0", type: NgtParent, isStandalone: true, selector: "[parent]", inputs: { parent: "parent" }, usesInheritance: true, ngImport: i0 }); }
1070
1089
  }
1071
- NgtParent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: NgtParent, deps: null, target: i0.ɵɵFactoryTarget.Directive });
1072
- NgtParent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.6", type: NgtParent, isStandalone: true, selector: "[parent]", inputs: { parent: "parent" }, usesInheritance: true, ngImport: i0 });
1073
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: NgtParent, decorators: [{
1090
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtParent, decorators: [{
1074
1091
  type: Directive,
1075
1092
  args: [{ selector: '[parent]', standalone: true }]
1076
1093
  }], propDecorators: { parent: [{
@@ -2008,10 +2025,10 @@ class NgtRendererFactory {
2008
2025
  }
2009
2026
  return renderer;
2010
2027
  }
2028
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtRendererFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2029
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtRendererFactory }); }
2011
2030
  }
2012
- NgtRendererFactory.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: NgtRendererFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
2013
- NgtRendererFactory.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: NgtRendererFactory });
2014
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: NgtRendererFactory, decorators: [{
2031
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtRendererFactory, decorators: [{
2015
2032
  type: Injectable
2016
2033
  }] });
2017
2034
  /**
@@ -2570,14 +2587,14 @@ class NgtCanvas extends NgtRxStore {
2570
2587
  }
2571
2588
  safeDetectChanges(this.cdr);
2572
2589
  }
2573
- }
2574
- NgtCanvasfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: NgtCanvas, deps: null, target: i0.ɵɵFactoryTarget.Component });
2575
- NgtCanvas.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.6", type: NgtCanvas, isStandalone: true, selector: "ngt-canvas", inputs: { sceneGraph: "sceneGraph", sceneGraphInputs: "sceneGraphInputs", compoundPrefixes: "compoundPrefixes", linear: "linear", legacy: "legacy", flat: "flat", orthographic: "orthographic", frameloop: "frameloop", dpr: "dpr", raycaster: "raycaster", shadows: "shadows", camera: "camera", gl: "gl", eventSource: "eventSource", eventPrefix: "eventPrefix", lookAt: "lookAt", performance: "performance" }, outputs: { created: "created", pointerMissed: "pointerMissed" }, host: { properties: { "class.ngt-canvas": "this.hbClass", "style.pointerEvents": "this.hbPointerEvents" } }, providers: [NgtStore, provideNgxResizeOptions({ emitInZone: false })], viewQueries: [{ propertyName: "glCanvas", first: true, predicate: ["glCanvas"], descendants: true, static: true }, { propertyName: "glAnchor", first: true, predicate: ["glCanvas"], descendants: true, read: ViewContainerRef, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: `
2590
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtCanvas, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
2591
+ static { thiscmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: NgtCanvas, isStandalone: true, selector: "ngt-canvas", inputs: { sceneGraph: "sceneGraph", sceneGraphInputs: "sceneGraphInputs", compoundPrefixes: "compoundPrefixes", linear: "linear", legacy: "legacy", flat: "flat", orthographic: "orthographic", frameloop: "frameloop", dpr: "dpr", raycaster: "raycaster", shadows: "shadows", camera: "camera", gl: "gl", eventSource: "eventSource", eventPrefix: "eventPrefix", lookAt: "lookAt", performance: "performance" }, outputs: { created: "created", pointerMissed: "pointerMissed" }, host: { properties: { "class.ngt-canvas": "this.hbClass", "style.pointerEvents": "this.hbPointerEvents" } }, providers: [NgtStore, provideNgxResizeOptions({ emitInZone: false })], viewQueries: [{ propertyName: "glCanvas", first: true, predicate: ["glCanvas"], descendants: true, static: true }, { propertyName: "glAnchor", first: true, predicate: ["glCanvas"], descendants: true, read: ViewContainerRef, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: `
2576
2592
  <div (ngxResize)="onResize($event)" style="height: 100%; width: 100%;">
2577
2593
  <canvas #glCanvas style="display: block;"></canvas>
2578
2594
  </div>
2579
- `, isInline: true, styles: [":host{display:block;position:relative;width:100%;height:100%;overflow:hidden}\n"], dependencies: [{ kind: "directive", type: NgxResize, selector: "[ngxResize]", inputs: ["ngxResizeOptions"], outputs: ["ngxResize"] }] });
2580
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: NgtCanvas, decorators: [{
2595
+ `, isInline: true, styles: [":host{display:block;position:relative;width:100%;height:100%;overflow:hidden}\n"], dependencies: [{ kind: "directive", type: NgxResize, selector: "[ngxResize]", inputs: ["ngxResizeOptions"], outputs: ["ngxResize"] }] }); }
2596
+ }
2597
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtCanvas, decorators: [{
2581
2598
  type: Component,
2582
2599
  args: [{ selector: 'ngt-canvas', standalone: true, template: `
2583
2600
  <div (ngxResize)="onResize($event)" style="height: 100%; width: 100%;">
@@ -2771,10 +2788,10 @@ class NgtRepeat extends NgForOf {
2771
2788
  set ngForRepeat(count) {
2772
2789
  this.ngForOf = Number.isInteger(count) ? Array.from({ length: count }, (_, i) => i) : [];
2773
2790
  }
2791
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtRepeat, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
2792
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.0", type: NgtRepeat, isStandalone: true, selector: "[ngFor][ngForRepeat]", inputs: { ngForRepeat: "ngForRepeat" }, usesInheritance: true, ngImport: i0 }); }
2774
2793
  }
2775
- NgtRepeat.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: NgtRepeat, deps: null, target: i0.ɵɵFactoryTarget.Directive });
2776
- NgtRepeat.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.6", type: NgtRepeat, isStandalone: true, selector: "[ngFor][ngForRepeat]", inputs: { ngForRepeat: "ngForRepeat" }, usesInheritance: true, ngImport: i0 });
2777
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: NgtRepeat, decorators: [{
2794
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtRepeat, decorators: [{
2778
2795
  type: Directive,
2779
2796
  args: [{ selector: '[ngFor][ngForRepeat]', standalone: true }]
2780
2797
  }], propDecorators: { ngForRepeat: [{
@@ -2818,10 +2835,10 @@ class NgtPush {
2818
2835
  this.latestValue = undefined;
2819
2836
  this.obj = undefined;
2820
2837
  }
2838
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtPush, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
2839
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "16.0.0", ngImport: i0, type: NgtPush, isStandalone: true, name: "ngtPush", pure: false }); }
2821
2840
  }
2822
- NgtPush.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: NgtPush, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
2823
- NgtPush.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.2.6", ngImport: i0, type: NgtPush, isStandalone: true, name: "ngtPush", pure: false });
2824
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: NgtPush, decorators: [{
2841
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtPush, decorators: [{
2825
2842
  type: Pipe,
2826
2843
  args: [{ name: 'ngtPush', pure: false, standalone: true }]
2827
2844
  }] });
@@ -2869,10 +2886,10 @@ class NgtPortalBeforeRender {
2869
2886
  ngOnDestroy() {
2870
2887
  this.subscription?.();
2871
2888
  }
2889
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtPortalBeforeRender, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
2890
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.0", type: NgtPortalBeforeRender, isStandalone: true, selector: "[ngtPortalBeforeRender]", inputs: { renderPriority: "renderPriority", parentScene: "parentScene", parentCamera: "parentCamera" }, outputs: { beforeRender: "beforeRender" }, ngImport: i0 }); }
2872
2891
  }
2873
- NgtPortalBeforeRender.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: NgtPortalBeforeRender, deps: [], target: i0.ɵɵFactoryTarget.Directive });
2874
- NgtPortalBeforeRender.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.6", type: NgtPortalBeforeRender, isStandalone: true, selector: "[ngtPortalBeforeRender]", inputs: { renderPriority: "renderPriority", parentScene: "parentScene", parentCamera: "parentCamera" }, outputs: { beforeRender: "beforeRender" }, ngImport: i0 });
2875
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: NgtPortalBeforeRender, decorators: [{
2892
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtPortalBeforeRender, decorators: [{
2876
2893
  type: Directive,
2877
2894
  args: [{ selector: '[ngtPortalBeforeRender]', standalone: true }]
2878
2895
  }], propDecorators: { renderPriority: [{
@@ -2892,10 +2909,10 @@ class NgtPortalContent {
2892
2909
  delete commentNode['__ngt_renderer_add_comment__'];
2893
2910
  }
2894
2911
  }
2912
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtPortalContent, deps: [{ token: i0.ViewContainerRef }, { token: i0.ViewContainerRef, skipSelf: true }], target: i0.ɵɵFactoryTarget.Directive }); }
2913
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.0", type: NgtPortalContent, isStandalone: true, selector: "ng-template[ngtPortalContent]", ngImport: i0 }); }
2895
2914
  }
2896
- NgtPortalContent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: NgtPortalContent, deps: [{ token: i0.ViewContainerRef }, { token: i0.ViewContainerRef, skipSelf: true }], target: i0.ɵɵFactoryTarget.Directive });
2897
- NgtPortalContent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.6", type: NgtPortalContent, isStandalone: true, selector: "ng-template[ngtPortalContent]", ngImport: i0 });
2898
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: NgtPortalContent, decorators: [{
2915
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtPortalContent, decorators: [{
2899
2916
  type: Directive,
2900
2917
  args: [{ selector: 'ng-template[ngtPortalContent]', standalone: true }]
2901
2918
  }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i0.ViewContainerRef, decorators: [{
@@ -3001,9 +3018,8 @@ class NgtPortal extends NgtRxStore {
3001
3018
  ...restInputsState,
3002
3019
  };
3003
3020
  }
3004
- }
3005
- NgtPortalfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: NgtPortal, deps: null, target: i0.ɵɵFactoryTarget.Component });
3006
- NgtPortal.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.6", type: NgtPortal, isStandalone: true, selector: "ngt-portal", inputs: { container: "container", state: "state", autoRender: "autoRender", autoRenderPriority: "autoRenderPriority" }, outputs: { beforeRender: "beforeRender" }, providers: [NgtStore], queries: [{ propertyName: "portalContentTemplate", first: true, predicate: NgtPortalContent, descendants: true, read: TemplateRef, static: true }], viewQueries: [{ propertyName: "portalContentAnchor", first: true, predicate: ["portalContentAnchor"], descendants: true, read: ViewContainerRef, static: true }], usesInheritance: true, ngImport: i0, template: `
3021
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtPortal, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
3022
+ static { thiscmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: NgtPortal, isStandalone: true, selector: "ngt-portal", inputs: { container: "container", state: "state", autoRender: "autoRender", autoRenderPriority: "autoRenderPriority" }, outputs: { beforeRender: "beforeRender" }, providers: [NgtStore], queries: [{ propertyName: "portalContentTemplate", first: true, predicate: NgtPortalContent, descendants: true, read: TemplateRef, static: true }], viewQueries: [{ propertyName: "portalContentAnchor", first: true, predicate: ["portalContentAnchor"], descendants: true, read: ViewContainerRef, static: true }], usesInheritance: true, ngImport: i0, template: `
3007
3023
  <ng-container #portalContentAnchor>
3008
3024
  <ng-container
3009
3025
  *ngIf="autoRender && portalContentRendered"
@@ -3014,8 +3030,9 @@ NgtPortal.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15
3014
3030
  (beforeRender)="onBeforeRender($event)"
3015
3031
  />
3016
3032
  </ng-container>
3017
- `, isInline: true, dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgtPortalBeforeRender, selector: "[ngtPortalBeforeRender]", inputs: ["renderPriority", "parentScene", "parentCamera"], outputs: ["beforeRender"] }] });
3018
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: NgtPortal, decorators: [{
3033
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgtPortalBeforeRender, selector: "[ngtPortalBeforeRender]", inputs: ["renderPriority", "parentScene", "parentCamera"], outputs: ["beforeRender"] }] }); }
3034
+ }
3035
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtPortal, decorators: [{
3019
3036
  type: Component,
3020
3037
  args: [{
3021
3038
  selector: 'ngt-portal',
@@ -3054,17 +3071,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.6", ngImpor
3054
3071
  }] } });
3055
3072
 
3056
3073
  class NgtRoutedScene {
3074
+ static { this.isRoutedScene = true; }
3057
3075
  constructor(router) {
3058
3076
  const { destroy$, cdr } = injectNgtDestroy();
3059
3077
  router.events
3060
3078
  .pipe(filter((event) => event instanceof ActivationEnd), takeUntil(destroy$))
3061
3079
  .subscribe(() => safeDetectChanges(cdr));
3062
3080
  }
3081
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtRoutedScene, deps: [{ token: i1.Router }], target: i0.ɵɵFactoryTarget.Component }); }
3082
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: NgtRoutedScene, isStandalone: true, selector: "ngt-routed-scene", ngImport: i0, template: `<router-outlet />`, isInline: true, dependencies: [{ kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }] }); }
3063
3083
  }
3064
- NgtRoutedScene.isRoutedScene = true;
3065
- NgtRoutedScene.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: NgtRoutedScene, deps: [{ token: i1.Router }], target: i0.ɵɵFactoryTarget.Component });
3066
- NgtRoutedScene.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.6", type: NgtRoutedScene, isStandalone: true, selector: "ngt-routed-scene", ngImport: i0, template: `<router-outlet />`, isInline: true, dependencies: [{ kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }] });
3067
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.6", ngImport: i0, type: NgtRoutedScene, decorators: [{
3084
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtRoutedScene, decorators: [{
3068
3085
  type: Component,
3069
3086
  args: [{
3070
3087
  standalone: true,