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