You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
376 lines
13 KiB
376 lines
13 KiB
using System.IO;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
using uc;
|
|
[CustomEditor(typeof(DShowClip))]
|
|
public class DShowClipEditor : PlayerPreviewEditorBase
|
|
{
|
|
private DShowPlayer _player;
|
|
protected override DShowPlayer player { get { if (_player == null) _player = new DShowPlayer(); return _player; } }
|
|
protected override DShowClip clip { get { return target as DShowClip; } }
|
|
|
|
public void OnDestroy()
|
|
{
|
|
player.release();
|
|
}
|
|
|
|
public override GUIContent GetPreviewTitle()
|
|
{
|
|
return new GUIContent("DShowClip");
|
|
}
|
|
|
|
[MenuItem("Assets/Create/UltraCombos/DShowClip")]
|
|
public static void CreateAsset()
|
|
{
|
|
CreateAsset<DShowClip>();
|
|
}
|
|
private static void CreateAsset<T>() where T : ScriptableObject
|
|
{
|
|
T asset = ScriptableObject.CreateInstance<T>();
|
|
|
|
string path = AssetDatabase.GetAssetPath(Selection.activeObject);
|
|
if (path == "")
|
|
{
|
|
path = "Assets";
|
|
}
|
|
else if (Path.GetExtension(path) != "")
|
|
{
|
|
path = path.Replace(Path.GetFileName(AssetDatabase.GetAssetPath(Selection.activeObject)), "");
|
|
}
|
|
|
|
string assetPathAndName = AssetDatabase.GenerateUniqueAssetPath(path + "/New " + typeof(T).ToString() + ".asset");
|
|
|
|
AssetDatabase.CreateAsset(asset, assetPathAndName);
|
|
|
|
AssetDatabase.SaveAssets();
|
|
EditorUtility.FocusProjectWindow();
|
|
Selection.activeObject = asset;
|
|
}
|
|
|
|
|
|
private SerializedProperty _propLocation;
|
|
private SerializedProperty _propPath;
|
|
|
|
private static GUIStyle _mediaNameStyle = null;
|
|
|
|
#if UNITY_EDITOR_OSX
|
|
private const string MediaExtensions = "mp4,m4v,mov,avi,mp3,m4a,aac,ac3,au,aiff,wav";
|
|
#else
|
|
//private const string MediaExtensions = "Media Files;*.mp4;*.mov;*.m4v;*.avi;*.mkv;*.ts;*.webm;*.flv;*.vob;*.ogg;*.ogv;*.mpg;*.wmv;*.3gp;Audio Files;*wav;*.mp3;*.mp2;*.m4a;*.wma;*.aac;*.au;*.flac";
|
|
private const string MediaExtensions = "Media Files;*.avi";
|
|
#endif
|
|
|
|
|
|
void OnEnable()
|
|
{
|
|
_propLocation = serializedObject.FindProperty("m_VideoLocation");
|
|
_propPath = serializedObject.FindProperty("m_VideoPath");
|
|
}
|
|
|
|
private static bool IsPathWithin(string fullPath, string targetPath)
|
|
{
|
|
return fullPath.StartsWith(targetPath);
|
|
}
|
|
|
|
private static string GetPathRelativeTo(string root, string fullPath)
|
|
{
|
|
#if true
|
|
return fullPath.GetRelativePath(root);
|
|
#else
|
|
string result = fullPath.Remove(0, root.Length);
|
|
if (result.StartsWith(System.IO.Path.DirectorySeparatorChar.ToString()) || result.StartsWith(System.IO.Path.AltDirectorySeparatorChar.ToString()))
|
|
{
|
|
result = result.Remove(0, 1);
|
|
}
|
|
return result;
|
|
#endif
|
|
|
|
}
|
|
|
|
public override void OnInspectorGUI()
|
|
{
|
|
DShowClip media = (this.target) as DShowClip;
|
|
|
|
serializedObject.Update();
|
|
|
|
if (media == null || _propLocation == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
GUILayout.Space(6f);
|
|
|
|
/////////////////// FILE PATH
|
|
|
|
// Display the file name and buttons to load new files
|
|
OnInspectorGUI_CopyableFilename(media.m_VideoPath);
|
|
|
|
EditorGUILayout.LabelField("Source Path", EditorStyles.boldLabel);
|
|
|
|
EditorGUILayout.PropertyField(_propLocation, GUIContent.none);
|
|
|
|
{
|
|
string oldPath = _propPath.stringValue;
|
|
string newPath = EditorGUILayout.TextField(string.Empty, _propPath.stringValue);
|
|
if (newPath != oldPath)
|
|
{
|
|
// Check for invalid characters
|
|
if (0 > newPath.IndexOfAny(System.IO.Path.GetInvalidPathChars()))
|
|
{
|
|
_propPath.stringValue = newPath.Replace("\\", "/");
|
|
EditorUtility.SetDirty(target);
|
|
}
|
|
}
|
|
}
|
|
|
|
//if (!Application.isPlaying)
|
|
{
|
|
GUILayout.BeginHorizontal();
|
|
GUI.color = Color.green;
|
|
if (GUILayout.Button("BROWSE"))
|
|
{
|
|
string startFolder = GetStartFolder(_propPath.stringValue, (DShowClip.FileLocation)_propLocation.enumValueIndex);
|
|
string videoPath = media.m_VideoPath;
|
|
string fullPath = string.Empty;
|
|
DShowClip.FileLocation fileLocation = media.m_VideoLocation;
|
|
if (Browse(startFolder, ref videoPath, ref fileLocation, ref fullPath, MediaExtensions))
|
|
{
|
|
_propPath.stringValue = videoPath.Replace("\\", "/");
|
|
_propLocation.enumValueIndex = (int)fileLocation;
|
|
EditorUtility.SetDirty(target);
|
|
}
|
|
}
|
|
GUI.color = Color.white;
|
|
GUILayout.EndHorizontal();
|
|
|
|
//ShowFileWarningMessages(_propPath.stringValue, (FileLocation)_propLocation.enumValueIndex, media.m_AutoOpen, Platform.Unknown);
|
|
GUI.color = Color.white;
|
|
}
|
|
GUILayout.BeginHorizontal();
|
|
if (GUILayout.Button("SpawnAnimation"))
|
|
{
|
|
MakeAnimationCaller((DShowClip)target);
|
|
}
|
|
GUILayout.EndHorizontal();
|
|
|
|
|
|
|
|
|
|
//////////////////// PREVIEW
|
|
|
|
//OnInspectorGUI_Preview();
|
|
|
|
if (serializedObject.ApplyModifiedProperties())
|
|
{
|
|
EditorUtility.SetDirty(target);
|
|
}
|
|
}
|
|
|
|
private void OnInspectorGUI_CopyableFilename(string path)
|
|
{
|
|
// Display the file name so it's easy to read and copy to the clipboard
|
|
if (!string.IsNullOrEmpty(path) && 0 > path.IndexOfAny(System.IO.Path.GetInvalidPathChars()))
|
|
{
|
|
// Some GUI hacks here because SelectableLabel wants to be double height and it doesn't want to be centered because it's an EditorGUILayout function...
|
|
GUI.backgroundColor = new Color(0.8f, 0.8f, 0.8f, 0.1f);
|
|
if (EditorGUIUtility.isProSkin)
|
|
{
|
|
GUI.backgroundColor = Color.black;
|
|
GUI.color = Color.cyan;
|
|
}
|
|
string text = System.IO.Path.GetFileName(path);
|
|
|
|
if (_mediaNameStyle == null)
|
|
{
|
|
_mediaNameStyle = new GUIStyle(EditorStyles.wordWrappedLabel);
|
|
_mediaNameStyle.fontStyle = FontStyle.Bold;
|
|
_mediaNameStyle.stretchWidth = true;
|
|
_mediaNameStyle.stretchHeight = true;
|
|
_mediaNameStyle.alignment = TextAnchor.MiddleCenter;
|
|
_mediaNameStyle.margin.top = 8;
|
|
_mediaNameStyle.margin.bottom = 16;
|
|
}
|
|
|
|
float height = _mediaNameStyle.CalcHeight(new GUIContent(text), Screen.width) * 1.5f;
|
|
EditorGUILayout.SelectableLabel(text, _mediaNameStyle, GUILayout.Height(height), GUILayout.ExpandHeight(false), GUILayout.ExpandWidth(true));
|
|
|
|
GUI.color = Color.white;
|
|
GUI.backgroundColor = Color.white;
|
|
}
|
|
}
|
|
|
|
private static string GetStartFolder(string path, DShowClip.FileLocation fileLocation)
|
|
{
|
|
// Try to resolve based on file path + file location
|
|
string result = DShowClip.GetFilePath(path, fileLocation);
|
|
if (!string.IsNullOrEmpty(result))
|
|
{
|
|
if (System.IO.File.Exists(result))
|
|
{
|
|
result = System.IO.Path.GetDirectoryName(result);
|
|
}
|
|
}
|
|
|
|
if (!System.IO.Directory.Exists(result))
|
|
{
|
|
// Just resolve on file location
|
|
result = DShowClip.GetPath(fileLocation);
|
|
}
|
|
if (string.IsNullOrEmpty(result))
|
|
{
|
|
// Fallback
|
|
result = Application.streamingAssetsPath;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
private static bool Browse(string startPath, ref string filePath, ref DShowClip.FileLocation fileLocation, ref string fullPath, string extensions)
|
|
{
|
|
bool result = false;
|
|
|
|
string path = UnityEditor.EditorUtility.OpenFilePanel("Browse Video File", startPath, extensions);
|
|
if (!string.IsNullOrEmpty(path) && !path.EndsWith(".meta"))
|
|
{
|
|
fullPath = path;
|
|
GetRelativeLocationFromPath(path, ref filePath, ref fileLocation);
|
|
result = true;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
private static void GetRelativeLocationFromPath(string path, ref string filePath, ref DShowClip.FileLocation fileLocation)
|
|
{
|
|
string projectRoot = System.IO.Path.GetFullPath(System.IO.Path.Combine(Application.dataPath, ".."));
|
|
projectRoot = projectRoot.Replace('\\', '/');
|
|
#if true
|
|
switch(fileLocation)
|
|
{
|
|
case DShowClip.FileLocation.RelativeToStreamingAssetsFolder:
|
|
// Must be StreamingAssets relative path
|
|
filePath = GetPathRelativeTo(Application.streamingAssetsPath, path);
|
|
fileLocation = DShowClip.FileLocation.RelativeToStreamingAssetsFolder;
|
|
break;
|
|
case DShowClip.FileLocation.RelativeToDataFolder:
|
|
// Must be Assets relative path
|
|
filePath = GetPathRelativeTo(Application.dataPath, path);
|
|
fileLocation = DShowClip.FileLocation.RelativeToDataFolder;
|
|
break;
|
|
case DShowClip.FileLocation.RelativeToProjectFolder:
|
|
// Must be project relative path
|
|
filePath = GetPathRelativeTo(projectRoot, path);
|
|
fileLocation = DShowClip.FileLocation.RelativeToProjectFolder;
|
|
break;
|
|
case DShowClip.FileLocation.RelativeToPeristentDataFolder:
|
|
filePath = GetPathRelativeTo(Application.persistentDataPath, path);
|
|
fileLocation = DShowClip.FileLocation.RelativeToPeristentDataFolder;
|
|
break;
|
|
|
|
case DShowClip.FileLocation.AbsolutePathOrURL:
|
|
default:
|
|
// Must be absolute path
|
|
filePath = path;
|
|
fileLocation = DShowClip.FileLocation.AbsolutePathOrURL;
|
|
break;
|
|
}
|
|
#else
|
|
if (path.StartsWith(projectRoot))
|
|
{
|
|
if (path.StartsWith(Application.streamingAssetsPath))
|
|
{
|
|
// Must be StreamingAssets relative path
|
|
filePath = GetPathRelativeTo(Application.streamingAssetsPath, path);
|
|
fileLocation = DShowClip.FileLocation.RelativeToStreamingAssetsFolder;
|
|
}
|
|
else if (path.StartsWith(Application.dataPath))
|
|
{
|
|
// Must be Assets relative path
|
|
filePath = GetPathRelativeTo(Application.dataPath, path);
|
|
fileLocation = DShowClip.FileLocation.RelativeToDataFolder;
|
|
}
|
|
else
|
|
{
|
|
// Must be project relative path
|
|
filePath = GetPathRelativeTo(projectRoot, path);
|
|
fileLocation = DShowClip.FileLocation.RelativeToProjectFolder;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Must be persistant data
|
|
if (path.StartsWith(Application.persistentDataPath))
|
|
{
|
|
filePath = GetPathRelativeTo(Application.persistentDataPath, path);
|
|
fileLocation = DShowClip.FileLocation.RelativeToPeristentDataFolder;
|
|
}
|
|
|
|
// Must be absolute path
|
|
filePath = path;
|
|
fileLocation = DShowClip.FileLocation.AbsolutePathOrURL;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
public void MakeAnimationCaller(DShowClip DSclip)
|
|
{
|
|
makeAnime(DSclip);
|
|
}
|
|
|
|
void makeAnime(DShowClip DSclips)
|
|
{
|
|
AnimationClip NewClip = new AnimationClip();
|
|
NewClip.wrapMode = WrapMode.Loop;
|
|
SerializedObject serializedClip = new SerializedObject(NewClip);
|
|
SerializedProperty settings = serializedClip.FindProperty("m_AnimationClipSettings");
|
|
while (settings.Next(true))
|
|
{
|
|
if (settings.name == "m_LoopTime")
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
settings.boolValue = true;
|
|
serializedClip.ApplyModifiedProperties();
|
|
|
|
{
|
|
ObjectReferenceKeyframe[] Keyframes = new ObjectReferenceKeyframe[2];
|
|
Keyframes[0] = new ObjectReferenceKeyframe();
|
|
Keyframes[0].time = 0.1f;
|
|
//Keyframes[0].value = DSclips;
|
|
|
|
Keyframes[1] = new ObjectReferenceKeyframe();
|
|
Keyframes[1].time = player.GetDuration;
|
|
|
|
EditorCurveBinding curveBinding = new EditorCurveBinding();
|
|
curveBinding.type = typeof(DShowListMoviePlayer);
|
|
curveBinding.path = string.Empty;
|
|
curveBinding.propertyName = "videoAsset";
|
|
|
|
AnimationUtility.SetObjectReferenceCurve(NewClip, curveBinding, Keyframes);
|
|
}
|
|
|
|
{
|
|
AnimationEvent[] m_event = new AnimationEvent[1];
|
|
m_event[0] = new AnimationEvent();
|
|
//m_event[0].stringParameter = DSclips.name;
|
|
m_event[0].objectReferenceParameter = DSclips;
|
|
m_event[0].functionName = "Play";
|
|
m_event[0].time = 0;
|
|
|
|
AnimationUtility.SetAnimationEvents(NewClip, m_event);
|
|
}
|
|
|
|
{
|
|
string filePath = AssetDatabase.GetAssetPath(DSclips);
|
|
string[] PathSp = filePath.Split(new char[] { '.' });
|
|
if (PathSp.Length > 1)
|
|
{
|
|
filePath = "";
|
|
for (int i = 0; i < PathSp.Length - 1; i++)
|
|
{
|
|
filePath += PathSp[i];
|
|
}
|
|
}
|
|
AssetDatabase.CreateAsset(NewClip, filePath + ".anim");
|
|
}
|
|
}
|
|
}
|
|
|