cameraTreeItemComponent.tsx 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import { Nullable } from "babylonjs/types";
  2. import { Observer } from "babylonjs/Misc/observable";
  3. import { IExplorerExtensibilityGroup } from "babylonjs/Debug/debugLayer";
  4. import { Camera } from "babylonjs/Cameras/camera";
  5. import { Scene } from "babylonjs/scene";
  6. import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
  7. import { faVideo, faCamera } from '@fortawesome/free-solid-svg-icons';
  8. import { TreeItemLabelComponent } from "../treeItemLabelComponent";
  9. import { ExtensionsComponent } from "../extensionsComponent";
  10. import * as React from "react";
  11. interface ICameraTreeItemComponentProps {
  12. camera: Camera,
  13. extensibilityGroups?: IExplorerExtensibilityGroup[],
  14. onClick: () => void
  15. }
  16. export class CameraTreeItemComponent extends React.Component<ICameraTreeItemComponentProps, { isActive: boolean }> {
  17. private _onBeforeRenderObserver: Nullable<Observer<Scene>>;
  18. constructor(props: ICameraTreeItemComponentProps) {
  19. super(props);
  20. const camera = this.props.camera;
  21. const scene = camera.getScene();
  22. this.state = { isActive: scene.activeCamera === camera };
  23. }
  24. setActive(): void {
  25. const camera = this.props.camera;
  26. const scene = camera.getScene();
  27. scene.activeCamera = camera;
  28. camera.attachControl(scene.getEngine().getRenderingCanvas()!, true);
  29. this.setState({ isActive: true });
  30. }
  31. componentDidMount() {
  32. const scene = this.props.camera.getScene();
  33. this._onBeforeRenderObserver = scene.onBeforeRenderObservable.add(() => {
  34. const camera = this.props.camera;
  35. // This will deactivate the previous camera when the camera is changed. Multiple camera's cycle frequently so only do this for single cameras
  36. if (this.state.isActive && scene.activeCameras.length <= 1 && scene.activeCamera !== camera) {
  37. camera.detachControl(scene.getEngine().getRenderingCanvas()!);
  38. }
  39. let newState = scene.activeCamera === camera;
  40. if (newState !== this.state.isActive) {
  41. this.setState({ isActive: newState});
  42. }
  43. })
  44. }
  45. componentWillUnmount() {
  46. if (this._onBeforeRenderObserver) {
  47. const camera = this.props.camera;
  48. const scene = camera.getScene();
  49. scene.onBeforeRenderObservable.remove(this._onBeforeRenderObserver);
  50. }
  51. }
  52. render() {
  53. const isActiveElement = this.state.isActive ? <FontAwesomeIcon icon={faVideo} /> : <FontAwesomeIcon icon={faVideo} className="isNotActive" />;
  54. const scene = this.props.camera.getScene()!;
  55. return (
  56. <div className="cameraTools">
  57. <TreeItemLabelComponent label={this.props.camera.name} onClick={() => this.props.onClick()} icon={faCamera} color="green" />
  58. {
  59. (!scene.activeCameras || scene.activeCameras.length === 0) &&
  60. <div className="activeCamera icon" onClick={() => this.setActive()} title="Set as main camera and attach to controls">
  61. {isActiveElement}
  62. </div>
  63. }
  64. <ExtensionsComponent target={this.props.camera} extensibilityGroups={this.props.extensibilityGroups} />
  65. </div>
  66. )
  67. }
  68. }