]> icculus.org git repositories - icculus/iodoom3.git/blob - neo/tools/radiant/SurfaceDlg.cpp
Various Mac OS X tweaks to get this to build. Probably breaking things.
[icculus/iodoom3.git] / neo / tools / radiant / SurfaceDlg.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 "SurfaceDlg.h"
35 #include "mainfrm.h"
36
37 #ifdef _DEBUG
38 #define new DEBUG_NEW
39 #undef THIS_FILE
40 static char THIS_FILE[] = __FILE__;
41 #endif
42
43 /////////////////////////////////////////////////////////////////////////////
44 // CSurfaceDlg dialog
45
46 CSurfaceDlg g_dlgSurface;
47
48
49 CSurfaceDlg::CSurfaceDlg(CWnd* pParent /*=NULL*/)
50         : CDialog(CSurfaceDlg::IDD, pParent) {
51         //{{AFX_DATA_INIT(CSurfaceDlg)
52         m_nHorz = 3;
53         m_nVert = 3;
54         m_horzScale = 1.0f;
55         m_horzShift = 0.5f;
56         m_rotate = 15.0f;
57         m_vertScale = 1.0f;
58         m_vertShift = 0.5f;
59         m_strMaterial = _T("");
60         m_subdivide = FALSE;
61         m_fHeight = 1.0f;
62         m_fWidth = 1.0f;
63         m_absolute = FALSE;
64         //}}AFX_DATA_INIT
65 }
66
67
68 void CSurfaceDlg::DoDataExchange(CDataExchange* pDX) {
69         CDialog::DoDataExchange(pDX);
70         //{{AFX_DATA_MAP(CSurfaceDlg)
71         DDX_Control(pDX, IDC_ROTATE, m_wndRotateEdit);
72         DDX_Control(pDX, IDC_EDIT_VERT, m_wndVert);
73         DDX_Control(pDX, IDC_EDIT_HORZ, m_wndHorz);
74         DDX_Control(pDX, IDC_SLIDER_VERT, m_wndVerticalSubdivisions);
75         DDX_Control(pDX, IDC_SLIDER_HORZ, m_wndHorzSubdivisions);
76         DDX_Control(pDX, IDC_SPIN_WIDTH, m_wndWidth);
77         DDX_Control(pDX, IDC_SPIN_HEIGHT, m_wndHeight);
78         DDX_Control(pDX, IDC_SPIN_VSHIFT, m_wndVShift);
79         DDX_Control(pDX, IDC_SPIN_ROTATE, m_wndRotate);
80         DDX_Control(pDX, IDC_SPIN_HSHIFT, m_wndHShift);
81         DDX_Text(pDX, IDC_EDIT_HORZ, m_nHorz);
82         DDV_MinMaxInt(pDX, m_nHorz, 1, 64);
83         DDX_Text(pDX, IDC_EDIT_VERT, m_nVert);
84         DDV_MinMaxInt(pDX, m_nVert, 1, 64);
85         DDX_Text(pDX, IDC_HSCALE, m_horzScale);
86         DDX_Text(pDX, IDC_HSHIFT, m_horzShift);
87         DDX_Text(pDX, IDC_ROTATE, m_rotate);
88         DDX_Text(pDX, IDC_VSCALE, m_vertScale);
89         DDX_Text(pDX, IDC_VSHIFT, m_vertShift);
90         DDX_Text(pDX, IDC_TEXTURE, m_strMaterial);
91         DDX_Check(pDX, IDC_CHECK_SUBDIVIDE, m_subdivide);
92         DDX_Text(pDX, IDC_EDIT_HEIGHT, m_fHeight);
93         DDX_Text(pDX, IDC_EDIT_WIDTH, m_fWidth);
94         DDX_Check(pDX, IDC_CHECK_ABSOLUTE, m_absolute);
95         //}}AFX_DATA_MAP
96 }
97
98
99 BEGIN_MESSAGE_MAP(CSurfaceDlg, CDialog)
100         //{{AFX_MSG_MAP(CSurfaceDlg)
101         ON_WM_HSCROLL()
102         ON_WM_KEYDOWN()
103         ON_WM_VSCROLL()
104         ON_WM_CLOSE()
105         ON_WM_DESTROY()
106         ON_BN_CLICKED(IDCANCEL, OnBtnCancel)
107         ON_BN_CLICKED(IDC_BTN_COLOR, OnBtnColor)
108         ON_WM_CTLCOLOR()
109         ON_WM_CREATE()
110         ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_HSHIFT, OnDeltaPosSpin)
111         ON_BN_CLICKED(IDC_BTN_PATCHDETAILS, OnBtnPatchdetails)
112         ON_BN_CLICKED(IDC_BTN_PATCHNATURAL, OnBtnPatchnatural)
113         ON_BN_CLICKED(IDC_BTN_PATCHRESET, OnBtnPatchreset)
114         ON_BN_CLICKED(IDC_BTN_AXIAL, OnBtnAxial)
115         ON_BN_CLICKED(IDC_BTN_BRUSHFIT, OnBtnBrushfit)
116         ON_BN_CLICKED(IDC_BTN_FACEFIT, OnBtnFacefit)
117         ON_BN_CLICKED(IDC_CHECK_SUBDIVIDE, OnCheckSubdivide)
118         ON_EN_CHANGE(IDC_EDIT_HORZ, OnChangeEditHorz)
119         ON_EN_CHANGE(IDC_EDIT_VERT, OnChangeEditVert)
120         ON_EN_SETFOCUS(IDC_HSCALE, OnSetfocusHscale)
121         ON_EN_KILLFOCUS(IDC_HSCALE, OnKillfocusHscale)
122         ON_EN_KILLFOCUS(IDC_VSCALE, OnKillfocusVscale)
123         ON_EN_SETFOCUS(IDC_VSCALE, OnSetfocusVscale)
124         ON_EN_KILLFOCUS(IDC_EDIT_WIDTH, OnKillfocusEditWidth)
125         ON_EN_SETFOCUS(IDC_EDIT_WIDTH, OnSetfocusEditWidth)
126         ON_EN_KILLFOCUS(IDC_EDIT_HEIGHT, OnKillfocusEditHeight)
127         ON_EN_SETFOCUS(IDC_EDIT_HEIGHT, OnSetfocusEditHeight)
128         ON_BN_CLICKED(IDC_BTN_FLIPX, OnBtnFlipx)
129         ON_BN_CLICKED(IDC_BTN_FLIPY, OnBtnFlipy)
130         ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_ROTATE, OnDeltaPosSpin)
131         ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_VSHIFT, OnDeltaPosSpin)
132         ON_EN_KILLFOCUS(IDC_ROTATE, OnKillfocusRotate)
133         ON_EN_SETFOCUS(IDC_ROTATE, OnSetfocusRotate)
134         //}}AFX_MSG_MAP
135 END_MESSAGE_MAP()
136
137 /////////////////////////////////////////////////////////////////////////////
138 // CSurfaceDlg message handlers
139
140
141 /*
142 ===================================================
143
144   SURFACE INSPECTOR
145
146 ===================================================
147 */
148
149 texdef_t        g_old_texdef;
150 texdef_t        g_patch_texdef;
151 HWND            g_surfwin = NULL;
152 bool    g_changed_surface;
153
154 /*
155 ==============
156 SetTexMods
157
158 Set the fields to the current texdef
159 if one face selected -> will read this face texdef, else current texdef
160 if only patches selected, will read the patch texdef
161 ===============
162 */
163 extern void Face_GetScale_BrushPrimit(face_t *face, float *s, float *t, float *rot);
164 void CSurfaceDlg::SetTexMods() {
165         UpdateData(TRUE);
166         m_strMaterial = g_qeglobals.d_texturewin.texdef.name;
167         patchMesh_t *p = SinglePatchSelected();
168         if (p) {
169                 m_subdivide = p->explicitSubdivisions;
170                 m_strMaterial = p->d_texture->GetName();
171         } else {
172                 m_subdivide = false;
173         }
174
175         int faceCount = g_ptrSelectedFaces.GetSize();
176         face_t *selFace = NULL;
177         if (faceCount) {
178                 selFace = reinterpret_cast < face_t * > (g_ptrSelectedFaces.GetAt(0));
179         } else {
180                 if (selected_brushes.next != &selected_brushes) {
181                         brush_t *b = selected_brushes.next; 
182                         if (!b->pPatch) {
183                                 selFace = b->brush_faces;
184                         }
185                 }
186         }
187
188         if (selFace) {
189                 float rot;
190                 Face_GetScale_BrushPrimit(selFace, &m_horzScale, &m_vertScale, &rot);   
191         } else {
192                 m_horzScale = 1.0f;
193                 m_vertScale = 1.0f;
194         }
195
196         UpdateData(FALSE);
197 }
198
199
200 bool g_bNewFace = false;
201 bool g_bNewApplyHandling = false;
202 bool g_bGatewayhack = false;
203
204
205 /*
206 =================
207 UpdateSpinners
208 =================
209 */
210
211 void CSurfaceDlg::UpdateSpinners(bool up, int nID) {
212         UpdateData(TRUE);
213         float hdiv = 0.0f;
214         float vdiv = 0.0f;
215         switch (nID) {
216                 case IDC_SPIN_ROTATE : 
217                         Select_RotateTexture((up) ? m_rotate : -m_rotate);
218                         break;
219                 case IDC_SPIN_HSCALE : 
220                         m_horzScale += (up) ? 0.1f : -0.1f;
221                         hdiv = (m_horzScale == 0.0f) ? 1.0f : m_horzScale;
222                         Select_ScaleTexture( 1.0f / hdiv, 0.0f, true, ( m_absolute != FALSE ) );
223                         UpdateData(FALSE);
224                         break;
225                 case IDC_SPIN_VSCALE : 
226                         m_vertScale += (up) ? 0.1f : -0.1f;
227                         vdiv = (m_vertScale == 0.0f) ? 1.0f : m_vertScale;
228                         Select_ScaleTexture( 0.0f, 1.0f / vdiv, true, ( m_absolute != FALSE ) );
229                         UpdateData(FALSE);
230                         break;
231                 case IDC_SPIN_HSHIFT :
232                         Select_ShiftTexture((up) ? m_horzShift : -m_horzShift, 0);
233                         break;
234                 case IDC_SPIN_VSHIFT :
235                         Select_ShiftTexture(0, (up) ? m_vertShift : -m_vertShift);
236                         break;
237         }
238         g_changed_surface = true;
239 }
240
241 void CSurfaceDlg::UpdateSpinners(int nScrollCode, int nPos, CScrollBar* pBar) {
242
243         return;
244         UpdateData(TRUE);
245         if ((nScrollCode != SB_LINEUP) && (nScrollCode != SB_LINEDOWN))  {
246                 return;
247         }
248
249         bool up = (nScrollCode == SB_LINEUP);
250
251 // FIXME: bad resource define
252 #define IDC_ROTATEA             0
253 #define IDC_HSCALEA             0
254 #define IDC_VSCALEA             0
255 #define IDC_HSHIFTA             0
256 #define IDC_VSHIFTA             0
257
258         if (pBar->GetSafeHwnd() == ::GetDlgItem(GetSafeHwnd(), IDC_ROTATEA)) {
259                 Select_RotateTexture((up) ? m_rotate : -m_rotate);
260         } else if (pBar->GetSafeHwnd() == ::GetDlgItem(GetSafeHwnd(), IDC_HSCALEA)) {
261                 Select_ScaleTexture((up) ? -m_horzScale : m_horzScale, 0, true, ( m_absolute != FALSE ) );
262         } else if (pBar->GetSafeHwnd() == ::GetDlgItem(GetSafeHwnd(), IDC_VSCALEA)) {
263                 Select_ScaleTexture(0, (up) ? -m_vertScale : m_vertScale, true, ( m_absolute != FALSE ) );
264         } else if (pBar->GetSafeHwnd() == ::GetDlgItem(GetSafeHwnd(), IDC_HSHIFTA)) {
265                 Select_ShiftTexture((up) ? -m_horzShift : m_horzShift, 0);
266         } else if (pBar->GetSafeHwnd() == ::GetDlgItem(GetSafeHwnd(), IDC_VSHIFTA)) {
267                 Select_ShiftTexture((up) ? -m_vertShift : m_vertShift, 0);
268         }
269
270         g_changed_surface = true;
271 }
272
273 void UpdateSurfaceDialog() {
274         if (g_surfwin)  {
275                 g_dlgSurface.SetTexMods();
276         }
277         g_pParentWnd->UpdateTextureBar();
278 }
279
280 bool ByeByeSurfaceDialog();
281
282 void DoSurface (void) {
283
284         g_bNewFace = ( g_PrefsDlg.m_bFace != FALSE );
285         g_bNewApplyHandling = ( g_PrefsDlg.m_bNewApplyHandling != FALSE );
286         g_bGatewayhack = ( g_PrefsDlg.m_bGatewayHack != FALSE );
287         // save current state for cancel
288         g_old_texdef = g_qeglobals.d_texturewin.texdef;
289         g_changed_surface = false;
290
291         if (g_surfwin == NULL && g_dlgSurface.GetSafeHwnd() == NULL) {
292                 g_patch_texdef.scale[0] = 0.05f;
293                 g_patch_texdef.scale[1] = 0.05f;
294                 g_patch_texdef.shift[0] = 0.05f;
295                 g_patch_texdef.shift[1] = 0.05f;
296                 // use rotation increment from preferences
297                 g_patch_texdef.rotate = g_PrefsDlg.m_nRotation;
298
299                 g_dlgSurface.Create(IDD_SURFACE);
300                 CRect rct;
301                 LONG lSize = sizeof(rct);
302                 if (LoadRegistryInfo("radiant_SurfaceWindow", &rct, &lSize))  {
303                         g_dlgSurface.SetWindowPos( NULL, rct.left, rct.top, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW );
304                 }
305                 g_dlgSurface.ShowWindow(SW_SHOW);
306                 Sys_UpdateWindows(W_ALL);
307         } else {
308                 g_surfwin = g_dlgSurface.GetSafeHwnd();
309                 g_dlgSurface.SetTexMods ();
310                 g_dlgSurface.ShowWindow(SW_SHOW);
311         }
312 }               
313
314 bool ByeByeSurfaceDialog() {
315         if (g_surfwin) {
316                 if (g_bGatewayhack)  {
317                         PostMessage(g_surfwin, WM_COMMAND, IDC_APPLY, 0);
318                 } else  {
319                         PostMessage(g_surfwin, WM_COMMAND, IDCANCEL, 0);
320                 }
321                 return true;
322         } else  {
323                 return false;
324         }
325 }
326
327 BOOL CSurfaceDlg::OnInitDialog() {
328         CDialog::OnInitDialog();
329
330         g_surfwin = GetSafeHwnd();
331         SetTexMods ();
332
333         //m_wndHScale.SetRange(0, 100);
334         //m_wndVScale.SetRange(0, 100);
335         m_wndHShift.SetRange(0, 100);
336         m_wndVShift.SetRange(0, 100);
337         m_wndRotate.SetRange(0, 100);
338         m_wndWidth.SetRange(1, 32);
339         m_wndHeight.SetRange(1, 32);
340
341         m_wndVerticalSubdivisions.SetRange(1, 32);
342         m_wndVerticalSubdivisions.SetBuddy(&m_wndVert, FALSE);
343         m_wndHorzSubdivisions.SetRange(1, 32);
344         m_wndHorzSubdivisions.SetBuddy(&m_wndHorz, FALSE);
345         m_wndVerticalSubdivisions.SetPos(m_nVert);
346         m_wndHorzSubdivisions.SetPos(m_nHorz);
347
348         return TRUE;  // return TRUE unless you set the focus to a control
349         // EXCEPTION: OCX Property Pages should return FALSE
350 }
351
352 void CSurfaceDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) {
353         UpdateData(TRUE);
354         if (pScrollBar->IsKindOf(RUNTIME_CLASS(CSliderCtrl))) {
355                 CSliderCtrl *ctrl = reinterpret_cast<CSliderCtrl*>(pScrollBar);
356                 assert(ctrl);
357                 if (ctrl == &m_wndVerticalSubdivisions) {
358                         m_nVert = ctrl->GetPos();
359                 } else {
360                         m_nHorz = ctrl->GetPos();
361                 }
362                 UpdateData(FALSE);
363
364                 if (m_subdivide) {
365                         Patch_SubdivideSelected( ( m_subdivide != FALSE ), m_nHorz, m_nVert );
366                 }
367         }
368         Sys_UpdateWindows(W_CAMERA | W_XY);
369 }
370
371 void CSurfaceDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) {
372
373         CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
374 }
375
376 void CSurfaceDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) {
377         //UpdateSpinners(nSBCode, nPos, pScrollBar);
378         //Sys_UpdateWindows(W_CAMERA);
379 }
380
381
382 void CSurfaceDlg::OnOK() {
383         //GetTexMods();
384         UpdateData(TRUE);
385         if (m_strMaterial.Find(":") >= 0) {
386                 const idMaterial *mat = declManager->FindMaterial(m_strMaterial);
387                 Select_UpdateTextureName(m_strMaterial);
388         }
389         g_surfwin = NULL;
390         CDialog::OnOK();
391         Sys_UpdateWindows(W_ALL);
392 }
393
394 void CSurfaceDlg::OnClose() {
395         g_surfwin = NULL;
396         CDialog::OnClose();
397 }
398
399 void CSurfaceDlg::OnCancel() {
400         if (g_bGatewayhack)  {
401                 OnOK();
402         } else  {
403                 OnBtnCancel();
404         }
405 }
406
407 void CSurfaceDlg::OnDestroy() {
408         if (GetSafeHwnd()) {
409                 CRect rct;
410                 GetWindowRect(rct);
411                 SaveRegistryInfo("radiant_SurfaceWindow", &rct, sizeof(rct));
412         }
413         CDialog::OnDestroy();
414         g_surfwin = NULL;
415         Sys_UpdateWindows(W_ALL);
416 }
417
418 void CSurfaceDlg::OnBtnCancel() {
419         g_qeglobals.d_texturewin.texdef = g_old_texdef;
420         if (g_changed_surface) {
421                 //++timo if !g_qeglobals.m_bBrushPrimitMode send a NULL brushprimit_texdef
422                 if (!g_qeglobals.m_bBrushPrimitMode) {
423                         common->Printf("Warning : non brush primitive mode call to CSurfaceDlg::GetTexMods broken\n");
424                         common->Printf("          ( Select_SetTexture not called )\n");
425                 }
426                 //              Select_SetTexture(&g_qeglobals.d_texturewin.texdef);
427         }
428         g_surfwin = NULL;
429         DestroyWindow();
430 }
431
432 void CSurfaceDlg::OnBtnColor() {
433 }
434
435 HBRUSH CSurfaceDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) {
436         HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
437         return hbr;
438 }
439
440 int CSurfaceDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) {
441         if (CDialog::OnCreate(lpCreateStruct) == -1)
442                 return -1;
443
444         return 0;
445 }
446
447 BOOL CSurfaceDlg::PreCreateWindow(CREATESTRUCT& cs) {
448         // TODO: Add your specialized code here and/or call the base class
449
450         return CDialog::PreCreateWindow(cs);
451 }
452
453
454 void CSurfaceDlg::OnDeltaPosSpin(NMHDR* pNMHDR, LRESULT* pResult) {
455         NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
456         UpdateSpinners((pNMUpDown->iDelta > 0), pNMUpDown->hdr.idFrom);
457         *pResult = 0;
458 }
459
460 void CSurfaceDlg::OnBtnPatchdetails() {
461         Patch_NaturalizeSelected(true);
462         g_pParentWnd->GetCamera()->MarkWorldDirty ();
463         Sys_UpdateWindows(W_ALL);
464 }
465
466 void CSurfaceDlg::OnBtnPatchnatural() {
467         Select_SetTexture (&g_qeglobals.d_texturewin.texdef, &g_qeglobals.d_texturewin.brushprimit_texdef, false);
468         Patch_NaturalizeSelected();
469         g_pParentWnd->GetCamera()->MarkWorldDirty ();
470         g_changed_surface = true;
471         Sys_UpdateWindows(W_ALL);
472 }
473
474 void CSurfaceDlg::OnBtnPatchreset() {
475         //CTextureLayout dlg;
476         //if (dlg.DoModal() == IDOK) {
477         //      Patch_ResetTexturing(dlg.m_fX, dlg.m_fY);
478         //}
479         //Sys_UpdateWindows(W_ALL);
480 }
481
482 void CSurfaceDlg::OnBtnAxial() {
483 }
484
485 void CSurfaceDlg::OnBtnBrushfit() {
486         // TODO: Add your control notification handler code here
487
488 }
489
490 void CSurfaceDlg::OnBtnFacefit() {
491         UpdateData(TRUE);
492 /*
493         brush_t *b;
494         for (b=selected_brushes.next ; b != &selected_brushes ; b=b->next) {
495                 if (!b->patchBrush) {
496                         for (face_t* pFace = b->brush_faces; pFace; pFace = pFace->next) {
497                                 g_ptrSelectedFaces.Add(pFace);
498                                 g_ptrSelectedFaceBrushes.Add(b);
499                         }
500                 }
501         }
502 */
503         Select_FitTexture(m_fHeight, m_fWidth);
504         g_pParentWnd->GetCamera()->MarkWorldDirty ();
505         //SetTexMods();
506         g_changed_surface = true;
507         Sys_UpdateWindows(W_ALL);
508 }
509
510
511 void CSurfaceDlg::OnCheckSubdivide() {
512         UpdateData( TRUE );
513         // turn any patches in explicit subdivides
514         Patch_SubdivideSelected( ( m_subdivide != FALSE ), m_nHorz, m_nVert );
515         g_pParentWnd->GetCamera()->MarkWorldDirty ();
516         Sys_UpdateWindows( W_CAMERA | W_XY );
517 }
518
519 void CSurfaceDlg::OnChangeEditHorz() 
520 {
521         // TODO: If this is a RICHEDIT control, the control will not
522         // send this notification unless you override the CDialog::OnInitDialog()
523         // function and call CRichEditCtrl().SetEventMask()
524         // with the ENM_CHANGE flag ORed into the mask.
525         
526         // TODO: Add your control notification handler code here
527         UpdateData(TRUE);
528         // turn any patches in explicit subdivides
529         Patch_SubdivideSelected( ( m_subdivide != FALSE ), m_nHorz, m_nVert );
530         Sys_UpdateWindows(W_CAMERA | W_XY);
531                 
532 }
533
534 void CSurfaceDlg::OnChangeEditVert() 
535 {
536         // TODO: If this is a RICHEDIT control, the control will not
537         // send this notification unless you override the CDialog::OnInitDialog()
538         // function and call CRichEditCtrl().SetEventMask()
539         // with the ENM_CHANGE flag ORed into the mask.
540         
541         // TODO: Add your control notification handler code here
542         UpdateData(TRUE);
543         // turn any patches in explicit subdivides
544         Patch_SubdivideSelected( ( m_subdivide != FALSE ), m_nHorz, m_nVert );
545         Sys_UpdateWindows(W_CAMERA | W_XY);
546         
547 }
548
549 BOOL CSurfaceDlg::PreTranslateMessage(MSG* pMsg) 
550 {
551         if (pMsg->message == WM_KEYDOWN) {
552                 if (pMsg->wParam == VK_RETURN) {
553                         if (focusControl) {
554                                 UpdateData(TRUE);
555                                 if (focusControl == &m_wndHScale) {
556                                         Select_ScaleTexture( m_horzScale, 1.0f, true, ( m_absolute != FALSE ) );
557                                 } else if (focusControl == &m_wndVScale) {
558                                         Select_ScaleTexture( 1.0f, m_vertScale, true, ( m_absolute != FALSE ) );
559                                 } else if (focusControl == &m_wndRotateEdit) {
560                                         Select_RotateTexture( m_rotate, true );
561                                 } else if (focusControl == &m_wndHeight || focusControl == &m_wndWidth) {
562                                         Select_FitTexture( m_fHeight, m_fWidth );
563                                 }
564                         }
565                         return TRUE;
566                 }
567         }
568         return CDialog::PreTranslateMessage(pMsg);
569 }
570
571 void CSurfaceDlg::OnSetfocusHscale() 
572 {
573         focusControl = &m_wndHScale;    
574 }
575
576 void CSurfaceDlg::OnKillfocusHscale() 
577 {
578         focusControl = NULL;
579 }
580
581 void CSurfaceDlg::OnKillfocusVscale() 
582 {
583         focusControl = NULL;
584 }
585
586 void CSurfaceDlg::OnSetfocusVscale() 
587 {
588         focusControl = &m_wndVScale;    
589 }
590
591 void CSurfaceDlg::OnKillfocusEditWidth() 
592 {
593         focusControl = NULL;
594 }
595
596 void CSurfaceDlg::OnSetfocusEditWidth() 
597 {
598         focusControl = &m_wndWidth;     
599 }
600
601 void CSurfaceDlg::OnKillfocusEditHeight() 
602 {
603         focusControl = NULL;
604 }
605
606 void CSurfaceDlg::OnSetfocusEditHeight() 
607 {
608         focusControl = &m_wndHeight;    
609 }
610
611 void CSurfaceDlg::OnBtnFlipx() 
612 {
613         Select_FlipTexture(false);
614 }
615
616 void CSurfaceDlg::OnBtnFlipy() 
617 {
618         Select_FlipTexture(true);
619 }
620
621 void CSurfaceDlg::OnKillfocusRotate() 
622 {
623         focusControl = NULL;
624 }
625
626 void CSurfaceDlg::OnSetfocusRotate() 
627 {
628         focusControl = &m_wndRotateEdit;
629 }