00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "stdafx.h"
00026 #include "Radiant.h"
00027 #include "PatchDialog.h"
00028 #include "TextureLayout.h"
00029
00030 #ifdef _DEBUG
00031 #define new DEBUG_NEW
00032 #undef THIS_FILE
00033 static char THIS_FILE[] = __FILE__;
00034 #endif
00035
00037
00038
00039 CPatchDialog g_PatchDialog;
00040
00041 CPatchDialog::CPatchDialog(CWnd* pParent )
00042 : CDialog(CPatchDialog::IDD, pParent)
00043 {
00044
00045 m_strName = _T("");
00046 m_fS = 0.0f;
00047 m_fT = 0.0f;
00048 m_fX = 0.0f;
00049 m_fY = 0.0f;
00050 m_fZ = 0.0f;
00051 m_fHScale = 0.05f;
00052 m_fHShift = 0.05f;
00053 m_fRotate = 45;
00054 m_fVScale = 0.05f;
00055 m_fVShift = 0.05f;
00056
00057 m_Patch = NULL;
00058 }
00059
00060
00061 void CPatchDialog::DoDataExchange(CDataExchange* pDX)
00062 {
00063 CDialog::DoDataExchange(pDX);
00064
00065 DDX_Control(pDX, IDC_SPIN_VSHIFT, m_wndVShift);
00066 DDX_Control(pDX, IDC_SPIN_VSCALE, m_wndVScale);
00067 DDX_Control(pDX, IDC_SPIN_ROTATE, m_wndRotate);
00068 DDX_Control(pDX, IDC_SPIN_HSHIFT, m_wndHShift);
00069 DDX_Control(pDX, IDC_SPIN_HSCALE, m_wndHScale);
00070 DDX_Control(pDX, IDC_COMBO_TYPE, m_wndType);
00071 DDX_Control(pDX, IDC_COMBO_ROW, m_wndRows);
00072 DDX_Control(pDX, IDC_COMBO_COL, m_wndCols);
00073 DDX_Text(pDX, IDC_EDIT_NAME, m_strName);
00074 DDX_Text(pDX, IDC_EDIT_S, m_fS);
00075 DDX_Text(pDX, IDC_EDIT_T, m_fT);
00076 DDX_Text(pDX, IDC_EDIT_X, m_fX);
00077 DDX_Text(pDX, IDC_EDIT_Y, m_fY);
00078 DDX_Text(pDX, IDC_EDIT_Z, m_fZ);
00079 DDX_Text(pDX, IDC_HSCALE, m_fHScale);
00080 DDX_Text(pDX, IDC_HSHIFT, m_fHShift);
00081 DDX_Text(pDX, IDC_ROTATE, m_fRotate);
00082 DDX_Text(pDX, IDC_VSCALE, m_fVScale);
00083 DDX_Text(pDX, IDC_VSHIFT, m_fVShift);
00084
00085 }
00086
00087
00088 BEGIN_MESSAGE_MAP(CPatchDialog, CDialog)
00089
00090 ON_BN_CLICKED(IDC_BTN_PATCHDETAILS, OnBtnPatchdetails)
00091 ON_BN_CLICKED(IDC_BTN_PATCHFIT, OnBtnPatchfit)
00092 ON_BN_CLICKED(IDC_BTN_PATCHNATURAL, OnBtnPatchnatural)
00093 ON_BN_CLICKED(IDC_BTN_PATCHRESET, OnBtnPatchreset)
00094 ON_CBN_SELCHANGE(IDC_COMBO_COL, OnSelchangeComboCol)
00095 ON_CBN_SELCHANGE(IDC_COMBO_ROW, OnSelchangeComboRow)
00096 ON_CBN_SELCHANGE(IDC_COMBO_TYPE, OnSelchangeComboType)
00097 ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_HSCALE, OnDeltaposSpin)
00098 ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_ROTATE, OnDeltaposSpin)
00099 ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_VSCALE, OnDeltaposSpin)
00100 ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_VSHIFT, OnDeltaposSpin)
00101 ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_HSHIFT, OnDeltaposSpin)
00102 ON_WM_DESTROY()
00103 ON_BN_CLICKED(ID_APPLY, OnApply)
00104
00105 END_MESSAGE_MAP()
00106
00108
00109
00110 void CPatchDialog::OnBtnPatchdetails()
00111 {
00112 Patch_NaturalizeSelected(true);
00113 Sys_UpdateWindows(W_ALL);
00114 }
00115
00116 void CPatchDialog::OnBtnPatchfit()
00117 {
00118 Patch_FitTexturing();
00119 Sys_UpdateWindows(W_ALL);
00120 }
00121
00122 void CPatchDialog::OnBtnPatchnatural()
00123 {
00124 Patch_NaturalizeSelected();
00125 Sys_UpdateWindows(W_ALL);
00126 }
00127
00128 void CPatchDialog::OnBtnPatchreset()
00129 {
00130 CTextureLayout dlg;
00131 if (dlg.DoModal() == IDOK)
00132 {
00133 Patch_ResetTexturing(dlg.m_fX, dlg.m_fY);
00134 }
00135 Sys_UpdateWindows(W_ALL);
00136 }
00137
00138 void CPatchDialog::OnSelchangeComboCol()
00139 {
00140 UpdateRowColInfo();
00141 }
00142
00143 void CPatchDialog::OnSelchangeComboRow()
00144 {
00145 UpdateRowColInfo();
00146 }
00147
00148 void CPatchDialog::OnSelchangeComboType()
00149 {
00150
00151
00152 }
00153
00154 void CPatchDialog::OnOK()
00155 {
00156 m_Patch = NULL;
00157
00158 CDialog::OnOK();
00159 }
00160
00161 void CPatchDialog::OnDeltaposSpin(NMHDR* pNMHDR, LRESULT* pResult)
00162 {
00163 NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
00164 UpdateSpinners((pNMUpDown->iDelta > 0), pNMUpDown->hdr.idFrom);
00165 *pResult = 0;
00166 }
00167
00168 BOOL CPatchDialog::OnInitDialog()
00169 {
00170 CDialog::OnInitDialog();
00171
00172 m_wndHScale.SetRange(0, 1000);
00173 m_wndVScale.SetRange(0, 1000);
00174 m_wndHShift.SetRange(0, 1000);
00175 m_wndVShift.SetRange(0, 1000);
00176 m_wndRotate.SetRange(0, 1000);
00177
00178 GetPatchInfo();
00179
00180
00181
00182 return TRUE;
00183
00184 }
00185
00186
00187
00188 void CPatchDialog::GetPatchInfo()
00189 {
00190 m_Patch = SinglePatchSelected();
00191 if (m_Patch != NULL)
00192 {
00193 CString str;
00194 int i;
00195 m_wndRows.ResetContent();
00196 for (i = 0; i < m_Patch->height; i++)
00197 {
00198 str.Format("%i", i);
00199 m_wndRows.AddString(str);
00200 }
00201 m_wndRows.SetCurSel(0);
00202 m_wndCols.ResetContent();
00203 for (i = 0; i < m_Patch->width; i++)
00204 {
00205 str.Format("%i", i);
00206 m_wndCols.AddString(str);
00207 }
00208 m_wndCols.SetCurSel(0);
00209 }
00210 UpdateRowColInfo();
00211 }
00212
00213 void CPatchDialog::SetPatchInfo()
00214 {
00215
00216 }
00217
00218 void DoPatchInspector()
00219 {
00220 if (g_PatchDialog.GetSafeHwnd() == NULL)
00221 {
00222 g_PatchDialog.Create(IDD_DIALOG_PATCH);
00223 CRect rct;
00224 LONG lSize = sizeof(rct);
00225 if (LoadRegistryInfo("Radiant::PatchWindow", &rct, &lSize))
00226 {
00227 g_PatchDialog.SetWindowPos(NULL, rct.left, rct.top, 0,0, SWP_NOSIZE);
00228 }
00229 }
00230 g_PatchDialog.ShowWindow(SW_SHOW);
00231 g_PatchDialog.GetPatchInfo();
00232 }
00233
00234 void UpdatePatchInspector()
00235 {
00236 if (g_PatchDialog.GetSafeHwnd() != NULL)
00237 {
00238 g_PatchDialog.UpdateInfo();
00239 }
00240
00241 }
00242
00243 void CPatchDialog::OnDestroy()
00244 {
00245 if (GetSafeHwnd())
00246 {
00247 CRect rct;
00248 GetWindowRect(rct);
00249 SaveRegistryInfo("Radiant::PatchWindow", &rct, sizeof(rct));
00250 }
00251 CDialog::OnDestroy();
00252 }
00253
00254 void CPatchDialog::UpdateRowColInfo()
00255 {
00256 m_fX = m_fY = m_fZ = m_fS = m_fT = 0.0;
00257
00258 if (m_Patch != NULL)
00259 {
00260 int r = m_wndRows.GetCurSel();
00261 int c = m_wndCols.GetCurSel();
00262 if (r >= 0 && r < m_Patch->height && c >= 0 && c < m_Patch->width)
00263 {
00264 m_fX = m_Patch->ctrl[c][r].xyz[0];
00265 m_fY = m_Patch->ctrl[c][r].xyz[1];
00266 m_fZ = m_Patch->ctrl[c][r].xyz[2];
00267 m_fS = m_Patch->ctrl[c][r].st[0];
00268 m_fT = m_Patch->ctrl[c][r].st[1];
00269 }
00270 }
00271 UpdateData(FALSE);
00272 }
00273
00274 void CPatchDialog::UpdateInfo()
00275 {
00276 GetPatchInfo();
00277 }
00278
00279 void CPatchDialog::OnApply()
00280 {
00281 UpdateData(TRUE);
00282 if (m_Patch != NULL)
00283 {
00284 int r = m_wndRows.GetCurSel();
00285 int c = m_wndCols.GetCurSel();
00286 if (r >= 0 && r < m_Patch->height && c >= 0 && c < m_Patch->width)
00287 {
00288 m_Patch->ctrl[c][r].xyz[0] = m_fX;
00289 m_Patch->ctrl[c][r].xyz[1] = m_fY;
00290 m_Patch->ctrl[c][r].xyz[2] = m_fZ;
00291 m_Patch->ctrl[c][r].st[0] = m_fS;
00292 m_Patch->ctrl[c][r].st[1] = m_fT;
00293 m_Patch->bDirty = true;
00294 Sys_UpdateWindows(W_ALL);
00295 }
00296 }
00297 }
00298
00299 void CPatchDialog::UpdateSpinners(bool bUp, int nID)
00300 {
00301 texdef_t td;
00302
00303 td.rotate = 0.0;
00304 td.scale[0] = td.scale[1] = 0.0;
00305 td.shift[0] = td.shift[1] = 0.0;
00306 td.contents = 0;
00307 td.flags = 0;
00308 td.value = 0;
00309
00310
00311 UpdateData(TRUE);
00312
00313 if (nID == IDC_SPIN_ROTATE)
00314 {
00315 if (bUp)
00316 td.rotate = m_fRotate;
00317 else
00318 td.rotate = -m_fRotate;
00319 }
00320 else if (nID == IDC_SPIN_HSCALE)
00321 {
00322 if (bUp)
00323 td.scale[0] = 1 - m_fHScale;
00324 else
00325 td.scale[0] = 1 + m_fHScale;
00326 }
00327 else if (nID == IDC_SPIN_VSCALE)
00328 {
00329 if (bUp)
00330 td.scale[1] = 1 - m_fVScale;
00331 else
00332 td.scale[1] = 1 + m_fVScale;
00333 }
00334
00335 else if (nID == IDC_SPIN_HSHIFT)
00336 {
00337 if (bUp)
00338 td.shift[0] = m_fHShift;
00339 else
00340 td.shift[0] = -m_fHShift;
00341 }
00342 else if (nID == IDC_SPIN_VSHIFT)
00343 {
00344 if (bUp)
00345 td.shift[1] = m_fVShift;
00346 else
00347 td.shift[1] = -m_fVShift;
00348 }
00349
00350 Patch_SetTextureInfo(&td);
00351 Sys_UpdateWindows(W_CAMERA);
00352 }
00353
00354