quake3/q3radiant/PatchDialog.cpp

355 lines
8.3 KiB
C++
Executable File

/*
===========================================================================
Copyright (C) 1999-2005 Id Software, Inc.
This file is part of Quake III Arena source code.
Quake III Arena source code is free software; you can redistribute it
and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the License,
or (at your option) any later version.
Quake III Arena source code is distributed in the hope that it will be
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Foobar; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
===========================================================================
*/
// PatchDialog.cpp : implementation file
//
#include "stdafx.h"
#include "Radiant.h"
#include "PatchDialog.h"
#include "TextureLayout.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CPatchDialog dialog
CPatchDialog g_PatchDialog;
CPatchDialog::CPatchDialog(CWnd* pParent /*=NULL*/)
: CDialog(CPatchDialog::IDD, pParent)
{
//{{AFX_DATA_INIT(CPatchDialog)
m_strName = _T("");
m_fS = 0.0f;
m_fT = 0.0f;
m_fX = 0.0f;
m_fY = 0.0f;
m_fZ = 0.0f;
m_fHScale = 0.05f;
m_fHShift = 0.05f;
m_fRotate = 45;
m_fVScale = 0.05f;
m_fVShift = 0.05f;
//}}AFX_DATA_INIT
m_Patch = NULL;
}
void CPatchDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPatchDialog)
DDX_Control(pDX, IDC_SPIN_VSHIFT, m_wndVShift);
DDX_Control(pDX, IDC_SPIN_VSCALE, m_wndVScale);
DDX_Control(pDX, IDC_SPIN_ROTATE, m_wndRotate);
DDX_Control(pDX, IDC_SPIN_HSHIFT, m_wndHShift);
DDX_Control(pDX, IDC_SPIN_HSCALE, m_wndHScale);
DDX_Control(pDX, IDC_COMBO_TYPE, m_wndType);
DDX_Control(pDX, IDC_COMBO_ROW, m_wndRows);
DDX_Control(pDX, IDC_COMBO_COL, m_wndCols);
DDX_Text(pDX, IDC_EDIT_NAME, m_strName);
DDX_Text(pDX, IDC_EDIT_S, m_fS);
DDX_Text(pDX, IDC_EDIT_T, m_fT);
DDX_Text(pDX, IDC_EDIT_X, m_fX);
DDX_Text(pDX, IDC_EDIT_Y, m_fY);
DDX_Text(pDX, IDC_EDIT_Z, m_fZ);
DDX_Text(pDX, IDC_HSCALE, m_fHScale);
DDX_Text(pDX, IDC_HSHIFT, m_fHShift);
DDX_Text(pDX, IDC_ROTATE, m_fRotate);
DDX_Text(pDX, IDC_VSCALE, m_fVScale);
DDX_Text(pDX, IDC_VSHIFT, m_fVShift);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPatchDialog, CDialog)
//{{AFX_MSG_MAP(CPatchDialog)
ON_BN_CLICKED(IDC_BTN_PATCHDETAILS, OnBtnPatchdetails)
ON_BN_CLICKED(IDC_BTN_PATCHFIT, OnBtnPatchfit)
ON_BN_CLICKED(IDC_BTN_PATCHNATURAL, OnBtnPatchnatural)
ON_BN_CLICKED(IDC_BTN_PATCHRESET, OnBtnPatchreset)
ON_CBN_SELCHANGE(IDC_COMBO_COL, OnSelchangeComboCol)
ON_CBN_SELCHANGE(IDC_COMBO_ROW, OnSelchangeComboRow)
ON_CBN_SELCHANGE(IDC_COMBO_TYPE, OnSelchangeComboType)
ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_HSCALE, OnDeltaposSpin)
ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_ROTATE, OnDeltaposSpin)
ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_VSCALE, OnDeltaposSpin)
ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_VSHIFT, OnDeltaposSpin)
ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_HSHIFT, OnDeltaposSpin)
ON_WM_DESTROY()
ON_BN_CLICKED(ID_APPLY, OnApply)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPatchDialog message handlers
void CPatchDialog::OnBtnPatchdetails()
{
Patch_NaturalizeSelected(true);
Sys_UpdateWindows(W_ALL);
}
void CPatchDialog::OnBtnPatchfit()
{
Patch_FitTexturing();
Sys_UpdateWindows(W_ALL);
}
void CPatchDialog::OnBtnPatchnatural()
{
Patch_NaturalizeSelected();
Sys_UpdateWindows(W_ALL);
}
void CPatchDialog::OnBtnPatchreset()
{
CTextureLayout dlg;
if (dlg.DoModal() == IDOK)
{
Patch_ResetTexturing(dlg.m_fX, dlg.m_fY);
}
Sys_UpdateWindows(W_ALL);
}
void CPatchDialog::OnSelchangeComboCol()
{
UpdateRowColInfo();
}
void CPatchDialog::OnSelchangeComboRow()
{
UpdateRowColInfo();
}
void CPatchDialog::OnSelchangeComboType()
{
// TODO: Add your control notification handler code here
}
void CPatchDialog::OnOK()
{
m_Patch = NULL;
CDialog::OnOK();
}
void CPatchDialog::OnDeltaposSpin(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
UpdateSpinners((pNMUpDown->iDelta > 0), pNMUpDown->hdr.idFrom);
*pResult = 0;
}
BOOL CPatchDialog::OnInitDialog()
{
CDialog::OnInitDialog();
m_wndHScale.SetRange(0, 1000);
m_wndVScale.SetRange(0, 1000);
m_wndHShift.SetRange(0, 1000);
m_wndVShift.SetRange(0, 1000);
m_wndRotate.SetRange(0, 1000);
GetPatchInfo();
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CPatchDialog::GetPatchInfo()
{
m_Patch = SinglePatchSelected();
if (m_Patch != NULL)
{
CString str;
int i;
m_wndRows.ResetContent();
for (i = 0; i < m_Patch->height; i++)
{
str.Format("%i", i);
m_wndRows.AddString(str);
}
m_wndRows.SetCurSel(0);
m_wndCols.ResetContent();
for (i = 0; i < m_Patch->width; i++)
{
str.Format("%i", i);
m_wndCols.AddString(str);
}
m_wndCols.SetCurSel(0);
}
UpdateRowColInfo();
}
void CPatchDialog::SetPatchInfo()
{
}
void DoPatchInspector()
{
if (g_PatchDialog.GetSafeHwnd() == NULL)
{
g_PatchDialog.Create(IDD_DIALOG_PATCH);
CRect rct;
LONG lSize = sizeof(rct);
if (LoadRegistryInfo("Radiant::PatchWindow", &rct, &lSize))
{
g_PatchDialog.SetWindowPos(NULL, rct.left, rct.top, 0,0, SWP_NOSIZE);
}
}
g_PatchDialog.ShowWindow(SW_SHOW);
g_PatchDialog.GetPatchInfo();
}
void UpdatePatchInspector()
{
if (g_PatchDialog.GetSafeHwnd() != NULL)
{
g_PatchDialog.UpdateInfo();
}
}
void CPatchDialog::OnDestroy()
{
if (GetSafeHwnd())
{
CRect rct;
GetWindowRect(rct);
SaveRegistryInfo("Radiant::PatchWindow", &rct, sizeof(rct));
}
CDialog::OnDestroy();
}
void CPatchDialog::UpdateRowColInfo()
{
m_fX = m_fY = m_fZ = m_fS = m_fT = 0.0;
if (m_Patch != NULL)
{
int r = m_wndRows.GetCurSel();
int c = m_wndCols.GetCurSel();
if (r >= 0 && r < m_Patch->height && c >= 0 && c < m_Patch->width)
{
m_fX = m_Patch->ctrl[c][r].xyz[0];
m_fY = m_Patch->ctrl[c][r].xyz[1];
m_fZ = m_Patch->ctrl[c][r].xyz[2];
m_fS = m_Patch->ctrl[c][r].st[0];
m_fT = m_Patch->ctrl[c][r].st[1];
}
}
UpdateData(FALSE);
}
void CPatchDialog::UpdateInfo()
{
GetPatchInfo();
}
void CPatchDialog::OnApply()
{
UpdateData(TRUE);
if (m_Patch != NULL)
{
int r = m_wndRows.GetCurSel();
int c = m_wndCols.GetCurSel();
if (r >= 0 && r < m_Patch->height && c >= 0 && c < m_Patch->width)
{
m_Patch->ctrl[c][r].xyz[0] = m_fX;
m_Patch->ctrl[c][r].xyz[1] = m_fY;
m_Patch->ctrl[c][r].xyz[2] = m_fZ;
m_Patch->ctrl[c][r].st[0] = m_fS;
m_Patch->ctrl[c][r].st[1] = m_fT;
m_Patch->bDirty = true;
Sys_UpdateWindows(W_ALL);
}
}
}
void CPatchDialog::UpdateSpinners(bool bUp, int nID)
{
texdef_t td;
td.rotate = 0.0;
td.scale[0] = td.scale[1] = 0.0;
td.shift[0] = td.shift[1] = 0.0;
td.contents = 0;
td.flags = 0;
td.value = 0;
UpdateData(TRUE);
if (nID == IDC_SPIN_ROTATE)
{
if (bUp)
td.rotate = m_fRotate;
else
td.rotate = -m_fRotate;
}
else if (nID == IDC_SPIN_HSCALE)
{
if (bUp)
td.scale[0] = 1 - m_fHScale;
else
td.scale[0] = 1 + m_fHScale;
}
else if (nID == IDC_SPIN_VSCALE)
{
if (bUp)
td.scale[1] = 1 - m_fVScale;
else
td.scale[1] = 1 + m_fVScale;
}
else if (nID == IDC_SPIN_HSHIFT)
{
if (bUp)
td.shift[0] = m_fHShift;
else
td.shift[0] = -m_fHShift;
}
else if (nID == IDC_SPIN_VSHIFT)
{
if (bUp)
td.shift[1] = m_fVShift;
else
td.shift[1] = -m_fVShift;
}
Patch_SetTextureInfo(&td);
Sys_UpdateWindows(W_CAMERA);
}