"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getDeserializeResult = exports.getDependUUIDList = exports.generateEffectAsset = void 0; const path_1 = require("path"); module.paths.push((0, path_1.join)(Editor.App.path, 'node_modules')); const { AssetDB, forEach, Asset } = require('@editor/asset-db'); const effect_utils_1 = require("../effect-utils"); async function loadTexture(assetId) { return new Promise((resolve) => { cc.assetManager.loadAny(assetId, (error, asset) => { if (!error) { resolve(asset); } else { resolve(null); } }); }); } /** * 在 library 里生成对应的 effectAsset 对象 * @param asset 资源数据 * @param code */ // @ts-expect-error async function generateEffectAsset(asset, code) { const name = (0, path_1.basename)(asset.source, (0, path_1.extname)(asset.source)); const effect = await (0, effect_utils_1.buildEffect)(name, code); // 记录 effect 的头文件依赖 // @ts-expect-error forEach((db) => { for (const header of effect.dependencies) { asset.depend((0, path_1.resolve)(db.options.target, 'chunks', header + '.chunk')); } }); const result = new cc.EffectAsset(); Object.assign(result, effect); // 引擎数据结构不变,保留 hideInEditor 属性 if (effect.editor && effect.editor.hide) { result.hideInEditor = true; } for (let n = 0; n < result.techniques.length; n++) { const technique = result.techniques[n]; for (let i = 0; i < technique.passes.length; i++) { const pass = technique.passes[i]; for (const key in pass.properties) { const propInfo = pass.properties[key]; if (typeof propInfo.value === 'string') { const assetId = propInfo.value; if (Editor.Utils.UUID.isUUID(assetId)) { const asset = await loadTexture(assetId); if (asset) { propInfo.value = asset; } } } } } } // 添加 meta 文件中的 combinations if (asset.userData) { if (asset.userData.combinations) { result.combinations = asset.userData.combinations; } if (effect.editor) { asset.userData.editor = effect.editor; } else { // 已存在的需要清空 asset.userData.editor = undefined; } } const serializeJSON = EditorExtends.serialize(result); await asset.saveToLibrary('.json', serializeJSON); const depends = getDependUUIDList(serializeJSON); asset.setData('depends', depends); } exports.generateEffectAsset = generateEffectAsset; function getDependUUIDList(content, uuid) { if (typeof content === 'string') { // 注意:此方法无法匹配出脚本引用的 uuid let arr = content.match(/[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}(@[a-z0-9]+){0,}/g); if (arr) { // https://stackoverflow.com/questions/32813720/nodejs-profiling-parent-in-sliced-string arr = JSON.parse(JSON.stringify(Array.from(new Set(arr)).filter((id) => id !== uuid))); } // const arr = content.match(/"__uuid__":( )?"[^"]+/g); return arr || []; } // console.warn('Unable to extract dependencies properly'); return getDeserializeResult(content).uuids; } exports.getDependUUIDList = getDependUUIDList; function getDeserializeResult(json) { const deserializeDetails = new cc.deserialize.Details(); deserializeDetails.reset(); const MissingClass = EditorExtends.MissingReporter.classInstance; MissingClass.reset(); MissingClass.hasMissingClass = false; const dependScriptID = new Set(); function classFinder(classId) { if (Editor.Utils.UUID.isUUID(classId)) { dependScriptID.add(Editor.Utils.UUID.decompressUUID(classId)); } return MissingClass.classFinder(classId); } const deserializedAsset = cc.deserialize(json, deserializeDetails, { classFinder, }); deserializeDetails.assignAssetsBy(function (uuid, options) { return EditorExtends.serialize.asAsset(uuid); }); return { instance: deserializedAsset, uuids: deserializeDetails.uuidList, dependScriptUuids: Array.from(dependScriptID), classFinder: MissingClass.classFinder, }; } exports.getDeserializeResult = getDeserializeResult; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMtMy44LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ltcG9ydGVyL3V0aWxzLTMuOC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQkFBd0Q7QUFFeEQsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBQSxXQUFJLEVBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQztBQUV6RCxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUloRSxrREFBOEM7QUFLOUMsS0FBSyxVQUFVLFdBQVcsQ0FBQyxPQUFlO0lBQ3RDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUMzQixFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFVLEVBQUUsS0FBVSxFQUFFLEVBQUU7WUFDeEQsSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDUixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDbEI7aUJBQU07Z0JBQ0gsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2pCO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsbUJBQW1CO0FBQ1osS0FBSyxVQUFVLG1CQUFtQixDQUFDLEtBQVksRUFBRSxJQUFZO0lBQ2hFLE1BQU0sSUFBSSxHQUFHLElBQUEsZUFBUSxFQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBQSxjQUFPLEVBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFFM0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFBLDBCQUFXLEVBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBRTdDLG1CQUFtQjtJQUNuQixtQkFBbUI7SUFD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TSxpQkFBaUIsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRTtRQUMvRCxXQUFXO0tBQ2QsQ0FBQyxDQUFDO0lBQ0gsa0JBQWtCLENBQUMsY0FBYyxDQUFDLFVBQVMsSUFBWSxFQUFFLE9BQXdEO1FBQzdHLE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakQsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPO1FBQ0gsUUFBUSxFQUFFLGlCQUFpQjtRQUMzQixLQUFLLEVBQUUsa0JBQWtCLENBQUMsUUFBUTtRQUNsQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUM3QyxXQUFXLEVBQUUsWUFBWSxDQUFDLFdBQVc7S0FDeEMsQ0FBQztBQUNOLENBQUM7QUF6QkQsb0RBeUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYmFzZW5hbWUsIGV4dG5hbWUsIGpvaW4sIHJlc29sdmUgfSBmcm9tICdwYXRoJztcblxubW9kdWxlLnBhdGhzLnB1c2goam9pbihFZGl0b3IuQXBwLnBhdGgsICdub2RlX21vZHVsZXMnKSk7XG5cbmNvbnN0IHsgQXNzZXREQiwgZm9yRWFjaCwgQXNzZXQgfSA9IHJlcXVpcmUoJ0BlZGl0b3IvYXNzZXQtZGInKTtcblxuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgQ0NPTiB9IGZyb20gJ2NjL2VkaXRvci9zZXJpYWxpemF0aW9uJztcbmltcG9ydCB7IGJ1aWxkRWZmZWN0IH0gZnJvbSAnLi4vZWZmZWN0LXV0aWxzJztcblxuZGVjbGFyZSBjb25zdCBFZGl0b3JFeHRlbmRzOiBhbnk7XG5kZWNsYXJlIGNvbnN0IGNjOiBhbnk7XG5cbmFzeW5jIGZ1bmN0aW9uIGxvYWRUZXh0dXJlKGFzc2V0SWQ6IHN0cmluZyk6IFByb21pc2U8YW55IHwgbnVsbD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBjYy5hc3NldE1hbmFnZXIubG9hZEFueShhc3NldElkLCAoZXJyb3I6IGFueSwgYXNzZXQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoYXNzZXQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiDlnKggbGlicmFyeSDph4znlJ/miJDlr7nlupTnmoQgZWZmZWN0QXNzZXQg5a+56LGhXG4gKiBAcGFyYW0gYXNzZXQg6LWE5rqQ5pWw5o2uXG4gKiBAcGFyYW0gY29kZVxuICovXG4vLyBAdHMtZXhwZWN0LWVycm9yXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVFZmZlY3RBc3NldChhc3NldDogQXNzZXQsIGNvZGU6IHN0cmluZyl7XG4gICAgY29uc3QgbmFtZSA9IGJhc2VuYW1lKGFzc2V0LnNvdXJjZSwgZXh0bmFtZShhc3NldC5zb3VyY2UpKTtcblxuICAgIGNvbnN0IGVmZmVjdCA9IGF3YWl0IGJ1aWxkRWZmZWN0KG5hbWUsIGNvZGUpO1xuXG4gICAgLy8g6K6w5b2VIGVmZmVjdCDnmoTlpLTmlofku7bkvp3otZZcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgZm9yRWFjaCgoZGI6IEFzc2V0REIpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBoZWFkZXIgb2YgZWZmZWN0LmRlcGVuZGVuY2llcykge1xuICAgICAgICAgICAgYXNzZXQuZGVwZW5kKHJlc29sdmUoZGIub3B0aW9ucy50YXJnZXQsICdjaHVua3MnLCBoZWFkZXIgKyAnLmNodW5rJykpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBuZXcgY2MuRWZmZWN0QXNzZXQoKTtcbiAgICBPYmplY3QuYXNzaWduKHJlc3VsdCwgZWZmZWN0KTtcblxuICAgIC8vIOW8leaTjuaVsOaNrue7k+aehOS4jeWPmO+8jOS/neeVmSBoaWRlSW5FZGl0b3Ig5bGe5oCnXG4gICAgaWYgKGVmZmVjdC5lZGl0b3IgJiYgZWZmZWN0LmVkaXRvci5oaWRlKSB7XG4gICAgICAgIHJlc3VsdC5oaWRlSW5FZGl0b3IgPSB0cnVlO1xuICAgIH1cblxuICAgIGZvciAobGV0IG4gPSAwOyBuIDwgcmVzdWx0LnRlY2huaXF1ZXMubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgY29uc3QgdGVjaG5pcXVlID0gcmVzdWx0LnRlY2huaXF1ZXNbbl07XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGVjaG5pcXVlLnBhc3Nlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcGFzcyA9IHRlY2huaXF1ZS5wYXNzZXNbaV07XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBwYXNzLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wSW5mbyA9IHBhc3MucHJvcGVydGllc1trZXldO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcEluZm8udmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFzc2V0SWQgPSBwcm9wSW5mby52YWx1ZSBhcyBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIGlmIChFZGl0b3IuVXRpbHMuVVVJRC5pc1VVSUQoYXNzZXRJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFzc2V0ID0gYXdhaXQgbG9hZFRleHR1cmUoYXNzZXRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXNzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wSW5mby52YWx1ZSA9IGFzc2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8g5re75YqgIG1ldGEg5paH5Lu25Lit55qEIGNvbWJpbmF0aW9uc1xuICAgIGlmIChhc3NldC51c2VyRGF0YSkge1xuICAgICAgICBpZiAoYXNzZXQudXNlckRhdGEuY29tYmluYXRpb25zKSB7XG4gICAgICAgICAgICByZXN1bHQuY29tYmluYXRpb25zID0gYXNzZXQudXNlckRhdGEuY29tYmluYXRpb25zO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVmZmVjdC5lZGl0b3IpIHtcbiAgICAgICAgICAgIGFzc2V0LnVzZXJEYXRhLmVkaXRvciA9IGVmZmVjdC5lZGl0b3I7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyDlt7LlrZjlnKjnmoTpnIDopoHmuIXnqbpcbiAgICAgICAgICAgIGFzc2V0LnVzZXJEYXRhLmVkaXRvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNlcmlhbGl6ZUpTT04gPSBFZGl0b3JFeHRlbmRzLnNlcmlhbGl6ZShyZXN1bHQpO1xuICAgIGF3YWl0IGFzc2V0LnNhdmVUb0xpYnJhcnkoJy5qc29uJywgc2VyaWFsaXplSlNPTik7XG5cbiAgICBjb25zdCBkZXBlbmRzID0gZ2V0RGVwZW5kVVVJRExpc3Qoc2VyaWFsaXplSlNPTik7XG4gICAgYXNzZXQuc2V0RGF0YSgnZGVwZW5kcycsIGRlcGVuZHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVwZW5kVVVJRExpc3QoY29udGVudDogc3RyaW5nIHwgQ0NPTiB8IE9iamVjdCwgdXVpZD86IHN0cmluZykge1xuICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8g5rOo5oSP77ya5q2k5pa55rOV5peg5rOV5Yy56YWN5Ye66ISa5pys5byV55So55qEIHV1aWRcbiAgICAgICAgbGV0IGFyciA9IGNvbnRlbnQubWF0Y2goL1thLXowLTldezh9LVthLXowLTldezR9LVthLXowLTldezR9LVthLXowLTldezR9LVthLXowLTldezEyfShAW2EtejAtOV0rKXswLH0vZyk7XG4gICAgICAgIGlmIChhcnIpIHtcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzMyODEzNzIwL25vZGVqcy1wcm9maWxpbmctcGFyZW50LWluLXNsaWNlZC1zdHJpbmdcbiAgICAgICAgICAgIGFyciA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoQXJyYXkuZnJvbShuZXcgU2V0KGFycikpLmZpbHRlcigoaWQpID0+IGlkICE9PSB1dWlkKSkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnN0IGFyciA9IGNvbnRlbnQubWF0Y2goL1wiX191dWlkX19cIjooICk/XCJbXlwiXSsvZyk7XG4gICAgICAgIHJldHVybiBhcnIgfHwgW107XG4gICAgfVxuICAgIC8vIGNvbnNvbGUud2FybignVW5hYmxlIHRvIGV4dHJhY3QgZGVwZW5kZW5jaWVzIHByb3Blcmx5Jyk7XG5cbiAgICByZXR1cm4gZ2V0RGVzZXJpYWxpemVSZXN1bHQoY29udGVudCkudXVpZHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXNlcmlhbGl6ZVJlc3VsdChqc29uOiBDQ09OIHwgT2JqZWN0KSB7XG4gICAgY29uc3QgZGVzZXJpYWxpemVEZXRhaWxzID0gbmV3IGNjLmRlc2VyaWFsaXplLkRldGFpbHMoKTtcbiAgICBkZXNlcmlhbGl6ZURldGFpbHMucmVzZXQoKTtcbiAgICBjb25zdCBNaXNzaW5nQ2xhc3MgPSBFZGl0b3JFeHRlbmRzLk1pc3NpbmdSZXBvcnRlci5jbGFzc0luc3RhbmNlO1xuICAgIE1pc3NpbmdDbGFzcy5yZXNldCgpO1xuICAgIE1pc3NpbmdDbGFzcy5oYXNNaXNzaW5nQ2xhc3MgPSBmYWxzZTtcbiAgICBjb25zdCBkZXBlbmRTY3JpcHRJRCA9IG5ldyBTZXQoKTtcbiAgICBmdW5jdGlvbiBjbGFzc0ZpbmRlcihjbGFzc0lkOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKEVkaXRvci5VdGlscy5VVUlELmlzVVVJRChjbGFzc0lkKSkge1xuICAgICAgICAgICAgZGVwZW5kU2NyaXB0SUQuYWRkKEVkaXRvci5VdGlscy5VVUlELmRlY29tcHJlc3NVVUlEKGNsYXNzSWQpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTWlzc2luZ0NsYXNzLmNsYXNzRmluZGVyKGNsYXNzSWQpO1xuICAgIH1cbiAgICBjb25zdCBkZXNlcmlhbGl6ZWRBc3NldCA9IGNjLmRlc2VyaWFsaXplKGpzb24sIGRlc2VyaWFsaXplRGV0YWlscywge1xuICAgICAgICBjbGFzc0ZpbmRlcixcbiAgICB9KTtcbiAgICBkZXNlcmlhbGl6ZURldGFpbHMuYXNzaWduQXNzZXRzQnkoZnVuY3Rpb24odXVpZDogc3RyaW5nLCBvcHRpb25zOiB7IG93bmVyOiBvYmplY3Q7IHByb3A6IHN0cmluZzsgdHlwZTogRnVuY3Rpb24gfSkge1xuICAgICAgICByZXR1cm4gRWRpdG9yRXh0ZW5kcy5zZXJpYWxpemUuYXNBc3NldCh1dWlkKTtcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBpbnN0YW5jZTogZGVzZXJpYWxpemVkQXNzZXQsXG4gICAgICAgIHV1aWRzOiBkZXNlcmlhbGl6ZURldGFpbHMudXVpZExpc3QsXG4gICAgICAgIGRlcGVuZFNjcmlwdFV1aWRzOiBBcnJheS5mcm9tKGRlcGVuZFNjcmlwdElEKSxcbiAgICAgICAgY2xhc3NGaW5kZXI6IE1pc3NpbmdDbGFzcy5jbGFzc0ZpbmRlcixcbiAgICB9O1xufVxuIl19