MCPcopy Create free account
hub / github.com/DavidColson/Polybox / DrawFrame

Function DrawFrame

source/graphics.cpp:397–546  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

395// ***********************************************************************
396
397void 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 }

Callers 1

mainFunction · 0.85

Calls 2

SokolPresentFunction · 0.85
IdentityFunction · 0.85

Tested by

no test coverage detected