You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

178 lines
3.4 KiB
JavaScript

import { NodePrototypeEditor } from './editors/NodePrototypeEditor.js';
import { ScriptableEditor } from './editors/ScriptableEditor.js';
import { BasicMaterialEditor } from './editors/BasicMaterialEditor.js';
import { StandardMaterialEditor } from './editors/StandardMaterialEditor.js';
import { PointsMaterialEditor } from './editors/PointsMaterialEditor.js';
import { FloatEditor } from './editors/FloatEditor.js';
import { Vector2Editor } from './editors/Vector2Editor.js';
import { Vector3Editor } from './editors/Vector3Editor.js';
import { Vector4Editor } from './editors/Vector4Editor.js';
import { SliderEditor } from './editors/SliderEditor.js';
import { ColorEditor } from './editors/ColorEditor.js';
import { TextureEditor } from './editors/TextureEditor.js';
import { UVEditor } from './editors/UVEditor.js';
import { PreviewEditor } from './editors/PreviewEditor.js';
import { TimerEditor } from './editors/TimerEditor.js';
import { SplitEditor } from './editors/SplitEditor.js';
import { SwizzleEditor } from './editors/SwizzleEditor.js';
import { JoinEditor } from './editors/JoinEditor.js';
import { StringEditor } from './editors/StringEditor.js';
import { FileEditor } from './editors/FileEditor.js';
import { CustomNodeEditor } from './editors/CustomNodeEditor.js';
export const ClassLib = {
BasicMaterialEditor,
StandardMaterialEditor,
PointsMaterialEditor,
FloatEditor,
Vector2Editor,
Vector3Editor,
Vector4Editor,
SliderEditor,
ColorEditor,
TextureEditor,
UVEditor,
TimerEditor,
SplitEditor,
SwizzleEditor,
JoinEditor,
StringEditor,
FileEditor,
ScriptableEditor,
PreviewEditor,
NodePrototypeEditor
};
let nodeList = null;
let nodeListLoading = false;
export const getNodeList = async () => {
if ( nodeList === null ) {
if ( nodeListLoading === false ) {
nodeListLoading = true;
const response = await fetch( './Nodes.json' );
nodeList = await response.json();
} else {
await new Promise( res => {
const verifyNodeList = () => {
if ( nodeList !== null ) {
res();
} else {
window.requestAnimationFrame( verifyNodeList );
}
};
verifyNodeList();
} );
}
}
return nodeList;
};
export const init = async () => {
const nodeList = await getNodeList();
const traverseNodeEditors = ( list ) => {
for ( const node of list ) {
getNodeEditorClass( node );
if ( Array.isArray( node.children ) ) {
traverseNodeEditors( node.children );
}
}
};
traverseNodeEditors( nodeList.nodes );
};
export const getNodeEditorClass = async ( nodeData ) => {
const editorClass = nodeData.editorClass || nodeData.name.replace( / /g, '' );
//
let nodeClass = nodeData.nodeClass || ClassLib[ editorClass ];
if ( nodeClass !== undefined ) {
if ( nodeData.editorClass !== undefined ) {
nodeClass.prototype.icon = nodeData.icon;
}
return nodeClass;
}
//
if ( nodeData.editorURL ) {
const moduleEditor = await import( nodeData.editorURL );
const moduleName = nodeData.editorClass || Object.keys( moduleEditor )[ 0 ];
nodeClass = moduleEditor[ moduleName ];
} else if ( nodeData.shaderNode ) {
const createNodeEditorClass = ( nodeData ) => {
return class extends CustomNodeEditor {
constructor() {
super( nodeData );
}
get className() {
return editorClass;
}
};
};
nodeClass = createNodeEditorClass( nodeData );
}
if ( nodeClass !== null ) {
ClassLib[ editorClass ] = nodeClass;
}
return nodeClass;
};