You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
218 lines
25 KiB
218 lines
25 KiB
|
1 week ago
|
"use strict";
|
||
|
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||
|
|
if (k2 === undefined) k2 = k;
|
||
|
|
var desc = Object.getOwnPropertyDescriptor(m, k);
|
||
|
|
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
||
|
|
desc = { enumerable: true, get: function() { return m[k]; } };
|
||
|
|
}
|
||
|
|
Object.defineProperty(o, k2, desc);
|
||
|
|
}) : (function(o, m, k, k2) {
|
||
|
|
if (k2 === undefined) k2 = k;
|
||
|
|
o[k2] = m[k];
|
||
|
|
}));
|
||
|
|
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||
|
|
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||
|
|
}) : function(o, v) {
|
||
|
|
o["default"] = v;
|
||
|
|
});
|
||
|
|
var __importStar = (this && this.__importStar) || (function () {
|
||
|
|
var ownKeys = function(o) {
|
||
|
|
ownKeys = Object.getOwnPropertyNames || function (o) {
|
||
|
|
var ar = [];
|
||
|
|
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
||
|
|
return ar;
|
||
|
|
};
|
||
|
|
return ownKeys(o);
|
||
|
|
};
|
||
|
|
return function (mod) {
|
||
|
|
if (mod && mod.__esModule) return mod;
|
||
|
|
var result = {};
|
||
|
|
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
||
|
|
__setModuleDefault(result, mod);
|
||
|
|
return result;
|
||
|
|
};
|
||
|
|
})();
|
||
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
|
exports.Parser = void 0;
|
||
|
|
const logger_1 = require("./logger");
|
||
|
|
const object_util_1 = require("./object-util");
|
||
|
|
const FileUtil = require('./lib/eazax/file-util');
|
||
|
|
const Path = __importStar(require("path"));
|
||
|
|
/**
|
||
|
|
* 用来解析预制体/场景
|
||
|
|
*/
|
||
|
|
var Parser;
|
||
|
|
(function (Parser) {
|
||
|
|
/**
|
||
|
|
* 节点树缓存
|
||
|
|
* @type {{ [key: string]: object }}
|
||
|
|
*/
|
||
|
|
const caches = {};
|
||
|
|
/**
|
||
|
|
* 获取节点树
|
||
|
|
* @param {string} path 路径
|
||
|
|
* @returns {Promise<object>}
|
||
|
|
*/
|
||
|
|
async function getNodeTree(path) {
|
||
|
|
path = Path.normalize(path);
|
||
|
|
if (!caches[path]) {
|
||
|
|
const file = await FileUtil.readFile(path);
|
||
|
|
let data = null;
|
||
|
|
try {
|
||
|
|
data = JSON.parse(file);
|
||
|
|
}
|
||
|
|
catch (error) {
|
||
|
|
(0, logger_1.print)('warn', '文件解析失败', path);
|
||
|
|
(0, logger_1.print)('warn', error);
|
||
|
|
}
|
||
|
|
if (!data) {
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
caches[path] = convert(data);
|
||
|
|
}
|
||
|
|
return caches[path];
|
||
|
|
}
|
||
|
|
Parser.getNodeTree = getNodeTree;
|
||
|
|
/**
|
||
|
|
* 更新缓存
|
||
|
|
* @param {string} path 路径
|
||
|
|
*/
|
||
|
|
async function updateCache(path) {
|
||
|
|
path = Path.normalize(path);
|
||
|
|
if (!caches[path]) {
|
||
|
|
// 本来就没有缓存
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
caches[path] = null;
|
||
|
|
await getNodeTree(path);
|
||
|
|
}
|
||
|
|
Parser.updateCache = updateCache;
|
||
|
|
/**
|
||
|
|
* 将资源解析为节点树
|
||
|
|
* @param {object} source 源数据
|
||
|
|
* @returns {object}
|
||
|
|
*/
|
||
|
|
function convert(source) {
|
||
|
|
const tree = Object.create(null);
|
||
|
|
// 第一个元素
|
||
|
|
const firstElement = source[0];
|
||
|
|
// 最后一个元素
|
||
|
|
const lastElement = source[source.length - 1];
|
||
|
|
// 类型存储在这
|
||
|
|
const type = firstElement.__type__;
|
||
|
|
if (type === 'cc.SceneAsset') {
|
||
|
|
// 场景资源
|
||
|
|
const id = firstElement.scene.__id__;
|
||
|
|
// 获取子节点列表
|
||
|
|
const children = source[id]._children;
|
||
|
|
// 类型
|
||
|
|
tree.type = 'cc.Scene';
|
||
|
|
// ID
|
||
|
|
tree.id = id;
|
||
|
|
// 场景下可以有多个一级节点
|
||
|
|
tree.children = [];
|
||
|
|
for (let i = 0, l = children.length; i < l; i++) {
|
||
|
|
const nodeId = children[i].__id__;
|
||
|
|
convertNode(source, nodeId, tree);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else if (type === 'cc.Prefab') {
|
||
|
|
// 预制体资源
|
||
|
|
const id = firstElement.data.__id__;
|
||
|
|
// 类型
|
||
|
|
tree.type = 'cc.Prefab';
|
||
|
|
// ID
|
||
|
|
tree.id = id;
|
||
|
|
// 预制体本身就是一个节点
|
||
|
|
tree.children = [];
|
||
|
|
convertNode(source, id, tree);
|
||
|
|
}
|
||
|
|
return tree;
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* 解析节点
|
||
|
|
* @param {NodeInfo[]} source 源数据
|
||
|
|
* @param {number} nodeId 节点 ID
|
||
|
|
* @param {TreeNodeInfo} parent 父节点
|
||
|
|
*/
|
||
|
|
function convertNode(source, nodeId, parent) {
|
||
|
|
// 获取节点数据
|
||
|
|
const srcNode = source[nodeId];
|
||
|
|
const node = Object.create(null);
|
||
|
|
// 基本信息
|
||
|
|
node.name = srcNode._name;
|
||
|
|
node.id = nodeId;
|
||
|
|
// TODO 更多类型
|
||
|
|
node.type = srcNode.__type__;
|
||
|
|
// 路径
|
||
|
|
const parentPath = parent.path || null;
|
||
|
|
node.path = parentPath ? `${parentPath}/${node.name}` : node.name;
|
||
|
|
// 预制体引用
|
||
|
|
const srcPrefab = srcNode._prefab;
|
||
|
|
if (srcPrefab) {
|
||
|
|
// 读取prefab数据
|
||
|
|
const id = srcPrefab.__id__;
|
||
|
|
node.prefab = extractValidInfo(source[id]);
|
||
|
|
// 预制体名称特殊一点,节点信息并不包含 _name
|
||
|
|
try {
|
||
|
|
const overrideInfo = source[id + 2];
|
||
|
|
if (overrideInfo.__type__ === 'CCPropertyOverrideInfo') {
|
||
|
|
node.path = parentPath ? `${parentPath}/${overrideInfo.value}` : overrideInfo.value;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
catch (error) {
|
||
|
|
}
|
||
|
|
}
|
||
|
|
// 组件
|
||
|
|
node.components = [];
|
||
|
|
const srcComponents = srcNode._components;
|
||
|
|
if (srcComponents && srcComponents.length > 0) {
|
||
|
|
for (let i = 0, l = srcComponents.length; i < l; i++) {
|
||
|
|
const compId = srcComponents[i].__id__;
|
||
|
|
const component = extractValidInfo(source[compId]);
|
||
|
|
node.components.push(component);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
// 子节点
|
||
|
|
node.children = [];
|
||
|
|
const srcChildren = srcNode._children;
|
||
|
|
if (srcChildren && srcChildren.length > 0) {
|
||
|
|
for (let i = 0, l = srcChildren.length; i < l; i++) {
|
||
|
|
const nodeId = srcChildren[i].__id__;
|
||
|
|
convertNode(source, nodeId, node);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
// 保存到父节点
|
||
|
|
parent.children.push(node);
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* 提取有效信息(含有 uuid)
|
||
|
|
* @param {ExtraInfo} source 源数据
|
||
|
|
* @returns {{ __type__: string, _name: string, fileId?: string }}
|
||
|
|
*/
|
||
|
|
function extractValidInfo(source) {
|
||
|
|
const result = Object.create(null);
|
||
|
|
// 记录有用的属性
|
||
|
|
if (source.__type__ !== undefined) {
|
||
|
|
// 如果是component , 那么这个就是组件名
|
||
|
|
// 如果是自定义component,那么这个就是脚本的uuid(压缩过后)
|
||
|
|
result.__type__ = source.__type__;
|
||
|
|
}
|
||
|
|
if (source._name !== undefined) {
|
||
|
|
result._name = source._name;
|
||
|
|
}
|
||
|
|
if (source.fileId !== undefined) {
|
||
|
|
result.fileId = source.fileId;
|
||
|
|
}
|
||
|
|
// 记录包含 uuid 的属性
|
||
|
|
for (const key in source) {
|
||
|
|
const val = source[key];
|
||
|
|
const contains = object_util_1.ObjectUtil.containsProperty(val, '__uuid__');
|
||
|
|
if (contains) {
|
||
|
|
result[key] = val;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return result;
|
||
|
|
}
|
||
|
|
})(Parser || (exports.Parser = Parser = {}));
|
||
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc291cmNlL3BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxQ0FBaUM7QUFDakMsK0NBQTJDO0FBQzNDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0FBQ2xELDJDQUE2QjtBQUU3Qjs7R0FFRztBQUNILElBQWlCLE1BQU0sQ0FvTHRCO0FBcExELFdBQWlCLE1BQU07SUFDbkI7OztPQUdHO0lBQ0gsTUFBTSxNQUFNLEdBQW9DLEVBQUUsQ0FBQztJQUVuRDs7OztPQUlHO0lBQ0ksS0FBSyxVQUFVLFdBQVcsQ0FBQyxJQUFZO1FBQzFDLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNoQixNQUFNLElBQUksR0FBRyxNQUFNLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0MsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ2hCLElBQUksQ0FBQztnQkFDRCxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDYixJQUFBLGNBQUssRUFBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUM5QixJQUFBLGNBQUssRUFBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDekIsQ0FBQztZQUNELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDUixPQUFPLElBQUksQ0FBQztZQUNoQixDQUFDO1lBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxDQUFD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
|