Example #1
0
        public override BoneMotion BoneMotionAt(RenderBone b, float frame)
        {
            if (Bone.ContainsKey (b.bone.name)) {
                var bones = Bone [b.bone.name];
                var m0 = from x in bones
                             where x.frame_no >= frame
                     select x;
                var m1 = from x in bones
                             where x.frame_no <= frame
                         select x;

                if (m0.Count () == 0) {
                    if (m1.Count () == 0) {
                        return null;
                    } else {
                        return m1.Last ();
                    }
                } else {
                    var b0 = m0.First ();
                    if (m1.Count () == 0) {
                        return b0;
                    } else {
                        var b1 = m1.Last ();
                        if (b0.Equals (b1)) {
                            return b0;
                        } else {	// interpolate
                            int dif = b1.frame_no - b0.frame_no;
                            float a0 = frame - b0.frame_no;
                            float ratio = a0 / dif;

                            var m = new BoneMotion ();
                            m.location = new float[3];
                            m.rotation = new float[4];
                            double t = bazier(b0.interp, 0, 1, ratio);
                            m.location[0] = (float) (b0.location[0] + (b1.location[0] - b0.location[0]) * t);
                            t = bazier(b0.interp, 1, 1, ratio);
                            m.location[1] = (float) (b0.location[1] + (b1.location[1] - b0.location[1]) * t);
                            t = bazier(b0.interp, 2, 1, ratio);
                            m.location[2] = (float) (b0.location[2] + (b1.location[2] - b0.location[2]) * t);

                            slerp(m.rotation, b0.rotation, b1.rotation, 0, 0, bazier(b0.interp, 3, 1, ratio));

                            return m;
                        }
                    }
                }
            } else {
                return null;
            }
        }
Example #2
0
        public override BoneMotion BoneMotionAt(RenderBone b, float frame)
        {
            if (Bone.ContainsKey(b.bone.name))
            {
                var bones = Bone [b.bone.name];
                var m0    = from x in bones
                            where x.frame_no >= frame
                            select x;
                var m1 = from x in bones
                         where x.frame_no <= frame
                         select x;

                if (m0.Count() == 0)
                {
                    if (m1.Count() == 0)
                    {
                        return(null);
                    }
                    else
                    {
                        return(m1.Last());
                    }
                }
                else
                {
                    var b0 = m0.First();
                    if (m1.Count() == 0)
                    {
                        return(b0);
                    }
                    else
                    {
                        var b1 = m1.Last();
                        if (b0.Equals(b1))
                        {
                            return(b0);
                        }
                        else                                    // interpolate
                        {
                            int   dif   = b1.frame_no - b0.frame_no;
                            float a0    = frame - b0.frame_no;
                            float ratio = a0 / dif;

                            var m = new BoneMotion();
                            m.location = new float[3];
                            m.rotation = new float[4];
                            double t = bazier(b0.interp, 0, 1, ratio);
                            m.location[0] = (float)(b0.location[0] + (b1.location[0] - b0.location[0]) * t);
                            t             = bazier(b0.interp, 1, 1, ratio);
                            m.location[1] = (float)(b0.location[1] + (b1.location[1] - b0.location[1]) * t);
                            t             = bazier(b0.interp, 2, 1, ratio);
                            m.location[2] = (float)(b0.location[2] + (b1.location[2] - b0.location[2]) * t);

                            slerp(m.rotation, b0.rotation, b1.rotation, 0, 0, bazier(b0.interp, 3, 1, ratio));

                            return(m);
                        }
                    }
                }
            }
            else
            {
                return(null);
            }
        }
Example #3
0
        private void parseFrame(BinaryReader br)
        {
            int num = br.ReadInt32();

            Log.Debug("VMD", "Animation: " + num.ToString());
            string bone_name;

            if (num > 0)
            {
                // initialize bone hash
                var mh = new Dictionary <string, List <BoneMotion> > ();
                Bone = new Dictionary <string, List <BoneMotion> > ();

                // parse
                for (int i = 0; i < num; i++)
                {
                    BoneMotion m = new BoneMotion();

                    bone_name  = Util.ReadString(br, 15);
                    m.frame_no = br.ReadInt32();
                    m.location = Util.ReadFloats(br, 3);
                    m.rotation = Util.ReadFloats(br, 4);
                    m.interp   = br.ReadBytes(16);

                    br.BaseStream.Position = br.BaseStream.Position + 48;

                    List <BoneMotion> mi;
                    if (mh.ContainsKey(bone_name))
                    {
                        mi = mh [bone_name];
                    }
                    else
                    {
                        mi = new List <BoneMotion> ();

                        // set default
                        BoneMotion d = new BoneMotion();
                        d.location = new float[3];
                        d.rotation = new float[4];

                        d.frame_no     = -1;
                        d.location [0] = d.location [1] = d.location [2] = 0;
                        d.rotation [0] = d.rotation [1] = d.rotation [2] = 0;
                        d.rotation [3] = 1;
                        d.interp       = null;
                        mi.Add(d);

                        mh[bone_name] = mi;
                    }

                    mi.Add(m);
                    if (m.frame_no > max_frame)
                    {
                        max_frame = m.frame_no;
                    }
                }

                // sorted by frame_no
                foreach (var i in mh)
                {
                    Bone[i.Key] = new List <BoneMotion>(from x in i.Value orderby x.frame_no select x);
                }
            }
            else
            {
                Bone = null;
            }
        }
Example #4
0
        private void parseFrame(BinaryReader br)
        {
            int num = br.ReadInt32 ();
            Log.Debug ("VMD", "Animation: " + num.ToString());
            string bone_name;

            if (num > 0) {
                // initialize bone hash
                var mh = new Dictionary<string, List<BoneMotion> > ();
                Bone = new Dictionary<string, List<BoneMotion> > ();

                // parse
                for (int i = 0; i < num; i++) {
                    BoneMotion m = new BoneMotion ();

                    bone_name = Util.ReadString (br, 15);
                    m.frame_no = br.ReadInt32 ();
                    m.location = Util.ReadFloats (br, 3);
                    m.rotation = Util.ReadFloats (br, 4);
                    m.interp = br.ReadBytes (16);

                    br.BaseStream.Position = br.BaseStream.Position + 48;

                    List<BoneMotion> mi;
                    if (mh.ContainsKey (bone_name)) {
                        mi = mh [bone_name];
                    } else {
                        mi = new List<BoneMotion> ();

                        // set default
                        BoneMotion d = new BoneMotion ();
                        d.location = new float[3];
                        d.rotation = new float[4];

                        d.frame_no = -1;
                        d.location [0] = d.location [1] = d.location [2] = 0;
                        d.rotation [0] = d.rotation [1] = d.rotation [2] = 0;
                        d.rotation [3] = 1;
                        d.interp = null;
                        mi.Add (d);

                        mh[bone_name] = mi;
                    }

                    mi.Add (m);
                    if (m.frame_no > max_frame) {
                        max_frame = m.frame_no;
                    }
                }

                // sorted by frame_no
                foreach (var i in mh) {
                    Bone[i.Key] = new List<BoneMotion>(from x in i.Value orderby x.frame_no select x);
                }
            } else {
                Bone = null;
            }
        }