Esempio n. 1
0
        public Skeleton(GraphicsDevice Device, byte[] Filedata, Matrix WorldMatrix)
        {
            MemoryStream MemStream = new MemoryStream(Filedata);
            BinaryReader Reader    = new BinaryReader(MemStream);

            m_WorldMatrix = WorldMatrix;

            m_Version = Endian.SwapUInt32(Reader.ReadUInt32());
            m_Name    = Encoding.ASCII.GetString(Reader.ReadBytes(Reader.ReadByte()));

            m_BoneCount = Endian.SwapUInt16(Reader.ReadUInt16());
            m_Bones     = new Bone[m_BoneCount];

            for (int i = 0; i < m_BoneCount; i++)
            {
                Endian.SwapUInt32(Reader.ReadUInt32()); //1 in hexadecimal... typical useless Maxis value...

                Bone Bne = new Bone(this);

                Bne.ID = i;

                Bne.BoneName = Encoding.ASCII.GetString(Reader.ReadBytes(Reader.ReadByte()));
                Log.LogThis("BoneName: " + Bne.BoneName, eloglevel.info);
                Bne.ParentName = Encoding.ASCII.GetString(Reader.ReadBytes(Reader.ReadByte()));

                Bne.HasPropertyList = Reader.ReadByte();

                if (Bne.HasPropertyList == 1)
                {
                    Bne.PList = ReadPropList(Reader);
                }

                //Little Endian
                Bne.Translations    = new float[3];
                Bne.Translations[0] = Reader.ReadSingle();
                Bne.Translations[1] = Reader.ReadSingle();
                Bne.Translations[2] = Reader.ReadSingle();

                Bne.Versor = new float[4];
                //These values are given in degrees...
                Bne.Versor[0] = MathHelper.ToRadians(Reader.ReadSingle());
                Bne.Versor[1] = MathHelper.ToRadians(Reader.ReadSingle());
                Bne.Versor[2] = MathHelper.ToRadians(Reader.ReadSingle());
                Bne.Versor[3] = MathHelper.ToRadians(Reader.ReadSingle());

                Bne.CanTranslate   = Endian.SwapInt32(Reader.ReadInt32());
                Bne.CanRotate      = Endian.SwapInt32(Reader.ReadInt32());
                Bne.CanUseBlending = Endian.SwapInt32(Reader.ReadInt32());
                //Little endian.
                Bne.CanWiggle    = Reader.ReadSingle();
                Bne.WiggleAmount = Reader.ReadSingle();

                Bne.BoneEffect = new BasicEffect(Device, null);

                Bne.Children = new int[m_BoneCount - i - 1];

                int Parent = FindBone(Bne.ParentName, i);
                if (Parent != -1)
                {
                    m_Bones[Parent].Children[m_Bones[Parent].NumChildren] = Bne.ID;
                    m_Bones[Parent].NumChildren += 1;
                    Bne.Parent = m_Bones[Parent];
                    Bne.ComputeAbsoluteTransform(m_WorldMatrix);
                }

                m_Bones[i] = Bne;

                /*Log.LogThis("Bone: " + Bne.BoneName, eloglevel.info);
                 * if (Parent != -1)
                 * {
                 *  Log.LogThis("Parent: " + Bne.Parent.BoneName, eloglevel.info);
                 *
                 *  for (int j = 0; j < Bne.Parent.NumChildren; j++)
                 *      Log.LogThis("Child: " + Bne.Parent.Children[j].BoneName, eloglevel.info);
                 * }
                 * else
                 *  Log.LogThis("Parent: NULL", eloglevel.info);*/
            }

            Reader.Close();
        }
Esempio n. 2
0
 public int ReadInt32()
 {
     return(Endian.SwapInt32(Reader.ReadInt32()));
 }
Esempio n. 3
0
        public Skeleton(GraphicsDevice Device, string Filepath, ref Matrix WorldMatrix)
        {
            BinaryReader Reader = new BinaryReader(File.Open(Filepath, FileMode.Open));

            m_WorldMatrix = WorldMatrix;

            m_Version = Endian.SwapUInt32(Reader.ReadUInt32());
            m_Name    = Encoding.ASCII.GetString(Reader.ReadBytes(Reader.ReadByte()));

            m_BoneCount = Endian.SwapUInt16(Reader.ReadUInt16());
            m_Bones     = new Bone[m_BoneCount];

            for (int i = 0; i < m_BoneCount; i++)
            {
                Endian.SwapUInt32(Reader.ReadUInt32()); //1 in hexadecimal... typical useless Maxis value...

                Bone Bne = new Bone(this);

                Bne.ID = i;

                Bne.BoneName   = Encoding.ASCII.GetString(Reader.ReadBytes(Reader.ReadByte()));
                Bne.ParentName = Encoding.ASCII.GetString(Reader.ReadBytes(Reader.ReadByte()));

                Bne.HasPropertyList = Reader.ReadByte();

                if (Bne.HasPropertyList == 1)
                {
                    Bne.PList = ReadPropList(Reader);
                }

                //Little Endian
                Bne.Translations    = new float[3];
                Bne.Translations[0] = Reader.ReadSingle();
                Bne.Translations[1] = Reader.ReadSingle();
                Bne.Translations[2] = Reader.ReadSingle();

                Bne.Versor = new float[4];
                //These values are given in degrees...
                Bne.Versor[0] = MathHelper.ToRadians(Reader.ReadSingle());
                Bne.Versor[1] = MathHelper.ToRadians(Reader.ReadSingle());
                Bne.Versor[2] = MathHelper.ToRadians(Reader.ReadSingle());
                Bne.Versor[3] = MathHelper.ToRadians(Reader.ReadSingle());

                Bne.CanTranslate   = Endian.SwapInt32(Reader.ReadInt32());
                Bne.CanRotate      = Endian.SwapInt32(Reader.ReadInt32());
                Bne.CanUseBlending = Endian.SwapInt32(Reader.ReadInt32());
                //Little endian.
                Bne.CanWiggle    = Reader.ReadSingle();
                Bne.WiggleAmount = Reader.ReadSingle();

                Bne.BoneEffect = new BasicEffect(Device, null);

                Bne.Children = new int[m_BoneCount - i - 1];

                int Parent = FindBone(Bne.ParentName, i);
                if (Parent != -1)
                {
                    m_Bones[Parent].Children[m_Bones[Parent].NumChildren] = Bne.ID;
                    m_Bones[Parent].NumChildren += 1;
                    Bne.Parent = m_Bones[Parent];
                    Bne.ComputeAbsoluteTransform(m_WorldMatrix);
                }

                m_Bones[i] = Bne;
            }

            Reader.Close();
        }
Esempio n. 4
0
        public Mesh(byte[] Filedata, bool BodyMesh)
        {
            MemoryStream MemStream = new MemoryStream(Filedata);
            BinaryReader Reader    = new BinaryReader(MemStream);

            IsBodyMesh = BodyMesh;

            m_Version = Endian.SwapInt32(Reader.ReadInt32());

            m_BoneCount = Endian.SwapInt32(Reader.ReadInt32());

            for (int i = 0; i < m_BoneCount; i++)
            {
                byte   StrLen   = Reader.ReadByte();
                string BoneName = Encoding.ASCII.GetString(Reader.ReadBytes(StrLen));
                m_BoneNames.Add(BoneName);
            }

            m_FaceCount = Endian.SwapInt32(Reader.ReadInt32());
            m_Faces     = new Face[m_FaceCount];

            for (int i = 0; i < m_FaceCount; i++)
            {
                m_Faces[i].AVertexIndex = Endian.SwapInt32(Reader.ReadInt32());
                m_Faces[i].BVertexIndex = Endian.SwapInt32(Reader.ReadInt32());
                m_Faces[i].CVertexIndex = Endian.SwapInt32(Reader.ReadInt32());
            }

            m_BndCount = Endian.SwapInt32(Reader.ReadInt32());

            for (int i = 0; i < m_BndCount; i++)
            {
                BoneBinding Binding = new BoneBinding();
                Binding.BoneIndex          = Endian.SwapInt32(Reader.ReadInt32());
                Binding.FirstVertex        = Endian.SwapInt32(Reader.ReadInt32());
                Binding.VertexCount        = Endian.SwapInt32(Reader.ReadInt32());
                Binding.FirstBlendedVert   = Endian.SwapInt32(Reader.ReadInt32());
                Binding.BlendedVertexCount = Endian.SwapInt32(Reader.ReadInt32());

                m_BoneBindings.Add(Binding);
            }

            m_RealVertexCount = Endian.SwapInt32(Reader.ReadInt32());
            m_TexVerticies    = new Single[m_RealVertexCount, 3];

            for (int i = 0; i < m_RealVertexCount; i++)
            {
                m_TexVerticies[i, 0] = i;
                m_TexVerticies[i, 1] = Reader.ReadSingle();
                m_TexVerticies[i, 2] = Reader.ReadSingle();
            }

            m_BlendCount = Endian.SwapInt32(Reader.ReadInt32());

            for (int i = 0; i < m_BlendCount; i++)
            {
                BlendData Blend = new BlendData();
                Blend.WeightFixed      = (float)(Endian.SwapInt32(Reader.ReadInt32())) / 0x8000;
                Blend.OtherVertexIndex = Endian.SwapInt32(Reader.ReadInt32());
                m_BlendData.Add(Blend);
            }

            m_TotalVertexCount = Endian.SwapInt32(Reader.ReadInt32());

            m_VertexData          = new Single[m_TotalVertexCount, 6];
            m_TransformedVertices = new Vertex[m_TotalVertexCount];

            for (int i = 0; i < m_TotalVertexCount; i++)
            {
                m_VertexData[i, 0] = Reader.ReadSingle();
                m_VertexData[i, 1] = Reader.ReadSingle();
                m_VertexData[i, 2] = Reader.ReadSingle();
                //Normals
                m_VertexData[i, 3] = Reader.ReadSingle();
                m_VertexData[i, 4] = Reader.ReadSingle();
                m_VertexData[i, 5] = Reader.ReadSingle();

                if (i < m_RealVertexCount)
                {
                    if (m_TransformedVertices[i] == null)
                    {
                        m_TransformedVertices[i] = new Vertex();
                    }

                    //Fixed vertex
                    m_TransformedVertices[i].TextureCoord.X = m_TexVerticies[i, 1];
                    m_TransformedVertices[i].TextureCoord.Y = m_TexVerticies[i, 2];
                }
                else
                {
                    if (m_TransformedVertices[i] == null)
                    {
                        m_TransformedVertices[i] = new Vertex();
                    }

                    //Blended vertex
                    m_TransformedVertices[i].Blend.WeightFixed      = m_BlendData[i - m_RealVertexCount].WeightFixed;
                    m_TransformedVertices[i].Blend.OtherVertexIndex = m_BlendData[i - m_RealVertexCount].OtherVertexIndex;
                }
            }
        }