win_main.c 32 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328
  1. /*
  2. ===========================================================================
  3. Copyright (C) 1997-2006 Id Software, Inc.
  4. This file is part of Quake 2 Tools source code.
  5. Quake 2 Tools source code is free software; you can redistribute it
  6. and/or modify it under the terms of the GNU General Public License as
  7. published by the Free Software Foundation; either version 2 of the License,
  8. or (at your option) any later version.
  9. Quake 2 Tools source code is distributed in the hope that it will be
  10. useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with Quake 2 Tools source code; if not, write to the Free Software
  15. Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  16. ===========================================================================
  17. */
  18. #include "qe3.h"
  19. #include <process.h>
  20. #include "mru.h"
  21. #include "entityw.h"
  22. static HWND s_hwndToolbar;
  23. BOOL SaveRegistryInfo(const char *pszName, void *pvBuf, long lSize);
  24. BOOL LoadRegistryInfo(const char *pszName, void *pvBuf, long *plSize);
  25. static HWND CreateMyStatusWindow(HINSTANCE hInst);
  26. static HWND CreateToolBar(HINSTANCE hinst);
  27. extern int WXY_Print( void );
  28. /*
  29. ==============================================================================
  30. MENU
  31. ==============================================================================
  32. */
  33. void OpenDialog (void);
  34. void SaveAsDialog (void);
  35. qboolean ConfirmModified (void);
  36. void Select_Ungroup (void);
  37. void QE_ExpandBspString (char *bspaction, char *out, char *mapname)
  38. {
  39. char *in;
  40. char src[1024];
  41. char rsh[1024];
  42. char base[256];
  43. ExtractFileName (mapname, base);
  44. sprintf (src, "%s/maps/%s", ValueForKey(g_qeglobals.d_project_entity, "remotebasepath"), base);
  45. strcpy (rsh, ValueForKey(g_qeglobals.d_project_entity, "rshcmd"));
  46. in = ValueForKey( g_qeglobals.d_project_entity, bspaction );
  47. while (*in)
  48. {
  49. if (in[0] == '!')
  50. {
  51. strcpy (out, rsh);
  52. out += strlen(rsh);
  53. in++;
  54. continue;
  55. }
  56. if (in[0] == '$')
  57. {
  58. strcpy (out, src);
  59. out += strlen(src);
  60. in++;
  61. continue;
  62. }
  63. if (in[0] == '@')
  64. {
  65. *out++ = '"';
  66. in++;
  67. continue;
  68. }
  69. *out++ = *in++;
  70. }
  71. *out = 0;
  72. }
  73. void RunBsp (char *command)
  74. {
  75. char sys[1024];
  76. char batpath[1024];
  77. char outputpath[1024];
  78. char temppath[512];
  79. char name[1024];
  80. FILE *hFile;
  81. BOOL ret;
  82. PROCESS_INFORMATION ProcessInformation;
  83. STARTUPINFO startupinfo;
  84. SetInspectorMode (W_CONSOLE);
  85. if (bsp_process)
  86. {
  87. Sys_Printf ("BSP is still going...\n");
  88. return;
  89. }
  90. GetTempPath(512, temppath);
  91. sprintf (outputpath, "%sjunk.txt", temppath);
  92. strcpy (name, currentmap);
  93. if (region_active)
  94. {
  95. Map_SaveFile (name, false);
  96. StripExtension (name);
  97. strcat (name, ".reg");
  98. }
  99. Map_SaveFile (name, region_active);
  100. QE_ExpandBspString (command, sys, name);
  101. Sys_ClearPrintf ();
  102. Sys_Printf ("======================================\nRunning bsp command...\n");
  103. Sys_Printf ("\n%s\n", sys);
  104. //
  105. // write qe3bsp.bat
  106. //
  107. sprintf (batpath, "%sqe3bsp.bat", temppath);
  108. hFile = fopen(batpath, "w");
  109. if (!hFile)
  110. Error ("Can't write to %s", batpath);
  111. fprintf (hFile, sys);
  112. fclose (hFile);
  113. //
  114. // write qe3bsp2.bat
  115. //
  116. sprintf (batpath, "%sqe3bsp2.bat", temppath);
  117. hFile = fopen(batpath, "w");
  118. if (!hFile)
  119. Error ("Can't write to %s", batpath);
  120. fprintf (hFile, "%sqe3bsp.bat > %s", temppath, outputpath);
  121. fclose (hFile);
  122. Pointfile_Delete ();
  123. GetStartupInfo (&startupinfo);
  124. ret = CreateProcess(
  125. batpath, // pointer to name of executable module
  126. NULL, // pointer to command line string
  127. NULL, // pointer to process security attributes
  128. NULL, // pointer to thread security attributes
  129. FALSE, // handle inheritance flag
  130. 0 /*DETACHED_PROCESS*/, // creation flags
  131. NULL, // pointer to new environment block
  132. NULL, // pointer to current directory name
  133. &startupinfo, // pointer to STARTUPINFO
  134. &ProcessInformation // pointer to PROCESS_INFORMATION
  135. );
  136. if (!ret)
  137. Error ("CreateProcess failed");
  138. bsp_process = ProcessInformation.hProcess;
  139. Sleep (100); // give the new process a chance to open it's window
  140. BringWindowToTop( g_qeglobals.d_hwndMain ); // pop us back on top
  141. SetFocus (g_qeglobals.d_hwndCamera);
  142. }
  143. /*
  144. =============
  145. DoColor
  146. =============
  147. */
  148. qboolean DoColor(int iIndex)
  149. {
  150. CHOOSECOLOR cc;
  151. static COLORREF custom[16];
  152. cc.lStructSize = sizeof(cc);
  153. cc.hwndOwner = g_qeglobals.d_hwndMain;
  154. cc.hInstance = g_qeglobals.d_hInstance;
  155. cc.rgbResult =
  156. (int)(g_qeglobals.d_savedinfo.colors[iIndex][0]*255) +
  157. (((int)(g_qeglobals.d_savedinfo.colors[iIndex][1]*255))<<8) +
  158. (((int)(g_qeglobals.d_savedinfo.colors[iIndex][2]*255))<<16);
  159. cc.lpCustColors = custom;
  160. cc.Flags = CC_FULLOPEN|CC_RGBINIT;
  161. //cc.lCustData;
  162. //cc.lpfnHook;
  163. //cc.lpTemplateName
  164. if (!ChooseColor(&cc))
  165. return false;
  166. g_qeglobals.d_savedinfo.colors[iIndex][0] = (cc.rgbResult&255)/255.0;
  167. g_qeglobals.d_savedinfo.colors[iIndex][1] = ((cc.rgbResult>>8)&255)/255.0;
  168. g_qeglobals.d_savedinfo.colors[iIndex][2] = ((cc.rgbResult>>16)&255)/255.0;
  169. /*
  170. ** scale colors so that at least one component is at 1.0F
  171. ** if this is meant to select an entity color
  172. */
  173. if ( iIndex == COLOR_ENTITY )
  174. {
  175. float largest = 0.0F;
  176. if ( g_qeglobals.d_savedinfo.colors[iIndex][0] > largest )
  177. largest = g_qeglobals.d_savedinfo.colors[iIndex][0];
  178. if ( g_qeglobals.d_savedinfo.colors[iIndex][1] > largest )
  179. largest = g_qeglobals.d_savedinfo.colors[iIndex][1];
  180. if ( g_qeglobals.d_savedinfo.colors[iIndex][2] > largest )
  181. largest = g_qeglobals.d_savedinfo.colors[iIndex][2];
  182. if ( largest == 0.0F )
  183. {
  184. g_qeglobals.d_savedinfo.colors[iIndex][0] = 1.0F;
  185. g_qeglobals.d_savedinfo.colors[iIndex][1] = 1.0F;
  186. g_qeglobals.d_savedinfo.colors[iIndex][2] = 1.0F;
  187. }
  188. else
  189. {
  190. float scaler = 1.0F / largest;
  191. g_qeglobals.d_savedinfo.colors[iIndex][0] *= scaler;
  192. g_qeglobals.d_savedinfo.colors[iIndex][1] *= scaler;
  193. g_qeglobals.d_savedinfo.colors[iIndex][2] *= scaler;
  194. }
  195. }
  196. Sys_UpdateWindows (W_ALL);
  197. return true;
  198. }
  199. /* Copied from MSDN */
  200. BOOL DoMru(HWND hWnd,WORD wId)
  201. {
  202. char szFileName[128];
  203. OFSTRUCT of;
  204. BOOL fExist;
  205. GetMenuItem(g_qeglobals.d_lpMruMenu, wId, TRUE, szFileName, sizeof(szFileName));
  206. // Test if the file exists.
  207. fExist = OpenFile(szFileName ,&of,OF_EXIST) != HFILE_ERROR;
  208. if (fExist) {
  209. // Place the file on the top of MRU.
  210. AddNewItem(g_qeglobals.d_lpMruMenu,(LPSTR)szFileName);
  211. // Now perform opening this file !!!
  212. Map_LoadFile (szFileName);
  213. }
  214. else
  215. // Remove the file on MRU.
  216. DelMenuItem(g_qeglobals.d_lpMruMenu,wId,TRUE);
  217. // Refresh the File menu.
  218. PlaceMenuMRUItem(g_qeglobals.d_lpMruMenu,GetSubMenu(GetMenu(hWnd),0),
  219. ID_FILE_EXIT);
  220. return fExist;
  221. }
  222. /* handle all WM_COMMAND messages here */
  223. LONG WINAPI CommandHandler (
  224. HWND hWnd,
  225. WPARAM wParam,
  226. LPARAM lParam)
  227. {
  228. HMENU hMenu;
  229. switch (LOWORD(wParam))
  230. {
  231. //
  232. // file menu
  233. //
  234. case ID_FILE_EXIT:
  235. /* exit application */
  236. if (!ConfirmModified())
  237. return TRUE;
  238. PostMessage (hWnd, WM_CLOSE, 0, 0L);
  239. break;
  240. case ID_FILE_OPEN:
  241. if (!ConfirmModified())
  242. return TRUE;
  243. OpenDialog ();
  244. break;
  245. case ID_FILE_NEW:
  246. if (!ConfirmModified())
  247. return TRUE;
  248. Map_New ();
  249. break;
  250. case ID_FILE_SAVE:
  251. if (!strcmp(currentmap, "unnamed.map"))
  252. SaveAsDialog ();
  253. else
  254. Map_SaveFile (currentmap, false); // ignore region
  255. break;
  256. case ID_FILE_SAVEAS:
  257. SaveAsDialog ();
  258. break;
  259. case ID_FILE_LOADPROJECT:
  260. if (!ConfirmModified())
  261. return TRUE;
  262. ProjectDialog ();
  263. break;
  264. case ID_FILE_POINTFILE:
  265. if (g_qeglobals.d_pointfile_display_list)
  266. Pointfile_Clear ();
  267. else
  268. Pointfile_Check ();
  269. break;
  270. //
  271. // view menu
  272. //
  273. case ID_VIEW_ENTITY:
  274. SetInspectorMode(W_ENTITY);
  275. break;
  276. case ID_VIEW_CONSOLE:
  277. SetInspectorMode(W_CONSOLE);
  278. break;
  279. case ID_VIEW_TEXTURE:
  280. SetInspectorMode(W_TEXTURE);
  281. break;
  282. case ID_VIEW_100:
  283. g_qeglobals.d_xy.scale = 1;
  284. Sys_UpdateWindows (W_XY|W_XY_OVERLAY);
  285. break;
  286. case ID_VIEW_ZOOMIN:
  287. g_qeglobals.d_xy.scale *= 5.0/4;
  288. if (g_qeglobals.d_xy.scale > 16)
  289. g_qeglobals.d_xy.scale = 16;
  290. Sys_UpdateWindows (W_XY|W_XY_OVERLAY);
  291. break;
  292. case ID_VIEW_ZOOMOUT:
  293. g_qeglobals.d_xy.scale *= 4.0/5;
  294. if (g_qeglobals.d_xy.scale < 0.1)
  295. g_qeglobals.d_xy.scale = 0.1;
  296. Sys_UpdateWindows (W_XY|W_XY_OVERLAY);
  297. break;
  298. case ID_VIEW_Z100:
  299. z.scale = 1;
  300. Sys_UpdateWindows (W_Z|W_Z_OVERLAY);
  301. break;
  302. case ID_VIEW_ZZOOMIN:
  303. z.scale *= 5.0/4;
  304. if (z.scale > 4)
  305. z.scale = 4;
  306. Sys_UpdateWindows (W_Z|W_Z_OVERLAY);
  307. break;
  308. case ID_VIEW_ZZOOMOUT:
  309. z.scale *= 4.0/5;
  310. if (z.scale < 0.125)
  311. z.scale = 0.125;
  312. Sys_UpdateWindows (W_Z|W_Z_OVERLAY);
  313. break;
  314. case ID_VIEW_CENTER:
  315. camera.angles[ROLL] = camera.angles[PITCH] = 0;
  316. camera.angles[YAW] = 22.5 *
  317. floor( (camera.angles[YAW]+11)/22.5 );
  318. Sys_UpdateWindows (W_CAMERA|W_XY_OVERLAY);
  319. break;
  320. case ID_VIEW_UPFLOOR:
  321. Cam_ChangeFloor (true);
  322. break;
  323. case ID_VIEW_DOWNFLOOR:
  324. Cam_ChangeFloor (false);
  325. break;
  326. case ID_VIEW_SHOWNAMES:
  327. g_qeglobals.d_savedinfo.show_names = !g_qeglobals.d_savedinfo.show_names;
  328. CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWNAMES, MF_BYCOMMAND | (g_qeglobals.d_savedinfo.show_names ? MF_CHECKED : MF_UNCHECKED) );
  329. Map_BuildBrushData();
  330. Sys_UpdateWindows (W_XY);
  331. break;
  332. case ID_VIEW_SHOWCOORDINATES:
  333. g_qeglobals.d_savedinfo.show_coordinates ^= 1;
  334. CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWCOORDINATES, MF_BYCOMMAND | (g_qeglobals.d_savedinfo.show_coordinates ? MF_CHECKED : MF_UNCHECKED) );
  335. Sys_UpdateWindows (W_XY);
  336. break;
  337. case ID_VIEW_SHOWBLOCKS:
  338. g_qeglobals.show_blocks ^= 1;
  339. CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWBLOCKS, MF_BYCOMMAND | (g_qeglobals.show_blocks ? MF_CHECKED : MF_UNCHECKED) );
  340. Sys_UpdateWindows (W_XY);
  341. break;
  342. case ID_VIEW_SHOWLIGHTS:
  343. if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIGHTS ) & EXCLUDE_LIGHTS )
  344. CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWLIGHTS, MF_BYCOMMAND | MF_UNCHECKED );
  345. else
  346. CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWLIGHTS, MF_BYCOMMAND | MF_CHECKED );
  347. Sys_UpdateWindows (W_XY|W_CAMERA);
  348. break;
  349. case ID_VIEW_SHOWPATH:
  350. if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_PATHS ) & EXCLUDE_PATHS )
  351. CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWPATH, MF_BYCOMMAND | MF_UNCHECKED );
  352. else
  353. CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWPATH, MF_BYCOMMAND | MF_CHECKED );
  354. Sys_UpdateWindows (W_XY|W_CAMERA);
  355. break;
  356. case ID_VIEW_SHOWENT:
  357. if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_ENT ) & EXCLUDE_ENT )
  358. CheckMenuItem( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWENT, MF_BYCOMMAND | MF_UNCHECKED);
  359. else
  360. CheckMenuItem( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWENT, MF_BYCOMMAND | MF_CHECKED);
  361. Sys_UpdateWindows (W_XY|W_CAMERA);
  362. break;
  363. case ID_VIEW_SHOWWATER:
  364. if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_WATER ) & EXCLUDE_WATER )
  365. CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWWATER, MF_BYCOMMAND | MF_UNCHECKED );
  366. else
  367. CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWWATER, MF_BYCOMMAND | MF_CHECKED );
  368. Sys_UpdateWindows (W_XY|W_CAMERA);
  369. break;
  370. case ID_VIEW_SHOWCLIP:
  371. if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CLIP ) & EXCLUDE_CLIP )
  372. CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWCLIP, MF_BYCOMMAND | MF_UNCHECKED );
  373. else
  374. CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWCLIP, MF_BYCOMMAND | MF_CHECKED );
  375. Sys_UpdateWindows (W_XY|W_CAMERA);
  376. break;
  377. case ID_VIEW_SHOWDETAIL:
  378. if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_DETAIL ) & EXCLUDE_DETAIL )
  379. {
  380. CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWDETAIL, MF_BYCOMMAND | MF_UNCHECKED );
  381. SetWindowText (g_qeglobals.d_hwndCamera, "Camera View (DETAIL EXCLUDED)");
  382. }
  383. else
  384. {
  385. CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWDETAIL, MF_BYCOMMAND | MF_CHECKED );
  386. SetWindowText (g_qeglobals.d_hwndCamera, "Camera View");
  387. }
  388. Sys_UpdateWindows (W_XY|W_CAMERA);
  389. break;
  390. case ID_VIEW_SHOWWORLD:
  391. if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_WORLD ) & EXCLUDE_WORLD )
  392. CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWWORLD, MF_BYCOMMAND | MF_UNCHECKED );
  393. else
  394. CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWWORLD, MF_BYCOMMAND | MF_CHECKED );
  395. Sys_UpdateWindows (W_XY|W_CAMERA);
  396. break;
  397. //
  398. // grid menu
  399. //
  400. case ID_GRID_1:
  401. case ID_GRID_2:
  402. case ID_GRID_4:
  403. case ID_GRID_8:
  404. case ID_GRID_16:
  405. case ID_GRID_32:
  406. case ID_GRID_64:
  407. {
  408. hMenu = GetMenu(hWnd);
  409. CheckMenuItem(hMenu, ID_GRID_1, MF_BYCOMMAND | MF_UNCHECKED);
  410. CheckMenuItem(hMenu, ID_GRID_2, MF_BYCOMMAND | MF_UNCHECKED);
  411. CheckMenuItem(hMenu, ID_GRID_4, MF_BYCOMMAND | MF_UNCHECKED);
  412. CheckMenuItem(hMenu, ID_GRID_8, MF_BYCOMMAND | MF_UNCHECKED);
  413. CheckMenuItem(hMenu, ID_GRID_16, MF_BYCOMMAND | MF_UNCHECKED);
  414. CheckMenuItem(hMenu, ID_GRID_32, MF_BYCOMMAND | MF_UNCHECKED);
  415. CheckMenuItem(hMenu, ID_GRID_64, MF_BYCOMMAND | MF_UNCHECKED);
  416. switch (LOWORD(wParam))
  417. {
  418. case ID_GRID_1: g_qeglobals.d_gridsize = 0; break;
  419. case ID_GRID_2: g_qeglobals.d_gridsize = 1; break;
  420. case ID_GRID_4: g_qeglobals.d_gridsize = 2; break;
  421. case ID_GRID_8: g_qeglobals.d_gridsize = 3; break;
  422. case ID_GRID_16: g_qeglobals.d_gridsize = 4; break;
  423. case ID_GRID_32: g_qeglobals.d_gridsize = 5; break;
  424. case ID_GRID_64: g_qeglobals.d_gridsize = 6; break;
  425. }
  426. g_qeglobals.d_gridsize = 1 << g_qeglobals.d_gridsize;
  427. CheckMenuItem(hMenu, LOWORD(wParam), MF_BYCOMMAND | MF_CHECKED);
  428. Sys_UpdateWindows (W_XY|W_Z);
  429. break;
  430. }
  431. //
  432. // texture menu
  433. //
  434. case ID_VIEW_NEAREST:
  435. case ID_VIEW_NEARESTMIPMAP:
  436. case ID_VIEW_LINEAR:
  437. case ID_VIEW_BILINEAR:
  438. case ID_VIEW_BILINEARMIPMAP:
  439. case ID_VIEW_TRILINEAR:
  440. case ID_TEXTURES_WIREFRAME:
  441. case ID_TEXTURES_FLATSHADE:
  442. Texture_SetMode (LOWORD(wParam));
  443. break;
  444. case ID_TEXTURES_SHOWINUSE:
  445. Sys_BeginWait ();
  446. Texture_ShowInuse ();
  447. SetInspectorMode(W_TEXTURE);
  448. break;
  449. case ID_TEXTURES_INSPECTOR:
  450. DoSurface ();
  451. break;
  452. case CMD_TEXTUREWAD:
  453. case CMD_TEXTUREWAD+1:
  454. case CMD_TEXTUREWAD+2:
  455. case CMD_TEXTUREWAD+3:
  456. case CMD_TEXTUREWAD+4:
  457. case CMD_TEXTUREWAD+5:
  458. case CMD_TEXTUREWAD+6:
  459. case CMD_TEXTUREWAD+7:
  460. case CMD_TEXTUREWAD+8:
  461. case CMD_TEXTUREWAD+9:
  462. case CMD_TEXTUREWAD+10:
  463. case CMD_TEXTUREWAD+11:
  464. case CMD_TEXTUREWAD+12:
  465. case CMD_TEXTUREWAD+13:
  466. case CMD_TEXTUREWAD+14:
  467. case CMD_TEXTUREWAD+15:
  468. case CMD_TEXTUREWAD+16:
  469. case CMD_TEXTUREWAD+17:
  470. case CMD_TEXTUREWAD+18:
  471. case CMD_TEXTUREWAD+19:
  472. case CMD_TEXTUREWAD+20:
  473. case CMD_TEXTUREWAD+21:
  474. case CMD_TEXTUREWAD+22:
  475. case CMD_TEXTUREWAD+23:
  476. case CMD_TEXTUREWAD+24:
  477. case CMD_TEXTUREWAD+25:
  478. case CMD_TEXTUREWAD+26:
  479. case CMD_TEXTUREWAD+27:
  480. case CMD_TEXTUREWAD+28:
  481. case CMD_TEXTUREWAD+29:
  482. case CMD_TEXTUREWAD+30:
  483. case CMD_TEXTUREWAD+31:
  484. Sys_BeginWait ();
  485. Texture_ShowDirectory (LOWORD(wParam));
  486. SetInspectorMode(W_TEXTURE);
  487. break;
  488. //
  489. // bsp menu
  490. //
  491. case CMD_BSPCOMMAND:
  492. case CMD_BSPCOMMAND+1:
  493. case CMD_BSPCOMMAND+2:
  494. case CMD_BSPCOMMAND+3:
  495. case CMD_BSPCOMMAND+4:
  496. case CMD_BSPCOMMAND+5:
  497. case CMD_BSPCOMMAND+6:
  498. case CMD_BSPCOMMAND+7:
  499. case CMD_BSPCOMMAND+8:
  500. case CMD_BSPCOMMAND+9:
  501. case CMD_BSPCOMMAND+10:
  502. case CMD_BSPCOMMAND+11:
  503. case CMD_BSPCOMMAND+12:
  504. case CMD_BSPCOMMAND+13:
  505. case CMD_BSPCOMMAND+14:
  506. case CMD_BSPCOMMAND+15:
  507. case CMD_BSPCOMMAND+16:
  508. case CMD_BSPCOMMAND+17:
  509. case CMD_BSPCOMMAND+18:
  510. case CMD_BSPCOMMAND+19:
  511. case CMD_BSPCOMMAND+20:
  512. case CMD_BSPCOMMAND+21:
  513. case CMD_BSPCOMMAND+22:
  514. case CMD_BSPCOMMAND+23:
  515. case CMD_BSPCOMMAND+24:
  516. case CMD_BSPCOMMAND+25:
  517. case CMD_BSPCOMMAND+26:
  518. case CMD_BSPCOMMAND+27:
  519. case CMD_BSPCOMMAND+28:
  520. case CMD_BSPCOMMAND+29:
  521. case CMD_BSPCOMMAND+30:
  522. case CMD_BSPCOMMAND+31:
  523. {
  524. extern char *bsp_commands[256];
  525. RunBsp (bsp_commands[LOWORD(wParam-CMD_BSPCOMMAND)]);
  526. }
  527. break;
  528. //
  529. // misc menu
  530. //
  531. case ID_MISC_BENCHMARK:
  532. SendMessage ( g_qeglobals.d_hwndCamera,
  533. WM_USER+267, 0, 0);
  534. break;
  535. case ID_TEXTUREBK:
  536. DoColor(COLOR_TEXTUREBACK);
  537. Sys_UpdateWindows (W_ALL);
  538. break;
  539. case ID_MISC_SELECTENTITYCOLOR:
  540. {
  541. extern int inspector_mode;
  542. if ( ( inspector_mode == W_ENTITY ) && DoColor(COLOR_ENTITY) == true )
  543. {
  544. extern void AddProp( void );
  545. char buffer[100];
  546. sprintf( buffer, "%f %f %f", g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][0],
  547. g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][1],
  548. g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][2] );
  549. SetWindowText( hwndEnt[EntValueField], buffer );
  550. SetWindowText( hwndEnt[EntKeyField], "_color" );
  551. AddProp();
  552. }
  553. Sys_UpdateWindows( W_ALL );
  554. }
  555. break;
  556. case ID_MISC_PRINTXY:
  557. WXY_Print();
  558. break;
  559. case ID_COLORS_XYBK:
  560. DoColor(COLOR_GRIDBACK);
  561. Sys_UpdateWindows (W_ALL);
  562. break;
  563. case ID_COLORS_MAJOR:
  564. DoColor(COLOR_GRIDMAJOR);
  565. Sys_UpdateWindows (W_ALL);
  566. break;
  567. case ID_COLORS_MINOR:
  568. DoColor(COLOR_GRIDMINOR);
  569. Sys_UpdateWindows (W_ALL);
  570. break;
  571. case ID_MISC_GAMMA:
  572. DoGamma();
  573. break;
  574. case ID_MISC_FINDBRUSH:
  575. DoFind();
  576. break;
  577. case ID_MISC_NEXTLEAKSPOT:
  578. Pointfile_Next();
  579. break;
  580. case ID_MISC_PREVIOUSLEAKSPOT:
  581. Pointfile_Prev();
  582. break;
  583. //
  584. // brush menu
  585. //
  586. case ID_BRUSH_3SIDED:
  587. Brush_MakeSided (3);
  588. break;
  589. case ID_BRUSH_4SIDED:
  590. Brush_MakeSided (4);
  591. break;
  592. case ID_BRUSH_5SIDED:
  593. Brush_MakeSided (5);
  594. break;
  595. case ID_BRUSH_6SIDED:
  596. Brush_MakeSided (6);
  597. break;
  598. case ID_BRUSH_7SIDED:
  599. Brush_MakeSided (7);
  600. break;
  601. case ID_BRUSH_8SIDED:
  602. Brush_MakeSided (8);
  603. break;
  604. case ID_BRUSH_9SIDED:
  605. Brush_MakeSided (9);
  606. break;
  607. case ID_BRUSH_ARBITRARYSIDED:
  608. DoSides ();
  609. break;
  610. //
  611. // select menu
  612. //
  613. case ID_BRUSH_FLIPX:
  614. Select_FlipAxis (0);
  615. break;
  616. case ID_BRUSH_FLIPY:
  617. Select_FlipAxis (1);
  618. break;
  619. case ID_BRUSH_FLIPZ:
  620. Select_FlipAxis (2);
  621. break;
  622. case ID_BRUSH_ROTATEX:
  623. Select_RotateAxis (0, 90);
  624. break;
  625. case ID_BRUSH_ROTATEY:
  626. Select_RotateAxis (1, 90);
  627. break;
  628. case ID_BRUSH_ROTATEZ:
  629. Select_RotateAxis (2, 90);
  630. break;
  631. case ID_SELECTION_ARBITRARYROTATION:
  632. DoRotate ();
  633. break;
  634. case ID_SELECTION_UNGROUPENTITY:
  635. Select_Ungroup ();
  636. break;
  637. case ID_SELECTION_CONNECT:
  638. ConnectEntities ();
  639. break;
  640. case ID_SELECTION_DRAGVERTECIES:
  641. if (g_qeglobals.d_select_mode == sel_vertex)
  642. {
  643. g_qeglobals.d_select_mode = sel_brush;
  644. Sys_UpdateWindows (W_ALL);
  645. }
  646. else
  647. {
  648. SetupVertexSelection ();
  649. if (g_qeglobals.d_numpoints)
  650. g_qeglobals.d_select_mode = sel_vertex;
  651. }
  652. break;
  653. case ID_SELECTION_DRAGEDGES:
  654. if (g_qeglobals.d_select_mode == sel_edge)
  655. {
  656. g_qeglobals.d_select_mode = sel_brush;
  657. Sys_UpdateWindows (W_ALL);
  658. }
  659. else
  660. {
  661. SetupVertexSelection ();
  662. if (g_qeglobals.d_numpoints)
  663. g_qeglobals.d_select_mode = sel_edge;
  664. }
  665. break;
  666. case ID_SELECTION_SELECTPARTIALTALL:
  667. Select_PartialTall ();
  668. break;
  669. case ID_SELECTION_SELECTCOMPLETETALL:
  670. Select_CompleteTall ();
  671. break;
  672. case ID_SELECTION_SELECTTOUCHING:
  673. Select_Touching ();
  674. break;
  675. case ID_SELECTION_SELECTINSIDE:
  676. Select_Inside ();
  677. break;
  678. case ID_SELECTION_CSGSUBTRACT:
  679. CSG_Subtract ();
  680. break;
  681. case ID_SELECTION_MAKEHOLLOW:
  682. CSG_MakeHollow ();
  683. break;
  684. case ID_SELECTION_CLONE:
  685. Select_Clone ();
  686. break;
  687. case ID_SELECTION_DELETE:
  688. Select_Delete ();
  689. break;
  690. case ID_SELECTION_DESELECT:
  691. Select_Deselect ();
  692. break;
  693. case ID_SELECTION_MAKE_DETAIL:
  694. Select_MakeDetail ();
  695. break;
  696. case ID_SELECTION_MAKE_STRUCTURAL:
  697. Select_MakeStructural ();
  698. break;
  699. //
  700. // region menu
  701. //
  702. case ID_REGION_OFF:
  703. Map_RegionOff ();
  704. break;
  705. case ID_REGION_SETXY:
  706. Map_RegionXY ();
  707. break;
  708. case ID_REGION_SETTALLBRUSH:
  709. Map_RegionTallBrush ();
  710. break;
  711. case ID_REGION_SETBRUSH:
  712. Map_RegionBrush ();
  713. break;
  714. case ID_REGION_SETSELECTION:
  715. Map_RegionSelectedBrushes ();
  716. break;
  717. case IDMRU+1:
  718. case IDMRU+2:
  719. case IDMRU+3:
  720. case IDMRU+4:
  721. case IDMRU+5:
  722. case IDMRU+6:
  723. case IDMRU+7:
  724. case IDMRU+8:
  725. case IDMRU+9:
  726. DoMru(hWnd,LOWORD(wParam));
  727. break;
  728. //
  729. // help menu
  730. //
  731. case ID_HELP_ABOUT:
  732. DoAbout();
  733. break;
  734. default:
  735. return FALSE;
  736. }
  737. return TRUE;
  738. }
  739. /*
  740. ============
  741. WMAIN_WndProc
  742. ============
  743. */
  744. LONG WINAPI WMAIN_WndProc (
  745. HWND hWnd,
  746. UINT uMsg,
  747. WPARAM wParam,
  748. LPARAM lParam)
  749. {
  750. LONG lRet = 1;
  751. RECT rect;
  752. HDC maindc;
  753. GetClientRect(hWnd, &rect);
  754. switch (uMsg)
  755. {
  756. case WM_TIMER:
  757. QE_CountBrushesAndUpdateStatusBar();
  758. QE_CheckAutoSave();
  759. return 0;
  760. case WM_DESTROY:
  761. SaveMruInReg(g_qeglobals.d_lpMruMenu,"Software\\id\\QuakeEd4\\MRU");
  762. DeleteMruMenu(g_qeglobals.d_lpMruMenu);
  763. PostQuitMessage(0);
  764. KillTimer( hWnd, QE_TIMER0 );
  765. return 0;
  766. case WM_CREATE:
  767. maindc = GetDC(hWnd);
  768. // QEW_SetupPixelFormat(maindc, false);
  769. g_qeglobals.d_lpMruMenu = CreateMruMenuDefault();
  770. LoadMruInReg(g_qeglobals.d_lpMruMenu,"Software\\id\\QuakeEd4\\MRU");
  771. // Refresh the File menu.
  772. PlaceMenuMRUItem(g_qeglobals.d_lpMruMenu,GetSubMenu(GetMenu(hWnd),0),
  773. ID_FILE_EXIT);
  774. return 0;
  775. case WM_SIZE:
  776. // resize the status window
  777. MoveWindow( g_qeglobals.d_hwndStatus, -100, 100, 10, 10, true);
  778. return 0;
  779. case WM_KEYDOWN:
  780. return QE_KeyDown (wParam);
  781. case WM_CLOSE:
  782. /* call destroy window to cleanup and go away */
  783. SaveWindowState(g_qeglobals.d_hwndXY, "xywindow");
  784. SaveWindowState(g_qeglobals.d_hwndCamera, "camerawindow");
  785. SaveWindowState(g_qeglobals.d_hwndZ, "zwindow");
  786. SaveWindowState(g_qeglobals.d_hwndEntity, "EntityWindow");
  787. SaveWindowState(g_qeglobals.d_hwndMain, "mainwindow");
  788. // FIXME: is this right?
  789. SaveRegistryInfo("SavedInfo", &g_qeglobals.d_savedinfo, sizeof(g_qeglobals.d_savedinfo));
  790. DestroyWindow (hWnd);
  791. return 0;
  792. case WM_COMMAND:
  793. return CommandHandler (hWnd, wParam, lParam);
  794. return 0;
  795. }
  796. return DefWindowProc (hWnd, uMsg, wParam, lParam);
  797. }
  798. /*
  799. ==============
  800. Main_Create
  801. ==============
  802. */
  803. void Main_Create (HINSTANCE hInstance)
  804. {
  805. WNDCLASS wc;
  806. int i;
  807. HMENU hMenu;
  808. /* Register the camera class */
  809. memset (&wc, 0, sizeof(wc));
  810. wc.style = 0;
  811. wc.lpfnWndProc = (WNDPROC)WMAIN_WndProc;
  812. wc.cbClsExtra = 0;
  813. wc.cbWndExtra = 0;
  814. wc.hInstance = hInstance;
  815. wc.hIcon = 0;
  816. wc.hCursor = LoadCursor (NULL,IDC_ARROW);
  817. wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  818. wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
  819. wc.lpszClassName = "QUAKE_MAIN";
  820. if (!RegisterClass (&wc) )
  821. Error ("WCam_Register: failed");
  822. g_qeglobals.d_hwndMain = CreateWindow ("QUAKE_MAIN" ,
  823. "QuakeEd 3",
  824. WS_OVERLAPPEDWINDOW |
  825. WS_CLIPSIBLINGS |
  826. WS_CLIPCHILDREN,
  827. 0,0,screen_width,screen_height+GetSystemMetrics(SM_CYSIZE), // size
  828. 0,
  829. 0, // no menu
  830. hInstance,
  831. NULL);
  832. if (!g_qeglobals.d_hwndMain)
  833. Error ("Couldn't create main window");
  834. /* create a timer so that we can count brushes */
  835. SetTimer( g_qeglobals.d_hwndMain,
  836. QE_TIMER0,
  837. 1000,
  838. NULL );
  839. LoadWindowState(g_qeglobals.d_hwndMain, "mainwindow");
  840. s_hwndToolbar = CreateToolBar(hInstance);
  841. g_qeglobals.d_hwndStatus = CreateMyStatusWindow(hInstance);
  842. //
  843. // load misc info from registry
  844. //
  845. i = sizeof(g_qeglobals.d_savedinfo);
  846. LoadRegistryInfo("SavedInfo", &g_qeglobals.d_savedinfo, &i);
  847. if (g_qeglobals.d_savedinfo.iSize != sizeof(g_qeglobals.d_savedinfo))
  848. {
  849. // fill in new defaults
  850. g_qeglobals.d_savedinfo.iSize = sizeof(g_qeglobals.d_savedinfo);
  851. g_qeglobals.d_savedinfo.fGamma = 1.0;
  852. g_qeglobals.d_savedinfo.iTexMenu = ID_VIEW_NEAREST;
  853. g_qeglobals.d_savedinfo.exclude = 0;
  854. g_qeglobals.d_savedinfo.show_coordinates = true;
  855. g_qeglobals.d_savedinfo.show_names = true;
  856. for (i=0 ; i<3 ; i++)
  857. {
  858. g_qeglobals.d_savedinfo.colors[COLOR_TEXTUREBACK][i] = 0.25;
  859. g_qeglobals.d_savedinfo.colors[COLOR_GRIDBACK][i] = 1.0;
  860. g_qeglobals.d_savedinfo.colors[COLOR_GRIDMINOR][i] = 0.75;
  861. g_qeglobals.d_savedinfo.colors[COLOR_GRIDMAJOR][i] = 0.5;
  862. g_qeglobals.d_savedinfo.colors[COLOR_CAMERABACK][i] = 0.25;
  863. }
  864. }
  865. if ( ( hMenu = GetMenu( g_qeglobals.d_hwndMain ) ) != 0 )
  866. {
  867. /*
  868. ** by default all of these are checked because that's how they're defined in the menu editor
  869. */
  870. if ( !g_qeglobals.d_savedinfo.show_names )
  871. CheckMenuItem( hMenu, ID_VIEW_SHOWNAMES, MF_BYCOMMAND | MF_UNCHECKED );
  872. if ( !g_qeglobals.d_savedinfo.show_coordinates )
  873. CheckMenuItem( hMenu, ID_VIEW_SHOWCOORDINATES, MF_BYCOMMAND | MF_UNCHECKED );
  874. if ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_LIGHTS )
  875. CheckMenuItem( hMenu, ID_VIEW_SHOWLIGHTS, MF_BYCOMMAND | MF_UNCHECKED );
  876. if ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_ENT )
  877. CheckMenuItem( hMenu, ID_VIEW_ENTITY, MF_BYCOMMAND | MF_UNCHECKED );
  878. if ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_PATHS )
  879. CheckMenuItem( hMenu, ID_VIEW_SHOWPATH, MF_BYCOMMAND | MF_UNCHECKED );
  880. if ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_WATER )
  881. CheckMenuItem( hMenu, ID_VIEW_SHOWWATER, MF_BYCOMMAND | MF_UNCHECKED );
  882. if ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_WORLD )
  883. CheckMenuItem( hMenu, ID_VIEW_SHOWWORLD, MF_BYCOMMAND | MF_UNCHECKED );
  884. if ( g_qeglobals.d_savedinfo.exclude & EXCLUDE_CLIP )
  885. CheckMenuItem( hMenu, ID_VIEW_SHOWCLIP, MF_BYCOMMAND | MF_UNCHECKED );
  886. }
  887. ShowWindow (g_qeglobals.d_hwndMain, SW_SHOWDEFAULT);
  888. }
  889. /*
  890. =============================================================
  891. REGISTRY INFO
  892. =============================================================
  893. */
  894. BOOL SaveRegistryInfo(const char *pszName, void *pvBuf, long lSize)
  895. {
  896. LONG lres;
  897. DWORD dwDisp;
  898. HKEY hKeyId;
  899. lres = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\id\\QuakeEd4", 0, NULL,
  900. REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKeyId, &dwDisp);
  901. if (lres != ERROR_SUCCESS)
  902. return FALSE;
  903. lres = RegSetValueEx(hKeyId, pszName, 0, REG_BINARY, pvBuf, lSize);
  904. RegCloseKey(hKeyId);
  905. if (lres != ERROR_SUCCESS)
  906. return FALSE;
  907. return TRUE;
  908. }
  909. BOOL LoadRegistryInfo(const char *pszName, void *pvBuf, long *plSize)
  910. {
  911. HKEY hKey;
  912. long lres, lType, lSize;
  913. if (plSize == NULL)
  914. plSize = &lSize;
  915. lres = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\id\\QuakeEd4", 0, KEY_READ, &hKey);
  916. if (lres != ERROR_SUCCESS)
  917. return FALSE;
  918. lres = RegQueryValueEx(hKey, pszName, NULL, &lType, pvBuf, plSize);
  919. RegCloseKey(hKey);
  920. if (lres != ERROR_SUCCESS)
  921. return FALSE;
  922. return TRUE;
  923. }
  924. BOOL SaveWindowState(HWND hWnd, const char *pszName)
  925. {
  926. RECT rc;
  927. GetWindowRect(hWnd, &rc);
  928. if (hWnd != g_qeglobals.d_hwndMain)
  929. MapWindowPoints(NULL, g_qeglobals.d_hwndMain, (POINT *)&rc, 2);
  930. return SaveRegistryInfo(pszName, &rc, sizeof(rc));
  931. }
  932. BOOL LoadWindowState(HWND hWnd, const char *pszName)
  933. {
  934. RECT rc;
  935. LONG lSize = sizeof(rc);
  936. if (LoadRegistryInfo(pszName, &rc, &lSize))
  937. {
  938. if (rc.left < 0)
  939. rc.left = 0;
  940. if (rc.top < 0)
  941. rc.top = 0;
  942. if (rc.right < rc.left + 16)
  943. rc.right = rc.left + 16;
  944. if (rc.bottom < rc.top + 16)
  945. rc.bottom = rc.top + 16;
  946. MoveWindow(hWnd, rc.left, rc.top, rc.right - rc.left,
  947. rc.bottom - rc.top, FALSE);
  948. return TRUE;
  949. }
  950. return FALSE;
  951. }
  952. /*
  953. ===============================================================
  954. STATUS WINDOW
  955. ===============================================================
  956. */
  957. void Sys_UpdateStatusBar( void )
  958. {
  959. extern int g_numbrushes, g_numentities;
  960. char numbrushbuffer[100]="";
  961. sprintf( numbrushbuffer, "Brushes: %d Entities: %d", g_numbrushes, g_numentities );
  962. Sys_Status( numbrushbuffer, 2 );
  963. }
  964. void Sys_Status(const char *psz, int part )
  965. {
  966. SendMessage(g_qeglobals.d_hwndStatus, SB_SETTEXT, part, (LPARAM)psz);
  967. }
  968. static HWND CreateMyStatusWindow(HINSTANCE hInst)
  969. {
  970. HWND hWnd;
  971. int partsize[3] = { 300, 1100, -1 };
  972. hWnd = CreateWindowEx( WS_EX_TOPMOST, // no extended styles
  973. STATUSCLASSNAME, // status bar
  974. "", // no text
  975. WS_CHILD | WS_BORDER | WS_VISIBLE, // styles
  976. -100, -100, 10, 10, // x, y, cx, cy
  977. g_qeglobals.d_hwndMain, // parent window
  978. (HMENU)100, // window ID
  979. hInst, // instance
  980. NULL); // window data
  981. SendMessage( hWnd, SB_SETPARTS, 3, ( long ) partsize );
  982. return hWnd;
  983. }
  984. //==============================================================
  985. #define NUMBUTTONS 15
  986. HWND CreateToolBar(HINSTANCE hinst)
  987. {
  988. HWND hwndTB;
  989. TBADDBITMAP tbab;
  990. TBBUTTON tbb[NUMBUTTONS];
  991. // Ensure that the common control DLL is loaded.
  992. InitCommonControls();
  993. // Create a toolbar that the user can customize and that has a
  994. // tooltip associated with it.
  995. hwndTB = CreateWindowEx(0, TOOLBARCLASSNAME, (LPSTR) NULL,
  996. WS_CHILD | TBSTYLE_TOOLTIPS | CCS_ADJUSTABLE | WS_BORDER,
  997. 0, 0, 0, 0, g_qeglobals.d_hwndMain, (HMENU) IDR_TOOLBAR1, hinst, NULL);
  998. // Send the TB_BUTTONSTRUCTSIZE message, which is required for
  999. // backward compatibility.
  1000. SendMessage(hwndTB, TB_BUTTONSTRUCTSIZE, (WPARAM) sizeof(TBBUTTON), 0);
  1001. // Add the bitmap containing button images to the toolbar.
  1002. tbab.hInst = hinst;
  1003. tbab.nID = IDR_TOOLBAR1;
  1004. SendMessage(hwndTB, TB_ADDBITMAP, (WPARAM)NUMBUTTONS, (WPARAM) &tbab);
  1005. // Fill the TBBUTTON array with button information, and add the
  1006. // buttons to the toolbar.
  1007. tbb[0].iBitmap = 0;
  1008. tbb[0].idCommand = ID_BRUSH_FLIPX;
  1009. tbb[0].fsState = TBSTATE_ENABLED;
  1010. tbb[0].fsStyle = TBSTYLE_BUTTON;
  1011. tbb[0].dwData = 0;
  1012. tbb[0].iString = 0;
  1013. tbb[1].iBitmap = 2;
  1014. tbb[1].idCommand = ID_BRUSH_FLIPY;
  1015. tbb[1].fsState = TBSTATE_ENABLED;
  1016. tbb[1].fsStyle = TBSTYLE_BUTTON;
  1017. tbb[1].dwData = 0;
  1018. tbb[1].iString = 0;
  1019. tbb[2].iBitmap = 4;
  1020. tbb[2].idCommand = ID_BRUSH_FLIPZ;
  1021. tbb[2].fsState = TBSTATE_ENABLED;
  1022. tbb[2].fsStyle = TBSTYLE_BUTTON;
  1023. tbb[2].dwData = 0;
  1024. tbb[2].iString = 0;
  1025. tbb[3].iBitmap = 1;
  1026. tbb[3].idCommand = ID_BRUSH_ROTATEX;
  1027. tbb[3].fsState = TBSTATE_ENABLED;
  1028. tbb[3].fsStyle = TBSTYLE_BUTTON;
  1029. tbb[3].dwData = 0;
  1030. tbb[3].iString = 0;
  1031. tbb[4].iBitmap = 3;
  1032. tbb[4].idCommand = ID_BRUSH_ROTATEY;
  1033. tbb[4].fsState = TBSTATE_ENABLED;
  1034. tbb[4].fsStyle = TBSTYLE_BUTTON;
  1035. tbb[4].dwData = 0;
  1036. tbb[4].iString = 0;
  1037. tbb[5].iBitmap = 5;
  1038. tbb[5].idCommand = ID_BRUSH_ROTATEZ;
  1039. tbb[5].fsState = TBSTATE_ENABLED;
  1040. tbb[5].fsStyle = TBSTYLE_BUTTON;
  1041. tbb[5].dwData = 0;
  1042. tbb[5].iString = 0;
  1043. tbb[6].iBitmap = 6;
  1044. tbb[6].idCommand = ID_SELECTION_SELECTCOMPLETETALL;
  1045. tbb[6].fsState = TBSTATE_ENABLED;
  1046. tbb[6].fsStyle = TBSTYLE_BUTTON;
  1047. tbb[6].dwData = 0;
  1048. tbb[6].iString = 0;
  1049. tbb[7].iBitmap = 7;
  1050. tbb[7].idCommand = ID_SELECTION_SELECTTOUCHING;
  1051. tbb[7].fsState = TBSTATE_ENABLED;
  1052. tbb[7].fsStyle = TBSTYLE_BUTTON;
  1053. tbb[7].dwData = 0;
  1054. tbb[7].iString = 0;
  1055. tbb[8].iBitmap = 8;
  1056. tbb[8].idCommand = ID_SELECTION_SELECTPARTIALTALL;
  1057. tbb[8].fsState = TBSTATE_ENABLED;
  1058. tbb[8].fsStyle = TBSTYLE_BUTTON;
  1059. tbb[8].dwData = 0;
  1060. tbb[8].iString = 0;
  1061. tbb[9].iBitmap = 9;
  1062. tbb[9].idCommand = ID_SELECTION_SELECTINSIDE;
  1063. tbb[9].fsState = TBSTATE_ENABLED;
  1064. tbb[9].fsStyle = TBSTYLE_BUTTON;
  1065. tbb[9].dwData = 0;
  1066. tbb[9].iString = 0;
  1067. tbb[10].iBitmap = 10;
  1068. tbb[10].idCommand = ID_SELECTION_CSGSUBTRACT;
  1069. tbb[10].fsState = TBSTATE_ENABLED;
  1070. tbb[10].fsStyle = TBSTYLE_BUTTON;
  1071. tbb[10].dwData = 0;
  1072. tbb[10].iString = 0;
  1073. tbb[11].iBitmap = 11;
  1074. tbb[11].idCommand = ID_SELECTION_MAKEHOLLOW;
  1075. tbb[11].fsState = TBSTATE_ENABLED;
  1076. tbb[11].fsStyle = TBSTYLE_BUTTON;
  1077. tbb[11].dwData = 0;
  1078. tbb[11].iString = 0;
  1079. tbb[12].iBitmap = 12;
  1080. tbb[12].idCommand = ID_TEXTURES_WIREFRAME;
  1081. tbb[12].fsState = TBSTATE_ENABLED;
  1082. tbb[12].fsStyle = TBSTYLE_BUTTON;
  1083. tbb[12].dwData = 0;
  1084. tbb[12].iString = 0;
  1085. tbb[13].iBitmap = 13;
  1086. tbb[13].idCommand = ID_TEXTURES_FLATSHADE;
  1087. tbb[13].fsState = TBSTATE_ENABLED;
  1088. tbb[13].fsStyle = TBSTYLE_BUTTON;
  1089. tbb[13].dwData = 0;
  1090. tbb[13].iString = 0;
  1091. tbb[14].iBitmap = 14;
  1092. tbb[14].idCommand = ID_VIEW_TRILINEAR;
  1093. tbb[14].fsState = TBSTATE_ENABLED;
  1094. tbb[14].fsStyle = TBSTYLE_BUTTON;
  1095. tbb[14].dwData = 0;
  1096. tbb[14].iString = 0;
  1097. SendMessage(hwndTB, TB_ADDBUTTONS, (WPARAM)NUMBUTTONS,
  1098. (LPARAM) (LPTBBUTTON) &tbb);
  1099. ShowWindow(hwndTB, SW_SHOW);
  1100. return hwndTB;
  1101. }