Main Page | Class Hierarchy | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals

PatchDialog.cpp

Go to the documentation of this file.
00001 /*
00002 ===========================================================================
00003 Copyright (C) 1999-2005 Id Software, Inc.
00004 
00005 This file is part of Quake III Arena source code.
00006 
00007 Quake III Arena source code is free software; you can redistribute it
00008 and/or modify it under the terms of the GNU General Public License as
00009 published by the Free Software Foundation; either version 2 of the License,
00010 or (at your option) any later version.
00011 
00012 Quake III Arena source code is distributed in the hope that it will be
00013 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
00014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015 GNU General Public License for more details.
00016 
00017 You should have received a copy of the GNU General Public License
00018 along with Foobar; if not, write to the Free Software
00019 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
00020 ===========================================================================
00021 */
00022 // PatchDialog.cpp : implementation file
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 // CPatchDialog dialog
00038 
00039 CPatchDialog g_PatchDialog;
00040 
00041 CPatchDialog::CPatchDialog(CWnd* pParent /*=NULL*/)
00042     : CDialog(CPatchDialog::IDD, pParent)
00043 {
00044     //{{AFX_DATA_INIT(CPatchDialog)
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     //}}AFX_DATA_INIT
00057     m_Patch = NULL;
00058 }
00059 
00060 
00061 void CPatchDialog::DoDataExchange(CDataExchange* pDX)
00062 {
00063     CDialog::DoDataExchange(pDX);
00064     //{{AFX_DATA_MAP(CPatchDialog)
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     //}}AFX_DATA_MAP
00085 }
00086 
00087 
00088 BEGIN_MESSAGE_MAP(CPatchDialog, CDialog)
00089     //{{AFX_MSG_MAP(CPatchDialog)
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     //}}AFX_MSG_MAP
00105 END_MESSAGE_MAP()
00106 
00108 // CPatchDialog message handlers
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     // TODO: Add your control notification handler code here
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     // TODO: Add extra initialization here
00181     
00182     return TRUE;  // return TRUE unless you set the focus to a control
00183                   // EXCEPTION: OCX Property Pages should return FALSE
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 

Generated on Thu Aug 25 12:38:34 2005 for Quake III Arena by  doxygen 1.3.9.1