123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- import { Scene, Observable, PointerInfo, Observer, Nullable, GizmoManager, IExplorerExtensibilityGroup } from "babylonjs";
- import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
- import { faSyncAlt, faImage, faCrosshairs, faArrowsAlt, faCompress, faRedoAlt } from '@fortawesome/free-solid-svg-icons';
- import { ExtensionsComponent } from "../extensionsComponent";
- import * as React from "react";
- interface ISceneTreeItemComponentProps {
- scene: Scene,
- onRefresh: () => void,
- selectedEntity?: any,
- extensibilityGroups?: IExplorerExtensibilityGroup[],
- onSelectionChangeObservable?: Observable<any>
- }
- export class SceneTreeItemComponent extends React.Component<ISceneTreeItemComponentProps, { isSelected: boolean, isInPickingMode: boolean, gizmoMode: number }> {
- private _onPointerObserver: Nullable<Observer<PointerInfo>>;
- private _onSelectionChangeObserver: Nullable<Observer<any>>;
- constructor(props: ISceneTreeItemComponentProps) {
- super(props);
- const scene = this.props.scene;
- let gizmoMode = 0;
- if (scene.metadata && scene.metadata.gizmoManager) {
- const manager: GizmoManager = scene.metadata.gizmoManager;
- if (manager.positionGizmoEnabled) {
- gizmoMode = 1;
- } else if (manager.rotationGizmoEnabled) {
- gizmoMode = 2;
- } else if (manager.scaleGizmoEnabled) {
- gizmoMode = 3;
- }
- }
- this.state = { isSelected: false, isInPickingMode: false, gizmoMode: gizmoMode };
- }
- shouldComponentUpdate(nextProps: ISceneTreeItemComponentProps, nextState: { isSelected: boolean, isInPickingMode: boolean }) {
- if (nextProps.selectedEntity) {
- if (nextProps.scene === nextProps.selectedEntity) {
- nextState.isSelected = true;
- return true;
- } else {
- nextState.isSelected = false;
- }
- }
- return true;
- }
- componentWillMount() {
- if (!this.props.onSelectionChangeObservable) {
- return;
- }
- const scene = this.props.scene;
- this._onSelectionChangeObserver = this.props.onSelectionChangeObservable.add((entity) => {
- if (scene.metadata && scene.metadata.gizmoManager) {
- const manager: GizmoManager = scene.metadata.gizmoManager;
- const className = entity.getClassName();
- if (className === "TransformNode" || className.indexOf("Mesh") !== -1) {
- manager.attachToMesh(entity);
- }
- }
- });
- }
- componentWillUnmount() {
- const scene = this.props.scene;
- if (this._onPointerObserver) {
- scene.onPointerObservable.remove(this._onPointerObserver);
- this._onPointerObserver = null;
- }
- if (this._onSelectionChangeObserver && this.props.onSelectionChangeObservable) {
- this.props.onSelectionChangeObservable.remove(this._onSelectionChangeObserver);
- }
- }
- onSelect() {
- if (!this.props.onSelectionChangeObservable) {
- return;
- }
- const scene = this.props.scene;
- this.props.onSelectionChangeObservable.notifyObservers(scene);
- }
- onPickingMode() {
- const scene = this.props.scene;
- if (this._onPointerObserver) {
- scene.onPointerObservable.remove(this._onPointerObserver);
- this._onPointerObserver = null;
- }
- if (!this.state.isInPickingMode) {
- this._onPointerObserver = scene.onPointerObservable.add(() => {
- const pickPosition = scene.unTranslatedPointer;
- const pickInfo = scene.pick(pickPosition.x, pickPosition.y, mesh => mesh.isEnabled() && mesh.isVisible && mesh.getTotalVertices() > 0);
- if (pickInfo && pickInfo.hit && this.props.onSelectionChangeObservable) {
- this.props.onSelectionChangeObservable.notifyObservers(pickInfo.pickedMesh);
- }
- }, BABYLON.PointerEventTypes.POINTERTAP)
- }
- this.setState({ isInPickingMode: !this.state.isInPickingMode });
- }
- setGizmoMode(mode: number) {
- const scene = this.props.scene;
- if (!scene.metadata) {
- scene.metadata = {};
- }
- if (!scene.metadata.gizmoManager) {
- scene.metadata.gizmoManager = new GizmoManager(scene);
- }
- const manager: GizmoManager = scene.metadata.gizmoManager;
- manager.positionGizmoEnabled = false;
- manager.rotationGizmoEnabled = false;
- manager.scaleGizmoEnabled = false;
- if (this.state.gizmoMode === mode) {
- mode = 0;
- manager.dispose();
- scene.metadata.gizmoManager = null;
- } else {
- switch (mode) {
- case 1:
- manager.positionGizmoEnabled = true;
- break;
- case 2:
- manager.rotationGizmoEnabled = true;
- break;
- case 3:
- manager.scaleGizmoEnabled = true;
- break;
- }
- }
- this.setState({ gizmoMode: mode });
- }
- render() {
- return (
- <div className={this.state.isSelected ? "itemContainer selected" : "itemContainer"}>
- <div className="sceneNode">
- <div className="sceneTitle" onClick={() => this.onSelect()} >
- <FontAwesomeIcon icon={faImage} /> Scene
- </div>
- <div className={this.state.gizmoMode === 1 ? "translation selected icon" : "translation icon"} onClick={() => this.setGizmoMode(1)} title="Enable/Disable position mode">
- <FontAwesomeIcon icon={faArrowsAlt} />
- </div>
- <div className={this.state.gizmoMode === 2 ? "rotation selected icon" : "rotation icon"} onClick={() => this.setGizmoMode(2)} title="Enable/Disable rotation mode">
- <FontAwesomeIcon icon={faRedoAlt} />
- </div>
- <div className={this.state.gizmoMode === 3 ? "scaling selected icon" : "scaling icon"} onClick={() => this.setGizmoMode(3)} title="Enable/Disable scaling mode">
- <FontAwesomeIcon icon={faCompress} />
- </div>
- <div className="separator" />
- <div className={this.state.isInPickingMode ? "pickingMode selected icon" : "pickingMode icon"} onClick={() => this.onPickingMode()} title="Turn picking mode on/off">
- <FontAwesomeIcon icon={faCrosshairs} />
- </div>
- <div className="refresh icon" onClick={() => this.props.onRefresh()} title="Refresh the explorer">
- <FontAwesomeIcon icon={faSyncAlt} />
- </div>
- {
- <ExtensionsComponent target={this.props.scene} extensibilityGroups={this.props.extensibilityGroups} />
- }
- </div>
- </div>
- )
- }
- }
|