annotate src/zamikongine/mesh.nim @ 20:beb86492b178

add: generate ubermeshes
author Sam <sam@basx.dev>
date Tue, 10 Jan 2023 00:23:40 +0700
parents b55d6ecde79d
children 94c38e4b5782
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
19
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
1 import std/typetraits
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
2
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
3 import ./vulkan
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
4 import ./thing
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
5 import ./buffer
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
6 import ./vertex
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
7
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
8 type
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
9 Mesh*[T] = object of Part
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
10 vertexData*: T
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
11 IndexedMesh*[T: object, U: uint16|uint32] = object of Part
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
12 vertexData*: T
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
13 indices*: seq[array[3, U]]
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
14
20
beb86492b178 add: generate ubermeshes
Sam <sam@basx.dev>
parents: 19
diff changeset
15 func createUberMesh*[T](meshes: openArray[Mesh[T]]): Mesh[T] =
beb86492b178 add: generate ubermeshes
Sam <sam@basx.dev>
parents: 19
diff changeset
16 for mesh in meshes:
beb86492b178 add: generate ubermeshes
Sam <sam@basx.dev>
parents: 19
diff changeset
17 for srcname, srcvalue in mesh.vertexData.fieldPairs:
beb86492b178 add: generate ubermeshes
Sam <sam@basx.dev>
parents: 19
diff changeset
18 when typeof(srcvalue) is VertexAttribute:
beb86492b178 add: generate ubermeshes
Sam <sam@basx.dev>
parents: 19
diff changeset
19 for dstname, dstvalue in result.vertexData.fieldPairs:
beb86492b178 add: generate ubermeshes
Sam <sam@basx.dev>
parents: 19
diff changeset
20 when srcname == dstname:
beb86492b178 add: generate ubermeshes
Sam <sam@basx.dev>
parents: 19
diff changeset
21 dstvalue.data.add srcvalue.data
beb86492b178 add: generate ubermeshes
Sam <sam@basx.dev>
parents: 19
diff changeset
22
beb86492b178 add: generate ubermeshes
Sam <sam@basx.dev>
parents: 19
diff changeset
23 func createUberMesh*[T: object, U: uint16|uint32](meshes: openArray[IndexedMesh[T, U]]): IndexedMesh[T, U] =
beb86492b178 add: generate ubermeshes
Sam <sam@basx.dev>
parents: 19
diff changeset
24 var indexoffset = U(0)
beb86492b178 add: generate ubermeshes
Sam <sam@basx.dev>
parents: 19
diff changeset
25 for mesh in meshes:
beb86492b178 add: generate ubermeshes
Sam <sam@basx.dev>
parents: 19
diff changeset
26 for srcname, srcvalue in mesh.vertexData.fieldPairs:
beb86492b178 add: generate ubermeshes
Sam <sam@basx.dev>
parents: 19
diff changeset
27 when typeof(srcvalue) is VertexAttribute:
beb86492b178 add: generate ubermeshes
Sam <sam@basx.dev>
parents: 19
diff changeset
28 for dstname, dstvalue in result.vertexData.fieldPairs:
beb86492b178 add: generate ubermeshes
Sam <sam@basx.dev>
parents: 19
diff changeset
29 when srcname == dstname:
beb86492b178 add: generate ubermeshes
Sam <sam@basx.dev>
parents: 19
diff changeset
30 dstvalue.data.add srcvalue.data
beb86492b178 add: generate ubermeshes
Sam <sam@basx.dev>
parents: 19
diff changeset
31 var indexdata: seq[array[3, U]]
beb86492b178 add: generate ubermeshes
Sam <sam@basx.dev>
parents: 19
diff changeset
32 for i in mesh.indices:
beb86492b178 add: generate ubermeshes
Sam <sam@basx.dev>
parents: 19
diff changeset
33 indexdata.add [i[0] + indexoffset, i[1] + indexoffset, i[2] + indexoffset]
beb86492b178 add: generate ubermeshes
Sam <sam@basx.dev>
parents: 19
diff changeset
34 result.indices.add indexdata
beb86492b178 add: generate ubermeshes
Sam <sam@basx.dev>
parents: 19
diff changeset
35 indexoffset += U(mesh.vertexData.VertexCount)
beb86492b178 add: generate ubermeshes
Sam <sam@basx.dev>
parents: 19
diff changeset
36
19
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
37 func getVkIndexType[T: object, U: uint16|uint32](m: IndexedMesh[T, U]): VkIndexType =
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
38 when U is uint16: VK_INDEX_TYPE_UINT16
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
39 elif U is uint32: VK_INDEX_TYPE_UINT32
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
40
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
41 proc createVertexBuffers*[M: Mesh|IndexedMesh](
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
42 mesh: var M,
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
43 device: VkDevice,
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
44 physicalDevice: VkPhysicalDevice,
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
45 commandPool: VkCommandPool,
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
46 queue: VkQueue,
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
47 useDeviceLocalBuffer: bool = true # decides if data is transfered to the fast device-local memory or not
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
48 ): (seq[Buffer], uint32) =
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
49 result[1] = mesh.vertexData.VertexCount
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
50 for name, value in mesh.vertexData.fieldPairs:
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
51 when typeof(value) is VertexAttribute:
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
52 assert value.data.len > 0
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
53 var flags = if useDeviceLocalBuffer: {TransferSrc} else: {VertexBuffer}
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
54 var stagingBuffer = device.InitBuffer(physicalDevice, value.datasize, flags, {VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, VK_MEMORY_PROPERTY_HOST_COHERENT_BIT})
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
55 var d: pointer
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
56 stagingBuffer.withMapping(d):
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
57 copyMem(d, addr(value.data[0]), value.datasize)
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
58
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
59 if useDeviceLocalBuffer:
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
60 var finalBuffer = device.InitBuffer(physicalDevice, value.datasize, {TransferDst, VertexBuffer}, {VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT})
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
61 copyBuffer(commandPool, queue, stagingBuffer, finalBuffer, value.datasize)
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
62 stagingBuffer.trash()
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
63 result[0].add(finalBuffer)
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
64 else:
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
65 result[0].add(stagingBuffer)
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
66
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
67 proc createIndexBuffer*(
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
68 mesh: var IndexedMesh,
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
69 device: VkDevice,
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
70 physicalDevice: VkPhysicalDevice,
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
71 commandPool: VkCommandPool,
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
72 queue: VkQueue,
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
73 useDeviceLocalBuffer: bool = true # decides if data is transfered to the fast device-local memory or not
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
74 ): Buffer =
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
75 let bufferSize = uint64(mesh.indices.len * sizeof(get(genericParams(typeof(mesh.indices)), 0)))
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
76 let flags = if useDeviceLocalBuffer: {TransferSrc} else: {IndexBuffer}
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
77
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
78 var stagingBuffer = device.InitBuffer(physicalDevice, bufferSize, flags, {VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, VK_MEMORY_PROPERTY_HOST_COHERENT_BIT})
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
79 var d: pointer
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
80 stagingBuffer.withMapping(d):
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
81 copyMem(d, addr(mesh.indices[0]), bufferSize)
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
82
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
83 if useDeviceLocalBuffer:
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
84 var finalBuffer = device.InitBuffer(physicalDevice, bufferSize, {TransferDst, IndexBuffer}, {VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT})
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
85 copyBuffer(commandPool, queue, stagingBuffer, finalBuffer, bufferSize)
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
86 stagingBuffer.trash()
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
87 return finalBuffer
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
88 else:
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
89 return stagingBuffer
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
90
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
91 proc createIndexedVertexBuffers*(
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
92 mesh: var IndexedMesh,
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
93 device: VkDevice,
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
94 physicalDevice: VkPhysicalDevice,
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
95 commandPool: VkCommandPool,
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
96 queue: VkQueue,
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
97 useDeviceLocalBuffer: bool = true # decides if data is transfered to the fast device-local memory or not
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
98 ): (seq[Buffer], Buffer, uint32, VkIndexType) =
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
99 result[0] = createVertexBuffers(mesh, device, physicalDevice, commandPool, queue, useDeviceLocalBuffer)[0]
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
100 result[1] = createIndexBuffer(mesh, device, physicalDevice, commandPool, queue, useDeviceLocalBuffer)
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
101 result[2] = uint32(mesh.indices.len * mesh.indices[0].len)
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
102
b55d6ecde79d did: introduce scene graph, meshs and generic vertex buffers
Sam <sam@basx.dev>
parents:
diff changeset
103 result[3] = getVkIndexType(mesh)