/* =========================================================================== Copyright (C) 1999-2005 Id Software, Inc. This file is part of Quake III Arena source code. Quake III Arena source code 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. Quake III Arena source code 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 Foobar; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA =========================================================================== */ #ifndef __QE3_H__ #define __QE3_H__ // disable data conversion warnings for gl #pragma warning(disable : 4244) // MIPS #pragma warning(disable : 4136) // X86 #pragma warning(disable : 4051) // ALPHA #include extern "C" { #include "qgl.h" } #include #include #include // this define to use HTREEITEM and MFC stuff in the headers #define QERTYPES_USE_MFC #include "qertypes.h" #include "../libs/cmdlib.h" #include "mathlib.h" #include "parse.h" #include "lbmlib.h" #include #include "afxres.h" #include "resource.h" #include "qedefs.h" #include "qfiles.h" #include "textures.h" #include "brush.h" #include "entity.h" #include "map.h" #include "select.h" #include "splines/splines.h" #include "camera.h" #include "xy.h" #include "z.h" #include "mru.h" #include "undo.h" #include "terrain.h" // the dec offsetof macro doesn't work very well... #define myoffsetof(type,identifier) ((size_t)&((type *)0)->identifier) // set these before calling CheckParm extern int myargc; extern char **myargv; double I_FloatTime (void); void Error (char *error, ...); void Warning (char *error, ...); int CheckParm (char *check); void ParseCommandLine (char *lpCmdLine); int ParseNum (char *str); char *COM_Parse (char *data); extern char com_token[1024]; extern qboolean com_eof; #define MAX_NUM_ARGVS 32 extern int argc; extern char *argv[MAX_NUM_ARGVS]; typedef struct { int p1, p2; face_t *f1, *f2; } pedge_t; typedef struct { int iSize; int iTexMenu; // nearest, linear, etc float fGamma; // gamma for textures char szProject[256]; // last project loaded vec3_t colors[COLOR_LAST]; qboolean show_names; qboolean show_coordinates; int exclude; int m_nTextureTweak; } SavedInfo_t; // // system functions // // TTimo NOTE: WINAPI funcs can be accessed by plugins void Sys_UpdateStatusBar( void ); void WINAPI Sys_UpdateWindows (int bits); void Sys_Beep (void); void Sys_ClearPrintf (void); void Sys_Printf (char *text, ...); double Sys_DoubleTime (void); void Sys_GetCursorPos (int *x, int *y); void Sys_SetCursorPos (int x, int y); void Sys_SetTitle (char *text); void Sys_BeginWait (void); void Sys_EndWait (void); void Sys_Status(const char *psz, int part); /* ** most of the QE globals are stored in this structure */ typedef struct { qboolean d_showgrid; int d_gridsize; int d_num_entities; entity_t *d_project_entity; float d_new_brush_bottom_z, d_new_brush_top_z; HINSTANCE d_hInstance; HGLRC d_hglrcBase; HDC d_hdcBase; HWND d_hwndMain; HWND d_hwndCamera; HWND d_hwndEdit; HWND d_hwndEntity; HWND d_hwndTexture; HWND d_hwndXY; HWND d_hwndZ; HWND d_hwndStatus; HWND d_hwndGroup; HWND d_hwndMedia; vec3_t d_points[MAX_POINTS]; int d_numpoints; pedge_t d_edges[MAX_EDGES]; int d_numedges; // terrain variables float d_terrainBrushSize; terrainnoise_t d_terrainNoiseType; terrainfalloff_t d_terrainFalloff; terrainbrush_t d_terrainBrush; int d_terrainWidth; int d_terrainHeight; terrainVert_t *d_terrapoints[MAX_TERRA_POINTS]; int d_numterrapoints; int d_num_move_points; float *d_move_points[4096]; qtexture_t *d_qtextures; texturewin_t d_texturewin; int d_pointfile_display_list; xy_t d_xyOld; LPMRUMENU d_lpMruMenu; SavedInfo_t d_savedinfo; int d_workcount; // connect entities uses the last two brushes selected int d_select_count; brush_t *d_select_order[2]; vec3_t d_select_translate; // for dragging w/o making new display lists select_t d_select_mode; idPointListInterface *selectObject; // int d_font_list; int d_parsed_brushes; qboolean show_blocks; // Timo // tells if we are internally using brush primitive (texture coordinates and map format) // this is a shortcut for IntForKey( g_qeglobals.d_project_entity, "brush_primit" ) // NOTE: must keep the two ones in sync BOOL m_bBrushPrimitMode; // used while importing brush data from file or memory buffer // tells if conversion between map format and internal preferences ( m_bBrushPrimitMode ) is needed qboolean bNeedConvert; qboolean bOldBrushes; qboolean bPrimitBrushes; vec3_t d_vAreaTL; vec3_t d_vAreaBR; // tells if we are using .INI files for prefs instead of registry qboolean use_ini; // even in .INI mode we use the registry for all void* prefs char use_ini_registry[64]; //Timo // tells we have surface properties plugin qboolean bSurfacePropertiesPlugin; // tells we are using a BSP frontend plugin qboolean bBSPFrontendPlugin; qboolean dontDrawSelectedOutlines; } QEGlobals_t; //void *qmalloc (size_t size); char *copystring (char *s); char *ExpandReletivePath (char *p); void Pointfile_Delete (void); void WINAPI Pointfile_Check (void); void Pointfile_Next (void); void Pointfile_Prev (void); void Pointfile_Clear (void); void Pointfile_Draw( void ); void Pointfile_Load( void ); // // drag.c // void Drag_Begin (int x, int y, int buttons, vec3_t xaxis, vec3_t yaxis, vec3_t origin, vec3_t dir); void Drag_MouseMoved (int x, int y, int buttons); void Drag_MouseUp (int nButtons = 0); // // csg.c // void CSG_MakeHollow (void); void CSG_Subtract (void); void CSG_Merge (void); // // vertsel.c // void SetupVertexSelection (void); void SelectEdgeByRay (vec3_t org, vec3_t dir); void SelectVertexByRay (vec3_t org, vec3_t dir); void ConnectEntities (void); extern int update_bits; extern int screen_width; extern int screen_height; extern HANDLE bsp_process; extern HANDLE g_hBSPOutput; extern HANDLE g_hBSPInput; char *TranslateString (char *buf); void ProjectDialog (void); void FillTextureMenu (CStringArray* pArray = NULL); void FillBSPMenu (void); BOOL CALLBACK Win_Dialog ( HWND hwndDlg, // handle to dialog box UINT uMsg, // message WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ); // // win_cam.c // void WCam_Create (HINSTANCE hInstance); // // win_xy.c // void WXY_Create (HINSTANCE hInstance); // // win_z.c // void WZ_Create (HINSTANCE hInstance); // // win_ent.c // // // win_main.c // void Main_Create (HINSTANCE hInstance); extern BOOL SaveWindowState(HWND hWnd, const char *pszName); extern BOOL LoadWindowState(HWND hWnd, const char *pszName); extern BOOL SaveRegistryInfo(const char *pszName, void *pvBuf, long lSize); extern BOOL LoadRegistryInfo(const char *pszName, void *pvBuf, long *plSize); // // entityw.c // BOOL CreateEntityWindow(HINSTANCE hInstance); void FillClassList (void); BOOL UpdateEntitySel(eclass_t *pec); void SetInspectorMode(int iType); int DrawTexControls(HWND hWnd); void SetSpawnFlags(void); void GetSpawnFlags(void); void SetKeyValuePairs(bool bClearMD3 = false); extern void BuildGammaTable(float g); BOOL GetSelectAllCriteria(CString &strKey, CString &strVal); // win_dlg.c void DoGamma(void); void DoFind(void); void DoRotate(void); void DoSides(bool bCone = false, bool bSphere = false, bool bTorus = false); void DoAbout(void); void DoSurface(); /* ** QE function declarations */ void QE_CheckAutoSave( void ); void WINAPI QE_ConvertDOSToUnixName( char *dst, const char *src ); void QE_CountBrushesAndUpdateStatusBar( void ); void WINAPI QE_CheckOpenGLForErrors(void); void QE_ExpandBspString (char *bspaction, char *out, char *mapname, bool useTemps); void QE_Init (void); qboolean QE_KeyDown (int key, int nFlags = 0); qboolean QE_LoadProject (char *projectfile); qboolean QE_SingleBrush (bool bQuiet = false); // sys stuff void Sys_MarkMapModified (void); /* ** QE Win32 function declarations */ int WINAPI QEW_SetupPixelFormat(HDC hDC, qboolean zbuffer ); void QEW_StopGL( HWND hWnd, HGLRC hGLRC, HDC hDC ); /* ** extern declarations */ extern QEGlobals_t g_qeglobals; //++timo clean (moved into qertypes.h) //enum VIEWTYPE {YZ, XZ, XY}; qboolean IsBrushSelected(brush_t* bSel); // curve brushes void Curve_MakeCurvedBrush (qboolean negative, qboolean top, qboolean bottom, qboolean s1, qboolean s2, qboolean s3, qboolean s4); void Curve_Invert (void); void Curve_AddFakePlanes( brush_t *B ); void Curve_StripFakePlanes( brush_t *B ); void Curve_BuildPoints (brush_t *b); void Curve_XYDraw (brush_t *b); void Curve_CameraDraw (brush_t *b); void Curve_WriteFile (char *name); // patch stuff extern bool g_bSameView; extern int g_nPatchClickedView; bool within(vec3_t vTest, vec3_t vTL, vec3_t vBR); void Brush_RebuildBrush(brush_t *b, vec3_t vMins, vec3_t vMaxs ); patchMesh_t* MakeNewPatch(); brush_t* AddBrushForPatch(patchMesh_t *pm, bool bLinkToWorld = true); brush_t* Patch_GenericMesh(int nWidth, int nHeight, int nOrientation = 2, bool bDeleteSource = true, bool bOverride = false); void Patch_ReadFile (char *name); void Patch_WriteFile (char *name); void Patch_BuildPoints (brush_t *b); void Patch_Move(patchMesh_t *p, const vec3_t vMove, bool bRebuild = false); //++timo had to add a default value for bSnap (see Patch_ApplyMatrix call from Select_ApplyMatrix in select.cpp) void Patch_ApplyMatrix(patchMesh_t *p, const vec3_t vOrigin, const vec3_t vMatrix[3], bool bSnap = false); void Patch_EditPatch(); void Patch_Deselect(); void Patch_Deselect(patchMesh_t *p); void Patch_Delete(patchMesh_t *p); int Patch_MemorySize(patchMesh_t *p); void Patch_Select(patchMesh_t *p); void Patch_Scale(patchMesh_t *p, const vec3_t vOrigin, const vec3_t vAmt, bool bRebuilt = true); void Patch_Cleanup(); void Patch_SetView(int n); void Patch_SetTexture(patchMesh_t *p, texdef_t *tex_def, IPluginTexdef* pPlugTexdef = NULL); void Patch_BrushToMesh(bool bCone = false, bool bBevel = false, bool bEndcap = false, bool bSquare = false, int nHeight = 3); bool Patch_DragScale(patchMesh_t *p, vec3_t vAmt, vec3_t vMove); void Patch_ReadBuffer(char* pBuff, bool bSelect = false); void Patch_WriteFile (CMemFile* pMemFile); void Patch_UpdateSelected(vec3_t vMove); void Patch_AddRow(patchMesh_t *p); brush_t* Patch_Parse(bool bOld); void Patch_Write (patchMesh_t *p, FILE *f); void Patch_Write (patchMesh_t *p, CMemFile *file); void Patch_AdjustColumns(patchMesh_t *p, int nCols); void Patch_AdjustRows(patchMesh_t *p, int nRows); void Patch_AdjustSelected(bool bInsert, bool bColumn, bool bFlag); patchMesh_t* Patch_Duplicate(patchMesh_t *pFrom); void Patch_RotateTexture(patchMesh_t *p, float fAngle); void Patch_ScaleTexture(patchMesh_t *p, float fx, float fy, bool bFixup = true); void Patch_ShiftTexture(patchMesh_t *p, float fx, float fy); void Patch_DrawCam(patchMesh_t *p); void Patch_DrawXY(patchMesh_t *p); void Patch_InsertColumn(patchMesh_t *p, bool bAdd); void Patch_InsertRow(patchMesh_t *p, bool bAdd); void Patch_RemoveRow(patchMesh_t *p, bool bFirst); void Patch_RemoveColumn(patchMesh_t *p, bool bFirst); void Patch_ToggleInverted(); void Patch_Restore(patchMesh_t *p); void Patch_Save(patchMesh_t *p); void Patch_SetTextureInfo(texdef_t* pt); void Patch_NaturalTexturing(); void Patch_ResetTexturing(float fx, float fy); void Patch_FitTexturing(); void Patch_BendToggle(); void Patch_StartInsDel(); void Patch_BendHandleTAB(); void Patch_BendHandleENTER(); void Patch_SelectBendNormal(); void Patch_SelectBendAxis(); bool WINAPI OnlyPatchesSelected(); bool WINAPI AnyPatchesSelected(); patchMesh_t* SinglePatchSelected(); void Patch_CapCurrent(bool bInvertedBevel = false, bool bInvertedEndcap = false); void Patch_DisperseRows(); void Patch_DisperseColumns(); void Patch_NaturalizeSelected(bool bCap = false, bool bCycleCap = false); void Patch_SelectAreaPoints(); void Patch_InvertTexture(bool bY); void Patch_InsDelToggle(); void Patch_InsDelHandleTAB(); void Patch_InsDelHandleENTER(); void Patch_SetOverlays(); void Patch_ClearOverlays(); void Patch_Thicken(int nAmount, bool bSeam); void Patch_Transpose(); void Patch_Freeze(); void Patch_UnFreeze(bool bAll); const char* Patch_GetTextureName(); void Patch_FindReplaceTexture(brush_t *pb, const char *pFind, const char *pReplace, bool bForce); void Patch_ReplaceQTexture(brush_t *pb, qtexture_t *pOld, qtexture_t *pNew); void Select_SnapToGrid(); extern bool g_bPatchShowBounds; extern bool g_bPatchWireFrame; extern bool g_bPatchWeld; extern bool g_bPatchDrillDown; extern bool g_bPatchInsertMode; extern bool g_bPatchBendMode; extern vec3_t g_vBendOrigin; void Patch_FromTriangle(vec5_t vx, vec5_t vy, vec5_t vz); const char* Patch_GetKeyValue(patchMesh_t *p, const char *pKey); void Patch_SetEpair(patchMesh_t *p, const char *pKey, const char *pValue); // group stuff // group_t are loaded / saved through "group_info" entities // they hold epairs for group settings and additionnal access info (tree nodes) typedef struct group_s { struct group_s *next; epair_t *epairs; HTREEITEM itemOwner; } group_t; // NOTES: grouping only enabled in brush primitives mode // grouping works by naming brushes and setting display properties // the group hierarchy is not related with the map hierarchy (entity list, brushes etc.) // brushes with no group are under the "world" node (default for all brushes) // void Group_GetListFromWorld(CStringArray *pArray); void Group_RemoveListFromWorld(); // void Group_SetListToWorld(CStringArray *pArray); // void Group_BuildTree(CTreeCtrl *pTree); // void Group_DecomposeTree(CTreeCtrl *pTree); // save group_t as "classname" "group_info" things void Group_Save(FILE *f); // clean the brushes ownerItem, clean the treeview and rebuild everything // is usually called when loading a new map, but may be called anytime void Group_Init(); void Group_Add(entity_t *e); // remove a brush from it's current group, will erase the "group" epair if any, and delete the tree control node void Group_RemoveBrush(brush_t *b); void Group_AddToWorld(brush_t *b); // will remove brush of it's current group if any, and will add it wherever needed according to it's "group" key void Group_AddToProperGroup(brush_t *b); void Group_AddToSelected(brush_t *b); // allocate a new group, set name group_t* Group_Alloc(const char *name); // we use entities to store information about the groups // these entities are not linked into the world, and they have no brushes // only loaded / saved in map file group_t* Group_ForName(const char *name); // Timo // new brush primitive stuff void ComputeAxisBase(vec3_t normal,vec3_t texS,vec3_t texT ); void FaceToBrushPrimitFace(face_t *f); void EmitBrushPrimitTextureCoordinates(face_t *, winding_t *); // EmitTextureCoordinates, is old code used for brush to brush primitive conversion void EmitTextureCoordinates ( float *xyzst, qtexture_t *q, face_t *f); void BrushPrimit_Parse(brush_t *); // compute a fake shift scale rot representation from the texture matrix void TexMatToFakeTexCoords( vec_t texMat[2][3], float shift[2], float *rot, float scale[2] ); void FakeTexCoordsToTexMat( float shift[2], float rot, float scale[2], vec_t texMat[2][3] ); void ConvertTexMatWithQTexture( brushprimit_texdef_t *texMat1, qtexture_t *qtex1, brushprimit_texdef_t *texMat2, qtexture_t *qtex2 ); // texture locking void Face_MoveTexture_BrushPrimit(face_t *f, vec3_t delta); void Select_ShiftTexture_BrushPrimit( face_t *f, int x, int y ); void RotateFaceTexture_BrushPrimit(face_t *f, int nAxis, float fDeg, vec3_t vOrigin ); // used in CCamWnd::ShiftTexture_BrushPrimit void ComputeBest2DVector( vec3_t v, vec3_t X, vec3_t Y, int &x, int &y ); // // eclass.cpp // extern qboolean parsing_single; extern qboolean eclass_found; extern eclass_t *eclass_e; void Eclass_ScanFile( char *filename ); // for interfaces, we require main plugin header included #include "qerplugin.h" // // SurfaceDlg.cpp and surface properties plugin // //++timo some patch in/out stuff is in there, needs to be moved out in a dedicated interface void WINAPI Patch_Rebuild(patchMesh_t *p); #include "isurfaceplugin.h" extern _QERPlugSurfaceTable g_SurfaceTable; // // OpenGL interface // #include "igl.h" HGLRC WINAPI QERApp_GetQeglobalsHGLRC(); void WINAPI QERApp_HookXYGLWindow(IGLWindow* pGLW); void WINAPI QERApp_UnHookGLWindow(IGLWindow* pGLW); void DrawPluginEntities( VIEWTYPE vt ); // // ISelectedFace interface // #include "ISelectedFace.h" int WINAPI QERApp_ISelectedFace_GetTextureNumber(); int WINAPI QERApp_GetFaceInfo(_QERFaceData *pFaceData, winding_t *pWinding); int WINAPI QERApp_SetFaceInfo(_QERFaceData *pFaceData); void WINAPI QERApp_GetTextureSize( int Size[2] ); // // IEpairs interface // #include "IEpairs.h" #include "EpairsWrapper.h" // // IPluginEntities interface // #include "IPluginEntities.h" int WINAPI QERApp_EClassScanDir( char *dir, HMODULE plugID ); // // ShaderInfo.cpp // #include "ShaderInfo.h" // // TexWnd.cpp // CShaderInfo* hasShader(const char *pName); // // IScripLib interface // GetToken, UnGetToken, etc. #include "IScriplib.h" extern FILE *g_File; void WINAPI QERApp_MapPrintf_FILE( char *text, ... ); // // ISurfacePlugin interface // void WINAPI QERApp_GetTwoSelectedPatch( patchMesh_t **p1, patchMesh_t **p2 ); // // IBSPFrontend interface // #include "IBSPFrontend.h" extern _QERPlugBSPFrontendTable g_BSPFrontendTable; extern CStringArray g_BSPFrontendCommands; // // IMessaging interface #include "IMessaging.h" #include "Messaging.h" void WINAPI QERApp_HookWindow(IWindowListener* pListen); void WINAPI QERApp_UnHookWindow(IWindowListener* pListen); IXYWndWrapper* WINAPI QERApp_GetXYWndWrapper(); void WINAPI QERApp_HookListener(IListener* pListen, int Msg); int WINAPI QERApp_UnHookListener(IListener* pListen); void DispatchRadiantMsg( int Msg ); // dispatch for IWindowListener entities void DispatchOnMouseMove(UINT nFlags, int x, int y); bool DispatchOnLButtonDown(UINT nFlags, int x, int y); bool DispatchOnLButtonUp(UINT nFlags, int x, int y); // // IShaders interface CShaderInfo* SetNameShaderInfo(qtexture_t* q, const char* pPath, const char* pName); qtexture_t* Texture_LoadTGATexture (unsigned char* pPixels, int nWidth, int nHeight, char* pPath, int nFlags, int nContents, int nValue ); #include "IShaders.h" qtexture_t* WINAPI QERApp_TryTextureForName(const char* name); #endif