// private methods private void ProcessMeshContext(H1MeshContext context) { // offset tracking int currOffset = 0; // process vertex buffers and index buffer // 1. positions var positions = context.Positions.ToArray(); if (positions.Count() != 0) { LocalVertexFactory.PositionVertexBuffer = H1VertexBuffer.ProcessVertexBuffer(positions); LocalVertexFactory.PositionStreamComponent = new H1VertexStreamComponent(H1VertexStreamSematicType.Position, H1VertexElementType.Float3, currOffset++); } // 2. normals var normals = context.Normals.ToArray(); if (normals.Count() != 0) { LocalVertexFactory.NormalVertexBuffer = H1VertexBuffer.ProcessVertexBuffer(normals); LocalVertexFactory.NormalStreamComponent = new H1VertexStreamComponent(H1VertexStreamSematicType.Normal, H1VertexElementType.Float3, currOffset++); } // 3. texcoords // 3-1. looping UVBuffers foreach (var texcoords in context.UVBuffers) { if (texcoords.Buffer.Count() != 0) { LocalVertexFactory.TexcoordVertexBuffers.Add(H1VertexBuffer.ProcessVertexBuffer(texcoords.Buffer.ToArray())); LocalVertexFactory.AddTexcoordStreamComponent(new H1VertexStreamComponent(H1VertexStreamSematicType.Texcoord, H1VertexElementType.Float2, currOffset++)); } } // 3-2. looping UVWBuffers foreach (var texcoords in context.UVWBuffers) { if (texcoords.Buffer.Count() != 0) { LocalVertexFactory.TexcoordVertexBuffers.Add(H1VertexBuffer.ProcessVertexBuffer(texcoords.Buffer.ToArray())); LocalVertexFactory.AddTexcoordStreamComponent(new H1VertexStreamComponent(H1VertexStreamSematicType.Texcoord, H1VertexElementType.Float3, currOffset++)); } } // @TODO - temporal color component int numVertices = context.Positions.Count; Vector4[] colors = new Vector4[numVertices]; for (int i = 0; i < numVertices; ++i) { colors[i].X = 1.0f; colors[i].Y = 0.0f; colors[i].Z = 0.0f; colors[i].W = 1.0f; } LocalVertexFactory.ColorVertexBuffer = H1VertexBuffer.ProcessVertexBuffer(colors); LocalVertexFactory.ColorStreamComponent = new H1VertexStreamComponent(H1VertexStreamSematicType.Color, H1VertexElementType.Float4, currOffset++); // generate RHIVertexFormatDeclaration LocalVertexFactory.GenerateVertexDeclaration(); // 4. indices var indices = context.Indices.ToArray(); m_IndexBuffer = H1IndexBuffer.ProcessIndexBuffer(indices); }
public Boolean GenerateSkeleltalMeshObjectGpuSkin() { // allocate new instance of SkeletalMeshGpuSkin m_SkeletalMeshObject = new H1SkeletalMeshObjectGPUSkin(m_SkeletalMesh.SkeletalMeshResource); H1SkeletalMeshObjectGPUSkin refSkeletalMeshObject = m_SkeletalMeshObject as H1SkeletalMeshObjectGPUSkin; // process soft vertices for each chunk to separate vertex buffers // @TODO - handle LOD variation List <H1SkelMeshChunk> skelChunks = SkeletalMesh.SkeletalMeshResource.GetLODModel(0).Chunks; // @TODO - temporary add LOD_0 H1SkeletalMeshObjectGPUSkin.H1SkeletalMeshObjectLOD skeletalMeshObjectLOD_0 = refSkeletalMeshObject.AddSkeletalMeshObjectLOD(); Int32 skelChunkIndex = 0; foreach (H1SkelMeshChunk skelChunk in skelChunks) { H1SkeletalMeshVertexBuffers skeletalMeshVBsRef = skeletalMeshObjectLOD_0.SkelMeshResourceRef.GetLODModel(0).VertexBufferGPUSkin.SkeletalMeshVertexBuffers[skelChunkIndex]; // add GPUSkinFactory skeletalMeshObjectLOD_0.GPUSkinVertexFactories.VertexFactories.Add(new H1GpuSkinVertexFactory()); H1GpuSkinVertexFactory newGpuSkinVertexFactoryRef = skeletalMeshObjectLOD_0.GPUSkinVertexFactories.VertexFactories.Last(); // offset tracking Int32 currOffset = 0; Int32 skelMeshVBsCount = skeletalMeshVBsRef.GetSkeletalMeshVertexDataCount(); for (Int32 skelMeshVBIndex = 0; skelMeshVBIndex < skelMeshVBsCount; ++skelMeshVBIndex) { H1SkeletalMeshVertexDataInterface skeletalMeshVertexData = skeletalMeshVBsRef.GetSkeletalMeshVertexData(skelMeshVBIndex); switch (skeletalMeshVertexData.DataType) { case H1SkeletalMeshVertexDataInterface.VertexDataType.Position: { H1SkeletalMeshVertexData <Vector4> positionVertexData = skeletalMeshVertexData as H1SkeletalMeshVertexData <Vector4>; newGpuSkinVertexFactoryRef.ShaderData.PositionBuffer = H1VertexBuffer.ProcessVertexBuffer(positionVertexData.VertexBuffer); newGpuSkinVertexFactoryRef.PositionStreamComponent = new H1VertexStreamComponent(H1VertexStreamSematicType.Position, H1VertexElementType.Float4, currOffset++); break; } case H1SkeletalMeshVertexDataInterface.VertexDataType.TangentZ: { H1SkeletalMeshVertexData <Vector4> tangentZVertexData = skeletalMeshVertexData as H1SkeletalMeshVertexData <Vector4>; newGpuSkinVertexFactoryRef.ShaderData.TangentZBuffer = H1VertexBuffer.ProcessVertexBuffer(tangentZVertexData.VertexBuffer); newGpuSkinVertexFactoryRef.TangentZStreamComponent = new H1VertexStreamComponent(H1VertexStreamSematicType.TangentZ, H1VertexElementType.Float4, currOffset++); break; } case H1SkeletalMeshVertexDataInterface.VertexDataType.TangentX: { H1SkeletalMeshVertexData <Vector4> tangentXVertexData = skeletalMeshVertexData as H1SkeletalMeshVertexData <Vector4>; newGpuSkinVertexFactoryRef.ShaderData.TangentXBuffer = H1VertexBuffer.ProcessVertexBuffer(tangentXVertexData.VertexBuffer); newGpuSkinVertexFactoryRef.TangentXStreamComponent = new H1VertexStreamComponent(H1VertexStreamSematicType.TangentX, H1VertexElementType.Float4, currOffset++); break; } case H1SkeletalMeshVertexDataInterface.VertexDataType.InfluencedBones: { H1SkeletalMeshVertexData <Int4> boneIndicesVertexData = skeletalMeshVertexData as H1SkeletalMeshVertexData <Int4>; newGpuSkinVertexFactoryRef.ShaderData.BoneIndices = H1VertexBuffer.ProcessVertexBuffer(boneIndicesVertexData.VertexBuffer); newGpuSkinVertexFactoryRef.BoneIndicesStreamComponent = new H1VertexStreamComponent(H1VertexStreamSematicType.BoneIndices, H1VertexElementType.Int4, currOffset++); break; } case H1SkeletalMeshVertexDataInterface.VertexDataType.InfluencedWeights: { H1SkeletalMeshVertexData <Vector4> blendWeightsVertexData = skeletalMeshVertexData as H1SkeletalMeshVertexData <Vector4>; newGpuSkinVertexFactoryRef.ShaderData.BoneWeights = H1VertexBuffer.ProcessVertexBuffer(blendWeightsVertexData.VertexBuffer); newGpuSkinVertexFactoryRef.BoneWeightsStreamComponent = new H1VertexStreamComponent(H1VertexStreamSematicType.BoneWeights, H1VertexElementType.Float4, currOffset++); break; } // @TODO - support multiple texcoords case H1SkeletalMeshVertexDataInterface.VertexDataType.Texcoord: { H1SkeletalMeshVertexData <Vector2> texcoordVertexData = skeletalMeshVertexData as H1SkeletalMeshVertexData <Vector2>; newGpuSkinVertexFactoryRef.ShaderData.TexcoordBuffers.Add(H1VertexBuffer.ProcessVertexBuffer(texcoordVertexData.VertexBuffer)); newGpuSkinVertexFactoryRef.TexcoordStreamComponents.Add(new H1VertexStreamComponent(H1VertexStreamSematicType.Texcoord, H1VertexElementType.Float2, currOffset++)); break; } case H1SkeletalMeshVertexDataInterface.VertexDataType.Color: { H1SkeletalMeshVertexData <Vector4> colorVertexData = skeletalMeshVertexData as H1SkeletalMeshVertexData <Vector4>; newGpuSkinVertexFactoryRef.ShaderData.ColorBuffer = H1VertexBuffer.ProcessVertexBuffer(colorVertexData.VertexBuffer); newGpuSkinVertexFactoryRef.ColorStreamComponent = new H1VertexStreamComponent(H1VertexStreamSematicType.Color, H1VertexElementType.Float4, currOffset++); break; } } } // generate RHIVertexFormat Declaration newGpuSkinVertexFactoryRef.GenerateVertexDeclaration(); skelChunkIndex++; } // add index buffer (containing multiple skeletal mesh chunks's indices) List <UInt32> indices = SkeletalMesh.SkeletalMeshResource.GetLODModel(0).MultiSizeIndexContainer.Indices; UInt32 bufferSize = Convert.ToUInt32(Utilities.SizeOf <UInt32>() * indices.Count); skeletalMeshObjectLOD_0.IndexBuffer = H1Global <H1ManagedRenderer> .Instance.CreateIndexBuffer(bufferSize); // write indices data skeletalMeshObjectLOD_0.IndexBuffer.WriteData(indices.ToArray()); return(true); }