meshTreeItemComponent.tsx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import { AbstractMesh, Mesh, 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. // Connect to gizmo
  37. const dummy = BABYLON.BoundingBoxGizmo.MakeNotPickableAndWrapInBoundingBox(mesh as Mesh);
  38. dummy.reservedDataStore = { hidden: true };
  39. const gizmo = new BABYLON.BoundingBoxGizmo(BABYLON.Color3.FromHexString("#0984e3"));
  40. gizmo.attachedMesh = dummy;
  41. gizmo.updateBoundingBox();
  42. gizmo.fixedDragMeshScreenSize = true;
  43. mesh.reservedDataStore.gizmo = gizmo;
  44. var pointerDragBehavior = new BABYLON.PointerDragBehavior();
  45. pointerDragBehavior.useObjectOrienationForDragging = false;
  46. dummy.addBehavior(pointerDragBehavior);
  47. mesh.reservedDataStore.pointerDragBehavior = pointerDragBehavior;
  48. mesh.reservedDataStore.dummy = dummy;
  49. this.setState({ isGizmoEnabled: true });
  50. return;
  51. }
  52. const previousParent = mesh.reservedDataStore.previousParent;
  53. mesh.removeBehavior(mesh.reservedDataStore.pointerDragBehavior);
  54. mesh.reservedDataStore.gizmo.dispose();
  55. mesh.reservedDataStore.gizmo = null;
  56. mesh.setParent(previousParent);
  57. mesh.reservedDataStore.dummy.dispose();
  58. mesh.reservedDataStore.dummy = null;
  59. if (previousParent && previousParent.reservedDataStore) {
  60. previousParent.reservedDataStore.detachedChildren = null;
  61. }
  62. mesh.reservedDataStore.previousParent = null;
  63. mesh.reservedDataStore.pointerDragBehavior = null;
  64. this.setState({ isGizmoEnabled: false });
  65. }
  66. switchVisibility(): void {
  67. const newState = !this.state.isVisible;
  68. this.setState({ isVisible: newState });
  69. this.props.mesh.isVisible = newState;
  70. }
  71. render() {
  72. const mesh = this.props.mesh;
  73. const visibilityElement = this.state.isVisible ? <FontAwesomeIcon icon={faEye} /> : <FontAwesomeIcon icon={faEyeSlash} className="isNotActive" />
  74. return (
  75. <div className="meshTools">
  76. <TreeItemLabelComponent label={mesh.name} onClick={() => this.props.onClick()} icon={faCube} color="dodgerblue" />
  77. <div className={this.state.isGizmoEnabled ? "gizmo selected icon" : "gizmo icon"} onClick={() => this.showGizmos()} title="Show/Hide position gizmo">
  78. <FontAwesomeIcon icon={faVectorSquare} />
  79. </div>
  80. <div className="visibility icon" onClick={() => this.switchVisibility()} title="Show/Hide mesh">
  81. {visibilityElement}
  82. </div>
  83. {
  84. <ExtensionsComponent target={mesh} extensibilityGroups={this.props.extensibilityGroups} />
  85. }
  86. </div>
  87. )
  88. }
  89. }