You've already forked UniversalViewer
							
							DanMachi:
-compatibility improvements Core: -simplified object and keyframe serialization -complicated assetbundle loading
This commit is contained in:
		| @@ -9,6 +9,13 @@ public class ExtendedDropdown : MonoBehaviour | ||||
|     [SerializeField] private TMPro.TMP_Dropdown _dropdown; | ||||
|     public UnityEvent<int> OnValueChangedEvent; | ||||
|     public List<TMPro.TMP_Dropdown.OptionData> options => _dropdown.options; | ||||
|     public int value | ||||
|     { | ||||
|         get { return _dropdown.value; } | ||||
|         set { _dropdown.value = value; } | ||||
|     } | ||||
|  | ||||
|     [Header("Hotkeys")] | ||||
|     public KeyCode PreviousKey  = KeyCode.None; | ||||
|     public KeyCode NextKey      = KeyCode.None; | ||||
|  | ||||
|   | ||||
| @@ -1,31 +1,29 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using UnityEngine; | ||||
| using UnityEngine.UI; | ||||
| using static SerializableBone; | ||||
|  | ||||
| namespace KF3.UI.Panels | ||||
| public class HandleSettingsPanel : MonoBehaviour | ||||
| { | ||||
|     public class HandleSettingsPanel : MonoBehaviour | ||||
|     { | ||||
|         public ScrollRect HandleVisibilityToggles; | ||||
|     public ScrollRect HandleVisibilityToggles; | ||||
|     public List<BoneTags> AvailableTags = new List<BoneTags>(); | ||||
|  | ||||
|         private void Start() | ||||
|     private void Start() | ||||
|     { | ||||
|         var handleManager = HandleManager.Instance; | ||||
|         foreach (BoneTags en in AvailableTags) | ||||
|         { | ||||
|             var handleManager = HandleManager.Instance; | ||||
|             foreach (BoneTags en in Enum.GetValues(typeof(BoneTags))) | ||||
|             var handle = SliderPanel.CreateToggle(en.ToString(), handleManager.EnabledHandles.Contains(en), HandleVisibilityToggles.content, (value)=> | ||||
|             { | ||||
|                 var handle = SliderPanel.CreateToggle(en.ToString(), handleManager.EnabledHandles.Contains(en), HandleVisibilityToggles.content, (value)=> | ||||
|                 if (value) | ||||
|                 { | ||||
|                     if (value) | ||||
|                     { | ||||
|                         handleManager.EnabledHandles.Add(en); | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         handleManager.EnabledHandles.Remove(en); | ||||
|                     } | ||||
|                 }); | ||||
|             } | ||||
|                     handleManager.EnabledHandles.Add(en); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     handleManager.EnabledHandles.Remove(en); | ||||
|                 } | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -16,6 +16,11 @@ public class MorphPanel : MonoBehaviour | ||||
|  | ||||
|     public void Init(List<string> categories) | ||||
|     { | ||||
|         for(int i = _categoryPanels.childCount-1; i >= 0; i--) | ||||
|         { | ||||
|             Destroy(_categoryPanels.GetChild(i).gameObject); | ||||
|         } | ||||
|  | ||||
|         Categories.Clear(); | ||||
|         foreach (var category in categories) | ||||
|         { | ||||
| @@ -25,8 +30,8 @@ public class MorphPanel : MonoBehaviour | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void CreateMorph(string category, ObjectContainer container, SkinnedMeshRenderer meshRenderer, int index, string displayName) | ||||
|     public SliderPanel CreateMorph(string category, ObjectContainer container, SkinnedMeshRenderer meshRenderer, int index, string displayName) | ||||
|     { | ||||
|         SliderPanel.CreateMorph(container, meshRenderer, index, displayName, this.Categories[category].Content); | ||||
|         return SliderPanel.CreateMorph(container, meshRenderer, index, displayName, this.Categories[category].Content); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -8,10 +8,11 @@ public class SliderPanel : MonoBehaviour | ||||
|     public static SliderPanel Prefab; | ||||
|  | ||||
|     public Slider Slider; | ||||
|     //public UICallbacks ToggleCallbacks; | ||||
|     public TMPro.TMP_Text Text; | ||||
|     public Toggle Toggle; | ||||
|     public float DefaultValue; | ||||
|     public MorphHelper MorphHelper; | ||||
|  | ||||
|     public float value { | ||||
|         get { return Slider.value; } | ||||
|         set { Slider.value = value; } | ||||
| @@ -39,15 +40,10 @@ public class SliderPanel : MonoBehaviour | ||||
|     { | ||||
|         SliderPanel panel = Instantiate(SharedResources.Instance.SliderPanel, parent); | ||||
|  | ||||
|         var helper = new MorphHelper(meshRenderer, meshRenderer.sharedMesh.GetBlendShapeName(index), panel.Slider); | ||||
|         if (container.Morphs.ContainsKey(meshRenderer)) | ||||
|             container.Morphs[meshRenderer].Add(helper); | ||||
|         else | ||||
|             container.Morphs.Add(meshRenderer, new List<MorphHelper>() { helper }); | ||||
|  | ||||
|         panel.MorphHelper = new MorphHelper(meshRenderer, meshRenderer.sharedMesh.GetBlendShapeName(index), panel.Slider); | ||||
|         panel.Text.text = displayName; | ||||
|         panel.Slider.value = meshRenderer.GetBlendShapeWeight(index); | ||||
|         panel.SetOnValueChanged((value) => {helper.UpdateMorph(value);}); | ||||
|         panel.SetOnValueChanged((value) => {panel.MorphHelper.UpdateMorph(value);}); | ||||
|         panel.SetOnRelease((value) => { container.SetKeyframe(); }); | ||||
|         panel.SetOnRightClick(null); | ||||
|         return panel; | ||||
|   | ||||
| @@ -96,13 +96,15 @@ public class TimelineController : MonoBehaviour | ||||
|     { | ||||
|         var main = ModelViewerMain.GetInstance(); | ||||
|         Instance.CurrentFrame = frameIndex; | ||||
|         //Debug.Log(frameIndex); | ||||
|  | ||||
|         Debug.Log("Setting frame to: " + frameIndex); | ||||
|  | ||||
|         foreach (var container in main.CurrentScene.AllObjects) | ||||
|         { | ||||
|             container.GetClosestFrames(frameIndex, out var previousFrame, out var nextFrame); | ||||
|             var blendAmount = previousFrame == nextFrame? 0 : 1 - (float)(nextFrame.FrameNum - frameIndex) / (nextFrame.FrameNum - previousFrame.FrameNum); | ||||
|  | ||||
|             Debug.Log($"Setting {container.name} to frame {previousFrame.FrameNum}({nextFrame.FrameNum})"); | ||||
|             container.Lerp(previousFrame.ObjectData, nextFrame.ObjectData, blendAmount); | ||||
|         } | ||||
|         UpdateTimeline(); | ||||
|   | ||||
| @@ -6,19 +6,39 @@ using UnityEngine.EventSystems; | ||||
|  | ||||
| public class UICallbacks : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler | ||||
| { | ||||
|     private bool _isHovering; | ||||
|     private bool _hoverActionActivated; | ||||
|     private float _hoveredTime; | ||||
|     private float _timeBeforeHoverActivate = 1.5f; | ||||
|     public UnityEvent MouseHover; | ||||
|     public UnityEvent MouseHoverEnd; | ||||
|  | ||||
|     public void OnPointerEnter(PointerEventData eventData) | ||||
|     { | ||||
|         MouseHover.Invoke(); | ||||
|         _hoverActionActivated = false; | ||||
|         _isHovering = true; | ||||
|         _hoveredTime = 0; | ||||
|     } | ||||
|  | ||||
|     public void OnPointerExit(PointerEventData eventData) | ||||
|     { | ||||
|         _isHovering = false; | ||||
|         MouseHoverEnd.Invoke(); | ||||
|     } | ||||
|  | ||||
|     private void Update() | ||||
|     { | ||||
|         if (_isHovering && !_hoverActionActivated) | ||||
|         { | ||||
|             _hoveredTime += Time.deltaTime; | ||||
|             if (_hoveredTime >= _timeBeforeHoverActivate) | ||||
|             { | ||||
|                 _hoverActionActivated = true; | ||||
|                 MouseHover.Invoke(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void SetTooltipText(string text) | ||||
|     { | ||||
|         ModelViewerInterface.GetInstance().Tooltip.SetAsLastSibling(); | ||||
|   | ||||
| @@ -1,5 +1,6 @@ | ||||
| using UnityEngine; | ||||
| using UnityEngine.EventSystems; | ||||
| using UnityEngine.UI; | ||||
|  | ||||
| public class UIDraggableProxy : MonoBehaviour, IEndDragHandler, IDragHandler | ||||
| { | ||||
|   | ||||
| @@ -27,7 +27,7 @@ public class UIElementDragger : MonoBehaviour, IDragHandler, IEndDragHandler, IP | ||||
|     private CanvasGroup _canvasGroup; | ||||
|  | ||||
|     public DragAction LastDragAction; | ||||
|      | ||||
|  | ||||
|     public enum DragAction | ||||
|     { | ||||
|         None, | ||||
|   | ||||
| @@ -11,7 +11,7 @@ public class UIPoseContainer : MonoBehaviour | ||||
|     public KeyframeData KeyframeData; | ||||
|     public TMPro.TMP_InputField NameLabel; | ||||
|  | ||||
|     static ModelViewerInterface UI => ModelViewerInterface.GetInstance(); | ||||
|     static UISaveLoadPanel SaveLoadPanel => ModelViewerInterface.GetInstance().CanvasContainer.SaveLoadPanel; | ||||
|     static ModelViewerMain Main => ModelViewerMain.GetInstance(); | ||||
|  | ||||
|     public static UIPoseContainer CreateNew(string poseName, KeyframeData poseData, bool forceOverride) | ||||
| @@ -23,7 +23,7 @@ public class UIPoseContainer : MonoBehaviour | ||||
|             return null; | ||||
|         } | ||||
|  | ||||
|         if (UI.SaveLoadPanel.GetPoseByName(poseName, out var savedPose)) | ||||
|         if (SaveLoadPanel.GetPoseByName(poseName, out var savedPose)) | ||||
|         { | ||||
|             if (!forceOverride) | ||||
|             { | ||||
| @@ -33,8 +33,8 @@ public class UIPoseContainer : MonoBehaviour | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             savedPose = Instantiate(SharedResources.Instance.UIPoseContainer, UI.PosePresetToggle.content); | ||||
|             UI.SaveLoadPanel.AddPose(savedPose); | ||||
|             savedPose = Instantiate(SharedResources.Instance.UIPoseContainer, SaveLoadPanel.ScrollPose.content); | ||||
|             SaveLoadPanel.AddPose(savedPose); | ||||
|         } | ||||
|  | ||||
|         savedPose.Init(poseName, poseData); | ||||
| @@ -54,16 +54,16 @@ public class UIPoseContainer : MonoBehaviour | ||||
|     { | ||||
|         var poseName = NameLabel.text; | ||||
|  | ||||
|         if (UI.SaveLoadPanel.GetPoseByName(poseName, out var savedPose)) | ||||
|         if (SaveLoadPanel.GetPoseByName(poseName, out var savedPose)) | ||||
|         { | ||||
|             Error.Log(Color.red, "Preset with this name already exists"); | ||||
|             return; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             savedPose = Instantiate(SharedResources.Instance.UIPoseContainer, UI.PosePresetToggle.content); | ||||
|             savedPose = Instantiate(SharedResources.Instance.UIPoseContainer, SaveLoadPanel.ScrollPose.content); | ||||
|             savedPose.NameLabel.text = poseName; | ||||
|             UI.SaveLoadPanel.AddPose(savedPose); | ||||
|             SaveLoadPanel.AddPose(savedPose); | ||||
|         } | ||||
|  | ||||
|         savedPose.Save(); | ||||
| @@ -75,12 +75,12 @@ public class UIPoseContainer : MonoBehaviour | ||||
|  | ||||
|         var poseData = Main.SelectedObject.SerializeFrame(); | ||||
|         string poseName = NameLabel.text; | ||||
|         string fileName = Path.GetFullPath(Path.Combine(Settings.SavePoseDirectory, $"{poseName}.pose")); | ||||
|         string fileName = Path.GetFullPath(Path.Combine(UISaveLoadPanel.SavePoseDirectory, $"{poseName}.pose")); | ||||
|  | ||||
|         try | ||||
|         { | ||||
|             var settings = new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.Auto, DefaultValueHandling = DefaultValueHandling.Ignore }; | ||||
|             var json = JsonConvert.SerializeObject(poseData, Formatting.Indented, settings); | ||||
|             var json = JsonConvert.SerializeObject(poseData, typeof(KeyframeData), Formatting.Indented, settings); | ||||
|             File.WriteAllText(fileName, json); | ||||
|             Error.Log(Color.green, $"Pose saved to {fileName}"); | ||||
|         } | ||||
| @@ -121,7 +121,7 @@ public class UIPoseContainer : MonoBehaviour | ||||
|     { | ||||
|         Destroy(this.gameObject); | ||||
|  | ||||
|         string path = Path.GetFullPath(Path.Combine(Settings.SavePoseDirectory, $"{PoseName}.pose")); | ||||
|         string path = Path.GetFullPath(Path.Combine(UISaveLoadPanel.SavePoseDirectory, $"{NameLabel.text}.pose")); | ||||
|         if (File.Exists(path)) | ||||
|             File.Delete(path); | ||||
|  | ||||
|   | ||||
| @@ -19,6 +19,15 @@ public class UISaveLoadPanel : MonoBehaviour | ||||
|     public List<UISceneContainer> ScenePresetEntries = new List<UISceneContainer>(); | ||||
|     public List<UIPoseContainer> PosePresetEntries = new List<UIPoseContainer>(); | ||||
|  | ||||
|     public static string SavePoseDirectory => ModelViewerSettings.Get("SavePoseDirectory", new ModelViewerSettings.Setting(Application.dataPath + "/../Poses/", ModelViewerSettings.SettingType.FolderPath)); | ||||
|     public static string SaveSceneDirectory => ModelViewerSettings.Get("SaveSceneDirectory", new ModelViewerSettings.Setting(Application.dataPath + "/../Scenes/", ModelViewerSettings.SettingType.FolderPath)); | ||||
|  | ||||
|     private void Awake() | ||||
|     { | ||||
|         InitPoses(); | ||||
|         InitScenes(); | ||||
|     } | ||||
|  | ||||
|     public void AddPose(UIPoseContainer pose) | ||||
|     { | ||||
|         PosePresetEntries.Add(pose); | ||||
| @@ -45,6 +54,11 @@ public class UISaveLoadPanel : MonoBehaviour | ||||
|         ScrollPose.gameObject.SetActive(false); | ||||
|     } | ||||
|  | ||||
|     public void OnDeleteButton() | ||||
|     { | ||||
|         ModelViewerMain.GetInstance().EmptySceneDefault(); | ||||
|     } | ||||
|  | ||||
|     public bool GetPoseByName(string name, out UIPoseContainer pose) | ||||
|     { | ||||
|         pose = PosePresetEntries.FirstOrDefault(p => p.PoseName == name); | ||||
| @@ -57,15 +71,13 @@ public class UISaveLoadPanel : MonoBehaviour | ||||
|         return scene != null; | ||||
|     } | ||||
|  | ||||
|     public void Init() | ||||
|     { | ||||
|         InitPoses(); | ||||
|         InitScenes(); | ||||
|     } | ||||
|  | ||||
|     private void InitPoses() | ||||
|     { | ||||
|         string path = Settings.SavePoseDirectory; | ||||
|         string path = SavePoseDirectory; | ||||
|         if(!Directory.Exists(path)) | ||||
|         { | ||||
|             Directory.CreateDirectory(path); | ||||
|         } | ||||
|  | ||||
|         foreach (var fileName in Directory.GetFiles(path).Where(f => f.EndsWith(".pose"))) | ||||
|         { | ||||
| @@ -86,7 +98,11 @@ public class UISaveLoadPanel : MonoBehaviour | ||||
|  | ||||
|     private void InitScenes() | ||||
|     { | ||||
|         string path = Settings.SaveSceneDirectory; | ||||
|         string path = SaveSceneDirectory; | ||||
|         if (!Directory.Exists(path)) | ||||
|         { | ||||
|             Directory.CreateDirectory(path); | ||||
|         } | ||||
|         List<SceneSerializable> scenes = new List<SceneSerializable>(); | ||||
|  | ||||
|         foreach (var fileName in Directory.GetFiles(path).Where(f => f.EndsWith(".scene"))) | ||||
|   | ||||
| @@ -11,7 +11,7 @@ public class UISceneContainer : MonoBehaviour | ||||
|     public TMPro.TMP_Text DateLabel; | ||||
|     public TMPro.TMP_Text VersionLabel; | ||||
|  | ||||
|     static ModelViewerInterface UI => ModelViewerInterface.GetInstance(); | ||||
|     static UISaveLoadPanel SaveLoadPanel => ModelViewerInterface.GetInstance().CanvasContainer.SaveLoadPanel; | ||||
|     static ModelViewerMain Main => ModelViewerMain.GetInstance(); | ||||
|  | ||||
|     public static UISceneContainer CreateNew(SceneSerializable sceneData, bool forceOverride) | ||||
| @@ -23,7 +23,7 @@ public class UISceneContainer : MonoBehaviour | ||||
|             return null; | ||||
|         } | ||||
|  | ||||
|         if (UI.SaveLoadPanel.GetSceneByName(sceneData.Filename, out var savedScene)) | ||||
|         if (SaveLoadPanel.GetSceneByName(sceneData.Filename, out var savedScene)) | ||||
|         { | ||||
|             if (!forceOverride) | ||||
|             { | ||||
| @@ -33,8 +33,8 @@ public class UISceneContainer : MonoBehaviour | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             savedScene = Instantiate(SharedResources.Instance.UISceneContainer, UI.ScenePresetToggle.content); | ||||
|             UI.SaveLoadPanel.AddScene(savedScene); | ||||
|             savedScene = Instantiate(SharedResources.Instance.UISceneContainer, SaveLoadPanel.ScrollScene.content); | ||||
|             SaveLoadPanel.AddScene(savedScene); | ||||
|         } | ||||
|  | ||||
|         savedScene.Init(sceneData); | ||||
| @@ -56,16 +56,16 @@ public class UISceneContainer : MonoBehaviour | ||||
|     { | ||||
|         var sceneName = NameLabel.text; | ||||
|  | ||||
|         if (UI.SaveLoadPanel.GetSceneByName(sceneName, out var savedScene)) | ||||
|         if (SaveLoadPanel.GetSceneByName(sceneName, out var savedScene)) | ||||
|         { | ||||
|             Error.Log(Color.red, "Preset with this name already exists"); | ||||
|             return; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             savedScene = Instantiate(SharedResources.Instance.UISceneContainer, UI.ScenePresetToggle.content); | ||||
|             savedScene = Instantiate(SharedResources.Instance.UISceneContainer, SaveLoadPanel.ScrollScene.content); | ||||
|             savedScene.NameLabel.text = sceneName; | ||||
|             UI.SaveLoadPanel.AddScene(savedScene); | ||||
|             SaveLoadPanel.AddScene(savedScene); | ||||
|         } | ||||
|  | ||||
|         savedScene.Save(); | ||||
| @@ -80,12 +80,12 @@ public class UISceneContainer : MonoBehaviour | ||||
|  | ||||
|         var sceneData = Main.SaveScene(); | ||||
|         sceneData.Filename = NameLabel.text; | ||||
|         string fileName = Path.GetFullPath(Path.Combine(Settings.SaveSceneDirectory, $"{sceneData.Filename}.scene")); | ||||
|         string fileName = Path.GetFullPath(Path.Combine(UISaveLoadPanel.SaveSceneDirectory, $"{sceneData.Filename}.scene")); | ||||
|  | ||||
|         try | ||||
|         { | ||||
|             var settings = new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.Auto, DefaultValueHandling = DefaultValueHandling.Ignore }; | ||||
|             var json = JsonConvert.SerializeObject(sceneData, Formatting.Indented, settings); | ||||
|             var json = JsonConvert.SerializeObject(sceneData, typeof(SceneSerializable), Formatting.Indented, settings); | ||||
|             File.WriteAllText(fileName, json); | ||||
|             if (!silenceMessage) | ||||
|             { | ||||
| @@ -110,7 +110,7 @@ public class UISceneContainer : MonoBehaviour | ||||
|     { | ||||
|         Destroy(this.gameObject); | ||||
|  | ||||
|         string path = Path.GetFullPath(Path.Combine(Settings.SaveSceneDirectory, $"{SceneData.Filename}.scene")); | ||||
|         string path = Path.GetFullPath(Path.Combine(UISaveLoadPanel.SaveSceneDirectory, $"{SceneData.Filename}.scene")); | ||||
|         if (File.Exists(path)) | ||||
|             File.Delete(path); | ||||
|          | ||||
|   | ||||
| @@ -21,8 +21,6 @@ public class UISettingsPanel : MonoBehaviour | ||||
|  | ||||
|     public void UpdateSettings(ModelViewerSettings settings) | ||||
|     { | ||||
|         Debug.Log("Updating"); | ||||
|  | ||||
|         for(int i = Content.childCount -1; i >= 0; i--) | ||||
|         { | ||||
|             Destroy(Content.GetChild(i).gameObject); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user