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

103 lines
1.5 KiB

2 years ago
import { LabelElement } from '../../libs/flow.module.js';
import { Object3DEditor } from './Object3DEditor.js';
import { Mesh } from 'three';
export class MeshEditor extends Object3DEditor {
constructor( mesh = null ) {
if ( mesh === null ) {
mesh = new Mesh();
}
super( mesh, 'Mesh' );
this.material = null;
this.meshMaterial = null;
this.defaultMeshMaterial = null;
this._initMaterial();
this.updateDefault();
this.restoreDefault();
this.update();
}
get mesh() {
return this.value;
}
_initMaterial() {
const material = new LabelElement( 'Material' ).setInputColor( 'forestgreen' ).setInput( 1 );
material.onValid( ( source, target, stage ) => {
const object = target.getObject();
if ( object && object.isMaterial !== true ) {
if ( stage === 'dragged' ) {
const name = target.node.getName();
this.editor.tips.error( `"${name}" is not a Material.` );
}
return false;
}
} ).onConnect( () => {
this.meshMaterial = material.getLinkedObject() || this.defaultMeshMaterial;
this.update();
} );
this.add( material );
this.material = material;
}
update() {
super.update();
const mesh = this.mesh;
if ( mesh ) {
mesh.material = this.meshMaterial || this.defaultMeshMaterial;
}
}
updateDefault() {
super.updateDefault();
this.defaultMeshMaterial = this.mesh.material;
}
restoreDefault() {
super.restoreDefault();
this.mesh.material = this.defaultMeshMaterial;
}
}