super-hero/extensions/shader-graph/shader-node/assets/operation/utils.ts

170 lines
4.4 KiB
TypeScript

import { EDITOR } from 'cc/env';
import {
SlotConnectType,
SlotDefaultValueType,
SlotDefine,
SlotOrPropType, SlotPropDetail,
TextureConcretePrecision,
} from './type';
import { Vec2, Vec3, Vec4, Color } from 'cc';
const useNpm = (EDITOR || globalThis.electron);
export const Editor = useNpm && globalThis.Editor;
export const projectPath = EDITOR && Editor.Project.path;
export const fs = useNpm && globalThis.require('fs-extra');
export const path = useNpm && globalThis.require('path');
// export const shaderTemplatesDir = path.join(__dirname, '../../compile-shader/shader-templates');
export function getJsonObject(str: string) {
let content;
try {
content = JSON.parse(str);
}
catch (err) {
console.error(err);
}
return content;
}
export function getFloatString(value: number) {
if (typeof value !== 'number') {
return value;
}
let str = value + '';
if (!str.includes('.')) {
str += '.';
}
return str;
}
const ValueElements = {
vector: ['x', 'y', 'z', 'w'],
color: ['r', 'g', 'b', 'a'],
mat4: ['e00', 'e01', 'e02', 'e03'],
};
export function getValueElement(value: any | number, index: number): number {
if (typeof value === 'number') {
return value;
}
let elements;
if (value.x !== undefined) {
elements = ValueElements.vector;
}
else if (value.r !== undefined) {
elements = ValueElements.color;
}
else if (value.e00 !== undefined) {
elements = ValueElements.mat4;
}
return value[elements[index]] || 0;
}
export function getValueElementStr(value: object | number, index: number): string {
return getFloatString(getValueElement(value, index));
}
export function getValueConcretePrecision(value: any) {
let valueConretePresition = 1;
if (typeof value === 'object') {
if (value.w !== undefined || value.a !== undefined) {
valueConretePresition = 4;
}
else if (value.z !== undefined || value.b !== undefined) {
valueConretePresition = 3;
}
else if (value.y !== undefined || value.g !== undefined) {
valueConretePresition = 2;
}
else if (value.m_SerializedTexture !== undefined) {
valueConretePresition = TextureConcretePrecision.Texture2D;
}
else if (value.m_SerializedCubemap !== undefined) {
valueConretePresition = TextureConcretePrecision.TextureCube;
}
}
return valueConretePresition;
}
export function getPrecisionName(precision: number, type: SlotOrPropType) {
let name = '';
if (type === 'boolean') {
name = 'bool';
}
else if (precision === 1) {
name = 'float';
}
else if (precision === 2) {
name = 'vec2';
}
else if (precision === 3) {
name = 'vec3';
}
else if (precision === 4) {
name = 'vec4';
}
else if (precision === TextureConcretePrecision.Texture2D) {
name = 'sampler2D';
}
else if (precision === TextureConcretePrecision.TextureCube) {
name = 'samplerCube';
}
return name;
}
export function getEnumNames(type) {
let names = Object.getOwnPropertyNames(type);
names = names.filter(name => Number.isNaN(Number.parseFloat(name)) && name !== '_name');
return names;
}
export function slot(display: string,
defaultValue: SlotDefaultValueType,
type: SlotOrPropType,
connectType: SlotConnectType,
opts: { [key: string]: any } = {}
): SlotDefine {
const data = { display, default: defaultValue, type, connectType };
Object.assign(data, opts);
return data;
}
export function prop(
display: string,
defaultValue: Vec4 | Vec3 | Vec2 | Number | Color | String | null,
type: SlotOrPropType,
details: SlotPropDetail = {}
) {
const data = { display, default: defaultValue, type };
Object.assign(data, details);
return data as any;
}
export function getEnumDefineName(enumObj, value) {
return `CC_${enumObj._name.replace('Space', '')}_${enumObj[value]}`.toUpperCase();
}
export function getEnumDefine(enumObj, value) {
const name = getEnumDefineName(enumObj, value);
return `#define ${name} 1`;
}
export function ensureEnumDefines(enumObj, define: string) {
getEnumNames(enumObj).forEach(name => {
const def = getEnumDefineName(enumObj, enumObj[name]);
if (!define.includes(def)) {
define += `#define ${def} 0\n`;
}
});
return define;
}