super-hero/extensions/shader-graph/dist/importer/shader-graph.js

234 lines
32 KiB
JavaScript
Raw Permalink Normal View History

2024-05-29 19:24:12 -07:00
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ShaderGraph = void 0;
const path_1 = require("path");
const js_yaml_1 = require("js-yaml");
const fs_extra_1 = require("fs-extra");
module.paths.push((0, path_1.join)(Editor.App.path, 'node_modules'));
const { Asset } = require('@editor/asset-db');
const block_forge_1 = require("../block-forge");
const shader_graph_1 = require("../shader-graph");
const utils_3_8_1 = require("./utils-3.8");
const VectorDataType = [
'float',
'vec2',
'vec3',
'vec4',
'color',
'enum',
'boolean',
];
class ShaderGraph {
constructor() {
this.shaderNodeClassMap = new Map;
/**
* 用于存储每个 asset 对应的 source
* 导入前先换成 source 替换成 temp 路径下的 effect
* 导入后在替换成原本的 source
*/
this.cacheSourceMap = new Map();
this._initedGraph = false;
}
get assetType() {
return 'cc.EffectAsset';
}
get version() {
return '1.0.0';
}
get name() {
return 'shader-graph';
}
get migrations() {
return [];
}
async initGraph() {
if (this._initedGraph && this.shaderContext?.shaderTemplatesDir) {
return;
}
await Editor.Module.importProjectModule('db://shader-graph/operation/index.ts');
const { ShaderProperty } = await Editor.Module.importProjectModule('db://shader-graph/operation/property.ts');
this.ShaderProperty = ShaderProperty;
const { shaderNodeMap, shaderPropertyMap, shaderNodeClassMap } = await Editor.Module.importProjectModule('db://shader-graph/graph/index.ts');
const { shaderContext } = await Editor.Module.importProjectModule('db://shader-graph/operation/context.ts');
(0, shader_graph_1.declareShaderNodeBlock)(shaderNodeMap);
this.shaderNodeClassMap = shaderNodeClassMap;
this.shaderContext = shaderContext;
shaderContext.shaderTemplatesDir = await Editor.Message.request('asset-db', 'query-path', 'db://shader-graph/../compile-shader/shader-templates');
// shaderContext.shaderTemplatesDir = queryPath('db://shader-graph/../compile-shader/shader-templates');
this._initedGraph = true;
}
createShaderNodes(blockMap) {
const shaderNodeClassMap = this.shaderNodeClassMap;
const shaderContext = this.shaderContext;
for (const uuid in blockMap) {
const block = blockMap[uuid];
if (!block.desc)
continue;
const type = block.desc.type;
let shaderNode = block.shaderNode;
if (!shaderNode) {
const cls = shaderNodeClassMap.get(type);
if (!cls) {
console.error(`Can not find type for ${type}`);
}
shaderNode = new cls();
shaderNode.init();
shaderNode.block = block;
if (!shaderContext.allNodes.includes(shaderNode)) {
shaderContext.allNodes.push(shaderNode);
}
if (type === 'RegisterLocalVar') {
if (!shaderContext.localVars.includes(shaderNode)) {
shaderNode.name = block.getInputPinsList()[1].value.value;
shaderContext.localVars.push(shaderNode);
}
}
if (type === 'GetLocalVar') {
if (!shaderContext.getLocalVars.includes(shaderNode)) {
shaderNode.name = block.getInputPinsList()[0].value.value;
shaderContext.getLocalVars.push(shaderNode);
}
}
if (type === 'PropertyNode') {
shaderNode.name = block.block.details.title;
}
const inputPins = block.getInputPinsList();
for (let i = 0; i < inputPins.length; i++) {
const pin = inputPins[i];
const value = pin.value;
const input = shaderNode.inputs[i];
let slot = shaderNode.getSlotWithSlotName(pin.desc.name);
if (!slot) {
slot = shaderNode.getPropWithName(pin.desc.name);
}
if (VectorDataType.includes(value.dataType)) {
if (slot) {
if (typeof value.value === 'number' || typeof value.value === 'boolean') {
slot.value = value.value;
}
else if (value.dataType === 'color') {
// srgb to linear
slot.value.set(value.value.x * value.value.x, value.value.y * value.value.y, value.value.z * value.value.z, value.value.w);
}
else if (value.dataType === 'enum') {
slot.value = value.value;
}
else if (value.dataType === 'dynamicEnum') {
// TODO
}
else {
slot.value.set(value.value);
}
}
}
}
block.shaderNode = shaderNode;
}
}
}
searchInputs(block) {
const shaderNode = block.shaderNode;
const inputList = block.getInputPinsList();
for (let i = 0; i < inputList.length; i++) {
const pin = inputList[i];
if (!shaderNode.inputs[i]) {
continue;
}
const connectPin = pin.connectPins[0];
if (connectPin) {
const connectBlock = connectPin.block;
const connectShaderNode = connectBlock.shaderNode;
const connectOutIdx = connectPin.block.getOutputPinsList().indexOf(connectPin);
const connectSlot = connectShaderNode.outputs[connectOutIdx];
shaderNode.inputs[i].connectSlots[0] = connectSlot;
connectSlot.connectSlots.push(shaderNode.inputs[i]);
this.searchInputs(connectBlock);
}
else {
shaderNode.inputs[i].connectSlots.length = 0;
}
}
}
async generateMasterNode(graphData) {
await this.initGraph();
const forge = new block_forge_1.Forge(graphData);
const graph = forge.getGraph();
this.shaderContext.reset();
// TODO 这里还需要处理子图的 properties
const properties = graph.details.properties;
if (properties) {
properties.forEach((v) => {
const prop = new this.ShaderProperty(v.type);
prop.name = v.name;
prop.setValue(v.outputPins[0].value);
this.shaderContext.properties.push(prop);
});
}
const blockMap = graph.getBlockMap();
await this.createShaderNodes(blockMap);
let masterBlock;
for (const uuid in blockMap) {
const block = blockMap[uuid];
if (!block.desc)
continue;
const type = block.desc.type;
if (type.includes('MasterNode')) {
masterBlock = block;
}
}
if (!masterBlock) {
throw new Error('Can not find MasterBlock');
}
for (let i = 0; i < this.shaderContext.localVars.length; i++) {
const locVar = this.shaderContext.localVars[i];
await this.searchInputs(locVar.block);
}
await this.searchInputs(masterBlock);
const masterNode = masterBlock.shaderNode;
return masterNode;
}
async generateEffectByGraphData(graphData) {
const masterNode = await this.generateMasterNode(graphData);
return masterNode.generateCode();
}
// @ts-expect-error
async generateEffectByAsset(asset) {
const serializeYAML = await (0, fs_extra_1.readFile)(asset.source, 'utf8');
const graphData = (0, js_yaml_1.load)(serializeYAML);
const code = await this.generateEffectByGraphData(graphData);
(0, fs_extra_1.ensureDirSync)(this.tempEffectCodeDir);
await (0, fs_extra_1.writeFile)(this.getTempEffectCodePath(asset), code);
return code;
}
// @ts-expect-error
existsCacheEffect(asset) {
return (0, fs_extra_1.existsSync)(this.getTempEffectCodePath(asset));
}
/**
* 获取存储 effect code 文件夹
*/
// @ts-expect-error
getTempEffectCodePath(asset) {
return (0, path_1.join)(this.tempEffectCodeDir, `${asset.uuid}.effect`);
}
/**
* 获取存储 effect code 路径
*/
get tempEffectCodeDir() {
return (0, path_1.join)(Editor.Project.tmpDir, `shader-graph`);
}
/**
* 返回是否导入成功的标记
* 如果返回 false imported 标记不会变成 true
* 后续的一系列操作都不会执行
* @param asset
*/
// @ts-expect-error
async import(asset) {
await (0, utils_3_8_1.generateEffectAsset)(asset, await this.generateEffectByAsset(asset));
return true;
}
}
exports.ShaderGraph = ShaderGraph;
exports.default = new ShaderGraph();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhZGVyLWdyYXBoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ltcG9ydGVyL3NoYWRlci1ncmFwaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQkFBNEI7QUFDNUIscUNBQStCO0FBQy9CLHVDQUEwRTtBQUUxRSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFBLFdBQUksRUFBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO0FBRXpELE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUU5QyxnREFBOEM7QUFFOUMsa0RBQXlFO0FBQ3pFLDJDQUFrRDtBQUVsRCxNQUFNLGNBQWMsR0FBRztJQUNuQixPQUFPO0lBQ1AsTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sT0FBTztJQUNQLE1BQU07SUFDTixTQUFTO0NBQ1osQ0FBQztBQUVGLE1BQWEsV0FBVztJQUF4QjtRQWtCSSx1QkFBa0IsR0FBcUIsSUFBSSxHQUFHLENBQUM7UUFJL0M7Ozs7V0FJRztRQUNJLG1CQUFjLEdBQXdCLElBQUksR0FBRyxFQUFFLENBQUM7UUFFdkQsaUJBQVksR0FBRyxLQUFLLENBQUM7SUF3T3pCLENBQUM7SUFuUUcsSUFBSSxTQUFTO1FBQ1QsT0FBTyxnQkFBZ0IsQ0FBQztJQUM1QixDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1AsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUVELElBQUksSUFBSTtRQUNKLE9BQU8sY0FBYyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDVixPQUFPLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFjRCxLQUFLLENBQUMsU0FBUztRQUNYLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLGtCQUFrQixFQUFFO1lBQzdELE9BQU87U0FDVjtRQUVE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