MeshEditor.js 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import { LabelElement } from '../../libs/flow.module.js';
  2. import { Object3DEditor } from './Object3DEditor.js';
  3. import { Mesh } from 'three';
  4. export class MeshEditor extends Object3DEditor {
  5. constructor( mesh = null ) {
  6. if ( mesh === null ) {
  7. mesh = new Mesh();
  8. }
  9. super( mesh, 'Mesh' );
  10. this.material = null;
  11. this.meshMaterial = null;
  12. this.defaultMeshMaterial = null;
  13. this._initMaterial();
  14. this.updateDefault();
  15. this.restoreDefault();
  16. this.update();
  17. }
  18. get mesh() {
  19. return this.value;
  20. }
  21. _initMaterial() {
  22. const material = new LabelElement( 'Material' ).setInputColor( 'forestgreen' ).setInput( 1 );
  23. material.onValid( ( source, target, stage ) => {
  24. const object = target.getObject();
  25. if ( object && object.isMaterial !== true ) {
  26. if ( stage === 'dragged' ) {
  27. const name = target.node.getName();
  28. this.editor.tips.error( `"${name}" is not a Material.` );
  29. }
  30. return false;
  31. }
  32. } ).onConnect( () => {
  33. this.meshMaterial = material.getLinkedObject() || this.defaultMeshMaterial;
  34. this.update();
  35. } );
  36. this.add( material );
  37. this.material = material;
  38. }
  39. update() {
  40. super.update();
  41. const mesh = this.mesh;
  42. if ( mesh ) {
  43. mesh.material = this.meshMaterial || this.defaultMeshMaterial;
  44. }
  45. }
  46. updateDefault() {
  47. super.updateDefault();
  48. this.defaultMeshMaterial = this.mesh.material;
  49. }
  50. restoreDefault() {
  51. super.restoreDefault();
  52. this.mesh.material = this.defaultMeshMaterial;
  53. }
  54. }