217 lines
8.2 KiB
C#
217 lines
8.2 KiB
C#
using System;
|
|
using System.Collections;
|
|
using LE_LevelEditor.Core;
|
|
using LE_LevelEditor.Events;
|
|
using LE_LevelEditor.UI;
|
|
using LS_LevelStreaming;
|
|
using UnityEngine;
|
|
|
|
namespace LE_LevelEditor.Logic
|
|
{
|
|
public class LE_LogicLevel : LE_LogicBase
|
|
{
|
|
private LE_ConfigLevel m_confL;
|
|
|
|
private LE_GUI3dTerrain m_GUI3dTerrain;
|
|
|
|
private LE_GUI3dObject m_GUI3dObject;
|
|
|
|
private bool m_isObliqueFocusCentering;
|
|
|
|
private Texture2D[] m_configTextures;
|
|
|
|
private Texture2D[] m_configNormals;
|
|
|
|
private Vector2[] m_configTextureSizes;
|
|
|
|
private Vector2[] m_configTextureOffsets;
|
|
|
|
private Texture2D m_levelIcon;
|
|
|
|
public LE_LogicLevel(LE_ConfigLevel p_confL, LE_GUI3dTerrain p_GUI3dTerrain, LE_GUI3dObject p_GUI3dObject, bool p_isObliqueFocusCentering, Texture2D[] p_configTextures, Texture2D[] p_configNormals, Vector2[] p_configTextureSizes, Vector2[] p_configTextureOffsets)
|
|
{
|
|
m_confL = p_confL;
|
|
m_GUI3dTerrain = p_GUI3dTerrain;
|
|
m_GUI3dObject = p_GUI3dObject;
|
|
m_isObliqueFocusCentering = p_isObliqueFocusCentering;
|
|
m_configTextures = p_configTextures;
|
|
m_configNormals = p_configNormals;
|
|
m_configTextureSizes = p_configTextureSizes;
|
|
m_configTextureOffsets = p_configTextureOffsets;
|
|
LE_GUIInterface.EventHandlers events = LE_GUIInterface.Instance.events;
|
|
events.OnLevelSaveBtn = (System.EventHandler)Delegate.Combine(events.OnLevelSaveBtn, new System.EventHandler(OnLevelSaveBtn));
|
|
LE_GUIInterface.EventHandlers events2 = LE_GUIInterface.Instance.events;
|
|
events2.OnLevelLoadBtn = (System.EventHandler)Delegate.Combine(events2.OnLevelLoadBtn, new System.EventHandler(OnLevelLoadBtn));
|
|
LE_GUIInterface.EventHandlers events3 = LE_GUIInterface.Instance.events;
|
|
events3.OnLevelRenderIconBtn = (System.EventHandler)Delegate.Combine(events3.OnLevelRenderIconBtn, new System.EventHandler(OnLevelRenderIconBtn));
|
|
}
|
|
|
|
public override void Destroy()
|
|
{
|
|
if (LE_GUIInterface.Instance != null)
|
|
{
|
|
LE_GUIInterface.EventHandlers events = LE_GUIInterface.Instance.events;
|
|
events.OnLevelSaveBtn = (System.EventHandler)Delegate.Remove(events.OnLevelSaveBtn, new System.EventHandler(OnLevelSaveBtn));
|
|
LE_GUIInterface.EventHandlers events2 = LE_GUIInterface.Instance.events;
|
|
events2.OnLevelLoadBtn = (System.EventHandler)Delegate.Remove(events2.OnLevelLoadBtn, new System.EventHandler(OnLevelLoadBtn));
|
|
LE_GUIInterface.EventHandlers events3 = LE_GUIInterface.Instance.events;
|
|
events3.OnLevelRenderIconBtn = (System.EventHandler)Delegate.Remove(events3.OnLevelRenderIconBtn, new System.EventHandler(OnLevelRenderIconBtn));
|
|
}
|
|
if (m_levelIcon != null)
|
|
{
|
|
UnityEngine.Object.Destroy(m_levelIcon);
|
|
}
|
|
}
|
|
|
|
public override void Update()
|
|
{
|
|
}
|
|
|
|
private void OnLevelSaveBtn(object p_obj, EventArgs p_args)
|
|
{
|
|
SaveLevel();
|
|
}
|
|
|
|
private void OnLevelLoadBtn(object p_obj, EventArgs p_args)
|
|
{
|
|
if (LE_EventInterface.OnLoad != null)
|
|
{
|
|
LE_EventInterface.OnLoad(this, GetLoadEvent());
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("LE_LogicLevel: OnLevelLoadBtn: you have to provide an event handler for 'LE_EventInterface.OnLoad' to load a level!");
|
|
}
|
|
}
|
|
|
|
private void OnLevelRenderIconBtn(object p_obj, EventArgs p_args)
|
|
{
|
|
m_confL.StartCoroutine(DrawLevelIcon());
|
|
}
|
|
|
|
public LE_LoadEvent GetLoadEvent()
|
|
{
|
|
return new LE_LoadEvent(delegate(byte[] p_savedLevelData)
|
|
{
|
|
Vector3 vector = new Vector3(99999f, -99999f, 99999f);
|
|
LE_Object[] array = UnityEngine.Object.FindObjectsOfType<LE_Object>();
|
|
for (int i = 0; i < array.Length; i++)
|
|
{
|
|
array[i].transform.position += vector;
|
|
UnityEngine.Object.Destroy(array[i].gameObject);
|
|
}
|
|
LE_SaveLoadData lE_SaveLoadData = LE_SaveLoad.LoadLevelDataFromByteArray(p_savedLevelData, (m_GUI3dTerrain != null) ? m_GUI3dTerrain.TERRAIN_LAYER : 0, m_configTextures, m_configNormals, m_configTextureSizes, m_configTextureOffsets);
|
|
for (int j = 0; j < lE_SaveLoadData.LevelObjects.Length; j++)
|
|
{
|
|
LE_SaveLoadData.ObjectData objectData = lE_SaveLoadData.LevelObjects[j];
|
|
if (objectData.Result == LE_SaveLoadData.ObjectData.EResult.INSTANCE)
|
|
{
|
|
if (m_GUI3dObject != null)
|
|
{
|
|
LE_LogicObjects.AddSnappingScripts(m_GUI3dObject, objectData.Instance);
|
|
}
|
|
}
|
|
else if (objectData.Result == LE_SaveLoadData.ObjectData.EResult.STREAMED)
|
|
{
|
|
LS_ManagedObjectBase managedObject = LS_LevelStreamingSceneManager.Instance.GetManagedObject(objectData.StreamedLevelObjectID);
|
|
if (managedObject != null && m_GUI3dObject != null)
|
|
{
|
|
managedObject.m_onShow = (System.EventHandler)Delegate.Combine(managedObject.m_onShow, (System.EventHandler)delegate(object p_object, EventArgs p_args)
|
|
{
|
|
if (m_GUI3dObject != null && p_object is LS_ManagedObjectInstantiateDestroy)
|
|
{
|
|
LE_LogicObjects.AddSnappingScripts(m_GUI3dObject, ((LS_ManagedObjectInstantiateDestroy)p_object).Instance.GetComponent<LE_Object>());
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
if (LE_EventInterface.OnLoadedLevelInEditor != null)
|
|
{
|
|
LE_EventInterface.OnLoadedLevelInEditor(this, EventArgs.Empty);
|
|
}
|
|
}, delegate(byte[] p_savedLevelMeta)
|
|
{
|
|
LE_SaveLoad.LevelMetaData levelMetaData = LE_SaveLoad.LoadLevelMetaFromByteArray(p_savedLevelMeta, true);
|
|
m_levelIcon = levelMetaData.Icon;
|
|
if (LE_GUIInterface.Instance.delegates.SetLevelIcon != null)
|
|
{
|
|
LE_GUIInterface.Instance.delegates.SetLevelIcon(levelMetaData.Icon);
|
|
}
|
|
else if (levelMetaData.Icon != null)
|
|
{
|
|
Debug.LogError("LE_LogicLevel: GetLoadEvent: LE_LoadEvent: LoadLevelMetaFromBytes: you level meta seems to contain an icon, but you have not provided the LE_GUIInterface.delegates.SetLevelIcon delegate. Level icon will not be shown!");
|
|
}
|
|
});
|
|
}
|
|
|
|
public void SaveLevel(bool quick = false)
|
|
{
|
|
if (LE_EventInterface.OnSave != null)
|
|
{
|
|
FisheryEditor.Instance.ChangeMode();
|
|
LE_CollectMetaDataEvent lE_CollectMetaDataEvent = new LE_CollectMetaDataEvent();
|
|
if (LE_EventInterface.OnCollectMetaDataBeforeSave != null)
|
|
{
|
|
LE_EventInterface.OnCollectMetaDataBeforeSave(this, lE_CollectMetaDataEvent);
|
|
}
|
|
int p_removedDuplicatesCount = 0;
|
|
if (m_confL.IsRemoveDuplicatesOnSave)
|
|
{
|
|
p_removedDuplicatesCount = LE_SaveLoad.RemoveDuplicatesInCurrentLevel();
|
|
}
|
|
LE_SaveEvent lE_SaveEvent = new LE_SaveEvent(LE_SaveLoad.SaveCurrentLevelDataToByteArray(m_configTextures), LE_SaveLoad.SaveCurrentLevelMetaToByteArray(m_levelIcon, lE_CollectMetaDataEvent.GetCollectedMetaData()), p_removedDuplicatesCount);
|
|
if (quick)
|
|
{
|
|
FisheryEditor.Instance.OnSaveQuick(this, lE_SaveEvent);
|
|
}
|
|
else
|
|
{
|
|
LE_EventInterface.OnSave(this, lE_SaveEvent);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("LE_LogicLevel: OnLevelLoadBtn: you have to provide an event handler for 'LE_EventInterface.OnSave' to save a level!");
|
|
}
|
|
}
|
|
|
|
private IEnumerator DrawLevelIcon()
|
|
{
|
|
yield return new WaitForEndOfFrame();
|
|
if (m_levelIcon == null || m_levelIcon.width != m_confL.LevelIconWidth || m_levelIcon.height != m_confL.LevelIconHeight)
|
|
{
|
|
UnityEngine.Object.Destroy(m_levelIcon);
|
|
m_levelIcon = new Texture2D(m_confL.LevelIconWidth, m_confL.LevelIconHeight, TextureFormat.RGB24, false, true);
|
|
}
|
|
Rect originalPixelRect = Camera.main.pixelRect;
|
|
Rect pixelRect = new Rect(0f, 0f, m_confL.LevelIconWidth, m_confL.LevelIconHeight);
|
|
Camera.main.pixelRect = pixelRect;
|
|
if (!Camera.main.orthographic && m_isObliqueFocusCentering)
|
|
{
|
|
LE_LevelEditorMain.SetObliqueFocusProjectionMatrix(false);
|
|
}
|
|
Camera.main.Render();
|
|
m_levelIcon.ReadPixels(pixelRect, 0, 0, false);
|
|
m_levelIcon.Apply(false);
|
|
Camera.main.pixelRect = originalPixelRect;
|
|
if (!Camera.main.orthographic && m_isObliqueFocusCentering)
|
|
{
|
|
LE_LevelEditorMain.SetObliqueFocusProjectionMatrix(true);
|
|
}
|
|
if (LE_GUIInterface.Instance.delegates.SetLevelIcon != null)
|
|
{
|
|
LE_GUIInterface.Instance.delegates.SetLevelIcon(m_levelIcon);
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("LE_LogicLevel: DrawLevelIcon: you seem to have a 'Render Level Icon' button, but you have not provided the LE_GUIInterface.delegates.SetLevelIcon delegate. Level icon will not be shown!");
|
|
}
|
|
if (LE_EventInterface.OnChangeLevelData != null)
|
|
{
|
|
LE_EventInterface.OnChangeLevelData(m_levelIcon, new LE_LevelDataChangedEvent(LE_ELevelDataChangeType.LEVEL_ICON));
|
|
}
|
|
}
|
|
}
|
|
}
|