]> icculus.org git repositories - icculus/iodoom3.git/blob - neo/tools/radiant/MainFrm.cpp
Various Mac OS X tweaks to get this to build. Probably breaking things.
[icculus/iodoom3.git] / neo / tools / radiant / MainFrm.cpp
1 /*
2 ===========================================================================
3
4 Doom 3 GPL Source Code
5 Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company. 
6
7 This file is part of the Doom 3 GPL Source Code (?Doom 3 Source Code?).  
8
9 Doom 3 Source Code is free software: you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14 Doom 3 Source Code is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with Doom 3 Source Code.  If not, see <http://www.gnu.org/licenses/>.
21
22 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.
23
24 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.
25
26 ===========================================================================
27 */
28
29 #include "../../idlib/precompiled.h"
30 #pragma hdrstop
31
32 #include "qe3.h"
33 #include "Radiant.h"
34 #include "ZWnd.h"
35 #include "CamWnd.h"
36 #include "MapInfo.h"
37 #include "MainFrm.h"
38 #include "RotateDlg.h"
39 #include "EntityListDlg.h"
40 #include "NewProjDlg.h"
41 #include "CommandsDlg.h"
42 #include "ScaleDialog.h"
43 #include "FindTextureDlg.h"
44 #include "SurfaceDlg.h"
45 #include "shlobj.h"
46 #include "DialogTextures.h"
47 #include "PatchDensityDlg.h"
48 #include "DialogThick.h"
49 #include "PatchDialog.h"
50 #include "Undo.h"
51 #include "NewTexWnd.h"
52 #include "splines.h"
53 #include "dlgcamera.h"
54 #include "mmsystem.h"
55 #include "LightDlg.h"
56 #include "GetString.h"
57 #include "EntKeyFindReplace.h"
58 #include "InspectorDialog.h"
59 #include "autocaulk.h"
60
61 #include "../../sys/win32/rc/common_resource.h"
62 #include "../comafx/DialogName.h"
63 #include "../comafx/DialogColorPicker.h"
64
65 #ifdef _DEBUG
66         #define new DEBUG_NEW
67         #undef THIS_FILE
68 static char             THIS_FILE[] = __FILE__;
69 #endif
70
71 // globals
72 CString                 g_strAppPath;                                           // holds the full path of the executable
73 CMainFrame              *g_pParentWnd = NULL;                           // used to precast to CMainFrame
74 CPrefsDlg               g_Preferences;                                          // global prefs instance
75 CPrefsDlg               &g_PrefsDlg = g_Preferences;            // reference used throughout
76 int                             g_nUpdateBits = 0;                                      // window update flags
77 bool                    g_bScreenUpdates = true;                        // whether window painting is active, used in a few places
78
79 //
80 // to disable updates for speed reasons both of the above should be made members
81 // of CMainFrame
82 // bool g_bSnapToGrid = true; // early use, no longer in use, clamping pref will
83 // be used
84 //
85 CString                 g_strProject;                                           // holds the active project filename
86
87 #define D3XP_ID_FILE_SAVE_COPY ( WM_USER + 28476 )
88 #define D3XP_ID_SHOW_MODELS ( WM_USER + 28477 )
89
90 //
91 // CMainFrame
92 // command mapping stuff m_strCommand is the command string m_nKey is the windows
93 // VK_??? equivelant m_nModifiers are key states as follows bit 0 - shift 1 - alt
94 // 2 - control 4 - press only
95 //
96 #define SPEED_MOVE      32.0f
97 #define SPEED_TURN      22.5f
98
99 #define MAX_GRID        64.0f
100 #define MIN_GRID        0.125f
101
102 SCommandInfo    g_Commands[] = {
103         { "Texture_AxialByHeight",   'U', 0,    ID_SELECT_AXIALTEXTURE_BYHEIGHT },
104         { "Texture_AxialArbitrary",  'U', RAD_SHIFT, ID_SELECT_AXIALTEXTURE_ARBITRARY },
105         { "Texture_AxialByWidth",    'U', RAD_CONTROL, ID_SELECT_AXIALTEXTURE_BYWIDTH },
106         { "Texture_Decrement",       VK_SUBTRACT, RAD_SHIFT, ID_SELECTION_TEXTURE_DEC },
107         { "Texture_Increment",       VK_ADD, RAD_SHIFT, ID_SELECTION_TEXTURE_INC },
108         { "Texture_Fit",             '5', RAD_SHIFT, ID_SELECTION_TEXTURE_FIT },
109         { "Texture_RotateClock",     VK_NEXT, RAD_SHIFT, ID_SELECTION_TEXTURE_ROTATECLOCK },
110         { "Texture_RotateCounter",   VK_PRIOR, RAD_SHIFT, ID_SELECTION_TEXTURE_ROTATECOUNTER },
111         { "Texture_ScaleUp",         VK_UP, RAD_CONTROL, ID_SELECTION_TEXTURE_SCALEUP },
112         { "Texture_ScaleDown",       VK_DOWN, RAD_CONTROL, ID_SELECTION_TEXTURE_SCALEDOWN },
113         { "Texture_ShiftLeft",       VK_LEFT, RAD_SHIFT, ID_SELECTION_TEXTURE_SHIFTLEFT },
114         { "Texture_ShiftRight",      VK_RIGHT, RAD_SHIFT, ID_SELECTION_TEXTURE_SHIFTRIGHT },
115         { "Texture_ShiftUp",         VK_UP, RAD_SHIFT, ID_SELECTION_TEXTURE_SHIFTUP },
116         { "Texture_ShiftDown",       VK_DOWN, RAD_SHIFT, ID_SELECTION_TEXTURE_SHIFTDOWN },
117         { "Texture_ScaleLeft",       VK_LEFT, RAD_CONTROL, ID_SELECTION_TEXTURE_SCALELEFT },
118         { "Texture_ScaleRight",      VK_RIGHT, RAD_CONTROL, ID_SELECTION_TEXTURE_SCALERIGHT },
119         { "Texture_InvertX",         'I', RAD_CONTROL|RAD_SHIFT, ID_CURVE_NEGATIVETEXTUREY },
120         { "Texture_InvertY",         'I', RAD_SHIFT, ID_CURVE_NEGATIVETEXTUREX },
121         { "Texture_ToggleLock",      'T', RAD_SHIFT, ID_TOGGLE_LOCK },
122
123         { "Texture_ShowAllTextures", 'A', RAD_CONTROL, ID_TEXTURES_SHOWALL },
124
125         { "Edit_Copy",              'C', RAD_CONTROL, ID_EDIT_COPYBRUSH },
126         { "Edit_Paste",             'V', RAD_CONTROL, ID_EDIT_PASTEBRUSH },
127         { "Edit_Undo",              'Z', RAD_CONTROL, ID_EDIT_UNDO },
128         { "Edit_Redo",              'Y', RAD_CONTROL, ID_EDIT_REDO },
129
130         { "Camera_Forward",          VK_UP, 0, ID_CAMERA_FORWARD },
131         { "Camera_Back",             VK_DOWN, 0, ID_CAMERA_BACK },
132         { "Camera_Left",             VK_LEFT, 0, ID_CAMERA_LEFT },
133         { "Camera_Right",            VK_RIGHT, 0, ID_CAMERA_RIGHT },
134         { "Camera_Up",               'D', 0, ID_CAMERA_UP },
135         { "Camera_Down",             'C', 0, ID_CAMERA_DOWN },
136         { "Camera_AngleUp",          'A', 0, ID_CAMERA_ANGLEUP },
137         { "Camera_AngleDown",        'Z', 0, ID_CAMERA_ANGLEDOWN },
138         { "Camera_StrafeRight",      VK_PERIOD, 0, ID_CAMERA_STRAFERIGHT },
139         { "Camera_StrafeLeft",       VK_COMMA, 0, ID_CAMERA_STRAFELEFT },
140         { "Camera_UpFloor",          VK_PRIOR, 0, ID_VIEW_UPFLOOR },
141         { "Camera_DownFloor",        VK_NEXT, 0, ID_VIEW_DOWNFLOOR },
142         { "Camera_CenterView",       VK_END, 0, ID_VIEW_CENTER },
143
144         { "Grid_ZoomOut",            VK_INSERT, 0, ID_VIEW_ZOOMOUT },
145         { "FileSaveCopy",            'C', RAD_CONTROL|RAD_ALT|RAD_SHIFT, D3XP_ID_FILE_SAVE_COPY },
146         { "ShowHideModels",          'M', RAD_CONTROL, D3XP_ID_SHOW_MODELS },
147         { "NextView",                VK_HOME, 0, ID_VIEW_NEXTVIEW },
148         { "Grid_ZoomIn",             VK_DELETE, 0, ID_VIEW_ZOOMIN },
149
150         { "Grid_SetPoint5",          '4', RAD_SHIFT, ID_GRID_POINT5 },
151         { "Grid_SetPoint25",         '3', RAD_SHIFT, ID_GRID_POINT25 },
152         { "Grid_SetPoint125",        '2', RAD_SHIFT, ID_GRID_POINT125 },
153         //{ "Grid_SetPoint0625",     '1', RAD_SHIFT, ID_GRID_POINT0625 },
154         { "Grid_Set1",               '1', 0, ID_GRID_1 },
155         { "Grid_Set2",               '2', 0, ID_GRID_2 },
156         { "Grid_Set4",               '3', 0, ID_GRID_4 },
157         { "Grid_Set8",               '4', 0, ID_GRID_8 },
158         { "Grid_Set16",              '5', 0, ID_GRID_16 },
159         { "Grid_Set32",              '6', 0, ID_GRID_32 },
160         { "Grid_Set64",              '7', 0, ID_GRID_64 },
161         { "Grid_Down",               219, 0, ID_GRID_PREV },
162         { "Grid_Up",                 221, 0, ID_GRID_NEXT },
163
164         { "Grid_Toggle",             '0', 0, ID_GRID_TOGGLE },
165         { "Grid_ToggleSizePaint",    'Q', RAD_PRESS, ID_SELECTION_TOGGLESIZEPAINT },
166
167         { "Grid_PrecisionCursorMode",VK_F11, 0 , ID_PRECISION_CURSOR_CYCLE},
168
169         { "Grid_NextView",           VK_TAB, RAD_CONTROL, ID_VIEW_NEXTVIEW },
170         { "Grid_ToggleCrosshairs",   'X', RAD_SHIFT, ID_VIEW_CROSSHAIR },
171
172         { "Grid_ZZoomOut",           VK_INSERT, RAD_CONTROL, ID_VIEW_ZZOOMOUT },
173         { "Grid_ZZoomIn",            VK_DELETE, RAD_CONTROL, ID_VIEW_ZZOOMIN },
174
175         { "Brush_Make3Sided",        '3', RAD_CONTROL, ID_BRUSH_3SIDED },
176         { "Brush_Make4Sided",        '4', RAD_CONTROL, ID_BRUSH_4SIDED },
177         { "Brush_Make5Sided",        '5', RAD_CONTROL, ID_BRUSH_5SIDED },
178         { "Brush_Make6Sided",        '6', RAD_CONTROL, ID_BRUSH_6SIDED },
179         { "Brush_Make7Sided",        '7', RAD_CONTROL, ID_BRUSH_7SIDED },
180         { "Brush_Make8Sided",        '8', RAD_CONTROL, ID_BRUSH_8SIDED },
181         { "Brush_Make9Sided",        '9', RAD_CONTROL, ID_BRUSH_9SIDED },
182
183         { "Leak_NextSpot",           'K', RAD_CONTROL|RAD_SHIFT, ID_MISC_NEXTLEAKSPOT },
184         { "Leak_PrevSpot",           'L', RAD_CONTROL|RAD_SHIFT, ID_MISC_PREVIOUSLEAKSPOT },
185
186         { "File_Open",               'O', RAD_CONTROL, ID_FILE_OPEN },
187         { "File_Save",               'S', RAD_CONTROL, ID_FILE_SAVE },
188
189         { "TAB",                      VK_TAB, 0, ID_PATCH_TAB },
190         { "TAB",                      VK_TAB, RAD_SHIFT, ID_PATCH_TAB },
191
192         { "Patch_BendMode",           'B', 0, ID_PATCH_BEND },
193         { "Patch_FreezeVertices",     'F', 0, ID_CURVE_FREEZE },
194         { "Patch_UnFreezeVertices",   'F', RAD_CONTROL, ID_CURVE_UNFREEZE },
195         { "Patch_UnFreezeAllVertices",'F', RAD_CONTROL|RAD_SHIFT, ID_CURVE_UNFREEZEALL },
196         { "Patch_Thicken",            'T', RAD_CONTROL, ID_CURVE_THICKEN },
197         { "Patch_ClearOverlays",      'Y', RAD_SHIFT, ID_CURVE_OVERLAY_CLEAR },
198         { "Patch_MakeOverlay",        'Y', 0, ID_CURVE_OVERLAY_SET },
199         { "Patch_CycleCapTexturing",   'P', RAD_CONTROL|RAD_SHIFT, ID_CURVE_CYCLECAP },
200         { "Patch_CycleCapTexturingAlt",'P', RAD_SHIFT, ID_CURVE_CYCLECAPALT },
201         { "Patch_InvertCurve",        'I', RAD_CONTROL, ID_CURVE_NEGATIVE },
202         { "Patch_IncPatchColumn",     VK_ADD, RAD_CONTROL|RAD_SHIFT, ID_CURVE_INSERTCOLUMN },
203         { "Patch_IncPatchRow",        VK_ADD, RAD_CONTROL, ID_CURVE_INSERTROW },
204         { "Patch_DecPatchColumn",     VK_SUBTRACT, RAD_CONTROL|RAD_SHIFT, ID_CURVE_DELETECOLUMN },
205         { "Patch_DecPatchRow",        VK_SUBTRACT, RAD_CONTROL, ID_CURVE_DELETEROW },
206         { "Patch_RedisperseRows",     'E', RAD_CONTROL, ID_CURVE_REDISPERSE_ROWS },
207         { "Patch_RedisperseCols",     'E', RAD_CONTROL|RAD_SHIFT, ID_CURVE_REDISPERSE_COLS },
208         { "Patch_Naturalize",         'N', RAD_CONTROL, ID_PATCH_NATURALIZE },
209         { "Patch_SnapToGrid",         'G', RAD_CONTROL, ID_SELECT_SNAPTOGRID },
210         { "Patch_CapCurrentCurve",    'C', RAD_SHIFT, ID_CURVE_CAP },
211
212         { "Clipper_Toggle",          'X', 0, ID_VIEW_CLIPPER },
213         { "Clipper_ClipSelected",    VK_RETURN, 0, ID_CLIP_SELECTED },
214         { "Clipper_SplitSelected",   VK_RETURN, RAD_SHIFT, ID_SPLIT_SELECTED },
215         { "Clipper_FlipClip",        VK_RETURN, RAD_CONTROL, ID_FLIP_CLIP },
216
217         { "CameraClip_ZoomOut",       219, RAD_CONTROL, ID_VIEW_CUBEOUT },
218         { "CameraClip_ZoomIn",        221, RAD_CONTROL, ID_VIEW_CUBEIN },
219         { "CameraClip_Toggle",        220, RAD_CONTROL, ID_VIEW_CUBICCLIPPING },
220
221         { "ViewTab_EntityInfo",     'N', 0, ID_VIEW_ENTITY },
222         { "ViewTab_Console",        'O', 0, ID_VIEW_CONSOLE },
223         { "ViewTab_Textures",       'T', 0, ID_VIEW_TEXTURE },
224         { "ViewTab_MediaBrowser",   'M', 0, ID_VIEW_MEDIABROWSER },
225
226         { "Window_SurfaceInspector",'S', 0, ID_TEXTURES_INSPECTOR },
227         { "Window_PatchInspector",  'S', RAD_SHIFT, ID_PATCH_INSPECTOR },
228         { "Window_EntityList",      'I', 0, ID_EDIT_ENTITYINFO },
229         { "Window_Preferences",     'P', 0, ID_PREFS },
230         { "Window_ToggleCamera",    'C', RAD_CONTROL|RAD_SHIFT, ID_TOGGLECAMERA },
231         { "Window_ToggleView",      'V', RAD_CONTROL|RAD_SHIFT, ID_TOGGLEVIEW },
232         { "Window_ToggleZ",         'Z', RAD_CONTROL|RAD_SHIFT, ID_TOGGLEZ },
233         { "Window_LightEditor",     'J', 0, ID_PROJECTED_LIGHT },
234         { "Window_EntityColor",     'K', 0, ID_MISC_SELECTENTITYCOLOR },
235
236         { "Selection_DragEdges",     'E', 0, ID_SELECTION_DRAGEDGES },
237         { "Selection_DragVertices",  'V', 0, ID_SELECTION_DRAGVERTECIES },
238         { "Selection_Clone",         VK_SPACE, 0, ID_SELECTION_CLONE },
239         { "Selection_Delete",        VK_BACK, 0, ID_SELECTION_DELETE },
240         { "Selection_UnSelect",      VK_ESCAPE, 0, ID_SELECTION_DESELECT },
241         { "Selection_Invert",        'I' , 0 , ID_SELECTION_INVERT },
242         { "Selection_ToggleMoveOnly",'W', 0, ID_SELECTION_MOVEONLY },
243
244         { "Selection_MoveDown",     VK_SUBTRACT, 0, ID_SELECTION_MOVEDOWN },
245         { "Selection_MoveUp",       VK_ADD, 0, ID_SELECTION_MOVEUP },
246         { "Selection_DumpBrush",    'D', RAD_SHIFT, ID_SELECTION_PRINT },
247         { "Selection_NudgeLeft",    VK_LEFT, RAD_ALT, ID_SELECTION_SELECT_NUDGELEFT },
248         { "Selection_NudgeRight",   VK_RIGHT, RAD_ALT, ID_SELECTION_SELECT_NUDGERIGHT },
249         { "Selection_NudgeUp",      VK_UP, RAD_ALT, ID_SELECTION_SELECT_NUDGEUP },
250         { "Selection_NudgeDown",    VK_DOWN, RAD_ALT, ID_SELECTION_SELECT_NUDGEDOWN },
251         { "Selection_Combine",      'K', RAD_SHIFT, ID_SELECTION_COMBINE },
252         { "Selection_Connect",      'K', RAD_CONTROL, ID_SELECTION_CONNECT },
253         { "Selection_Ungroup",      'G', RAD_SHIFT, ID_SELECTION_UNGROUPENTITY },
254         { "Selection_CSGMerge",     'M', RAD_SHIFT, ID_SELECTION_CSGMERGE },
255         
256         { "Selection_CenterOrigin",           'O', RAD_SHIFT, ID_SELECTION_CENTER_ORIGIN },
257         { "Selection_SelectCompleteEntity",   'E' , RAD_CONTROL|RAD_ALT|RAD_SHIFT , ID_SELECT_COMPLETE_ENTITY },
258         { "Selection_SelectAllOfType",        'A', RAD_SHIFT, ID_SELECT_ALL },
259
260         { "Show_ToggleLights",       '0' , RAD_ALT , ID_VIEW_SHOWLIGHTS },
261         { "Show_TogglePatches",      'P', RAD_CONTROL, ID_VIEW_SHOWCURVES },
262         { "Show_ToggleClip",         'L', RAD_CONTROL, ID_VIEW_SHOWCLIP },
263
264         { "Show_HideSelected",       'H', 0, ID_VIEW_HIDESHOW_HIDESELECTED },
265         { "Show_ShowHidden",         'H', RAD_SHIFT, ID_VIEW_HIDESHOW_SHOWHIDDEN },
266         { "Show_HideNotSelected",    'H', RAD_CONTROL|RAD_SHIFT, ID_VIEW_HIDESHOW_HIDENOTSELECTED },
267
268         { "Render_ToggleSound",      VK_F9, 0, ID_VIEW_RENDERSOUND },
269         { "Render_ToggleSelections", VK_F8, 0, ID_VIEW_RENDERSELECTION },
270         { "Render_RebuildData",      VK_F7, 0, ID_VIEW_REBUILDRENDERDATA },
271         { "Render_ToggleAnimation",  VK_F6, 0, ID_VIEW_MATERIALANIMATION},
272         { "Render_ToggleEntityOutlines", VK_F5, 0, ID_VIEW_RENDERENTITYOUTLINES },
273         { "Render_ToggleRealtimeBuild",  VK_F4, 0, ID_VIEW_REALTIMEREBUILD },
274         { "Render_Toggle",           VK_F3, 0, ID_VIEW_RENDERMODE },
275
276         { "Find_Textures",    'F', RAD_SHIFT, ID_TEXTURE_REPLACEALL },
277         { "Find_Entity",       VK_F3, RAD_CONTROL, ID_MISC_FINDORREPLACEENTITY},        
278         { "Find_NextEntity",   VK_F3,RAD_SHIFT, ID_MISC_FINDNEXTENT},
279
280         { "_ShowDOOM",               VK_F2, 0, ID_SHOW_DOOM },
281
282         { "Rotate_MouseRotate",            'R', 0, ID_SELECT_MOUSEROTATE },
283         { "Rotate_ToggleFlatRotation",     'R', RAD_CONTROL, ID_VIEW_CAMERAUPDATE },
284         { "Rotate_CycleRotationAxis",      'R', RAD_SHIFT, ID_TOGGLE_ROTATELOCK },
285
286         { "_AutoCaulk",              'A', RAD_CONTROL|RAD_SHIFT, ID_AUTOCAULK },        // ctrl-shift-a, since SHIFT-A is already taken
287 };
288
289 int                             g_nCommandCount = sizeof(g_Commands) / sizeof(SCommandInfo);
290
291 SKeyInfo                g_Keys[] = {
292         { "Space", VK_SPACE },
293         { "Backspace", VK_BACK },
294         { "Escape", VK_ESCAPE },
295         { "End", VK_END },
296         { "Insert", VK_INSERT },
297         { "Delete", VK_DELETE },
298         { "PageUp", VK_PRIOR },
299         { "PageDown", VK_NEXT },
300         { "Up", VK_UP },
301         { "Down", VK_DOWN },
302         { "Left", VK_LEFT },
303         { "Right", VK_RIGHT },
304         { "F1", VK_F1 },
305         { "F2", VK_F2 },
306         { "F3", VK_F3 },
307         { "F4", VK_F4 },
308         { "F5", VK_F5 },
309         { "F6", VK_F6 },
310         { "F7", VK_F7 },
311         { "F8", VK_F8 },
312         { "F9", VK_F9 },
313         { "F10", VK_F10 },
314         { "F11", VK_F11 },
315         { "F12", VK_F12 },
316         { "Tab", VK_TAB },
317         { "Return", VK_RETURN },
318         { "Comma", VK_COMMA },
319         { "Period", VK_PERIOD },
320         { "Plus", VK_ADD },
321         { "Multiply", VK_MULTIPLY },
322         { "Subtract", VK_SUBTRACT },
323         { "NumPad0", VK_NUMPAD0 },
324         { "NumPad1", VK_NUMPAD1 },
325         { "NumPad2", VK_NUMPAD2 },
326         { "NumPad3", VK_NUMPAD3 },
327         { "NumPad4", VK_NUMPAD4 },
328         { "NumPad5", VK_NUMPAD5 },
329         { "NumPad6", VK_NUMPAD6 },
330         { "NumPad7", VK_NUMPAD7 },
331         { "NumPad8", VK_NUMPAD8 },
332         { "NumPad9", VK_NUMPAD9 },
333         { "[", 219 },
334         { "]", 221 },
335         { "\\", 220 }
336 };
337
338 int                             g_nKeyCount = sizeof(g_Keys) / sizeof(SKeyInfo);
339
340 const int               CMD_TEXTUREWAD_END = CMD_TEXTUREWAD + 127;
341 const int               CMD_BSPCOMMAND_END = CMD_BSPCOMMAND + 127;
342 const int               IDMRU_END = IDMRU + 9;
343
344 const int               g_msgBSPDone = RegisterWindowMessage(DMAP_DONE);
345 const int               g_msgBSPStatus = RegisterWindowMessage(DMAP_MSGID);
346
347 IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd)
348 BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
349 //{{AFX_MSG_MAP(CMainFrame)
350         ON_WM_PARENTNOTIFY()
351         ON_WM_CREATE()
352         ON_WM_TIMER()
353         ON_WM_DESTROY()
354         ON_WM_CLOSE()
355         ON_WM_KEYDOWN()
356         ON_WM_SIZE()
357         ON_COMMAND(ID_VIEW_CAMERATOGGLE, ToggleCamera)
358         ON_COMMAND(ID_FILE_CLOSE, OnFileClose)
359         ON_COMMAND(ID_FILE_EXIT, OnFileExit)
360         ON_COMMAND(ID_FILE_LOADPROJECT, OnFileLoadproject)
361         ON_COMMAND(ID_FILE_NEW, OnFileNew)
362         ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
363         ON_COMMAND(ID_FILE_POINTFILE, OnFilePointfile)
364         ON_COMMAND(ID_FILE_PRINT, OnFilePrint)
365         ON_COMMAND(ID_FILE_PRINT_PREVIEW, OnFilePrintPreview)
366         ON_COMMAND(ID_FILE_SAVE, OnFileSave)
367         ON_COMMAND(ID_FILE_SAVEAS, OnFileSaveas)
368         ON_COMMAND(D3XP_ID_FILE_SAVE_COPY, OnFileSaveCopy)
369         ON_COMMAND(D3XP_ID_SHOW_MODELS, OnViewShowModels )
370         ON_COMMAND(ID_VIEW_100, OnView100)
371         ON_COMMAND(ID_VIEW_CENTER, OnViewCenter)
372         ON_COMMAND(ID_VIEW_CONSOLE, OnViewConsole)
373         ON_COMMAND(ID_VIEW_DOWNFLOOR, OnViewDownfloor)
374         ON_COMMAND(ID_VIEW_ENTITY, OnViewEntity)
375         ON_COMMAND(ID_VIEW_MEDIABROWSER, OnViewMediaBrowser)
376         ON_COMMAND(ID_VIEW_FRONT, OnViewFront)
377         ON_COMMAND(ID_VIEW_SHOWBLOCKS, OnViewShowblocks)
378         ON_COMMAND(ID_VIEW_SHOWCLIP, OnViewShowclip)
379         ON_COMMAND(ID_VIEW_SHOWTRIGGERS, OnViewShowTriggers)
380         ON_COMMAND(ID_VIEW_SHOWCOORDINATES, OnViewShowcoordinates)
381         ON_COMMAND(ID_VIEW_SHOWENT, OnViewShowent)
382         ON_COMMAND(ID_VIEW_SHOWLIGHTS, OnViewShowlights)
383         ON_COMMAND(ID_VIEW_SHOWNAMES, OnViewShownames)
384         ON_COMMAND(ID_VIEW_SHOWPATH, OnViewShowpath)
385         ON_COMMAND(ID_VIEW_SHOWCOMBATNODES, OnViewShowCombatNodes)
386         ON_COMMAND(ID_VIEW_SHOWWATER, OnViewShowwater)
387         ON_COMMAND(ID_VIEW_SHOWWORLD, OnViewShowworld)
388         ON_COMMAND(ID_VIEW_TEXTURE, OnViewTexture)
389         ON_COMMAND(ID_VIEW_UPFLOOR, OnViewUpfloor)
390         ON_COMMAND(ID_VIEW_XY, OnViewXy)
391         ON_COMMAND(ID_VIEW_Z100, OnViewZ100)
392         ON_COMMAND(ID_VIEW_ZOOMIN, OnViewZoomin)
393         ON_COMMAND(ID_VIEW_ZOOMOUT, OnViewZoomout)
394         ON_COMMAND(ID_VIEW_ZZOOMIN, OnViewZzoomin)
395         ON_COMMAND(ID_VIEW_ZZOOMOUT, OnViewZzoomout)
396         ON_COMMAND(ID_VIEW_SIDE, OnViewSide)
397         ON_COMMAND(ID_TEXTURES_SHOWINUSE, OnTexturesShowinuse)
398         ON_COMMAND(ID_TEXTURES_INSPECTOR, OnTexturesInspector)
399         ON_COMMAND(ID_MISC_FINDBRUSH, OnMiscFindbrush)
400         ON_COMMAND(ID_MISC_GAMMA, OnMiscGamma)
401         ON_COMMAND(ID_MISC_NEXTLEAKSPOT, OnMiscNextleakspot)
402         ON_COMMAND(ID_MISC_PREVIOUSLEAKSPOT, OnMiscPreviousleakspot)
403         ON_COMMAND(ID_MISC_PRINTXY, OnMiscPrintxy)
404         ON_COMMAND(ID_MISC_SELECTENTITYCOLOR, OnMiscSelectentitycolor)
405         ON_COMMAND(ID_MISC_FINDORREPLACEENTITY, OnMiscFindOrReplaceEntity)
406         ON_COMMAND(ID_MISC_FINDNEXTENT, OnMiscFindNextEntity)
407         ON_COMMAND(ID_MISC_SETVIEWPOS, OnMiscSetViewPos)
408         ON_COMMAND(ID_TEXTUREBK, OnTexturebk)
409         ON_COMMAND(ID_COLORS_MAJOR, OnColorsMajor)
410         ON_COMMAND(ID_COLORS_MINOR, OnColorsMinor)
411         ON_COMMAND(ID_COLORS_XYBK, OnColorsXybk)
412         ON_COMMAND(ID_BRUSH_3SIDED, OnBrush3sided)
413         ON_COMMAND(ID_BRUSH_4SIDED, OnBrush4sided)
414         ON_COMMAND(ID_BRUSH_5SIDED, OnBrush5sided)
415         ON_COMMAND(ID_BRUSH_6SIDED, OnBrush6sided)
416         ON_COMMAND(ID_BRUSH_7SIDED, OnBrush7sided)
417         ON_COMMAND(ID_BRUSH_8SIDED, OnBrush8sided)
418         ON_COMMAND(ID_BRUSH_9SIDED, OnBrush9sided)
419         ON_COMMAND(ID_BRUSH_ARBITRARYSIDED, OnBrushArbitrarysided)
420         ON_COMMAND(ID_BRUSH_FLIPX, OnBrushFlipx)
421         ON_COMMAND(ID_BRUSH_FLIPY, OnBrushFlipy)
422         ON_COMMAND(ID_BRUSH_FLIPZ, OnBrushFlipz)
423         ON_COMMAND(ID_BRUSH_ROTATEX, OnBrushRotatex)
424         ON_COMMAND(ID_BRUSH_ROTATEY, OnBrushRotatey)
425         ON_COMMAND(ID_BRUSH_ROTATEZ, OnBrushRotatez)
426         ON_COMMAND(ID_REGION_OFF, OnRegionOff)
427         ON_COMMAND(ID_REGION_SETBRUSH, OnRegionSetbrush)
428         ON_COMMAND(ID_REGION_SETSELECTION, OnRegionSetselection)
429         ON_COMMAND(ID_REGION_SETTALLBRUSH, OnRegionSettallbrush)
430         ON_COMMAND(ID_REGION_SETXY, OnRegionSetxy)
431         ON_COMMAND(ID_SELECTION_ARBITRARYROTATION, OnSelectionArbitraryrotation)
432         ON_COMMAND(ID_SELECTION_CLONE, OnSelectionClone)
433         ON_COMMAND(ID_SELECTION_CONNECT, OnSelectionConnect)
434         ON_COMMAND(ID_SELECTION_CSGSUBTRACT, OnSelectionCsgsubtract)
435         ON_COMMAND(ID_SELECTION_CSGMERGE, OnSelectionCsgmerge)
436         ON_COMMAND(ID_SELECTION_DELETE, OnSelectionDelete)
437         ON_COMMAND(ID_SELECTION_DESELECT, OnSelectionDeselect)
438         ON_COMMAND(ID_SELECTION_DRAGEDGES, OnSelectionDragedges)
439         ON_COMMAND(ID_SELECTION_DRAGVERTECIES, OnSelectionDragvertecies)
440         ON_COMMAND(ID_SELECTION_CENTER_ORIGIN, OnSelectionCenterOrigin)
441         ON_COMMAND(ID_SELECTION_MAKEHOLLOW, OnSelectionMakehollow)
442         ON_COMMAND(ID_SELECTION_SELECTCOMPLETETALL, OnSelectionSelectcompletetall)
443         ON_COMMAND(ID_SELECTION_SELECTINSIDE, OnSelectionSelectinside)
444         ON_COMMAND(ID_SELECTION_SELECTPARTIALTALL, OnSelectionSelectpartialtall)
445         ON_COMMAND(ID_SELECTION_SELECTTOUCHING, OnSelectionSelecttouching)
446         ON_COMMAND(ID_SELECTION_UNGROUPENTITY, OnSelectionUngroupentity)
447         ON_COMMAND(ID_TEXTURES_POPUP, OnTexturesPopup)
448         ON_COMMAND(ID_SPLINES_POPUP, OnSplinesPopup)
449         ON_COMMAND(ID_SPLINES_EDITPOINTS, OnSplinesEditPoints)
450         ON_COMMAND(ID_SPLINES_ADDPOINTS, OnSplinesAddPoints)
451         ON_COMMAND(ID_SPLINES_INSERTPOINTS, OnSplinesInsertPoint)
452         ON_COMMAND(ID_SPLINES_DELETEPOINTS, OnSplinesDeletePoint)
453         ON_COMMAND(ID_POPUP_SELECTION, OnPopupSelection)
454         ON_COMMAND(ID_VIEW_CHANGE, OnViewChange)
455         ON_COMMAND(ID_VIEW_CAMERAUPDATE, OnViewCameraupdate)
456         ON_WM_SIZING()
457         ON_COMMAND(ID_HELP_ABOUT, OnHelpAbout)
458         ON_COMMAND(ID_VIEW_CLIPPER, OnViewClipper)
459         ON_COMMAND(ID_CAMERA_ANGLEDOWN, OnCameraAngledown)
460         ON_COMMAND(ID_CAMERA_ANGLEUP, OnCameraAngleup)
461         ON_COMMAND(ID_CAMERA_BACK, OnCameraBack)
462         ON_COMMAND(ID_CAMERA_DOWN, OnCameraDown)
463         ON_COMMAND(ID_CAMERA_FORWARD, OnCameraForward)
464         ON_COMMAND(ID_CAMERA_LEFT, OnCameraLeft)
465         ON_COMMAND(ID_CAMERA_RIGHT, OnCameraRight)
466         ON_COMMAND(ID_CAMERA_STRAFELEFT, OnCameraStrafeleft)
467         ON_COMMAND(ID_CAMERA_STRAFERIGHT, OnCameraStraferight)
468         ON_COMMAND(ID_CAMERA_UP, OnCameraUp)
469         ON_COMMAND(ID_GRID_TOGGLE, OnGridToggle)
470         ON_COMMAND(ID_PREFS, OnPrefs)
471         ON_COMMAND(ID_TOGGLECAMERA, OnTogglecamera)
472         ON_COMMAND(ID_TOGGLEVIEW, OnToggleview)
473         ON_COMMAND(ID_TOGGLEZ, OnTogglez)
474         ON_COMMAND(ID_TOGGLE_LOCK, OnToggleLock)
475         ON_COMMAND(ID_EDIT_MAPINFO, OnEditMapinfo)
476         ON_COMMAND(ID_EDIT_ENTITYINFO, OnEditEntityinfo)
477         ON_COMMAND(ID_VIEW_NEXTVIEW, OnViewNextview)
478         ON_COMMAND(ID_HELP_COMMANDLIST, OnHelpCommandlist)
479         ON_COMMAND(ID_FILE_NEWPROJECT, OnFileNewproject)
480         ON_COMMAND(ID_FLIP_CLIP, OnFlipClip)
481         ON_COMMAND(ID_CLIP_SELECTED, OnClipSelected)
482         ON_COMMAND(ID_SPLIT_SELECTED, OnSplitSelected)
483         ON_COMMAND(ID_TOGGLEVIEW_XZ, OnToggleviewXz)
484         ON_COMMAND(ID_TOGGLEVIEW_YZ, OnToggleviewYz)
485         ON_COMMAND(ID_COLORS_BRUSH, OnColorsBrush)
486         ON_COMMAND(ID_COLORS_CLIPPER, OnColorsClipper)
487         ON_COMMAND(ID_COLORS_GRIDTEXT, OnColorsGridtext)
488         ON_COMMAND(ID_COLORS_SELECTEDBRUSH, OnColorsSelectedbrush)
489         ON_COMMAND(ID_COLORS_GRIDBLOCK, OnColorsGridblock)
490         ON_COMMAND(ID_COLORS_VIEWNAME, OnColorsViewname)
491         ON_COMMAND(ID_COLOR_SETORIGINAL, OnColorSetoriginal)
492         ON_COMMAND(ID_COLOR_SETQER, OnColorSetqer)
493         ON_COMMAND(ID_COLOR_SUPERMAL, OnColorSetSuperMal)
494         ON_COMMAND(ID_THEMES_MAX , OnColorSetMax )
495         ON_COMMAND(ID_COLOR_SETBLACK, OnColorSetblack)
496         ON_COMMAND(ID_SNAPTOGRID, OnSnaptogrid)
497         ON_COMMAND(ID_SELECT_SCALE, OnSelectScale)
498         ON_COMMAND(ID_SELECT_MOUSEROTATE, OnSelectMouserotate)
499         ON_COMMAND(ID_EDIT_COPYBRUSH, OnEditCopybrush)
500         ON_COMMAND(ID_EDIT_PASTEBRUSH, OnEditPastebrush)
501         ON_COMMAND(ID_EDIT_UNDO, OnEditUndo)
502         ON_COMMAND(ID_EDIT_REDO, OnEditRedo)
503         ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo)
504         ON_UPDATE_COMMAND_UI(ID_EDIT_REDO, OnUpdateEditRedo)
505         ON_COMMAND(ID_SELECTION_INVERT, OnSelectionInvert)
506         ON_COMMAND(ID_SELECTION_TEXTURE_DEC, OnSelectionTextureDec)
507         ON_COMMAND(ID_SELECTION_TEXTURE_FIT, OnSelectionTextureFit)
508         ON_COMMAND(ID_SELECTION_TEXTURE_INC, OnSelectionTextureInc)
509         ON_COMMAND(ID_SELECTION_TEXTURE_ROTATECLOCK, OnSelectionTextureRotateclock)
510         ON_COMMAND(ID_SELECTION_TEXTURE_ROTATECOUNTER, OnSelectionTextureRotatecounter)
511         ON_COMMAND(ID_SELECTION_TEXTURE_SCALEDOWN, OnSelectionTextureScaledown)
512         ON_COMMAND(ID_SELECTION_TEXTURE_SCALEUP, OnSelectionTextureScaleup)
513         ON_COMMAND(ID_SELECTION_TEXTURE_SHIFTDOWN, OnSelectionTextureShiftdown)
514         ON_COMMAND(ID_SELECTION_TEXTURE_SHIFTLEFT, OnSelectionTextureShiftleft)
515         ON_COMMAND(ID_SELECTION_TEXTURE_SHIFTRIGHT, OnSelectionTextureShiftright)
516         ON_COMMAND(ID_SELECTION_TEXTURE_SHIFTUP, OnSelectionTextureShiftup)
517         ON_COMMAND(ID_GRID_NEXT, OnGridNext)
518         ON_COMMAND(ID_GRID_PREV, OnGridPrev)
519         ON_COMMAND(ID_SELECTION_TEXTURE_SCALELEFT, OnSelectionTextureScaleLeft)
520         ON_COMMAND(ID_SELECTION_TEXTURE_SCALERIGHT, OnSelectionTextureScaleRight)
521         ON_COMMAND(ID_TEXTURE_REPLACEALL, OnTextureReplaceall)
522         ON_COMMAND(ID_SCALELOCKX, OnScalelockx)
523         ON_COMMAND(ID_SCALELOCKY, OnScalelocky)
524         ON_COMMAND(ID_SCALELOCKZ, OnScalelockz)
525         ON_COMMAND(ID_SELECT_MOUSESCALE, OnSelectMousescale)
526         ON_COMMAND(ID_VIEW_CUBICCLIPPING, OnViewCubicclipping)
527         ON_COMMAND(ID_FILE_IMPORT, OnFileImport)
528         ON_COMMAND(ID_FILE_PROJECTSETTINGS, OnFileProjectsettings)
529         ON_UPDATE_COMMAND_UI(ID_FILE_IMPORT, OnUpdateFileImport)
530         ON_COMMAND(ID_VIEW_CUBEIN, OnViewCubein)
531         ON_COMMAND(ID_VIEW_CUBEOUT, OnViewCubeout)
532         ON_COMMAND(ID_FILE_SAVEREGION, OnFileSaveregion)
533         ON_UPDATE_COMMAND_UI(ID_FILE_SAVEREGION, OnUpdateFileSaveregion)
534         ON_COMMAND(ID_SELECTION_MOVEDOWN, OnSelectionMovedown)
535         ON_COMMAND(ID_SELECTION_MOVEUP, OnSelectionMoveup)
536         ON_COMMAND(ID_TOOLBAR_MAIN, OnToolbarMain)
537         ON_COMMAND(ID_TOOLBAR_TEXTURE, OnToolbarTexture)
538         ON_COMMAND(ID_SELECTION_PRINT, OnSelectionPrint)
539         ON_COMMAND(ID_SELECTION_TOGGLESIZEPAINT, OnSelectionTogglesizepaint)
540         ON_COMMAND(ID_BRUSH_MAKECONE, OnBrushMakecone)
541         ON_COMMAND(ID_TEXTURES_LOAD, OnTexturesLoad)
542         ON_COMMAND(ID_TOGGLE_ROTATELOCK, OnToggleRotatelock)
543         ON_COMMAND(ID_CURVE_BEVEL, OnCurveBevel)
544         ON_COMMAND(ID_CURVE_INCREASE_VERT, OnCurveIncreaseVert)
545         ON_COMMAND(ID_CURVE_DECREASE_VERT, OnCurveDecreaseVert)
546         ON_COMMAND(ID_CURVE_INCREASE_HORZ, OnCurveIncreaseHorz)
547         ON_COMMAND(ID_CURVE_DECREASE_HORZ, OnCurveDecreaseHorz)
548         ON_COMMAND(ID_CURVE_CYLINDER, OnCurveCylinder)
549         ON_COMMAND(ID_CURVE_EIGHTHSPHERE, OnCurveEighthsphere)
550         ON_COMMAND(ID_CURVE_ENDCAP, OnCurveEndcap)
551         ON_COMMAND(ID_CURVE_HEMISPHERE, OnCurveHemisphere)
552         ON_COMMAND(ID_CURVE_INVERTCURVE, OnCurveInvertcurve)
553         ON_COMMAND(ID_CURVE_QUARTER, OnCurveQuarter)
554         ON_COMMAND(ID_CURVE_SPHERE, OnCurveSphere)
555         ON_COMMAND(ID_FILE_IMPORTMAP, OnFileImportmap)
556         ON_COMMAND(ID_FILE_EXPORTMAP, OnFileExportmap)
557         ON_COMMAND(ID_EDIT_LOADPREFAB, OnEditLoadprefab)
558         ON_COMMAND(ID_VIEW_SHOWCURVES, OnViewShowcurves)
559         ON_COMMAND(ID_SELECTION_SELECT_NUDGEDOWN, OnSelectionSelectNudgedown)
560         ON_COMMAND(ID_SELECTION_SELECT_NUDGELEFT, OnSelectionSelectNudgeleft)
561         ON_COMMAND(ID_SELECTION_SELECT_NUDGERIGHT, OnSelectionSelectNudgeright)
562         ON_COMMAND(ID_SELECTION_SELECT_NUDGEUP, OnSelectionSelectNudgeup)
563         ON_WM_SYSKEYDOWN()
564         ON_COMMAND(ID_TEXTURES_LOADLIST, OnTexturesLoadlist)
565         ON_COMMAND(ID_DYNAMIC_LIGHTING, OnDynamicLighting)
566         ON_COMMAND(ID_CURVE_SIMPLEPATCHMESH, OnCurveSimplepatchmesh)
567         ON_COMMAND(ID_PATCH_SHOWBOUNDINGBOX, OnPatchToggleBox)
568         ON_COMMAND(ID_PATCH_WIREFRAME, OnPatchWireframe)
569         ON_COMMAND(ID_CURVE_PATCHCONE, OnCurvePatchcone)
570         ON_COMMAND(ID_CURVE_PATCHTUBE, OnCurvePatchtube)
571         ON_COMMAND(ID_PATCH_WELD, OnPatchWeld)
572         ON_COMMAND(ID_CURVE_PATCHBEVEL, OnCurvePatchbevel)
573         ON_COMMAND(ID_CURVE_PATCHENDCAP, OnCurvePatchendcap)
574         ON_COMMAND(ID_CURVE_PATCHINVERTEDBEVEL, OnCurvePatchinvertedbevel)
575         ON_COMMAND(ID_CURVE_PATCHINVERTEDENDCAP, OnCurvePatchinvertedendcap)
576         ON_COMMAND(ID_PATCH_DRILLDOWN, OnPatchDrilldown)
577         ON_COMMAND(ID_CURVE_INSERTCOLUMN, OnCurveInsertcolumn)
578         ON_COMMAND(ID_CURVE_INSERTROW, OnCurveInsertrow)
579         ON_COMMAND(ID_CURVE_DELETECOLUMN, OnCurveDeletecolumn)
580         ON_COMMAND(ID_CURVE_DELETEROW, OnCurveDeleterow)
581         ON_COMMAND(ID_CURVE_INSERT_ADDCOLUMN, OnCurveInsertAddcolumn)
582         ON_COMMAND(ID_CURVE_INSERT_ADDROW, OnCurveInsertAddrow)
583         ON_COMMAND(ID_CURVE_INSERT_INSERTCOLUMN, OnCurveInsertInsertcolumn)
584         ON_COMMAND(ID_CURVE_INSERT_INSERTROW, OnCurveInsertInsertrow)
585         ON_COMMAND(ID_CURVE_NEGATIVE, OnCurveNegative)
586         ON_COMMAND(ID_CURVE_NEGATIVETEXTUREX, OnCurveNegativeTextureX)
587         ON_COMMAND(ID_CURVE_NEGATIVETEXTUREY, OnCurveNegativeTextureY)
588         ON_COMMAND(ID_CURVE_DELETE_FIRSTCOLUMN, OnCurveDeleteFirstcolumn)
589         ON_COMMAND(ID_CURVE_DELETE_FIRSTROW, OnCurveDeleteFirstrow)
590         ON_COMMAND(ID_CURVE_DELETE_LASTCOLUMN, OnCurveDeleteLastcolumn)
591         ON_COMMAND(ID_CURVE_DELETE_LASTROW, OnCurveDeleteLastrow)
592         ON_COMMAND(ID_PATCH_BEND, OnPatchBend)
593         ON_COMMAND(ID_PATCH_INSDEL, OnPatchInsdel)
594         ON_COMMAND(ID_PATCH_ENTER, OnPatchEnter)
595         ON_COMMAND(ID_PATCH_TAB, OnPatchTab)
596         ON_COMMAND(ID_CURVE_PATCHDENSETUBE, OnCurvePatchdensetube)
597         ON_COMMAND(ID_CURVE_PATCHVERYDENSETUBE, OnCurvePatchverydensetube)
598         ON_COMMAND(ID_CURVE_CAP, OnCurveCap)
599         ON_COMMAND(ID_CURVE_CAP_INVERTEDBEVEL, OnCurveCapInvertedbevel)
600         ON_COMMAND(ID_CURVE_CAP_INVERTEDENDCAP, OnCurveCapInvertedendcap)
601         ON_COMMAND(ID_CURVE_REDISPERSE_COLS, OnCurveRedisperseCols)
602         ON_COMMAND(ID_CURVE_REDISPERSE_ROWS, OnCurveRedisperseRows)
603         ON_COMMAND(ID_PATCH_NATURALIZE, OnPatchNaturalize)
604         ON_COMMAND(ID_PATCH_NATURALIZEALT, OnPatchNaturalizeAlt)
605         ON_COMMAND(ID_SELECT_SNAPTOGRID, OnSnapToGrid)
606         ON_COMMAND(ID_CURVE_PATCHSQUARE, OnCurvePatchsquare)
607         ON_COMMAND(ID_TEXTURES_TEXTUREWINDOWSCALE_10, OnTexturesTexturewindowscale10)
608         ON_COMMAND(ID_TEXTURES_TEXTUREWINDOWSCALE_100, OnTexturesTexturewindowscale100)
609         ON_COMMAND(ID_TEXTURES_TEXTUREWINDOWSCALE_200, OnTexturesTexturewindowscale200)
610         ON_COMMAND(ID_TEXTURES_TEXTUREWINDOWSCALE_25, OnTexturesTexturewindowscale25)
611         ON_COMMAND(ID_TEXTURES_TEXTUREWINDOWSCALE_50, OnTexturesTexturewindowscale50)
612         ON_COMMAND(ID_TEXTURES_FLUSH, OnTexturesFlush)
613         ON_COMMAND(ID_CURVE_OVERLAY_CLEAR, OnCurveOverlayClear)
614         ON_COMMAND(ID_CURVE_OVERLAY_SET, OnCurveOverlaySet)
615         ON_COMMAND(ID_CURVE_THICKEN, OnCurveThicken)
616         ON_COMMAND(ID_CURVE_CYCLECAP, OnCurveCyclecap)
617         ON_COMMAND(ID_CURVE_CYCLECAPALT, OnCurveCyclecapAlt)
618         ON_COMMAND(ID_CURVE_MATRIX_TRANSPOSE, OnCurveMatrixTranspose)
619         ON_COMMAND(ID_TEXTURES_RELOADSHADERS, OnTexturesReloadshaders)
620         ON_COMMAND(ID_SHOW_ENTITIES, OnShowEntities)
621         ON_COMMAND(ID_VIEW_ENTITIESAS_SKINNED, OnViewEntitiesasSkinned)
622         ON_COMMAND(ID_VIEW_ENTITIESAS_WIREFRAME, OnViewEntitiesasWireframe)
623         ON_COMMAND(ID_VIEW_SHOWHINT, OnViewShowhint)
624         ON_UPDATE_COMMAND_UI(ID_TEXTURES_SHOWINUSE, OnUpdateTexturesShowinuse)
625         ON_COMMAND(ID_TEXTURES_SHOWALL, OnTexturesShowall)
626         ON_COMMAND(ID_TEXTURES_HIDEALL, OnTexturesHideall)
627         ON_COMMAND(ID_PATCH_INSPECTOR, OnPatchInspector)
628         ON_COMMAND(ID_VIEW_OPENGLLIGHTING, OnViewOpengllighting)
629         ON_COMMAND(ID_SELECT_ALL, OnSelectAll)
630         ON_COMMAND(ID_VIEW_SHOWCAULK, OnViewShowcaulk)
631         ON_COMMAND(ID_CURVE_FREEZE, OnCurveFreeze)
632         ON_COMMAND(ID_CURVE_UNFREEZE, OnCurveUnFreeze)
633         ON_COMMAND(ID_CURVE_UNFREEZEALL, OnCurveUnFreezeAll)
634         ON_COMMAND(ID_SELECT_RESELECT, OnSelectReselect)
635         ON_COMMAND(ID_VIEW_SHOWANGLES, OnViewShowangles)
636         ON_COMMAND(ID_EDIT_SAVEPREFAB, OnEditSaveprefab)
637         ON_COMMAND(ID_CURVE_MOREENDCAPSBEVELS_SQUAREBEVEL, OnCurveMoreendcapsbevelsSquarebevel)
638         ON_COMMAND(ID_CURVE_MOREENDCAPSBEVELS_SQUAREENDCAP, OnCurveMoreendcapsbevelsSquareendcap)
639         ON_COMMAND(ID_BRUSH_PRIMITIVES_SPHERE, OnBrushPrimitivesSphere)
640         ON_COMMAND(ID_VIEW_CROSSHAIR, OnViewCrosshair)
641         ON_COMMAND(ID_VIEW_HIDESHOW_HIDESELECTED, OnViewHideshowHideselected)
642         ON_COMMAND(ID_VIEW_HIDESHOW_HIDENOTSELECTED, OnViewHideshowHideNotselected)
643         ON_COMMAND(ID_VIEW_HIDESHOW_SHOWHIDDEN, OnViewHideshowShowhidden)
644         ON_COMMAND(ID_TEXTURES_SHADERS_SHOW, OnTexturesShadersShow)
645         ON_COMMAND(ID_TEXTURES_FLUSH_UNUSED, OnTexturesFlushUnused)
646         ON_COMMAND(ID_PROJECTED_LIGHT, OnProjectedLight)
647         ON_COMMAND(ID_SHOW_LIGHTTEXTURES, OnShowLighttextures)
648         ON_COMMAND(ID_SHOW_LIGHTVOLUMES, OnShowLightvolumes)
649         ON_WM_ACTIVATE()
650         ON_COMMAND(ID_SPLINES_MODE, OnSplinesMode)
651         ON_COMMAND(ID_SPLINES_LOAD, OnSplinesLoad)
652         ON_COMMAND(ID_SPLINES_SAVE, OnSplinesSave)
653         //ON_COMMAND(ID_SPLINES_EDIT, OnSplinesEdit)
654         ON_COMMAND(ID_SPLINE_TEST, OnSplineTest)
655         ON_COMMAND(ID_POPUP_NEWCAMERA_INTERPOLATED, OnPopupNewcameraInterpolated)
656         ON_COMMAND(ID_POPUP_NEWCAMERA_SPLINE, OnPopupNewcameraSpline)
657         ON_COMMAND(ID_POPUP_NEWCAMERA_FIXED, OnPopupNewcameraFixed)
658         ON_COMMAND(ID_SELECTION_MOVEONLY, OnSelectionMoveonly)
659         ON_COMMAND(ID_SELECT_BRUSHESONLY, OnSelectBrushesOnly)
660         ON_COMMAND(ID_SELECT_BYBOUNDINGBRUSH, OnSelectByBoundingBrush)
661         ON_COMMAND(ID_SELECTION_COMBINE, OnSelectionCombine)
662         ON_COMMAND(ID_PATCH_COMBINE, OnPatchCombine)
663         ON_COMMAND(ID_SHOW_DOOM, OnShowDoom)
664         ON_COMMAND(ID_VIEW_RENDERMODE, OnViewRendermode)
665         ON_COMMAND(ID_VIEW_REBUILDRENDERDATA, OnViewRebuildrenderdata)
666         ON_COMMAND(ID_VIEW_REALTIMEREBUILD, OnViewRealtimerebuild)
667         ON_COMMAND(ID_VIEW_RENDERENTITYOUTLINES, OnViewRenderentityoutlines)
668         ON_COMMAND(ID_VIEW_MATERIALANIMATION, OnViewMaterialanimation)
669         ON_COMMAND(ID_SELECT_AXIALTEXTURE_BYWIDTH, OnAxialTextureByWidth)
670         ON_COMMAND(ID_SELECT_AXIALTEXTURE_BYHEIGHT, OnAxialTextureByHeight)
671         ON_COMMAND(ID_SELECT_AXIALTEXTURE_ARBITRARY, OnAxialTextureArbitrary)
672         ON_COMMAND(ID_SELECTION_EXPORT_TOOBJ, OnSelectionExportToobj)
673         ON_COMMAND(ID_SELECTION_EXPORT_TOCM, OnSelectionExportToCM)
674         ON_COMMAND(ID_VIEW_RENDERSELECTION, OnViewRenderselection)
675         ON_COMMAND(ID_SELECT_NOMODELS, OnSelectNomodels)
676         ON_COMMAND(ID_VIEW_SHOW_SHOWVISPORTALS, OnViewShowShowvisportals)
677         ON_COMMAND(ID_VIEW_SHOW_NODRAW, OnViewShowNoDraw)
678         ON_COMMAND(ID_VIEW_RENDERSOUND, OnViewRendersound)
679         ON_COMMAND(ID_SOUND_SHOWSOUNDVOLUMES, OnSoundShowsoundvolumes)
680         ON_COMMAND(ID_SOUND_SHOWSELECTEDSOUNDVOLUMES, OnSoundShowselectedsoundvolumes)
681         ON_COMMAND(ID_PATCH_NURBEDITOR, OnNurbEditor)
682     ON_COMMAND(ID_SELECT_COMPLETE_ENTITY, OnSelectCompleteEntity)
683         ON_COMMAND(ID_PRECISION_CURSOR_CYCLE , OnPrecisionCursorCycle)
684         ON_COMMAND(ID_MATERIALS_GENERATEMATERIALSLIST,OnGenerateMaterialsList)
685         ON_COMMAND(ID_SELECTION_VIEW_WIREFRAMEON, OnSelectionWireFrameOn)
686         ON_COMMAND(ID_SELECTION_VIEW_WIREFRAMEOFF, OnSelectionWireFrameOff)
687         ON_COMMAND(ID_SELECTION_VIEW_VISIBLEON, OnSelectionVisibleOn)
688         ON_COMMAND(ID_SELECTION_VIEW_VISIBLEOFF, OnSelectionVisibleOff)
689         //}}AFX_MSG_MAP
690         ON_COMMAND_RANGE(CMD_TEXTUREWAD, CMD_TEXTUREWAD_END, OnTextureWad)
691         ON_COMMAND_RANGE(CMD_BSPCOMMAND, CMD_BSPCOMMAND_END, OnBspCommand)
692         ON_COMMAND_RANGE(IDMRU, IDMRU_END, OnMru)
693         ON_COMMAND_RANGE(ID_VIEW_NEAREST, ID_TEXTURES_FLATSHADE, OnViewNearest)
694         ON_COMMAND_RANGE(ID_GRID_POINT0625, ID_GRID_64, OnGrid1)
695 #if _MSC_VER < 1300
696         ON_REGISTERED_MESSAGE(g_msgBSPDone, OnBSPDone) 
697         ON_REGISTERED_MESSAGE(g_msgBSPStatus, OnBSPStatus)
698         ON_MESSAGE(WM_DISPLAYCHANGE, OnDisplayChange)
699 #endif
700         ON_COMMAND(ID_AUTOCAULK, OnAutocaulk)
701         ON_UPDATE_COMMAND_UI(ID_AUTOCAULK, OnUpdateAutocaulk)
702         ON_COMMAND(ID_SELECT_ALLTARGETS, OnSelectAlltargets)
703         END_MESSAGE_MAP()
704 static UINT indicators[] = {
705         ID_SEPARATOR,   // status line indicator
706         ID_SEPARATOR,   // status line indicator
707         ID_SEPARATOR,   // status line indicator
708         ID_SEPARATOR,   // status line indicator
709         ID_SEPARATOR,   // status line indicator
710         ID_SEPARATOR,   // status line indicator
711 };
712
713 /*
714  =======================================================================================================================
715  =======================================================================================================================
716  */
717 void CMainFrame::OnDisplayChange(UINT wParam, long lParam) {
718         int n = wParam;
719 }
720
721 /*
722  =======================================================================================================================
723  =======================================================================================================================
724  */
725 void CMainFrame::OnBSPStatus(UINT wParam, long lParam) {
726         // lparam is an atom contain the text
727         char buff[1024];
728         if (::GlobalGetAtomName(static_cast<ATOM>(lParam), buff, sizeof(buff))) {
729                 common->Printf("%s", buff);
730                 ::GlobalDeleteAtom(static_cast<ATOM>(lParam));
731         }
732 }
733
734 /*
735  =======================================================================================================================
736  =======================================================================================================================
737  */
738 void CMainFrame::OnBSPDone(UINT wParam, long lParam) {
739         idStr str = cvarSystem->GetCVarString( "radiant_bspdone" );
740         if (str.Length()) {
741             sndPlaySound(str.c_str(), SND_FILENAME | SND_ASYNC);
742         }
743 }
744
745 //
746 // =======================================================================================================================
747 //    CMainFrame construction/destruction
748 // =======================================================================================================================
749 //
750 CMainFrame::CMainFrame() {
751         m_bDoLoop = false;
752         g_pParentWnd = this;
753         m_pXYWnd = NULL;
754         m_pCamWnd = NULL;
755         m_pZWnd = NULL;
756         m_pYZWnd = NULL;
757         m_pXZWnd = NULL;
758         m_pActiveXY = NULL;
759         m_bCamPreview = true;
760         nurbMode = 0;
761 }
762
763 /*
764  =======================================================================================================================
765  =======================================================================================================================
766  */
767 CMainFrame::~CMainFrame() {
768 }
769
770 /*
771  =======================================================================================================================
772  =======================================================================================================================
773  */
774 void HandlePopup(CWnd *pWindow, unsigned int uId) {
775         // Get the current position of the mouse
776         CPoint  ptMouse;
777         GetCursorPos(&ptMouse);
778
779         // Load up a menu that has the options we are looking for in it
780         CMenu   mnuPopup;
781         VERIFY(mnuPopup.LoadMenu(uId));
782         mnuPopup.GetSubMenu(0)->TrackPopupMenu
783                 (
784                         TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON,
785                         ptMouse.x,
786                         ptMouse.y,
787                         pWindow
788                 );
789         mnuPopup.DestroyMenu();
790
791         // Set focus back to window
792         pWindow->SetFocus();
793 }
794
795 /*
796  =======================================================================================================================
797  =======================================================================================================================
798  */
799 void CMainFrame::OnParentNotify(UINT message, LPARAM lParam) {
800 }
801
802 /*
803  =======================================================================================================================
804  =======================================================================================================================
805  */
806 void CMainFrame::SetButtonMenuStates() {
807         CMenu   *pMenu = GetMenu();
808         if (pMenu) {
809                 //
810                 pMenu->CheckMenuItem(ID_VIEW_SHOWNAMES, MF_BYCOMMAND | MF_CHECKED);
811                 pMenu->CheckMenuItem(ID_VIEW_SHOWCOORDINATES, MF_BYCOMMAND | MF_CHECKED);
812                 pMenu->CheckMenuItem(ID_VIEW_SHOWLIGHTS, MF_BYCOMMAND | MF_CHECKED);
813                 pMenu->CheckMenuItem(ID_VIEW_SHOWCOMBATNODES, MF_BYCOMMAND | MF_CHECKED);
814                 pMenu->CheckMenuItem(ID_VIEW_ENTITY, MF_BYCOMMAND | MF_CHECKED);
815                 pMenu->CheckMenuItem(ID_VIEW_SHOWPATH, MF_BYCOMMAND | MF_CHECKED);
816                 pMenu->CheckMenuItem(ID_VIEW_SHOWWATER, MF_BYCOMMAND | MF_CHECKED);
817                 pMenu->CheckMenuItem(ID_VIEW_SHOWWORLD, MF_BYCOMMAND | MF_CHECKED);
818                 pMenu->CheckMenuItem(ID_VIEW_SHOWCLIP, MF_BYCOMMAND | MF_CHECKED);
819                 pMenu->CheckMenuItem(ID_VIEW_SHOWTRIGGERS, MF_BYCOMMAND | MF_CHECKED);
820                 pMenu->CheckMenuItem(ID_VIEW_SHOWHINT, MF_BYCOMMAND | MF_CHECKED);
821                 pMenu->CheckMenuItem(ID_VIEW_SHOWCAULK, MF_BYCOMMAND | MF_CHECKED);
822                 pMenu->CheckMenuItem(ID_VIEW_SHOW_SHOWVISPORTALS, MF_BYCOMMAND | MF_CHECKED);
823                 pMenu->CheckMenuItem(ID_VIEW_SHOW_NODRAW, MF_BYCOMMAND | MF_CHECKED);
824                 pMenu->CheckMenuItem(ID_VIEW_SHOWANGLES, MF_BYCOMMAND | MF_CHECKED);
825
826                 if (!g_qeglobals.d_savedinfo.show_names) {
827                         pMenu->CheckMenuItem(ID_VIEW_SHOWNAMES, MF_BYCOMMAND | MF_UNCHECKED);
828                 }
829
830                 if (!g_qeglobals.d_savedinfo.show_coordinates) {
831                         pMenu->CheckMenuItem(ID_VIEW_SHOWCOORDINATES, MF_BYCOMMAND | MF_UNCHECKED);
832                 }
833
834                 if (g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTS) {
835                         pMenu->CheckMenuItem(ID_VIEW_SHOWLIGHTS, MF_BYCOMMAND | MF_UNCHECKED);
836                 }
837
838                 if (g_qeglobals.d_savedinfo.exclude & EXCLUDE_COMBATNODES) {
839                         pMenu->CheckMenuItem(ID_VIEW_SHOWCOMBATNODES, MF_BYCOMMAND | MF_UNCHECKED);
840                 }
841
842                 if (g_qeglobals.d_savedinfo.exclude & EXCLUDE_ENT) {
843                         pMenu->CheckMenuItem(ID_VIEW_ENTITY, MF_BYCOMMAND | MF_UNCHECKED);
844                 }
845
846                 if (g_qeglobals.d_savedinfo.exclude & EXCLUDE_PATHS) {
847                         pMenu->CheckMenuItem(ID_VIEW_SHOWPATH, MF_BYCOMMAND | MF_UNCHECKED);
848                 }
849
850                 if (g_qeglobals.d_savedinfo.exclude & EXCLUDE_DYNAMICS) {
851                         pMenu->CheckMenuItem(ID_VIEW_SHOWWATER, MF_BYCOMMAND | MF_UNCHECKED);
852                 }
853
854                 if (g_qeglobals.d_savedinfo.exclude & EXCLUDE_WORLD) {
855                         pMenu->CheckMenuItem(ID_VIEW_SHOWWORLD, MF_BYCOMMAND | MF_UNCHECKED);
856                 }
857
858                 if (g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLIP) {
859                         pMenu->CheckMenuItem(ID_VIEW_SHOWCLIP, MF_BYCOMMAND | MF_UNCHECKED);
860                 }
861
862                 if (g_qeglobals.d_savedinfo.exclude & EXCLUDE_TRIGGERS) {
863                         pMenu->CheckMenuItem(ID_VIEW_SHOWTRIGGERS, MF_BYCOMMAND | MF_UNCHECKED);
864                 }
865
866                 if (g_qeglobals.d_savedinfo.exclude & EXCLUDE_HINT) {
867                         pMenu->CheckMenuItem(ID_VIEW_SHOWHINT, MF_BYCOMMAND | MF_UNCHECKED);
868                 }
869
870                 if (g_qeglobals.d_savedinfo.exclude & EXCLUDE_CAULK) {
871                         pMenu->CheckMenuItem(ID_VIEW_SHOWCAULK, MF_BYCOMMAND | MF_UNCHECKED);
872                 }
873
874                 if (g_qeglobals.d_savedinfo.exclude & EXCLUDE_VISPORTALS) {
875                         pMenu->CheckMenuItem(ID_VIEW_SHOW_SHOWVISPORTALS, MF_BYCOMMAND | MF_UNCHECKED);
876                 }
877
878                 if (g_qeglobals.d_savedinfo.exclude & EXCLUDE_NODRAW) {
879                         pMenu->CheckMenuItem(ID_VIEW_SHOW_NODRAW, MF_BYCOMMAND | MF_UNCHECKED);
880                 }
881
882                 if (g_qeglobals.d_savedinfo.exclude & EXCLUDE_ANGLES) {
883                         pMenu->CheckMenuItem(ID_VIEW_SHOWANGLES, MF_BYCOMMAND | MF_UNCHECKED);
884                 }
885
886                 pMenu->CheckMenuItem(ID_TOGGLE_LOCK, MF_BYCOMMAND | (g_PrefsDlg.m_bTextureLock) ? MF_CHECKED : MF_UNCHECKED);
887                 pMenu->CheckMenuItem
888                         (
889                                 ID_TOGGLE_ROTATELOCK,
890                                 MF_BYCOMMAND | (g_PrefsDlg.m_bRotateLock) ? MF_CHECKED : MF_UNCHECKED
891                         );
892                 pMenu->CheckMenuItem
893                         (
894                                 ID_VIEW_CUBICCLIPPING,
895                                 MF_BYCOMMAND | (g_PrefsDlg.m_bCubicClipping) ? MF_CHECKED : MF_UNCHECKED
896                         );
897                 pMenu->CheckMenuItem
898                         (
899                                 ID_VIEW_OPENGLLIGHTING,
900                                 MF_BYCOMMAND | (g_PrefsDlg.m_bGLLighting) ? MF_CHECKED : MF_UNCHECKED
901                         );
902                 pMenu->CheckMenuItem(ID_SNAPTOGRID, MF_BYCOMMAND | (!g_PrefsDlg.m_bNoClamp) ? MF_CHECKED : MF_UNCHECKED);
903                 if (m_wndToolBar.GetSafeHwnd()) {
904                         m_wndToolBar.GetToolBarCtrl().CheckButton
905                                 (
906                                         ID_VIEW_CUBICCLIPPING,
907                                         (g_PrefsDlg.m_bCubicClipping) ? TRUE : FALSE
908                                 );
909                 }
910
911                 int n = g_PrefsDlg.m_nTextureScale;
912                 int id;
913                 switch (n)
914                 {
915                         case 10:
916                                 id = ID_TEXTURES_TEXTUREWINDOWSCALE_10;
917                                 break;
918                         case 25:
919                                 id = ID_TEXTURES_TEXTUREWINDOWSCALE_25;
920                                 break;
921                         case 50:
922                                 id = ID_TEXTURES_TEXTUREWINDOWSCALE_50;
923                                 break;
924                         case 200:
925                                 id = ID_TEXTURES_TEXTUREWINDOWSCALE_200;
926                                 break;
927                         default:
928                                 id = ID_TEXTURES_TEXTUREWINDOWSCALE_100;
929                                 break;
930                 }
931
932                 CheckTextureScale(id);
933         }
934
935         if (g_qeglobals.d_project_entity) {
936                 // FillTextureMenu(); // redundant but i'll clean it up later.. yeah right..
937                 FillBSPMenu();
938                 LoadMruInReg(g_qeglobals.d_lpMruMenu, "Software\\" EDITOR_REGISTRY_KEY "\\MRU" );
939                 PlaceMenuMRUItem(g_qeglobals.d_lpMruMenu, ::GetSubMenu(::GetMenu(GetSafeHwnd()), 0), ID_FILE_EXIT);
940         }
941 }
942
943 /*
944  =======================================================================================================================
945  =======================================================================================================================
946  */
947 void CMainFrame::ShowMenuItemKeyBindings(CMenu *pMenu) {
948         int                             i, j;
949         char                    key[1024], *ptr;
950         MENUITEMINFO    MenuItemInfo;
951
952         // return;
953         for (i = 0; i < g_nCommandCount; i++) {
954                 memset(&MenuItemInfo, 0, sizeof(MENUITEMINFO));
955                 MenuItemInfo.cbSize = sizeof(MENUITEMINFO);
956                 MenuItemInfo.fMask = MIIM_TYPE;
957                 MenuItemInfo.dwTypeData = key;
958                 MenuItemInfo.cch = sizeof(key);
959                 if (!pMenu->GetMenuItemInfo(g_Commands[i].m_nCommand, &MenuItemInfo)) {
960                         continue;
961                 }
962
963                 if (MenuItemInfo.fType != MFT_STRING) {
964                         continue;
965                 }
966
967                 ptr = strchr(key, '\t');
968                 if (ptr) {
969                         *ptr = '\0';
970                 }
971
972                 strcat(key, "\t");
973                 if (g_Commands[i].m_nModifiers) {       // are there modifiers present?
974                         if (g_Commands[i].m_nModifiers & RAD_SHIFT) {
975                                 strcat(key, "Shift-");
976                         }
977
978                         if (g_Commands[i].m_nModifiers & RAD_ALT) {
979                                 strcat(key, "Alt-");
980                         }
981
982                         if (g_Commands[i].m_nModifiers & RAD_CONTROL) {
983                                 strcat(key, "Ctrl-");
984                         }
985                 }
986
987                 for (j = 0; j < g_nKeyCount; j++) {
988                         if (g_Commands[i].m_nKey == g_Keys[j].m_nVKKey) {
989                                 strcat(key, g_Keys[j].m_strName);
990                                 break;
991                         }
992                 }
993
994                 if (j >= g_nKeyCount) {
995                         sprintf(&key[strlen(key)], "%c", g_Commands[i].m_nKey);
996                 }
997
998                 memset(&MenuItemInfo, 0, sizeof(MENUITEMINFO));
999                 MenuItemInfo.cbSize = sizeof(MENUITEMINFO);
1000                 MenuItemInfo.fMask = MIIM_TYPE;
1001                 MenuItemInfo.fType = MFT_STRING;
1002                 MenuItemInfo.dwTypeData = key;
1003                 MenuItemInfo.cch = strlen(key);
1004                 SetMenuItemInfo(pMenu->m_hMenu, g_Commands[i].m_nCommand, FALSE, &MenuItemInfo);
1005         }
1006 }
1007
1008 /*
1009 ==============
1010 MFCCreate
1011 ==============
1012 */
1013 void MFCCreate( HINSTANCE hInstance )
1014 {
1015         HMENU hMenu = NULL;
1016         int i = sizeof(g_qeglobals.d_savedinfo);
1017         long l = i;
1018
1019         g_qeglobals.d_savedinfo.exclude |= (EXCLUDE_HINT | EXCLUDE_CLIP);
1020         LoadRegistryInfo("radiant_SavedInfo", &g_qeglobals.d_savedinfo, &l);
1021
1022         int nOldSize = g_qeglobals.d_savedinfo.iSize;
1023         if (g_qeglobals.d_savedinfo.iSize != sizeof(g_qeglobals.d_savedinfo)) {
1024                 // fill in new defaults
1025                 g_qeglobals.d_savedinfo.iSize = sizeof(g_qeglobals.d_savedinfo);
1026                 g_qeglobals.d_savedinfo.fGamma = 1.0;
1027                 g_qeglobals.d_savedinfo.iTexMenu = ID_VIEW_BILINEARMIPMAP;
1028                 g_qeglobals.d_savedinfo.m_nTextureTweak = 1.0;
1029   
1030                 //g_qeglobals.d_savedinfo.exclude = INCLUDE_EASY | INCLUDE_NORMAL | INCLUDE_HARD | INCLUDE_DEATHMATCH;
1031                 g_qeglobals.d_savedinfo.show_coordinates = true;
1032                 g_qeglobals.d_savedinfo.show_names       = false;
1033
1034                 for (i=0 ; i<3 ; i++) {
1035                         g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0;
1036                         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 1.0;
1037                         g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.75;
1038                         g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.5;
1039                         g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25;
1040                 }
1041
1042                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0;
1043                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0;
1044                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0;
1045
1046                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0;
1047                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0;
1048                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0;
1049
1050                 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0;
1051                 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0;
1052                 g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0;
1053
1054                 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0;
1055                 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0;
1056                 g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0;
1057
1058                 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0;
1059                 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0;
1060                 g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0;
1061
1062                 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5;
1063                 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0;
1064                 g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75;
1065
1066
1067                 // old size was smaller, reload original prefs
1068                 if (nOldSize > 0 && nOldSize < sizeof(g_qeglobals.d_savedinfo)) {
1069                         long l = nOldSize;
1070                         LoadRegistryInfo("radiant_SavedInfo", &g_qeglobals.d_savedinfo, &l);
1071                 }
1072         }
1073 }
1074
1075 /*
1076  =======================================================================================================================
1077  =======================================================================================================================
1078  */
1079 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {
1080         char    *pBuffer = g_strAppPath.GetBufferSetLength(_MAX_PATH + 1);
1081         int             nResult = ::GetModuleFileName(NULL, pBuffer, _MAX_PATH);
1082         ASSERT(nResult != 0);
1083         pBuffer[g_strAppPath.ReverseFind('\\') + 1] = '\0';
1084         g_strAppPath.ReleaseBuffer();
1085
1086         com_editors |= EDITOR_RADIANT;
1087
1088         InitCommonControls();
1089         g_qeglobals.d_hInstance = AfxGetInstanceHandle();
1090         MFCCreate(AfxGetInstanceHandle());
1091
1092         // g_PrefsDlg.LoadPrefs();
1093         if (CFrameWnd::OnCreate(lpCreateStruct) == -1) {
1094                 return -1;
1095         }
1096
1097         UINT    nID = (g_PrefsDlg.m_bWideToolbar) ? IDR_TOOLBAR_ADVANCED : IDR_TOOLBAR1;
1098
1099         if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
1100                 | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar.LoadToolBar(nID)) {
1101                 TRACE0("Failed to create toolbar\n");
1102                 return -1;      // fail to create
1103         }
1104
1105         if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators) / sizeof(UINT))) {
1106                 TRACE0("Failed to create status bar\n");
1107                 return -1;      // fail to create
1108         }
1109
1110         m_bCamPreview = true;
1111
1112         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_SCALELOCKX, FALSE);
1113         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_SCALELOCKY, FALSE);
1114         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_SCALELOCKZ, FALSE);
1115         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_SELECT_BYBOUNDINGBRUSH, FALSE);
1116         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_SELECT_BRUSHESONLY, FALSE);
1117         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_PATCH_SHOWBOUNDINGBOX, FALSE);
1118         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_PATCH_WELD, TRUE);
1119         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_PATCH_DRILLDOWN, TRUE);
1120         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_SHOW_LIGHTVOLUMES, FALSE);
1121         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_SHOW_LIGHTTEXTURES, FALSE);
1122         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_SELECTION_MOVEONLY, FALSE);
1123         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_SOUND_SHOWSOUNDVOLUMES,g_qeglobals.d_savedinfo.showSoundAlways);
1124         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_SOUND_SHOWSELECTEDSOUNDVOLUMES,g_qeglobals.d_savedinfo.showSoundWhenSelected);
1125
1126         m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
1127         EnableDocking(CBRS_ALIGN_ANY);
1128         DockControlBar(&m_wndToolBar);
1129
1130         g_nScaleHow = 0;
1131
1132         m_wndTextureBar.Create(this, IDD_TEXTUREBAR, CBRS_BOTTOM, 7433);
1133         m_wndTextureBar.EnableDocking(CBRS_ALIGN_ANY);
1134         DockControlBar(&m_wndTextureBar);
1135
1136         g_qeglobals.d_lpMruMenu = CreateMruMenuDefault();
1137
1138         m_bAutoMenuEnable = FALSE;
1139
1140         LoadCommandMap();
1141
1142         CMenu *pMenu = GetMenu();
1143         ShowMenuItemKeyBindings(pMenu);
1144
1145         CFont   *pFont = new CFont();
1146         pFont->CreatePointFont(g_PrefsDlg.m_nStatusSize * 10, "Arial");
1147         m_wndStatusBar.SetFont(pFont);
1148
1149
1150         if (g_PrefsDlg.m_bRunBefore == FALSE) {
1151                 g_PrefsDlg.m_bRunBefore = TRUE;
1152                 g_PrefsDlg.SavePrefs();
1153
1154                 /*
1155                  * if (MessageBox("Would you like QERadiant to build and load a default project?
1156                  * If this is the first time you have run QERadiant or you are not familiar with
1157                  * editing QE4 project files directly, this is HIGHLY recommended", "Create a
1158                  * default project?", MB_YESNO) == IDYES) { OnFileNewproject(); }
1159                  */
1160         }
1161         else
1162         {
1163                 // load plugins before the first Map_LoadFile required for model plugins
1164                 if (g_PrefsDlg.m_bLoadLastMap && g_PrefsDlg.m_strLastMap.GetLength() > 0) {
1165                         Map_LoadFile(g_PrefsDlg.m_strLastMap.GetBuffer(0));
1166                 }
1167         }
1168
1169         SetGridStatus();
1170         SetTexValStatus();
1171         SetButtonMenuStates();
1172         LoadBarState("RadiantToolBars2");
1173
1174         SetActiveXY(m_pXYWnd);
1175         m_pXYWnd->SetFocus();
1176
1177         PostMessage(WM_KEYDOWN, 'O', NULL);
1178
1179         if ( radiant_entityMode.GetBool() ) {
1180                 g_qeglobals.d_savedinfo.exclude |= (EXCLUDE_PATHS | EXCLUDE_CLIP | EXCLUDE_CAULK | EXCLUDE_VISPORTALS | EXCLUDE_NODRAW | EXCLUDE_TRIGGERS);
1181         }
1182
1183         Sys_UpdateWindows ( W_ALL );
1184         return 0;
1185 }
1186
1187 /*
1188  =======================================================================================================================
1189  =======================================================================================================================
1190  */
1191
1192 void FindReplace(CString& strContents, const char* pTag, const char* pValue) {
1193         if (strcmp(pTag, pValue) == 0)
1194                 return;
1195         for (int nPos = strContents.Find(pTag); nPos >= 0; nPos = strContents.Find(pTag)) {
1196                 int nRightLen = strContents.GetLength() - strlen(pTag) - nPos;
1197                 CString strLeft = strContents.Left(nPos);
1198                 CString strRight = strContents.Right(nRightLen);
1199                 strLeft += pValue;
1200                 strLeft += strRight;
1201                 strContents = strLeft;
1202         }
1203 }
1204
1205 void CMainFrame::LoadCommandMap() {
1206         CString strINI;
1207         char    pBuff[1024];
1208         strINI = g_strAppPath;
1209         strINI += "\\radiant.ini";
1210
1211         for (int i = 0; i < g_nCommandCount; i++) {
1212                 int nLen = GetPrivateProfileString("Commands", g_Commands[i].m_strCommand, "", pBuff, 1024, strINI);
1213                 if (nLen > 0) {
1214                         CString strBuff = pBuff;
1215                         strBuff.TrimLeft();
1216                         strBuff.TrimRight();
1217
1218                         int nSpecial = strBuff.Find("+alt");
1219                         g_Commands[i].m_nModifiers = 0;
1220                         if (nSpecial >= 0) {
1221                                 g_Commands[i].m_nModifiers |= RAD_ALT;
1222                                 FindReplace(strBuff, "+alt", "");
1223                         }
1224
1225                         nSpecial = strBuff.Find("+ctrl");
1226                         if (nSpecial >= 0) {
1227                                 g_Commands[i].m_nModifiers |= RAD_CONTROL;
1228                                 FindReplace(strBuff, "+ctrl", "");
1229                         }
1230
1231                         nSpecial = strBuff.Find("+shift");
1232                         if (nSpecial >= 0) {
1233                                 g_Commands[i].m_nModifiers |= RAD_SHIFT;
1234                                 FindReplace(strBuff, "+shift", "");
1235                         }
1236
1237                         strBuff.TrimLeft();
1238                         strBuff.TrimRight();
1239                         strBuff.MakeUpper();
1240                         if (nLen == 1) {        // most often case.. deal with first
1241                                 g_Commands[i].m_nKey = __toascii(strBuff.GetAt(0));
1242                         }
1243                         else {                          // special key
1244                                 for (int j = 0; j < g_nKeyCount; j++) {
1245                                         if (strBuff.CompareNoCase(g_Keys[j].m_strName) == 0) {
1246                                                 g_Commands[i].m_nKey = g_Keys[j].m_nVKKey;
1247                                                 break;
1248                                         }
1249                                 }
1250                         }
1251                 }
1252         }
1253 }
1254
1255 /*
1256  =======================================================================================================================
1257  =======================================================================================================================
1258  */
1259 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT &cs) {
1260         // TODO: Modify the Window class or styles here by modifying the CREATESTRUCT cs
1261         return CFrameWnd::PreCreateWindow(cs);
1262 }
1263
1264 // CMainFrame diagnostics
1265 #ifdef _DEBUG
1266
1267 /*
1268  =======================================================================================================================
1269  =======================================================================================================================
1270  */
1271 void CMainFrame::AssertValid() const {
1272         CFrameWnd::AssertValid();
1273 }
1274
1275 /*
1276  =======================================================================================================================
1277  =======================================================================================================================
1278  */
1279 void CMainFrame::Dump(CDumpContext &dc) const {
1280         CFrameWnd::Dump(dc);
1281 }
1282 #endif // _DEBUG
1283
1284 //
1285 // =======================================================================================================================
1286 //    CMainFrame message handlers
1287 // =======================================================================================================================
1288 //
1289 void CMainFrame::CreateQEChildren() {
1290         //
1291         // the project file can be specified on the command line, or implicitly found in
1292         // the basedir directory
1293         //
1294         bool bProjectLoaded = false;
1295         if (g_PrefsDlg.m_bLoadLast && g_PrefsDlg.m_strLastProject.GetLength() > 0) {
1296                 bProjectLoaded = QE_LoadProject(g_PrefsDlg.m_strLastProject.GetBuffer(0));
1297         }
1298         if (!bProjectLoaded) {
1299                 bProjectLoaded = QE_LoadProject( EDITOR_DEFAULT_PROJECT );
1300         }
1301
1302         if (!bProjectLoaded) {
1303                 CFileDialog dlgFile( true, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, EDITOR_WINDOWTEXT " Project files (*.qe4, *.prj)|*.qe4|*.prj||", this );
1304                 if (dlgFile.DoModal() == IDOK) {
1305                         bProjectLoaded = QE_LoadProject(dlgFile.GetPathName().GetBuffer(0));
1306                 }
1307         }
1308
1309         if (!bProjectLoaded) {
1310                 Error("Unable to load project file. It was unavailable in the scripts path and the default could not be found");
1311         }
1312
1313         QE_Init();
1314
1315         common->Printf("Entering message loop\n");
1316
1317         m_bDoLoop = true;
1318         SetTimer(QE_TIMER0, 100, NULL);
1319         SetTimer(QE_TIMER1, g_PrefsDlg.m_nAutoSave * 60 * 1000, NULL);
1320 }
1321
1322 /*
1323  =======================================================================================================================
1324  =======================================================================================================================
1325  */
1326 BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam) {
1327         return CFrameWnd::OnCommand(wParam, lParam);
1328 }
1329
1330 /*
1331  =======================================================================================================================
1332  =======================================================================================================================
1333  */
1334 LRESULT CMainFrame::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) {
1335         //RoutineProcessing();
1336         return CFrameWnd::DefWindowProc(message, wParam, lParam);
1337 }
1338
1339 /*
1340  =======================================================================================================================
1341  =======================================================================================================================
1342  */
1343 void CMainFrame::RoutineProcessing() {
1344         if (m_bDoLoop) {
1345                 double  time = 0.0;
1346                 static double oldtime = 0.0;
1347                 double  delta = 0.0;
1348
1349                 time = Sys_DoubleTime();
1350                 delta = time - oldtime;
1351                 oldtime = time;
1352                 if (delta > 0.2) {
1353                         delta = 0.2;
1354                 }
1355
1356                 // run time dependant behavior
1357                 if (m_pCamWnd) {
1358                         m_pCamWnd->Cam_MouseControl(delta);
1359                 }
1360
1361                 if (g_PrefsDlg.m_bQE4Painting && g_nUpdateBits) {
1362                         int nBits = g_nUpdateBits;      // this is done to keep this routine from being
1363                         g_nUpdateBits = 0;                      // re-entered due to the paint process.. only
1364                         UpdateWindows(nBits);           // happens in rare cases but causes a stack overflow
1365                 }
1366         }
1367 }
1368
1369 /*
1370  =======================================================================================================================
1371  =======================================================================================================================
1372  */
1373 LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) {
1374         return CFrameWnd::WindowProc(message, wParam, lParam);
1375 }
1376
1377 /*
1378  =======================================================================================================================
1379  =======================================================================================================================
1380  */
1381 bool MouseDown() {
1382         if (::GetAsyncKeyState(VK_LBUTTON)) {
1383                 return true;
1384         }
1385
1386         if (::GetAsyncKeyState(VK_RBUTTON)) {
1387                 return true;
1388         }
1389
1390         if (::GetAsyncKeyState(VK_MBUTTON)) {
1391                 return true;
1392         }
1393
1394         return false;
1395 }
1396
1397 /*
1398  =======================================================================================================================
1399  =======================================================================================================================
1400  */
1401
1402 void CMainFrame::OnTimer(UINT nIDEvent) {
1403         static bool autoSavePending = false;
1404
1405         if ( nIDEvent == QE_TIMER0 && !MouseDown() ) {
1406                 QE_CountBrushesAndUpdateStatusBar();
1407         }
1408         if ( nIDEvent == QE_TIMER1 || autoSavePending ) {
1409                 if ( MouseDown() ) {
1410                         autoSavePending = true;
1411                         return;
1412                 }
1413                 if ( Sys_Waiting() ) {
1414                         autoSavePending = true;
1415                         return;
1416                 }
1417                 QE_CheckAutoSave();
1418                 autoSavePending = false;
1419         }
1420 }
1421
1422 struct SplitInfo {
1423         int m_nMin;
1424         int m_nCur;
1425 };
1426
1427 /*
1428  =======================================================================================================================
1429  =======================================================================================================================
1430  */
1431 bool LoadWindowPlacement(HWND hwnd, const char *pName) {
1432         WINDOWPLACEMENT wp;
1433         wp.length = sizeof(WINDOWPLACEMENT);
1434
1435         LONG lSize = sizeof(wp);
1436         if (LoadRegistryInfo(pName, &wp, &lSize)) {
1437                 ::SetWindowPlacement(hwnd, &wp);
1438                 return true;
1439         }
1440
1441         return false;
1442 }
1443
1444 /*
1445  =======================================================================================================================
1446  =======================================================================================================================
1447  */
1448 void SaveWindowPlacement(HWND hwnd, const char *pName) {
1449         WINDOWPLACEMENT wp;
1450         wp.length = sizeof(WINDOWPLACEMENT);
1451         if (::GetWindowPlacement(hwnd, &wp)) {
1452                 SaveRegistryInfo(pName, &wp, sizeof(wp));
1453         }
1454 }
1455
1456 /*
1457  =======================================================================================================================
1458  =======================================================================================================================
1459  */
1460 void CMainFrame::OnDestroy() {
1461         KillTimer(QE_TIMER0);
1462
1463         SaveBarState("RadiantToolBars2");
1464
1465         // FIXME original mru stuff needs replaced with mfc stuff
1466         SaveMruInReg(g_qeglobals.d_lpMruMenu, "Software\\" EDITOR_REGISTRY_KEY "\\MRU");
1467
1468         DeleteMruMenu(g_qeglobals.d_lpMruMenu);
1469
1470         SaveRegistryInfo("radiant_SavedInfo", &g_qeglobals.d_savedinfo, sizeof(g_qeglobals.d_savedinfo));
1471
1472         SaveWindowPlacement(GetSafeHwnd(), "radiant_MainWindowPlace");
1473
1474         SaveWindowPlacement(m_pXYWnd->GetSafeHwnd(), "radiant_xywindow");
1475         SaveWindowPlacement(m_pXZWnd->GetSafeHwnd(), "radiant_xzwindow");
1476         SaveWindowPlacement(m_pYZWnd->GetSafeHwnd(), "radiant_yzwindow");
1477         SaveWindowPlacement(m_pCamWnd->GetSafeHwnd(), "radiant_camerawindow");
1478         SaveWindowPlacement(m_pZWnd->GetSafeHwnd(), "radiant_zwindow");
1479         SaveWindowState(g_Inspectors->texWnd.GetSafeHwnd(), "radiant_texwindow");
1480
1481         if (m_pXYWnd->GetSafeHwnd()) {
1482                 m_pXYWnd->SendMessage(WM_DESTROY, 0, 0);
1483         }
1484
1485         delete m_pXYWnd;
1486         m_pXYWnd = NULL;
1487
1488         if (m_pYZWnd->GetSafeHwnd()) {
1489                 m_pYZWnd->SendMessage(WM_DESTROY, 0, 0);
1490         }
1491
1492         delete m_pYZWnd;
1493         m_pYZWnd = NULL;
1494
1495         if (m_pXZWnd->GetSafeHwnd()) {
1496                 m_pXZWnd->SendMessage(WM_DESTROY, 0, 0);
1497         }
1498
1499         delete m_pXZWnd;
1500         m_pXZWnd = NULL;
1501
1502         if (m_pZWnd->GetSafeHwnd()) {
1503                 m_pZWnd->SendMessage(WM_DESTROY, 0, 0);
1504         }
1505
1506         delete m_pZWnd;
1507         m_pZWnd = NULL;
1508
1509         if (m_pCamWnd->GetSafeHwnd()) {
1510                 m_pCamWnd->SendMessage(WM_DESTROY, 0, 0);
1511         }
1512
1513         delete m_pCamWnd;
1514         m_pCamWnd = NULL;
1515
1516         if ( idStr::Icmp(currentmap, "unnamed.map") != 0 ) {
1517                 g_PrefsDlg.m_strLastMap = currentmap;
1518                 g_PrefsDlg.SavePrefs();
1519         }
1520
1521         CleanUpEntities();
1522
1523         while (active_brushes.next != &active_brushes) {
1524                 Brush_Free(active_brushes.next, false);
1525         }
1526
1527         while (selected_brushes.next != &selected_brushes) {
1528                 Brush_Free(selected_brushes.next, false);
1529         }
1530
1531         while (filtered_brushes.next != &filtered_brushes) {
1532                 Brush_Free(filtered_brushes.next, false);
1533         }
1534
1535         while (entities.next != &entities) {
1536                 Entity_Free(entities.next);
1537         }
1538
1539
1540         g_qeglobals.d_project_entity->epairs.Clear();
1541
1542         entity_t        *pEntity = g_qeglobals.d_project_entity->next;
1543         while (pEntity != NULL && pEntity != g_qeglobals.d_project_entity) {
1544                 entity_t        *pNextEntity = pEntity->next;
1545                 Entity_Free(pEntity);
1546                 pEntity = pNextEntity;
1547         }
1548
1549         Texture_Cleanup();
1550
1551         if (world_entity) {
1552                 Entity_Free(world_entity);
1553         }
1554
1555         //
1556         // FIXME: idMaterial
1557         // if (notexture) { // Timo // Surface properties plugin #ifdef _DEBUG if (
1558         // !notexture->pData ) common->Printf("WARNING: found a qtexture_t* with no
1559         // IPluginQTexture\n"); #endif if ( notexture->pData )
1560         // GETPLUGINTEXDEF(notexture)->DecRef(); Mem_Free(notexture); }
1561         // if (current_texture) free(current_texture);
1562         //
1563
1564         // FIXME: idMaterial FreeShaders();
1565         CFrameWnd::OnDestroy();
1566
1567         AfxGetApp()->ExitInstance();
1568 }
1569
1570 /*
1571  =======================================================================================================================
1572  =======================================================================================================================
1573  */
1574 void CMainFrame::OnClose() {
1575         if (ConfirmModified()) {
1576                 g_Inspectors->SaveWindowPlacement ();
1577                 CFrameWnd::OnClose();
1578         }
1579 }
1580
1581 /*
1582  =======================================================================================================================
1583  =======================================================================================================================
1584  */
1585 void CMainFrame::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) {
1586         // run through our list to see if we have a handler for nChar
1587
1588         for (int i = 0; i < g_nCommandCount; i++) {
1589                 if (g_Commands[i].m_nKey == nChar) {    // find a match?
1590                         bool    bGo = true;
1591                         if (g_Commands[i].m_nModifiers & RAD_PRESS) {
1592                                 int nModifiers = g_Commands[i].m_nModifiers &~RAD_PRESS;
1593                                 if (nModifiers) {                               // are there modifiers present?
1594                                         if (nModifiers & RAD_ALT) {
1595                                                 if (!(GetAsyncKeyState(VK_MENU) & 0x8000)) {
1596                                                         bGo = false;
1597                                                 }
1598                                         }
1599
1600                                         if (nModifiers & RAD_CONTROL) {
1601                                                 if (!(GetAsyncKeyState(VK_CONTROL) & 0x8000)) {
1602                                                         bGo = false;
1603                                                 }
1604                                         }
1605
1606                                         if (nModifiers & RAD_SHIFT) {
1607                                                 if (!(GetAsyncKeyState(VK_SHIFT) & 0x8000)) {
1608                                                         bGo = false;
1609                                                 }
1610                                         }
1611                                 }
1612                                 else {  // no modifiers make sure none of those keys are pressed
1613                                         if (GetAsyncKeyState(VK_MENU) & 0x8000) {
1614                                                 bGo = false;
1615                                         }
1616
1617                                         if (GetAsyncKeyState(VK_CONTROL) & 0x8000) {
1618                                                 bGo = false;
1619                                         }
1620
1621                                         if (GetAsyncKeyState(VK_SHIFT) & 0x8000) {
1622                                                 bGo = false;
1623                                         }
1624                                 }
1625
1626                                 if (bGo) {
1627                                         SendMessage(WM_COMMAND, g_Commands[i].m_nCommand, 0);
1628                                         break;
1629                                 }
1630                         }
1631                 }
1632         }
1633 }
1634
1635 /*
1636  =======================================================================================================================
1637  =======================================================================================================================
1638  */
1639 bool CamOK(unsigned int nKey) {
1640         if (nKey == VK_UP || nKey == VK_LEFT || nKey == VK_RIGHT || nKey == VK_DOWN) {
1641                 if (::GetAsyncKeyState(nKey)) {
1642                         return true;
1643                 }
1644                 else {
1645                         return false;
1646                 }
1647         }
1648
1649         return true;
1650 }
1651
1652 /*
1653  =======================================================================================================================
1654  =======================================================================================================================
1655  */
1656 void CMainFrame::OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) {
1657         // OnKeyDown(nChar, nRepCnt, nFlags);
1658         if (nChar == VK_DOWN) {
1659                 OnKeyDown(nChar, nRepCnt, nFlags);
1660         }
1661
1662         CFrameWnd::OnSysKeyDown(nChar, nRepCnt, nFlags);
1663 }
1664
1665 /*
1666  =======================================================================================================================
1667  =======================================================================================================================
1668  */
1669 void CMainFrame::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) {
1670
1671         for (int i = 0; i < g_nCommandCount; i++) {
1672                 if (g_Commands[i].m_nKey == nChar) {    // find a match?
1673                         // check modifiers
1674                         unsigned int    nState = 0;
1675                         if (GetAsyncKeyState(VK_MENU) & 0x8000) {
1676                                 nState |= RAD_ALT;
1677                         }
1678
1679                         if (GetAsyncKeyState(VK_CONTROL) & 0x8000) {
1680                                 nState |= RAD_CONTROL;
1681                         }
1682
1683                         if (GetAsyncKeyState(VK_SHIFT) & 0x8000) {
1684                                 nState |= RAD_SHIFT;
1685                         }
1686
1687                         if ((g_Commands[i].m_nModifiers & 0x7) == nState) {
1688                                 SendMessage(WM_COMMAND, g_Commands[i].m_nCommand, 0);
1689                                 break;
1690                         }
1691                 }
1692         }
1693
1694         CFrameWnd::OnKeyDown(nChar, nRepCnt, nFlags);
1695 }
1696
1697 /*
1698  =======================================================================================================================
1699  =======================================================================================================================
1700  */
1701 BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext *pContext) {
1702
1703         g_Inspectors = new CInspectorDialog( this );
1704         g_Inspectors->Create(IDD_DIALOG_INSPECTORS, this);
1705
1706         LoadWindowPlacement(g_Inspectors->GetSafeHwnd(), "radiant_InspectorsWindow");
1707         g_Inspectors->ShowWindow(SW_SHOW);
1708
1709         CRect r;
1710         g_Inspectors->GetWindowRect ( r );
1711
1712         //stupid hack to get the window resize itself properly
1713         r.DeflateRect(0,0,0,1);
1714         g_Inspectors->MoveWindow(r);    
1715         r.InflateRect(0,0,0,1);
1716         g_Inspectors->MoveWindow(r);
1717
1718
1719         if (!LoadWindowPlacement(GetSafeHwnd(), "radiant_MainWindowPlace")) {
1720         }
1721
1722         CRect rect(5, 25, 100, 100);
1723         CRect rctParent;
1724         GetClientRect(rctParent);
1725
1726         m_pCamWnd = new CCamWnd();
1727         m_pCamWnd->Create(CAMERA_WINDOW_CLASS, "", QE3_CHILDSTYLE, rect, this, 1234);
1728
1729         m_pZWnd = new CZWnd();
1730         m_pZWnd->Create(Z_WINDOW_CLASS, "", QE3_CHILDSTYLE, rect, this, 1238);
1731
1732         m_pXYWnd = new CXYWnd();
1733         m_pXYWnd->Create(XY_WINDOW_CLASS, "", QE3_CHILDSTYLE, rect, this, 1235);
1734         m_pXYWnd->SetViewType(XY);
1735
1736         m_pXZWnd = new CXYWnd();
1737         m_pXZWnd->Create(XY_WINDOW_CLASS, "", QE3_CHILDSTYLE, rect, this, 1236);
1738         m_pXZWnd->SetViewType(XZ);
1739
1740         m_pYZWnd = new CXYWnd();
1741         m_pYZWnd->Create(XY_WINDOW_CLASS, "", QE3_CHILDSTYLE, rect, this, 1237);
1742         m_pYZWnd->SetViewType(YZ);
1743
1744         m_pCamWnd->SetXYFriend(m_pXYWnd);
1745
1746         CRect   rctWork;
1747
1748         LoadWindowPlacement(m_pXYWnd->GetSafeHwnd(), "radiant_xywindow");
1749         LoadWindowPlacement(m_pXZWnd->GetSafeHwnd(), "radiant_xzwindow");
1750         LoadWindowPlacement(m_pYZWnd->GetSafeHwnd(), "radiant_yzwindow");
1751         LoadWindowPlacement(m_pCamWnd->GetSafeHwnd(), "radiant_camerawindow");
1752         LoadWindowPlacement(m_pZWnd->GetSafeHwnd(), "radiant_zwindow");
1753
1754         if (!g_PrefsDlg.m_bXZVis) {
1755                 m_pXZWnd->ShowWindow(SW_HIDE);
1756         }
1757
1758         if (!g_PrefsDlg.m_bYZVis) {
1759                 m_pYZWnd->ShowWindow(SW_HIDE);
1760         }
1761
1762         if (!g_PrefsDlg.m_bZVis) {
1763                 m_pZWnd->ShowWindow(SW_HIDE);
1764         }
1765
1766         CreateQEChildren();
1767
1768         if (m_pXYWnd) {
1769                 m_pXYWnd->SetActive(true);
1770         }
1771
1772         Texture_SetMode(g_qeglobals.d_savedinfo.iTexMenu);
1773
1774         g_Inspectors->SetMode(W_CONSOLE);
1775         return TRUE;
1776 }
1777
1778 CRect   g_rctOld(0, 0, 0, 0);
1779
1780 /*
1781  =======================================================================================================================
1782  =======================================================================================================================
1783  */
1784 void CMainFrame::OnSize(UINT nType, int cx, int cy) {
1785         CFrameWnd::OnSize(nType, cx, cy);
1786
1787         CRect   rctParent;
1788         GetClientRect(rctParent);
1789
1790         UINT    nID;
1791         UINT    nStyle;
1792         int             nWidth;
1793         if (m_wndStatusBar.GetSafeHwnd()) {
1794                 m_wndStatusBar.GetPaneInfo( 0, nID, nStyle, nWidth);
1795                 m_wndStatusBar.SetPaneInfo( 0, nID, nStyle, rctParent.Width() * 0.15f );
1796                 m_wndStatusBar.GetPaneInfo( 1, nID, nStyle, nWidth);
1797                 m_wndStatusBar.SetPaneInfo( 1, nID, nStyle, rctParent.Width() * 0.15f);
1798                 m_wndStatusBar.GetPaneInfo( 2, nID, nStyle, nWidth);
1799                 m_wndStatusBar.SetPaneInfo( 2, nID, nStyle, rctParent.Width() * 0.15f );
1800                 m_wndStatusBar.GetPaneInfo( 3, nID, nStyle, nWidth);
1801                 m_wndStatusBar.SetPaneInfo( 3, nID, nStyle, rctParent.Width() * 0.39f );
1802                 m_wndStatusBar.GetPaneInfo( 4, nID, nStyle, nWidth);
1803                 m_wndStatusBar.SetPaneInfo( 4, nID, nStyle, rctParent.Width() * 0.15f );
1804                 m_wndStatusBar.GetPaneInfo( 5, nID, nStyle, nWidth);
1805                 m_wndStatusBar.SetPaneInfo( 5, nID, nStyle, rctParent.Width() * 0.01f );
1806         }
1807 }
1808
1809 void    OpenDialog(void);
1810 void    SaveAsDialog(bool bRegion);
1811 void    Select_Ungroup();
1812
1813 /*
1814  =======================================================================================================================
1815  =======================================================================================================================
1816  */
1817 void CMainFrame::ToggleCamera() {
1818         if (m_bCamPreview) {
1819                 m_bCamPreview = false;
1820         }
1821         else {
1822                 m_bCamPreview = true;
1823         }
1824 }
1825
1826 /*
1827  =======================================================================================================================
1828  =======================================================================================================================
1829  */
1830 void CMainFrame::OnFileClose() {
1831 }
1832
1833 /*
1834  =======================================================================================================================
1835  =======================================================================================================================
1836  */
1837 void CMainFrame::OnFileExit() {
1838         PostMessage(WM_CLOSE, 0, 0L);
1839 }
1840
1841 /*
1842  =======================================================================================================================
1843  =======================================================================================================================
1844  */
1845 void CMainFrame::OnFileLoadproject() {
1846         if (ConfirmModified()) {
1847                 ProjectDialog();
1848         }
1849 }
1850
1851 /*
1852  =======================================================================================================================
1853  =======================================================================================================================
1854  */
1855 void CMainFrame::OnFileNew() {
1856         if (ConfirmModified()) {
1857                 Map_New();
1858         }
1859 }
1860
1861 /*
1862  =======================================================================================================================
1863  =======================================================================================================================
1864  */
1865 void CMainFrame::OnFileOpen() {
1866         if (ConfirmModified()) {
1867                 OpenDialog();
1868         }
1869 }
1870
1871 /*
1872  =======================================================================================================================
1873  =======================================================================================================================
1874  */
1875 void CMainFrame::OnFilePointfile() {
1876         if (g_qeglobals.d_pointfile_display_list) {
1877                 Pointfile_Clear();
1878         }
1879         else {
1880                 Pointfile_Check();
1881         }
1882         Sys_UpdateWindows(W_ALL);
1883 }
1884
1885 /*
1886  =======================================================================================================================
1887  =======================================================================================================================
1888  */
1889 void CMainFrame::OnFilePrint() {
1890 }
1891
1892 /*
1893  =======================================================================================================================
1894  =======================================================================================================================
1895  */
1896 void CMainFrame::OnFilePrintPreview() {
1897 }
1898
1899 /*
1900  =======================================================================================================================
1901  =======================================================================================================================
1902  */
1903 void CMainFrame::OnFileSave() {
1904         if (!strcmp(currentmap, "unnamed.map")) {
1905                 SaveAsDialog(false);
1906         }
1907         else {
1908                 Map_SaveFile(currentmap, false);
1909         }
1910
1911         // DHM - _D3XP
1912         SetTimer(QE_TIMER1, g_PrefsDlg.m_nAutoSave * 60 * 1000, NULL);
1913 }
1914
1915 /*
1916  =======================================================================================================================
1917  =======================================================================================================================
1918  */
1919 void CMainFrame::OnFileSaveas() {
1920         SaveAsDialog(false);
1921 }
1922
1923 /*
1924  =======================================================================================================================
1925  =======================================================================================================================
1926  */
1927 void CMainFrame::OnFileSaveCopy() {
1928         char aFile[260] = "\0";
1929         char aFilter[260] = "Map\0*.map\0\0";
1930         char aTitle[260] = "Save a Copy\0";
1931         OPENFILENAME afn;
1932
1933         memset( &afn, 0, sizeof(OPENFILENAME) );
1934
1935         CString strPath = ValueForKey(g_qeglobals.d_project_entity, "basepath");
1936         AddSlash(strPath);
1937         strPath += "maps";
1938         if (g_PrefsDlg.m_strMaps.GetLength() > 0) {
1939                 strPath += va("\\%s", g_PrefsDlg.m_strMaps);
1940         }
1941
1942         /* Place the terminating null character in the szFile. */
1943         aFile[0] = '\0';
1944
1945         /* Set the members of the OPENFILENAME structure. */
1946         afn.lStructSize = sizeof(OPENFILENAME);
1947         afn.hwndOwner = g_pParentWnd->GetSafeHwnd();
1948         afn.lpstrFilter = aFilter;
1949         afn.nFilterIndex = 1;
1950         afn.lpstrFile = aFile;
1951         afn.nMaxFile = sizeof(aFile);
1952         afn.lpstrFileTitle = NULL;
1953         afn.nMaxFileTitle = 0;
1954         afn.lpstrInitialDir = strPath;
1955         afn.lpstrTitle = aTitle;
1956         afn.Flags = OFN_SHOWHELP | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_OVERWRITEPROMPT;
1957
1958         /* Display the Open dialog box. */
1959         if (!GetSaveFileName(&afn)) {
1960                 return; // canceled
1961         }
1962
1963         DefaultExtension(afn.lpstrFile, ".map");
1964         Map_SaveFile(afn.lpstrFile, false);     // ignore region
1965
1966         // Set the title back to the current working map
1967         Sys_SetTitle(currentmap);
1968 }
1969
1970 /*
1971 ==================================================================================================
1972 */
1973 void CMainFrame::OnViewShowModels() {
1974         g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_MODELS;
1975
1976         Sys_UpdateWindows(W_ALL);
1977 }
1978
1979 /*
1980  =======================================================================================================================
1981  =======================================================================================================================
1982  */
1983 void CMainFrame::OnView100() {
1984         if (m_pXYWnd) {
1985                 m_pXYWnd->SetScale(1);
1986         }
1987
1988         if (m_pXZWnd) {
1989                 m_pXZWnd->SetScale(1);
1990         }
1991
1992         if (m_pYZWnd) {
1993                 m_pYZWnd->SetScale(1);
1994         }
1995
1996         Sys_UpdateWindows(W_XY | W_XY_OVERLAY);
1997 }
1998
1999 /*
2000  =======================================================================================================================
2001  =======================================================================================================================
2002  */
2003 void CMainFrame::OnViewCenter() {
2004         m_pCamWnd->Camera().angles[ROLL] = m_pCamWnd->Camera().angles[PITCH] = 0;
2005         m_pCamWnd->Camera().angles[YAW] = 22.5 * floor((m_pCamWnd->Camera().angles[YAW] + 11) / 22.5);
2006         Sys_UpdateWindows(W_CAMERA | W_XY_OVERLAY);
2007 }
2008
2009 /*
2010  =======================================================================================================================
2011  =======================================================================================================================
2012  */
2013 void CMainFrame::OnViewConsole() {
2014         g_Inspectors->SetMode(W_CONSOLE);
2015 }
2016
2017 /*
2018  =======================================================================================================================
2019  =======================================================================================================================
2020  */
2021 void CMainFrame::OnViewDownfloor() {
2022         m_pCamWnd->Cam_ChangeFloor(false);
2023 }
2024
2025 /*
2026  =======================================================================================================================
2027  =======================================================================================================================
2028  */
2029 void CMainFrame::OnViewEntity() {
2030         g_Inspectors->SetMode(W_ENTITY);
2031 }
2032
2033 void CMainFrame::OnViewMediaBrowser() {
2034         g_Inspectors->SetMode(W_MEDIA);
2035 }
2036
2037
2038
2039 /*
2040  =======================================================================================================================
2041  =======================================================================================================================
2042  */
2043 void CMainFrame::OnViewFront() {
2044         m_pXYWnd->SetViewType(YZ);
2045         m_pXYWnd->PositionView();
2046         Sys_UpdateWindows(W_XY);
2047 }
2048
2049 /*
2050  =======================================================================================================================
2051  =======================================================================================================================
2052  */
2053
2054 BOOL DoMru(HWND hWnd,WORD wId)
2055 {
2056         char szFileName[128];
2057         OFSTRUCT of;
2058         BOOL fExist;
2059
2060         GetMenuItem(g_qeglobals.d_lpMruMenu, wId, TRUE, szFileName, sizeof(szFileName));
2061
2062         // Test if the file exists.
2063
2064         fExist = OpenFile(szFileName ,&of,OF_EXIST) != HFILE_ERROR;
2065
2066         if (fExist) {
2067
2068                 // Place the file on the top of MRU.
2069                 AddNewItem(g_qeglobals.d_lpMruMenu,(LPSTR)szFileName);
2070
2071                 // Now perform opening this file !!!
2072                 Map_LoadFile (szFileName);      
2073         }
2074         else
2075                 // Remove the file on MRU.
2076                 DelMenuItem(g_qeglobals.d_lpMruMenu,wId,TRUE);
2077
2078         // Refresh the File menu.
2079         PlaceMenuMRUItem(g_qeglobals.d_lpMruMenu,GetSubMenu(GetMenu(hWnd),0),
2080                         ID_FILE_EXIT);
2081
2082         return fExist;
2083 }
2084
2085 void CMainFrame::OnMru(unsigned int nID) {
2086         // DHM - _D3XP
2087         if (ConfirmModified()) {
2088         DoMru(GetSafeHwnd(), nID);
2089 }
2090 }
2091
2092 /*
2093  =======================================================================================================================
2094  =======================================================================================================================
2095  */
2096 void CMainFrame::OnViewNearest(unsigned int nID) {
2097         Texture_SetMode(nID);
2098 }
2099
2100 /*
2101  =======================================================================================================================
2102  =======================================================================================================================
2103  */
2104 void CMainFrame::OnTextureWad(unsigned int nID) {
2105         Sys_BeginWait();
2106
2107         // FIXME: idMaterial Texture_ShowDirectory (nID);
2108         Sys_UpdateWindows(W_ALL);
2109 }
2110
2111 /*
2112  =======================================================================================================================
2113  =======================================================================================================================
2114  */
2115
2116 /*
2117 ============
2118 RunBsp
2119
2120 This is the new all-internal bsp
2121 ============
2122 */
2123 void RunBsp (const char *command) {
2124         char    sys[2048];
2125         char    name[2048];
2126         char    *in;
2127
2128         // bring the console window forward for feedback
2129         g_Inspectors->SetMode(W_CONSOLE);
2130
2131         // decide if we are doing a .map or a .reg
2132         strcpy (name, currentmap);
2133         if ( region_active ) {
2134                 Map_SaveFile (name, false);
2135                 StripExtension (name);
2136                 strcat (name, ".reg");
2137         }
2138
2139         if ( !Map_SaveFile ( name, region_active ) ) {
2140                 return;
2141         }
2142
2143         // name should be a full pathname, but we only
2144         // want to pass the maps/ part to dmap
2145         in = strstr(name, "maps/");
2146         if ( !in ) {
2147                 in = strstr(name, "maps\\");
2148         }
2149         if ( !in ) {
2150                 in = name;
2151         }
2152
2153         if (idStr::Icmpn(command, "bspext", strlen("runbsp")) == 0) {
2154                 PROCESS_INFORMATION ProcessInformation;
2155                 STARTUPINFO     startupinfo;
2156                 char buff[2048];
2157
2158                 idStr base = cvarSystem->GetCVarString( "fs_basepath" );
2159                 idStr cd = cvarSystem->GetCVarString( "fs_cdpath" );
2160                 idStr paths;
2161                 if (base.Length()) {
2162                         paths += "+set fs_basepath ";
2163                         paths += base;
2164                 }
2165                 if (cd.Length()) {
2166                         paths += "+set fs_cdpath ";
2167                         paths += cd;
2168                 }
2169
2170                 ::GetModuleFileName(AfxGetApp()->m_hInstance, buff, sizeof(buff));
2171                 if (strlen(command) > strlen("bspext")) {
2172                         idStr::snPrintf( sys, sizeof(sys), "%s %s +set r_fullscreen 0 +dmap editorOutput %s %s +quit", buff, paths.c_str(), command + strlen("bspext"), in );
2173                 } else {
2174                         idStr::snPrintf( sys, sizeof(sys), "%s %s +set r_fullscreen 0 +dmap editorOutput %s +quit", buff, paths.c_str(), in );
2175                 }
2176                 
2177                 ::GetStartupInfo (&startupinfo);
2178                 if (!CreateProcess(NULL, sys, NULL, NULL, FALSE, 0, NULL, NULL, &startupinfo, &ProcessInformation)) {
2179                         common->Printf("Could not start bsp process %s %s/n", buff, sys);  
2180                 }
2181                 g_pParentWnd->SetFocus();
2182
2183         } else { // assumes bsp is the command
2184                 if (strlen(command) > strlen("bsp")) {
2185                         idStr::snPrintf( sys, sizeof(sys), "dmap %s %s", command + strlen("bsp"), in );
2186                 } else {
2187                         idStr::snPrintf( sys, sizeof(sys), "dmap %s", in );
2188                 }
2189
2190                 cmdSystem->BufferCommandText( CMD_EXEC_NOW, "disconnect\n" );
2191
2192                 // issue the bsp command
2193                 Dmap_f( idCmdArgs( sys, false ) );
2194         }
2195 }
2196
2197 void CMainFrame::OnBspCommand(unsigned int nID) {
2198         if (g_PrefsDlg.m_bSnapShots && stricmp(currentmap, "unnamed.map") != 0) {
2199                 Map_Snapshot();
2200         }
2201
2202         RunBsp(bsp_commands[LOWORD(nID - CMD_BSPCOMMAND)]);
2203
2204         // DHM - _D3XP
2205         SetTimer(QE_TIMER1, g_PrefsDlg.m_nAutoSave * 60 * 1000, NULL);
2206 }
2207
2208 /*
2209  =======================================================================================================================
2210  =======================================================================================================================
2211  */
2212 void CMainFrame::OnViewShowblocks() {
2213         g_qeglobals.show_blocks = !(g_qeglobals.show_blocks);
2214         CheckMenuItem
2215         (
2216                 ::GetMenu(GetSafeHwnd()),
2217                 ID_VIEW_SHOWBLOCKS,
2218                 MF_BYCOMMAND | (g_qeglobals.show_blocks ? MF_CHECKED : MF_UNCHECKED)
2219         );
2220         Sys_UpdateWindows(W_XY);
2221 }
2222
2223 /*
2224  =======================================================================================================================
2225  =======================================================================================================================
2226  */
2227 void CMainFrame::OnViewShowclip() {
2228         if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CLIP) & EXCLUDE_CLIP) {
2229                 CheckMenuItem(::GetMenu(GetSafeHwnd()), ID_VIEW_SHOWCLIP, MF_BYCOMMAND | MF_UNCHECKED);
2230         }
2231         else {
2232                 CheckMenuItem(::GetMenu(GetSafeHwnd()), ID_VIEW_SHOWCLIP, MF_BYCOMMAND | MF_CHECKED);
2233         }
2234
2235         Sys_UpdateWindows(W_XY | W_CAMERA);
2236 }
2237
2238 /*
2239  =======================================================================================================================
2240  =======================================================================================================================
2241  */
2242 void CMainFrame::OnViewShowTriggers() {
2243         if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_TRIGGERS) & EXCLUDE_TRIGGERS) {
2244                 CheckMenuItem(::GetMenu(GetSafeHwnd()), ID_VIEW_SHOWTRIGGERS, MF_BYCOMMAND | MF_UNCHECKED);
2245         }
2246         else {
2247                 CheckMenuItem(::GetMenu(GetSafeHwnd()), ID_VIEW_SHOWTRIGGERS, MF_BYCOMMAND | MF_CHECKED);
2248         }
2249
2250         Sys_UpdateWindows(W_XY | W_CAMERA);
2251 }
2252
2253 /*
2254  =======================================================================================================================
2255  =======================================================================================================================
2256  */
2257 void CMainFrame::OnViewShowcoordinates() {
2258         g_qeglobals.d_savedinfo.show_coordinates ^= 1;
2259         CheckMenuItem
2260         (
2261                 ::GetMenu(GetSafeHwnd()),
2262                 ID_VIEW_SHOWCOORDINATES,
2263                 MF_BYCOMMAND | (g_qeglobals.d_savedinfo.show_coordinates ? MF_CHECKED : MF_UNCHECKED)
2264         );
2265         Sys_UpdateWindows(W_XY);
2266 }
2267
2268 /*
2269  =======================================================================================================================
2270  =======================================================================================================================
2271  */
2272 void CMainFrame::OnViewShowent() {
2273         if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_ENT) & EXCLUDE_ENT) {
2274                 CheckMenuItem(::GetMenu(GetSafeHwnd()), ID_VIEW_SHOWENT, MF_BYCOMMAND | MF_UNCHECKED);
2275         }
2276         else {
2277                 CheckMenuItem(::GetMenu(GetSafeHwnd()), ID_VIEW_SHOWENT, MF_BYCOMMAND | MF_CHECKED);
2278         }
2279
2280         Sys_UpdateWindows(W_XY | W_CAMERA);
2281 }
2282
2283 /*
2284  =======================================================================================================================
2285  =======================================================================================================================
2286  */
2287 void CMainFrame::OnViewShowlights() {
2288         if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIGHTS) & EXCLUDE_LIGHTS) {
2289                 CheckMenuItem(::GetMenu(GetSafeHwnd()), ID_VIEW_SHOWLIGHTS, MF_BYCOMMAND | MF_UNCHECKED);
2290         }
2291         else {
2292                 CheckMenuItem(::GetMenu(GetSafeHwnd()), ID_VIEW_SHOWLIGHTS, MF_BYCOMMAND | MF_CHECKED);
2293         }
2294
2295         Sys_UpdateWindows(W_XY | W_CAMERA);
2296 }
2297
2298 /*
2299  =======================================================================================================================
2300  =======================================================================================================================
2301  */
2302 void CMainFrame::OnViewShownames() {
2303         g_qeglobals.d_savedinfo.show_names = !(g_qeglobals.d_savedinfo.show_names);
2304         CheckMenuItem
2305         (
2306                 ::GetMenu(GetSafeHwnd()),
2307                 ID_VIEW_SHOWNAMES,
2308                 MF_BYCOMMAND | (g_qeglobals.d_savedinfo.show_names ? MF_CHECKED : MF_UNCHECKED)
2309         );
2310         Map_BuildBrushData();
2311         Sys_UpdateWindows(W_XY);
2312 }
2313
2314 /*
2315  =======================================================================================================================
2316  =======================================================================================================================
2317  */
2318 void CMainFrame::OnViewShowpath() {
2319         if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_PATHS) & EXCLUDE_PATHS) {
2320                 CheckMenuItem(::GetMenu(GetSafeHwnd()), ID_VIEW_SHOWPATH, MF_BYCOMMAND | MF_UNCHECKED);
2321         }
2322         else {
2323                 CheckMenuItem(::GetMenu(GetSafeHwnd()), ID_VIEW_SHOWPATH, MF_BYCOMMAND | MF_CHECKED);
2324         }
2325
2326         Sys_UpdateWindows(W_XY | W_CAMERA);
2327 }
2328
2329 /*
2330  =======================================================================================================================
2331  =======================================================================================================================
2332  */
2333 void CMainFrame::OnViewShowCombatNodes() {
2334         if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_COMBATNODES) & EXCLUDE_COMBATNODES) {
2335                 CheckMenuItem(::GetMenu(GetSafeHwnd()), ID_VIEW_SHOWCOMBATNODES, MF_BYCOMMAND | MF_UNCHECKED);
2336         }
2337         else {
2338                 CheckMenuItem(::GetMenu(GetSafeHwnd()), ID_VIEW_SHOWCOMBATNODES, MF_BYCOMMAND | MF_CHECKED);
2339         }
2340
2341         Sys_UpdateWindows(W_XY | W_CAMERA);
2342 }
2343
2344 /*
2345  =======================================================================================================================
2346  =======================================================================================================================
2347  */
2348 void CMainFrame::OnViewShowwater() {
2349         if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_DYNAMICS) & EXCLUDE_DYNAMICS) {
2350                 CheckMenuItem(::GetMenu(GetSafeHwnd()), ID_VIEW_SHOWWATER, MF_BYCOMMAND | MF_UNCHECKED);
2351         }
2352         else {
2353                 CheckMenuItem(::GetMenu(GetSafeHwnd()), ID_VIEW_SHOWWATER, MF_BYCOMMAND | MF_CHECKED);
2354         }
2355
2356         Sys_UpdateWindows(W_XY | W_CAMERA);
2357 }
2358
2359 /*
2360  =======================================================================================================================
2361  =======================================================================================================================
2362  */
2363 void CMainFrame::OnViewShowworld() {
2364         if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_WORLD) & EXCLUDE_WORLD) {
2365                 CheckMenuItem(::GetMenu(GetSafeHwnd()), ID_VIEW_SHOWWORLD, MF_BYCOMMAND | MF_UNCHECKED);
2366         }
2367         else {
2368                 CheckMenuItem(::GetMenu(GetSafeHwnd()), ID_VIEW_SHOWWORLD, MF_BYCOMMAND | MF_CHECKED);
2369         }
2370
2371         Sys_UpdateWindows(W_XY | W_CAMERA);
2372 }
2373
2374 /*
2375  =======================================================================================================================
2376  =======================================================================================================================
2377  */
2378 void CMainFrame::OnViewTexture() {
2379         g_Inspectors->SetMode(W_TEXTURE);
2380 }
2381
2382 /*
2383  =======================================================================================================================
2384  =======================================================================================================================
2385  */
2386 void CMainFrame::OnViewUpfloor() {
2387         m_pCamWnd->Cam_ChangeFloor(true);
2388 }
2389
2390 /*
2391  =======================================================================================================================
2392  =======================================================================================================================
2393  */
2394 void CMainFrame::OnViewXy() {
2395         m_pXYWnd->SetViewType(XY);
2396         m_pXYWnd->PositionView();
2397         Sys_UpdateWindows(W_XY);
2398 }
2399
2400 /*
2401  =======================================================================================================================
2402  =======================================================================================================================
2403  */
2404 void CMainFrame::OnViewZ100() {
2405         z.scale = 1;
2406         Sys_UpdateWindows(W_Z | W_Z_OVERLAY);
2407 }
2408
2409 /*
2410  =======================================================================================================================
2411  =======================================================================================================================
2412  */
2413 void CMainFrame::OnViewZoomin() {
2414         if ( m_pXYWnd && m_pXYWnd->Active() ) {
2415                 m_pXYWnd->SetScale( m_pXYWnd->Scale() * 5.0f / 4.0f );
2416                 if ( m_pXYWnd->Scale() > 256.0f ) {
2417                         m_pXYWnd->SetScale( 256.0f );
2418                 }
2419         }
2420
2421         if ( m_pXZWnd && m_pXZWnd->Active() ) {
2422                 m_pXZWnd->SetScale( m_pXZWnd->Scale() * 5.0f / 4.0f );
2423                 if ( m_pXZWnd->Scale() > 256.0f ) {
2424                         m_pXZWnd->SetScale( 256.0f );
2425                 }
2426         }
2427
2428         if ( m_pYZWnd && m_pYZWnd->Active() ) {
2429                 m_pYZWnd->SetScale( m_pYZWnd->Scale() * 5.0f / 4.0f );
2430                 if ( m_pYZWnd->Scale() > 256.0f ) {
2431                         m_pYZWnd->SetScale( 256.0f );
2432                 }
2433         }
2434
2435         Sys_UpdateWindows( W_XY | W_XY_OVERLAY );
2436 }
2437
2438 /*
2439  =======================================================================================================================
2440  =======================================================================================================================
2441  */
2442 void CMainFrame::OnViewZoomout() {
2443         if ( m_pXYWnd && m_pXYWnd->Active() ) {
2444                 m_pXYWnd->SetScale( m_pXYWnd->Scale() * 4.0f / 5.0f );
2445                 if ( m_pXYWnd->Scale() < 0.1f / 32.0f ) {
2446                         m_pXYWnd->SetScale( 0.1f / 32.0f );
2447                 }
2448         }
2449
2450         if ( m_pXZWnd && m_pXZWnd->Active() ) {
2451                 m_pXZWnd->SetScale( m_pXZWnd->Scale() * 4.0f / 5.0f );
2452                 if ( m_pXZWnd->Scale() < 0.1f / 32.0f ) {
2453                         m_pXZWnd->SetScale( 0.1f / 32.0f );
2454                 }
2455         }
2456
2457         if ( m_pYZWnd && m_pYZWnd->Active() ) {
2458                 m_pYZWnd->SetScale( m_pYZWnd->Scale() * 4.0f / 5.0f );
2459                 if ( m_pYZWnd->Scale() < 0.1f / 32.0f ) {
2460                         m_pYZWnd->SetScale( 0.1f / 32.0f );
2461                 }
2462         }
2463
2464         Sys_UpdateWindows(W_XY | W_XY_OVERLAY);
2465 }
2466
2467 /*
2468  =======================================================================================================================
2469  =======================================================================================================================
2470  */
2471 void CMainFrame::OnViewZzoomin() {
2472         z.scale *= 5.0f / 4.0f;
2473         if ( z.scale > 4.0f ) {
2474                 z.scale = 4.0f;
2475         }
2476
2477         Sys_UpdateWindows(W_Z | W_Z_OVERLAY);
2478 }
2479
2480 /*
2481  =======================================================================================================================
2482  =======================================================================================================================
2483  */
2484 void CMainFrame::OnViewZzoomout() {
2485         z.scale *= 4.0f / 5.0f;
2486         if ( z.scale < 0.125f ) {
2487                 z.scale = 0.125f;
2488         }
2489
2490         Sys_UpdateWindows(W_Z | W_Z_OVERLAY);
2491 }
2492
2493 /*
2494  =======================================================================================================================
2495  =======================================================================================================================
2496  */
2497 void CMainFrame::OnViewSide() {
2498         m_pXYWnd->SetViewType(XZ);
2499         m_pXYWnd->PositionView();
2500         Sys_UpdateWindows(W_XY);
2501 }
2502
2503 static void UpdateGrid(void)
2504 {
2505         // g_qeglobals.d_gridsize = 1 << g_qeglobals.d_gridsize;
2506         if (g_PrefsDlg.m_bSnapTToGrid) {
2507                 g_qeglobals.d_savedinfo.m_nTextureTweak = g_qeglobals.d_gridsize;
2508         }
2509 }
2510
2511 /*
2512  =======================================================================================================================
2513  =======================================================================================================================
2514  */
2515 void CMainFrame::OnGrid1(unsigned int nID) {
2516         switch (nID)
2517         {
2518                 case ID_GRID_1:
2519                         g_qeglobals.d_gridsize = 1;
2520                         break;
2521                 case ID_GRID_2:
2522                         g_qeglobals.d_gridsize = 2;
2523                         break;
2524                 case ID_GRID_4:
2525                         g_qeglobals.d_gridsize = 4;
2526                         break;
2527                 case ID_GRID_8:
2528                         g_qeglobals.d_gridsize = 8;
2529                         break;
2530                 case ID_GRID_16:
2531                         g_qeglobals.d_gridsize = 16;
2532                         break;
2533                 case ID_GRID_32:
2534                         g_qeglobals.d_gridsize = 32;
2535                         break;
2536                 case ID_GRID_64:
2537                         g_qeglobals.d_gridsize = 64;
2538                         break;
2539                 case ID_GRID_POINT5:
2540                         g_qeglobals.d_gridsize = 0.5f;
2541                         break;
2542                 case ID_GRID_POINT25:
2543                         g_qeglobals.d_gridsize = 0.25f;
2544                         break;
2545                 case ID_GRID_POINT125:
2546                         g_qeglobals.d_gridsize = 0.125f;
2547                         break;
2548                 //case ID_GRID_POINT0625:
2549                 //      g_qeglobals.d_gridsize = 0.0625f;
2550                 //      break;
2551         }
2552
2553         UpdateGrid();
2554
2555         SetGridStatus();
2556         SetGridChecks(nID);
2557         Sys_UpdateWindows(W_XY | W_Z);
2558 }
2559
2560 /*
2561  =======================================================================================================================
2562  =======================================================================================================================
2563  */
2564 void CMainFrame::OnTexturesShowinuse() {
2565         Sys_BeginWait();
2566         Texture_ShowInuse();
2567         g_Inspectors->texWnd.RedrawWindow();
2568 }
2569
2570 // from TexWnd.cpp
2571 extern bool texture_showinuse;
2572
2573 /*
2574  =======================================================================================================================
2575  =======================================================================================================================
2576  */
2577 void CMainFrame::OnUpdateTexturesShowinuse(CCmdUI *pCmdUI) {
2578         pCmdUI->SetCheck(texture_showinuse);
2579 }
2580
2581 /*
2582  =======================================================================================================================
2583  =======================================================================================================================
2584  */
2585 void CMainFrame::OnTexturesInspector() {
2586         DoSurface();
2587 }
2588
2589 /*
2590  =======================================================================================================================
2591  =======================================================================================================================
2592  */
2593 void CMainFrame::OnMiscFindbrush() {
2594         DoFind();
2595 }
2596
2597 /*
2598  =======================================================================================================================
2599  =======================================================================================================================
2600  */
2601 void CMainFrame::OnMiscGamma() {
2602         float   fSave = g_qeglobals.d_savedinfo.fGamma;
2603         DoGamma();
2604         if (fSave != g_qeglobals.d_savedinfo.fGamma) {
2605                 MessageBox("You must restart Q3Radiant for Gamma settings to take place");
2606         }
2607 }
2608
2609 /*
2610  =======================================================================================================================
2611  =======================================================================================================================
2612  */
2613 void CMainFrame::OnMiscNextleakspot() {
2614         Pointfile_Next();
2615 }
2616
2617 /*
2618  =======================================================================================================================
2619  =======================================================================================================================
2620  */
2621 void CMainFrame::OnMiscPreviousleakspot() {
2622         Pointfile_Prev();
2623 }
2624
2625 /*
2626  =======================================================================================================================
2627  =======================================================================================================================
2628  */
2629 void CMainFrame::OnMiscPrintxy() {
2630         WXY_Print();
2631 }
2632
2633 /*
2634  =======================================================================================================================
2635  =======================================================================================================================
2636  */
2637
2638 void UpdateRadiantColor( float r, float g, float b, float a ) {
2639         if ( g_pParentWnd ) {
2640                 g_pParentWnd->RoutineProcessing();
2641         }
2642 }
2643
2644 bool DoColor( int iIndex ) {
2645         COLORREF cr = (int)(g_qeglobals.d_savedinfo.colors[iIndex][0]*255) +
2646                                 (((int)(g_qeglobals.d_savedinfo.colors[iIndex][1]*255))<<8) +
2647                                         (((int)(g_qeglobals.d_savedinfo.colors[iIndex][2]*255))<<16);
2648
2649         CDialogColorPicker dlg(cr);
2650
2651         dlg.UpdateParent = UpdateRadiantColor;
2652
2653         if ( dlg.DoModal() == IDOK ) {
2654                 g_qeglobals.d_savedinfo.colors[iIndex][0] = (dlg.GetColor() & 255)/255.0;
2655                 g_qeglobals.d_savedinfo.colors[iIndex][1] = ((dlg.GetColor() >> 8)&255)/255.0;
2656                 g_qeglobals.d_savedinfo.colors[iIndex][2] = ((dlg.GetColor() >> 16)&255)/255.0;
2657
2658                 Sys_UpdateWindows (W_ALL);
2659                 return true;
2660         } else {
2661                 return false;
2662         }
2663 }
2664
2665 /*
2666  =======================================================================================================================
2667  =======================================================================================================================
2668  */
2669 extern void Select_SetKeyVal(const char *key, const char *val);
2670 void CMainFrame::OnMiscSelectentitycolor() {
2671
2672         entity_t *ent = NULL;
2673         if (QE_SingleBrush(true, true)) {
2674                 ent = selected_brushes.next->owner;
2675                 CString strColor = ValueForKey(ent, "_color");
2676                 if (strColor.GetLength() > 0) {
2677                         float   fR, fG, fB;
2678                         int             n = sscanf(strColor, "%f %f %f", &fR, &fG, &fB);
2679                         if (n == 3) {
2680                                 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][0] = fR;
2681                                 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][1] = fG;
2682                                 g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][2] = fB;
2683                         }
2684                 }
2685         }
2686
2687         if (DoColor(COLOR_ENTITY)) {
2688                 char    buffer[100];
2689                 sprintf(buffer, "%f %f %f", g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][0], g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][1],g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][2]);
2690                 Select_SetKeyVal("_color", buffer);
2691                 if (ent) {
2692                         g_Inspectors->UpdateEntitySel(ent->eclass);
2693                 }
2694                 Sys_UpdateWindows(W_ALL);
2695         }
2696 }
2697
2698 CString strFindKey;
2699 CString strFindValue;
2700 CString strReplaceKey;
2701 CString strReplaceValue;
2702 bool    gbWholeStringMatchOnly = true;
2703 bool    gbSelectAllMatchingEnts= false;
2704 brush_t* gpPrevEntBrushFound = NULL;
2705
2706 // all this because there's no ansi stristr(), sigh...
2707 //
2708 LPCSTR String_ToLower(LPCSTR psString)
2709 {
2710         const int iBufferSize = 4096;
2711         static char sString[8][iBufferSize];
2712         static int iIndex=0;
2713
2714         if (strlen(psString)>=iBufferSize)
2715         {
2716                 assert(0);
2717                 common->Printf("String_ToLower(): Warning, input string was %d bytes too large, performing strlwr() inline!\n",strlen(psString)-(iBufferSize-1));
2718                 return strlwr(const_cast<char*>(psString));
2719         }
2720
2721         iIndex = ++ iIndex & 7;
2722
2723         strcpy(sString[iIndex],psString);
2724         strlwr(sString[iIndex]);
2725
2726         return sString[iIndex];
2727 }
2728
2729
2730 bool FindNextBrush(brush_t* pPrevFoundBrush)    // can be NULL for fresh search
2731 {       
2732         bool bFoundSomething = false;
2733         entity_t *pLastFoundEnt;
2734         brush_t  *pLastFoundBrush;
2735
2736         CWaitCursor waitcursor;
2737
2738         Select_Deselect(true);  // bool bDeSelectToListBack
2739
2740         // see whether to start search from prev_brush->next by checking if prev_brush is still in the active list...
2741         //
2742         brush_t *pStartBrush = active_brushes.next;
2743
2744         if (pPrevFoundBrush && !gbSelectAllMatchingEnts)
2745         {
2746                 brush_t *pPrev = NULL;
2747                 for (brush_t* b = active_brushes.next ; b != &active_brushes ; b = b->next)
2748                 {
2749                         if (pPrev == pPrevFoundBrush && pPrevFoundBrush)
2750                         {
2751                                 pStartBrush = b;
2752                                 break;
2753                         }
2754                         pPrev = b;
2755                 }
2756         }
2757
2758         // now do the search proper...
2759         //      
2760         int iBrushesScanned = 0;
2761         int iBrushesSelected=0;
2762         int iEntsScanned = 0;
2763
2764         brush_t* pNextBrush;            
2765         for (brush_t* b = pStartBrush; b != &active_brushes ; b = pNextBrush)
2766         {       
2767                 // setup the <nextbrush> ptr before going any further (because selecting a brush down below moves it to a 
2768                 //      different link list), but we need to ensure that the next brush has a different ent-owner than the current
2769                 //      one, or multi-brush ents will confuse the list process if they get selected (infinite loop badness)...
2770                 //
2771                 // pNextBrush = &active_brushes;        // default to loop-stop condition
2772                 pNextBrush = b->next;
2773                 while (pNextBrush->owner == b->owner && pNextBrush!=&active_brushes)
2774                 {
2775                         pNextBrush = pNextBrush->next;
2776                 }
2777
2778                 iBrushesScanned++;
2779
2780                 // a simple progress bar so they don't think it's locked up on long searches...
2781                 //
2782                 static int iDotBodge=0;
2783                 if (!(++iDotBodge&15))
2784                         common->Printf(".");    // cut down on printing         
2785
2786                 bool bMatch = false;
2787                 entity_t* ent = b->owner;
2788
2789                 if (ent && ent!= world_entity)  // needed!
2790                 {
2791                         iEntsScanned++;
2792                         if (FilterBrush (b))
2793                                 continue;                       
2794
2795                         // only check the find-key if there was one specified...
2796                         //
2797                         if (!strFindKey.IsEmpty())
2798                         {
2799                                 const char *psEntFoundValue = ValueForKey(ent, strFindKey);
2800
2801                                 if (strlen(psEntFoundValue)
2802                                                 &&
2803                                                 (
2804 //                                                      (stricmp(strFindValue, psEntFoundValue)==0)     // found this exact key/value
2805                                                         (
2806                                                         (gbWholeStringMatchOnly && stricmp(psEntFoundValue, strFindValue)==0)
2807                                                         ||
2808                                                         (!gbWholeStringMatchOnly && strstr(String_ToLower(psEntFoundValue), String_ToLower(strFindValue)))
2809                                                         )
2810                                                         ||                                                                                      //  or
2811                                                         (strFindValue.IsEmpty())                                        // any value for this key if blank value search specified
2812                                                 )
2813                                         )
2814                                 {
2815                                         bMatch = true;
2816                                 }
2817                         }
2818                         else
2819                         {
2820                                 // no FIND key specified, so just scan all of them...
2821                                 //
2822                                 int iNumEntKeys = GetNumKeys(ent);
2823                                 for (int i=0; i<iNumEntKeys; i++)
2824                                 {
2825                                         const char *psEntFoundValue = ValueForKey(ent, GetKeyString(ent, i));
2826                                         if (psEntFoundValue)
2827                                         {
2828                                                 if (    (strlen(psEntFoundValue) &&     strFindValue.IsEmpty()) // if blank <value> search specified then any found-value is ok
2829                                                                 ||
2830                                                                 (gbWholeStringMatchOnly && stricmp(psEntFoundValue, strFindValue)==0)
2831                                                                 ||
2832                                                                 (!gbWholeStringMatchOnly && strstr(String_ToLower(psEntFoundValue), String_ToLower(strFindValue)))
2833                                                         )
2834                                                 {
2835                                                         if (!gbWholeStringMatchOnly && strstr(String_ToLower(psEntFoundValue), String_ToLower(strFindValue)))
2836                                                         {
2837 //                                                              OutputDebugString(va("Matching because: psEntFoundValue '%s' & strFindValue '%s'\n",psEntFoundValue, strFindValue));
2838 //                                                              Sys_Printf("Matching because: psEntFoundValue '%s' & strFindValue '%s'\n",psEntFoundValue, strFindValue);
2839
2840 //                                                              if (strstr(psEntFoundValue,"killsplat"))
2841 //                                                              {
2842 //                                                                      DebugBreak();
2843 //                                                              }
2844                                                         }
2845                                                         bMatch = true;
2846                                                         break;
2847                                                 }
2848                                         }
2849                                 }
2850                         }
2851
2852                         if (bMatch)
2853                         {
2854                                 bFoundSomething = true;
2855                                 pLastFoundEnt   = ent;
2856                                 pLastFoundBrush = b;
2857                                 iBrushesSelected++;
2858
2859                                 g_bScreenUpdates = false;       // !!!!!!!!!!!!!!!!!!!!!!!!!!!!
2860                                 
2861                                         Select_Brush(b);
2862
2863                                 g_bScreenUpdates = true;        // !!!!!!!!!!!!!!!!!!!!!!!!!!!!
2864
2865                                 if (!gbSelectAllMatchingEnts)
2866                                         break;
2867                         }
2868                 }
2869         }
2870         if (gbSelectAllMatchingEnts)
2871         {
2872                 common->Printf("\nBrushes Selected: %d           (Brushes Scanned %d, Ents Scanned %d)\n", iBrushesSelected, iBrushesScanned, iEntsScanned);
2873         }
2874
2875         if (bFoundSomething)
2876         {
2877                 idVec3 v3Origin;
2878
2879                 if (pLastFoundEnt->origin[0] != 0.0f || pLastFoundEnt->origin[1] != 0.0f || pLastFoundEnt->origin[2] != 0.0f)
2880                 {
2881                         VectorCopy(pLastFoundEnt->origin,v3Origin);
2882                 }
2883                 else
2884                 {
2885                         // pLastFoundEnt's origin is zero, so use average point of brush mins maxs instead...
2886                         //
2887                         v3Origin[0] = (pLastFoundBrush->mins[0] + pLastFoundBrush->maxs[0])/2;
2888                         v3Origin[1] = (pLastFoundBrush->mins[1] + pLastFoundBrush->maxs[1])/2;
2889                         v3Origin[2] = (pLastFoundBrush->mins[2] + pLastFoundBrush->maxs[2])/2;
2890                 }
2891
2892                 // got one, jump the camera to it...
2893                 //
2894                 VectorCopy(v3Origin, g_pParentWnd->GetCamera()->Camera().origin);
2895                                                          g_pParentWnd->GetCamera()->Camera().origin[1] -= 32;   // back off a touch to look at it
2896                 g_pParentWnd->GetCamera()->Camera().angles[0] = 0;
2897                 g_pParentWnd->GetCamera()->Camera().angles[1] = 90;
2898                 g_pParentWnd->GetCamera()->Camera().angles[2] = 0;
2899
2900                 // force main screen into XY camera mode (just in case)...
2901                 //
2902                 g_pParentWnd->SetActiveXY(g_pParentWnd->GetXYWnd());
2903                 g_pParentWnd->GetXYWnd()->PositionView();
2904
2905                 Sys_UpdateWindows (W_ALL);
2906                 //
2907                 // and record for next find request (F3)...
2908                 //
2909                 gpPrevEntBrushFound = pLastFoundBrush;
2910         }
2911
2912         return bFoundSomething;
2913 }
2914
2915
2916 void CMainFrame::OnMiscFindOrReplaceEntity()
2917 {
2918         CEntKeyFindReplace FindReplace(&strFindKey, &strFindValue, &strReplaceKey, &strReplaceValue, &gbWholeStringMatchOnly, &gbSelectAllMatchingEnts);
2919         switch (FindReplace.DoModal())
2920         {
2921                 case ID_RET_REPLACE:
2922                 {       
2923                         brush_t* next = NULL;
2924                         int iOccurences = 0;
2925                         for (brush_t* b = active_brushes.next ; b != &active_brushes ; b = next)
2926                         {
2927                                 next = b->next; // important to do this here, in case brush gets linked to a different list
2928                                 entity_t* ent = b->owner;
2929
2930                                 if (ent)        // needed!
2931                                 {
2932                                         if (FilterBrush (b))
2933                                                 continue;
2934
2935                                         const char *psEntFoundValue = ValueForKey(ent, strFindKey);
2936
2937                                         if (stricmp(strFindValue, psEntFoundValue)==0 ||                // found this exact key/value
2938                                                 (strlen(psEntFoundValue) &&     strFindValue.IsEmpty()) // or any value for this key if blank value search specified
2939                                                 )
2940                                         {
2941                                                 // found this search key/value, so delete it...
2942                                                 //
2943                                                 DeleteKey(ent,strFindKey);
2944                                                 //
2945                                                 // and replace with the new key/value (if specified)...
2946                                                 //
2947                                                 if (!strReplaceKey.IsEmpty() && !strReplaceValue.IsEmpty())
2948                                                 {
2949                                                         SetKeyValue (ent, strReplaceKey, strReplaceValue);
2950                                                 }
2951                                                 iOccurences++;
2952                                         }
2953                                 }
2954                         }
2955                         if (iOccurences)
2956                         {
2957                                 common->Printf("%d occurence(s) replaced\n",iOccurences);
2958                         }
2959                         else
2960                         {
2961                                 common->Printf("Nothing found to replace\n");
2962                         }
2963                 }
2964                 break;
2965                 case ID_RET_FIND:
2966                 {
2967                         gpPrevEntBrushFound = NULL;
2968                         FindNextBrush(NULL);
2969                 }
2970                 break;
2971         }
2972 }
2973 void CMainFrame::OnMiscFindNextEntity()
2974 {
2975         // try it once, if it fails, try it again from top, and give up if still failed after that...
2976         //
2977         if (!FindNextBrush(gpPrevEntBrushFound))
2978         {
2979                 gpPrevEntBrushFound = NULL;
2980                 FindNextBrush(NULL);
2981         }
2982 }
2983
2984 void CMainFrame::OnMiscSetViewPos()
2985 {
2986         CString psNewCoords = GetString("Input coords (x y z [rot])\n\nUse spaces to seperate numbers");
2987         if (!psNewCoords.IsEmpty())
2988         {
2989                 idVec3 v3Viewpos;
2990                 float fYaw = 0;
2991
2992                 psNewCoords.Remove(',');
2993                 int iArgsFound = sscanf(psNewCoords,"%f %f %f",&v3Viewpos[0], &v3Viewpos[1], &v3Viewpos[2]);
2994                 if (iArgsFound == 3)
2995                 {
2996                         // try for an optional 4th (note how this wasn't part of the sscanf() above, so I can check 1st-3, not just any 3)
2997                         //
2998                         int iArgsFound = sscanf(psNewCoords,"%f %f %f %f", &v3Viewpos[0], &v3Viewpos[1], &v3Viewpos[2], &fYaw);
2999                         if (iArgsFound != 4)
3000                         {
3001                                 fYaw = 0;       // jic
3002                         }
3003
3004                         g_pParentWnd->GetCamera()->Camera().angles[YAW] = fYaw;
3005                         VectorCopy (v3Viewpos, g_pParentWnd->GetCamera()->Camera().origin);
3006                         VectorCopy (v3Viewpos, g_pParentWnd->GetXYWnd()->GetOrigin());
3007                         Sys_UpdateWindows (W_ALL);
3008                 }
3009                 else
3010                 {
3011                         ErrorBox(va("\"%s\" wasn't 3 valid floats with spaces",psNewCoords));
3012                 }
3013         }
3014 }
3015
3016 /*
3017  =======================================================================================================================
3018  =======================================================================================================================
3019  */
3020 void CMainFrame::OnTexturebk() {
3021         DoColor(COLOR_TEXTUREBACK);
3022         Sys_UpdateWindows(W_ALL);
3023 }
3024
3025 /*
3026  =======================================================================================================================
3027  =======================================================================================================================
3028  */
3029 void CMainFrame::OnColorsMajor() {
3030         DoColor(COLOR_GRIDMAJOR);
3031         Sys_UpdateWindows(W_ALL);
3032 }
3033
3034 /*
3035  =======================================================================================================================
3036  =======================================================================================================================
3037  */
3038 void CMainFrame::OnColorsMinor() {
3039         DoColor(COLOR_GRIDMINOR);
3040         Sys_UpdateWindows(W_ALL);
3041 }
3042
3043 /*
3044  =======================================================================================================================
3045  =======================================================================================================================
3046  */
3047 void CMainFrame::OnColorsXybk() {
3048         DoColor(COLOR_GRIDBACK);
3049         Sys_UpdateWindows(W_ALL);
3050 }
3051
3052 /*
3053  =======================================================================================================================
3054  =======================================================================================================================
3055  */
3056 void CMainFrame::OnBrush3sided() {
3057         Undo_Start("3 sided");
3058         Undo_AddBrushList(&selected_brushes);
3059         Brush_MakeSided(3);
3060         Undo_EndBrushList(&selected_brushes);
3061         Undo_End();
3062 }
3063
3064 /*
3065  =======================================================================================================================
3066  =======================================================================================================================
3067  */
3068 void CMainFrame::OnBrush4sided() {
3069         Undo_Start("4 sided");
3070         Undo_AddBrushList(&selected_brushes);
3071         Brush_MakeSided(4);
3072         Undo_EndBrushList(&selected_brushes);
3073         Undo_End();
3074 }
3075
3076 /*
3077  =======================================================================================================================
3078  =======================================================================================================================
3079  */
3080 void CMainFrame::OnBrush5sided() {
3081         Undo_Start("5 sided");
3082         Undo_AddBrushList(&selected_brushes);
3083         Brush_MakeSided(5);
3084         Undo_EndBrushList(&selected_brushes);
3085         Undo_End();
3086 }
3087
3088 /*
3089  =======================================================================================================================
3090  =======================================================================================================================
3091  */
3092 void CMainFrame::OnBrush6sided() {
3093         Undo_Start("6 sided");
3094         Undo_AddBrushList(&selected_brushes);
3095         Brush_MakeSided(6);
3096         Undo_EndBrushList(&selected_brushes);
3097         Undo_End();
3098 }
3099
3100 /*
3101  =======================================================================================================================
3102  =======================================================================================================================
3103  */
3104 void CMainFrame::OnBrush7sided() {
3105         Undo_Start("7 sided");
3106         Undo_AddBrushList(&selected_brushes);
3107         Brush_MakeSided(7);
3108         Undo_EndBrushList(&selected_brushes);
3109         Undo_End();
3110 }
3111
3112 /*
3113  =======================================================================================================================
3114  =======================================================================================================================
3115  */
3116 void CMainFrame::OnBrush8sided() {
3117         Undo_Start("8 sided");
3118         Undo_AddBrushList(&selected_brushes);
3119         Brush_MakeSided(8);
3120         Undo_EndBrushList(&selected_brushes);
3121         Undo_End();
3122 }
3123
3124 /*
3125  =======================================================================================================================
3126  =======================================================================================================================
3127  */
3128 void CMainFrame::OnBrush9sided() {
3129         Undo_Start("9 sided");
3130         Undo_AddBrushList(&selected_brushes);
3131         Brush_MakeSided(9);
3132         Undo_EndBrushList(&selected_brushes);
3133         Undo_End();
3134 }
3135
3136 /*
3137  =======================================================================================================================
3138  =======================================================================================================================
3139  */
3140 void CMainFrame::OnBrushArbitrarysided() {
3141         Undo_Start("arbitrary sided");
3142         Undo_AddBrushList(&selected_brushes);
3143         DoSides();
3144         Undo_EndBrushList(&selected_brushes);
3145         Undo_End();
3146 }
3147
3148 /*
3149  =======================================================================================================================
3150  =======================================================================================================================
3151  */
3152 void CMainFrame::OnBrushFlipx() {
3153         Undo_Start("flip X");
3154         Undo_AddBrushList(&selected_brushes);
3155
3156         Select_FlipAxis(0);
3157         for (brush_t * b = selected_brushes.next; b != &selected_brushes; b = b->next) {
3158                 if (b->owner->eclass->fixedsize) {
3159                         char    buf[16];
3160                         float   a = FloatForKey(b->owner, "angle");
3161                         a = div((180 - a), 180).rem;
3162                         SetKeyValue(b->owner, "angle", itoa(a, buf, 10));
3163                         Brush_Build(b);
3164                 }
3165         }
3166     Patch_ToggleInverted();
3167         Undo_EndBrushList(&selected_brushes);
3168         Undo_End();
3169 }
3170
3171 /*
3172  =======================================================================================================================
3173  =======================================================================================================================
3174  */
3175 void CMainFrame::OnBrushFlipy() {
3176         Undo_Start("flip Y");
3177         Undo_AddBrushList(&selected_brushes);
3178
3179         Select_FlipAxis(1);
3180         for (brush_t * b = selected_brushes.next; b != &selected_brushes; b = b->next) {
3181                 if (b->owner->eclass->fixedsize) {
3182                         float   a = FloatForKey(b->owner, "angle");
3183                         if (a == 0 || a == 180 || a == 360) {
3184                                 continue;
3185                         }
3186
3187                         if (a == 90 || a == 270) {
3188                                 a += 180;
3189                         }
3190                         else if (a > 270) {
3191                                 a += 90;
3192                         }
3193                         else if (a > 180) {
3194                                 a -= 90;
3195                         }
3196                         else if (a > 90) {
3197                                 a += 90;
3198                         }
3199                         else {
3200                                 a -= 90;
3201                         }
3202
3203                         a = (int)a % 360;
3204
3205                         char    buf[16];
3206                         SetKeyValue(b->owner, "angle", itoa(a, buf, 10));
3207                         Brush_Build(b);
3208                 }
3209         }
3210     Patch_ToggleInverted();
3211         Undo_EndBrushList(&selected_brushes);
3212         Undo_End();
3213 }
3214
3215 /*
3216  =======================================================================================================================
3217  =======================================================================================================================
3218  */
3219 void CMainFrame::OnBrushFlipz() {
3220         Undo_Start("flip Z");
3221         Undo_AddBrushList(&selected_brushes);
3222         Select_FlipAxis(2);
3223         Patch_ToggleInverted();
3224         Undo_EndBrushList(&selected_brushes);
3225         Undo_End();
3226 }
3227
3228 /*
3229  =======================================================================================================================
3230  =======================================================================================================================
3231  */
3232 void CMainFrame::OnBrushRotatex() {
3233         Undo_Start("rotate X");
3234         Undo_AddBrushList(&selected_brushes);
3235         Select_RotateAxis(0, 90);
3236         Undo_EndBrushList(&selected_brushes);
3237         Undo_End();
3238 }
3239
3240 /*
3241  =======================================================================================================================
3242  =======================================================================================================================
3243  */
3244 void CMainFrame::OnBrushRotatey() {
3245         Undo_Start("rotate Y");
3246         Undo_AddBrushList(&selected_brushes);
3247         Select_RotateAxis(1, 90);
3248         Undo_EndBrushList(&selected_brushes);
3249         Undo_End();
3250 }
3251
3252 /*
3253  =======================================================================================================================
3254  =======================================================================================================================
3255  */
3256 void CMainFrame::OnBrushRotatez() {
3257         Undo_Start("rotate Z");
3258         Undo_AddBrushList(&selected_brushes);
3259         Select_RotateAxis(2, 90);
3260         Undo_EndBrushList(&selected_brushes);
3261         Undo_End();
3262 }
3263
3264 /*
3265  =======================================================================================================================
3266  =======================================================================================================================
3267  */
3268 void CMainFrame::OnRegionOff() {
3269         Map_RegionOff();
3270 }
3271
3272 /*
3273  =======================================================================================================================
3274  =======================================================================================================================
3275  */
3276 void CMainFrame::OnRegionSetbrush() {
3277         Map_RegionBrush();
3278 }
3279
3280 /*
3281  =======================================================================================================================
3282  =======================================================================================================================
3283  */
3284 void CMainFrame::OnRegionSetselection() {
3285         Map_RegionSelectedBrushes();
3286 }
3287
3288 /*
3289  =======================================================================================================================
3290  =======================================================================================================================
3291  */
3292 void CMainFrame::OnRegionSettallbrush() {
3293         Map_RegionTallBrush();
3294 }
3295
3296 /*
3297  =======================================================================================================================
3298  =======================================================================================================================
3299  */
3300 void CMainFrame::OnRegionSetxy() {
3301         Map_RegionXY();
3302 }
3303
3304 /*
3305  =======================================================================================================================
3306  =======================================================================================================================
3307  */
3308 void CMainFrame::OnSelectionArbitraryrotation() {
3309         // if (ActiveXY()) ActiveXY()->UndoCopy();
3310         Undo_Start("arbitrary rotation");
3311         Undo_AddBrushList(&selected_brushes);
3312
3313         CRotateDlg      dlg;
3314         dlg.DoModal();
3315
3316         // DoRotate ();
3317         Undo_EndBrushList(&selected_brushes);
3318         Undo_End();
3319 }
3320
3321 /*
3322  =======================================================================================================================
3323  =======================================================================================================================
3324  */
3325 void CMainFrame::OnSelectionClone() {
3326         // if (ActiveXY()) ActiveXY()->UndoCopy();
3327         Select_Clone();
3328 }
3329
3330 /*
3331  =======================================================================================================================
3332  =======================================================================================================================
3333  */
3334 void CMainFrame::OnSelectionConnect() {
3335         ConnectEntities();
3336 }
3337
3338 /*
3339  =======================================================================================================================
3340  =======================================================================================================================
3341  */
3342 void CMainFrame::OnSelectionMakehollow() {
3343         // if (ActiveXY()) ActiveXY()->UndoCopy();
3344         Undo_Start("hollow");
3345         Undo_AddBrushList(&selected_brushes);
3346         CSG_MakeHollow();
3347         Undo_EndBrushList(&selected_brushes);
3348         Undo_End();
3349 }
3350
3351 /*
3352  =======================================================================================================================
3353  =======================================================================================================================
3354  */
3355 void CMainFrame::OnSelectionCsgsubtract() {
3356         // if (ActiveXY()) ActiveXY()->UndoCopy();
3357         Undo_Start("CSG subtract");
3358         CSG_Subtract();
3359         Undo_End();
3360 }
3361
3362 /*
3363  =======================================================================================================================
3364  =======================================================================================================================
3365  */
3366 void CMainFrame::OnSelectionCsgmerge() {
3367         // if (ActiveXY()) ActiveXY()->UndoCopy();
3368         Undo_Start("CSG merge");
3369         Undo_AddBrushList(&selected_brushes);
3370         CSG_Merge();
3371         Undo_EndBrushList(&selected_brushes);
3372         Undo_End();
3373 }
3374
3375 /*
3376  =======================================================================================================================
3377  =======================================================================================================================
3378  */
3379 void CMainFrame::OnSelectionDelete() {
3380         brush_t *brush;
3381
3382         // if (ActiveXY()) ActiveXY()->UndoCopy();
3383         Undo_Start("delete");
3384         Undo_AddBrushList(&selected_brushes);
3385
3386         // add all deleted entities to the undo
3387         for (brush = selected_brushes.next; brush != &selected_brushes; brush = brush->next) {
3388                 Undo_AddEntity(brush->owner);
3389         }
3390
3391         // NOTE: Select_Delete does NOT delete entities
3392         Select_Delete();
3393         Undo_EndBrushList(&selected_brushes);
3394         Undo_End();
3395 }
3396
3397 /*
3398  =======================================================================================================================
3399  =======================================================================================================================
3400  */
3401 void CMainFrame::OnSelectionDeselect() {
3402         if (!ByeByeSurfaceDialog()) {
3403                 if (g_bClipMode) {
3404                         OnViewClipper();
3405                 } else if (g_bRotateMode) {
3406                         OnSelectMouserotate();
3407                 } else if (g_bScaleMode) {
3408                         OnSelectMousescale();
3409                 } else if (g_bPathMode) {
3410                         if (ActiveXY()) {
3411                                 ActiveXY()->KillPathMode();
3412                         }
3413                 } else if (g_bAxialMode) {
3414                         g_bAxialMode = false;
3415                         Sys_UpdateWindows(W_CAMERA);
3416                 } else {
3417                         if (g_qeglobals.d_select_mode == sel_curvepoint && g_qeglobals.d_num_move_points > 0) {
3418                                 g_qeglobals.d_num_move_points = 0;
3419                                 Sys_UpdateWindows(W_ALL);
3420                         } else {
3421                                 Select_Deselect();
3422                                 SetStatusText(2, " ");
3423                         }
3424                 }
3425         }
3426 }
3427
3428 /*
3429  =======================================================================================================================
3430  =======================================================================================================================
3431  */
3432 void CMainFrame::OnSelectionDragedges() {
3433         if (g_qeglobals.d_select_mode == sel_edge) {
3434                 g_qeglobals.d_select_mode = sel_brush;
3435                 Sys_UpdateWindows(W_ALL);
3436         }
3437         else {
3438                 SetupVertexSelection();
3439                 if (g_qeglobals.d_numpoints) {
3440                         g_qeglobals.d_select_mode = sel_edge;
3441                 }
3442
3443                 Sys_UpdateWindows(W_ALL);
3444         }
3445 }
3446
3447 /*
3448  =======================================================================================================================
3449  =======================================================================================================================
3450  */
3451 void CMainFrame::OnSelectionDragvertecies() {
3452         if (g_qeglobals.d_select_mode == sel_vertex || g_qeglobals.d_select_mode == sel_curvepoint) {
3453                 g_qeglobals.d_select_mode = sel_brush;
3454                 Sys_UpdateWindows(W_ALL);
3455         }
3456         else {
3457                 // --if (QE_SingleBrush() && selected_brushes.next->patchBrush)
3458                 if (OnlyPatchesSelected()) {
3459                         Patch_EditPatch();
3460                 }
3461                 else if (!AnyPatchesSelected()) {
3462                         SetupVertexSelection();
3463                         if (g_qeglobals.d_numpoints) {
3464                                 g_qeglobals.d_select_mode = sel_vertex;
3465                         }
3466                 }
3467
3468                 Sys_UpdateWindows(W_ALL);
3469         }
3470 }
3471
3472 /*
3473  =======================================================================================================================
3474  =======================================================================================================================
3475  */
3476 void CMainFrame::OnSelectionCenterOrigin() {
3477         Undo_Start("center origin");
3478         Undo_AddBrushList(&selected_brushes);
3479         Select_CenterOrigin();
3480         Undo_EndBrushList(&selected_brushes);
3481         Undo_End();
3482 }
3483
3484 /*
3485  =======================================================================================================================
3486  =======================================================================================================================
3487  */
3488 void CMainFrame::OnSelectionSelectcompletetall() {
3489         //if (ActiveXY()) {
3490         //      ActiveXY()->UndoCopy();
3491         //}
3492
3493         Select_CompleteTall();
3494 }
3495
3496 /*
3497  =======================================================================================================================
3498  =======================================================================================================================
3499  */
3500 void CMainFrame::OnSelectionSelectinside() {
3501         Select_Inside();
3502 }
3503
3504 /*
3505  =======================================================================================================================
3506  =======================================================================================================================
3507  */
3508 void CMainFrame::OnSelectionSelectpartialtall() {
3509         Select_PartialTall();
3510 }
3511
3512 /*
3513  =======================================================================================================================
3514  =======================================================================================================================
3515  */
3516 void CMainFrame::OnSelectionSelecttouching() {
3517         Select_Touching();
3518 }
3519
3520 /*
3521  =======================================================================================================================
3522  =======================================================================================================================
3523  */
3524 void CMainFrame::OnSelectionUngroupentity() {
3525         Select_Ungroup();
3526 }
3527
3528 void CMainFrame::OnAutocaulk()
3529 {
3530         Select_AutoCaulk();     
3531 }
3532 void CMainFrame::OnUpdateAutocaulk(CCmdUI* pCmdUI)
3533 {
3534         pCmdUI->Enable( selected_brushes.next != &selected_brushes);
3535 }
3536
3537
3538 /*
3539  =======================================================================================================================
3540  =======================================================================================================================
3541  */
3542 void CMainFrame::OnTexturesPopup() {
3543         HandlePopup(this, IDR_POPUP_TEXTURE);
3544 }
3545
3546 /*
3547  =======================================================================================================================
3548  =======================================================================================================================
3549  */
3550 void CMainFrame::OnSplinesPopup() {
3551         HandlePopup(this, IDR_POPUP_SPLINE);
3552 }
3553
3554 /*
3555  =======================================================================================================================
3556  =======================================================================================================================
3557  */
3558 void CMainFrame::OnPopupSelection() {
3559         HandlePopup(this, IDR_POPUP_SELECTION);
3560 }
3561
3562 /*
3563  =======================================================================================================================
3564  =======================================================================================================================
3565  */
3566 void CMainFrame::OnViewChange() {
3567         OnViewNextview();
3568 }
3569
3570 /*
3571  =======================================================================================================================
3572  =======================================================================================================================
3573  */
3574 void CMainFrame::OnViewCameraupdate() {
3575         g_qeglobals.flatRotation++;
3576         
3577         if (g_qeglobals.flatRotation > 2) {
3578                 g_qeglobals.flatRotation = 0;
3579         }
3580
3581         if (g_qeglobals.flatRotation) {
3582                 g_qeglobals.rotateAxis = 0;
3583                 if (ActiveXY()->GetViewType() == XY) {
3584                         g_qeglobals.rotateAxis = 2;
3585                 } else if (ActiveXY()->GetViewType() == XZ) {
3586                         g_qeglobals.rotateAxis = 1;
3587                 }
3588         }
3589         Select_InitializeRotation();
3590         Sys_UpdateWindows(W_CAMERA | W_XY);
3591 }
3592
3593
3594 /*
3595  =======================================================================================================================
3596  =======================================================================================================================
3597  */
3598 void CMainFrame::OnSizing(UINT fwSide, LPRECT pRect) {
3599         CFrameWnd::OnSizing(fwSide, pRect);
3600         GetClientRect(g_rctOld);
3601 }
3602
3603 /*
3604  =======================================================================================================================
3605  =======================================================================================================================
3606  */
3607 void CMainFrame::OnHelpAbout() {
3608         DoAbout();
3609 }
3610
3611 /*
3612  =======================================================================================================================
3613  =======================================================================================================================
3614  */
3615 void CMainFrame::OnViewClipper() {
3616         if (ActiveXY()) {
3617                 if (ActiveXY()->ClipMode()) {
3618                         ActiveXY()->SetClipMode(false);
3619                         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_VIEW_CLIPPER, FALSE);
3620                 }
3621                 else {
3622                         if (ActiveXY()->RotateMode()) {
3623                                 OnSelectMouserotate();
3624                         }
3625
3626                         ActiveXY()->SetClipMode(true);
3627                         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_VIEW_CLIPPER);
3628                 }
3629         }
3630 }
3631
3632 /*
3633  =======================================================================================================================
3634  =======================================================================================================================
3635  */
3636 void CMainFrame::OnCameraAngledown() {
3637         m_pCamWnd->Camera().angles[0] -= SPEED_TURN;
3638         if (m_pCamWnd->Camera().angles[0] < -85) {
3639                 m_pCamWnd->Camera().angles[0] = -85;
3640         }
3641
3642         Sys_UpdateWindows(W_CAMERA | W_XY_OVERLAY);
3643 }
3644
3645 /*
3646  =======================================================================================================================
3647  =======================================================================================================================
3648  */
3649 void CMainFrame::OnCameraAngleup() {
3650         m_pCamWnd->Camera().angles[0] += SPEED_TURN;
3651         if (m_pCamWnd->Camera().angles[0] > 85) {
3652                 m_pCamWnd->Camera().angles[0] = 85;
3653         }
3654
3655         Sys_UpdateWindows(W_CAMERA | W_XY_OVERLAY);
3656 }
3657
3658 /*
3659  =======================================================================================================================
3660  =======================================================================================================================
3661  */
3662 void CMainFrame::OnCameraBack() {
3663         VectorMA(m_pCamWnd->Camera().origin, -SPEED_MOVE, m_pCamWnd->Camera().forward, m_pCamWnd->Camera().origin);
3664
3665         int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
3666         Sys_UpdateWindows(nUpdate);
3667 }
3668
3669 /*
3670  =======================================================================================================================
3671  =======================================================================================================================
3672  */
3673 void CMainFrame::OnCameraDown() {
3674         m_pCamWnd->Camera().origin[2] -= SPEED_MOVE;
3675         Sys_UpdateWindows(W_CAMERA | W_XY | W_Z);
3676 }
3677
3678 /*
3679  =======================================================================================================================
3680  =======================================================================================================================
3681  */
3682 void CMainFrame::OnCameraForward() {
3683         VectorMA(m_pCamWnd->Camera().origin, SPEED_MOVE, m_pCamWnd->Camera().forward, m_pCamWnd->Camera().origin);
3684
3685         int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
3686         Sys_UpdateWindows(nUpdate);
3687 }
3688
3689 /*
3690  =======================================================================================================================
3691  =======================================================================================================================
3692  */
3693 void CMainFrame::OnCameraLeft() {
3694         m_pCamWnd->Camera().angles[1] += SPEED_TURN;
3695
3696         int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
3697         Sys_UpdateWindows(nUpdate);
3698 }
3699
3700 /*
3701  =======================================================================================================================
3702  =======================================================================================================================
3703  */
3704 void CMainFrame::OnCameraRight() {
3705         m_pCamWnd->Camera().angles[1] -= SPEED_TURN;
3706
3707         int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
3708         Sys_UpdateWindows(nUpdate);
3709 }
3710
3711 /*
3712  =======================================================================================================================
3713  =======================================================================================================================
3714  */
3715 void CMainFrame::OnCameraStrafeleft() {
3716         VectorMA(m_pCamWnd->Camera().origin, -SPEED_MOVE, m_pCamWnd->Camera().right, m_pCamWnd->Camera().origin);
3717
3718         int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
3719         Sys_UpdateWindows(nUpdate);
3720 }
3721
3722 /*
3723  =======================================================================================================================
3724  =======================================================================================================================
3725  */
3726 void CMainFrame::OnCameraStraferight() {
3727         VectorMA(m_pCamWnd->Camera().origin, SPEED_MOVE, m_pCamWnd->Camera().right, m_pCamWnd->Camera().origin);
3728
3729         int nUpdate = (g_PrefsDlg.m_bCamXYUpdate) ? (W_CAMERA | W_XY) : (W_CAMERA);
3730         Sys_UpdateWindows(nUpdate);
3731 }
3732
3733 /*
3734  =======================================================================================================================
3735  =======================================================================================================================
3736  */
3737 void CMainFrame::OnCameraUp() {
3738         m_pCamWnd->Camera().origin[2] += SPEED_MOVE;
3739         Sys_UpdateWindows(W_CAMERA | W_XY | W_Z);
3740 }
3741
3742 /*
3743  =======================================================================================================================
3744  =======================================================================================================================
3745  */
3746 void CMainFrame::OnGridToggle() {
3747         g_qeglobals.d_showgrid ^= 1;
3748         Sys_UpdateWindows(W_XY | W_Z);
3749 }
3750
3751 /*
3752  =======================================================================================================================
3753  =======================================================================================================================
3754  */
3755 void CMainFrame::OnPrefs() {
3756         BOOL    bToolbar = g_PrefsDlg.m_bWideToolbar;
3757         g_PrefsDlg.LoadPrefs();
3758         if (g_PrefsDlg.DoModal() == IDOK) {
3759                 if (g_PrefsDlg.m_bWideToolbar != bToolbar) {
3760                         MessageBox("You need to restart Q3Radiant for the view changes to take place.");
3761                 }
3762
3763                 g_Inspectors->texWnd.UpdatePrefs();
3764
3765                 CMenu   *pMenu = GetMenu();
3766                 if (pMenu) {
3767                         pMenu->CheckMenuItem(ID_SNAPTOGRID, MF_BYCOMMAND | (!g_PrefsDlg.m_bNoClamp) ? MF_CHECKED : MF_UNCHECKED);
3768                 }
3769         }
3770 }
3771
3772 //
3773 // =======================================================================================================================
3774 //    0 = radiant styel 1 = qe4 style
3775 // =======================================================================================================================
3776 //
3777 void CMainFrame::SetWindowStyle(int nStyle) {
3778 }
3779
3780 /*
3781  =======================================================================================================================
3782  =======================================================================================================================
3783  */
3784 void CMainFrame::OnTogglecamera() {
3785         if (m_pCamWnd->IsWindowVisible()) {
3786                 m_pCamWnd->ShowWindow(SW_HIDE);
3787         } else {
3788                 m_pCamWnd->ShowWindow(SW_SHOW);
3789         }
3790 }
3791
3792
3793 /*
3794  =======================================================================================================================
3795  =======================================================================================================================
3796  */
3797 void CMainFrame::OnToggleview() {
3798         if (m_pXYWnd && m_pXYWnd->GetSafeHwnd()) {
3799                 if (m_pXYWnd->IsWindowVisible()) {
3800                         m_pXYWnd->ShowWindow(SW_HIDE);
3801                 } else {
3802                         m_pXYWnd->ShowWindow(SW_SHOW);
3803                 }
3804         }
3805 }
3806
3807 /*
3808  =======================================================================================================================
3809  =======================================================================================================================
3810  */
3811 void CMainFrame::OnTogglez() {
3812         if (m_pZWnd && m_pZWnd->GetSafeHwnd()) {
3813                 if (m_pZWnd->IsWindowVisible()) {
3814                         m_pZWnd->ShowWindow(SW_HIDE);
3815                 } else {
3816                         m_pZWnd->ShowWindow(SW_SHOW);
3817                 }
3818         }
3819 }
3820
3821 /*
3822  =======================================================================================================================
3823  =======================================================================================================================
3824  */
3825 void CMainFrame::OnToggleLock() {
3826         g_PrefsDlg.m_bTextureLock = !g_PrefsDlg.m_bTextureLock;
3827
3828         CMenu   *pMenu = GetMenu();
3829         if (pMenu) {
3830                 pMenu->CheckMenuItem(ID_TOGGLE_LOCK, MF_BYCOMMAND | (g_PrefsDlg.m_bTextureLock) ? MF_CHECKED : MF_UNCHECKED);
3831         }
3832
3833         g_PrefsDlg.SavePrefs();
3834         SetGridStatus();
3835 }
3836
3837 /*
3838  =======================================================================================================================
3839  =======================================================================================================================
3840  */
3841 void CMainFrame::OnEditMapinfo() {
3842         CMapInfo        dlg;
3843         dlg.DoModal();
3844 }
3845
3846 /*
3847  =======================================================================================================================
3848  =======================================================================================================================
3849  */
3850 void CMainFrame::OnEditEntityinfo() {
3851         CEntityListDlg::ShowDialog();
3852 }
3853
3854 /*
3855  =======================================================================================================================
3856  =======================================================================================================================
3857  */
3858 void CMainFrame::OnViewNextview() {
3859         if (m_pXYWnd->GetViewType() == XY) {
3860                 m_pXYWnd->SetViewType(XZ);
3861         }
3862         else if (m_pXYWnd->GetViewType() == XZ) {
3863                 m_pXYWnd->SetViewType(YZ);
3864         }
3865         else {
3866                 m_pXYWnd->SetViewType(XY);
3867         }
3868
3869         m_pXYWnd->PositionView();
3870         if (g_qeglobals.flatRotation) {
3871                 g_qeglobals.rotateAxis = 0;
3872                 if (ActiveXY()->GetViewType() == XY) {
3873                         g_qeglobals.rotateAxis = 2;
3874                 } else if (ActiveXY()->GetViewType() == XZ) {
3875                         g_qeglobals.rotateAxis = 1;
3876                 }
3877         }
3878         Sys_UpdateWindows(W_XY | W_CAMERA);
3879 }
3880
3881 /*
3882  =======================================================================================================================
3883  =======================================================================================================================
3884  */
3885 void CMainFrame::OnHelpCommandlist() {
3886         CCommandsDlg    dlg;
3887         dlg.DoModal();
3888 #if 0
3889         if (g_b3Dfx) {
3890                 C3DFXCamWnd *pWnd = new C3DFXCamWnd();
3891                 CRect           rect(50, 50, 400, 400);
3892                 pWnd->Create(_3DFXCAMERA_WINDOW_CLASS, "", QE3_CHILDSTYLE, rect, this, 1234);
3893                 pWnd->ShowWindow(SW_SHOW);
3894         }
3895 #endif
3896 }
3897
3898 /*
3899  =======================================================================================================================
3900  =======================================================================================================================
3901  */
3902 void CMainFrame::OnFileNewproject()
3903 {
3904 }
3905
3906 /*
3907  =======================================================================================================================
3908  =======================================================================================================================
3909  */
3910 void CMainFrame::UpdateStatusText() {
3911         for (int n = 0; n < 6; n++) {
3912                 if (m_strStatus[n].GetLength() >= 0 && m_wndStatusBar.GetSafeHwnd()) {
3913                         m_wndStatusBar.SetPaneText(n, m_strStatus[n]);
3914                 }
3915         }
3916 }
3917
3918 /*
3919  =======================================================================================================================
3920  =======================================================================================================================
3921  */
3922 void CMainFrame::SetStatusText(int nPane, const char *pText) {
3923         if (pText && nPane <= 5 && nPane >= 0) {
3924                 m_strStatus[nPane] = pText;
3925                 UpdateStatusText();
3926         }
3927 }
3928
3929 /*
3930  =======================================================================================================================
3931  =======================================================================================================================
3932  */
3933 void CMainFrame::UpdateWindows(int nBits) {
3934
3935         if (!g_bScreenUpdates) {
3936                 return;
3937         }
3938
3939         if (nBits & (W_XY | W_XY_OVERLAY)) {
3940                 if (m_pXYWnd) {
3941                         m_pXYWnd->RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW);
3942                 }
3943
3944                 if (m_pXZWnd) {
3945                         m_pXZWnd->RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW);
3946                 }
3947
3948                 if (m_pYZWnd) {
3949                         m_pYZWnd->RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW);
3950                 }
3951         }
3952
3953         if (nBits & W_CAMERA || ((nBits & W_CAMERA_IFON) && m_bCamPreview)) {
3954                 if (m_pCamWnd) {
3955                         m_pCamWnd->RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW);
3956                 }
3957         }
3958
3959         if (nBits & (W_Z | W_Z_OVERLAY)) {
3960                 if (m_pZWnd) {
3961                         m_pZWnd->RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW);
3962                 }
3963         }
3964
3965         if (nBits & W_TEXTURE) {
3966                 g_Inspectors->texWnd.RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW);
3967         }
3968 }
3969
3970 /*
3971  =======================================================================================================================
3972  =======================================================================================================================
3973  */
3974 void WINAPI Sys_UpdateWindows(int nBits) {
3975         if (g_PrefsDlg.m_bQE4Painting) {
3976                 g_nUpdateBits |= nBits;
3977         }
3978         else if ( g_pParentWnd ) {
3979                 g_pParentWnd->UpdateWindows(nBits);
3980         }
3981 }
3982
3983 /*
3984  =======================================================================================================================
3985  =======================================================================================================================
3986  */
3987 void CMainFrame::OnFlipClip() {
3988         if (m_pActiveXY) {
3989                 m_pActiveXY->FlipClip();
3990         }
3991 }
3992
3993 /*
3994  =======================================================================================================================
3995  =======================================================================================================================
3996  */
3997 void CMainFrame::OnClipSelected() {
3998         if (m_pActiveXY && m_pActiveXY->ClipMode()) {
3999                 Undo_Start("clip selected");
4000                 Undo_AddBrushList(&selected_brushes);
4001                 m_pActiveXY->Clip();
4002                 Undo_EndBrushList(&selected_brushes);
4003                 Undo_End();
4004         } else {
4005                 if (g_bPatchBendMode) {
4006                         Patch_BendHandleENTER();
4007                 } else if (g_bAxialMode) {
4008
4009                 }
4010                 //else if (g_bPatchBendMode) {
4011                 //      Patch_InsDelHandleENTER();
4012                 //}
4013         }
4014 }
4015
4016 /*
4017  =======================================================================================================================
4018  =======================================================================================================================
4019  */
4020 void CMainFrame::OnSplitSelected() {
4021         if (m_pActiveXY) {
4022                 Undo_Start("split selected");
4023                 Undo_AddBrushList(&selected_brushes);
4024                 m_pActiveXY->SplitClip();
4025                 Undo_EndBrushList(&selected_brushes);
4026                 Undo_End();
4027         }
4028 }
4029
4030 /*
4031  =======================================================================================================================
4032  =======================================================================================================================
4033  */
4034 CXYWnd *CMainFrame::ActiveXY() {
4035         return m_pActiveXY;
4036 }
4037
4038 /*
4039  =======================================================================================================================
4040  =======================================================================================================================
4041  */
4042 void CMainFrame::OnToggleviewXz() {
4043         if (m_pXZWnd && m_pXZWnd->GetSafeHwnd()) {
4044                 // get windowplacement doesn't actually save this so we will here
4045                 g_PrefsDlg.m_bXZVis = m_pXZWnd->IsWindowVisible();
4046                 if (g_PrefsDlg.m_bXZVis) {
4047                         m_pXZWnd->ShowWindow(SW_HIDE);
4048                 } else {
4049                         m_pXZWnd->ShowWindow(SW_SHOW);
4050                 }
4051
4052                 g_PrefsDlg.m_bXZVis ^= 1;
4053                 g_PrefsDlg.SavePrefs();
4054         }
4055 }
4056
4057 /*
4058  =======================================================================================================================
4059  =======================================================================================================================
4060  */
4061 void CMainFrame::OnToggleviewYz() {
4062         if (m_pYZWnd && m_pYZWnd->GetSafeHwnd()) {
4063                 g_PrefsDlg.m_bYZVis = m_pYZWnd->IsWindowVisible();
4064                 if (g_PrefsDlg.m_bYZVis) {
4065                         m_pYZWnd->ShowWindow(SW_HIDE);
4066                 } else {
4067                         m_pYZWnd->ShowWindow(SW_SHOW);
4068                 }
4069
4070                 g_PrefsDlg.m_bYZVis ^= 1;
4071                 g_PrefsDlg.SavePrefs();
4072         }
4073 }
4074
4075 /*
4076  =======================================================================================================================
4077  =======================================================================================================================
4078  */
4079
4080 void CMainFrame::OnToggleToolbar()
4081 {
4082         ShowControlBar(&m_wndToolBar, !m_wndToolBar.IsWindowVisible(), false);
4083 }
4084
4085 void CMainFrame::OnToggleTextureBar()
4086 {
4087         ShowControlBar(&m_wndTextureBar, !m_wndTextureBar.IsWindowVisible(), false);
4088 }
4089
4090
4091 /*
4092  =======================================================================================================================
4093  =======================================================================================================================
4094  */
4095 void CMainFrame::OnColorsBrush() {
4096         DoColor(COLOR_BRUSHES);
4097         Sys_UpdateWindows(W_ALL);
4098 }
4099
4100 /*
4101  =======================================================================================================================
4102  =======================================================================================================================
4103  */
4104 void CMainFrame::OnColorsClipper() {
4105         DoColor(COLOR_CLIPPER);
4106         Sys_UpdateWindows(W_ALL);
4107 }
4108
4109 /*
4110  =======================================================================================================================
4111  =======================================================================================================================
4112  */
4113 void CMainFrame::OnColorsGridtext() {
4114         DoColor(COLOR_GRIDTEXT);
4115         Sys_UpdateWindows(W_ALL);
4116 }
4117
4118 /*
4119  =======================================================================================================================
4120  =======================================================================================================================
4121  */
4122 void CMainFrame::OnColorsSelectedbrush() {
4123         DoColor(COLOR_SELBRUSHES);
4124         Sys_UpdateWindows(W_ALL);
4125 }
4126
4127 /*
4128  =======================================================================================================================
4129  =======================================================================================================================
4130  */
4131 void CMainFrame::OnColorsGridblock() {
4132         DoColor(COLOR_GRIDBLOCK);
4133         Sys_UpdateWindows(W_ALL);
4134 }
4135
4136 /*
4137  =======================================================================================================================
4138  =======================================================================================================================
4139  */
4140 void CMainFrame::OnColorsViewname() {
4141         DoColor(COLOR_VIEWNAME);
4142         Sys_UpdateWindows(W_ALL);
4143 }
4144
4145 /*
4146  =======================================================================================================================
4147  =======================================================================================================================
4148  */
4149 void CMainFrame::OnColorSetoriginal() {
4150         for (int i = 0; i < 3; i++) {
4151                 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.0f;
4152                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 1.0f;
4153                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.75f;
4154                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.5f;
4155                 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
4156         }
4157
4158         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
4159         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
4160         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
4161
4162         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
4163         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
4164         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
4165
4166         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
4167         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
4168         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
4169
4170         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
4171         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
4172         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
4173
4174         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
4175         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
4176         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
4177
4178         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
4179         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
4180         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
4181
4182         g_qeglobals.d_savedinfo.colors[COLOR_PRECISION_CROSSHAIR][0] = 1.0;
4183         g_qeglobals.d_savedinfo.colors[COLOR_PRECISION_CROSSHAIR][1] = 0.0;
4184         g_qeglobals.d_savedinfo.colors[COLOR_PRECISION_CROSSHAIR][2] = 1.0;
4185
4186         Sys_UpdateWindows(W_ALL);
4187 }
4188
4189 /*
4190  =======================================================================================================================
4191  =======================================================================================================================
4192  */
4193 void CMainFrame::OnColorSetqer() {
4194         for (int i = 0; i < 3; i++) {
4195                 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.0f;
4196                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 1.0f;
4197                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 1.0f;
4198                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.5f;
4199                 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
4200         }
4201
4202         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
4203         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
4204         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
4205
4206         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
4207         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
4208         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
4209
4210         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
4211         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
4212         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
4213
4214         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
4215         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
4216         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
4217
4218         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
4219         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
4220         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
4221
4222         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
4223         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
4224         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
4225
4226         g_qeglobals.d_savedinfo.colors[COLOR_PRECISION_CROSSHAIR][0] = 1.0;
4227         g_qeglobals.d_savedinfo.colors[COLOR_PRECISION_CROSSHAIR][1] = 0.0;
4228         g_qeglobals.d_savedinfo.colors[COLOR_PRECISION_CROSSHAIR][2] = 1.0;
4229
4230         Sys_UpdateWindows(W_ALL);
4231 }
4232
4233 //FIXME: these just need to be read from a def file
4234 void CMainFrame::OnColorSetSuperMal() {
4235         OnColorSetqer();
4236         g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][0] = 0.0f;
4237         g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][1] = 0.0f;
4238         g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][2] = 0.0f;
4239         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][0] = 0.35f;
4240         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][1] = 0.35f;
4241         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][2] = 0.35f;
4242         g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][0] = 0.5f;
4243         g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][1] = 0.5f;
4244         g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][2] = 0.5f;
4245         g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][0] = 0.39f;
4246         g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][1] = 0.39f;
4247         g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][2] = 0.39f;
4248         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
4249         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
4250         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
4251         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
4252         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
4253         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
4254         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
4255         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.90f;
4256         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.90f;
4257         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
4258         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
4259         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.74f;
4260
4261
4262         Sys_UpdateWindows(W_ALL);
4263 }
4264
4265 /*
4266  =======================================================================================================================
4267  =======================================================================================================================
4268  */
4269 void CMainFrame::OnColorSetblack() {
4270         for (int i = 0; i < 3; i++) {
4271                 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.0f;
4272                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 0.0f;
4273                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.0f;
4274                 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
4275         }
4276
4277         g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][0] = 0.3f;
4278         g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][1] = 0.5f;
4279         g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][2] = 0.5f;
4280
4281         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 0.0f;
4282         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 0.0f;
4283         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
4284
4285         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 1.0f;
4286         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 1.0f;
4287         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 1.0f;
4288
4289         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
4290         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
4291         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
4292
4293         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
4294         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
4295         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
4296
4297         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 1.0f;
4298         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 1.0f;
4299         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 1.0f;
4300
4301         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.7f;
4302         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.7f;
4303         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.0f;
4304
4305         g_qeglobals.d_savedinfo.colors[COLOR_PRECISION_CROSSHAIR][0] = 1.0;
4306         g_qeglobals.d_savedinfo.colors[COLOR_PRECISION_CROSSHAIR][1] = 0.0;
4307         g_qeglobals.d_savedinfo.colors[COLOR_PRECISION_CROSSHAIR][2] = 1.0;
4308
4309         Sys_UpdateWindows(W_ALL);
4310 }
4311
4312 void CMainFrame::OnColorSetMax() {
4313         for (int i=0 ; i<3 ; i++) {
4314                 g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25f;
4315                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 0.77f;
4316                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.83f;
4317                 g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.89f;
4318                 g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25f;
4319         }
4320         
4321         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][0] = 1.0f;
4322         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][1] = 1.0f;
4323         g_qeglobals.d_savedinfo.colors[COLOR_GRIDBLOCK][2] = 1.0f;
4324         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][0] = 0.0f;
4325         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][1] = 0.0f;
4326         g_qeglobals.d_savedinfo.colors[COLOR_GRIDTEXT][2] = 0.0f;
4327         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][0] = 1.0f;
4328         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][1] = 0.0f;
4329         g_qeglobals.d_savedinfo.colors[COLOR_SELBRUSHES][2] = 0.0f;
4330         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][0] = 0.0f;
4331         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][1] = 0.0f;
4332         g_qeglobals.d_savedinfo.colors[COLOR_CLIPPER][2] = 1.0f;
4333         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][0] = 0.0f;
4334         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][1] = 0.0f;
4335         g_qeglobals.d_savedinfo.colors[COLOR_BRUSHES][2] = 0.0f;
4336         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][0] = 0.5f;
4337         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][1] = 0.0f;
4338         g_qeglobals.d_savedinfo.colors[COLOR_VIEWNAME][2] = 0.75f;
4339
4340         //g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][0] = 0.0f;
4341         //g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][1] = 1.0f;
4342         //g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][2] = 1.0f;
4343
4344         g_qeglobals.d_savedinfo.colors[COLOR_PRECISION_CROSSHAIR][0] = 1.0f;
4345         g_qeglobals.d_savedinfo.colors[COLOR_PRECISION_CROSSHAIR][1] = 0.0f;
4346         g_qeglobals.d_savedinfo.colors[COLOR_PRECISION_CROSSHAIR][2] = 1.0f;
4347         
4348         Sys_UpdateWindows (W_ALL);
4349         
4350 }
4351
4352 /*
4353  =======================================================================================================================
4354  =======================================================================================================================
4355  */
4356 void CMainFrame::OnSnaptogrid() {
4357         g_PrefsDlg.m_bNoClamp ^= 1;
4358         g_PrefsDlg.SavePrefs();
4359
4360         CMenu   *pMenu = GetMenu();
4361         if (pMenu) {
4362                 pMenu->CheckMenuItem(ID_SNAPTOGRID, MF_BYCOMMAND | (!g_PrefsDlg.m_bNoClamp) ? MF_CHECKED : MF_UNCHECKED);
4363         }
4364 }
4365
4366 /*
4367  =======================================================================================================================
4368  =======================================================================================================================
4369  */
4370 void CMainFrame::OnSelectScale() {
4371         // if (ActiveXY()) ActiveXY()->UndoCopy();
4372         Undo_Start("scale");
4373         Undo_AddBrushList(&selected_brushes);
4374
4375         CScaleDialog    dlg;
4376         if (dlg.DoModal() == IDOK) {
4377                 if (dlg.m_fX > 0 && dlg.m_fY > 0 && dlg.m_fZ > 0) {
4378                         Select_Scale(dlg.m_fX, dlg.m_fY, dlg.m_fZ);
4379                         Sys_UpdateWindows(W_ALL);
4380                 }
4381                 else {
4382                         common->Printf("Warning.. Tried to scale by a zero value.");
4383                 }
4384         }
4385
4386         Undo_EndBrushList(&selected_brushes);
4387         Undo_End();
4388 }
4389
4390 /*
4391  =======================================================================================================================
4392  =======================================================================================================================
4393  */
4394 void CMainFrame::OnSelectMouserotate() {
4395         if (ActiveXY()) {
4396                 if (ActiveXY()->ClipMode()) {
4397                         OnViewClipper();
4398                 }
4399
4400                 if (ActiveXY()->RotateMode()) {
4401                         ActiveXY()->SetRotateMode(false);
4402                         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_SELECT_MOUSEROTATE, FALSE);
4403                         Map_BuildBrushData();
4404                 }
4405                 else {
4406                         // may not work if no brush selected, see return value
4407                         if (ActiveXY()->SetRotateMode(true)) {
4408                                 g_qeglobals.rotateAxis = 0;
4409                                 if (ActiveXY()->GetViewType() == XY) {
4410                                         g_qeglobals.rotateAxis = 2;
4411                                 } else if (ActiveXY()->GetViewType() == XZ) {
4412                                         g_qeglobals.rotateAxis = 1;
4413                                 }
4414                                 m_wndToolBar.GetToolBarCtrl().CheckButton(ID_SELECT_MOUSEROTATE, TRUE);
4415                         }
4416                         else {  // if MFC called, we need to set back to FALSE ourselves
4417                                 m_wndToolBar.GetToolBarCtrl().CheckButton(ID_SELECT_MOUSEROTATE, FALSE);
4418                         }
4419                 }
4420         }
4421         Sys_UpdateWindows(W_CAMERA | W_XY);
4422 }
4423
4424 /*
4425  =======================================================================================================================
4426  =======================================================================================================================
4427  */
4428 void CMainFrame::OnEditCopybrush() {
4429         if (ActiveXY()) {
4430                 ActiveXY()->Copy();
4431         }
4432 }
4433
4434 /*
4435  =======================================================================================================================
4436  =======================================================================================================================
4437  */
4438 void CMainFrame::OnEditPastebrush() {
4439         if (ActiveXY()) {
4440                 ActiveXY()->Paste();
4441         }
4442 }
4443
4444 /*
4445  =======================================================================================================================
4446  =======================================================================================================================
4447  */
4448 void CMainFrame::OnEditUndo() {
4449         // if (ActiveXY()) ActiveXY()->Undo();
4450         Undo_Undo();
4451 }
4452
4453 /*
4454  =======================================================================================================================
4455  =======================================================================================================================
4456  */
4457 void CMainFrame::OnEditRedo() {
4458         Undo_Redo();
4459 }
4460
4461 /*
4462  =======================================================================================================================
4463  =======================================================================================================================
4464  */
4465 void CMainFrame::OnUpdateEditUndo(CCmdUI *pCmdUI) {
4466         /*
4467          * BOOL bEnable = false; if (ActiveXY()) bEnable = ActiveXY()->UndoAvailable();
4468          * pCmdUI->Enable(bEnable);
4469          */
4470         pCmdUI->Enable(Undo_UndoAvailable());
4471 }
4472
4473 /*
4474  =======================================================================================================================
4475  =======================================================================================================================
4476  */
4477 void CMainFrame::OnUpdateEditRedo(CCmdUI *pCmdUI) {
4478         pCmdUI->Enable(Undo_RedoAvailable());
4479 }
4480
4481 /*
4482  =======================================================================================================================
4483  =======================================================================================================================
4484  */
4485 void CMainFrame::OnSelectionTextureDec() {
4486         g_qeglobals.d_savedinfo.m_nTextureTweak -= 1.0f;
4487         if ( g_qeglobals.d_savedinfo.m_nTextureTweak == 0.0f ) {
4488                 g_qeglobals.d_savedinfo.m_nTextureTweak -= 1.0f;
4489         }
4490
4491         SetTexValStatus();
4492 }
4493
4494 /*
4495  =======================================================================================================================
4496  =======================================================================================================================
4497  */
4498 void CMainFrame::OnSelectionTextureFit() {
4499         Select_FitTexture( 1.0f, 1.0f );
4500 }
4501
4502 /*
4503  =======================================================================================================================
4504  =======================================================================================================================
4505  */
4506 void CMainFrame::OnSelectionTextureInc() {
4507         g_qeglobals.d_savedinfo.m_nTextureTweak += 1.0f;
4508         if ( g_qeglobals.d_savedinfo.m_nTextureTweak == 0.0f ) {
4509                 g_qeglobals.d_savedinfo.m_nTextureTweak += 1.0f;
4510         }
4511
4512         SetTexValStatus();
4513 }
4514
4515 /*
4516  =======================================================================================================================
4517  =======================================================================================================================
4518  */
4519 void CMainFrame::OnSelectionTextureRotateclock() {
4520         Select_RotateTexture(abs(g_PrefsDlg.m_nRotation));
4521 }
4522
4523 /*
4524  =======================================================================================================================
4525  =======================================================================================================================
4526  */
4527 void CMainFrame::OnSelectionTextureRotatecounter() {
4528         Select_RotateTexture(-abs(g_PrefsDlg.m_nRotation));
4529 }
4530
4531 /*
4532  =======================================================================================================================
4533  =======================================================================================================================
4534  */
4535 void CMainFrame::OnSelectionTextureScaledown() {
4536         Select_ScaleTexture(0, -g_qeglobals.d_savedinfo.m_nTextureTweak);
4537 }
4538
4539 /*
4540  =======================================================================================================================
4541  =======================================================================================================================
4542  */
4543 void CMainFrame::OnSelectionTextureScaleup() {
4544         Select_ScaleTexture(0, g_qeglobals.d_savedinfo.m_nTextureTweak);
4545 }
4546
4547 /*
4548  =======================================================================================================================
4549  =======================================================================================================================
4550  */
4551 void CMainFrame::OnSelectionTextureScaleLeft() {
4552         Select_ScaleTexture(g_qeglobals.d_savedinfo.m_nTextureTweak, 0);
4553 }
4554
4555 /*
4556  =======================================================================================================================
4557  =======================================================================================================================
4558  */
4559 void CMainFrame::OnSelectionTextureScaleRight() {
4560         Select_ScaleTexture(g_qeglobals.d_savedinfo.m_nTextureTweak, 0);
4561 }
4562
4563 /*
4564  =======================================================================================================================
4565  =======================================================================================================================
4566  */
4567 void CMainFrame::OnSelectionTextureShiftdown() {
4568         Select_ShiftTexture(0, -g_qeglobals.d_savedinfo.m_nTextureTweak, true);
4569 }
4570
4571 /*
4572  =======================================================================================================================
4573  =======================================================================================================================
4574  */
4575 void CMainFrame::OnSelectionTextureShiftleft() {
4576         Select_ShiftTexture(-g_qeglobals.d_savedinfo.m_nTextureTweak, 0, true);
4577 }
4578
4579 /*
4580  =======================================================================================================================
4581  =======================================================================================================================
4582  */
4583 void CMainFrame::OnSelectionTextureShiftright() {
4584         Select_ShiftTexture(g_qeglobals.d_savedinfo.m_nTextureTweak, 0, true);
4585 }
4586
4587 /*
4588  =======================================================================================================================
4589  =======================================================================================================================
4590  */
4591 void CMainFrame::OnSelectionTextureShiftup() {
4592         Select_ShiftTexture(0, g_qeglobals.d_savedinfo.m_nTextureTweak, true);
4593 }
4594
4595 /*
4596  =======================================================================================================================
4597  =======================================================================================================================
4598  */
4599 void CMainFrame::SetGridChecks(int id) {
4600         HMENU   hMenu = ::GetMenu(GetSafeHwnd());
4601         CheckMenuItem(hMenu, ID_GRID_1, MF_BYCOMMAND | MF_UNCHECKED);
4602         CheckMenuItem(hMenu, ID_GRID_2, MF_BYCOMMAND | MF_UNCHECKED);
4603         CheckMenuItem(hMenu, ID_GRID_4, MF_BYCOMMAND | MF_UNCHECKED);
4604         CheckMenuItem(hMenu, ID_GRID_8, MF_BYCOMMAND | MF_UNCHECKED);
4605         CheckMenuItem(hMenu, ID_GRID_16, MF_BYCOMMAND | MF_UNCHECKED);
4606         CheckMenuItem(hMenu, ID_GRID_32, MF_BYCOMMAND | MF_UNCHECKED);
4607         CheckMenuItem(hMenu, ID_GRID_64, MF_BYCOMMAND | MF_UNCHECKED);
4608         CheckMenuItem(hMenu, ID_GRID_POINT5, MF_BYCOMMAND | MF_UNCHECKED);
4609         CheckMenuItem(hMenu, ID_GRID_POINT25, MF_BYCOMMAND | MF_UNCHECKED);
4610         CheckMenuItem(hMenu, ID_GRID_POINT125, MF_BYCOMMAND | MF_UNCHECKED);
4611         CheckMenuItem(hMenu, ID_GRID_POINT0625, MF_BYCOMMAND | MF_UNCHECKED);
4612         CheckMenuItem(hMenu, id, MF_BYCOMMAND | MF_CHECKED);
4613 }
4614
4615 /*
4616  =======================================================================================================================
4617  =======================================================================================================================
4618  */
4619 void CMainFrame::OnGridNext() {
4620         if (g_qeglobals.d_gridsize >= MAX_GRID) {
4621                 return;
4622         }
4623
4624         g_qeglobals.d_gridsize *= 2.0f;
4625
4626         float   minGrid = MIN_GRID;
4627         int             id = ID_GRID_START;
4628
4629         while (minGrid < g_qeglobals.d_gridsize && id < ID_GRID_END) {
4630                 minGrid *= 2.0f;
4631                 id++;
4632         }
4633
4634         UpdateGrid();
4635
4636         SetGridChecks(id);
4637         SetGridStatus();
4638         Sys_UpdateWindows(W_XY | W_Z);
4639 }
4640
4641 /*
4642  =======================================================================================================================
4643  =======================================================================================================================
4644  */
4645 void CMainFrame::OnGridPrev() {
4646         if (g_qeglobals.d_gridsize <= MIN_GRID) {
4647                 return;
4648         }
4649
4650         g_qeglobals.d_gridsize /= 2;
4651
4652         float   maxGrid = MAX_GRID;
4653         int             id = ID_GRID_END;
4654
4655         while (maxGrid > g_qeglobals.d_gridsize && id > ID_GRID_START) {
4656                 maxGrid /= 2.0f;
4657                 id--;
4658         }
4659
4660         UpdateGrid();
4661
4662         SetGridChecks(id);
4663         SetGridStatus();
4664         Sys_UpdateWindows(W_XY | W_Z);
4665 }
4666
4667 /*
4668  =======================================================================================================================
4669  =======================================================================================================================
4670  */
4671 void CMainFrame::SetGridStatus() {
4672         CString strStatus;
4673         char    c1;
4674         char    c2;
4675         c1 = (g_PrefsDlg.m_bTextureLock) ? 'M' : ' ';
4676         c2 = (g_PrefsDlg.m_bRotateLock) ? 'R' : ' ';
4677         strStatus.Format
4678                 (
4679                         "G:%1.2f T:%1.2f R:%i C:%i L:%c%c",
4680                         g_qeglobals.d_gridsize,
4681                         g_qeglobals.d_savedinfo.m_nTextureTweak,
4682                         g_PrefsDlg.m_nRotation,
4683                         g_PrefsDlg.m_nCubicScale,
4684                         c1,
4685                         c2
4686                 );
4687         SetStatusText(4, strStatus);
4688 }
4689
4690 /*
4691  =======================================================================================================================
4692  =======================================================================================================================
4693  */
4694 void CMainFrame::SetTexValStatus() {
4695         //
4696         // CString strStatus; strStatus.Format("T: %i C: %i", g_nTextureTweak,
4697         // g_nCubicScale); SetStatusText(5, strStatus.GetBuffer(0));
4698         //
4699         SetGridStatus();
4700 }
4701
4702 /*
4703  =======================================================================================================================
4704  =======================================================================================================================
4705  */
4706 void CMainFrame::OnTextureReplaceall() {
4707         CFindTextureDlg::show();
4708 }
4709
4710 /*
4711  =======================================================================================================================
4712  =======================================================================================================================
4713  */
4714 void CMainFrame::OnScalelockx() {
4715         if (g_nScaleHow & SCALE_X) {
4716                 m_wndToolBar.GetToolBarCtrl().CheckButton(ID_SCALELOCKX, FALSE);
4717         }
4718         else {
4719                 m_wndToolBar.GetToolBarCtrl().CheckButton(ID_SCALELOCKX);
4720         }
4721
4722         g_nScaleHow ^= SCALE_X;
4723 }
4724
4725 /*
4726  =======================================================================================================================
4727  =======================================================================================================================
4728  */
4729 void CMainFrame::OnScalelocky() {
4730         if (g_nScaleHow & SCALE_Y) {
4731                 m_wndToolBar.GetToolBarCtrl().CheckButton(ID_SCALELOCKY, FALSE);
4732         }
4733         else {
4734                 m_wndToolBar.GetToolBarCtrl().CheckButton(ID_SCALELOCKY);
4735         }
4736
4737         g_nScaleHow ^= SCALE_Y;
4738 }
4739
4740 /*
4741  =======================================================================================================================
4742  =======================================================================================================================
4743  */
4744 void CMainFrame::OnScalelockz() {
4745         if (g_nScaleHow & SCALE_Z) {
4746                 m_wndToolBar.GetToolBarCtrl().CheckButton(ID_SCALELOCKZ, FALSE);
4747         }
4748         else {
4749                 m_wndToolBar.GetToolBarCtrl().CheckButton(ID_SCALELOCKZ);
4750         }
4751
4752         g_nScaleHow ^= SCALE_Z;
4753 }
4754
4755 /*
4756  =======================================================================================================================
4757  =======================================================================================================================
4758  */
4759 void CMainFrame::OnSelectMousescale() {
4760         if (ActiveXY()) {
4761                 if (ActiveXY()->ClipMode()) {
4762                         OnViewClipper();
4763                 }
4764
4765                 if (ActiveXY()->RotateMode()) {
4766                         // SetRotateMode(false) always works
4767                         ActiveXY()->SetRotateMode(false);
4768                         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_SELECT_MOUSESCALE, FALSE);
4769                 }
4770
4771                 if (ActiveXY()->ScaleMode()) {
4772                         ActiveXY()->SetScaleMode(false);
4773                         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_SELECT_MOUSESCALE, FALSE);
4774                 }
4775                 else {
4776                         ActiveXY()->SetScaleMode(true);
4777                         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_SELECT_MOUSESCALE);
4778                 }
4779         }
4780 }
4781
4782 /*
4783  =======================================================================================================================
4784  =======================================================================================================================
4785  */
4786 void CMainFrame::OnFileImport() {
4787 }
4788
4789 /*
4790  =======================================================================================================================
4791  =======================================================================================================================
4792  */
4793 void CMainFrame::OnFileProjectsettings() {
4794         DoProjectSettings();
4795 }
4796
4797 /*
4798  =======================================================================================================================
4799  =======================================================================================================================
4800  */
4801 void CMainFrame::OnUpdateFileImport(CCmdUI *pCmdUI) {
4802         pCmdUI->Enable(FALSE);
4803 }
4804
4805 /*
4806  =======================================================================================================================
4807  =======================================================================================================================
4808  */
4809 void CMainFrame::OnViewCubein() {
4810         g_PrefsDlg.m_nCubicScale--;
4811         if (g_PrefsDlg.m_nCubicScale < 1) {
4812                 g_PrefsDlg.m_nCubicScale = 1;
4813         }
4814
4815         g_PrefsDlg.SavePrefs();
4816         Sys_UpdateWindows(W_CAMERA);
4817         SetTexValStatus();
4818 }
4819
4820 /*
4821  =======================================================================================================================
4822  =======================================================================================================================
4823  */
4824 void CMainFrame::OnViewCubeout() {
4825         g_PrefsDlg.m_nCubicScale++;
4826         if (g_PrefsDlg.m_nCubicScale > 99) {
4827                 g_PrefsDlg.m_nCubicScale = 99;
4828         }
4829
4830         g_PrefsDlg.SavePrefs();
4831         Sys_UpdateWindows(W_CAMERA);
4832         SetTexValStatus();
4833 }
4834
4835 /*
4836  =======================================================================================================================
4837  =======================================================================================================================
4838  */
4839 void CMainFrame::OnViewCubicclipping() {
4840         g_PrefsDlg.m_bCubicClipping ^= 1;
4841
4842         CMenu   *pMenu = GetMenu();
4843         if (pMenu) {
4844                 pMenu->CheckMenuItem
4845                         (
4846                                 ID_VIEW_CUBICCLIPPING,
4847                                 MF_BYCOMMAND | (g_PrefsDlg.m_bCubicClipping) ? MF_CHECKED : MF_UNCHECKED
4848                         );
4849         }
4850
4851         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_VIEW_CUBICCLIPPING, (g_PrefsDlg.m_bCubicClipping) ? TRUE : FALSE);
4852         g_PrefsDlg.SavePrefs();
4853         Map_BuildBrushData();
4854         Sys_UpdateWindows(W_CAMERA);
4855 }
4856
4857 /*
4858  =======================================================================================================================
4859  =======================================================================================================================
4860  */
4861 void CMainFrame::OnFileSaveregion() {
4862         SaveAsDialog(true);
4863 }
4864
4865 /*
4866  =======================================================================================================================
4867  =======================================================================================================================
4868  */
4869 void CMainFrame::OnUpdateFileSaveregion(CCmdUI *pCmdUI) {
4870         pCmdUI->Enable (static_cast<BOOL>(region_active));
4871 }
4872
4873 /*
4874  =======================================================================================================================
4875  =======================================================================================================================
4876  */
4877 void CMainFrame::OnSelectionMovedown() {
4878         Undo_Start("move up");
4879         Undo_AddBrushList(&selected_brushes);
4880
4881         idVec3  vAmt;
4882         vAmt[0] = vAmt[1] = 0.0f;
4883         vAmt[2] = -g_qeglobals.d_gridsize;
4884         Select_Move(vAmt);
4885         Sys_UpdateWindows(W_CAMERA | W_XY | W_Z);
4886
4887         Undo_EndBrushList(&selected_brushes);
4888         Undo_End();
4889 }
4890
4891 /*
4892  =======================================================================================================================
4893  =======================================================================================================================
4894  */
4895 void CMainFrame::OnSelectionMoveup() {
4896         idVec3  vAmt;
4897         vAmt[0] = vAmt[1] = 0.0f;
4898         vAmt[2] = g_qeglobals.d_gridsize;
4899         Select_Move(vAmt);
4900         Sys_UpdateWindows(W_CAMERA | W_XY | W_Z);
4901 }
4902
4903 /*
4904  =======================================================================================================================
4905  =======================================================================================================================
4906  */
4907 void CMainFrame::OnToolbarMain() {
4908 }
4909
4910 /*
4911  =======================================================================================================================
4912  =======================================================================================================================
4913  */
4914 void CMainFrame::OnToolbarTexture() {
4915 }
4916
4917 /*
4918  =======================================================================================================================
4919  =======================================================================================================================
4920  */
4921 void CMainFrame::OnSelectionPrint() {
4922         for (brush_t * b = selected_brushes.next; b != &selected_brushes; b = b->next) {
4923                 Brush_Print(b);
4924         }
4925 }
4926
4927 /*
4928  =======================================================================================================================
4929  =======================================================================================================================
4930  */
4931 void CMainFrame::UpdateTextureBar() {
4932         if (m_wndTextureBar.GetSafeHwnd()) {
4933                 m_wndTextureBar.GetSurfaceAttributes();
4934         }
4935 }
4936
4937 bool    g_bTABDown = false;
4938 bool    g_bOriginalFlag;
4939
4940 /*
4941  =======================================================================================================================
4942  =======================================================================================================================
4943  */
4944 void CMainFrame::OnSelectionTogglesizepaint() {
4945         if (::GetAsyncKeyState('Q')) {
4946                 if (!g_bTABDown) {
4947                         g_bTABDown = true;
4948                         g_bOriginalFlag = ( g_PrefsDlg.m_bSizePaint != FALSE );
4949                         g_PrefsDlg.m_bSizePaint = !g_bOriginalFlag;
4950                         Sys_UpdateWindows(W_XY);
4951                         return;
4952                 }
4953         }
4954         else {
4955                 g_bTABDown = false;
4956                 g_PrefsDlg.m_bSizePaint = g_bOriginalFlag;
4957                 Sys_UpdateWindows(W_XY);
4958                 return;
4959         }
4960 }
4961
4962 /*
4963  =======================================================================================================================
4964  =======================================================================================================================
4965  */
4966 void CMainFrame::OnBrushMakecone() {
4967         Undo_Start("make cone");
4968         Undo_AddBrushList(&selected_brushes);
4969         DoSides(true);
4970         Undo_EndBrushList(&selected_brushes);
4971         Undo_End();
4972 }
4973
4974 /*
4975  =======================================================================================================================
4976  =======================================================================================================================
4977  */
4978 void CMainFrame::OnTexturesLoad() {
4979         BROWSEINFO      bi;
4980         CString         strPath;
4981         char            *p = strPath.GetBuffer(MAX_PATH + 1);
4982         bi.hwndOwner = GetSafeHwnd();
4983         bi.pidlRoot = NULL;
4984         bi.pszDisplayName = p;
4985         bi.lpszTitle = "Load textures from path";
4986         bi.ulFlags = 0;
4987         bi.lpfn = NULL;
4988         bi.lParam = NULL;
4989         bi.iImage = 0;
4990
4991         LPITEMIDLIST    pidlBrowse;
4992         pidlBrowse = SHBrowseForFolder(&bi);
4993         if (pidlBrowse) {
4994                 SHGetPathFromIDList(pidlBrowse, p);
4995                 strPath.ReleaseBuffer();
4996                 AddSlash(strPath);
4997                 //FIXME: idMaterial
4998                 //Texture_ShowDirectory(strPath.GetBuffer(0));
4999         }
5000 }
5001
5002 /*
5003  =======================================================================================================================
5004  =======================================================================================================================
5005  */
5006 void CMainFrame::OnToggleRotatelock() {
5007         g_qeglobals.flatRotation = false;
5008         g_qeglobals.rotateAxis++;
5009         if (g_qeglobals.rotateAxis > 2) {
5010                 g_qeglobals.rotateAxis = 0;
5011         }
5012         Select_InitializeRotation();
5013         Sys_UpdateWindows(W_CAMERA | W_XY);
5014 }
5015
5016 /*
5017  =======================================================================================================================
5018  =======================================================================================================================
5019  */
5020 void CMainFrame::OnCurveBevel() {
5021         // Curve_MakeCurvedBrush (false, false, false, false, false, true, true);
5022 }
5023
5024 /*
5025  =======================================================================================================================
5026  =======================================================================================================================
5027  */
5028 void CMainFrame::OnCurveCylinder() {
5029         // Curve_MakeCurvedBrush (false, false, false, true, true, true, true);
5030 }
5031
5032 /*
5033  =======================================================================================================================
5034  =======================================================================================================================
5035  */
5036 void CMainFrame::OnCurveEighthsphere() {
5037         // Curve_MakeCurvedBrush (false, true, false, true, true, false, false);
5038 }
5039
5040 /*
5041  =======================================================================================================================
5042  =======================================================================================================================
5043  */
5044 void CMainFrame::OnCurveEndcap() {
5045         // Curve_MakeCurvedBrush (false, false, false, false, true, true, true);
5046 }
5047
5048 /*
5049  =======================================================================================================================
5050  =======================================================================================================================
5051  */
5052 void CMainFrame::OnCurveHemisphere() {
5053         // Curve_MakeCurvedBrush (false, true, false, true, true, true, true);
5054 }
5055
5056 /*
5057  =======================================================================================================================
5058  =======================================================================================================================
5059  */
5060 void CMainFrame::OnCurveInvertcurve() {
5061         // Curve_Invert ();
5062 }
5063
5064 /*
5065  =======================================================================================================================
5066  =======================================================================================================================
5067  */
5068 void CMainFrame::OnCurveQuarter() {
5069         // Curve_MakeCurvedBrush (false, true, false, true, true, true, false);
5070 }
5071
5072 /*
5073  =======================================================================================================================
5074  =======================================================================================================================
5075  */
5076 void CMainFrame::OnCurveSphere() {
5077         // Curve_MakeCurvedBrush (false, true, true, true, true, true, true);
5078 }
5079
5080 /*
5081  =======================================================================================================================
5082  =======================================================================================================================
5083  */
5084 void CMainFrame::OnFileImportmap() {
5085         CFileDialog dlgFile(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "Map files (*.map)|*.map||", this);
5086         if (dlgFile.DoModal() == IDOK) {
5087                 Map_ImportFile(dlgFile.GetPathName().GetBuffer(0));
5088         }
5089 }
5090
5091 /*
5092  =======================================================================================================================
5093  =======================================================================================================================
5094  */
5095 void CMainFrame::OnFileExportmap() {
5096         CFileDialog dlgFile(FALSE, "map", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "Map files (*.map)|*.map||", this);
5097         if (dlgFile.DoModal() == IDOK) {
5098                 Map_SaveSelected(dlgFile.GetPathName().GetBuffer(0));
5099         }
5100 }
5101
5102 /*
5103  =======================================================================================================================
5104  =======================================================================================================================
5105  */
5106 void CMainFrame::OnViewShowcurves() {
5107         if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CURVES) & EXCLUDE_CURVES) {
5108                 CheckMenuItem(::GetMenu(GetSafeHwnd()), ID_VIEW_SHOWCURVES, MF_BYCOMMAND | MF_UNCHECKED);
5109         }
5110         else {
5111                 CheckMenuItem(::GetMenu(GetSafeHwnd()), ID_VIEW_SHOWCURVES, MF_BYCOMMAND | MF_CHECKED);
5112         }
5113
5114         Sys_UpdateWindows(W_XY | W_CAMERA);
5115 }
5116
5117 /*
5118  =======================================================================================================================
5119  =======================================================================================================================
5120  */
5121 void CMainFrame::OnSelectionSelectNudgedown() {
5122         NudgeSelection(3, g_qeglobals.d_savedinfo.m_nTextureTweak);
5123 }
5124
5125 /*
5126  =======================================================================================================================
5127  =======================================================================================================================
5128  */
5129 void CMainFrame::OnSelectionSelectNudgeleft() {
5130         NudgeSelection(0, g_qeglobals.d_savedinfo.m_nTextureTweak);
5131 }
5132
5133 /*
5134  =======================================================================================================================
5135  =======================================================================================================================
5136  */
5137 void CMainFrame::OnSelectionSelectNudgeright() {
5138         NudgeSelection(2, g_qeglobals.d_savedinfo.m_nTextureTweak);
5139 }
5140
5141 /*
5142  =======================================================================================================================
5143  =======================================================================================================================
5144  */
5145 void CMainFrame::OnSelectionSelectNudgeup() {
5146         NudgeSelection(1, g_qeglobals.d_savedinfo.m_nTextureTweak);
5147 }
5148
5149 /*
5150  =======================================================================================================================
5151  =======================================================================================================================
5152  */
5153 void CMainFrame::NudgeSelection(int nDirection, float fAmount) {
5154         if (ActiveXY()->RotateMode()) {
5155                 int nAxis = 0;
5156                 if (ActiveXY()->GetViewType() == XY) {
5157                         nAxis = 2;
5158                 } else if (g_pParentWnd->ActiveXY()->GetViewType() == XZ) {
5159                         nAxis = 1;
5160                         fAmount = -fAmount;
5161                 }
5162
5163                 if (nDirection == 2 || nDirection == 3) {
5164                         fAmount = -fAmount;
5165                 }
5166
5167                 float   fDeg = -fAmount;
5168
5169                 g_pParentWnd->ActiveXY()->Rotation()[nAxis] += fAmount;
5170
5171                 CString strStatus;
5172                 strStatus.Format
5173                         (
5174                                 "Rotation x:: %.1f  y:: %.1f  z:: %.1f",
5175                                 g_pParentWnd->ActiveXY()->Rotation()[0],
5176                                 g_pParentWnd->ActiveXY()->Rotation()[1],
5177                                 g_pParentWnd->ActiveXY()->Rotation()[2]
5178                         );
5179                 g_pParentWnd->SetStatusText(2, strStatus);
5180                 Select_RotateAxis(nAxis, fDeg, false, true);
5181                 Sys_UpdateWindows(W_ALL);
5182         }
5183         else if (ActiveXY()->ScaleMode()) {
5184                 if (nDirection == 0 || nDirection == 3) {
5185                         fAmount = -fAmount;
5186                 }
5187
5188                 idVec3  v;
5189                 v[0] = v[1] = v[2] = 1.0f;
5190                 if (fAmount > 0) {
5191                         v[0] = 1.1f;
5192                         v[1] = 1.1f;
5193                         v[2] = 1.1f;
5194                 }
5195                 else {
5196                         v[0] = 0.9f;
5197                         v[1] = 0.9f;
5198                         v[2] = 0.9f;
5199                 }
5200
5201                 Select_Scale
5202                 (
5203                         (g_nScaleHow & SCALE_X) ? v[0] : 1.0f,
5204                         (g_nScaleHow & SCALE_Y) ? v[1] : 1.0f,
5205                         (g_nScaleHow & SCALE_Z) ? v[2] : 1.0f
5206                 );
5207                 Sys_UpdateWindows(W_ALL);
5208         }
5209         else {
5210                 // 0 - left, 1 - up, 2 - right, 3 - down
5211                 int nDim;
5212                 if (nDirection == 0) {
5213                         nDim = ActiveXY()->GetViewType() == YZ ? 1 : 0;
5214                         fAmount = -fAmount;
5215                 }
5216                 else if (nDirection == 1) {
5217                         nDim = ActiveXY()->GetViewType() == XY ? 1 : 2;
5218                 }
5219                 else if (nDirection == 2) {
5220                         nDim = ActiveXY()->GetViewType() == YZ ? 1 : 0;
5221                 }
5222                 else {
5223                         nDim = ActiveXY()->GetViewType() == XY ? 1 : 2;
5224                         fAmount = -fAmount;
5225                 }
5226
5227                 Nudge(nDim, fAmount);
5228         }
5229 }
5230
5231 /*
5232  =======================================================================================================================
5233  =======================================================================================================================
5234  */
5235 BOOL CMainFrame::PreTranslateMessage(MSG *pMsg) {
5236         return CFrameWnd::PreTranslateMessage(pMsg);
5237 }
5238
5239 /*
5240  =======================================================================================================================
5241  =======================================================================================================================
5242  */
5243 void CMainFrame::Nudge(int nDim, float fNudge) {
5244         idVec3  vMove;
5245         vMove[0] = vMove[1] = vMove[2] = 0;
5246         vMove[nDim] = fNudge;
5247         Select_Move(vMove, true);
5248         Sys_UpdateWindows(W_ALL);
5249 }
5250
5251 /*
5252  =======================================================================================================================
5253  =======================================================================================================================
5254  */
5255 void CMainFrame::OnTexturesLoadlist() {
5256         CDialogTextures dlg;
5257         dlg.DoModal();
5258 }
5259
5260 /*
5261  =======================================================================================================================
5262  =======================================================================================================================
5263  */
5264 void CMainFrame::OnSelectByBoundingBrush() {
5265         g_PrefsDlg.m_selectByBoundingBrush ^= 1;
5266         m_wndToolBar.GetToolBarCtrl().CheckButton
5267                 (
5268                         ID_SELECT_BYBOUNDINGBRUSH,
5269                         (g_PrefsDlg.m_selectByBoundingBrush) ? TRUE : FALSE
5270                 );
5271 }
5272
5273 /*
5274  =======================================================================================================================
5275  =======================================================================================================================
5276  */
5277 void CMainFrame::OnSelectBrushesOnly() {
5278         g_PrefsDlg.m_selectOnlyBrushes ^= 1;
5279         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_SELECT_BRUSHESONLY, (g_PrefsDlg.m_selectOnlyBrushes) ? TRUE : FALSE);
5280 }
5281
5282
5283
5284
5285 /*
5286  =======================================================================================================================
5287  =======================================================================================================================
5288  */
5289 void CMainFrame::OnDynamicLighting() {
5290         CCamWnd *pCam = new CCamWnd();
5291         CRect   rect(100, 100, 300, 300);
5292         pCam->Create(CAMERA_WINDOW_CLASS, "", WS_OVERLAPPEDWINDOW, rect, GetDesktopWindow(), 12345);
5293         pCam->ShowWindow(SW_SHOW);
5294 }
5295
5296 /*
5297  =======================================================================================================================
5298  =======================================================================================================================
5299  */
5300 void CMainFrame::OnCurveSimplepatchmesh() {
5301         Undo_Start("make simpe patch mesh");
5302         Undo_AddBrushList(&selected_brushes);
5303
5304         CPatchDensityDlg        dlg;
5305         dlg.DoModal();
5306
5307         Undo_EndBrushList(&selected_brushes);
5308         Undo_End();
5309 }
5310
5311 /*
5312  =======================================================================================================================
5313  =======================================================================================================================
5314  */
5315 void CMainFrame::OnPatchToggleBox() {
5316         g_bPatchShowBounds ^= 1;
5317         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_PATCH_SHOWBOUNDINGBOX, (g_bPatchShowBounds) ? TRUE : FALSE);
5318         Sys_UpdateWindows(W_ALL);
5319 }
5320
5321 /*
5322  =======================================================================================================================
5323  =======================================================================================================================
5324  */
5325 void CMainFrame::OnPatchWireframe() {
5326         g_bPatchWireFrame ^= 1;
5327         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_PATCH_WIREFRAME, (g_bPatchWireFrame) ? TRUE : FALSE);
5328         Sys_UpdateWindows(W_ALL);
5329 }
5330
5331 /*
5332  =======================================================================================================================
5333  =======================================================================================================================
5334  */
5335 void CMainFrame::OnCurvePatchcone() {
5336         Undo_Start("make curve cone");
5337         Undo_AddBrushList(&selected_brushes);
5338         Patch_BrushToMesh(true);
5339         Sys_UpdateWindows(W_ALL);
5340         Undo_EndBrushList(&selected_brushes);
5341         Undo_End();
5342 }
5343
5344 /*
5345  =======================================================================================================================
5346  =======================================================================================================================
5347  */
5348 void CMainFrame::OnCurvePatchtube() {
5349         Undo_Start("make curve cylinder");
5350         Undo_AddBrushList(&selected_brushes);
5351         Patch_BrushToMesh(false);
5352         Sys_UpdateWindows(W_ALL);
5353         Undo_EndBrushList(&selected_brushes);
5354         Undo_End();
5355 }
5356
5357 /*
5358  =======================================================================================================================
5359  =======================================================================================================================
5360  */
5361 void CMainFrame::OnPatchWeld() {
5362         g_bPatchWeld ^= 1;
5363         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_PATCH_WELD, (g_bPatchWeld) ? TRUE : FALSE);
5364         Sys_UpdateWindows(W_ALL);
5365 }
5366
5367 /*
5368  =======================================================================================================================
5369  =======================================================================================================================
5370  */
5371 void CMainFrame::OnCurvePatchbevel() {
5372         Undo_Start("make bevel");
5373         Undo_AddBrushList(&selected_brushes);
5374         Patch_BrushToMesh(false, true, false);
5375         Sys_UpdateWindows(W_ALL);
5376         Undo_EndBrushList(&selected_brushes);
5377         Undo_End();
5378 }
5379
5380 /*
5381  =======================================================================================================================
5382  =======================================================================================================================
5383  */
5384 void CMainFrame::OnCurvePatchendcap() {
5385         Undo_Start("make end cap");
5386         Undo_AddBrushList(&selected_brushes);
5387         Patch_BrushToMesh(false, false, true);
5388         Sys_UpdateWindows(W_ALL);
5389         Undo_EndBrushList(&selected_brushes);
5390         Undo_End();
5391 }
5392
5393 /*
5394  =======================================================================================================================
5395  =======================================================================================================================
5396  */
5397 void CMainFrame::OnCurvePatchinvertedbevel() {
5398         // Patch_BrushToMesh(false, true, false, true); Sys_UpdateWindows (W_ALL);
5399 }
5400
5401 /*
5402  =======================================================================================================================
5403  =======================================================================================================================
5404  */
5405 void CMainFrame::OnCurvePatchinvertedendcap() {
5406         // Patch_BrushToMesh(false, false, true, true); Sys_UpdateWindows (W_ALL);
5407 }
5408
5409 /*
5410  =======================================================================================================================
5411  =======================================================================================================================
5412  */
5413 void CMainFrame::OnPatchDrilldown() {
5414         g_bPatchDrillDown ^= 1;
5415         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_PATCH_DRILLDOWN, (g_bPatchDrillDown) ? TRUE : FALSE);
5416         Sys_UpdateWindows(W_ALL);
5417 }
5418
5419 /*
5420  =======================================================================================================================
5421  =======================================================================================================================
5422  */
5423 void CMainFrame::OnCurveInsertcolumn() {
5424         Undo_Start("insert colum");
5425         Undo_AddBrushList(&selected_brushes);
5426
5427         // Patch_AdjustSelectedRowCols(0, 2);
5428         Patch_AdjustSelected(true, true, true);
5429         Sys_UpdateWindows(W_ALL);
5430         Undo_EndBrushList(&selected_brushes);
5431         Undo_End();
5432 }
5433
5434 /*
5435  =======================================================================================================================
5436  =======================================================================================================================
5437  */
5438 void CMainFrame::OnCurveInsertrow() {
5439         Undo_Start("insert row");
5440         Undo_AddBrushList(&selected_brushes);
5441
5442         // Patch_AdjustSelectedRowCols(2, 0);
5443         Patch_AdjustSelected(true, false, true);
5444         Sys_UpdateWindows(W_ALL);
5445         Undo_EndBrushList(&selected_brushes);
5446         Undo_End();
5447 }
5448
5449 /*
5450  =======================================================================================================================
5451  =======================================================================================================================
5452  */
5453 void CMainFrame::OnCurveDeletecolumn() {
5454         Undo_Start("delete column");
5455         Undo_AddBrushList(&selected_brushes);
5456         Patch_AdjustSelected(false, true, true);
5457         Sys_UpdateWindows(W_ALL);
5458         Undo_EndBrushList(&selected_brushes);
5459         Undo_End();
5460 }
5461
5462 /*
5463  =======================================================================================================================
5464  =======================================================================================================================
5465  */
5466 void CMainFrame::OnCurveDeleterow() {
5467         Undo_Start("delete row");
5468         Undo_AddBrushList(&selected_brushes);
5469         Patch_AdjustSelected(false, false, true);
5470         Sys_UpdateWindows(W_ALL);
5471         Undo_EndBrushList(&selected_brushes);
5472         Undo_End();
5473 }
5474
5475 /*
5476  =======================================================================================================================
5477  =======================================================================================================================
5478  */
5479 void CMainFrame::OnCurveInsertAddcolumn() {
5480         Undo_Start("add (2) columns");
5481         Undo_AddBrushList(&selected_brushes);
5482         Patch_AdjustSelected(true, true, true);
5483         Sys_UpdateWindows(W_ALL);
5484         Undo_EndBrushList(&selected_brushes);
5485         Undo_End();
5486 }
5487
5488 /*
5489  =======================================================================================================================
5490  =======================================================================================================================
5491  */
5492 void CMainFrame::OnCurveInsertAddrow() {
5493         Undo_Start("add (2) rows");
5494         Undo_AddBrushList(&selected_brushes);
5495         Patch_AdjustSelected(true, false, true);
5496         Sys_UpdateWindows(W_ALL);
5497         Undo_EndBrushList(&selected_brushes);
5498         Undo_End();
5499 }
5500
5501 /*
5502  =======================================================================================================================
5503  =======================================================================================================================
5504  */
5505 void CMainFrame::OnCurveInsertInsertcolumn() {
5506         Undo_Start("insert (2) columns");
5507         Undo_AddBrushList(&selected_brushes);
5508         Patch_AdjustSelected(true, true, false);
5509         Sys_UpdateWindows(W_ALL);
5510         Undo_EndBrushList(&selected_brushes);
5511         Undo_End();
5512 }
5513
5514 /*
5515  =======================================================================================================================
5516  =======================================================================================================================
5517  */
5518 void CMainFrame::OnCurveInsertInsertrow() {
5519         Undo_Start("insert (2) rows");
5520         Undo_AddBrushList(&selected_brushes);
5521         Patch_AdjustSelected(true, false, false);
5522         Sys_UpdateWindows(W_ALL);
5523         Undo_EndBrushList(&selected_brushes);
5524         Undo_End();
5525 }
5526
5527 /*
5528  =======================================================================================================================
5529  =======================================================================================================================
5530  */
5531 void CMainFrame::OnCurveNegative() {
5532         Patch_ToggleInverted();
5533
5534         // Sys_UpdateWindows(W_ALL);
5535 }
5536
5537 /*
5538  =======================================================================================================================
5539  =======================================================================================================================
5540  */
5541 void CMainFrame::OnCurveNegativeTextureX() {
5542         Select_FlipTexture(false);
5543
5544         // Sys_UpdateWindows(W_ALL);
5545 }
5546
5547 /*
5548  =======================================================================================================================
5549  =======================================================================================================================
5550  */
5551 void CMainFrame::OnCurveNegativeTextureY() {
5552         Select_FlipTexture(true);
5553         // Sys_UpdateWindows(W_ALL);
5554 }
5555
5556 /*
5557  =======================================================================================================================
5558  =======================================================================================================================
5559  */
5560 void CMainFrame::OnCurveDeleteFirstcolumn() {
5561         Undo_Start("delete first (2) columns");
5562         Undo_AddBrushList(&selected_brushes);
5563         Patch_AdjustSelected(false, true, true);
5564         Sys_UpdateWindows(W_ALL);
5565         Undo_EndBrushList(&selected_brushes);
5566         Undo_End();
5567 }
5568
5569 /*
5570  =======================================================================================================================
5571  =======================================================================================================================
5572  */
5573 void CMainFrame::OnCurveDeleteFirstrow() {
5574         Undo_Start("delete first (2) rows");
5575         Undo_AddBrushList(&selected_brushes);
5576         Patch_AdjustSelected(false, false, true);
5577         Sys_UpdateWindows(W_ALL);
5578         Undo_EndBrushList(&selected_brushes);
5579         Undo_End();
5580 }
5581
5582 /*
5583  =======================================================================================================================
5584  =======================================================================================================================
5585  */
5586 void CMainFrame::OnCurveDeleteLastcolumn() {
5587         Undo_Start("delete last (2) columns");
5588         Undo_AddBrushList(&selected_brushes);
5589         Patch_AdjustSelected(false, true, false);
5590         Sys_UpdateWindows(W_ALL);
5591         Undo_EndBrushList(&selected_brushes);
5592         Undo_End();
5593 }
5594
5595 /*
5596  =======================================================================================================================
5597  =======================================================================================================================
5598  */
5599 void CMainFrame::OnCurveDeleteLastrow() {
5600         Undo_Start("delete last (2) rows");
5601         Undo_AddBrushList(&selected_brushes);
5602         Patch_AdjustSelected(false, false, false);
5603         Sys_UpdateWindows(W_ALL);
5604         Undo_EndBrushList(&selected_brushes);
5605         Undo_End();
5606 }
5607
5608 /*
5609  =======================================================================================================================
5610  =======================================================================================================================
5611  */
5612 void CMainFrame::OnPatchBend() {
5613         Patch_BendToggle();
5614         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_PATCH_BEND, (g_bPatchBendMode) ? TRUE : FALSE);
5615         Sys_UpdateWindows(W_ALL);
5616 }
5617
5618 /*
5619  =======================================================================================================================
5620  =======================================================================================================================
5621  */
5622 void CMainFrame::OnPatchInsdel() {
5623         Patch_InsDelToggle();
5624         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_PATCH_INSDEL, (g_bPatchInsertMode) ? TRUE : FALSE);
5625         Sys_UpdateWindows(W_ALL);
5626 }
5627
5628 /*
5629  =======================================================================================================================
5630  =======================================================================================================================
5631  */
5632 void CMainFrame::OnPatchEnter() {
5633 }
5634
5635 /*
5636  =======================================================================================================================
5637  =======================================================================================================================
5638  */
5639 extern bool Sys_KeyDown(int key);
5640 void CMainFrame::OnPatchTab() {
5641         if (g_bPatchBendMode) {
5642                 Patch_BendHandleTAB();
5643         }
5644         else if (g_bPatchInsertMode) {
5645                 Patch_InsDelHandleTAB();
5646         }
5647         else if (g_bAxialMode) {
5648                 int faceCount = g_ptrSelectedFaces.GetSize();
5649                 if (faceCount > 0) {
5650                         face_t  *selFace = reinterpret_cast < face_t * > (g_ptrSelectedFaces.GetAt(0));
5651                         int *ip = (Sys_KeyDown(VK_SHIFT)) ? &g_axialAnchor : &g_axialDest;
5652                         (*ip)++;
5653                         if ( *ip >= selFace->face_winding->GetNumPoints() ) {
5654                                 *ip = 0;
5655                         }
5656                 }
5657                 Sys_UpdateWindows(W_CAMERA);
5658         } else {
5659                 //
5660                 // check to see if the selected brush is part of a func group if it is, deselect
5661                 // everything and reselect the next brush in the group
5662                 //
5663                 brush_t         *b = selected_brushes.next;
5664                 entity_t        *e;
5665                 if (b != &selected_brushes) {
5666                         if ( idStr::Icmp(b->owner->eclass->name, "worldspawn") != 0 ) {
5667                                 e = b->owner;
5668                                 Select_Deselect();
5669                                 brush_t *b2;
5670                                 for (b2 = e->brushes.onext; b2 != &e->brushes; b2 = b2->onext) {
5671                                         if (b == b2) {
5672                                                 b2 = b2->onext;
5673                                                 break;
5674                                         }
5675                                 }
5676
5677                                 if (b2 == &e->brushes) {
5678                                         b2 = b2->onext;
5679                                 }
5680
5681                                 Select_Brush(b2, false);
5682                                 Sys_UpdateWindows(W_ALL);
5683                         }
5684                 } 
5685         }
5686 }
5687
5688 /*
5689  =======================================================================================================================
5690  =======================================================================================================================
5691  */
5692 void CMainFrame::UpdatePatchToolbarButtons() {
5693         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_PATCH_BEND, (g_bPatchBendMode) ? TRUE : FALSE);
5694         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_PATCH_INSDEL, (g_bPatchInsertMode) ? TRUE : FALSE);
5695 }
5696
5697 /*
5698  =======================================================================================================================
5699  =======================================================================================================================
5700  */
5701 void CMainFrame::OnCurvePatchdensetube() {
5702         Undo_Start("dense cylinder");
5703         Undo_AddBrushList(&selected_brushes);
5704
5705         Patch_BrushToMesh(false);
5706         OnCurveInsertAddrow();
5707         OnCurveInsertInsertrow();
5708         Sys_UpdateWindows(W_ALL);
5709
5710         Undo_EndBrushList(&selected_brushes);
5711         Undo_End();
5712 }
5713
5714 /*
5715  =======================================================================================================================
5716  =======================================================================================================================
5717  */
5718 void CMainFrame::OnCurvePatchverydensetube() {
5719         Undo_Start("very dense cylinder");
5720         Undo_AddBrushList(&selected_brushes);
5721
5722         Patch_BrushToMesh(false);
5723         OnCurveInsertAddrow();
5724         OnCurveInsertInsertrow();
5725         OnCurveInsertAddrow();
5726         OnCurveInsertInsertrow();
5727         Sys_UpdateWindows(W_ALL);
5728
5729         Undo_EndBrushList(&selected_brushes);
5730         Undo_End();
5731 }
5732
5733 /*
5734  =======================================================================================================================
5735  =======================================================================================================================
5736  */
5737 void CMainFrame::OnCurveCap() {
5738         Patch_CapCurrent();
5739         Sys_UpdateWindows(W_ALL);
5740 }
5741
5742 /*
5743  =======================================================================================================================
5744  =======================================================================================================================
5745  */
5746 void CMainFrame::OnCurveCapInvertedbevel() {
5747         Patch_CapCurrent(true);
5748         Sys_UpdateWindows(W_ALL);
5749 }
5750
5751 /*
5752  =======================================================================================================================
5753  =======================================================================================================================
5754  */
5755 void CMainFrame::OnCurveCapInvertedendcap() {
5756         Patch_CapCurrent(false, true);
5757         Sys_UpdateWindows(W_ALL);
5758 }
5759
5760 /*
5761  =======================================================================================================================
5762  =======================================================================================================================
5763  */
5764 void CMainFrame::OnCurveRedisperseCols() {
5765         Patch_DisperseColumns();
5766         Sys_UpdateWindows(W_ALL);
5767 }
5768
5769 /*
5770  =======================================================================================================================
5771  =======================================================================================================================
5772  */
5773 void CMainFrame::OnCurveRedisperseRows() {
5774         Patch_DisperseRows();
5775         Sys_UpdateWindows(W_ALL);
5776 }
5777
5778 /*
5779  =======================================================================================================================
5780  =======================================================================================================================
5781  */
5782 void CMainFrame::OnPatchNaturalize() {
5783         Patch_NaturalizeSelected();
5784         Sys_UpdateWindows(W_ALL);
5785 }
5786
5787 /*
5788  =======================================================================================================================
5789  =======================================================================================================================
5790  */
5791 void CMainFrame::OnPatchNaturalizeAlt() {
5792         Patch_NaturalizeSelected(false, false, true);
5793         Sys_UpdateWindows(W_ALL);
5794 }
5795
5796 /*
5797  =======================================================================================================================
5798  =======================================================================================================================
5799  */
5800 void CMainFrame::OnSnapToGrid() {
5801         Select_SnapToGrid();
5802         Sys_UpdateWindows(W_ALL);
5803 }
5804
5805 /*
5806  =======================================================================================================================
5807  =======================================================================================================================
5808  */
5809 void CMainFrame::OnCurvePatchsquare() {
5810         Undo_Start("square cylinder");
5811         Undo_AddBrushList(&selected_brushes);
5812
5813         Patch_BrushToMesh(false, false, false, true);
5814         Sys_UpdateWindows(W_ALL);
5815
5816         Undo_EndBrushList(&selected_brushes);
5817         Undo_End();
5818 }
5819
5820 /*
5821  =======================================================================================================================
5822  =======================================================================================================================
5823  */
5824 void CMainFrame::CheckTextureScale(int id) {
5825         CMenu   *pMenu = GetMenu();
5826         if (pMenu) {
5827                 pMenu->CheckMenuItem(ID_TEXTURES_TEXTUREWINDOWSCALE_10, MF_BYCOMMAND | MF_UNCHECKED);
5828                 pMenu->CheckMenuItem(ID_TEXTURES_TEXTUREWINDOWSCALE_25, MF_BYCOMMAND | MF_UNCHECKED);
5829                 pMenu->CheckMenuItem(ID_TEXTURES_TEXTUREWINDOWSCALE_50, MF_BYCOMMAND | MF_UNCHECKED);
5830                 pMenu->CheckMenuItem(ID_TEXTURES_TEXTUREWINDOWSCALE_100, MF_BYCOMMAND | MF_UNCHECKED);
5831                 pMenu->CheckMenuItem(ID_TEXTURES_TEXTUREWINDOWSCALE_200, MF_BYCOMMAND | MF_UNCHECKED);
5832                 pMenu->CheckMenuItem(id, MF_BYCOMMAND | MF_CHECKED);
5833         }
5834
5835         g_PrefsDlg.SavePrefs();
5836         //FIXME: idMaterial
5837         //Texture_ResetPosition();
5838         Sys_UpdateWindows(W_TEXTURE);
5839 }
5840
5841 /*
5842  =======================================================================================================================
5843  =======================================================================================================================
5844  */
5845 void CMainFrame::OnTexturesTexturewindowscale10() {
5846         g_PrefsDlg.m_nTextureScale = 10;
5847         CheckTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_10);
5848 }
5849
5850 /*
5851  =======================================================================================================================
5852  =======================================================================================================================
5853  */
5854 void CMainFrame::OnTexturesTexturewindowscale100() {
5855         g_PrefsDlg.m_nTextureScale = 100;
5856         CheckTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_100);
5857 }
5858
5859 /*
5860  =======================================================================================================================
5861  =======================================================================================================================
5862  */
5863 void CMainFrame::OnTexturesTexturewindowscale200() {
5864         g_PrefsDlg.m_nTextureScale = 200;
5865         CheckTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_200);
5866 }
5867
5868 /*
5869  =======================================================================================================================
5870  =======================================================================================================================
5871  */
5872 void CMainFrame::OnTexturesTexturewindowscale25() {
5873         g_PrefsDlg.m_nTextureScale = 25;
5874         CheckTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_25);
5875 }
5876
5877 /*
5878  =======================================================================================================================
5879  =======================================================================================================================
5880  */
5881 void CMainFrame::OnTexturesTexturewindowscale50() {
5882         g_PrefsDlg.m_nTextureScale = 50;
5883         CheckTextureScale(ID_TEXTURES_TEXTUREWINDOWSCALE_50);
5884 }
5885
5886 /*
5887  =======================================================================================================================
5888  =======================================================================================================================
5889  */
5890 void CMainFrame::OnTexturesFlush() {
5891         //FIXME: idMaterial
5892         //Texture_Flush();
5893         Sys_UpdateWindows(W_ALL);
5894 }
5895
5896 /*
5897  =======================================================================================================================
5898  =======================================================================================================================
5899  */
5900 void CMainFrame::OnCurveOverlayClear() {
5901         Patch_ClearOverlays();
5902         Sys_UpdateWindows(W_ALL);
5903 }
5904
5905 /*
5906  =======================================================================================================================
5907  =======================================================================================================================
5908  */
5909 void CMainFrame::OnCurveOverlaySet() {
5910         Patch_SetOverlays();
5911         Sys_UpdateWindows(W_ALL);
5912 }
5913
5914 /*
5915  =======================================================================================================================
5916  =======================================================================================================================
5917  */
5918 void CMainFrame::OnCurveThicken() {
5919         Undo_Start("curve thicken");
5920         Undo_AddBrushList(&selected_brushes);
5921
5922         CDialogThick    dlg;
5923         if ( dlg.DoModal() == IDOK ) {
5924                 Patch_Thicken( dlg.m_nAmount, ( dlg.m_bSeams != FALSE ) );
5925                 Sys_UpdateWindows(W_ALL);
5926         }
5927
5928         Undo_EndBrushList(&selected_brushes);
5929         Undo_End();
5930 }
5931
5932 /*
5933  =======================================================================================================================
5934  =======================================================================================================================
5935  */
5936 void CMainFrame::OnCurveCyclecap() {
5937         Patch_NaturalizeSelected(true, true);
5938         Sys_UpdateWindows(W_ALL);
5939 }
5940
5941 void CMainFrame::OnCurveCyclecapAlt() {
5942         Patch_NaturalizeSelected(true, true, true);
5943         Sys_UpdateWindows(W_ALL);
5944 }
5945
5946 /*
5947  =======================================================================================================================
5948  =======================================================================================================================
5949  */
5950 void CMainFrame::OnCurveMatrixTranspose() {
5951         Patch_Transpose();
5952         Sys_UpdateWindows(W_ALL);
5953 }
5954
5955 /*
5956  =======================================================================================================================
5957  =======================================================================================================================
5958  */
5959 void CMainFrame::OnTexturesReloadshaders() {
5960         CWaitCursor wait;
5961         declManager->Reload( false );
5962         Sys_UpdateWindows(W_ALL);
5963 }
5964
5965 /*
5966  =======================================================================================================================
5967  =======================================================================================================================
5968  */
5969 void CMainFrame::SetEntityCheck() {
5970         CMenu   *pMenu = GetMenu();
5971         if (pMenu) {
5972                 pMenu->CheckMenuItem(ID_VIEW_ENTITIESAS_WIREFRAME, MF_BYCOMMAND | (g_PrefsDlg.m_nEntityShowState == ENTITY_WIRE) ? MF_CHECKED : MF_UNCHECKED);
5973                 pMenu->CheckMenuItem(ID_VIEW_ENTITIESAS_SKINNED, MF_BYCOMMAND | (g_PrefsDlg.m_nEntityShowState == ENTITY_SKINNED) ? MF_CHECKED : MF_UNCHECKED);
5974         }
5975 }
5976
5977 /*
5978  =======================================================================================================================
5979  =======================================================================================================================
5980  */
5981 void CMainFrame::OnShowEntities() {
5982         HandlePopup(this, IDR_POPUP_ENTITY);
5983 }
5984
5985 /*
5986  =======================================================================================================================
5987  =======================================================================================================================
5988  */
5989 void CMainFrame::OnViewEntitiesasSkinned() {
5990         g_PrefsDlg.m_nEntityShowState = ENTITY_SKINNED;
5991         SetEntityCheck();
5992         g_PrefsDlg.SavePrefs();
5993         Sys_UpdateWindows(W_ALL);
5994 }
5995
5996 /*
5997  =======================================================================================================================
5998  =======================================================================================================================
5999  */
6000 void CMainFrame::OnViewEntitiesasWireframe() {
6001         g_PrefsDlg.m_nEntityShowState = ENTITY_WIRE;
6002         SetEntityCheck();
6003         g_PrefsDlg.SavePrefs();
6004         Sys_UpdateWindows(W_ALL);
6005 }
6006
6007 /*
6008  =======================================================================================================================
6009  =======================================================================================================================
6010  */
6011 void CMainFrame::OnViewShowhint() {
6012         if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_HINT) & EXCLUDE_HINT) {
6013                 CheckMenuItem(::GetMenu(GetSafeHwnd()), ID_VIEW_SHOWHINT, MF_BYCOMMAND | MF_UNCHECKED);
6014         }
6015         else {
6016                 CheckMenuItem(::GetMenu(GetSafeHwnd()), ID_VIEW_SHOWHINT, MF_BYCOMMAND | MF_CHECKED);
6017         }
6018
6019         Sys_UpdateWindows(W_XY | W_CAMERA);
6020 }
6021
6022 /*
6023  =======================================================================================================================
6024  =======================================================================================================================
6025  */
6026 void CMainFrame::OnTexturesShowall() {
6027         Texture_ShowAll();
6028 }
6029
6030 void CMainFrame::OnTexturesHideall() {
6031         Texture_HideAll();
6032 }
6033
6034 /*
6035  =======================================================================================================================
6036  =======================================================================================================================
6037  */
6038 void CMainFrame::OnPatchInspector() {
6039         DoPatchInspector();
6040 }
6041
6042 /*
6043  =======================================================================================================================
6044  =======================================================================================================================
6045  */
6046 void CMainFrame::OnViewOpengllighting() {
6047         g_PrefsDlg.m_bGLLighting ^= 1;
6048         g_PrefsDlg.SavePrefs();
6049         CheckMenuItem
6050         (
6051                 ::GetMenu(GetSafeHwnd()),
6052                 ID_VIEW_OPENGLLIGHTING,
6053                 MF_BYCOMMAND | (g_PrefsDlg.m_bGLLighting) ? MF_CHECKED : MF_UNCHECKED
6054         );
6055         Sys_UpdateWindows(W_XY | W_CAMERA);
6056 }
6057
6058 /*
6059  =======================================================================================================================
6060  =======================================================================================================================
6061  */
6062 void CMainFrame::OnSelectAll() {
6063         Select_AllOfType();
6064 }
6065
6066 /*
6067  =======================================================================================================================
6068  =======================================================================================================================
6069  */
6070 void CMainFrame::OnViewShowcaulk() {
6071         if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CAULK) & EXCLUDE_CAULK) {
6072                 CheckMenuItem(::GetMenu(GetSafeHwnd()), ID_VIEW_SHOWCAULK, MF_BYCOMMAND | MF_UNCHECKED);
6073         }
6074         else {
6075                 CheckMenuItem(::GetMenu(GetSafeHwnd()), ID_VIEW_SHOWCAULK, MF_BYCOMMAND | MF_CHECKED);
6076         }
6077
6078         Sys_UpdateWindows(W_XY | W_CAMERA);
6079 }
6080
6081 /*
6082  =======================================================================================================================
6083  =======================================================================================================================
6084  */
6085 void CMainFrame::OnCurveFreeze() {
6086         Patch_Freeze();
6087 }
6088
6089 /*
6090  =======================================================================================================================
6091  =======================================================================================================================
6092  */
6093 void CMainFrame::OnCurveUnFreeze() {
6094         Patch_UnFreeze(false);
6095 }
6096
6097 /*
6098  =======================================================================================================================
6099  =======================================================================================================================
6100  */
6101 void CMainFrame::OnCurveUnFreezeAll() {
6102         Patch_UnFreeze(true);
6103 }
6104
6105 /*
6106  =======================================================================================================================
6107  =======================================================================================================================
6108  */
6109 void CMainFrame::OnSelectReselect() {
6110         Select_Reselect();
6111 }
6112
6113 /*
6114  =======================================================================================================================
6115  =======================================================================================================================
6116  */
6117 void CMainFrame::OnViewShowangles() {
6118         if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_ANGLES) & EXCLUDE_ANGLES) {
6119                 CheckMenuItem(::GetMenu(GetSafeHwnd()), ID_VIEW_SHOWANGLES, MF_BYCOMMAND | MF_UNCHECKED);
6120         }
6121         else {
6122                 CheckMenuItem(::GetMenu(GetSafeHwnd()), ID_VIEW_SHOWANGLES, MF_BYCOMMAND | MF_CHECKED);
6123         }
6124
6125         Sys_UpdateWindows(W_XY | W_CAMERA);
6126 }
6127
6128 /*
6129  =======================================================================================================================
6130  =======================================================================================================================
6131  */
6132 void CMainFrame::OnEditSaveprefab() {
6133         CFileDialog dlgFile
6134                                 (
6135                                         FALSE,
6136                                         "pfb",
6137                                         NULL,
6138                                         OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
6139                                         "Prefab files (*.pfb)|*.pfb||",
6140                                         this
6141                                 );
6142         char            CurPath[1024];
6143         ::GetCurrentDirectory(1024, CurPath);
6144
6145         dlgFile.m_ofn.lpstrInitialDir = CurPath;
6146         if (dlgFile.DoModal() == IDOK) {
6147                 Map_SaveSelected(dlgFile.GetPathName().GetBuffer(0));
6148         }
6149 }
6150
6151 /*
6152  =======================================================================================================================
6153  =======================================================================================================================
6154  */
6155 void CMainFrame::OnEditLoadprefab() {
6156         CFileDialog dlgFile
6157                                 (
6158                                         TRUE,
6159                                         "pfb",
6160                                         NULL,
6161                                         OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
6162                                         "Prefab files (*.pfb)|*.pfb||",
6163                                         this
6164                                 );
6165         char            CurPath[1024];
6166         ::GetCurrentDirectory(1024, CurPath);
6167         dlgFile.m_ofn.lpstrInitialDir = CurPath;
6168         if (dlgFile.DoModal() == IDOK) {
6169                 Map_ImportFile(dlgFile.GetPathName().GetBuffer(0));
6170         }
6171 }
6172
6173 /*
6174  =======================================================================================================================
6175  =======================================================================================================================
6176  */
6177 void CMainFrame::OnCurveMoreendcapsbevelsSquarebevel() {
6178         Undo_Start("square bevel");
6179         Undo_AddBrushList(&selected_brushes);
6180
6181         Patch_BrushToMesh(false, true, false, true);
6182         Sys_UpdateWindows(W_ALL);
6183
6184         Undo_EndBrushList(&selected_brushes);
6185         Undo_End();
6186 }
6187
6188 /*
6189  =======================================================================================================================
6190  =======================================================================================================================
6191  */
6192 void CMainFrame::OnCurveMoreendcapsbevelsSquareendcap() {
6193         Undo_Start("square endcap");
6194         Undo_AddBrushList(&selected_brushes);
6195
6196         Patch_BrushToMesh(false, false, true, true);
6197         Sys_UpdateWindows(W_ALL);
6198
6199         Undo_EndBrushList(&selected_brushes);
6200         Undo_End();
6201 }
6202
6203 /*
6204  =======================================================================================================================
6205  =======================================================================================================================
6206  */
6207 void CMainFrame::OnBrushPrimitivesSphere() {
6208         Undo_Start("make sphere");
6209         Undo_AddBrushList(&selected_brushes);
6210
6211         DoSides(false, true);
6212
6213         Undo_EndBrushList(&selected_brushes);
6214         Undo_End();
6215 }
6216
6217 extern bool g_bCrossHairs;
6218
6219 /*
6220  =======================================================================================================================
6221  =======================================================================================================================
6222  */
6223 void CMainFrame::OnViewCrosshair() {
6224         g_bCrossHairs ^= 1;
6225         Sys_UpdateWindows(W_XY);
6226 }
6227
6228 /*
6229  =======================================================================================================================
6230  =======================================================================================================================
6231  */
6232 void CMainFrame::OnViewHideshowHideselected() {
6233         Select_Hide();
6234         Select_Deselect();
6235 }
6236
6237 void CMainFrame::OnViewHideshowHideNotselected() {
6238         Select_Hide(true);
6239         Select_Deselect();
6240 }
6241
6242 /*
6243  =======================================================================================================================
6244  =======================================================================================================================
6245  */
6246 void CMainFrame::OnViewHideshowShowhidden() {
6247         Select_ShowAllHidden();
6248 }
6249
6250 /*
6251  =======================================================================================================================
6252  =======================================================================================================================
6253  */
6254 void CMainFrame::OnTexturesShadersShow() {
6255         //
6256         // g_PrefsDlg.m_bShowShaders ^= 1; CheckMenuItem (
6257         // ::GetMenu(GetSafeHwnd()), ID_TEXTURES_SHADERS_SHOW, MF_BYCOMMAND |
6258         // ((g_PrefsDlg.m_bShowShaders) ? MF_CHECKED : MF_UNCHECKED ));
6259         // Sys_UpdateWindows(W_TEXTURE);
6260         //
6261 }
6262
6263 /*
6264  =======================================================================================================================
6265  =======================================================================================================================
6266  */
6267 void CMainFrame::OnTexturesFlushUnused() {
6268         //FIXME: idMaterial
6269         //Texture_FlushUnused();
6270         Sys_UpdateWindows(W_TEXTURE);
6271 }
6272
6273 /*
6274  =======================================================================================================================
6275  =======================================================================================================================
6276  */
6277 void CMainFrame::OnSelectionInvert() {
6278         Select_Invert();
6279         Sys_UpdateWindows(W_XY | W_Z | W_CAMERA);
6280 }
6281
6282 /*
6283  =======================================================================================================================
6284  =======================================================================================================================
6285  */
6286 void CMainFrame::OnProjectedLight() {
6287         LightEditorInit( NULL );
6288 }
6289
6290 /*
6291  =======================================================================================================================
6292  =======================================================================================================================
6293  */
6294 void CMainFrame::OnShowLighttextures() {
6295         g_bShowLightTextures ^= 1;
6296         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_SHOW_LIGHTTEXTURES, (g_bShowLightTextures) ? TRUE : FALSE);
6297         Sys_UpdateWindows(W_ALL);
6298 }
6299
6300 /*
6301  =======================================================================================================================
6302  =======================================================================================================================
6303  */
6304 void CMainFrame::OnShowLightvolumes() {
6305         g_bShowLightVolumes ^= 1;
6306         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_SHOW_LIGHTVOLUMES, (g_bShowLightVolumes) ? TRUE : FALSE);
6307         Sys_UpdateWindows(W_ALL);
6308 }
6309
6310 /*
6311  =======================================================================================================================
6312  =======================================================================================================================
6313  */
6314 void CMainFrame::OnActivate(UINT nState, CWnd *pWndOther, BOOL bMinimized) {
6315         CFrameWnd::OnActivate(nState, pWndOther, bMinimized);
6316
6317         if ( nState != WA_INACTIVE ) {
6318                 common->ActivateTool( true );
6319                 if (::IsWindowVisible(win32.hWnd)) {
6320                         ::ShowWindow(win32.hWnd, SW_HIDE);
6321                 }
6322
6323                 // start playing the editor sound world
6324                 soundSystem->SetPlayingSoundWorld( g_qeglobals.sw );
6325         }
6326         else {
6327                  //com_editorActive = false;
6328         }
6329 }
6330
6331 /*
6332  =======================================================================================================================
6333  =======================================================================================================================
6334  */
6335 void CMainFrame::OnSplinesMode() {
6336         g_qeglobals.d_select_mode = sel_addpoint;
6337         g_splineList->clear();
6338         g_splineList->startEdit(true);
6339         showCameraInspector();
6340         Sys_UpdateWindows(W_ALL);
6341 }
6342
6343 /*
6344  =======================================================================================================================
6345  =======================================================================================================================
6346  */
6347 void CMainFrame::OnSplinesLoad() {
6348         g_splineList->load("maps/test.camera");
6349         g_splineList->buildCamera();
6350 }
6351
6352 /*
6353  =======================================================================================================================
6354  =======================================================================================================================
6355  */
6356 void CMainFrame::OnSplinesSave() {
6357         g_splineList->save("maps/test.camera");
6358 }
6359
6360 /*
6361  =======================================================================================================================
6362  =======================================================================================================================
6363  */
6364 void CMainFrame::OnSplinesEdit() {
6365         showCameraInspector();
6366         Sys_UpdateWindows(W_ALL);
6367 }
6368
6369 extern void testCamSpeed();
6370
6371 /*
6372  =======================================================================================================================
6373  =======================================================================================================================
6374  */
6375 void CMainFrame::OnSplineTest() {
6376         long    start = GetTickCount();
6377         g_splineList->startCamera(start);
6378
6379         float   cycle = g_splineList->getTotalTime();
6380         long    msecs = cycle * 1000;
6381         long    current = start;
6382         idVec3  lookat(0, 0, 0);
6383         idVec3  dir;
6384
6385         while (current < start + msecs) {
6386                 float   fov;
6387                 g_splineList->getCameraInfo(current, g_pParentWnd->GetCamera()->Camera().origin, dir, &fov);
6388                 g_pParentWnd->GetCamera()->Camera().angles[1] = atan2(dir[1], dir[0]) * 180 / 3.14159;
6389                 g_pParentWnd->GetCamera()->Camera().angles[0] = asin(dir[2]) * 180 / 3.14159;
6390                 g_pParentWnd->UpdateWindows(W_XY | W_CAMERA);
6391                 current = GetTickCount();
6392         }
6393
6394         g_splineList->setRunning(false);
6395 }
6396
6397 /*
6398  =======================================================================================================================
6399  =======================================================================================================================
6400  */
6401 void CMainFrame::OnSplinesTargetPoints() {
6402 }
6403
6404 /*
6405  =======================================================================================================================
6406  =======================================================================================================================
6407  */
6408 void CMainFrame::OnSplinesCameraPoints() {
6409 }
6410
6411 /*
6412  =======================================================================================================================
6413  =======================================================================================================================
6414  */
6415 void CMainFrame::OnPopupNewcameraInterpolated() {
6416         g_qeglobals.d_select_mode = sel_addpoint;
6417         g_qeglobals.selectObject = g_splineList->startNewCamera(idCameraPosition::INTERPOLATED);
6418         OnSplinesEdit();
6419 }
6420
6421 /*
6422  =======================================================================================================================
6423  =======================================================================================================================
6424  */
6425 void CMainFrame::OnPopupNewcameraSpline() {
6426         g_qeglobals.d_select_mode = sel_addpoint;
6427         g_qeglobals.selectObject = g_splineList->startNewCamera(idCameraPosition::SPLINE);
6428         OnSplinesEdit();
6429 }
6430
6431 /*
6432  =======================================================================================================================
6433  =======================================================================================================================
6434  */
6435 void CMainFrame::OnPopupNewcameraFixed() {
6436         g_qeglobals.d_select_mode = sel_addpoint;
6437         g_qeglobals.selectObject = g_splineList->startNewCamera(idCameraPosition::FIXED);
6438         OnSplinesEdit();
6439 }
6440
6441 extern void Patch_AdjustSubdivisions(float hadj, float vadj);
6442
6443 /*
6444  =======================================================================================================================
6445  =======================================================================================================================
6446  */
6447 void CMainFrame::OnCurveIncreaseVert() {
6448         Patch_AdjustSubdivisions( 0.0f, -0.5f );
6449 }
6450
6451 /*
6452  =======================================================================================================================
6453  =======================================================================================================================
6454  */
6455 void CMainFrame::OnCurveDecreaseVert() {
6456         Patch_AdjustSubdivisions( 0.0f, 0.5f );
6457 }
6458
6459 /*
6460  =======================================================================================================================
6461  =======================================================================================================================
6462  */
6463 void CMainFrame::OnCurveIncreaseHorz() {
6464         Patch_AdjustSubdivisions( -0.5f, 0.0f );
6465 }
6466
6467 /*
6468  =======================================================================================================================
6469  =======================================================================================================================
6470  */
6471 void CMainFrame::OnCurveDecreaseHorz() {
6472         Patch_AdjustSubdivisions( 0.5f, 0.0f );
6473 }
6474
6475 /*
6476  =======================================================================================================================
6477  =======================================================================================================================
6478  */
6479 void CMainFrame::OnSelectionMoveonly() {
6480         g_moveOnly ^= 1;
6481         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_SELECTION_MOVEONLY, (g_moveOnly) ? TRUE : FALSE);
6482 }
6483
6484 void CMainFrame::OnSelectBrushlight() 
6485 {
6486         // TODO: Add your command handler code here
6487         
6488 }
6489
6490 void CMainFrame::OnSelectionCombine() 
6491 {
6492         if (g_qeglobals.d_select_count < 2) {
6493                 Sys_Status("Must have at least two things selected.", 0);
6494                 Sys_Beep();
6495                 return;
6496         }
6497
6498         entity_t *e1 = g_qeglobals.d_select_order[0]->owner;
6499
6500         if (e1 == world_entity) {
6501                 Sys_Status("First selection must not be world.", 0);
6502                 Sys_Beep();
6503                 return;
6504         }
6505
6506         idStr str;
6507         idMat3 mat;
6508         idVec3 v;
6509         if (e1->eclass->nShowFlags & ECLASS_LIGHT) {
6510                 // copy the lights origin and rotation matrix to 
6511                 // light_origin and light_rotation
6512                 e1->trackLightOrigin = true;
6513                 e1->brushes.onext->trackLightOrigin = true;
6514                 if (GetVectorForKey(e1, "origin", v)) {
6515                         SetKeyVec3(e1, "light_origin", v);
6516                         e1->lightOrigin = v;
6517                 }
6518                 if (!GetMatrixForKey(e1, "rotation", mat)) {
6519                         mat.Identity();
6520                 }
6521                 sprintf(str, "%g %g %g %g %g %g %g %g %g", mat[0][0], mat[0][1], mat[0][2], mat[1][0], mat[1][1], mat[1][2], mat[2][0], mat[2][1], mat[2][2]);
6522                 SetKeyValue(e1, "light_rotation", str, false);
6523                 e1->lightRotation = mat;
6524         }
6525
6526         bool setModel = true;
6527         for (brush_t *b = selected_brushes.next; b != &selected_brushes; b = b->next) {
6528                 if (b->owner != e1) {
6529                         if (e1->eclass->nShowFlags & ECLASS_LIGHT) {
6530                                 if (GetVectorForKey(b->owner, "origin", v)) {
6531                                         e1->origin = b->owner->origin;
6532                                         SetKeyVec3(e1, "origin", b->owner->origin);
6533                                 }
6534                                 if (GetMatrixForKey(b->owner, "rotation", mat)) {
6535                                         e1->rotation = b->owner->rotation;
6536                                         mat = b->owner->rotation;
6537                                         sprintf(str, "%g %g %g %g %g %g %g %g %g", mat[0][0], mat[0][1], mat[0][2], mat[1][0], mat[1][1], mat[1][2], mat[2][0], mat[2][1], mat[2][2]);
6538                                         SetKeyValue(e1, "rotation", str, false);
6539                                 }
6540                                 if (b->modelHandle) {
6541                                         SetKeyValue(e1, "model", ValueForKey(b->owner, "model"));
6542                                         setModel = false;
6543                                 } else {
6544                                         b->entityModel = true;
6545                                 }
6546                         }
6547                         Entity_UnlinkBrush(b);
6548                         Entity_LinkBrush(e1, b);
6549                 }
6550         }
6551
6552         if (setModel) {
6553                 SetKeyValue(e1, "model", ValueForKey(e1, "name"));
6554         }
6555
6556         Select_Deselect();
6557         Select_Brush(g_qeglobals.d_select_order[0]);
6558         Sys_UpdateWindows(W_XY | W_CAMERA);
6559 }
6560
6561 extern void Patch_Weld(patchMesh_t *p, patchMesh_t *p2);
6562 void CMainFrame::OnPatchCombine() {
6563         patchMesh_t *p, *p2;
6564         p = p2 = NULL;
6565         for (brush_t *b = selected_brushes.next; b != &selected_brushes; b = b->next) {
6566                 if (b->pPatch) {
6567                         if (p == NULL) {
6568                                 p = b->pPatch;
6569                         } else if (p2 == NULL) {
6570                                 p2 = b->pPatch;
6571                                 Patch_Weld(p, p2);
6572                                 return;
6573                         }
6574                 }
6575         }
6576 }
6577
6578 void CMainFrame::OnShowDoom() 
6579 {
6580         int show = ::IsWindowVisible(win32.hWnd) ? SW_HIDE : SW_NORMAL;
6581         if (show == SW_NORMAL) {
6582                 g_Inspectors->SetMode(W_TEXTURE);
6583         }
6584         ::ShowWindow(win32.hWnd, show);
6585 }
6586
6587 void CMainFrame::OnViewRendermode() 
6588 {
6589         m_pCamWnd->ToggleRenderMode();
6590         CheckMenuItem(::GetMenu(GetSafeHwnd()), ID_VIEW_RENDERMODE, MF_BYCOMMAND | (m_pCamWnd->GetRenderMode()) ? MF_CHECKED : MF_UNCHECKED);
6591         Sys_UpdateWindows(W_ALL);
6592 }
6593
6594 void CMainFrame::OnViewRebuildrenderdata() 
6595 {
6596         m_pCamWnd->BuildRendererState();
6597         if (!m_pCamWnd->GetRenderMode()) {
6598                 OnViewRendermode();
6599         }
6600         Sys_UpdateWindows(W_ALL);
6601 }
6602
6603 void CMainFrame::OnViewRealtimerebuild() 
6604 {
6605         m_pCamWnd->ToggleRebuildMode();
6606         CheckMenuItem(::GetMenu(GetSafeHwnd()), ID_VIEW_REALTIMEREBUILD, MF_BYCOMMAND | (m_pCamWnd->GetRebuildMode()) ? MF_CHECKED : MF_UNCHECKED);
6607         Sys_UpdateWindows(W_ALL);
6608 }
6609
6610 void CMainFrame::OnViewRenderentityoutlines() 
6611 {
6612         m_pCamWnd->ToggleEntityMode();
6613         CheckMenuItem(::GetMenu(GetSafeHwnd()), ID_VIEW_RENDERENTITYOUTLINES, MF_BYCOMMAND | (m_pCamWnd->GetEntityMode()) ? MF_CHECKED : MF_UNCHECKED);
6614         Sys_UpdateWindows(W_ALL);
6615 }
6616
6617 void CMainFrame::OnViewMaterialanimation() 
6618 {
6619         m_pCamWnd->ToggleAnimationMode();
6620         CheckMenuItem(::GetMenu(GetSafeHwnd()), ID_VIEW_MATERIALANIMATION, MF_BYCOMMAND | (m_pCamWnd->GetAnimationMode()) ? MF_CHECKED : MF_UNCHECKED);
6621         Sys_UpdateWindows(W_ALL);
6622 }
6623
6624 extern void Face_SetAxialScale_BrushPrimit(face_t *face, bool y);
6625 void CMainFrame::OnAxialTextureByWidth() {
6626         // temp test code
6627         int faceCount = g_ptrSelectedFaces.GetSize();
6628         
6629         if (faceCount > 0) {
6630                 for (int i = 0; i < faceCount; i++) {
6631                         face_t  *selFace = reinterpret_cast < face_t * > (g_ptrSelectedFaces.GetAt(i));
6632                         Face_SetAxialScale_BrushPrimit(selFace, false);
6633                 }
6634                 Sys_UpdateWindows(W_CAMERA);
6635         }
6636
6637 }
6638
6639 void CMainFrame::OnAxialTextureByHeight() {
6640         // temp test code
6641         int faceCount = g_ptrSelectedFaces.GetSize();
6642         
6643         if (faceCount > 0) {
6644                 for (int i = 0; i < faceCount; i++) {
6645                         face_t  *selFace = reinterpret_cast < face_t * > (g_ptrSelectedFaces.GetAt(i));
6646                         Face_SetAxialScale_BrushPrimit(selFace, true);
6647                 }
6648                 Sys_UpdateWindows(W_CAMERA);
6649         }
6650 }
6651
6652 void CMainFrame::OnAxialTextureArbitrary() {
6653         if (g_bAxialMode) {
6654                 g_bAxialMode = false;
6655         }
6656         int faceCount = g_ptrSelectedFaces.GetSize();
6657         if (faceCount > 0) {
6658                 g_axialAnchor = 0;
6659                 g_axialDest = 1;
6660                 g_bAxialMode = true;
6661         }
6662         Sys_UpdateWindows(W_CAMERA);
6663 }
6664
6665 extern void Select_ToOBJ();
6666 void CMainFrame::OnSelectionExportToobj() 
6667 {
6668         Select_ToOBJ();
6669 }
6670
6671 extern void Select_ToCM();
6672 void CMainFrame::OnSelectionExportToCM()
6673 {
6674         Select_ToCM();
6675 }
6676
6677 void CMainFrame::OnSelectionWireFrameOff() {
6678         Select_WireFrame( false );
6679 }
6680
6681 void CMainFrame::OnSelectionWireFrameOn() {
6682         Select_WireFrame( true );
6683 }
6684
6685 void CMainFrame::OnSelectionVisibleOn() {
6686         Select_ForceVisible( true );
6687 }
6688
6689 void CMainFrame::OnSelectionVisibleOff() {
6690         Select_ForceVisible( false );
6691 }
6692
6693
6694 void CMainFrame::OnViewRenderselection() 
6695 {
6696         m_pCamWnd->ToggleSelectMode();
6697         CheckMenuItem(::GetMenu(GetSafeHwnd()), ID_VIEW_RENDERSELECTION, MF_BYCOMMAND | (m_pCamWnd->GetSelectMode()) ? MF_CHECKED : MF_UNCHECKED);
6698         Sys_UpdateWindows(W_CAMERA);
6699 }
6700
6701 void CMainFrame::OnSelectNomodels() 
6702 {
6703         g_PrefsDlg.m_selectNoModels ^= 1;
6704         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_SELECT_NOMODELS, (g_PrefsDlg.m_selectNoModels) ? TRUE : FALSE);
6705 }
6706
6707 void CMainFrame::OnViewShowShowvisportals() 
6708 {
6709         if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_VISPORTALS) & EXCLUDE_VISPORTALS) {
6710                 CheckMenuItem(::GetMenu(GetSafeHwnd()), ID_VIEW_SHOW_SHOWVISPORTALS, MF_BYCOMMAND | MF_UNCHECKED);
6711         }
6712         else {
6713                 CheckMenuItem(::GetMenu(GetSafeHwnd()), ID_VIEW_SHOW_SHOWVISPORTALS, MF_BYCOMMAND | MF_CHECKED);
6714         }
6715
6716         Sys_UpdateWindows(W_XY | W_CAMERA);
6717 }
6718
6719 void CMainFrame::OnViewShowNoDraw() 
6720 {
6721         if ((g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_NODRAW) & EXCLUDE_NODRAW) {
6722                 CheckMenuItem(::GetMenu(GetSafeHwnd()), ID_VIEW_SHOW_NODRAW, MF_BYCOMMAND | MF_UNCHECKED);
6723         }
6724         else {
6725                 CheckMenuItem(::GetMenu(GetSafeHwnd()), ID_VIEW_SHOW_NODRAW, MF_BYCOMMAND | MF_CHECKED);
6726         }
6727
6728         Sys_UpdateWindows(W_XY | W_CAMERA);
6729 }
6730
6731
6732
6733 void CMainFrame::OnViewRendersound() 
6734 {
6735         m_pCamWnd->ToggleSoundMode();
6736         CheckMenuItem(::GetMenu(GetSafeHwnd()), ID_VIEW_RENDERSOUND, MF_BYCOMMAND | (m_pCamWnd->GetSoundMode()) ? MF_CHECKED : MF_UNCHECKED);
6737         Sys_UpdateWindows(W_CAMERA);
6738 }
6739
6740
6741 void CMainFrame::OnSoundShowsoundvolumes() 
6742 {
6743         g_qeglobals.d_savedinfo.showSoundAlways ^= 1;
6744         if (g_qeglobals.d_savedinfo.showSoundAlways) {
6745                 g_qeglobals.d_savedinfo.showSoundWhenSelected = false;
6746         }
6747         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_SOUND_SHOWSOUNDVOLUMES,g_qeglobals.d_savedinfo.showSoundAlways);
6748         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_SOUND_SHOWSELECTEDSOUNDVOLUMES,g_qeglobals.d_savedinfo.showSoundWhenSelected);
6749         Sys_UpdateWindows(W_XY | W_CAMERA);
6750 }
6751
6752 void CMainFrame::OnNurbEditor() {
6753         nurbMode ^= 1;
6754         if (nurbMode) {
6755                 int num = nurb.GetNumValues();
6756                 idStr temp = va("%i 3 ", num);
6757                 for (int i = 0; i < num; i++) {
6758                         temp += va("(%i %i) ", (int)nurb.GetValue(i).x, (int)nurb.GetValue(i).y);
6759                 }
6760                 temp += "\r\n";
6761                 if (OpenClipboard()) {
6762                         ::EmptyClipboard();
6763                 HGLOBAL clip;
6764                         char* buff;
6765                         clip = ::GlobalAlloc(GMEM_DDESHARE, temp.Length()+1);
6766                         buff = (char*)::GlobalLock(clip);
6767                         strcpy(buff, temp);
6768                         ::GlobalUnlock(clip);
6769                         ::SetClipboardData(CF_TEXT, clip);
6770                         ::CloseClipboard();
6771                 }
6772                 nurb.Clear();
6773         }
6774 }
6775
6776
6777 void CMainFrame::OnSoundShowselectedsoundvolumes() 
6778 {
6779         g_qeglobals.d_savedinfo.showSoundWhenSelected ^= 1;
6780         if (g_qeglobals.d_savedinfo.showSoundWhenSelected) {
6781                 g_qeglobals.d_savedinfo.showSoundAlways = false;
6782         }
6783         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_SOUND_SHOWSOUNDVOLUMES,g_qeglobals.d_savedinfo.showSoundAlways);
6784         m_wndToolBar.GetToolBarCtrl().CheckButton(ID_SOUND_SHOWSELECTEDSOUNDVOLUMES,g_qeglobals.d_savedinfo.showSoundWhenSelected);
6785         Sys_UpdateWindows(W_XY | W_CAMERA);
6786 }
6787
6788 void CMainFrame::OnSelectAlltargets()
6789 {
6790         Select_AllTargets();
6791 }
6792
6793
6794 void CMainFrame::OnSelectCompleteEntity()
6795 {
6796     brush_t* b = NULL;
6797     entity_t* e = NULL;
6798
6799     b = selected_brushes.next;
6800     if ( b == &selected_brushes )
6801     {
6802         return; //no brushes selected
6803     }
6804     
6805     e = b->owner;
6806     if ( b->owner == world_entity )
6807     {
6808         return; //don't select the world entity
6809     }
6810
6811     for (b = e->brushes.onext; b != &e->brushes; b = b->onext) 
6812     {
6813         Select_Brush ( b , false );
6814     }
6815     Sys_UpdateWindows ( W_ALL );
6816 }
6817
6818
6819
6820
6821 //---------------------------------------------------------------------------
6822 // OnPrecisionCursorCycle
6823 // 
6824 // Called when the user presses the "cycle precision cursor mode" key.
6825 // Cycles the precision cursor among the following three modes:
6826 //              PRECISION_CURSOR_NONE
6827 //              PRECISION_CURSOR_SNAP
6828 //              PRECISION_CURSOR_FREE
6829 //---------------------------------------------------------------------------
6830 void CMainFrame::OnPrecisionCursorCycle()
6831 {
6832         m_pActiveXY->CyclePrecisionCrosshairMode();
6833 }
6834
6835 void CMainFrame::OnGenerateMaterialsList()
6836 {
6837         idStrList mtrList;
6838         idStr     mtrName,mtrFileName;
6839
6840         
6841         g_Inspectors->consoleWnd.ExecuteCommand ( "clear" );
6842         Sys_BeginWait ();
6843         common->Printf ( "Generating list of active materials...\n" );
6844
6845         for ( brush_t* b = active_brushes.next ; b != &active_brushes ; b=b->next ) {
6846                 if ( b->pPatch ){
6847                         mtrName = b->pPatch->d_texture->GetName();
6848                         if ( !mtrList.Find( mtrName) ) {
6849                                 mtrList.Insert ( mtrName );
6850                         }
6851
6852                 }
6853                 else {
6854                         for ( face_t* f = b->brush_faces ; f != NULL ; f=f->next)
6855                         {
6856                                 mtrName = f->d_texture->GetName();
6857                                 if ( !mtrList.Find( mtrName) ) {
6858                                         mtrList.Insert ( mtrName );
6859                                 }
6860
6861                         }
6862                 }                               
6863         }
6864
6865         mtrList.Sort();
6866         for ( int i = 0 ; i < mtrList.Num() ; i++ ) {
6867                 common->Printf ( "%s\n" , mtrList[i].c_str());
6868         }
6869         
6870         mtrFileName = currentmap;
6871 //      mtrFileName.ExtractFileName( mtrFileName );
6872         mtrFileName = mtrFileName.StripPath();
6873
6874         common->Printf ( "Done...found %i unique materials\n" , mtrList.Num());
6875         mtrFileName = mtrFileName + idStr ( "_Materials.txt" );
6876         g_Inspectors->SetMode ( W_CONSOLE , true );
6877         g_Inspectors->consoleWnd.SetConsoleText ( va ( "condump %s" , mtrFileName.c_str()) );
6878
6879         Sys_EndWait ();
6880 }
6881
6882 /*
6883 =======================================================================================================================
6884 =======================================================================================================================
6885 */
6886
6887
6888 void CMainFrame::OnSplinesAddPoints() {
6889         g_Inspectors->entityDlg.AddCurvePoints();
6890 }
6891
6892 void CMainFrame::OnSplinesEditPoints() {
6893         g_Inspectors->entityDlg.EditCurvePoints();
6894 }
6895
6896 void CMainFrame::OnSplinesDeletePoint() {
6897         g_Inspectors->entityDlg.DeleteCurvePoint();
6898 }
6899
6900 void CMainFrame::OnSplinesInsertPoint() {
6901         g_Inspectors->entityDlg.InsertCurvePoint();
6902 }