/* =========================================================================== Doom 3 GPL Source Code Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company. This file is part of the Doom 3 GPL Source Code ("Doom 3 Source Code"). Doom 3 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 3 of the License, or (at your option) any later version. Doom 3 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 Doom 3 Source Code. If not, see . In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below. If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. =========================================================================== */ #ifndef __QE3_H__ #define __QE3_H__ #ifdef ID_DEBUG_MEMORY #undef new #undef DEBUG_NEW #define DEBUG_NEW new #endif // this define to use HTREEITEM and MFC stuff in the headers #define QERTYPES_USE_MFC #include "qertypes.h" #include "cmdlib.h" #include "parse.h" #include #include "afxres.h" #include "../../sys/win32/rc/Radiant_resource.h" // main symbols #include "../../sys/win32/win_local.h" #include "qedefs.h" // stuff from old qfiles.h #define MAX_MAP_ENTITIES 2048 const int MAX_MOVE_POINTS = 4096; const int MAX_MOVE_PLANES = 2048; // assume that all maps fit within this const float HUGE_DISTANCE = 100000; #include "textures.h" #include "EditorBrush.h" #include "EditorEntity.h" #include "EditorMap.h" #include "select.h" #include "splines.h" #include "z.h" #include "mru.h" #include "waitdlg.h" #include "MainFrm.h" #include "PrefsDlg.h" #include "FindTextureDlg.h" #include "dialogtextures.h" #include "InspectorDialog.h" #include "undo.h" #include "PMESH.H" // the dec offsetof macro doesn't work very well... #define myoffsetof(type,identifier) ((size_t)&((type *)0)->identifier) void Error (char *error, ...); void Warning (char *error, ...); 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 idVec3 colors[COLOR_LAST]; bool show_names; bool show_coordinates; int exclude; float m_nTextureTweak; bool editorExpanded; RECT oldEditRect; bool showSoundAlways; bool showSoundWhenSelected; } 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); double Sys_DoubleTime (void); void Sys_GetCursorPos (int *x, int *y); void Sys_SetCursorPos (int x, int y); void Sys_SetTitle (const char *text); void Sys_BeginWait (void); bool Sys_Waiting(); void Sys_EndWait (void); void Sys_Status(const char *psz, int part = -1); /* ** most of the QE globals are stored in this structure */ typedef struct { bool d_showgrid; float d_gridsize; int rotateAxis; // 0, 1 or 2 int flatRotation; // 0, 1 or 2, 0 == off, 1 == rotate about the rotation origin, 1 == rotate about the selection mid point int d_num_entities; entity_t *d_project_entity; idVec3 d_new_brush_bottom, d_new_brush_top; HINSTANCE d_hInstance; idVec3 d_points[MAX_POINTS]; int d_numpoints; pedge_t d_edges[MAX_EDGES]; int d_numedges; int d_num_move_points; idVec3 *d_move_points[MAX_MOVE_POINTS]; int d_num_move_planes; idPlane *d_move_planes[MAX_MOVE_PLANES]; qtexture_t *d_qtextures; texturewin_t d_texturewin; int d_pointfile_display_list; 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[MAX_MAP_ENTITIES]; idVec3 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; bool 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 bool bNeedConvert; bool bOldBrushes; bool bPrimitBrushes; float mapVersion; idVec3 d_vAreaTL; idVec3 d_vAreaBR; // tells if we are using .INI files for prefs instead of registry bool 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 bool bSurfacePropertiesPlugin; // tells we are using a BSP frontend plugin bool bBSPFrontendPlugin; // the editor has its own soundWorld and renderWorld, completely distinct from the game idRenderWorld *rw; idSoundWorld *sw; } QEGlobals_t; 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, const idVec3 &xaxis, const idVec3 &yaxis, const idVec3 &origin, const idVec3 &dir); void Drag_MouseMoved (int x, int y, int buttons); void Drag_MouseUp (int nButtons = 0); extern bool g_moveOnly; // // csg.c // void CSG_MakeHollow (void); void CSG_Subtract (void); void CSG_Merge (void); // // vertsel.c // void SetupVertexSelection (void); void SelectEdgeByRay (idVec3 org, idVec3 dir); void SelectVertexByRay (idVec3 org, idVec3 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); // 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 QE_CountBrushesAndUpdateStatusBar( void ); void WINAPI QE_CheckOpenGLForErrors(void); void QE_ExpandBspString (char *bspaction, char *out, char *mapname, bool useTemps); void QE_Init (void); bool QE_KeyDown (int key, int nFlags = 0); bool QE_LoadProject (char *projectfile); bool QE_SingleBrush (bool bQuiet = false, bool entityOK = false); // sys stuff void Sys_MarkMapModified (void); /* ** QE Win32 function declarations */ int WINAPI QEW_SetupPixelFormat(HDC hDC, bool zbuffer ); /* ** extern declarations */ extern QEGlobals_t g_qeglobals; extern int mapModified; // for quit confirmation (0 = clean, 1 = unsaved, //++timo clean (moved into qertypes.h) //enum VIEWTYPE {YZ, XZ, XY}; extern bool g_bAxialMode; extern int g_axialAnchor; extern int g_axialDest; extern void Face_FlipTexture_BrushPrimit(face_t *face, bool y); extern void Brush_FlipTexture_BrushPrimit(brush_t *b, bool y); // Timo // new brush primitive stuff //void ComputeAxisBase( idVec3 &normal,idVec3 &texS,idVec3 &texT ); void FaceToBrushPrimitFace(face_t *f); void EmitBrushPrimitTextureCoordinates(face_t *, idWinding *, patchMesh_t *patch = NULL); // EmitTextureCoordinates, is old code used for brush to brush primitive conversion void EmitTextureCoordinates ( idVec5 &xyzst, const idMaterial *q, face_t *f, bool force = false); void BrushPrimit_Parse(brush_t *, bool newFormat, const idVec3 origin); // compute a fake shift scale rot representation from the texture matrix void TexMatToFakeTexCoords( float texMat[2][3], float shift[2], float *rot, float scale[2] ); void FakeTexCoordsToTexMat( float shift[2], float rot, float scale[2], float texMat[2][3] ); void ConvertTexMatWithQTexture( brushprimit_texdef_t *texMat1, const idMaterial *qtex1, brushprimit_texdef_t *texMat2, const idMaterial *qtex2, float sScale = 1.0, float tScale = 1.0 ); // texture locking void Face_MoveTexture_BrushPrimit(face_t *f, idVec3 delta); void Select_ShiftTexture_BrushPrimit( face_t *f, float x, float y, bool autoAdjust ); void RotateFaceTexture_BrushPrimit(face_t *f, int nAxis, float fDeg, idVec3 vOrigin ); // used in CCamWnd::ShiftTexture_BrushPrimit void ComputeBest2DVector( idVec3 v, idVec3 X, idVec3 Y, int &x, int &y ); void ApplyMatrix_BrushPrimit(face_t *f, idMat3 matrix, idVec3 origin); // low level functions .. put in mathlib? #define BPMatCopy(a,b) {b[0][0] = a[0][0]; b[0][1] = a[0][1]; b[0][2] = a[0][2]; b[1][0] = a[1][0]; b[1][1] = a[1][1]; b[1][2] = a[1][2];} // apply a scale transformation to the BP matrix #define BPMatScale(m,sS,sT) {m[0][0]*=sS; m[1][0]*=sS; m[0][1]*=sT; m[1][1]*=sT;} // apply a translation transformation to a BP matrix #define BPMatTranslate(m,s,t) {m[0][2] += m[0][0]*s + m[0][1]*t; m[1][2] += m[1][0]*s+m[1][1]*t;} // 2D homogeneous matrix product C = A*B void BPMatMul(float A[2][3], float B[2][3], float C[2][3]); // apply a rotation (degrees) void BPMatRotate(float A[2][3], float theta); #ifdef _DEBUG void BPMatDump(float A[2][3]); #endif // // eclass.cpp // extern bool parsing_single; extern bool eclass_found; extern eclass_t *eclass_e; void Eclass_ScanFile( char *filename ); void FillClassList (void); extern bool g_bShowLightVolumes; extern bool g_bShowLightTextures; extern const idMaterial *Texture_LoadLight(const char *name); #define FONT_HEIGHT 10 void UniqueTargetName(idStr& rStr); #define MAP_VERSION 2.0 extern CMainFrame* g_pParentWnd; extern CString g_strAppPath; extern CPrefsDlg& g_PrefsDlg; extern CFindTextureDlg& g_dlgFind; extern idCVar radiant_entityMode; // layout styles #define QR_SPLIT 0 #define QR_QE4 1 #define QR_4WAY 2 #define QR_SPLITZ 3 // externs extern void AddSlash(CString&); extern void DLLBuildDone(); extern void CleanUpEntities(); extern void QE_CountBrushesAndUpdateStatusBar(); extern void QE_CheckAutoSave(); extern qtexture_t *notexture; extern qtexture_t *current_texture; extern bool SaveWindowState(HWND hWnd, const char *pszName); extern void Map_Snapshot(); extern void WXY_Print(); extern void AddProp( void ); extern int inspector_mode; extern bool g_bRotateMode; extern bool g_bClipMode; extern bool g_bScaleMode; extern int g_nScaleHow; extern bool g_bPathMode; extern void RunScript(char* pBuffer); extern HINSTANCE g_hOpenGL32; extern void FindReplaceTextures(const char* pFind, const char* pReplace, bool bSelected, bool bForce); extern void DoProjectSettings(); extern bool region_active; extern void Texture_ShowDirectory (char* pPath, bool Linked = false); extern void Map_ImportFile (char *filename); extern void Map_SaveSelected(char* pFilename); extern bool g_bNewFace; extern bool g_bSwitch; extern brush_t g_brFrontSplits; extern brush_t g_brBackSplits; extern CClipPoint g_Clip1; extern CClipPoint g_Clip2; extern brush_t* g_pSplitList; extern CClipPoint g_PathPoints[256]; extern void AcquirePath(int nCount, PFNPathCallback* pFunc); extern bool g_bScreenUpdates; extern SCommandInfo g_Commands[]; extern int g_nCommandCount; extern SKeyInfo g_Keys[]; extern int g_nKeyCount; extern int inspector_mode; extern const char *bsp_commands[256]; extern void HandlePopup(CWnd* pWindow, unsigned int uId); extern z_t z; extern CString g_strProject; extern void TextureAxisFromPlane( const idPlane &pln, idVec3 &xv, idVec3 &yv); extern bool QE_SaveProject (const char* pProjectFile); extern void Clamp(float& f, int nClamp); extern bool WriteFileString( FILE *fp, char *string, ... ); extern void MemFile_fprintf(CMemFile* pMemFile, const char* pText, ...); extern void SaveWindowPlacement(HWND hwnd, const char* pName); extern bool LoadWindowPlacement(HWND hwnd, const char* pName); extern bool ConfirmModified (void); extern void DoPatchInspector(); void UpdatePatchInspector(); extern int g_nSmartX; extern int g_nSmartY; extern brush_t* CreateEntityBrush(int x, int y, CXYWnd* pWnd); int PointInMoveList( idVec3 *pf ); extern bool ByeByeSurfaceDialog(); extern void UpdateSurfaceDialog(); extern void UpdateLightInspector(); BOOL UpdateEntitySel(eclass_t *pec); void SetInspectorMode(int iType); BOOL GetSelectAllCriteria(CString &strKey, CString &strVal); int GetCvarInt(const char *name, const int def); const char *GetCvarString(const char *name, const char *def); void SetCvarInt(const char *name, const int value); void SetCvarString(const char *name, const char *value); void SetCvarBinary(const char *name, void *pv, int size); bool GetCvarBinary(const char *name, void *pv, int size); void UpdateRadiantColor( float r, float g, float b, float a ); #endif /* !__QE3_H__ */