568 lines
29 KiB
C#
568 lines
29 KiB
C#
using System;
|
|
using LE_LevelEditor.Commands;
|
|
using LE_LevelEditor.Core;
|
|
using LE_LevelEditor.Events;
|
|
using LE_LevelEditor.UI;
|
|
using MyUtility;
|
|
using S_SnapTools;
|
|
using UndoRedo;
|
|
using UnityEngine;
|
|
|
|
namespace LE_LevelEditor.Logic
|
|
{
|
|
public class LE_LogicObjects : LE_LogicBase
|
|
{
|
|
private LE_GUI3dObject m_GUI3dObject;
|
|
|
|
public LE_LogicObjects(LE_GUI3dObject p_GUI3dObject, LE_ObjectMap p_objectMap)
|
|
{
|
|
m_GUI3dObject = p_GUI3dObject;
|
|
LE_GUIInterface.EventHandlers events = LE_GUIInterface.Instance.events;
|
|
events.OnObjectEditSpaceBtn = (EventHandler<LE_GUIInterface.EventHandlers.ObjectEditSpaceEventArgs>)Delegate.Combine(events.OnObjectEditSpaceBtn, new EventHandler<LE_GUIInterface.EventHandlers.ObjectEditSpaceEventArgs>(OnObjectEditSpaceBtn));
|
|
LE_GUIInterface.EventHandlers events2 = LE_GUIInterface.Instance.events;
|
|
events2.OnObjectEditModeBtn = (EventHandler<LE_GUIInterface.EventHandlers.ObjectEditModeEventArgs>)Delegate.Combine(events2.OnObjectEditModeBtn, new EventHandler<LE_GUIInterface.EventHandlers.ObjectEditModeEventArgs>(OnObjectEditModeBtn));
|
|
LE_GUIInterface.EventHandlers events3 = LE_GUIInterface.Instance.events;
|
|
events3.OnObjectSelectDraggable = (EventHandler<LE_GUIInterface.EventHandlers.ObjectSelectDraggableEventArgs>)Delegate.Combine(events3.OnObjectSelectDraggable, new EventHandler<LE_GUIInterface.EventHandlers.ObjectSelectDraggableEventArgs>(OnObjectSelectDraggable));
|
|
LE_GUIInterface.EventHandlers events4 = LE_GUIInterface.Instance.events;
|
|
events4.OnSelectedObjectFocusBtn = (System.EventHandler)Delegate.Combine(events4.OnSelectedObjectFocusBtn, new System.EventHandler(OnSelectedObjectFocusBtn));
|
|
LE_GUIInterface.EventHandlers events5 = LE_GUIInterface.Instance.events;
|
|
events5.OnSelectedObjectDuplicateBtn = (System.EventHandler)Delegate.Combine(events5.OnSelectedObjectDuplicateBtn, new System.EventHandler(OnSelectedObjectDuplicateBtn));
|
|
LE_GUIInterface.EventHandlers events6 = LE_GUIInterface.Instance.events;
|
|
events6.OnSelectedPrefabFindBtn = (System.EventHandler)Delegate.Combine(events6.OnSelectedPrefabFindBtn, new System.EventHandler(OnSelectedPrefabFindBtn));
|
|
LE_GUIInterface.EventHandlers events7 = LE_GUIInterface.Instance.events;
|
|
events7.OnSelectedObjectDeleteBtn = (System.EventHandler)Delegate.Combine(events7.OnSelectedObjectDeleteBtn, new System.EventHandler(OnSelectedObjectDeleteBtn));
|
|
LE_GUIInterface.EventHandlers events8 = LE_GUIInterface.Instance.events;
|
|
events8.OnSelectedObjectIsSleepOnStartChanged = (EventHandler<LE_GUIInterface.EventHandlers.BoolEventArgs>)Delegate.Combine(events8.OnSelectedObjectIsSleepOnStartChanged, new EventHandler<LE_GUIInterface.EventHandlers.BoolEventArgs>(OnSelectedObjectIsSleepOnStartChanged));
|
|
LE_GUIInterface.EventHandlers events9 = LE_GUIInterface.Instance.events;
|
|
events9.OnSelectedObjectColorChanged = (EventHandler<LE_GUIInterface.EventHandlers.ColorEventArgs>)Delegate.Combine(events9.OnSelectedObjectColorChanged, new EventHandler<LE_GUIInterface.EventHandlers.ColorEventArgs>(OnSelectedObjectColorChanged));
|
|
LE_GUIInterface.EventHandlers events10 = LE_GUIInterface.Instance.events;
|
|
events10.OnSelectedObjectVariationIndexChanged = (EventHandler<LE_GUIInterface.EventHandlers.IntEventArgs>)Delegate.Combine(events10.OnSelectedObjectVariationIndexChanged, new EventHandler<LE_GUIInterface.EventHandlers.IntEventArgs>(OnSelectedObjectVariationIndexChanged));
|
|
if (p_objectMap != null)
|
|
{
|
|
if (p_objectMap.ObjectPrefabs.Length > 0 || p_objectMap.ObjectPrefabResourcePaths.Length > 0 || p_objectMap.SubObjectMaps.Length > 0)
|
|
{
|
|
if (LE_GUIInterface.Instance.delegates.SetObjects != null)
|
|
{
|
|
LE_GUIInterface.Instance.delegates.SetObjects(p_objectMap);
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("LE_LogicObjects: you have not set the LE_GUIInterface.delegates.SetObjects, but the provided object map is not empty. You have to set this delegate to update your object UI.");
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("LE_LogicObjects: ROOT_OBJECT_MAP was not initialized! You need to set it in the inspector of LE_LevelEditorMain.");
|
|
}
|
|
m_GUI3dObject.ObjectEditMode = LE_EObjectEditMode.MOVE;
|
|
if (LE_GUIInterface.Instance.delegates.SetIsSelectedObjectFocusBtnInteractable == null)
|
|
{
|
|
Debug.LogWarning("LE_LogicObjects: you have not set the LE_GUIInterface.delegates.SetIsSelectedObjectFocusBtnInteractable delegate! It might confuse players if you have a focus button, which is always clickable, but works only when an object is selected. Set this delegate to disable the focus button when no object is selected.");
|
|
}
|
|
if (LE_GUIInterface.Instance.delegates.SetIsSelectedObjectDuplicateBtnInteractable == null)
|
|
{
|
|
Debug.LogWarning("LE_LogicObjects: you have not set the LE_GUIInterface.delegates.SetIsSelectedObjectDuplicateBtnInteractable delegate! It might confuse players if you have a duplicate button, which is always clickable, but works only when an object can be duplicated. Set this delegate to disable the duplicate button when no object is selected or this object cannot be created (e.g. max. count reached in this level).");
|
|
}
|
|
if (LE_GUIInterface.Instance.delegates.SetIsSelectedObjectDeleteBtnInteractable == null)
|
|
{
|
|
Debug.LogWarning("LE_LogicObjects: you have not set the LE_GUIInterface.delegates.SetIsSelectedObjectDeleteBtnInteractable delegate! It might confuse players if you have a delete button, which is always clickable, but works only when an object is selected. Set this delegate to disable the delete button when no object is selected.");
|
|
}
|
|
if (LE_GUIInterface.Instance.delegates.SetIsSelectedObjectSleepPropertyInteractable == null)
|
|
{
|
|
Debug.LogWarning("LE_LogicObjects: you have not set the LE_GUIInterface.delegates.SetIsSelectedObjectSleepPropertyInteractable delegate! It might confuse players if you have a property menu, which is always editable, but applied only to some objects. Set this delegate to disable the 'Is Sleep On Start' property menu when the selected object does not support it.");
|
|
}
|
|
if (LE_GUIInterface.Instance.delegates.SetSelectedObjectIsSleepOnStartPropertyValue == null)
|
|
{
|
|
Debug.LogWarning("LE_LogicObjects: you have not set the LE_GUIInterface.delegates.SetIsSelectedObjectSleepPropertyValue delegate! The value of this property can change every time when an object is selected. Set this delegate to get updates for this property.");
|
|
}
|
|
if (LE_GUIInterface.Instance.delegates.SetIsSelectedObjectColorPropertyInteractable == null)
|
|
{
|
|
Debug.LogWarning("LE_LogicObjects: you have not set the LE_GUIInterface.delegates.SetIsSelectedObjectColorPropertyInteractable delegate! It might confuse players if you have a property menu, which is always editable, but applied only to some objects. Set this delegate to disable the 'Color' property menu when the selected object does not support it.");
|
|
}
|
|
if (LE_GUIInterface.Instance.delegates.SetSelectedObjectColorPropertyValue == null)
|
|
{
|
|
Debug.LogWarning("LE_LogicObjects: you have not set the LE_GUIInterface.delegates.SetSelectedObjectColorPropertyValue delegate! The value of this property can change every time when an object is selected. Set this delegate to get updates for this property.");
|
|
}
|
|
if (LE_GUIInterface.Instance.delegates.SetSelectedObjectVariationPropertyValue == null)
|
|
{
|
|
Debug.LogWarning("LE_LogicObjects: you have not set the LE_GUIInterface.delegates.SetSelectedObjectVariationPropertyValue delegate! The value of this property can change every time when an object is selected. Set this delegate to get updates for this property.");
|
|
}
|
|
}
|
|
|
|
public override void Destroy()
|
|
{
|
|
if (LE_GUIInterface.Instance != null)
|
|
{
|
|
LE_GUIInterface.EventHandlers events = LE_GUIInterface.Instance.events;
|
|
events.OnObjectEditSpaceBtn = (EventHandler<LE_GUIInterface.EventHandlers.ObjectEditSpaceEventArgs>)Delegate.Remove(events.OnObjectEditSpaceBtn, new EventHandler<LE_GUIInterface.EventHandlers.ObjectEditSpaceEventArgs>(OnObjectEditSpaceBtn));
|
|
LE_GUIInterface.EventHandlers events2 = LE_GUIInterface.Instance.events;
|
|
events2.OnObjectEditModeBtn = (EventHandler<LE_GUIInterface.EventHandlers.ObjectEditModeEventArgs>)Delegate.Remove(events2.OnObjectEditModeBtn, new EventHandler<LE_GUIInterface.EventHandlers.ObjectEditModeEventArgs>(OnObjectEditModeBtn));
|
|
LE_GUIInterface.EventHandlers events3 = LE_GUIInterface.Instance.events;
|
|
events3.OnObjectSelectDraggable = (EventHandler<LE_GUIInterface.EventHandlers.ObjectSelectDraggableEventArgs>)Delegate.Remove(events3.OnObjectSelectDraggable, new EventHandler<LE_GUIInterface.EventHandlers.ObjectSelectDraggableEventArgs>(OnObjectSelectDraggable));
|
|
LE_GUIInterface.EventHandlers events4 = LE_GUIInterface.Instance.events;
|
|
events4.OnSelectedObjectFocusBtn = (System.EventHandler)Delegate.Remove(events4.OnSelectedObjectFocusBtn, new System.EventHandler(OnSelectedObjectFocusBtn));
|
|
LE_GUIInterface.EventHandlers events5 = LE_GUIInterface.Instance.events;
|
|
events5.OnSelectedObjectDuplicateBtn = (System.EventHandler)Delegate.Remove(events5.OnSelectedObjectDuplicateBtn, new System.EventHandler(OnSelectedObjectDuplicateBtn));
|
|
LE_GUIInterface.EventHandlers events6 = LE_GUIInterface.Instance.events;
|
|
events6.OnSelectedObjectDeleteBtn = (System.EventHandler)Delegate.Remove(events6.OnSelectedObjectDeleteBtn, new System.EventHandler(OnSelectedObjectDeleteBtn));
|
|
LE_GUIInterface.EventHandlers events7 = LE_GUIInterface.Instance.events;
|
|
events7.OnSelectedObjectIsSleepOnStartChanged = (EventHandler<LE_GUIInterface.EventHandlers.BoolEventArgs>)Delegate.Remove(events7.OnSelectedObjectIsSleepOnStartChanged, new EventHandler<LE_GUIInterface.EventHandlers.BoolEventArgs>(OnSelectedObjectIsSleepOnStartChanged));
|
|
LE_GUIInterface.EventHandlers events8 = LE_GUIInterface.Instance.events;
|
|
events8.OnSelectedObjectColorChanged = (EventHandler<LE_GUIInterface.EventHandlers.ColorEventArgs>)Delegate.Remove(events8.OnSelectedObjectColorChanged, new EventHandler<LE_GUIInterface.EventHandlers.ColorEventArgs>(OnSelectedObjectColorChanged));
|
|
LE_GUIInterface.EventHandlers events9 = LE_GUIInterface.Instance.events;
|
|
events9.OnSelectedObjectVariationIndexChanged = (EventHandler<LE_GUIInterface.EventHandlers.IntEventArgs>)Delegate.Remove(events9.OnSelectedObjectVariationIndexChanged, new EventHandler<LE_GUIInterface.EventHandlers.IntEventArgs>(OnSelectedObjectVariationIndexChanged));
|
|
}
|
|
}
|
|
|
|
public override void Update()
|
|
{
|
|
bool flag = m_GUI3dObject.SelectedObject != null;
|
|
bool obj = flag && m_GUI3dObject.IsObjectPlaceable(m_GUI3dObject.SelectedObject, m_GUI3dObject.SelectedObject.name);
|
|
if (LE_GUIInterface.Instance.delegates.SetIsSelectedObjectFocusBtnInteractable != null)
|
|
{
|
|
LE_GUIInterface.Instance.delegates.SetIsSelectedObjectFocusBtnInteractable(flag);
|
|
}
|
|
if (LE_GUIInterface.Instance.delegates.SetIsSelectedObjectDuplicateBtnInteractable != null)
|
|
{
|
|
LE_GUIInterface.Instance.delegates.SetIsSelectedObjectDuplicateBtnInteractable(obj);
|
|
}
|
|
if (LE_GUIInterface.Instance.delegates.SetIsSelectedObjectDeleteBtnInteractable != null)
|
|
{
|
|
LE_GUIInterface.Instance.delegates.SetIsSelectedObjectDeleteBtnInteractable(flag);
|
|
}
|
|
if (LE_GUIInterface.Instance.delegates.SetIsSelectedPrefabFindBtnInteractable != null)
|
|
{
|
|
LE_GUIInterface.Instance.delegates.SetIsSelectedPrefabFindBtnInteractable(m_GUI3dObject.IsSceneInstanceFound);
|
|
}
|
|
bool flag2 = flag && m_GUI3dObject.SelectedObject.IsRigidbodySleepingStartEditable && m_GUI3dObject.SelectedObject.IsWithRigidbodies;
|
|
if (LE_GUIInterface.Instance.delegates.SetIsSelectedObjectSleepPropertyInteractable != null)
|
|
{
|
|
LE_GUIInterface.Instance.delegates.SetIsSelectedObjectSleepPropertyInteractable(flag2);
|
|
}
|
|
if (flag2 && LE_GUIInterface.Instance.delegates.SetSelectedObjectIsSleepOnStartPropertyValue != null)
|
|
{
|
|
LE_GUIInterface.Instance.delegates.SetSelectedObjectIsSleepOnStartPropertyValue(m_GUI3dObject.SelectedObject.IsRigidbodySleepingStart);
|
|
}
|
|
bool flag3 = flag && m_GUI3dObject.SelectedObject.IsWithColorProperty;
|
|
if (LE_GUIInterface.Instance.delegates.SetIsSelectedObjectColorPropertyInteractable != null)
|
|
{
|
|
LE_GUIInterface.Instance.delegates.SetIsSelectedObjectColorPropertyInteractable(flag3);
|
|
}
|
|
if (flag3 && LE_GUIInterface.Instance.delegates.SetSelectedObjectColorPropertyValue != null)
|
|
{
|
|
LE_GUIInterface.Instance.delegates.SetSelectedObjectColorPropertyValue(m_GUI3dObject.SelectedObject.ColorProperty);
|
|
}
|
|
if (LE_GUIInterface.Instance.delegates.SetSelectedObjectVariationPropertyValue != null)
|
|
{
|
|
if (flag)
|
|
{
|
|
LE_GUIInterface.Instance.delegates.SetSelectedObjectVariationPropertyValue(m_GUI3dObject.SelectedObject.VariationsDefaultIndex, m_GUI3dObject.SelectedObject.Variations);
|
|
}
|
|
else
|
|
{
|
|
LE_GUIInterface.Instance.delegates.SetSelectedObjectVariationPropertyValue(0, null);
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void OnNewObjectSnapped(LE_GUI3dObject p_gui3d, LE_Object p_newObject, S_SnapToObjectEventArgs p_args)
|
|
{
|
|
if (p_newObject != null)
|
|
{
|
|
LE_Object componentInParent = p_args.Source.GetComponentInParent<LE_Object>();
|
|
LE_Object component = p_args.NewInstance.GetComponent<LE_Object>();
|
|
p_gui3d.MarkSnapPointAsUsed(componentInParent, component, p_args.Source);
|
|
if (component.RootSnapPointIndex != -1)
|
|
{
|
|
p_gui3d.MarkSnapPointAsUsed(component, componentInParent, component.RootSnapPointIndex);
|
|
}
|
|
OnNewObjectPlaced(p_gui3d, p_newObject);
|
|
}
|
|
}
|
|
|
|
public static void DeleteObject(LE_GUI3dObject p_gui3d, LE_Object p_selectedObject)
|
|
{
|
|
if (p_selectedObject != null)
|
|
{
|
|
p_gui3d.ReactivateSnapPoints(p_selectedObject.UID, p_selectedObject.ObjectSnapPoints.Length);
|
|
UnityEngine.Object.Destroy(p_selectedObject.gameObject);
|
|
p_selectedObject.name = "deleted";
|
|
p_gui3d.UpdateIsObjectPlaceable();
|
|
if (LE_EventInterface.OnChangeLevelData != null)
|
|
{
|
|
LE_EventInterface.OnChangeLevelData(p_selectedObject.gameObject, new LE_LevelDataChangedEvent(LE_ELevelDataChangeType.OBJECT_DELETE));
|
|
}
|
|
}
|
|
}
|
|
|
|
public static LE_Object PlaceObject(LE_GUI3dObject p_gui3d, LE_Object p_prefab, Vector3 p_position, Quaternion p_rotation, Vector3 p_scale, string p_objectResourcePath, bool p_isDestroyClonedScripts)
|
|
{
|
|
return PlaceObject(p_gui3d, p_prefab, p_position, p_rotation, p_scale, p_objectResourcePath, p_isDestroyClonedScripts, -1);
|
|
}
|
|
|
|
public static LE_Object PlaceObject(LE_GUI3dObject p_gui3d, LE_Object p_prefab, Vector3 p_position, Quaternion p_rotation, Vector3 p_scale, string p_objectResourcePath, bool p_isDestroyClonedScripts, int p_customUID)
|
|
{
|
|
LE_Object lE_Object = InstantiateObject(p_prefab, p_position, p_rotation, p_scale, p_objectResourcePath);
|
|
if (p_customUID > 0)
|
|
{
|
|
lE_Object.UID = p_customUID;
|
|
}
|
|
if (p_isDestroyClonedScripts)
|
|
{
|
|
LE_ObjectEditHandle componentInChildren = lE_Object.GetComponentInChildren<LE_ObjectEditHandle>();
|
|
if (componentInChildren != null)
|
|
{
|
|
UnityEngine.Object.Destroy(componentInChildren.gameObject);
|
|
}
|
|
S_SnapToWorld component = lE_Object.GetComponent<S_SnapToWorld>();
|
|
if (component != null)
|
|
{
|
|
UnityEngine.Object.Destroy(component);
|
|
}
|
|
S_SnapToGrid component2 = lE_Object.GetComponent<S_SnapToGrid>();
|
|
if (component2 != null)
|
|
{
|
|
UnityEngine.Object.Destroy(component2);
|
|
}
|
|
S_SnapToObject[] componentsInChildren = lE_Object.GetComponentsInChildren<S_SnapToObject>(true);
|
|
for (int i = 0; i < componentsInChildren.Length; i++)
|
|
{
|
|
LE_ObjectSnapPoint.DestroySnapSystem(componentsInChildren[i]);
|
|
}
|
|
UtilityOnDestroyHandler component3 = lE_Object.GetComponent<UtilityOnDestroyHandler>();
|
|
if (component3 != null)
|
|
{
|
|
component3.DestroyWithoutHandling();
|
|
}
|
|
}
|
|
OnNewObjectPlaced(p_gui3d, lE_Object);
|
|
return lE_Object;
|
|
}
|
|
|
|
public static LE_Object InstantiateObject(LE_Object p_prefab, Vector3 p_position, Quaternion p_rotation, Vector3 p_scale, string p_objectResourcePath)
|
|
{
|
|
LE_Object lE_Object = UnityEngine.Object.Instantiate(p_prefab);
|
|
lE_Object.name = p_objectResourcePath;
|
|
lE_Object.transform.position = p_position;
|
|
lE_Object.transform.rotation = p_rotation;
|
|
lE_Object.transform.localScale = p_scale;
|
|
return lE_Object;
|
|
}
|
|
|
|
public static void OnNewObjectPlaced(LE_GUI3dObject p_gui3d, LE_Object p_newInstance)
|
|
{
|
|
ApplyRandomity(p_newInstance);
|
|
ApplyColor(p_newInstance, p_newInstance.ColorProperty);
|
|
ApplyVariation(p_newInstance, p_newInstance.VariationsDefaultIndex);
|
|
p_newInstance.SolveCollisionAndDeactivateRigidbody();
|
|
AddSnappingScripts(p_gui3d, p_newInstance);
|
|
SelectNewObjectAndNotifyListeners(p_gui3d, p_newInstance);
|
|
}
|
|
|
|
public static void SelectNewObjectAndNotifyListeners(LE_GUI3dObject p_gui3d, LE_Object p_newInstance)
|
|
{
|
|
p_gui3d.SelectObject(p_newInstance);
|
|
p_gui3d.UpdateIsObjectPlaceable();
|
|
if (LE_EventInterface.OnChangeLevelData != null)
|
|
{
|
|
LE_EventInterface.OnChangeLevelData(p_newInstance, new LE_LevelDataChangedEvent(LE_ELevelDataChangeType.OBJECT_PLACE));
|
|
}
|
|
if (LE_EventInterface.OnObjectPlaced != null)
|
|
{
|
|
LE_EventInterface.OnObjectPlaced(p_gui3d, new LE_ObjectPlacedEvent(p_newInstance));
|
|
}
|
|
}
|
|
|
|
public static void ApplyRandomity(LE_Object p_newInstance)
|
|
{
|
|
Vector3 a = new Vector3(Mathf.Clamp(p_newInstance.RotationRndEulerX * 0.5f, 0f, 360f), Mathf.Clamp(p_newInstance.RotationRndEulerY * 0.5f, 0f, 360f), Mathf.Clamp(p_newInstance.RotationRndEulerZ * 0.5f, 0f, 360f));
|
|
if (a.sqrMagnitude > 0.0001f)
|
|
{
|
|
p_newInstance.transform.localEulerAngles += Vector3.Scale(a, UnityEngine.Random.insideUnitSphere);
|
|
}
|
|
if (p_newInstance.UniformScaleRnd > 0f)
|
|
{
|
|
Vector3 vector = new Vector3((!p_newInstance.IsScaleableOnX) ? 0f : 1f, (!p_newInstance.IsScaleableOnY) ? 0f : 1f, (!p_newInstance.IsScaleableOnZ) ? 0f : 1f);
|
|
p_newInstance.transform.localScale += vector * p_newInstance.UniformScaleRnd * (UnityEngine.Random.value - 0.5f);
|
|
}
|
|
}
|
|
|
|
public static void ApplyColor(LE_Object p_instance, Color p_color)
|
|
{
|
|
if (p_instance.IsWithColorProperty)
|
|
{
|
|
p_instance.ColorProperty = p_color;
|
|
}
|
|
}
|
|
|
|
public static void ApplyVariation(LE_Object p_instance, int p_variationIndex)
|
|
{
|
|
if (p_instance.Variations.Length == 1)
|
|
{
|
|
p_instance.Variations[0].Apply(p_instance);
|
|
ApplyColor(p_instance, p_instance.ColorProperty);
|
|
}
|
|
else if (p_instance.Variations.Length > 1)
|
|
{
|
|
if (p_variationIndex < 0 || p_variationIndex >= p_instance.Variations.Length)
|
|
{
|
|
Debug.LogError("LE_LogicObjects: ApplyVariation: p_variationIndex '" + p_variationIndex + "' is out of bounds [0," + (p_instance.Variations.Length - 1) + "]");
|
|
}
|
|
else
|
|
{
|
|
p_instance.VariationsDefaultIndex = p_variationIndex;
|
|
p_instance.Variations[p_variationIndex].Apply(p_instance);
|
|
ApplyColor(p_instance, p_instance.ColorProperty);
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void AddSnappingScripts(LE_GUI3dObject p_gui3d, LE_Object p_newObject)
|
|
{
|
|
if (p_newObject != null)
|
|
{
|
|
if (p_newObject.SnapType == LE_Object.ESnapType.SNAP_TO_OBJECT)
|
|
{
|
|
AddObjectSnapping(p_gui3d, p_newObject);
|
|
}
|
|
else if (p_newObject.SnapType == LE_Object.ESnapType.SNAP_TO_TERRAIN)
|
|
{
|
|
AddTerrainSnapping(p_gui3d, p_newObject);
|
|
}
|
|
else if (p_newObject.SnapType == LE_Object.ESnapType.SNAP_TO_3D_GRID || p_newObject.SnapType == LE_Object.ESnapType.SNAP_TO_2D_GRID_AND_TERRAIN)
|
|
{
|
|
AddGridSnapping(p_gui3d, p_newObject, false);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("LE_GUI3dObject: AddSnappingScripts: passed object is null!");
|
|
}
|
|
}
|
|
|
|
public static void AddObjectSnapping(LE_GUI3dObject p_gui3d, LE_Object p_newObject)
|
|
{
|
|
for (int i = 0; i < p_newObject.ObjectSnapPoints.Length; i++)
|
|
{
|
|
if (p_newObject.ObjectSnapPoints[i] != null)
|
|
{
|
|
Material p_materialLine = null;
|
|
Material p_materialFill = null;
|
|
if (p_newObject.IsDrawSnapToObjectUI)
|
|
{
|
|
p_materialLine = (Material)Resources.Load("SnapToObjectUIMaterial_Line");
|
|
p_materialFill = (Material)Resources.Load("SnapToObjectUIMaterial_Fill");
|
|
}
|
|
S_SnapToObject s_SnapToObject = p_newObject.ObjectSnapPoints[i].InstatiateSnapSystem((GameObject)UnityEngine.Object.Instantiate(Resources.Load("ObjectSnapButtonVisuals")), p_newObject.IsDrawSnapToObjectUI, p_materialLine, p_materialFill);
|
|
if (s_SnapToObject != null)
|
|
{
|
|
string snapPointUID = GetSnapPointUID(p_newObject.UID, i);
|
|
p_gui3d.AddSnapPoint(snapPointUID, s_SnapToObject);
|
|
if (!p_gui3d.IsSnapToObjectActive)
|
|
{
|
|
s_SnapToObject.gameObject.SetActive(false);
|
|
}
|
|
p_gui3d.LoadSnapCounter(snapPointUID, s_SnapToObject);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("LE_GUI3dObject: AddObjectSnapping: object '" + p_newObject.name + "' has a nullpointer in the ObjectSnapPoints array at index '" + i + "'!");
|
|
}
|
|
}
|
|
}
|
|
|
|
public static string GetSnapPointUID(int p_objectUID, int p_snapPointIndex)
|
|
{
|
|
return p_objectUID + "_" + p_snapPointIndex;
|
|
}
|
|
|
|
public static void AddTerrainSnapping(LE_GUI3dObject p_gui3d, LE_Object p_newObject)
|
|
{
|
|
S_SnapToWorld worldSnap = p_newObject.gameObject.AddComponent<S_SnapToWorld>();
|
|
worldSnap.SnapToLayers = 1 << p_gui3d.TERRAIN_LAYER;
|
|
worldSnap.SnapFrameRate = -1;
|
|
worldSnap.IsRotationSnap = p_newObject.IsPlacementRotationByNormal;
|
|
worldSnap.DoSnap();
|
|
EventHandler<LE_LevelDataChangedEvent> snapUpdateFunct = delegate(object p_object, LE_LevelDataChangedEvent p_args)
|
|
{
|
|
if (p_args.ChangeType == LE_ELevelDataChangeType.TERRAIN_HEIGHTS || (p_object is LE_ObjectEditHandle && (((LE_ObjectEditHandle)p_object).Target == p_newObject.transform || ((LE_ObjectEditHandle)p_object).transform.IsChildOf(p_newObject.transform))))
|
|
{
|
|
worldSnap.DoSnap();
|
|
}
|
|
};
|
|
LE_EventInterface.OnChangeLevelData = (EventHandler<LE_LevelDataChangedEvent>)Delegate.Combine(LE_EventInterface.OnChangeLevelData, snapUpdateFunct);
|
|
p_newObject.gameObject.AddComponent<UtilityOnDestroyHandler>().m_onDestroy = delegate
|
|
{
|
|
LE_EventInterface.OnChangeLevelData = (EventHandler<LE_LevelDataChangedEvent>)Delegate.Remove(LE_EventInterface.OnChangeLevelData, snapUpdateFunct);
|
|
};
|
|
}
|
|
|
|
public static void AddGridSnapping(LE_GUI3dObject p_gui3d, LE_Object p_newObject, bool p_isPreview)
|
|
{
|
|
S_SnapToGrid s_SnapToGrid = p_newObject.gameObject.AddComponent<S_SnapToGrid>();
|
|
s_SnapToGrid.GridOffset = p_newObject.SnapGridOffset;
|
|
s_SnapToGrid.GridCellSize = p_newObject.SnapGridCellSize;
|
|
s_SnapToGrid.SnapCondition = ((!p_isPreview) ? S_SnapToGrid.ESnapCondition.WHEN_STILL : S_SnapToGrid.ESnapCondition.ON_UPDATE);
|
|
s_SnapToGrid.IsInstantSnap = p_isPreview;
|
|
bool flag = (s_SnapToGrid.IsSnapAxisZRotation = false);
|
|
flag = (s_SnapToGrid.IsSnapAxisYRotation = flag);
|
|
s_SnapToGrid.IsSnapAxisXRotation = flag;
|
|
if (p_newObject.SnapType == LE_Object.ESnapType.SNAP_TO_2D_GRID_AND_TERRAIN)
|
|
{
|
|
s_SnapToGrid.IsSnapAxisY = false;
|
|
if (!p_isPreview)
|
|
{
|
|
AddTerrainSnapping(p_gui3d, p_newObject);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void OnObjectEditSpaceBtn(object p_obj, LE_GUIInterface.EventHandlers.ObjectEditSpaceEventArgs p_args)
|
|
{
|
|
m_GUI3dObject.ObjectEditSpace = p_args.EditSpace;
|
|
}
|
|
|
|
private void OnObjectEditModeBtn(object p_obj, LE_GUIInterface.EventHandlers.ObjectEditModeEventArgs p_args)
|
|
{
|
|
m_GUI3dObject.ObjectEditMode = p_args.EditMode;
|
|
}
|
|
|
|
private void OnObjectSelectDraggable(object p_obj, LE_GUIInterface.EventHandlers.ObjectSelectDraggableEventArgs p_args)
|
|
{
|
|
m_GUI3dObject.SetDraggableObject(p_args.ObjPrefab, p_args.ResourcePath);
|
|
}
|
|
|
|
private void OnSelectedObjectFocusBtn(object p_obj, EventArgs p_args)
|
|
{
|
|
if (m_GUI3dObject.SelectedObject != null)
|
|
{
|
|
m_GUI3dObject.Focus();
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("LE_LogicObject: OnSelectedObjectFocusBtn: you have triggered the focus button behaviour, but there is no object selected! You should listen to the LE_GUIInterface.delegates.SetIsSelectedObjectFocusBtnInteractable and change the button's state accordingly. This will prevent users from getting irritated by not working buttons.");
|
|
}
|
|
}
|
|
|
|
private void OnSelectedObjectDuplicateBtn(object p_obj, EventArgs p_args)
|
|
{
|
|
if (m_GUI3dObject.SelectedObject != null)
|
|
{
|
|
m_GUI3dObject.CloneObject();
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("LE_LogicObject: OnSelectedObjectDuplicateBtn: you have triggered the duplicate button behaviour, but there is no object selected! You should listen to the LE_GUIInterface.delegates.SetIsSelectedObjectDuplicateBtnInteractable and change the button's state accordingly. This will prevent users from getting irritated by not working buttons.");
|
|
}
|
|
}
|
|
|
|
private void OnSelectedPrefabFindBtn(object p_obj, EventArgs p_args)
|
|
{
|
|
if (m_GUI3dObject.SelectedPrefab != null)
|
|
{
|
|
m_GUI3dObject.SelectNFocusPrefabInstanceInScene();
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("LE_LogicObject: OnSelectedPrefabFindBtn: you have triggered the find button behaviour, but there is no prefab selected! You should listen to the LE_GUIInterface.delegates.SetIsSelectedPrefabFindBtnInteractable and change the button's state accordingly. This will prevent users from getting irritated by not working buttons.");
|
|
}
|
|
}
|
|
|
|
public void OnSelectedObjectDeleteBtn(object p_obj, EventArgs p_args)
|
|
{
|
|
if (m_GUI3dObject.SelectedObject != null)
|
|
{
|
|
if (LE_GUIInterface.Instance.delegates.ShowPopupConfirmDeleteObject != null)
|
|
{
|
|
ConfirmDelete();
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("LE_LogicObject: OnSelectedObjectDeleteBtn: you have triggered the delete button behaviour, but the LE_GUIInterface.delegates.ShowPopupConfirmDeleteObject delegate is not set! Set this delegate to make the delete button work!");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("LE_LogicObject: OnSelectedObjectDeleteBtn: you have triggered the delete button behaviour, but there is no object selected! You should listen to the LE_GUIInterface.delegates.SetIsSelectedObjectDeleteBtnInteractable and change the button's state accordingly. This will prevent users from getting irritated by not working buttons.");
|
|
}
|
|
}
|
|
|
|
private void OnSelectedObjectIsSleepOnStartChanged(object p_obj, LE_GUIInterface.EventHandlers.BoolEventArgs p_args)
|
|
{
|
|
if (m_GUI3dObject.SelectedObject != null && m_GUI3dObject.SelectedObject.IsRigidbodySleepingStartEditable)
|
|
{
|
|
if (m_GUI3dObject.SelectedObject.IsRigidbodySleepingStart != p_args.Value)
|
|
{
|
|
UR_CommandMgr.Instance.Execute(new LE_CmdChangeObjectIsSleepingStart(m_GUI3dObject.SelectedObject, p_args.Value));
|
|
if (LE_EventInterface.OnChangeLevelData != null)
|
|
{
|
|
LE_EventInterface.OnChangeLevelData(m_GUI3dObject.SelectedObject, new LE_LevelDataChangedEvent(LE_ELevelDataChangeType.OBJECT_RIGIDBODY_SLEEPING_START));
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("LE_LogicObject: OnSelectedObjectIsSleepOnStartChanged was called, but the selected object does not allow to change this property (or nothing is selected)! You should listen to the LE_GUIInterface.delegates.SetIsSelectedObjectSleepPropertyInteractable and change the UI's state accordingly. This will prevent users from getting irritated by not working buttons.");
|
|
}
|
|
}
|
|
|
|
private void OnSelectedObjectColorChanged(object p_obj, LE_GUIInterface.EventHandlers.ColorEventArgs p_args)
|
|
{
|
|
if (m_GUI3dObject.SelectedObject != null)
|
|
{
|
|
if (m_GUI3dObject.SelectedObject.ColorProperty != p_args.Value)
|
|
{
|
|
UR_CommandMgr.Instance.Execute(new LE_CmdChangeObjectColor(m_GUI3dObject.SelectedObject, p_args.Value - m_GUI3dObject.SelectedObject.ColorProperty));
|
|
if (LE_EventInterface.OnChangeLevelData != null)
|
|
{
|
|
LE_EventInterface.OnChangeLevelData(m_GUI3dObject.SelectedObject, new LE_LevelDataChangedEvent(LE_ELevelDataChangeType.OBJECT_COLOR));
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("LE_LogicObject: OnSelectedObjectColorChanged was called, but the selected object does not allow to change this property (or nothing is selected)! You should listen to the LE_GUIInterface.delegates.SetIsSelectedObjectColorPropertyInteractable and change the UI's state accordingly. This will prevent users from getting irritated by not working buttons.");
|
|
}
|
|
}
|
|
|
|
private void OnSelectedObjectVariationIndexChanged(object p_obj, LE_GUIInterface.EventHandlers.IntEventArgs p_args)
|
|
{
|
|
if (m_GUI3dObject.SelectedObject != null)
|
|
{
|
|
if (m_GUI3dObject.SelectedObject.VariationsDefaultIndex != p_args.Value)
|
|
{
|
|
UR_CommandMgr.Instance.Execute(new LE_CmdChangeObjectVariation(m_GUI3dObject.SelectedObject, p_args.Value));
|
|
if (LE_EventInterface.OnChangeLevelData != null)
|
|
{
|
|
LE_EventInterface.OnChangeLevelData(m_GUI3dObject.SelectedObject, new LE_LevelDataChangedEvent(LE_ELevelDataChangeType.OBJECT_VARIATION));
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("LE_LogicObject: OnSelectedObjectVariationIndexChanged was called, but the selected object does not allow to change this property (or nothing is selected)! You should listen to the LE_GUIInterface.delegates.SetSelectedObjectVariationPropertyValue and change the UI's state accordingly. This will prevent users from getting irritated by not working buttons.");
|
|
}
|
|
}
|
|
|
|
private void ConfirmDelete()
|
|
{
|
|
if (!m_GUI3dObject.SelectedObject.canBeDestroyed)
|
|
{
|
|
return;
|
|
}
|
|
LE_EObjectEditMode editModeBK = m_GUI3dObject.ObjectEditMode;
|
|
m_GUI3dObject.ObjectEditMode = LE_EObjectEditMode.NO_EDIT;
|
|
LE_GUIInterface.Instance.delegates.ShowPopupConfirmDeleteObject(delegate(bool p_isDeleteConfirmed)
|
|
{
|
|
if (p_isDeleteConfirmed)
|
|
{
|
|
m_GUI3dObject.Delete();
|
|
}
|
|
m_GUI3dObject.ObjectEditMode = editModeBK;
|
|
});
|
|
}
|
|
}
|
|
}
|