axesViewerComponent.tsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import * as React from "react";
  2. import { TransformNode } from "babylonjs";
  3. import { CheckBoxLineComponent } from "../../../lines/checkBoxLineComponent";
  4. interface IAxisViewerComponentProps {
  5. node: TransformNode
  6. }
  7. export class AxesViewerComponent extends React.Component<IAxisViewerComponentProps, { displayAxis: boolean }> {
  8. constructor(props: IAxisViewerComponentProps) {
  9. super(props);
  10. const node = this.props.node;
  11. if (!node.reservedDataStore) {
  12. node.reservedDataStore = {};
  13. }
  14. this.state = { displayAxis: (node.reservedDataStore && node.reservedDataStore.axisViewer) ? true : false }
  15. }
  16. displayAxes() {
  17. const node = this.props.node;
  18. const scene = node.getScene();
  19. if (node.reservedDataStore.axisViewer) {
  20. node.reservedDataStore.axisViewer.dispose();
  21. node.reservedDataStore.axisViewer = null;
  22. scene.onBeforeRenderObservable.remove(node.reservedDataStore.onBeforeRenderObserver);
  23. node.reservedDataStore.onBeforeRenderObserver = null;
  24. this.setState({ displayAxis: false });
  25. return;
  26. }
  27. const viewer = new BABYLON.Debug.AxesViewer(scene);
  28. node.reservedDataStore.axisViewer = viewer;
  29. const x = new BABYLON.Vector3(1, 0, 0);
  30. const y = new BABYLON.Vector3(0, 1, 0);
  31. const z = new BABYLON.Vector3(0, 0, 1);
  32. viewer.xAxis.reservedDataStore = { hidden: true };
  33. viewer.yAxis.reservedDataStore = { hidden: true };
  34. viewer.zAxis.reservedDataStore = { hidden: true };
  35. node.reservedDataStore.onBeforeRenderObserver = scene.onBeforeRenderObservable.add(() => {
  36. let matrix = node.getWorldMatrix();
  37. let extend = BABYLON.Tmp.Vector3[0];
  38. const worldExtend = scene.getWorldExtends();
  39. worldExtend.max.subtractToRef(worldExtend.min, extend);
  40. extend.scaleInPlace(0.5 * 0.5);
  41. viewer.scaleLines = Math.max(extend.x, extend.y, extend.z) * 2;
  42. viewer.update(node.getAbsolutePosition(), BABYLON.Vector3.TransformNormal(x, matrix), BABYLON.Vector3.TransformNormal(y, matrix), BABYLON.Vector3.TransformNormal(z, matrix));
  43. });
  44. this.setState({ displayAxis: true });
  45. }
  46. render() {
  47. return (
  48. <CheckBoxLineComponent label="Display axes" isSelected={() => this.state.displayAxis} onSelect={() => this.displayAxes()} />
  49. )
  50. }
  51. }