Cześć.
Przerabiam książkę OpenGL Programowanie Gier. Potrzebuję skonfigurować projekt dla OpenGL glaux tak żeby móc uruchomić poniższy kod:
#define WIN32_LEAN_AND_MEAN #include <windows.h> #include <GL/gl.h> #include <GL/glu.h> #include <GL/glaux.h> float angle = 0.0f; HDC g_HDC; bool fullScreen = false;
float legAngle[ 2 ] = { 0.0f, 0.0f }; float armAngle[ 2 ] = { 0.0f, 0.0f };
void DrawCube( float xPos, float yPos, float zPos )
{
glPushMatrix();
glTranslatef( xPos, yPos, zPos );
glBegin( GL_POLYGON );
glVertex3f( 0.0f, 0.0f, 0.0f ); glVertex3f( 0.0f, 0.0f, - 1.0f );
glVertex3f( - 1.0f, 0.0f, - 1.0f );
glVertex3f( - 1.0f, 0.0f, 0.0f );
glVertex3f( 0.0f, 0.0f, 0.0f ); glVertex3f( - 1.0f, 0.0f, 0.0f );
glVertex3f( - 1.0f, - 1.0f, 0.0f );
glVertex3f( 0.0f, - 1.0f, 0.0f );
glVertex3f( 0.0f, 0.0f, 0.0f ); glVertex3f( 0.0f, - 1.0f, 0.0f );
glVertex3f( 0.0f, - 1.0f, - 1.0f );
glVertex3f( 0.0f, 0.0f, - 1.0f );
glVertex3f( - 1.0f, 0.0f, 0.0f ); glVertex3f( - 1.0f, 0.0f, - 1.0f );
glVertex3f( - 1.0f, - 1.0f, - 1.0f );
glVertex3f( - 1.0f, - 1.0f, 0.0f );
glVertex3f( 0.0f, 0.0f, 0.0f ); glVertex3f( 0.0f, - 1.0f, - 1.0f );
glVertex3f( - 1.0f, - 1.0f, - 1.0f );
glVertex3f( - 1.0f, - 1.0f, 0.0f );
glVertex3f( 0.0f, 0.0f, 0.0f ); glVertex3f( - 1.0f, 0.0f, - 1.0f );
glVertex3f( - 1.0f, - 1.0f, - 1.0f );
glVertex3f( 0.0f, - 1.0f, - 1.0f );
glEnd();
glPopMatrix();
}
void DrawArm( float xPos, float yPos, float zPos )
{
glPushMatrix();
glColor3f( 1.0f, 0.0f, 0.0f ); glTranslatef( xPos, yPos, zPos );
glScalef( 1.0f, 4.0f, 1.0f ); DrawCube( 0.0f, 0.0f, 0.0f );
glPopMatrix();
}
void DrawHead( float xPos, float yPos, float zPos )
{
glPushMatrix();
glColor3f( 1.0f, 1.0f, 1.0f ); glTranslatef( xPos, yPos, zPos );
glScalef( 2.0f, 2.0f, 2.0f ); DrawCube( 0.0f, 0.0f, 0.0f );
glPopMatrix();
}
void DrawTorso( float xPos, float yPos, float zPos )
{
glPushMatrix();
glColor3f( 0.0f, 0.0f, 1.0f ); glTranslatef( xPos, yPos, zPos );
glScalef( 3.0f, 5.0f, 2.0f ); DrawCube( 0.0f, 0.0f, 0.0f );
glPopMatrix();
}
void DrawLeg( float xPos, float yPos, float zPos )
{
glPushMatrix();
glColor3f( 1.0f, 1.0f, 0.0f ); glTranslatef( xPos, yPos, zPos );
glScalef( 1.0f, 5.0f, 1.0f ); DrawCube( 0.0f, 0.0f, 0.0f );
glPopMatrix();
}
void DrawRobot( float xPos, float yPos, float zPos )
{
static bool leg1 = true; static bool leg2 = false; static bool arm1 = true;
static bool arm2 = false;
glPushMatrix();
glTranslatef( xPos, yPos, zPos ); DrawHead( 1.0f, 2.0f, 0.0f );
DrawTorso( 1.5f, 0.0f, 0.0f );
glPushMatrix();
if( arm1 )
armAngle[ 0 ] = armAngle[ 0 ] + 0.1f;
else
armAngle[ 0 ] = armAngle[ 0 ] - 0.1f;
if( armAngle[ 0 ] >= 15.0f )
arm1 = false;
if( armAngle[ 0 ] <= - 15.0f )
arm1 = true;
glTranslatef( 0.0f, - 0.5f, 0.0f );
glRotatef( armAngle[ 0 ], 1.0f, 0.0f, 0.0f );
DrawArm( 2.5f, 0.0f, - 0.5f );
glPopMatrix();
glPushMatrix();
if( arm2 )
armAngle[ 1 ] = armAngle[ 1 ] + 0.1f;
else
armAngle[ 1 ] = armAngle[ 1 ] - 0.1f;
if( armAngle[ 1 ] >= 15.0f )
arm2 = false;
if( armAngle[ 1 ] <= - 15.0f )
arm2 = true;
glTranslatef( 0.0f, - 0.5f, 0.0f );
glRotatef( armAngle[ 1 ], 1.0f, 0.0f, 0.0f );
DrawArm( - 1.5f, 0.0f, - 0.5f );
glPopMatrix();
glPushMatrix();
if( leg1 )
legAngle[ 0 ] = legAngle[ 0 ] + 0.1f;
else
legAngle[ 0 ] = legAngle[ 0 ] - 0.1f;
if( legAngle[ 0 ] >= 15.0f )
leg1 = false;
if( legAngle[ 0 ] <= - 15.0f )
leg1 = true;
glTranslatef( 0.0f, - 0.5f, 0.0f );
glRotatef( legAngle[ 0 ], 1.0f, 0.0f, 0.0f );
DrawLeg( - 0.5f, - 5.0f, - 0.5f );
glPopMatrix();
glPushMatrix();
if( leg2 )
legAngle[ 1 ] = legAngle[ 1 ] + 0.1f;
else
legAngle[ 1 ] = legAngle[ 1 ] - 0.1f;
if( legAngle[ 1 ] >= 15.0f )
leg2 = false;
if( legAngle[ 1 ] <= - 15.0f )
leg2 = true;
glTranslatef( 0.0f, - 0.5f, 0.0f );
glRotatef( legAngle[ 1 ], 1.0f, 0.0f, 0.0f );
DrawLeg( 1.5f, - 5.0f, - 0.5f );
glPopMatrix();
glPopMatrix();
}
void Render()
{
glEnable( GL_DEPTH_TEST ); glClearColor( 0.0f, 0.0f, 0.0f, 0.0f ); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glLoadIdentity(); angle = angle + 0.05f; if( angle >= 360.0f ) angle = 0.0f;
glPushMatrix(); glLoadIdentity(); glTranslatef( 0.0f, 0.0f, - 30.0f ); glRotatef( angle, 0.0f, 1.0f, 0.0f ); DrawRobot( 0.0f, 0.0f, 0.0f ); glPopMatrix(); glFlush();
SwapBuffers( g_HDC ); }
void SetupPixelFormat( HDC hDC )
{
int nPixelFormat; static PIXELFORMATDESCRIPTOR pfd = {
sizeof( PIXELFORMATDESCRIPTOR ), 1, PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, PFD_TYPE_RGBA, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0 }; nPixelFormat = ChoosePixelFormat( hDC, & pfd ); SetPixelFormat( hDC, nPixelFormat, & pfd ); }
LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
static HGLRC hRC; static HDC hDC; int width, height; switch( message )
{
case WM_CREATE: hDC = GetDC( hwnd ); g_HDC = hDC;
SetupPixelFormat( hDC ); hRC = wglCreateContext( hDC );
wglMakeCurrent( hDC, hRC );
return 0;
break;
case WM_CLOSE: wglMakeCurrent( hDC, NULL );
wglDeleteContext( hRC );
PostQuitMessage( 0 );
return 0;
break;
case WM_SIZE:
height = HIWORD( lParam ); width = LOWORD( lParam );
if( height == 0 ) {
height = 1;
}
glViewport( 0, 0, width, height ); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); gluPerspective( 54.0f,( GLfloat ) width /( GLfloat ) height, 1.0f, 1000.0f );
glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); return 0;
break;
default:
break;
}
return( DefWindowProc( hwnd, message, wParam, lParam ) );
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
WNDCLASSEX windowClass; HWND hwnd; MSG msg; bool done; DWORD dwExStyle; DWORD dwStyle; RECT windowRect;
int width = 800;
int height = 600;
int bits = 32;
windowRect.left =( long ) 0; windowRect.right =( long ) width;
windowRect.top =( long ) 0;
windowRect.bottom =( long ) height;
windowClass.cbSize = sizeof( WNDCLASSEX );
windowClass.style = CS_HREDRAW | CS_VREDRAW;
windowClass.lpfnWndProc = WndProc;
windowClass.cbClsExtra = 0;
windowClass.cbWndExtra = 0;
windowClass.hInstance = hInstance;
windowClass.hIcon = LoadIcon( NULL, IDI_APPLICATION ); windowClass.hCursor = LoadCursor( NULL, IDC_ARROW ); windowClass.hbrBackground = NULL; windowClass.lpszMenuName = NULL; windowClass.lpszClassName = L"MojaKlasa";
windowClass.hIconSm = LoadIcon( NULL, IDI_WINLOGO ); if( !RegisterClassEx( & windowClass ) )
return 0;
if( fullScreen ) {
DEVMODE dmScreenSettings; memset( & dmScreenSettings, 0, sizeof( dmScreenSettings ) );
dmScreenSettings.dmSize = sizeof( dmScreenSettings );
dmScreenSettings.dmPelsWidth = width; dmScreenSettings.dmPelsHeight = height; dmScreenSettings.dmBitsPerPel = bits; dmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
if( ChangeDisplaySettings( & dmScreenSettings, CDS_FULLSCREEN ) != DISP_CHANGE_SUCCESSFUL )
{
MessageBox( NULL, L"Prze³¹czenie trybu wyswietlania nie powiod³o siê", NULL, MB_OK );
fullScreen = FALSE;
}
}
if( fullScreen ) {
dwExStyle = WS_EX_APPWINDOW; dwStyle = WS_POPUP; ShowCursor( FALSE ); }
else
{
dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; dwStyle = WS_OVERLAPPEDWINDOW; }
AdjustWindowRectEx( & windowRect, dwStyle, FALSE, dwExStyle ); hwnd = CreateWindowEx( NULL, L"MojaKlasa", L"Model robota w OpenGL", dwStyle | WS_CLIPCHILDREN |
WS_CLIPSIBLINGS,
0, 0, windowRect.right - windowRect.left,
windowRect.bottom - windowRect.top, NULL, NULL, hInstance, NULL ); if( !hwnd )
return 0;
ShowWindow( hwnd, SW_SHOW ); UpdateWindow( hwnd ); done = false; while( !done )
{
PeekMessage( & msg, hwnd, NULL, NULL, PM_REMOVE );
if( msg.message == WM_QUIT ) {
done = true; }
else
{
Render();
TranslateMessage( & msg ); DispatchMessage( & msg );
}
}
if( fullScreen )
{
ChangeDisplaySettings( NULL, 0 ); ShowCursor( TRUE ); }
return msg.wParam;
}