Skip to content

Commit 77e9817

Browse files
authored
Inspector: Added Extension support and revisions (#33200)
1 parent ca7895c commit 77e9817

14 files changed

Lines changed: 731 additions & 302 deletions

File tree

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { Tab } from 'three/addons/inspector/ui/Tab.js';
2+
3+
export class Extension extends Tab {
4+
5+
constructor( name, options = {} ) {
6+
7+
super( name, options );
8+
9+
this.isExtension = true;
10+
11+
}
12+
13+
}

examples/jsm/inspector/Inspector.js

Lines changed: 108 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -8,32 +8,9 @@ import { Parameters } from './tabs/Parameters.js';
88
import { Settings } from './tabs/Settings.js';
99
import { Viewer } from './tabs/Viewer.js';
1010
import { 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

3815
class 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 };

examples/jsm/inspector/RendererInspector.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ export class RendererInspector extends InspectorBase {
173173

174174
}
175175

176-
resolveViewer() { }
176+
updateTabs() { }
177177

178178
resolveFrame( /*frame*/ ) { }
179179

@@ -321,7 +321,7 @@ export class RendererInspector extends InspectorBase {
321321

322322
if ( this.isAvailable ) {
323323

324-
this.resolveViewer();
324+
this.updateTabs();
325325
this.resolveTimestamp();
326326

327327
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
[
2+
{
3+
"name": "TSL Graph",
4+
"url": "./tsl-graph/TSLGraphEditor.js"
5+
}
6+
]

0 commit comments

Comments
 (0)