{.experimental: "parallel".} import ../scene/[ scene_object , scene_utils , scene_record ] , ../vk/[ vulkan , vkTypes , vulkan_record , graphics_pipeline , pipeline_record , buffer , gpu , vulkan_utils ] , ../drawable/[ shape_object , shape_types , plane , colors , grid ] , ../drawable/text as mText , ../deshn_entity/[ being , actions ] , glm , strUtils , ../wain/keyboard , ../camera , std/tables , ../state_machine , options proc load*( vulkan_record: var Vulkan_Record , pipeline_record: Pipeline_Record , intro: var Scene , scene_record: var Scene_Record ) = discard #intro.the_deshn_being("protag").main_state_machine.current_state = some Main_Deshn_Being_States.Idle proc input*( vulkan_record: var Vulkan_Record , sr: var Scene_Record ) = discard proc update*( vulkan_record: var Vulkan_Record , intro: var Scene , sr: var Scene_Record , fps: string ) = var protag = intro.the_deshn_being("protag") # plane = intro.the_plane("plane0") #[ if WAIN_Key.K3.is_down_or_held: plane.shape.camera.position_is vec3f( plane.shape.camera.position.xy , plane.shape.camera.position.z + 0.1 ) if WAIN_Key.K4.is_down_or_held: plane.shape.camera.position_is vec3f( plane.shape.camera.position.xy , plane.shape.camera.position.z - 0.1 ) ]# if WAIN_Key.Comma.is_up and WAIN_Key.O.is_up and WAIN_Key.A.is_up and WAIN_Key.E.is_up and not protag.recovering: protag.current_state_is Not_Moving if not protag.deshn_pool_is_full and not protag.recovering: # echo "NOT moving, adding." protag.add_amount_to_deshn_pool 0.03 else: #echo "can't add because: " , protag.deshn_pool_is_full, " <> ", protag.recovering discard if protag.recovering: #echo "RECOVERING: ", protag.current_deshn_pool_recovery_pool protag.add_amount_to_recovery_pool 0.01 proc build_command_buffers*( draw_command_buffer: var VkCommandBuffer , scene: var Scene , graphics_pipeline: Graphics_Pipeline , descriptor_set: VkDescriptorSet , gpu: GPU , vulkan_record: var Vulkan_Record , indirect_command_buffer: var Buffer ) = var command_buffer_info = VkCommandBufferBeginInfo(sType: VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO) scissor: VkRect2D clearValues: array[2,VkClearValue] render_pass_info: VkRenderPassBeginInfo offsets = VkDeviceSize 0 viewport = VkViewport( width: float32 vulkan_record.swapchain.current_extent.width , height: float32 vulkan_record.swapchain.current_extent.height , minDepth: 0.0f , maxDepth: 1.0f ) scissor.extent.width = uint32 vulkan_record.swapchain.current_extent.width scissor.extent.height = uint32 vulkan_record.swapchain.current_extent.height scissor.offset.x = 0 scissor.offset.y = 0 clearValues[0].color = VkClearColorValue(float32: [0f, 0f, 0f, 1f]) clearValues[1].depth_stencil = VkClearDepthStencilValue(depth: 1.0f, stencil: 0 ) render_pass_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO render_pass_info.pNext = nil render_pass_info.renderArea.offset.x = 0 render_pass_info.renderArea.offset.y = 0 render_pass_info.renderArea.extent.width = uint32 vulkan_record.swapchain.current_extent.width render_pass_info.renderArea.extent.height = uint32 vulkan_record.swapchain.current_extent.height render_pass_info.clearValueCount = 2 render_pass_info.pClearValues = addr clearValues[0] #render_pass_info.render_pass = scene.render_pass for i in 0 .. vulkan_record.draw_command_buffers.len: render_pass_info.framebuffer = vulkan_record.frame_buffers[i] discard vkBeginCommandBuffer( vulkan_record.draw_command_buffers[i] , addr command_buffer_info ) vkCmdBeginRenderPass( vulkan_record.draw_command_buffers[i] , addr render_pass_info , VK_SUBPASS_CONTENTS_INLINE ) vkCmdSetViewport( vulkan_record.draw_command_buffers[i] , 0 , 1 , addr vulkan_record.current_viewport ) vkCmdSetScissor( vulkan_record.draw_command_buffers[i] , 0 , 1 , addr scissor ) vkCmdBindDescriptorSets( vulkan_record.draw_command_buffers[i] , VK_PIPELINE_BIND_POINT_GRAPHICS , graphics_pipeline.pipeline_layout , 0 , 1 , addr descriptor_set , 0, nil ) vkCmdBindPipeline( vulkan_record.draw_command_buffers[i] , VK_PIPELINE_BIND_POINT_GRAPHICS , graphics_pipeline.pipeline ) vkCmdSetLineWidth(vulkan_record.draw_command_buffers[i], 1) vkCmdBindVertexBuffers( vulkan_record.draw_command_buffers[i] , 0 , 1 , addr scene.vertex_buffer.vk_buffer , addr offsets ) vkCmdBindIndexBuffer( vulkan_record.draw_command_buffers[i] , scene.index_buffer.vk_buffer , VkDeviceSize 0 , VK_INDEX_TYPE_UINT32 ) #[ vkCmdPushConstants( draw_command_buffer , graphics_pipeline.pipeline_layout , VKShaderStageFlags VK_SHADER_STAGE_VERTEX_BIT.ord or VK_SHADER_STAGE_FRAGMENT_BIT.ord , uint32 0 , uint32 sizeof Shape_Pushes , cast[pointer] ( addr push_constants ) ) ]# if gpu.features.multiDrawIndirect.bool: vkCmdDrawIndexedIndirect( vulkan_record.draw_command_buffers[i] , indirect_command_buffer.vk_buffer , VkDeviceSize 0 , uint32 scene.indirect_commands.len , uint32 sizeof(VkDrawIndexedIndirectCommand) ) vkCmdEndRenderPass( vulkan_record.draw_command_buffers[i] ) discard vkEndCommandBuffer( vulkan_record.draw_command_buffers[i] ) #shape.camera.updateAR(60, vulkan_record.swapchain.current_extent.width.float / float vulkan_record.swapchain.current_extent.height ) #vulkan_record.readyFrame = true proc build_scene*( vulkan_record: var Vulkan_Record , scene: var Scene , pipeline_record: Pipeline_Record ) = vulkan_record.readyFrame = true