#include "qe3.h" #include "undo.h" BOOL CALLBACK GammaDlgProc ( HWND hwndDlg, // handle to dialog box UINT uMsg, // message WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { char sz[256]; switch (uMsg) { case WM_INITDIALOG: sprintf(sz, "%1.1f", g_qeglobals.d_savedinfo.fGamma); SetWindowText(GetDlgItem(hwndDlg, IDC_G_EDIT), sz); return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: GetWindowText(GetDlgItem(hwndDlg, IDC_G_EDIT), sz, 255); g_qeglobals.d_savedinfo.fGamma = atof(sz); EndDialog(hwndDlg, 1); return TRUE; case IDCANCEL: EndDialog(hwndDlg, 0); return TRUE; } } return FALSE; } void DoGamma(void) { char *psz, sz[256]; if ( DialogBox(g_qeglobals.d_hInstance, (char *)IDD_GAMMA, g_qeglobals.d_hwndMain, GammaDlgProc)) { psz = ValueForKey(world_entity, "_wad"); if (psz) { strcpy(sz, psz); Texture_Flush(); Texture_ShowInuse(); } } } //================================================ void SelectBrush (int entitynum, int brushnum) { entity_t *e; brush_t *b; int i; if (entitynum == 0) e = world_entity; else { e = entities.next; while (--entitynum) { e=e->next; if (e == &entities) { Sys_Status ("No such entity.", 0); return; } } } b = e->brushes.onext; if (b == &e->brushes) { Sys_Status ("No such brush.", 0); return; } while (brushnum--) { b=b->onext; if (b == &e->brushes) { Sys_Status ("No such brush.", 0); return; } } Brush_RemoveFromList (b); Brush_AddToList (b, &selected_brushes); Sys_UpdateWindows (W_ALL); for (i=0 ; i<3 ; i++) g_qeglobals.d_xy.origin[i] = (b->mins[i] + b->maxs[i])/2; Sys_Status ("Selected.", 0); } /* ================= GetSelectionIndex ================= */ void GetSelectionIndex (int *ent, int *brush) { brush_t *b, *b2; entity_t *entity; *ent = *brush = 0; b = selected_brushes.next; if (b == &selected_brushes) return; // find entity if (b->owner != world_entity) { (*ent)++; for (entity = entities.next ; entity != &entities ; entity=entity->next, (*ent)++) ; } // find brush for (b2=b->owner->brushes.onext ; b2 != b && b2 != &b->owner->brushes ; b2=b2->onext, (*brush)++) ; } BOOL CALLBACK FindBrushDlgProc ( HWND hwndDlg, // handle to dialog box UINT uMsg, // message WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { char entstr[256]; char brushstr[256]; HWND h; int ent, brush; switch (uMsg) { case WM_INITDIALOG: // set entity and brush number GetSelectionIndex (&ent, &brush); sprintf (entstr, "%i", ent); sprintf (brushstr, "%i", brush); SetWindowText(GetDlgItem(hwndDlg, IDC_FIND_ENTITY), entstr); SetWindowText(GetDlgItem(hwndDlg, IDC_FIND_BRUSH), brushstr); h = GetDlgItem(hwndDlg, IDC_FIND_ENTITY); SetFocus (h); return FALSE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: GetWindowText(GetDlgItem(hwndDlg, IDC_FIND_ENTITY), entstr, 255); GetWindowText(GetDlgItem(hwndDlg, IDC_FIND_BRUSH), brushstr, 255); SelectBrush (atoi(entstr), atoi(brushstr)); EndDialog(hwndDlg, 1); return TRUE; case IDCANCEL: EndDialog(hwndDlg, 0); return TRUE; } } return FALSE; } void DoFind(void) { DialogBox(g_qeglobals.d_hInstance, (char *)IDD_FINDBRUSH, g_qeglobals.d_hwndMain, FindBrushDlgProc); } /* =================================================== Set Max View Distance =================================================== */ BOOL CALLBACK SeMaxViewDistDlgProc ( HWND hwndDlg, // handle to dialog box UINT uMsg, // message WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { char toStr[256]; char* curDist; int decimal, sign; float vDist; HWND h; switch (uMsg) { case WM_INITDIALOG: curDist = _fcvt(g_qeglobals.d_maxViewDist,0, &decimal, &sign); SetWindowText(GetDlgItem(hwndDlg, IDC_MAXVIEWDIST), curDist); h = GetDlgItem(hwndDlg, IDC_MAXVIEWDIST); SetFocus (h);//put the cursor on the x text entry box return FALSE; case WM_COMMAND: GetWindowText(GetDlgItem(hwndDlg, IDC_MAXVIEWDIST), toStr, 255); vDist = atof(toStr); switch (LOWORD(wParam)) { case IDOK: // set some global view range here. if(vDist > 16) { // less than this would be meaningless, I believe g_qeglobals.d_maxViewDist = vDist; g_qeglobals.d_savedinfo.maxViewDist = vDist; } Sys_UpdateWindows (W_CAMERA); EndDialog(hwndDlg, 0); return TRUE; case IDCANCEL: EndDialog(hwndDlg, 0); return TRUE; } } return FALSE; } void DoSetMaxViewDist(void) { DialogBox(g_qeglobals.d_hInstance, (char *)IDD_MAXVIEWDIST, g_qeglobals.d_hwndMain, SeMaxViewDistDlgProc); } void DoDefaultTextures(void) { brush_t *b; face_t *f; for (b=active_brushes.next ; b != &active_brushes ; b=b->next) { for(f=b->brush_faces; f ; f=f->next) { f->texdef.scale[0] = f->d_texture->scale_x; f->texdef.scale[1] = f->d_texture->scale_y; } } if(camera.draw_mode == cd_texture) { camera.draw_mode = cd_solid; Map_BuildBrushData(false); Sys_UpdateWindows (W_ALL); if (camera.draw_mode != cd_texture) { camera.draw_mode = cd_texture; Map_BuildBrushData(false); } Sys_UpdateWindows (W_ALL); } } /* =================================================== REPLACE TEXTURE =================================================== */ BOOL CALLBACK ReplaceTextureDlgProc ( HWND hwndDlg, // handle to dialog box UINT uMsg, // message WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { char fromStr[256]; char toStr[256]; switch (uMsg) { case WM_INITDIALOG: // init the two boxes to the last two selected textures SetWindowText(GetDlgItem(hwndDlg, IDC_REP_EDIT2), g_qeglobals.d_texturewin.texdef.name); SetWindowText(GetDlgItem(hwndDlg, IDC_REP_EDIT1), g_qeglobals.d_texturewin.prevTexDef.name); return FALSE; case WM_COMMAND: GetWindowText(GetDlgItem(hwndDlg, IDC_REP_EDIT2), toStr, 255); GetWindowText(GetDlgItem(hwndDlg, IDC_REP_EDIT1), fromStr, 255); switch (LOWORD(wParam)) { case IDD_REPLACEALL: Texture_Replace(fromStr, toStr, 1); EndDialog(hwndDlg, 0); return TRUE; case IDD_REPLACESELECTED: Texture_Replace(fromStr, toStr, 0); EndDialog(hwndDlg, 0); return TRUE; case IDCANCEL: EndDialog(hwndDlg, 0); return TRUE; } } return FALSE; } void DoTextureReplace(void) { DialogBox(g_qeglobals.d_hInstance, (char *)IDD_REPLACE, g_qeglobals.d_hwndMain, ReplaceTextureDlgProc); } /* =================================================== ARBITRARY ROTATE =================================================== */ BOOL CALLBACK RotateDlgProc ( HWND hwndDlg, // handle to dialog box UINT uMsg, // message WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { char str[256]; HWND h; float v; switch (uMsg) { case WM_INITDIALOG: h = GetDlgItem(hwndDlg, IDC_ROTX); SetFocus (h);//put the cursor on the x text entry box return FALSE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: UNDO_StartBrushEdit ("&Undo Rotation"); GetWindowText(GetDlgItem(hwndDlg, IDC_ROTX), str, 255); v = atof(str); if (v) Select_RotateAxis (0, v); GetWindowText(GetDlgItem(hwndDlg, IDC_ROTY), str, 255); v = atof(str); if (v) Select_RotateAxis (1, v); GetWindowText(GetDlgItem(hwndDlg, IDC_ROTZ), str, 255); v = atof(str); if (v) Select_RotateAxis (2, v); UNDO_FinishBrushEdit (NULL); EndDialog(hwndDlg, 1); return TRUE; case IDCANCEL: EndDialog(hwndDlg, 0); return TRUE; } } return FALSE; } void DoRotate(void) { DialogBox(g_qeglobals.d_hInstance, (char *)IDD_ROTATE, g_qeglobals.d_hwndMain, RotateDlgProc); } /* =================================================== ARBITRARY ROTATE =================================================== */ BOOL CALLBACK ScaleDlgProc ( HWND hwndDlg, // handle to dialog box UINT uMsg, // message WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { char str[256]; HWND h; float v; int b1, nox, noy, noz; switch (uMsg) { case WM_INITDIALOG: h = GetDlgItem(hwndDlg, IDC_SCALE); SetWindowText(h, "1.0"); SetFocus (h);//set focus to scale text entry box SendMessage(h, WM_LBUTTONDBLCLK, 0, 0);//don't know an easier way to highlight this text --ss return FALSE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: GetWindowText(GetDlgItem(hwndDlg, IDC_SCALE), str, 255); v = atof(str); if (v) { // Scale all of the selected brushes here by this value UNDO_StartBrushEdit ("&Undo Scale"); b1 = SendMessage(GetDlgItem(hwndDlg, IDC_SCALE_EACH_ORIGIN), BM_GETCHECK, 0, 0); b1 = (b1) ? 0:1; // these need to be swapped for the function nox = SendMessage(GetDlgItem(hwndDlg, IDC_CHECK_NOX), BM_GETCHECK, 0, 0); noy = SendMessage(GetDlgItem(hwndDlg, IDC_CHECK_NOY), BM_GETCHECK, 0, 0); noz = SendMessage(GetDlgItem(hwndDlg, IDC_CHECK_NOZ), BM_GETCHECK, 0, 0); Brush_Scale(v, b1, nox, noy, noz); UNDO_FinishBrushEdit (NULL); } EndDialog(hwndDlg, 1); return TRUE; case IDCANCEL: EndDialog(hwndDlg, 0); return TRUE; } } return FALSE; } void DoScale(void) { DialogBox(g_qeglobals.d_hInstance, (char *)IDD_SCALE, g_qeglobals.d_hwndMain, ScaleDlgProc); } /* =================================================== ARBITRARY SIDES =================================================== */ BOOL CALLBACK SidesDlgProc ( HWND hwndDlg, // handle to dialog box UINT uMsg, // message WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { char str[256]; HWND h; switch (uMsg) { case WM_INITDIALOG: h = GetDlgItem(hwndDlg, IDC_FIND_ENTITY); SetFocus (h); return FALSE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: GetWindowText(GetDlgItem(hwndDlg, IDC_SIDES), str, 255); UNDO_StartBrushEdit("&Undo Sides"); Brush_MakeSided (atoi(str)); UNDO_FinishBrushEdit (NULL); EndDialog(hwndDlg, 1); break; case ID_BRUSH_SNAPOK: GetWindowText(GetDlgItem(hwndDlg, IDC_SIDES), str, 255); UNDO_StartBrushEdit("&Undo Sides"); Brush_MakeSided_Snap (atoi(str)); UNDO_FinishBrushEdit (NULL); EndDialog(hwndDlg, 1); break; case IDCANCEL: EndDialog(hwndDlg, 0); break; } default: return FALSE; } } void DoSides(void) { DialogBox(g_qeglobals.d_hInstance, (char *)IDD_SIDES, g_qeglobals.d_hwndMain, SidesDlgProc); } //====================================================================== /* =================== DoAbout =================== */ BOOL CALLBACK AboutDlgProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch (uMsg) { case WM_INITDIALOG: { char renderer[1024]; char version[1024]; char vendor[1024]; char extensions[4096]; sprintf( renderer, "Renderer:\t%s", glGetString( GL_RENDERER ) ); sprintf( version, "Version:\t\t%s", glGetString( GL_VERSION ) ); sprintf( vendor, "Vendor:\t\t%s", glGetString( GL_VENDOR ) ); sprintf( extensions, "\n%s", glGetString( GL_EXTENSIONS ) ); SetWindowText( GetDlgItem( hwndDlg, IDC_ABOUT_GLRENDERER ), renderer ); SetWindowText( GetDlgItem( hwndDlg, IDC_ABOUT_GLVERSION ), version ); SetWindowText( GetDlgItem( hwndDlg, IDC_ABOUT_GLVENDOR ), vendor ); SetWindowText( GetDlgItem( hwndDlg, IDC_ABOUT_GLEXTENSIONS ), extensions ); } return TRUE; case WM_CLOSE: EndDialog( hwndDlg, 1 ); return TRUE; case WM_COMMAND: if ( LOWORD( wParam ) == IDOK ) EndDialog(hwndDlg, 1); return TRUE; } return FALSE; } void DoAbout(void) { DialogBox( g_qeglobals.d_hInstance, ( char * ) IDD_ABOUT, g_qeglobals.d_hwndMain, AboutDlgProc ); } /* =================================================== SURFACE INSPECTOR =================================================== */ texdef_t g_old_texdef; qboolean g_changed_surface; int g_checkboxes[64] = { IDC_CHECK1, IDC_CHECK2, IDC_CHECK3, IDC_CHECK4, IDC_CHECK5, IDC_CHECK6, IDC_CHECK7, IDC_CHECK8, IDC_CHECK9, IDC_CHECK10, IDC_CHECK11, IDC_CHECK12, IDC_CHECK13, IDC_CHECK14, IDC_CHECK15, IDC_CHECK16, IDC_CHECK17, IDC_CHECK18, IDC_CHECK19, IDC_CHECK20, IDC_CHECK21, IDC_CHECK22, IDC_CHECK23, IDC_CHECK24, IDC_CHECK25, IDC_CHECK26, IDC_CHECK27, IDC_CHECK28, IDC_CHECK29, IDC_CHECK30, IDC_CHECK31, IDC_CHECK32, IDC_CHECK33, IDC_CHECK34, IDC_CHECK35, IDC_CHECK36, IDC_CHECK37, IDC_CHECK38, IDC_CHECK39, IDC_CHECK40, IDC_CHECK41, IDC_CHECK42, IDC_CHECK43, IDC_CHECK44, IDC_CHECK45, IDC_CHECK46, IDC_CHECK47, IDC_CHECK48, IDC_CHECK49, IDC_CHECK50, IDC_CHECK51, IDC_CHECK52, IDC_CHECK53, IDC_CHECK54, IDC_CHECK55, IDC_CHECK56, IDC_CHECK57, IDC_CHECK58, IDC_CHECK59, IDC_CHECK60, IDC_CHECK61, IDC_CHECK62, IDC_CHECK63, IDC_CHECK64 }; /* ============== SetSurfMods Set the fields to the current texdef =============== */ void SetSurfMods(HWND hwnd) { char sz[128]; texdef_t *pt; int i; HWND comboBox; materialtype_t *mat; pt = &g_qeglobals.d_texturewin.texdef; i = (pt->flags & 0x0FF000000) >> 24; comboBox = GetDlgItem(hwnd, IDC_TEXTURE_MATERIAL); for (mat=materialtypes ; mat->name ; mat++) { SendMessage(comboBox, CB_ADDSTRING, 0, (LPARAM)mat->name); if (i == mat->value) { SendMessage(comboBox, CB_SELECTSTRING, (WPARAM)(-1), (LPARAM)mat->name); } } SendMessage (hwnd, WM_SETREDRAW, 0, 0); SetWindowText(GetDlgItem(hwnd, IDC_TEXTURE), pt->name); sprintf(sz, "%d", (int)pt->shift[0]); SetWindowText(GetDlgItem(hwnd, IDC_HSHIFT), sz); sprintf(sz, "%d", (int)pt->shift[1]); SetWindowText(GetDlgItem(hwnd, IDC_VSHIFT), sz); sprintf(sz, "%4.2f", pt->scale[0]); SetWindowText(GetDlgItem(hwnd, IDC_HSCALE), sz); sprintf(sz, "%4.2f", pt->scale[1]); SetWindowText(GetDlgItem(hwnd, IDC_VSCALE), sz); sprintf(sz, "%d", (int)pt->rotate); SetWindowText(GetDlgItem(hwnd, IDC_ROTATE), sz); sprintf(sz, "%d", (int)pt->value); SetWindowText(GetDlgItem(hwnd, IDC_VALUE), sz); sprintf(sz, "%f", pt->lighting[0]); SetWindowText(GetDlgItem(hwnd, IDC_LIGHT_RED), sz); sprintf(sz, "%f", pt->lighting[1]); SetWindowText(GetDlgItem(hwnd, IDC_LIGHT_GREEN), sz); sprintf(sz, "%f", pt->lighting[2]); SetWindowText(GetDlgItem(hwnd, IDC_LIGHT_BLUE), sz); sprintf(sz, "%f", pt->lighting[3]); SetWindowText(GetDlgItem(hwnd, IDC_LIGHT_ALPHA), sz); // for (i=0 ; i<32 ; i++) top 8 bits are now material for (i=0 ; i<24 ; i++) SendMessage(GetDlgItem(hwnd, g_checkboxes[i]), BM_SETCHECK, !!(pt->flags&(1<contents&(1<name, sz, sizeof(pt->name)-1); if (pt->name[0] <= ' ') { strcpy (pt->name, "none"); SetWindowText(GetDlgItem(hwnd, IDC_TEXTURE), pt->name); } GetWindowText (GetDlgItem(hwnd, IDC_HSHIFT), sz, 127); pt->shift[0] = atof(sz); GetWindowText (GetDlgItem(hwnd, IDC_VSHIFT), sz, 127); pt->shift[1] = atof(sz); GetWindowText(GetDlgItem(hwnd, IDC_HSCALE), sz, 127); pt->scale[0] = atof(sz); GetWindowText(GetDlgItem(hwnd, IDC_VSCALE), sz, 127); pt->scale[1] = atof(sz); GetWindowText(GetDlgItem(hwnd, IDC_ROTATE), sz, 127); pt->rotate = atof(sz); GetWindowText(GetDlgItem(hwnd, IDC_VALUE), sz, 127); pt->value = atof(sz); GetWindowText(GetDlgItem(hwnd, IDC_LIGHT_RED), sz, 127); pt->lighting[0] = atof(sz); GetWindowText(GetDlgItem(hwnd, IDC_LIGHT_GREEN), sz, 127); pt->lighting[1] = atof(sz); GetWindowText(GetDlgItem(hwnd, IDC_LIGHT_BLUE), sz, 127); pt->lighting[2] = atof(sz); GetWindowText(GetDlgItem(hwnd, IDC_LIGHT_ALPHA), sz, 127); pt->lighting[3] = atof(sz); pt->flags = 0; // for (i=0 ; i<32 ; i++) top 8 bits are now material for (i=0 ; i<24 ; i++) { b = SendMessage(GetDlgItem(hwnd, g_checkboxes[i]), BM_GETCHECK, 0, 0); if (b != 1 && b != 0) continue; pt->flags |= b<contents = 0; for (i=0 ; i<32 ; i++) { b = SendMessage(GetDlgItem(hwnd, g_checkboxes[32+i]), BM_GETCHECK, 0, 0); if (b != 1 && b != 0) continue; pt->contents |= b<name ; mat++) { if (!strcmp(mat->name, sz)) { // assumes SURF_MATERIAL is in top 8 bits pt->flags = (pt->flags & 0x0FFFFFF) | (mat->value << 24); break; } } g_changed_surface = true; Select_SetTexture(pt); } /* ================= UpdateSpinners ================= */ void UpdateSpinners(HWND wnd, unsigned uMsg, WPARAM wParam, LPARAM lParam) { int nScrollCode; HWND hwnd; texdef_t *pt; pt = &g_qeglobals.d_texturewin.texdef; nScrollCode = (int) LOWORD(wParam); // scroll bar value hwnd = (HWND) lParam; // handle of scroll bar if ((nScrollCode != SB_LINEUP) && (nScrollCode != SB_LINEDOWN)) return; if (hwnd == GetDlgItem(wnd, IDC_ROTATEA)) { if (nScrollCode == SB_LINEUP) pt->rotate += 45; else pt->rotate -= 45; if (pt->rotate < 0) pt->rotate += 360; if (pt->rotate >= 360) pt->rotate -= 360; } else if (hwnd == GetDlgItem(wnd, IDC_HSCALEA)) { if (nScrollCode == SB_LINEDOWN) pt->scale[0] -= 0.1; else pt->scale[0] += 0.1; } else if (hwnd == GetDlgItem(wnd, IDC_VSCALEA)) { if (nScrollCode == SB_LINEUP) pt->scale[1] += 0.1; else pt->scale[1] -= 0.1; } else if (hwnd == GetDlgItem(wnd, IDC_HSHIFTA)) { if (nScrollCode == SB_LINEDOWN) pt->shift[0] -= 8; else pt->shift[0] += 8; } else if (hwnd == GetDlgItem(wnd, IDC_VSHIFTA)) { if (nScrollCode == SB_LINEUP) pt->shift[1] += 8; else pt->shift[1] -= 8; } SetSurfMods(wnd); g_changed_surface = true; Select_SetTexture(pt); } BOOL CALLBACK SurfaceDlgProc ( HWND hwndDlg, // handle to dialog box UINT uMsg, // message WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { switch (uMsg) { case WM_INITDIALOG: SetSurfMods (hwndDlg); return 0; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: GetSurfMods (hwndDlg); EndDialog(hwndDlg, 1); return 1; break; case IDAPPLY: GetSurfMods (hwndDlg); InvalidateRect(g_qeglobals.d_hwndCamera, NULL, false); UpdateWindow (g_qeglobals.d_hwndCamera); return 1; break; case IDCANCEL: // g_qeglobals.d_texturewin.texdef = g_old_texdef; // if (g_changed_surface) // Select_SetTexture(&g_qeglobals.d_texturewin.texdef); EndDialog(hwndDlg, 0); return 1; break; } break; case WM_HSCROLL: case WM_VSCROLL: UpdateSpinners(hwndDlg, uMsg, wParam, lParam); InvalidateRect(g_qeglobals.d_hwndCamera, NULL, false); UpdateWindow (g_qeglobals.d_hwndCamera); return 1; default: return 0; } return 0; } static undo_t surfaceUndo; void SurfaceDlg_Init() { surfaceUndo.brushdata.next = surfaceUndo.brushdata.prev = &surfaceUndo.brushdata; } void DoSurface (void) { brush_t *from, *data; //need to save all data if brush selection active // how can you tell if only one face selected?????? if(!selected_face) { while (surfaceUndo.brushdata.next != &surfaceUndo.brushdata) { from = surfaceUndo.brushdata.next; Brush_Free (from); } from = &selected_brushes; while (from->next != &selected_brushes) { from = from->next; data = Brush_Clone(from); Brush_AddToList(data, &surfaceUndo.brushdata); //store data } } else { // save current state for cancel g_old_texdef = g_qeglobals.d_texturewin.texdef; } g_changed_surface = false; if(!DialogBox(g_qeglobals.d_hInstance, (char *)IDD_SURFACE, g_qeglobals.d_hwndMain, SurfaceDlgProc)) { //cancelled, undo changes if(g_changed_surface) { if(!selected_face) { while (selected_brushes.next != &selected_brushes) { from = selected_brushes.next; Brush_Free (from); } UNDO_Reset (); //clone can destroy undo info UNDO_BrushClone (&surfaceUndo); } else { g_qeglobals.d_texturewin.texdef = g_old_texdef; Select_SetTexture(&g_qeglobals.d_texturewin.texdef); } } } }