Beispiel #1
0
    public void DrawSimple(Color color, Matrix4x4[] transformations)
    {
        UltiDraw.Begin();

        if (DrawSkeleton)
        {
            Action <Bone> recursion = null;
            recursion = new Action <Bone>((bone) => {
                if (bone.GetParent() != null)
                {
                    UltiDraw.DrawLine(transformations[bone.GetParent().Index].GetPosition(), transformations[bone.Index].GetPosition(), color);
                }
                UltiDraw.DrawCircle(transformations[bone.Index].GetPosition(), 0.02f, Color.Lerp(color, UltiDraw.Black, 0.25f));
                for (int i = 0; i < bone.Childs.Length; i++)
                {
                    recursion(bone.GetChild(i));
                }
            });
            if (Bones.Length > 0)
            {
                recursion(Bones[0]);
            }
        }

        UltiDraw.End();
    }
Beispiel #2
0
 public void Draw()
 {
     UltiDraw.Begin();
     UltiDraw.DrawTranslateGizmo(Pivot.GetPosition(), Pivot.GetRotation(), 0.1f);
     for (int i = 0; i < Points.Length; i++)
     {
         UltiDraw.DrawLine(Pivot.GetPosition(), Points[i], UltiDraw.DarkGreen.Transparent(0.1f));
         UltiDraw.DrawCircle(Points[i], 0.025f, UltiDraw.Orange.Transparent(0.5f));
     }
     UltiDraw.End();
 }
Beispiel #3
0
    public void Draw(int step = 1)
    {
        UltiDraw.Begin();
        //Connections
        for (int i = 0; i < Points.Length - step; i += step)
        {
            UltiDraw.DrawLine(Points[i].GetPosition(), Points[i + step].GetPosition(), 0.01f, UltiDraw.Black);
        }

        //Projections
        for (int i = 0; i < Points.Length; i += step)
        {
            //	Vector3 right = Points[i].GetRightSample();
            //	Vector3 left = Points[i].GetLeftSample();
            //	UltiDraw.DrawCircle(right, 0.01f, Utility.Yellow);
            //	UltiDraw.DrawCircle(left, 0.01f, Utility.Yellow);
        }

        //Velocities
        Color transparentVelocity = UltiDraw.DarkGreen.Transparent(0.25f);

        for (int i = 0; i < Points.Length; i += step)
        {
            Vector3 start = Points[i].GetPosition();
            Vector3 end   = Points[i].GetPosition() + Points[i].GetVelocity() * Points[i].GetDirection();
            end = Utility.ProjectGround(end, LayerMask.GetMask("Ground"));
            UltiDraw.DrawLine(start, end, 0.025f, 0f, transparentVelocity);
        }

        //Directions
        Color transparentDirection = UltiDraw.Orange.Transparent(0.75f);

        for (int i = 0; i < Points.Length; i += step)
        {
            Vector3 start = Points[i].GetPosition();
            Vector3 end   = Points[i].GetPosition() + 0.25f * Points[i].GetDirection();
            end = Utility.ProjectGround(end, LayerMask.GetMask("Ground"));
            UltiDraw.DrawLine(start, end, 0.025f, 0f, transparentDirection);
        }

        //Slopes
        //Color transparentSlope = Utility.Blue.Transparent(0.75f);
        for (int i = 0; i < Points.Length; i += step)
        {
            //	UltiDraw.DrawLine(Points[i].GetPosition(), Points[i].GetPosition() + 1f * Points[i].GetSlope() * Vector3.up, 0.025f, 0f, transparentSlope);
        }

        //Positions
        for (int i = 0; i < Points.Length; i += step)
        {
            UltiDraw.DrawCircle(Points[i].GetPosition(), 0.025f, UltiDraw.Black);
        }
        UltiDraw.End();
    }
Beispiel #4
0
 public void Draw()
 {
     UltiDraw.Begin();
     UltiDraw.DrawTranslateGizmo(Pivot.GetPosition(), Pivot.GetRotation(), 0.1f);
     for (int i = 0; i < Points.Length; i++)
     {
         Vector3 bottom = new Vector3(Points[i].x, Pivot.GetPosition().y, Points[i].z);
         Vector3 top    = Points[i];
         UltiDraw.DrawLine(bottom, top, UltiDraw.Green.Transparent(0.25f));
         UltiDraw.DrawCircle(bottom, 0.015f, UltiDraw.DarkGrey.Transparent(0.5f));
         UltiDraw.DrawCircle(top, 0.025f, UltiDraw.Mustard.Transparent(0.5f));
     }
     UltiDraw.End();
 }
Beispiel #5
0
 private void DrawSimple(Segment segment)
 {
     if (segment == null)
     {
         return;
     }
     for (int i = 0; i < segment.GetChildCount(); i++)
     {
         Segment child = segment.GetChild(Hierarchy, i);
         UltiDraw.DrawLine(segment.GetTransformation().GetPosition(), child.GetTransformation().GetPosition(), Color.grey);
     }
     UltiDraw.DrawCircle(segment.GetTransformation().GetPosition(), 0.01f, Color.black);
     for (int i = 0; i < segment.GetChildCount(); i++)
     {
         DrawSimple(segment.GetChild(Hierarchy, i));
     }
 }
Beispiel #6
0
 private void DrawSimple(Segment segment, Color color)
 {
     if (segment == null)
     {
         return;
     }
     for (int i = 0; i < segment.GetChildCount(); i++)
     {
         Segment child = segment.GetChild(Hierarchy, i);
         UltiDraw.DrawLine(segment.GetTransformation().GetPosition(), child.GetTransformation().GetPosition(), color);
     }
     UltiDraw.DrawCircle(segment.GetTransformation().GetPosition(), 0.02f, Color.Lerp(color, UltiDraw.Black, 0.25f));
     for (int i = 0; i < segment.GetChildCount(); i++)
     {
         DrawSimple(segment.GetChild(Hierarchy, i), color);
     }
 }
    public void Draw(float[] mean = null, float[] std = null)
    {
        //return;
        UltiDraw.Begin();

        //Quaternion rotation = Pivot.GetRotation() * Quaternion.Euler(90f, 0f, 0f);
        Color color = UltiDraw.IndianRed.Transparent(0.5f);

        //float area = (float)Size/(float)(Resolution-1);
        for (int i = 0; i < Points.Length; i++)
        {
            UltiDraw.DrawCircle(Points[i], 0.025f, color);
            //UltiDraw.DrawQuad(Points[i], rotation, area, area, color);
        }

        UltiDraw.End();
    }
Beispiel #8
0
        public void Draw()
        {
            int step = TimeSeries.Resolution;

            UltiDraw.Begin();
            //Connections
            for (int i = 0; i < Transformations.Length - step; i += step)
            {
                UltiDraw.DrawLine(Transformations[i].GetPosition(), Transformations[i + step].GetPosition(), 0.01f, UltiDraw.Black);
            }

            //Positions
            for (int i = 0; i < Transformations.Length; i += step)
            {
                UltiDraw.DrawCircle(Transformations[i].GetPosition(), 0.025f, UltiDraw.Black);
            }

            //Directions
            for (int i = 0; i < Transformations.Length; i += step)
            {
                UltiDraw.DrawLine(Transformations[i].GetPosition(), Transformations[i].GetPosition() + 0.25f * Transformations[i].GetForward(), 0.025f, 0f, UltiDraw.Orange.Transparent(0.75f));
            }

            //Velocities
            for (int i = 0; i < Velocities.Length; i += step)
            {
                UltiDraw.DrawLine(Transformations[i].GetPosition(), Transformations[i].GetPosition() + Velocities[i], 0.025f, 0f, UltiDraw.DarkGreen.Transparent(0.25f));
            }

            /*
             * //Velocity Magnitudes
             * List<float[]> functions = new List<float[]>();
             * float[] magnitudes = new float[Velocities.Length];
             * for(int i=0; i<Velocities.Length; i++) {
             *      magnitudes[i] = Velocities[i].magnitude;
             * }
             * functions.Add(magnitudes);
             * functions.Add(Speeds);
             * UltiDraw.DrawGUIFunctions(new Vector2(0.125f, 0.125f), new Vector2(0.2f, 0.1f), functions, 0f, 5f, 0.0025f, UltiDraw.DarkGrey, new Color[2]{UltiDraw.DarkGreen, UltiDraw.DarkRed}, 0.0025f, UltiDraw.Black);
             */

            UltiDraw.End();
        }
Beispiel #9
0
    public override void Draw(Camera canvas = null)
    {
        if (DrawScene)
        {
            UltiDraw.Begin(canvas);

            float size = 2f;
            int   step = Resolution;

            //Connections
            for (int i = 0; i < Transformations.Length - step; i += step)
            {
                UltiDraw.DrawLine(Transformations[i].GetPosition(), Transformations[i + step].GetPosition(), Transformations[i].GetUp(), size * 0.01f, UltiDraw.Black);
            }

            //Positions
            for (int i = 0; i < Transformations.Length; i += step)
            {
                UltiDraw.DrawCircle(Transformations[i].GetPosition(), size * 0.025f, i % Resolution == 0 ? UltiDraw.Black : UltiDraw.Red.Opacity(0.5f));
            }

            //Directions
            for (int i = 0; i < Transformations.Length; i += step)
            {
                UltiDraw.DrawLine(Transformations[i].GetPosition(), Transformations[i].GetPosition() + 0.25f * Transformations[i].GetForward(), Transformations[i].GetUp(), size * 0.025f, 0f, UltiDraw.Orange.Opacity(0.75f));
            }

            //Velocities
            for (int i = 0; i < Velocities.Length; i += step)
            {
                UltiDraw.DrawLine(Transformations[i].GetPosition(), Transformations[i].GetPosition() + GetTemporalScale(Velocities[i]), Transformations[i].GetUp(), size * 0.0125f, 0f, UltiDraw.DarkGreen.Opacity(0.25f));
            }

            //Target
            // UltiDraw.DrawSphere(TargetPosition, Quaternion.identity, 0.25f, UltiDraw.Black);
            // UltiDraw.DrawLine(TargetPosition, TargetPosition + 0.25f*TargetDirection, Vector3.up, size*0.05f, 0f, UltiDraw.Orange);
            // UltiDraw.DrawLine(TargetPosition, TargetPosition + TargetVelocity, Vector3.up, size*0.025f, 0f, UltiDraw.DarkGreen);

            UltiDraw.End();
        }
    }
Beispiel #10
0
    public void Draw(int step = 1)
    {
        UltiDraw.Begin();

        Color[] colors = UltiDraw.GetRainbowColors(Styles);

        //Connections
        for (int i = 0; i < Points.Length - step; i += step)
        {
            UltiDraw.DrawLine(Points[i].GetPosition(), Points[i + step].GetPosition(), 0.01f, UltiDraw.Black);
        }

        //Velocities
        for (int i = 0; i < Points.Length; i += step)
        {
            //Vector3 start = Points[i].GetPosition();
            //Vector3 end = Points[i].GetPosition() + Points[i].GetVelocity();
            //end = Utility.ProjectGround(end, LayerMask.GetMask("Ground"));
            //UltiDraw.DrawLine(start, end, 0.025f, 0f, UltiDraw.DarkGreen.Transparent(0.5f));

            /*
             * float r = 0f;
             * float g = 0f;
             * float b = 0f;
             * for(int j=0; j<Points[i].Styles.Length; j++) {
             *      r += Points[i].Styles[j] * colors[j].r;
             *      g += Points[i].Styles[j] * colors[j].g;
             *      b += Points[i].Styles[j] * colors[j].b;
             * }
             * UltiDraw.DrawLine(Points[i].GetPosition(), Points[i].GetPosition() + Points[i].GetVelocity(), 0.025f, 0f, new Color(r, g, b, 0.5f));
             */

            //UltiDraw.DrawLine(Points[i].GetPosition(), Points[i].GetPosition() + Points[i].GetVelocity(), 0.025f, 0f, UltiDraw.DarkGreen.Transparent(0.5f));
        }

        //Directions
        for (int i = 0; i < Points.Length; i += step)
        {
            //Vector3 start = Points[i].GetPosition();
            //Vector3 end = Points[i].GetPosition() + 0.25f * Points[i].GetDirection();
            //end = Utility.ProjectGround(end, LayerMask.GetMask("Ground"));
            //UltiDraw.DrawLine(start, end, 0.025f, 0f, UltiDraw.Orange.Transparent(0.75f));
            UltiDraw.DrawLine(Points[i].GetPosition(), Points[i].GetPosition() + 0.25f * Points[i].GetDirection(), 0.025f, 0f, UltiDraw.Orange.Transparent(0.75f));
        }

        //Styles
        if (Styles > 0)
        {
            for (int i = 0; i < Points.Length; i += step)
            {
                float r = 0f;
                float g = 0f;
                float b = 0f;
                for (int j = 0; j < Points[i].Styles.Length; j++)
                {
                    r += Points[i].Styles[j] * colors[j].r;
                    g += Points[i].Styles[j] * colors[j].g;
                    b += Points[i].Styles[j] * colors[j].b;
                }
                UltiDraw.DrawCube(Points[i].GetPosition(), Points[i].GetRotation(), 0.05f, new Color(r, g, b, 1f));
            }
        }

        /*
         * //Speed
         * for(int i=0; i<Points.Length; i+=step) {
         *      float r = 0f;
         *      float g = 0f;
         *      float b = 0f;
         *      for(int j=0; j<Points[i].Styles.Length; j++) {
         *              r += Points[i].Styles[j] * colors[j].r;
         *              g += Points[i].Styles[j] * colors[j].g;
         *              b += Points[i].Styles[j] * colors[j].b;
         *      }
         *      UltiDraw.DrawArrow(Points[i].GetPosition(), Points[i].GetPosition() + Points[i].GetSpeed() * Points[i].GetTransformation().GetForward(), 0.8f, 0.02f, 0.04f, new Color(r, g, b, 0.5f));
         * }
         */

        //Projections
        //for(int i=0; i<Points.Length; i+=step) {
        //	Vector3 right = Points[i].GetRightSample();
        //	Vector3 left = Points[i].GetLeftSample();
        //	UltiDraw.DrawCircle(right, 0.01f, UltiDraw.Yellow);
        //	UltiDraw.DrawCircle(left, 0.01f, UltiDraw.Yellow);
        //}

        //Slopes
        //for(int i=0; i<Points.Length; i+=step) {
        //	UltiDraw.DrawLine(Points[i].GetPosition(), Points[i].GetPosition() + 1f * Points[i].GetSlope() * Vector3.up, 0.025f, 0f, UltiDraw.Blue.Transparent(0.75f));
        //}

        //Positions
        for (int i = 0; i < Points.Length; i += step)
        {
            UltiDraw.DrawCircle(Points[i].GetPosition(), 0.025f, UltiDraw.Black);
        }

        //Phase
        for (int i = 0; i < Points.Length; i += step)
        {
            UltiDraw.DrawLine(Points[i].GetPosition(), Points[i].GetPosition() + Points[i].Phase * Vector3.up, UltiDraw.IndianRed);
        }

        UltiDraw.End();
    }
Beispiel #11
0
    public void Draw(int step = 1)
    {
        UltiDraw.Begin();

        Color[] colors = UltiDraw.GetRainbowColors(Styles.Length);

        //Connections,黑线连接评估点,这些点以step=10为间隔就画一个,总共12个,历史6个,当前1个,预测5个
        for (int i = 0; i < Points.Length - step; i += step)
        {
            UltiDraw.DrawLine(Points[i].GetPosition(), Points[i + step].GetPosition(), 0.01f, UltiDraw.Black);
        }

        //Velocities
        for (int i = 0; i < Points.Length; i += step)
        {
            //Vector3 start = Points[i].GetPosition();
            //Vector3 end = Points[i].GetPosition() + Points[i].GetVelocity();
            //end = Utility.ProjectGround(end, LayerMask.GetMask("Ground"));
            //UltiDraw.DrawLine(start, end, 0.025f, 0f, UltiDraw.DarkGreen.Transparent(0.5f));

            /*
             * float r = 0f;
             * float g = 0f;
             * float b = 0f;
             * for(int j=0; j<Points[i].Styles.Length; j++) {
             *      r += Points[i].Styles[j] * colors[j].r;
             *      g += Points[i].Styles[j] * colors[j].g;
             *      b += Points[i].Styles[j] * colors[j].b;
             * }
             * UltiDraw.DrawLine(Points[i].GetPosition(), Points[i].GetPosition() + Points[i].GetVelocity(), 0.025f, 0f, new Color(r, g, b, 0.5f));
             */

            //UltiDraw.DrawLine(Points[i].GetPosition(), Points[i].GetPosition() + Points[i].GetVelocity(), 0.025f, 0f, UltiDraw.DarkGreen.Transparent(0.5f));
        }

        //Directions,黄色线画个间隔点的方向
        for (int i = 0; i < Points.Length; i += step)
        {
            //Vector3 start = Points[i].GetPosition();
            //Vector3 end = Points[i].GetPosition() + 0.25f * Points[i].GetDirection();
            //end = Utility.ProjectGround(end, LayerMask.GetMask("Ground"));
            //UltiDraw.DrawLine(start, end, 0.025f, 0f, UltiDraw.Orange.Transparent(0.75f));
            UltiDraw.DrawLine(Points[i].GetPosition(), Points[i].GetPosition() + 0.25f * Points[i].GetDirection(), 0.025f, 0f, UltiDraw.Orange.Transparent(0.75f));
        }

        //Styles,方块的颜色是什么信息呢?
        if (Styles.Length > 0)
        {
            for (int i = 0; i < Points.Length; i += step)
            {
                float r = 0f;
                float g = 0f;
                float b = 0f;
                for (int j = 0; j < Points[i].Styles.Length; j++)
                {
                    r += Points[i].Styles[j] * colors[j].r;
                    g += Points[i].Styles[j] * colors[j].g;
                    b += Points[i].Styles[j] * colors[j].b;
                }
                Color color = new Color(r, g, b, 1f);
                UltiDraw.DrawCube(Points[i].GetPosition(), Points[i].GetRotation(), 0.05f, color);
            }
        }

        //Signals

        /*
         * if(Styles.Length > 0) {
         *      for(int i=0; i<Points.Length; i+=step) {
         *              Color color = UltiDraw.Black;
         *              for(int j=0; j<Points[i].Signals.Length; j++) {
         *                      if(Points[i].Signals[j]) {
         *                              color = colors[j];
         *                              break;
         *                      }
         *              }
         *              UltiDraw.DrawCone(Points[i].GetPosition(), Quaternion.identity, 0.1f, 0.1f, color);
         *      }
         * }
         */

        /*
         * //Speed
         * for(int i=0; i<Points.Length; i+=step) {
         *      float r = 0f;
         *      float g = 0f;
         *      float b = 0f;
         *      for(int j=0; j<Points[i].Styles.Length; j++) {
         *              r += Points[i].Styles[j] * colors[j].r;
         *              g += Points[i].Styles[j] * colors[j].g;
         *              b += Points[i].Styles[j] * colors[j].b;
         *      }
         *      UltiDraw.DrawArrow(Points[i].GetPosition(), Points[i].GetPosition() + Points[i].GetSpeed() * Points[i].GetTransformation().GetForward(), 0.8f, 0.02f, 0.04f, new Color(r, g, b, 0.5f));
         * }
         */

        //Projections
        //for(int i=0; i<Points.Length; i+=step) {
        //	Vector3 right = Points[i].GetRightSample();
        //	Vector3 left = Points[i].GetLeftSample();
        //	UltiDraw.DrawCircle(right, 0.01f, UltiDraw.Yellow);
        //	UltiDraw.DrawCircle(left, 0.01f, UltiDraw.Yellow);
        //}

        //Slopes
        //for(int i=0; i<Points.Length; i+=step) {
        //	UltiDraw.DrawLine(Points[i].GetPosition(), Points[i].GetPosition() + 1f * Points[i].GetSlope() * Vector3.up, 0.025f, 0f, UltiDraw.Blue.Transparent(0.75f));
        //}

        //Positions,间隔点再画上黑圈
        for (int i = 0; i < Points.Length; i += step)
        {
            UltiDraw.DrawCircle(Points[i].GetPosition(), 0.025f, UltiDraw.Black);
        }

        //Phase,周期信息是怎么画的呢,为什么demo上看不到?
        for (int i = 0; i < Points.Length; i += step)
        {
            //UltiDraw.DrawLine(Points[i].GetPosition(), Points[i].GetPosition() + Points[i].Phase*Vector3.up, UltiDraw.IndianRed);
            UltiDraw.DrawArrow(Points[i].GetPosition(), Points[i].GetPosition() + Points[i].Phase * Vector3.up, 0.8f, 0.025f, 0.05f, UltiDraw.IndianRed.Transparent(0.5f));
            //UltiDraw.DrawSphere(Points[i].GetPosition(), Quaternion.identity, Points[i].PhaseUpdate / 10f, UltiDraw.Purple.Transparent(0.25f));
        }

        /*
         * List<float[]> signal = new List<float[]>();
         * for(int i=0; i<Styles.Length; i++) {
         *      float[] s = new float[Points.Length];
         *      for(int j=0; j<Points.Length; j++) {
         *              s[j] = Points[j].Signals[i];
         *      }
         *      signal.Add(s);
         * }
         * List<float[]> signalInput = new List<float[]>();
         * for(int i=0; i<Styles.Length; i++) {
         *      float[] s = new float[Points.Length];
         *      for(int j=0; j<Points.Length; j++) {
         *              s[j] = Points[j].Signals[i] - Points[j].Styles[i];
         *      }
         *      signalInput.Add(s);
         * }
         * List<float[]> stateInput = new List<float[]>();
         * for(int i=0; i<Styles.Length; i++) {
         *      float[] s = new float[Points.Length];
         *      for(int j=0; j<Points.Length; j++) {
         *              s[j] = Points[j].Styles[i];
         *      }
         *      stateInput.Add(s);
         * }
         * UltiDraw.DrawGUIFunctions(new Vector2(0.5f, 0.4f), new Vector2(0.75f, 0.1f), signal, 0f, 1f, UltiDraw.DarkGrey, colors);
         * UltiDraw.DrawGUIFunctions(new Vector2(0.5f, 0.25f), new Vector2(0.75f, 0.1f), stateInput, 0f, 1f, UltiDraw.DarkGrey, colors);
         * UltiDraw.DrawGUIFunctions(new Vector2(0.5f, 0.1f), new Vector2(0.75f, 0.1f), signalInput, -1f, 1f, UltiDraw.DarkGrey, colors);
         */

        UltiDraw.End();
    }
Beispiel #12
0
        public void Inspector(MotionEditor editor)
        {
            UltiDraw.Begin();
            Utility.SetGUIColor(UltiDraw.Grey);
            using (new EditorGUILayout.VerticalScope("Box")) {
                Utility.ResetGUIColor();

                Frame frame = editor.GetCurrentFrame();

                Utility.SetGUIColor(UltiDraw.Orange);
                using (new EditorGUILayout.VerticalScope("Box")) {
                    Utility.ResetGUIColor();
                    EditorGUILayout.LabelField(this == Module.RegularPhaseFunction ? "Regular" : "Inverse");
                }

                if (IsKey(frame))
                {
                    SetPhase(frame, EditorGUILayout.Slider("Phase", GetPhase(frame), 0f, 1f));
                }
                else
                {
                    EditorGUI.BeginDisabledGroup(true);
                    SetPhase(frame, EditorGUILayout.Slider("Phase", GetPhase(frame), 0f, 1f));
                    EditorGUI.EndDisabledGroup();
                }

                if (IsKey(frame))
                {
                    if (Utility.GUIButton("Unset Key", UltiDraw.Grey, UltiDraw.White))
                    {
                        SetKey(frame, false);
                    }
                }
                else
                {
                    if (Utility.GUIButton("Set Key", UltiDraw.DarkGrey, UltiDraw.White))
                    {
                        SetKey(frame, true);
                    }
                }

                EditorGUILayout.BeginHorizontal();
                if (Utility.GUIButton("<", UltiDraw.DarkGrey, UltiDraw.White, 25f, 50f))
                {
                    editor.LoadFrame((GetPreviousKey(frame).Timestamp));
                }

                EditorGUILayout.BeginVertical(GUILayout.Height(50f));
                Rect ctrl = EditorGUILayout.GetControlRect();
                Rect rect = new Rect(ctrl.x, ctrl.y, ctrl.width, 50f);
                EditorGUI.DrawRect(rect, UltiDraw.Black);

                float startTime = frame.Timestamp - editor.GetWindow() / 2f;
                float endTime   = frame.Timestamp + editor.GetWindow() / 2f;
                if (startTime < 0f)
                {
                    endTime  -= startTime;
                    startTime = 0f;
                }
                if (endTime > Module.Data.GetTotalTime())
                {
                    startTime -= endTime - Module.Data.GetTotalTime();
                    endTime    = Module.Data.GetTotalTime();
                }
                startTime = Mathf.Max(0f, startTime);
                endTime   = Mathf.Min(Module.Data.GetTotalTime(), endTime);
                int start    = Module.Data.GetFrame(startTime).Index;
                int end      = Module.Data.GetFrame(endTime).Index;
                int elements = end - start;

                Vector3 prevPos = Vector3.zero;
                Vector3 newPos  = Vector3.zero;
                Vector3 bottom  = new Vector3(0f, rect.yMax, 0f);
                Vector3 top     = new Vector3(0f, rect.yMax - rect.height, 0f);

                //Sequences
                for (int i = 0; i < Module.Data.Sequences.Length; i++)
                {
                    float   _start = (float)(Mathf.Clamp(Module.Data.Sequences[i].Start, start, end) - start) / (float)elements;
                    float   _end   = (float)(Mathf.Clamp(Module.Data.Sequences[i].End, start, end) - start) / (float)elements;
                    float   left   = rect.x + _start * rect.width;
                    float   right  = rect.x + _end * rect.width;
                    Vector3 a      = new Vector3(left, rect.y, 0f);
                    Vector3 b      = new Vector3(right, rect.y, 0f);
                    Vector3 c      = new Vector3(left, rect.y + rect.height, 0f);
                    Vector3 d      = new Vector3(right, rect.y + rect.height, 0f);
                    UltiDraw.DrawTriangle(a, c, b, UltiDraw.Yellow.Transparent(0.25f));
                    UltiDraw.DrawTriangle(b, c, d, UltiDraw.Yellow.Transparent(0.25f));
                }

                if (Module.ShowVelocities)
                {
                    //Regular Velocities
                    for (int i = 1; i < elements; i++)
                    {
                        prevPos.x = rect.xMin + (float)(i - 1) / (elements - 1) * rect.width;
                        prevPos.y = rect.yMax - Module.RegularPhaseFunction.NVelocities[i + start - 1] * rect.height;
                        newPos.x  = rect.xMin + (float)(i) / (elements - 1) * rect.width;
                        newPos.y  = rect.yMax - Module.RegularPhaseFunction.NVelocities[i + start] * rect.height;
                        UltiDraw.DrawLine(prevPos, newPos, this == Module.RegularPhaseFunction ? UltiDraw.Green : UltiDraw.Red);
                    }

                    //Inverse Velocities
                    for (int i = 1; i < elements; i++)
                    {
                        prevPos.x = rect.xMin + (float)(i - 1) / (elements - 1) * rect.width;
                        prevPos.y = rect.yMax - Module.InversePhaseFunction.NVelocities[i + start - 1] * rect.height;
                        newPos.x  = rect.xMin + (float)(i) / (elements - 1) * rect.width;
                        newPos.y  = rect.yMax - Module.InversePhaseFunction.NVelocities[i + start] * rect.height;
                        UltiDraw.DrawLine(prevPos, newPos, this == Module.RegularPhaseFunction ? UltiDraw.Red : UltiDraw.Green);
                    }
                }

                if (Module.ShowCycle)
                {
                    //Cycle
                    for (int i = 1; i < elements; i++)
                    {
                        prevPos.x = rect.xMin + (float)(i - 1) / (elements - 1) * rect.width;
                        prevPos.y = rect.yMax - NormalisedCycle[i + start - 1] * rect.height;
                        newPos.x  = rect.xMin + (float)(i) / (elements - 1) * rect.width;
                        newPos.y  = rect.yMax - NormalisedCycle[i + start] * rect.height;
                        UltiDraw.DrawLine(prevPos, newPos, UltiDraw.Yellow);
                    }
                }

                //Phase
                //for(int i=1; i<Module.Data.Frames.Length; i++) {
                //	Frame A = Module.Data.Frames[i-1];
                //	Frame B = Module.Data.Frames[i];
                //	prevPos.x = rect.xMin + (float)(A.Index-start)/elements * rect.width;
                //	prevPos.y = rect.yMax - Mathf.Repeat(Phase[A.Index-1], 1f) * rect.height;
                //	newPos.x = rect.xMin + (float)(B.Index-start)/elements * rect.width;
                //	newPos.y = rect.yMax - Phase[B.Index-1] * rect.height;
                //	UltiDraw.DrawLine(prevPos, newPos, UltiDraw.White);
                //	bottom.x = rect.xMin + (float)(B.Index-start)/elements * rect.width;
                //	top.x = rect.xMin + (float)(B.Index-start)/elements * rect.width;
                //}

                Frame A = Module.Data.GetFrame(start);
                if (A.Index == 1)
                {
                    bottom.x = rect.xMin;
                    top.x    = rect.xMin;
                    UltiDraw.DrawLine(bottom, top, UltiDraw.Magenta.Transparent(0.5f));
                }
                Frame B = GetNextKey(A);
                while (A != B)
                {
                    prevPos.x = rect.xMin + (float)(A.Index - start) / elements * rect.width;
                    prevPos.y = rect.yMax - Mathf.Repeat(Phase[A.Index - 1], 1f) * rect.height;
                    newPos.x  = rect.xMin + (float)(B.Index - start) / elements * rect.width;
                    newPos.y  = rect.yMax - Phase[B.Index - 1] * rect.height;
                    UltiDraw.DrawLine(prevPos, newPos, UltiDraw.White);
                    bottom.x = rect.xMin + (float)(B.Index - start) / elements * rect.width;
                    top.x    = rect.xMin + (float)(B.Index - start) / elements * rect.width;
                    UltiDraw.DrawLine(bottom, top, UltiDraw.Magenta.Transparent(0.5f));
                    A = B;
                    B = GetNextKey(A);
                    if (B.Index > end)
                    {
                        break;
                    }
                }

                //Seconds
                float timestamp = startTime;
                while (timestamp <= endTime)
                {
                    float floor = Mathf.FloorToInt(timestamp);
                    if (floor >= startTime && floor <= endTime)
                    {
                        top.x = rect.xMin + (float)(Module.Data.GetFrame(floor).Index - start) / elements * rect.width;
                        UltiDraw.DrawCircle(top, 5f, UltiDraw.White);
                    }
                    timestamp += 1f;
                }
                //

                //Current Pivot
                top.x    = rect.xMin + (float)(frame.Index - start) / elements * rect.width;
                bottom.x = rect.xMin + (float)(frame.Index - start) / elements * rect.width;
                UltiDraw.DrawLine(top, bottom, UltiDraw.Yellow);
                UltiDraw.DrawCircle(top, 3f, UltiDraw.Green);
                UltiDraw.DrawCircle(bottom, 3f, UltiDraw.Green);

                Handles.DrawLine(Vector3.zero, Vector3.zero);                 //Somehow needed to get it working...
                EditorGUILayout.EndVertical();

                if (Utility.GUIButton(">", UltiDraw.DarkGrey, UltiDraw.White, 25f, 50f))
                {
                    editor.LoadFrame(GetNextKey(frame).Timestamp);
                }
                EditorGUILayout.EndHorizontal();
            }
            UltiDraw.End();
        }
Beispiel #13
0
        public void Inspector(MotionEditor editor)
        {
            UltiDraw.Begin();

            UltiDraw.DrawSphere(Vector3.zero, Quaternion.identity, 1f, Color.red);

            Utility.SetGUIColor(UltiDraw.Grey);
            using (new EditorGUILayout.VerticalScope("Box")) {
                Utility.ResetGUIColor();

                Frame frame = editor.GetCurrentFrame();

                SetSensor(EditorGUILayout.Popup("Sensor", Sensor, Module.Data.Source.GetNames()));
                SetDistanceThreshold(EditorGUILayout.FloatField("Distance Threshold", DistanceThreshold));
                SetVelocityThreshold(EditorGUILayout.FloatField("Velocity Threshold", VelocityThtreshold));
                SetFilterWidth(EditorGUILayout.IntField("Filter Width", FilterWidth));
                SetOffset(EditorGUILayout.Vector3Field("Offset", Offset));
                SetNormal(EditorGUILayout.Vector3Field("Normal", Normal));
                SetMask(InternalEditorUtility.ConcatenatedLayersMaskToLayerMask(EditorGUILayout.MaskField("Mask", InternalEditorUtility.LayerMaskToConcatenatedLayersMask(Mask), InternalEditorUtility.layers)));

                EditorGUILayout.BeginVertical(GUILayout.Height(50f));
                Rect ctrl = EditorGUILayout.GetControlRect();
                Rect rect = new Rect(ctrl.x, ctrl.y, ctrl.width, 50f);
                EditorGUI.DrawRect(rect, UltiDraw.Black);

                float startTime = frame.Timestamp - editor.GetWindow() / 2f;
                float endTime   = frame.Timestamp + editor.GetWindow() / 2f;
                if (startTime < 0f)
                {
                    endTime  -= startTime;
                    startTime = 0f;
                }
                if (endTime > Module.Data.GetTotalTime())
                {
                    startTime -= endTime - Module.Data.GetTotalTime();
                    endTime    = Module.Data.GetTotalTime();
                }
                startTime = Mathf.Max(0f, startTime);
                endTime   = Mathf.Min(Module.Data.GetTotalTime(), endTime);
                int start    = Module.Data.GetFrame(startTime).Index;
                int end      = Module.Data.GetFrame(endTime).Index;
                int elements = end - start;

                Vector3 prevPos = Vector3.zero;
                Vector3 newPos  = Vector3.zero;
                Vector3 bottom  = new Vector3(0f, rect.yMax, 0f);
                Vector3 top     = new Vector3(0f, rect.yMax - rect.height, 0f);

                //Contacts
                for (int i = start; i <= end; i++)
                {
                    top.x    = rect.xMin + (float)(i - start) / elements * rect.width;
                    bottom.x = rect.xMin + (float)(i - start) / elements * rect.width;

                    top.y    = rect.yMax - rect.height;
                    bottom.y = rect.yMax - rect.height / 2f;
                    if (RegularContacts[i - 1])
                    {
                        UltiDraw.DrawLine(top, bottom, UltiDraw.Green);
                    }

                    top.y    = rect.yMax - rect.height / 2f;
                    bottom.y = rect.yMax;
                    if (InverseContacts[i - 1])
                    {
                        UltiDraw.DrawLine(top, bottom, UltiDraw.Green);
                    }
                }

                //Sequences
                for (int i = 0; i < Module.Data.Sequences.Length; i++)
                {
                    float   _start = (float)(Mathf.Clamp(Module.Data.Sequences[i].Start, start, end) - start) / (float)elements;
                    float   _end   = (float)(Mathf.Clamp(Module.Data.Sequences[i].End, start, end) - start) / (float)elements;
                    float   left   = rect.x + _start * rect.width;
                    float   right  = rect.x + _end * rect.width;
                    Vector3 a      = new Vector3(left, rect.y, 0f);
                    Vector3 b      = new Vector3(right, rect.y, 0f);
                    Vector3 c      = new Vector3(left, rect.y + rect.height, 0f);
                    Vector3 d      = new Vector3(right, rect.y + rect.height, 0f);
                    UltiDraw.DrawTriangle(a, c, b, UltiDraw.Yellow.Transparent(0.25f));
                    UltiDraw.DrawTriangle(b, c, d, UltiDraw.Yellow.Transparent(0.25f));
                }
                //Current Pivot
                top.x    = rect.xMin + (float)(frame.Index - start) / elements * rect.width;
                bottom.x = rect.xMin + (float)(frame.Index - start) / elements * rect.width;
                top.y    = rect.yMax - rect.height;
                bottom.y = rect.yMax;
                UltiDraw.DrawLine(top, bottom, UltiDraw.Yellow);
                UltiDraw.DrawCircle(top, 3f, UltiDraw.Green);
                UltiDraw.DrawCircle(bottom, 3f, UltiDraw.Green);

                Handles.DrawLine(Vector3.zero, Vector3.zero);                 //Somehow needed to get it working...

                EditorGUILayout.EndVertical();
            }
            UltiDraw.End();
        }
Beispiel #14
0
    protected override void DerivedInspector(MotionEditor editor)
    {
        Repair();

        Frame frame = editor.GetCurrentFrame();

        if (Utility.GUIButton("Key", IsKey(frame) ? UltiDraw.Cyan : UltiDraw.DarkGrey, IsKey(frame) ? UltiDraw.Black : UltiDraw.White))
        {
            ToggleKey(frame);
        }
        Color[] colors = UltiDraw.GetRainbowColors(Functions.Length);
        for (int i = 0; i < Functions.Length; i++)
        {
            float height = 25f;
            EditorGUILayout.BeginHorizontal();
            if (Utility.GUIButton(Functions[i].Name, colors[i].Transparent(Utility.Normalise(Functions[i].GetValue(frame), 0f, 1f, 0.25f, 1f)), UltiDraw.White, 200f, height))
            {
                Functions[i].Toggle(frame);
            }
            //EditorGUILayout.Toggle(Functions[i].GetFlag(frame));
            //EditorGUILayout.Toggle(Functions[i].GetRelease(frame));
            Rect c = EditorGUILayout.GetControlRect();
            Rect r = new Rect(c.x, c.y, Functions[i].GetValue(frame) * c.width, height);
            EditorGUI.DrawRect(r, colors[i].Transparent(0.75f));
            EditorGUILayout.FloatField(Functions[i].GetValue(frame), GUILayout.Width(50f));
            Functions[i].Name = EditorGUILayout.TextField(Functions[i].Name);
            if (Utility.GUIButton("X", UltiDraw.DarkRed, UltiDraw.White, 20f, 20f))
            {
                RemoveStyle(Functions[i].Name);
            }
            EditorGUILayout.EndHorizontal();
        }
        if (Utility.GUIButton("Add Style", UltiDraw.DarkGrey, UltiDraw.White))
        {
            AddStyle("Style " + (Functions.Length + 1));
            EditorGUIUtility.ExitGUI();
        }
        EditorGUILayout.BeginHorizontal();
        if (Utility.GUIButton("<", UltiDraw.DarkGrey, UltiDraw.White, 25f, 50f))
        {
            Frame previous = GetPreviousKey(frame);
            editor.LoadFrame(previous == null ? 0f : previous.Timestamp);
        }
        EditorGUILayout.BeginVertical(GUILayout.Height(50f));
        Rect ctrl = EditorGUILayout.GetControlRect();
        Rect rect = new Rect(ctrl.x, ctrl.y, ctrl.width, 50f);

        EditorGUI.DrawRect(rect, UltiDraw.Black);

        UltiDraw.Begin();

        float startTime = frame.Timestamp - editor.GetWindow() / 2f;
        float endTime   = frame.Timestamp + editor.GetWindow() / 2f;

        if (startTime < 0f)
        {
            endTime  -= startTime;
            startTime = 0f;
        }
        if (endTime > Data.GetTotalTime())
        {
            startTime -= endTime - Data.GetTotalTime();
            endTime    = Data.GetTotalTime();
        }
        startTime = Mathf.Max(0f, startTime);
        endTime   = Mathf.Min(Data.GetTotalTime(), endTime);
        int start    = Data.GetFrame(startTime).Index;
        int end      = Data.GetFrame(endTime).Index;
        int elements = end - start;

        Vector3 prevPos = Vector3.zero;
        Vector3 newPos  = Vector3.zero;
        Vector3 bottom  = new Vector3(0f, rect.yMax, 0f);
        Vector3 top     = new Vector3(0f, rect.yMax - rect.height, 0f);

        //Sequences
        for (int i = 0; i < Data.Sequences.Length; i++)
        {
            float   _start = (float)(Mathf.Clamp(Data.Sequences[i].Start, start, end) - start) / (float)elements;
            float   _end   = (float)(Mathf.Clamp(Data.Sequences[i].End, start, end) - start) / (float)elements;
            float   left   = rect.x + _start * rect.width;
            float   right  = rect.x + _end * rect.width;
            Vector3 a      = new Vector3(left, rect.y, 0f);
            Vector3 b      = new Vector3(right, rect.y, 0f);
            Vector3 c      = new Vector3(left, rect.y + rect.height, 0f);
            Vector3 d      = new Vector3(right, rect.y + rect.height, 0f);
            UltiDraw.DrawTriangle(a, c, b, UltiDraw.Yellow.Transparent(0.25f));
            UltiDraw.DrawTriangle(b, c, d, UltiDraw.Yellow.Transparent(0.25f));
        }

        //Styles
        for (int i = 0; i < Functions.Length; i++)
        {
            Frame current = Data.GetFirstFrame();
            while (current != Data.GetLastFrame())
            {
                Frame next   = GetNextKey(current);
                float _start = (float)(Mathf.Clamp(current.Index, start, end) - start) / (float)elements;
                float _end   = (float)(Mathf.Clamp(next.Index, start, end) - start) / (float)elements;
                float xStart = rect.x + _start * rect.width;
                float xEnd   = rect.x + _end * rect.width;
                float yStart = rect.y + (1f - Functions[i].Values[Mathf.Clamp(current.Index, start, end) - 1]) * rect.height;
                float yEnd   = rect.y + (1f - Functions[i].Values[Mathf.Clamp(next.Index, start, end) - 1]) * rect.height;
                UltiDraw.DrawLine(new Vector3(xStart, yStart, 0f), new Vector3(xEnd, yEnd, 0f), colors[i]);
                current = next;
            }
        }

        //Keys
        for (int i = 0; i < Keys.Length; i++)
        {
            if (Keys[i])
            {
                top.x    = rect.xMin + (float)(i + 1 - start) / elements * rect.width;
                bottom.x = rect.xMin + (float)(i + 1 - start) / elements * rect.width;
                UltiDraw.DrawLine(top, bottom, UltiDraw.White);
            }
        }

        //Current Pivot
        top.x    = rect.xMin + (float)(frame.Index - start) / elements * rect.width;
        bottom.x = rect.xMin + (float)(frame.Index - start) / elements * rect.width;
        UltiDraw.DrawLine(top, bottom, UltiDraw.Yellow);
        UltiDraw.DrawCircle(top, 3f, UltiDraw.Green);
        UltiDraw.DrawCircle(bottom, 3f, UltiDraw.Green);

        UltiDraw.End();
        EditorGUILayout.EndVertical();
        if (Utility.GUIButton(">", UltiDraw.DarkGrey, UltiDraw.White, 25f, 50f))
        {
            Frame next = GetNextKey(frame);
            editor.LoadFrame(next == null ? Data.GetTotalTime() : next.Timestamp);
        }
        EditorGUILayout.EndHorizontal();
    }
    public override void Draw(Camera canvas = null)
    {
        Matrix4x4 GetRoot(int index)
        {
            return(ActorRoot.Transformations[index]);
        }

        UltiDraw.Begin(canvas);

        // //Weighted Balls
        // for(int i=1; i<=Pivot; i++) {
        //     float weight = Mathf.Pow((float)(i) / (float)Pivot, 0.25f);
        //     UltiDraw.DrawLine(GetWeightedBallPosition(i-1), GetWeightedBallPosition(i), UltiDraw.Magenta.Opacity(weight));
        // }
        // for(int i=0; i<=Pivot; i++) {
        //     float weight = Mathf.Pow((float)(i+1) / (float)(Pivot+1), 0.25f);
        //     UltiDraw.DrawSphere(GetWeightedBallPosition(i), Quaternion.identity, 0.025f, UltiDraw.Black.Opacity(weight));
        //     if(GetControlWeight(i) > 0.001f) {
        //         UltiDraw.DrawTranslateGizmo(GetWeightedBallPosition(i), Quaternion.LookRotation(GetWeightedBallForward(i).normalized, GetWeightedBallUp(i).normalized), 0.25f * GetControlWeight(i));
        //     }
        //     UltiDraw.DrawArrow(GetWeightedBallPosition(i), GetWeightedBallPosition(i) + GetTemporalScale(GetWeightedBallVelocity(i)), 0.8f, 0.025f, 0.05f, UltiDraw.Black.Opacity(weight));
        // }
        // float[] values = new float[Samples.Length];
        // for(int i=0; i<values.Length; i++) {
        //     values[i] = GetControlWeight(i);
        // }
        // UltiDraw.PlotFunction(new Vector2(0.125f, 0.425f), new Vector2(0.225f, 0.1f), values, 0f, 1f);

        //World-Space Balls
        // for(int i=1; i<=Pivot; i++) {
        //     float weight = Mathf.Pow((float)(i) / (float)Pivot, 0.25f);
        //     UltiDraw.DrawLine(BallTransformations[i-1].GetPosition(), BallTransformations[i].GetPosition(), UltiDraw.Black.Opacity(weight));
        // }
        // for(int i=0; i<=Pivot; i++) {
        //     float weight = Mathf.Pow((float)(i+1) / (float)(Pivot+1), 0.25f);
        //     UltiDraw.DrawSphere(BallTransformations[i].GetPosition(), Quaternion.identity, 0.025f, UltiDraw.Magenta.Opacity(weight));
        //     UltiDraw.DrawLine(BallTransformations[i].GetPosition(), BallTransformations[i].GetPosition()+GetTemporalScale(BallVelocities[i]), 0.025f, 0f, UltiDraw.Red.Opacity(weight));
        // }

        //Debug Interaction Sphere
        // UltiDraw.DrawWireHemisphere(GetRoot(Pivot).GetPosition(), GetRoot(Pivot).GetRotation(), 2f*GetInteractionRadius(), UltiDraw.DarkGrey.Opacity(0.25f));

        //Control
        float controlWeight = GetControlWeight(Pivot, GetRoot(Pivot).GetPosition()).SmoothStep(1f, 0.1f);

        Color GetPivotColor(int index)
        {
            float weight = Mathf.Sqrt((float)(index + 1) / (float)Samples.Length);

            return(PivotStartColor.Lerp(PivotEndColor, weight).Lerp(UltiDraw.DarkGrey, 1f - controlWeight).Opacity(weight.Normalize(0f, 1f, PivotStartOpacity, PivotEndOpacity)));
        }

        Color GetMomentumColor(int index)
        {
            float weight = Mathf.Sqrt((float)(index + 1) / (float)Samples.Length);

            return(MomentumStartColor.Lerp(MomentumEndColor, weight).Lerp(UltiDraw.DarkGrey, 1f - controlWeight).Opacity(weight.Normalize(0f, 1f, MomentumStartOpacity, MomentumEndOpacity)));
        }

        if (DrawGUI)
        {
            //Image Space
            UltiDraw.GUICircle(rect.GetCenter(), rect.W, UltiDraw.DarkGrey.Opacity(0.8f));
            UltiDraw.GUICircle(rect.GetCenter() + rect.ToScreen(new Vector2(0f, 1f)), 0.01f, ReferenceColor);
            UltiDraw.GUICircle(rect.GetCenter() + rect.ToScreen(new Vector2(0f, -1f)), 0.01f, ReferenceColor);
            UltiDraw.GUICircle(rect.GetCenter() + rect.ToScreen(new Vector2(1f, 0f)), 0.01f, ReferenceColor);
            UltiDraw.GUICircle(rect.GetCenter() + rect.ToScreen(new Vector2(-1f, 0f)), 0.01f, ReferenceColor);
            int step = Resolution;
            for (int i = 0; i < Samples.Length; i += step)
            {
                Vector3 current = rect.GetCenter() + rect.ToScreen(new Vector2(Pivots[i].x, Pivots[i].z));
                Vector3 target  = rect.GetCenter() + rect.ToScreen(new Vector2(Pivots[i].x, Pivots[i].z) + GetTemporalScale(new Vector2(Momentums[i].x, Momentums[i].z)));
                if (i < Samples.Length - step)
                {
                    Vector3 next = rect.GetCenter() + rect.ToScreen(new Vector2(Pivots[i + step].x, Pivots[i + step].z));
                    UltiDraw.GUILine(current, next, UltiDraw.Red);
                }
                UltiDraw.GUICircle(current, 0.01f, GetPivotColor(i));
                UltiDraw.GUILine(current, target, GetMomentumColor(i));
            }
            UltiDraw.PlotVerticalPivot(rect.GetCenter() + rect.ToScreen(new Vector2(-1.25f, 0f)), rect.ToScreen(new Vector2(0.125f, 1.5f)), Pivots[Pivot].y.Normalize(HeightParameters.x, HeightParameters.y, 0f, 1f), backgroundColor: UltiDraw.DarkGrey, pivotColor: UltiDraw.Green);
            UltiDraw.PlotVerticalPivot(rect.GetCenter() + rect.ToScreen(new Vector2(1.25f, 0f)), rect.ToScreen(new Vector2(0.125f, 1.5f)), Momentums[Pivot].y.Normalize(SpeedParameters.x, SpeedParameters.y, 0f, 1f), backgroundColor: UltiDraw.DarkGrey, pivotColor: UltiDraw.Magenta);

            UltiDraw.GUILine(rect.GetCenter(), rect.GetCenter() + rect.ToScreen(new Vector2(Target.x, Target.z)), 0.01f * Target.MagnitudeXZ(), 0f, TargetColor);
        }
        if (DrawScene)
        {
            //World Space
            Color circleColor    = UltiDraw.DarkGrey.Opacity(0.25f);
            Color wireColor      = Color.Lerp(UltiDraw.DarkGrey, UltiDraw.IndianRed, controlWeight);
            Color referenceColor = Color.Lerp(UltiDraw.DarkGrey, UltiDraw.Mustard, controlWeight).Opacity(0.5f);
            UltiDraw.DrawCircle(GetRoot(Pivot).GetPosition(), Quaternion.Euler(90f, 0f, 0f), 2f * GetControlRadius(), circleColor);
            UltiDraw.DrawWireCircle(GetRoot(Pivot).GetPosition(), Quaternion.Euler(90f, 0f, 0f), 2f * GetControlRadius(), wireColor);
            UltiDraw.DrawCircle(GetRoot(Pivot).GetPosition() + GetControlRadius() * Vector3.forward.GetRelativeDirectionFrom(GetRoot(Pivot)), 0.05f, referenceColor);
            UltiDraw.DrawCircle(GetRoot(Pivot).GetPosition() + GetControlRadius() * Vector3.right.GetRelativeDirectionFrom(GetRoot(Pivot)), 0.05f, referenceColor);
            UltiDraw.DrawCircle(GetRoot(Pivot).GetPosition() + GetControlRadius() * Vector3.left.GetRelativeDirectionFrom(GetRoot(Pivot)), 0.05f, referenceColor);
            UltiDraw.DrawCircle(GetRoot(Pivot).GetPosition() + GetControlRadius() * Vector3.back.GetRelativeDirectionFrom(GetRoot(Pivot)), 0.05f, referenceColor);
            UltiDraw.DrawLine(GetRoot(Pivot).GetPosition(), GetRoot(Pivot).GetPosition() + GetControlRadius() * new Vector3(Target.x, 0f, Target.z).GetRelativeDirectionFrom(GetRoot(Pivot)), GetRoot(Pivot).GetUp(), 0.1f * Target.MagnitudeXZ(), 0f, Color.Lerp(UltiDraw.DarkGrey, UltiDraw.Yellow, controlWeight).Opacity(0.5f));

            //Pivots and Momentums
            for (int i = 0; i < Samples.Length; i += Resolution)
            {
                float   size     = Mathf.Sqrt((float)(i + 1) / (float)Samples.Length);
                Vector3 location = (GetRoot(Pivot).GetPosition() + GetControlRadius() * Pivots[i].GetRelativeDirectionFrom(GetRoot(Pivot))).ZeroY();
                Vector3 momentum = GetTemporalScale(Momentums[i].GetRelativeDirectionFrom(GetRoot(Pivot)).ZeroY());
                UltiDraw.DrawSphere(location, Quaternion.identity, size * 0.05f, GetPivotColor(i));
                UltiDraw.DrawArrow(location, location + momentum, 0.8f, 0.0125f, 0.025f, GetMomentumColor(i));
            }
            //Connections
            for (int i = 0; i < Samples.Length - 1; i++)
            {
                float   wPrev = (float)i / (float)(Samples.Length - 1);
                float   wNext = (float)(i + 1) / (float)(Samples.Length - 1);
                Vector3 prev  = (GetRoot(Pivot).GetPosition() + wPrev * GetControlRadius() * Pivots[i].GetRelativeDirectionFrom(GetRoot(Pivot))).SetY(Pivots[i].y);
                Vector3 next  = (GetRoot(Pivot).GetPosition() + wNext * GetControlRadius() * Pivots[i + 1].GetRelativeDirectionFrom(GetRoot(Pivot))).SetY(Pivots[i + 1].y);
                UltiDraw.DrawLine(prev, next, UltiDraw.DarkGrey);
            }
            //Heights and Speeds
            for (int i = 0; i < Samples.Length; i += Resolution)
            {
                float   weight   = (float)i / (float)(Samples.Length - 1);
                float   size     = Mathf.Sqrt((float)(i + 1) / (float)Samples.Length);
                Vector3 location = GetRoot(Pivot).GetPosition() + weight * GetControlRadius() * Pivots[i].GetRelativeDirectionFrom(GetRoot(Pivot)).ZeroY();
                Vector3 prev     = location.SetY(Pivots[i].y);
                UltiDraw.DrawSphere(prev, Quaternion.identity, size * 0.05f, GetPivotColor(i));
                UltiDraw.DrawArrow(prev, location.SetY(Pivots[i].y - 0.5f * GetTemporalScale(Momentums[i].y)), 0.8f, 0.0125f, 0.025f, GetMomentumColor(i));
                UltiDraw.DrawArrow(prev, location.SetY(Pivots[i].y + 0.5f * GetTemporalScale(Momentums[i].y)), 0.8f, 0.0125f, 0.025f, GetMomentumColor(i));
            }
        }

        //Interaction
        if (DrawGUI)
        {
            float[] weights = new float[SampleCount];
            for (int i = 0; i < Samples.Length; i++)
            {
                weights[i] = GetInteractorWeight(i);
            }
            UltiDraw.PlotFunction(new Vector2(opponent.X, opponent.Y + 2.5f * opponent.H / 3f), new Vector2(opponent.W, opponent.H / 3f), weights, yMin: 0f, yMax: 1f, thickness: 0.0025f);

            float     padding   = 1.1f;
            Vector3[] gradients = new Vector3[SampleCount];
            for (int i = 0; i < SampleCount; i++)
            {
                gradients[i] = GetInteractorGradient(i);
            }
            UltiDraw.PlotFunctions(new Vector2(opponent.X - opponent.W / 3f, opponent.Y + 1.5f * opponent.H / 3f), new Vector2(opponent.W / 3f, opponent.H / 3f), gradients, yMin: -padding * GetInteractionRadius(), yMax: padding * GetInteractionRadius(), thickness: 0.0025f);
            Vector3[] directions = new Vector3[SampleCount];
            for (int i = 0; i < SampleCount; i++)
            {
                directions[i] = GetInteractorDirection(i);
            }
            UltiDraw.PlotFunctions(new Vector2(opponent.X, opponent.Y + 1.5f * opponent.H / 3f), new Vector2(opponent.W / 3f, opponent.H / 3f), directions, yMin: -padding * 1f, yMax: padding * 1f, thickness: 0.0025f);
            Vector3[] velocities = new Vector3[SampleCount];
            for (int i = 0; i < SampleCount; i++)
            {
                velocities[i] = GetInteractorVelocity(i);
            }
            UltiDraw.PlotFunctions(new Vector2(opponent.X + opponent.W / 3f, opponent.Y + 1.5f * opponent.H / 3f), new Vector2(opponent.W / 3f, opponent.H / 3f), velocities, yMin: -padding * 5f, yMax: padding * 5f, thickness: 0.0025f);

            float[] magnitudes = new float[Actor.Bones.Length];
            for (int i = 0; i < Actor.Bones.Length; i++)
            {
                magnitudes[i] = GetInteractorBoneDistance(i);
            }
            UltiDraw.PlotBars(new Vector2(opponent.X, opponent.Y + 0.5f * opponent.H / 3f), new Vector2(opponent.W, opponent.H / 3f), magnitudes, yMin: 0f, yMax: GetInteractionRadius());
        }
        if (DrawScene)
        {
            if (Rival != null && RivalRoot != null)
            {
                //Trajectory
                for (int i = 0; i < Samples.Length; i++)
                {
                    float   weight = GetInteractorWeight(i);
                    Vector3 pivot  = RivalRoot.GetPosition(i);
                    UltiDraw.DrawLine(GetRoot(i).GetPosition(), pivot, Vector3.up, 0.05f, 0f, UltiDraw.Blue.Opacity(0.25f * weight));
                    UltiDraw.DrawLine(pivot, pivot + 0.25f * RivalRoot.GetDirection(i), Vector3.up, 0.05f, 0f, UltiDraw.Red.Opacity(0.25f * weight));
                    UltiDraw.DrawLine(pivot, pivot + GetTemporalScale(RivalRoot.GetVelocity(i)), Vector3.up, 0.05f, 0f, UltiDraw.Red.Opacity(0.25f * weight));
                    UltiDraw.DrawSphere(pivot, Quaternion.identity, 0.05f * weight, Color.red);
                }
                {
                    //Bone Distances
                    float weight = GetInteractorWeight(Pivot);
                    for (int i = 0; i < Actor.Bones.Length; i++)
                    {
                        UltiDraw.DrawLine(Actor.Bones[i].Transform.position, Rival.Bones[i].Transform.position, UltiDraw.Red.Opacity(0.25f * weight), UltiDraw.Black.Opacity(0.25f * weight));
                    }
                }
            }
        }

        UltiDraw.End();
    }
    protected override void OnRenderObjectDerived()
    {
        Controller.Draw();

        if (ShowRoot)
        {
            RootSeries.Draw();
        }
        if (ShowGoal)
        {
            GoalSeries.Draw();
        }
        if (ShowCurrent)
        {
            StyleSeries.Draw();
        }
        if (ShowPhase)
        {
            PhaseSeries.Draw();
        }
        if (ShowContacts)
        {
            ContactSeries.Draw();
        }
        if (ShowEnvironment)
        {
            Environment.Draw(UltiDraw.Mustard.Transparent(0.25f));
        }
        if (ShowInteraction)
        {
            Geometry.Draw(UltiDraw.Cyan.Transparent(0.25f));
        }

        if (ShowBiDirectional)
        {
            UltiDraw.Begin();
            for (int i = 0; i < PosePrediction.Length; i++)
            {
                UltiDraw.DrawSphere(PosePrediction[i], Quaternion.identity, 0.05f, UltiDraw.Magenta);
            }
            for (int i = 0; i < RootPrediction.Length; i++)
            {
                UltiDraw.DrawCircle(RootPrediction[i].GetPosition(), 0.05f, UltiDraw.DarkRed.Darken(0.5f));
                UltiDraw.DrawArrow(RootPrediction[i].GetPosition(), RootPrediction[i].GetPosition() + 0.1f * RootPrediction[i].GetForward(), 0f, 0f, 0.025f, UltiDraw.DarkRed);
                if (i < RootPrediction.Length - 1)
                {
                    UltiDraw.DrawLine(RootPrediction[i].GetPosition(), RootPrediction[i + 1].GetPosition(), UltiDraw.Black);
                }
            }
            for (int i = 0; i < GoalPrediction.Length; i++)
            {
                UltiDraw.DrawCircle(GoalPrediction[i].GetPosition(), 0.05f, UltiDraw.DarkGreen.Darken(0.5f));
                UltiDraw.DrawArrow(GoalPrediction[i].GetPosition(), GoalPrediction[i].GetPosition() + 0.1f * GoalPrediction[i].GetForward(), 0f, 0f, 0.025f, UltiDraw.DarkGreen);
                if (i < GoalPrediction.Length - 1)
                {
                    UltiDraw.DrawLine(GoalPrediction[i].GetPosition(), GoalPrediction[i + 1].GetPosition(), UltiDraw.Black);
                }
            }
            UltiDraw.End();
        }
    }
Beispiel #17
0
    protected override void DerivedInspector(MotionEditor editor)
    {
        Frame frame = Data.GetFrame(editor.GetState().Index);

        EditorGUILayout.BeginHorizontal();
        SetTransition(EditorGUILayout.Slider("Transition", Transition, 0.1f, 1f));
        if (Utility.GUIButton("Add Style", UltiDraw.DarkGrey, UltiDraw.White))
        {
            AddStyle("Style");
        }
        if (Utility.GUIButton("Remove Style", UltiDraw.DarkGrey, UltiDraw.White))
        {
            RemoveStyle();
        }
        EditorGUILayout.EndHorizontal();

        Color[] colors = UltiDraw.GetRainbowColors(Functions.Length);
        for (int i = 0; i < Functions.Length; i++)
        {
            float height = 25f;
            EditorGUILayout.BeginHorizontal();
            if (Utility.GUIButton(Functions[i].Name, !Functions[i].GetFlag(frame) ? colors[i].Transparent(0.25f) : colors[i], UltiDraw.White, 200f, height))
            {
                Functions[i].ToggleStyle(frame);
            }
            Rect c = EditorGUILayout.GetControlRect();
            Rect r = new Rect(c.x, c.y, Functions[i].GetValue(frame) * c.width, height);
            EditorGUI.DrawRect(r, colors[i].Transparent(0.75f));
            EditorGUILayout.FloatField(Functions[i].GetValue(frame), GUILayout.Width(50f));
            Functions[i].Name = EditorGUILayout.TextField(Functions[i].Name);
            EditorGUILayout.EndHorizontal();
        }
        EditorGUILayout.BeginHorizontal();
        if (Utility.GUIButton("<", UltiDraw.DarkGrey, UltiDraw.White, 25f, 50f))
        {
            Frame previous = GetAnyPreviousStyleKey(frame);
            editor.LoadFrame(previous == null ? 0f : previous.Timestamp);
        }
        EditorGUILayout.BeginVertical(GUILayout.Height(50f));
        Rect ctrl = EditorGUILayout.GetControlRect();
        Rect rect = new Rect(ctrl.x, ctrl.y, ctrl.width, 50f);

        EditorGUI.DrawRect(rect, UltiDraw.Black);

        UltiDraw.Begin();

        float startTime = frame.Timestamp - editor.GetWindow() / 2f;
        float endTime   = frame.Timestamp + editor.GetWindow() / 2f;

        if (startTime < 0f)
        {
            endTime  -= startTime;
            startTime = 0f;
        }
        if (endTime > Data.GetTotalTime())
        {
            startTime -= endTime - Data.GetTotalTime();
            endTime    = Data.GetTotalTime();
        }
        startTime = Mathf.Max(0f, startTime);
        endTime   = Mathf.Min(Data.GetTotalTime(), endTime);
        int start    = Data.GetFrame(startTime).Index;
        int end      = Data.GetFrame(endTime).Index;
        int elements = end - start;

        Vector3 prevPos = Vector3.zero;
        Vector3 newPos  = Vector3.zero;
        Vector3 bottom  = new Vector3(0f, rect.yMax, 0f);
        Vector3 top     = new Vector3(0f, rect.yMax - rect.height, 0f);

        //Sequences
        for (int i = 0; i < Data.Sequences.Length; i++)
        {
            float   _start = (float)(Mathf.Clamp(Data.Sequences[i].Start, start, end) - start) / (float)elements;
            float   _end   = (float)(Mathf.Clamp(Data.Sequences[i].End, start, end) - start) / (float)elements;
            float   left   = rect.x + _start * rect.width;
            float   right  = rect.x + _end * rect.width;
            Vector3 a      = new Vector3(left, rect.y, 0f);
            Vector3 b      = new Vector3(right, rect.y, 0f);
            Vector3 c      = new Vector3(left, rect.y + rect.height, 0f);
            Vector3 d      = new Vector3(right, rect.y + rect.height, 0f);
            UltiDraw.DrawTriangle(a, c, b, UltiDraw.Yellow.Transparent(0.25f));
            UltiDraw.DrawTriangle(b, c, d, UltiDraw.Yellow.Transparent(0.25f));
        }

        //Styles
        for (int i = 0; i < Functions.Length; i++)
        {
            int x = start;
            for (int j = start; j < end; j++)
            {
                float val = Functions[i].Values[j];
                if (
                    Functions[i].Values[x] < 1f && val == 1f ||
                    Functions[i].Values[x] > 0f && val == 0f
                    )
                {
                    float _start = (float)(Mathf.Clamp(x - 1, start, end) - 1 - start) / (float)elements;
                    float _end   = (float)(Mathf.Clamp(j, start, end) - 1 - start) / (float)elements;
                    float xStart = rect.x + _start * rect.width;
                    float xEnd   = rect.x + _end * rect.width;
                    float yStart = rect.y + (1f - Functions[i].Values[Mathf.Max(x - 1, 0)]) * rect.height;
                    float yEnd   = rect.y + (1f - Functions[i].Values[j]) * rect.height;
                    UltiDraw.DrawLine(new Vector3(xStart, yStart, 0f), new Vector3(xEnd, yEnd, 0f), colors[i]);
                    x = j;
                }
                if (
                    Functions[i].Values[x] == 0f && val > 0f ||
                    Functions[i].Values[x] == 1f && val < 1f
                    )
                {
                    float _start = (float)(Mathf.Clamp(x, start, end) - 1 - start) / (float)elements;
                    float _end   = (float)(Mathf.Clamp(j - 1, start, end) - 1 - start) / (float)elements;
                    float xStart = rect.x + _start * rect.width;
                    float xEnd   = rect.x + _end * rect.width;
                    float yStart = rect.y + (1f - Functions[i].Values[x]) * rect.height;
                    float yEnd   = rect.y + (1f - Functions[i].Values[j - 1]) * rect.height;
                    UltiDraw.DrawLine(new Vector3(xStart, yStart, 0f), new Vector3(xEnd, yEnd, 0f), colors[i]);
                    x = j;
                }
                if (j == Data.GetTotalFrames() - 1)
                {
                    float _start = (float)(Mathf.Clamp(x, start, end) - 1 - start) / (float)elements;
                    float _end   = (float)(Mathf.Clamp(j - 1, start, end) - 1 - start) / (float)elements;
                    float xStart = rect.x + _start * rect.width;
                    float xEnd   = rect.x + _end * rect.width;
                    float yStart = rect.y + (1f - Functions[i].Values[x]) * rect.height;
                    float yEnd   = rect.y + (1f - Functions[i].Values[j - 1]) * rect.height;
                    UltiDraw.DrawLine(new Vector3(xStart, yStart, 0f), new Vector3(xEnd, yEnd, 0f), colors[i]);
                    x = j;
                }
            }
        }

        //Current Pivot
        top.x    = rect.xMin + (float)(frame.Index - start) / elements * rect.width;
        bottom.x = rect.xMin + (float)(frame.Index - start) / elements * rect.width;
        UltiDraw.DrawLine(top, bottom, UltiDraw.Yellow);
        UltiDraw.DrawCircle(top, 3f, UltiDraw.Green);
        UltiDraw.DrawCircle(bottom, 3f, UltiDraw.Green);

        UltiDraw.End();
        EditorGUILayout.EndVertical();
        if (Utility.GUIButton(">", UltiDraw.DarkGrey, UltiDraw.White, 25f, 50f))
        {
            Frame next = GetAnyNextStyleKey(frame);
            editor.LoadFrame(next == null ? Data.GetTotalTime() : next.Timestamp);
        }
        EditorGUILayout.EndHorizontal();
    }