| 80 | } |
| 81 | |
| 82 | void Mesh::Initialize(ID3D11Device* device, SDKMesh& sdkMesh, uint32 meshIdx, bool generateTangents) |
| 83 | { |
| 84 | const SDKMESH_MESH& sdkMeshData = *sdkMesh.GetMesh(meshIdx); |
| 85 | |
| 86 | uint32 indexSize = 2; |
| 87 | indexType = Mesh::Index16Bit; |
| 88 | if(sdkMesh.GetIndexType(meshIdx) == IT_32BIT) |
| 89 | { |
| 90 | indexSize = 4; |
| 91 | indexType = Mesh::Index32Bit; |
| 92 | } |
| 93 | |
| 94 | vertexStride = sdkMesh.GetVertexStride(meshIdx, 0); |
| 95 | numVertices = static_cast<uint32>(sdkMesh.GetNumVertices(meshIdx, 0)); |
| 96 | numIndices = static_cast<uint32>(sdkMesh.GetNumIndices(meshIdx)); |
| 97 | const uint32 vbIdx = sdkMeshData.VertexBuffers[0]; |
| 98 | const uint32 ibIdx = sdkMeshData.IndexBuffer; |
| 99 | |
| 100 | CreateInputElements(sdkMesh.VBElements(0)); |
| 101 | |
| 102 | vertices.resize(vertexStride * numVertices, 0); |
| 103 | memcpy(vertices.data(), sdkMesh.GetRawVerticesAt(vbIdx), vertexStride * numVertices); |
| 104 | |
| 105 | indices.resize(indexSize * numIndices, 0); |
| 106 | memcpy(indices.data(), sdkMesh.GetRawIndicesAt(ibIdx), indexSize * numIndices); |
| 107 | |
| 108 | name = sdkMeshData.Name; |
| 109 | |
| 110 | if(generateTangents) |
| 111 | GenerateTangentFrame(); |
| 112 | |
| 113 | D3D11_BUFFER_DESC bufferDesc; |
| 114 | bufferDesc.Usage = D3D11_USAGE_IMMUTABLE; |
| 115 | bufferDesc.ByteWidth = vertexStride * numVertices; |
| 116 | bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; |
| 117 | bufferDesc.CPUAccessFlags = 0; |
| 118 | bufferDesc.MiscFlags = 0; |
| 119 | bufferDesc.StructureByteStride = 0; |
| 120 | |
| 121 | D3D11_SUBRESOURCE_DATA initData; |
| 122 | initData.pSysMem = vertices.data(); |
| 123 | initData.SysMemPitch = 0; |
| 124 | initData.SysMemSlicePitch = 0; |
| 125 | DXCall(device->CreateBuffer(&bufferDesc, &initData, &vertexBuffer)); |
| 126 | |
| 127 | bufferDesc.ByteWidth = indexSize * numIndices; |
| 128 | bufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER; |
| 129 | bufferDesc.MiscFlags = 0; |
| 130 | bufferDesc.StructureByteStride = 0; |
| 131 | |
| 132 | initData.pSysMem = indices.data(); |
| 133 | DXCall(device->CreateBuffer(&bufferDesc, &initData, &indexBuffer)); |
| 134 | |
| 135 | const uint32 numSubsets = sdkMesh.GetNumSubsets(meshIdx); |
| 136 | meshParts.resize(numSubsets); |
| 137 | for(uint32 i = 0; i < numSubsets; ++i) |
| 138 | { |
| 139 | const SDKMESH_SUBSET& subset = *sdkMesh.GetSubset(meshIdx, i); |
no test coverage detected