subdivdlg.cpp
来自「此代码主要用于汽车车身的优化」· C++ 代码 · 共 955 行 · 第 1/2 页
CPP
955 行
wglMakeCurrent(m_hDC, NULL);
}
// Set OpenGL perspective, viewport and mode
// m_winWidth = cx;
// m_winHeight = cy;
/* // set viewport
glViewport(0, 0, cx, cy);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// perspective transform
// gluPerspective(60.f, m_aspect, .1, 100);
if (m_projMode == 0)
glFrustum(-3,3,-3,3,4,30);
else
glOrtho(-3,3,-3,3,4,30);
// viewing transform
*/
void CSubdivDlg::OnLMouseMoveOpengl(short x, short y)
{
if( m_lBtnDown )
{
xRot = (y - startPoint.y) + xOriginRot;
yRot = (x - startPoint.x) + yOriginRot;
}
else if (m_rBtnDown)
{
xTran += x - rstartPoint.x;
yTran += y - rstartPoint.y;
rstartPoint = CPoint(x,y);
}
else startPoint = rstartPoint = CPoint(x,y);
CRect rc;
GetClientRect(&rc);
mouseLight.x = rc.Width()/2 - x;
mouseLight.y = y - rc.Height()/2;
Invalidate(FALSE);
mousePoint = CPoint(x,y);
Invalidate(FALSE); // not clear the bg
}
void CSubdivDlg::OnLMouseWheelOpengl(short zDelta, CPoint pt)
{
if (zDelta > 0)
zoom *= 1.1;
else
zoom *= 0.9;
CRect rc;
GetWindowRect(&rc);
zoomPoint.x = pt.x - rc.left - 3;
zoomPoint.y = pt.y - rc.top - 20; // how to retrieve the height of dialog's caption
m_mouseWheeled = true;
Invalidate(FALSE);
}
void CSubdivDlg::OnLButtonUpOpengl(long m_Flags, short x, short y)
{
m_lBtnDown = false;
xRot = (y - startPoint.y) + xOriginRot;
yRot = (x - startPoint.x) + yOriginRot;
}
void CSubdivDlg::OnLButtonDblClkOpengl(long mFlags, short x, short y)
{
zRot = xRot = yRot = xOriginRot = yOriginRot = 0;
xTran = yTran = 0;
zoom = 1;
startPoint = rstartPoint = CPoint(x,y);
Invalidate(false);
}
void CSubdivDlg::OnRButtonDownOpengl(long nFlags, short x, short y)
{
m_rBtnDown = true;
rstartPoint = CPoint(x,y);
}
void CSubdivDlg::OnRButtonUpOpengl(long nFlags, short x, short y)
{
m_rBtnDown = false;
}
void CSubdivDlg::OnLButtonDownOpengl(long mFlags, short x, short y)
{
if (!m_lBtnDown)
{
xOriginRot = xRot;
yOriginRot = yRot;
zOriginRot = zRot;
m_lBtnDown = true;
startPoint = CPoint(x,y);
}
}
void CSubdivDlg::OnRadioRenderEdge()
{
UpdateData();
Invalidate(false);
}
void CSubdivDlg::OnRadioRenderFace()
{
UpdateData();
Invalidate(false);
}
void CSubdivDlg::OnRadioRenderVertex()
{
UpdateData();
Invalidate(false);
}
void CSubdivDlg::OnButtonDump()
{
if(m_blMeshReady)
m_meshs[m_nowMeshIdx]->dump();
}
void CSubdivDlg::OnButtonCatmull()
{
Mesh *pNewMesh;
if(m_blMeshReady)
{
startTimeCount();
pNewMesh = m_meshs[m_nowMeshIdx]->calcCatmallSubdivMesh();
EndTimeCout();
if(pNewMesh)
{
clearMeshHistory(m_nowMeshIdx+1); // clear all history after now mesh
m_meshs.push_back(pNewMesh);
m_nowMeshIdx ++;
}
}
// pMesh->reset();
// delete pMesh;
/*
while( m_nowMeshIdx < m_meshs.size() - 1 )
{
m_meshs[m_meshs.size() - 1]->reset();
delete m_meshs[m_meshs.size() - 1];
m_meshs.pop_back();
}
*/
CButton *bb = (CButton *)GetDlgItem(IDC_BUTTON_BACK);
bb->EnableWindow(TRUE);
bb = (CButton *)GetDlgItem(IDC_BUTTON_FORWARD);
bb->EnableWindow(FALSE);
Invalidate(false);
}
void CSubdivDlg::OnButtonDoosabin()
{
Mesh *pNewMesh;
if(m_blMeshReady)
{
startTimeCount();
pNewMesh = m_meshs[m_nowMeshIdx]->calcDooSabinSubdivMesh();
EndTimeCout();
if(pNewMesh)
{
clearMeshHistory(m_nowMeshIdx+1); // clear all history after now mesh
m_meshs.push_back(pNewMesh);
m_nowMeshIdx ++;
}
}
CButton *bb = (CButton *)GetDlgItem(IDC_BUTTON_BACK);
bb->EnableWindow(TRUE);
bb = (CButton *)GetDlgItem(IDC_BUTTON_FORWARD);
bb->EnableWindow(FALSE);
Invalidate(false);
}
void CSubdivDlg::OnButtonSqrt3()
{
Mesh *pNewMesh;
if(m_blMeshReady)
{
startTimeCount();
pNewMesh = m_meshs[m_nowMeshIdx]->calcsqrt3SubdivMesh(m_divBeforesqrt3);
EndTimeCout();
if(pNewMesh)
{
clearMeshHistory(m_nowMeshIdx+1); // clear all history after now mesh
m_meshs.push_back(pNewMesh);
m_nowMeshIdx ++;
}
}
CButton *bb = (CButton *)GetDlgItem(IDC_BUTTON_BACK);
bb->EnableWindow(TRUE);
bb = (CButton *)GetDlgItem(IDC_BUTTON_FORWARD);
bb->EnableWindow(FALSE);
Invalidate(false);
}
void CSubdivDlg::OnButtonSaveobj()
{
CFileDialog fd(FALSE,".obj",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"文件(*.obj)|*.obj|所有文件(*.*)|*.*||",NULL);
if (fd.DoModal() == IDCANCEL)
return;
if( m_blMeshReady )
m_meshs[m_nowMeshIdx]->saveObjFile(fd.GetPathName());
}
void CSubdivDlg::OnButtonQuit()
{
// TODO: Add your control notification handler code here
OnOK();
}
void CSubdivDlg::OnButtonBack()
{
if( m_nowMeshIdx > 0)
m_nowMeshIdx --;
if( m_nowMeshIdx == 0 )
{
CButton *bb = (CButton *)GetDlgItem(IDC_BUTTON_BACK);
bb->EnableWindow(FALSE);
}
if(m_nowMeshIdx < m_meshs.size() - 1)
{
CButton *bb = (CButton *)GetDlgItem(IDC_BUTTON_FORWARD);
bb->EnableWindow(TRUE);
}
Invalidate(false);
}
void CSubdivDlg::OnButtonForward()
{
if( m_nowMeshIdx < m_meshs.size() - 1)
m_nowMeshIdx ++;
if(m_nowMeshIdx >= m_meshs.size() - 1)
{
CButton *bb = (CButton *)GetDlgItem(IDC_BUTTON_FORWARD);
bb->EnableWindow(FALSE);
}
if( m_nowMeshIdx > 0 )
{
CButton *bb = (CButton *)GetDlgItem(IDC_BUTTON_BACK);
bb->EnableWindow(TRUE);
}
Invalidate(false);
}
void CSubdivDlg::clearMeshHistory(int startj)
{
for( int i = m_meshs.size() - 1; i >= startj; i -- )
{
m_meshs[i]->reset();
delete m_meshs[i];
m_meshs.pop_back();//删除原网格
}
}
long HighStart,LowStart,HighEnd,LowEnd;
long numhigh,numlow;
void CSubdivDlg::startTimeCount()
{
//获取代码运行开始时cpu内部计数器的值
__asm
{
RDTSC
mov HighStart, edx
mov LowStart, eax
}
}
void CSubdivDlg::EndTimeCout()
{
__asm
{
RDTSC
mov HighEnd, edx
Mov LowEnd, eax
;//获取两次计数器值得差
sub eax, LowStart
cmp eax, 0 ; //如果低32的差为负则求返,因为第二次取得永远比第一次的大
jg L1
neg eax
jmp L2
L1: mov numlow, eax
L2: sbb edx, HighStart
mov numhigh, edx
}
//把两个计数器值之差放在一个64位的整形变量中
//先把高32位左移32位放在64的整形变量中,然后再加上低32位
__int64 timer =(numhigh<<32) + numlow;
//输出代码段运行的时钟周期数
//以频率2.0Gcpu为例,如果换计算机把其中的2.0改其它即可
cout<< "Run Time: " << (double) (timer /2.0/1000000000) << endl;
}
void CSubdivDlg::OnButtonLoop()
{
Mesh *pNewMesh;
if(m_blMeshReady)
{
startTimeCount();
pNewMesh = m_meshs[m_nowMeshIdx]->calcLoopSubdivMesh(m_divBeforeLoop);
//细分后的网格赋给pNewMesh
EndTimeCout();
if(pNewMesh)
{
clearMeshHistory(m_nowMeshIdx+1); // clear all history after now mesh
m_meshs.push_back(pNewMesh);
m_nowMeshIdx ++;
}
}
CButton *bb = (CButton *)GetDlgItem(IDC_BUTTON_BACK);
bb->EnableWindow(TRUE);
bb = (CButton *)GetDlgItem(IDC_BUTTON_FORWARD);
bb->EnableWindow(FALSE);
Invalidate(false);
}
BOOL CSubdivDlg::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style = WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
return CDialog::PreCreateWindow(cs);
}
BOOL CSubdivDlg::DestroyWindow()
{
// TODO: Add your specialized code here and/or call the base class
return CDialog::DestroyWindow();
}
void CSubdivDlg::OnDestroy()
{
CDialog::OnDestroy();
wglMakeCurrent(NULL,NULL);
wglDeleteContext(m_hRC);
}
void CSubdivDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
OnReSizeOpengl(cx,cy);
// TODO: Add your message handler code here
}
void CSubdivDlg::OnMouseMove(UINT nFlags, CPoint point)
{
OnLMouseMoveOpengl(point.x, point.y);
CDialog::OnMouseMove(nFlags, point);
}
int CSubdivDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
PIXELFORMATDESCRIPTOR pfd =
{
sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd
1, // version number
PFD_DRAW_TO_WINDOW | // support window
PFD_SUPPORT_OPENGL | // support OpenGL
PFD_DOUBLEBUFFER, // double buffered
PFD_TYPE_RGBA, // RGBA type
24, // 24-bit color depth
0, 0, 0, 0, 0, 0, // color bits ignored
0, // no alpha buffer
0, // shift bit ignored
0, // no accumulation buffer
0, 0, 0, 0, // accum bits ignored
16, // 16-bit z-buffer
0, // no stencil buffer
0, // no auxiliary buffer
PFD_MAIN_PLANE, // main layer
0, // reserved
0, 0, 0 // layer masks ignored
};
int pixelformat;
m_hDC = GetDC()->GetSafeHdc();
if ( (pixelformat = ChoosePixelFormat(m_hDC, &pfd)) == 0 )
{
MessageBox("在该DC上找不到与pfd接近的位图结构");
return -1;
}
if (SetPixelFormat(m_hDC, pixelformat, &pfd) == FALSE)
{
MessageBox("无法在该DC上设置位图结构");
return -1;
}
m_hRC = wglCreateContext(m_hDC);
return 0;
}
void CSubdivDlg::OnLButtonDblClk(UINT nFlags, CPoint point)
{
OnLButtonDblClkOpengl(nFlags, point.x, point.y);
CDialog::OnLButtonDblClk(nFlags, point);
}
void CSubdivDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
OnLButtonDownOpengl(nFlags, point.x, point.y);
CDialog::OnLButtonDown(nFlags, point);
}
void CSubdivDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
OnLButtonUpOpengl(nFlags, point.x, point.y);
CDialog::OnLButtonUp(nFlags, point);
}
void CSubdivDlg::OnRButtonDown(UINT nFlags, CPoint point)
{
OnRButtonDownOpengl(nFlags, point.x, point.y);
CDialog::OnRButtonDown(nFlags, point);
}
void CSubdivDlg::OnRButtonUp(UINT nFlags, CPoint point)
{
OnRButtonUpOpengl(nFlags, point.x, point.y);
CDialog::OnRButtonUp(nFlags, point);
}
BOOL CSubdivDlg::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
OnLMouseWheelOpengl(zDelta, pt);
return CDialog::OnMouseWheel(nFlags, zDelta, pt);
}
void CSubdivDlg::OnButtonZoomin()
{
zoom *= 1.1;
Invalidate(false);
}
void CSubdivDlg::OnButtonZoomout()
{
zoom *= 0.9;
Invalidate(false);
}
void CSubdivDlg::OnCheckDivloop()
{
//UpdateData(false);
UpdateData(true);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?