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 */