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

📄 showcanvas.cpp

📁 空战游戏flacon源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//#define	USE_PALETTIZED_TEXTURE

// disable the conversion from 'double ' to 'long ', possible loss of data
// disable the conversion from 'double ' to 'float', possible loss of data
#pragma warning( disable : 4244 )

//"*~-.,__,.-~*""*~-.,__,.-~*""*~-.,__,.-~*""*~-.,__,.-~*""*~-.,__,.-~*""*~-.,_

#include "header.h"

//"*~-.,__,.-~*""*~-.,__,.-~*""*~-.,__,.-~*""*~-.,__,.-~*""*~-.,__,.-~*""*~-.,_

#define	ANGLEROTATION		512
#define	LEFTSHIFTBIT		1
#define	RIGHTSHIFTBIT		2
#define	SHIFTBIT			3
#define	SCREENWIDTH			640	//320	//640
#define	SCREENHEIGHT		480	//200	//480
#define	SCREENDEPTH			16

//"*~-.,__,.-~*""*~-.,__,.-~*""*~-.,__,.-~*""*~-.,__,.-~*""*~-.,__,.-~*""*~-.,_

#include "..\..\..\Canvas\canvas.h"

GLvertex	canvasVertex[] = {
	{ -25.000001f, -88.888894f, -25.000001f },
	{ -25.000001f,   0.0f, -25.000001f },
	{  25.000001f,   0.0f, -25.000001f }
};
float	canvaspoly[] = {
	0.0f, 0.0f,
	0.0f, 1.0f,
	1.0f, 1.0f,
	1.0f, 0.0f,

	0.0f, 0.0f,
	1.0f, 1.0f,
	1.0f, 0.0f

};

Canvas		myCanvas;
GLAnimation	*myAnimData;
ContextMPR	*myContext;
GLGraphics	myGraphics;
GLViewport	myViewport;
CObject3D	myObject;
GLmatrix	myObjectMatrix, myCameraMatrix;
GLmatrix	myBillboardMatrix, myBillboard1Matrix;

GLint		TimerStart, ProgramIsActive;
GLint		perspectiveflag, smoothmode, filtermode, colormode;
GLint		cameraheading, cameraclimb, camerabank, cameraangle;
GLint		objectheading, objectclimb, objectbank;
GLint		camhflag, camcflag, cambflag;
GLint		objhflag, objcflag, objbflag;
GLint		bgcolor, keypressed, doneflag, shadowflag;
GLint		currentstate, currentflag;
GLvertex	cameraPosition;
GLfloat		cameraRange, cameraStartRange;
GLvertex	lightdir, objcoord;
GLfloat		TotalFrameRate=(GLfloat) 0.0;
GLfloat		CurrentFrameRate=(GLfloat) 10.0;
HINSTANCE	myInst;
PSTR		ShowProgramName = "Canvas";
GLbyte		ShowTitle[256], CurrentTextureDirectory[256], CurrentObjectName[256];
GLint		ProgramIsTerminated, WaitAWhile;
GLint		filterindex;
GLint		textureset;
GLint		lightOn;
char		sizeString[32];

//"*~-.,__,.-~*""*~-.,__,.-~*""*~-.,__,.-~*""*~-.,__,.-~*""*~-.,__,.-~*""*~-.,_

void SetCameraAngle ();
void SetCamera ();
void glCopyMessage (GLchar *buffer, GLchar *format, GLchar *message);
void glCopyMessage (GLchar *buffer, GLchar *format, GLfloat value);
void glCopyMessage (GLchar *buffer, GLchar *format, GLint value);
void glDisplayMessageEnd ();
void glDisplayMessageStart ();
void glDisplayMessage (GLbyte *message);
void glDisplayMessage1 (GLbyte *message);
GLint 	LoadObjectFile ();
void 	DisplayFramerate (HWND hWnd);
void 	StartTimer ();
void 	CheckKeyReleased (WPARAM wParam);
GLint	ProcessKeyboard ();
GLint 	InitializeProgram (HWND hWnd);
void 	ProgramLoop (HWND hWnd);
GLint 	ProcessInput (WPARAM wParam, HWND hWnd);
LONG APIENTRY WndProc (HWND, UINT, WPARAM, LPARAM);
BOOL APIENTRY Load3DObjectData(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam);
void	UpdateCameraRange();

//"*~-.,__,.-~*""*~-.,__,.-~*""*~-.,__,.-~*""*~-.,__,.-~*""*~-.,__,.-~*""*~-.,_

int APIENTRY WinMain (	HINSTANCE hInstance, HINSTANCE hPrevInstance, 
						LPSTR lpCmdLine, int nCmdShow)
{
	HWND		hWnd;
	MSG			msg;
	WNDCLASS	wndclass;
	RECT		rect;
	DWORD		style;


	if (!hPrevInstance) {
		wndclass.style = 0;
		wndclass.lpfnWndProc = (WNDPROC) WndProc;
		wndclass.cbClsExtra = 0;
		wndclass.cbWndExtra = 0;
		wndclass.hInstance = hInstance;
		wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
		wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
		wndclass.lpszMenuName = NULL;
		wndclass.hbrBackground = GetStockObject (WHITE_BRUSH);
		wndclass.lpszClassName = ShowProgramName;
		RegisterClass (&wndclass);
	}

#ifdef USE_FULLSCREEN
	style = WS_VISIBLE | WS_POPUP;
	hWnd = CreateWindowEx (	0, ShowProgramName, ShowProgramName, 
							style,
							0, 0, 
					        GetSystemMetrics(SM_CXSCREEN),
							GetSystemMetrics(SM_CYSCREEN),
							NULL, NULL, hInstance, NULL);
#else
	style = WS_VISIBLE | WS_OVERLAPPEDWINDOW;
	rect.top = rect.left = 0;
	rect.right = SCREENWIDTH;
	rect.bottom = SCREENHEIGHT;
	AdjustWindowRect(&rect,	style, FALSE);

	hWnd = CreateWindowEx (	0, ShowProgramName, ShowProgramName, 
							style,
							CW_USEDEFAULT, CW_USEDEFAULT, 
							rect.right-rect.left,			/* init. x size */
							rect.bottom-rect.top,			/* init. y size */
							NULL, NULL, hInstance, NULL);
#endif

	myInst = hInstance;
	ProgramIsTerminated = ProgramIsActive = WaitAWhile = 0;

	myCanvas.Setup (canvasVertex);
	myCanvas.SetColor (1.0f,0.0f,0.0f,1.0f);

	TheLoader.Setup ();
	if (InitializeProgram (hWnd)) {
		TheLoader.Cleanup ();
		DestroyWindow (hWnd);
		return FALSE;
	}
	UpdateWindow (hWnd);
	StartTimer();
	while( 1 ) {
		if( !ProgramIsActive && PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) {
			if( !GetMessage( &msg, NULL, 0, 0 ) ) return msg.wParam;
			TranslateMessage(&msg); 
			DispatchMessage(&msg);
		}
		else {
			ProgramLoop(hWnd);
			DisplayFramerate(hWnd);
		}
	}
	TheLoader.Cleanup ();
}

BOOL APIENTRY Load3DObjectData(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	OPENFILENAME	ofn;
	char			szPath[256], szTitle[256];
	GLint			flag;

	flag = 0;
	switch (message) {
		case WM_INITDIALOG:
			SetDlgItemText (hwndDlg, IDC_TEXTURE_DIR, (const char *) CurrentTextureDirectory);
			break;
		case WM_ACTIVATEAPP:
			ProgramIsActive = wParam;
			break;
		case WM_COMMAND:
			switch (wParam) {
				case IDC_TEXTURE_DIR:
					GetDlgItemText (hwndDlg, IDC_TEXTURE_DIR, (char *) CurrentTextureDirectory, 256);
					break;
				case IDC_LOAD_3D_OBJECT:
					szPath[0] = '\0';
					memset (&ofn, 0, sizeof(OPENFILENAME));
					ofn.nFilterIndex = filterindex;
					ofn.lStructSize = sizeof(OPENFILENAME);
					ofn.hwndOwner = hwndDlg;
//#ifdef	SUPPORT_HOT_FORMAT
//					ofn.lpstrFilter = "HOB files\0*.HOB\0HOT files\0*.HOT\0\0";
//#else
					ofn.lpstrFilter = "HOB files\0*.HOB\0\0";
//#endif
					ofn.lpstrFile = szPath;
					ofn.nMaxFile = 256;
					ofn.lpstrFileTitle = szTitle;
					ofn.nMaxFileTitle = 256;
					ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
					if (!GetOpenFileName (&ofn)) break;
					strcpy ((char *) CurrentObjectName, szPath);
					GetDlgItemText (hwndDlg, IDC_TEXTURE_DIR, (char *) CurrentTextureDirectory, 256);
					glSetTextureDirectory ((char *)CurrentTextureDirectory);
					filterindex = ofn.nFilterIndex;
					flag = 1;
				case IDC_CANCEL:
					EndDialog (hwndDlg, flag);
					break;
			}
			break;
		default:
         return FALSE;
	}
	return TRUE;
}

LONG APIENTRY WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	switch (msg) {
		case WM_MOVE:
			myGraphics.WindowMove (hWnd);
			break;
		case WM_DESTROY:
			ProgramIsTerminated = 1;
			glReset3D ();
			myGraphics.Cleanup ();
			PostQuitMessage (0);
			break;

		case WM_KEYUP:
			CheckKeyReleased (wParam);
			break;

		case WM_KEYDOWN:
			if (WaitAWhile) break;
			if (ProcessInput (wParam, hWnd)) {
				ProgramIsTerminated = 1;
				glReset3D ();
				myGraphics.Cleanup ();
				PostQuitMessage (0);
			}
			break;

		default:
			return (DefWindowProc (hWnd, msg, wParam, lParam));
	}
	return 0;
}

void DisplayFramerate (HWND hWnd)
{
	GLint		endtime;

	if (ProgramIsTerminated) return;
	if (WaitAWhile) return;

	TotalFrameRate += 1.0;
	endtime = timeGetTime () - TimerStart;
	if (endtime > 1000) {
		CurrentFrameRate = (TotalFrameRate * 1000.0) / (GLdouble) endtime;

		sprintf ((char *) ShowTitle, "%.2f fps, %s, camera is %.0fft from the origin", CurrentFrameRate, sizeString, cameraRange);
		SetWindowText (hWnd, (const char *) ShowTitle);

		TotalFrameRate = 0.0;
		StartTimer ();
	}
}

void StartTimer ()
{
	TimerStart = timeGetTime ();
}

void SetCameraAngle ()
{
	GLfloat hScale, vScale;

	glCalculateViewScale (&hScale, &vScale, cameraangle, SCREENWIDTH, SCREENHEIGHT);
	myViewport.glSetViewport (myContext, 0, 0, SCREENWIDTH, SCREENHEIGHT, hScale, vScale);//, SCREENWIDTH/2, SCREENHEIGHT/2);
	SetCamera ();
}

void SetCamera ()
{
	glCreateInverseTransformation (	cameraheading, cameraclimb, camerabank,
									&myCameraMatrix,cameraangle,SCREENWIDTH,SCREENHEIGHT);
	glCreateInverseTransformation (	0, 0, camerabank,
									&myBillboardMatrix,cameraangle,SCREENWIDTH,SCREENHEIGHT);
	glCreateInverseTransformation (	0, cameraclimb, camerabank,
									&myBillboard1Matrix,cameraangle,SCREENWIDTH,SCREENHEIGHT);
	myViewport.glSetCameraMatrix (	&myCameraMatrix, 
									&myBillboardMatrix, &myBillboard1Matrix);
}

GLint InitializeProgram (HWND hWnd)
{
	GLint	i;

	i = myGraphics.Setup (hWnd, SCREENWIDTH, SCREENHEIGHT, SCREENDEPTH);
	if (i) {
		glDisplayMessage1 ((signed char *) "Can not initialize graphic! Program is aborted...\n");
		ProgramIsTerminated = 1;
		return 1;
	}
	myContext = &myGraphics.context;

	strcpy ((char *) CurrentObjectName, "test");
	strcpy ((char *) CurrentTextureDirectory, "texture\\");
	filterindex = 0;	
	i = DialogBox (myInst, "IDD_LOAD3DOBJECT", hWnd, (FARPROC) Load3DObjectData);

#ifdef	USE_PALETTIZED_TEXTURE
	currentstate = ENABLE_PALETTIZED_TEXTURE_STATE;
	glInitialize3D (myContext -> rc, "texture.lst", "palette.lst");
#else
	currentstate = 0;
	glInitialize3D (myContext -> rc, "texture.lst");
#endif

	if (glInitializeColorTable ("color.lst")) {
		glDisplayMessage1 ((signed char *) "Can not Load color list file! Program is aborted...\n");
		ProgramIsTerminated = 1;
		return 1;
	}

	cameraheading = cameraclimb = camerabank = 0;
	cameraangle = 2730;	// 59.98... degree viewing angle
	SetCameraAngle ();

	if (LoadObjectFile ()) {
		glDisplayMessage1 ((signed char *) "Can not Load object file! Program is aborted...\n");
		ProgramIsTerminated = 1;
		return 1;
	}

	objectheading = 0;
	objectclimb = 0;
	objectbank = 0;

	// Put a default light source into the environment
	lightdir.x = 0.0f;
	lightdir.y = 1.0f;
	lightdir.z = 0.0f;
	myViewport.glSetLightDirection( &lightdir );
	myViewport.glSetAmbientIntensity ( 0.3f );
	myViewport.glSetDiffuseIntensity ( 0.7f );
	lightOn = 1;

	bgcolor = 0xffffffff;
	myContext -> SetState (MPR_STA_BG_COLOR, bgcolor);
	myContext -> SetState (MPR_STA_FOG_COLOR, bgcolor);

//	myViewport.glSetDepthCueDistance ((GLfloat) 20.0, (GLfloat) 50.0);
	myViewport.glSetDepthCueColor (	(GLfloat) (bgcolor & 0xff) / 255.0,
									(GLfloat) ((bgcolor >> 8) & 0xff) / 255.0,
									(GLfloat) ((bgcolor >> 16) & 0xff) / 255.0);

	camhflag = camcflag = cambflag = objhflag = objcflag = objbflag = 0;
	doneflag = keypressed = perspectiveflag = smoothmode = filtermode = 0;

	shadowflag = 0;
	colormode = 0;
	currentflag = 0;
	textureset = 0;
	return 0;
}

GLint LoadObjectFile ()
{
	myObject.DeleteObject ();
	if (!myObject.LoadObject (myContext -> rc,CurrentObjectName)) return (1);

	while (!myObject.Object.objectDetail[0].objectData) {
		Sleep (10);
	};

	objcoord.x = objcoord.y = objcoord.z = 0;
	myObject.Object.objectCoordinate = &objcoord;
	myObject.Object.objectMatrix = &myObjectMatrix;

	cameraStartRange = 2.0f * myObject.GetObjectRadius();

	sprintf( sizeString, "%.0fx%.0fx%.0f ft", myObject.objectSize.x, 
											 myObject.objectSize.y, 
											 myObject.objectSize.z );

	// Setup the camera looking at the origin from twice the object radius away
	cameraPosition.x = 0.0f;
	cameraPosition.y = 0.0f;
	cameraPosition.z = -cameraStartRange;
	myViewport.glSetCameraPosition (&cameraPosition);
	UpdateCameraRange();

	myAnimData = myObject.GetObjectAnimation();

	myContext -> InvalidateState ();

	return 0;
}

⌨️ 快捷键说明

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