|
@@ -10,15 +10,20 @@ import { faSyncAlt, faImage, faCrosshairs, faArrowsAlt, faCompress, faRedoAlt }
|
|
|
import { ExtensionsComponent } from "../extensionsComponent";
|
|
|
import * as React from "react";
|
|
|
|
|
|
+import { GlobalState } from "../../globalState";
|
|
|
+import { UtilityLayerRenderer } from 'babylonjs';
|
|
|
+
|
|
|
interface ISceneTreeItemComponentProps {
|
|
|
scene: Scene;
|
|
|
onRefresh: () => void;
|
|
|
selectedEntity?: any;
|
|
|
extensibilityGroups?: IExplorerExtensibilityGroup[];
|
|
|
onSelectionChangedObservable?: Observable<any>;
|
|
|
+ globalState: GlobalState;
|
|
|
}
|
|
|
|
|
|
export class SceneTreeItemComponent extends React.Component<ISceneTreeItemComponentProps, { isSelected: boolean, isInPickingMode: boolean, gizmoMode: number }> {
|
|
|
+ private _gizmoLayerOnPointerObserver: Nullable<Observer<PointerInfo>>;
|
|
|
private _onPointerObserver: Nullable<Observer<PointerInfo>>;
|
|
|
private _onSelectionChangeObserver: Nullable<Observer<any>>;
|
|
|
private _selectedEntity: any;
|
|
@@ -67,9 +72,11 @@ export class SceneTreeItemComponent extends React.Component<ISceneTreeItemCompon
|
|
|
const manager: GizmoManager = scene.reservedDataStore.gizmoManager;
|
|
|
|
|
|
const className = entity.getClassName();
|
|
|
-
|
|
|
+
|
|
|
if (className === "TransformNode" || className.indexOf("Mesh") !== -1) {
|
|
|
manager.attachToMesh(entity);
|
|
|
+ }else if(className.indexOf("Light") !== -1 && this._selectedEntity.reservedDataStore && this._selectedEntity.reservedDataStore.lightGizmo){
|
|
|
+ manager.attachToMesh(this._selectedEntity.reservedDataStore.lightGizmo.attachedMesh);
|
|
|
}
|
|
|
}
|
|
|
});
|
|
@@ -83,6 +90,11 @@ export class SceneTreeItemComponent extends React.Component<ISceneTreeItemCompon
|
|
|
this._onPointerObserver = null;
|
|
|
}
|
|
|
|
|
|
+ if (this._gizmoLayerOnPointerObserver) {
|
|
|
+ scene.onPointerObservable.remove(this._gizmoLayerOnPointerObserver);
|
|
|
+ this._gizmoLayerOnPointerObserver = null;
|
|
|
+ }
|
|
|
+
|
|
|
if (this._onSelectionChangeObserver && this.props.onSelectionChangedObservable) {
|
|
|
this.props.onSelectionChangedObservable.remove(this._onSelectionChangeObserver);
|
|
|
}
|
|
@@ -108,10 +120,27 @@ export class SceneTreeItemComponent extends React.Component<ISceneTreeItemCompon
|
|
|
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);
|
|
|
-
|
|
|
+
|
|
|
+ // Pick light gizmos first
|
|
|
+ if(this.props.globalState.lightGizmos.length > 0){
|
|
|
+ var gizmoScene = this.props.globalState.lightGizmos[0].gizmoLayer.utilityLayerScene;
|
|
|
+ let pickInfo = gizmoScene.pick(pickPosition.x, pickPosition.y, (m:any)=>{
|
|
|
+ for(var g of (this.props.globalState.lightGizmos as any)){
|
|
|
+ if(g.attachedMesh == m){
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ });
|
|
|
+ if (pickInfo && pickInfo.hit && this.props.onSelectionChangedObservable) {
|
|
|
+ this.props.onSelectionChangedObservable.notifyObservers(pickInfo.pickedMesh);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
if (pickInfo && pickInfo.hit && this.props.onSelectionChangedObservable) {
|
|
|
this.props.onSelectionChangedObservable.notifyObservers(pickInfo.pickedMesh);
|
|
|
}
|
|
|
+
|
|
|
}, PointerEventTypes.POINTERTAP);
|
|
|
}
|
|
|
|
|
@@ -125,11 +154,33 @@ export class SceneTreeItemComponent extends React.Component<ISceneTreeItemCompon
|
|
|
scene.reservedDataStore = {};
|
|
|
}
|
|
|
|
|
|
+ if (this._gizmoLayerOnPointerObserver) {
|
|
|
+ scene.onPointerObservable.remove(this._gizmoLayerOnPointerObserver);
|
|
|
+ this._gizmoLayerOnPointerObserver = null;
|
|
|
+ }
|
|
|
+
|
|
|
if (!scene.reservedDataStore.gizmoManager) {
|
|
|
scene.reservedDataStore.gizmoManager = new GizmoManager(scene);
|
|
|
}
|
|
|
|
|
|
const manager: GizmoManager = scene.reservedDataStore.gizmoManager;
|
|
|
+ // Allow picking of light gizmo when a gizmo mode is selected
|
|
|
+ this._gizmoLayerOnPointerObserver = UtilityLayerRenderer.DefaultUtilityLayer.utilityLayerScene.onPointerObservable.add((pointerInfo)=>{
|
|
|
+ if (pointerInfo.type == PointerEventTypes.POINTERDOWN) {
|
|
|
+ if (pointerInfo.pickInfo && pointerInfo.pickInfo.pickedMesh) {
|
|
|
+ var node: Nullable<any> = pointerInfo.pickInfo.pickedMesh;
|
|
|
+ // Attach to the most parent node
|
|
|
+ while (node && node.parent != null) {
|
|
|
+ node = node.parent;
|
|
|
+ }
|
|
|
+ for(var gizmo of this.props.globalState.lightGizmos){
|
|
|
+ if(gizmo._rootMesh == node){
|
|
|
+ manager.attachToMesh(gizmo.attachedMesh);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
|
|
|
manager.positionGizmoEnabled = false;
|
|
|
manager.rotationGizmoEnabled = false;
|
|
@@ -157,6 +208,8 @@ export class SceneTreeItemComponent extends React.Component<ISceneTreeItemCompon
|
|
|
|
|
|
if (className === "TransformNode" || className.indexOf("Mesh") !== -1) {
|
|
|
manager.attachToMesh(this._selectedEntity);
|
|
|
+ } else if(className.indexOf("Light") !== -1 && this._selectedEntity.reservedDataStore && this._selectedEntity.reservedDataStore.lightGizmo){
|
|
|
+ manager.attachToMesh(this._selectedEntity.reservedDataStore.lightGizmo.attachedMesh);
|
|
|
}
|
|
|
}
|
|
|
}
|