Viewer.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. import { Tab } from '../ui/Tab.js';
  2. import { List } from '../ui/List.js';
  3. import { Item } from '../ui/Item.js';
  4. import { RendererUtils, NoToneMapping, LinearSRGBColorSpace } from 'three/webgpu';
  5. class Viewer extends Tab {
  6. constructor( options = {} ) {
  7. super( 'Viewer', options );
  8. const nodeList = new List( 'Viewer', 'Name' );
  9. nodeList.setGridStyle( '150px minmax(200px, 2fr)' );
  10. nodeList.domElement.style.minWidth = '400px';
  11. const scrollWrapper = document.createElement( 'div' );
  12. scrollWrapper.className = 'list-scroll-wrapper';
  13. scrollWrapper.appendChild( nodeList.domElement );
  14. this.content.appendChild( scrollWrapper );
  15. const nodes = new Item( 'Nodes' );
  16. nodeList.add( nodes );
  17. //
  18. this.itemLibrary = new Map();
  19. this.folderLibrary = new Map();
  20. this.currentDataList = [];
  21. this.nodeList = nodeList;
  22. this.nodes = nodes;
  23. }
  24. getFolder( name ) {
  25. let folder = this.folderLibrary.get( name );
  26. if ( folder === undefined ) {
  27. folder = new Item( name );
  28. this.folderLibrary.set( name, folder );
  29. this.nodeList.add( folder );
  30. }
  31. return folder;
  32. }
  33. addNodeItem( canvasData ) {
  34. let item = this.itemLibrary.get( canvasData.id );
  35. if ( item === undefined ) {
  36. const name = canvasData.name;
  37. const domElement = canvasData.canvasTarget.domElement;
  38. item = new Item( domElement, name );
  39. item.itemRow.children[ 1 ].style[ 'justify-content' ] = 'flex-start';
  40. this.itemLibrary.set( canvasData.id, item );
  41. }
  42. return item;
  43. }
  44. update( renderer, canvasDataList ) {
  45. if ( ! this.isActive && ! this.isDetached ) return;
  46. //
  47. const previousDataList = [ ...this.currentDataList ];
  48. // remove old
  49. for ( const canvasData of previousDataList ) {
  50. if ( this.itemLibrary.has( canvasData.id ) && canvasDataList.indexOf( canvasData ) === - 1 ) {
  51. const item = this.itemLibrary.get( canvasData.id );
  52. const parent = item.parent;
  53. parent.remove( item );
  54. if ( this.folderLibrary.has( parent.data[ 0 ] ) && parent.children.length === 0 ) {
  55. parent.parent.remove( parent );
  56. this.folderLibrary.delete( parent.data[ 0 ] );
  57. }
  58. this.itemLibrary.delete( canvasData.id );
  59. }
  60. }
  61. //
  62. const indexes = {};
  63. for ( const canvasData of canvasDataList ) {
  64. const item = this.addNodeItem( canvasData );
  65. const previousCanvasTarget = renderer.getCanvasTarget();
  66. const path = canvasData.path;
  67. if ( path ) {
  68. const folder = this.getFolder( path );
  69. if ( indexes[ path ] === undefined ) {
  70. indexes[ path ] = 0;
  71. }
  72. if ( folder.parent === null || item.parent !== folder || folder.children.indexOf( item ) !== indexes[ path ] ) {
  73. folder.add( item );
  74. }
  75. indexes[ path ] ++;
  76. } else {
  77. if ( ! item.parent ) {
  78. this.nodes.add( item );
  79. }
  80. }
  81. this.currentDataList = canvasDataList;
  82. //
  83. const state = RendererUtils.resetRendererState( renderer );
  84. renderer.toneMapping = NoToneMapping;
  85. renderer.outputColorSpace = LinearSRGBColorSpace;
  86. renderer.setCanvasTarget( canvasData.canvasTarget );
  87. canvasData.quad.render( renderer );
  88. renderer.setCanvasTarget( previousCanvasTarget );
  89. RendererUtils.restoreRendererState( renderer, state );
  90. }
  91. }
  92. }
  93. export { Viewer };
粤ICP备19079148号