172 lines
5.5 KiB
C#
172 lines
5.5 KiB
C#
using System;
|
|
using System.IO;
|
|
using UniGLTF;
|
|
using UnityEditor;
|
|
using UnityEditorInternal;
|
|
using UnityEngine;
|
|
|
|
|
|
namespace VRM
|
|
{
|
|
[CustomEditor(typeof(BlendShapeClip))]
|
|
public class BlendShapeClipEditor : PreviewEditor
|
|
{
|
|
SerializedBlendShapeEditor m_serializedEditor;
|
|
|
|
BlendShapeClip m_target;
|
|
protected override PreviewSceneManager.BakeValue GetBakeValue()
|
|
{
|
|
return new PreviewSceneManager.BakeValue
|
|
{
|
|
BlendShapeBindings = m_target.Values,
|
|
MaterialValueBindings = m_target.MaterialValues,
|
|
Weight = 1.0f,
|
|
};
|
|
}
|
|
|
|
//SerializedProperty m_thumbnailProp;
|
|
SerializedProperty m_isBinaryProp;
|
|
|
|
protected override GameObject GetPrefab()
|
|
{
|
|
return m_target.Prefab;
|
|
}
|
|
|
|
protected override void OnEnable()
|
|
{
|
|
m_target = (BlendShapeClip)target;
|
|
|
|
base.OnEnable();
|
|
}
|
|
|
|
float m_previewSlider = 1.0f;
|
|
|
|
static Texture2D SaveResizedImage(RenderTexture rt, UnityPath path, int size)
|
|
{
|
|
var tex = new Texture2D(rt.width, rt.height, TextureFormat.RGB24, false);
|
|
RenderTexture.active = rt;
|
|
tex.ReadPixels(new Rect(0, 0, rt.width, rt.height), 0, 0);
|
|
tex.Apply();
|
|
|
|
//TextureScale.Scale(tex, size, size);
|
|
tex = TextureScale.GetResized(tex, size, size);
|
|
|
|
byte[] bytes;
|
|
switch (path.Extension.ToLower())
|
|
{
|
|
case ".png":
|
|
bytes = tex.EncodeToPNG();
|
|
break;
|
|
|
|
case ".jpg":
|
|
bytes = tex.EncodeToJPG();
|
|
break;
|
|
|
|
default:
|
|
throw new Exception();
|
|
}
|
|
|
|
if (Application.isPlaying)
|
|
{
|
|
UnityEngine.Object.Destroy(tex);
|
|
}
|
|
else
|
|
{
|
|
UnityEngine.Object.DestroyImmediate(tex);
|
|
}
|
|
File.WriteAllBytes(path.FullPath, bytes);
|
|
|
|
path.ImportAsset();
|
|
return path.LoadAsset<Texture2D>();
|
|
}
|
|
|
|
public override void OnInspectorGUI()
|
|
{
|
|
if (PreviewSceneManager == null)
|
|
{
|
|
return;
|
|
}
|
|
serializedObject.Update();
|
|
|
|
if (m_serializedEditor == null)
|
|
{
|
|
m_serializedEditor = new SerializedBlendShapeEditor(serializedObject, PreviewSceneManager);
|
|
//m_thumbnailProp = serializedObject.FindProperty("Thumbnail");
|
|
m_isBinaryProp = serializedObject.FindProperty("IsBinary");
|
|
}
|
|
|
|
EditorGUILayout.BeginHorizontal();
|
|
|
|
/*
|
|
int thumbnailSize = 96;
|
|
var objectReferenceValue = EditorGUILayout.ObjectField(m_thumbnailProp.objectReferenceValue, typeof(Texture), false,
|
|
GUILayout.Width(thumbnailSize), GUILayout.Height(thumbnailSize));
|
|
if (m_thumbnailProp.objectReferenceValue != objectReferenceValue)
|
|
{
|
|
m_thumbnailProp.objectReferenceValue = objectReferenceValue;
|
|
serializedObject.ApplyModifiedProperties();
|
|
}
|
|
*/
|
|
|
|
var changed = false;
|
|
EditorGUILayout.BeginVertical();
|
|
base.OnInspectorGUI();
|
|
EditorGUILayout.LabelField("Preview Weight");
|
|
var previewSlider = EditorGUILayout.Slider(m_previewSlider, 0, 1.0f);
|
|
GUI.enabled = PreviewTexture != null;
|
|
/*
|
|
if (GUILayout.Button("save thumbnail"))
|
|
{
|
|
//var ext = "jpg";
|
|
var ext = "png";
|
|
var asset = UnityPath.FromAsset(target);
|
|
var path = EditorUtility.SaveFilePanel(
|
|
"save thumbnail",
|
|
asset.Parent.FullPath,
|
|
string.Format("{0}.{1}", asset.FileNameWithoutExtension, ext),
|
|
ext);
|
|
if (!string.IsNullOrEmpty(path))
|
|
{
|
|
var thumbnail = SaveResizedImage(PreviewTexture, UnityPath.FromFullpath(path),
|
|
BlendShapeClipDrawer.ThumbnailSize);
|
|
m_thumbnailProp.objectReferenceValue = thumbnail;
|
|
serializedObject.ApplyModifiedProperties();
|
|
}
|
|
}
|
|
*/
|
|
GUI.enabled = true;
|
|
EditorGUILayout.EndVertical();
|
|
|
|
if (m_isBinaryProp.boolValue)
|
|
{
|
|
previewSlider = Mathf.Round(previewSlider);
|
|
}
|
|
if (previewSlider != m_previewSlider)
|
|
{
|
|
m_previewSlider = previewSlider;
|
|
changed = true;
|
|
}
|
|
|
|
EditorGUILayout.EndHorizontal();
|
|
Separator();
|
|
EditorGUILayout.Space();
|
|
|
|
var result = m_serializedEditor.Draw();
|
|
if ((changed || result.Changed) && PreviewSceneManager != null)
|
|
{
|
|
PreviewSceneManager.Bake(new PreviewSceneManager.BakeValue
|
|
{
|
|
BlendShapeBindings = result.BlendShapeBindings,
|
|
MaterialValueBindings = result.MaterialValueBindings,
|
|
Weight = m_previewSlider
|
|
});
|
|
}
|
|
}
|
|
|
|
public override string GetInfoString()
|
|
{
|
|
return BlendShapeKey.CreateFromClip((BlendShapeClip)target).ToString();
|
|
}
|
|
}
|
|
}
|