Скачиваний:
29
Добавлен:
02.05.2014
Размер:
11.01 Кб
Скачать
// 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