meshTreeItemComponent.tsx 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import { AbstractMesh, IExplorerExtensibilityGroup } from "babylonjs";
  2. import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
  3. import { faCube } from '@fortawesome/free-solid-svg-icons';
  4. import { faEye, faEyeSlash } from '@fortawesome/free-regular-svg-icons';
  5. import { faVectorSquare } from '@fortawesome/free-solid-svg-icons';
  6. import { TreeItemLabelComponent } from "../treeItemLabelComponent";
  7. import { ExtensionsComponent } from "../extensionsComponent";
  8. import * as React from "react";
  9. interface IMeshTreeItemComponentProps {
  10. mesh: AbstractMesh,
  11. extensibilityGroups?: IExplorerExtensibilityGroup[],
  12. onClick: () => void
  13. }
  14. export class MeshTreeItemComponent extends React.Component<IMeshTreeItemComponentProps, { isGizmoEnabled: boolean, isVisible: boolean }> {
  15. constructor(props: IMeshTreeItemComponentProps) {
  16. super(props);
  17. const mesh = this.props.mesh;
  18. this.state = { isGizmoEnabled: mesh.reservedDataStore && mesh.reservedDataStore.gizmo, isVisible: this.props.mesh.isVisible }
  19. }
  20. showGizmos(): void {
  21. const mesh = this.props.mesh;
  22. if (!this.state.isGizmoEnabled) {
  23. if (!mesh.reservedDataStore) {
  24. mesh.reservedDataStore = {};
  25. }
  26. mesh.reservedDataStore.previousParent = mesh.parent;
  27. if (mesh.reservedDataStore.previousParent) {
  28. if (!mesh.reservedDataStore.previousParent.reservedDataStore) {
  29. mesh.reservedDataStore.previousParent.reservedDataStore = {};
  30. }
  31. if (!mesh.reservedDataStore.previousParent.reservedDataStore.detachedChildren) {
  32. mesh.reservedDataStore.previousParent.reservedDataStore.detachedChildren = [];
  33. }
  34. mesh.reservedDataStore.previousParent.reservedDataStore.detachedChildren.push(mesh);
  35. }
  36. const gizmo = new BABYLON.BoundingBoxGizmo(BABYLON.Color3.FromHexString("#0984e3"));
  37. gizmo.attachedMesh = mesh;
  38. gizmo.enableDragBehavior();
  39. gizmo.updateBoundingBox();
  40. gizmo.fixedDragMeshScreenSize = true;
  41. mesh.reservedDataStore.gizmo = gizmo;
  42. this.setState({ isGizmoEnabled: true });
  43. return;
  44. }
  45. const previousParent = mesh.reservedDataStore.previousParent;
  46. mesh.reservedDataStore.gizmo.dispose();
  47. mesh.reservedDataStore.gizmo = null;
  48. mesh.setParent(previousParent);
  49. if (previousParent && previousParent.reservedDataStore) {
  50. previousParent.reservedDataStore.detachedChildren = null;
  51. }
  52. mesh.reservedDataStore.previousParent = null;
  53. mesh.reservedDataStore.pointerDragBehavior = null;
  54. this.setState({ isGizmoEnabled: false });
  55. }
  56. switchVisibility(): void {
  57. const newState = !this.state.isVisible;
  58. this.setState({ isVisible: newState });
  59. this.props.mesh.isVisible = newState;
  60. }
  61. render() {
  62. const mesh = this.props.mesh;
  63. const visibilityElement = this.state.isVisible ? <FontAwesomeIcon icon={faEye} /> : <FontAwesomeIcon icon={faEyeSlash} className="isNotActive" />
  64. return (
  65. <div className="meshTools">
  66. <TreeItemLabelComponent label={mesh.name} onClick={() => this.props.onClick()} icon={faCube} color="dodgerblue" />
  67. <div className={this.state.isGizmoEnabled ? "gizmo selected icon" : "gizmo icon"} onClick={() => this.showGizmos()} title="Show/Hide position gizmo">
  68. <FontAwesomeIcon icon={faVectorSquare} />
  69. </div>
  70. <div className="visibility icon" onClick={() => this.switchVisibility()} title="Show/Hide mesh">
  71. {visibilityElement}
  72. </div>
  73. {
  74. <ExtensionsComponent target={mesh} extensibilityGroups={this.props.extensibilityGroups} />
  75. }
  76. </div>
  77. )
  78. }
  79. }