1
This commit is contained in:
@@ -10,17 +10,17 @@ public class CustomMessagePackResolver : IFormatterResolver
|
||||
|
||||
private static readonly Dictionary<Type, object> formatters = new Dictionary<Type, object>
|
||||
{
|
||||
{ typeof(XED.Manage.MaterialPropertyData), new MessagePack.Formatters.XED.Asset.MaterialPropertyDataFormatter() },
|
||||
{ typeof(XED.Manage.ModelData), new MessagePack.Formatters.XED.Asset.ModelDataFormatter() },
|
||||
{ typeof(XED.Manage.SaveData), new MessagePack.Formatters.XED.Asset.SaveDataFormatter() },
|
||||
{ typeof(XED.Manage.SavedModelData), new MessagePack.Formatters.XED.Asset.SavedModelDataFormatter() },
|
||||
{ typeof(XED.Manage.SerializableMesh), new MessagePack.Formatters.XED.Asset.SerializableMeshFormatter() },
|
||||
{ typeof(XED.Manage.SerializableQuaternion), new MessagePack.Formatters.XED.Asset.SerializableQuaternionFormatter() },
|
||||
{ typeof(XED.Manage.SerializableVector2), new MessagePack.Formatters.XED.Asset.SerializableVector2Formatter() },
|
||||
{ typeof(XED.Manage.SerializableVector3), new MessagePack.Formatters.XED.Asset.SerializableVector3Formatter() },
|
||||
{ typeof(XED.Manage.SubmeshData), new MessagePack.Formatters.XED.Asset.SubmeshDataFormatter() },
|
||||
{ typeof(XED.Manage.TextureData), new MessagePack.Formatters.XED.Asset.TextureDataFormatter() },
|
||||
{ typeof(XED.Manage.TransformData), new MessagePack.Formatters.XED.Asset.TransformDataFormatter() },
|
||||
{ typeof(XED.Manage.MaterialPropertyData), new MessagePack.Formatters.XED.Manage.MaterialPropertyDataFormatter() },
|
||||
{ typeof(XED.Manage.ModelData), new MessagePack.Formatters.XED.Manage.ModelDataFormatter() },
|
||||
{ typeof(XED.Manage.SaveData), new MessagePack.Formatters.XED.Manage.SaveDataFormatter() },
|
||||
{ typeof(XED.Manage.SavedModelData), new MessagePack.Formatters.XED.Manage.SavedModelDataFormatter() },
|
||||
{ typeof(XED.Manage.SerializableMesh), new MessagePack.Formatters.XED.Manage.SerializableMeshFormatter() },
|
||||
{ typeof(XED.Manage.SerializableQuaternion), new MessagePack.Formatters.XED.Manage.SerializableQuaternionFormatter() },
|
||||
{ typeof(XED.Manage.SerializableVector2), new MessagePack.Formatters.XED.Manage.SerializableVector2Formatter() },
|
||||
{ typeof(XED.Manage.SerializableVector3), new MessagePack.Formatters.XED.Manage.SerializableVector3Formatter() },
|
||||
{ typeof(XED.Manage.SubmeshData), new MessagePack.Formatters.XED.Manage.SubmeshDataFormatter() },
|
||||
{ typeof(XED.Manage.TextureData), new MessagePack.Formatters.XED.Manage.TextureDataFormatter() },
|
||||
{ typeof(XED.Manage.TransformData), new MessagePack.Formatters.XED.Manage.TransformDataFormatter() },
|
||||
};
|
||||
|
||||
public IMessagePackFormatter<T> GetFormatter<T>()
|
||||
|
||||
@@ -95,19 +95,19 @@ namespace MessagePack.Resolvers
|
||||
case 7: return new global::MessagePack.Formatters.ArrayFormatter<global::XED.Manage.TextureData>();
|
||||
case 8: return new global::MessagePack.Formatters.ArrayFormatter<global::XED.Manage.ThumbnailData>();
|
||||
case 9: return new global::MessagePack.Formatters.ArrayFormatter<string[]>();
|
||||
case 10: return new MessagePack.Formatters.XED.Asset.MaterialPropertyDataFormatter();
|
||||
case 11: return new MessagePack.Formatters.XED.Asset.ModelDataFormatter();
|
||||
case 12: return new MessagePack.Formatters.XED.Asset.SaveDataFormatter();
|
||||
case 13: return new MessagePack.Formatters.XED.Asset.SavedModelDataFormatter();
|
||||
case 14: return new MessagePack.Formatters.XED.Asset.SerializableMeshFormatter();
|
||||
case 15: return new MessagePack.Formatters.XED.Asset.SerializableQuaternionFormatter();
|
||||
case 16: return new MessagePack.Formatters.XED.Asset.SerializableVector2Formatter();
|
||||
case 17: return new MessagePack.Formatters.XED.Asset.SerializableVector3Formatter();
|
||||
case 18: return new MessagePack.Formatters.XED.Asset.SerializableVector4Formatter();
|
||||
case 19: return new MessagePack.Formatters.XED.Asset.SubmeshDataFormatter();
|
||||
case 20: return new MessagePack.Formatters.XED.Asset.TextureDataFormatter();
|
||||
case 21: return new MessagePack.Formatters.XED.Asset.ThumbnailDataFormatter();
|
||||
case 22: return new MessagePack.Formatters.XED.Asset.TransformDataFormatter();
|
||||
case 10: return new MessagePack.Formatters.XED.Manage.MaterialPropertyDataFormatter();
|
||||
case 11: return new MessagePack.Formatters.XED.Manage.ModelDataFormatter();
|
||||
case 12: return new MessagePack.Formatters.XED.Manage.SaveDataFormatter();
|
||||
case 13: return new MessagePack.Formatters.XED.Manage.SavedModelDataFormatter();
|
||||
case 14: return new MessagePack.Formatters.XED.Manage.SerializableMeshFormatter();
|
||||
case 15: return new MessagePack.Formatters.XED.Manage.SerializableQuaternionFormatter();
|
||||
case 16: return new MessagePack.Formatters.XED.Manage.SerializableVector2Formatter();
|
||||
case 17: return new MessagePack.Formatters.XED.Manage.SerializableVector3Formatter();
|
||||
case 18: return new MessagePack.Formatters.XED.Manage.SerializableVector4Formatter();
|
||||
case 19: return new MessagePack.Formatters.XED.Manage.SubmeshDataFormatter();
|
||||
case 20: return new MessagePack.Formatters.XED.Manage.TextureDataFormatter();
|
||||
case 21: return new MessagePack.Formatters.XED.Manage.ThumbnailDataFormatter();
|
||||
case 22: return new MessagePack.Formatters.XED.Manage.TransformDataFormatter();
|
||||
default: return null;
|
||||
}
|
||||
}
|
||||
@@ -141,7 +141,7 @@ namespace MessagePack.Resolvers
|
||||
#pragma warning disable SA1403 // File may only contain a single namespace
|
||||
#pragma warning disable SA1649 // File name should match first type name
|
||||
|
||||
namespace MessagePack.Formatters.XED.Asset
|
||||
namespace MessagePack.Formatters.XED.Manage
|
||||
{
|
||||
public sealed class MaterialPropertyDataFormatter : global::MessagePack.Formatters.IMessagePackFormatter<global::XED.Manage.MaterialPropertyData>
|
||||
{
|
||||
|
||||
@@ -5,6 +5,7 @@ using UnityEditor;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Events;
|
||||
using UnityEngine.EventSystems;
|
||||
using XED.Asset;
|
||||
using XED.DataStructures;
|
||||
using XED.Interfaces;
|
||||
using XED.Manage;
|
||||
@@ -159,6 +160,13 @@ namespace XED.Util
|
||||
RemoveAllSelections();
|
||||
onDeselectAll?.Invoke();
|
||||
}
|
||||
|
||||
public void RemoveAll(List<ConnectedAsset> removeList)
|
||||
{
|
||||
CompletelyRemoveAllSelections(removeList);
|
||||
onDeselectAll?.Invoke();
|
||||
}
|
||||
|
||||
public void AddSelection(CustomAssetRenderObject item)
|
||||
{
|
||||
if (selectedRenderObjects.Any(x => x == item))
|
||||
@@ -195,6 +203,16 @@ namespace XED.Util
|
||||
selectedGameObjects.Clear();
|
||||
rtgController.SetGizmoTargetObjects(selectedGameObjects);
|
||||
}
|
||||
public void CompletelyRemoveAllSelections(List<ConnectedAsset> removeList)
|
||||
{
|
||||
for (int i = 0; i < removeList.Count; i++)
|
||||
{
|
||||
Destroy(removeList[i].renderObject.gameObject);
|
||||
}
|
||||
selectedRenderObjects.Clear();
|
||||
selectedGameObjects.Clear();
|
||||
rtgController.SetGizmoTargetObjects(selectedGameObjects);
|
||||
}
|
||||
public void RemoveSelection(CustomAssetRenderObject item)
|
||||
{
|
||||
selectedRenderObjects.Remove(item);
|
||||
|
||||
46
Assets/Scripts/Studio/Common/ProejctData.cs
Normal file
46
Assets/Scripts/Studio/Common/ProejctData.cs
Normal file
@@ -0,0 +1,46 @@
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace XED.Util
|
||||
{
|
||||
public class ProjectData
|
||||
{
|
||||
public string filePath;
|
||||
public string updateDate;
|
||||
public List<AssetData> assetDatas;
|
||||
}
|
||||
|
||||
public class AssetData
|
||||
{
|
||||
public int id;
|
||||
public string name;
|
||||
public SaveVector3 position;
|
||||
public SaveVector3 rotation;
|
||||
public SaveVector3 scale;
|
||||
public List<int> children;
|
||||
|
||||
public AssetData(int id, string name, SaveVector3 position, SaveVector3 rotation, SaveVector3 scale, List<int> children)
|
||||
{
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
this.position = position;
|
||||
this.rotation = rotation;
|
||||
this.scale = scale;
|
||||
this.children = children;
|
||||
}
|
||||
}
|
||||
|
||||
public class SaveVector3
|
||||
{
|
||||
public float x;
|
||||
public float y;
|
||||
public float z;
|
||||
|
||||
public SaveVector3(Vector3 vector3)
|
||||
{
|
||||
x = vector3.x;
|
||||
y = vector3.y;
|
||||
z = vector3.z;
|
||||
}
|
||||
}
|
||||
}
|
||||
2
Assets/Scripts/Studio/Common/ProejctData.cs.meta
Normal file
2
Assets/Scripts/Studio/Common/ProejctData.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c5105f98311fa764aaeb8dccca24e342
|
||||
@@ -1,10 +1,13 @@
|
||||
using Newtonsoft.Json;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using TriLibCore.SFB;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
using XED.Asset;
|
||||
using XED.HierarchyTree;
|
||||
using XED.Service;
|
||||
using XED.Util;
|
||||
using XRLib;
|
||||
|
||||
@@ -12,10 +15,12 @@ namespace XED.Manage
|
||||
{
|
||||
public class ProjectManager : MonoBehaviour, ISingle
|
||||
{
|
||||
private AssetDataService assetDataService;
|
||||
private CustomAssetConnector connector;
|
||||
private FileBrowserHandler fileBrowserHandler;
|
||||
|
||||
private string curProjectPath;
|
||||
private SceneData curSceneData;
|
||||
private ProjectData curProjectData;
|
||||
Dictionary<int, HierarchyItem> itemDict = new Dictionary<int, HierarchyItem>();
|
||||
|
||||
public event Action<AssetData> onLoadAsset;
|
||||
public event Action<HierarchyItem, HierarchyItem> onRestoreHierarchy;
|
||||
@@ -23,140 +28,146 @@ namespace XED.Manage
|
||||
|
||||
public override void AfterAwake()
|
||||
{
|
||||
assetDataService = new AssetDataService();
|
||||
connector = FindSingle<CustomAssetConnector>();
|
||||
fileBrowserHandler = FindSingle<FileBrowserHandler>();
|
||||
}
|
||||
|
||||
public void SaveProject()
|
||||
{
|
||||
bool isNewProject = string.IsNullOrEmpty(curProjectPath);
|
||||
|
||||
List<AssetData> assetInfos = connector.connectedAssets
|
||||
.Where(asset => asset.hierarchyItem.linkedObject.activeSelf)
|
||||
.OrderBy(asset => asset.hierarchyItem.layerNum)
|
||||
.ThenBy(asset => asset.hierarchyItem.GetSiblingIndex())
|
||||
.Select(asset => CreateAssetData(asset.hierarchyItem))
|
||||
.ToList();
|
||||
string path = isNewProject ? GetSaveFilePath() : curProjectData.filePath;
|
||||
|
||||
SceneData sceneData = new SceneData
|
||||
{
|
||||
createTime = isNewProject ? DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") : curSceneData.createTime,
|
||||
updateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
assetInfos = assetInfos
|
||||
};
|
||||
if (string.IsNullOrEmpty(path))
|
||||
return;
|
||||
|
||||
if(isNewProject)
|
||||
{
|
||||
fileBrowserHandler.SaveFileBrowser(sceneData, "SaveProject", "ProjectName");
|
||||
}
|
||||
else
|
||||
{
|
||||
fileBrowserHandler.SaveFile(sceneData, curProjectPath);
|
||||
}
|
||||
List<AssetData> assetDatas = assetDataService.SortAssetDatas(connector.connectedAssets);
|
||||
ProjectData projectData = CreateProjectData(path, assetDatas);
|
||||
|
||||
curProjectPath = fileBrowserHandler.GetLastOpenFilePath();
|
||||
curProjectPath = path;
|
||||
curProjectData = projectData;
|
||||
|
||||
if(!string.IsNullOrEmpty(curProjectPath))
|
||||
{
|
||||
curSceneData = sceneData;
|
||||
}
|
||||
}
|
||||
|
||||
private AssetData CreateAssetData(HierarchyItem hierarchyItem)
|
||||
{
|
||||
return new AssetData(
|
||||
hierarchyItem.linkedObject.GetInstanceID(),
|
||||
hierarchyItem.name,
|
||||
new SaveVector3(hierarchyItem.linkedObject.transform.position),
|
||||
new SaveVector3(hierarchyItem.linkedObject.transform.eulerAngles),
|
||||
new SaveVector3(hierarchyItem.linkedObject.transform.localScale),
|
||||
hierarchyItem.children.Select(x => x.linkedObject.GetInstanceID()).ToList()
|
||||
);
|
||||
SaveFile();
|
||||
}
|
||||
|
||||
public void LoadProject()
|
||||
{
|
||||
SceneData sceneData = fileBrowserHandler.OpenFileBrowser<SceneData>("OpenProject");
|
||||
|
||||
if (sceneData == null || !FindAnyObjectByType<FBXFileManager>().isLoadTaskComplete)
|
||||
if (!FindAnyObjectByType<FBXFileManager>().isLoadTaskComplete)
|
||||
return;
|
||||
|
||||
NewProject();
|
||||
curProjectPath = fileBrowserHandler.GetLastOpenFilePath();
|
||||
curSceneData = sceneData;
|
||||
Dictionary<int, HierarchyItem> itemDict = new Dictionary<int, HierarchyItem>();
|
||||
string path = GetOpenFilePath();
|
||||
|
||||
foreach (AssetData asset in sceneData.assetInfos)
|
||||
{
|
||||
onLoadAsset?.Invoke(asset);
|
||||
itemDict.Add(asset.id, connector.connectedAssets.Last().hierarchyItem);
|
||||
}
|
||||
if (string.IsNullOrEmpty(path))
|
||||
return;
|
||||
|
||||
foreach (AssetData asset in sceneData.assetInfos)
|
||||
{
|
||||
foreach (int id in asset.children)
|
||||
{
|
||||
HierarchyItem parent = itemDict[asset.id];
|
||||
HierarchyItem child = itemDict[id];
|
||||
|
||||
if (parent == null || child == null)
|
||||
continue;
|
||||
ProjectData projectData = GetFileData(path);
|
||||
|
||||
onRestoreHierarchy?.Invoke(parent, child);
|
||||
}
|
||||
}
|
||||
CommandManager.instance.Clear();
|
||||
if (projectData == null)
|
||||
return;
|
||||
|
||||
RemoveObject();
|
||||
Init();
|
||||
|
||||
LoadAssets(projectData.assetDatas);
|
||||
RestoreHierarchys(projectData.assetDatas);
|
||||
|
||||
CommandManager.I.Clear();
|
||||
curProjectPath = path;
|
||||
curProjectData = projectData;
|
||||
}
|
||||
|
||||
public void NewProject()
|
||||
{
|
||||
RemoveObject();
|
||||
Init();
|
||||
}
|
||||
|
||||
private ProjectData CreateProjectData(string path, List<AssetData> assetDatas)
|
||||
{
|
||||
return new ProjectData
|
||||
{
|
||||
filePath = path,
|
||||
updateDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
assetDatas = assetDatas
|
||||
};
|
||||
}
|
||||
|
||||
private void LoadAssets(List<AssetData> assets)
|
||||
{
|
||||
foreach (AssetData asset in assets)
|
||||
{
|
||||
LoadAsset(asset);
|
||||
}
|
||||
}
|
||||
|
||||
private void LoadAsset(AssetData asset)
|
||||
{
|
||||
onLoadAsset?.Invoke(asset);
|
||||
itemDict.Add(asset.id, connector.connectedAssets.Last().hierarchyItem);
|
||||
}
|
||||
|
||||
private void RestoreHierarchys(List<AssetData> assets)
|
||||
{
|
||||
foreach (AssetData asset in assets)
|
||||
{
|
||||
RestoreHierarchy(asset);
|
||||
}
|
||||
}
|
||||
|
||||
private void RestoreHierarchy(AssetData asset)
|
||||
{
|
||||
foreach (int id in asset.children)
|
||||
{
|
||||
HierarchyItem parent = itemDict[asset.id];
|
||||
HierarchyItem child = itemDict[id];
|
||||
|
||||
if (parent == null || child == null)
|
||||
continue;
|
||||
|
||||
onRestoreHierarchy?.Invoke(parent, child);
|
||||
}
|
||||
}
|
||||
|
||||
private void RemoveObject()
|
||||
{
|
||||
List<CustomAssetRenderObject> objects = connector.connectedAssets.Select(x => x.renderObject).ToList();
|
||||
onRemoveAsset?.Invoke(objects);
|
||||
onRemoveAsset?.Invoke(objects);
|
||||
}
|
||||
|
||||
private void Init()
|
||||
{
|
||||
curProjectPath = string.Empty;
|
||||
curSceneData = null;
|
||||
curProjectData = null;
|
||||
connector.connectedAssets.Clear();
|
||||
CommandManager.instance.Clear();
|
||||
CommandManager.I.Clear();
|
||||
itemDict.Clear();
|
||||
}
|
||||
}
|
||||
|
||||
public class SceneData
|
||||
{
|
||||
public string createTime;
|
||||
public string updateTime;
|
||||
public List<AssetData> assetInfos;
|
||||
}
|
||||
|
||||
public class AssetData
|
||||
{
|
||||
public int id;
|
||||
public string name;
|
||||
public SaveVector3 position;
|
||||
public SaveVector3 rotation;
|
||||
public SaveVector3 scale;
|
||||
public List<int> children;
|
||||
|
||||
public AssetData(int id, string name, SaveVector3 position, SaveVector3 rotation, SaveVector3 scale, List<int> children)
|
||||
private string GetSaveFilePath()
|
||||
{
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
this.position = position;
|
||||
this.rotation = rotation;
|
||||
this.scale = scale;
|
||||
this.children = children;
|
||||
var data = StandaloneFileBrowser.SaveFilePanel("SaveProject", "", "", "json");
|
||||
return data.Name;
|
||||
}
|
||||
}
|
||||
|
||||
public class SaveVector3
|
||||
{
|
||||
public float x;
|
||||
public float y;
|
||||
public float z;
|
||||
|
||||
public SaveVector3(Vector3 vector3)
|
||||
private string GetOpenFilePath()
|
||||
{
|
||||
x = vector3.x;
|
||||
y = vector3.y;
|
||||
z = vector3.z;
|
||||
var data = StandaloneFileBrowser.OpenFilePanel("OpenProject", "", "json", false);
|
||||
return data.Count >= 1 ? data[0].Name : "";
|
||||
}
|
||||
}
|
||||
|
||||
private void SaveFile()
|
||||
{
|
||||
string json = JsonConvert.SerializeObject(curProjectData);
|
||||
FileStream fs = new FileStream(curProjectPath, FileMode.Create, FileAccess.Write);
|
||||
StreamWriter writer = new StreamWriter(fs, System.Text.Encoding.Unicode);
|
||||
writer.Write(json);
|
||||
writer.Close();
|
||||
}
|
||||
|
||||
private ProjectData GetFileData(string path)
|
||||
{
|
||||
string json = File.ReadAllText(path);
|
||||
return JsonConvert.DeserializeObject<ProjectData>(json);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
8
Assets/Scripts/Studio/Service.meta
Normal file
8
Assets/Scripts/Studio/Service.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 229f65e4bb8676d41a04d9a838745d5e
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
33
Assets/Scripts/Studio/Service/AssetDataService.cs
Normal file
33
Assets/Scripts/Studio/Service/AssetDataService.cs
Normal file
@@ -0,0 +1,33 @@
|
||||
using System.Collections.Generic;
|
||||
using XED.Util;
|
||||
using XED.Asset;
|
||||
using System.Linq;
|
||||
using XED.HierarchyTree;
|
||||
|
||||
namespace XED.Service
|
||||
{
|
||||
public class AssetDataService
|
||||
{
|
||||
public List<AssetData> SortAssetDatas(List<ConnectedAsset> connectedAssets)
|
||||
{
|
||||
return connectedAssets
|
||||
.Where(asset => asset.hierarchyItem.linkedObject.activeSelf)
|
||||
.OrderBy(asset => asset.hierarchyItem.layerNum)
|
||||
.ThenBy(asset => asset.hierarchyItem.GetSiblingIndex())
|
||||
.Select(asset => CreateAssetData(asset.hierarchyItem))
|
||||
.ToList();
|
||||
}
|
||||
|
||||
public AssetData CreateAssetData(HierarchyItem hierarchyItem)
|
||||
{
|
||||
return new AssetData(
|
||||
hierarchyItem.linkedObject.GetInstanceID(),
|
||||
hierarchyItem.name,
|
||||
new SaveVector3(hierarchyItem.linkedObject.transform.position),
|
||||
new SaveVector3(hierarchyItem.linkedObject.transform.eulerAngles),
|
||||
new SaveVector3(hierarchyItem.linkedObject.transform.localScale),
|
||||
hierarchyItem.children.Select(x => x.linkedObject.GetInstanceID()).ToList()
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
2
Assets/Scripts/Studio/Service/AssetDataService.cs.meta
Normal file
2
Assets/Scripts/Studio/Service/AssetDataService.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 90919af16f583ed46add3dccc093f7c6
|
||||
Reference in New Issue
Block a user