Compare commits
5
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
589f2bd45c | ||
|
|
c720774c79 | ||
|
|
c1f3d0e61b | ||
|
|
a85380fb71 | ||
|
|
21d2a2c0e4 |
+27
-4
@@ -35,6 +35,7 @@ App :: struct {
|
|||||||
transfer_buffer: ^sdl.GPUTransferBuffer,
|
transfer_buffer: ^sdl.GPUTransferBuffer,
|
||||||
draw_list: [dynamic]Queued_Sprite,
|
draw_list: [dynamic]Queued_Sprite,
|
||||||
clear_color: sdl.FColor,
|
clear_color: sdl.FColor,
|
||||||
|
camera: Camera,
|
||||||
}
|
}
|
||||||
|
|
||||||
Shader_Backend :: enum {
|
Shader_Backend :: enum {
|
||||||
@@ -124,6 +125,8 @@ init :: proc(app: ^App, title: cstring, width, height: i32) -> bool {
|
|||||||
|
|
||||||
app.draw_list = make([dynamic]Queued_Sprite)
|
app.draw_list = make([dynamic]Queued_Sprite)
|
||||||
|
|
||||||
|
app.camera = camera_default()
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -270,9 +273,13 @@ end_frame :: proc(app: ^App) {
|
|||||||
app.render_pass = sdl.BeginGPURenderPass(cmd, &color_info, 1, nil)
|
app.render_pass = sdl.BeginGPURenderPass(cmd, &color_info, 1, nil)
|
||||||
sdl.BindGPUGraphicsPipeline(app.render_pass, app.pipeline)
|
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 {
|
sampler_binding := sdl.GPUTextureSamplerBinding {
|
||||||
texture = q.texture,
|
texture = q0.texture,
|
||||||
sampler = app.sampler,
|
sampler = app.sampler,
|
||||||
}
|
}
|
||||||
sdl.BindGPUFragmentSamplers(app.render_pass, 0, &sampler_binding, 1)
|
sdl.BindGPUFragmentSamplers(app.render_pass, 0, &sampler_binding, 1)
|
||||||
@@ -282,9 +289,11 @@ end_frame :: proc(app: ^App) {
|
|||||||
offset = u32(i * SPRITE_VERTS_SIZE),
|
offset = u32(i * SPRITE_VERTS_SIZE),
|
||||||
}
|
}
|
||||||
sdl.BindGPUVertexBuffers(app.render_pass, 0, &vb_binding, 1)
|
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)
|
sdl.EndGPURenderPass(app.render_pass)
|
||||||
app.render_pass = nil
|
app.render_pass = nil
|
||||||
|
|
||||||
@@ -418,3 +427,17 @@ create_sprite_pipeline :: proc(app: ^App) -> ^sdl.GPUGraphicsPipeline {
|
|||||||
|
|
||||||
return pipeline
|
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
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package engine
|
||||||
|
|
||||||
|
Camera :: struct {
|
||||||
|
position: Vec2,
|
||||||
|
anchor: Vec2,
|
||||||
|
}
|
||||||
|
|
||||||
|
camera_default :: proc() -> Camera {
|
||||||
|
return Camera{position = {0, 0}, anchor = {0.5, 0.5}}
|
||||||
|
}
|
||||||
|
|
||||||
|
world_to_screen :: proc(cam: Camera, world: Vec2, viewport: Vec2) -> Vec2 {
|
||||||
|
return {
|
||||||
|
world.x - cam.position.x + viewport.x * cam.anchor[0],
|
||||||
|
world.y - cam.position.y + viewport.y * cam.anchor[1],
|
||||||
|
}
|
||||||
|
}
|
||||||
+7
-7
@@ -109,14 +109,17 @@ draw_sprite :: proc(app: ^App, sprite: ^Sprite) {
|
|||||||
trim_y := f32(frame.trim_offset[1])
|
trim_y := f32(frame.trim_offset[1])
|
||||||
pivot := sprite.data.def.pivot
|
pivot := sprite.data.def.pivot
|
||||||
|
|
||||||
canvas_top := sprite.position.y - src_h * pivot[1]
|
viewport := Vec2{f32(app.swapchain_w), f32(app.swapchain_h)}
|
||||||
|
feet := world_to_screen(app.camera, sprite.position, viewport)
|
||||||
|
|
||||||
|
canvas_top := feet.y - src_h * pivot[1]
|
||||||
x0_px, y0_px: f32
|
x0_px, y0_px: f32
|
||||||
if sprite.flip_x {
|
if sprite.flip_x {
|
||||||
canvas_left := sprite.position.x - (1.0 - pivot[0]) * src_w
|
canvas_left := feet.x - (1.0 - pivot[0]) * src_w
|
||||||
x0_px = canvas_left + (src_w - trim_x - fw)
|
x0_px = canvas_left + (src_w - trim_x - fw)
|
||||||
y0_px = canvas_top + trim_y
|
y0_px = canvas_top + trim_y
|
||||||
} else {
|
} else {
|
||||||
canvas_left := sprite.position.x - src_w * pivot[0]
|
canvas_left := feet.x - src_w * pivot[0]
|
||||||
x0_px = canvas_left + trim_x
|
x0_px = canvas_left + trim_x
|
||||||
y0_px = canvas_top + trim_y
|
y0_px = canvas_top + trim_y
|
||||||
}
|
}
|
||||||
@@ -147,10 +150,7 @@ draw_sprite :: proc(app: ^App, sprite: ^Sprite) {
|
|||||||
{pos = p3, uv = {u0, v1}},
|
{pos = p3, uv = {u0, v1}},
|
||||||
}
|
}
|
||||||
|
|
||||||
append(
|
append(&app.draw_list, Queued_Sprite{texture = sprite.data.texture, verts = verts})
|
||||||
&app.draw_list,
|
|
||||||
Queued_Sprite{texture = sprite.data.texture, verts = verts},
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
set_sprite_clip :: proc(sprite: ^Sprite, clip: string) {
|
set_sprite_clip :: proc(sprite: ^Sprite, clip: string) {
|
||||||
|
|||||||
@@ -39,6 +39,8 @@ main :: proc() {
|
|||||||
} else {
|
} else {
|
||||||
eng.set_sprite_clip(&toad, "idle")
|
eng.set_sprite_clip(&toad, "idle")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
app.camera.position = toad.position - {0, 100}
|
||||||
eng.update_sprite(&toad, dt)
|
eng.update_sprite(&toad, dt)
|
||||||
|
|
||||||
eng.begin_frame(&app)
|
eng.begin_frame(&app)
|
||||||
|
|||||||
Reference in New Issue
Block a user