power_play/src/sprite.h
2025-05-23 20:43:51 -05:00

143 lines
3.9 KiB
C

#ifndef SPRITE_H
#define SPRITE_H
#include "gpu.h"
#include "util.h"
struct gpu_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 gpu_startup_receipt *gpu_sr,
struct resource_startup_receipt *resource_sr);
/* ========================== *
* Tag
* ========================== */
INLINE struct sprite_tag sprite_tag_nil(void) { return (struct sprite_tag) { 0 }; }
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_cache_ref **ref_node_bins;
struct sprite_scope_cache_ref *ref_node_pool;
u64 num_references;
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 gpu_texture texture;
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 dict spans_dict;
u32 slice_groups_count;
struct sprite_sheet_slice_group *slice_groups;
struct 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