📄 nonamedlg.cpp
字号:
PIXELFORMATDESCRIPTOR pixelDesc;
pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pixelDesc.nVersion = 1;
pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER |
PFD_STEREO_DONTCARE;
pixelDesc.iPixelType = PFD_TYPE_RGBA;
pixelDesc.cColorBits = 32;
pixelDesc.cRedBits = 8;
pixelDesc.cRedShift = 16;
pixelDesc.cGreenBits = 8;
pixelDesc.cGreenShift = 8;
pixelDesc.cBlueBits = 8;
pixelDesc.cBlueShift = 0;
pixelDesc.cAlphaBits = 0;
pixelDesc.cAlphaShift = 0;
pixelDesc.cAccumBits = 64;
pixelDesc.cAccumRedBits = 16;
pixelDesc.cAccumGreenBits = 16;
pixelDesc.cAccumBlueBits = 16;
pixelDesc.cAccumAlphaBits = 0;
pixelDesc.cDepthBits = 32;
pixelDesc.cStencilBits = 8;
pixelDesc.cAuxBuffers = 0;
pixelDesc.iLayerType = PFD_MAIN_PLANE;
pixelDesc.bReserved = 0;
pixelDesc.dwLayerMask = 0;
pixelDesc.dwVisibleMask = 0;
pixelDesc.dwDamageMask = 0;
m_GLPixelIndex = ChoosePixelFormat(hDC,&pixelDesc);
if(m_GLPixelIndex==0) // Choose default
{
m_GLPixelIndex = 1;
if(DescribePixelFormat(hDC,m_GLPixelIndex,
sizeof(PIXELFORMATDESCRIPTOR),&pixelDesc)==0)
{
return FALSE;
}
}
if(SetPixelFormat(hDC,m_GLPixelIndex,&pixelDesc)==FALSE)
{
return FALSE;
}
return TRUE;
}
BOOL CNoNameDlg::CreateViewGLContext(HDC hDC)
{
m_hGLContext = wglCreateContext(hDC);
if(m_hGLContext==NULL)
return FALSE;
if(wglMakeCurrent(hDC,m_hGLContext)==FALSE)
return FALSE;
return TRUE;
}
void CNoNameDlg::OnDestroy()
{
CDialog::OnDestroy();
if(wglGetCurrentContext() != NULL)
wglMakeCurrent(NULL,NULL);
if(m_hGLContext != NULL)
{
wglDeleteContext(m_hGLContext);
m_hGLContext = NULL;
}
}
void CNoNameDlg::OnTimer(UINT nIDEvent)
{
// m_yRotate -= 3;
// m_xRotate -= 2;
switch(TranslateChoice)
{
case 1:
if(Dirction==1)
{
Eye_x+=0.1;
}
else
{
Eye_x-=0.1;
}
break;
case 2:
if(Dirction==1)
{
Eye_y+=0.1;
}
else
{
Eye_y-=0.1;
}
break;
case 3:
if(Dirction==1)
{
Eye_z-=0.2;
View_z-=0.1;
}
else
{
if(View_z>0)
{
break;
}
Eye_z+=0.2;
View_z+=0.1;
}
break;
}
InvalidateRect(NULL,FALSE);
CDialog::OnTimer(nIDEvent);
}
void CNoNameDlg::RenderScene()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
CPrimitive* temp=NULL;
glPolygonMode(GL_FRONT,GL_FILL);
glPolygonMode(GL_BACK,GL_FILL);
for(int i=0;i<tracer->GetScene()->GetNrPrimitives();i++)
{
glLoadIdentity();
glPushMatrix();
glTranslated(0.0,0.0,-15.0);
//glRotated(45.0, 1.0, 1.0, 1.0);
glScalef(0.4,0.4,0.4);
temp=tracer->GetScene()->GetPrimitive(i);
if(temp->GetType()==CPrimitive::SPHERE)//表示球
{
Color Spherecolor=temp->GetColor();
double red=Spherecolor.r;
double green=Spherecolor.g;
double blue=Spherecolor.b;
glColor3d(red,green,blue);
CVector3 Centre=((CSphere*)temp)->GetCentre();
glTranslated(Centre.x,Centre.y,-Centre.z);
float r=((CSphere*)temp)->GetRadius();
glutSolidSphere(r, 20 ,20);
}
glEnd();
}
//draw plane
glLoadIdentity();
glPushMatrix();
glTranslated(0.0,0.0,-15.0);
glScalef(0.4,0.4,0.4);
::glCallList(2);
glEnd();
//draw eye
glLoadIdentity();
glPushMatrix();
glTranslated(0.0,0.0,-10.0);
glTranslated(Eye_x,Eye_y,Eye_z);
glRotated(45.0, 0.0, 1.0, 0.0);
glScalef(0.4,0.4,0.4);
::glCallList(3);
glEnd();
}
void CNoNameDlg::BuildList_Flat()
{
::glNewList(2,GL_COMPILE_AND_EXECUTE);
glShadeModel(GL_SMOOTH);
float xt = 5.0f;
// ground plane 0, 1, 0
glBegin(GL_POLYGON);
glNormal3d(0.0,0.0,1.0);
glColor3ub(255,0,0);
glVertex3d( -20.0, -4.4, 20.0);
glVertex3d( 20.0, -4.4, 20.0);
glVertex3d(20.0, -4.4, -20.0);
glVertex3d(-20.0, -4.4, -20.0);
glEnd();
// back plane 0.0f, 0, -1
glBegin(GL_POLYGON);
glNormal3d(0.0,0.0,1.0);
glColor3ub(125,100,125);
glVertex3d( -20.0, 7.4,-20);
glVertex3d( 20.0, 7.4,-20);
glVertex3d(20.0, -4.4,-20);
glVertex3d(-20.0, -4.4,-20);
glEnd();
// ceiling plane 0, -1, 0
glBegin(GL_POLYGON);
glNormal3d(0.0,0.0,1.0);
glColor3ub(0,0,255);
glVertex3d( -20.0, 7.4, 20.0);
glColor3ub(125,125,125);
glVertex3d( 20.0, 7.4, 20.0);
glColor3ub(125,125,125);
glVertex3d(20.0, 7.4, -20.0);
glColor3ub(125,125,125);
glVertex3d(-20.0, 7.4, -20.0);
glEnd();
::glEndList();
}
void CNoNameDlg::OnContextMenu(CWnd* pWnd, CPoint point)
{
if (point.x == -1 && point.y == -1){
//keystroke invocation
CRect rect;
GetClientRect(rect);
ClientToScreen(rect);
point = rect.TopLeft();
point.Offset(5, 5);
}
CMenu menu;
VERIFY(menu.LoadMenu(IDR_MENU_Operation));
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(pPopup != NULL);
CWnd* pWndPopupOwner = this;
while (pWndPopupOwner->GetStyle() & WS_CHILD)
pWndPopupOwner = pWndPopupOwner->GetParent();
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
pWndPopupOwner);
}
void CNoNameDlg::BuildList_Eye()
{
::glNewList(3,GL_COMPILE_AND_EXECUTE);
glShadeModel(GL_SMOOTH);
glColor3ub(0,0,255);
glutSolidSphere(0.2, 20 ,20);
glPolygonMode(GL_FRONT,GL_LINE );
glPolygonMode(GL_BACK,GL_LINE );
glBegin(GL_POLYGON);
glColor3ub(255,0,0);
glVertex3d( 0.0, 0.0, 0.0);
glVertex3d( 1.0, 0.0, 0.0);
glColor3ub(0,255,0);
glVertex3d( 0.0, 0.0, 0.0);
glVertex3d( 0.0, 1.0, 0.0);
glColor3ub(0,0,255);
glVertex3d( 0.0, 0.0, 0.0);
glVertex3d( 0.0, 0.0, -1.0);
glEnd();
::glEndList();
}
void CNoNameDlg::OnTracedPicture()
{
surface = new CSurface( SCRWIDTH, SCRHEIGHT );
buffer = surface->GetBuffer();
surface->Clear();
tracer->SetTarget( surface->GetBuffer(), SCRWIDTH, SCRHEIGHT );
tracer->InitRender();
tracer->GetViewPoint(CVector3(Eye_x,Eye_y,View_z));
tracer->Render();
ShowPic.LoadOriPixel(buffer);
ShowPic.DoModal();
}
void CNoNameDlg::OnAddSphere()
{
(tracer->GetScene())->AddScene(1);
RenderScene();
Invalidate(NULL);
}
void CNoNameDlg::OnDeleteObject()
{
// TODO: Add your command handler code here
(tracer->GetScene())->DeleteLastObject();
}
void CNoNameDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
// MessageBox("hah");
switch(nChar)
{
case 83 :
// MessageBox("down");
TranslateChoice=2;
Dirction=-1;
break;
case 87 :
// MessageBox("up");
TranslateChoice=2;
Dirction=1;
break;
case 65:
// MessageBox("left");
TranslateChoice=1;
Dirction=-1;
break;
case 68 :
// MessageBox("right");
TranslateChoice=1;
Dirction=1;
break;
case 74 ://'j'
// MessageBox("j");
TranslateChoice=3;
Dirction=1;
break;
case 75://'k'
// MessageBox("k");
TranslateChoice=3;
Dirction=-1;
break;
}
SetTimer(0,20,NULL);
CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}
void CNoNameDlg::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
KillTimer(0);
CDialog::OnKeyUp(nChar, nRepCnt, nFlags);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -