#ifndef SPRITE_H #define SPRITE_H #include "util.h" struct renderer_startup_receipt; struct resource_startup_receipt; struct sprite_sheet_span; struct sprite_sheet_slice_group; /* ========================== * * Startup * ========================== */ struct sprite_startup_receipt { i32 _; }; struct sprite_startup_receipt sprite_startup(struct renderer_startup_receipt *renderer_sr, struct resource_startup_receipt *resource_sr); /* ========================== * * Tag * ========================== */ struct sprite_tag sprite_tag_from_path(struct string path); b32 sprite_tag_is_nil(struct sprite_tag tag); b32 sprite_tag_eq(struct sprite_tag t1, struct sprite_tag t2); /* ========================== * * Scope * ========================== */ struct sprite_scope { struct sprite_scope_reference **reference_buckets; struct sprite_scope *next_free; }; struct sprite_scope *sprite_scope_begin(void); void sprite_scope_end(struct sprite_scope *scope); /* ========================== * * Texture load * ========================== */ struct sprite_texture { b32 loaded; b32 valid; struct renderer_handle renderer_handle; u32 width; u32 height; }; struct sprite_texture *sprite_texture_from_tag_await(struct sprite_scope *scope, struct sprite_tag tag); struct sprite_texture *sprite_texture_from_tag_async(struct sprite_scope *scope, struct sprite_tag tag); /* ========================== * * Sheet load * ========================== */ struct sprite_sheet { b32 loaded; b32 valid; struct v2 image_size; struct v2 frame_size; u32 frames_count; struct sprite_sheet_frame *frames; u32 spans_count; struct sprite_sheet_span *spans; struct fixed_dict spans_dict; u32 slice_groups_count; struct sprite_sheet_slice_group *slice_groups; struct fixed_dict slice_groups_dict; }; struct sprite_sheet *sprite_sheet_from_tag_await(struct sprite_scope *scope, struct sprite_tag tag); struct sprite_sheet *sprite_sheet_from_tag_async(struct sprite_scope *scope, struct sprite_tag tag); /* ========================== * * Sheet query * ========================== */ struct sprite_sheet_frame { u32 index; f64 duration; struct clip_rect clip; }; struct sprite_sheet_span { struct string name; u32 start; u32 end; }; struct sprite_sheet_slice { /* If true, this slice was not copied over from another frame in the sprite sheet */ b32 original; /* If true, the slice has a corresponding '.ray' slice affecting the 'dir' fields */ b32 has_ray; /* Values are in the range -0.5 (top / left edge) -> +0.5 (bottom / right edge) */ struct rect rect; struct v2 center; struct v2 dir; /* '_px' values retain the original sprite pixel dimensions */ struct rect rect_px; struct v2 center_px; struct v2 dir_px; }; struct sprite_sheet_slice_array { u64 count; struct sprite_sheet_slice *slices; }; struct sprite_sheet_slice_group { struct string name; u64 per_frame_count; /* 2d array of slices with length (num frames) * (num slices per frame). * Index with [(frame index * num slices per frame) + slice index in frame] */ struct sprite_sheet_slice *frame_slices; }; struct sprite_sheet_frame sprite_sheet_get_frame(struct sprite_sheet *sheet, u32 index); struct sprite_sheet_span sprite_sheet_get_span(struct sprite_sheet *sheet, struct string name); /* Returns first slice with name in frame */ struct sprite_sheet_slice sprite_sheet_get_slice(struct sprite_sheet *sheet, struct string name, u32 frame_index); /* Returns all slices with name in frame */ struct sprite_sheet_slice_array sprite_sheet_get_slices(struct sprite_sheet *sheet, struct string name, u32 frame_index); #endif