From a85380fb71e4e9b312eef2a0dc119d8a98b0570c Mon Sep 17 00:00:00 2001 From: codegirl-007 Date: Sat, 1 Aug 2026 23:25:17 -0700 Subject: [PATCH 1/2] sprite batching --- engine/app.odin | 28 ++++++++++++++++++++++++---- examples/toad/main.odin | 4 ++++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/engine/app.odin b/engine/app.odin index 2e6fa31..424c83e 100644 --- a/engine/app.odin +++ b/engine/app.odin @@ -270,9 +270,13 @@ end_frame :: proc(app: ^App) { app.render_pass = sdl.BeginGPURenderPass(cmd, &color_info, 1, nil) sdl.BindGPUGraphicsPipeline(app.render_pass, app.pipeline) - for q, i in app.draw_list { + i := 0 + for i < n { + run := texture_run_len(app.draw_list[:], i) + q0 := app.draw_list[i] + sampler_binding := sdl.GPUTextureSamplerBinding { - texture = q.texture, + texture = q0.texture, sampler = app.sampler, } sdl.BindGPUFragmentSamplers(app.render_pass, 0, &sampler_binding, 1) @@ -282,9 +286,11 @@ end_frame :: proc(app: ^App) { offset = u32(i * SPRITE_VERTS_SIZE), } sdl.BindGPUVertexBuffers(app.render_pass, 0, &vb_binding, 1) - sdl.DrawGPUPrimitives(app.render_pass, SPRITE_VERT_COUNT, 1, 0, 0) - } + sdl.DrawGPUPrimitives(app.render_pass, u32(run * SPRITE_VERT_COUNT), 1, 0, 0) + + i += run + } sdl.EndGPURenderPass(app.render_pass) app.render_pass = nil @@ -418,3 +424,17 @@ create_sprite_pipeline :: proc(app: ^App) -> ^sdl.GPUGraphicsPipeline { return pipeline } + +texture_run_len :: proc(list: []Queued_Sprite, start: int) -> int { + if start < 0 || start >= len(list) do return 0 + + tex := list[start].texture + n := 1 + + for i in start + 1 ..< len(list) { + if list[i].texture != tex do break + n += 1 + } + + return n +} diff --git a/examples/toad/main.odin b/examples/toad/main.odin index ba68abe..de02712 100644 --- a/examples/toad/main.odin +++ b/examples/toad/main.odin @@ -13,6 +13,8 @@ main :: proc() { defer eng.destroy_character_data(&app, &data) toad := eng.spawn_sprite(&data, {400, 500}, "idle", 0) + toad1 := eng.spawn_sprite(&data, {250, 500}, "idle", 0) + toad2 := eng.spawn_sprite(&data, {550, 500}, "idle", 0) last := eng.now_seconds() SPEED :: f32(200) @@ -43,6 +45,8 @@ main :: proc() { eng.begin_frame(&app) eng.draw_sprite(&app, &toad) + eng.draw_sprite(&app, &toad1) + eng.draw_sprite(&app, &toad2) eng.end_frame(&app) } } From c1f3d0e61b1de3922c4b672195448995e52d513d Mon Sep 17 00:00:00 2001 From: codegirl-007 Date: Sat, 1 Aug 2026 23:27:08 -0700 Subject: [PATCH 2/2] revert example testing --- examples/toad/main.odin | 4 ---- 1 file changed, 4 deletions(-) diff --git a/examples/toad/main.odin b/examples/toad/main.odin index de02712..ba68abe 100644 --- a/examples/toad/main.odin +++ b/examples/toad/main.odin @@ -13,8 +13,6 @@ main :: proc() { defer eng.destroy_character_data(&app, &data) toad := eng.spawn_sprite(&data, {400, 500}, "idle", 0) - toad1 := eng.spawn_sprite(&data, {250, 500}, "idle", 0) - toad2 := eng.spawn_sprite(&data, {550, 500}, "idle", 0) last := eng.now_seconds() SPEED :: f32(200) @@ -45,8 +43,6 @@ main :: proc() { eng.begin_frame(&app) eng.draw_sprite(&app, &toad) - eng.draw_sprite(&app, &toad1) - eng.draw_sprite(&app, &toad2) eng.end_frame(&app) } }