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(); }
public int ReadInt32() { return(Endian.SwapInt32(Reader.ReadInt32())); }
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(); }
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; } } }