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(); }
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(); }
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(); }
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(); }
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)); } }
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(); }
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(); }
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(); } }
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(); }
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(); }
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(); }
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(); }
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(); } }
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(); }