From 7fb83578b99aa224f7545f4118a46e84b58a9295 Mon Sep 17 00:00:00 2001 From: iamcheeseman <[hidden email]> Date: Mon, 12 Jan 2026 20:51:28 -0500 Subject: NEW ASSET SYSTEM WOOOOOOOOHOOOOOOOOOOOOOOOOOOOOOOOOO --- src/sprite.odin | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 src/sprite.odin (limited to 'src/sprite.odin') diff --git a/src/sprite.odin b/src/sprite.odin new file mode 100644 index 0000000..af2fdf9 --- /dev/null +++ b/src/sprite.odin @@ -0,0 +1,106 @@ +package demonchime + +import "core:log" + +import rl "vendor:raylib" + +import "draw" + +Sprite :: struct { + image: rl.Texture2D, + anim_id: Animation_Id, + current_tag: Tag_Resource, + frame_time: f32, + current_frame: i32, + + width: i32, + height: i32, + + pos: Vec2, + offset: Vec2, + rotation: f32, + scale: Vec2, + + just_finished_loop: bool, +} + +init_sprite :: proc( + sprite: ^Sprite, + image_id: Image_Id, + anim_id: Maybe(Animation_Id) = nil, +) -> bool { + sprite.image = get_image(image_id) + + switch id in anim_id { + case Animation_Id: + sprite.anim_id = id + case nil: + sprite.anim_id = images[image_id].anim + } + + anim := animations[sprite.anim_id] + + sprite.width = i32(f32(sprite.image.width) / f32(anim.frame_count)) + sprite.height = i32(sprite.image.height) + + log.debug(sprite.width, anim.frame_count, sprite.anim_id) + + sprite.scale = Vec2{1, 1} + + return true +} + +destroy_sprite :: proc(sprite: Sprite) { + rl.UnloadTexture(sprite.image) +} + +set_sprite_active_tag :: proc(sprite: ^Sprite, tag_name: string) { + anim := animations[sprite.anim_id] + sprite.current_tag = anim.tags[tag_name] +} + +update_sprite :: proc(sprite: ^Sprite, dt: f32) { + sprite.just_finished_loop = false + + sprite.frame_time += dt + + anim := animations[sprite.anim_id] + + duration := f32(anim.frame_durations[sprite.current_frame]) / 1000 + + if sprite.frame_time > duration { + sprite.frame_time -= duration + sprite.current_frame += 1 + } + + tag := &sprite.current_tag + + if sprite.current_frame < tag.from { + sprite.current_frame = tag.to + sprite.just_finished_loop = true + } + if sprite.current_frame > tag.to { + sprite.current_frame = tag.from + sprite.just_finished_loop = true + } +} + +draw_sprite :: proc( + sprite: Sprite, +) { + rect := draw.Rect{ + {f32(sprite.width * sprite.current_frame), 0}, + {f32(sprite.width), f32(sprite.height)}, + } + + draw.texture_quad( + sprite.image, + rect, + sprite.pos, + sprite.offset, + sprite.rotation, + sprite.scale, + ) + + // log.debug(rect) +} -- cgit v1.3-2-g0d8e