www.pudn.com > 3DEDITOR.rar > DLGMATERIAL.CPP
// DlgMaterial.cpp : implementation file
//
#include "stdafx.h"
#include "3DEditor.h"
#include "3DEditorDoc.h"
#include "3DEditorView.h"
#include "DlgMaterial.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// DlgMaterial dialog
DlgMaterial::DlgMaterial(CWnd* pParent /*=NULL*/)
: CDialog(DlgMaterial::IDD, pParent)
{
//{{AFX_DATA_INIT(DlgMaterial)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
curmat=0;
}
void DlgMaterial::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(DlgMaterial)
DDX_Control(pDX, IDC_NAME, m_names);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(DlgMaterial, CDialog)
//{{AFX_MSG_MAP(DlgMaterial)
ON_WM_CLOSE()
ON_WM_LBUTTONDOWN()
ON_CBN_SELCHANGE(IDC_NAME, OnSelchangeName)
ON_WM_PAINT()
ON_EN_KILLFOCUS(IDC_OPACITY, OnKillfocusOpacity)
ON_EN_KILLFOCUS(IDC_SELFILLUM, OnKillfocusSelfillum)
ON_EN_KILLFOCUS(IDC_SHININESS, OnKillfocusShininess)
ON_EN_KILLFOCUS(IDC_STRENGTH, OnKillfocusStrength)
ON_BN_CLICKED(IDC_BUT_OPACITY, OnButOpacity)
ON_BN_CLICKED(IDC_BUT_SELFILLUM, OnButSelfillum)
ON_BN_CLICKED(IDC_BUT_BUMP, OnButBump)
ON_BN_CLICKED(IDC_BUT_TEXT1, OnButText1)
ON_EN_KILLFOCUS(IDC_REFLECTION, OnKillfocusReflection)
ON_EN_KILLFOCUS(IDC_REFRACTION, OnKillfocusRefraction)
ON_EN_KILLFOCUS(IDC_AM_BUMP, OnKillfocusAmBump)
ON_EN_KILLFOCUS(IDC_AM_OPACITY, OnKillfocusAmOpacity)
ON_EN_KILLFOCUS(IDC_AM_SELFILLUM, OnKillfocusAmSelfillum)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// DlgMaterial message handlers
BOOL DlgMaterial::OnInitDialog()
{
CDialog::OnInitDialog();
winpos2.left=-1;
winpos2.top=-1;
int i,j;
for( i=0;inmatlib;i++ )
{
j=m_names.AddString(doc->matlib[i].name);
m_names.SetItemData(j,i);
}
if (winpos2.left!=-1)
SetWindowPos(0,winpos2.left,winpos2.top,0,0,SWP_NOSIZE|SWP_NOZORDER);
m_names.SetCurSel(0);
curmat=&doc->matlib[m_names.GetItemData(0)];
FillDlg();
FillColors();
return TRUE;
}
void DlgMaterial::OnOK()
{
}
void DlgMaterial::OnCancel()
{
}
void DlgMaterial::Close()
{
OnClose();
}
void DlgMaterial::OnClose()
{
GetWindowRect(&winpos2);
CDialog **d=&doc->dlgmat;
delete doc->dlgmat;
*d=0;
}
void DlgMaterial::OnLButtonDown(UINT nFlags, CPoint point)
{
CRect rect;
CPoint p;
float *v=0;
GetDlgItem(IDC_AMBIENT)->GetClientRect(&rect);
GetDlgItem(IDC_AMBIENT)->MapWindowPoints( this, &rect);
if (rect.left<=point.x && rect.right>=point.x && rect.top<=point.y && rect.bottom>=point.y)
v=&curmat->ambient[0];
GetDlgItem(IDC_DIFFUSE)->GetClientRect(&rect);
GetDlgItem(IDC_DIFFUSE)->MapWindowPoints( this, &rect);
if (rect.left<=point.x && rect.right>=point.x && rect.top<=point.y && rect.bottom>=point.y)
v=&curmat->diffuse[0];
GetDlgItem(IDC_SPECULAR)->GetClientRect(&rect);
GetDlgItem(IDC_SPECULAR)->MapWindowPoints( this, &rect);
if (rect.left<=point.x && rect.right>=point.x && rect.top<=point.y && rect.bottom>=point.y)
v=&curmat->specular[0];
if (v)
{
COLORREF cr=RGB(v[0]*255,v[1]*255,v[2]*255);
CColorDialog c(cr);
if (c.DoModal()==IDOK)
{
cr=c.GetColor();
v[0]=GetRValue(cr)/(float)255;
v[1]=GetGValue(cr)/(float)255;
v[2]=GetBValue(cr)/(float)255;
FillColors();
doc->UpdateAllViews(0);
}
}
CDialog::OnLButtonDown(nFlags, point);
}
void DlgMaterial::FillDlg()
{
SetDlgItemInt(IDC_AM_OPACITY,curmat->map_opacity.amount);
SetDlgItemInt(IDC_AM_BUMP,curmat->map_bump.amount);
SetDlgItemInt(IDC_AM_SELFILLUM,curmat->map_selfillum.amount);
SetDlgItemText(IDC_TEXT1_MAP,curmat->map_texture1.filename);
SetDlgItemText(IDC_OPACITY_MAP,curmat->map_opacity.filename);
SetDlgItemText(IDC_BUMP_MAP,curmat->map_bump.filename);
SetDlgItemText(IDC_SELFILLUM_MAP,curmat->map_selfillum.filename);
GetDlgItem(IDC_AM_OPACITY)->EnableWindow(curmat->map_opacity.filename[0]!=0);
GetDlgItem(IDC_OPACITY)->EnableWindow(curmat->map_opacity.filename[0]==0);
GetDlgItem(IDC_AM_BUMP)->EnableWindow(curmat->map_bump.filename[0]!=0);
GetDlgItem(IDC_AM_SELFILLUM)->EnableWindow(curmat->map_selfillum.filename[0]!=0);
GetDlgItem(IDC_SELFILLUM)->EnableWindow(curmat->map_selfillum.filename[0]==0);
char str[256];
sprintf(str,"%4.2f",1-curmat->transparency);
SetDlgItemText(IDC_OPACITY,str);
sprintf(str,"%4.2f",curmat->shininess);
SetDlgItemText(IDC_SHININESS,str);
sprintf(str,"%4.2f",curmat->shininess_strength);
SetDlgItemText(IDC_STRENGTH,str);
sprintf(str,"%4.2f",curmat->self_illum);
SetDlgItemText(IDC_SELFILLUM,str);
sprintf(str,"%4.2f",curmat->reflection);
SetDlgItemText(IDC_REFLECTION,str);
sprintf(str,"%4.2f",curmat->refraction);
SetDlgItemText(IDC_REFRACTION,str);
FillColors();
}
void DlgMaterial::FillColors()
{
CBrush *b;
CRect rect;
CDC *dc;
COLORREF c;
c=RGB((int)(curmat->ambient[0]*255),(int)(curmat->ambient[1]*255),(int)(curmat->ambient[2]*255));
b=new CBrush(c);
GetDlgItem(IDC_AMBIENT)->GetClientRect(&rect);
rect.DeflateRect(3,3);
dc=GetDlgItem(IDC_AMBIENT)->GetDC();
dc->FillRect(rect,b);
GetDlgItem(IDC_AMBIENT)->ReleaseDC(dc);
delete b;
c=RGB(curmat->diffuse[0]*255,curmat->diffuse[1]*255,curmat->diffuse[2]*255);
b=new CBrush(c);
GetDlgItem(IDC_DIFFUSE)->GetClientRect(&rect);
rect.DeflateRect(3,3);
dc=GetDlgItem(IDC_DIFFUSE)->GetDC();
dc->FillRect(rect,b);
GetDlgItem(IDC_DIFFUSE)->ReleaseDC(dc);
delete b;
c=RGB(curmat->specular[0]*255,curmat->specular[1]*255,curmat->specular[2]*255);
b=new CBrush(c);
GetDlgItem(IDC_SPECULAR)->GetClientRect(&rect);
rect.DeflateRect(3,3);
dc=GetDlgItem(IDC_SPECULAR)->GetDC();
dc->FillRect(rect,b);
GetDlgItem(IDC_SPECULAR)->ReleaseDC(dc);
delete b;
}
void DlgMaterial::OnSelchangeName()
{
curmat=&doc->matlib[m_names.GetItemData(m_names.GetCurSel())];
FillDlg();
}
void DlgMaterial::OnPaint()
{
CPaintDC dc(this);
if (curmat) FillColors();
}
void DlgMaterial::OnKillfocusOpacity()
{
float f;
char str[256];
GetDlgItemText(IDC_OPACITY,str,255);
if (sscanf(str,"%f",&f))
{
if (fabs(f-(1-curmat->transparency))>0.0001)
doc->SetModifiedFlag();
curmat->transparency=1-f;
}
sprintf(str,"%4.2f",1-curmat->transparency);
SetDlgItemText(IDC_OPACITY,str);
}
void DlgMaterial::OnKillfocusSelfillum()
{
float f;
char str[256];
GetDlgItemText(IDC_SELFILLUM,str,255);
if (sscanf(str,"%f",&f))
{
if (f!=curmat->self_illum)
{
doc->SetModifiedFlag();
doc->UpdateAllViews(0);
}
curmat->self_illum=f;
}
sprintf(str,"%4.2f",curmat->self_illum);
SetDlgItemText(IDC_SELFILLUM,str);
}
void DlgMaterial::OnKillfocusShininess()
{
float f;
char str[256];
GetDlgItemText(IDC_SHININESS,str,255);
if (sscanf(str,"%f",&f))
{
if (f!=curmat->shininess)
{
doc->SetModifiedFlag();
doc->UpdateAllViews(0);
}
curmat->shininess=f;
}
sprintf(str,"%4.2f",curmat->shininess);
SetDlgItemText(IDC_SHININESS,str);
}
void DlgMaterial::OnKillfocusStrength()
{
float f;
char str[256];
GetDlgItemText(IDC_STRENGTH,str,255);
if (sscanf(str,"%f",&f))
{
if (f!=curmat->shininess_strength)
{
doc->SetModifiedFlag();
doc->UpdateAllViews(0);
}
curmat->shininess_strength=f;
}
sprintf(str,"%4.2f",curmat->shininess_strength);
SetDlgItemText(IDC_STRENGTH,str);
}
void DlgMaterial::LoadMap(struct mapping *mapp)
{
CString s;
s.LoadString(IDS_FD_TGAJPGBMP);
CFileDialog fd(TRUE,0,mapp->filename,OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST,s);
if(fd.DoModal()==IDOK)
strcpy(mapp->filename,(char *)(LPCSTR)fd.GetFileName());
else strcpy(mapp->filename,"");
if (mapp->filename[0])
{
BeginWaitCursor();
mapp->piclibindx=doc->find_image(mapp->filename);
EndWaitCursor();
}
else
{
mapp->piclibindx=-1;
strcpy(mapp->filename,"");
}
}
void DlgMaterial::OnButOpacity()
{
LoadMap(&curmat->map_opacity);
GetDlgItem(IDC_OPACITY_MAP)->SetWindowText(curmat->map_opacity.filename);
GetDlgItem(IDC_AM_OPACITY)->EnableWindow(curmat->map_opacity.piclibindx!=-1);
GetDlgItem(IDC_OPACITY)->EnableWindow(curmat->map_opacity.piclibindx==-1);
doc->SetModifiedFlag();
doc->UpdateAllViews(0);
}
void DlgMaterial::OnButSelfillum()
{
LoadMap(&curmat->map_selfillum);
GetDlgItem(IDC_SELFILLUM_MAP)->SetWindowText(curmat->map_selfillum.filename);
GetDlgItem(IDC_AM_SELFILLUM)->EnableWindow(curmat->map_selfillum.piclibindx!=-1);
GetDlgItem(IDC_SELFILLUM)->EnableWindow(curmat->map_selfillum.piclibindx==-1);
doc->SetModifiedFlag();
doc->UpdateAllViews(0);
}
void DlgMaterial::OnButBump()
{
LoadMap(&curmat->map_bump);
GetDlgItem(IDC_BUMP_MAP)->SetWindowText(curmat->map_bump.filename);
GetDlgItem(IDC_AM_BUMP)->EnableWindow(curmat->map_bump.piclibindx!=-1);
doc->SetModifiedFlag();
doc->UpdateAllViews(0);
}
void DlgMaterial::OnButText1()
{
LoadMap(&curmat->map_texture1);
GetDlgItem(IDC_TEXT1_MAP)->SetWindowText(curmat->map_texture1.filename);
doc->SetModifiedFlag();
doc->UpdateAllViews(0);
}
void DlgMaterial::OnKillfocusReflection()
{
float f;
char str[256];
GetDlgItemText(IDC_REFLECTION,str,255);
if (sscanf(str,"%f",&f))
{
if (f!=curmat->reflection)
doc->SetModifiedFlag();
curmat->reflection=f;
}
sprintf(str,"%4.2f",curmat->reflection);
SetDlgItemText(IDC_REFLECTION,str);
}
void DlgMaterial::OnKillfocusRefraction()
{
float f;
char str[256];
GetDlgItemText(IDC_REFRACTION,str,255);
if (sscanf(str,"%f",&f))
{
if (f!=curmat->refraction)
doc->SetModifiedFlag();
curmat->refraction=f;
}
sprintf(str,"%4.2f",curmat->refraction);
SetDlgItemText(IDC_REFRACTION,str);
}
void DlgMaterial::OnKillfocusAmBump()
{
int i;
char str[256];
GetDlgItemText(IDC_AM_BUMP,str,255);
if (sscanf(str,"%i",&i))
{
if (i!=curmat->map_bump.amount)
doc->SetModifiedFlag();
curmat->map_bump.amount=i;
}
sprintf(str,"%i",curmat->map_bump.amount);
SetDlgItemText(IDC_AM_BUMP,str);
}
void DlgMaterial::OnKillfocusAmOpacity()
{
int i;
char str[256];
GetDlgItemText(IDC_AM_OPACITY,str,255);
if (sscanf(str,"%i",&i))
{
if (i!=curmat->map_opacity.amount)
doc->SetModifiedFlag();
curmat->map_opacity.amount=i;
}
sprintf(str,"%i",curmat->map_opacity.amount);
SetDlgItemText(IDC_AM_OPACITY,str);
}
void DlgMaterial::OnKillfocusAmSelfillum()
{
int i;
char str[256];
GetDlgItemText(IDC_AM_SELFILLUM,str,255);
if (sscanf(str,"%i",&i))
{
if (i!=curmat->map_selfillum.amount)
doc->SetModifiedFlag();
curmat->map_selfillum.amount=i;
}
sprintf(str,"%i",curmat->map_selfillum.amount);
SetDlgItemText(IDC_AM_SELFILLUM,str);
}