@@ -8,32 +8,9 @@ import { Parameters } from './tabs/Parameters.js';
88import { Settings } from './tabs/Settings.js' ;
99import { Viewer } from './tabs/Viewer.js' ;
1010import { Timeline } from './tabs/Timeline.js' ;
11- import { setText , splitPath , splitCamelCase } from './ui/utils.js' ;
11+ import { setText } from './ui/utils.js' ;
1212
13- import { QuadMesh , NodeMaterial , CanvasTarget , setConsoleFunction , REVISION , NoToneMapping } from 'three/webgpu' ;
14- import { renderOutput , vec2 , vec3 , vec4 , Fn , screenUV , step , OnMaterialUpdate , uniform } from 'three/tsl' ;
15-
16- const aspectRatioUV = /*@__PURE__ */ Fn ( ( [ uv , textureNode ] ) => {
17-
18- const aspect = uniform ( 0 ) ;
19-
20- OnMaterialUpdate ( ( ) => {
21-
22- const { width, height } = textureNode . value ;
23-
24- aspect . value = width / height ;
25-
26- } ) ;
27-
28- const centered = uv . sub ( 0.5 ) ;
29- const corrected = vec2 ( centered . x . div ( aspect ) , centered . y ) ;
30- const finalUV = corrected . add ( 0.5 ) ;
31-
32- const inBounds = step ( 0.0 , finalUV . x ) . mul ( step ( finalUV . x , 1.0 ) ) . mul ( step ( 0.0 , finalUV . y ) ) . mul ( step ( finalUV . y , 1.0 ) ) ;
33-
34- return vec3 ( finalUV , inBounds ) ;
35-
36- } ) ;
13+ import { setConsoleFunction , REVISION } from 'three/webgpu' ;
3714
3815class Inspector extends RendererInspector {
3916
@@ -43,7 +20,7 @@ class Inspector extends RendererInspector {
4320
4421 // init profiler
4522
46- const profiler = new Profiler ( ) ;
23+ const profiler = new Profiler ( this ) ;
4724 profiler . addEventListener ( 'resize' , ( e ) => this . dispatchEvent ( e ) ) ;
4825
4926 const parameters = new Parameters ( {
@@ -81,15 +58,16 @@ class Inspector extends RendererInspector {
8158 }
8259
8360 this . statsData = new Map ( ) ;
84- this . canvasNodes = new Map ( ) ;
8561 this . profiler = profiler ;
8662 this . performance = performance ;
8763 this . memory = memory ;
8864 this . console = consoleTab ;
8965 this . parameters = parameters ;
9066 this . viewer = viewer ;
9167 this . timeline = timeline ;
68+ this . settings = settings ;
9269 this . once = { } ;
70+ this . extensionsData = new WeakMap ( ) ;
9371
9472 this . displayCycle = {
9573 text : {
@@ -112,6 +90,34 @@ class Inspector extends RendererInspector {
11290
11391 }
11492
93+ onExtension ( name , callback ) {
94+
95+ const extensionAdded = ( e ) => {
96+
97+ if ( e . name === name ) {
98+
99+ callback ( e . tab ) ;
100+
101+ this . settings . removeEventListener ( 'extensionadded' , extensionAdded ) ;
102+
103+ }
104+
105+ } ;
106+
107+ if ( this . settings . extensions [ name ] && this . settings . extensions [ name ] . loaded ) {
108+
109+ callback ( this . settings . extensions [ name ] ) ;
110+
111+ } else {
112+
113+ this . settings . addEventListener ( 'extensionadded' , extensionAdded ) ;
114+
115+ }
116+
117+ return this ;
118+
119+ }
120+
115121 hide ( ) {
116122
117123 this . profiler . hide ( ) ;
@@ -154,6 +160,14 @@ class Inspector extends RendererInspector {
154160
155161 }
156162
163+ setActiveExtension ( name , value ) {
164+
165+ this . settings . setActiveExtension ( name , value ) ;
166+
167+ return this ;
168+
169+ }
170+
157171 resolveConsoleOnce ( type , message ) {
158172
159173 const key = type + message ;
@@ -351,115 +365,62 @@ class Inspector extends RendererInspector {
351365
352366 }
353367
354- getCanvasDataByNode ( node ) {
355-
356- let canvasData = this . canvasNodes . get ( node ) ;
357-
358- if ( canvasData === undefined ) {
359-
360- const renderer = this . getRenderer ( ) ;
361-
362- const canvas = document . createElement ( 'canvas' ) ;
363-
364- const canvasTarget = new CanvasTarget ( canvas ) ;
365- canvasTarget . setPixelRatio ( window . devicePixelRatio ) ;
366- canvasTarget . setSize ( 140 , 140 ) ;
367-
368- const id = node . id ;
369-
370- const { path, name } = splitPath ( splitCamelCase ( node . getName ( ) || '(unnamed)' ) ) ;
368+ getNodes ( ) {
371369
372- const target = node . context ( { getUV : ( textureNode ) => {
373-
374- const uvData = aspectRatioUV ( screenUV , textureNode ) ;
375- const correctedUV = uvData . xy ;
376- const mask = uvData . z ;
377-
378- return correctedUV . mul ( mask ) ;
379-
380- } } ) ;
381-
382- let output = vec4 ( vec3 ( target ) , 1 ) ;
383- output = renderOutput ( output , NoToneMapping , renderer . outputColorSpace ) ;
384- output = output . context ( { inspector : true } ) ;
385-
386- const material = new NodeMaterial ( ) ;
387- material . outputNode = output ;
388-
389- const quad = new QuadMesh ( material ) ;
390- quad . name = 'Viewer - ' + name ;
391-
392- canvasData = {
393- id,
394- name,
395- path,
396- node,
397- quad,
398- canvasTarget,
399- material
400- } ;
401-
402- this . canvasNodes . set ( node , canvasData ) ;
403-
404- }
405-
406- return canvasData ;
370+ return this . currentNodes ;
407371
408372 }
409373
410- resolveViewer ( ) {
411-
412- const nodes = this . currentNodes ;
413- const renderer = this . getRenderer ( ) ;
374+ getAverageDeltaTime ( statsData , property , frames = this . fps ) {
414375
415- if ( nodes . length === 0 ) return ;
376+ const statsArray = statsData . stats ;
416377
417- if ( ! renderer . backend . isWebGPUBackend ) {
378+ let sum = 0 ;
379+ let count = 0 ;
418380
419- this . resolveConsoleOnce ( 'warn' , 'Inspector: Viewer is only available with WebGPU.' ) ;
381+ for ( let i = statsArray . length - 1 ; i >= 0 && count < frames ; i -- ) {
420382
421- return ;
383+ const stats = statsArray [ i ] ;
384+ const value = stats [ property ] ;
422385
423- }
386+ if ( value > 0 ) {
424387
425- //
388+ // ignore invalid values
426389
427- if ( ! this . viewer . isVisible ) {
390+ sum += value ;
391+ count ++ ;
428392
429- this . viewer . show ( ) ;
393+ }
430394
431395 }
432396
433- const canvasDataList = nodes . map ( node => this . getCanvasDataByNode ( node ) ) ;
434-
435- this . viewer . update ( renderer , canvasDataList ) ;
397+ return count > 0 ? sum / count : 0 ;
436398
437399 }
438400
439- getAverageDeltaTime ( statsData , property , frames = this . fps ) {
401+ updateTabs ( ) {
440402
441- const statsArray = statsData . stats ;
403+ // tabs
442404
443- let sum = 0 ;
444- let count = 0 ;
405+ const tabs = Object . values ( this . profiler . tabs ) ;
445406
446- for ( let i = statsArray . length - 1 ; i >= 0 && count < frames ; i -- ) {
407+ for ( const tab of tabs ) {
447408
448- const stats = statsArray [ i ] ;
449- const value = stats [ property ] ;
409+ let tabData = this . extensionsData . get ( tab ) ;
450410
451- if ( value > 0 ) {
411+ if ( tabData === undefined ) {
452412
453- // ignore invalid values
413+ tab . init ( this ) ;
454414
455- sum += value ;
456- count ++ ;
415+ tabData = { } ;
416+
417+ this . extensionsData . set ( tab , tabData ) ;
457418
458419 }
459420
460- }
421+ tab . update ( this ) ;
461422
462- return count > 0 ? sum / count : 0 ;
423+ }
463424
464425 }
465426
@@ -537,6 +498,45 @@ class Inspector extends RendererInspector {
537498
538499 }
539500
501+ static getItem ( id ) {
502+
503+ console . warn ( 'Inspector.getItem is deprecated. Use getItem directly instead.' ) ;
504+ return getItem ( id ) ;
505+
506+ }
507+
508+ static setItem ( id , state ) {
509+
510+ console . warn ( 'Inspector.setItem is deprecated. Use setItem directly instead.' ) ;
511+ setItem ( id , state ) ;
512+
513+ }
514+
515+ }
516+
517+ function getItem ( id ) {
518+
519+ const data = JSON . parse ( localStorage . getItem ( 'threejs-inspector' ) || '{}' ) ;
520+ return data [ id ] || { } ;
521+
522+ }
523+
524+ function setItem ( id , state ) {
525+
526+ const data = JSON . parse ( localStorage . getItem ( 'threejs-inspector' ) || '{}' ) ;
527+
528+ if ( state === null ) {
529+
530+ delete data [ id ] ;
531+
532+ } else {
533+
534+ data [ id ] = state ;
535+
536+ }
537+
538+ localStorage . setItem ( 'threejs-inspector' , JSON . stringify ( data ) ) ;
539+
540540}
541541
542- export { Inspector } ;
542+ export { Inspector , getItem , setItem } ;
0 commit comments