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