Archived

This topic is now archived and is closed to further replies.

Ekim_Gram

Trouble with OpenGL Game Programming book

Recommended Posts

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.

Share this post


Link to post
Share on other sites
Guest Anonymous Poster
Project->Settings->Link->Category:General->Object/library modules->(add opengl32.lib glu32.lib glaux.lib to this textbox)

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites