CCube0Dlgクラス設定編 |
ヘッダーファイル"Cube0Dlg.h"編 |
void Idle(); void Init(); void Draw(); CClientDC* m_pDC; HGLRC m_hRC; double anglex, angley, anglez; double camerax, cameray, cameraz;
ソースファイル"Cube0Dlg.cpp"編 |
m_pDC = NULL; anglex = 0.0; angley = 0.0; anglez = 150; camerax = 0.0; cameray = 0.0; cameraz = -10.0;
BOOL CCube0Dlg::PreCreateWindow(CREATESTRUCT& cs) { cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN; return CDialog::PreCreateWindow(cs); }
void CCube0Dlg::PostNcDestroy() { wglMakeCurrent(0, 0); wglDeleteContext(m_hRC); CDialog::PostNcDestroy(); delete this; }
void CCube0Dlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); if (cx && cy) glViewport(0, 0, cx, cy); }
void CCube0Dlg::OnClose() { CDialog::OnClose(); DestroyWindow(); }
void CCube0Dlg::OnDestroy() { CDialog::OnDestroy(); if (m_pDC) delete m_pDC; }
void CCube0Dlg::Idle() { if (GetAsyncKeyState(VK_LEFT)) anglex -= 2.0; if (GetAsyncKeyState(VK_RIGHT)) anglex += 2.0; if (GetAsyncKeyState(VK_UP)) anglez -= 2.0; if (GetAsyncKeyState(VK_DOWN)) anglez += 2.0; if (GetAsyncKeyState(VK_NEXT)) cameraz -= 0.5; if (GetAsyncKeyState(VK_PRIOR)) cameraz += 0.5; Draw(); Sleep(10); }
void CCube0Dlg::Init() { // CTopAppのOnIdle用にビューへのポインタを設定 ((CCube0App*)AfxGetApp())->pView = this; if (m_hRC) { wglMakeCurrent(0, 0); wglDeleteContext(m_hRC); m_hRC = NULL; } if (m_pDC) delete m_pDC; m_pDC = new CClientDC(this); static PIXELFORMATDESCRIPTOR pfd = { sizeof (PIXELFORMATDESCRIPTOR), // strcut size 1, // Version number PFD_DRAW_TO_WINDOW | // Flags, draw to a window, PFD_SUPPORT_OPENGL | // use OpenGL PFD_DOUBLEBUFFER, // use OpenGL PFD_TYPE_RGBA, // RGBA pixel values 24, // 24-bit color 0, 0, 0, // RGB bits & shift sizes. 0, 0, 0, // Don't care about them 0, 0, // No alpha buffer info 0, 0, 0, 0, 0, // No accumulation buffer 32, // 32-bit depth buffer 0, // No stencil buffer 0, // No auxiliary buffers PFD_MAIN_PLANE, // Layer type 0, // Reserved (must be 0) 0, // No layer mask 0, // No visible mask 0 // No damage mask }; int nMyPixelFormatID; nMyPixelFormatID = ChoosePixelFormat( m_pDC->GetSafeHdc(), &pfd ); SetPixelFormat( m_pDC->GetSafeHdc(), nMyPixelFormatID, &pfd ); m_hRC = wglCreateContext(m_pDC->GetSafeHdc()); if (!m_hRC) { AfxMessageBox("OpenGLの初期化に失敗しました"); exit(1); } wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC); glClearColor(1.0f, 1.0f, 1.0f, 1.0f) ; // ビュー設定 glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(40, 1, 0.1, 200); /// Zバッファー(デプス・バッファー)の有効化 glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); //// 光源の有効化と色をセット //// 光源は、たいていLIGHT0 からLIGHT7まで使えます //// 使う光源は、glEnableで有効化してやります glEnable(GL_LIGHTING) ; // Enable lighting glEnable(GL_LIGHT0) ; // Light0 ON }
void CCube0Dlg::Draw() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) ; // カメラセット glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslated(camerax, cameray, cameraz); glRotated(anglez, 1, 0, 0); glRotated(anglex, 0, 0, 1); // オプジェクトセット glBegin(GL_QUADS); /// Z軸に垂直な面 glMaterialfv(GL_FRONT,GL_AMBIENT,red); glNormal3f(0,0,1); glVertex3f(-1,-1,1); glVertex3f( 1,-1,1); glVertex3f( 1, 1,1); glVertex3f(-1, 1,1); glNormal3f(0,0,-1); glVertex3f(-1,-1,-1); glVertex3f( 1,-1,-1); glVertex3f( 1, 1,-1); glVertex3f(-1, 1,-1); /// X軸に垂直な面 glMaterialfv(GL_FRONT,GL_AMBIENT,green); glNormal3f(1,0,0); glVertex3f(1,-1, 1); glVertex3f(1, 1, 1); glVertex3f(1, 1,-1); glVertex3f(1,-1,-1); glNormal3f(-1,0,0); glVertex3f(-1,-1, 1); glVertex3f(-1, 1, 1); glVertex3f(-1, 1,-1); glVertex3f(-1,-1,-1); /// Y軸に垂直な面 glMaterialfv(GL_FRONT,GL_AMBIENT,blue); glNormal3f(0,1,0); glVertex3f(-1, 1, 1); glVertex3f( 1, 1, 1); glVertex3f( 1, 1,-1); glVertex3f(-1, 1,-1); glNormal3f(0,-1,0); glVertex3f(-1,-1, 1); glVertex3f( 1,-1, 1); glVertex3f( 1,-1,-1); glVertex3f(-1,-1,-1); glEnd(); glFinish(); SwapBuffers(m_pDC->GetSafeHdc()); }