mirror of
https://github.com/DrBeef/ioq3quest.git
synced 2024-11-26 05:52:03 +00:00
354 lines
8 KiB
C++
354 lines
8 KiB
C++
/*
|
|
===========================================================================
|
|
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);
|
|
}
|
|
|
|
|