Example #1
0
 public StyleFunction(StyleModule module, string name)
 {
     Module = module;
     Name   = name;
     Values = new float[Module.Data.GetTotalFrames()];
     Flags  = new bool[Module.Data.GetTotalFrames()];
 }
Example #2
0
    public void Load()
    {
        if (Editor != null)
        {
            Actions = new List <LabelGroup>();
            Styles  = new List <LabelGroup>();

            Files  = new List <MotionData>();
            Export = new List <bool>();
            for (int i = 0; i < Editor.Files.Length; i++)
            {
                Files.Add(Editor.Files[i]);
                if (Editor.Files[i].Export || !LoadActiveOnly)
                {
                    Export.Add(true);
                    if (Editor.Files[i].GetModule(Module.ID.Goal) != null)
                    {
                        GoalModule module = (GoalModule)Editor.Files[i].GetModule(Module.ID.Goal);
                        for (int j = 0; j < module.Functions.Length; j++)
                        {
                            if (Actions.Find(x => ArrayExtensions.Contains(ref x.Labels, module.Functions[j].Name)) == null)
                            {
                                Actions.Add(new LabelGroup(module.Functions[j].Name));
                            }
                        }
                    }
                    if (Editor.Files[i].GetModule(Module.ID.Style) != null)
                    {
                        StyleModule module = (StyleModule)Editor.Files[i].GetModule(Module.ID.Style);
                        for (int j = 0; j < module.Functions.Length; j++)
                        {
                            if (Styles.Find(x => ArrayExtensions.Contains(ref x.Labels, module.Functions[j].Name)) == null)
                            {
                                Styles.Add(new LabelGroup(module.Functions[j].Name));
                            }
                        }
                    }
                }
                else
                {
                    Export.Add(false);
                }
            }
        }
    }
Example #3
0
    private IEnumerator ExportOutputLabels()
    {
        MotionEditor editor = Editors[0];

        if (editor == null)
        {
            Debug.Log("No editor found.");
        }
        else
        {
            Exporting = true;

            StreamWriter file = CreateFile("OutputLabels");

            StyleModule styleModule = editor.GetFile().Data.GetModule(Module.TYPE.Style) == null ? null : (StyleModule)editor.GetFile().Data.GetModule(Module.TYPE.Style);
            PhaseModule phaseModule = editor.GetFile().Data.GetModule(Module.TYPE.Phase) == null ? null : (PhaseModule)editor.GetFile().Data.GetModule(Module.TYPE.Phase);

            int index = 0;
            for (int i = 7; i <= 12; i++)
            {
                file.WriteLine(index + " " + "TrajectoryPositionX" + i); index  += 1;
                file.WriteLine(index + " " + "TrajectoryPositionZ" + i); index  += 1;
                file.WriteLine(index + " " + "TrajectoryDirectionX" + i); index += 1;
                file.WriteLine(index + " " + "TrajectoryDirectionZ" + i); index += 1;
                file.WriteLine(index + " " + "TrajectoryVelocityX" + i); index  += 1;
                file.WriteLine(index + " " + "TrajectoryVelocityZ" + i); index  += 1;
                for (int j = 0; j < styleModule.Functions.Length; j++)
                {
                    file.WriteLine(index + " " + styleModule.Functions[j].Name + i); index += 1;
                }
            }
            for (int i = 0; i < editor.GetFile().Data.Source.Bones.Length; i++)
            {
                if (editor.GetFile().Data.Source.Bones[i].Active)
                {
                    file.WriteLine(index + " " + editor.GetFile().Data.Source.Bones[i].Name + "PositionX" + (i + 1)); index += 1;
                    file.WriteLine(index + " " + editor.GetFile().Data.Source.Bones[i].Name + "PositionY" + (i + 1)); index += 1;
                    file.WriteLine(index + " " + editor.GetFile().Data.Source.Bones[i].Name + "PositionZ" + (i + 1)); index += 1;
                    file.WriteLine(index + " " + editor.GetFile().Data.Source.Bones[i].Name + "ForwardX" + (i + 1)); index  += 1;
                    file.WriteLine(index + " " + editor.GetFile().Data.Source.Bones[i].Name + "ForwardY" + (i + 1)); index  += 1;
                    file.WriteLine(index + " " + editor.GetFile().Data.Source.Bones[i].Name + "ForwardZ" + (i + 1)); index  += 1;
                    file.WriteLine(index + " " + editor.GetFile().Data.Source.Bones[i].Name + "UpX" + (i + 1)); index       += 1;
                    file.WriteLine(index + " " + editor.GetFile().Data.Source.Bones[i].Name + "UpY" + (i + 1)); index       += 1;
                    file.WriteLine(index + " " + editor.GetFile().Data.Source.Bones[i].Name + "UpZ" + (i + 1)); index       += 1;
                    file.WriteLine(index + " " + editor.GetFile().Data.Source.Bones[i].Name + "VelocityX" + (i + 1)); index += 1;
                    file.WriteLine(index + " " + editor.GetFile().Data.Source.Bones[i].Name + "VelocityY" + (i + 1)); index += 1;
                    file.WriteLine(index + " " + editor.GetFile().Data.Source.Bones[i].Name + "VelocityZ" + (i + 1)); index += 1;
                }
            }
            //file.WriteLine(index + " " + "RootMotionX"); index += 1;
            //file.WriteLine(index + " " + "RootMotionY"); index += 1;
            //file.WriteLine(index + " " + "RootMotionZ"); index += 1;

            if (phaseModule != null)
            {
                file.WriteLine(index + " " + "PhaseUpdate"); index += 1;
            }

            yield return(new WaitForSeconds(0f));

            file.Close();

            Exporting = false;
        }
    }
Example #4
0
    private IEnumerator ExportInputLabels()
    {
        MotionEditor editor = Editors[0];

        Exporting = true;

        StreamWriter file = CreateFile("InputLabels");

        StyleModule styleModule = editor.GetFile().Data.GetModule(Module.TYPE.Style) == null ? null : (StyleModule)editor.GetFile().Data.GetModule(Module.TYPE.Style);
        PhaseModule phaseModule = editor.GetFile().Data.GetModule(Module.TYPE.Phase) == null ? null : (PhaseModule)editor.GetFile().Data.GetModule(Module.TYPE.Phase);
        //ContactModule contactModule = editor.GetFile().Data.GetModule(Module.TYPE.Contact) == null ? null : (ContactModule)editor.GetFile().Data.GetModule(Module.TYPE.Contact);

        int index = 0;

        for (int i = 1; i <= 12; i++)
        {
            file.WriteLine(index + " " + "TrajectoryPositionX" + i); index  += 1;
            file.WriteLine(index + " " + "TrajectoryPositionZ" + i); index  += 1;
            file.WriteLine(index + " " + "TrajectoryDirectionX" + i); index += 1;
            file.WriteLine(index + " " + "TrajectoryDirectionZ" + i); index += 1;
            file.WriteLine(index + " " + "TrajectoryVelocityX" + i); index  += 1;
            file.WriteLine(index + " " + "TrajectoryVelocityZ" + i); index  += 1;
            file.WriteLine(index + " " + "TrajectorySpeed" + i); index      += 1;
            //for(int j=1; j<=StyleFilters.Length; j++) {
            //	file.WriteLine(index + " " + StyleFilters[j-1].Name + i); index += 1;
            //}
            if (styleModule != null)
            {
                //for(int j=1; j<=styleModule.Functions.Length; j++) {
                for (int j = 1; j <= 4; j++)
                {
                    if (phaseModule == null)
                    {
                        file.WriteLine(index + " " + styleModule.Functions[j - 1].Name + i); index += 1;
                    }
                    else
                    {
                        file.WriteLine(index + " " + styleModule.Functions[j - 1].Name + "X" + i); index += 1;
                        file.WriteLine(index + " " + styleModule.Functions[j - 1].Name + "Y" + i); index += 1;
                    }
                }
            }
        }
        for (int i = 0; i < editor.GetFile().Data.Source.Bones.Length; i++)
        {
            if (editor.GetFile().Data.Source.Bones[i].Active)
            {
                file.WriteLine(index + " " + editor.GetFile().Data.Source.Bones[i].Name + "PositionX" + (i + 1)); index += 1;
                file.WriteLine(index + " " + editor.GetFile().Data.Source.Bones[i].Name + "PositionY" + (i + 1)); index += 1;
                file.WriteLine(index + " " + editor.GetFile().Data.Source.Bones[i].Name + "PositionZ" + (i + 1)); index += 1;
                file.WriteLine(index + " " + editor.GetFile().Data.Source.Bones[i].Name + "ForwardX" + (i + 1)); index  += 1;
                file.WriteLine(index + " " + editor.GetFile().Data.Source.Bones[i].Name + "ForwardY" + (i + 1)); index  += 1;
                file.WriteLine(index + " " + editor.GetFile().Data.Source.Bones[i].Name + "ForwardZ" + (i + 1)); index  += 1;
                file.WriteLine(index + " " + editor.GetFile().Data.Source.Bones[i].Name + "UpX" + (i + 1)); index       += 1;
                file.WriteLine(index + " " + editor.GetFile().Data.Source.Bones[i].Name + "UpY" + (i + 1)); index       += 1;
                file.WriteLine(index + " " + editor.GetFile().Data.Source.Bones[i].Name + "UpZ" + (i + 1)); index       += 1;
                file.WriteLine(index + " " + editor.GetFile().Data.Source.Bones[i].Name + "VelocityX" + (i + 1)); index += 1;
                file.WriteLine(index + " " + editor.GetFile().Data.Source.Bones[i].Name + "VelocityY" + (i + 1)); index += 1;
                file.WriteLine(index + " " + editor.GetFile().Data.Source.Bones[i].Name + "VelocityZ" + (i + 1)); index += 1;
            }
        }

        if (phaseModule != null)
        {
            file.WriteLine(index + " " + "PhaseX"); index      += 1;
            file.WriteLine(index + " " + "PhaseY"); index      += 1;
            file.WriteLine(index + " " + "PhaseUpdate"); index += 1;
        }

        /*
         * if(contactModule != null) {
         *      for(int i=0; i<contactModule.Functions.Length; i++) {
         *              file.WriteLine(index + " " + "Contact" + editor.GetFile().Data.Source.Bones[contactModule.Functions[i].Sensor].Name); index += 1;
         *      }
         * }
         */

        yield return(new WaitForSeconds(0f));

        file.Close();

        Exporting = false;
    }
Example #5
0
    public Trajectory GetTrajectory(bool mirrored)
    {
        StyleModule styleModule = Data.GetModule(Module.TYPE.Style) == null ? null : (StyleModule)Data.GetModule(Module.TYPE.Style);
        PhaseModule phaseModule = Data.GetModule(Module.TYPE.Phase) == null ? null : (PhaseModule)Data.GetModule(Module.TYPE.Phase);

        Trajectory trajectory = new Trajectory(12, styleModule == null ? 0 : styleModule.Functions.Length);

        //Current
        trajectory.Points[6].SetTransformation(GetRootTransformation(mirrored));
        trajectory.Points[6].SetVelocity(GetRootVelocity(mirrored));
        trajectory.Points[6].SetSpeed(GetSpeed(mirrored));
        trajectory.Points[6].Styles = styleModule == null ? new float[0] : styleModule.GetStyle(this);
        trajectory.Points[6].Phase  = phaseModule == null ? 0f : phaseModule.GetPhase(this, mirrored);

        //Past
        for (int i = 0; i < 6; i++)
        {
            float delta = -1f + (float)i / 6f;
            if (Timestamp + delta < 0f)
            {
                float pivot     = -Timestamp - delta;
                float clamped   = Mathf.Clamp(pivot, 0f, Data.GetTotalTime());
                float ratio     = pivot == clamped ? 1f : Mathf.Abs(pivot / clamped);
                Frame reference = Data.GetFrame(clamped);
                trajectory.Points[i].SetPosition(Data.GetFirstFrame().GetRootPosition(mirrored) - ratio * (reference.GetRootPosition(mirrored) - Data.GetFirstFrame().GetRootPosition(mirrored)));
                trajectory.Points[i].SetRotation(reference.GetRootRotation(mirrored));
                trajectory.Points[i].SetVelocity(reference.GetRootVelocity(mirrored));
                trajectory.Points[i].SetSpeed(reference.GetSpeed(mirrored));
                trajectory.Points[i].Styles = styleModule == null ? new float[0] : styleModule.GetStyle(reference);
                trajectory.Points[i].Phase  = phaseModule == null ? 0f : 1f - phaseModule.GetPhase(reference, mirrored);
            }
            else
            {
                Frame previous = Data.GetFrame(Mathf.Clamp(Timestamp + delta, 0f, Data.GetTotalTime()));
                trajectory.Points[i].SetTransformation(previous.GetRootTransformation(mirrored));
                trajectory.Points[i].SetVelocity(previous.GetRootVelocity(mirrored));
                trajectory.Points[i].SetSpeed(previous.GetSpeed(mirrored));
                trajectory.Points[i].Styles = styleModule == null ? new float[0] : styleModule.GetStyle(previous);
                trajectory.Points[i].Phase  = phaseModule == null ? 0f : phaseModule.GetPhase(previous, mirrored);
            }
        }

        //Future
        for (int i = 1; i <= 5; i++)
        {
            float delta = (float)i / 5f;
            if (Timestamp + delta > Data.GetTotalTime())
            {
                float pivot     = 2f * Data.GetTotalTime() - Timestamp - delta;
                float clamped   = Mathf.Clamp(pivot, 0f, Data.GetTotalTime());
                float ratio     = pivot == clamped ?1f : Mathf.Abs((Data.GetTotalTime() - pivot) / (Data.GetTotalTime() - clamped));
                Frame reference = Data.GetFrame(clamped);
                trajectory.Points[6 + i].SetPosition(Data.GetLastFrame().GetRootPosition(mirrored) - ratio * (reference.GetRootPosition(mirrored) - Data.GetLastFrame().GetRootPosition(mirrored)));
                trajectory.Points[6 + i].SetRotation(reference.GetRootRotation(mirrored));
                trajectory.Points[6 + i].SetVelocity(reference.GetRootVelocity(mirrored));
                trajectory.Points[6 + i].SetSpeed(reference.GetSpeed(mirrored));
                trajectory.Points[6 + i].Styles = styleModule == null ? new float[0] : styleModule.GetStyle(reference);
                trajectory.Points[6 + i].Phase  = phaseModule == null ? 0f : 1f - phaseModule.GetPhase(reference, mirrored);
            }
            else
            {
                Frame future = Data.GetFrame(Mathf.Clamp(Timestamp + delta, 0f, Data.GetTotalTime()));
                trajectory.Points[6 + i].SetTransformation(future.GetRootTransformation(mirrored));
                trajectory.Points[6 + i].SetVelocity(future.GetRootVelocity(mirrored));
                trajectory.Points[6 + i].SetSpeed(future.GetSpeed(mirrored));
                trajectory.Points[6 + i].Styles = styleModule == null ? new float[0] : styleModule.GetStyle(future);
                trajectory.Points[6 + i].Phase  = phaseModule == null ? 0f : phaseModule.GetPhase(future, mirrored);
            }
        }

        return(trajectory);
    }
Example #6
0
    private IEnumerator ExportData()
    {
        Exporting = true;

        StreamWriter input  = CreateFile("Input");
        StreamWriter output = CreateFile("Output");

        for (int e = 0; e < Editors.Length; e++)
        {
            if (Export[e])
            {
                MotionEditor editor = Editors[e];
                int          items  = 0;
                for (int i = 0; i < editor.GetFiles().Length; i++)
                {
                    if (editor.Files[i].Data.Export)
                    {
                        editor.LoadFile(editor.Files[i]);

                        StyleModule styleModule = editor.GetFile().Data.GetModule(Module.TYPE.Style) == null ? null : (StyleModule)editor.GetFile().Data.GetModule(Module.TYPE.Style);
                        PhaseModule phaseModule = editor.GetFile().Data.GetModule(Module.TYPE.Phase) == null ? null : (PhaseModule)editor.GetFile().Data.GetModule(Module.TYPE.Phase);

                        for (int m = 1; m <= (Mirror ? 2 : 1); m++)
                        {
                            if (m == 1)
                            {
                                editor.SetMirror(false);
                            }
                            if (m == 2)
                            {
                                editor.SetMirror(true);
                            }
                            for (int s = 0; s < editor.GetFile().Data.Sequences.Length; s++)
                            {
                                MotionData.Sequence.Interval[] intervals = editor.GetFile().Data.Sequences[s].GetIntervals();
                                for (int interval = 0; interval < intervals.Length; interval++)
                                {
                                    Generating = 0f;
                                    Writing    = 0f;

                                    List <State> states = new List <State>();
                                    float        start  = editor.GetFile().Data.GetFrame(intervals[interval].Start).Timestamp;
                                    float        end    = editor.GetFile().Data.GetFrame(intervals[interval].End).Timestamp;

                                    for (float t = start; t <= end; t += 1f / Framerate)
                                    {
                                        Generating = (t - start) / (end - start - 1f / Framerate);
                                        editor.LoadFrame(t);
                                        states.Add(editor.GetState());
                                        //Spin
                                        items += 1;
                                        if (items == BatchSize)
                                        {
                                            items = 0;
                                            yield return(new WaitForSeconds(0f));
                                        }
                                    }

                                    for (int state = 0; state < states.Count - 1; state++)
                                    {
                                        Writing = (float)(state) / (float)(states.Count - 2);
                                        State current = states[state];
                                        State next    = states[state + 1];
                                        editor.LoadFrame(current);

                                        //Input
                                        string inputLine = string.Empty;
                                        for (int k = 0; k < 12; k++)
                                        {
                                            Vector3 position  = current.Trajectory.Points[k].GetPosition().GetRelativePositionTo(current.Root);
                                            Vector3 direction = current.Trajectory.Points[k].GetDirection().GetRelativeDirectionTo(current.Root);
                                            Vector3 velocity  = current.Trajectory.Points[k].GetVelocity().GetRelativeDirectionTo(current.Root);
                                            float[] style     = current.Trajectory.Points[k].Styles;
                                            inputLine += FormatValue(position.x);
                                            inputLine += FormatValue(position.z);
                                            inputLine += FormatValue(direction.x);
                                            inputLine += FormatValue(direction.z);
                                            inputLine += FormatValue(velocity.x);
                                            inputLine += FormatValue(velocity.z);
                                            inputLine += FormatArray(style);
                                        }
                                        for (int k = 0; k < current.BoneTransformations.Length; k++)
                                        {
                                            Vector3 position = current.BoneTransformations[k].GetPosition().GetRelativePositionTo(current.Root);
                                            Vector3 forward  = current.BoneTransformations[k].GetForward().GetRelativeDirectionTo(current.Root);
                                            Vector3 up       = current.BoneTransformations[k].GetUp().GetRelativeDirectionTo(current.Root);
                                            Vector3 velocity = current.BoneVelocities[k].GetRelativeDirectionTo(current.Root);
                                            inputLine += FormatVector3(position);
                                            inputLine += FormatVector3(forward);
                                            inputLine += FormatVector3(up);
                                            inputLine += FormatVector3(velocity);
                                        }
                                        if (phaseModule != null)
                                        {
                                            float currentPhase = phaseModule.GetPhase(editor.GetFile().Data.GetFrame(current.Index), editor.ShowMirror);
                                            //inputLine += FormatVector2(Utility.GetCirclePhase(currentPhase));
                                            inputLine += FormatArray(Utility.StylePhase(current.Trajectory.Points[6].Styles, currentPhase));
                                        }

                                        inputLine = inputLine.Remove(inputLine.Length - 1);
                                        inputLine = inputLine.Replace(",", ".");
                                        input.WriteLine(inputLine);

                                        //Output
                                        string outputLine = string.Empty;
                                        for (int k = 6; k < 12; k++)
                                        {
                                            Vector3 position  = next.Trajectory.Points[k].GetPosition().GetRelativePositionTo(current.Root);
                                            Vector3 direction = next.Trajectory.Points[k].GetDirection().GetRelativeDirectionTo(current.Root);
                                            Vector3 velocity  = next.Trajectory.Points[k].GetVelocity().GetRelativeDirectionTo(current.Root);
                                            float[] style     = next.Trajectory.Points[k].Styles;
                                            outputLine += FormatValue(position.x);
                                            outputLine += FormatValue(position.z);
                                            outputLine += FormatValue(direction.x);
                                            outputLine += FormatValue(direction.z);
                                            outputLine += FormatValue(velocity.x);
                                            outputLine += FormatValue(velocity.z);
                                            outputLine += FormatArray(style);
                                        }
                                        for (int k = 0; k < next.BoneTransformations.Length; k++)
                                        {
                                            Vector3 position = next.BoneTransformations[k].GetPosition().GetRelativePositionTo(current.Root);
                                            Vector3 forward  = next.BoneTransformations[k].GetForward().GetRelativeDirectionTo(current.Root);
                                            Vector3 up       = next.BoneTransformations[k].GetUp().GetRelativeDirectionTo(current.Root);
                                            Vector3 velocity = next.BoneVelocities[k].GetRelativeDirectionTo(current.Root);
                                            outputLine += FormatVector3(position);
                                            outputLine += FormatVector3(forward);
                                            outputLine += FormatVector3(up);
                                            outputLine += FormatVector3(velocity);
                                        }
                                        //outputLine += FormatVector3(next.RootMotion);
                                        if (phaseModule != null)
                                        {
                                            float currentPhase = phaseModule.GetPhase(editor.GetFile().Data.GetFrame(current.Index), editor.ShowMirror);
                                            float nextPhase    = phaseModule.GetPhase(editor.GetFile().Data.GetFrame(next.Index), editor.ShowMirror);
                                            outputLine += FormatValue(Utility.GetLinearPhaseUpdate(currentPhase, nextPhase));
                                        }

                                        outputLine = outputLine.Remove(outputLine.Length - 1);
                                        outputLine = outputLine.Replace(",", ".");
                                        output.WriteLine(outputLine);

                                        //Spin
                                        items += 1;
                                        if (items == BatchSize)
                                        {
                                            items = 0;
                                            yield return(new WaitForSeconds(0f));
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            yield return(new WaitForSeconds(0f));
        }
        input.Close();
        output.Close();
        Exporting = false;
    }
Example #7
0
    public Trajectory GetTrajectory(Frame frame, bool mirrored)
    {
        StyleModule styleModule = Data.GetModule(Module.TYPE.Style) == null ? null : (StyleModule)Data.GetModule(Module.TYPE.Style);
        PhaseModule phaseModule = Data.GetModule(Module.TYPE.Phase) == null ? null : (PhaseModule)Data.GetModule(Module.TYPE.Phase);

        Trajectory trajectory = new Trajectory(12, styleModule == null ? new string[0] : styleModule.GetNames());

        //Current
        trajectory.Points[6].SetTransformation(frame.GetRootTransformation(mirrored));
        trajectory.Points[6].SetVelocity(frame.GetRootVelocity(mirrored));
        trajectory.Points[6].Styles = styleModule == null ? new float[0] : styleModule.GetStyle(frame);
        trajectory.Points[6].Phase  = phaseModule == null ? 0f : phaseModule.GetPhase(frame, mirrored);

        //Past
        for (int i = 0; i < 6; i++)
        {
            float delta = -1f + (float)i / 6f;
            if (frame.Timestamp + delta < 0f)
            {
                float pivot     = -frame.Timestamp - delta;
                float clamped   = Mathf.Clamp(pivot, 0f, Data.GetTotalTime());
                float ratio     = pivot == clamped ? 1f : Mathf.Abs(pivot / clamped);
                Frame reference = Data.GetFrame(clamped);
                trajectory.Points[i].SetPosition(Data.GetFirstFrame().GetRootPosition(mirrored) - ratio * (reference.GetRootPosition(mirrored) - Data.GetFirstFrame().GetRootPosition(mirrored)));
                trajectory.Points[i].SetRotation(reference.GetRootRotation(mirrored));
                trajectory.Points[i].SetVelocity(reference.GetRootVelocity(mirrored));
                trajectory.Points[i].Styles = styleModule == null ? new float[0] : styleModule.GetStyle(reference);
                trajectory.Points[i].Phase  = phaseModule == null ? 0f : Mathf.Repeat(phaseModule.GetPhase(Data.GetFirstFrame(), mirrored) - Utility.PhaseUpdate(phaseModule.GetPhase(Data.GetFirstFrame(), mirrored), phaseModule.GetPhase(reference, mirrored)), 1f);
            }
            else
            {
                Frame previous = Data.GetFrame(Mathf.Clamp(frame.Timestamp + delta, 0f, Data.GetTotalTime()));
                trajectory.Points[i].SetTransformation(previous.GetRootTransformation(mirrored));
                trajectory.Points[i].SetVelocity(previous.GetRootVelocity(mirrored));
                trajectory.Points[i].Styles = styleModule == null ? new float[0] : styleModule.GetStyle(previous);
                trajectory.Points[i].Phase  = phaseModule == null ? 0f : phaseModule.GetPhase(previous, mirrored);
            }
        }

        //Future
        for (int i = 1; i <= 5; i++)
        {
            float delta = (float)i / 5f;
            if (frame.Timestamp + delta > Data.GetTotalTime())
            {
                float pivot     = 2f * Data.GetTotalTime() - frame.Timestamp - delta;
                float clamped   = Mathf.Clamp(pivot, 0f, Data.GetTotalTime());
                float ratio     = pivot == clamped ?1f : Mathf.Abs((Data.GetTotalTime() - pivot) / (Data.GetTotalTime() - clamped));
                Frame reference = Data.GetFrame(clamped);
                trajectory.Points[6 + i].SetPosition(Data.GetLastFrame().GetRootPosition(mirrored) - ratio * (reference.GetRootPosition(mirrored) - Data.GetLastFrame().GetRootPosition(mirrored)));
                trajectory.Points[6 + i].SetRotation(reference.GetRootRotation(mirrored));
                trajectory.Points[6 + i].SetVelocity(reference.GetRootVelocity(mirrored));
                trajectory.Points[6 + i].Styles = styleModule == null ? new float[0] : styleModule.GetStyle(reference);
                trajectory.Points[6 + i].Phase  = phaseModule == null ? 0f : Mathf.Repeat(phaseModule.GetPhase(Data.GetLastFrame(), mirrored) + Utility.PhaseUpdate(phaseModule.GetPhase(reference, mirrored), phaseModule.GetPhase(Data.GetLastFrame(), mirrored)), 1f);
            }
            else
            {
                Frame future = Data.GetFrame(Mathf.Clamp(frame.Timestamp + delta, 0f, Data.GetTotalTime()));
                trajectory.Points[6 + i].SetTransformation(future.GetRootTransformation(mirrored));
                trajectory.Points[6 + i].SetVelocity(future.GetRootVelocity(mirrored));
                trajectory.Points[6 + i].Styles = styleModule == null ? new float[0] : styleModule.GetStyle(future);
                trajectory.Points[6 + i].Phase  = phaseModule == null ? 0f : phaseModule.GetPhase(future, mirrored);
            }
        }

        /*
         * //Signals
         * for(int i=0; i<7; i++) {
         *      float delta = -2f + (float)i/6f;
         *      if(frame.Timestamp + delta < 0f) {
         *              float pivot = - frame.Timestamp - delta;
         *              float clamped = Mathf.Clamp(pivot, 0f, Data.GetTotalTime());
         *              Frame reference = Data.GetFrame(clamped);
         *              trajectory.Points[i].Signals = ArrayExtensions.Sub(styleModule.GetInverseSignal(reference, window), styleModule.GetStyle(reference, window));
         *      } else {
         *              Frame pivot = Data.GetFrame(Mathf.Clamp(frame.Timestamp + delta, 0f, Data.GetTotalTime()));
         *              trajectory.Points[i].Signals = ArrayExtensions.Sub(styleModule.GetSignal(pivot, window), styleModule.GetStyle(pivot, window));
         *      }
         * }
         * for(int i=1; i<=5; i++) {
         *      float delta = -1f + (float)i/5f;
         *      if(frame.Timestamp + delta < 0f) {
         *              float pivot = - frame.Timestamp - delta;
         *              float clamped = Mathf.Clamp(pivot, 0f, Data.GetTotalTime());
         *              Frame reference = Data.GetFrame(clamped);
         *              trajectory.Points[6+i].Signals = ArrayExtensions.Sub(styleModule.GetInverseSignal(reference, window), styleModule.GetStyle(reference, window));
         *      } else {
         *              Frame pivot = Data.GetFrame(Mathf.Clamp(frame.Timestamp + delta, 0f, Data.GetTotalTime()));
         *              trajectory.Points[6+i].Signals = ArrayExtensions.Sub(styleModule.GetSignal(pivot, window), styleModule.GetStyle(pivot, window));
         *      }
         * }
         *
         * //Finish
         * for(int i=0; i<trajectory.GetLast().Signals.Length; i++) {
         *      for(int j=7; j<12; j++) {
         *              if(trajectory.GetLast().Signals[i] > 0f && trajectory.GetLast().Signals[i] < 1f) {
         *                      int pivot = j-1;
         *                      trajectory.Points[j].Styles[i] = Mathf.Max(trajectory.Points[pivot].Styles[i], trajectory.Points[j].Styles[i]);
         *              }
         *              if(trajectory.GetLast().Signals[i] < 0f && trajectory.GetLast().Signals[i] > -1f) {
         *                      int pivot = j-1;
         *                      trajectory.Points[j].Styles[i] = Mathf.Min(trajectory.Points[pivot].Styles[i], trajectory.Points[j].Styles[i]);
         *              }
         *              if(trajectory.GetLast().Signals[i] == 0f) {
         *                      trajectory.Points[j].Styles[i] = 0f;
         *              }
         *              if(trajectory.GetLast().Signals[i] == 1f || trajectory.GetLast().Signals[i] == -1f) {
         *                      trajectory.Points[j].Styles[i] = trajectory.Points[6].Styles[i];
         *              }
         *      }
         * }
         * if(trajectory.GetLast().Signals.AbsSum() == 0f) {
         *      for(int j=7; j<12; j++) {
         *              trajectory.Points[j].Styles = trajectory.Points[6].Styles;
         *      }
         * }
         */

        //Signals
        for (int i = 0; i < 7; i++)
        {
            float delta = -1f + (float)i / 6f;
            if (frame.Timestamp + delta < 0f)
            {
                float pivot     = -frame.Timestamp - delta;
                float clamped   = Mathf.Clamp(pivot, 0f, Data.GetTotalTime());
                Frame reference = Data.GetFrame(clamped);
                trajectory.Points[i].Signals = styleModule.GetInverseSignal(reference);
            }
            else
            {
                Frame pivot = Data.GetFrame(Mathf.Clamp(frame.Timestamp + delta, 0f, Data.GetTotalTime()));
                trajectory.Points[i].Signals = styleModule.GetSignal(pivot);
            }
        }
        for (int i = 7; i < 12; i++)
        {
            trajectory.Points[i].Signals = (float[])trajectory.Points[6].Signals.Clone();
        }

        //Finish
        for (int i = 0; i < trajectory.GetLast().Signals.Length; i++)
        {
            for (int j = 7; j < 12; j++)
            {
                if (trajectory.GetLast().Signals[i] > 0f && trajectory.GetLast().Signals[i] < 1f)
                {
                    int pivot = j - 1;
                    trajectory.Points[j].Styles[i] = Mathf.Max(trajectory.Points[pivot].Styles[i], trajectory.Points[j].Styles[i]);
                }
                if (trajectory.GetLast().Signals[i] < 0f && trajectory.GetLast().Signals[i] > -1f)
                {
                    int pivot = j - 1;
                    trajectory.Points[j].Styles[i] = Mathf.Min(trajectory.Points[pivot].Styles[i], trajectory.Points[j].Styles[i]);
                }
                if (trajectory.GetLast().Signals[i] == 0f)
                {
                    trajectory.Points[j].Styles[i] = trajectory.Points[6].Styles[i];
                }
                if (trajectory.GetLast().Signals[i] == 1f || trajectory.GetLast().Signals[i] == -1f)
                {
                    trajectory.Points[j].Styles[i] = trajectory.Points[6].Styles[i];
                }
            }
        }
        if (trajectory.GetLast().Signals.AbsSum() == 0f)
        {
            for (int j = 7; j < 12; j++)
            {
                trajectory.Points[j].Styles = (float[])trajectory.Points[6].Styles.Clone();
            }
        }

        //for(int i=0; i<trajectory.Points.Length; i++) {
        //	for(int j=0; j<trajectory.Points[i].Signals.Length; j++) {
        //		trajectory.Points[i].Signals[j] = Mathf.Sign(trajectory.Points[i].Signals[j]) * Mathf.Pow(Mathf.Abs(trajectory.Points[i].Signals[j]), 0.5f);
        //	}
        //}

        return(trajectory);
    }
Example #8
0
    public void Repair(MotionEditor editor)
    {
        //Repair
        for (int i = 0; i < Modules.Length; i++)
        {
            if (Modules[i] == null)
            {
                ArrayExtensions.RemoveAt(ref Modules, i);
                i--;
            }
        }
        Object[] objects = AssetDatabase.LoadAllAssetsAtPath(AssetDatabase.GetAssetPath(this));
        foreach (Object o in objects)
        {
            if (o is Module)
            {
                if (ArrayExtensions.Contains(ref Modules, (Module)o))
                {
                    //	Debug.Log(((Module)o).Type().ToString() + " contained.");
                }
                else
                {
                    ArrayExtensions.Add(ref Modules, (Module)o);
                    //	Debug.Log(((Module)o).Type().ToString() + " missing.");
                }
            }
        }

        //Repair
        StyleModule styleModule = (StyleModule)GetModule(Module.TYPE.Style);

        if (styleModule != null)
        {
            if (styleModule.Keys.Length != styleModule.Data.GetTotalFrames())
            {
                styleModule.Keys    = new bool[styleModule.Data.GetTotalFrames()];
                styleModule.Keys[0] = true;
                styleModule.Keys[styleModule.Keys.Length - 1] = true;
                for (int i = 1; i < styleModule.Keys.Length - 1; i++)
                {
                    for (int j = 0; j < styleModule.Functions.Length; j++)
                    {
                        if (styleModule.Functions[j].Values[i] == 0f && styleModule.Functions[j].Values[i + 1] != 0f)
                        {
                            styleModule.Keys[i] = true;
                        }
                        if (styleModule.Functions[j].Values[i] == 1f && styleModule.Functions[j].Values[i + 1] != 1f)
                        {
                            styleModule.Keys[i] = true;
                        }
                        if (styleModule.Functions[j].Values[i] != 0f && styleModule.Functions[j].Values[i + 1] == 0f)
                        {
                            styleModule.Keys[i + 1] = true;
                        }
                        if (styleModule.Functions[j].Values[i] != 1f && styleModule.Functions[j].Values[i + 1] == 1f)
                        {
                            styleModule.Keys[i + 1] = true;
                        }
                    }
                }
            }
        }
        //
        //
    }
Example #9
0
    public Trajectory GetTrajectory(Frame frame, bool mirrored)
    {
        StyleModule styleModule = Data.GetModule(Module.TYPE.Style) == null ? null : (StyleModule)Data.GetModule(Module.TYPE.Style);
        PhaseModule phaseModule = Data.GetModule(Module.TYPE.Phase) == null ? null : (PhaseModule)Data.GetModule(Module.TYPE.Phase);

        Trajectory trajectory = new Trajectory(12, styleModule == null ? new string[0] : styleModule.GetNames());

        int window = 5;

        //Current
        trajectory.Points[6].SetTransformation(frame.GetRootTransformation(mirrored));
        trajectory.Points[6].SetVelocity(frame.GetRootVelocity(mirrored));
        trajectory.Points[6].SetSpeed(frame.GetSpeed(mirrored));
        trajectory.Points[6].Styles  = styleModule == null ? new float[0] : styleModule.GetStyle(frame, window);
        trajectory.Points[6].Phase   = phaseModule == null ? 0f : phaseModule.GetPhase(frame, mirrored, window);
        trajectory.Points[6].Signals = styleModule == null ? new float[0] : styleModule.GetSignal(frame, window);

        //Past
        for (int i = 0; i < 6; i++)
        {
            float delta = -1f + (float)i / 6f;
            if (frame.Timestamp + delta < 0f)
            {
                float pivot     = -frame.Timestamp - delta;
                float clamped   = Mathf.Clamp(pivot, 0f, Data.GetTotalTime());
                float ratio     = pivot == clamped ? 1f : Mathf.Abs(pivot / clamped);
                Frame reference = Data.GetFrame(clamped);
                trajectory.Points[i].SetPosition(Data.GetFirstFrame().GetRootPosition(mirrored) - ratio * (reference.GetRootPosition(mirrored) - Data.GetFirstFrame().GetRootPosition(mirrored)));
                trajectory.Points[i].SetRotation(reference.GetRootRotation(mirrored));
                trajectory.Points[i].SetVelocity(reference.GetRootVelocity(mirrored));
                trajectory.Points[i].SetSpeed(reference.GetSpeed(mirrored));
                trajectory.Points[i].Styles  = styleModule == null ? new float[0] : styleModule.GetStyle(reference, window);
                trajectory.Points[i].Phase   = phaseModule == null ? 0f : Mathf.Repeat(phaseModule.GetPhase(Data.GetFirstFrame(), mirrored, window) - Utility.GetLinearPhaseUpdate(phaseModule.GetPhase(Data.GetFirstFrame(), mirrored, window), phaseModule.GetPhase(reference, mirrored, window)), 1f);
                trajectory.Points[i].Signals = styleModule == null ? new float[0] : styleModule.GetInverseSignal(reference, window);
            }
            else
            {
                Frame previous = Data.GetFrame(Mathf.Clamp(frame.Timestamp + delta, 0f, Data.GetTotalTime()));
                trajectory.Points[i].SetTransformation(previous.GetRootTransformation(mirrored));
                trajectory.Points[i].SetVelocity(previous.GetRootVelocity(mirrored));
                trajectory.Points[i].SetSpeed(previous.GetSpeed(mirrored));
                trajectory.Points[i].Styles  = styleModule == null ? new float[0] : styleModule.GetStyle(previous, window);
                trajectory.Points[i].Phase   = phaseModule == null ? 0f : phaseModule.GetPhase(previous, mirrored, window);
                trajectory.Points[i].Signals = styleModule == null ? new float[0] : styleModule.GetSignal(previous, window);
            }
        }

        //Future
        for (int i = 1; i <= 5; i++)
        {
            float delta = (float)i / 5f;
            if (frame.Timestamp + delta > Data.GetTotalTime())
            {
                float pivot     = 2f * Data.GetTotalTime() - frame.Timestamp - delta;
                float clamped   = Mathf.Clamp(pivot, 0f, Data.GetTotalTime());
                float ratio     = pivot == clamped ?1f : Mathf.Abs((Data.GetTotalTime() - pivot) / (Data.GetTotalTime() - clamped));
                Frame reference = Data.GetFrame(clamped);
                trajectory.Points[6 + i].SetPosition(Data.GetLastFrame().GetRootPosition(mirrored) - ratio * (reference.GetRootPosition(mirrored) - Data.GetLastFrame().GetRootPosition(mirrored)));
                trajectory.Points[6 + i].SetRotation(reference.GetRootRotation(mirrored));
                trajectory.Points[6 + i].SetVelocity(reference.GetRootVelocity(mirrored));
                trajectory.Points[6 + i].SetSpeed(reference.GetSpeed(mirrored));
                trajectory.Points[6 + i].Styles  = styleModule == null ? new float[0] : styleModule.GetStyle(reference, window);
                trajectory.Points[6 + i].Phase   = phaseModule == null ? 0f : Mathf.Repeat(phaseModule.GetPhase(Data.GetLastFrame(), mirrored, window) + Utility.GetLinearPhaseUpdate(phaseModule.GetPhase(reference, mirrored, window), phaseModule.GetPhase(Data.GetLastFrame(), mirrored, window)), 1f);
                trajectory.Points[6 + i].Signals = styleModule == null ? new float[0] : styleModule.GetInverseSignal(reference, window);
            }
            else
            {
                Frame future = Data.GetFrame(Mathf.Clamp(frame.Timestamp + delta, 0f, Data.GetTotalTime()));
                trajectory.Points[6 + i].SetTransformation(future.GetRootTransformation(mirrored));
                trajectory.Points[6 + i].SetVelocity(future.GetRootVelocity(mirrored));
                trajectory.Points[6 + i].SetSpeed(future.GetSpeed(mirrored));
                trajectory.Points[6 + i].Styles  = styleModule == null ? new float[0] : styleModule.GetStyle(future, window);
                trajectory.Points[6 + i].Phase   = phaseModule == null ? 0f : phaseModule.GetPhase(future, mirrored, window);
                trajectory.Points[6 + i].Signals = styleModule == null ? new float[0] : styleModule.GetSignal(future, window);
            }
        }
        return(trajectory);
    }
Example #10
0
    private IEnumerator Process()
    {
        if (Editor != null)
        {
            Processing = true;
            foreach (Asset a in Assets)
            {
                a.Processed = false;
            }
            int count = 0;

            if (Pipeline == PIPELINE.Basketball)
            {
                string     referenceBone = string.Empty;
                MotionData referenceData = null;
                foreach (Asset a in Assets)
                {
                    if (a.Selected)
                    {
                        count += 1;
                        MotionData data = OfflineProcessing ? Editor.GetAsset(a.GUID) : Editor.LoadData(a.GUID);
                        while (!OfflineProcessing && !data.GetScene().isLoaded)
                        {
                            Debug.Log("Waiting for scene being loaded...");
                            yield return(new WaitForSeconds(0f));
                        }
                        //START OF PROCESSING

                        // Reset motion data
                        foreach (Frame frame in data.Frames)
                        {
                            frame.ResetTransformations();
                        }

                        // Global
                        data.RemoveAllModules();
                        data.MirrorAxis = Axis.ZPositive;

                        // 1on1 Ball Copying
                        {
                            string GetID(MotionData asset)
                            {
                                return(asset.GetName().Substring(0, asset.GetName().LastIndexOf("_P0")));
                            }

                            referenceBone = "Player 01:Ball";
                            if (data.GetName().Contains("_P0"))
                            {
                                if (data.GetName().Contains("_P01"))
                                {
                                    referenceData = data;
                                }
                                else if (GetID(data) == GetID(referenceData))
                                {
                                    data.SampleTransformations(referenceData, referenceBone);
                                }
                                else
                                {
                                    Debug.LogError("Skipping asset " + data.GetName() + " as information of P01 is not of same capture.");
                                }
                            }
                            else
                            {
                                Debug.LogError("Skipping asset " + data.GetName() + " as it does not contain player information.");
                            }
                        }

                        {
                            RootModule root = data.AddModule <RootModule>();
                            root.Root          = data.Source.FindBone("Player 01:Hips").Index;
                            root.RightShoulder = data.Source.FindBone("Player 01:LeftShoulder").Index;
                            root.LeftShoulder  = data.Source.FindBone("Player 01:RightShoulder").Index;
                            root.RightHip      = data.Source.FindBone("Player 01:LeftUpLeg").Index;
                            root.LeftHip       = data.Source.FindBone("Player 01:RightUpLeg").Index;
                            root.Neck          = data.Source.FindBone("Player 01:Neck").Index;
                            root.Hips          = data.Source.FindBone("Player 01:Hips").Index;
                            root.Smooth        = true;
                            root.Topology      = RootModule.TOPOLOGY.Biped;
                            root.ForwardAxis   = Axis.XPositive;
                        }

                        {
                            ContactModule contact = data.AddModule <ContactModule>();
                            contact.Clear();
                            contact.AddSensor("Player 01:LeftFootEnd", "Player 01:LeftFootEnd", Vector3.zero, 0.075f, 1f, -1);
                            contact.AddSensor("Player 01:RightFootEnd", "Player 01:RightFootEnd", Vector3.zero, 0.075f, 1f, -1);
                            contact.AddSensor("Player 01:LeftHand", "Player 01:LeftHand", new Vector3(-0.1f, 0f, 0f), 0.075f, 0f, -1);
                            contact.AddSensor("Player 01:RightHand", "Player 01:RightHand", new Vector3(-0.1f, 0f, 0f), 0.075f, 0f, -1);
                            contact.AddSensor("Player 01:Ball", "Player 01:Ball", Vector3.zero, 0.2f, 0f, LayerMask.GetMask("Ground"));
                            contact.CaptureContacts(Editor);
                        }

                        {
                            DribbleModule dribble = data.AddModule <DribbleModule>();
                            dribble.Area   = 2.5f;
                            dribble.Radius = 0.125f;
                            dribble.Axis   = Axis.YPositive;
                            Matrix4x4[] motion = dribble.CleanupBallTransformations(false);
                            for (int i = 0; i < data.Frames.Length; i++)
                            {
                                data.Frames[i].Transformations[dribble.Ball] = motion[i];
                            }
                            data.GetModule <ContactModule>().CaptureContacts(Editor);
                        }

                        {
                            StyleModule   style   = data.AddModule <StyleModule>();
                            RootModule    root    = data.GetModule <RootModule>();
                            DribbleModule dribble = data.GetModule <DribbleModule>();
                            style.Clear();
                            StyleModule.StyleFunction standing  = style.AddStyle("Stand");
                            StyleModule.StyleFunction moving    = style.AddStyle("Move");
                            StyleModule.StyleFunction dribbling = style.AddStyle("Dribble");
                            StyleModule.StyleFunction holding   = style.AddStyle("Hold");
                            StyleModule.StyleFunction shooting  = style.AddStyle("Shoot");
                            float threshold = 1f;
                            for (int f = 0; f < data.Frames.Length; f++)
                            {
                                float[] timestamps = data.SimulateTimestamps(data.Frames[f], 30);
                                float[] weights    = new float[timestamps.Length];
                                for (int j = 0; j < timestamps.Length; j++)
                                {
                                    weights[j] = Mathf.Clamp(root.GetRootVelocity(timestamps[j], false).magnitude, 0f, threshold);
                                    weights[j] = weights[j].Normalize(0f, threshold, 0, 1f);
                                    weights[j] = weights[j].SmoothStep(2f, 0.5f);
                                }
                                float weight = weights.Gaussian().SmoothStep(2f, 0.5f);
                                standing.Values[f]  = 1f - weight;
                                moving.Values[f]    = weight;
                                dribbling.Values[f] = dribble.IsDribbling(data.Frames[f].Timestamp, false) ? 1f : 0f;
                                holding.Values[f]   = dribble.IsHolding(data.Frames[f].Timestamp, false) ? 1f : 0f;
                                shooting.Values[f]  = dribble.IsShooting(data.Frames[f].Timestamp, false) ? 1f : 0f;
                            }
                            style.Mode = StyleModule.DRAWING.Frames;
                            style.GenerateKeys();
                        }

                        {
                            PhaseModule   phase   = data.AddModule <PhaseModule>();
                            ContactModule contact = data.GetModule <ContactModule>();
                            phase.Inspect = true;
                            phase.SetFunctions(contact.GetNames());
                            phase.ShowNormalized   = true;
                            phase.ShowHighlighted  = true;
                            phase.ShowValues       = true;
                            phase.ShowFitting      = true;
                            phase.ShowZero         = true;
                            phase.ShowPhase        = true;
                            phase.ShowWindow       = false;
                            phase.DisplayValues    = false;
                            phase.MaxIterations    = 50;
                            phase.Individuals      = 50;
                            phase.Elites           = 5;
                            phase.Exploration      = 0.2f;
                            phase.Memetism         = 0.1f;
                            phase.MaxFrequency     = 4f;
                            phase.RescalingMethod  = PhaseModule.Rescaling.Window;
                            phase.ApplyButterworth = true;
                            phase.StartFitting();
                            while (phase.IsFitting())
                            {
                                yield return(new WaitForSeconds(0f));
                            }
                        }

                        //END OF PROCESSING
                        data.MarkDirty();
                        a.Processed = true;
                    }
                }
                foreach (Asset a in Assets)
                {
                    if (a.Selected)
                    {
                        MotionData data = Editor.LoadData(a.GUID);
                        while (!data.GetScene().isLoaded)
                        {
                            Debug.Log("Waiting for scene being loaded...");
                            yield return(new WaitForSeconds(0f));
                        }
                        //START OF PROCESSING

                        data.GetModule <DribbleModule>().ComputeInteraction();

                        //END OF PROCESSING
                        if (SaveAfterProcessing)
                        {
                            data.MarkDirty(true, !OfflineProcessing);
                        }
                        a.Processed = true;
                        yield return(new WaitForSeconds(0f));
                    }
                }
                if (SaveAfterProcessing)
                {
                    AssetDatabase.SaveAssets();
                    AssetDatabase.Refresh();
                }
            }

            if (Pipeline == PIPELINE.Quadruped)
            {
                foreach (Asset a in Assets)
                {
                    if (a.Selected)
                    {
                        count += 1;
                        MotionData data = OfflineProcessing ? Editor.GetAsset(a.GUID) : Editor.LoadData(a.GUID);
                        while (!OfflineProcessing && !data.GetScene().isLoaded)
                        {
                            Debug.Log("Waiting for scene being loaded...");
                            yield return(new WaitForSeconds(0f));
                        }
                        // START OF PROCESSING

                        // Reset motion data
                        foreach (Frame frame in data.Frames)
                        {
                            frame.ResetTransformations();
                        }

                        // Global
                        data.RemoveAllModules();
                        data.Scale      = 0.01f;
                        data.MirrorAxis = Axis.ZPositive;
                        data.Source.FindBone("Head").Alignment      = new Vector3(90f, 0f, 0f);
                        data.Source.FindBone("Tail").Alignment      = new Vector3(-45f, 0f, 0f);
                        data.Source.FindBone("Tail1").Alignment     = new Vector3(-45f, 0f, 0f);
                        data.Source.FindBone("Tail1Site").Alignment = new Vector3(-45f, 0f, 0f);

                        {
                            ContactModule contact = data.AddModule <ContactModule>();
                            contact.Clear();
                            contact.AddSensor("Hips", "Hips", Vector3.zero, 0.2f, 1f, LayerMask.GetMask("Ground"));
                            contact.AddSensor("Neck", "Neck", Vector3.zero, 0.25f, 1f, LayerMask.GetMask("Ground"));
                            contact.AddSensor("LeftHandSite", new string[] { "LeftForeArm", "LeftHandSite" }, Vector3.zero, 1f / 30f, 1f, LayerMask.GetMask("Ground"));
                            contact.AddSensor("RightHandSite", new string[] { "RightForeArm", "RightHandSite" }, Vector3.zero, 1f / 30f, 1f, LayerMask.GetMask("Ground"));
                            contact.AddSensor("LeftFootSite", "LeftFootSite", Vector3.zero, 1f / 30f, 1f, LayerMask.GetMask("Ground"));
                            contact.AddSensor("RightFootSite", "RightFootSite", Vector3.zero, 1f / 30f, 1f, LayerMask.GetMask("Ground"));
                            contact.CaptureContacts(Editor);
                        }

                        {
                            StyleModule style = data.AddModule <StyleModule>();
                            RootModule  root  = data.AddModule <RootModule>();
                            root.Topology = RootModule.TOPOLOGY.Quadruped;
                            ContactModule contact = data.GetModule <ContactModule>();
                            style.Clear();
                            StyleModule.StyleFunction idling   = style.AddStyle("Idle");
                            StyleModule.StyleFunction moving   = style.AddStyle("Move");
                            StyleModule.StyleFunction sitting  = style.AddStyle("Sit");
                            StyleModule.StyleFunction resting  = style.AddStyle("Rest");
                            StyleModule.StyleFunction standing = style.AddStyle("Stand");
                            StyleModule.StyleFunction jumping  = style.AddStyle("Jump");
                            StyleModule.StyleFunction speed    = style.AddStyle("Speed");
                            float[]        timeWindow          = data.GetTimeWindow(MotionEditor.GetInstance().PastWindow + MotionEditor.GetInstance().FutureWindow, 1f);
                            float[]        contactHeights      = new float[data.Frames.Length];
                            List <float[]> sitPatterns         = new List <float[]>()
                            {
                                new float[] { 1f, 0f, 1f, 1f, 1f, 1f },
                                new float[] { 1f, 0f, 0f, 1f, 1f, 1f },
                                new float[] { 1f, 0f, 1f, 0f, 1f, 1f }
                            };
                            List <float[]> restPatterns = new List <float[]>()
                            {
                                new float[] { 1f, 1f, 1f, 1f, 1f, 1f }
                            };
                            List <float[]> standPatterns = new List <float[]>()
                            {
                                new float[] { 1f, 0f, 0f, 0f, 1f, 1f }
                            };
                            List <float[]> jumpPatterns = new List <float[]>()
                            {
                                new float[] { 0f, 0f, 0f, 0f, 0f, 0f }
                            };
                            for (int i = 0; i < data.Frames.Length; i++)
                            {
                                for (int j = 0; j < contact.Sensors.Length; j++)
                                {
                                    contactHeights[i] += data.Frames[i].GetBoneTransformation(contact.Sensors[j].Bones.Last(), false).GetPosition().y;
                                }
                                contactHeights[i] /= contact.Sensors.Length;
                            }
                            for (int f = 0; f < data.Frames.Length; f++)
                            {
                                float weight = GetMovementWeight(data.Frames[f].Timestamp, 0.5f, 0.5f);
                                idling.Values[f] = 1f - weight;
                                moving.Values[f] = weight;
                                float   sit     = GetContactsWeight(data.Frames[f].Timestamp, 0.5f, contact, sitPatterns, 0f, 1f);
                                float   rest    = GetContactsWeight(data.Frames[f].Timestamp, 0.5f, contact, restPatterns, 0f, 1f);
                                float   stand   = GetContactsWeight(data.Frames[f].Timestamp, 0.5f, contact, standPatterns, 0f, 1f);
                                float   jump    = GetContactsWeight(data.Frames[f].Timestamp, 0.5f, contact, jumpPatterns, 0.3f, 0.1f);
                                float[] actions = new float[] { sit, rest, stand, jump };
                                Utility.SoftMax(ref actions);
                                sitting.Values[f]  = sit;
                                resting.Values[f]  = rest;
                                standing.Values[f] = stand;
                                jumping.Values[f]  = jump;
                                speed.Values[f]    = GetRootSpeed(data.Frames[f].Timestamp);
                            }

                            float GetRootSpeed(float timestamp)
                            {
                                return(Compute());

                                float Compute()
                                {
                                    Vector3[] positions = new Vector3[timeWindow.Length];
                                    for (int i = 0; i < timeWindow.Length; i++)
                                    {
                                        positions[i] = root.GetRootPosition(timestamp + timeWindow[i], false);
                                    }
                                    float length = 0f;

                                    for (int i = 1; i < positions.Length; i++)
                                    {
                                        length += Vector3.Distance(positions[i - 1], positions[i]);
                                    }
                                    return(length / (timeWindow.Last() - timeWindow.First()));
                                }
                            }

                            float GetMovementWeight(float timestamp, float window, float threshold)
                            {
                                float[] weights = new float[timeWindow.Length];
                                for (int j = 0; j < timeWindow.Length; j++)
                                {
                                    weights[j] = Mathf.Clamp(root.GetRootVelocity(timestamp + timeWindow[j], false).magnitude, 0f, threshold) / threshold;
                                }

                                float[] gradients = new float[weights.Length - 1];
                                for (int i = 0; i < gradients.Length; i++)
                                {
                                    gradients[i] = (weights[i + 1] - weights[i]) / (timeWindow[i + 1] - timeWindow[i]);
                                }
                                float gradient = Mathf.Abs(gradients.Gaussian());

                                return(weights.Gaussian(gradient).SmoothStep(2f, 0.5f));
                            }

                            float GetContactsWeight(float timestamp, float window, ContactModule module, List <float[]> patterns, float heightThreshold, float power)
                            {
                                float ContactGaussian(float t)
                                {
                                    float[] weights = new float[timeWindow.Length];
                                    for (int j = 0; j < timeWindow.Length; j++)
                                    {
                                        bool match = false;
                                        for (int i = 0; i < patterns.Count; i++)
                                        {
                                            float[] contacts = module.GetContacts(t + timeWindow[j], false);
                                            match = ArrayExtensions.Equal(contacts, patterns[i]).All(true);
                                            if (match)
                                            {
                                                break;
                                            }
                                        }
                                        if (match && heightThreshold != 0f && contactHeights[data.GetFrame(t).Index - 1] < heightThreshold)
                                        {
                                            match = false;
                                        }
                                        weights[j] = match ? 1f : 0f;
                                    }
                                    return(weights.Gaussian());
                                }

                                float weight = ContactGaussian(timestamp);

                                weight = Mathf.Pow(weight, 1f - weight);
                                return(Mathf.Pow(weight, power));
                            }

                            style.Mode = StyleModule.DRAWING.Frames;
                        }

                        {
                            PhaseModule phase = data.AddModule <PhaseModule>();
                            phase.Inspect = true;
                            RootModule    root    = data.GetModule <RootModule>();
                            ContactModule contact = data.GetModule <ContactModule>();
                            phase.SetFunctions(contact.GetNames());
                            phase.ShowNormalized   = true;
                            phase.ShowHighlighted  = true;
                            phase.ShowValues       = true;
                            phase.ShowFitting      = true;
                            phase.ShowZero         = true;
                            phase.ShowPhase        = true;
                            phase.ShowWindow       = false;
                            phase.DisplayValues    = false;
                            phase.MaxIterations    = 50;
                            phase.Individuals      = 100;
                            phase.Elites           = 10;
                            phase.Exploration      = 0.2f;
                            phase.Memetism         = 0.1f;
                            phase.MaxFrequency     = 4f;
                            phase.RescalingMethod  = PhaseModule.Rescaling.Window;
                            phase.ApplyButterworth = true;

                            phase.StartFitting();
                            while (phase.IsFitting())
                            {
                                yield return(new WaitForSeconds(0f));
                            }
                        }

                        //END OF PROCESSING
                        if (SaveAfterProcessing)
                        {
                            data.MarkDirty(true, !OfflineProcessing);
                        }
                        a.Processed = true;
                        yield return(new WaitForSeconds(0f));
                    }
                }

                for (int i = 0; i < Editor.Assets.Length; i++)
                {
                    Editor.GetAsset(i).ResetSequences();
                    Editor.GetAsset(i).Export = false;
                }
                Editor.GetAsset(0).Export = true;
                Editor.GetAsset(0).SetSequence(0, 180, 1531);
                Editor.GetAsset(2).Export = true;
                Editor.GetAsset(2).SetSequence(0, 680, 820);
                Editor.GetAsset(6).Export = true;
                Editor.GetAsset(6).SetSequence(0, 90, 593);
                Editor.GetAsset(7).Export = true;
                Editor.GetAsset(7).SetSequence(0, 290, 1072);
                Editor.GetAsset(8).Export = true;
                Editor.GetAsset(8).SetSequence(0, 1, 50);
                Editor.GetAsset(8).SetSequence(1, 400, 911);
                Editor.GetAsset(9).Export  = true;
                Editor.GetAsset(10).Export = true;
                Editor.GetAsset(10).SetSequence(0, 230, 548);
                Editor.GetAsset(11).Export = true;
                Editor.GetAsset(11).SetSequence(0, 400, 567);
                Editor.GetAsset(12).Export = true;
                Editor.GetAsset(13).Export = true;
                Editor.GetAsset(14).Export = true;
                Editor.GetAsset(16).Export = true;
                Editor.GetAsset(16).SetSequence(0, 200, 550);
                Editor.GetAsset(17).Export = true;
                Editor.GetAsset(17).SetSequence(0, 470, 720);
                Editor.GetAsset(18).Export = true;
                Editor.GetAsset(18).SetSequence(0, 175, 395);
                Editor.GetAsset(19).Export = true;
                Editor.GetAsset(19).SetSequence(0, 300, 750);
                Editor.GetAsset(19).SetSequence(1, 1040, 1079);
                Editor.GetAsset(20).Export = true;
                Editor.GetAsset(21).Export = true;
                Editor.GetAsset(21).SetSequence(0, 1, 1300);
                Editor.GetAsset(21).SetSequence(1, 2950, 3530);
                Editor.GetAsset(21).SetSequence(2, 3730, 4200);
                Editor.GetAsset(22).Export = true;
                Editor.GetAsset(23).Export = true;
                Editor.GetAsset(23).Export = true;
                Editor.GetAsset(24).Export = true;
                Editor.GetAsset(24).SetSequence(0, 200, 630);
                Editor.GetAsset(25).Export = true;
                Editor.GetAsset(25).SetSequence(0, 1, 2690);
                Editor.GetAsset(25).SetSequence(1, 2760, 4336);
                Editor.GetAsset(26).Export = true;
                Editor.GetAsset(27).Export = true;
                Editor.GetAsset(27).SetSequence(0, 1, 1100);
                Editor.GetAsset(27).SetSequence(1, 2820, 3940);
                Editor.GetAsset(27).SetSequence(2, 4100, 4500);
                Editor.GetAsset(27).SetSequence(3, 5660, 6010);
                Editor.GetAsset(27).SetSequence(4, 6600, 7200);
                Editor.GetAsset(27).SetSequence(5, 12300, 12850);
                Editor.GetAsset(27).SetSequence(6, 13200, 13399);
                Editor.GetAsset(28).Export = true;
                Editor.GetAsset(28).SetSequence(0, 920, 985);
                Editor.GetAsset(28).SetSequence(1, 1700, 1907);
                Editor.GetAsset(29).Export = true;
                Editor.GetAsset(29).SetSequence(0, 250, 790);
                Editor.GetAsset(29).SetSequence(1, 970, 1575);
                Editor.GetAsset(29).SetSequence(2, 1630, 1750);
                Editor.GetAsset(30).Export = true;
                Editor.GetAsset(30).SetSequence(0, 1790, 1920);
                Editor.GetAsset(30).SetSequence(1, 2070, 2470);
                Editor.GetAsset(30).SetSequence(2, 2770, 3025);
                Editor.GetAsset(31).Export = true;
                Editor.GetAsset(31).SetSequence(0, 170, 500);
                Editor.GetAsset(31).SetSequence(1, 1250, 2460);
                Editor.GetAsset(31).SetSequence(2, 3040, 3200);
                Editor.GetAsset(31).SetSequence(3, 4680, 6550);
                Editor.GetAsset(31).SetSequence(4, 7600, 9450);
                Editor.GetAsset(31).SetSequence(5, 11540, 11691);
                Editor.GetAsset(32).Export = true;
                Editor.GetAsset(32).SetSequence(0, 1, 300);
                Editor.GetAsset(32).SetSequence(1, 1360, 1540);
                Editor.GetAsset(32).SetSequence(2, 2380, 3086);
                Editor.GetAsset(33).Export = true;
                Editor.GetAsset(33).SetSequence(0, 1, 1170);
                Editor.GetAsset(33).SetSequence(1, 1980, 2160);
                Editor.GetAsset(33).SetSequence(2, 7830, 8090);
                Editor.GetAsset(34).Export = true;
                Editor.GetAsset(34).SetSequence(0, 1, 270);
                Editor.GetAsset(34).SetSequence(1, 2490, 2856);
                Editor.GetAsset(35).Export = true;
                Editor.GetAsset(37).Export = true;
                Editor.GetAsset(38).Export = true;
                Editor.GetAsset(38).SetSequence(0, 3330, 3900);
                Editor.GetAsset(39).Export = true;
                Editor.GetAsset(39).SetSequence(0, 880, 920);
                Editor.GetAsset(39).SetSequence(1, 1280, 5052);
                Editor.GetAsset(41).Export = true;
                Editor.GetAsset(41).SetSequence(0, 4690, 6190);
                Editor.GetAsset(42).Export = true;
                Editor.GetAsset(42).SetSequence(0, 900, 3594);
                Editor.GetAsset(43).Export = true;
                Editor.GetAsset(43).SetSequence(0, 1, 500);
                Editor.GetAsset(43).SetSequence(1, 4340, 4577);
                Editor.GetAsset(44).Export = true;
                Editor.GetAsset(44).SetSequence(0, 1, 700);
                Editor.GetAsset(44).SetSequence(1, 950, 2000);
                Editor.GetAsset(45).Export = true;
                Editor.GetAsset(45).SetSequence(0, 1, 410);
                Editor.GetAsset(45).SetSequence(1, 680, 778);
                Editor.GetAsset(46).Export = true;
                Editor.GetAsset(46).SetSequence(0, 175, 235);
                Editor.GetAsset(47).Export = true;
                Editor.GetAsset(47).SetSequence(0, 275, 498);
                Editor.GetAsset(48).Export = true;
                Editor.GetAsset(48).SetSequence(0, 1, 220);
                Editor.GetAsset(48).SetSequence(1, 675, 748);
                Editor.GetAsset(49).Export = true;
                Editor.GetAsset(49).SetSequence(0, 1, 700);
                Editor.GetAsset(49).SetSequence(1, 1510, 8300);
                Editor.GetAsset(50).Export = true;
                Editor.GetAsset(50).SetSequence(0, 200, 1000);
                Editor.GetAsset(50).SetSequence(1, 1850, 2100);
                Editor.GetAsset(50).SetSequence(2, 4150, 4700);
                Editor.GetAsset(50).SetSequence(3, 5030, 5356);

                //Mark for saving
                for (int i = 0; i < Editor.Assets.Length; i++)
                {
                    Editor.GetAsset(i).MarkDirty(true, false);
                }

                if (SaveAfterProcessing)
                {
                    AssetDatabase.SaveAssets();
                    AssetDatabase.Refresh();
                }
            }

            Processing = false;
            foreach (Asset a in Assets)
            {
                a.Processed = false;
            }
            yield return(new WaitForSeconds(0f));

            Debug.Log("Finished processing " + count + " assets.");
        }
    }
Example #11
0
        public void Inspector()
        {
            Index = GetIndex();

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

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

                    EditorGUILayout.BeginHorizontal();
                    Target.Folder = EditorGUILayout.TextField("Folder", "Assets/" + Target.Folder.Substring(Mathf.Min(7, Target.Folder.Length)));
                    if (Utility.GUIButton("Import", UltiDraw.DarkGrey, UltiDraw.White))
                    {
                        Import();
                    }
                    EditorGUILayout.EndHorizontal();


                    Utility.SetGUIColor(Target.GetActor() == null ? UltiDraw.DarkRed : UltiDraw.White);
                    Target.Actor = (Actor)EditorGUILayout.ObjectField("Actor", Target.GetActor(), typeof(Actor), true);
                    Utility.ResetGUIColor();

                    EditorGUILayout.ObjectField("Environment", Target.GetEnvironment(), typeof(Transform), true);

                    SetNameFilter(EditorGUILayout.TextField("Name Filter", NameFilter));
                    SetExportFilter(EditorGUILayout.Toggle("Export Filter", ExportFilter));
                    SetExcludeFilter(EditorGUILayout.Toggle("Exclude Filter", ExcludeFilter));

                    if (Instances.Length == 0)
                    {
                        LoadFile(-1);
                        EditorGUILayout.LabelField("No data available.");
                    }
                    else
                    {
                        LoadFile(EditorGUILayout.Popup("Data " + "(" + Instances.Length + ")", Index, Names));
                        EditorGUILayout.BeginHorizontal();
                        LoadFile(EditorGUILayout.IntSlider(Index + 1, 1, Instances.Length) - 1);
                        if (Utility.GUIButton("<", UltiDraw.DarkGrey, UltiDraw.White))
                        {
                            LoadFile(Mathf.Max(Index - 1, 0));
                        }
                        if (Utility.GUIButton(">", UltiDraw.DarkGrey, UltiDraw.White))
                        {
                            LoadFile(Mathf.Min(Index + 1, Instances.Length - 1));
                        }
                        EditorGUILayout.EndHorizontal();
                    }
                }

                if (Target.GetCurrentFile() != null)
                {
                    Target.GetCurrentFile().Data.Repair(Target);
                    Utility.SetGUIColor(UltiDraw.Grey);
                    using (new EditorGUILayout.VerticalScope("Box")) {
                        Utility.ResetGUIColor();
                        Frame frame = Target.GetCurrentFrame();

                        Utility.SetGUIColor(UltiDraw.Mustard);
                        using (new EditorGUILayout.VerticalScope("Box")) {
                            Utility.ResetGUIColor();
                            EditorGUILayout.BeginHorizontal();
                            GUILayout.FlexibleSpace();
                            EditorGUILayout.LabelField(Target.GetCurrentFile().Data.name, GUILayout.Width(100f));
                            EditorGUILayout.LabelField("Frames: " + Target.GetCurrentFile().Data.GetTotalFrames(), GUILayout.Width(100f));
                            EditorGUILayout.LabelField("Time: " + Target.GetCurrentFile().Data.GetTotalTime().ToString("F3") + "s", GUILayout.Width(100f));
                            EditorGUILayout.LabelField("Framerate: " + Target.GetCurrentFile().Data.Framerate.ToString("F1") + "Hz", GUILayout.Width(130f));
                            EditorGUILayout.LabelField("Timescale:", GUILayout.Width(65f), GUILayout.Height(20f));
                            Target.Timescale = EditorGUILayout.FloatField(Target.Timescale, GUILayout.Width(30f), GUILayout.Height(20f));
                            if (Utility.GUIButton("Mirror", Target.Mirror ? UltiDraw.Cyan : UltiDraw.LightGrey, UltiDraw.Black))
                            {
                                Target.SetMirror(!Target.Mirror);
                            }
                            GUILayout.FlexibleSpace();
                            EditorGUILayout.EndHorizontal();
                        }

                        Utility.SetGUIColor(UltiDraw.DarkGrey);
                        using (new EditorGUILayout.VerticalScope("Box")) {
                            Utility.ResetGUIColor();
                            EditorGUILayout.BeginHorizontal();
                            GUILayout.FlexibleSpace();
                            if (Target.Playing)
                            {
                                if (Utility.GUIButton("||", Color.red, Color.black, 20f, 20f))
                                {
                                    Target.StopAnimation();
                                }
                            }
                            else
                            {
                                if (Utility.GUIButton("|>", Color.green, Color.black, 20f, 20f))
                                {
                                    Target.PlayAnimation();
                                }
                            }
                            if (Utility.GUIButton("<<", UltiDraw.Grey, UltiDraw.White, 30f, 20f))
                            {
                                Target.LoadFrame(Mathf.Max(Target.GetCurrentFrame().Index - Mathf.RoundToInt(Target.GetCurrentFile().Data.Framerate), 1));
                            }
                            if (Utility.GUIButton("<", UltiDraw.Grey, UltiDraw.White, 20f, 20f))
                            {
                                Target.LoadPreviousFrame();
                            }
                            if (Utility.GUIButton(">", UltiDraw.Grey, UltiDraw.White, 20f, 20f))
                            {
                                Target.LoadNextFrame();
                            }
                            if (Utility.GUIButton(">>", UltiDraw.Grey, UltiDraw.White, 30f, 20f))
                            {
                                Target.LoadFrame(Mathf.Min(Target.GetCurrentFrame().Index + Mathf.RoundToInt(Target.GetCurrentFile().Data.Framerate), Target.GetCurrentFile().Data.GetTotalFrames()));
                            }
                            int index = EditorGUILayout.IntSlider(frame.Index, 1, Target.GetCurrentFile().Data.GetTotalFrames(), GUILayout.Width(440f));
                            if (index != frame.Index)
                            {
                                Target.LoadFrame(index);
                            }
                            EditorGUILayout.LabelField(frame.Timestamp.ToString("F3") + "s", Utility.GetFontColor(Color.white), GUILayout.Width(50f));
                            GUILayout.FlexibleSpace();
                            EditorGUILayout.EndHorizontal();
                            EditorGUILayout.BeginHorizontal();
                            GUILayout.FlexibleSpace();
                            Target.Window = EditorGUILayout.Slider(Target.Window, 0f, 1f);
                            GUILayout.FlexibleSpace();
                            EditorGUILayout.EndHorizontal();
                        }
                    }
                    for (int i = 0; i < Target.GetCurrentFile().Data.Modules.Length; i++)
                    {
                        Target.GetCurrentFile().Data.Modules[i].Inspector(Target);
                    }
                    string[] modules = new string[(int)Module.TYPE.Length + 1];
                    modules[0] = "Add Module...";
                    for (int i = 1; i < modules.Length; i++)
                    {
                        modules[i] = ((Module.TYPE)(i - 1)).ToString();
                    }
                    int module = EditorGUILayout.Popup(0, modules);
                    if (module > 0)
                    {
                        Target.GetCurrentFile().Data.AddModule((Module.TYPE)(module - 1));
                    }
                    if (Utility.GUIButton("Settings", Target.InspectSettings ? UltiDraw.Cyan : UltiDraw.LightGrey, UltiDraw.Black))
                    {
                        Target.InspectSettings = !Target.InspectSettings;
                    }
                    if (Target.InspectSettings)
                    {
                        StyleModule styleModule = (StyleModule)Target.GetCurrentFile().Data.GetModule(Module.TYPE.Style);

                        Utility.SetGUIColor(UltiDraw.LightGrey);
                        using (new EditorGUILayout.VerticalScope("Box")) {
                            Utility.ResetGUIColor();
                            Target.GetCurrentFile().Data.Export = EditorGUILayout.Toggle("Export", Target.GetCurrentFile().Data.Export);
                            Target.SetScaling(EditorGUILayout.FloatField("Scaling", Target.GetCurrentFile().Data.Scaling));
                            Target.GetCurrentFile().Data.RootSmoothing = EditorGUILayout.IntField("Root Smoothing", Target.GetCurrentFile().Data.RootSmoothing);
                            Target.GetCurrentFile().Data.Ground = InternalEditorUtility.ConcatenatedLayersMaskToLayerMask(EditorGUILayout.MaskField("Ground Mask", InternalEditorUtility.LayerMaskToConcatenatedLayersMask(Target.GetCurrentFile().Data.Ground), InternalEditorUtility.layers));
                            Target.GetCurrentFile().Data.ForwardAxis = (MotionData.AXIS)EditorGUILayout.EnumPopup("Forward Axis", Target.GetCurrentFile().Data.ForwardAxis);

                            Target.GetCurrentFile().Data.MirrorAxis = (MotionData.AXIS)EditorGUILayout.EnumPopup("Mirror Axis", Target.GetCurrentFile().Data.MirrorAxis);
                            string[] names = new string[Target.GetCurrentFile().Data.Source.Bones.Length];
                            for (int i = 0; i < Target.GetCurrentFile().Data.Source.Bones.Length; i++)
                            {
                                names[i] = Target.GetCurrentFile().Data.Source.Bones[i].Name;
                            }
                            for (int i = 0; i < Target.GetCurrentFile().Data.Source.Bones.Length; i++)
                            {
                                EditorGUILayout.BeginHorizontal();
                                Target.GetCurrentFile().Data.Source.Bones[i].Active = EditorGUILayout.Toggle(Target.GetCurrentFile().Data.Source.Bones[i].Active);
                                EditorGUI.BeginDisabledGroup(true);
                                EditorGUILayout.TextField(names[i]);
                                EditorGUI.EndDisabledGroup();
                                Target.GetCurrentFile().Data.SetSymmetry(i, EditorGUILayout.Popup(Target.GetCurrentFile().Data.Symmetry[i], names));

                                if (names[i] == "Head")
                                {
                                    float x = 90f;
                                    if (Target.Mirror)
                                    {
                                        x = -90f;
                                    }
                                    Target.GetCurrentFile().Data.Source.Bones[i].Alignment = EditorGUILayout.Vector3Field("", new Vector3(x, 0f, 0f));
                                }
                                else
                                {
                                    Target.GetCurrentFile().Data.Source.Bones[i].Alignment = EditorGUILayout.Vector3Field("", Target.GetCurrentFile().Data.Source.Bones[i].Alignment);
                                }
                                EditorGUILayout.EndHorizontal();
                            }

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

                                Utility.SetGUIColor(UltiDraw.Cyan);
                                using (new EditorGUILayout.VerticalScope("Box")) {
                                    Utility.ResetGUIColor();
                                    EditorGUILayout.LabelField("Camera");
                                }

                                if (Utility.GUIButton("Auto Focus", Target.AutoFocus ? UltiDraw.Cyan : UltiDraw.LightGrey, UltiDraw.Black))
                                {
                                    Target.SetAutoFocus(!Target.AutoFocus);
                                }
                                Target.FocusHeight    = EditorGUILayout.FloatField("Focus Height", Target.FocusHeight);
                                Target.FocusOffset    = EditorGUILayout.FloatField("Focus Offset", Target.FocusOffset);
                                Target.FocusDistance  = EditorGUILayout.FloatField("Focus Distance", Target.FocusDistance);
                                Target.FocusAngle     = EditorGUILayout.Slider("Focus Angle", Target.FocusAngle, 0f, 360f);
                                Target.FocusSmoothing = EditorGUILayout.Slider("Focus Smoothing", Target.FocusSmoothing, 0f, 1f);
                            }

                            if (Utility.GUIButton("Copy Hierarchy", UltiDraw.DarkGrey, UltiDraw.White))
                            {
                                Target.CopyHierarchy();
                            }
                            if (Utility.GUIButton("Detect Symmetry", UltiDraw.DarkGrey, UltiDraw.White))
                            {
                                Target.GetCurrentFile().Data.DetectSymmetry();
                            }
                            if (Utility.GUIButton("Create Skeleton", UltiDraw.DarkGrey, UltiDraw.White))
                            {
                                Target.CreateSkeleton();
                            }

                            EditorGUILayout.BeginHorizontal();
                            if (Utility.GUIButton("Add Export Sequence", UltiDraw.DarkGrey, UltiDraw.White))
                            {
                                Target.GetCurrentFile().Data.AddSequence(1, Target.GetCurrentFile().Data.GetTotalFrames());
                            }
                            if (Utility.GUIButton("Remove Export Sequence", UltiDraw.DarkGrey, UltiDraw.White))
                            {
                                Target.GetCurrentFile().Data.RemoveSequence();
                            }
                            EditorGUILayout.EndHorizontal();
                            for (int i = 0; i < Target.GetCurrentFile().Data.Sequences.Length; i++)
                            {
                                Utility.SetGUIColor(UltiDraw.Grey);
                                using (new EditorGUILayout.VerticalScope("Box")) {
                                    Utility.ResetGUIColor();

                                    EditorGUILayout.BeginHorizontal();
                                    GUILayout.FlexibleSpace();
                                    if (Utility.GUIButton("X", Color.cyan, Color.black, 15f, 15f))
                                    {
                                        Target.GetCurrentFile().Data.Sequences[i].SetStart(Target.GetCurrentFrame().Index);
                                    }
                                    EditorGUILayout.LabelField("Start", GUILayout.Width(50f));
                                    Target.GetCurrentFile().Data.Sequences[i].SetStart(EditorGUILayout.IntField(Target.GetCurrentFile().Data.Sequences[i].Start, GUILayout.Width(100f)));
                                    EditorGUILayout.LabelField("End", GUILayout.Width(50f));
                                    Target.GetCurrentFile().Data.Sequences[i].SetEnd(EditorGUILayout.IntField(Target.GetCurrentFile().Data.Sequences[i].End, GUILayout.Width(100f)));
                                    if (Utility.GUIButton("X", Color.cyan, Color.black, 15f, 15f))
                                    {
                                        Target.GetCurrentFile().Data.Sequences[i].SetEnd(Target.GetCurrentFrame().Index);
                                    }
                                    GUILayout.FlexibleSpace();
                                    EditorGUILayout.EndHorizontal();
                                }
                            }
                        }
                    }
                }
            }
        }
Example #12
0
    public void LoadFrame(float timestamp)
    {
        Timestamp = timestamp;

        if (Mirror)
        {
            GetEnvironment().localScale = Vector3.one.GetMirror(GetCurrentFile().Data.GetAxis(GetCurrentFile().Data.MirrorAxis));
        }
        else
        {
            GetEnvironment().localScale = Vector3.one;
        }

        Frame     frame = GetCurrentFrame();
        Matrix4x4 root  = frame.GetRootTransformation(Mirror);

        GetActor().GetRoot().position = root.GetPosition();
        GetActor().GetRoot().rotation = root.GetRotation();
        Matrix4x4[] posture    = frame.GetBoneTransformations(Mirror);
        Vector3[]   velocities = frame.GetBoneVelocities(Mirror);
        for (int i = 0; i < Mathf.Min(GetActor().Bones.Length, posture.Length); i++)
        {
            GetActor().Bones[i].Transform.position = posture[i].GetPosition();
            GetActor().Bones[i].Transform.rotation = posture[i].GetRotation();
            GetActor().Bones[i].Velocity           = velocities[i];
        }
        StyleModule styleModule = (StyleModule)GetCurrentFile().Data.GetModule(Module.TYPE.Style);

        if (styleModule != null)
        {
            if (styleModule.GetSneakValue(frame) == 1)
            {
                IKStyle.Sneak(1);
            }

            if (styleModule.GetEatValue(frame) == 1)
            {
                IKStyle.Eat();
            }

            if (styleModule.GetHydrateValue(frame) == 1)
            {
                IKStyle.Hydrate();
            }
        }



        if (AutoFocus)
        {
            if (SceneView.lastActiveSceneView != null)
            {
                Vector3    lastPosition = SceneView.lastActiveSceneView.camera.transform.position;
                Quaternion lastRotation = SceneView.lastActiveSceneView.camera.transform.rotation;
                Vector3    position     = root.GetPosition();
                position.y += FocusHeight;
                Quaternion rotation = root.GetRotation();
                rotation.x = 0f;
                rotation.z = 0f;
                rotation   = Quaternion.Euler(0f, Mirror ? Mathf.Repeat(FocusAngle + 0f, 360f) : FocusAngle, 0f) * rotation;
                position  += FocusOffset * (rotation * Vector3.right);
                SceneView.lastActiveSceneView.LookAtDirect(Vector3.Lerp(lastPosition, position, 1f - FocusSmoothing), Quaternion.Slerp(lastRotation, rotation, (1f - FocusSmoothing)), FocusDistance * (1f - FocusSmoothing));
            }
        }
    }
Example #13
0
    public TimeSeries GetTimeSeries(Frame frame, bool mirrored, int pastKeys, int futureKeys, float pastWindow, float futureWindow, int resolution, float delta)
    {
        TimeSeries timeSeries = new TimeSeries(pastKeys, futureKeys, pastWindow, futureWindow, resolution);

        foreach (Module module in Data.Modules)
        {
            if (module is RootModule)
            {
                RootModule      m      = (RootModule)module;
                TimeSeries.Root series = new TimeSeries.Root(timeSeries);
                for (int i = 0; i < timeSeries.Samples.Length; i++)
                {
                    float t = frame.Timestamp + timeSeries.Samples[i].Timestamp;
                    if (t < 0f || t > Data.GetTotalTime())
                    {
                        series.Transformations[i] = m.GetEstimatedRootTransformation(frame, timeSeries.Samples[i].Timestamp, mirrored);
                        series.Velocities[i]      = m.GetEstimatedRootVelocity(frame, timeSeries.Samples[i].Timestamp, mirrored, delta);
                    }
                    else
                    {
                        series.Transformations[i] = m.GetRootTransformation(Data.GetFrame(t), mirrored);
                        series.Velocities[i]      = m.GetRootVelocity(Data.GetFrame(t), mirrored, delta);
                    }
                }
            }
            if (module is StyleModule)
            {
                StyleModule      m      = (StyleModule)module;
                TimeSeries.Style series = new TimeSeries.Style(timeSeries, m.GetNames());
                for (int i = 0; i < timeSeries.Samples.Length; i++)
                {
                    float t = frame.Timestamp + timeSeries.Samples[i].Timestamp;
                    series.Values[i] = m.GetStyles(Data.GetFrame(t));
                }
            }
            if (module is GoalModule)
            {
                GoalModule      m      = (GoalModule)module;
                TimeSeries.Goal series = new TimeSeries.Goal(timeSeries, m.GetNames());
                for (int i = 0; i < timeSeries.Samples.Length; i++)
                {
                    float t = frame.Timestamp + timeSeries.Samples[i].Timestamp;
                    series.Transformations[i] = m.Target.GetGoalTransformation(frame, timeSeries.Samples[i].Timestamp, mirrored, delta);
                    series.Values[i]          = m.GetActions(Data.GetFrame(t), delta);
                }
            }
            if (module is ContactModule)
            {
                ContactModule      m      = (ContactModule)module;
                TimeSeries.Contact series = new TimeSeries.Contact(timeSeries, m.GetNames());
                for (int i = 0; i < timeSeries.Samples.Length; i++)
                {
                    float t = frame.Timestamp + timeSeries.Samples[i].Timestamp;
                    series.Values[i] = m.GetContacts(Data.GetFrame(t), mirrored);
                }
            }
            if (module is PhaseModule)
            {
                PhaseModule      m      = (PhaseModule)module;
                TimeSeries.Phase series = new TimeSeries.Phase(timeSeries);
                for (int i = 0; i < timeSeries.Samples.Length; i++)
                {
                    float t = frame.Timestamp + timeSeries.Samples[i].Timestamp;
                    series.Values[i] = m.GetPhase(Data.GetFrame(t), mirrored);
                }
            }
        }
        return(timeSeries);
    }
Example #14
0
    private void ProcessData()
    {
        for (int i = 0; i < Data.Length; i++)
        {
            if (Active[i])
            {
                /*
                 * for(int s=0; s<Data[i].Sequences.Length; s++) {
                 *      //Idle
                 *      Data[i].Sequences[s].SetStyleCopies("Idle", 0);
                 *      Data[i].Sequences[s].SetTransitionCopies("Idle", 0);
                 *
                 *      //Walk
                 *      Data[i].Sequences[s].SetStyleCopies("Walk", 0);
                 *      Data[i].Sequences[s].SetTransitionCopies("Walk", 0);
                 *
                 *      //Pace
                 *      Data[i].Sequences[s].SetStyleCopies("Pace", 0);
                 *      Data[i].Sequences[s].SetTransitionCopies("Pace", 0);
                 *
                 *      //Trot
                 *      Data[i].Sequences[s].SetStyleCopies("Trot", 6);
                 *      Data[i].Sequences[s].SetTransitionCopies("Trot", 6);
                 *
                 *      //Canter
                 *      Data[i].Sequences[s].SetStyleCopies("Canter", 1);
                 *      Data[i].Sequences[s].SetTransitionCopies("Canter", 1);
                 *
                 *      //Jump
                 *      Data[i].Sequences[s].SetStyleCopies("Jump", 9);
                 *      Data[i].Sequences[s].SetTransitionCopies("Jump", 9);
                 *
                 *      //Sit
                 *      Data[i].Sequences[s].SetStyleCopies("Sit", 0);
                 *      Data[i].Sequences[s].SetTransitionCopies("Sit", 0);
                 *
                 *      //Stand
                 *      Data[i].Sequences[s].SetStyleCopies("Stand", 0);
                 *      Data[i].Sequences[s].SetTransitionCopies("Stand", 5);
                 *
                 *      //Lie
                 *      Data[i].Sequences[s].SetStyleCopies("Lie", 0);
                 *      Data[i].Sequences[s].SetTransitionCopies("Lie", 5);
                 * }
                 */
                //string path = AssetDatabase.GetAssetPath(Data[i]);
                //path = path.Substring(0, path.LastIndexOf(".")) + ".unity";
                //SceneAsset scene = AssetDatabase.LoadAssetAtPath<SceneAsset>(path);
                //Data[i].Scene = scene;
                //Data[i].Sequences[0].SetStart(1);
                //Data[i].Sequences[0].SetEnd(Data[i].GetTotalFrames());
                //Data[i].RootSmoothing = 10;

                //Data[i].AddModule(Module.TYPE.Style);
                //Data[i].AddModule(Module.TYPE.Phase);
                //StyleModule style = (StyleModule)Data[i].GetModule(Module.TYPE.Style);
                //style.Inspect = false;
                //style.AddStyle("Idle");
                //style.AddStyle("Walk");
                //style.AddStyle("Run");
                //style.AddStyle("Crouch");
                //PhaseModule phase = (PhaseModule)Data[i].GetModule(Module.TYPE.Phase);
                //phase.Inspect = false;
                //phase.ToggleVariable(Data[i].Source.FindBone("RightToeSite").Index);
                //Data[i].Sequences[0].Start = 62;
                //Data[i].Sequences[0].End = Data[i].GetTotalFrames();

                StyleModule style = (StyleModule)Data[i].GetModule(Module.TYPE.Style);
                //style.AddStyle("Jump");
                //style.Inspect = true;
                for (int j = 0; j < style.Functions.Length; j++)
                {
                    style.Functions[j].Module = style;
                }

                ContactModule contact = (ContactModule)Data[i].GetModule(ContactModule.TYPE.Contact);
                //contact.Inspect = false;

                //Data[i].AddModule(Module.TYPE.Contact);

                /*
                 * ContactModule contact = (ContactModule)Data[i].GetModule(ContactModule.TYPE.Contact);
                 * contact.Inspect = true;
                 * for(int j=0; j<contact.Functions.Length; j++) {
                 *      contact.Functions[j].SetDistanceThreshold(0.025f);
                 *      contact.Functions[j].SetVelocityThreshold(1f);
                 *      contact.Functions[j].SetFilterWidth(10);
                 * }
                 */

                //for(int b=0; b<Data[i].Source.Bones.Length; b++) {
                //	Data[i].Source.Bones[b].Active = true;
                //}

                EditorUtility.SetDirty(Data[i]);
            }
        }
        AssetDatabase.SaveAssets();
        AssetDatabase.Refresh();
    }
Example #15
0
    /*
     * private void ExamineData() {
     *      int sequences = 0;
     *      int frames = 0;
     *      int[] styles = new int[Data[0].Styles.Length];
     *      for(int i=0; i<Data.Length; i++) {
     *              if(Active[i]) {
     *                      for(int m=1; m<=2; m++) {
     *                              for(int s=0; s<Data[i].Sequences.Length; s++) {
     *
     *                                      MotionData.Sequence.Interval[] intervals = Data[i].Sequences[s].GetIntervals();
     *                                      for(int interval=0; interval<intervals.Length; interval++) {
     *                                              sequences += 1;
     *                                              for(int f=intervals[interval].Start; f<=intervals[interval].End; f++) {
     *                                                      frames += 1;
     *                                                      for(int index=0; index<Data[i].GetFrame(f).StyleValues.Length; index++) {
     *                                                              if(Data[i].GetFrame(f).StyleFlags[index]) {
     *                                                                      styles[index] += 1;
     *                                                              }
     *                                                              //if(Data[i].Frames[f].StyleValues[index] > 0f) {
     *                                                              //	styles[index] += 1;
     *                                                              //}
     *                                                      }
     *                                              }
     *                                      }
     *
     *                              }
     *                      }
     *              }
     *      }
     *
     *      Debug.Log("Sequences: " + sequences);
     *      Debug.Log("Frames: " + frames);
     *      Debug.Log("Time: " + (float)frames/(float)Data[0].Framerate+"s");
     *      for(int i=0; i<styles.Length; i++) {
     *              Debug.Log(Data[0].Styles[i] + " -> " + (float)styles[i] / (float)frames + "%" + " (" + styles[i] + " frames; " + (float)styles[i]/(float)Data[0].Framerate + "s)");
     *      }
     * }
     */

    /*
     * private void SearchStyle() {
     *      /*
     *      int style = System.Array.FindIndex(Data[0].Styles, x => x == "Sit");
     *      for(int i=0; i<Data.Length; i++) {
     *              for(int s=0; s<Data[i].Sequences.Length; s++) {
     *                      for(int f=Data[i].Sequences[s].Start; f<=Data[i].Sequences[s].End; f++) {
     *                              if((Data[i].GetFrame(f).IsStyleKey(style) || f==Data[i].Sequences[s].Start) && Data[i].GetFrame(f).StyleFlags[style]) {
     *                                      Debug.Log("Style at frame " + f + " in file " + Data[i]);
     *                              }
     *                      }
     *              }
     *      }
     * }
     */

    private void BatchProcess()
    {
        for (int i = 0; i < Editors.Length; i++)
        {
            if (Active[i])
            {
                for (int j = 0; j < Editors[i].Files.Length; j++)
                {
                    MotionData data = Editors[i].Files[j].Data;

                    /*
                     * for(int s=0; s<Data[i].Sequences.Length; s++) {
                     *      //Idle
                     *      Data[i].Sequences[s].SetStyleCopies("Idle", 0);
                     *      Data[i].Sequences[s].SetTransitionCopies("Idle", 0);
                     *
                     *      //Walk
                     *      Data[i].Sequences[s].SetStyleCopies("Walk", 0);
                     *      Data[i].Sequences[s].SetTransitionCopies("Walk", 0);
                     *
                     *      //Pace
                     *      Data[i].Sequences[s].SetStyleCopies("Pace", 0);
                     *      Data[i].Sequences[s].SetTransitionCopies("Pace", 0);
                     *
                     *      //Trot
                     *      Data[i].Sequences[s].SetStyleCopies("Trot", 6);
                     *      Data[i].Sequences[s].SetTransitionCopies("Trot", 6);
                     *
                     *      //Canter
                     *      Data[i].Sequences[s].SetStyleCopies("Canter", 1);
                     *      Data[i].Sequences[s].SetTransitionCopies("Canter", 1);
                     *
                     *      //Jump
                     *      Data[i].Sequences[s].SetStyleCopies("Jump", 9);
                     *      Data[i].Sequences[s].SetTransitionCopies("Jump", 9);
                     *
                     *      //Sit
                     *      Data[i].Sequences[s].SetStyleCopies("Sit", 0);
                     *      Data[i].Sequences[s].SetTransitionCopies("Sit", 0);
                     *
                     *      //Stand
                     *      Data[i].Sequences[s].SetStyleCopies("Stand", 0);
                     *      Data[i].Sequences[s].SetTransitionCopies("Stand", 5);
                     *
                     *      //Lie
                     *      Data[i].Sequences[s].SetStyleCopies("Lie", 0);
                     *      Data[i].Sequences[s].SetTransitionCopies("Lie", 5);
                     * }
                     */
                    //string path = AssetDatabase.GetAssetPath(Data[i]);
                    //path = path.Substring(0, path.LastIndexOf(".")) + ".unity";
                    //SceneAsset scene = AssetDatabase.LoadAssetAtPath<SceneAsset>(path);
                    //Data[i].Scene = scene;
                    //Data[i].Sequences[0].SetStart(1);
                    //Data[i].Sequences[0].SetEnd(Data[i].GetTotalFrames());
                    //Data[i].RootSmoothing = 10;

                    //PhaseModule phaseModule = (PhaseModule)data.GetModule(Module.TYPE.Phase);
                    //phaseModule.ToggleVariable(5);
                    StyleModule styleModule = (StyleModule)data.GetModule(Module.TYPE.Style);
                    styleModule.RemoveStyle("ArmedPassive");
                    styleModule.RemoveStyle("ArmedActive");
                    EditorUtility.SetDirty(data);
                }
            }
        }
        AssetDatabase.SaveAssets();
        AssetDatabase.Refresh();
    }