-/*\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