/* Copyright (C) 1999-2007 id Software, Inc. and contributors. For a list of contributors, see the accompanying CONTRIBUTORS file. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ // QERadiant PlugIns // // #ifndef __QERPLUGIN_H__ #define __QERPLUGIN_H__ /*! \todo this header is intended to be turned into a header for the core editor functionality some portability related code should be moved to synapse (such as the GUID stuff) */ #include #include // TTimo // ideally the plugin API would be UI toolkit independent, but removing the dependency with GLib seems tricky right now.. #include #include "qertypes.h" // FIXME TTimo: // GUID declaration here should be trashed, it is in synapse.h #ifdef _WIN32 #include #endif #define QER_MAX_NAMELEN 1024 #ifndef _WIN32 #include "misc_def.h" #endif // the editor will look for plugins in two places, the plugins path // under the application path, and the path under the basepath as defined // in the project (.qe4) file. // // you can drop any number of new texture, model format DLL's in the standard plugin path // but only one plugin that overrides map loading/saving, surface dialog, surface flags, etc.. // should be used at one time.. if multiples are loaded then the last one loaded will be the // active one // // type of services the plugin supplies, pass any combo of these flags // it is assumed the plugin will have a matching function as defined below // to correlate to the implied functionality // #define RADIANT_MAJOR "radiant" // basics #define QERPLUG_INIT "QERPlug_Init" #define QERPLUG_GETNAME "QERPlug_GetName" #define QERPLUG_GETCOMMANDLIST "QERPlug_GetCommandList" #define QERPLUG_DISPATCH "QERPlug_Dispatch" #define QERPLUG_GETFUNCTABLE "QERPlug_GetFuncTable" // game stuff #define QERPLUG_GETTEXTUREINFO "QERPlug_GetTextureInfo" // gets a texture info structure #define QERPLUG_LOADTEXTURE "QERPlug_LoadTexture" // loads a texture, will return an RGBA structure // and any surface flags/contents for it #define QERPLUG_GETSURFACEFLAGS "QERPlug_GetSurfaceFlags" // gets a list of surface/content flag names from a plugin struct _QERTextureInfo { char m_TextureExtension[QER_MAX_NAMELEN]; // the extension these textures have qboolean m_bHiColor; // if textures are NOT high color, the default // palette (as described inthe qe4 file will be used for gamma correction) // if they are high color, gamma and shading are computed on the fly // based on the rgba data //--bool m_bIsShader; // will probably do q3 shaders this way when i merge qboolean m_bWadStyle; // if this is true, the plugin will be presented with the texture path // defined in the .qe4 file and is expected to preload all the textures qboolean m_bHalfLife; // causes brushes to be saved/parsed without the surface contents/flags/value }; struct _QERTextureLoad // returned by a plugin { _QERTextureLoad(){ memset( reinterpret_cast( this ), 0, sizeof( _QERTextureLoad ) ); }; ~_QERTextureLoad(){ delete []m_pRGBA; delete []m_pName; }; void makeSpace( int nSize ){ m_pRGBA = new unsigned char[nSize + 1]; }; void setName( const char* p ){ m_pName = new char[strlen( p ) + 1]; strcpy( m_pName, p ); }; unsigned char *m_pRGBA; // rgba data (alpha channel is supported and drawn appropriately) int m_nWidth; // width int m_nHeight; // height int m_nContents; // default contents int m_nFlags; // "" flags int m_nValue; // "" value char *m_pName; // name to be referenced in map, build tools, etc. }; struct _QERModelInfo { char m_ModelExtension[QER_MAX_NAMELEN]; bool m_bSkinned; bool m_bMultipart; }; struct _QERModelLoad { // vertex and skin data }; //========================================= // plugin functions typedef char* ( WINAPI * PFN_QERPLUG_GETFUNCTABLE )(); // v1.5 // // Texture loading // returns a ptr to _QERTextureInfo typedef void* ( WINAPI * PFN_QERPLUG_GETTEXTUREINFO )(); // // loads a texture by calling the texture load func in the editor (defined below) // transparency (for water, fog, lava, etc.. ) can be emulated in the editor // by passing in appropriate alpha data or by setting the appropriate surface flags // expected by q2 (which the editor will use.. ) typedef void ( WINAPI * PFN_QERPLUG_LOADTEXTURE )( const char* pFilename ); // v1.6 typedef void* ( WINAPI * PFN_QERPLUG_GETSURFACEFLAGS )(); // v1.7 // if exists in plugin, gets called between INIT and GETCOMMANDLIST // the plugin can register the EClasses he wants to handle //++timo TODO: this has got to move into the table, and be requested by QERPlug_RequestInterface //++timo FIXME: the LPVOID parameter must be casted to an IEpair interface #define QERPLUG_REGISTERPLUGINENTITIES "QERPlug_RegisterPluginEntities" typedef void ( WINAPI * PFN_QERPLUG_REGISTERPLUGINENTITIES )( void* ); // if exists in plugin, gets called between INIT and GETCOMMANDLIST // the plugin can Init all it needs for surface properties #define QERPLUG_INITSURFACEPROPERTIES "QERPlug_InitSurfaceProperties" typedef void ( WINAPI * PFN_QERPLUG_INITSURFACEPROPERTIES )(); // if Radiant needs to use a particular set of commands, it can request the plugin to fill a func table // this is similar to PFN_QERAPP_REQUESTINTERFACE #define QERPLUG_REQUESTINTERFACE "QERPlug_RequestInterface" typedef int ( WINAPI * PFN_QERPLUG_REQUESTINTERFACE )( REFGUID refGUID, void* pInterface, const char *version_name ); // Load an image file typedef void ( *PFN_QERAPP_LOADIMAGE )( const char *name, unsigned char **pic, int *width, int *height ); // TTimo FIXME: the logic for this is in synapse now // MODULES specific: // if it exports this entry point, will be considered as a module // a module is a plugin that provides some REQUIRED interfaces to Radiant, such as the shader module // Radiant will call QERPLUG_LISTINTERFACES to get a list of the interfaces a given plugin implements // then it will call PFN_QERPLUG_REQUESTINTERFACE to actually get them // following leo's code .. looks ok to use a string to identify the various versions of a same interface // obviously it would be handy to have the same string naming for the interfaces. // best way would be to have the names come in when you list the interfaces // NOTE: we might have a problem with the order in which the interfaces are filled in // there's some kind of dependency graph, the shader module expects to find the VFS ready etc. typedef struct moduleentry_s { const GUID *interface_GUID; const char* interface_name; const char* version_name; } moduleentry_t; #define QERPLUG_LISTINTERFACES "QERPlug_ListInterfaces" #define MAX_QERPLUG_INTERFACES 10 typedef int ( WINAPI * PFN_QERPLUG_LISTINTERFACES )( moduleentry_t table[MAX_QERPLUG_INTERFACES] ); // ======================================== // GTK+ helper functions // NOTE: parent can be NULL in all functions but it's best to set them // simple Message Box, see above for the 'type' flags // toolkit-independent, cast parent ot a GtkWidget* typedef gint ( WINAPI * PFN_QERAPP_MESSAGEBOX )( void *parent, const char* text, const char* caption, guint32 type, const char *URL ); // file and directory selection functions return NULL if the user hits cancel // or a gchar* string that must be g_free'd by the user // - 'title' is the dialog title (can be NULL) // - 'path' is used to set the initial directory (can be NULL) // - 'pattern': the first pattern is for the win32 mode, then comes the Gtk pattern list, see Radiant source for samples // TTimo 04/01/2001 toolkit-independant, cast parent to a GtkWidget* typedef const gchar* ( *PFN_QERAPP_FILEDIALOG )( void *parent, gboolean open, const char* title, const char* path, const char* pattern, const char *baseSubDir ); typedef gchar* ( WINAPI * PFN_QERAPP_DIRDIALOG )( void *parent, const char* title, const char* path ); // return true if the user closed the dialog with 'Ok' // 'color' is used to set the initial value and store the selected value typedef bool ( WINAPI * PFN_QERAPP_COLORDIALOG )( void *parent, float *color, const char* title ); // load a .bmp file and store the results in 'gdkpixmap' and 'mask' // returns TRUE on success but even if it fails, it creates an empty pixmap // NOTE: 'filename' is relative to /plugins/bitmaps/ // TTimo 04/01/2001 toolkit-independant, cast gkpixmap to GdkPixmap and mask to GdkBitmap typedef bool ( WINAPI * PFN_QERAPP_LOADBITMAP )( const char* filename, void **gdkpixmap, void **mask ); // ======================================== // read/write preferences file // use this function to get the directory where the preferences file are stored typedef const char* ( WINAPI * PFN_QERAPP_PROFILE_GETDIR )(); // 'filename' is the absolute path typedef bool ( WINAPI * PFN_QERAPP_PROFILE_SAVEINT )( const char *filename, const char *section, const char *key, int value ); typedef bool ( WINAPI * PFN_QERAPP_PROFILE_SAVESTR )( const char *filename, const char *section, const char *key, const char *value ); typedef int ( WINAPI * PFN_QERAPP_PROFILE_LOADINT )( const char *filename, const char *section, const char *key, int default_value ); typedef char* ( WINAPI * PFN_QERAPP_PROFILE_LOADSTR )( const char *filename, const char *section, const char *key, const char *default_value ); //========================================= // editor functions // There are 3 potential brush handle lists // 1. the list that contains brushes a plugin creates using CreateBrushHandle // 2. the selected brush list (brushes the user has selected) // 3. the active brush list (brushes in the map that are not selected) // // In general, the same things can be done to brush handles (face manip, delete brushhandle, etc.. ) in each // list. There are a few exceptions. // 1. You cannot commit a selected or active brush handle to the map. This is because it is already in the map. // 2. You cannot bind brush handles from the selected or active brush list to an entity. As of v1.0 of the plugins // the only way for a plugin to create entities is to create a brush handles (or a list of handles) and then bind // them to an entity. This will commit the brush(s) and/or the entities to the map as well. // // To use the active or selected brush lists, you must first allocate them (which returns a count) and then // release them when you are finish manipulating brushes in one of those lists. // v1.80 #define QERAPP_GETDISPATCHPARAMS "QERApp_GetDispatchParams" struct _QERPointData { int m_nCount; vec3_t *m_pVectors; }; struct _QERFaceData { char m_TextureName[QER_MAX_NAMELEN]; int m_nContents; int m_nFlags; int m_nValue; float m_fShift[2]; float m_fRotate; float m_fScale[2]; vec3_t m_v1, m_v2, m_v3; // brush primitive additions qboolean m_bBPrimit; brushprimit_texdef_t brushprimit_texdef; }; typedef void ( WINAPI * PFN_QERAPP_CREATEBRUSH )( vec3_t vMin, vec3_t vMax ); typedef void* ( WINAPI * PFN_QERAPP_CREATEBRUSHHANDLE )(); typedef void ( WINAPI * PFN_QERAPP_DELETEBRUSHHANDLE )( void* pv ); typedef void ( WINAPI * PFN_QERAPP_COMMITBRUSHHANDLETOMAP )( void* pv ); typedef void ( WINAPI * PFN_QERAPP_ADDFACE )( void* pv, vec3_t v1, vec3_t v2, vec3_t v3 ); typedef void ( WINAPI * PFN_QERAPP_ADDFACEDATA )( void* pv, _QERFaceData *pData ); typedef int ( WINAPI * PFN_QERAPP_GETFACECOUNT )( void* pv ); typedef _QERFaceData* ( WINAPI * PFN_QERAPP_GETFACEDATA )( void* pv, int nFaceIndex ); typedef void ( WINAPI * PFN_QERAPP_SETFACEDATA )( void* pv, int nFaceIndex, _QERFaceData *pData ); typedef void ( WINAPI * PFN_QERAPP_DELETEFACE )( void* pv, int nFaceIndex ); typedef void ( WINAPI * PFN_QERAPP_TEXTUREBRUSH )( void* pv, char* pName ); typedef void ( WINAPI * PFN_QERAPP_BUILDBRUSH )( void* pv ); // PGM typedef void ( WINAPI * PFN_QERAPP_SELECTBRUSH )( void* pv ); // PGM typedef void ( WINAPI * PFN_QERAPP_DESELECTBRUSH )( void* pv ); // PGM typedef void ( WINAPI * PFN_QERAPP_DESELECTALLBRUSHES )(); // PGM typedef void ( WINAPI * PFN_QERAPP_DELETESELECTION )(); typedef void ( WINAPI * PFN_QERAPP_GETPOINTS )( int nMax, _QERPointData *pData, char* pMsg ); typedef int ( WINAPI * PFN_QERAPP_SELECTEDBRUSHCOUNT )(); typedef int ( WINAPI * PFN_QERAPP_ALLOCATESELECTEDBRUSHHANDLES )(); typedef void ( WINAPI * PFN_QERAPP_RELEASESELECTEDBRUSHHANDLES )(); typedef void* ( WINAPI * PFN_QERAPP_GETSELECTEDBRUSHHANDLE )( int nIndex ); typedef int ( WINAPI * PFN_QERAPP_ACTIVEBRUSHCOUNT )(); typedef int ( WINAPI * PFN_QERAPP_ALLOCATEACTIVEBRUSHHANDLES )(); typedef void ( WINAPI * PFN_QERAPP_RELEASEACTIVEBRUSHHANDLES )(); typedef void* ( WINAPI * PFN_QERAPP_GETACTIVEBRUSHHANDLE )( int nIndex ); typedef int ( WINAPI * PFN_QERAPP_TEXTURECOUNT )(); typedef char* ( WINAPI * PFN_QERAPP_GETTEXTURE )( int nIndex ); typedef char* ( WINAPI * PFN_QERAPP_GETCURRENTTEXTURE )(); typedef void ( WINAPI * PFN_QERAPP_SETCURRENTTEXTURE )( char* pName ); typedef void ( WINAPI * PFN_QERAPP_REGISTERMAPLOAD )( void* vp ); typedef void ( WINAPI * PFN_QERAPP_REGISTERMAPSAVE )( void* vp ); typedef int ( WINAPI * PFN_QERAPP_GETECLASSCOUNT )(); typedef char* ( WINAPI * PFN_QERAPP_GETECLASS )( int nIndex ); typedef void ( WINAPI * PFN_QERAPP_RESETPLUGINS )(); //--typedef int (WINAPI* PFN_QERAPP_GETENTITYCOUNT)(); /*! \fn LoadTextureRGBA \param pPixels is the raw RGBA pixel data (24bits, 8 bit depth) \param nWidth image width \param nHeight image height this will work from the RGBA data and create a GL texture (accessed through a GL bind number) it takes care of creating the mipmapping levels too */ typedef qtexture_t* ( *PFN_QERAPP_LOADTEXTURERGBA )( unsigned char* pPixels, int nWidth, int nHeight ); //--typedef LPCSTR (WINAPI* PFN_QERAPP_GETENTITY)(int nIndex); // v1.70 typedef int ( WINAPI * PFN_QERAPP_GETENTITYCOUNT )(); typedef void* ( WINAPI * PFN_QERAPP_GETENTITYHANDLE )( int nIndex ); // FIXME: those two are fairly outdated, you get the epairs // but you don't have a clean epair read/write query // and you rely on the C structs directly, which might go away soon // ok now, stop using, it's bad for your karma (see iepairs.h instead) typedef epair_t* ( WINAPI * PFN_QERAPP_ALLOCATEEPAIR )( const char*, const char* ); typedef int ( WINAPI * PFN_QERAPP_ALLOCATEENTITYBRUSHHANDLES )( void* vp ); typedef void ( WINAPI * PFN_QERAPP_RELEASEENTITYBRUSHHANDLES )(); typedef void* ( WINAPI * PFN_QERAPP_GETENTITYBRUSHHANDLE )( int nIndex ); typedef void* ( WINAPI * PFN_QERAPP_CREATEENTITYHANDLE )(); typedef void ( WINAPI * PFN_QERAPP_COMMITBRUSHHANDLETOENTITY )( void* vpBrush, void* vpEntity ); typedef void ( WINAPI * PFN_QERAPP_COMMITENTITYHANDLETOMAP )( void* vp ); typedef void ( WINAPI * PFN_QERAPP_SETSCREENUPDATE )( int bScreenUpdate ); // this one uses window flags defined in qertypes.h typedef void ( WINAPI * PFN_QERAPP_SYSUPDATEWINDOWS )( int bits ); //++timo remove this one typedef void ( WINAPI * PFN_QERAPP_BUILDBRUSH2 )( void* vp, int bConvert ); // v1.80 typedef void ( WINAPI * PFN_QERAPP_GETDISPATCHPARAMS )( vec3_t vMin, vec3_t vMax, bool *bSingleBrush ); typedef int ( WINAPI * PFN_QERAPP_REQUESTINTERFACE )( REFGUID, void* ); // use this one for errors, Radiant will stop after the "edit preferences" dialog typedef void ( WINAPI * PFN_QERAPP_ERROR )( const char* pMsg, ... ); // use to gain read access to the project epairs // FIXME: removed, accessed through QERPlug_RegisterPluginEntities with the IEpair interface // typedef void (WINAPI* PFN_QERAPP_GETPROJECTEPAIR)(epair_t **); // used to allocate and read a buffer //++timo NOTE: perhaps this would need moving to some kind of dedicated interface typedef int ( WINAPI * PFN_QERAPP_LOADFILE )( const char *pLocation, void ** buffer ); typedef char* ( WINAPI * PFN_QERAPP_EXPANDRELETIVEPATH )( char * ); typedef void ( WINAPI * PFN_QERAPP_QECONVERTDOSTOUNIXNAME )( char *dst, const char *src ); typedef int ( WINAPI * PFN_QERAPP_HASSHADER )( const char * ); typedef int ( WINAPI * PFN_QERAPP_TEXTURELOADSKIN )( char *pName, int *pnWidth, int *pnHeight ); // retrieves the path to the engine from the preferences dialog box typedef const char* ( WINAPI * PFN_QERAPP_GETGAMEPATH )(); // retrieves full Radiant path typedef const char* ( WINAPI * PFN_QERAPP_GETQERPATH )(); // retieves .game name of current active game typedef const char* ( WINAPI * PFN_QERAPP_GETGAMEFILE )(); // patches in/out // NOTE: this is a bit different from the brushes in/out, no LPVOID handles this time // use int indexes instead // if you call AllocateActivePatchHandles, you'll be playing with active patches // AllocateSelectedPatcheHandles for selected stuff // a call to CreatePatchHandle will move you to a seperate index table typedef int ( WINAPI * PFN_QERAPP_ALLOCATEACTIVEPATCHHANDLES )(); typedef int ( WINAPI * PFN_QERAPP_ALLOCATESELECTEDPATCHHANDLES )(); typedef void ( WINAPI * PFN_QERAPP_RELEASEPATCHHANDLES )(); typedef patchMesh_t* ( WINAPI * PFN_QERAPP_GETPATCHDATA )( int ); typedef patchMesh_t* ( WINAPI * PFN_QERAPP_GETPATCHHANDLE )( int ); typedef void ( WINAPI * PFN_QERAPP_DELETEPATCH )( int ); typedef int ( WINAPI * PFN_QERAPP_CREATEPATCHHANDLE )(); // when commiting, only a few patchMesh_t members are relevant: // int width, height; // in control points, not patches // int contents, flags, value, type; // drawVert_t ctrl[MAX_PATCH_WIDTH][MAX_PATCH_HEIGHT]; // once you have commited the index is still available, if the patch handle was allocated by you // then you can re-use the index to commit other patches .. otherwise you can change existing patches // NOTE: the handle thing for plugin-allocated patches is a bit silly (nobody's perfect) // TODO: change current behaviour to an index = 0 to tell Radiant to allocate, other indexes to existing patches // patch is selected after a commit // you can add an optional texture / shader name .. if NULL will use the current texture typedef void ( WINAPI * PFN_QERAPP_COMMITPATCHHANDLETOMAP )( int, patchMesh_t* pMesh, char *texName ); typedef void ( WINAPI * PFN_QERAPP_COMMITPATCHHANDLETOENTITY )( int, patchMesh_t* pMesh, char *texName, void* vpEntity ); // console output #define SYS_VRB 0 ///< verbose support (on/off) #define SYS_STD 1 ///< standard print level - this is the default #define SYS_WRN 2 ///< warnings #define SYS_ERR 3 ///< error #define SYS_NOCON 4 ///< no console, only print to the file (useful whenever Sys_Printf and output IS the problem) typedef void ( WINAPI * PFN_QERAPP_SYSPRINTF )( const char *text, ... ); typedef void ( WINAPI * PFN_QERAPP_SYSFPRINTF )( int flag, const char *text, ... ); typedef void ( WINAPI * PFN_QERAPP_SYSBEGINWAIT )(); typedef void ( WINAPI * PFN_QERAPP_SYSENDWAIT )(); typedef void ( *PFN_QERAPP_SYSBEEP )(); typedef void ( *PFN_QERAPP_SYSSTATUS )( const char *psz, int part ); // core map functionality typedef void ( *PFN_QERAPP_MAPNEW )(); typedef void ( *PFN_QERAPP_MAPFREE )(); typedef void ( *PFN_QERAPP_MAPBUILDBRUSHDATA )(); typedef qboolean ( *PFN_QERAPP_MAPISBRUSHFILTERED )( brush_t * ); typedef void ( *PFN_QERAPP_MAPSTARTPOSITION )(); typedef void ( *PFN_QERAPP_MAPREGIONOFF )(); //typedef void (* PFN_QERAPP_SAVEASDIALOG) (bool bRegion); typedef void ( *PFN_QERAPP_SETBUILDWINDINGSNOTEXBUILD )( bool ); typedef void ( *PFN_QERAPP_POINTFILECLEAR )(); typedef void ( *PFN_QERAPP_SYSSETTITLE )( const char *text ); typedef void ( *PFN_QERAPP_CSGMAKEHOLLOW )(); typedef void ( *PFN_QERAPP_REGIONSPAWNPOINT )( FILE *f ); /*! access to a portable GetTickCount */ typedef unsigned long ( *PFN_QERAPP_GETTICKCOUNT )(); class IModelCache { public: virtual ~IModelCache() { } virtual entity_interfaces_t *GetByID( const char *id, const char* version ) = 0; virtual void DeleteByID( const char *id, const char* version ) = 0; virtual void RefreshAll() = 0; }; typedef IModelCache* ( *PFN_GETMODELCACHE )(); class IFileTypeList { public: virtual ~IFileTypeList() { } virtual void addType( filetype_t type ) = 0; }; class IFileTypeRegistry { public: virtual ~IFileTypeRegistry() { } virtual void addType( const char* key, filetype_t type ) = 0; virtual void getTypeList( const char* key, IFileTypeList* typelist ) = 0; private: }; typedef IFileTypeRegistry* ( *PFN_GETFILETYPEREGISTRY )(); typedef const char* ( *PFN_QERAPP_READPROJECTKEY )( const char* key ); typedef char* ( *PFN_GETMAPFILENAME )(); typedef bfilter_t* ( *PFN_QERPLUG_FILTERADD )( int type, int bmask, const char *str, int exclude ); typedef void ( *PFN_QERPLUG_FILTERACTIVATE )( void ); // FIXME: // add map format extensions // add texture format handlers // add surface dialog handler // add model handler/displayer // v1 func table // Plugins need to declare one of these and implement the getfunctable as described above struct _QERFuncTable_1 { int m_nSize; PFN_QERAPP_CREATEBRUSH m_pfnCreateBrush; PFN_QERAPP_CREATEBRUSHHANDLE m_pfnCreateBrushHandle; PFN_QERAPP_DELETEBRUSHHANDLE m_pfnDeleteBrushHandle; PFN_QERAPP_COMMITBRUSHHANDLETOMAP m_pfnCommitBrushHandle; PFN_QERAPP_ADDFACE m_pfnAddFace; PFN_QERAPP_ADDFACEDATA m_pfnAddFaceData; PFN_QERAPP_GETFACEDATA m_pfnGetFaceData; PFN_QERAPP_GETFACECOUNT m_pfnGetFaceCount; PFN_QERAPP_SETFACEDATA m_pfnSetFaceData; PFN_QERAPP_DELETEFACE m_pfnDeleteFace; PFN_QERAPP_TEXTUREBRUSH m_pfnTextureBrush; PFN_QERAPP_BUILDBRUSH m_pfnBuildBrush; // PGM PFN_QERAPP_SELECTBRUSH m_pfnSelectBrush; // PGM PFN_QERAPP_DESELECTBRUSH m_pfnDeselectBrush; // PGM PFN_QERAPP_DESELECTALLBRUSHES m_pfnDeselectAllBrushes; // PGM PFN_QERAPP_DELETESELECTION m_pfnDeleteSelection; PFN_QERAPP_GETPOINTS m_pfnGetPoints; PFN_QERAPP_SELECTEDBRUSHCOUNT m_pfnSelectedBrushCount; PFN_QERAPP_ALLOCATESELECTEDBRUSHHANDLES m_pfnAllocateSelectedBrushHandles; PFN_QERAPP_RELEASESELECTEDBRUSHHANDLES m_pfnReleaseSelectedBrushHandles; PFN_QERAPP_GETSELECTEDBRUSHHANDLE m_pfnGetSelectedBrushHandle; PFN_QERAPP_ACTIVEBRUSHCOUNT m_pfnActiveBrushCount; PFN_QERAPP_ALLOCATEACTIVEBRUSHHANDLES m_pfnAllocateActiveBrushHandles; PFN_QERAPP_RELEASEACTIVEBRUSHHANDLES m_pfnReleaseActiveBrushHandles; PFN_QERAPP_GETACTIVEBRUSHHANDLE m_pfnGetActiveBrushHandle; //++timo this would need to be removed and replaced by the IShaders interface PFN_QERAPP_TEXTURECOUNT m_pfnTextureCount; PFN_QERAPP_GETTEXTURE m_pfnGetTexture; PFN_QERAPP_GETCURRENTTEXTURE m_pfnGetCurrentTexture; PFN_QERAPP_SETCURRENTTEXTURE m_pfnSetCurrentTexture; PFN_QERAPP_GETECLASSCOUNT m_pfnGetEClassCount; PFN_QERAPP_GETECLASS m_pfnGetEClass; PFN_QERAPP_RESETPLUGINS m_pfnResetPlugins; // v1.00 ends here // v1.50 starts here PFN_QERAPP_LOADTEXTURERGBA m_pfnLoadTextureRGBA; // v1.50 ends here // v1.70 starts here PFN_QERAPP_GETENTITYCOUNT m_pfnGetEntityCount; PFN_QERAPP_GETENTITYHANDLE m_pfnGetEntityHandle; PFN_QERAPP_ALLOCATEENTITYBRUSHHANDLES m_pfnAllocateEntityBrushHandles; PFN_QERAPP_RELEASEENTITYBRUSHHANDLES m_pfnReleaseEntityBrushHandles; PFN_QERAPP_GETENTITYBRUSHHANDLE m_pfnGetEntityBrushHandle; PFN_QERAPP_CREATEENTITYHANDLE m_pfnCreateEntityHandle; PFN_QERAPP_COMMITBRUSHHANDLETOENTITY m_pfnCommitBrushHandleToEntity; PFN_QERAPP_COMMITENTITYHANDLETOMAP m_pfnCommitEntityHandleToMap; PFN_QERAPP_ALLOCATEEPAIR m_pfnAllocateEpair; PFN_QERAPP_SETSCREENUPDATE m_pfnSetScreenUpdate; PFN_QERAPP_BUILDBRUSH2 m_pfnBuildBrush2; // v1.70 ends here // v1.80 starts here PFN_QERAPP_GETDISPATCHPARAMS m_pfnGetDispatchParams; // plugins can request additional interfaces PFN_QERAPP_REQUESTINTERFACE m_pfnRequestInterface; PFN_QERAPP_ERROR m_pfnError; // loading a file into a buffer PFN_QERAPP_LOADFILE m_pfnLoadFile; PFN_QERAPP_EXPANDRELETIVEPATH m_pfnExpandReletivePath; PFN_QERAPP_QECONVERTDOSTOUNIXNAME m_pfnQE_ConvertDOSToUnixName; PFN_QERAPP_HASSHADER m_pfnHasShader; PFN_QERAPP_TEXTURELOADSKIN m_pfnTexture_LoadSkin; PFN_QERAPP_GETGAMEPATH m_pfnGetGamePath; PFN_QERAPP_GETQERPATH m_pfnGetQERPath; PFN_QERAPP_GETGAMEFILE m_pfnGetGameFile; // patches in / out PFN_QERAPP_ALLOCATEACTIVEPATCHHANDLES m_pfnAllocateActivePatchHandles; PFN_QERAPP_ALLOCATESELECTEDPATCHHANDLES m_pfnAllocateSelectedPatchHandles; PFN_QERAPP_RELEASEPATCHHANDLES m_pfnReleasePatchHandles; PFN_QERAPP_GETPATCHDATA m_pfnGetPatchData; PFN_QERAPP_GETPATCHHANDLE m_pfnGetPatchHandle; PFN_QERAPP_DELETEPATCH m_pfnDeletePatch; PFN_QERAPP_CREATEPATCHHANDLE m_pfnCreatePatchHandle; PFN_QERAPP_COMMITPATCHHANDLETOMAP m_pfnCommitPatchHandleToMap; PFN_QERAPP_COMMITPATCHHANDLETOENTITY m_pfnCommitPatchHandleToEntity; PFN_QERAPP_LOADIMAGE m_pfnLoadImage; // GTK+ functions PFN_QERAPP_MESSAGEBOX m_pfnMessageBox; PFN_QERAPP_FILEDIALOG m_pfnFileDialog; PFN_QERAPP_DIRDIALOG m_pfnDirDialog; PFN_QERAPP_COLORDIALOG m_pfnColorDialog; PFN_QERAPP_LOADBITMAP m_pfnLoadBitmap; // Profile functions PFN_QERAPP_PROFILE_GETDIR m_pfnProfileGetDirectory; PFN_QERAPP_PROFILE_SAVEINT m_pfnProfileSaveInt; PFN_QERAPP_PROFILE_SAVESTR m_pfnProfileSaveString; PFN_QERAPP_PROFILE_LOADINT m_pfnProfileLoadInt; PFN_QERAPP_PROFILE_LOADSTR m_pfnProfileLoadString; // Sys_ functions PFN_QERAPP_SYSUPDATEWINDOWS m_pfnSysUpdateWindows; PFN_QERAPP_SYSBEEP m_pfnSysBeep; PFN_QERAPP_SYSPRINTF m_pfnSysPrintf; PFN_QERAPP_SYSFPRINTF m_pfnSysFPrintf; PFN_QERAPP_SYSBEGINWAIT m_pfnSysBeginWait; PFN_QERAPP_SYSENDWAIT m_pfnSysEndWait; PFN_QERAPP_SYSSETTITLE m_pfnSys_SetTitle; PFN_QERAPP_SYSSTATUS m_pfnSys_Status; // some core functionality on the map PFN_QERAPP_MAPNEW m_pfnMapNew; PFN_QERAPP_MAPFREE m_pfnMapFree; PFN_QERAPP_MAPBUILDBRUSHDATA m_pfnMapBuildBrushData; PFN_QERAPP_MAPISBRUSHFILTERED m_pfnMap_IsBrushFiltered; PFN_QERAPP_MAPSTARTPOSITION m_pfnMapStartPosition; PFN_QERAPP_MAPREGIONOFF m_pfnMapRegionOff; PFN_QERAPP_SETBUILDWINDINGSNOTEXBUILD m_pfnSetBuildWindingsNoTexBuild; // PFN_QERAPP_SAVEASDIALOG m_pfnSaveAsDialog; PFN_QERAPP_POINTFILECLEAR m_pfnPointFileClear; // FIXME TTimo prolly want to move that somewhere else PFN_QERAPP_CSGMAKEHOLLOW m_pfnCSG_MakeHollow; PFN_QERAPP_REGIONSPAWNPOINT m_pfnRegionSpawnPoint; PFN_QERAPP_GETTICKCOUNT m_pfnQGetTickCount; PFN_GETMODELCACHE m_pfnGetModelCache; PFN_GETFILETYPEREGISTRY m_pfnGetFileTypeRegistry; PFN_QERAPP_READPROJECTKEY m_pfnReadProjectKey; PFN_QERPLUG_FILTERACTIVATE m_pfnFiltersActivate; PFN_QERPLUG_FILTERADD m_pfnFilterAdd; // digibob from the old _QERAppBSPFrontendTable table PFN_GETMAPFILENAME m_pfnGetMapName; }; // macros to access those faster in plugins #ifdef USE_QERTABLE_DEFINE #ifndef __QERTABLENAME #define __QERTABLENAME g_FuncTable #endif #define CSG_MakeHollow __QERTABLENAME.m_pfnCSG_MakeHollow #define Sys_Beep __QERTABLENAME.m_pfnSysBeep #define Sys_Printf __QERTABLENAME.m_pfnSysPrintf #define Sys_FPrintf __QERTABLENAME.m_pfnSysFPrintf #define Sys_BeginWait __QERTABLENAME.m_pfnSysBeginWait #define Sys_EndWait __QERTABLENAME.m_pfnSysEndWait #define Sys_UpdateWindows __QERTABLENAME.m_pfnSysUpdateWindows #define Sys_SetTitle __QERTABLENAME.m_pfnSys_SetTitle #define Sys_Status __QERTABLENAME.m_pfnSys_Status #define Select_Deselect __QERTABLENAME.m_pfnDeselectAllBrushes #define Map_New __QERTABLENAME.m_pfnMapNew #define Map_Free __QERTABLENAME.m_pfnMapFree #define Map_IsBrushFiltered __QERTABLENAME.m_pfnMap_IsBrushFiltered #define Map_BuildBrushData __QERTABLENAME.m_pfnMapBuildBrushData #define Map_StartPosition __QERTABLENAME.m_pfnMapStartPosition #define Map_RegionOff __QERTABLENAME.m_pfnMapRegionOff #define QE_ConvertDOSToUnixName __QERTABLENAME.m_pfnQE_ConvertDOSToUnixName #define SetBuildWindingsNoTexBuild __QERTABLENAME.m_pfnSetBuildWindingsNoTexBuild //#define SaveAsDialog __QERTABLENAME.m_pfnSaveAsDialog #define Pointfile_Clear __QERTABLENAME.m_pfnPointFileClear #define SetScreenUpdate __QERTABLENAME.m_pfnSetScreenUpdate #define Region_SpawnPoint __QERTABLENAME.m_pfnRegionSpawnPoint #define QGetTickCount __QERTABLENAME.m_pfnGetTickCount #define GetModelCache __QERTABLENAME.m_pfnGetModelCache #define GetFileTypeRegistry __QERTABLENAME.m_pfnGetFileTypeRegistry #else IFileTypeRegistry* GetFileTypeRegistry(); #endif #endif