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); 
}