Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        /// <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);
                    }
                }
            }
        }