⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 一本关于OPenGL的很好的电子书
💻 CPP
字号:
#define WIN32_LEAN_AND_MEAN		// trim the excess fat from Windows

/*******************************************************************
*	Program: Chapter 9 Environment Mapping Example 1
*	Author: Kevin Hawkins
*	Description: 
********************************************************************/

////// Defines
#define BITMAP_ID 0x4D42		// the universal bitmap ID
#define PI 3.14195

////// Includes
#include <windows.h>			// standard Windows app include
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <gl/gl.h>				// standard OpenGL include
#include <gl/glu.h>				// OpenGL utilties
#include <gl/glaux.h>

////// Types
typedef struct 
{
	int width;					// width of texture
	int height;					// height of texture
	unsigned int texID;			// the texture object id of this texture
	unsigned char *data;		// the texture data
} texture_t;

////// Global Variables
HDC g_HDC;						// global device context
bool fullScreen = false;		// true = fullscreen; false = windowed
bool keyPressed[256];			// holds true for keys that are pressed	

float angle = 0.0f;				// camera angle 
float radians = 0.0f;			// camera angle in radians

float cSurface[3][3][3] = { { { -200.0, 40.0, 200.0 }, { -100.0, 100.0, 200.0 }, { 200.0, 0.0, 200.0 } },
							{ { -240.0, 0.0, 0.0 }, { -150.0, 100.0, 0.0 },	{ 200.0, 0.0, 0.0 } },
							{ { -200.0, -80.0, -200.0 }, { -100.0, 100.0, -200.0 },	{ 200.0, 0.0, -200.0 } }  };

float control[4][3] = { { 1.0, -3.0, 0.0 }, { 3.0, 2.5, 0.0 },
						{ 8.0, -2.0, 0.0}, {7.0, 2.0, 0.0 } };


float control2[3][3] = { { -10.0, -3.0, 0.0 }, { -8.0, 2.5, 0.0 },
						{ -3.0, -2.0, 0.0} };
float control3[2][3] = { { -20.0, -3.0, 0.0 }, { -13.0, -2.0, 0.0 } };

////// Mouse/Camera Variables
int mouseX, mouseY;					// mouse coordinates
float cameraX, cameraY, cameraZ;	// camera coordinates
float lookX, lookY, lookZ;			// camera look-at coordinates

void CleanUp()
{
}

void MoveSurface()
{
	static bool dir = false;
	int i;

	srand( (unsigned)time( NULL ) );

	if (!dir)
	{
		for (i = 0; i < 3; i++)
		{
			cSurface[i][1][1] += 0.05;
		}
	}
	else
		for (i = 0; i < 3; i++)
		{
			cSurface[i][1][1] -= 0.05;
		}

	if (cSurface[0][1][1] >= 30.0f)
		dir = true;
	else if (cSurface[0][1][1] <= -30.0f)
		dir = false;
}


// Initialize
// desc: initializes OpenGL
void Initialize()
{
	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);		// clear to black

	glShadeModel(GL_SMOOTH);					// use smooth shading
	glEnable(GL_DEPTH_TEST);					// hidden surface removal
//	glEnable(GL_CULL_FACE);						// do not calculate inside of poly's
//	glFrontFace(GL_CCW);						// counter clock-wise polygons are out
/*	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);
	glEnable(GL_COLOR_MATERIAL);
	glEnable(GL_AUTO_NORMAL);*/
}

// Render
// desc: handles drawing of scene
void Render()
{
	// increase rotation angle
//	if (angle > 360.0f)
//		angle = 0.0f;

//	angle = angle + 0.2f;

	radians =  float(PI*(angle-90.0f)/180.0f);

	// calculate the camera's position
	cameraX = lookX + (float)sin(radians)*mouseY;	// multiplying by mouseY makes the
	cameraZ = lookZ + (float)cos(radians)*mouseY;  // camera get closer/farther away with mouseY
	cameraY = lookY + mouseY / 2.0f;

	// calculate the camera look-at coordinates as the center
	lookX = -20.0f;
	lookY = 20.0f;
	lookZ = 0.0f;

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

	// set the camera position
	gluLookAt(cameraX, cameraY, cameraZ, lookX, lookY, lookZ, 0.0, 1.0, 0.0);

//	glTranslatef(5.0f, 0.0f, -30.0f);
//	glTranslatef(-5.0f, 0.0f, -10.0f);
//	glRotatef(angle, 0.0f, 1.0f, 0.0f);

//	glScalef(10.0f, 10.0f, 10.0f);

	glMap2f(GL_MAP2_VERTEX_3, 0.0, 10.0, 3, 3, 0.0, 10.0, 9, 3, &cSurface[0][0][0]);
	glEnable(GL_MAP2_VERTEX_3);
	glColor3f(1.0, 1.0, 1.0);
/*	glBegin(GL_LINE_STRIP);
		for (int i = 0; i <= 30; i++)
		{
			for (int j = 0; j <= 30; j++)
				glEvalCoord2f((float)j/30.0f, (float)i/30.0f);
			for (j = 0; j <= 30; j++)
				glEvalCoord2f((float)i/30.0f, (float)j/30.0f);
		}
	glEnd();
*/
	glMapGrid2f(10, 0.0f, 10.0f, 10, 0.0f, 10.0f);
	glEvalMesh2(GL_LINE, 0, 10, 0, 10);

	glPointSize(3.0);
	glColor3f(1.0, 1.0, 0.0);
	glBegin(GL_POINTS);
		for (int i = 0; i < 3; i++)
			for (int j = 0; j < 3; j++)
				glVertex3fv(&cSurface[i][j][0]);
	glEnd();
	glPointSize(1.0);

/*	glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 3, &control2[0][0]);
	glEnable(GL_MAP1_VERTEX_3);
	glColor3f(1.0, 1.0, 1.0);
	glBegin(GL_LINE_STRIP);
		for (i = 0; i <= 30; i++)
			glEvalCoord1f((float)i/30.0f);
	glEnd();

	glPointSize(5.0);
	glColor3f(1.0, 1.0, 1.0);
	glBegin(GL_POINTS);
		for (i = 0; i < 3; i++)
			glVertex3fv(&control2[i][0]);
	glEnd();

	glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 2, &control3[0][0]);
	glEnable(GL_MAP1_VERTEX_3);
	glColor3f(1.0, 1.0, 1.0);
	glBegin(GL_LINE_STRIP);
		for (i = 0; i <= 30; i++)
			glEvalCoord1f((float)i/30.0f);
	glEnd();

	glPointSize(5.0);
	glColor3f(1.0, 1.0, 1.0);
	glBegin(GL_POINTS);
		for (i = 0; i < 2; i++)
			glVertex3fv(&control3[i][0]);
	glEnd();
*/
//	MoveSurface();

	glFlush();
	SwapBuffers(g_HDC);			// bring backbuffer to foreground
}

// 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
	int oldMouseX, oldMouseY;

	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(54.0f,(GLfloat)width/(GLfloat)height,1.0f,1000.0f);

			glMatrixMode(GL_MODELVIEW);			// set modelview matrix
			glLoadIdentity();					// reset modelview matrix

			return 0;
			break;

		case WM_KEYDOWN:					// is a key pressed?
			keyPressed[wParam] = true;
			return 0;
			break;

		case WM_KEYUP:
			keyPressed[wParam] = false;
			return 0;
			break;

				case WM_MOUSEMOVE:
			// save old mouse coordinates
			oldMouseX = mouseX;
			oldMouseY = mouseY;

			// get mouse coordinates from Windows
			mouseX = LOWORD(lParam);
			mouseY = HIWORD(lParam);

			// these lines limit the camera's range
			if (mouseY < 30)
				mouseY = 30;
			if (mouseY > 550)
				mouseY = 550;

			if ((mouseX - oldMouseX) > 0)		// mouse moved to the right
				angle += 6.0f;
			else if ((mouseX - oldMouseX) < 0)	// mouse moved to the left
				angle -= 6.0f;

			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 = TRUE;

	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
						  "Surface Example 1: Bezier Surface",		// 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
	Initialize();						// initialize OpenGL

	// 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
		{
			if (keyPressed[VK_ESCAPE])
				done = true;
			else
			{
				Render();

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

	CleanUp();

	if (fullScreen)
	{
		ChangeDisplaySettings(NULL,0);		// If So Switch Back To The Desktop
		ShowCursor(TRUE);					// Show Mouse Pointer
	}

	return msg.wParam;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -