1549 {
1550 if (cmd == VK_NULL_HANDLE || pipeline == VK_NULL_HANDLE || pipelineLayout == VK_NULL_HANDLE) {
1551 return;
1552 }
1553 if (imageIndex >= uniformBuffersMapped.size() || descriptorSets.empty() || vertexBuffer == VK_NULL_HANDLE || indexBuffer == VK_NULL_HANDLE) {
1554 return;
1555 }
1556
1558 uniforms.
view = view;
1559 uniforms.proj = proj;
1560 uniforms.fx = fx;
1561 std::memcpy(uniformBuffersMapped[imageIndex], &uniforms,
sizeof(
WallUniforms));
1562
1563 vkCmdBindPipeline(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
1564 vkCmdBindDescriptorSets(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSets[imageIndex], 0, nullptr);
1565
1566 const VkDeviceSize offset = 0;
1567 vkCmdBindVertexBuffers(cmd, 0, 1, &vertexBuffer, &offset);
1568 vkCmdBindIndexBuffer(cmd, indexBuffer, 0, VK_INDEX_TYPE_UINT32);
1569
1570 const float thickness = std::max(0.02f, wallThickness);
1571
1572
1573 const float wallOverlap = thickness * 0.55f;
1574 for (const WallSegment &segment : walls) {
1575 const glm::vec3 center = (segment.start + segment.end) * 0.5f;
1576 const glm::vec3 span = segment.end - segment.start;
1577 const float length = glm::length(span);
1578 if (length < 0.0001f) {
1579 continue;
1580 }
1581
1582
1583 constexpr float baseSink = 0.01f;
1584 glm::mat4 model = glm::translate(glm::mat4(1.0f), glm::vec3(center.x, -baseSink, center.z));
1585 model = glm::rotate(model, std::atan2(span.z, span.x), glm::vec3(0.0f, 1.0f, 0.0f));
1586 model = glm::scale(model, glm::vec3(length + wallOverlap * 2.0f, segment.height, thickness));
1587 vkCmdPushConstants(cmd, pipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(glm::mat4), &model);
1588 vkCmdDrawIndexed(cmd, indexCount, 1, 0, 0, 0);
1589 }
1590 }