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