Quake-III-Arena

Quake III Arena GPL Source Release
Log | Files | Refs

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