Archived
1
0
Fork 0
This repository has been archived on 2025-09-02. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
skcblitz/types.h
2025-09-02 14:43:36 +02:00

2243 lines
55 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// memory sizes
#define MEM_CATS 12
#define LOG_BUF 65536
#define WORK_BUF 65536
#define LOCALE_SIZE 512
#define LOCALE_ELEM 128
#define GUI_MAX_ELEM 512
#define GUI_STR_SIZE 256
#define SHD_INCLUDE 256
#define KEY_MAXBINDS 64
#define PERF_SECTIONS 10
#define CVAR_MAX 256
#define CCMD_MAX 256
#define CON_BUF 32768
#define CON_LINE 1024
#define HUD_MSGS 128
#define HUD_BUF 16384
#define VID_MODES 28
#define VID_MODE_STR 32
#define SND_QUEUE 1024
#define SND_LOG 256
#define SND_LOG_LEN 256
#define COLL_MAX 1024
#define MATERIAL_MAX 4096
#define SND_INFO 64
#define SND_KAR 72
#define SND_KLOG 5
#define BANK_MAX 64
#define GUI_AUX_STR 320
// numerical constants
#define GLM_E 2.71828182845904523536028747135266250 /* e */
#define GLM_LOG2E 1.44269504088896340735992468100189214 /* log2(e) */
#define GLM_LOG10E 0.434294481903251827651128918916605082 /* log10(e) */
#define GLM_LN2 0.693147180559945309417232121458176568 /* loge(2) */
#define GLM_LN10 2.30258509299404568401799145468436421 /* loge(10) */
#define GLM_PI 3.14159265358979323846264338327950288 /* pi */
#define GLM_PI_2 1.57079632679489661923132169163975144 /* pi/2 */
#define GLM_PI_4 0.785398163397448309615660845819875721 /* pi/4 */
#define GLM_1_PI 0.318309886183790671537767526745028724 /* 1/pi */
#define GLM_2_PI 0.636619772367581343075535053490057448 /* 2/pi */
#define GLM_2_SQRTPI 1.12837916709551257389615890312154517 /* 2/sqrt(pi) */
#define GLM_SQRT2 1.41421356237309504880168872420969808 /* sqrt(2) */
#define GLM_SQRT1_2 0.707106781186547524400844362104849039 /* 1/sqrt(2) */
#define GLM_Ef ((float)GLM_E)
#define GLM_LOG2Ef ((float)GLM_LOG2E)
#define GLM_LOG10Ef ((float)GLM_LOG10E)
#define GLM_LN2f ((float)GLM_LN2)
#define GLM_LN10f ((float)GLM_LN10)
#define GLM_PIf ((float)GLM_PI)
#define GLM_PI_2f ((float)GLM_PI_2)
#define GLM_PI_4f ((float)GLM_PI_4)
#define GLM_1_PIf ((float)GLM_1_PI)
#define GLM_2_PIf ((float)GLM_2_PI)
#define GLM_2_SQRTPIf ((float)GLM_2_SQRTPI)
#define GLM_SQRT2f ((float)GLM_SQRT2)
#define GLM_SQRT1_2f ((float)GLM_SQRT1_2)
#define FILE_FLAG_IGNMISS 0x01
#define FILE_FLAG_IGNEMPTY 0x02
#define FILE_FLAG_STRING 0x04
#define TEX_FLAG_FLIP 0x01
#define TEX_FLAG_FILTER 0x02
#define TEX_FLAG_MIPMAP 0x04
#define TEX_FLAG_NMIPMAP 0x08
#define WIN_BORDER 2
#define WIN_TITLEBAR 20
#define WIN_MINX (WIN_BORDER * 2)
#define WIN_MINY (WIN_TITLEBAR + WIN_BORDER * 2)
#define SHD_FLAG_UL 0x01
#define SHD_FLAG_CL 0x02
#define SHD_FLAG_BL 0x04
#define SHD_FLAG_FD 0x08
#define SHD_TRACE_SIZE 1024
#define ERR_LOG_SIZE 1024
#define CCMD_UNLIMITED 65535
#define GUI_SCROLL_LN 3
#define KEY_BINDS 20
#define CHUNK_SIZE 32
#define CHUNK_POLY_GROW 32
// #define CHUNK_LIGHT_WIDTH (CHUNK_SIZE * 2)
// #define CHUNK_LIGHT_BORDER 2
// #define CHUNK_LIGHT_SIZE (CHUNK_LIGHT_WIDTH + (CHUNK_LIGHT_BORDER * 2))
#define WORLD_CLAMP_XZ 0x01
#define WORLD_CLAMP_Y 0x02
#define MID_DEFTEMPO 500000
#define BANK_KEEP 0x01
#define BANK_UNKN 0x02
#define BANK_PBRANGE 2.0
#define RSM_FRAC 10
#define WAV_HDRSIZE 44
#define BNK_IDX_MELO_ONLY 25
#define BNK_IDX_DRUM_ONLY 30
#define SND_VOLUMES 4
#define SND_LOGX 8
#define MOUSE_BTNS 8
// #define GUI_REFRESH 0xfd
#define GUI_INVALID 0xff
#define UNI_MAX_PAGES 4352
#define LIGHT_SSIZE (sizeof(float) * 20)
// strings, characters, ...
#define COL_RESET "\x01"
#define COL_AUX1 "\x02"
#define COL_AUX2 "\x03"
#define COL_AUX3 "\x04"
#define COL_AUX4 "\x05"
#define COL_AUX5 "\x06"
#define COL_AUX6 "\x07"
#define COL_AUX7 "\x08"
#define COL_AUX8 "\x09"
#define STR_NLN "\x0a"
#define FMT_RESET "\x0b"
#define FMT_ULINE "\x0c"
#define FMT_CLINE "\x0d"
#define FMT_BLINK "\x0e"
#define FMT_FADE "\x0f"
#define COL_BLACK "\x10"
#define COL_DGRAY "\x11"
#define COL_GRAY "\x12"
#define COL_LGRAY "\x13"
#define COL_WHITE "\x14"
#define COL_RED "\x15"
#define COL_GREEN "\x16"
#define COL_BLUE "\x17"
#define COL_YELLOW "\x18"
#define COL_MAGENTA "\x19"
#define COL_CYAN "\x1a"
#define COL_VIOLET "\x1b"
#define COL_ORANGE "\x1c"
#define COL_CRIMSON "\x1d"
#define COL_MIDNIGHT "\x1e"
#define COL_NEON "\x1f"
#define STR_SPC "\x20"
#define STR_UNK "\x7f"
#define STR_WSPC "\u3000"
#define CHR_CRESET 0x01
#define CHR_COLORS2 0x02
#define CHR_COLORE2 0x09
#define CHR_NLN 0x0a
#define CHR_FRESET 0x0b
#define CHR_ULINE 0x0c
#define CHR_CLINE 0x0d
#define CHR_BLINK 0x0e
#define CHR_FADE 0x0f
#define CHR_COLORS1 0x10
#define CHR_COLORE1 0x1f
#define CHR_SPC 0x20
#define CHR_UNK 0x7f
#define CHR_WSPC 0x3000
#define LOG_SYS "SYS"
#define LOG_MEM "MEM"
#define LOG_GFX "OGL"
#define LOG_IO "FIO"
#define LOG_CON "CON"
#define LOG_TIC "TIC"
#define LOG_SND "SND"
#define LOG_X11 "X11"
#define LOG_GLX "GLX"
#define DIR_SCREENSHOTS "screenshots"
#define DIR_BANKS "banks"
#define DIR_SHADERS "shaders"
#define SHD_VERSION "450 core"
#define SYM_IMP "\U0001f47f"
#define SYM_BLKHEART "\U0001f5a4"
#define SYM_DEMON "\U0001f608"
#define SYM_HORNS "\U0001f918"
#define SYM_PLAY "\U00100000"
#define SYM_STOP "\U00100001"
#define SYM_PAUSE "\U00100002"
#define SYM_NEXT "\U00100003"
#define SYM_PREV "\U00100004"
#define SYM_FFORWARD "\U00100005"
#define SYM_FREVERSE "\U00100006"
#define SYM_CONTINUOS "\U00100007"
#define SYM_REPEAT "\U00100008"
#define SYM_LOOPED "\U00100009"
#define SYM_SHUFFLE "\U0010000a"
#define SYM_PRANDOM "\U0010000b"
#define SYM_JUMPTO "\U0010000c"
#define SYM_FOLDER "\U0010000d"
#define SYM_DELETE "\U0010000e"
#define SYM_SAVEDISK "\U0010000f"
#define SYM_BUG "\U00100010"
#define SYM_INVALID "\U00100011"
#define KEYSYM_0 1
#define KEYSYM_1 2
#define KEYSYM_2 3
#define KEYSYM_3 4
#define KEYSYM_4 5
#define KEYSYM_5 6
#define KEYSYM_6 7
#define KEYSYM_7 8
#define KEYSYM_8 9
#define KEYSYM_9 10
#define KEYSYM_A 11
#define KEYSYM_B 12
#define KEYSYM_C 13
#define KEYSYM_D 14
#define KEYSYM_E 15
#define KEYSYM_F 16
#define KEYSYM_G 17
#define KEYSYM_H 18
#define KEYSYM_I 19
#define KEYSYM_J 20
#define KEYSYM_K 21
#define KEYSYM_L 22
#define KEYSYM_M 23
#define KEYSYM_N 24
#define KEYSYM_O 25
#define KEYSYM_P 26
#define KEYSYM_Q 27
#define KEYSYM_R 28
#define KEYSYM_S 29
#define KEYSYM_T 30
#define KEYSYM_U 31
#define KEYSYM_V 32
#define KEYSYM_W 33
#define KEYSYM_X 34
#define KEYSYM_Y 35
#define KEYSYM_Z 36
#define KEYSYM_F1 37
#define KEYSYM_F2 38
#define KEYSYM_F3 39
#define KEYSYM_F4 40
#define KEYSYM_F5 41
#define KEYSYM_F6 42
#define KEYSYM_F7 43
#define KEYSYM_F8 44
#define KEYSYM_F9 45
#define KEYSYM_F10 46
#define KEYSYM_F11 47
#define KEYSYM_F12 48
#define KEYSYM_KP_0 49
#define KEYSYM_KP_1 50
#define KEYSYM_KP_2 51
#define KEYSYM_KP_3 52
#define KEYSYM_KP_4 53
#define KEYSYM_KP_5 54
#define KEYSYM_KP_6 55
#define KEYSYM_KP_7 56
#define KEYSYM_KP_8 57
#define KEYSYM_KP_9 58
#define KEYSYM_SPACE 59
#define KEYSYM_CIRCUMFLEX 60
#define KEYSYM_SHARP_S 61
#define KEYSYM_ACUTE 62
#define KEYSYM_UE 63
#define KEYSYM_PLUS 64
#define KEYSYM_OE 65
#define KEYSYM_AE 66
#define KEYSYM_NUMBER_SIGN 67
#define KEYSYM_LESS_THAN 68
#define KEYSYM_COMMA 69
#define KEYSYM_PERIOD 70
#define KEYSYM_HYPHEN 71
#define KEYSYM_KP_DECIMAL 72
#define KEYSYM_KP_DIVIDE 73
#define KEYSYM_KP_MULTIPLY 74
#define KEYSYM_KP_SUBTRACT 75
#define KEYSYM_KP_ADD 76
#define KEYSYM_KP_ENTER 77
#define KEYSYM_KP_EQUAL 78
#define KEYSYM_CAPS_LOCK 79
#define KEYSYM_SCROLL_LOCK 80
#define KEYSYM_NUM_LOCK 81
#define KEYSYM_ESCAPE 82
#define KEYSYM_RETURN 83
#define KEYSYM_TAB 84
#define KEYSYM_BACKSPACE 85
#define KEYSYM_INSERT 86
#define KEYSYM_DELETE 87
#define KEYSYM_RIGHT 88
#define KEYSYM_LEFT 89
#define KEYSYM_DOWN 90
#define KEYSYM_UP 91
#define KEYSYM_PAGE_UP 92
#define KEYSYM_PAGE_DOWN 93
#define KEYSYM_HOME 94
#define KEYSYM_END 95
#define KEYSYM_PRINT_SCREEN 96
#define KEYSYM_PAUSE 97
#define KEYSYM_LEFT_SHIFT 98
#define KEYSYM_LEFT_CONTROL 99
#define KEYSYM_ALT 100
#define KEYSYM_LEFT_META 101
#define KEYSYM_RIGHT_SHIFT 102
#define KEYSYM_RIGHT_CONTROL 103
#define KEYSYM_ALT_GRAPH 104
#define KEYSYM_RIGHT_META 105
#define KEYSYM_MENU 106
#define KEYSYM_FIRST KEYSYM_SPACE
#define KEYSYM_LAST KEYSYM_MENU
#define KEY_MOUSE_OFFSET (1 + KEYSYM_LAST - KEYSYM_FIRST)
#define STR_ARG_USAGE "Verwendung"
#define STR_ARG_HELP "Diese Hilfe anzeigen"
#define STR_ARG_OPVEC "Option %s (-%c)"
#define STR_ARG_OPPOS "Option %s (#%d)"
#define STR_ARG_EINT "muss ein ganzzahliger Wert sein"
#define STR_ARG_ERANGE "muss sich im Bereich %d .. %d befinden"
#define STR_ARG_UNKNOWN "Unbekannte Option -%c"
#define STR_ARG_EMORE "Zu viele Argumente, Maximum %d"
#define STR_ARG_ELESS "Nicht genug Argumente, Minimum %d"
#define STR_ARG_EREQARG STR_ARG_OPVEC " benoetigt ein Argument"
#define STR_ARG_EINT_V STR_ARG_OPVEC " " STR_ARG_EINT
#define STR_ARG_EINT_P STR_ARG_OPPOS " " STR_ARG_EINT
#define STR_ARG_ERANGE_V STR_ARG_OPVEC " " STR_ARG_ERANGE
#define STR_ARG_ERANGE_P STR_ARG_OPPOS " " STR_ARG_ERANGE
#define ARGSTR_COMMANDS "Befehle"
#define ARGSTR_VERSION "Version ausgeben und beenden"
#define ARGSTR_LOGLEVEL "Ausgabestufe"
#define ARGSTR_GLDEBUG "OpenGL-Debugging"
#define ARGSTR_NOSOUND "Tonausgabe deaktivieren"
#define ARGSTR_CONFIG "Konfigurationsdatei"
#define ARGSTR_LANG "Sprachdatei"
#define SYS_BUILD "D" STRINGIZE(BUILD_ID)
#define SYS_PROGRAM SYS_PROGNAME " " SYS_BUILD
#define SYS_PROGRAM_FULL SYS_PROGRAM " [" BUILD_DATE "]"
// macros
#define SIZE_TEST(t, s) assert((sizeof(t) * 8) == s)
#define STRINGIZE(s) ISTRINGIZE(s)
#define ISTRINGIZE(s) #s
#define f_inline static inline __attribute((always_inline))
#define f_align(x) __attribute((aligned(x)))
#define LOG_FUNC(func, level) void func(const char *prefix, const char *fmt, ...) { va_list ap; va_start(ap, fmt); log_msg(prefix, level, fmt, ap); va_end(ap); }
#define SLOG_FUNC(func, level) void func(const char *fmt, ...) { va_list ap; va_start(ap, fmt); snd_log(level, fmt, ap); va_end(ap); }
#define file_read(d, f) file_read_hdr(d, f, NULL, 0, 0)
#define file_sread(d, f) file_read_hdr((byte**)(d), f, NULL, 0, FILE_FLAG_IGNMISS | FILE_FLAG_STRING)
#define LOAD_SHADER(f, r, s) if(!shd_load(&(gdr.shd_ ## f), DIR_SHADERS "/" STRINGIZE(f) ".vsh", DIR_SHADERS "/" STRINGIZE(f) ".fsh", r, (shd_dfunc*)s)) { loge(LOG_GFX, STR_SHD_ELOAD, STRINGIZE(f)); return 0; }
#define FONT_STRIDE(x, y, c) ((((c & 15) * width + x) + (((c >> 4) & 15) * height + y) * (width << 4)) << 2)
#define PERF_FIRST() sys.tmr_atime = tmr_time();
#define PERF_START(s) sys.tmr_ftime = sys.tmr_stime = tmr_time(); sys.perf_pos = s;
#define PERF_SEC(s) sys.tmr_dtime = tmr_time() - sys.tmr_ftime; sys.tmr_ftime = tmr_time(); sys.tmr_total[sys.perf_pos] += sys.tmr_profile[sys.perf_swap + sys.perf_pos] = sys.tmr_dtime; sys.perf_pos = s;
#define PERF_END() sys.tmr_dtime = (sys.tmr_etime = tmr_time()) - sys.tmr_ftime; sys.tmr_total[sys.perf_pos] += sys.tmr_profile[sys.perf_swap + sys.perf_pos] = sys.tmr_dtime; sys.tmr_ttime = sys.tmr_etime - sys.tmr_stime; sys.tmr_iters += 1; sys.perf_swap = sys.perf_swap ? 0 : PERF_SECTIONS;
#define PERF_LAST() sys.tmr_atime = tmr_time() - sys.tmr_atime;
#define CLAMP_VALUE(v, a, b) ((v) < (a) ? (a) : ((v) > (b) ? (b) : (v)))
#define MIN_VALUE(a, b) ((a) < (b) ? (a) : (b))
#define MAX_VALUE(a, b) ((a) > (b) ? (a) : (b))
#define VEC3_SET(v, x, y, z) v[0] = x; v[1] = y; v[2] = z;
#define AABB_OFFSET(bb, x, y, z) bb.x1 += x; bb.x2 += x; bb.y1 += y; bb.y2 += y; bb.z1 += z; bb.z2 += z;
#define AABB_SET(bb, px1, py1, pz1, px2, py2, pz2) bb.x1 = px1; bb.x2 = px2; bb.y1 = py1; bb.y2 = py2; bb.z1 = pz1; bb.z2 = pz2;
#define AABB_PSET(bb, px1, py1, pz1, px2, py2, pz2) bb->x1 = px1; bb->x2 = px2; bb->y1 = py1; bb->y2 = py2; bb->z1 = pz1; bb->z2 = pz2;
#define AABB_COPY(aa, bb) memcpy(&bb, &aa, sizeof(bbox_t))
#define AABB_PCOPY(aa, bb) memcpy(bb, aa, sizeof(bbox_t))
// #define CHUNK_STRIDE(w, x, y, z) (((x) + w->size_x / 2) + w->size_x * (((z) + w->size_z / 2) + (w->size_z * ((y) + w->size_y / 2))))
// #define CHUNK_OUT(w, x, y, z) ((x) < -(w->size_x / 2) || (y) < -(w->size_y / 2) || (z) < -(w->size_z / 2) || (x) >= ((w->size_x + 1) / 2) || (y) >= ((w->size_y + 1) / 2) || (z) >= ((w->size_z + 1) / 2))
// #define CHUNK_CLAMP(w, v, c) CLAMP_VALUE(v, -(w->size_ ## c / 2), ((w->size_ ## c + 1) / 2) - 1)
#define BANK_VELOFUNC(x, n) (1.0-log(1.0+((1.0-pow(x,n))*(M_E-1.0))))
/* input: [0, 256), output: [0, 65536] */
#define OPL_SIN(x) ((int)(sin((x) * M_PI / 512.0) * 65536.0))
#define SYS_BASE (sizeof(sys_t) + sizeof(gfx_t) + sizeof(isnd_t) + sizeof(snd_t) + sizeof(wcf_t))
#define DL_LOPEN(name) dlopen(name, RTLD_LAZY | RTLD_LOCAL)
#define X [0]
#define Y [1]
#define Z [2]
#define NEG_OFFSET(x, d) (x < 0 ? ((x / d) - 1) : (x / d))
#define sys_assert(expr) if(!(expr)){sys_panic("ASSERTION_FAILURE", "Falsch: " STRINGIZE(expr));}
#define CHUNK_ID(x, y, z) (((ulong)(x & 0xfffff) | (x < 0 ? 0x100000ULL : 0ULL)) | (((ulong)(y & 0xfffff) | (y < 0 ? 0x100000ULL : 0ULL)) << 21) | \
(((ulong)(z & 0xfffff) | (z < 0 ? 0x100000ULL : 0ULL)) << 42) | 0x8000000000000000)
// enums
enum mem_category {
MEM_SYSTEM,
MEM_IMAGE,
MEM_FONT,
MEM_DRAW,
MEM_FILE,
MEM_LIGHTS,
MEM_WORLD,
MEM_POLY,
MEM_CHUNK,
MEM_OBJECT,
MEM_OBJMAP,
MEM_MISC
};
enum log_level {
LOG_SILENT, LOG_USER, LOG_ERROR, LOG_WARN, LOG_INFO, LOG_PERF, LOG_DEBUG, LOG_TRACE
};
enum gui_type {
GUI_LABEL,
GUI_BUTTON,
GUI_TOGGLE_OFF,
GUI_TOGGLE_ON,
GUI_ENUM,
GUI_SLIDER,
GUI_SLIDER_HANDLE,
GUI_DROPDOWN,
GUI_DROPDOWN_HANDLE,
GUI_FIELD,
GUI_CUSTOM
};
enum key_event {
KEY_RELEASE,
KEY_PRESS,
KEY_REPEAT
};
enum key_bind {
KEY_QUIT,
KEY_SCREENSHOT,
KEY_CONSOLE,
KEY_SHOW,
KEY_FULLSCREEN,
KEY_SYNC,
KEY_MENU,
KEY_DOWN,
KEY_UP,
KEY_FORWARD,
KEY_BACKWARD,
KEY_LEFT,
KEY_RIGHT,
KEY_FAST,
KEY_NOCLIP,
KEY_FLY,
KEY_ZOOM_IN,
KEY_ZOOM_OUT,
KEY_CAMERA,
KEY_PLAYER
};
enum mouse_button {
MOUSE_LEFT = 1,
MOUSE_RIGHT,
MOUSE_MIDDLE,
MOUSE_BTN_X,
MOUSE_BTN_Y,
MOUSE_BTN_A,
MOUSE_BTN_B,
MOUSE_BTN_C,
SCROLL_UP,
SCROLL_DOWN,
SCROLL_LEFT,
SCROLL_RIGHT
};
enum perf_section {
PERF_TIMING,
PERF_INPUT,
PERF_TICK,
PERF_UPDATE,
PERF_RENDER,
PERF_GUI,
PERF_REST,
PERF_SWAP,
PERF_EVENTS,
PERF_WAIT
};
enum cvar_type {
CVAR_BOOL,
CVAR_INT,
CVAR_FLOAT,
CVAR_ENUM,
CVAR_COLOR,
CVAR_COLOR_ALPHA,
CVAR_KEY
};
enum cvar_category {
CVAR_SYSTEM,
CVAR_WINDOW,
CVAR_GUI,
CVAR_STYLE,
CVAR_RENDER,
CVAR_BIND,
CVAR_CONSOLE,
CVAR_PHYSICS,
CVAR_WORLD,
CVAR_SOUND
};
enum move_dir {
DIR_LEFT,
DIR_RIGHT,
DIR_DOWN,
DIR_UP,
DIR_BACKWARD,
DIR_FORWARD
};
enum cardinal_dir {
FACE_WEST,
FACE_EAST,
FACE_DOWN,
FACE_UP,
FACE_NORTH,
FACE_SOUTH
};
enum mipmap_type {
MIP_NONE,
MIP_NEAREST,
MIP_LINEAR
};
enum geom_type {
GEOM_TRI,
GEOM_QUAD,
GEOM_PLANE
};
enum mid_event {
midev_noteoff = 0x80,
midev_noteon = 0x90,
midev_aftertouch = 0xa0,
midev_control = 0xb0,
midev_progchg = 0xc0,
midev_chnpressure = 0xd0,
midev_pitchbend = 0xe0,
midev_sysex = 0xf0,
midev_songpos = 0xf2,
midev_songsel = 0xf3,
midev_tunereq = 0xf6,
midev_endsysex = 0xf7,
midev_clock = 0xf8,
midev_start = 0xfa,
midev_continue = 0xfb,
midev_stop = 0xfc,
midev_actsense = 0xfe,
midev_meta = 0xff
};
enum mid_meta {
midmt_seqnum = 0x00, // nn nn
midmt_text = 0x01, // text...
midmt_copyright = 0x02, // text...
midmt_trackname = 0x03, // text...
midmt_instrname = 0x04, // text...
midmt_lyric = 0x05, // text...
midmt_marker = 0x06, // text...
midmt_cuepoint = 0x07, // text...
midmt_chnprefix = 0x20, // cc
midmt_endtrack = 0x2f, //
midmt_tempo = 0x51, // tt tt tt
midmt_smpte = 0x54, // hr mn se fr ff
midmt_timesig = 0x58, // nn dd cc bb
midmt_keysig = 0x59, // sf mi
midmt_seqspec = 0x7f // data...
};
enum bank_op {
b_op2,
b_op4,
b_op22,
b_op0
};
enum opl3_op {
ch_2op = 0,
ch_4op = 1,
ch_4op2 = 2
};
enum envelope_gen_num {
envelope_gen_num_attack = 0,
envelope_gen_num_decay = 1,
envelope_gen_num_sustain = 2,
envelope_gen_num_release = 3
};
enum snd_volume {
SND_VOL_MASTER,
SND_VOL_MUSIC,
SND_VOL_SFX,
SND_VOL_GUI
};
// types
typedef int ivec2[2];
typedef int ivec3[3];
typedef int ivec4[4];
typedef float vec2[2];
typedef float vec3[3];
typedef f_align(16) float vec4[4];
typedef f_align(16) vec2 mat2[2];
typedef vec3 mat3[3];
typedef f_align(16) vec4 mat4[4];
// arrays
static const char *mem_types[] = {"system", "textures", "fonts", "rendering", "files", "lighting", "worlds", "polys", "chunks", "objects", "mapping", "misc"};
static const char *log_levels[] = {"UNK?", "USER", "ERR!", "WARN", "INFO", "PERF", "DBG#", "TRC#"};
static const char *log_elevels[] = {"silent", "user", "error", "warn", "info", "perf", "debug", "trace"};
static const char *log_colors[] = {"", COL_WHITE, COL_RED, COL_YELLOW, COL_BLUE, COL_CYAN, COL_MAGENTA, COL_VIOLET};
static const char *perf_sections[] = {"Timing", "Input", "Tick", "Update", "Render", "Gui", "Rest", "Swap", "Events", "Wait"};
static const char *cvar_types[] = {COL_MAGENTA"bool", COL_GREEN"int", COL_YELLOW"float", COL_CYAN"enum", COL_LGRAY"color", COL_GRAY"color32", COL_VIOLET"key"};
static const char *cvar_categories[] = {COL_RED"system", COL_BLUE"window", COL_GREEN"gui", COL_VIOLET"style", COL_NEON"render", COL_ORANGE"bind", COL_YELLOW"console", COL_CYAN"physics", COL_MAGENTA"world",
COL_CRIMSON"sound"};
// BLACK DGRAY GRAY LGRAY WHITE RED GREEN BLUE YELLOW MAGENTA CYAN VIOLET ORANGE CRIMSON MIDNIGHT NEON
static const uint text_colors[] = {0x000000, 0x585858, 0x808080, 0xc0c0c0, 0xffffff, 0xcf0000, 0x00cf00, 0x0000cf, 0xbfbf00, 0xbf00bf, 0x00bfbf, 0x6000ff, 0xff7000, 0x601010, 0x000080, 0x80c0f0};
static const uint aux_colors[] = {0x80f0c0, 0x3000c0, 0x56250b, 0x80ff00, 0x202020, 0x606060, 0xa0a0a0, 0xe0e0e0};
static const char dc32_ascii[] = { // 0x1f -> AUX1
0, ' ', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'G', // $00, $80
'H', 'I', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'V', 'W', 'X', 'Z', 0 // $10, $90
};
static const char dc32_aux1[] = { // 0x01 -> lc / UC, 0x1f -> AUX2
0, 0, '!', '"', '#', '$', '%', '&', '\'', '*', '+', ',', '-', '.', '/', 'F', // $20, $A0
':', '1', 'J', ';', '=', '?', '0', '\\', 'Q', '^', '_', 'U', '|', '~', 'Y', 0 // $30, $B0
};
static const char dc32_aux2[] = { // 0x0f -> [0x10 ~ 0x1f ... 0x0f -> UTF] | [0x01 ~ 0x0e -> AUX3], 0x0c -> STR_WSPC
0, 0x01, '(', ')', '<', '>', '@', '[', ']', '`', '{', '}', 0, 0x7f, 0x0a, 0, // $40
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f // $50
};
static const char dc32_aux3[] = { // 0x01 -> SYM_DEMON
0, 0, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0 // $60
};
static const char plr_wheel[] = { '/', '-', '\\', '|'};
static const byte ascii_dc32[] = {
0x00, 0x41, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x4e, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e,
0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
0x01, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x42, 0x43, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e,
0x36, 0x31, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x30, 0x33, 0x44, 0x34, 0x45, 0x35,
0x46, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x2f, 0x0f, 0x10, 0x11, 0x32, 0x12, 0x13, 0x14, 0x15, 0x16,
0x17, 0x38, 0x18, 0x19, 0x1a, 0x3b, 0x1b, 0x1c, 0x1d, 0x3e, 0x1e, 0x47, 0x37, 0x48, 0x39, 0x3a,
0x49, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0xaf, 0x8f, 0x90, 0x91, 0xb2, 0x92, 0x93, 0x94, 0x95, 0x96,
0x97, 0xb8, 0x98, 0x99, 0x9a, 0xbb, 0x9b, 0x9c, 0x9d, 0xbe, 0x9e, 0x4a, 0x3c, 0x4b, 0x3d, 0x4d
};
static const byte ascii_dc32s[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0x16, 0x11, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0, 0, 0, 0, 0, 0,
0, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x1b, 0x0f, 0x10, 0x11, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,
0x17, 0x16, 0x18, 0x19, 0x1a, 0x1b, 0x1b, 0x1c, 0x1d, 0x1d, 0x1e, 0, 0, 0, 0, 0,
0, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x1b, 0x0f, 0x10, 0x11, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,
0x17, 0x16, 0x18, 0x19, 0x1a, 0x1b, 0x1b, 0x1c, 0x1d, 0x1d, 0x1e, 0, 0, 0, 0, 0
};
static const float vert_quad[] = {0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f};
/*
static const float vert_box[] = {
// x y z nx ny nz u v
-1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, // -Z
1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f,
1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f,
1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f,
-1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f,
-1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,
-1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, // +Z
1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,
1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
-1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f,
-1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
-1.0f, 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, // -X
-1.0f, 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 1.0f,
-1.0f, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
-1.0f, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
-1.0f, -1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
-1.0f, 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, // +X
1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f,
1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
1.0f, -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
-1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f, // -Y
1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f,
1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f,
1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f,
-1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f,
-1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f,
-1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, // +Y
1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,
1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,
-1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
-1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f
};
*/
static const char *mipmap_etype[] = {"off", "nearest", "linear"};
static const char *snd_eformat[] = {"s16le", "s32le"};
static const char *snd_edevice[] = {"default", "null", "jack", "pulse", "hw", "plughw", "none"};
static const char *con_epositions[] = {"top", "bottom"};
static const char *mid_extensions[] = {"mid", "kar", "midi"};
static const char *snd_cvar_volume[] = {"snd_volume_master", "snd_volume_music", "snd_volume_sfx", "snd_volume_gui"};
static const char *key_names[] = {
"space", "^", "ß", "´", "ü", "+", "ö", "ä", "#", "<", ",", ".", "-",
"kp.", "kp/", "kp*", "kp-", "kp+", "enter", "kp=",
"caps", "scroll", "num",
"esc", "return", "tab", "bksp", "ins", "del", "right", "left", "down", "up", "pgup", "pgdn", "home", "end", "print", "pause",
"lshift", "lctrl", "alt", "lmeta", "rshift", "rctrl", "altgr", "rmeta", "menu",
"lmb", "rmb", "mmb", "xmb", "ymb", "m6", "m7", "m8", "scrup", "scrdn", "scrl", "scrr"
};
static const char *snd_banknames[] = {
"dmx_dmx", "dmx_doom1", "dmx_doom2", "dmx_raptor", "dmx_strife", "wolfinstein", "std_o3", "std_sb", "hmi_144", "cyberpuck",
"d3dtimbr", "d3dtimbr_mod", "gmoconel", "gmopl_mod", "swtimbr", "tmb_default", "wallence", "fat2", "fat4", "op2x2", "wallace",
"earthsieg", "warcraft", "nemesis", "bank49",
"jv_2op", "gmopl", "mt32", "insmaker_std", "bank53",
"drumopl"
};
static const char *snd_bankfiles[] = {
DIR_BANKS"/dmx_dmx.op2", DIR_BANKS"/dmx_doom1.op2", DIR_BANKS"/dmx_doom2.op2", DIR_BANKS"/dmx_raptor.op2",
DIR_BANKS"/dmx_strife.op2", DIR_BANKS"/wolfinstein.op2", DIR_BANKS"/std_o3.skb", DIR_BANKS"/std_sb.skb",
DIR_BANKS"/hmi_144.skb", DIR_BANKS"/cyberpuck.tmb", DIR_BANKS"/d3dtimbr.tmb", DIR_BANKS"/d3dtimbr_mod.tmb",
DIR_BANKS"/gmoconel.tmb", DIR_BANKS"/gmopl_mod.tmb", DIR_BANKS"/swtimbr.tmb", DIR_BANKS"/tmb_default.tmb",
DIR_BANKS"/wallence.op3", DIR_BANKS"/fat2.op3", DIR_BANKS"/fat4.op3", DIR_BANKS"/op2x2.op3",
DIR_BANKS"/wallace.op3", DIR_BANKS"/earthsieg.ad", DIR_BANKS"/warcraft.ad", DIR_BANKS"/nemesis.opl",
DIR_BANKS"/bank49.opl", DIR_BANKS"/jv_2op.op3", DIR_BANKS"/gmopl.ibk", DIR_BANKS"/mt32.ibk",
DIR_BANKS"/insmaker_std.bnk", DIR_BANKS"/bank53.opl", DIR_BANKS"/drumopl.tmb"
};
static const char *mid_hdr = "MThd";
static const char *mid_trk = "MTrk";
static const uint bank_notes[] = {
8175, 8661, 9177, 9722, 10300, 10913, 11562, 12249,
12978, 13750, 14567, 15433, 16351, 17323, 18354, 19445,
20601, 21826, 23124, 24499, 25956, 27500, 29135, 30867,
32703, 34647, 36708, 38890, 41203, 43653, 46249, 48999,
51913, 55000, 58270, 61735, 65406, 69295, 73416, 77781,
82406, 87307, 92498, 97998, 103826, 110000, 116540, 123470,
130812, 138591, 146832, 155563, 164813, 174614, 184997, 195997,
207652, 220000, 233081, 246941, 261625, 277182, 293664, 311126,
329627, 349228, 369994, 391995, 415304, 440000, 466163, 493883,
523251, 554365, 587329, 622253, 659255, 698456, 739988, 783990,
830609, 880000, 932327, 987766, 1046502, 1108730, 1174659, 1244507,
1318510, 1396912, 1479977, 1567981, 1661218, 1760000, 1864655, 1975533,
2093004, 2217461, 2349318, 2489015, 2637020, 2793825, 2959955, 3135963,
3322437, 3520000, 3729310, 3951066, 4186009, 4434922, 4698636, 4978031,
5274040, 5587651, 5919910, 6271926, 6644875, 7040000, 7458620, 7902132,
8372018, 8869844, 9397272, 9956063, 10548081, 11175303, 11839821, 12543853
};
static const uint opl3_maxfreq[] = {
48503,
97006,
194013,
388026,
776053,
1552107,
3104215,
6208431
};
static const ushort logsinrom[256] = {
0x859, 0x6c3, 0x607, 0x58b, 0x52e, 0x4e4, 0x4a6, 0x471,
0x443, 0x41a, 0x3f5, 0x3d3, 0x3b5, 0x398, 0x37e, 0x365,
0x34e, 0x339, 0x324, 0x311, 0x2ff, 0x2ed, 0x2dc, 0x2cd,
0x2bd, 0x2af, 0x2a0, 0x293, 0x286, 0x279, 0x26d, 0x261,
0x256, 0x24b, 0x240, 0x236, 0x22c, 0x222, 0x218, 0x20f,
0x206, 0x1fd, 0x1f5, 0x1ec, 0x1e4, 0x1dc, 0x1d4, 0x1cd,
0x1c5, 0x1be, 0x1b7, 0x1b0, 0x1a9, 0x1a2, 0x19b, 0x195,
0x18f, 0x188, 0x182, 0x17c, 0x177, 0x171, 0x16b, 0x166,
0x160, 0x15b, 0x155, 0x150, 0x14b, 0x146, 0x141, 0x13c,
0x137, 0x133, 0x12e, 0x129, 0x125, 0x121, 0x11c, 0x118,
0x114, 0x10f, 0x10b, 0x107, 0x103, 0x0ff, 0x0fb, 0x0f8,
0x0f4, 0x0f0, 0x0ec, 0x0e9, 0x0e5, 0x0e2, 0x0de, 0x0db,
0x0d7, 0x0d4, 0x0d1, 0x0cd, 0x0ca, 0x0c7, 0x0c4, 0x0c1,
0x0be, 0x0bb, 0x0b8, 0x0b5, 0x0b2, 0x0af, 0x0ac, 0x0a9,
0x0a7, 0x0a4, 0x0a1, 0x09f, 0x09c, 0x099, 0x097, 0x094,
0x092, 0x08f, 0x08d, 0x08a, 0x088, 0x086, 0x083, 0x081,
0x07f, 0x07d, 0x07a, 0x078, 0x076, 0x074, 0x072, 0x070,
0x06e, 0x06c, 0x06a, 0x068, 0x066, 0x064, 0x062, 0x060,
0x05e, 0x05c, 0x05b, 0x059, 0x057, 0x055, 0x053, 0x052,
0x050, 0x04e, 0x04d, 0x04b, 0x04a, 0x048, 0x046, 0x045,
0x043, 0x042, 0x040, 0x03f, 0x03e, 0x03c, 0x03b, 0x039,
0x038, 0x037, 0x035, 0x034, 0x033, 0x031, 0x030, 0x02f,
0x02e, 0x02d, 0x02b, 0x02a, 0x029, 0x028, 0x027, 0x026,
0x025, 0x024, 0x023, 0x022, 0x021, 0x020, 0x01f, 0x01e,
0x01d, 0x01c, 0x01b, 0x01a, 0x019, 0x018, 0x017, 0x017,
0x016, 0x015, 0x014, 0x014, 0x013, 0x012, 0x011, 0x011,
0x010, 0x00f, 0x00f, 0x00e, 0x00d, 0x00d, 0x00c, 0x00c,
0x00b, 0x00a, 0x00a, 0x009, 0x009, 0x008, 0x008, 0x007,
0x007, 0x007, 0x006, 0x006, 0x005, 0x005, 0x005, 0x004,
0x004, 0x004, 0x003, 0x003, 0x003, 0x002, 0x002, 0x002,
0x002, 0x001, 0x001, 0x001, 0x001, 0x001, 0x001, 0x001,
0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000
};
static const ushort exprom[256] = {
0x7fa, 0x7f5, 0x7ef, 0x7ea, 0x7e4, 0x7df, 0x7da, 0x7d4,
0x7cf, 0x7c9, 0x7c4, 0x7bf, 0x7b9, 0x7b4, 0x7ae, 0x7a9,
0x7a4, 0x79f, 0x799, 0x794, 0x78f, 0x78a, 0x784, 0x77f,
0x77a, 0x775, 0x770, 0x76a, 0x765, 0x760, 0x75b, 0x756,
0x751, 0x74c, 0x747, 0x742, 0x73d, 0x738, 0x733, 0x72e,
0x729, 0x724, 0x71f, 0x71a, 0x715, 0x710, 0x70b, 0x706,
0x702, 0x6fd, 0x6f8, 0x6f3, 0x6ee, 0x6e9, 0x6e5, 0x6e0,
0x6db, 0x6d6, 0x6d2, 0x6cd, 0x6c8, 0x6c4, 0x6bf, 0x6ba,
0x6b5, 0x6b1, 0x6ac, 0x6a8, 0x6a3, 0x69e, 0x69a, 0x695,
0x691, 0x68c, 0x688, 0x683, 0x67f, 0x67a, 0x676, 0x671,
0x66d, 0x668, 0x664, 0x65f, 0x65b, 0x657, 0x652, 0x64e,
0x649, 0x645, 0x641, 0x63c, 0x638, 0x634, 0x630, 0x62b,
0x627, 0x623, 0x61e, 0x61a, 0x616, 0x612, 0x60e, 0x609,
0x605, 0x601, 0x5fd, 0x5f9, 0x5f5, 0x5f0, 0x5ec, 0x5e8,
0x5e4, 0x5e0, 0x5dc, 0x5d8, 0x5d4, 0x5d0, 0x5cc, 0x5c8,
0x5c4, 0x5c0, 0x5bc, 0x5b8, 0x5b4, 0x5b0, 0x5ac, 0x5a8,
0x5a4, 0x5a0, 0x59c, 0x599, 0x595, 0x591, 0x58d, 0x589,
0x585, 0x581, 0x57e, 0x57a, 0x576, 0x572, 0x56f, 0x56b,
0x567, 0x563, 0x560, 0x55c, 0x558, 0x554, 0x551, 0x54d,
0x549, 0x546, 0x542, 0x53e, 0x53b, 0x537, 0x534, 0x530,
0x52c, 0x529, 0x525, 0x522, 0x51e, 0x51b, 0x517, 0x514,
0x510, 0x50c, 0x509, 0x506, 0x502, 0x4ff, 0x4fb, 0x4f8,
0x4f4, 0x4f1, 0x4ed, 0x4ea, 0x4e7, 0x4e3, 0x4e0, 0x4dc,
0x4d9, 0x4d6, 0x4d2, 0x4cf, 0x4cc, 0x4c8, 0x4c5, 0x4c2,
0x4be, 0x4bb, 0x4b8, 0x4b5, 0x4b1, 0x4ae, 0x4ab, 0x4a8,
0x4a4, 0x4a1, 0x49e, 0x49b, 0x498, 0x494, 0x491, 0x48e,
0x48b, 0x488, 0x485, 0x482, 0x47e, 0x47b, 0x478, 0x475,
0x472, 0x46f, 0x46c, 0x469, 0x466, 0x463, 0x460, 0x45d,
0x45a, 0x457, 0x454, 0x451, 0x44e, 0x44b, 0x448, 0x445,
0x442, 0x43f, 0x43c, 0x439, 0x436, 0x433, 0x430, 0x42d,
0x42a, 0x428, 0x425, 0x422, 0x41f, 0x41c, 0x419, 0x416,
0x414, 0x411, 0x40e, 0x40b, 0x408, 0x406, 0x403, 0x400
};
static const byte op_mt[16] = {
1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 20, 24, 24, 30, 30
};
static const byte kslrom[16] = {
0, 32, 40, 45, 48, 51, 53, 55, 56, 58, 59, 60, 61, 62, 63, 64
};
static const byte kslshift[4] = {
8, 1, 2, 0
};
static const byte eg_incstep[4][4] = {
{ 0, 0, 0, 0 },
{ 1, 0, 0, 0 },
{ 1, 0, 1, 0 },
{ 1, 1, 1, 0 }
};
static const char *wav_hdr = "RIFF";
static const char *wav_hdr_fmt = "fmt ";
static const char *wav_hdr_data = "data";
static const char *wav_format = "WAVE";
static const byte rng_table[256] = {
0x95, 0xbc, 0x64, 0x99, 0xc3, 0x31, 0x68, 0xc5, 0xba, 0xe2, 0x67, 0x66, 0xd1, 0x14, 0xce, 0xd7,
0x4c, 0xdb, 0x78, 0x41, 0xb9, 0xf3, 0x38, 0x55, 0x71, 0x1b, 0x5f, 0x83, 0x3c, 0xaf, 0xa7, 0x9c,
0x16, 0x9d, 0xe0, 0x54, 0x93, 0x5d, 0xaa, 0x2a, 0xef, 0xff, 0x6b, 0x4a, 0xfa, 0x39, 0x08, 0xcb,
0x97, 0x8b, 0x86, 0x2c, 0x60, 0xa0, 0xac, 0x4e, 0x7a, 0xc9, 0xd3, 0x1e, 0xee, 0xbb, 0x9b, 0x09,
0xca, 0x33, 0x9e, 0x0d, 0xbe, 0x75, 0x9a, 0x29, 0xf7, 0x88, 0xdd, 0x5c, 0x7e, 0xa3, 0x58, 0x94,
0x00, 0x74, 0xad, 0x17, 0x07, 0x84, 0x7c, 0x63, 0x76, 0xb6, 0x1c, 0xa1, 0xb8, 0x79, 0xf0, 0xf9,
0xb3, 0x98, 0x3e, 0xeb, 0x8a, 0x5e, 0x6e, 0x6a, 0x70, 0x7d, 0xc8, 0xa4, 0x01, 0x42, 0x2f, 0xd9,
0x2b, 0xf1, 0x90, 0x44, 0xea, 0xa6, 0xcd, 0x72, 0x18, 0x91, 0x22, 0xf4, 0x03, 0x2d, 0xe1, 0xb0,
0xda, 0xb1, 0x6d, 0xe6, 0x37, 0xc0, 0xfb, 0x65, 0x8d, 0xe9, 0xfe, 0x28, 0xfc, 0x47, 0xd2, 0xe4,
0xdf, 0x19, 0x4d, 0x8e, 0x80, 0x56, 0x1d, 0x21, 0xc1, 0x82, 0xc2, 0x27, 0x7b, 0x24, 0xa8, 0x8c,
0x11, 0x43, 0xd8, 0xdc, 0xb7, 0x48, 0x85, 0x30, 0xf5, 0x0e, 0xd4, 0x89, 0x4b, 0x0c, 0x45, 0x87,
0x04, 0x0b, 0xfd, 0x53, 0xd5, 0xf6, 0x06, 0xcf, 0xf2, 0xe7, 0x51, 0xe5, 0x50, 0x25, 0xed, 0x12,
0x4f, 0x20, 0x96, 0x81, 0xae, 0x8f, 0xd0, 0x36, 0xc6, 0x3b, 0x1a, 0xb5, 0xa2, 0x13, 0x1f, 0x2e,
0x0f, 0x34, 0x9f, 0x61, 0x05, 0x0a, 0xbf, 0xc7, 0x10, 0xa9, 0x23, 0x15, 0x5b, 0xf8, 0x6c, 0xd6,
0xb4, 0xab, 0x49, 0x5a, 0x6f, 0xb2, 0x02, 0x59, 0x92, 0x73, 0xde, 0x3f, 0x3d, 0x46, 0x57, 0xe8,
0x77, 0xcc, 0xa5, 0x3a, 0x62, 0x69, 0x35, 0xec, 0x26, 0x52, 0x7f, 0xc4, 0xe3, 0x40, 0xbd, 0x32
};
// struct prototypes
typedef struct _table_e table_e;
typedef struct _itable_t itable_t;
typedef struct _list_e list_e;
typedef struct _list_t list_t;
typedef struct _map_t map_t;
typedef struct _smap_t smap_t;
typedef struct _gui_t gui_t;
typedef struct _cvar_t cvar_t;
typedef struct _ccmd_t ccmd_t;
typedef struct _chunk_t chunk_t;
typedef struct _world_t world_t;
typedef struct _geometry_t geometry_t;
typedef struct _bank_voice bank_voice;
typedef struct _bank_key bank_key;
typedef struct _bank_channel bank_channel;
typedef struct _bank_handle bank_handle;
typedef struct _opl3_slot opl3_slot;
typedef struct _opl3_channel opl3_channel;
typedef struct _opl3_chip opl3_chip;
typedef struct _window_t window_t;
typedef struct _monitor_t monitor_t;
typedef struct _cursor_t cursor_t;
// function types
typedef uint map_hashfunc(void*);
typedef byte map_eqfunc(void*, void*);
typedef void gui_func(gui_t*, int);
typedef void clear_func(void*);
typedef byte clear_sfunc(void*);
typedef void cvar_func(cvar_t*, int);
typedef void ccmd_func(ccmd_t*, const char**, int);
typedef byte (*cvar_parse_func)(const char *, int *);
typedef void (*cvar_fmt_func)(char *, int);
typedef void shd_func();
typedef void shd_dfunc(void*);
typedef short(*envelope_sinfunc)(ushort phase, ushort envelope);
typedef void(*envelope_genfunc)(opl3_slot *slott);
typedef float graph_func(void*, float);
typedef float graph2_func(void*, float, float);
typedef byte gui_initfnc(window_t*, int, int, byte);
// structs
typedef struct {
char spec;
char arg;
int min;
int max;
int *value;
char **str;
const char *name;
} arg_t;
typedef struct {
uint arg_min;
uint arg_max;
uint arg_count;
arg_t *arg_vec;
} argp_t;
struct _table_e {
table_e *u_next;
table_e *u_prev;
table_e *f_next;
table_e *f_prev;
// void *value;
uint cid;
uint eid;
};
struct _itable_t {
table_e *elems;
void **data;
uint *sizes;
table_e *used;
table_e *free;
uint size;
uint load;
uint chunks;
uint stride;
uint alloc;
uint stored;
byte cat;
byte pad[7];
};
typedef struct {
itable_t *nodes;
uint load;
uint block;
uint stride;
uint size;
uint stored;
byte cat;
byte pad[3];
} table_t;
struct _list_e {
list_e *u_next;
list_e *u_prev;
list_e *f_next;
list_e *f_prev;
uint id;
uint pad;
};
struct _list_t {
list_e *elems;
list_e *used;
list_e *free;
uint size;
uint stored;
};
struct _map_t {
map_hashfunc *hash_func;
map_eqfunc *eq_func;
void **elems;
uint load;
uint stored;
byte cat;
byte pad[7];
};
struct _smap_t {
void *elems[27];
uint load;
uint stored;
byte cat;
byte pad[7];
};
typedef struct {
uint *id;
const char *path;
ushort width;
ushort height;
byte filter;
byte mipmap;
byte fallback;
byte system;
} tex_t;
typedef struct {
uint *vao;
uint *vbo;
uint size;
byte stride;
byte groups;
byte dynamic;
byte system;
} buf_t;
typedef struct {
uint *fbo;
uint *tex;
uint *rbo;
window_t *resize;
int xsize;
int ysize;
byte linear;
byte pad[7];
} fbo_t;
typedef struct {
const char *vpath;
const char *fpath;
shd_func *init;
shd_dfunc *draw;
uint id;
uint pad;
} shd_t;
typedef struct {
byte s;
byte t;
byte u;
byte v;
} fchar_t;
typedef struct {
uint textures[UNI_MAX_PAGES];
fchar_t *sizes[UNI_MAX_PAGES];
int xsize;
int ysize;
int xglyph;
int yglyph;
} font_t;
struct _gui_t {
window_t *window;
gui_func *func;
gui_func *format;
font_t *font;
char *text;
const char *format_text;
void *aux_data;
const char ***format_data;
cvar_t *cv_data;
uint color_fill_t;
uint color_fill_b;
uint color_brdr_t;
uint color_brdr_b;
uint color_text;
int border;
uint texture;
int font_size;
int pos_x;
int pos_y;
int size_x;
int size_y;
int text_x;
int text_y;
int tsize_x;
int tsize_y;
int margin_x1; // slider fill top
int margin_y1; // slider fill bottom
int margin_x2; // slider border top
int margin_y2; // slider border bottom
int sel_start; // slider handle pos
int sel_end; // slider handle width
int sel_drag; // slider border
int capacity;
int value;
int def;
int min;
int max;
int line_space;
int id;
byte type;
byte visible;
byte enabled;
byte t_dirty;
byte r_dirty;
byte pad;
byte xbreak;
byte precision;
};
typedef struct {
const char *name;
uint brdr_top;
uint brdr_btm;
uint wbrdr_top;
uint wbrdr_btm;
uint win_top;
uint win_btm;
uint fill_top;
uint fill_btm;
uint field_top;
uint field_btm;
uint text_label;
uint text_base;
uint text_field;
uint text_win;
int slider_width;
int border;
uint bg_top;
uint bg_btm;
uint press_top;
uint press_btm;
uint hover_top;
uint hover_btm;
uint select;
uint cursor;
} style_t;
typedef struct {
int key;
byte id;
byte pressed;
byte active;
byte last_state;
} bind_t;
struct _cvar_t {
const char *name;
cvar_func *func;
void *data;
void *aux_data;
int value;
int def;
int min;
int max;
int id;
byte readonly;
byte type;
byte category;
byte startup;
};
struct _ccmd_t {
const char *name;
const char *args;
ccmd_func *func;
int id;
ushort min;
ushort max;
};
typedef struct {
int width;
int height;
int refresh;
int pad;
} vidmode_t;
struct _window_t {
window_t* next;
monitor_t* monitor;
cursor_t* cursor;
gui_t *selected;
const char *title;
gui_initfnc *initializer;
world_t *world;
ulong tmr_scroll;
ulong tmr_leftmb;
uint fb_gui;
uint fbtex_gui;
int video_width;
int video_height;
int video_refresh;
int pad1;
int minwidth;
int minheight;
int maxwidth;
int maxheight;
int width;
int height;
int xpos;
int ypos;
int last_cur_x;
int last_cur_y;
int warp_cur_x;
int warp_cur_y;
int virtual_cur_x;
int virtual_cur_y;
int scrollx;
int scrolly;
int min_x;
int min_y;
int max_x;
int max_y;
int n_elems;
int mouse_clickx;
int mouse_clicky;
int offset_x;
int offset_y;
int frame_x;
int frame_y;
int mouse_x;
int mouse_y;
int xsize;
int ysize;
int saved_xpos;
int saved_ypos;
int fb_x;
int fb_y;
byte resizable;
byte floating;
byte override_redir;
byte iconified;
byte cursor_set;
byte redraw;
byte open;
byte queue;
byte drag_x;
byte drag_y;
byte focused;
byte mouse;
byte scroll;
byte pad2[3];
gui_t elems[GUI_MAX_ELEM];
char strings[GUI_STR_SIZE*GUI_MAX_ELEM];
char str_aux[GUI_AUX_STR];
char buttons[MOUSE_BTNS];
char keys[KEYSYM_LAST + 1];
Time key_times[256];
GLXWindow window;
Colormap colormap;
Window handle;
Window parent;
XIC ic;
};
struct _monitor_t {
window_t* window;
vidmode_t* modes;
int n_modes;
int index;
vidmode_t current_mode;
RROutput output;
RRCrtc crtc;
RRMode old_mode;
};
struct _cursor_t {
cursor_t* next;
Cursor handle;
};
typedef struct {
char *message;
window_t *window;
ulong time;
int offset;
int length;
} conmsg_t;
typedef struct {
void *buffer;
short command;
short address;
uint param;
} snd_cmd_t;
typedef struct {
vec3 front;
vec3 up;
vec3 right;
vec3 world_up;
double pos_x;
double pos_y;
double pos_z;
float yaw;
float pitch;
float zoom;
float pad;
} camera_t;
typedef struct {
double x1;
double y1;
double z1;
double x2;
double y2;
double z2;
} bbox_t;
typedef struct {
double pos_x;
double pos_y;
double pos_z;
double motion_x;
double motion_y;
double motion_z;
double width;
double height;
double jump_motion;
double fly_base_speed;
double walk_base_speed;
double air_base_speed;
double fly_speed;
double walk_speed;
double air_speed;
double speed;
bbox_t box;
double forward;
double strafe;
double eye;
double rot_yaw;
double step_height;
double fall_distance;
double last_x;
double last_y;
double last_z;
float yaw;
float pitch;
int fly_timer;
int jump_ticks;
byte jump;
byte sprint;
byte sneak;
byte use;
byte blocked;
byte braked;
byte pad[2];
byte first_tick;
byte last_jump;
byte flying;
byte sprinting;
byte ground;
byte collided;
byte collided_h;
byte collided_v;
world_t *world;
} entity_t;
typedef struct {
shd_t *shader;
uint texture;
float density;
uint spec_color;
float shine;
} material_t;
typedef struct {
uint color;
float amb_fact;
float dif_fact;
float range_xz;
float range_y;
float constant;
float linear;
float quadratic;
} light_b;
typedef struct {
vec3 pos;
vec2 coord;
} vertex_b;
typedef struct {
vertex_b vertices[3];
float pad;
material_t *material;
} polygon_b;
typedef struct {
vec3 pos;
float pad1;
vec3 ambient;
float constant;
vec3 diffuse;
float linear;
vec3 specular;
float quadratic;
vec3 range;
float pad2;
ulong id;
} light_t;
typedef struct {
vec3 pos;
vec3 normal;
vec2 coord;
} vertex_t;
typedef struct {
vertex_t vertices[3];
material_t *material;
uint next;
uint pad;
} polygon_t;
struct _geometry_t {
geometry_t **global;
bbox_t collision;
ulong id;
uint polys;
int chunk_x;
int chunk_y;
int chunk_z;
};
typedef struct {
material_t *material;
int size;
int offset;
} draw_t;
typedef struct {
uint vao;
uint vbo;
draw_t *draws;
buf_t *bind;
int size;
vec3 position;
} drawlist_t;
struct _chunk_t {
table_t obj_table;
table_t light_table;
list_t poly_list;
bbox_t box;
world_t *world;
polygon_t *poly_pool;
drawlist_t *drawlist;
chunk_t *next_dirty;
int x;
int y;
int z;
int size;
byte dirty;
byte pad[7];
};
struct _world_t {
chunk_t *dirty_first;
chunk_t *dirty_queue;
entity_t *entity;
shd_t *shader;
fbo_t *post_buf;
ulong pointed;
ulong obj_id;
double gravity;
double friction;
vec3 look_pos;
uint fb_post;
uint fbtex_post;
uint rbo_post;
uint light_buf;
int s_lights;
int n_chunks;
int n_objects;
int n_lights;
int last_cx;
int last_cy;
int last_cz;
byte light_dirty;
byte chunks_dirty;
byte noclip;
byte camonly;
table_t global_geom;
table_t chunk_table;
map_t chunk_map;
map_t obj_map;
camera_t camera;
entity_t entity_base;
};
typedef struct {
FILE *fd;
const char *filename;
byte buffer[8];
uint samplerate;
uint samples;
ushort channels;
ushort bytes;
ushort pad[2];
} wav_handle;
typedef struct {
byte *buffer;
uint size;
uint pos;
byte status;
byte ending;
uint wait;
ushort trknum;
} mid_track;
typedef struct {
mid_track *track;
ushort tracks;
uint tpqn;
uint uspb;
uint ticktime;
} mid_handle;
typedef struct {
byte tremolo;
byte vibrato;
byte sustaining;
byte ksr;
byte mult;
byte ksl;
byte level;
byte attack;
byte decay;
byte sustain;
byte release;
byte waveform;
} bank_operator;
typedef struct {
bank_operator ops[2];
short detune;
short offset;
byte feedback;
byte am;
} bank_pair;
typedef struct {
bank_pair channels[2];
byte op;
byte fixed;
byte percnum;
char name[32];
} bank_instr;
struct _bank_voice {
bank_channel *channel;
opl3_channel *opl;
byte note;
byte op;
short detune;
bank_voice *pair;
};
struct _bank_key {
byte note;
byte velocity;
bank_voice *voice;
};
struct _bank_channel {
bank_handle *bank;
bank_key keys[BANK_MAX];
byte notes[128];
byte keyindex;
byte active;
ushort pbank;
char pan;
byte volume;
short pitch;
byte program;
bank_instr *instr;
byte ch_num;
};
struct _bank_handle {
bank_channel channel[16];
bank_voice *voices;
bank_instr *bdata;
ushort voiceindex;
ushort v_avail;
ushort v_used;
byte flags;
char velo_func;
};
struct _opl3_slot {
opl3_channel *channel;
opl3_chip *chip;
short out;
short fbmod;
short *mod;
short prout;
ushort eg_rout;
ushort eg_out;
// byte eg_inc;
byte eg_gen;
// byte eg_rate;
byte eg_ksl;
byte *trem;
byte reg_vib;
byte reg_type;
byte reg_ksr;
byte reg_mult;
byte reg_ksl;
byte reg_tl;
byte reg_ar;
byte reg_dr;
byte reg_sl;
byte reg_rr;
byte reg_wf;
byte key;
byte detrigger;
byte retrigger;
uint pg_reset;
uint pg_phase;
ushort pg_phase_out;
byte slot_num;
};
struct _opl3_channel {
opl3_slot *slots[2];
opl3_channel *pair;
opl3_chip *chip;
short *out[4];
int level[2];
byte chtype;
ushort f_num;
byte block;
byte fb;
byte con;
byte alg;
byte ksv;
byte ch_num;
};
struct _opl3_chip {
opl3_channel *channel;
opl3_slot *slot;
ushort timer;
ulong eg_timer;
byte eg_timerrem;
byte eg_state;
byte eg_add;
byte nts;
byte vibpos;
byte vibshift;
byte tremolo;
byte tremolopos;
byte tremoloshift;
byte n_voices;
uint noise;
short zeromod;
int mixbuff[4];
int rateratio;
int samplecnt;
short oldsamples[2];
short samples[2];
};
typedef struct {
window_t *console;
const char *cfg_file;
style_t *style_def;
window_t *keywin;
window_t *win_full;
ulong mem_pool_sizes[MEM_CATS];
ulong mem_pool_blocks[MEM_CATS];
ulong mem_alloc;
ulong mem_blocks;
ulong mem_peak;
ulong sync_limit;
ulong tmr_timer;
ulong tmr_start;
ulong tmr_current;
ulong tmr_last;
ulong tmr_delta;
ulong tmr_update;
ulong tmr_frames;
ulong tmr_iters;
ulong tmr_stime;
ulong tmr_etime;
ulong tmr_ttime;
ulong tmr_ftime;
ulong tmr_dtime;
ulong tmr_atime;
ulong tick_torun;
ulong tick_done;
ulong tick_total;
ulong tick_time;
ulong tick_stime;
ulong tick_ftime;
ulong tick_ttime;
ulong tick_update;
ulong rng_uniq;
double tick_fraction;
ulong tmr_profile[PERF_SECTIONS*2];
ulong tmr_total[PERF_SECTIONS];
float tmr_framerate;
float tick_tickrate;
float fdelta;
float sensitivity;
float speed;
int n_cvars;
int key_release;
int log_len;
int n_modes;
int vid_mode;
int n_ccmds;
int tick_target;
int tick_timeout;
int win_xfull;
int win_yfull;
int win_refresh;
int font_pages;
int tick_frame;
int dclick_delay;
int hud_pos;
int hud_size;
int hud_fadeout;
int hud_len;
byte hud_overlay;
byte hud_bottom;
byte hud_opacity;
byte mouse_first;
byte input;
byte mouse_bind;
byte nograb;
byte cfg_dirty;
byte ticked;
byte win_vsync;
byte sync_limited;
byte interrupted;
byte screenshot;
byte draw_fps;
byte draw_debug;
byte gl_flush;
byte log_level;
byte log_set;
byte perf_pos;
byte perf_swap;
byte keywait;
byte con_timestamps;
byte con_autoscroll;
bind_t binds[KEY_MAXBINDS];
font_t font;
cvar_t cvars[CVAR_MAX];
ccmd_t ccmds[CCMD_MAX];
smap_t cvar_map;
smap_t ccmd_map;
vidmode_t vid_modes[VID_MODES];
conmsg_t hud_msgs[HUD_MSGS];
bbox_t collision_list[COLL_MAX];
style_t style;
table_t themes;
const char *str_format[LOCALE_SIZE];
char log_buf[LOG_BUF];
char work_buf[WORK_BUF];
char con_buf[CON_BUF];
char con_line[CON_LINE];
char con_tok[CON_LINE];
char *con_arg[CON_LINE / 2];
char hud_buf[HUD_BUF];
char str_table[LOCALE_SIZE*LOCALE_ELEM];
char vid_mode_list[VID_MODES*VID_MODE_STR];
} sys_t;
typedef struct {
shd_t *shd_rect;
shd_t *shd_text;
shd_t *shd_blit;
shd_t *shd_world;
shd_t *shd_vis;
shd_t *shd_grid;
uint aux_colors[8];
uint shader;
uint vbo_quad;
uint vao_quad;
uint tex_fallback;
uint tex_logo;
uint tex_crosshair;
float clear_r;
float clear_g;
float clear_b;
float clear_a;
float clip_near;
float clip_far;
float aniso_max;
float tex_aniso;
float fov;
float light_blend;
float light_dist_vert;
float light_dist_cam;
float ambient_x;
float ambient_y;
float ambient_z;
byte tex_miptype;
byte tex_miplevel;
byte tex_filter;
byte wireframe;
byte post;
// byte aniso_avail;
ulong tex_mem;
ulong tex_peak;
ulong buf_mem;
ulong buf_peak;
ulong fb_mem;
ulong fb_peak;
int light_dist_chunk;
int ldist_chunk_xz;
int ldist_chunk_y;
int light_max;
int tex_loaded;
int shd_loaded;
int buf_loaded;
int fb_loaded;
int lists_drawn;
int tris_drawn;
table_t textures;
table_t buffers;
table_t shaders;
table_t framebufs;
table_t drawlists;
table_t materials;
char shd_include[SHD_INCLUDE];
} gfx_t;
typedef struct {
pthread_t thread;
pthread_mutex_t lock;
pthread_mutex_t log_lock;
ulong mid_time;
uint cmd_push;
uint cmd_queue;
uint log_push;
uint log_queue;
uint log_pop;
uint query;
uint mid_tick;
byte waiting;
byte disabled;
byte pad1[2];
snd_cmd_t cmds[SND_QUEUE];
char logs[SND_LOG * SND_LOG_LEN];
byte interrupt;
byte playing;
byte nowait;
byte paused;
byte stopped;
byte log_debug;
byte capture;
ushort volumes[SND_VOLUMES];
wav_handle wav;
mid_handle mid;
opl3_chip *chip;
bank_handle *bank;
bank_instr ibank[256];
} isnd_t;
typedef struct {
window_t *player;
ulong mid_poll;
char **mid_queue;
char *mid_list;
byte mid_nowait;
byte mid_repeat;
byte mid_bank;
int mid_queued;
int mid_playpos;
int mid_prevpos;
byte mid_keep;
byte mid_unknown;
byte mid_visual;
int mid_velo;
int mid_voices;
byte mid_debug;
byte mid_karaoke;
uint mid_klog_pos;
uint mid_klog_offs;
uint mid_info_offs[6];
char mid_klogger[SND_KLOG * SND_KAR];
char mid_info[SND_INFO * 6];
} snd_t;
typedef struct {
cursor_t* cursor_list;
window_t* window_list;
window_t* current;
window_t* active;
window_t* grab_cur_window;
Display* display;
void* handle;
char* primary_str;
char* clipboard_str;
monitor_t** monitors;
int n_monitors;
int screen;
int major;
int minor;
int event_base;
int error_base;
int restore_cur_x;
int restore_cur_y;
int error_code;
int depth;
byte debug;
byte pad1[7];
char keycodes[256];
Window root;
Window helper_window;
Cursor empty_cursor;
XContext context;
XIM im;
XErrorHandler error_handler;
Visual* visual;
GLXFBConfig native;
GLXContext glx;
// Window manager atoms
Atom NET_SUPPORTED;
Atom NET_SUPPORTING_WM_CHECK;
Atom WM_PROTOCOLS;
Atom WM_STATE;
Atom WM_DELETE_WINDOW;
Atom NET_WM_NAME;
Atom NET_WM_ICON_NAME;
Atom NET_WM_ICON;
Atom NET_WM_PID;
Atom NET_WM_PING;
Atom NET_WM_WINDOW_TYPE;
Atom NET_WM_WINDOW_TYPE_NORMAL;
Atom NET_WM_STATE;
Atom NET_WM_STATE_ABOVE;
Atom NET_WM_STATE_FULLSCREEN;
Atom NET_WM_BYPASS_COMPOSITOR;
Atom NET_WM_FULLSCREEN_MONITORS;
Atom NET_WM_WINDOW_OPACITY;
Atom NET_WM_CM_Sx;
Atom NET_CURRENT_DESKTOP;
Atom NET_ACTIVE_WINDOW;
Atom NET_FRAME_EXTENTS;
Atom NET_REQUEST_FRAME_EXTENTS;
Atom MOTIF_WM_HINTS;
// Xdnd (drag and drop) atoms
Atom XdndAware;
Atom XdndEnter;
Atom XdndPosition;
Atom XdndStatus;
Atom XdndActionCopy;
Atom XdndDrop;
Atom XdndFinished;
Atom XdndSelection;
Atom XdndTypeList;
Atom text_uri_list;
// Selection (clipboard) atoms
Atom TARGETS;
Atom MULTIPLE;
Atom INCR;
Atom CLIPBOARD;
Atom PRIMARY;
Atom CLIPBOARD_MANAGER;
Atom SAVE_TARGETS;
Atom NULL_;
Atom UTF8_STRING;
Atom COMPOUND_STRING;
Atom ATOM_PAIR;
Atom WCF_SELECTION;
// GLX 1.3 functions
PFNGLXGETFBCONFIGSPROC GetFBConfigs;
PFNGLXGETFBCONFIGATTRIBPROC GetFBConfigAttrib;
PFNGLXGETCLIENTSTRINGPROC GetClientString;
PFNGLXQUERYEXTENSIONPROC QueryExtension;
PFNGLXQUERYVERSIONPROC QueryVersion;
PFNGLXDESTROYCONTEXTPROC DestroyContext;
PFNGLXMAKECURRENTPROC MakeCurrent;
PFNGLXSWAPBUFFERSPROC SwapBuffers;
PFNGLXQUERYEXTENSIONSSTRINGPROC QueryExtensionsString;
PFNGLXCREATENEWCONTEXTPROC CreateNewContext;
PFNGLXGETVISUALFROMFBCONFIGPROC GetVisualFromFBConfig;
PFNGLXCREATEWINDOWPROC CreateWindow;
PFNGLXDESTROYWINDOWPROC DestroyWindow;
// GLX 1.4 and extension functions
PFNGLXGETPROCADDRESSPROC GetProcAddress;
PFNGLXGETPROCADDRESSPROC GetProcAddressARB;
PFNGLXSWAPINTERVALSGIPROC SwapIntervalSGI;
PFNGLXSWAPINTERVALEXTPROC SwapIntervalEXT;
PFNGLXSWAPINTERVALMESAPROC SwapIntervalMESA;
PFNGLXCREATECONTEXTATTRIBSARBPROC CreateContextAttribsARB;
byte SGI_swap_control;
byte EXT_swap_control;
byte MESA_swap_control;
byte ARB_multisample;
// byte ARB_create_context_no_error;
byte pad2[4];
struct {
byte available;
byte monitor_broken;
void* handle;
int event_base;
int error_base;
int major;
int minor;
PFN_XRRFreeCrtcInfo FreeCrtcInfo;
PFN_XRRFreeOutputInfo FreeOutputInfo;
PFN_XRRFreeScreenResources FreeScreenResources;
PFN_XRRGetCrtcInfo GetCrtcInfo;
PFN_XRRGetOutputInfo GetOutputInfo;
PFN_XRRGetOutputPrimary GetOutputPrimary;
PFN_XRRGetScreenResourcesCurrent GetScreenResourcesCurrent;
PFN_XRRQueryExtension QueryExtension;
PFN_XRRQueryVersion QueryVersion;
PFN_XRRSelectInput SelectInput;
PFN_XRRSetCrtcConfig SetCrtcConfig;
PFN_XRRUpdateConfiguration UpdateConfiguration;
} randr;
struct {
byte available;
byte detectable;
int major_opcode;
int event_base;
int error_base;
int major;
int minor;
uint group;
} xkb;
struct {
int version;
Window source;
Atom format;
} xdnd;
struct {
void* handle;
PFN_XcursorImageCreate ImageCreate;
PFN_XcursorImageDestroy ImageDestroy;
PFN_XcursorImageLoadCursor ImageLoadCursor;
} xcursor;
struct {
byte available;
void* handle;
int major;
int minor;
PFN_XineramaIsActive IsActive;
PFN_XineramaQueryExtension QueryExtension;
PFN_XineramaQueryScreens QueryScreens;
} xinerama;
struct {
void* handle;
PFN_XGetXCBConnection GetXCBConnection;
} x11xcb;
struct {
byte available;
void* handle;
int event_base;
int error_base;
PFN_XF86VidModeQueryExtension QueryExtension;
} vidmode;
struct {
byte available;
void* handle;
int major_opcode;
int event_base;
int error_base;
int major;
int minor;
PFN_XIQueryVersion QueryVersion;
PFN_XISelectEvents SelectEvents;
} xi;
struct {
byte available;
void* handle;
int major;
int minor;
int event_base;
int error_base;
PFN_XRenderQueryExtension QueryExtension;
PFN_XRenderQueryVersion QueryVersion;
PFN_XRenderFindVisualFormat FindVisualFormat;
} xrender;
} wcf_t;
// global state
sys_t sys;
gfx_t gdr;
isnd_t sgt;
snd_t snd;
wcf_t wcf;