| 30 | #include "Renderer.h" |
| 31 | |
| 32 | SkinnedRenderMesh::SkinnedRenderMesh(const std::vector<const SimpleMesh*>& meshes) |
| 33 | { |
| 34 | PX_ASSERT_WITH_MESSAGE(meshes.size() <= MeshesCountMax, "meshes.size() have to be <= SkinnedRenderMesh::MeshesCountMax"); |
| 35 | |
| 36 | m_device = GetDeviceManager()->GetDevice(); |
| 37 | |
| 38 | // input element desc setup |
| 39 | m_inputDesc.push_back({ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }); |
| 40 | m_inputDesc.push_back({ "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }); |
| 41 | m_inputDesc.push_back({ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 24, D3D11_INPUT_PER_VERTEX_DATA, 0 }); |
| 42 | m_inputDesc.push_back({ "TEXCOORD", 1, DXGI_FORMAT_R32_UINT, 1, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }); |
| 43 | |
| 44 | // reserve VB |
| 45 | uint32_t verticesTotal = 0; |
| 46 | std::for_each(meshes.begin(), meshes.end(), [&](const SimpleMesh* c) { verticesTotal += (uint32_t)c->vertices.size(); }); |
| 47 | std::vector<SimpleMesh::Vertex> vertexBuffer; |
| 48 | vertexBuffer.reserve(verticesTotal); |
| 49 | |
| 50 | // reserve IB |
| 51 | uint32_t indicesTotal = 0; |
| 52 | std::for_each(meshes.begin(), meshes.end(), [&](const SimpleMesh* c) { indicesTotal += (uint32_t)c->indices.size(); }); |
| 53 | m_indices.reserve(indicesTotal); |
| 54 | |
| 55 | // fill VB, IB, MeshInfo |
| 56 | m_meshesInfo.resize(meshes.size()); |
| 57 | for (uint32_t meshIndex = 0; meshIndex < meshes.size(); ++meshIndex) |
| 58 | { |
| 59 | const SimpleMesh* mesh = meshes[meshIndex]; |
| 60 | MeshInfo& meshInfo = m_meshesInfo[meshIndex]; |
| 61 | |
| 62 | meshInfo.firstVertex = (uint32_t)vertexBuffer.size(); |
| 63 | vertexBuffer.insert(vertexBuffer.end(), mesh->vertices.begin(), mesh->vertices.end()); |
| 64 | meshInfo.verticesCount = (uint32_t)mesh->vertices.size(); |
| 65 | |
| 66 | meshInfo.firstIndex = (uint32_t)m_indices.size(); |
| 67 | uint32_t indexOffset = meshInfo.firstVertex; |
| 68 | for (uint32_t index : mesh->indices) |
| 69 | { |
| 70 | m_indices.push_back((uint32_t)index + indexOffset); |
| 71 | } |
| 72 | meshInfo.indicesCount = (uint32_t)mesh->indices.size(); |
| 73 | } |
| 74 | |
| 75 | // vertex buffer |
| 76 | { |
| 77 | D3D11_SUBRESOURCE_DATA vertexBufferData; |
| 78 | |
| 79 | ZeroMemory(&vertexBufferData, sizeof(vertexBufferData)); |
| 80 | vertexBufferData.pSysMem = vertexBuffer.data(); |
| 81 | |
| 82 | D3D11_BUFFER_DESC bufferDesc; |
| 83 | |
| 84 | memset(&bufferDesc, 0, sizeof(D3D11_BUFFER_DESC)); |
| 85 | bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; |
| 86 | bufferDesc.ByteWidth = (uint32_t)(sizeof(SimpleMesh::Vertex) * vertexBuffer.size()); |
| 87 | bufferDesc.CPUAccessFlags = 0; |
| 88 | bufferDesc.MiscFlags = 0; |
| 89 | bufferDesc.Usage = D3D11_USAGE_IMMUTABLE; |