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 + -
显示快捷键?