starfield

starfield.git
git clone git://git.lenczewski.org/starfield.git
Log | Files | Refs | Submodules | README | LICENSE

starfield_api.h (5920B)


      1 #ifndef STARFIELD_API_H
      2 #define STARFIELD_API_H
      3 
      4 #ifdef __cplusplus
      5 extern "C" {
      6 #endif /* __cplusplus */
      7 
      8 #include "starfield/types.h"
      9 #include "starfield/maths.h"
     10 #include "starfield/intrinsics.h"
     11 
     12 /* platform api definitions */
     13 
     14 #ifdef STARFIELD_DEBUG
     15 
     16 struct DEBUG_platform_read_file_result {
     17 	void *ptr;
     18 	u64 len;
     19 };
     20 
     21 #define DEBUG_PLATFORM_READ_FILE(name) \
     22 	struct DEBUG_platform_read_file_result name(char const *filename)
     23 
     24 #define DEBUG_PLATFORM_WRITE_FILE(name) \
     25 	b32 name(char const *filename, void *buf, u64 len)
     26 
     27 #define DEBUG_PLATFORM_FREE_FILE_MEMORY(name) \
     28 	void name(void *ptr)
     29 
     30 typedef DEBUG_PLATFORM_READ_FILE(DEBUG_platform_api_read_file_t);
     31 typedef DEBUG_PLATFORM_WRITE_FILE(DEBUG_platform_api_write_file_t);
     32 typedef DEBUG_PLATFORM_FREE_FILE_MEMORY(DEBUG_platform_api_free_file_memory_t);
     33 
     34 #endif
     35 
     36 struct platform_api {
     37 #ifdef STARFIELD_DEBUG
     38 	DEBUG_platform_api_read_file_t *DEBUG_read_file;
     39 	DEBUG_platform_api_write_file_t *DEBUG_write_file;
     40 	DEBUG_platform_api_free_file_memory_t *DEBUG_free_file_memory;
     41 #endif
     42 };
     43 
     44 /* renderer api definitions */
     45 
     46 struct renderer;
     47 struct render_frame;
     48 
     49 #define RENDER_BEGIN_FRAME(name) \
     50 	struct render_frame *name(struct renderer *renderer, u32 width, u32 height)
     51 
     52 #define RENDER_BEGIN_RENDER_PASS(name) \
     53 	void name(struct renderer *renderer, struct render_frame *frame)
     54 
     55 #define RENDER_BIND_PIPELINE(name) \
     56 	void name(struct renderer *renderer, struct render_frame *frame)
     57 
     58 #define RENDER_SET_VIEWPORT(name) \
     59 	void name(struct renderer *renderer, struct render_frame *frame)
     60 
     61 #define RENDER_SET_SCISSOR(name) \
     62 	void name(struct renderer *renderer, struct render_frame *frame)
     63 
     64 #define RENDER_DRAW_VERTICES(name) \
     65 	void name(struct renderer *renderer, struct render_frame *frame)
     66 
     67 #define RENDER_END_RENDER_PASS(name) \
     68 	void name(struct renderer *renderer, struct render_frame *frame)
     69 
     70 #define RENDER_END_FRAME(name) \
     71 	void name(struct renderer *renderer, struct render_frame *frame)
     72 
     73 typedef RENDER_BEGIN_FRAME(render_api_begin_frame_t);
     74 typedef RENDER_BEGIN_RENDER_PASS(render_api_begin_render_pass_t);
     75 typedef RENDER_BIND_PIPELINE(render_api_bind_pipeline_t);
     76 typedef RENDER_SET_VIEWPORT(render_api_set_viewport_t);
     77 typedef RENDER_SET_SCISSOR(render_api_set_scissor_t);
     78 typedef RENDER_DRAW_VERTICES(render_api_draw_vertices_t);
     79 typedef RENDER_END_RENDER_PASS(render_api_end_render_pass_t);
     80 typedef RENDER_END_FRAME(render_api_end_frame_t);
     81 
     82 struct render_api {
     83 	render_api_begin_frame_t *begin_frame;
     84 	render_api_begin_render_pass_t *begin_render_pass;
     85 	render_api_bind_pipeline_t *bind_pipeline;
     86 	render_api_set_viewport_t *set_viewport;
     87 	render_api_set_scissor_t *set_scissor;
     88 	render_api_draw_vertices_t *draw_vertices;
     89 	render_api_end_render_pass_t *end_render_pass;
     90 	render_api_end_frame_t *end_frame;
     91 };
     92 
     93 /* starfield api definitions */
     94 
     95 #define STARFIELD_DATADIR "data"
     96 #define STARFIELD_TEMPDIR "temp"
     97 
     98 struct starfield_thread;
     99 
    100 struct starfield_memory {
    101 	void *ptr;
    102 	u64 cap, len;
    103 };
    104 
    105 struct starfield_button_input {
    106 	u32 half_transition_count;
    107 	b32 was_down;
    108 };
    109 
    110 enum starfield_mouse_button {
    111 	STARFIELD_MOUSE_L,
    112 	STARFIELD_MOUSE_R,
    113 	STARFIELD_MOUSE_M,
    114 
    115 	STARFIELD_MOUSE_X,
    116 	STARFIELD_MOUSE_Y,
    117 
    118 	_STARFIELD_MOUSE_BUTTON_COUNT,
    119 };
    120 
    121 struct starfield_mouse_input {
    122 	s16 x, y, z;
    123 	struct starfield_button_input buttons[_STARFIELD_MOUSE_BUTTON_COUNT];
    124 };
    125 
    126 enum starfield_keyboard_button {
    127 	STARFIELD_KEYBOARD_ESC,
    128 
    129 	STARFIELD_KEYBOARD_A,
    130 	STARFIELD_KEYBOARD_D,
    131 	STARFIELD_KEYBOARD_W,
    132 	STARFIELD_KEYBOARD_S,
    133 	STARFIELD_KEYBOARD_SPACE,
    134 	STARFIELD_KEYBOARD_SHIFT,
    135 	STARFIELD_KEYBOARD_CTRL,
    136 
    137 	STARFIELD_KEYBOARD_Q,
    138 	STARFIELD_KEYBOARD_E,
    139 
    140 	STARFIELD_KEYBOARD_J,
    141 	STARFIELD_KEYBOARD_L,
    142 	STARFIELD_KEYBOARD_I,
    143 	STARFIELD_KEYBOARD_K,
    144 
    145 	_STARFIELD_KEYBOARD_BUTTON_COUNT,
    146 };
    147 
    148 struct starfield_keyboard_input {
    149 	struct starfield_button_input buttons[_STARFIELD_KEYBOARD_BUTTON_COUNT];
    150 };
    151 
    152 struct starfield_input {
    153 	struct starfield_mouse_input mouse;
    154 	struct starfield_keyboard_input keyboard;
    155 };
    156 
    157 #define STARFIELD_VIDEO_HRES 1024 // 1920
    158 #define STARFIELD_VIDEO_VRES 576 // 1080
    159 
    160 #define STARFIELD_VIDEO_BYTES_PER_PIXEL 4
    161 
    162 #define STARFIELD_AUDIO_CHANNELS 2
    163 #define STARFIELD_AUDIO_SAMPLE_RATE 48000
    164 #define STARFIELD_AUDIO_SAMPLE_BITS 32
    165 
    166 #define STARFIELD_AUDIO_FRAME_BYTES \
    167 	(STARFIELD_AUDIO_CHANNELS * (STARFIELD_AUDIO_SAMPLE_BITS / 8))
    168 
    169 struct starfield_audio_buffer {
    170 	void *buffer;
    171 	u32 channels;
    172 	u32 sample_rate;
    173 	u32 sample_bits;
    174 	u32 expected_frames;
    175 };
    176 
    177 #define STARFIELD_INIT(name) \
    178 	b32 name(struct starfield_thread *thread, \
    179 		  struct starfield_memory *memory, \
    180 		  struct platform_api *platform)
    181 
    182 #define STARFIELD_UPDATE(name) \
    183 	void name(struct starfield_thread *thread, \
    184 		  struct starfield_memory *memory, \
    185 		  struct platform_api *platform, \
    186 		  struct starfield_input *input, \
    187 		  f32 dt)
    188 
    189 #define STARFIELD_RENDER(name) \
    190 	void name(struct starfield_thread *thread, \
    191 		  struct starfield_memory *memory, \
    192 		  struct platform_api *platform, \
    193 		  struct render_api *render_api, \
    194 		  struct renderer *renderer, \
    195 		  u32 width, u32 height, f32 dt)
    196 
    197 #define STARFIELD_SAMPLE(name) \
    198 	void name(struct starfield_thread *thread, \
    199 		  struct starfield_memory *memory, \
    200 		  struct platform_api *platform, \
    201 		  struct starfield_audio_buffer *audio, \
    202 		  f32 dt)
    203 
    204 #define STARFIELD_FREE(name) \
    205 	void name(struct starfield_thread *thread, \
    206 		  struct starfield_memory *memory, \
    207 		  struct platform_api *platform)
    208 
    209 typedef STARFIELD_INIT(starfield_api_init_t);
    210 typedef STARFIELD_UPDATE(starfield_api_update_t);
    211 typedef STARFIELD_RENDER(starfield_api_render_t);
    212 typedef STARFIELD_SAMPLE(starfield_api_sample_t);
    213 typedef STARFIELD_FREE(starfield_api_free_t);
    214 
    215 struct starfield_api {
    216 	starfield_api_init_t *init;
    217 	starfield_api_update_t *update;
    218 	starfield_api_render_t *render;
    219 	starfield_api_sample_t *sample;
    220 	starfield_api_free_t *free;
    221 };
    222 
    223 #ifdef __cplusplus
    224 }
    225 #endif /* __cplusplus */
    226 
    227 #endif /* STARFIELD_API_H */