public unsafe void Read(Stream stream) { using (var io = IoBuffer.FromStream(stream)) { var version = io.ReadInt32(); var boneCount = io.ReadInt32(); var boneNames = new string[boneCount]; for (var i = 0; i < boneCount; i++){ boneNames[i] = io.ReadPascalString(); } var faceCount = io.ReadInt32(); NumPrimitives = faceCount; IndexBuffer = new short[faceCount * 3]; int offset = 0; for (var i = 0; i < faceCount; i++){ IndexBuffer[offset++] = (short)io.ReadInt32(); IndexBuffer[offset++] = (short)io.ReadInt32(); IndexBuffer[offset++] = (short)io.ReadInt32(); } /** Bone bindings **/ var bindingCount = io.ReadInt32(); BoneBindings = new BoneBinding[bindingCount]; for (var i = 0; i < bindingCount; i++) { BoneBindings[i] = new BoneBinding { BoneIndex = io.ReadInt32(), FirstRealVertex = io.ReadInt32(), RealVertexCount = io.ReadInt32(), FirstBlendVertex = io.ReadInt32(), BlendVertexCount = io.ReadInt32() }; BoneBindings[i].BoneName = boneNames[BoneBindings[i].BoneIndex]; } var realVertexCount = io.ReadInt32(); RealVertexBuffer = new MeshVertex[realVertexCount]; for (var i = 0; i < realVertexCount; i++){ RealVertexBuffer[i].UV.X = io.ReadFloat(); RealVertexBuffer[i].UV.Y = io.ReadFloat(); } /** Blend data **/ var blendVertexCount = io.ReadInt32(); BlendData = new BlendData[blendVertexCount]; for (var i = 0; i < blendVertexCount; i++) { BlendData[i] = new BlendData { Weight = (float)io.ReadInt32() / 0x8000, OtherVertex = io.ReadInt32() }; } var realVertexCount2 = io.ReadInt32(); BlendVertexBuffer = new MeshVertex[realVertexCount]; for (int i = 0; i < realVertexCount; i++) { RealVertexBuffer[i].Position = new Microsoft.Xna.Framework.Vector3( -io.ReadFloat(), io.ReadFloat(), io.ReadFloat() ); BlendVertexBuffer[i].Position = RealVertexBuffer[i].Position; BlendVertexBuffer[i].Normal = new Microsoft.Xna.Framework.Vector3( -io.ReadFloat(), io.ReadFloat(), io.ReadFloat() ); BlendVertexBuffer[i].UV = RealVertexBuffer[i].UV; } } }
public unsafe void Read(Stream stream) { using (var io = IoBuffer.FromStream(stream)) { var version = io.ReadInt32(); var boneCount = io.ReadInt32(); var boneNames = new string[boneCount]; for (var i = 0; i < boneCount; i++) { boneNames[i] = io.ReadPascalString(); } var faceCount = io.ReadInt32(); NumPrimitives = faceCount; IndexBuffer = new short[faceCount * 3]; int offset = 0; for (var i = 0; i < faceCount; i++) { IndexBuffer[offset++] = (short)io.ReadInt32(); IndexBuffer[offset++] = (short)io.ReadInt32(); IndexBuffer[offset++] = (short)io.ReadInt32(); } /** Bone bindings **/ var bindingCount = io.ReadInt32(); BoneBindings = new BoneBinding[bindingCount]; for (var i = 0; i < bindingCount; i++) { BoneBindings[i] = new BoneBinding { BoneIndex = io.ReadInt32(), FirstRealVertex = io.ReadInt32(), RealVertexCount = io.ReadInt32(), FirstBlendVertex = io.ReadInt32(), BlendVertexCount = io.ReadInt32() }; BoneBindings[i].BoneName = boneNames[BoneBindings[i].BoneIndex]; } var realVertexCount = io.ReadInt32(); RealVertexBuffer = new MeshVertex[realVertexCount]; for (var i = 0; i < realVertexCount; i++) { RealVertexBuffer[i].UV.X = io.ReadFloat(); RealVertexBuffer[i].UV.Y = io.ReadFloat(); } /** Blend data **/ var blendVertexCount = io.ReadInt32(); BlendData = new BlendData[blendVertexCount]; for (var i = 0; i < blendVertexCount; i++) { BlendData[i] = new BlendData { Weight = (float)io.ReadInt32() / 0x8000, OtherVertex = io.ReadInt32() }; } var realVertexCount2 = io.ReadInt32(); BlendVertexBuffer = new MeshVertex[realVertexCount]; for (int i = 0; i < realVertexCount; i++) { RealVertexBuffer[i].Position = new Microsoft.Xna.Framework.Vector3( -io.ReadFloat(), io.ReadFloat(), io.ReadFloat() ); BlendVertexBuffer[i].Position = RealVertexBuffer[i].Position; BlendVertexBuffer[i].Normal = new Microsoft.Xna.Framework.Vector3( -io.ReadFloat(), io.ReadFloat(), io.ReadFloat() ); BlendVertexBuffer[i].UV = RealVertexBuffer[i].UV; } } }