Files
text_editor/src/build_tool/standalone_libraries/multimedia.h
Krzosa Karol a75c8a2e4f Init repo
2024-06-19 06:51:06 +02:00

370 lines
8.1 KiB
C

#ifndef FIRST_MU_HEADER
#define FIRST_MU_HEADER
#include <stdbool.h>
#include <stdint.h>
#include <stddef.h>
#ifndef MU_API
#ifdef __cplusplus
#define MU_API extern "C"
#else
#define MU_API
#endif
#endif
#ifndef MU_INLINE
#ifndef _MSC_VER
#ifdef __cplusplus
#define MU_INLINE inline
#else
#define MU_INLINE
#endif
#else
#define MU_INLINE __forceinline
#endif
#endif
#ifndef MU_Float2
#define MU_Float2 MU__Float2
typedef struct MU__Float2 {
float x;
float y;
} MU__Float2;
#endif
#ifndef MU_Int2
#define MU_Int2 MU__Int2
typedef struct MU__Int2 {
int x;
int y;
} MU__Int2;
#endif
//@begin gen_structs
typedef struct MU_UTF32Result MU_UTF32Result;
typedef struct MU_UTF8Result MU_UTF8Result;
typedef struct MU_Win32 MU_Win32;
typedef struct MU_Win32_Window MU_Win32_Window;
typedef struct MU_Window_Params MU_Window_Params;
typedef struct MU_Params MU_Params;
typedef struct MU_Key_State MU_Key_State;
typedef struct MU_Mouse_State MU_Mouse_State;
typedef struct MU_DroppedFile MU_DroppedFile;
typedef struct MU_Arena MU_Arena;
typedef struct MU_Window MU_Window;
typedef struct MU_Time MU_Time;
typedef struct MU_Sound MU_Sound;
typedef struct MU_Context MU_Context;
//@end gen_structs
typedef void *MU_glGetProcAddress(const char *);
struct MU_Window_Params {
MU_Int2 size;
MU_Int2 pos;
char *title;
bool enable_canvas;
bool resizable;
bool borderless;
bool fps_cursor;
};
struct MU_Params {
void *memory;
size_t cap;
bool enable_opengl;
int opengl_major;
int opengl_minor;
double delta_time;
MU_Window_Params window; // this controls window when calling MU_Start
void (*sound_callback)(MU_Context *mu, uint16_t *buffer, uint32_t samples_to_fill);
};
struct MU_Key_State {
bool down;
bool press;
bool unpress;
bool raw_press;
};
typedef enum MU_Key {
MU_KEY_INVALID,
MU_KEY_ESCAPE,
MU_KEY_ENTER,
MU_KEY_TAB,
MU_KEY_BACKSPACE,
MU_KEY_INSERT,
MU_KEY_DELETE,
MU_KEY_RIGHT,
MU_KEY_LEFT,
MU_KEY_DOWN,
MU_KEY_UP,
MU_KEY_PAGE_UP,
MU_KEY_PAGE_DOWN,
MU_KEY_HOME,
MU_KEY_END,
MU_KEY_F1,
MU_KEY_F2,
MU_KEY_F3,
MU_KEY_F4,
MU_KEY_F5,
MU_KEY_F6,
MU_KEY_F7,
MU_KEY_F8,
MU_KEY_F9,
MU_KEY_F10,
MU_KEY_F11,
MU_KEY_F12,
MU_KEY_SPACE = 32,
MU_KEY_APOSTROPHE = 39,
MU_KEY_PLUS = 43,
MU_KEY_COMMA = 44,
MU_KEY_MINUS = 45,
MU_KEY_PERIOD = 46,
MU_KEY_SLASH = 47,
MU_KEY_0 = 48,
MU_KEY_1 = 49,
MU_KEY_2 = 50,
MU_KEY_3 = 51,
MU_KEY_4 = 52,
MU_KEY_5 = 53,
MU_KEY_6 = 54,
MU_KEY_7 = 55,
MU_KEY_8 = 56,
MU_KEY_9 = 57,
MU_KEY_SEMICOLON = 59,
MU_KEY_EQUAL = 61,
MU_KEY_A = 65,
MU_KEY_B = 66,
MU_KEY_C = 67,
MU_KEY_D = 68,
MU_KEY_E = 69,
MU_KEY_F = 70,
MU_KEY_G = 71,
MU_KEY_H = 72,
MU_KEY_I = 73,
MU_KEY_J = 74,
MU_KEY_K = 75,
MU_KEY_L = 76,
MU_KEY_M = 77,
MU_KEY_N = 78,
MU_KEY_O = 79,
MU_KEY_P = 80,
MU_KEY_Q = 81,
MU_KEY_R = 82,
MU_KEY_S = 83,
MU_KEY_T = 84,
MU_KEY_U = 85,
MU_KEY_V = 86,
MU_KEY_W = 87,
MU_KEY_X = 88,
MU_KEY_Y = 89,
MU_KEY_Z = 90,
MU_KEY_LEFT_BRACKET = 91,
MU_KEY_BACKSLASH = 92,
MU_KEY_RIGHT_BRACKET = 93,
MU_KEY_GRAVE_ACCENT = 96,
MU_KEY_F13,
MU_KEY_F14,
MU_KEY_F15,
MU_KEY_F16,
MU_KEY_F17,
MU_KEY_F18,
MU_KEY_F19,
MU_KEY_F20,
MU_KEY_F21,
MU_KEY_F22,
MU_KEY_F23,
MU_KEY_F24,
MU_KEY_KP_0,
MU_KEY_KP_1,
MU_KEY_KP_2,
MU_KEY_KP_3,
MU_KEY_KP_4,
MU_KEY_KP_5,
MU_KEY_KP_6,
MU_KEY_KP_7,
MU_KEY_KP_8,
MU_KEY_KP_9,
MU_KEY_KP_DECIMAL,
MU_KEY_KP_DIVIDE,
MU_KEY_KP_MULTIPLY,
MU_KEY_KP_SUBTRACT,
MU_KEY_KP_ADD,
MU_KEY_KP_ENTER,
MU_KEY_LEFT_SHIFT,
MU_KEY_LEFT_CONTROL,
MU_KEY_LEFT_ALT,
MU_KEY_LEFT_SUPER,
MU_KEY_RIGHT_SHIFT,
MU_KEY_RIGHT_CONTROL,
MU_KEY_RIGHT_ALT,
MU_KEY_RIGHT_SUPER,
MU_KEY_CAPS_LOCK,
MU_KEY_SCROLL_LOCK,
MU_KEY_NUM_LOCK,
MU_KEY_PRINT_SCREEN,
MU_KEY_PAUSE,
MU_KEY_SHIFT,
MU_KEY_CONTROL,
MU_KEY_COUNT,
} MU_Key;
struct MU_Mouse_State {
MU_Int2 pos;
MU_Float2 posf;
MU_Int2 delta_pos;
MU_Float2 delta_pos_normalized;
MU_Key_State left;
MU_Key_State middle;
MU_Key_State right;
float delta_wheel; // @todo: add smooth delta?
};
struct MU_DroppedFile {
MU_DroppedFile *next;
char *filename; // null terminated
int filename_size;
};
struct MU_Arena {
char *memory;
size_t len;
size_t cap;
};
// Most of the fields in the window struct are read only. They are updated
// in appropriate update functions. The window should belong to the MU_Context
// but you get access to the information.
struct MU_Window {
MU_Int2 size;
MU_Float2 sizef;
MU_Int2 pos;
MU_Float2 posf;
float dpi_scale;
bool is_fullscreen;
bool is_fps_mode;
bool is_focused;
bool change_cursor_on_mouse_hold; // @in @out
uint64_t processed_events_this_frame;
bool should_render; // @in @out this is false on first frame but it doesn't matter cause it shouldnt be rendered
MU_DroppedFile *first_dropped_file;
uint32_t *canvas;
bool canvas_enabled; // @in @out
MU_Mouse_State mouse;
MU_Key_State key[MU_KEY_COUNT];
uint32_t user_text32[32];
int user_text32_count;
char user_text8[32];
int user_text8_count;
MU_Window *next;
void *handle;
void *platform;
};
struct MU_Time {
double app_start;
double frame_start;
double update;
double update_total;
double delta;
float deltaf;
double total;
float totalf;
};
struct MU_Sound {
bool initialized;
unsigned samples_per_second;
unsigned number_of_channels;
unsigned bytes_per_sample;
void (*callback)(MU_Context *mu, uint16_t *buffer, uint32_t samples_to_fill);
};
struct MU_Context {
bool quit;
MU_Sound sound;
MU_Time time;
bool first_frame;
int _MU_Update_count;
size_t frame;
size_t consecutive_missed_frames;
size_t total_missed_frames;
MU_Int2 primary_monitor_size;
bool opengl_initialized;
int opengl_major;
int opengl_minor;
void *(*gl_get_proc_address)(const char *str);
MU_Params params;
MU_Window *window;
MU_Window *all_windows;
MU_Arena perm_arena;
MU_Arena frame_arena; // Reset at beginning of MU_Update
void *platform;
};
//@begin gen_api_funcs
MU_API void MU_Quit(MU_Context *mu);
MU_API void MU_DefaultSoundCallback(MU_Context *mu, uint16_t *buffer, uint32_t samples_to_fill);
MU_API double MU_GetTime(void);
MU_API void MU_ToggleFPSMode(MU_Window *window);
MU_API void MU_DisableFPSMode(MU_Window *window);
MU_API void MU_EnableFPSMode(MU_Window *window);
MU_API void MU_ToggleFullscreen(MU_Window *window);
MU_API void MU_Init(MU_Context *mu, MU_Params params, size_t len);
MU_API MU_Window *MU_AddWindow(MU_Context *mu, MU_Window_Params params);
MU_API void MU_InitWindow(MU_Context *mu, MU_Window *window, MU_Window_Params params);
MU_API MU_Context *MU_Start(MU_Params params);
MU_API bool MU_Update(MU_Context *mu);
//@end gen_api_funcs
/* @! In the future, api for processing messages manually
while(true) {
MU_Event event;
while (mu_get_event_blocking(&event)) {
switch(event.kind) {
}
}
}
typedef int MU_Modifier;
enum MU_Modifier {
MU_MODIFIER_SHIFT = 0x1, // left or right shift key
MU_MODIFIER_CTRL = 0x2, // left or right control key
MU_MODIFIER_ALT = 0x4, // left or right alt key
MU_MODIFIER_SUPER = 0x8, // left or right 'super' key
MU_MODIFIER_LMB = 0x100, // left mouse button
MU_MODIFIER_RMB = 0x200, // right mouse button
MU_MODIFIER_MMB = 0x400, // middle mouse button
};
typedef enum MU_Event_Kind {
MU_EVENT_KIND_INVALID,
MU_EVENT_KIND_KEY_DOWN,
MU_EVENT_KIND_KEY_UP,
MU_EVENT_KIND_MOUSE_MOVE,
} MU_Event_Kind;
typedef struct MU_Event {
MU_Event_Kind kind;
MU_Modifier modifier;
MU_Key key;
} MU_Event;
*/
#endif