Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Тихомиров Ю. Программирование трёхмерной графики / Files / Texture / TextureDlg
.cpp// TextureDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Texture.h"
#include "TextureDlg.h"
#include "TextureView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CSettings set;
/////////////////////////////////////////////////////////////////////////////
// CTextureDlg dialog
CTextureDlg::CTextureDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTextureDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CTextureDlg)
m_Env = -1;
m_Hint = -1;
m_MinF = -1;
m_MagF = -1;
m_TexC = 0.0;
m_RepT = -1;
m_RepS = -1;
m_GenS = FALSE;
m_GenT = FALSE;
m_s_w = 0.0;
m_s_x = 0.0;
m_s_y = 0.0;
m_s_z = 0.0;
m_sMode = -1;
m_tMode = -1;
m_t_w = 0.0;
m_t_x = 0.0;
m_t_y = 0.0;
m_t_z = 0.0;
//}}AFX_DATA_INIT
m_pView = NULL;
}
void CTextureDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTextureDlg)
DDX_Radio(pDX, IDC_DECAL, m_Env);
DDX_Radio(pDX, IDC_FASTEST, m_Hint);
DDX_Radio(pDX, IDC_MINFILTER_NEAREST, m_MinF);
DDX_Radio(pDX, IDC_MAGFILTER_NEAREST, m_MagF);
DDX_Text(pDX, IDC_TEXCOORD, m_TexC);
DDX_Radio(pDX, IDC_T_CLAMP, m_RepT);
DDX_Radio(pDX, IDC_S_CLAMP, m_RepS);
DDX_Check(pDX, IDC_S_GEN_TOGGLE, m_GenS);
DDX_Check(pDX, IDC_T_GEN_TOGGLE, m_GenT);
DDX_Text(pDX, IDC_S_W, m_s_w);
DDX_Text(pDX, IDC_S_X, m_s_x);
DDX_Text(pDX, IDC_S_Y, m_s_y);
DDX_Text(pDX, IDC_S_Z, m_s_z);
DDX_Radio(pDX, IDC_S_OBJECT_LINEAR_MODE, m_sMode);
DDX_Radio(pDX, IDC_T_OBJECT_LINEAR_MODE, m_tMode);
DDX_Text(pDX, IDC_T_W, m_t_w);
DDX_Text(pDX, IDC_T_X, m_t_x);
DDX_Text(pDX, IDC_T_Y, m_t_y);
DDX_Text(pDX, IDC_T_Z, m_t_z);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTextureDlg, CDialog)
//{{AFX_MSG_MAP(CTextureDlg)
ON_BN_CLICKED(IDC_DECAL, OnDecal)
ON_BN_CLICKED(IDAPPLY, OnApply)
ON_BN_CLICKED(IDC_S_GEN_TOGGLE, OnSGenToggle)
ON_BN_CLICKED(IDC_T_GEN_TOGGLE, OnTGenToggle)
//}}AFX_MSG_MAP
ON_CONTROL_RANGE(BN_CLICKED, IDC_S_OBJECT_LINEAR_MODE,
IDC_S_SPHERE_MAP_MODE, OnSSphereMapMode)
ON_CONTROL_RANGE(BN_CLICKED, IDC_T_OBJECT_LINEAR_MODE,
IDC_T_SPHERE_MAP_MODE, OnTSphereMapMode)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTextureDlg message handlers
void CTextureDlg::OnDecal()
{
m_Decal = !m_Decal;
}
BOOL CTextureDlg::OnInitDialog()
{
CDialog::OnInitDialog();
if(set.envmode == GL_DECAL)
m_Env = 0;
else
m_Env = 1;
if(set.hint == GL_FASTEST)
m_Hint = 0;
else
m_Hint = 1;
if(set.minfilter == GL_NEAREST)
m_MinF = 0;
else
m_MinF = 1;
if(set.magfilter == GL_NEAREST)
m_MagF = 0;
else
m_MagF = 1;
if(set.wrap_t == GL_REPEAT)
m_RepT = 1;
else
m_RepT = 0;
if(set.wrap_s == GL_REPEAT)
m_RepS = 1;
else
m_RepS = 0;
if(set.s_gen == 0){
m_GenS = 0;
GetDlgItem(IDC_S_OBJECT_LINEAR_MODE)->EnableWindow(FALSE);
GetDlgItem(IDC_S_EYE_LINEAR_MODE)->EnableWindow(FALSE);
GetDlgItem(IDC_S_SPHERE_MAP_MODE)->EnableWindow(FALSE);
GetDlgItem(IDC_S_X)->EnableWindow(FALSE);
GetDlgItem(IDC_S_Y)->EnableWindow(FALSE);
GetDlgItem(IDC_S_Z)->EnableWindow(FALSE);
GetDlgItem(IDC_S_W)->EnableWindow(FALSE);
}
else{
m_GenS = 1;
GetDlgItem(IDC_S_OBJECT_LINEAR_MODE)->EnableWindow(TRUE);
GetDlgItem(IDC_S_EYE_LINEAR_MODE)->EnableWindow(TRUE);
GetDlgItem(IDC_S_SPHERE_MAP_MODE)->EnableWindow(TRUE);
GetDlgItem(IDC_S_X)->EnableWindow(TRUE);
GetDlgItem(IDC_S_Y)->EnableWindow(TRUE);
GetDlgItem(IDC_S_Z)->EnableWindow(TRUE);
GetDlgItem(IDC_S_W)->EnableWindow(TRUE);
switch(set.s_mode){
case GL_OBJECT_LINEAR: m_sMode = 0; break;
case GL_EYE_LINEAR: m_sMode = 1; break;
case GL_SPHERE_MAP: m_sMode = 2; break;
}
m_s_x = set.s_coeffs[0];
m_s_y = set.s_coeffs[1];
m_s_z = set.s_coeffs[2];
m_s_w = set.s_coeffs[3];
}
if(set.t_gen == 0){
m_GenT = 0;
GetDlgItem(IDC_T_OBJECT_LINEAR_MODE)->EnableWindow(FALSE);
GetDlgItem(IDC_T_EYE_LINEAR_MODE)->EnableWindow(FALSE);
GetDlgItem(IDC_T_SPHERE_MAP_MODE)->EnableWindow(FALSE);
GetDlgItem(IDC_T_X)->EnableWindow(FALSE);
GetDlgItem(IDC_T_Y)->EnableWindow(FALSE);
GetDlgItem(IDC_T_Z)->EnableWindow(FALSE);
GetDlgItem(IDC_T_W)->EnableWindow(FALSE);
}
else{
m_GenT = 1;
GetDlgItem(IDC_T_OBJECT_LINEAR_MODE)->EnableWindow(TRUE);
GetDlgItem(IDC_T_EYE_LINEAR_MODE)->EnableWindow(TRUE);
GetDlgItem(IDC_T_SPHERE_MAP_MODE)->EnableWindow(TRUE);
GetDlgItem(IDC_T_X)->EnableWindow(TRUE);
GetDlgItem(IDC_T_Y)->EnableWindow(TRUE);
GetDlgItem(IDC_T_Z)->EnableWindow(TRUE);
GetDlgItem(IDC_T_W)->EnableWindow(TRUE);
switch(set.t_mode){
case GL_OBJECT_LINEAR: m_tMode = 0; break;
case GL_EYE_LINEAR: m_tMode = 1; break;
case GL_SPHERE_MAP: m_tMode = 2; break;
}
m_t_x = set.t_coeffs[0];
m_t_y = set.t_coeffs[1];
m_t_z = set.t_coeffs[2];
m_t_w = set.t_coeffs[3];
}
m_TexC = set.texcoord;
UpdateData(FALSE);
return TRUE;
}
CSettings::CSettings()
{
envmode = GL_DECAL;
hint = GL_FASTEST;
minfilter = GL_NEAREST;
magfilter = GL_LINEAR;
wrap_s = GL_REPEAT;
wrap_t = GL_REPEAT;
texcoord = 1.0f;
s_gen = 0;
s_mode = GL_SPHERE_MAP;
s_coeffs[0] = 0.0f;
s_coeffs[1] = 0.0f;
s_coeffs[2] = 0.0f;
s_coeffs[3] = 1.0f;
t_gen = 0;
t_mode = GL_EYE_LINEAR;
t_coeffs[0] = 0.0f;
t_coeffs[1] = 0.0f;
t_coeffs[2] = 0.0f;
t_coeffs[3] = 1.0f;
}
CSettings::~CSettings()
{
}
void CTextureDlg::OnApply()
{
UpdateData(TRUE);
if(m_Env == 0)
set.envmode = GL_DECAL;
else
set.envmode = GL_MODULATE;
if(m_Hint == 0)
set.hint = GL_FASTEST;
else
set.hint = GL_NICEST;
if(m_MinF == 0)
set.minfilter = GL_NEAREST;
else
set.minfilter = GL_LINEAR;
if(m_MagF == 0)
set.magfilter = GL_NEAREST;
else
set.magfilter = GL_LINEAR;
if(m_RepT == 0)
set.wrap_t = GL_CLAMP;
else
set.wrap_t = GL_REPEAT;
if(m_RepS == 0)
set.wrap_s = GL_CLAMP;
else
set.wrap_s = GL_REPEAT;
if(m_GenS == 0)
set.s_gen = 0;
else
set.s_gen = 1;
if(m_GenT == 0)
set.t_gen = 0;
else
set.t_gen = 1;
switch(m_sMode){
case 0: set.s_mode = GL_OBJECT_LINEAR; break;
case 1: set.s_mode = GL_EYE_LINEAR; break;
case 2: set.s_mode = GL_SPHERE_MAP; break;
}
switch(m_tMode){
case 0: set.t_mode = GL_OBJECT_LINEAR; break;
case 1: set.t_mode = GL_EYE_LINEAR; break;
case 2: set.t_mode = GL_SPHERE_MAP; break;
}
set.s_coeffs[0] = m_s_x;
set.s_coeffs[1] = m_s_y;
set.s_coeffs[2] = m_s_z;
set.s_coeffs[3] = m_s_w;
set.t_coeffs[0] = m_t_x;
set.t_coeffs[1] = m_t_y;
set.t_coeffs[2] = m_t_z;
set.t_coeffs[3] = m_t_w;
set.texcoord = m_TexC;
UpdateData(FALSE);
((CTextureView*)m_pView)->ChangeSettings();
}
void CTextureDlg::OnOK()
{
OnApply();
CDialog::OnOK();
delete ((CTextureView*)m_pView)->m_pDlg;
((CTextureView*)m_pView)->m_pDlg = NULL;
}
void CTextureDlg::OnSGenToggle()
{
if(m_GenS){
GetDlgItem(IDC_S_OBJECT_LINEAR_MODE)->EnableWindow(FALSE);
GetDlgItem(IDC_S_EYE_LINEAR_MODE)->EnableWindow(FALSE);
GetDlgItem(IDC_S_SPHERE_MAP_MODE)->EnableWindow(FALSE);
GetDlgItem(IDC_S_X)->EnableWindow(FALSE);
GetDlgItem(IDC_S_Y)->EnableWindow(FALSE);
GetDlgItem(IDC_S_Z)->EnableWindow(FALSE);
GetDlgItem(IDC_S_W)->EnableWindow(FALSE);
}
else{
GetDlgItem(IDC_S_OBJECT_LINEAR_MODE)->EnableWindow(TRUE);
GetDlgItem(IDC_S_EYE_LINEAR_MODE)->EnableWindow(TRUE);
GetDlgItem(IDC_S_SPHERE_MAP_MODE)->EnableWindow(TRUE);
GetDlgItem(IDC_S_X)->EnableWindow(TRUE);
GetDlgItem(IDC_S_Y)->EnableWindow(TRUE);
GetDlgItem(IDC_S_Z)->EnableWindow(TRUE);
GetDlgItem(IDC_S_W)->EnableWindow(TRUE);
switch(set.s_mode){
case GL_OBJECT_LINEAR: m_sMode = 0; break;
case GL_EYE_LINEAR: m_sMode = 1; break;
case GL_SPHERE_MAP: m_sMode = 2; break;
}
OnSSphereMapMode(m_sMode + IDC_S_OBJECT_LINEAR_MODE);
m_s_x = set.s_coeffs[0];
m_s_y = set.s_coeffs[1];
m_s_z = set.s_coeffs[2];
m_s_w = set.s_coeffs[3];
}
m_GenS = !m_GenS;
UpdateData(FALSE);
}
void CTextureDlg::OnTGenToggle()
{
if(m_GenT){
GetDlgItem(IDC_T_OBJECT_LINEAR_MODE)->EnableWindow(FALSE);
GetDlgItem(IDC_T_EYE_LINEAR_MODE)->EnableWindow(FALSE);
GetDlgItem(IDC_T_SPHERE_MAP_MODE)->EnableWindow(FALSE);
GetDlgItem(IDC_T_X)->EnableWindow(FALSE);
GetDlgItem(IDC_T_Y)->EnableWindow(FALSE);
GetDlgItem(IDC_T_Z)->EnableWindow(FALSE);
GetDlgItem(IDC_T_W)->EnableWindow(FALSE);
}
else{
GetDlgItem(IDC_T_OBJECT_LINEAR_MODE)->EnableWindow(TRUE);
GetDlgItem(IDC_T_EYE_LINEAR_MODE)->EnableWindow(TRUE);
GetDlgItem(IDC_T_SPHERE_MAP_MODE)->EnableWindow(TRUE);
switch(set.t_mode){
case GL_OBJECT_LINEAR: m_tMode = 0; break;
case GL_EYE_LINEAR: m_tMode = 1; break;
case GL_SPHERE_MAP: m_tMode = 2; break;
}
OnTSphereMapMode(m_tMode + IDC_T_OBJECT_LINEAR_MODE);
m_t_x = set.t_coeffs[0];
m_t_y = set.t_coeffs[1];
m_t_z = set.t_coeffs[2];
m_t_w = set.t_coeffs[3];
}
m_GenT = !m_GenT;
UpdateData(FALSE);
}
void CTextureDlg::OnSSphereMapMode(UINT nID)
{
if(nID == IDC_S_SPHERE_MAP_MODE){
GetDlgItem(IDC_S_X)->EnableWindow(FALSE);
GetDlgItem(IDC_S_Y)->EnableWindow(FALSE);
GetDlgItem(IDC_S_Z)->EnableWindow(FALSE);
GetDlgItem(IDC_S_W)->EnableWindow(FALSE);
}
else{
GetDlgItem(IDC_S_X)->EnableWindow(TRUE);
GetDlgItem(IDC_S_Y)->EnableWindow(TRUE);
GetDlgItem(IDC_S_Z)->EnableWindow(TRUE);
GetDlgItem(IDC_S_W)->EnableWindow(TRUE);
}
}
void CTextureDlg::OnTSphereMapMode(UINT nID)
{
if(nID == IDC_T_SPHERE_MAP_MODE){
GetDlgItem(IDC_T_X)->EnableWindow(FALSE);
GetDlgItem(IDC_T_Y)->EnableWindow(FALSE);
GetDlgItem(IDC_T_Z)->EnableWindow(FALSE);
GetDlgItem(IDC_T_W)->EnableWindow(FALSE);
}
else{
GetDlgItem(IDC_T_X)->EnableWindow(TRUE);
GetDlgItem(IDC_T_Y)->EnableWindow(TRUE);
GetDlgItem(IDC_T_Z)->EnableWindow(TRUE);
GetDlgItem(IDC_T_W)->EnableWindow(TRUE);
}
}
BOOL CTextureDlg::Create(CView * pView)
{
m_pView = (CTextureView*)pView;
return CDialog::Create(CTextureDlg::IDD);
}
void CTextureDlg::OnCancel()
{
CDialog::OnCancel();
delete ((CTextureView*)m_pView)->m_pDlg;
((CTextureView*)m_pView)->m_pDlg = NULL;
}
Соседние файлы в папке Texture