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();
        }
예제 #2
0
        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);
            }
        }