annotate tests/test_gltf.nim @ 1253:c4f98eb4bb05

fix: a few things
author sam <sam@basx.dev>
date Fri, 26 Jul 2024 23:39:24 +0700
parents 3f98ad20a9d3
children b0f4c8ccd49a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1247
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
1 import std/os
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
2 import std/sequtils
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
3 import std/monotimes
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
4 import std/times
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
5 import std/options
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
6 import std/random
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
7
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
8 import ../semiconginev2
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
9
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
10 proc test_gltf(time: float32) =
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
11 var renderdata = InitRenderData()
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
12
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
13 type
1253
c4f98eb4bb05 fix: a few things
sam <sam@basx.dev>
parents: 1251
diff changeset
14 ObjectData = object
c4f98eb4bb05 fix: a few things
sam <sam@basx.dev>
parents: 1251
diff changeset
15 transform: Mat4
c4f98eb4bb05 fix: a few things
sam <sam@basx.dev>
parents: 1251
diff changeset
16 Camera = object
c4f98eb4bb05 fix: a few things
sam <sam@basx.dev>
parents: 1251
diff changeset
17 view: Mat4
c4f98eb4bb05 fix: a few things
sam <sam@basx.dev>
parents: 1251
diff changeset
18 perspective: Mat4
1247
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
19 Material = object
1248
317bb5a73606 did: continue on gltf importer
sam <sam@basx.dev>
parents: 1247
diff changeset
20 color: Vec4f = NewVec4f(1, 1, 1, 1)
1247
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
21 colorTexture: int32 = -1
1248
317bb5a73606 did: continue on gltf importer
sam <sam@basx.dev>
parents: 1247
diff changeset
22 metallic: float32 = 0
317bb5a73606 did: continue on gltf importer
sam <sam@basx.dev>
parents: 1247
diff changeset
23 roughness: float32 = 0
1247
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
24 metallicRoughnessTexture: int32 = -1
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
25
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
26 normalTexture: int32 = -1
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
27 occlusionTexture: int32 = -1
1248
317bb5a73606 did: continue on gltf importer
sam <sam@basx.dev>
parents: 1247
diff changeset
28 emissive: Vec4f = NewVec4f(0, 0, 0, 0)
1247
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
29 emissiveTexture: int32 = -1
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
30 MainDescriptors = object
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
31 material: GPUValue[Material, UniformBuffer]
1253
c4f98eb4bb05 fix: a few things
sam <sam@basx.dev>
parents: 1251
diff changeset
32 camera: GPUValue[Camera, UniformBufferMapped]
1247
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
33 Shader = object
1253
c4f98eb4bb05 fix: a few things
sam <sam@basx.dev>
parents: 1251
diff changeset
34 objectData {.PushConstantAttribute.}: ObjectData
1247
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
35 position {.VertexAttribute.}: Vec3f
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
36 uv {.VertexAttribute.}: Vec2f
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
37 fragmentColor {.Pass.}: Vec4f
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
38 fragmentUv {.Pass.}: Vec2f
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
39 outColor {.ShaderOutput.}: Vec4f
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
40 descriptors {.DescriptorSets.}: (MainDescriptors, )
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
41 # code
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
42 vertexCode: string = """
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
43 void main() {
1249
d83726af7abb did: first triangles getting loaded from gltf
sam <sam@basx.dev>
parents: 1248
diff changeset
44 fragmentColor = vec4(1, 1, 1, 1);
1247
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
45 fragmentUv = uv;
1253
c4f98eb4bb05 fix: a few things
sam <sam@basx.dev>
parents: 1251
diff changeset
46 gl_Position = vec4(position, 1) * camera.perspective * camera.view;
1247
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
47 }"""
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
48 fragmentCode: string = """void main() { outColor = fragmentColor;}"""
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
49 Mesh = object
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
50 position: GPUArray[Vec3f, VertexBuffer]
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
51 uv: GPUArray[Vec2f, VertexBuffer]
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
52
1251
3f98ad20a9d3 add: render by-node instead of by-mesh
sam <sam@basx.dev>
parents: 1249
diff changeset
53 var gltfData = LoadMeshes[Mesh, Material](
1247
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
54 "town.glb",
1248
317bb5a73606 did: continue on gltf importer
sam <sam@basx.dev>
parents: 1247
diff changeset
55 MeshAttributeNames(
317bb5a73606 did: continue on gltf importer
sam <sam@basx.dev>
parents: 1247
diff changeset
56 POSITION: "position",
1249
d83726af7abb did: first triangles getting loaded from gltf
sam <sam@basx.dev>
parents: 1248
diff changeset
57 TEXCOORD: @["uv"],
d83726af7abb did: first triangles getting loaded from gltf
sam <sam@basx.dev>
parents: 1248
diff changeset
58 ),
1248
317bb5a73606 did: continue on gltf importer
sam <sam@basx.dev>
parents: 1247
diff changeset
59 MaterialAttributeNames(
317bb5a73606 did: continue on gltf importer
sam <sam@basx.dev>
parents: 1247
diff changeset
60 baseColorFactor: "color",
317bb5a73606 did: continue on gltf importer
sam <sam@basx.dev>
parents: 1247
diff changeset
61 baseColorTexture: "colorTexture",
317bb5a73606 did: continue on gltf importer
sam <sam@basx.dev>
parents: 1247
diff changeset
62 metallicFactor: "metallic",
317bb5a73606 did: continue on gltf importer
sam <sam@basx.dev>
parents: 1247
diff changeset
63 roughnessFactor: "roughness",
317bb5a73606 did: continue on gltf importer
sam <sam@basx.dev>
parents: 1247
diff changeset
64 metallicRoughnessTexture: "metallicRoughnessTexture",
317bb5a73606 did: continue on gltf importer
sam <sam@basx.dev>
parents: 1247
diff changeset
65 normalTexture: "normalTexture",
317bb5a73606 did: continue on gltf importer
sam <sam@basx.dev>
parents: 1247
diff changeset
66 occlusionTexture: "occlusionTexture",
317bb5a73606 did: continue on gltf importer
sam <sam@basx.dev>
parents: 1247
diff changeset
67 emissiveTexture: "emissiveTexture",
317bb5a73606 did: continue on gltf importer
sam <sam@basx.dev>
parents: 1247
diff changeset
68 emissiveFactor: "emissive",
317bb5a73606 did: continue on gltf importer
sam <sam@basx.dev>
parents: 1247
diff changeset
69 )
1247
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
70 )
1253
c4f98eb4bb05 fix: a few things
sam <sam@basx.dev>
parents: 1251
diff changeset
71 var descriptors = asDescriptorSet(
c4f98eb4bb05 fix: a few things
sam <sam@basx.dev>
parents: 1251
diff changeset
72 MainDescriptors(
c4f98eb4bb05 fix: a few things
sam <sam@basx.dev>
parents: 1251
diff changeset
73 camera: asGPUValue(Camera(
c4f98eb4bb05 fix: a few things
sam <sam@basx.dev>
parents: 1251
diff changeset
74 view: Unit4,
c4f98eb4bb05 fix: a few things
sam <sam@basx.dev>
parents: 1251
diff changeset
75 perspective: Unit4,
c4f98eb4bb05 fix: a few things
sam <sam@basx.dev>
parents: 1251
diff changeset
76 ), UniformBufferMapped)
c4f98eb4bb05 fix: a few things
sam <sam@basx.dev>
parents: 1251
diff changeset
77 )
c4f98eb4bb05 fix: a few things
sam <sam@basx.dev>
parents: 1251
diff changeset
78 )
1251
3f98ad20a9d3 add: render by-node instead of by-mesh
sam <sam@basx.dev>
parents: 1249
diff changeset
79 for mesh in mitems(gltfData.meshes):
1249
d83726af7abb did: first triangles getting loaded from gltf
sam <sam@basx.dev>
parents: 1248
diff changeset
80 for primitive in mitems(mesh):
d83726af7abb did: first triangles getting loaded from gltf
sam <sam@basx.dev>
parents: 1248
diff changeset
81 renderdata.AssignBuffers(primitive[0])
1253
c4f98eb4bb05 fix: a few things
sam <sam@basx.dev>
parents: 1251
diff changeset
82 renderdata.AssignBuffers(descriptors)
1247
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
83
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
84 var pipeline = CreatePipeline[Shader](renderPass = vulkan.swapchain.renderPass)
1253
c4f98eb4bb05 fix: a few things
sam <sam@basx.dev>
parents: 1251
diff changeset
85 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], descriptors)
c4f98eb4bb05 fix: a few things
sam <sam@basx.dev>
parents: 1251
diff changeset
86 renderdata.FlushAllMemory()
1247
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
87
1251
3f98ad20a9d3 add: render by-node instead of by-mesh
sam <sam@basx.dev>
parents: 1249
diff changeset
88 proc drawNode(commandbuffer: VkCommandBuffer, pipeline: Pipeline, nodeId: int, transform: Mat4 = Unit4) =
3f98ad20a9d3 add: render by-node instead of by-mesh
sam <sam@basx.dev>
parents: 1249
diff changeset
89 let nodeTransform = gltfData.nodes[nodeId].transform * transform
3f98ad20a9d3 add: render by-node instead of by-mesh
sam <sam@basx.dev>
parents: 1249
diff changeset
90 if gltfData.nodes[nodeId].mesh >= 0:
3f98ad20a9d3 add: render by-node instead of by-mesh
sam <sam@basx.dev>
parents: 1249
diff changeset
91 for primitive in gltfData.meshes[gltfData.nodes[nodeId].mesh]:
1253
c4f98eb4bb05 fix: a few things
sam <sam@basx.dev>
parents: 1251
diff changeset
92 RenderWithPushConstant(commandbuffer = commandbuffer, pipeline = pipeline, mesh = primitive[0], pushConstant = ObjectData(transform: nodeTransform))
1251
3f98ad20a9d3 add: render by-node instead of by-mesh
sam <sam@basx.dev>
parents: 1249
diff changeset
93 for childNode in gltfData.nodes[nodeId].children:
3f98ad20a9d3 add: render by-node instead of by-mesh
sam <sam@basx.dev>
parents: 1249
diff changeset
94 drawNode(commandbuffer = commandbuffer, pipeline = pipeline, nodeId = childNode, transform = nodeTransform)
3f98ad20a9d3 add: render by-node instead of by-mesh
sam <sam@basx.dev>
parents: 1249
diff changeset
95
3f98ad20a9d3 add: render by-node instead of by-mesh
sam <sam@basx.dev>
parents: 1249
diff changeset
96
1247
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
97 var start = getMonoTime()
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
98 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
99
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
100 WithNextFrame(framebuffer, commandbuffer):
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
101
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
102 WithRenderPass(vulkan.swapchain.renderPass, framebuffer, commandbuffer, vulkan.swapchain.width, vulkan.swapchain.height, NewVec4f(0, 0, 0, 0)):
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
103
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
104 WithPipeline(commandbuffer, pipeline):
1253
c4f98eb4bb05 fix: a few things
sam <sam@basx.dev>
parents: 1251
diff changeset
105 WithBind(commandbuffer, (descriptors, ), pipeline):
c4f98eb4bb05 fix: a few things
sam <sam@basx.dev>
parents: 1251
diff changeset
106 for nodeId in gltfData.scenes[0]:
c4f98eb4bb05 fix: a few things
sam <sam@basx.dev>
parents: 1251
diff changeset
107 drawNode(commandbuffer = commandbuffer, pipeline = pipeline, nodeId = nodeId)
1247
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
108
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
109 # cleanup
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
110 checkVkResult vkDeviceWaitIdle(vulkan.device)
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
111 DestroyPipeline(pipeline)
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
112 DestroyRenderData(renderdata)
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
113 when isMainModule:
1249
d83726af7abb did: first triangles getting loaded from gltf
sam <sam@basx.dev>
parents: 1248
diff changeset
114 var time = 5'f32
1247
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
115 InitVulkan()
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
116
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
117 var renderpass = CreateDirectPresentationRenderPass(depthBuffer = true, samples = VK_SAMPLE_COUNT_4_BIT)
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
118 SetupSwapchain(renderpass = renderpass)
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
119
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
120 # tests a simple triangle with minimalistic shader and vertex format
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
121 test_gltf(time)
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
122
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
123 checkVkResult vkDeviceWaitIdle(vulkan.device)
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
124 vkDestroyRenderPass(vulkan.device, renderpass.vk, nil)
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
125 ClearSwapchain()
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
126
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents:
diff changeset
127 DestroyVulkan()