public void AssetPlaybackBar(Interface.AssetInterface asset, SerializedObject serializedObject) { if (asset == null) { return; } GUILayout.BeginVertical(GUI.skin.GetStyle("HelpBox")); { EditorGUILayout.LabelField("Playback Preview", EditorStyles.centeredGreyMiniLabel); GUILayout.Space(2); float currentTime = asset.GetCurrentTime(); float duration = asset.GetDuration(); Rect progressRect = EditorGUILayout.BeginHorizontal(GUILayout.MinHeight(18), GUILayout.MaxHeight(18)); { GUILayout.Space(18); Color backgroundcolor = new Color(0.1f, 0.1f, 0.1f, 1.0f); Color progressColor = new Color(0.0f, 0.37f, 0.62f, 1.0f); Handles.BeginGUI(); { Vector3[] points = new Vector3[] { new Vector3(progressRect.xMin, progressRect.yMin, 0), new Vector3(progressRect.xMax, progressRect.yMin, 0), new Vector3(progressRect.xMax, progressRect.yMax, 0), new Vector3(progressRect.xMin, progressRect.yMax, 0) }; Handles.color = backgroundcolor; Handles.DrawAAConvexPolygon(points); } Handles.EndGUI(); float progressX = Mathf.Lerp(progressRect.xMin, progressRect.xMax, (currentTime / duration)); // Progress Handles.BeginGUI(); { Vector3[] points = new Vector3[] { new Vector3(progressRect.xMin, progressRect.yMin, 0), new Vector3(progressX, progressRect.yMin, 0), new Vector3(progressX, progressRect.yMax, 0), new Vector3(progressRect.xMin, progressRect.yMax, 0) }; Handles.color = progressColor; Handles.DrawAAConvexPolygon(points); } Handles.EndGUI(); //ProgressLine Handles.BeginGUI(); { Vector3[] points = new Vector3[] { new Vector3(progressX, progressRect.yMin, 0), new Vector3(progressX, progressRect.yMax, 0) }; Handles.color = Color.white; Handles.DrawLine(points[0], points[1]); } Handles.EndGUI(); GUIStyle timeStyle = new GUIStyle("label"); timeStyle.alignment = TextAnchor.MiddleCenter; timeStyle.normal.textColor = Color.white; EditorGUI.LabelField(progressRect, currentTime.ToString("f2") + " / " + asset.GetDuration().ToString("f2"), timeStyle); } EditorGUILayout.EndHorizontal(); float mouseXPos = Event.current.mousePosition.x; if (progressRect.Contains(Event.current.mousePosition)) { Handles.BeginGUI(); { Vector2 startPoint = new Vector2(mouseXPos, progressRect.yMin); Vector2 endPoint = new Vector2(mouseXPos, progressRect.yMax); Vector2 startTangent = new Vector2(mouseXPos, progressRect.yMax); Vector2 endTangent = new Vector2(mouseXPos, progressRect.yMin); Handles.DrawBezier(startPoint, endPoint, startTangent, endTangent, Color.white, null, 3); } Handles.EndGUI(); if ((Event.current.type == EventType.MouseDown || Event.current.type == EventType.MouseDrag) && Event.current.button == 0) { float mouseTimeProgress = Mathf.InverseLerp(progressRect.xMin, progressRect.xMax, mouseXPos); float time = Mathf.Lerp(0, duration, mouseTimeProgress); asset.Seek(time); } } GUILayout.BeginHorizontal(); { GUILayout.FlexibleSpace(); GUILayoutOption[] buttonGLO = new GUILayoutOption[] { GUILayout.MinWidth(30), GUILayout.MinHeight(30), GUILayout.MaxHeight(30), GUILayout.MaxWidth(30), }; Color origColor = GUI.backgroundColor; GUI.backgroundColor = new Color(0.6f, 0.6f, 0.6f, 1.0f); if (GUILayout.Button(EditorSharedResources.instance.hvrActorStepBack, buttonGLO)) { foreach (HvrActor actor in serializedObject.targetObjects) { if (actor.assetInterface != null) { actor.assetInterface.Step(-1); } } } if (asset.IsPlaying()) { if (GUILayout.Button(EditorSharedResources.instance.hvrActorPause, buttonGLO)) { foreach (HvrActor actor in serializedObject.targetObjects) { if (actor.assetInterface != null) { actor.assetInterface.Pause(); } } } } else { if (GUILayout.Button(EditorSharedResources.instance.hvrActorPlay, buttonGLO)) { foreach (HvrActor actor in serializedObject.targetObjects) { if (actor.assetInterface != null) { actor.assetInterface.Play(); } } } } if (GUILayout.Button(EditorSharedResources.instance.hvrActorStop, buttonGLO)) { foreach (HvrActor actor in serializedObject.targetObjects) { if (actor.assetInterface != null) { actor.assetInterface.Stop(); } } } if (GUILayout.Button(EditorSharedResources.instance.hvrActorStepForward, buttonGLO)) { foreach (HvrActor actor in serializedObject.targetObjects) { if (actor.assetInterface != null) { actor.assetInterface.Step(1); } } } Texture2D loopTex = EditorSharedResources.instance.hvrActorStepLoopOff; if (asset.IsLooping()) { loopTex = EditorSharedResources.instance.hvrActorStepLoopOn; } if (GUILayout.Button(loopTex, buttonGLO)) { foreach (HvrActor actor in serializedObject.targetObjects) { if (actor.assetInterface != null) { actor.assetInterface.SetLooping(!actor.assetInterface.IsLooping()); } } } GUI.backgroundColor = origColor; GUILayout.FlexibleSpace(); } GUILayout.EndHorizontal(); } GUILayout.EndVertical(); }
public override void ProcessFrame(Playable playable, FrameData info, object playerData) { if (m_Clips == null) { return; } HvrActor actor = playerData as HvrActor; if (actor == null) { return; } // Allow for the previous asset that was assigned to the HvrActor to // be set back when this graph ends if (actor != null && !m_firstFrameHappened) { m_firstFrameHappened = true; m_trackBindingActor = actor; m_originalAssetInterface = actor.assetInterface; m_originalActorRenderMethodType = actor.renderMethodType; } Interface.AssetInterface current_asset = null; float greatestWeight = 0; int inputPort = 0; foreach (TimelineClip clip in m_Clips) { float inputWeight = playable.GetInputWeight(inputPort); ScriptPlayable <HvrActor_AssetBehavior> scriptPlayable = (ScriptPlayable <HvrActor_AssetBehavior>)playable.GetInput(inputPort); HvrActor_AssetBehavior hvrAssetBehavior = scriptPlayable.GetBehaviour(); if (hvrAssetBehavior != null) { double preloadTime = Math.Max(0.0, hvrAssetBehavior.preloadTime); if (m_Director.time >= clip.start + clip.duration || m_Director.time <= clip.start - preloadTime) { hvrAssetBehavior.StopAsset(); } else if (m_Director.time > clip.start - preloadTime) { hvrAssetBehavior.PrepareAsset(); } // If this behavior is within the range of the clip, then take it's asset and // overwrite the activeAsset in order to ensure that only one asset is assigned per // evaluation to the target HvrActor // this assumes that the order of clips remain in a consistent order between frames if (m_Director.time >= clip.start && m_Director.time <= clip.end) { if (inputWeight >= greatestWeight) { greatestWeight = inputWeight; current_asset = hvrAssetBehavior.asset; } } } ++inputPort; } if (!string.IsNullOrEmpty(m_originalActorRenderMethodType) && m_originalActorRenderMethodType != actor.renderMethodType) { // TODO Remove this warning once this bug is fixed - Tom Debug.LogError("HvrActor RenderMethod changed while a Timeline Clip was playing. This behavior is unsupported"); return; } if (actor.actorInterface != null && actor.assetInterface != current_asset) { actor.SetAssetInterface(current_asset); } }