www.pudn.com > 3DEDITOR.rar > DLGRAYTRACE.CPP


// DlgRayTrace.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "3DEditor.h" 
#include "DlgRayTrace.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
CProgressCtrl *progress; 
CStatic *status,*status2; 
time_t t1; 
extern int backface_culling; 
RenderView *renderview=0; 
CRITICAL_SECTION cs_rv; 
 
///////////////////////////////////////////////////////////////////////////// 
// DlgRayTrace dialog 
 
UINT RayThread( LPVOID pParam ); 
 
DlgRayTrace::DlgRayTrace(CWnd* pParent /*=NULL*/) 
	: CDialog(DlgRayTrace::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(DlgRayTrace) 
	m_res_x = 0; 
	m_res_y = 0; 
	m_ray_depth = 0; 
	m_antialiase = 0; 
	m_antialiase_factor = 0; 
	m_shadows = FALSE; 
	m_filename = _T(""); 
	//}}AFX_DATA_INIT 
} 
 
 
void DlgRayTrace::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(DlgRayTrace) 
	DDX_Control(pDX, IDC_TIME, m_time); 
	DDX_Control(pDX, IDC_STATUS, m_status); 
	DDX_Control(pDX, IDC_PROGRESS, m_progress); 
	DDX_Text(pDX, IDC_RES_X, m_res_x); 
	DDV_MinMaxInt(pDX, m_res_x, 16, 10240); 
	DDX_Text(pDX, IDC_RES_Y, m_res_y); 
	DDV_MinMaxInt(pDX, m_res_y, 16, 10240); 
	DDX_Text(pDX, IDC_RAY_DEPTH, m_ray_depth); 
	DDV_MinMaxInt(pDX, m_ray_depth, 1, 16); 
	DDX_Text(pDX, IDC_ANTIALIASE, m_antialiase); 
	DDV_MinMaxInt(pDX, m_antialiase, 0, 4); 
	DDX_Text(pDX, IDC_ANTIALIASFACTOR, m_antialiase_factor); 
	DDV_MinMaxInt(pDX, m_antialiase_factor, 0, 255); 
	DDX_Check(pDX, IDC_SHADOWS, m_shadows); 
	DDX_Text(pDX, IDC_FILENAME, m_filename); 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(DlgRayTrace, CDialog) 
	//{{AFX_MSG_MAP(DlgRayTrace) 
	ON_BN_CLICKED(IDC_RES_CUSTOM, OnResCustom) 
	ON_BN_CLICKED(IDC_RES_VIEW, OnResView) 
	ON_BN_CLICKED(IDC_PREVIEW, OnPreview) 
	ON_BN_CLICKED(IDC_BROWSE, OnBrowse) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// DlgRayTrace message handlers 
 
BOOL DlgRayTrace::OnInitDialog()  
{ 
	CDialog::OnInitDialog(); 
	raythread=0; 
	progress=0; 
 
	buf=0; 
	rv=0; 
	InitializeCriticalSection(&cs_rv); 
 
	if(view) 
		{ 
		OnResView(); 
		((CButton *)GetDlgItem(IDC_RES_VIEW))->SetCheck(1); 
		} 
	else 
		{ 
		OnResCustom(); 
		((CButton *)GetDlgItem(IDC_RES_CUSTOM))->SetCheck(1); 
		} 
 
	return TRUE;   
} 
 
void DlgRayTrace::OnOK()  
{ 
	if (UpdateData(true)) 
		if (raythread==0) 
		{ 
			if (rv) 
				{ 
				CMenu *menu=rv->GetMenu(); 
				menu->EnableMenuItem(ID_SAVEIMG,MF_GRAYED|MF_BYCOMMAND); 
				menu->EnableMenuItem(ID_COPY,MF_GRAYED|MF_BYCOMMAND); 
				if (rv->buf) 
					{ 
					delete rv->buf; 
					rv->buf=0; 
					} 
				rv->Invalidate(1); 
				} 
			if (buf) 
				{ 
				delete buf; 
				buf=0; 
				} 
			raythread=AfxBeginThread(RayThread, this); 
		} 
} 
 
void DlgRayTrace::OnCancel()  
{ 
	if (raythread) 
		{ 
		CString s; 
		s.LoadString(IDS_STOPRAYTRACE); 
		if (IDYES==AfxMessageBox(s,MB_ICONQUESTION|MB_YESNO)) 
			if (progress) 
			{ 
			progress=0; 
			GetDlgItem(IDCANCEL)->EnableWindow(0); 
			} 
		} 
	else  
		{ 
		view=IsDlgButtonChecked(IDC_RES_VIEW); 
		UpdateData(true); 
		EndDialog(1); 
		if (rv) 
			rv->Close(); 
		if (buf) 
			delete buf; 
		buf=0; 
		DeleteCriticalSection(&cs_rv); 
		} 
} 
 
UINT RayThread( LPVOID pParam ) 
{ 
	DlgRayTrace *drt=(DlgRayTrace *)pParam; 
	scene *doc=drt->doc; 
 
	CString s; 
	s.LoadString(IDS_CANCEL); 
	drt->GetDlgItem(IDOK)->EnableWindow(0); 
	drt->GetDlgItem(IDCANCEL)->SetWindowText(s); 
	drt->GetDlgItem(IDC_ANTIALIASE)->EnableWindow(0); 
	drt->GetDlgItem(IDC_SHADOWS)->EnableWindow(0); 
	drt->GetDlgItem(IDC_ANTIALIASFACTOR)->EnableWindow(0); 
	drt->GetDlgItem(IDC_RAY_DEPTH)->EnableWindow(0); 
	drt->GetDlgItem(IDC_RES_X)->EnableWindow(0); 
	drt->GetDlgItem(IDC_RES_Y)->EnableWindow(0); 
	drt->GetDlgItem(IDC_RES_VIEW)->EnableWindow(0); 
	drt->GetDlgItem(IDC_RES_CUSTOM)->EnableWindow(0); 
 
	doc->shadows=drt->m_shadows; 
	progress=&drt->m_progress; 
	status=&drt->m_status; 
	status2=&drt->m_time; 
	time(&t1); 
 
	int sx=drt->m_res_x,sy=drt->m_res_y; 
 
	picture *p=doc->ray_trace(drt->cam, sx, sy, drt->m_ray_depth, 11, 5, drt->m_antialiase, drt->m_antialiase_factor); 
 
	if (drt->rv) 
		{ 
		CMenu *menu=drt->rv->GetMenu(); 
		menu->EnableMenuItem(ID_SAVEIMG,MF_ENABLED|MF_BYCOMMAND); 
		menu->EnableMenuItem(ID_COPY,MF_ENABLED|MF_BYCOMMAND); 
		if (!drt->fullfilename.IsEmpty()) 
			drt->rv->SaveTGA((char *)(LPCSTR)drt->fullfilename); 
		p->FreePicture(); 
		delete p; 
		} 
	else drt->PostMessage(WM_USER+10,sx|(sy<<16),(LONG)p); 
 
	s.LoadString(IDS_CLOSE); 
	drt->GetDlgItem(IDOK)->EnableWindow(1); 
	drt->GetDlgItem(IDCANCEL)->EnableWindow(1); 
	drt->GetDlgItem(IDCANCEL)->SetWindowText(s); 
	drt->GetDlgItem(IDC_SHADOWS)->EnableWindow(1); 
	drt->GetDlgItem(IDC_ANTIALIASE)->EnableWindow(1); 
	drt->GetDlgItem(IDC_ANTIALIASFACTOR)->EnableWindow(1); 
	drt->GetDlgItem(IDC_RAY_DEPTH)->EnableWindow(1); 
	drt->GetDlgItem(IDC_RES_X)->EnableWindow(drt->IsDlgButtonChecked(IDC_RES_CUSTOM)); 
	drt->GetDlgItem(IDC_RES_Y)->EnableWindow(drt->IsDlgButtonChecked(IDC_RES_CUSTOM)); 
	drt->GetDlgItem(IDC_RES_VIEW)->EnableWindow(1); 
	drt->GetDlgItem(IDC_RES_CUSTOM)->EnableWindow(1); 
	progress=0; 
	 
	drt->raythread=0; 
 
	return 1; 
} 
 
void DlgRayTrace::OnResCustom()  
{ 
	GetDlgItem(IDC_RES_X)->EnableWindow(1); 
	GetDlgItem(IDC_RES_Y)->EnableWindow(1); 
} 
 
void DlgRayTrace::OnResView()  
{ 
	GetDlgItem(IDC_RES_X)->EnableWindow(0); 
	GetDlgItem(IDC_RES_Y)->EnableWindow(0); 
 
	SetDlgItemInt(IDC_RES_X, rect.right); 
	SetDlgItemInt(IDC_RES_Y, rect.bottom); 
} 
 
void DlgRayTrace::OnPreview()  
{ 
	EnterCriticalSection(&cs_rv); 
	if (rv==0) 
		{ 
		rv=new RenderView; 
		rv->doc=doc; 
		rv->rd=this; 
		rv->buf=buf; 
		rv->bufsx=bufsx; 
		rv->bufsy=bufsy; 
		buf=0; 
		rv->Create(IDD_VIEWIMG); 
		renderview=rv; 
		GetDlgItem(IDC_PREVIEW)->EnableWindow(0); 
		rv->ShowWindow(SW_SHOW); 
 
		} 
	LeaveCriticalSection(&cs_rv); 
} 
 
LRESULT DlgRayTrace::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)  
{ 
	if (message==WM_USER+10) 
	{ 
		picture *p=(picture *)lParam; 
		OnPreview(); 
		rv->DrawPicture(p,wParam&0xFFFF,wParam>>16); 
		if (!fullfilename.IsEmpty()) 
			rv->SaveTGA((char *)(LPCSTR)fullfilename); 
		p->FreePicture(); 
		delete p; 
	} 
	return CDialog::WindowProc(message, wParam, lParam); 
} 
 
void DlgRayTrace::OnBrowse()  
{ 
	CString s; 
	s.LoadString(IDS_FD_TGA); 
	CFileDialog fd(FALSE,"tga",0,OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST,s); 
	 
	if(fd.DoModal()==IDOK) 
		{ 
		fullfilename=fd.GetPathName(); 
		GetDlgItem(IDC_FILENAME)->SetWindowText((char *)(LPCSTR)fd.GetFileName()); 
		} 
	char s2[256]; 
	GetDlgItem(IDC_FILENAME)->GetWindowText(s2,255); 
	GetDlgItem(IDOK)->EnableWindow(s[0]!=0); 
}