/* * Copyright © 2024 Matthew Wozniak * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ #ifndef ENGINEAPI_H #define ENGINEAPI_H #define VENGINE_SERVER_INTERFACE_VERSION "VEngineServer021" #define VENGINE_CLIENT_INTERFACE_VERSION "VEngineClient013" #define VENGINE_LAUNCHER_INTERFACE_VERSION "VENGINE_LAUNCHER_API_VERSION004" #define VENGINE_TOOL_INTERFACE_VERSION "VENGINETOOL003" #define VENGINE_CVAR_INTERFACE_VERSION "VEngineCvar004" #include "intdef.h" #include "os.h" typedef void * (*createinterface_func)(const char *name, int *ret); struct engserver { struct { usize _pad[36]; void (*VIRTUAL server_command)(struct engserver *this, const char *str); } *vt; }; struct engclient { struct { usize _pad[75]; void (*VIRTUAL is_playing_demo)(struct engclient *this); } *vt; }; struct engineapi { struct { usize _pad[7]; void *set_engine_window; } *vt; }; struct enginetools { struct { usize _pad[65]; void *start_movie_recording; } *vt; }; struct cvar { struct { usize _pad[10]; struct concommand * (*VIRTUAL find_command)(struct cvar *this, const char *name); } *vt; }; struct cmdbase { void **vt; struct cmdbase *next; bool registered; const char *name; const char *helpstring; int flags; }; struct concommand { struct cmdbase base; void *callback; }; struct audio_device { struct { usize _pad[22]; void *transfer_samples; } *vt; }; struct movieinfo { char name[256]; int curframe; int type; int jpeg_quality; }; // Almost no chance I need all of these, but why not. enum image_format { IMAGE_FORMAT_UNKNOWN = -1, IMAGE_FORMAT_RGBA8888 = 0, IMAGE_FORMAT_ABGR8888, IMAGE_FORMAT_RGB888, IMAGE_FORMAT_BGR888, IMAGE_FORMAT_RGB565, IMAGE_FORMAT_I8, IMAGE_FORMAT_IA88, IMAGE_FORMAT_P8, IMAGE_FORMAT_A8, IMAGE_FORMAT_RGB888_BLUESCREEN, IMAGE_FORMAT_BGR888_BLUESCREEN, IMAGE_FORMAT_ARGB8888, IMAGE_FORMAT_BGRA8888, IMAGE_FORMAT_DXT1, IMAGE_FORMAT_DXT3, IMAGE_FORMAT_DXT5, IMAGE_FORMAT_BGRX8888, IMAGE_FORMAT_BGR565, IMAGE_FORMAT_BGRX5551, IMAGE_FORMAT_BGRA4444, IMAGE_FORMAT_DXT1_ONEBITALPHA, IMAGE_FORMAT_BGRA5551, IMAGE_FORMAT_UV88, IMAGE_FORMAT_UVWQ8888, IMAGE_FORMAT_RGBA16161616F, IMAGE_FORMAT_RGBA16161616, IMAGE_FORMAT_UVLX8888, IMAGE_FORMAT_R32F, // Single-channel 32-bit floating point IMAGE_FORMAT_RGB323232F, IMAGE_FORMAT_RGBA32323232F, // vendor crap IMAGE_FORMAT_NV_DST16, IMAGE_FORMAT_NV_DST24, IMAGE_FORMAT_NV_INTZ, IMAGE_FORMAT_NV_RAWZ, IMAGE_FORMAT_ATI_DST16, IMAGE_FORMAT_ATI_DST24, IMAGE_FORMAT_NV_NULL, IMAGE_FORMAT_ATI2N, IMAGE_FORMAT_ATI1N, NUM_IMAGE_FORMATS }; struct videomode { struct { usize _pad[22]; void (*VIRTUAL write_movie_frame)(struct videomode *this, struct movieinfo *info); usize _pad2[4]; void (*VIRTUAL read_screen_pixels)(struct videomode *this, int x, int y, int w, int h, void *buf, enum image_format fmt); } *vt; }; struct demoplayer { struct { usize _pad[5]; bool (*VIRTUAL start_playback)(struct demoplayer *this, const char *filename, bool as_time_demo); usize _pad2[11]; void (*VIRTUAL stop_playback)(struct demoplayer *this); // TODO: Disable interp when in a portal bubble. This will be very // difficult! void (*VIRTUAL interpolate_viewpoint)(struct demoplayer *this); } *vt; }; /* EPIC HACK: * Snd_WriteLinearBlastStereo16 is an inline asm function that starts with * * mov ebx,snd_p * mov edi,snd_out * mov ecx,snd_linear_count * mov esi,snd_vol * * Luckily for us, these are all the things that we need!!!! * So, we just use the instructions as a struct so we don't have to copy * anything. It just works. */ struct soundstate { u16 _mov_ebx; int **snd_p; u16 _mov_edi; short **snd_out; u16 _mov_ecx; int *snd_linear_count; u16 _mov_esi; int *snd_vol; } __attribute__((packed)); #ifndef NO_EXTERNS extern struct engserver *engserver; extern struct engclient *engclient; extern struct engineapi *engineapi; extern struct enginetools *enginetools; extern struct demoplayer *demoplayer; extern struct videomode **videomode; extern struct movieinfo *movieinfo; extern void (*cbuf_addtext)(char *); extern void (*snd_recordbuffer)(void); extern struct soundstate *snd; #endif // initializes required engine apis. returns false on error. bool api_init(void); bool api_find_snd_recordbuffer(void); #endif // vi: sw=4 ts=4 noet tw=80 cc=80