/// <summary>
        ///     Clones this instance.
        /// </summary>
        /// <returns>The cloned animated model data.</returns>
        public InternalSkinnedModel Clone()
        {
            var newModel = new InternalSkinnedModel();

            newModel.graphics    = this.graphics;
            newModel.BoundingBox = this.BoundingBox;

            for (int i = 0; i < this.Meshes.Count; i++)
            {
                SkinnedMesh         currentMesh   = this.Meshes[i];
                SkinnedVertexBuffer currentBuffer = currentMesh.VertexBuffer as SkinnedVertexBuffer;
                var newVertices = new SkinnedVertex[currentMesh.NumVertices];
                Array.Copy(currentBuffer.CpuVertices, newVertices, currentBuffer.CpuVertices.Length);

                var newBuffer = new SkinnedVertexBuffer(currentBuffer.VertexBufferFormat);
                newBuffer.SetData(newVertices, currentBuffer.VertexCount);
                var newIndexBuffer = new IndexBuffer(this.internalindices[i]);
                var newMesh        = new SkinnedMesh(
                    currentMesh.VertexOffset,
                    currentMesh.NumVertices,
                    currentMesh.IndexOffset,
                    currentMesh.NumPrimitives,
                    newBuffer,
                    newIndexBuffer,
                    PrimitiveType.TriangleList);
                newMesh.Name = currentMesh.Name;

                newModel.Meshes.Add(newMesh);

                this.graphics.BindIndexBuffer(newModel.Meshes[i].IndexBuffer);
                this.graphics.BindVertexBuffer(newModel.Meshes[i].VertexBuffer);
            }

            return(newModel);
        }
示例#2
0
 public void WriteSkinnedVertex(SkinnedVertex v)
 {
     _stream.WriteShort4N(v.Position);
     _stream.WriteShort2N(v.Texcoord);
     _stream.WriteUByte4N(v.Tangent);
     _stream.WriteUByte4(v.BlendIndices);
     _stream.WriteUByte4N(new Vector4(v.BlendWeights));
 }
示例#3
0
 public void WriteSkinnedVertex(SkinnedVertex v)
 {
     _stream.WriteFloat3(v.Position.XYZ);
     _stream.WriteFloat2(v.Texcoord);
     _stream.WriteFloat3(v.Normal);
     _stream.WriteFloat3(v.Tangent.XYZ);
     _stream.WriteFloat3(v.Binormal);
     _stream.WriteUByte4(v.BlendIndices);
     _stream.WriteUByte4N(new Vector4(v.BlendWeights));
 }
示例#4
0
        public override void loadbody(byte[] buffer)
        {
            //  vertexdeclaration = new VertexPositionNormalTexture();
            BinaryReader br = new BinaryReader(new MemoryStream(buffer));
            vertices = new SkinnedVertex[br.ReadInt32()];
            indices = new int[br.ReadInt32()];

            for (int bv = 0; bv < vertices.Length; bv++)
            {
                Vector3 pos = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle());
                Vector3 nor = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle());
                Vector2 tcr = new Vector2(br.ReadSingle(), br.ReadSingle());

                Vector3 bindx = new Vector3();
                Vector3 bwigs = new Vector3();

                int relationBoneCount = br.ReadInt32();
                if (relationBoneCount > 3)
                    throw new Exception("Too many bones in skin!!!");
                var boneIndices = new int[] { 0, 0, 0 };
                for (var j = 0; j < relationBoneCount; j++)
                {
                    string name = br.ReadPackString();
                    boneIndices[j] = skeleton.IndexOf(name);
                }
                bindx.X = boneIndices[0];
                bindx.Y = boneIndices[1];
                bindx.Z = boneIndices[2];

                relationBoneCount = br.ReadInt32();
                float[] boneWeight = new float[] { 0.0f, 0.0f, 0.0f };
                for (var j = 0; j < relationBoneCount; j++)
                    boneWeight[j] = br.ReadSingle();
                bwigs.X = boneWeight[0];
                bwigs.Y = boneWeight[1];
                bwigs.Z = boneWeight[2];

                vertices[bv] = new SkinnedVertex(
                    pos,
                    nor,
                    tcr,
                    bindx,
                    bwigs);
            }

            for (int bv = 0; bv < indices.Length; bv++)
                indices[bv] = br.ReadInt32();

            br.Close();
        }
 private static void ReadSkinnedVertices(StreamReader reader, int numVertices, out List <SkinnedVertex> vertices)
 {
     vertices = new List <SkinnedVertex>(numVertices);
     reader.ReadLine(); // Vertices header text.
     for (int i = 0; i < numVertices; i++)
     {
         var      vertex = new SkinnedVertex();
         string[] split  = ReadAndSplitLine(reader);
         vertex.Pos = new Vector3(
             float.Parse(split[1], Culture),
             float.Parse(split[2], Culture),
             float.Parse(split[3], Culture));
         split           = ReadAndSplitLine(reader);
         vertex.TangentU = new Vector3(
             float.Parse(split[1], Culture),
             float.Parse(split[2], Culture),
             float.Parse(split[3], Culture));
         split         = ReadAndSplitLine(reader);
         vertex.Normal = new Vector3(
             float.Parse(split[1], Culture),
             float.Parse(split[2], Culture),
             float.Parse(split[3], Culture));
         split       = ReadAndSplitLine(reader);
         vertex.TexC = new Vector2(
             float.Parse(split[1], Culture),
             float.Parse(split[2], Culture));
         split = ReadAndSplitLine(reader);
         vertex.BoneWeights = new Vector3(
             float.Parse(split[1], Culture),
             float.Parse(split[2], Culture),
             float.Parse(split[3], Culture));
         split = ReadAndSplitLine(reader);
         vertex.BoneIndices = new Color(
             byte.Parse(split[1]),
             byte.Parse(split[2]),
             byte.Parse(split[3]),
             byte.Parse(split[4]));
         vertices.Add(vertex);
         reader.ReadLine();
     }
 }
        /// <summary>
        /// Loads this class with data from a stream.
        /// </summary>
        /// <param name="graphicsDevice">The graphicsDevice device.</param>
        /// <param name="stream">The stream that contains the model data.</param>
        public void Load(GraphicsDevice graphicsDevice, Stream stream)
        {
            this.graphics = graphicsDevice;

            using (var reader = new BinaryReader(stream))
            {
                this.internalindices      = new List <ushort[]>();
                this.BoundingBox.Min      = reader.ReadVector3();
                this.BoundingBox.Max      = reader.ReadVector3();
                this.BoundingBoxBoneIndex = reader.ReadInt32();

                int numMeshes = reader.ReadInt32();
                for (int i = 0; i < numMeshes; i++)
                {
                    string meshName = reader.ReadString();

                    reader.ReadInt32(); // mesh count

                    for (int j = 0; j < 1; j++)
                    {
                        ////bool usesTangent = false;

                        int vertexOffset   = reader.ReadInt32();
                        int numVertices    = reader.ReadInt32();
                        int startIndex     = reader.ReadInt32();
                        int primitiveCount = reader.ReadInt32();

                        reader.ReadInt32(); // vertex stride
                        int numVertexElements = reader.ReadInt32();

                        var properties = new VertexElementProperties[numVertexElements];

                        for (int k = 0; k < numVertexElements; k++)
                        {
                            properties[k].Offset     = reader.ReadInt32();
                            properties[k].Format     = (VertexElementFormat)reader.ReadInt32();
                            properties[k].Usage      = (VertexElementUsage)reader.ReadInt32();
                            properties[k].UsageIndex = reader.ReadInt32();
                        }

                        reader.ReadInt32(); // bufferSize

                        var bufferData = new SkinnedVertex[numVertices];

                        for (int k = 0; k < numVertices; k++)
                        {
                            foreach (VertexElementProperties property in properties)
                            {
                                switch (property.Usage)
                                {
                                case VertexElementUsage.Position:
                                    bufferData[k].Position = reader.ReadVector3();
                                    break;

                                case VertexElementUsage.TextureCoordinate:
                                    bufferData[k].TexCoord = reader.ReadVector2();
                                    break;

                                case VertexElementUsage.Normal:
                                    bufferData[k].Normal = reader.ReadVector3();
                                    break;

                                case VertexElementUsage.BlendIndices:
                                    bufferData[k].BlendIndices = reader.ReadByte4();
                                    break;

                                case VertexElementUsage.BlendWeight:
                                    bufferData[k].BlendWeights = reader.ReadVector2();
                                    break;

                                case VertexElementUsage.Tangent:
                                    bufferData[k].Tangent = reader.ReadVector3();
                                    break;

                                case VertexElementUsage.Binormal:
                                    bufferData[k].Binormal = reader.ReadVector3();
                                    break;
                                }
                            }
                        }

                        int indexSize = reader.ReadInt32();
                        var indices   = new ushort[indexSize];
                        for (int k = 0; k < indexSize; k++)
                        {
                            indices[k] = reader.ReadUInt16();
                        }

                        this.internalindices.Add(indices);

                        var newSkinnedBuffer = new SkinnedVertexBuffer(SkinnedVertex.VertexFormat);
                        newSkinnedBuffer.SetData(bufferData, numVertices);
                        var mesh = new SkinnedMesh(
                            vertexOffset,
                            numVertices,
                            startIndex,
                            primitiveCount,
                            newSkinnedBuffer,
                            new IndexBuffer(indices),
                            PrimitiveType.TriangleList);
                        mesh.Name = meshName;

                        this.Meshes.Add(mesh);
                    }
                }
            }
        }