power_play/src/sprite/sprite.h
2025-09-08 17:26:43 -05:00

168 lines
3.0 KiB
C

////////////////////////////////
//~ Texture types
Struct(S_Texture)
{
b32 valid;
b32 loaded;
GPU_Resource *gpu_resource;
u32 width;
u32 height;
};
extern Readonly S_Texture S_NilTexture;
////////////////////////////////
//~ Sheet types
Struct(S_Frame)
{
u32 index;
f64 duration;
ClipRect clip;
};
Struct(S_Span)
{
S_Span *next_in_bin;
u64 hash;
String name;
u32 start;
u32 end;
};
Struct(S_SpanBin)
{
S_Span *first;
S_Span *last;
};
Struct(S_Slice)
{
/* If 1, this slice was not copied over from another frame in the sprite sheet */
b32 is_original;
/* If 1, the slice has a corresponding '.ray' slice affecting the 'dir' fields */
b32 has_dir;
/* Values are in the range -0.5 (top / left edge) -> +0.5 (bottom / right edge) */
Rect rect;
Vec2 center;
Vec2 dir;
/* '_px' values retain the original sprite pixel dimensions */
Rect rect_px;
Vec2 center_px;
Vec2 dir_px;
};
Struct(S_SliceGroup)
{
S_SliceGroup *next_in_bin;
u64 hash;
String name;
S_Slice *slices;
};
Struct(S_SliceGroupBin)
{
S_SliceGroup *first;
S_SliceGroup *last;
};
Struct(S_Sheet)
{
b32 valid;
b32 loaded;
Vec2 image_size;
Vec2 frame_size;
u32 frames_count;
S_Frame *frames;
u32 spans_count;
S_Span *spans;
u32 slice_groups_count;
S_SliceGroup *slice_groups;
u32 span_bins_count;
S_SpanBin *span_bins;
u32 slice_group_bins_count;
S_SliceGroupBin *slice_group_bins;
};
extern Readonly S_Sheet S_NilSheet;
////////////////////////////////
//~ Cache types
Struct(S_Entry)
{
S_Entry *next_in_bin;
S_Texture texture;
S_Sheet sheet;
Atomic32 texture_touched;
Atomic32 sheet_touched;
Resource resource;
Counter texture_load_counter;
Counter sheet_load_counter;
};
Struct(S_EntryBin)
{
S_Entry *first;
S_Entry *last;
Mutex mutex;
};
////////////////////////////////
//~ State
#define S_EntryBinsCount 1024
Struct(S_SharedState)
{
S_EntryBin entry_bins[S_EntryBinsCount];
};
extern S_SharedState S_shared_state;
////////////////////////////////
//~ Load jobs
JobDecl(S_LoadTextureJob, { S_Entry *entry; });
JobDecl(S_LoadSheetJob, { S_Entry *entry; });
////////////////////////////////
//~ Cache operations
Enum(S_FetchFlag)
{
S_FetchFlag_None = 0,
S_FetchFlag_Texture = (1 << 0),
S_FetchFlag_Sheet = (1 << 1),
};
S_Entry *S_FetchEntry(Resource resource, JobPool pool, S_FetchFlag flags);
////////////////////////////////
//~ Sprite data retrieval operations
S_Texture *S_TextureFromResource(Resource resource);
S_Texture *S_TextureFromResourceAsync(Resource resource);
S_Sheet *S_SheetFromResource(Resource resource);
S_Sheet *S_SheetFromResourceAsync(Resource resource);
////////////////////////////////
//~ Sheet access operations
S_Span S_SpanFromName(S_Sheet *sheet, String name);
S_Frame S_FrameFromIndex(S_Sheet *sheet, u64 index);
S_Slice S_SliceFromName(S_Sheet *sheet, String name, u64 frame_index);