143 lines
3.9 KiB
C
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
|