index.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. 'use strict';
  2. const path = require('path');
  3. const { injectionStyle } = require('../../utils/prop');
  4. const defaultActiveTab = 'animation';
  5. let cacheActiveTab = defaultActiveTab;
  6. exports.template = /* html */`
  7. <div class="asset-fbx">
  8. <header class="header">
  9. <ui-tab class="tabs"></ui-tab>
  10. </header>
  11. <div class="content">
  12. <ui-panel class="tab-panel"></ui-panel>
  13. </div>
  14. </div>
  15. `;
  16. exports.style = /* css */`
  17. .asset-fbx {
  18. display: flex;
  19. flex: 1;
  20. flex-direction: column;
  21. }
  22. .asset-fbx > .header {
  23. padding: 8px 4px;
  24. }
  25. .asset-fbx > .header > .tabs {
  26. height: 24px;
  27. }
  28. `;
  29. exports.$ = {
  30. container: '.asset-fbx',
  31. header: '.header',
  32. tabs: '.tabs',
  33. tabPanel: '.tab-panel',
  34. };
  35. const Components = {
  36. model: path.join(__dirname, `./model.js`),
  37. animation: path.join(__dirname, `./animation.js`),
  38. material: path.join(__dirname, `./material.js`),
  39. fbx: path.join(__dirname, `./fbx.js`),
  40. };
  41. const Elements = {
  42. tabs: {
  43. ready() {
  44. const panel = this;
  45. panel.$.tabs.addEventListener('change', () => {
  46. cacheActiveTab = panel.activeTab = panel.tabs[panel.$.tabs.value];
  47. Elements.tabPanel.update.call(panel);
  48. });
  49. panel.activeTab = cacheActiveTab;
  50. },
  51. update() {
  52. const panel = this;
  53. panel.$.tabs.innerText = '';
  54. panel.tabs = [];
  55. for (const tab in Components) {
  56. if (panel.asset.importer === 'gltf' && tab === 'fbx') {
  57. continue;
  58. }
  59. panel.tabs.push(tab);
  60. }
  61. panel.tabs.forEach((tab) => {
  62. const button = document.createElement('ui-button');
  63. button.setAttribute('size', 'medium');
  64. panel.$.tabs.appendChild(button);
  65. const label = document.createElement('ui-label');
  66. button.appendChild(label);
  67. label.setAttribute('value', `i18n:ENGINE.assets.fbx.${tab}`);
  68. });
  69. panel.$.tabs.value = panel.tabs.indexOf(panel.activeTab);
  70. },
  71. },
  72. tabPanel: {
  73. ready() {
  74. const panel = this;
  75. panel.$.tabPanel.injectionStyle(injectionStyle);
  76. panel.$.tabPanel.addEventListener('change', () => {
  77. panel.dispatch('change');
  78. });
  79. panel.$.tabPanel.addEventListener('snapshot', () => {
  80. panel.dispatch('snapshot');
  81. });
  82. },
  83. update() {
  84. const panel = this;
  85. panel.$.tabPanel.setAttribute('src', Components[panel.activeTab]);
  86. panel.$.tabPanel.update(panel.assetList, panel.metaList);
  87. // Delay, waiting for the fbx preview area initialization to complete
  88. setTimeout(() => {
  89. Editor.Message.broadcast('fbx-inspector:change-tab', panel.activeTab);
  90. });
  91. },
  92. },
  93. };
  94. exports.methods = {
  95. apply() {
  96. Editor.Message.broadcast('fbx-inspector:apply');
  97. },
  98. };
  99. exports.listeners = {
  100. track(event) {
  101. if (event.args?.length) {
  102. const { prop, value } = event.args[0];
  103. if (!value) { return; } // 只有被勾选的时候上报埋点
  104. const trackMap = {
  105. 'meshOptimize.enable': 'A100000',
  106. 'fbx.smartMaterialEnabled': 'A100001',
  107. disableMeshSplit: 'A100002',
  108. };
  109. const trackId = trackMap[prop];
  110. if (trackId) {
  111. Editor.Metrics._trackEventWithTimer({
  112. category: 'importSystem',
  113. id: trackId,
  114. value: 1,
  115. });
  116. }
  117. }
  118. },
  119. };
  120. exports.ready = function() {
  121. for (const prop in Elements) {
  122. const element = Elements[prop];
  123. if (element.ready) {
  124. element.ready.call(this);
  125. }
  126. }
  127. };
  128. exports.update = function(assetList, metaList) {
  129. this.assetList = assetList;
  130. this.metaList = metaList;
  131. this.asset = assetList[0];
  132. this.meta = metaList[0];
  133. for (const prop in Elements) {
  134. const element = Elements[prop];
  135. if (element.update) {
  136. element.update.call(this);
  137. }
  138. }
  139. };