]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - include/qerplugin.h
apply misc fixes from Markus Fischer and Rambetter
[xonotic/netradiant.git] / include / qerplugin.h
index 907a4bee530b538418270b21c9c3de0c36e8a315..48f877c896f010d2b144c55d7ce910432c242f1f 100644 (file)
-/*\r
-Copyright (C) 1999-2007 id Software, Inc. and contributors.\r
-For a list of contributors, see the accompanying CONTRIBUTORS file.\r
-\r
-This file is part of GtkRadiant.\r
-\r
-GtkRadiant is free software; you can redistribute it and/or modify\r
-it under the terms of the GNU General Public License as published by\r
-the Free Software Foundation; either version 2 of the License, or\r
-(at your option) any later version.\r
-\r
-GtkRadiant is distributed in the hope that it will be useful,\r
-but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
-GNU General Public License for more details.\r
-\r
-You should have received a copy of the GNU General Public License\r
-along with GtkRadiant; if not, write to the Free Software\r
-Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\r
-*/\r
-\r
-// QERadiant PlugIns\r
-//\r
-//\r
-\r
-#ifndef __QERPLUGIN_H__\r
-#define __QERPLUGIN_H__\r
-\r
-/*!\r
-\todo this header is intended to be turned into a header for the core editor functionality\r
-some portability related code should be moved to synapse (such as the GUID stuff)\r
-*/\r
-\r
-#include <stdio.h>\r
-#include <string.h>\r
-// TTimo\r
-// ideally the plugin API would be UI toolkit independent, but removing the dependency with GLib seems tricky right now..\r
-#include <glib.h>\r
-#include "qertypes.h"\r
-\r
-// FIXME TTimo:\r
-// GUID declaration here should be trashed, it is in synapse.h\r
-#ifdef _WIN32\r
-#include <wtypes.h>\r
-#endif\r
-\r
-#define QER_MAX_NAMELEN 1024\r
-\r
-#ifndef _WIN32\r
-#include "misc_def.h"\r
-#endif\r
-\r
-// the editor will look for plugins in two places, the plugins path \r
-// under the application path, and the path under the basepath as defined\r
-// in the project (.qe4) file.\r
-//\r
-// you can drop any number of new texture, model format DLL's in the standard plugin path\r
-// but only one plugin that overrides map loading/saving, surface dialog, surface flags, etc.. \r
-// should be used at one time.. if multiples are loaded then the last one loaded will be the \r
-// active one\r
-//\r
-// type of services the plugin supplies, pass any combo of these flags\r
-// it is assumed the plugin will have a matching function as defined below\r
-// to correlate to the implied functionality\r
-// \r
-\r
-#define RADIANT_MAJOR "radiant"\r
-\r
-// basics\r
-#define QERPLUG_INIT "QERPlug_Init"\r
-#define QERPLUG_GETNAME "QERPlug_GetName"\r
-#define QERPLUG_GETCOMMANDLIST "QERPlug_GetCommandList"\r
-#define QERPLUG_DISPATCH "QERPlug_Dispatch"\r
-#define QERPLUG_GETFUNCTABLE "QERPlug_GetFuncTable"\r
-\r
-// game stuff\r
-#define QERPLUG_GETTEXTUREINFO "QERPlug_GetTextureInfo"   // gets a texture info structure\r
-#define QERPLUG_LOADTEXTURE    "QERPlug_LoadTexture"      // loads a texture, will return an RGBA structure\r
-                                                          // and any surface flags/contents for it\r
-#define QERPLUG_GETSURFACEFLAGS "QERPlug_GetSurfaceFlags" // gets a list of surface/content flag names from a plugin\r
-\r
-struct _QERTextureInfo\r
-{\r
-  char m_TextureExtension[QER_MAX_NAMELEN];   // the extension these textures have\r
-  qboolean m_bHiColor;    // if textures are NOT high color, the default \r
-                      // palette (as described inthe qe4 file will be used for gamma correction)\r
-                      // if they are high color, gamma and shading are computed on the fly \r
-                      // based on the rgba data\r
-  //--bool m_bIsShader;   // will probably do q3 shaders this way when i merge\r
-  qboolean m_bWadStyle;   // if this is true, the plugin will be presented with the texture path\r
-                      // defined in the .qe4 file and is expected to preload all the textures\r
-  qboolean m_bHalfLife;   // causes brushes to be saved/parsed without the surface contents/flags/value\r
-};\r
-\r
-struct _QERTextureLoad    // returned by a plugin\r
-{\r
-  _QERTextureLoad()\r
-  { \r
-    memset(reinterpret_cast<void*>(this), 0, sizeof(_QERTextureLoad));\r
-  };\r
-\r
-  ~_QERTextureLoad()\r
-  {\r
-    delete []m_pRGBA;\r
-    delete []m_pName;\r
-  };\r
-\r
-  void makeSpace(int nSize)\r
-  {\r
-    m_pRGBA = new unsigned char[nSize+1];\r
-  };\r
-\r
-  void setName(const char* p)\r
-  {\r
-    m_pName = new char[strlen(p)+1];\r
-    strcpy(m_pName, p);\r
-  };\r
-\r
-\r
-  unsigned char *m_pRGBA; // rgba data (alpha channel is supported and drawn appropriately)\r
-  int m_nWidth;           // width\r
-  int m_nHeight;          // height\r
-  int m_nContents;        // default contents\r
-  int m_nFlags;           // "" flags\r
-  int m_nValue;           // "" value\r
-  char *m_pName;          // name to be referenced in map, build tools, etc.\r
-};\r
-\r
-struct _QERModelInfo\r
-{\r
-  char m_ModelExtension[QER_MAX_NAMELEN];\r
-  bool m_bSkinned;\r
-  bool m_bMultipart;\r
-};\r
-\r
-struct _QERModelLoad\r
-{\r
-  // vertex and skin data\r
-};\r
-\r
-\r
-//=========================================\r
-// plugin functions\r
-#if 0\r
-// NOTE TTimo: hack to make old plugin tech and new plugin tech live together\r
-#ifndef _IPLUGIN_H_\r
-// toolkit-independant interface, cast hwndMain to GtkWidget*\r
-typedef const char* (WINAPI *PFN_QERPLUG_INIT)(void* hApp, void* hwndMain);\r
-typedef const char* (WINAPI *PFN_QERPLUG_GETNAME)();\r
-typedef const char* (WINAPI *PFN_QERPLUG_GETCOMMANDLIST)();\r
-typedef void  (WINAPI *PFN_QERPLUG_DISPATCH)(const char* p, vec3_t vMin, vec3_t vMax, bool bSingleBrush);\r
-#endif\r
-#endif\r
-\r
-typedef char* (WINAPI *PFN_QERPLUG_GETFUNCTABLE)();\r
-\r
-// v1.5\r
-//\r
-// Texture loading\r
-// returns a ptr to _QERTextureInfo\r
-typedef void* (WINAPI *PFN_QERPLUG_GETTEXTUREINFO)();\r
-//\r
-// loads a texture by calling the texture load func in the editor (defined below)\r
-// transparency (for water, fog, lava, etc.. ) can be emulated in the editor\r
-// by passing in appropriate alpha data or by setting the appropriate surface flags\r
-// expected by q2 (which the editor will use.. )\r
-typedef void (WINAPI *PFN_QERPLUG_LOADTEXTURE)(const char* pFilename); \r
-\r
-// v1.6\r
-typedef void* (WINAPI *PFN_QERPLUG_GETSURFACEFLAGS)();\r
-\r
-// v1.7\r
-// if exists in plugin, gets called between INIT and GETCOMMANDLIST\r
-// the plugin can register the EClasses he wants to handle\r
-//++timo TODO: this has got to move into the table, and be requested by QERPlug_RequestInterface\r
-//++timo FIXME: the LPVOID parameter must be casted to an IEpair interface\r
-#define QERPLUG_REGISTERPLUGINENTITIES "QERPlug_RegisterPluginEntities"\r
-typedef void (WINAPI * PFN_QERPLUG_REGISTERPLUGINENTITIES)( void* );\r
-\r
-// if exists in plugin, gets called between INIT and GETCOMMANDLIST\r
-// the plugin can Init all it needs for surface properties\r
-#define QERPLUG_INITSURFACEPROPERTIES "QERPlug_InitSurfaceProperties"\r
-typedef void (WINAPI * PFN_QERPLUG_INITSURFACEPROPERTIES)();\r
-\r
-// if Radiant needs to use a particular set of commands, it can request the plugin to fill a func table\r
-// this is similar to PFN_QERAPP_REQUESTINTERFACE\r
-#define QERPLUG_REQUESTINTERFACE "QERPlug_RequestInterface"\r
-typedef int (WINAPI * PFN_QERPLUG_REQUESTINTERFACE) (REFGUID refGUID, void* pInterface, const char *version_name);\r
-\r
-// Load an image file\r
-typedef void (* PFN_QERAPP_LOADIMAGE) (const char *name, unsigned char **pic, int *width, int *height);\r
-\r
-// TTimo FIXME: the logic for this is in synapse now\r
-\r
-// MODULES specific:\r
-// if it exports this entry point, will be considered as a module\r
-// a module is a plugin that provides some REQUIRED interfaces to Radiant, such as the shader module\r
-// Radiant will call QERPLUG_LISTINTERFACES to get a list of the interfaces a given plugin implements\r
-// then it will call PFN_QERPLUG_REQUESTINTERFACE to actually get them\r
-\r
-// following leo's code .. looks ok to use a string to identify the various versions of a same interface\r
-// obviously it would be handy to have the same string naming for the interfaces.\r
-// best way would be to have the names come in when you list the interfaces\r
-// NOTE: we might have a problem with the order in which the interfaces are filled in\r
-//   there's some kind of dependency graph, the shader module expects to find the VFS ready etc.\r
-typedef struct moduleentry_s {\r
-  const GUID *interface_GUID;\r
-  const char* interface_name;\r
-  const char* version_name; \r
-} moduleentry_t;\r
-\r
-#define QERPLUG_LISTINTERFACES "QERPlug_ListInterfaces"\r
-#define MAX_QERPLUG_INTERFACES 10\r
-typedef int (WINAPI* PFN_QERPLUG_LISTINTERFACES) (moduleentry_t table[MAX_QERPLUG_INTERFACES]);\r
-\r
-// ========================================\r
-// GTK+ helper functions\r
-\r
-// NOTE: parent can be NULL in all functions but it's best to set them\r
-\r
-// simple Message Box, see above for the 'type' flags\r
-// toolkit-independent, cast parent ot a GtkWidget*\r
-typedef gint (WINAPI* PFN_QERAPP_MESSAGEBOX) (void *parent, const char* text,\r
-                                              const char* caption, guint32 type, const char *URL);\r
-\r
-// file and directory selection functions return NULL if the user hits cancel\r
-// or a gchar* string that must be g_free'd by the user\r
-// - 'title' is the dialog title (can be NULL)\r
-// - 'path' is used to set the initial directory (can be NULL)\r
-// - 'pattern': the first pattern is for the win32 mode, then comes the Gtk pattern list, see Radiant source for samples\r
-// TTimo 04/01/2001 toolkit-independant, cast parent to a GtkWidget*\r
-typedef const gchar* (* PFN_QERAPP_FILEDIALOG) (void *parent, gboolean open, const char* title,\r
-                                                const char* path, const char* pattern);\r
-typedef gchar* (WINAPI* PFN_QERAPP_DIRDIALOG) (void *parent, const char* title,\r
-                                               const char* path);\r
-\r
-// return true if the user closed the dialog with 'Ok'\r
-// 'color' is used to set the initial value and store the selected value\r
-typedef bool (WINAPI* PFN_QERAPP_COLORDIALOG) (void *parent, float *color,\r
-                                               const char* title);\r
-\r
-// load a .bmp file and store the results in 'gdkpixmap' and 'mask'\r
-// returns TRUE on success but even if it fails, it creates an empty pixmap\r
-// NOTE: 'filename' is relative to <radiant_path>/plugins/bitmaps/\r
-// TTimo 04/01/2001 toolkit-independant, cast gkpixmap to GdkPixmap and mask to GdkBitmap\r
-typedef bool (WINAPI* PFN_QERAPP_LOADBITMAP) (const char* filename, void **gdkpixmap, void **mask);\r
-\r
-// ========================================\r
-// read/write preferences file\r
-\r
-// use this function to get the directory where the preferences file are stored\r
-typedef const char* (WINAPI* PFN_QERAPP_PROFILE_GETDIR) ();\r
-\r
-// 'filename' is the absolute path\r
-typedef bool (WINAPI* PFN_QERAPP_PROFILE_SAVEINT) (const char *filename, const char *section,\r
-                                                   const char *key, int value);\r
-typedef bool (WINAPI* PFN_QERAPP_PROFILE_SAVESTR) (const char *filename, const char *section,\r
-                                                   const char *key, const char *value);\r
-typedef int (WINAPI* PFN_QERAPP_PROFILE_LOADINT) (const char *filename, const char *section,\r
-                                                  const char *key, int default_value);\r
-typedef char* (WINAPI* PFN_QERAPP_PROFILE_LOADSTR) (const char *filename, const char *section,\r
-                                                    const char *key, const char *default_value);\r
-\r
-//=========================================\r
-// editor functions\r
-\r
-// There are 3 potential brush handle lists\r
-// 1. the list that contains brushes a plugin creates using CreateBrushHandle\r
-// 2. the selected brush list (brushes the user has selected)\r
-// 3. the active brush list (brushes in the map that are not selected)\r
-// \r
-// In general, the same things can be done to brush handles (face manip, delete brushhandle, etc.. ) in each\r
-// list. There are a few exceptions. \r
-// 1. You cannot commit a selected or active brush handle to the map. This is because it is already in the map. \r
-// 2. You cannot bind brush handles from the selected or active brush list to an entity. As of v1.0 of the plugins\r
-// the only way for a plugin to create entities is to create a brush handles (or a list of handles) and then bind\r
-// them to an entity. This will commit the brush(s) and/or the entities to the map as well.\r
-// \r
-// To use the active or selected brush lists, you must first allocate them (which returns a count) and then\r
-// release them when you are finish manipulating brushes in one of those lists. \r
-\r
-//++timo NOTE : the #defines here are never used, but can help finding where things are done in the editor\r
-#if 0\r
-// brush manipulation routines\r
-#define QERAPP_CREATEBRUSH "QERApp_CreateBrush"\r
-#define QERAPP_CREATEBRUSHHANDLE "QERApp_CreateBrushHandle"\r
-#define QERAPP_DELETEBRUSHHANDLE "QERApp_DeleteBrushHandle"\r
-#define QERAPP_COMMITBRUSHHANDLETOMAP "QERApp_CommitBrushHandleToMap"\r
-//++timo not implemented .. remove\r
-// #define QERAPP_BINDHANDLESTOENTITY "QERApp_BindHandlesToEntity"\r
-#define QERAPP_ADDFACE "QERApp_AddFace"\r
-#define QERAPP_ADDFACEDATA "QERApp_AddFaceData"\r
-#define QERAPP_GETFACECOUNT "QERApp_GetFaceCount"\r
-#define QERAPP_GETFACEDATA "QERApp_GetFaceData"\r
-#define QERAPP_SETFACEDATA "QERApp_SetFaceData"\r
-#define QERAPP_DELETEFACE "QERApp_DeleteFace"\r
-#define QERAPP_TEXTUREBRUSH "QERApp_TextureBrush"\r
-#define QERAPP_BUILDBRUSH "QERApp_BuildBrush"                                  // PGM\r
-#define QERAPP_SELECTEDBRUSHCOUNT "QERApp_SelectedBrushCount"\r
-#define QERAPP_ALLOCATESELECTEDBRUSHHANDLES "QERApp_AllocateSelectedBrushHandles"\r
-#define QERAPP_RELEASESELECTEDBRUSHHANDLES "QERApp_ReleaseSelectedBrushHandles"\r
-#define QERAPP_GETSELECTEDBRUSHHANDLE "QERApp_GetSelectedBrushHandle"\r
-#define QERAPP_ACTIVEBRUSHCOUNT "QERApp_ActiveBrushCount"\r
-#define QERAPP_ALLOCATEACTIVEBRUSHHANDLES "QERApp_AllocateActiveBrushHandles"\r
-#define QERAPP_RELEASEACTIVEBRUSHHANDLES "QERApp_ReleaseActiveBrushHandles"\r
-#define QERAPP_GETACTIVEBRUSHHANDLE "QERApp_GetActiveBrushHandle"\r
-\r
-// texture stuff\r
-#define QERAPP_TEXTURECOUNT "QERApp_TextureCount"\r
-#define QERAPP_GETTEXTURE "QERApp_GetTexture"\r
-#define QERAPP_GETCURRENTTEXTURE "QERApp_GetCurrentTexture"\r
-#define QERAPP_SETCURRENTTEXTURE "QERApp_SetCurrentTexture"\r
-\r
-// selection \r
-#define QERAPP_DELETESELECTION "QERApp_DeleteSelection"\r
-#define QERAPP_SELECTBRUSH "QERApp_SelectBrush"                                        // PGM\r
-#define QERAPP_DESELECTBRUSH "QERApp_DeselectBrush"                            // PGM\r
-#define QERAPP_DESELECTALLBRUSHES "QERApp_DeselectAllBrushes"  // PGM\r
-\r
-// data gathering\r
-#define QERAPP_GETPOINTS "QERApp_GetPoints"\r
-#define QERAPP_SELECTBRUSHES "QERApp_GetBrushes"\r
-\r
-// entity class stuff\r
-// the entity handling is very basic for 1.0\r
-#define QERAPP_GETECLASSCOUNT "QERApp_GetEClassCount"\r
-#define QERAPP_GETECLASS "QERApp_GetEClass"\r
-\r
-// misc\r
-#define QERAPP_SYSMSG "QERApp_SysMsg"\r
-#define QERAPP_INFOMSG "QERApp_InfoMsg"\r
-#define QERAPP_HIDEINFOMSG "QERApp_HideInfoMsg"\r
-#define QERAPP_RESET_PLUGINS "QERApp_ResetPlugins"\r
-\r
-// texture loading\r
-#define QERAPP_LOADTEXTURERGBA "QERApp_LoadTextureRGBA"\r
-\r
-// FIXME: the following are not implemented yet\r
-// hook registrations\r
-#define QERAPP_REGISTER_MAPLOADFUNC "QERApp_Register_MapLoadFunc"\r
-#define QERAPP_REGISTER_MAPSAVEFUNC "QERApp_Register_MapSaveFunc"\r
-\r
-// FIXME: the following are not implemented yet\r
-#define QERAPP_REGISTER_PROJECTLOADFUNC "QERApp_Register_ProjectLoadFunc"\r
-#define QERAPP_REGISTER_MOUSEHANDLER "QERApp_Register_MouseHandler"\r
-#define QERAPP_REGISTER_KEYHANDLER "QERApp_Register_KeyHandler"\r
-\r
-// FIXME: new primtives do not work in v1.00\r
-// primitives are new types of things in the map\r
-// for instance, the Q3 curves could have been done as \r
-// primitives instead of being built in \r
-// it will be a plugins responsibility to hook the map load and save funcs to load\r
-// and/or save any additional data (like new primitives of some type)\r
-// the editor will call each registered renderer during the rendering process to repaint\r
-// any primitives the plugin owns\r
-// each primitive object has a temporary sibling brush that lives in the map\r
-// FIXME: go backwards on this a bit.. orient it more towards the temp brush mode as it will be cleaner\r
-// basically a plugin will hook the map load and save and will add the primitives to the map.. this will\r
-// produce a temporary 'primitive' brush and the appropriate renderer will be called as well as the \r
-// edit handler (for edge drags, sizes, rotates, etc.. ) and the vertex maker will be called when vertex\r
-// mode is attemped on the brush.. there will need to be a GetPrimitiveBounds callback in the edit handler\r
-// so the brush can resize appropriately as needed.. this might be the plugins responsibility to set the \r
-// sibling brushes size.. it will then be the plugins responsibility to hook map save to save the primitives\r
-// as the editor will discard any temp primitive brushes.. (there probably needs to be some kind of sanity check\r
-// here as far as keeping the brushes and the plugin in sync.. i suppose the edit handler can deal with all of that\r
-// crap but it looks like a nice place for a mess)\r
-#define QERAPP_REGISTER_PRIMITIVE "QERApp_Register_Primitive"\r
-#define QERAPP_REGISTER_RENDERER "QERApp_Register_Renderer"\r
-#define QERAPP_REGISTER_EDITHANDLER "QERApp_Register_EditHandler"\r
-#define QERAPP_REGISTER_VERTEXMAKER "QERApp_Register_VertexMaker"\r
-#define QERAPP_ADDPRIMITIVE "QERApp_AddPrimitive"\r
-\r
-// v1.70\r
-#define QERAPP_GETENTITYCOUNT "QERApp_GetEntityCount"\r
-#define QERAPP_GETENTITYHANDLE "QERApp_GetEntityHandle"\r
-//++timo not implemented for the moment\r
-// #define QERAPP_GETENTITYINFO "QERApp_GetEntityInfo"\r
-//++timo does the keyval need some more funcs to add/remove ?\r
-// get the pointer and do the changes yourself\r
-#define QERAPP_ALLOCATEEPAIR "QERApp_AllocateEpair"\r
-#define QERAPP_ALLOCATEENTITYBRUSHHANDLES "QERApp_AllocateEntityBrushHandles"\r
-#define QERAPP_RELEASEENTITYBRUSHHANDLES "QERApp_ReleaseEntityBrushHandles"\r
-#define QERAPP_GETENTITYBRUSHHANDLE "QERApp_GetEntityBrushHandle"\r
-#define QERAPP_CREATEENTITYHANDLE "QERApp_CreateEntityHandle"\r
-#define QERAPP_COMMITBRUSHHANDLETOENTITY "QERApp_CommitBrushHandleToEntity"\r
-#define QERAPP_COMMITENTITYHANDLETOMAP "QERApp_CommitEntityHandleToMap"\r
-#define QERAPP_SETSCREENUPDATE "QERApp_SetScreenUpdate"\r
-#define QERAPP_BUILDBRUSH2 "QERApp_BuildBrush2"\r
-#endif\r
-\r
-// v1.80\r
-#define QERAPP_GETDISPATCHPARAMS "QERApp_GetDispatchParams"\r
-\r
-struct _QERPointData\r
-{\r
-  int     m_nCount;\r
-  vec3_t *m_pVectors;\r
-};\r
-\r
-struct _QERFaceData\r
-{\r
-  char  m_TextureName[QER_MAX_NAMELEN];\r
-  int   m_nContents;\r
-  int   m_nFlags;\r
-  int   m_nValue;\r
-  float m_fShift[2];\r
-  float m_fRotate;\r
-  float m_fScale[2];\r
-  vec3_t m_v1, m_v2, m_v3;\r
-  // brush primitive additions\r
-  qboolean m_bBPrimit;\r
-  brushprimit_texdef_t brushprimit_texdef;\r
-};\r
-\r
-typedef void (WINAPI * PFN_QERAPP_CREATEBRUSH)(vec3_t vMin, vec3_t vMax);\r
-\r
-typedef void* (WINAPI * PFN_QERAPP_CREATEBRUSHHANDLE)();\r
-typedef void (WINAPI * PFN_QERAPP_DELETEBRUSHHANDLE)(void* pv);\r
-typedef void (WINAPI * PFN_QERAPP_COMMITBRUSHHANDLETOMAP)(void* pv);\r
-typedef void (WINAPI * PFN_QERAPP_ADDFACE)(void* pv, vec3_t v1, vec3_t v2, vec3_t v3);\r
-\r
-typedef void (WINAPI * PFN_QERAPP_ADDFACEDATA)(void* pv, _QERFaceData *pData);\r
-typedef int  (WINAPI * PFN_QERAPP_GETFACECOUNT)(void* pv);\r
-typedef _QERFaceData* (WINAPI * PFN_QERAPP_GETFACEDATA)(void* pv, int nFaceIndex);\r
-typedef void (WINAPI * PFN_QERAPP_SETFACEDATA)(void* pv, int nFaceIndex, _QERFaceData *pData);\r
-typedef void (WINAPI * PFN_QERAPP_DELETEFACE)(void* pv, int nFaceIndex);\r
-typedef void (WINAPI * PFN_QERAPP_TEXTUREBRUSH)(void* pv, char* pName);\r
-typedef void (WINAPI * PFN_QERAPP_BUILDBRUSH)(void* pv);               // PGM\r
-typedef void (WINAPI * PFN_QERAPP_SELECTBRUSH)(void* pv);              // PGM\r
-typedef void (WINAPI * PFN_QERAPP_DESELECTBRUSH)(void* pv);            // PGM\r
-typedef void (WINAPI * PFN_QERAPP_DESELECTALLBRUSHES)();                       // PGM\r
-\r
-typedef void (WINAPI * PFN_QERAPP_DELETESELECTION)();\r
-typedef void (WINAPI * PFN_QERAPP_GETPOINTS)(int nMax, _QERPointData *pData, char* pMsg);\r
-\r
-typedef int  (WINAPI * PFN_QERAPP_SELECTEDBRUSHCOUNT)();\r
-typedef int (WINAPI * PFN_QERAPP_ALLOCATESELECTEDBRUSHHANDLES)();\r
-typedef void (WINAPI * PFN_QERAPP_RELEASESELECTEDBRUSHHANDLES)();\r
-typedef void* (WINAPI * PFN_QERAPP_GETSELECTEDBRUSHHANDLE)(int nIndex);\r
-\r
-typedef int  (WINAPI * PFN_QERAPP_ACTIVEBRUSHCOUNT)();\r
-typedef int (WINAPI * PFN_QERAPP_ALLOCATEACTIVEBRUSHHANDLES)();\r
-typedef void (WINAPI * PFN_QERAPP_RELEASEACTIVEBRUSHHANDLES)();\r
-typedef void* (WINAPI * PFN_QERAPP_GETACTIVEBRUSHHANDLE)(int nIndex);\r
-\r
-typedef int  (WINAPI * PFN_QERAPP_TEXTURECOUNT)();\r
-typedef char* (WINAPI * PFN_QERAPP_GETTEXTURE)(int nIndex);\r
-typedef char* (WINAPI * PFN_QERAPP_GETCURRENTTEXTURE)();\r
-typedef void (WINAPI * PFN_QERAPP_SETCURRENTTEXTURE)(char* pName);\r
-\r
-typedef void (WINAPI * PFN_QERAPP_REGISTERMAPLOAD)(void* vp);\r
-typedef void (WINAPI * PFN_QERAPP_REGISTERMAPSAVE)(void* vp);\r
-\r
-typedef int (WINAPI * PFN_QERAPP_GETECLASSCOUNT)();\r
-typedef char* (WINAPI * PFN_QERAPP_GETECLASS)(int nIndex);\r
-\r
-typedef void (WINAPI * PFN_QERAPP_RESETPLUGINS)();\r
-//--typedef int (WINAPI* PFN_QERAPP_GETENTITYCOUNT)();\r
-\r
-/*!\r
-\fn LoadTextureRGBA\r
-\param pPixels is the raw RGBA pixel data (24bits, 8 bit depth)\r
-\param nWidth image width\r
-\param nHeight image height\r
-this will work from the RGBA data and create a GL texture (accessed through a GL bind number)\r
-it takes care of creating the mipmapping levels too\r
-see http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=575 for some related issues\r
-*/\r
-typedef qtexture_t* (* PFN_QERAPP_LOADTEXTURERGBA)(unsigned char* pPixels, int nWidth, int nHeight);\r
-\r
-//--typedef LPCSTR (WINAPI* PFN_QERAPP_GETENTITY)(int nIndex);\r
-\r
-// v1.70\r
-typedef int (WINAPI * PFN_QERAPP_GETENTITYCOUNT)();\r
-typedef void* (WINAPI * PFN_QERAPP_GETENTITYHANDLE)(int nIndex);\r
-// FIXME: those two are fairly outdated, you get the epairs\r
-//   but you don't have a clean epair read/write query\r
-//   and you rely on the C structs directly, which might go away soon\r
-//   ok now, stop using, it's bad for your karma (see iepairs.h instead)\r
-typedef epair_t* (WINAPI * PFN_QERAPP_ALLOCATEEPAIR)( char*, char* );\r
-typedef int (WINAPI * PFN_QERAPP_ALLOCATEENTITYBRUSHHANDLES)(void* vp);\r
-typedef void (WINAPI * PFN_QERAPP_RELEASEENTITYBRUSHHANDLES)();\r
-typedef void* (WINAPI * PFN_QERAPP_GETENTITYBRUSHHANDLE)(int nIndex);\r
-typedef void* (WINAPI * PFN_QERAPP_CREATEENTITYHANDLE)();\r
-typedef void (WINAPI * PFN_QERAPP_COMMITBRUSHHANDLETOENTITY)( void* vpBrush, void* vpEntity);\r
-typedef void (WINAPI * PFN_QERAPP_COMMITENTITYHANDLETOMAP)(void* vp);\r
-typedef void (WINAPI * PFN_QERAPP_SETSCREENUPDATE)(int bScreenUpdate);\r
-// this one uses window flags defined in qertypes.h\r
-typedef void (WINAPI * PFN_QERAPP_SYSUPDATEWINDOWS)(int bits);\r
-//++timo remove this one\r
-typedef void (WINAPI * PFN_QERAPP_BUILDBRUSH2)(void* vp, int bConvert);\r
-\r
-// v1.80\r
-typedef void (WINAPI * PFN_QERAPP_GETDISPATCHPARAMS)(vec3_t vMin, vec3_t vMax, bool *bSingleBrush);\r
-\r
-typedef int (WINAPI * PFN_QERAPP_REQUESTINTERFACE)( REFGUID, void* );\r
-// use this one for errors, Radiant will stop after the "edit preferences" dialog\r
-typedef void (WINAPI * PFN_QERAPP_ERROR)(char* pMsg, ...);\r
-// use to gain read access to the project epairs\r
-// FIXME: removed, accessed through QERPlug_RegisterPluginEntities with the IEpair interface\r
-// typedef void (WINAPI* PFN_QERAPP_GETPROJECTEPAIR)(epair_t **);\r
-// used to allocate and read a buffer\r
-//++timo NOTE: perhaps this would need moving to some kind of dedicated interface\r
-typedef int (WINAPI * PFN_QERAPP_LOADFILE)(const char *pLocation, void ** buffer);\r
-typedef char* (WINAPI * PFN_QERAPP_EXPANDRELETIVEPATH)(char *);\r
-typedef void (WINAPI * PFN_QERAPP_QECONVERTDOSTOUNIXNAME)( char *dst, const char *src );\r
-typedef int (WINAPI * PFN_QERAPP_HASSHADER)(const char *);\r
-typedef int (WINAPI * PFN_QERAPP_TEXTURELOADSKIN)(char *pName, int *pnWidth, int *pnHeight);\r
-// retrieves the path to the engine from the preferences dialog box\r
-typedef const char* (WINAPI * PFN_QERAPP_GETGAMEPATH)();\r
-// retrieves full Radiant path\r
-typedef const char* (WINAPI * PFN_QERAPP_GETQERPATH)();\r
-// retieves .game name of current active game\r
-typedef const char* (WINAPI * PFN_QERAPP_GETGAMEFILE)();\r
-\r
-// patches in/out\r
-// NOTE: this is a bit different from the brushes in/out, no LPVOID handles this time\r
-// use int indexes instead\r
-// if you call AllocateActivePatchHandles, you'll be playing with active patches\r
-// AllocateSelectedPatcheHandles for selected stuff\r
-// a call to CreatePatchHandle will move you to a seperate index table\r
-typedef int                            (WINAPI * PFN_QERAPP_ALLOCATEACTIVEPATCHHANDLES)                ();\r
-typedef int                            (WINAPI * PFN_QERAPP_ALLOCATESELECTEDPATCHHANDLES)      ();\r
-typedef void                   (WINAPI * PFN_QERAPP_RELEASEPATCHHANDLES)                       ();\r
-typedef patchMesh_t*   (WINAPI * PFN_QERAPP_GETPATCHDATA)                                      (int);\r
-typedef patchMesh_t*   (WINAPI * PFN_QERAPP_GETPATCHHANDLE)                            (int);\r
-typedef void                   (WINAPI * PFN_QERAPP_DELETEPATCH)                               (int);\r
-typedef int                            (WINAPI * PFN_QERAPP_CREATEPATCHHANDLE)                         ();\r
-// when commiting, only a few patchMesh_t members are relevant:\r
-//  int        width, height;          // in control points, not patches\r
-//  int   contents, flags, value, type;\r
-//  drawVert_t ctrl[MAX_PATCH_WIDTH][MAX_PATCH_HEIGHT];\r
-// once you have commited the index is still available, if the patch handle was allocated by you\r
-//   then you can re-use the index to commit other patches .. otherwise you can change existing patches\r
-// NOTE: the handle thing for plugin-allocated patches is a bit silly (nobody's perfect)\r
-// TODO: change current behaviour to an index = 0 to tell Radiant to allocate, other indexes to existing patches\r
-// patch is selected after a commit\r
-// you can add an optional texture / shader name .. if NULL will use the current texture\r
-typedef void                   (WINAPI * PFN_QERAPP_COMMITPATCHHANDLETOMAP)                    (int, patchMesh_t* pMesh, char *texName);\r
-typedef void                   (WINAPI * PFN_QERAPP_COMMITPATCHHANDLETOENTITY)                 (int, patchMesh_t* pMesh, char *texName, void* vpEntity);\r
-\r
-// console output\r
-#define SYS_VRB 0 ///< verbose support (on/off)\r
-#define SYS_STD 1 ///< standard print level - this is the default\r
-#define SYS_WRN 2 ///< warnings\r
-#define SYS_ERR 3 ///< error\r
-#define SYS_NOCON 4 ///< no console, only print to the file (useful whenever Sys_Printf and output IS the problem)\r
-typedef void (WINAPI* PFN_QERAPP_SYSPRINTF) (const char *text, ...);\r
-typedef void (WINAPI* PFN_QERAPP_SYSFPRINTF) (int flag, const char *text, ...);\r
-\r
-typedef void (WINAPI* PFN_QERAPP_SYSBEGINWAIT) ();\r
-typedef void (WINAPI* PFN_QERAPP_SYSENDWAIT) ();\r
-\r
-typedef void (* PFN_QERAPP_SYSBEEP) ();\r
-\r
-typedef void (* PFN_QERAPP_SYSSTATUS) (const char *psz, int part );\r
-\r
-// core map functionality\r
-typedef void      (* PFN_QERAPP_MAPNEW)                     ();\r
-typedef void      (* PFN_QERAPP_MAPFREE)                    ();\r
-typedef void      (* PFN_QERAPP_MAPBUILDBRUSHDATA)          ();\r
-typedef qboolean  (* PFN_QERAPP_MAPISBRUSHFILTERED)         (brush_t *);\r
-typedef void      (* PFN_QERAPP_MAPSTARTPOSITION)           ();\r
-typedef void      (* PFN_QERAPP_MAPREGIONOFF)               ();\r
-//typedef void      (* PFN_QERAPP_SAVEASDIALOG)               (bool bRegion);\r
-typedef void      (* PFN_QERAPP_SETBUILDWINDINGSNOTEXBUILD) (bool);\r
-typedef void      (* PFN_QERAPP_POINTFILECLEAR)             ();\r
-\r
-typedef void (* PFN_QERAPP_SYSSETTITLE) (const char *text);\r
-\r
-typedef void (* PFN_QERAPP_CSGMAKEHOLLOW) ();\r
-\r
-typedef void (* PFN_QERAPP_REGIONSPAWNPOINT) (FILE *f);\r
-\r
-/*!\r
-access to a portable GetTickCount\r
-*/\r
-typedef unsigned long (* PFN_QERAPP_GETTICKCOUNT) ();\r
-\r
-class IModelCache\r
-{\r
-public:\r
-  virtual entity_interfaces_t *GetByID(const char *id, const char* version) = 0;\r
-  virtual void DeleteByID(const char *id, const char* version) = 0;\r
-  virtual void RefreshAll() = 0;\r
-};\r
-\r
-typedef IModelCache* (* PFN_GETMODELCACHE)();\r
-\r
-class IFileTypeList\r
-{\r
-public:\r
-  virtual void addType(filetype_t type) = 0;\r
-};\r
-\r
-class IFileTypeRegistry\r
-{\r
-public:\r
-  virtual void addType(const char* key, filetype_t type) = 0;\r
-  virtual void getTypeList(const char* key, IFileTypeList* typelist) = 0;\r
-private:\r
-};\r
-\r
-typedef IFileTypeRegistry* (* PFN_GETFILETYPEREGISTRY)();\r
-\r
-typedef const char* (* PFN_QERAPP_READPROJECTKEY)(const char* key);\r
-\r
-typedef char* (* PFN_GETMAPFILENAME)();\r
-\r
-  // FIXME:\r
-// add map format extensions\r
-// add texture format handlers\r
-// add surface dialog handler\r
-// add model handler/displayer\r
-\r
-// v1 func table\r
-// Plugins need to declare one of these and implement the getfunctable as described above\r
-struct _QERFuncTable_1\r
-{\r
-  int   m_nSize;\r
-  PFN_QERAPP_CREATEBRUSH            m_pfnCreateBrush;\r
-  PFN_QERAPP_CREATEBRUSHHANDLE      m_pfnCreateBrushHandle;\r
-  PFN_QERAPP_DELETEBRUSHHANDLE      m_pfnDeleteBrushHandle;\r
-  PFN_QERAPP_COMMITBRUSHHANDLETOMAP m_pfnCommitBrushHandle;\r
-  PFN_QERAPP_ADDFACE                m_pfnAddFace;\r
-  PFN_QERAPP_ADDFACEDATA            m_pfnAddFaceData;\r
-  PFN_QERAPP_GETFACEDATA            m_pfnGetFaceData;\r
-  PFN_QERAPP_GETFACECOUNT           m_pfnGetFaceCount;\r
-  PFN_QERAPP_SETFACEDATA            m_pfnSetFaceData;\r
-  PFN_QERAPP_DELETEFACE             m_pfnDeleteFace;\r
-  PFN_QERAPP_TEXTUREBRUSH           m_pfnTextureBrush;\r
-  PFN_QERAPP_BUILDBRUSH                                m_pfnBuildBrush;                                // PGM\r
-  PFN_QERAPP_SELECTBRUSH                       m_pfnSelectBrush;                               // PGM\r
-  PFN_QERAPP_DESELECTBRUSH                     m_pfnDeselectBrush;                             // PGM\r
-  PFN_QERAPP_DESELECTALLBRUSHES                m_pfnDeselectAllBrushes;                // PGM\r
-\r
-  PFN_QERAPP_DELETESELECTION        m_pfnDeleteSelection;\r
-  PFN_QERAPP_GETPOINTS              m_pfnGetPoints;\r
-\r
-  PFN_QERAPP_SELECTEDBRUSHCOUNT           m_pfnSelectedBrushCount;\r
-  PFN_QERAPP_ALLOCATESELECTEDBRUSHHANDLES m_pfnAllocateSelectedBrushHandles;\r
-  PFN_QERAPP_RELEASESELECTEDBRUSHHANDLES  m_pfnReleaseSelectedBrushHandles;\r
-  PFN_QERAPP_GETSELECTEDBRUSHHANDLE       m_pfnGetSelectedBrushHandle;\r
-\r
-  PFN_QERAPP_ACTIVEBRUSHCOUNT             m_pfnActiveBrushCount;\r
-  PFN_QERAPP_ALLOCATEACTIVEBRUSHHANDLES   m_pfnAllocateActiveBrushHandles;\r
-  PFN_QERAPP_RELEASEACTIVEBRUSHHANDLES    m_pfnReleaseActiveBrushHandles;\r
-  PFN_QERAPP_GETACTIVEBRUSHHANDLE         m_pfnGetActiveBrushHandle;\r
-\r
-  //++timo this would need to be removed and replaced by the IShaders interface\r
-  PFN_QERAPP_TEXTURECOUNT                 m_pfnTextureCount;\r
-  PFN_QERAPP_GETTEXTURE                   m_pfnGetTexture;\r
-  PFN_QERAPP_GETCURRENTTEXTURE            m_pfnGetCurrentTexture;\r
-  PFN_QERAPP_SETCURRENTTEXTURE            m_pfnSetCurrentTexture;\r
-\r
-  PFN_QERAPP_GETECLASSCOUNT         m_pfnGetEClassCount;\r
-  PFN_QERAPP_GETECLASS              m_pfnGetEClass;\r
-  PFN_QERAPP_RESETPLUGINS           m_pfnResetPlugins;\r
-  // v1.00 ends here\r
-  // v1.50 starts here\r
-  PFN_QERAPP_LOADTEXTURERGBA        m_pfnLoadTextureRGBA;\r
-  // v1.50 ends here\r
-  // v1.70 starts here\r
-  PFN_QERAPP_GETENTITYCOUNT                    m_pfnGetEntityCount;\r
-  PFN_QERAPP_GETENTITYHANDLE           m_pfnGetEntityHandle;\r
-  PFN_QERAPP_ALLOCATEENTITYBRUSHHANDLES        m_pfnAllocateEntityBrushHandles;\r
-  PFN_QERAPP_RELEASEENTITYBRUSHHANDLES m_pfnReleaseEntityBrushHandles;\r
-  PFN_QERAPP_GETENTITYBRUSHHANDLE      m_pfnGetEntityBrushHandle;\r
-  PFN_QERAPP_CREATEENTITYHANDLE                m_pfnCreateEntityHandle;\r
-  PFN_QERAPP_COMMITBRUSHHANDLETOENTITY m_pfnCommitBrushHandleToEntity;\r
-  PFN_QERAPP_COMMITENTITYHANDLETOMAP   m_pfnCommitEntityHandleToMap;\r
-  PFN_QERAPP_ALLOCATEEPAIR                     m_pfnAllocateEpair;\r
-  PFN_QERAPP_SETSCREENUPDATE           m_pfnSetScreenUpdate;\r
-  PFN_QERAPP_BUILDBRUSH2                       m_pfnBuildBrush2;\r
-  // v1.70 ends here\r
-  // v1.80 starts here\r
-  PFN_QERAPP_GETDISPATCHPARAMS     m_pfnGetDispatchParams;\r
-\r
-  // plugins can request additional interfaces\r
-  PFN_QERAPP_REQUESTINTERFACE          m_pfnRequestInterface;\r
-  PFN_QERAPP_ERROR                                     m_pfnError;\r
-  // loading a file into a buffer\r
-  PFN_QERAPP_LOADFILE                          m_pfnLoadFile;\r
-  PFN_QERAPP_EXPANDRELETIVEPATH                m_pfnExpandReletivePath;\r
-  PFN_QERAPP_QECONVERTDOSTOUNIXNAME    m_pfnQE_ConvertDOSToUnixName;\r
-  PFN_QERAPP_HASSHADER                         m_pfnHasShader;\r
-  PFN_QERAPP_TEXTURELOADSKIN           m_pfnTexture_LoadSkin;\r
-  PFN_QERAPP_GETGAMEPATH                       m_pfnGetGamePath;\r
-  PFN_QERAPP_GETQERPATH                                m_pfnGetQERPath;\r
-  PFN_QERAPP_GETGAMEFILE                       m_pfnGetGameFile;\r
-  // patches in / out\r
-  PFN_QERAPP_ALLOCATEACTIVEPATCHHANDLES                m_pfnAllocateActivePatchHandles;\r
-  PFN_QERAPP_ALLOCATESELECTEDPATCHHANDLES      m_pfnAllocateSelectedPatchHandles;\r
-  PFN_QERAPP_RELEASEPATCHHANDLES                       m_pfnReleasePatchHandles;\r
-  PFN_QERAPP_GETPATCHDATA                                      m_pfnGetPatchData;\r
-  PFN_QERAPP_GETPATCHHANDLE                            m_pfnGetPatchHandle;\r
-  PFN_QERAPP_DELETEPATCH                                       m_pfnDeletePatch;\r
-  PFN_QERAPP_CREATEPATCHHANDLE                         m_pfnCreatePatchHandle;\r
-  PFN_QERAPP_COMMITPATCHHANDLETOMAP                    m_pfnCommitPatchHandleToMap;\r
-  PFN_QERAPP_COMMITPATCHHANDLETOENTITY m_pfnCommitPatchHandleToEntity;\r
-\r
-  PFN_QERAPP_LOADIMAGE  m_pfnLoadImage;\r
-\r
-  // GTK+ functions\r
-  PFN_QERAPP_MESSAGEBOX  m_pfnMessageBox;\r
-  PFN_QERAPP_FILEDIALOG  m_pfnFileDialog;\r
-  PFN_QERAPP_DIRDIALOG   m_pfnDirDialog;\r
-  PFN_QERAPP_COLORDIALOG m_pfnColorDialog;\r
-  PFN_QERAPP_LOADBITMAP  m_pfnLoadBitmap;\r
-\r
-  // Profile functions\r
-  PFN_QERAPP_PROFILE_GETDIR  m_pfnProfileGetDirectory;\r
-  PFN_QERAPP_PROFILE_SAVEINT m_pfnProfileSaveInt;\r
-  PFN_QERAPP_PROFILE_SAVESTR m_pfnProfileSaveString;\r
-  PFN_QERAPP_PROFILE_LOADINT m_pfnProfileLoadInt;\r
-  PFN_QERAPP_PROFILE_LOADSTR m_pfnProfileLoadString;\r
-\r
-  // Sys_ functions\r
-  PFN_QERAPP_SYSUPDATEWINDOWS          m_pfnSysUpdateWindows;\r
-  PFN_QERAPP_SYSBEEP m_pfnSysBeep;\r
-  PFN_QERAPP_SYSPRINTF  m_pfnSysPrintf;\r
-  PFN_QERAPP_SYSFPRINTF m_pfnSysFPrintf;\r
-  PFN_QERAPP_SYSBEGINWAIT m_pfnSysBeginWait;\r
-  PFN_QERAPP_SYSENDWAIT m_pfnSysEndWait;\r
-  PFN_QERAPP_SYSSETTITLE m_pfnSys_SetTitle;\r
-  PFN_QERAPP_SYSSTATUS m_pfnSys_Status;\r
-\r
-  // some core functionality on the map\r
-  PFN_QERAPP_MAPNEW m_pfnMapNew;\r
-  PFN_QERAPP_MAPFREE m_pfnMapFree;\r
-  PFN_QERAPP_MAPBUILDBRUSHDATA m_pfnMapBuildBrushData;\r
-  PFN_QERAPP_MAPISBRUSHFILTERED m_pfnMap_IsBrushFiltered;\r
-  PFN_QERAPP_MAPSTARTPOSITION m_pfnMapStartPosition;\r
-  PFN_QERAPP_MAPREGIONOFF m_pfnMapRegionOff;\r
-  PFN_QERAPP_SETBUILDWINDINGSNOTEXBUILD m_pfnSetBuildWindingsNoTexBuild;\r
-//  PFN_QERAPP_SAVEASDIALOG m_pfnSaveAsDialog;\r
-  PFN_QERAPP_POINTFILECLEAR m_pfnPointFileClear;\r
-\r
-  // FIXME TTimo prolly want to move that somewhere else\r
-  PFN_QERAPP_CSGMAKEHOLLOW m_pfnCSG_MakeHollow;\r
-\r
-  PFN_QERAPP_REGIONSPAWNPOINT m_pfnRegionSpawnPoint;\r
-  PFN_QERAPP_GETTICKCOUNT m_pfnQGetTickCount;\r
-  PFN_GETMODELCACHE m_pfnGetModelCache;\r
-  PFN_GETFILETYPEREGISTRY m_pfnGetFileTypeRegistry;\r
-\r
-  PFN_QERAPP_READPROJECTKEY m_pfnReadProjectKey;\r
-\r
-  // digibob from the old _QERAppBSPFrontendTable table\r
-       PFN_GETMAPFILENAME  m_pfnGetMapName;\r
-};\r
-\r
-// macros to access those faster in plugins\r
-#ifdef USE_QERTABLE_DEFINE\r
-#ifndef __QERTABLENAME\r
-#define __QERTABLENAME g_FuncTable\r
-#endif\r
-#define CSG_MakeHollow __QERTABLENAME.m_pfnCSG_MakeHollow\r
-#define Sys_Beep __QERTABLENAME.m_pfnSysBeep\r
-#define Sys_Printf __QERTABLENAME.m_pfnSysPrintf\r
-#define Sys_FPrintf __QERTABLENAME.m_pfnSysFPrintf\r
-#define Sys_BeginWait __QERTABLENAME.m_pfnSysBeginWait\r
-#define Sys_EndWait __QERTABLENAME.m_pfnSysEndWait\r
-#define Sys_UpdateWindows __QERTABLENAME.m_pfnSysUpdateWindows\r
-#define Sys_SetTitle __QERTABLENAME.m_pfnSys_SetTitle\r
-#define Sys_Status __QERTABLENAME.m_pfnSys_Status\r
-#define Select_Deselect __QERTABLENAME.m_pfnDeselectAllBrushes\r
-#define Map_New __QERTABLENAME.m_pfnMapNew\r
-#define Map_Free __QERTABLENAME.m_pfnMapFree\r
-#define Map_IsBrushFiltered __QERTABLENAME.m_pfnMap_IsBrushFiltered\r
-#define Map_BuildBrushData __QERTABLENAME.m_pfnMapBuildBrushData\r
-#define Map_StartPosition __QERTABLENAME.m_pfnMapStartPosition\r
-#define Map_RegionOff __QERTABLENAME.m_pfnMapRegionOff\r
-#define QE_ConvertDOSToUnixName __QERTABLENAME.m_pfnQE_ConvertDOSToUnixName\r
-#define SetBuildWindingsNoTexBuild __QERTABLENAME.m_pfnSetBuildWindingsNoTexBuild\r
-//#define SaveAsDialog __QERTABLENAME.m_pfnSaveAsDialog\r
-#define Pointfile_Clear __QERTABLENAME.m_pfnPointFileClear\r
-#define SetScreenUpdate __QERTABLENAME.m_pfnSetScreenUpdate\r
-#define Region_SpawnPoint __QERTABLENAME.m_pfnRegionSpawnPoint\r
-#define QGetTickCount __QERTABLENAME.m_pfnGetTickCount\r
-#define GetModelCache __QERTABLENAME.m_pfnGetModelCache\r
-#define GetFileTypeRegistry __QERTABLENAME.m_pfnGetFileTypeRegistry\r
-#else\r
-IFileTypeRegistry* GetFileTypeRegistry();\r
-#endif\r
-\r
-#endif\r
+/*
+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 <stdio.h>
+#include <string.h>
+// TTimo
+// ideally the plugin API would be UI toolkit independent, but removing the dependency with GLib seems tricky right now..
+#include <glib.h>
+#include "qertypes.h"
+
+// FIXME TTimo:
+// GUID declaration here should be trashed, it is in synapse.h
+#ifdef _WIN32
+#include <wtypes.h>
+#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<void*>(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
+#if 0
+// NOTE TTimo: hack to make old plugin tech and new plugin tech live together
+#ifndef _IPLUGIN_H_
+// toolkit-independant interface, cast hwndMain to GtkWidget*
+typedef const char* (WINAPI *PFN_QERPLUG_INIT)(void* hApp, void* hwndMain);
+typedef const char* (WINAPI *PFN_QERPLUG_GETNAME)();
+typedef const char* (WINAPI *PFN_QERPLUG_GETCOMMANDLIST)();
+typedef void  (WINAPI *PFN_QERPLUG_DISPATCH)(const char* p, vec3_t vMin, vec3_t vMax, bool bSingleBrush);
+#endif
+#endif
+
+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 <radiant_path>/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.
+
+//++timo NOTE : the #defines here are never used, but can help finding where things are done in the editor
+#if 0
+// brush manipulation routines
+#define QERAPP_CREATEBRUSH "QERApp_CreateBrush"
+#define QERAPP_CREATEBRUSHHANDLE "QERApp_CreateBrushHandle"
+#define QERAPP_DELETEBRUSHHANDLE "QERApp_DeleteBrushHandle"
+#define QERAPP_COMMITBRUSHHANDLETOMAP "QERApp_CommitBrushHandleToMap"
+//++timo not implemented .. remove
+// #define QERAPP_BINDHANDLESTOENTITY "QERApp_BindHandlesToEntity"
+#define QERAPP_ADDFACE "QERApp_AddFace"
+#define QERAPP_ADDFACEDATA "QERApp_AddFaceData"
+#define QERAPP_GETFACECOUNT "QERApp_GetFaceCount"
+#define QERAPP_GETFACEDATA "QERApp_GetFaceData"
+#define QERAPP_SETFACEDATA "QERApp_SetFaceData"
+#define QERAPP_DELETEFACE "QERApp_DeleteFace"
+#define QERAPP_TEXTUREBRUSH "QERApp_TextureBrush"
+#define QERAPP_BUILDBRUSH "QERApp_BuildBrush"                                  // PGM
+#define QERAPP_SELECTEDBRUSHCOUNT "QERApp_SelectedBrushCount"
+#define QERAPP_ALLOCATESELECTEDBRUSHHANDLES "QERApp_AllocateSelectedBrushHandles"
+#define QERAPP_RELEASESELECTEDBRUSHHANDLES "QERApp_ReleaseSelectedBrushHandles"
+#define QERAPP_GETSELECTEDBRUSHHANDLE "QERApp_GetSelectedBrushHandle"
+#define QERAPP_ACTIVEBRUSHCOUNT "QERApp_ActiveBrushCount"
+#define QERAPP_ALLOCATEACTIVEBRUSHHANDLES "QERApp_AllocateActiveBrushHandles"
+#define QERAPP_RELEASEACTIVEBRUSHHANDLES "QERApp_ReleaseActiveBrushHandles"
+#define QERAPP_GETACTIVEBRUSHHANDLE "QERApp_GetActiveBrushHandle"
+
+// texture stuff
+#define QERAPP_TEXTURECOUNT "QERApp_TextureCount"
+#define QERAPP_GETTEXTURE "QERApp_GetTexture"
+#define QERAPP_GETCURRENTTEXTURE "QERApp_GetCurrentTexture"
+#define QERAPP_SETCURRENTTEXTURE "QERApp_SetCurrentTexture"
+
+// selection
+#define QERAPP_DELETESELECTION "QERApp_DeleteSelection"
+#define QERAPP_SELECTBRUSH "QERApp_SelectBrush"                                        // PGM
+#define QERAPP_DESELECTBRUSH "QERApp_DeselectBrush"                            // PGM
+#define QERAPP_DESELECTALLBRUSHES "QERApp_DeselectAllBrushes"  // PGM
+
+// data gathering
+#define QERAPP_GETPOINTS "QERApp_GetPoints"
+#define QERAPP_SELECTBRUSHES "QERApp_GetBrushes"
+
+// entity class stuff
+// the entity handling is very basic for 1.0
+#define QERAPP_GETECLASSCOUNT "QERApp_GetEClassCount"
+#define QERAPP_GETECLASS "QERApp_GetEClass"
+
+// misc
+#define QERAPP_SYSMSG "QERApp_SysMsg"
+#define QERAPP_INFOMSG "QERApp_InfoMsg"
+#define QERAPP_HIDEINFOMSG "QERApp_HideInfoMsg"
+#define QERAPP_RESET_PLUGINS "QERApp_ResetPlugins"
+
+// texture loading
+#define QERAPP_LOADTEXTURERGBA "QERApp_LoadTextureRGBA"
+
+// FIXME: the following are not implemented yet
+// hook registrations
+#define QERAPP_REGISTER_MAPLOADFUNC "QERApp_Register_MapLoadFunc"
+#define QERAPP_REGISTER_MAPSAVEFUNC "QERApp_Register_MapSaveFunc"
+
+// FIXME: the following are not implemented yet
+#define QERAPP_REGISTER_PROJECTLOADFUNC "QERApp_Register_ProjectLoadFunc"
+#define QERAPP_REGISTER_MOUSEHANDLER "QERApp_Register_MouseHandler"
+#define QERAPP_REGISTER_KEYHANDLER "QERApp_Register_KeyHandler"
+
+// FIXME: new primtives do not work in v1.00
+// primitives are new types of things in the map
+// for instance, the Q3 curves could have been done as
+// primitives instead of being built in
+// it will be a plugins responsibility to hook the map load and save funcs to load
+// and/or save any additional data (like new primitives of some type)
+// the editor will call each registered renderer during the rendering process to repaint
+// any primitives the plugin owns
+// each primitive object has a temporary sibling brush that lives in the map
+// FIXME: go backwards on this a bit.. orient it more towards the temp brush mode as it will be cleaner
+// basically a plugin will hook the map load and save and will add the primitives to the map.. this will
+// produce a temporary 'primitive' brush and the appropriate renderer will be called as well as the
+// edit handler (for edge drags, sizes, rotates, etc.. ) and the vertex maker will be called when vertex
+// mode is attemped on the brush.. there will need to be a GetPrimitiveBounds callback in the edit handler
+// so the brush can resize appropriately as needed.. this might be the plugins responsibility to set the
+// sibling brushes size.. it will then be the plugins responsibility to hook map save to save the primitives
+// as the editor will discard any temp primitive brushes.. (there probably needs to be some kind of sanity check
+// here as far as keeping the brushes and the plugin in sync.. i suppose the edit handler can deal with all of that
+// crap but it looks like a nice place for a mess)
+#define QERAPP_REGISTER_PRIMITIVE "QERApp_Register_Primitive"
+#define QERAPP_REGISTER_RENDERER "QERApp_Register_Renderer"
+#define QERAPP_REGISTER_EDITHANDLER "QERApp_Register_EditHandler"
+#define QERAPP_REGISTER_VERTEXMAKER "QERApp_Register_VertexMaker"
+#define QERAPP_ADDPRIMITIVE "QERApp_AddPrimitive"
+
+// v1.70
+#define QERAPP_GETENTITYCOUNT "QERApp_GetEntityCount"
+#define QERAPP_GETENTITYHANDLE "QERApp_GetEntityHandle"
+//++timo not implemented for the moment
+// #define QERAPP_GETENTITYINFO "QERApp_GetEntityInfo"
+//++timo does the keyval need some more funcs to add/remove ?
+// get the pointer and do the changes yourself
+#define QERAPP_ALLOCATEEPAIR "QERApp_AllocateEpair"
+#define QERAPP_ALLOCATEENTITYBRUSHHANDLES "QERApp_AllocateEntityBrushHandles"
+#define QERAPP_RELEASEENTITYBRUSHHANDLES "QERApp_ReleaseEntityBrushHandles"
+#define QERAPP_GETENTITYBRUSHHANDLE "QERApp_GetEntityBrushHandle"
+#define QERAPP_CREATEENTITYHANDLE "QERApp_CreateEntityHandle"
+#define QERAPP_COMMITBRUSHHANDLETOENTITY "QERApp_CommitBrushHandleToEntity"
+#define QERAPP_COMMITENTITYHANDLETOMAP "QERApp_CommitEntityHandleToMap"
+#define QERAPP_SETSCREENUPDATE "QERApp_SetScreenUpdate"
+#define QERAPP_BUILDBRUSH2 "QERApp_BuildBrush2"
+#endif
+
+// 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