import ../scene/[scene_object
, scene_utils
, scene_record
, main_scenes
]
, ../vk/[ vulkan
, vkTypes
, vulkan_record
]
, ../drawable/[ shape_object
, text
]
, ../wain/keyboard
, glm
import ../drawable/text as mText
import ../drawable/shape_object
type
MenuState = enum Begin, Exit
var
ms = MenuState.Begin
#TODO proper dynamic resolution scaling of UI elements
proc load*( rec: var Vulkan_Record
, title: var Scene
, scene_record: var Scene_Record
) =
#[ title.add rec.anSDFText(title, "title", str = "Shapes", size = 18)
title.add rec.anSDFText(title, "begin", str = "begin", size = 14)
title.add rec.anSDFText(title, "exit", str = "exit", size = 14)
title.add rec.a_shape( title.render_pass
, title.current_entity_id
, 4
, "settingsFrame"
, hollow = true
, theSize = 100
)
title.the_text("title").move_to( 150
, 40
)
title.the_text("begin").move_to( 900
, 70
)
title.the_text("exit").move_to( 1600
, 70
)
title.the_text("title").updateFS( outlined = 0.0)
echo rec.swapchain.current_extent.width
title.the_shape("settingsFrame").move_to( rec.swapchain.current_extent.width.float32 / 2
, ((rec.swapchain.current_extent.height.int / 2) + 100 ).float32
)
title.the_shape("settingsFrame").scale( 8
, 4
) ]#
#$title.the_shape("settingsFrame").ubo.model.scale(50)
scene_record.add_scene( addr title
, "title"
)
#TODO: switching states is kinda buggy
proc input*( rec: var Vulkan_Record
, sr: var Scene_Record
) =
if WAIN_Key.Up.is_down or
WAIN_Key.Right.is_down:
case ms
of MenuState.Begin: inc ms
of MenuState.Exit: ms = MenuState.Begin
if WAIN_Key.Down.is_down or
WAIN_Key.Left.is_down:
case ms
of MenuState.Begin: ms = MenuState.Exit
of MenuState.Exit: dec ms
if WAIN_Key.Enter.is_down:
case ms
#of MenuState.Begin: sr.the_main_scene = Main_Scene_Enum.Intro
of MenuState.Exit: quit()
else: discard
proc update*( rec: var Vulkan_Record
, menu: var Scene
) = discard
#[ case ms
of MenuState.Begin:
menu.the_text("begin").updateFS( outlined = 0.1
)
menu.the_text("exit").updateFS( outlined = 0.0)
of MenuState.Exit:
menu.the_text("begin").updateFS( outlined = 0.0)
menu.the_text("exit").updateFS( outlined = 0.1) ]#
proc build_scene*( rec: var Vulkan_Record
, scene: var Scene
) =
var
cmdBufInfo: VkCommandBufferBeginInfo
scissor: VkRect2D
clearValues: array[2,VkClearValue]
renderPassBeginInfo: VkRenderPassBeginInfo
scissor.extent.width = uint32 rec.swapchain.current_extent.width
scissor.extent.height = uint32 rec.swapchain.current_extent.height
scissor.offset.x = 0
scissor.offset.y = 0
cmdBufInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO
cmdBufInfo.pNext = nil
clearValues[0].color = VkClearColorValue(float32: [0f, 0f, 0f, 1f])
clearValues[1].depth_stencil = VkClearDepthStencilValue(depth: 1.0f, stencil: 0 )
renderPassBeginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO
renderPassBeginInfo.pNext = nil
renderPassBeginInfo.renderArea.offset.x = 0
renderPassBeginInfo.renderArea.offset.y = 0
renderPassBeginInfo.renderArea.extent.width = uint32 rec.swapchain.current_extent.width
renderPassBeginInfo.renderArea.extent.height = uint32 rec.swapchain.current_extent.height
renderPassBeginInfo.clearValueCount = 2
renderPassBeginInfo.pClearValues = addr clearValues[0]
#renderPassBeginInfo.render_pass = scene.render_pass
renderPassBeginInfo.framebuffer = rec.frame_buffers[rec.currentFrameBuffer]
discard vkBeginCommandBuffer(rec.draw_command_buffers[rec.currentFrameBuffer], addr cmdBufInfo)
vkCmdBeginRenderPass(rec.draw_command_buffers[rec.currentFrameBuffer], addr renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE)
vkCmdSetViewport(rec.draw_command_buffers[rec.currentFrameBuffer], 0, 1, addr rec.current_viewport)
vkCmdSetScissor(rec.draw_command_buffers[rec.currentFrameBuffer], 0, 1, addr scissor)
#[ for shape in scene.shapes.mitems:
rec.buildCommandBuffers shape, scene.render_pass, int rec.currentFrameBuffer
for text in scene.texts.mitems:
mtext.buildCommandBuffers rec, text, scene.render_pass, int rec.currentFrameBuffer ]#
vkCmdEndRenderPass(rec.draw_command_buffers[rec.currentFrameBuffer])
discard vkEndCommandBuffer(rec.draw_command_buffers[rec.currentFrameBuffer])
rec.readyFrame = true