Mercurial > games > semicongine
comparison tests/test_rendering.nim @ 1232:32a977c71ba5
fix: make matrices working correctly
| author | sam <sam@basx.dev> |
|---|---|
| date | Fri, 19 Jul 2024 20:00:15 +0700 |
| parents | 70f6c1cfe005 |
| children | 1cf698973dca |
comparison
equal
deleted
inserted
replaced
| 1231:70f6c1cfe005 | 1232:32a977c71ba5 |
|---|---|
| 1 import std/sequtils | 1 import std/sequtils |
| 2 import std/monotimes | |
| 3 import std/times | |
| 2 import std/options | 4 import std/options |
| 3 import std/random | 5 import std/random |
| 4 | 6 |
| 5 import ../semiconginev2 | 7 import ../semiconginev2 |
| 6 | 8 |
| 314 | 316 |
| 315 proc test_05_cube(nFrames: int, swapchain: var Swapchain) = | 317 proc test_05_cube(nFrames: int, swapchain: var Swapchain) = |
| 316 type | 318 type |
| 317 | 319 |
| 318 UniformData = object | 320 UniformData = object |
| 319 m: Mat4 | 321 mvp: Mat4 |
| 320 Uniforms = object | 322 Uniforms = object |
| 321 data: GPUValue[UniformData, UniformBufferMapped] | 323 data: GPUValue[UniformData, UniformBufferMapped] |
| 322 CubeShader = object | 324 CubeShader = object |
| 323 position {.VertexAttribute.}: Vec3f | 325 position {.VertexAttribute.}: Vec3f |
| 324 color {.VertexAttribute.}: Vec4f | 326 color {.VertexAttribute.}: Vec4f |
| 326 outColor {.ShaderOutput.}: Vec4f | 328 outColor {.ShaderOutput.}: Vec4f |
| 327 descriptorSets {.DescriptorSets.}: (Uniforms, ) | 329 descriptorSets {.DescriptorSets.}: (Uniforms, ) |
| 328 # code | 330 # code |
| 329 vertexCode = """void main() { | 331 vertexCode = """void main() { |
| 330 fragmentColor = color; | 332 fragmentColor = color; |
| 331 gl_Position = data.m * vec4(position, 1); | 333 gl_Position = vec4(position, 1) * data.mvp; |
| 332 }""" | 334 }""" |
| 333 fragmentCode = """void main() { | 335 fragmentCode = """void main() { |
| 334 outColor = fragmentColor; | 336 outColor = fragmentColor; |
| 335 }""" | 337 }""" |
| 336 Mesh = object | 338 Mesh = object |
| 340 | 342 |
| 341 let quad = @[ | 343 let quad = @[ |
| 342 NewVec3f(-0.5, -0.5), NewVec3f(-0.5, +0.5), NewVec3f(+0.5, +0.5), | 344 NewVec3f(-0.5, -0.5), NewVec3f(-0.5, +0.5), NewVec3f(+0.5, +0.5), |
| 343 NewVec3f(+0.5, +0.5), NewVec3f(+0.5, -0.5), NewVec3f(-0.5, -0.5), | 345 NewVec3f(+0.5, +0.5), NewVec3f(+0.5, -0.5), NewVec3f(-0.5, -0.5), |
| 344 ] | 346 ] |
| 345 proc transf(data: seq[Vec3f], m: Mat4): seq[Vec3f] = | 347 proc transf(data: seq[Vec3f], mat: Mat4): seq[Vec3f] = |
| 346 for v in data: | 348 for v in data: |
| 347 result.add m * v | 349 result.add mat * v |
| 348 | 350 |
| 349 var | 351 var |
| 350 vertices: seq[Vec3f] | 352 vertices: seq[Vec3f] |
| 351 colors: seq[Vec4f] | 353 colors: seq[Vec4f] |
| 352 normals: seq[Vec3f] | 354 normals: seq[Vec3f] |
| 397 ) | 399 ) |
| 398 AssignBuffers(renderdata, floor) | 400 AssignBuffers(renderdata, floor) |
| 399 | 401 |
| 400 var uniforms1 = asDescriptorSet( | 402 var uniforms1 = asDescriptorSet( |
| 401 Uniforms( | 403 Uniforms( |
| 402 data: asGPUValue(UniformData(m: Unit4), UniformBufferMapped) | 404 data: asGPUValue(UniformData(mvp: Unit4), UniformBufferMapped) |
| 403 ) | 405 ) |
| 404 ) | 406 ) |
| 405 AssignBuffers(renderdata, uniforms1) | 407 AssignBuffers(renderdata, uniforms1) |
| 406 | 408 |
| 407 renderdata.FlushAllMemory() | 409 renderdata.FlushAllMemory() |
| 408 | 410 |
| 409 var pipeline = CreatePipeline[CubeShader](renderPass = swapchain.renderPass) | 411 var pipeline = CreatePipeline[CubeShader](renderPass = swapchain.renderPass) |
| 410 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1) | 412 InitDescriptorSet(renderdata, pipeline.descriptorSetLayouts[0], uniforms1) |
| 411 | 413 |
| 412 var c = 0 | 414 var c = 0 |
| 415 var tStart = getMonoTime() | |
| 416 var t = tStart | |
| 413 while UpdateInputs() and c < nFrames: | 417 while UpdateInputs() and c < nFrames: |
| 414 | 418 |
| 415 uniforms1.data.data.data.m = Translate(0, 0, -2) * Rotate(PI * 2 * c.float32 / nFrames.float32, Y) * Rotate(-PI / 4, X) * Perspective(-PI / 2, GetAspectRatio(swapchain), 0.01, 100) | 419 let t = getMonoTime() - tStart |
| 420 | |
| 421 uniforms1.data.data.data.mvp = ( | |
| 422 Perspective(-PI / 2, GetAspectRatio(swapchain), 0.01, 100) * | |
| 423 Translate(0, 0, 2) * | |
| 424 Rotate(PI / 4, X) * | |
| 425 Rotate(PI * 0.5 * (t.inMicroseconds() / 1_000_000), Y) | |
| 426 ) | |
| 416 UpdateGPUBuffer(uniforms1.data.data, flush = true) | 427 UpdateGPUBuffer(uniforms1.data.data, flush = true) |
| 417 WithNextFrame(swapchain, framebuffer, commandbuffer): | 428 WithNextFrame(swapchain, framebuffer, commandbuffer): |
| 418 WithRenderPass(swapchain.renderPass, framebuffer, commandbuffer, swapchain.width, swapchain.height, NewVec4f(0, 0, 0, 0)): | 429 WithRenderPass(swapchain.renderPass, framebuffer, commandbuffer, swapchain.width, swapchain.height, NewVec4f(0, 0, 0, 0)): |
| 419 WithPipeline(commandbuffer, pipeline): | 430 WithPipeline(commandbuffer, pipeline): |
| 420 WithBind(commandbuffer, (uniforms1, ), pipeline, swapchain.currentFiF): | 431 WithBind(commandbuffer, (uniforms1, ), pipeline, swapchain.currentFiF): |
| 638 # tests multiple descriptor sets and arrays | 649 # tests multiple descriptor sets and arrays |
| 639 test_04_multiple_descriptorsets(nFrames, swapchain) | 650 test_04_multiple_descriptorsets(nFrames, swapchain) |
| 640 ]# | 651 ]# |
| 641 | 652 |
| 642 # rotating cube | 653 # rotating cube |
| 643 while true: | 654 test_05_cube(999999999, swapchain) |
| 644 test_05_cube(nFrames, swapchain) | |
| 645 | 655 |
| 646 checkVkResult vkDeviceWaitIdle(vulkan.device) | 656 checkVkResult vkDeviceWaitIdle(vulkan.device) |
| 647 vkDestroyRenderPass(vulkan.device, renderpass.vk, nil) | 657 vkDestroyRenderPass(vulkan.device, renderpass.vk, nil) |
| 648 DestroySwapchain(swapchain) | 658 DestroySwapchain(swapchain) |
| 649 | 659 |
