/* * 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" #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 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; }; #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 *); #endif // initializes required engine apis. returns false on error. bool api_init(void); #endif // vi: sw=4 ts=4 noet tw=80 cc=80