PatchDialog.cpp (8164B)
1 /* 2 =========================================================================== 3 Copyright (C) 1999-2005 Id Software, Inc. 4 5 This file is part of Quake III Arena source code. 6 7 Quake III Arena source code is free software; you can redistribute it 8 and/or modify it under the terms of the GNU General Public License as 9 published by the Free Software Foundation; either version 2 of the License, 10 or (at your option) any later version. 11 12 Quake III Arena source code is distributed in the hope that it will be 13 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with Foobar; if not, write to the Free Software 19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 20 =========================================================================== 21 */ 22 // PatchDialog.cpp : implementation file 23 // 24 25 #include "stdafx.h" 26 #include "Radiant.h" 27 #include "PatchDialog.h" 28 #include "TextureLayout.h" 29 30 #ifdef _DEBUG 31 #define new DEBUG_NEW 32 #undef THIS_FILE 33 static char THIS_FILE[] = __FILE__; 34 #endif 35 36 ///////////////////////////////////////////////////////////////////////////// 37 // CPatchDialog dialog 38 39 CPatchDialog g_PatchDialog; 40 41 CPatchDialog::CPatchDialog(CWnd* pParent /*=NULL*/) 42 : CDialog(CPatchDialog::IDD, pParent) 43 { 44 //{{AFX_DATA_INIT(CPatchDialog) 45 m_strName = _T(""); 46 m_fS = 0.0f; 47 m_fT = 0.0f; 48 m_fX = 0.0f; 49 m_fY = 0.0f; 50 m_fZ = 0.0f; 51 m_fHScale = 0.05f; 52 m_fHShift = 0.05f; 53 m_fRotate = 45; 54 m_fVScale = 0.05f; 55 m_fVShift = 0.05f; 56 //}}AFX_DATA_INIT 57 m_Patch = NULL; 58 } 59 60 61 void CPatchDialog::DoDataExchange(CDataExchange* pDX) 62 { 63 CDialog::DoDataExchange(pDX); 64 //{{AFX_DATA_MAP(CPatchDialog) 65 DDX_Control(pDX, IDC_SPIN_VSHIFT, m_wndVShift); 66 DDX_Control(pDX, IDC_SPIN_VSCALE, m_wndVScale); 67 DDX_Control(pDX, IDC_SPIN_ROTATE, m_wndRotate); 68 DDX_Control(pDX, IDC_SPIN_HSHIFT, m_wndHShift); 69 DDX_Control(pDX, IDC_SPIN_HSCALE, m_wndHScale); 70 DDX_Control(pDX, IDC_COMBO_TYPE, m_wndType); 71 DDX_Control(pDX, IDC_COMBO_ROW, m_wndRows); 72 DDX_Control(pDX, IDC_COMBO_COL, m_wndCols); 73 DDX_Text(pDX, IDC_EDIT_NAME, m_strName); 74 DDX_Text(pDX, IDC_EDIT_S, m_fS); 75 DDX_Text(pDX, IDC_EDIT_T, m_fT); 76 DDX_Text(pDX, IDC_EDIT_X, m_fX); 77 DDX_Text(pDX, IDC_EDIT_Y, m_fY); 78 DDX_Text(pDX, IDC_EDIT_Z, m_fZ); 79 DDX_Text(pDX, IDC_HSCALE, m_fHScale); 80 DDX_Text(pDX, IDC_HSHIFT, m_fHShift); 81 DDX_Text(pDX, IDC_ROTATE, m_fRotate); 82 DDX_Text(pDX, IDC_VSCALE, m_fVScale); 83 DDX_Text(pDX, IDC_VSHIFT, m_fVShift); 84 //}}AFX_DATA_MAP 85 } 86 87 88 BEGIN_MESSAGE_MAP(CPatchDialog, CDialog) 89 //{{AFX_MSG_MAP(CPatchDialog) 90 ON_BN_CLICKED(IDC_BTN_PATCHDETAILS, OnBtnPatchdetails) 91 ON_BN_CLICKED(IDC_BTN_PATCHFIT, OnBtnPatchfit) 92 ON_BN_CLICKED(IDC_BTN_PATCHNATURAL, OnBtnPatchnatural) 93 ON_BN_CLICKED(IDC_BTN_PATCHRESET, OnBtnPatchreset) 94 ON_CBN_SELCHANGE(IDC_COMBO_COL, OnSelchangeComboCol) 95 ON_CBN_SELCHANGE(IDC_COMBO_ROW, OnSelchangeComboRow) 96 ON_CBN_SELCHANGE(IDC_COMBO_TYPE, OnSelchangeComboType) 97 ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_HSCALE, OnDeltaposSpin) 98 ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_ROTATE, OnDeltaposSpin) 99 ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_VSCALE, OnDeltaposSpin) 100 ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_VSHIFT, OnDeltaposSpin) 101 ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_HSHIFT, OnDeltaposSpin) 102 ON_WM_DESTROY() 103 ON_BN_CLICKED(ID_APPLY, OnApply) 104 //}}AFX_MSG_MAP 105 END_MESSAGE_MAP() 106 107 ///////////////////////////////////////////////////////////////////////////// 108 // CPatchDialog message handlers 109 110 void CPatchDialog::OnBtnPatchdetails() 111 { 112 Patch_NaturalizeSelected(true); 113 Sys_UpdateWindows(W_ALL); 114 } 115 116 void CPatchDialog::OnBtnPatchfit() 117 { 118 Patch_FitTexturing(); 119 Sys_UpdateWindows(W_ALL); 120 } 121 122 void CPatchDialog::OnBtnPatchnatural() 123 { 124 Patch_NaturalizeSelected(); 125 Sys_UpdateWindows(W_ALL); 126 } 127 128 void CPatchDialog::OnBtnPatchreset() 129 { 130 CTextureLayout dlg; 131 if (dlg.DoModal() == IDOK) 132 { 133 Patch_ResetTexturing(dlg.m_fX, dlg.m_fY); 134 } 135 Sys_UpdateWindows(W_ALL); 136 } 137 138 void CPatchDialog::OnSelchangeComboCol() 139 { 140 UpdateRowColInfo(); 141 } 142 143 void CPatchDialog::OnSelchangeComboRow() 144 { 145 UpdateRowColInfo(); 146 } 147 148 void CPatchDialog::OnSelchangeComboType() 149 { 150 // TODO: Add your control notification handler code here 151 152 } 153 154 void CPatchDialog::OnOK() 155 { 156 m_Patch = NULL; 157 158 CDialog::OnOK(); 159 } 160 161 void CPatchDialog::OnDeltaposSpin(NMHDR* pNMHDR, LRESULT* pResult) 162 { 163 NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR; 164 UpdateSpinners((pNMUpDown->iDelta > 0), pNMUpDown->hdr.idFrom); 165 *pResult = 0; 166 } 167 168 BOOL CPatchDialog::OnInitDialog() 169 { 170 CDialog::OnInitDialog(); 171 172 m_wndHScale.SetRange(0, 1000); 173 m_wndVScale.SetRange(0, 1000); 174 m_wndHShift.SetRange(0, 1000); 175 m_wndVShift.SetRange(0, 1000); 176 m_wndRotate.SetRange(0, 1000); 177 178 GetPatchInfo(); 179 180 // TODO: Add extra initialization here 181 182 return TRUE; // return TRUE unless you set the focus to a control 183 // EXCEPTION: OCX Property Pages should return FALSE 184 } 185 186 187 188 void CPatchDialog::GetPatchInfo() 189 { 190 m_Patch = SinglePatchSelected(); 191 if (m_Patch != NULL) 192 { 193 CString str; 194 int i; 195 m_wndRows.ResetContent(); 196 for (i = 0; i < m_Patch->height; i++) 197 { 198 str.Format("%i", i); 199 m_wndRows.AddString(str); 200 } 201 m_wndRows.SetCurSel(0); 202 m_wndCols.ResetContent(); 203 for (i = 0; i < m_Patch->width; i++) 204 { 205 str.Format("%i", i); 206 m_wndCols.AddString(str); 207 } 208 m_wndCols.SetCurSel(0); 209 } 210 UpdateRowColInfo(); 211 } 212 213 void CPatchDialog::SetPatchInfo() 214 { 215 216 } 217 218 void DoPatchInspector() 219 { 220 if (g_PatchDialog.GetSafeHwnd() == NULL) 221 { 222 g_PatchDialog.Create(IDD_DIALOG_PATCH); 223 CRect rct; 224 LONG lSize = sizeof(rct); 225 if (LoadRegistryInfo("Radiant::PatchWindow", &rct, &lSize)) 226 { 227 g_PatchDialog.SetWindowPos(NULL, rct.left, rct.top, 0,0, SWP_NOSIZE); 228 } 229 } 230 g_PatchDialog.ShowWindow(SW_SHOW); 231 g_PatchDialog.GetPatchInfo(); 232 } 233 234 void UpdatePatchInspector() 235 { 236 if (g_PatchDialog.GetSafeHwnd() != NULL) 237 { 238 g_PatchDialog.UpdateInfo(); 239 } 240 241 } 242 243 void CPatchDialog::OnDestroy() 244 { 245 if (GetSafeHwnd()) 246 { 247 CRect rct; 248 GetWindowRect(rct); 249 SaveRegistryInfo("Radiant::PatchWindow", &rct, sizeof(rct)); 250 } 251 CDialog::OnDestroy(); 252 } 253 254 void CPatchDialog::UpdateRowColInfo() 255 { 256 m_fX = m_fY = m_fZ = m_fS = m_fT = 0.0; 257 258 if (m_Patch != NULL) 259 { 260 int r = m_wndRows.GetCurSel(); 261 int c = m_wndCols.GetCurSel(); 262 if (r >= 0 && r < m_Patch->height && c >= 0 && c < m_Patch->width) 263 { 264 m_fX = m_Patch->ctrl[c][r].xyz[0]; 265 m_fY = m_Patch->ctrl[c][r].xyz[1]; 266 m_fZ = m_Patch->ctrl[c][r].xyz[2]; 267 m_fS = m_Patch->ctrl[c][r].st[0]; 268 m_fT = m_Patch->ctrl[c][r].st[1]; 269 } 270 } 271 UpdateData(FALSE); 272 } 273 274 void CPatchDialog::UpdateInfo() 275 { 276 GetPatchInfo(); 277 } 278 279 void CPatchDialog::OnApply() 280 { 281 UpdateData(TRUE); 282 if (m_Patch != NULL) 283 { 284 int r = m_wndRows.GetCurSel(); 285 int c = m_wndCols.GetCurSel(); 286 if (r >= 0 && r < m_Patch->height && c >= 0 && c < m_Patch->width) 287 { 288 m_Patch->ctrl[c][r].xyz[0] = m_fX; 289 m_Patch->ctrl[c][r].xyz[1] = m_fY; 290 m_Patch->ctrl[c][r].xyz[2] = m_fZ; 291 m_Patch->ctrl[c][r].st[0] = m_fS; 292 m_Patch->ctrl[c][r].st[1] = m_fT; 293 m_Patch->bDirty = true; 294 Sys_UpdateWindows(W_ALL); 295 } 296 } 297 } 298 299 void CPatchDialog::UpdateSpinners(bool bUp, int nID) 300 { 301 texdef_t td; 302 303 td.rotate = 0.0; 304 td.scale[0] = td.scale[1] = 0.0; 305 td.shift[0] = td.shift[1] = 0.0; 306 td.contents = 0; 307 td.flags = 0; 308 td.value = 0; 309 310 311 UpdateData(TRUE); 312 313 if (nID == IDC_SPIN_ROTATE) 314 { 315 if (bUp) 316 td.rotate = m_fRotate; 317 else 318 td.rotate = -m_fRotate; 319 } 320 else if (nID == IDC_SPIN_HSCALE) 321 { 322 if (bUp) 323 td.scale[0] = 1 - m_fHScale; 324 else 325 td.scale[0] = 1 + m_fHScale; 326 } 327 else if (nID == IDC_SPIN_VSCALE) 328 { 329 if (bUp) 330 td.scale[1] = 1 - m_fVScale; 331 else 332 td.scale[1] = 1 + m_fVScale; 333 } 334 335 else if (nID == IDC_SPIN_HSHIFT) 336 { 337 if (bUp) 338 td.shift[0] = m_fHShift; 339 else 340 td.shift[0] = -m_fHShift; 341 } 342 else if (nID == IDC_SPIN_VSHIFT) 343 { 344 if (bUp) 345 td.shift[1] = m_fVShift; 346 else 347 td.shift[1] = -m_fVShift; 348 } 349 350 Patch_SetTextureInfo(&td); 351 Sys_UpdateWindows(W_CAMERA); 352 } 353 354