diff --git a/assets b/assets index 05e5272..38fd676 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 05e5272f3789b44192d0bf2bd253641e76659a2a +Subproject commit 38fd6766762ce90bb699f98e30e46b17c4eda50c diff --git a/content/ship.toml b/content/ship.toml index 986c34e..46e8030 100644 --- a/content/ship.toml +++ b/content/ship.toml @@ -1,5 +1,5 @@ [ship."Gypsum"] -sprite = "ship::gypsum" +sprite = "ship::peregrine" size = 100 mass = 1 hull = 200 diff --git a/content/sprite.toml b/content/sprite.toml index 95a8eb8..17f07fa 100644 --- a/content/sprite.toml +++ b/content/sprite.toml @@ -19,6 +19,23 @@ file = "projectile/blaster.png" [sprite."ship::gypsum"] file = "ship/gypsum.png" +[sprite."ship::peregrine"] +duration = 1 +repeat = "repeat" +frames = [ + "ship/peregrine/01.png", + "ship/peregrine/02.png", + "ship/peregrine/03.png", + "ship/peregrine/04.png", + "ship/peregrine/05.png", + "ship/peregrine/06.png", + "ship/peregrine/07.png", + "ship/peregrine/08.png", + "ship/peregrine/09.png", + "ship/peregrine/10.png", + "ship/peregrine/11.png", +] + [sprite."ui::radar"] file = "ui/radar.png" diff --git a/crates/render/shaders/object.wgsl b/crates/render/shaders/object.wgsl index 6530bff..50701ab 100644 --- a/crates/render/shaders/object.wgsl +++ b/crates/render/shaders/object.wgsl @@ -26,7 +26,39 @@ var texture_array: binding_array>; var sampler_array: binding_array; +fn fmod(x: f32, m: f32) -> f32 { + return x - floor(x / m) * m; +} +// Returns texture index +// TODO: random age +// TODO: preprocessor include function +// TODO: packed location config, better error +// TODO: bounce animations +// TODO: animation randomness? +fn animate(instance: InstanceInput) -> u32 { + // Age doesn't make sense here, so arbitrarily pick zero. + let age = global.current_time.x; + let len = sprites.data[instance.texture_index].frame_count; + let rep = sprites.data[instance.texture_index].repeatmode; + let fps = sprites.data[instance.texture_index].fps; + var frame: u32 = u32(0); + if rep == u32(1) { + // Repeat + frame = u32(fmod( + (age / fps), + f32(len) + )); + } else { + // Once + frame = u32(min( + (age / fps), + f32(len) - 1.0 + )); + } + + return frame + sprites.data[instance.texture_index].first_frame; +} @vertex fn vertex_main( @@ -44,8 +76,7 @@ fn vertex_main( var out: VertexOutput; out.position = transform * vec4(vertex.position, 1.0); - let i = sprites.data[instance.texture_index].first_frame; - let t = atlas.data[i]; + let t = atlas.data[animate(instance)]; out.texture_index = u32(0); out.texture_coords = vec2(t.xpos, t.ypos); if vertex.texture_coords.x == 1.0 { diff --git a/crates/render/shaders/particle.wgsl b/crates/render/shaders/particle.wgsl index 2a6f40a..29289e5 100644 --- a/crates/render/shaders/particle.wgsl +++ b/crates/render/shaders/particle.wgsl @@ -29,6 +29,30 @@ var texture_array: binding_array>; var sampler_array: binding_array; +// Returns texture index +fn animate(instance: InstanceInput) -> u32 { + let age = global.current_time.x - instance.created; + let len = sprites.data[instance.texture_index].frame_count; + let rep = sprites.data[instance.texture_index].repeatmode; + let fps = sprites.data[instance.texture_index].fps; + var frame: u32 = u32(0); + if rep == u32(1) { + // Repeat + frame = u32(fmod( + (age / fps), + f32(len) + )); + } else { + // Once + frame = u32(min( + (age / fps), + f32(len) - 1.0 + )); + } + + return frame + sprites.data[instance.texture_index].first_frame; +} + fn fmod(x: f32, m: f32) -> f32 { return x - floor(x / m) * m; } @@ -68,10 +92,7 @@ fn vertex_main( )); } - - // Pick image - frame = frame + sprites.data[instance.texture_index].first_frame; - let t = atlas.data[frame]; + let t = atlas.data[animate(instance)]; out.texture_index = u32(0); out.texture_coords = vec2(t.xpos, t.ypos); if vertex.texture_coords.x == 1.0 {