axesViewerComponent.tsx 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import * as React from "react";
  2. import { Vector3, Tmp } from "babylonjs/Maths/math";
  3. import { TransformNode } from "babylonjs/Meshes/transformNode";
  4. import { AxesViewer } from "babylonjs/Debug/axesViewer";
  5. import { CheckBoxLineComponent } from "../../../lines/checkBoxLineComponent";
  6. import { UtilityLayerRenderer } from 'babylonjs/Rendering/utilityLayerRenderer';
  7. import { GlobalState } from '../../../../globalState';
  8. interface IAxisViewerComponentProps {
  9. node: TransformNode;
  10. globalState: GlobalState;
  11. }
  12. export class AxesViewerComponent extends React.Component<IAxisViewerComponentProps, { displayAxis: boolean }> {
  13. constructor(props: IAxisViewerComponentProps) {
  14. super(props);
  15. const node = this.props.node;
  16. if (!node.reservedDataStore) {
  17. node.reservedDataStore = {};
  18. }
  19. this.state = { displayAxis: (node.reservedDataStore && node.reservedDataStore.axisViewer) ? true : false };
  20. }
  21. shouldComponentUpdate(nextProps: IAxisViewerComponentProps, nextState: { displayAxis: boolean }) {
  22. if (nextProps.node !== this.props.node) {
  23. nextState.displayAxis = (nextProps.node.reservedDataStore && nextProps.node.reservedDataStore.axisViewer) ? true : false;
  24. }
  25. return true;
  26. }
  27. displayAxes() {
  28. const node = this.props.node;
  29. const scene = UtilityLayerRenderer.DefaultUtilityLayer.utilityLayerScene;
  30. if (node.reservedDataStore.axisViewer) {
  31. node.reservedDataStore.axisViewer.dispose();
  32. node.reservedDataStore.axisViewer = null;
  33. scene.onBeforeRenderObservable.remove(node.reservedDataStore.onBeforeRenderObserver);
  34. node.reservedDataStore.onBeforeRenderObserver = null;
  35. this.setState({ displayAxis: false });
  36. return;
  37. }
  38. const viewer = new AxesViewer(scene);
  39. node.reservedDataStore.axisViewer = viewer;
  40. const x = new Vector3(1, 0, 0);
  41. const y = new Vector3(0, 1, 0);
  42. const z = new Vector3(0, 0, 1);
  43. viewer.xAxis.reservedDataStore = { hidden: true };
  44. viewer.yAxis.reservedDataStore = { hidden: true };
  45. viewer.zAxis.reservedDataStore = { hidden: true };
  46. node.reservedDataStore.onBeforeRenderObserver = scene.onBeforeRenderObservable.add(() => {
  47. let cameraMatrix = scene.activeCamera!.getWorldMatrix();
  48. let matrix = node.getWorldMatrix();
  49. let extend = Tmp.Vector3[0];
  50. Vector3.TransformCoordinatesFromFloatsToRef(0, 0, 1, cameraMatrix, extend);
  51. viewer.scaleLines = extend.length() / 10;
  52. viewer.update(node.getAbsolutePosition(), Vector3.TransformNormal(x, matrix), Vector3.TransformNormal(y, matrix), Vector3.TransformNormal(z, matrix));
  53. });
  54. this.setState({ displayAxis: true });
  55. }
  56. render() {
  57. return (
  58. <CheckBoxLineComponent label="Display axes" isSelected={() => this.state.displayAxis} onSelect={() => this.displayAxes()} />
  59. );
  60. }
  61. }