| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- 'use strict';
- function translate(dump, path, dumps, assets, ignoreCollectAssets) {
- const type = typeof dump;
- if (!dump || type !== 'object') {
- return;
- }
- if (Array.isArray(dump)) {
- dump.forEach((item, index) => {
- if (item === null || item === undefined) {
- console.warn(`data in node dump (${path} ${index}) is ${item}!`);
- return;
- }
- if (typeof item === 'object') {
- item.name = `[${index}]`;
- item.path = `${path}.${index}`;
- let values;
- if (dumps) {
- values = dumps.map((dump) => {
- if (dump[index]) {
- return dump[index].value;
- }
- });
- // 仅当存在 value 数据时才添加 values
- item.values = values;
- }
- collectAssets(item, assets, ignoreCollectAssets);
- translate(item.value, item.path, values, assets, ignoreCollectAssets);
- // 如果是数组,内部元素不需要显示 displayName
- delete item.displayName;
- }
- });
- return;
- }
- for (const name of Object.keys(dump)) {
- const item = dump[name];
- if (item === null || item === undefined) {
- console.warn(`data in node dump (${path} ${name}) is ${item}!`);
- continue;
- }
- if (typeof item === 'object') {
- item.name = name;
- item.path = `${path}.${name}`;
- // Once parent data has visible = false,itself and children do not collect Assets any more.
- let ignoreCollect = false;
- if (ignoreCollectAssets) {
- ignoreCollect = ignoreCollectAssets;
- } else {
- ignoreCollect = !item.visible;
- }
- collectAssets(item, assets, ignoreCollect);
- collectGroups(item);
- let values;
- if (dumps) {
- try {
- values = dumps.map((dump) => {
- if (dump[name]) {
- return dump[name].value;
- }
- });
- // When merging dumps, as long as there is a value of readonly is ture, it must be set to true
- const readonly = dumps.some(dump => {
- if (dump[name]) {
- return dump[name].readonly;
- }
- return false;
- });
- item.readonly = readonly;
- // 仅当存在 value 数据时才添加 values
- item.values = values;
- } catch (error) {
- values = undefined;
- }
- }
- translate(item.value, item.path, values, assets, ignoreCollect);
- }
- }
- }
- /**
- * 收集节点内的资源
- * @param item
- * @param assets
- */
- function collectAssets(dump, assets, ignore) {
- if (!ignore && Array.isArray(dump.extends) && dump.value && dump.value.uuid) {
- if (dump.extends.includes('cc.Asset')) {
- if (!assets[dump.type]) {
- assets[dump.type] = {};
- }
- if (assets[dump.type][dump.value.uuid] === undefined) {
- assets[dump.type][dump.value.uuid] = {};
- }
- // assets[dump.type][dump.value.uuid] 的 keys length 大于 0 是指里面多次使用
- assets[dump.type][dump.value.uuid][dump.path] = dump;
- }
- }
- }
- function collectGroups(dump) {
- if (!dump || !dump.value || typeof dump.value !== 'object') {
- return;
- }
- if (!dump.groups) {
- dump.groups = {};
- }
- for (const name in dump.value) {
- const info = dump.value[name];
- if (!info) {
- continue;
- }
- if (!info.group) {
- if (info.isArray && Array.isArray(info.value)) {
- info.value.forEach((item) => {
- collectGroups(item);
- });
- }
- continue;
- }
- if (typeof info.group !== 'object') {
- info.group = {
- id: 'default',
- name: info.group,
- };
- }
- const key = info.group.id || 'default';
- if (!dump.groups[key]) {
- dump.groups[key] = {
- displayOrder: Infinity,
- style: 'tab',
- };
- }
- const clone = JSON.parse(JSON.stringify(info.group));
- delete clone.id;
- delete clone.name;
- Object.assign(dump.groups[key], clone);
- }
- }
- /**
- * 填充 dump 数据内缺失的数据
- * @param dump
- * @param dumps
- * @param assets 收集节点内的资源
- */
- function translationDump(dump, dumps, assets) {
- dump.active.path = 'active';
- dump.name.path = 'name';
- if (dump.isScene) {
- // 场景节点的数据结构不同,不能多选
- return translationSceneDump(dump, dumps, assets);
- }
- dump.position.path = 'position';
- dump.rotation.path = 'rotation';
- dump.scale.path = 'scale';
- dump.mobility.path = 'mobility';
- dump.layer.path = 'layer';
- if (dumps) {
- dump.active.values = dumps.map((dump) => dump.active.value);
- dump.name.values = dumps.map((dump) => dump.name.value);
- dump.position.values = dumps.map((dump) => dump.position.value);
- dump.rotation.values = dumps.map((dump) => dump.rotation.value);
- dump.scale.values = dumps.map((dump) => dump.scale.value);
- dump.mobility.values = dumps.map((dump) => dump.mobility.value);
- dump.layer.values = dumps.map((dump) => dump.layer.value);
- }
- for (let i = 0; i < dump.__comps__.length; i++) {
- const component = dump.__comps__[i];
- component.path = `__comps__.${i}`;
- const allow = dumps ? dumps.every((dump) => dump.__comps__[i] && dump.__comps__[i].type === component.type) : true;
- if (allow) {
- collectGroups(component);
- translate(component.value, component.path, dumps ? dumps.map((dump) => dump.__comps__[i].value) : undefined, assets);
- } else {
- break;
- }
- }
- return dump;
- }
- function translationSceneDump(dump, dumps, assets) {
- dump.autoReleaseAssets.path = 'autoReleaseAssets';
- Object.keys(dump._globals).forEach((key) => {
- const property = dump._globals[key];
- property.name = property.type;
- property.path = `_globals.${key}`;
- translate(property.value, property.path, dumps ? dumps.map((dump) => dump._globals[key].value) : undefined, assets);
- });
- }
- exports.translationDump = translationDump;
|