Sidebar.Project.Resources.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. import { UIPanel, UIText, UITabbedPanel, UIListbox, UIButton } from './libs/ui.js';
  2. import { SetGeometryCommand } from './commands/SetGeometryCommand.js';
  3. import { SetMaterialCommand } from './commands/SetMaterialCommand.js';
  4. function SidebarProjectResources( editor ) {
  5. const signals = editor.signals;
  6. const strings = editor.strings;
  7. const container = new UITabbedPanel();
  8. // Geometries
  9. const geometriesTab = new UIPanel();
  10. geometriesTab.dom.style.borderTop = 'none';
  11. const geometriesListbox = new UIListbox();
  12. geometriesListbox.dom.style.height = '140px';
  13. geometriesListbox.dom.style.resize = 'vertical';
  14. geometriesListbox.dom.style.marginBottom = '10px';
  15. geometriesTab.add( geometriesListbox );
  16. const geometriesAssign = new UIButton( strings.getKey( 'sidebar/project/Assign' ) );
  17. geometriesTab.add( geometriesAssign );
  18. const geometriesInfo = new UIText();
  19. geometriesInfo.dom.style.float = 'right';
  20. geometriesTab.add( geometriesInfo );
  21. geometriesAssign.onClick( function () {
  22. const selectedObject = editor.selected;
  23. if ( selectedObject !== null && selectedObject.geometry !== undefined ) {
  24. const selectedId = geometriesListbox.getValue();
  25. const geometries = Object.values( editor.geometries );
  26. const geometry = geometries.find( g => g.id === parseInt( selectedId ) );
  27. if ( geometry !== undefined ) {
  28. editor.execute( new SetGeometryCommand( editor, selectedObject, geometry ) );
  29. }
  30. }
  31. } );
  32. container.addTab( 'geometries', strings.getKey( 'sidebar/project/geometries' ), geometriesTab );
  33. // Materials
  34. const materialsTab = new UIPanel();
  35. materialsTab.dom.style.borderTop = 'none';
  36. const materialsListbox = new UIListbox();
  37. materialsListbox.dom.style.height = '140px';
  38. materialsListbox.dom.style.resize = 'vertical';
  39. materialsListbox.dom.style.marginBottom = '10px';
  40. materialsTab.add( materialsListbox );
  41. const materialsAssign = new UIButton( strings.getKey( 'sidebar/project/Assign' ) );
  42. materialsTab.add( materialsAssign );
  43. const materialsInfo = new UIText();
  44. materialsInfo.dom.style.float = 'right';
  45. materialsTab.add( materialsInfo );
  46. materialsAssign.onClick( function () {
  47. const selectedObject = editor.selected;
  48. if ( selectedObject !== null && selectedObject.material !== undefined ) {
  49. const selectedId = materialsListbox.getValue();
  50. const materials = Object.values( editor.materials );
  51. const material = materials.find( m => m.id === parseInt( selectedId ) );
  52. if ( material !== undefined ) {
  53. editor.execute( new SetMaterialCommand( editor, selectedObject, material ) );
  54. }
  55. }
  56. } );
  57. container.addTab( 'materials', strings.getKey( 'sidebar/project/materials' ), materialsTab );
  58. // Textures
  59. const texturesTab = new UIPanel();
  60. texturesTab.dom.style.borderTop = 'none';
  61. const texturesListbox = new UIListbox();
  62. texturesListbox.dom.style.height = '140px';
  63. texturesListbox.dom.style.resize = 'vertical';
  64. texturesListbox.dom.style.marginBottom = '10px';
  65. texturesTab.add( texturesListbox );
  66. const texturesInfo = new UIText();
  67. texturesInfo.dom.style.float = 'right';
  68. texturesTab.add( texturesInfo );
  69. container.addTab( 'textures', strings.getKey( 'sidebar/project/textures' ), texturesTab );
  70. container.select( 'geometries' );
  71. // Signals
  72. function refreshGeometriesUI() {
  73. const geometries = Object.values( editor.geometries );
  74. geometriesListbox.setItems( geometries );
  75. geometriesInfo.setValue( geometries.length + ' ' + strings.getKey( 'sidebar/project/geometries' ).toLowerCase() );
  76. }
  77. function refreshMaterialsUI() {
  78. const materials = Object.values( editor.materials );
  79. materialsListbox.setItems( materials );
  80. materialsInfo.setValue( materials.length + ' ' + strings.getKey( 'sidebar/project/materials' ).toLowerCase() );
  81. }
  82. function refreshTexturesUI() {
  83. const textures = [];
  84. const texturesUsed = new Set();
  85. const materials = Object.values( editor.materials );
  86. for ( const material of materials ) {
  87. for ( const property in material ) {
  88. const value = material[ property ];
  89. if ( value !== null && value !== undefined && value.isTexture === true ) {
  90. if ( texturesUsed.has( value.uuid ) === false ) {
  91. textures.push( value );
  92. texturesUsed.add( value.uuid );
  93. }
  94. }
  95. }
  96. }
  97. texturesListbox.setItems( textures );
  98. texturesInfo.setValue( textures.length + ' ' + strings.getKey( 'sidebar/project/textures' ).toLowerCase() );
  99. }
  100. function refreshUI() {
  101. refreshGeometriesUI();
  102. refreshMaterialsUI();
  103. refreshTexturesUI();
  104. }
  105. signals.editorCleared.add( refreshUI );
  106. signals.sceneGraphChanged.add( refreshUI );
  107. signals.geometryChanged.add( refreshGeometriesUI );
  108. signals.materialAdded.add( refreshMaterialsUI );
  109. signals.materialChanged.add( refreshMaterialsUI );
  110. signals.materialRemoved.add( refreshMaterialsUI );
  111. signals.objectSelected.add( function ( object ) {
  112. if ( object !== null ) {
  113. const geometries = Object.values( editor.geometries );
  114. const materials = Object.values( editor.materials );
  115. if ( object.geometry !== undefined ) {
  116. const geometryIndex = geometries.indexOf( object.geometry );
  117. geometriesListbox.selectIndex( geometryIndex );
  118. }
  119. if ( object.material !== undefined ) {
  120. const material = Array.isArray( object.material ) ? object.material[ 0 ] : object.material;
  121. const materialIndex = materials.indexOf( material );
  122. materialsListbox.selectIndex( materialIndex );
  123. }
  124. } else {
  125. geometriesListbox.selectIndex( - 1 );
  126. materialsListbox.selectIndex( - 1 );
  127. }
  128. } );
  129. return container;
  130. }
  131. export { SidebarProjectResources };
粤ICP备19079148号