1- import { Component , contentChildren , Directive , ElementRef , inject , input , signal , TemplateRef } from " @angular/core" ;
2- import { NgTemplateOutlet } from " @angular/common" ;
3- import { beforeRender , injectStore } from " angular-three" ;
1+ import { NgTemplateOutlet } from ' @angular/common' ;
2+ import { Component , contentChildren , Directive , ElementRef , inject , input , signal , TemplateRef } from ' @angular/core' ;
3+ import { beforeRender , injectStore } from ' angular-three' ;
44import { mergeInputs } from 'ngxtension/inject-inputs' ;
5- import { Object3D , Vector3 } from " three" ;
5+ import { Object3D , Vector3 } from ' three' ;
66
77export type NgtsLODLevelOptions = {
8- distance : number ;
9- hysteresis : number ;
10- }
8+ distance : number ;
9+ hysteresis : number ;
10+ } ;
1111
1212const defaultLodLevelOptions : NgtsLODLevelOptions = {
13- distance : 0 ,
14- hysteresis : 0 ,
13+ distance : 0 ,
14+ hysteresis : 0 ,
1515} ;
1616
1717const _v1 = new Vector3 ( ) ;
@@ -22,11 +22,11 @@ const _v2 = new Vector3();
2222 * an NgtsLOD component.
2323 */
2424@Directive ( {
25- selector : 'ng-template[lodLevel]'
25+ selector : 'ng-template[lodLevel]' ,
2626} )
2727export class NgtsLODLevel {
28- lodLevel = input ( defaultLodLevelOptions , { transform : mergeInputs ( defaultLodLevelOptions ) } ) ;
29- template = inject ( TemplateRef ) ;
28+ lodLevel = input ( defaultLodLevelOptions , { transform : mergeInputs ( defaultLodLevelOptions ) } ) ;
29+ template = inject ( TemplateRef ) ;
3030}
3131
3232/**
@@ -50,67 +50,63 @@ export class NgtsLODLevel {
5050 * ```
5151 */
5252@Component ( {
53- selector : '[lod]' ,
54- template : `
55- <ng-container [ngTemplateOutlet]="level()?.template" />
56- `,
57- imports : [ NgTemplateOutlet ] ,
53+ selector : '[lod]' ,
54+ template : `
55+ <ng-container [ngTemplateOutlet]="level()?.template" />
56+ `,
57+ imports : [ NgTemplateOutlet ] ,
5858} )
5959export class NgtsLODImpl {
60- maxDistance = input < number > ( ) ;
60+ maxDistance = input < number > ( ) ;
6161
62- private store = injectStore ( ) ;
62+ private store = injectStore ( ) ;
6363 private container = inject ( ElementRef ) ;
6464
65- readonly levels = contentChildren ( NgtsLODLevel ) ;
66- readonly level = signal < NgtsLODLevel | undefined > ( undefined ) ;
67-
68- constructor ( ) {
69- beforeRender ( ( ) => {
70-
71- const levels = this . levels ( ) ;
72- const currentLevel = this . level ( ) ;
73- const maxDistance = this . maxDistance ( ) ;
74-
75- let level : NgtsLODLevel | undefined = levels [ 0 ] ;
76-
77- if ( level && ( levels . length > 1 || maxDistance ) ) {
78-
79- const container = this . container . nativeElement as Object3D ;
80- const { matrixWorld, zoom} = this . store . snapshot . camera ;
81-
82- _v1 . setFromMatrixPosition ( matrixWorld ) ;
83- _v2 . setFromMatrixPosition ( container . matrixWorld ) ;
84-
85- const distance = _v1 . distanceTo ( _v2 ) / zoom ;
86-
87- if ( maxDistance && distance > maxDistance ) {
88- level = undefined ;
89- }
90- else {
91- for ( let i = 1 , l = levels . length ; i < l ; i ++ ) {
92- const _level = levels [ i ] ;
93- let { distance : levelDistance , hysteresis} = _level . lodLevel ( ) ;
94-
95- if ( hysteresis && currentLevel === _level ) {
96- levelDistance -= levelDistance * hysteresis ;
97- }
98-
99- if ( distance >= levelDistance ) {
100- level = _level ;
101- }
102- else {
103- break ;
104- }
105- }
106- }
107- }
108-
109- if ( level !== currentLevel ) {
110- this . level . set ( level ) ;
111- }
112- } ) ;
113- }
65+ readonly levels = contentChildren ( NgtsLODLevel ) ;
66+ readonly level = signal < NgtsLODLevel | undefined > ( undefined ) ;
67+
68+ constructor ( ) {
69+ beforeRender ( ( ) => {
70+ const levels = this . levels ( ) ;
71+ const currentLevel = this . level ( ) ;
72+ const maxDistance = this . maxDistance ( ) ;
73+
74+ let level : NgtsLODLevel | undefined = levels [ 0 ] ;
75+
76+ if ( level && ( levels . length > 1 || maxDistance ) ) {
77+ const container = this . container . nativeElement as Object3D ;
78+ const { matrixWorld, zoom } = this . store . snapshot . camera ;
79+
80+ _v1 . setFromMatrixPosition ( matrixWorld ) ;
81+ _v2 . setFromMatrixPosition ( container . matrixWorld ) ;
82+
83+ const distance = _v1 . distanceTo ( _v2 ) / zoom ;
84+
85+ if ( maxDistance && distance > maxDistance ) {
86+ level = undefined ;
87+ } else {
88+ for ( let i = 1 , l = levels . length ; i < l ; i ++ ) {
89+ const _level = levels [ i ] ;
90+ let { distance : levelDistance , hysteresis } = _level . lodLevel ( ) ;
91+
92+ if ( hysteresis && currentLevel === _level ) {
93+ levelDistance -= levelDistance * hysteresis ;
94+ }
95+
96+ if ( distance >= levelDistance ) {
97+ level = _level ;
98+ } else {
99+ break ;
100+ }
101+ }
102+ }
103+ }
104+
105+ if ( level !== currentLevel ) {
106+ this . level . set ( level ) ;
107+ }
108+ } ) ;
109+ }
114110}
115111
116112export const NgtsLOD = [ NgtsLODImpl , NgtsLODLevel ] as const ;
0 commit comments