610 {
611 if (cmd == VK_NULL_HANDLE || pipeline == VK_NULL_HANDLE || pipelineLayout == VK_NULL_HANDLE) {
612 return;
613 }
614 if (imageIndex >= uniformBuffersMapped.size() || descriptorSets.empty() || vertexBuffer == VK_NULL_HANDLE || indexBuffer == VK_NULL_HANDLE) {
615 return;
616 }
617
619 uniforms.
view = view;
620 uniforms.proj = proj;
621 uniforms.fx = fx;
622 std::memcpy(uniformBuffersMapped[imageIndex], &uniforms,
sizeof(
PillarUniforms));
623
624 vkCmdBindPipeline(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
625 vkCmdBindDescriptorSets(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSets[imageIndex], 0, nullptr);
626
627 const VkDeviceSize offset = 0;
628 vkCmdBindVertexBuffers(cmd, 0, 1, &vertexBuffer, &offset);
629 vkCmdBindIndexBuffer(cmd, indexBuffer, 0, VK_INDEX_TYPE_UINT32);
630
631 for (const PillarInstance &pillar : pillars) {
632
633
634
635 constexpr float baseSink = 0.02f;
636 glm::mat4 model = glm::translate(glm::mat4(1.0f), glm::vec3(pillar.position.x, pillar.position.y - baseSink, pillar.position.z));
637 model = glm::scale(model, glm::vec3(pillar.radius, pillar.height, pillar.radius));
638 vkCmdPushConstants(cmd, pipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(glm::mat4), &model);
639 vkCmdDrawIndexed(cmd, indexCount, 1, 0, 0, 0);
640 }
641 }