| 395 | // *********************************************************************** |
| 396 | |
| 397 | void DrawFrame(i32 w, i32 h) { |
| 398 | // TODO: Sort the draw list to minimise state changes |
| 399 | |
| 400 | // Update the global vertex buffer |
| 401 | if (pRenderState->perFrameVertexBuffer.count > 0) { |
| 402 | sg_range vtxData; |
| 403 | vtxData.ptr = (void*)pRenderState->perFrameVertexBuffer.pData; |
| 404 | vtxData.size = pRenderState->perFrameVertexBuffer.count * sizeof(VertexData); |
| 405 | sg_update_buffer(pRenderState->transientVertexBuffer, &vtxData); |
| 406 | } |
| 407 | |
| 408 | if (pRenderState->perFrameIndexBuffer.count > 0) { |
| 409 | sg_range idxData; |
| 410 | idxData.ptr = (void*)pRenderState->perFrameIndexBuffer.pData; |
| 411 | idxData.size = pRenderState->perFrameIndexBuffer.count * sizeof(u16); |
| 412 | sg_update_buffer(pRenderState->transientIndexBuffer, &idxData); |
| 413 | } |
| 414 | |
| 415 | // Draw 3D view into texture |
| 416 | { |
| 417 | sg_begin_pass(&pRenderState->passCore3DScene); |
| 418 | |
| 419 | sg_apply_viewport(0, 0, (i32)pRenderState->targetResolution.x, (i32)pRenderState->targetResolution.y, true); |
| 420 | sg_apply_scissor_rect(0, 0, (i32)pRenderState->targetResolution.x, (i32)pRenderState->targetResolution.y, true); |
| 421 | |
| 422 | for(i32 i = 0; i < pRenderState->drawList3D.count; i++) { |
| 423 | DrawCommand& cmd = pRenderState->drawList3D[i]; |
| 424 | |
| 425 | sg_pipeline& pipeline = GetPipeline(cmd.indexedDraw, cmd.type, false, cmd.cullMode); |
| 426 | sg_apply_pipeline(pipeline); |
| 427 | |
| 428 | sg_bindings bind{0}; |
| 429 | bind.vertex_buffers[0] = pRenderState->transientVertexBuffer; |
| 430 | bind.fs = { |
| 431 | .images = { pRenderState->whiteTexture }, |
| 432 | .samplers = { pRenderState->samplerNearest } |
| 433 | }; |
| 434 | |
| 435 | if (cmd.indexedDraw) { |
| 436 | bind.index_buffer = pRenderState->transientIndexBuffer; |
| 437 | bind.index_buffer_offset = cmd.indexBufferOffset; |
| 438 | } |
| 439 | |
| 440 | if (cmd.texturedDraw) { |
| 441 | bind.fs.images[0] = cmd.texture; |
| 442 | } |
| 443 | |
| 444 | sg_range vsUniforms = SG_RANGE_REF(cmd.vsUniforms); |
| 445 | sg_apply_uniforms(SG_SHADERSTAGE_VS, 0, &vsUniforms); |
| 446 | sg_range fsUniforms = SG_RANGE_REF(cmd.fsUniforms); |
| 447 | sg_apply_uniforms(SG_SHADERSTAGE_FS, 0, &fsUniforms); |
| 448 | |
| 449 | bind.vertex_buffer_offsets[0] = cmd.vertexBufferOffset; |
| 450 | sg_apply_bindings(&bind); |
| 451 | sg_draw(0, cmd.numElements, 1); |
| 452 | } |
| 453 | sg_end_pass(); |
| 454 | } |
no test coverage detected