Example #1
0
    public static bool GetNodePosition(SampleNode node, string clip, int frame, out IM.Vector3 position)
    {
        AnimData animData = AnimationSampleManager.Instance.GetAnimData(clip);

        IM.Number time = frame / animData.frameRate;
        return(GetNodePosition(node, animData, time, out position));
    }
        public void ShouldReplaceLinkInAll()
        {
            // arrange
            var source = new SampleNode("source");
            var target = new SampleNode("target");

            var graph = new Graph();
            graph.AddNode(source);
            graph.AddNode(target);

            var firstLink = new SampleLink();

            graph.AddLink(source, target, firstLink);

            var secondLink = new SecondLink();

            // act
            graph.ReplaceLink(firstLink, secondLink);

            // Assert
            Assert.That(graph.Links, Has.Count.EqualTo(1));
            Assert.That(graph.Links, Has.No.Member(firstLink));
            Assert.That(graph.Links, Has.Member(secondLink));

            Assert.That(secondLink.Source, Is.SameAs(source));
            Assert.That(secondLink.Target, Is.SameAs(target));

            Assert.That(source.OutboundLinks, Has.No.Member(firstLink));
            Assert.That(target.InboundLinks, Has.No.Member(firstLink));

            Assert.That(source.OutboundLinks, Has.Member(secondLink));
            Assert.That(target.InboundLinks, Has.Member(secondLink));
        }
        public void SimpleTreeCreation()
        {
            SampleNode N = new SampleNode(0);

            N.Condition = (x) => { return(true); };
            Assert.IsTrue(ExecutePredicate <int> .Exec(N.Condition, 0));
        }
Example #4
0
    public static bool GetNodePosition(SampleNode node, AnimData animData, IM.Number time, out IM.Vector3 position)
    {
        int count = animData.sampleDatas.Count;

        for (int i = 0; i < count; ++i)
        {
            SampleData sample1 = animData.sampleDatas[i];
            if (time == sample1.time)
            {
                position = sample1.nodes[node].position;
                return(true);
            }
            else if (time > sample1.time && i < count - 1)
            {
                SampleData sample2 = animData.sampleDatas[i + 1];
                if (time < sample2.time)
                {
                    IM.Vector3 pos1 = sample1.nodes[node].position;
                    IM.Vector3 pos2 = sample2.nodes[node].position;
                    IM.Number  t    = (time - sample1.time) / (sample2.time - sample1.time);
                    position = IM.Vector3.Lerp(pos1, pos2, t);
                    return(true);
                }
            }
        }
        position = IM.Vector3.zero;
        return(false);
    }
Example #5
0
 private IM.Vector3 GetNodePosition(SampleNode node, bool calcRootMotion)
 {
     IM.Vector3 pos;
     IM.Number  horiAngle;
     GetNodePosAndRot(node, out pos, out horiAngle, calcRootMotion);
     return(pos);
 }
Example #6
0
    static void GetNodePosAndRot(PlayInfo info, SampleNode node, out IM.Vector3 pos, out IM.Number horiAngle)
    {
        SampleData sample1 = info.animData.sampleDatas[info.keyFrameIndex1];

        IM.Vector3 pos1   = sample1.nodes[node].position;
        IM.Number  angle1 = sample1.nodes[node].horiAngle;
        if (info.keyFrameIndex1 == info.keyFrameIndex2)
        {
            pos       = pos1;
            horiAngle = angle1;
        }
        else
        {
            SampleData sample2 = info.animData.sampleDatas[info.keyFrameIndex2];
            IM.Vector3 pos2    = sample2.nodes[node].position;
            IM.Number  angle2  = sample2.nodes[node].horiAngle;
            IM.Number  t       = (info.realTime - sample1.time) / (sample2.time - sample1.time);
            pos       = IM.Vector3.Lerp(pos1, pos2, t);
            horiAngle = IM.Math.LerpAngle(angle1, angle2, t);
        }
    }
        public void ShouldRemoveLinkFromAll()
        {
            // arrange
            var source = new SampleNode("source");
            var target = new SampleNode("target");

            var graph = new Graph();
            graph.AddNode(source);
            graph.AddNode(target);

            var link = new SampleLink();
            graph.AddLink(source, target, link);

            // act
            graph.RemoveLink(link);

            // Assert
            Assert.That(graph.Links, Has.Count.EqualTo(0));

            Assert.That(source.OutboundLinks, Has.No.Member(link));
            Assert.That(target.InboundLinks, Has.No.Member(link));
        }
        public void ShouldRemoveNodeInAll()
        {
            // arrange
            var graph = new Graph();
            var node1 = new SampleNode("node1");
            var node2 = new SampleNode("node2");

            graph.AddNode(node1);
            graph.AddNode(node2);

            var inboundLink = new SampleLink();
            graph.AddLink(node2, node1, inboundLink);

            var outboundLink = new SampleLink();
            graph.AddLink(node1, node2, outboundLink);

            // act
            graph.RemoveNode(node1);

            // assert
            Assert.That(graph.Nodes, Has.No.Member(node1));
            Assert.That(node2.InboundLinks, Has.No.Member(outboundLink));
            Assert.That(node2.OutboundLinks, Has.No.Member(inboundLink));
        }
        public void ShouldReplaceNodeInAll()
        {
            // arrange
            var graph = new Graph();
            var firstNode = new SampleNode("firstNode");
            var secondNode = new SampleNode("secondNode");

            graph.AddNode(firstNode);
            graph.AddNode(secondNode);

            var inboundLink = new SampleLink();
            graph.AddLink(secondNode, firstNode, inboundLink);

            var outboundLink = new SampleLink();
            graph.AddLink(firstNode, secondNode, outboundLink);

            var newNode = new SampleNode("replacedFirstNode");

            // act
            graph.ReplaceNode(firstNode, newNode);

            // Assert
            Assert.That(graph.Nodes, Has.No.Member(firstNode));
            Assert.That(graph.Nodes, Has.Member(newNode));

            Assert.That(inboundLink.Target, Is.SameAs(newNode));
            Assert.That(newNode.InboundLinks, Has.Member(inboundLink));

            Assert.That(outboundLink.Source, Is.SameAs(newNode));
            Assert.That(newNode.OutboundLinks, Has.Member(outboundLink));
        }
        public void ShouldTrackAddedLinks()
        {
            // arrange
            var source = new SampleNode("source");
            var target = new SampleNode("target");

            var graph = new Graph();
            graph.AddNode(source);
            graph.AddNode(target);

            var link = new SampleLink();

            // act
            graph.AddLink(source, target, link);

            // Assert
            Assert.That(graph.Links, Has.Count.EqualTo(1));
            Assert.That(link.Source, Is.SameAs(source));
            Assert.That(link.Target, Is.SameAs(target));

            Assert.That(source.OutboundLinks, Has.Member(link));
            Assert.That(target.InboundLinks, Has.Member(link));
        }
    static AnimData SampleClip(GameObject go, AnimationClip clip)
    {
        //Debug.Log("Sample motion, Clip:" + clip.name + " GameObject:" + go.name);

        AnimData animData = new AnimData();

        animData.sampleDatas = new List <SampleData>();

        animData.frameRate = IM.Editor.Tools.Convert(clip.frameRate);
        animData.wrapMode  = clip.wrapMode;

        Dictionary <SampleNode, Transform> transforms = new Dictionary <SampleNode, Transform>();

        for (int i = 0; i < (int)SampleNode.Count; ++i)
        {
            string    nodeName  = NODE_NAMES[i];
            Transform transform = GameUtils.FindChildRecursive(go.transform, nodeName);
            transforms.Add((SampleNode)i, transform);
        }

        Transform root = transforms[SampleNode.Root];

        //Debug.Log(clip.averageDuration);
        for (IM.Number t = IM.Number.zero; ; t += SAMPLE_INTERVAL)
        {
            SampleData data = new SampleData();

            float time = Mathf.Min((float)t, clip.averageDuration);
            clip.SampleAnimation(go, time);
            data.time = IM.Editor.Tools.Convert(time);

            data.nodes = new Dictionary <SampleNode, SampleNodeData>();
            for (int i = 0; i < (int)SampleNode.Count; ++i)
            {
                SampleNode node      = (SampleNode)i;
                Transform  transform = transforms[node];
                Vector3    curPos    = transform.position;
                Quaternion curRot    = transform.rotation;

                SampleNodeData nodeData = new SampleNodeData();
                if (node == SampleNode.Root)    //Root节点采样相对于Player的位置
                {
                    nodeData.position  = IM.Editor.Tools.Convert(curPos);
                    nodeData.horiAngle = IM.Editor.Tools.Convert(curRot.eulerAngles.y);
                }
                else    //其他节点采样相对于Root的位置
                {
                    nodeData.position = IM.Editor.Tools.Convert(root.transform.InverseTransformPoint(transform.position));
                }
                //Debug.Log(string.Format("Sample, clip:{0} node:{1} time:{2} pos:{3} angle:{4}",
                //    clip.name, node, time, nodeData.position, nodeData.horiAngle));

                data.nodes.Add(node, nodeData);
            }

            animData.sampleDatas.Add(data);

            if ((float)t >= clip.averageDuration)
            {
                break;
            }
        }


        //Animation event
        animData.eventDatas = new List <AnimEventData>();
        AnimationEvent[] events = AnimationUtility.GetAnimationEvents(clip);
        for (int i = 0; i < events.Length; ++i)
        {
            AnimationEvent evt       = events[i];
            AnimEventData  eventData = new AnimEventData();
            eventData.funcName        = evt.functionName;
            eventData.time            = IM.Editor.Tools.Convert(evt.time);
            eventData.intParameter    = evt.intParameter;
            eventData.floatParameter  = IM.Editor.Tools.Convert(evt.floatParameter);
            eventData.stringParameter = evt.stringParameter;
            animData.eventDatas.Add(eventData);
            evt.messageOptions = SendMessageOptions.DontRequireReceiver;
        }
        AnimationUtility.SetAnimationEvents(clip, events);

        return(animData);
    }
Example #12
0
 public IM.Vector3 GetNodePosition(SampleNode node)
 {
     return(GetNodePosition(node, false));
 }
Example #13
0
    void GetNodePosAndRot(SampleNode node, out IM.Vector3 pos, out IM.Number horiAngle, bool calcRootMotion)
    {
        pos       = IM.Vector3.zero;
        horiAngle = IM.Number.zero;
        if (node != SampleNode.Root && calcRootMotion)
        {
            Debug.LogError("RootMotion must calc on Root node.");
        }
        if (_curInfo == null)
        {
            return;
        }

        IM.Vector3 deltaMove  = IM.Vector3.zero;
        IM.Number  deltaAngle = IM.Number.zero;
        if (_curInfo.time < CROSS_FADE_LENGTH && _prevInfos.Count > 0)   // in cross fading
        {
            //Total weight
            IM.Number totalWeight = IM.Number.zero;
            foreach (PlayInfo prevInfo in _prevInfos)
            {
                totalWeight += prevInfo.blendWeight;
            }
            totalWeight += _curInfo.blendWeight;
            //RootMotion total weight
            IM.Number rmTotalWeight = IM.Number.zero;
            if (calcRootMotion)
            {
                foreach (PlayInfo prevInfo in _prevInfos)
                {
                    if (prevInfo.enableRootMotion)
                    {
                        rmTotalWeight += prevInfo.blendWeight;
                    }
                }
                if (_curInfo.enableRootMotion)
                {
                    rmTotalWeight += _curInfo.blendWeight;
                }
            }

            // Previous play info
            foreach (PlayInfo prevInfo in _prevInfos)
            {
                if (prevInfo.blendWeight <= IM.Number.zero)
                {
                    continue;
                }
                IM.Number  ratio = prevInfo.blendWeight / totalWeight;
                IM.Vector3 position;
                IM.Number  angle;
                GetNodePosAndRot(prevInfo, node, out position, out angle);
                pos       += position * ratio;
                horiAngle += angle * ratio;

                /*
                 * Debug.Log(string.Format(Time.frameCount +
                 *  " GetNodePos blend, {0} node:{8} weight:{1} {6} ratio:{2} pos:{3} speed:{4} time:{5} isPlaying:{7}",
                 *  GetOriginName(prevInfo.clipName), prevInfo.blendWeight, ratio, position,
                 *  _animation[prevInfo.clipName].speed, _animation[prevInfo.clipName].time,
                 *  _animation[prevInfo.clipName].weight, _animation.IsPlaying(prevInfo.clipName), node));
                 * //*/
                if (calcRootMotion && prevInfo.enableRootMotion)
                {
                    IM.Number rmRatio = prevInfo.blendWeight / rmTotalWeight;
                    prevInfo.rootMotion.Apply(position, angle, rmRatio);
                }
            }
            // Current play info
            IM.Number  curRatio = _curInfo.blendWeight / totalWeight;
            IM.Vector3 curPosition;
            IM.Number  curAngle;
            GetNodePosAndRot(_curInfo, node, out curPosition, out curAngle);
            pos       += curPosition * curRatio;
            horiAngle += curAngle * curRatio;

            /*
             *  Debug.Log(string.Format(Time.frameCount +
             *      " GetNodePos blend, {0}, node:{8}, weight:{1} {4} ratio:{2} pos:{3} speed:{5} time:{6} isPlaying:{7}",
             *      GetOriginName(_curInfo.clipName), _curInfo.blendWeight, curRatio, curPosition,
             *      _animation[_curInfo.clipName].weight, _animation[_curInfo.clipName].speed,
             *      _animation[_curInfo.clipName].time, _animation.IsPlaying(_curInfo.clipName), node));
             * //*/
            if (calcRootMotion && _curInfo.enableRootMotion)
            {
                IM.Number rmRatio = _curInfo.blendWeight / rmTotalWeight;
                _curInfo.rootMotion.Apply(curPosition, curAngle, rmRatio);
            }
        }
        else
        {
            // No blend between 2 animation
            GetNodePosAndRot(_curInfo, node, out pos, out horiAngle);
            if (calcRootMotion && _curInfo.enableRootMotion)
            {
                _curInfo.rootMotion.Apply(pos, horiAngle, IM.Number.one);
            }
        }

        /*
         * Debug.Log(string.Format(Time.frameCount +
         *  " GetNodePos, clip:{0} node:{1} time:{2} - {3} pos:{4} key:{5} - {6}",
         *  _animation[_curInfo.clipName].clip.name, node, _curInfo.time,
         *  _animation[_curInfo.clipName].time,// % _animation[_curInfo.clipName].length,
         *  pos, _curInfo.keyFrameIndex1, _curInfo.keyFrameIndex2));
         * //*/
        if (calcRootMotion)
        {
            pos       = deltaMove;
            horiAngle = deltaAngle;
        }
    }
Example #14
0
    public void ReadConfig()
    {
        if (isLoadFinish == false)
        {
            return;
        }
        isLoadFinish = false;
        lock (LockObject) { GameSystem.Instance.readConfigCnt += 1; }

        string text = ResourceLoadManager.Instance.GetConfigText(XML_ASSET_NAME);

        if (text == null)
        {
            ErrorDisplay.Instance.HandleLog("LoadConfig failed: " + XML_ASSET_NAME, "", LogType.Error);
            return;
        }

        datas.Clear();
        XmlDocument doc = new XmlDocument();

        doc.LoadXml(text);
        XmlNode root = doc.SelectSingleNode("AnimationSamples");

        foreach (XmlNode motion in root.SelectNodes("Animation"))
        {
            AnimData animData = new AnimData();
            string   name     = motion.Attributes["name"].Value;
            datas.Add(name, animData);

            animData.wrapMode  = (WrapMode)(int.Parse(motion.Attributes["wrapMode"].Value));
            animData.frameRate = IM.Number.Parse(motion.Attributes["frameRate"].Value);

            animData.sampleDatas = new List <SampleData>();
            foreach (XmlNode sample in motion.SelectNodes("Sample"))
            {
                IM.Number  time = IM.Number.Parse(sample.Attributes["time"].Value);
                SampleData data = new SampleData();
                data.time = time;
                animData.sampleDatas.Add(data);

                data.nodes = new Dictionary <SampleNode, SampleNodeData>();
                foreach (XmlNode node in sample.SelectNodes("Node"))
                {
                    SampleNodeData nodeData     = new SampleNodeData();
                    SampleNode     nodeName     = (SampleNode)(int.Parse(node.Attributes["name"].Value));
                    XmlAttribute   attrPosition = node.Attributes["position"];
                    if (attrPosition != null)
                    {
                        nodeData.position = IM.Vector3.Parse(attrPosition.Value);
                    }
                    XmlAttribute attrHoriAngle = node.Attributes["hori_angle"];
                    if (attrHoriAngle != null)
                    {
                        nodeData.horiAngle = IM.Number.Parse(attrHoriAngle.Value);
                    }
                    data.nodes.Add(nodeName, nodeData);
                }
            }
            animData.duration = animData.sampleDatas[animData.sampleDatas.Count - 1].time;

            animData.eventDatas = new List <AnimEventData>();
            foreach (XmlNode evt in motion.SelectNodes("Event"))
            {
                AnimEventData eventData = new AnimEventData();
                eventData.time     = IM.Number.Parse(evt.Attributes["time"].Value);
                eventData.funcName = evt.Attributes["func"].Value;
                XmlAttribute attrIntParam = evt.Attributes["int_param"];
                if (attrIntParam != null)
                {
                    eventData.intParameter = int.Parse(attrIntParam.Value);
                }
                XmlAttribute attrStringParam = evt.Attributes["string_param"];
                if (attrStringParam != null)
                {
                    eventData.stringParameter = attrStringParam.Value;
                }
                XmlAttribute attrFloatParam = evt.Attributes["float_param"];
                if (attrFloatParam != null)
                {
                    eventData.floatParameter = IM.Number.Parse(attrFloatParam.Value);
                }
                animData.eventDatas.Add(eventData);
            }
            //按事件时间排序
            animData.eventDatas.Sort((d1, d2) => d1.time < d2.time ? -1 : (d1.time > d2.time ? 1 : 0));
        }
    }