angular-three-soba 4.2.0 → 4.2.2

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 (30) hide show
  1. package/fesm2022/angular-three-soba-abstractions.mjs +98 -98
  2. package/fesm2022/angular-three-soba-abstractions.mjs.map +1 -1
  3. package/fesm2022/angular-three-soba-cameras.mjs +26 -26
  4. package/fesm2022/angular-three-soba-cameras.mjs.map +1 -1
  5. package/fesm2022/angular-three-soba-controls.mjs +32 -32
  6. package/fesm2022/angular-three-soba-controls.mjs.map +1 -1
  7. package/fesm2022/angular-three-soba-gizmos.mjs +119 -119
  8. package/fesm2022/angular-three-soba-gizmos.mjs.map +1 -1
  9. package/fesm2022/angular-three-soba-loaders.mjs +6 -6
  10. package/fesm2022/angular-three-soba-loaders.mjs.map +1 -1
  11. package/fesm2022/angular-three-soba-materials.mjs +75 -75
  12. package/fesm2022/angular-three-soba-materials.mjs.map +1 -1
  13. package/fesm2022/angular-three-soba-misc.mjs +85 -76
  14. package/fesm2022/angular-three-soba-misc.mjs.map +1 -1
  15. package/fesm2022/angular-three-soba-performances.mjs +164 -60
  16. package/fesm2022/angular-three-soba-performances.mjs.map +1 -1
  17. package/fesm2022/angular-three-soba-staging.mjs +257 -257
  18. package/fesm2022/angular-three-soba-staging.mjs.map +1 -1
  19. package/fesm2022/angular-three-soba-stats.mjs +5 -5
  20. package/fesm2022/angular-three-soba-stats.mjs.map +1 -1
  21. package/package.json +141 -140
  22. package/performances/README.md +47 -0
  23. package/types/angular-three-soba-abstractions.d.ts +57 -57
  24. package/types/angular-three-soba-cameras.d.ts +3 -3
  25. package/types/angular-three-soba-controls.d.ts +4 -4
  26. package/types/angular-three-soba-gizmos.d.ts +4 -4
  27. package/types/angular-three-soba-materials.d.ts +4 -4
  28. package/types/angular-three-soba-misc.d.ts +16 -5
  29. package/types/angular-three-soba-performances.d.ts +55 -9
  30. package/types/angular-three-soba-staging.d.ts +13 -13
@@ -39,7 +39,7 @@ class NgtsStats {
39
39
  * Configuration options for the stats panel.
40
40
  * Accepts a partial NgtsStatsOptions object that will be merged with defaults.
41
41
  */
42
- this.options = input(defaultOptions, { ...(ngDevMode ? { debugName: "options" } : {}), transform: mergeInputs(defaultOptions), alias: 'stats' });
42
+ this.options = input(defaultOptions, { ...(ngDevMode ? { debugName: "options" } : /* istanbul ignore next */ {}), transform: mergeInputs(defaultOptions), alias: 'stats' });
43
43
  const statsOptions = omit(this.options, ['parent', 'domClass']);
44
44
  const parent = pick(this.options, 'parent');
45
45
  const domClass = pick(this.options, 'domClass');
@@ -52,7 +52,7 @@ class NgtsStats {
52
52
  const stats = new Stats({ ...untracked(statsOptions) });
53
53
  void stats.init(gl);
54
54
  return stats;
55
- }, ...(ngDevMode ? [{ debugName: "stats" }] : []));
55
+ }, ...(ngDevMode ? [{ debugName: "stats" }] : /* istanbul ignore next */ []));
56
56
  effect((onCleanup) => {
57
57
  const _stats = stats();
58
58
  if (!_stats)
@@ -72,10 +72,10 @@ class NgtsStats {
72
72
  });
73
73
  });
74
74
  }
75
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: NgtsStats, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
76
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.1.6", type: NgtsStats, isStandalone: true, selector: "ngt-canvas[stats]", inputs: { options: { classPropertyName: "options", publicName: "stats", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
75
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: NgtsStats, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
76
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.9", type: NgtsStats, isStandalone: true, selector: "ngt-canvas[stats]", inputs: { options: { classPropertyName: "options", publicName: "stats", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
77
77
  }
78
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: NgtsStats, decorators: [{
78
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: NgtsStats, decorators: [{
79
79
  type: Directive,
80
80
  args: [{ selector: 'ngt-canvas[stats]' }]
81
81
  }], ctorParameters: () => [], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "stats", required: false }] }] } });
@@ -1 +1 @@
1
- {"version":3,"file":"angular-three-soba-stats.mjs","sources":["../../../../libs/soba/stats/src/lib/stats.ts","../../../../libs/soba/stats/src/angular-three-soba-stats.ts"],"sourcesContent":["import { computed, Directive, DOCUMENT, effect, ElementRef, inject, input, untracked } from '@angular/core';\nimport { addAfterEffect, injectStore, omit, pick, resolveRef } from 'angular-three';\nimport { mergeInputs } from 'ngxtension/inject-inputs';\nimport Stats from 'stats-gl';\n\n/**\n * Configuration options for the NgtsStats directive.\n *\n * Extends all properties from the stats-gl Stats class with additional\n * Angular-specific options for DOM placement and styling.\n */\nexport type NgtsStatsOptions = Partial<Stats> & {\n\t/**\n\t * The panel index to display by default.\n\t * - 0: FPS (Frames per Second)\n\t * - 1: MS (Milliseconds per frame)\n\t * - 2: MB (Memory usage)\n\t */\n\tshowPanel?: number;\n\t/**\n\t * CSS class(es) to apply to the stats DOM element.\n\t * Multiple classes can be separated by spaces.\n\t * @default ''\n\t */\n\tdomClass: string;\n\t/**\n\t * The parent element to attach the stats panel to.\n\t * If not provided, the stats panel will be appended to document.body.\n\t * @default null\n\t */\n\tparent: ElementRef<HTMLElement> | HTMLElement | null | undefined;\n};\n\nconst defaultOptions: NgtsStatsOptions = {\n\tdomClass: '',\n\tparent: null,\n};\n\n/**\n * A directive that displays performance statistics (FPS, MS, MB) for the Three.js renderer.\n *\n * This directive uses stats-gl to show real-time performance metrics for your 3D scene.\n * It automatically attaches to the canvas and updates every frame.\n *\n * @example\n * Basic usage:\n * ```html\n * <ngt-canvas [stats]=\"true\" />\n * ```\n *\n * @example\n * With custom options:\n * ```html\n * <ngt-canvas [stats]=\"{ domClass: 'my-stats', showPanel: 0 }\" />\n * ```\n *\n * @example\n * Attached to a custom parent element:\n * ```html\n * <div #statsContainer></div>\n * <ngt-canvas [stats]=\"{ parent: statsContainer }\" />\n * ```\n */\n@Directive({ selector: 'ngt-canvas[stats]' })\nexport class NgtsStats {\n\t/**\n\t * Configuration options for the stats panel.\n\t * Accepts a partial NgtsStatsOptions object that will be merged with defaults.\n\t */\n\toptions = input(defaultOptions, { transform: mergeInputs(defaultOptions), alias: 'stats' });\n\n\tconstructor() {\n\t\tconst statsOptions = omit(this.options, ['parent', 'domClass']);\n\t\tconst parent = pick(this.options, 'parent');\n\t\tconst domClass = pick(this.options, 'domClass');\n\n\t\tconst document = inject(DOCUMENT);\n\t\tconst store = injectStore();\n\n\t\tconst stats = computed(() => {\n\t\t\tconst gl = store.gl();\n\t\t\tif (!gl) return null;\n\n\t\t\tconst stats = new Stats({ ...untracked(statsOptions) });\n\t\t\tvoid stats.init(gl);\n\t\t\treturn stats;\n\t\t});\n\n\t\teffect((onCleanup) => {\n\t\t\tconst _stats = stats();\n\t\t\tif (!_stats) return;\n\n\t\t\tconst [_parent, _domClass] = [resolveRef(parent()), domClass()];\n\t\t\tconst target = _parent ?? document.body;\n\t\t\ttarget.appendChild(_stats.dom);\n\t\t\tconst classList = _domClass.split(' ').filter(Boolean);\n\t\t\tif (classList.length) _stats.dom.classList.add(...classList);\n\t\t\tconst end = addAfterEffect(() => _stats.update());\n\n\t\t\tonCleanup(() => {\n\t\t\t\tif (classList.length) _stats.dom.classList.remove(...classList);\n\t\t\t\ttarget.removeChild(_stats.dom);\n\t\t\t\tend();\n\t\t\t});\n\t\t});\n\t}\n}\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-stats.mjs","sources":["../../../../libs/soba/stats/src/lib/stats.ts","../../../../libs/soba/stats/src/angular-three-soba-stats.ts"],"sourcesContent":["import { computed, Directive, DOCUMENT, effect, ElementRef, inject, input, untracked } from '@angular/core';\nimport { addAfterEffect, injectStore, omit, pick, resolveRef } from 'angular-three';\nimport { mergeInputs } from 'ngxtension/inject-inputs';\nimport Stats from 'stats-gl';\n\n/**\n * Configuration options for the NgtsStats directive.\n *\n * Extends all properties from the stats-gl Stats class with additional\n * Angular-specific options for DOM placement and styling.\n */\nexport type NgtsStatsOptions = Partial<Stats> & {\n\t/**\n\t * The panel index to display by default.\n\t * - 0: FPS (Frames per Second)\n\t * - 1: MS (Milliseconds per frame)\n\t * - 2: MB (Memory usage)\n\t */\n\tshowPanel?: number;\n\t/**\n\t * CSS class(es) to apply to the stats DOM element.\n\t * Multiple classes can be separated by spaces.\n\t * @default ''\n\t */\n\tdomClass: string;\n\t/**\n\t * The parent element to attach the stats panel to.\n\t * If not provided, the stats panel will be appended to document.body.\n\t * @default null\n\t */\n\tparent: ElementRef<HTMLElement> | HTMLElement | null | undefined;\n};\n\nconst defaultOptions: NgtsStatsOptions = {\n\tdomClass: '',\n\tparent: null,\n};\n\n/**\n * A directive that displays performance statistics (FPS, MS, MB) for the Three.js renderer.\n *\n * This directive uses stats-gl to show real-time performance metrics for your 3D scene.\n * It automatically attaches to the canvas and updates every frame.\n *\n * @example\n * Basic usage:\n * ```html\n * <ngt-canvas [stats]=\"true\" />\n * ```\n *\n * @example\n * With custom options:\n * ```html\n * <ngt-canvas [stats]=\"{ domClass: 'my-stats', showPanel: 0 }\" />\n * ```\n *\n * @example\n * Attached to a custom parent element:\n * ```html\n * <div #statsContainer></div>\n * <ngt-canvas [stats]=\"{ parent: statsContainer }\" />\n * ```\n */\n@Directive({ selector: 'ngt-canvas[stats]' })\nexport class NgtsStats {\n\t/**\n\t * Configuration options for the stats panel.\n\t * Accepts a partial NgtsStatsOptions object that will be merged with defaults.\n\t */\n\toptions = input(defaultOptions, { transform: mergeInputs(defaultOptions), alias: 'stats' });\n\n\tconstructor() {\n\t\tconst statsOptions = omit(this.options, ['parent', 'domClass']);\n\t\tconst parent = pick(this.options, 'parent');\n\t\tconst domClass = pick(this.options, 'domClass');\n\n\t\tconst document = inject(DOCUMENT);\n\t\tconst store = injectStore();\n\n\t\tconst stats = computed(() => {\n\t\t\tconst gl = store.gl();\n\t\t\tif (!gl) return null;\n\n\t\t\tconst stats = new Stats({ ...untracked(statsOptions) });\n\t\t\tvoid stats.init(gl);\n\t\t\treturn stats;\n\t\t});\n\n\t\teffect((onCleanup) => {\n\t\t\tconst _stats = stats();\n\t\t\tif (!_stats) return;\n\n\t\t\tconst [_parent, _domClass] = [resolveRef(parent()), domClass()];\n\t\t\tconst target = _parent ?? document.body;\n\t\t\ttarget.appendChild(_stats.dom);\n\t\t\tconst classList = _domClass.split(' ').filter(Boolean);\n\t\t\tif (classList.length) _stats.dom.classList.add(...classList);\n\t\t\tconst end = addAfterEffect(() => _stats.update());\n\n\t\t\tonCleanup(() => {\n\t\t\t\tif (classList.length) _stats.dom.classList.remove(...classList);\n\t\t\t\ttarget.removeChild(_stats.dom);\n\t\t\t\tend();\n\t\t\t});\n\t\t});\n\t}\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;AAiCA,MAAM,cAAc,GAAqB;AACxC,IAAA,QAAQ,EAAE,EAAE;AACZ,IAAA,MAAM,EAAE,IAAI;CACZ;AAED;;;;;;;;;;;;;;;;;;;;;;;;AAwBG;MAEU,SAAS,CAAA;AAOrB,IAAA,WAAA,GAAA;AANA;;;AAGG;AACH,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,cAAc,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,SAAA,EAAA,8BAAA,EAAA,CAAA,EAAI,SAAS,EAAE,WAAW,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG;AAG1F,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC;AAE/C,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AACjC,QAAA,MAAM,KAAK,GAAG,WAAW,EAAE;AAE3B,QAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAK;AAC3B,YAAA,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,EAAE;AACrB,YAAA,IAAI,CAAC,EAAE;AAAE,gBAAA,OAAO,IAAI;AAEpB,YAAA,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC;AACvD,YAAA,KAAK,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;AACnB,YAAA,OAAO,KAAK;AACb,QAAA,CAAC,4EAAC;AAEF,QAAA,MAAM,CAAC,CAAC,SAAS,KAAI;AACpB,YAAA,MAAM,MAAM,GAAG,KAAK,EAAE;AACtB,YAAA,IAAI,CAAC,MAAM;gBAAE;AAEb,YAAA,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC;AAC/D,YAAA,MAAM,MAAM,GAAG,OAAO,IAAI,QAAQ,CAAC,IAAI;AACvC,YAAA,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC;AAC9B,YAAA,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;YACtD,IAAI,SAAS,CAAC,MAAM;gBAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;AAC5D,YAAA,MAAM,GAAG,GAAG,cAAc,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;YAEjD,SAAS,CAAC,MAAK;gBACd,IAAI,SAAS,CAAC,MAAM;oBAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;AAC/D,gBAAA,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC;AAC9B,gBAAA,GAAG,EAAE;AACN,YAAA,CAAC,CAAC;AACH,QAAA,CAAC,CAAC;IACH;8GAzCY,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAT,SAAS,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAAT,SAAS,EAAA,UAAA,EAAA,CAAA;kBADrB,SAAS;mBAAC,EAAE,QAAQ,EAAE,mBAAmB,EAAE;;;AC/D5C;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,142 +1,143 @@
1
1
  {
2
- "name": "angular-three-soba",
3
- "version": "4.2.0",
4
- "publishConfig": {
5
- "access": "public"
6
- },
7
- "repository": {
8
- "type": "git",
9
- "url": "https://github.com/angular-threejs/angular-three/tree/main/libs/soba"
10
- },
11
- "author": {
12
- "name": "Chau Tran",
13
- "email": "nartc7789@gmail.com",
14
- "url": "https://nartc.me"
15
- },
16
- "description": "Utilities for Angular Three",
17
- "keywords": [
18
- "angular",
19
- "threejs",
20
- "renderer",
21
- "utilities",
22
- "shaders"
23
- ],
24
- "license": "MIT",
25
- "exports": {
26
- "./assets/*": "./assets/*",
27
- "./package.json": {
28
- "default": "./package.json"
29
- },
30
- ".": {
31
- "types": "./types/angular-three-soba.d.ts",
32
- "default": "./fesm2022/angular-three-soba.mjs"
33
- },
34
- "./abstractions": {
35
- "types": "./types/angular-three-soba-abstractions.d.ts",
36
- "default": "./fesm2022/angular-three-soba-abstractions.mjs"
37
- },
38
- "./cameras": {
39
- "types": "./types/angular-three-soba-cameras.d.ts",
40
- "default": "./fesm2022/angular-three-soba-cameras.mjs"
41
- },
42
- "./controls": {
43
- "types": "./types/angular-three-soba-controls.d.ts",
44
- "default": "./fesm2022/angular-three-soba-controls.mjs"
45
- },
46
- "./gizmos": {
47
- "types": "./types/angular-three-soba-gizmos.d.ts",
48
- "default": "./fesm2022/angular-three-soba-gizmos.mjs"
49
- },
50
- "./loaders": {
51
- "types": "./types/angular-three-soba-loaders.d.ts",
52
- "default": "./fesm2022/angular-three-soba-loaders.mjs"
53
- },
54
- "./materials": {
55
- "types": "./types/angular-three-soba-materials.d.ts",
56
- "default": "./fesm2022/angular-three-soba-materials.mjs"
57
- },
58
- "./misc": {
59
- "types": "./types/angular-three-soba-misc.d.ts",
60
- "default": "./fesm2022/angular-three-soba-misc.mjs"
61
- },
62
- "./performances": {
63
- "types": "./types/angular-three-soba-performances.d.ts",
64
- "default": "./fesm2022/angular-three-soba-performances.mjs"
65
- },
66
- "./shaders": {
67
- "types": "./types/angular-three-soba-shaders.d.ts",
68
- "default": "./fesm2022/angular-three-soba-shaders.mjs"
69
- },
70
- "./staging": {
71
- "types": "./types/angular-three-soba-staging.d.ts",
72
- "default": "./fesm2022/angular-three-soba-staging.mjs"
73
- },
74
- "./stats": {
75
- "types": "./types/angular-three-soba-stats.d.ts",
76
- "default": "./fesm2022/angular-three-soba-stats.mjs"
77
- },
78
- "./vanilla-exports": {
79
- "types": "./types/angular-three-soba-vanilla-exports.d.ts",
80
- "default": "./fesm2022/angular-three-soba-vanilla-exports.mjs"
81
- }
82
- },
83
- "peerDependencies": {
84
- "@angular/common": ">=20.0.0 <22.0.0",
85
- "@angular/core": ">=20.0.0 <22.0.0",
86
- "@monogrid/gainmap-js": "^3.0.0",
87
- "@pmndrs/vanilla": "^1.24.0",
88
- "camera-controls": "^2.8.0",
89
- "hls.js": ">=1.5.0",
90
- "maath": ">=0.10.0 <0.11.0",
91
- "meshline": "^3.1.0",
92
- "stats-gl": ">=2.0.0",
93
- "three": ">=0.157.0 <0.183.0",
94
- "three-custom-shader-material": ">=5.5.0 <6.5.0",
95
- "three-mesh-bvh": ">=0.5.0 <0.10.0",
96
- "three-stdlib": "^2.0.0",
97
- "troika-three-text": ">=0.47.0 <0.53.0"
98
- },
99
- "peerDependenciesMeta": {
100
- "@monogrid/gainmap-js": {
101
- "optional": true
102
- },
103
- "@pmndrs/vanilla": {
104
- "optional": true
105
- },
106
- "hls.js": {
107
- "optional": true
108
- },
109
- "troika-three-text": {
110
- "optional": true
111
- },
112
- "three-custom-shader-material": {
113
- "optional": true
114
- },
115
- "three-mesh-bvh": {
116
- "optional": true
117
- },
118
- "maath": {
119
- "optional": true
120
- },
121
- "meshline": {
122
- "optional": true
123
- },
124
- "camera-controls": {
125
- "optional": true
126
- },
127
- "stats-gl": {
128
- "optional": true
129
- }
130
- },
131
- "dependencies": {
132
- "tslib": "^2.3.0"
133
- },
134
- "sideEffects": false,
135
- "web-types": [
136
- "../../node_modules/angular-three/web-types.json",
137
- "../../node_modules/angular-three-soba/web-types.json",
138
- "./web-types.json"
139
- ],
140
- "module": "fesm2022/angular-three-soba.mjs",
141
- "typings": "types/angular-three-soba.d.ts"
2
+ "name": "angular-three-soba",
3
+ "version": "4.2.2",
4
+ "publishConfig": {
5
+ "access": "public"
6
+ },
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/angular-threejs/angular-three/tree/main/libs/soba"
10
+ },
11
+ "author": {
12
+ "name": "Chau Tran",
13
+ "email": "nartc7789@gmail.com",
14
+ "url": "https://nartc.me"
15
+ },
16
+ "description": "Utilities for Angular Three",
17
+ "keywords": [
18
+ "angular",
19
+ "threejs",
20
+ "renderer",
21
+ "utilities",
22
+ "shaders"
23
+ ],
24
+ "license": "MIT",
25
+ "exports": {
26
+ "./assets/*": "./assets/*",
27
+ "./package.json": {
28
+ "default": "./package.json"
29
+ },
30
+ ".": {
31
+ "types": "./types/angular-three-soba.d.ts",
32
+ "default": "./fesm2022/angular-three-soba.mjs"
33
+ },
34
+ "./abstractions": {
35
+ "types": "./types/angular-three-soba-abstractions.d.ts",
36
+ "default": "./fesm2022/angular-three-soba-abstractions.mjs"
37
+ },
38
+ "./cameras": {
39
+ "types": "./types/angular-three-soba-cameras.d.ts",
40
+ "default": "./fesm2022/angular-three-soba-cameras.mjs"
41
+ },
42
+ "./controls": {
43
+ "types": "./types/angular-three-soba-controls.d.ts",
44
+ "default": "./fesm2022/angular-three-soba-controls.mjs"
45
+ },
46
+ "./gizmos": {
47
+ "types": "./types/angular-three-soba-gizmos.d.ts",
48
+ "default": "./fesm2022/angular-three-soba-gizmos.mjs"
49
+ },
50
+ "./loaders": {
51
+ "types": "./types/angular-three-soba-loaders.d.ts",
52
+ "default": "./fesm2022/angular-three-soba-loaders.mjs"
53
+ },
54
+ "./materials": {
55
+ "types": "./types/angular-three-soba-materials.d.ts",
56
+ "default": "./fesm2022/angular-three-soba-materials.mjs"
57
+ },
58
+ "./misc": {
59
+ "types": "./types/angular-three-soba-misc.d.ts",
60
+ "default": "./fesm2022/angular-three-soba-misc.mjs"
61
+ },
62
+ "./performances": {
63
+ "types": "./types/angular-three-soba-performances.d.ts",
64
+ "default": "./fesm2022/angular-three-soba-performances.mjs"
65
+ },
66
+ "./shaders": {
67
+ "types": "./types/angular-three-soba-shaders.d.ts",
68
+ "default": "./fesm2022/angular-three-soba-shaders.mjs"
69
+ },
70
+ "./staging": {
71
+ "types": "./types/angular-three-soba-staging.d.ts",
72
+ "default": "./fesm2022/angular-three-soba-staging.mjs"
73
+ },
74
+ "./stats": {
75
+ "types": "./types/angular-three-soba-stats.d.ts",
76
+ "default": "./fesm2022/angular-three-soba-stats.mjs"
77
+ },
78
+ "./vanilla-exports": {
79
+ "types": "./types/angular-three-soba-vanilla-exports.d.ts",
80
+ "default": "./fesm2022/angular-three-soba-vanilla-exports.mjs"
81
+ }
82
+ },
83
+ "peerDependencies": {
84
+ "@angular/common": ">=20.0.0 <22.0.0",
85
+ "@angular/core": ">=20.0.0 <22.0.0",
86
+ "@monogrid/gainmap-js": "^3.0.0",
87
+ "@pmndrs/vanilla": "^1.24.0",
88
+ "camera-controls": "^2.8.0",
89
+ "hls.js": ">=1.5.0",
90
+ "maath": ">=0.10.0 <0.11.0",
91
+ "meshline": "^3.1.0",
92
+ "stats-gl": ">=2.0.0",
93
+ "three": ">=0.157.0 <0.183.0",
94
+ "three-custom-shader-material": ">=5.5.0 <6.5.0",
95
+ "three-mesh-bvh": ">=0.5.0 <0.10.0",
96
+ "three-stdlib": "^2.0.0",
97
+ "troika-three-text": ">=0.47.0 <0.53.0"
98
+ },
99
+ "peerDependenciesMeta": {
100
+ "@monogrid/gainmap-js": {
101
+ "optional": true
102
+ },
103
+ "@pmndrs/vanilla": {
104
+ "optional": true
105
+ },
106
+ "hls.js": {
107
+ "optional": true
108
+ },
109
+ "troika-three-text": {
110
+ "optional": true
111
+ },
112
+ "three-custom-shader-material": {
113
+ "optional": true
114
+ },
115
+ "three-mesh-bvh": {
116
+ "optional": true
117
+ },
118
+ "maath": {
119
+ "optional": true
120
+ },
121
+ "meshline": {
122
+ "optional": true
123
+ },
124
+ "camera-controls": {
125
+ "optional": true
126
+ },
127
+ "stats-gl": {
128
+ "optional": true
129
+ }
130
+ },
131
+ "dependencies": {
132
+ "tslib": "^2.3.0"
133
+ },
134
+ "sideEffects": false,
135
+ "web-types": [
136
+ "../../node_modules/angular-three/web-types.json",
137
+ "../../node_modules/angular-three-soba/web-types.json",
138
+ "./web-types.json"
139
+ ],
140
+ "module": "fesm2022/angular-three-soba.mjs",
141
+ "typings": "types/angular-three-soba.d.ts",
142
+ "type": "module"
142
143
  }
@@ -16,6 +16,7 @@ npm install three-mesh-bvh
16
16
  - [NgtsAdaptiveEvents](#ngtsadaptiveevents)
17
17
  - [NgtsBVH](#ngtsbvh)
18
18
  - [NgtsDetailed](#ngtsdetailed)
19
+ - [NgtsLOD](#ngtslod)
19
20
  - [NgtsInstances](#ngtsinstances)
20
21
  - [NgtsSegments](#ngtssegments)
21
22
  - [NgtsPoints](#ngtspoints)
@@ -94,6 +95,52 @@ Implements Level of Detail (LOD) rendering. Automatically switches between diffe
94
95
  </ngts-detailed>
95
96
  ```
96
97
 
98
+ ## NgtsLOD
99
+
100
+ Implements Level of Detail (LOD) rendering. Automatically switches between different detail levels of child objects based on camera distance.
101
+
102
+ Unlike `NgtsDetailed`, this is an implementation based on Angular and angular-three APIs rather than Three's LOD class.
103
+ The component adds and remove objects from the scene graph rather than hiding them with `visible = false`.
104
+ This solves a number of issues such as avoid raycasting over hidden objects.
105
+
106
+ Usage:
107
+
108
+ ```html
109
+ <ngt-group lod [maxDistance]="10000">
110
+ <ngt-mesh *lodLevel />
111
+ <ngt-mesh *lodLevel="{distance: 100, hysteresis: 0.1}" />
112
+ <ngt-mesh *lodLevel="{distance: 1000}" />
113
+ </ngt-group>
114
+ ```
115
+
116
+ The `[lod]` directive (`NgtsLODImpl`) supports the following optional input:
117
+
118
+ | Property | Description | Default Value |
119
+ | ------------- | ----------------------------------------------------------------------------- | ------------- |
120
+ | `maxDistance` | Distance beyond which nothing is displayed (equivalent to a last empty level) | `undefined` |
121
+
122
+ The `[lodLevel]` directive (`NgtsLODLevel`) supports the following object inputs:
123
+
124
+ | Property | Description | Default Value |
125
+ | ------------ | ---------------------------------------------------- | ------------- |
126
+ | `distance` | Distance threshold above which to display the object | `0` |
127
+ | `hysteresis` | Prevents rapid switching near distance thresholds | `0` |
128
+
129
+ This directive may also be used with the following shorthand syntax:
130
+
131
+ ```html
132
+ <ngt-group lod>
133
+ <ng-template lodLevel>
134
+ <ngt-mesh />
135
+ <ngt-mesh />
136
+ </ng-template>
137
+ <ng-template [lodLevel]="{distance: 100}">
138
+ <ngt-mesh />
139
+ <ngt-mesh />
140
+ </ng-template>
141
+ </ngt-group>
142
+ ```
143
+
97
144
  ## NgtsInstances
98
145
 
99
146
  Efficiently renders many instances of the same geometry and material using a single draw call via `THREE.InstancedMesh`.