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

2244 lines
55 KiB
C
Raw Normal View History

2025-09-02 14:43:36 +02:00
// 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;