⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 复件 subdivdlg.cpp

📁 此代码主要用于汽车车身的优化
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	ON_EVENT(CSubdivDlg, IDC_OPENGLACTIVEXCTRL1, 2 /* InitOpenGL */, OnInitOpenGL, VTS_NONE)
	ON_EVENT(CSubdivDlg, IDC_OPENGLACTIVEXCTRL1, 3 /* LButtonUp */, OnLButtonUpOpengl, VTS_I4 VTS_I2 VTS_I2)
	ON_EVENT(CSubdivDlg, IDC_OPENGLACTIVEXCTRL1, 4 /* ReDraw */, OnReDrawOpengl, VTS_NONE)
	ON_EVENT(CSubdivDlg, IDC_OPENGLACTIVEXCTRL1, 5 /* ReSize */, OnReSizeOpengl, VTS_I2 VTS_I2)
	ON_EVENT(CSubdivDlg, IDC_OPENGLACTIVEXCTRL1, 6 /* LMouseMove */, OnLMouseMoveOpengl, VTS_I2 VTS_I2)
	ON_EVENT(CSubdivDlg, IDC_OPENGLACTIVEXCTRL1, 1 /* LButtonDown */, OnLButtonDownOpengl, VTS_I4 VTS_I2 VTS_I2)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

void CSubdivDlg::OnInitOpenGL() 
{
	// 设置深度检测函数
	glDepthFunc(GL_LESS);
	glEnable(GL_DEPTH_TEST);

	glClearColor(1,1,1,1);
	glClearDepth(1.0f);
}

void CSubdivDlg::OnLButtonUpOpengl(long m_Flags, short x, short y) 
{
	// TODO: Add your control notification handler code here
	
}

void CSubdivDlg::OnReDrawOpengl() 
{
//	MessageBox("OnRedrawOpengl");
	// 清除颜色和深度缓存
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glLoadIdentity();
	gluLookAt(10,10,10, 0,0,0,0, 1, 0);	// 摄像头上方向:y轴
//	gluLookAt(10,10,10, 0,0,0,0, 1, 0);	// 摄像头上方向:y轴
//	glColor3f(0,0,0);

	float
		mat_specular  []={ .3f, .3f, .3f, 1.0 },
		mat_shininess []={ 100.f },
		light0_pos    []={ -3, 3, 3, 0 },
		lmodel_ambient[] = {0.2, 0.2, 0.2, 1.0};

	glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
	glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);
//
	glLightfv(GL_LIGHT0, GL_POSITION, light0_pos);

	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);
	glEnable(GL_DEPTH_TEST);
	glEnable(GL_NORMALIZE);
	glEnable(GL_COLOR_MATERIAL);

	glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
	glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
	glDisable(GL_CULL_FACE);
	glClearColor(0, 0, 0, 0);

	/*
	GLfloat light_position[3] = { -1, -1, -1 };
	GLfloat  GreenSurface[]	= {  0.f,  1.0f,  1.0f,  0.0f};  
//	glMatrixMode(GL_PROJECTION);  
//	glLoadIdentity();  
//	glOrtho(-m_wid/2 * zoom,m_wid/2 * zoom,-m_hei/2 * zoom,m_hei/2 * zoom,-100,100);
	// 使用glScalef会导致光强变暗

//	glMatrixMode(GL_MODELVIEW);  
//	glLoadIdentity(); 
	//  glClearDepth(1.0f);  
	//	glClearColor(0.0f,  0.0f,  0.0f,  0.0f);	// BLACK BG

	glLightfv(GL_LIGHT0,GL_POSITION,light_position);  
	glEnable(GL_LIGHTING);  
	glEnable(GL_LIGHT0);  
//	glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR,  GreenSurface);  
	glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT,  GreenSurface);  
	glLineWidth(1.0f); 
*/

	glPushMatrix();
	glRotatef(xRot, 1.0f, 0.0f, 0.0f);
	glRotatef(yRot, 0.0f, 1.0f, 0.0f);
	glRotatef(zRot, 0.0f, 0.0f, 1.0f);
//	auxWireBox(3,3,5);
	// mesh draw here
	if( m_blMeshReady )
		m_meshs[m_nowMeshIdx]->render(m_renderType);
	
	glPopMatrix();

	SwapBuffers(::wglGetCurrentDC());	// 与当前rc相连的dc
}

void CSubdivDlg::OnReSizeOpengl(short cx, short cy) 
{
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();	
	if (m_projMode == 0)
		glFrustum(-3,3,-3,3,4,30);
	else
		glOrtho(-3,3,-3,3,4,30);

	glMatrixMode(GL_MODELVIEW);
	glViewport(0,0,cx,cy);
	glShadeModel(GL_FLAT);

	
	// Set OpenGL perspective, viewport and mode
//	m_winWidth = cx;
//	m_winHeight = cy;
/*	float m_aspect = (float)cx / (cy > 1? cy : 1);
	// 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) 
{
	yRot = x;
	zRot = y;
	m_opengl.Invalidate(FALSE);	// not clear the bg
}

void CSubdivDlg::OnLButtonDownOpengl(long mFlags, short x, short y) 
{
	// TODO: Add your control notification handler code here
	
}

void CSubdivDlg::OnRadioRenderEdge() 
{
	UpdateData();
	m_opengl.Invalidate();
}

void CSubdivDlg::OnRadioRenderFace() 
{
	UpdateData();
	m_opengl.Invalidate();
}

void CSubdivDlg::OnRadioRenderVertex() 
{
	UpdateData();
	m_opengl.Invalidate();

}

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

void CSubdivDlg::OnButtonDoosabin() 
{
	Mesh *pNewMesh;
	if(m_blMeshReady)
	{
		startTimeCount();
		pNewMesh = m_meshs[m_nowMeshIdx]->calcDoosabinSubdivMesh();
		EndTimeCout();
		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();
}

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

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

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; 

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -