1607 {
1608 if (cmd == VK_NULL_HANDLE || pipeline == VK_NULL_HANDLE || pipelineLayout == VK_NULL_HANDLE) {
1609 return;
1610 }
1611 if (imageIndex >= uniformBuffersMapped.size() || descriptorSets.empty() || vertexBuffer == VK_NULL_HANDLE || indexBuffer == VK_NULL_HANDLE) {
1612 return;
1613 }
1614
1616 uniforms.
view = view;
1617 uniforms.proj = proj;
1618 uniforms.fx = fx;
1619 std::memcpy(uniformBuffersMapped[imageIndex], &uniforms,
sizeof(
WallUniforms));
1620
1621 vkCmdBindPipeline(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
1622 vkCmdBindDescriptorSets(cmd,
1623 VK_PIPELINE_BIND_POINT_GRAPHICS,
1624 pipelineLayout,
1625 0,
1626 1,
1627 &descriptorSets[imageIndex],
1628 0,
1629 nullptr);
1630
1631 const VkDeviceSize offset = 0;
1632 vkCmdBindVertexBuffers(cmd, 0, 1, &vertexBuffer, &offset);
1633 vkCmdBindIndexBuffer(cmd, indexBuffer, 0, VK_INDEX_TYPE_UINT32);
1634
1635 const float thickness = std::max(0.02f, wallThickness);
1636
1637
1638 const float wallOverlap = thickness * 0.55f;
1639 for (const WallSegment &segment : walls) {
1640 const glm::vec3 center = (segment.start + segment.end) * 0.5f;
1641 const glm::vec3 span = segment.end - segment.start;
1642 const float length = glm::length(span);
1643 if (length < 0.0001f) {
1644 continue;
1645 }
1646
1647
1648 constexpr float baseSink = 0.01f;
1649 glm::mat4 model = glm::translate(glm::mat4(1.0f), glm::vec3(center.x, -baseSink, center.z));
1650 model = glm::rotate(model, std::atan2(span.z, span.x), glm::vec3(0.0f, 1.0f, 0.0f));
1651 model = glm::scale(model, glm::vec3(length + wallOverlap * 2.0f, segment.height, thickness));
1652 vkCmdPushConstants(cmd, pipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(glm::mat4), &model);
1653 vkCmdDrawIndexed(cmd, indexCount, 1, 0, 0, 0);
1654 }
1655 }