utils.js 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. 'use strict';
  2. function translate(dump, path, dumps, assets, ignoreCollectAssets) {
  3. const type = typeof dump;
  4. if (!dump || type !== 'object') {
  5. return;
  6. }
  7. if (Array.isArray(dump)) {
  8. dump.forEach((item, index) => {
  9. if (item === null || item === undefined) {
  10. console.warn(`data in node dump (${path} ${index}) is ${item}!`);
  11. return;
  12. }
  13. if (typeof item === 'object') {
  14. item.name = `[${index}]`;
  15. item.path = `${path}.${index}`;
  16. let values;
  17. if (dumps) {
  18. values = dumps.map((dump) => {
  19. if (dump[index]) {
  20. return dump[index].value;
  21. }
  22. });
  23. // 仅当存在 value 数据时才添加 values
  24. item.values = values;
  25. }
  26. collectAssets(item, assets, ignoreCollectAssets);
  27. translate(item.value, item.path, values, assets, ignoreCollectAssets);
  28. // 如果是数组,内部元素不需要显示 displayName
  29. delete item.displayName;
  30. }
  31. });
  32. return;
  33. }
  34. for (const name of Object.keys(dump)) {
  35. const item = dump[name];
  36. if (item === null || item === undefined) {
  37. console.warn(`data in node dump (${path} ${name}) is ${item}!`);
  38. continue;
  39. }
  40. if (typeof item === 'object') {
  41. item.name = name;
  42. item.path = `${path}.${name}`;
  43. // Once parent data has visible = false,itself and children do not collect Assets any more.
  44. let ignoreCollect = false;
  45. if (ignoreCollectAssets) {
  46. ignoreCollect = ignoreCollectAssets;
  47. } else {
  48. ignoreCollect = !item.visible;
  49. }
  50. collectAssets(item, assets, ignoreCollect);
  51. collectGroups(item);
  52. let values;
  53. if (dumps) {
  54. try {
  55. values = dumps.map((dump) => {
  56. if (dump[name]) {
  57. return dump[name].value;
  58. }
  59. });
  60. // When merging dumps, as long as there is a value of readonly is ture, it must be set to true
  61. const readonly = dumps.some(dump => {
  62. if (dump[name]) {
  63. return dump[name].readonly;
  64. }
  65. return false;
  66. });
  67. item.readonly = readonly;
  68. // 仅当存在 value 数据时才添加 values
  69. item.values = values;
  70. } catch (error) {
  71. values = undefined;
  72. }
  73. }
  74. translate(item.value, item.path, values, assets, ignoreCollect);
  75. }
  76. }
  77. }
  78. /**
  79. * 收集节点内的资源
  80. * @param item
  81. * @param assets
  82. */
  83. function collectAssets(dump, assets, ignore) {
  84. if (!ignore && Array.isArray(dump.extends) && dump.value && dump.value.uuid) {
  85. if (dump.extends.includes('cc.Asset')) {
  86. if (!assets[dump.type]) {
  87. assets[dump.type] = {};
  88. }
  89. if (assets[dump.type][dump.value.uuid] === undefined) {
  90. assets[dump.type][dump.value.uuid] = {};
  91. }
  92. // assets[dump.type][dump.value.uuid] 的 keys length 大于 0 是指里面多次使用
  93. assets[dump.type][dump.value.uuid][dump.path] = dump;
  94. }
  95. }
  96. }
  97. function collectGroups(dump) {
  98. if (!dump || !dump.value || typeof dump.value !== 'object') {
  99. return;
  100. }
  101. if (!dump.groups) {
  102. dump.groups = {};
  103. }
  104. for (const name in dump.value) {
  105. const info = dump.value[name];
  106. if (!info) {
  107. continue;
  108. }
  109. if (!info.group) {
  110. if (info.isArray && Array.isArray(info.value)) {
  111. info.value.forEach((item) => {
  112. collectGroups(item);
  113. });
  114. }
  115. continue;
  116. }
  117. if (typeof info.group !== 'object') {
  118. info.group = {
  119. id: 'default',
  120. name: info.group,
  121. };
  122. }
  123. const key = info.group.id || 'default';
  124. if (!dump.groups[key]) {
  125. dump.groups[key] = {
  126. displayOrder: Infinity,
  127. style: 'tab',
  128. };
  129. }
  130. const clone = JSON.parse(JSON.stringify(info.group));
  131. delete clone.id;
  132. delete clone.name;
  133. Object.assign(dump.groups[key], clone);
  134. }
  135. }
  136. /**
  137. * 填充 dump 数据内缺失的数据
  138. * @param dump
  139. * @param dumps
  140. * @param assets 收集节点内的资源
  141. */
  142. function translationDump(dump, dumps, assets) {
  143. dump.active.path = 'active';
  144. dump.name.path = 'name';
  145. if (dump.isScene) {
  146. // 场景节点的数据结构不同,不能多选
  147. return translationSceneDump(dump, dumps, assets);
  148. }
  149. dump.position.path = 'position';
  150. dump.rotation.path = 'rotation';
  151. dump.scale.path = 'scale';
  152. dump.mobility.path = 'mobility';
  153. dump.layer.path = 'layer';
  154. if (dumps) {
  155. dump.active.values = dumps.map((dump) => dump.active.value);
  156. dump.name.values = dumps.map((dump) => dump.name.value);
  157. dump.position.values = dumps.map((dump) => dump.position.value);
  158. dump.rotation.values = dumps.map((dump) => dump.rotation.value);
  159. dump.scale.values = dumps.map((dump) => dump.scale.value);
  160. dump.mobility.values = dumps.map((dump) => dump.mobility.value);
  161. dump.layer.values = dumps.map((dump) => dump.layer.value);
  162. }
  163. for (let i = 0; i < dump.__comps__.length; i++) {
  164. const component = dump.__comps__[i];
  165. component.path = `__comps__.${i}`;
  166. const allow = dumps ? dumps.every((dump) => dump.__comps__[i] && dump.__comps__[i].type === component.type) : true;
  167. if (allow) {
  168. collectGroups(component);
  169. translate(component.value, component.path, dumps ? dumps.map((dump) => dump.__comps__[i].value) : undefined, assets);
  170. } else {
  171. break;
  172. }
  173. }
  174. return dump;
  175. }
  176. function translationSceneDump(dump, dumps, assets) {
  177. dump.autoReleaseAssets.path = 'autoReleaseAssets';
  178. Object.keys(dump._globals).forEach((key) => {
  179. const property = dump._globals[key];
  180. property.name = property.type;
  181. property.path = `_globals.${key}`;
  182. translate(property.value, property.path, dumps ? dumps.map((dump) => dump._globals[key].value) : undefined, assets);
  183. });
  184. }
  185. exports.translationDump = translationDump;