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


// DlgMapping.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "3DEditor.h" 
#include "3DEditorDoc.h" 
#include "3DEditorView.h" 
#include "DlgMapping.h" 
#include "DlgProperties.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
 
#define MAP_PICK_SIZE 4 
 
///////////////////////////////////////////////////////////////////////////// 
// DlgMapping dialog 
 
 
DlgMapping::DlgMapping(CWnd* pParent /*=NULL*/) 
	: CDialog(DlgMapping::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(DlgMapping) 
		// NOTE: the ClassWizard will add member initialization here 
	//}}AFX_DATA_INIT 
	buf=0; 
	obj=0; 
	vsel=-1; 
	zoom=2; 
} 
 
void DlgMapping::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(DlgMapping) 
		// NOTE: the ClassWizard will add DDX and DDV calls here 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(DlgMapping, CDialog) 
	//{{AFX_MSG_MAP(DlgMapping) 
	ON_WM_CLOSE() 
	ON_WM_PAINT() 
	ON_WM_SIZE() 
	ON_WM_LBUTTONDOWN() 
	ON_WM_LBUTTONUP() 
	ON_WM_MOUSEMOVE() 
	ON_WM_CONTEXTMENU() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// DlgMapping message handlers 
 
BOOL DlgMapping::OnInitDialog()  
{ 
	CDialog::OnInitDialog(); 
	winpos4.left=-1; 
	winpos4.top=-1;	 
	if (winpos4.left!=-1) 
		SetWindowPos(0,winpos4.left,winpos4.top,0,0,SWP_NOSIZE|SWP_NOZORDER); 
	 
	return TRUE; 
} 
 
void DlgMapping::Close() 
{ 
	OnClose(); 
} 
 
void DlgMapping::OnClose()  
{ 
	if (buf) delete buf; 
	GetWindowRect(&winpos4); 
	CDialog **d=&doc->dlgmap; 
	delete doc->dlgmap; 
	*d=0; 
} 
 
void DlgMapping::OnOK()  
{ 
} 
 
void DlgMapping::OnCancel()  
{ 
} 
 
void DlgMapping::DrawPicture(CDC *dc,picture *p,int ssx,int ssy) 
{ 
	struct tagBITMAPINFO bmi; 
 
	bmi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER); 
	bmi.bmiHeader.biCompression=BI_RGB; 
	bmi.bmiHeader.biXPelsPerMeter=6000; 
	bmi.bmiHeader.biYPelsPerMeter=6000; 
	bmi.bmiHeader.biClrUsed=0; 
	bmi.bmiHeader.biClrImportant=0; 
	bmi.bmiHeader.biSizeImage=0; 
	bmi.bmiHeader.biWidth=p?ssx:bufsx; 
	bmi.bmiHeader.biHeight=p?ssy:bufsy; 
	bmi.bmiHeader.biPlanes=1; 
	bmi.bmiHeader.biBitCount=24; 
 
	if (p) 
		{ 
		int tx=ssx*3,x,y,yp,xx; 
		byteRGB *rgb; 
		if (tx%4) tx+=(4-tx%4); 
 
		if (buf)  
			delete buf; 
		buf=new unsigned char[tx*ssy]; 
 
		for( y=0;ybuf[y*(p->sy-1)/(ssy-1)]; 
				for( x=0;xsx-1)/(ssx-1); 
						buf[yp++]=rgb[xx].b; 
						buf[yp++]=rgb[xx].g; 
						buf[yp++]=rgb[xx].r; 
					 } 
				 } 
		bufsx=ssx; 
		bufsy=ssy; 
		} 
	if (buf) 
		StretchDIBits(dc->m_hDC,0,0,rect.right,rect.bottom,0,0,bufsx,bufsy,buf,&bmi,DIB_RGB_COLORS,SRCCOPY); 
} 
 
void DlgMapping::DrawElement(CDC *dc,ftlist *e) 
{ 
	int i,x0,y0,x1,y1; 
 
	for( i=0;i<3;i++ ) 
		{ 
		x0=abs((int)(e->lv[i]->tx[0]*(rect.right-1)))%rect.right; 
		y0=rect.bottom-1-(abs((int)(e->lv[i]->tx[1]*(rect.bottom-1)))%rect.bottom); 
		 
		x1=abs((int)(e->lv[(i+1)%3]->tx[0]*(rect.right-1)))%rect.right; 
		y1=rect.bottom-1-(abs((int)(e->lv[(i+1)%3]->tx[1]*(rect.bottom-1)))%rect.bottom); 
 
		dc->MoveTo(x0,y0); 
		dc->LineTo(x1,y1); 
		} 
 
	for( i=0;i<3;i++ ) 
		{ 
		x0=abs((int)(e->lv[i]->tx[0]*(rect.right-1)))%rect.right; 
		y0=rect.bottom-1-(abs((int)(e->lv[i]->tx[1]*(rect.bottom-1)))%rect.bottom); 
		 
		x1=abs((int)(e->lv[(i+1)%3]->tx[0]*(rect.right-1)))%rect.right; 
		y1=rect.bottom-1-(abs((int)(e->lv[(i+1)%3]->tx[1]*(rect.bottom-1)))%rect.bottom); 
 
		CRect r1(x0-3,y0-3,x0+4,y0+4); 
		dc->FillSolidRect(&r1,RGB(255,255,255)); 
		CRect r2(x0-2,y0-2,x0+3,y0+3); 
		dc->FillSolidRect(&r2,RGB(128,128,128)); 
		} 
 
	for( i=0;i<3;i++ ) 
		if (e->lf[i]) 
			if (e->lf[i]->flag) 
				{ 
				e->lf[i]->flag=0; 
				DrawElement(dc,e->lf[i]); 
				} 
} 
 
void DlgMapping::DrawPolygons(CDC *dc) 
{ 
	int i; 
	for( i=0;inf;i++ ) 
		if (obj->ft[i]) 
			obj->ft[i]->flag=1;	 
	ftlist *e=obj->ft[face]; 
	e->flag=0; 
	dc->SelectStockObject(WHITE_PEN); 
	DrawElement(dc,e); 
} 
 
void DlgMapping::OnPaint()  
{ 
	CPaintDC dc(this); 
 
	if (doc->dlgprop) 
	{ 
	DlgProperties *dp=(DlgProperties *)doc->dlgprop; 
	if (dp->obj && dp->sel>=0) 
		{ 
		face=dp->obj->elem[dp->sel].elem; 
		int mat=dp->obj->ft[face]->material; 
		if (mat!=-1) 
			{ 
			int pic=doc->matlib[mat].map_texture1.piclibindx; 
			if (pic!=-1) 
				{	 
				obj=dp->obj; 
 
				if (zoom) 
				{ 
				RECT wrect; 
				GetWindowRect(&wrect); 
				SetWindowPos(0,wrect.left,wrect.top, 
					doc->piclib[pic].sx*zoom+((wrect.right-wrect.left)-(rect.right-rect.left)), 
					doc->piclib[pic].sy*zoom+((wrect.bottom-wrect.top)-(rect.bottom-rect.top)), 
					SWP_NOZORDER); 
				} 
 
				DrawPicture(&dc,&doc->piclib[pic],doc->piclib[pic].sx,doc->piclib[pic].sy); 
				DrawPolygons(&dc); 
				return; 
				} 
			} 
		} 
	} 
	CBrush brush(RGB(192,192,192)); 
	dc.FillRect(&rect,&brush); 
	obj=0; 
	vsel=-1; 
	int x,y; 
	CString str; 
	CFont font; 
	font.CreateFont(18,0,0,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,PROOF_QUALITY,FF_DONTCARE,"Arial"); 
	dc.SelectObject(&font); 
	str.LoadString(IDS_NOMAPPING); 
	CSize s=dc.GetTextExtent(str); 
	x=rect.right/2-s.cx/2; 
	y=rect.bottom/2-s.cy/2; 
	dc.SetTextColor(RGB(0,0,0)); 
	dc.SetBkMode(TRANSPARENT); 
	dc.TextOut(x,y,str); 
} 
 
void DlgMapping::OnSize(UINT nType, int cx, int cy)  
{ 
	CDialog::OnSize(nType, cx, cy); 
	GetClientRect(&rect); 
	Invalidate(0);	 
} 
 
int DlgMapping::FindVertex(ftlist *e,int x,int y) 
{ 
	int i,j,x0,y0; 
	 
	for( i=0;i<3;i++ ) 
	{ 
		x0=abs((int)(e->lv[i]->tx[0]*(rect.right-1)))%rect.right; 
		y0=rect.bottom-1-(abs((int)(e->lv[i]->tx[1]*(rect.bottom-1)))%rect.bottom); 
 
		if (fabs(x0-x)lv[i]->flag; 
	} 
 
	for( i=0;i<3;i++ ) 
		if (e->lf[i]) 
			if (e->lf[i]->flag) 
				{ 
				e->lf[i]->flag=0; 
				j=FindVertex(e->lf[i],x,y); 
				if (j!=-1) return j; 
				} 
	return -1; 
} 
 
void DlgMapping::OnLButtonDown(UINT nFlags, CPoint point)  
{ 
	if (vsel==-1 && obj) 
	{ 
		int i; 
		for( i=0;inf;i++ ) 
			if (obj->ft[i]) 
				obj->ft[i]->flag=1;	 
		for( i=0;inv;i++ ) 
			if (obj->vt[i]) 
				obj->vt[i]->flag=i; 
		obj->ft[face]->flag=0; 
		vsel=FindVertex(obj->ft[face],point.x,point.y); 
		if (vsel!=-1) 
			SetCapture(); 
	} 
	 
	CDialog::OnLButtonDown(nFlags, point); 
} 
 
void DlgMapping::OnLButtonUp(UINT nFlags, CPoint point)  
{ 
	if (vsel!=-1) 
	{ 
		ReleaseCapture(); 
		doc->SetModifiedFlag(); 
		Invalidate(0); 
		vsel=-1; 
	} 
	 
	CDialog::OnLButtonUp(nFlags, point); 
} 
 
void DlgMapping::OnMouseMove(UINT nFlags, CPoint point)  
{ 
	if (vsel!=-1) 
	{ 
		if (point.x<0 || point.x>=rect.right || 
			point.y<0 || point.y>=rect.bottom) 
			return; 
 
		float u,v; 
 
		u=(float)point.x/(rect.right-1); 
		v=(float)(rect.bottom-1-point.y)/(rect.bottom-1); 
 
		obj->vt[vsel]->tx[0]=u; 
		obj->vt[vsel]->tx[1]=-v; 
 
		Invalidate(0); 
		doc->UpdateAllViews(0); 
	} 
	 
	CDialog::OnMouseMove(nFlags, point); 
} 
 
void DlgMapping::OnContextMenu(CWnd* pWnd, CPoint point)  
{ 
 
	HMENU hMenu = LoadMenu( 0, MAKEINTRESOURCE(IDR_MAPPING_POPUP) ); 
	CheckMenuItem(hMenu,zoom+ID_ZOOM_NOZOOM,MF_CHECKED); 
	int ret=TrackPopupMenuEx( GetSubMenu( hMenu, 0 ), 
					  TPM_VERTICAL|TPM_RETURNCMD, 
					  point.x, point.y, this->m_hWnd, NULL ); 
	if (ret) 
	{ 
		zoom=ret-ID_ZOOM_NOZOOM; 
		Invalidate(0); 
	} 
 
}