📄 复件 subdivdlg.cpp
字号:
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 + -