Trouble with OpenGL Game Programming book

Started by
9 comments, last by Ekim_Gram 20 years, 10 months ago
I''m finishing up chapter 2 and I''m doing the code with the rotation triangle. I''m using a pirated version of Microsoft Visual Studio 6 EE (i know...) and it''s not working. For those of you who don''t have the book; here''s the code:

#define WIN32_LEAN_AND_MEAN				// trim the excess fat from Windows


////// Includes

#include <windows.h>					// standard Windows app include

#include <gl/gl.h>						// standard OpenGL include

#include <gl/glu.h>						// OpenGL utilties

#include <gl/glaux.h>					// OpenGL auxiliary functions


////// Global Variables

float angle = 0.0f;						// current angle of the rotating triangle

HDC g_HDC;								// global device context

bool fullScreen = false;						

// function to set the pixel format for the device context

void SetupPixelFormat(HDC hDC)
{
	int nPixelFormat;					// our pixel format index


	static PIXELFORMATDESCRIPTOR pfd = {
		sizeof(PIXELFORMATDESCRIPTOR),	// size of structure

		1,								// default version

		PFD_DRAW_TO_WINDOW |			// window drawing support

		PFD_SUPPORT_OPENGL |			// OpenGL support

		PFD_DOUBLEBUFFER,				// double buffering support

		PFD_TYPE_RGBA,					// RGBA color mode

		32,								// 32 bit color mode

		0, 0, 0, 0, 0, 0,				// ignore color bits, non-palettized mode

		0,								// no alpha buffer

		0,								// ignore shift bit

		0,								// no accumulation buffer

		0, 0, 0, 0,						// ignore accumulation bits

		16,								// 16 bit z-buffer size

		0,								// no stencil buffer

		0,								// no auxiliary buffer

		PFD_MAIN_PLANE,					// main drawing plane

		0,								// reserved

		0, 0, 0 };						// layer masks ignored


	nPixelFormat = ChoosePixelFormat(hDC, &pfd);	// choose best matching pixel format


	SetPixelFormat(hDC, nPixelFormat, &pfd);		// set pixel format to device context

}

// the Windows Procedure event handler

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	static HGLRC hRC;					// rendering context

	static HDC hDC;						// device context

	int width, height;					// window width and height


	switch(message)
	{
		case WM_CREATE:					// window is being created


			hDC = GetDC(hwnd);			// get current window''s device context

			g_HDC = hDC;
			SetupPixelFormat(hDC);		// call our pixel format setup function


			// create rendering context and make it current

			hRC = wglCreateContext(hDC);
			wglMakeCurrent(hDC, hRC);

			return 0;
			break;

		case WM_CLOSE:					// windows is closing


			// deselect rendering context and delete it

			wglMakeCurrent(hDC, NULL);
			wglDeleteContext(hRC);

			// send WM_QUIT to message queue

			PostQuitMessage(0);

			return 0;
			break;

		case WM_SIZE:
			height = HIWORD(lParam);		// retrieve width and height

			width = LOWORD(lParam);

			if (height==0)					// don''t want a divide by zero

			{
				height=1;					
			}

			glViewport(0, 0, width, height);		// reset the viewport to new dimensions

			glMatrixMode(GL_PROJECTION);			// set projection matrix current matrix

			glLoadIdentity();						// reset projection matrix


			// calculate aspect ratio of window

			gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,1.0f,1000.0f);

			glMatrixMode(GL_MODELVIEW);				// set modelview matrix

			glLoadIdentity();						// reset modelview matrix


			return 0;
			break;

		default:
			break;
	}

	return (DefWindowProc(hwnd, message, wParam, lParam));
}

// the main windows entry point

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
	WNDCLASSEX windowClass;		// window class

	HWND	   hwnd;			// window handle

	MSG		   msg;				// message

	bool	   done;			// flag saying when our app is complete

	DWORD	   dwExStyle;						// Window Extended Style

	DWORD	   dwStyle;						// Window Style

	RECT	   windowRect;

	// temp var''s

	int width = 800;
	int height = 600;
	int bits = 32;

	fullScreen = FALSE;

	windowRect.left=(long)0;						// Set Left Value To 0

	windowRect.right=(long)width;						// Set Right Value To Requested Width

	windowRect.top=(long)0;							// Set Top Value To 0

	windowRect.bottom=(long)height;						// Set Bottom Value To Requested Height


	// fill out the window class structure

	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);	// default icon

	windowClass.hCursor			= LoadCursor(NULL, IDC_ARROW);		// default arrow

	windowClass.hbrBackground	= NULL;								// don''t need background

	windowClass.lpszMenuName	= NULL;								// no menu

	windowClass.lpszClassName	= "MyClass";
	windowClass.hIconSm			= LoadIcon(NULL, IDI_WINLOGO);		// windows logo small icon


	// register the windows class

	if (!RegisterClassEx(&windowClass))
		return 0;

	if (fullScreen)								// fullscreen?

	{
		DEVMODE dmScreenSettings;					// device mode

		memset(&dmScreenSettings,0,sizeof(dmScreenSettings));
		dmScreenSettings.dmSize = sizeof(dmScreenSettings);	
		dmScreenSettings.dmPelsWidth = width;			// screen width

		dmScreenSettings.dmPelsHeight = height;			// screen height

		dmScreenSettings.dmBitsPerPel = bits;				// bits per pixel

		dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;

		// 

		if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
		{
			// setting display mode failed, switch to windowed

			MessageBox(NULL, "Display mode failed", NULL, MB_OK);
			fullScreen=FALSE;	
		}
	}

	if (fullScreen)								// Are We Still In Fullscreen Mode?

	{
		dwExStyle=WS_EX_APPWINDOW;					// Window Extended Style

		dwStyle=WS_POPUP;						// Windows Style

		ShowCursor(FALSE);						// Hide Mouse Pointer

	}
	else
	{
		dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;			// Window Extended Style

		dwStyle=WS_OVERLAPPEDWINDOW;					// Windows Style

	}

	AdjustWindowRectEx(&windowRect, dwStyle, FALSE, dwExStyle);		// Adjust Window To True Requested Size


	// class registered, so now create our window

	hwnd = CreateWindowEx(NULL,									// extended style

						  "MyClass",							// class name

						  "OpenGL Application",		// app name

						  dwStyle | WS_CLIPCHILDREN |
						  WS_CLIPSIBLINGS,
						  0, 0,								// x,y coordinate

						  windowRect.right - windowRect.left,
						  windowRect.bottom - windowRect.top, // width, height

						  NULL,									// handle to parent

						  NULL,									// handle to menu

						  hInstance,							// application instance

						  NULL);								// no extra params


	// check if window creation failed (hwnd would equal NULL)

	if (!hwnd)
		return 0;

	ShowWindow(hwnd, SW_SHOW);			// display the window

	UpdateWindow(hwnd);					// update the window


	done = false;						// intialize the loop condition variable


	// main message loop

	while (!done)
	{
		PeekMessage(&msg, hwnd, NULL, NULL, PM_REMOVE);

		if (msg.message == WM_QUIT)		// do we receive a WM_QUIT message?

		{
			done = true;				// if so, time to quit the application

		}
		else
		{
			// do rendering here

			glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);		// clear screen and depth buffer

			glLoadIdentity();										// reset modelview matrix


			angle = angle + 0.1f;					// increase our rotation angle counter

			if (angle >= 360.0f)					// if we''ve gone in a circle, reset counter

				angle = 0.0f;
			glTranslatef(0.0f,0.0f,-5.0f);			// move back 5 units

			glRotatef(angle, 0.0f,0.0f,1.0f);		// rotate along z-axis


			glColor3f(1.0f,0.0f,0.0f);				// set color to red

			glBegin(GL_TRIANGLES);					// draw the triangle

				glVertex3f(0.0f,0.0f,0.0f);
				glVertex3f(1.0f,0.0f,0.0f);
				glVertex3f(1.0f,1.0f,0.0f);
			glEnd();

			SwapBuffers(g_HDC);			// bring backbuffer to foreground


			TranslateMessage(&msg);		// translate and dispatch to event queue

			DispatchMessage(&msg);
		}
	}

	if (fullScreen)
	{
		ChangeDisplaySettings(NULL,0);					// If So Switch Back To The Desktop

		ShowCursor(TRUE);						// Show Mouse Pointer

	}

	return msg.wParam;
}
Now I''m getting there errors:


--------------------Configuration: Win32 - Win32 Debug--------------------
Compiling...
file.cpp
Linking...
file.obj : error LNK2001: unresolved external symbol _gluPerspective@32
file.obj : error LNK2001: unresolved external symbol __imp__glLoadIdentity@0
file.obj : error LNK2001: unresolved external symbol __imp__glMatrixMode@4
file.obj : error LNK2001: unresolved external symbol __imp__glViewport@16
file.obj : error LNK2001: unresolved external symbol __imp__wglDeleteContext@4
file.obj : error LNK2001: unresolved external symbol __imp__wglMakeCurrent@8
file.obj : error LNK2001: unresolved external symbol __imp__wglCreateContext@4
file.obj : error LNK2001: unresolved external symbol __imp__glEnd@0
file.obj : error LNK2001: unresolved external symbol __imp__glVertex3f@12
file.obj : error LNK2001: unresolved external symbol __imp__glBegin@4
file.obj : error LNK2001: unresolved external symbol __imp__glColor3f@12
file.obj : error LNK2001: unresolved external symbol __imp__glRotatef@16
file.obj : error LNK2001: unresolved external symbol __imp__glTranslatef@12
file.obj : error LNK2001: unresolved external symbol __imp__glClear@4
Debug/Win32.exe : fatal error LNK1120: 14 unresolved externals
Error executing link.exe.

Win32.exe - 15 error(s), 0 warning(s)

What''s going on? The project is a Win32 Application and I got what needs to be included into the header and the files are on my hd I hope - they were last time I checked. There''s no town drunk here, we all take turns.
Advertisement
Project->Settings->Link->Category:General->Object/library modules->(add opengl32.lib glu32.lib glaux.lib to this textbox)
quote:Original post by Anonymous Poster
Project->Settings->Link->Category:General->Object/library modules->(add opengl32.lib glu32.lib glaux.lib to this textbox)
Which, incidentally, is all explained in Chapter 1.
quote:Original post by Myopic Rhino
Which, incidentally, is all explained in Chapter 1.

Wow. Do you own a copy?
wow, how the hell did you do that with the code, so it has its own sroll bar, or was that automatic
www.programmers-unlimited.com, try it, its not too bad.
quote:Original post by spetnaz_
wow, how the hell did you do that with the code, so it has its own sroll bar, or was that automatic




use tags
[ source ] some code [ /source ]
without blanks!

// This is a comment
including the opengl32.lib and glu32.lib should clear that up.

And, I use the MSDN to download my compilers.
Game Core
quote:Original post by baldurk
Wow. Do you own a copy?


He wrote the book...



Death of one is a tragedy, death of a million is just a statistic.
If at first you don't succeed, redefine success.
I guess I didn''t see the adding the opengl32.lib glu32.lib glaux.lib thing. And I dunno what happened but the code was in the source tags last night but oh well.


There''s no town drunk here, we all take turns.
quote:Original post by python_regious
quote:Original post by baldurk
Wow. Do you own a copy?


He wrote the book...





hence, the wink he put in there
Lucas Henekswww.ionforge.com

This topic is closed to new replies.

Advertisement