{.experimental: "codeReordering".}
{.deadCodeElim: on.}
# TODO: when mutual dependencies are avaliable
# uncomment the scene var so we can auto-add shapes to
# the current scene again.
import ../vk/[ vulkan
, vkTypes
, vulkan_record
, buffer
, vulkan_utils
, pipeline_record
, vk_core
]
, ../camera
, shape_types
, vmath
import ../vk/vkm/vkmat as vkm
import sequtils
import shape_primitives
import std/[ bitops
, tables
]
type
ShapeKind* = enum
Tri, Quad, Penta, Hexa, Hepta, Octa, Ngon, Circle, Cube
Shape_Object = object of RootObj
camera*: Camera
camera_kind*: Camera_Kind = Camera_Kind.Perspective
id*: int
kind*: ShapeKind
isTextured: bool
name*: string
pipelineCache*: VkPipelineCache
#graphicsPipeline*: GraphicsPipeline
# render_pass*: VkRenderPass
indexCount*: uint32
# stVertexBuffer*: Buffer
# stIndexBuffer*: Buffer
ubo*: UBO
changed*: bool
indices*: seq[uint32]
vertices*: seq[float32]
vertSize*: uint32
indSize*: uint32
hollow*: bool
theSize*: Vec2
#push_constants*: Shape_Pushes
#using_pipelines*: seq[Graphics_Pipeline_Enum]
moving*: bool
master_vertex_buffer_offset*: Natural
Shape* = ref object of Shape_Object
proc a_shape*( vulkan_record: var Vulkan_Record
, current_enitity_id: int
#, s: var Scene # TODO: DO NOT DELET
, sides: Natural
, name: string
, the_size: Vec2
, being_color: Vec4 = vec4(1.0, 0.0, 0.0, 1.0)
, deshn_color: Vec4 = vec4(1.0, 0.0, 0.0, 1.0)
, camera_type: Camera_Kind = Ortho
, hollow: bool = false
# TODO: custom vertices and indices
# , vertices: seq[seq[seq[float32]
# , indices seq[float32]
): Shape =
result = Shape( name: name
, hollow: hollow
, id: current_enitity_id
, the_size: the_size
, camera_kind: camera_type
#[ , camera: a_camera ( (float vulkan_record.swapchain.current_extent.width) /
(float vulkan_record.swapchain.current_extent.height)
) ]#
)
case sides
of 3:
result.kind = Tri
result.indices = toSeq triIndexBuffer
result.vertices = triVertBuffer
of 4:
result.kind = Quad
result.indices = toSeq quadIndexBuffer
result.vertices = quadVertBuffer
of 5:
result.kind = Penta
result.indices = toSeq pentaIndexBuffer
result.vertices = pentaVertBuffer
of 6:
result.kind = Hexa
result.indices = toSeq hexaIndexBuffer
result.vertices = hexaVertBuffer
of 7:
result.kind = Hepta
result.indices = toSeq heptaIndexBuffer
result.vertices = heptaVertBuffer
else:
if sides > 8: quit "sides > 8, currently not handled"
else: quit "ERROR[Constructing Shape]: " & $name & ", with " & $sides & " sides NOT supported yet, try: 3..8 sides"
result.indSize = result.indices.len.uint32 * uint32.sizeof.uint32
result.vertSize = result.vertices.len.uint32 * Vertex.sizeof.uint32
suballocate_vertex_buffer( vulkan_record
, cast[pointer](addr result.vertices)
)
suballocate_index_buffer( vulkan_record
, cast[pointer](addr result.indices)
)
suballocate_uniform_buffer( vulkan_record
, cast[pointer](addr result.ubo)
)