www.pudn.com > 3DEDITOR.rar > DLGMAPPING.CPP, change:2002-12-24,size:7487b
// 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);
}
}