Mercurial > games > semicongine
comparison semicongine/renderer.nim @ 1139:114f395b9144
did: finish refactoring and updated all tests accordingly
author | sam <sam@basx.dev> |
---|---|
date | Sat, 08 Jun 2024 14:58:25 +0700 |
parents | 02e1d2658ff5 |
children | dd757eb5ca86 |
comparison
equal
deleted
inserted
replaced
1138:02e1d2658ff5 | 1139:114f395b9144 |
---|---|
61 clearColor = NewVec4f(0, 0, 0, 0), | 61 clearColor = NewVec4f(0, 0, 0, 0), |
62 backFaceCulling = true, | 62 backFaceCulling = true, |
63 vSync = false, | 63 vSync = false, |
64 inFlightFrames = 2, | 64 inFlightFrames = 2, |
65 ): Renderer = | 65 ): Renderer = |
66 assert device.vk.valid | 66 assert device.vk.Valid |
67 | 67 |
68 result.device = device | 68 result.device = device |
69 result.renderPass = device.CreateRenderPass(shaders, clearColor = clearColor, backFaceCulling = backFaceCulling) | 69 result.renderPass = device.CreateRenderPass(shaders, clearColor = clearColor, backFaceCulling = backFaceCulling) |
70 let swapchain = device.CreateSwapchain( | 70 let swapchain = device.CreateSwapchain( |
71 result.renderPass.vk, | 71 result.renderPass.vk, |
332 if renderer.scenedata[scene].shaderData[shaderPipeline.vk].uniformBuffers.len > 0: | 332 if renderer.scenedata[scene].shaderData[shaderPipeline.vk].uniformBuffers.len > 0: |
333 var dirtyMaterialAttribs: seq[string] | 333 var dirtyMaterialAttribs: seq[string] |
334 for material in renderer.scenedata[scene].materials[materialType].mitems: | 334 for material in renderer.scenedata[scene].materials[materialType].mitems: |
335 dirtyMaterialAttribs.add material.DirtyAttributes | 335 dirtyMaterialAttribs.add material.DirtyAttributes |
336 material.ClearDirtyAttributes() | 336 material.ClearDirtyAttributes() |
337 assert renderer.scenedata[scene].shaderData[shaderPipeline.vk].uniformBuffers[renderer.swapchain.currentInFlight].vk.valid | 337 assert renderer.scenedata[scene].shaderData[shaderPipeline.vk].uniformBuffers[renderer.swapchain.currentInFlight].vk.Valid |
338 if forceAll: | 338 if forceAll: |
339 for buffer in renderer.scenedata[scene].shaderData[shaderPipeline.vk].uniformBuffers: | 339 for buffer in renderer.scenedata[scene].shaderData[shaderPipeline.vk].uniformBuffers: |
340 assert buffer.vk.valid | 340 assert buffer.vk.Valid |
341 | 341 |
342 var offset = 0'u64 | 342 var offset = 0'u64 |
343 # loop over all uniforms of the shader-shaderPipeline | 343 # loop over all uniforms of the shader-shaderPipeline |
344 for uniform in shaderPipeline.Uniforms: | 344 for uniform in shaderPipeline.Uniforms: |
345 if dirty.contains(uniform.name) or dirtyMaterialAttribs.contains(uniform.name) or forceAll: # only update uniforms if necessary | 345 if dirty.contains(uniform.name) or dirtyMaterialAttribs.contains(uniform.name) or forceAll: # only update uniforms if necessary |
372 proc StartNewFrame*(renderer: var Renderer) = | 372 proc StartNewFrame*(renderer: var Renderer) = |
373 # TODO: chance for an infinity-loop? | 373 # TODO: chance for an infinity-loop? |
374 while not renderer.swapchain.AcquireNextFrame(): | 374 while not renderer.swapchain.AcquireNextFrame(): |
375 checkVkResult renderer.device.vk.vkDeviceWaitIdle() | 375 checkVkResult renderer.device.vk.vkDeviceWaitIdle() |
376 let res = renderer.swapchain.Recreate() | 376 let res = renderer.swapchain.Recreate() |
377 if not res.isSome: | 377 if res.isSome: |
378 raise newException(Exception, "Unable to recreate swapchain") | 378 var oldSwapchain = renderer.swapchain |
379 var oldSwapchain = renderer.swapchain | 379 renderer.swapchain = res.get() |
380 renderer.swapchain = res.get() | 380 checkVkResult renderer.device.vk.vkDeviceWaitIdle() |
381 checkVkResult renderer.device.vk.vkDeviceWaitIdle() | 381 oldSwapchain.Destroy() |
382 oldSwapchain.Destroy() | |
383 renderer.nextFrameReady = true | 382 renderer.nextFrameReady = true |
384 | 383 |
385 proc Render*(renderer: var Renderer, scene: Scene) = | 384 proc Render*(renderer: var Renderer, scene: Scene) = |
386 assert scene in renderer.scenedata | 385 assert scene in renderer.scenedata |
387 assert renderer.nextFrameReady, "startNewFrame() must be called before calling render()" | 386 assert renderer.nextFrameReady, "startNewFrame() must be called before calling render()" |
425 oldSwapchain.Destroy() | 424 oldSwapchain.Destroy() |
426 renderer.swapchain.currentInFlight = (renderer.swapchain.currentInFlight + 1) mod renderer.swapchain.inFlightFrames | 425 renderer.swapchain.currentInFlight = (renderer.swapchain.currentInFlight + 1) mod renderer.swapchain.inFlightFrames |
427 renderer.nextFrameReady = false | 426 renderer.nextFrameReady = false |
428 | 427 |
429 func Valid*(renderer: Renderer): bool = | 428 func Valid*(renderer: Renderer): bool = |
430 renderer.device.vk.valid | 429 renderer.device.vk.Valid |
431 | 430 |
432 proc Destroy*(renderer: var Renderer, scene: Scene) = | 431 proc Destroy*(renderer: var Renderer, scene: Scene) = |
433 checkVkResult renderer.device.vk.vkDeviceWaitIdle() | 432 checkVkResult renderer.device.vk.vkDeviceWaitIdle() |
434 var scenedata = renderer.scenedata[scene] | 433 var scenedata = renderer.scenedata[scene] |
435 | 434 |
436 for buffer in scenedata.vertexBuffers.mvalues: | 435 for buffer in scenedata.vertexBuffers.mvalues: |
437 assert buffer.vk.valid | 436 assert buffer.vk.Valid |
438 buffer.Destroy() | 437 buffer.Destroy() |
439 | 438 |
440 if scenedata.indexBuffer.vk.valid: | 439 if scenedata.indexBuffer.vk.Valid: |
441 assert scenedata.indexBuffer.vk.valid | 440 assert scenedata.indexBuffer.vk.Valid |
442 scenedata.indexBuffer.Destroy() | 441 scenedata.indexBuffer.Destroy() |
443 | 442 |
444 var destroyedTextures: seq[VkImage] | 443 var destroyedTextures: seq[VkImage] |
445 | 444 |
446 for (vkPipeline, shaderData) in scenedata.shaderData.mpairs: | 445 for (vkPipeline, shaderData) in scenedata.shaderData.mpairs: |
447 | 446 |
448 for buffer in shaderData.uniformBuffers.mitems: | 447 for buffer in shaderData.uniformBuffers.mitems: |
449 assert buffer.vk.valid | 448 assert buffer.vk.Valid |
450 buffer.Destroy() | 449 buffer.Destroy() |
451 | 450 |
452 for textures in shaderData.textures.mvalues: | 451 for textures in shaderData.textures.mvalues: |
453 for texture in textures.mitems: | 452 for texture in textures.mitems: |
454 if not destroyedTextures.contains(texture.image.vk): | 453 if not destroyedTextures.contains(texture.image.vk): |