ZeroVR/ZeroPacientVR/Assets/Octave3D World Builder/Scripts/Objects/Object Placement/Path/PathObjectPlacement.cs

123 lines
5.2 KiB
C#

#if UNITY_EDITOR
using UnityEngine;
using System;
using System.Collections.Generic;
namespace O3DWB
{
[Serializable]
public class PathObjectPlacement
{
#region Private Variables
[SerializeField]
private ObjectPlacementPath _objectPlacementPath = new ObjectPlacementPath();
#endregion
#region Public Properties
public List<OrientedBox> AllOrientedBoxesInPath { get { return _objectPlacementPath.GetAllOrientedBoxes(); } }
public ObjectPlacementPathSettings PathSettings { get { return _objectPlacementPath.Settings; } }
public ObjectPlacementPathRenderSettings PathRenderSettings { get { return _objectPlacementPath.RenderSettings; } }
public ObjectPlacementExtensionPlaneRenderSettings PathExtensionPlaneRenderSettings { get { return _objectPlacementPath.ExtensionPlaneRenderSettings; } }
public bool IsPathUnderManualConstruction { get { return _objectPlacementPath.IsUnderManualConstruction; } }
#endregion
#region Public Static Functions
public static PathObjectPlacement Get()
{
return ObjectPlacement.Get().PathObjectPlacement;
}
#endregion
#region Public Methods
public void RenderGizmos()
{
_objectPlacementPath.RenderGizmos();
}
public void CancelManualPathConstruction()
{
ObjectPlacementGuide.Active = true;
_objectPlacementPath.CancelManualConstruction();
}
public void HandleMouseMoveEvent(Event e)
{
if (!_objectPlacementPath.IsUnderManualConstruction && ObjectPlacementGuide.ExistsInSceneAndIsActive)
{
ObjectPlacementGuide.Instance.Snap();
AxisAlignment.AlignObjectAxis(ObjectPlacementGuide.SceneObject, PathObjectPlacementSettings.Get().PlacementGuideSurfaceAlignmentSettings, ObjectSnapping.Get().ObjectSnapSurfacePlane.normal);
// Note: This is necessary just in case the placement guide has changed.
_objectPlacementPath.SetStartObject(ObjectPlacementGuide.SceneObject);
}
else if(ObjectPlacementGuide.ExistsInScene) _objectPlacementPath.UpdateForMouseMoveEvent();
}
public void HandleMouseButtonDownEvent(Event e)
{
if (ObjectPlacementGuide.ExistsInScene && _objectPlacementPath.IsUnderManualConstruction && AllShortcutCombos.Instance.PlacePathOnClick.IsActive())
{
e.DisableInSceneView();
List<GameObject> placedHierarchyRoots = Octave3DScene.Get().InstantiateObjectHirarchiesFromPlacementDataCollection(_objectPlacementPath.EndManualConstruction());
ObjectHierarchyRootsWerePlacedInSceneMessage.SendToInterestedListeners(placedHierarchyRoots, ObjectHierarchyRootsWerePlacedInSceneMessage.PlacementType.ObjectPlacement);
if (ObjectPlacementGuide.ExistsInScene) ObjectPlacementGuide.Active = true;
return;
}
if (_objectPlacementPath.IsUnderManualConstruction && AllShortcutCombos.Instance.ManualAttach2NewSegmentsToPath.IsActive())
{
e.DisableInSceneView();
_objectPlacementPath.Attach2NewSegmentsIfUnderManualConstruction();
}
if (!_objectPlacementPath.IsUnderManualConstruction && AllShortcutCombos.Instance.BeginManualPathConstruction.IsActive() && e.InvolvesLeftMouseButton())
{
e.DisableInSceneView();
if(ObjectPlacementGuide.ExistsInScene)
{
_objectPlacementPath.SetStartObject(ObjectPlacementGuide.SceneObject);
_objectPlacementPath.BeginManualConstruction();
if (_objectPlacementPath.IsUnderManualConstruction) ObjectPlacementGuide.Active = false;
}
else Debug.LogWarning("Can not begin path construction because the placement guide does not exist in the scene. Please activate a prefab to start construction.");
}
}
public void HandleKeyboardButtonDownEvent(Event e)
{
if(AllShortcutCombos.Instance.CancelManualPathConstruction.IsActive())
{
e.DisableInSceneView();
CancelManualPathConstruction();
}
else
if(AllShortcutCombos.Instance.ManualRaisePath.IsActive())
{
e.DisableInSceneView();
_objectPlacementPath.ManualRaise();
}
else
if(AllShortcutCombos.Instance.ManualLowerPath.IsActive())
{
e.DisableInSceneView();
_objectPlacementPath.ManualLower();
}
else
if(AllShortcutCombos.Instance.ManualRemoveLast2SegmentsInPath.IsActive())
{
e.DisableInSceneView();
_objectPlacementPath.RemoveLast2SegmentsIfUnderManualConstruction();
}
else
if(AllShortcutCombos.Instance.NextPathExtensionPlane.IsActive())
{
e.DisableInSceneView();
_objectPlacementPath.NextExtensionPlane();
}
}
#endregion
}
}
#endif