625 {
626 if (cmd == VK_NULL_HANDLE || pipeline == VK_NULL_HANDLE || pipelineLayout == VK_NULL_HANDLE) {
627 return;
628 }
629 if (imageIndex >= uniformBuffersMapped.size() || descriptorSets.empty() || vertexBuffer == VK_NULL_HANDLE || indexBuffer == VK_NULL_HANDLE) {
630 return;
631 }
632
634 uniforms.
view = view;
635 uniforms.proj = proj;
636 uniforms.fx = fx;
637 std::memcpy(uniformBuffersMapped[imageIndex], &uniforms,
sizeof(
PillarUniforms));
638
639 vkCmdBindPipeline(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
640 vkCmdBindDescriptorSets(cmd,
641 VK_PIPELINE_BIND_POINT_GRAPHICS,
642 pipelineLayout,
643 0,
644 1,
645 &descriptorSets[imageIndex],
646 0,
647 nullptr);
648
649 const VkDeviceSize offset = 0;
650 vkCmdBindVertexBuffers(cmd, 0, 1, &vertexBuffer, &offset);
651 vkCmdBindIndexBuffer(cmd, indexBuffer, 0, VK_INDEX_TYPE_UINT32);
652
653 for (const PillarInstance &pillar : pillars) {
654
655
656
657 constexpr float baseSink = 0.02f;
658 glm::mat4 model = glm::translate(glm::mat4(1.0f), glm::vec3(pillar.position.x, pillar.position.y - baseSink, pillar.position.z));
659 model = glm::scale(model, glm::vec3(pillar.radius, pillar.height, pillar.radius));
660 vkCmdPushConstants(cmd, pipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(glm::mat4), &model);
661 vkCmdDrawIndexed(cmd, indexCount, 1, 0, 0, 0);
662 }
663 }