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

📄 show3d.cpp

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

void ProgramLoop (HWND hWnd)
{
	if (ProgramIsTerminated) return;
	if (WaitAWhile) return;

	myViewport.glSetTime (timeGetTime());

	if (camhflag) cameraheading += ANGLEROTATION;
	if (camcflag) cameraclimb += ANGLEROTATION;
	if (cambflag) camerabank += ANGLEROTATION;
	if (camhflag || camcflag || cambflag) 
		SetCamera ();
	if (objhflag) objectheading += ANGLEROTATION;
	if (objcflag) objectclimb += ANGLEROTATION;
	if (objbflag) objectbank += ANGLEROTATION;
	glCreateTransformation (objectheading,objectclimb,objectbank, &myObjectMatrix);

	myGraphics.StartFrame (currentflag & 1);

	if (shadowflag) {
		glProcessObjectShadow (&myViewport, &myObject.Object, 1.0, myAnimData);
	}
	else {
		glProcessObject (&myViewport, &myObject.Object, 1.0, myAnimData, textureset);
//		glProcessObjectClip (&myViewport, &myObject.Object, 1.0, myAnimData, textureset);
	}

#if 0
	if (pointlightflag) {
		myObject.Object.objectCoordinate = &lightcoord;
		glProcessObjectShadow (&myViewport, &myObject.Object, 0.1, myAnimData);
		myObject.Object.objectCoordinate = &objcoord;
	}
#endif

#ifdef USE_FULLSCREEN
	sprintf ((char *) ShowTitle, "FrameRate = %.2f", CurrentFrameRate);
	HDC	hdc = GetDC (hWnd);
	TextOut (hdc, 10, 10, (const char *) ShowTitle, strlen((const char *) ShowTitle));
	ReleaseDC (hWnd, hdc);
#endif

	myGraphics.FlipBuffer ();

}

void CheckKeyReleased (WPARAM wParam)
{
	WORD		scanCode;

	scanCode = MapVirtualKey (wParam, 0);
	switch (scanCode) {
		case KEYLEFTSHIFT:
			keypressed &= ~LEFTSHIFTBIT;
			break;
		case KEYRIGHTSHIFT:
			keypressed &= ~RIGHTSHIFTBIT;
			break;
	}
}

GLint ProcessInput (WPARAM wParam, HWND hWnd)
{
	WORD		scanCode;
	GLfloat		stepsize;
	GLint		i, j;

	if (smoothmode) {
		stepsize = cameraRange / 200.0f;;
	}
	else stepsize = cameraRange / 32.0f;

	scanCode = MapVirtualKey (wParam, 0);
	switch (scanCode) {
		case KEYF1:
			textureset++;
			break;
		case KEYF2:
			textureset--;
			if (textureset < 0) textureset = 0;
			break;
		case KEYF3:
			glEnableAnimationScript(myAnimData);
			break;
		case KEYF4:
			glDisableAnimationScript(myAnimData);
			break;

		case KEYF:
			shadowflag ^= 1;
			break;

		case KEY8:
			colormode ^= 1;
			if (colormode) {
				myViewport.glEnableColorMode (GL_MAKE_COLOR_GREEN);
			}
			else {
				myViewport.glDisableColorMode (GL_MAKE_COLOR_GREEN);
			}
			break;

		case KEYL:
			lightOn ^= 1;
			if (lightOn) {
				myViewport.glSetAmbientIntensity ( 0.3f );
				myViewport.glSetDiffuseIntensity ( 0.7f );
			} else {
				myViewport.glSetAmbientIntensity ( 1.0f );
				myViewport.glSetDiffuseIntensity ( 0.0f );
			}
			break;

		case KEYESCAPE:
		case KEYQ:
			return (1);

		case KEYLEFTSHIFT:
			keypressed |= LEFTSHIFTBIT;
			break;
		case KEYRIGHTSHIFT:
			keypressed |= RIGHTSHIFTBIT;
			break;

		case KEYBACKSLASH:
			smoothmode ^= 1;
			break;

		case KEY9:
			cameraangle += 64;
			if (cameraangle > 7936) cameraangle = 7936;	// max == 174.4 deg
			SetCameraAngle ();
			break;
		case KEY0:
			cameraangle -= 64;
			if (cameraangle < 64) cameraangle = 64;	// min == 1.40625 deg
			SetCameraAngle ();
			break;

		case KEY1:
		case KEY2:
		case KEY3:
		case KEY4:
		case KEY5:
		case KEY6:
			if (keypressed & SHIFTBIT) {
				switch (scanCode) {
					case KEY1:
						cameraheading -= ANGLEROTATION;
						break;
					case KEY2:
						cameraheading += ANGLEROTATION;
						break;
					case KEY3:
						cameraclimb -= ANGLEROTATION;
						break;
					case KEY4:
						cameraclimb += ANGLEROTATION;
						break;
					case KEY5:
						camerabank -= ANGLEROTATION;
						break;
					case KEY6:
						camerabank += ANGLEROTATION;
						break;
				}
				SetCamera ();
			}
			else {
				switch (scanCode) {
					case KEY1:
						objectheading -= ANGLEROTATION;
						break;
					case KEY2:
						objectheading += ANGLEROTATION;
						break;
					case KEY3:
						objectclimb -= ANGLEROTATION;
						break;
					case KEY4:
						objectclimb += ANGLEROTATION;
						break;
					case KEY5:
						objectbank -= ANGLEROTATION;
						break;
					case KEY6:
						objectbank += ANGLEROTATION;
						break;
				}
			}
			break;
		case KEYH:
			if (keypressed & SHIFTBIT) camhflag ^= 1;
			else objhflag ^= 1;
			break;
		case KEYC:
			if (keypressed & SHIFTBIT) camcflag ^= 1;
			else objcflag ^= 1;
			break;
		case KEYB:
			if (keypressed & SHIFTBIT) cambflag ^= 1;
			else objbflag ^= 1;
			break;

		case KEYR:
			textureset = 0;
			cameraheading = cameraclimb = camerabank = 0;

			cameraangle = 2730;	// 59.98... degree viewing angle
			SetCameraAngle ();

			// Put the camera back at the starting point
			cameraPosition.x = 0.0f;
			cameraPosition.y = 0.0f;
			cameraPosition.z = -cameraStartRange;
			myViewport.glSetCameraPosition (&cameraPosition);
			UpdateCameraRange();

			objectheading = objectclimb = objectbank = 0;
			bgcolor = 0xffffffff;
			myContext -> SetState (MPR_STA_BG_COLOR, bgcolor);
			myContext -> SetState (MPR_STA_FOG_COLOR, bgcolor);
			myViewport.glSetDepthCueColor ((GLfloat) (bgcolor & 0xff) / 255.0,
								(GLfloat) ((bgcolor >> 8) & 0xff) / 255.0,
								(GLfloat) ((bgcolor >> 16) & 0xff) / 255.0);
			break;

		case KEYP:
			if (keypressed & SHIFTBIT) {
				currentflag ^= 4;
				if (currentflag & 4) {
					currentstate |= ENABLE_FILTERING_PERSPECTIVE_STATE;
					currentflag |= 2;
				}
				else currentstate &= ~ENABLE_FILTERING_STATE;
			}
			else {
				currentflag ^= 2;
				if (currentflag & 2) currentstate |= ENABLE_PERSPECTIVE_STATE;
				else if (currentflag & 4) {
					currentstate &= ~ENABLE_FILTERING_PERSPECTIVE_STATE;
					currentflag ^= 4;
				}
				else currentstate &= ~ENABLE_PERSPECTIVE_STATE;
			}
			myContext -> SetupMPRState (currentstate);
			break;

		case KEYT:
			if (keypressed & SHIFTBIT)
				myViewport.glToggleSurfaceDetail (GL_DETAIL_TRANSPARENT);
			else myViewport.glToggleSurfaceDetail (GL_DETAIL_TEXTURE);
			break;
		case KEYS:
			if (keypressed & SHIFTBIT)
				myViewport.glToggleSurfaceDetail (GL_DETAIL_SHADING);
			else myViewport.glDisableSurfaceDetail (GL_DETAIL_TEXTURE | GL_DETAIL_SMOOTH_SHADING);
			break;
		case KEYG:
			if (keypressed & SHIFTBIT)
				myViewport.glToggleSurfaceDetail (GL_DETAIL_GOURAUD);
			else myViewport.glToggleSurfaceDetail (GL_DETAIL_SMOOTH_SHADING);
			break;

		case KEYMINUS:
		case KEYPLUS:
		case KEYLEFTBRACKET:
		case KEYRIGHTBRACKET:
		case KEYCOLON:
		case KEYQUOTE:
			j = 8;
			if (keypressed & SHIFTBIT) j = 1;
			switch (scanCode) {
				case KEYMINUS:
					i = (bgcolor >> 16) & 0xff;			// blue
					i = ((i - j) & 0xff) << 16;
					bgcolor = (bgcolor & 0xff00ffff) | i;
					break;
				case KEYPLUS:
					i = (bgcolor >> 16) & 0xff;			// blue
					i = ((i + j) & 0xff) << 16;
					bgcolor = (bgcolor & 0xff00ffff) | i;
					break;
				case KEYLEFTBRACKET:
					i = (bgcolor >> 8) & 0xff;			// green
					i = ((i - j) & 0xff) << 8;
					bgcolor = (bgcolor & 0xffff00ff) | i;
					break;
				case KEYRIGHTBRACKET:
					i = (bgcolor >> 8) & 0xff;			// green
					i = ((i + j) & 0xff) << 8;
					bgcolor = (bgcolor & 0xffff00ff) | i;
					break;
				case KEYCOLON:
					i = ((bgcolor & 0xff) - j) & 0xff;	// red
					bgcolor = (bgcolor & 0xffffff00) | i;
					break;
				case KEYQUOTE:
					i = ((bgcolor & 0xff) + j) & 0xff;	// red
					bgcolor = (bgcolor & 0xffffff00) | i;
					break;
			}
			myContext -> SetState (MPR_STA_BG_COLOR, bgcolor);
			myContext -> SetState (MPR_STA_FOG_COLOR, bgcolor);
			myViewport.glSetDepthCueColor ((GLfloat) (bgcolor & 0xff) / 255.0,
								(GLfloat) ((bgcolor >> 8) & 0xff) / 255.0,
								(GLfloat) ((bgcolor >> 16) & 0xff) / 255.0);
			break;

		case KEYLEFT:
		case KEYRIGHT:
		case KEYUP: 	
		case KEYDOWN: 	
		case KEYPAGEUP:
		case KEYPAGEDOWN: 	
			if (keypressed & SHIFTBIT) {
				switch (scanCode) {
					case KEYLEFT:
//						lightcoord.x -= stepsize;
						break;
					case KEYRIGHT:
//						lightcoord.x += stepsize;
						break;
					case KEYUP: 	
//						lightcoord.z += stepsize;
						break;
					case KEYDOWN: 	
///						lightcoord.z -= stepsize;
						break;
					case KEYPAGEUP:
///						lightcoord.y -= stepsize;
						break;
					case KEYPAGEDOWN: 	
///						lightcoord.y += stepsize;
						break;
				}
				myViewport.glSetLightDirection (&lightdir);
			}
			else {
				switch (scanCode) {
					case KEYLEFT:
						cameraPosition.x -= stepsize;
						break;
					case KEYRIGHT:
						cameraPosition.x += stepsize;
						break;
					case KEYUP: 	
						cameraPosition.z += stepsize;
						break;
					case KEYDOWN: 	
						cameraPosition.z -= stepsize;
						break;
					case KEYPAGEUP:
						cameraPosition.y -= stepsize;
						break;
					case KEYPAGEDOWN: 	
						cameraPosition.y += stepsize;
						break;
				}
				myViewport.glSetCameraPosition (&cameraPosition);
				UpdateCameraRange();
			}
			break;

		case KEYTAB:
			i = DialogBox (myInst, "IDD_LOAD3DOBJECT", hWnd, (FARPROC) Load3DObjectData);
			if (i) {
				if (LoadObjectFile ()) {
					glDisplayMessage1 ((signed char *)"Can not Load object file! Program is aborted...\n");
					ProgramIsTerminated = 1;
					return 1;
				}
			}
			break;
	}
	return 0;
}

GLubyte	MessageBuffer[1000];	// up to 1000 characters of message
GLubyte	*currentMessageBuffer;

/*
赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯

⌨️ 快捷键说明

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