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
178 lines
3.4 KiB
JavaScript
2 months ago
|
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;
|
||
|
|
||
|
};
|