/// <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); }
/// <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); } } } }