www.pudn.com > coolMEMORY.rar > Intro.cpp


//----------------------------------------------------------------------------- 
// File: Intro.cpp 
//----------------------------------------------------------------------------- 
 
#include "AS\AS_Engine.h" 
#include "ModuleHeaders.h" 
 
 
// Definitions: *************************************************************** 
#define TITEL_GRID_X_SIZE 20 // The width of the game title 
#define TITEL_GRID_Y_SIZE 10 // The height of the game title 
/////////////////////////////////////////////////////////////////////////////// 
 
// Variables: ***************************************************************** 
// Game titel: 
FLOAT3 fTitelGridPoint[TITEL_GRID_X_SIZE*TITEL_GRID_Y_SIZE]; 
FLOAT2 fTitelGridTexture[TITEL_GRID_X_SIZE*TITEL_GRID_Y_SIZE]; 
float fGameTitleTimer, fGameTitleBlend, fGameTitleDarking, fASLogoBlend, 
	  fContinueBlend; 
BOOL bContinueBlend; 
/////////////////////////////////////////////////////////////////////////////// 
 
// Functions: ***************************************************************** 
HRESULT Intro(void); 
void InitIntro(void); 
HRESULT IntroDraw(AS_WINDOW *); 
HRESULT IntroCheck(AS_WINDOW *); 
void DrawTitel(AS_WINDOW *); 
void CheckTitel(void); 
void InitTitel(void); 
/////////////////////////////////////////////////////////////////////////////// 
 
 
HRESULT Intro(void) 
{ // begin Intro() 
	MSG msg; 
 
	if(!_AS->bShowIntro) 
	{ 
		_AS->SetNextModule(MODULE_MENU); 
 
		return 0; 
	} 
	_AS->WriteLogMessage("Enter game intro module"); 
	_AS->bDraw = FALSE; 
	_AS->pWindow[GAME_WINDOW_ID].SetDrawFunction(IntroDraw); 
	_AS->pWindow[GAME_WINDOW_ID].SetCheckFunction(IntroCheck); 
	 
	_AS->iActiveLights = 0; 
	InitIntro(); 
	_AS->bDraw = TRUE; 
 
	// Go into the game loop: 
	_AS->WriteLogMessage("Enter the game menu loop"); 
	for(;;) 
	{ 
		if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) 
    	{ 
        	if(!GetMessage(&msg, NULL, 0, 0)) 
                break; 
        	TranslateMessage(&msg); 
        	DispatchMessage(&msg); 
    	} 
		else 
		{	 
			if(_AS->GetShutDown() || _AS->CheckModuleChange()) 
				PostQuitMessage(0); 
			if(!_AS->GetActive()) 
				continue; 
			_AS->UpdateWindows(); 
		} 
	} 
	_AS->WriteLogMessage("Left the game intro loop"); 
 
	_AS->bDraw = FALSE; 
	 
	// Left the game module: 
	return msg.wParam; 
} // end Intro() 
 
void InitIntro(void) 
{ // begin InitIntro() 
	InitTitel(); 
	fASLogoBlend = 0.0f; 
} // end Intro() 
 
HRESULT IntroDraw(AS_WINDOW *pWindow) 
{ // begin IntroDraw() 
	if(!_AS->bDraw) 
		return 0; 
 
	ASEnableLighting(); 
	glLoadIdentity(); 
	if(_AS->iActiveLights+1 < _AS->iMaxLights) 
	{ // General environment light: 
		GLfloat LightAmbient[]	= { 0.1f, 0.1f, 0.1f, 1.0f }; 
		GLfloat LightDiffuse[]	= { 0.3f, 0.3f, 0.3f, 1.0f };  
		float fLightData[4]  = {0.0f, 0.0f, 0.0f, 0.0f}; 
 
		fLightData[0] = -1.0f; 
		fLightData[1] = -1.0f; 
		fLightData[2] = 5.0f; 
		fLightData[3] = 1.0f; 
		glLightfv(GL_LIGHT1+_AS->iActiveLights, GL_POSITION, fLightData); 
		glLightfv(GL_LIGHT1+_AS->iActiveLights, GL_AMBIENT , LightAmbient); 
		glLightfv(GL_LIGHT1+_AS->iActiveLights, GL_DIFFUSE, LightDiffuse); 
		glEnable(GL_LIGHT1+_AS->iActiveLights);  
		_AS->iActiveLights++; 
	} 
 
 
	 // Draw the stuff which is inside the computer: 
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
	glViewport(0, 0, 256, 256);	// Set our viewport (match texture size) 
 
	// Setup normal projection: 
	glMatrixMode(GL_PROJECTION); 
	glLoadIdentity(); 
	gluPerspective(45.f, (float) (_ASConfig->iWindowWidth)/(float) (_ASConfig->iWindowHeight), 0.1f, 100.0f); 
	glMatrixMode(GL_MODELVIEW); 
	glLoadIdentity(); 
 
	DrawTitel(pWindow); 
 
	// Copy our viewport to the temp texture (from 0, 0 to 256, 256... no border) 
	glBindTexture(GL_TEXTURE_2D, TempTexture.iOpenGLID); 
	glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 256, 256, 0); 
 
 
	// Now setup the blur texture: 
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
	glViewport(0, 0, 128, 128); 
	 
	// Setup normal projection: 
	glMatrixMode(GL_PROJECTION); 
	glLoadIdentity(); 
	gluPerspective(45.f, (float) (_ASConfig->iWindowWidth)/(float) (_ASConfig->iWindowHeight), 0.1f, 100.0f); 
	glMatrixMode(GL_MODELVIEW); 
	glLoadIdentity(); 
	 
	// Draw the computer screen: 
	glTranslatef(0.0f, -1.0f, -6.0f); 
	glScalef(0.065f, 0.065f, 0.065f); 
	glEnable(GL_CULL_FACE); 
	glCullFace(GL_BACK); 
	glDisable(GL_LIGHTING); 
	glEnable(GL_TEXTURE_2D); 
	glBindTexture(GL_TEXTURE_2D, TempTexture.iOpenGLID); 
	glBegin(GL_QUADS); 
		glTexCoord2f(0.0f, 0.0f); glVertex3f(-19.5f, 11.0f, 18.5f); 
		glTexCoord2f(1.0f, 0.0f); glVertex3f(14.0f, 11.0f, 18.5f); 
		glTexCoord2f(1.0f, 1.0f); glVertex3f(14.0f, 36.0f, 18.5f); 
		glTexCoord2f(0.0f, 1.0f); glVertex3f(-19.5f, 36.0f, 18.5f); 
	glEnd(); 
 
	glBindTexture(GL_TEXTURE_2D, BlurTexture.iOpenGLID); 
	// Copy our viewport to the temp texture (from 0, 0 to 128, 128... no border) 
	glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 128, 128, 0); 
 
 
	// Now draw the real visible stuff: 
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
	glViewport(0, 0, _ASConfig->iWindowWidth, _ASConfig->iWindowHeight); 
 
	// Setup general stuff: 
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
	 
	// Setup normal projection: 
	glMatrixMode(GL_PROJECTION); 
	glLoadIdentity(); 
	gluPerspective(45.f, (float) (_ASConfig->iWindowWidth)/(float) (_ASConfig->iWindowHeight), 0.1f, 100.0f); 
	glMatrixMode(GL_MODELVIEW); 
	glLoadIdentity(); 
	 
	glCullFace(GL_FRONT); 
	glDisable(GL_BLEND); 
	glEnable(GL_DEPTH_TEST); 
	glEnable(GL_TEXTURE_2D); 
	ASEnableLighting(); 
	glColor3f(1.0f, 1.0f, 1.0f); 
	glTranslatef(0.0f, -1.5f, -2.5f-(float)  (sin(fGameTitleTimer*fGameTitleBlend/100))- 
									(float)  (sin(fGameTitleBlend/10))*2.5f); 
 
	glRotatef((float) sin(fGameTitleTimer*fGameTitleBlend/100)*10, 1.0f, 0.0f, 0.0f); 
	glRotatef((float) cos(fGameTitleTimer*fGameTitleBlend/100)*10, 0.0f, 1.0f, 0.0f); 
	glRotatef((float)  (180.0f+sin(fGameTitleTimer*fGameTitleBlend/100)*20), 0.0f, 0.0f, 1.0f); 
	glRotatef(180.0f, 1.0f, 0.0f, 0.0f); 
	glRotatef(180.0f, 0.0f, 1.0f, 0.0f); 
 
	glScalef(0.065f, 0.065f, 0.065f); 
	glBindTexture(GL_TEXTURE_2D, GameTexture[7].iOpenGLID); 
	ASDrawMd2Frame(pComputerModel, 0); 
	glDisable(GL_CULL_FACE); 
	 
	// Draw the computer screen: 
	glEnable(GL_CULL_FACE); 
	glCullFace(GL_BACK); 
	glEnable(GL_TEXTURE_2D); 
	glDisable(GL_LIGHTING); 
	glBindTexture(GL_TEXTURE_2D, TempTexture.iOpenGLID); 
	glBegin(GL_QUADS); 
		glTexCoord2f(0.0f, 0.0f); glVertex3f(-19.5f, 11.5f, 18.5f); 
		glTexCoord2f(1.0f, 0.0f); glVertex3f(14.0f, 11.5f, 18.5f); 
		glTexCoord2f(1.0f, 1.0f); glVertex3f(14.0f, 36.5f, 18.5f); 
		glTexCoord2f(0.0f, 1.0f); glVertex3f(-19.5f, 36.5f, 18.5f); 
	glEnd(); 
 
 
 
	// Now draw the blur around the screen: 
	glDisable(GL_DEPTH_TEST); 
	glDisable(GL_LIGHTING); 
	glEnable(GL_BLEND); 
	glBlendFunc(GL_SRC_ALPHA, GL_ONE); 
	glBindTexture(GL_TEXTURE_2D, BlurTexture.iOpenGLID); 
	glMatrixMode(GL_PROJECTION); 
	glPushMatrix(); 
	glLoadIdentity(); 
	glOrtho(0, _ASConfig->iWindowWidth, _ASConfig->iWindowHeight, 0, -1, 1); 
	glMatrixMode(GL_MODELVIEW); 
	glPushMatrix(); 
	glLoadIdentity();		 
 
	float fInc = 0.1f, fSpost = 0.0f, fAlphainc = 0.7f/20, fAlpha = 0.2f; 
	fAlphainc = fAlpha/20; 
	glBegin(GL_QUADS); 
		for(int i = 0; i < 20; i++) 
		{ 
			glColor4f(1.0f, 1.0f, 1.0f, fAlpha); 
			glTexCoord2f(0.0f+fSpost, 1.0f-fSpost); 
			glVertex2f(0.0f, 0.0f); 
			glTexCoord2f(0.0f+fSpost, 0.0f+fSpost); 
			glVertex2f(0.0f, (float) _ASConfig->iWindowHeight); 
			glTexCoord2f(1.0f-fSpost, 0.0f+fSpost); 
			glVertex2f((float) _ASConfig->iWindowWidth, (float) _ASConfig->iWindowHeight); 
			glTexCoord2f(1.0f-fSpost, 1.0f-fSpost); 
			glVertex2f((float) _ASConfig->iWindowWidth, 0.0f); 
			fSpost += fInc; 
			fAlpha -= fAlphainc; 
		} 
	glEnd(); 
 
	glMatrixMode(GL_MODELVIEW); 
	glLoadIdentity(); 
	glViewport(0, 0, _ASConfig->iWindowWidth, _ASConfig->iWindowHeight); 
	glMatrixMode(GL_PROJECTION); 
	glLoadIdentity(); 
	gluPerspective(45.f, (GLfloat)_ASConfig->iWindowWidth/(GLfloat)_ASConfig->iWindowHeight, 0.1f, 1000.0f); 
	glMatrixMode(GL_MODELVIEW); 
	glDisable(GL_DEPTH_TEST); 
	glLoadIdentity(); 
 
	if(fContinueBlend*fASLogoBlend) 
	{ 
		glColor4f(1.0f, 1.0f, 1.0f, fContinueBlend*fASLogoBlend); 
		pWindow->PrintAnimated(320, 460, M_PressAnyKeyToContinue, 0, 1.0f, fFontAni, 1); 
	} 
 
	glCullFace(GL_BACK); 
	DisplaySmallMessage(pWindow); 
	ASSwapBuffers(*pWindow->GethDC(), pWindow, TRUE); 
 
	return 0; 
} // end IntroDraw() 
 
HRESULT IntroCheck(AS_WINDOW *pWindow) 
{ // begin IntroCheck() 
	_AS->ReadDXInput(*pWindow->GethWnd()); 
	AnimateFont(); 
	_ASCamera->SetCameraTranslation(FALSE); 
	CheckSmallMessage(); 
	CheckTitel(); 
 
	if(!bContinueBlend) 
	{ 
		fContinueBlend += (float) g_lDeltatime/1000; 
		if(fContinueBlend > 1.0f) 
		{ 
			fContinueBlend = 1.0f; 
			bContinueBlend = 1; 
		} 
	} 
	else 
	{ 
		fContinueBlend -= (float) g_lDeltatime/1000; 
		if(fContinueBlend < 0.0f) 
		{ 
			fContinueBlend = 0.0f; 
			bContinueBlend = 0; 
		} 
	} 
 
// Keys: 
	if(ASKeyFirst[DIK_F1]) 
	{ // Open the help file: 
		OpenHelp(); 
 
		return 0; 
	} 
	if(ASKeyFirst[DIK_F11]) 
		MusicNext(); 
	if(ASKeyFirst[DIK_F12]) 
	{ // Open the configuration menu: 
		SendMessage(*_AS->pWindow[GAME_WINDOW_ID].GethWnd(), WM_COMMAND, ID_OPTIONS_CONFIG, 0); 
		InitGameMenuElementsLanguage(); 
	} 
	if(ASIsKeyPressed()) 
		_AS->SetNextModule(MODULE_MENU); 
 
	return 0; 
} // end IntroCheck() 
 
void DrawTitel(AS_WINDOW *pWindow) 
{ // begin DrawTitel() 
	int iX, iY; 
	 
	glDisable(GL_LIGHTING); 
 
	// Draw the grid: 
	glDisableClientState(GL_COLOR_ARRAY); 
	glDisableClientState(GL_NORMAL_ARRAY); 
	glLoadIdentity(); 
	glRotatef((float) sin(fGameTitleTimer*fGameTitleBlend/100)*20, 1.0f, 0.0f, 0.0f); 
	glRotatef((float) cos(fGameTitleTimer*fGameTitleBlend/100)*10, 0.0f, 1.0f, 0.0f); 
	glRotatef((float)  (180.0f+sin(fGameTitleTimer*fGameTitleBlend/100)*50), 0.0f, 0.0f, 1.0f); 
	glTranslatef(7.0f, -3.0f, (float)  (-22.0f+sin(fGameTitleTimer*fGameTitleBlend/100)*5)); 
	glRotatef(180.0f, 0.0f, 1.0f, 0.0f); 
 
	glDisable(GL_CULL_FACE); 
	glDisable(GL_DEPTH_TEST); 
	glDisable(GL_FOG); 
	glDisable(GL_LIGHTING); 
	glBlendFunc(GL_SRC_ALPHA, GL_ONE); 
	glEnable(GL_BLEND); 
	glEnable(GL_TEXTURE_2D); 
	glColor4f(1.0f-1.0f*fGameTitleDarking, 1.0f-1.0f*fGameTitleDarking, 1.0f-1.0f*fGameTitleDarking, fGameTitleBlend-10.0f*fASLogoBlend); 
 
	glBindTexture(GL_TEXTURE_2D, GameTexture[9].iOpenGLID); 
	glEnableClientState(GL_VERTEX_ARRAY); 
	glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
	glVertexPointer(3, GL_FLOAT, 0, fTitelGridPoint); 
	glTexCoordPointer(2, GL_FLOAT, 0, fTitelGridTexture); 
	glBegin(GL_TRIANGLES); 
		for(iY = 0; iY < TITEL_GRID_Y_SIZE-1; iY++) 
		{ 
			for(iX = 1; iX < TITEL_GRID_X_SIZE-1; iX++) 
			{ 
				// Draw the first triangle of the quad: 
				glArrayElement((iX-1)+iY*TITEL_GRID_X_SIZE); 
				glArrayElement(iX+iY*TITEL_GRID_X_SIZE); 
				glArrayElement(iX+(iY+1)*TITEL_GRID_X_SIZE); 
				// Draw the second triangle of the quad: 
				glArrayElement(iX+(iY+1)*TITEL_GRID_X_SIZE); 
				glArrayElement((iX-1)+(iY+1)*TITEL_GRID_X_SIZE); 
				glArrayElement((iX-1)+iY*TITEL_GRID_X_SIZE); 
			} 
		} 
	glEnd(); 
	 
	// Now draw the AS-logo: 
	glBindTexture(GL_TEXTURE_2D, GameTexture[10].iOpenGLID); 
	glLoadIdentity(); 
	glTranslatef(0.0f, 0.0f, -2.6f); 
	glColor4f(0.8f, 0.8f, 0.8f, fASLogoBlend*0.8f); 
	glBegin(GL_QUADS); 
		glTexCoord2f(0.0f, 1.0f); 
		glVertex2f(-1.4f, -1.0f); 
		glTexCoord2f(1.0f, 1.0f); 
		glVertex2f(1.4f, -1.0f); 
		glTexCoord2f(1.0f, 0.0f); 
		glVertex2f(1.4f, 1.0f); 
		glTexCoord2f(0.0f, 0.0f); 
		glVertex2f(-1.4f, 1.0f); 
	glEnd(); 
	 
	glEnable(GL_BLEND); 
	glColor4f(0.8f, 0.8f, 0.8f, fASLogoBlend*0.8f); 
	pWindow->PrintAnimated(320, 50, "AblazeSpace", 0, 4.0f, fFontAni, 1); 
	pWindow->PrintAnimated(320, 10, "2002", 0, 4.0f, fFontAni, 1); 
} // end DrawTitel() 
 
void CheckTitel(void) 
{ // begin CheckTitel() 
	float fTemp; 
	int iX, iY; 
 
	fGameTitleTimer += (float) g_lDeltatime/1000; 
	fTemp = 2000*fGameTitleBlend; 
	if(fTemp > 4500) 
		fTemp = 4500; 
	fGameTitleBlend += (float) g_lDeltatime/(6000-fTemp); 
	if(fGameTitleBlend > 15.0f) 
		fGameTitleBlend = 15.0f; 
	if(fGameTitleBlend > 5.0f) 
	{ 
		fASLogoBlend += (float) g_lDeltatime/10000; 
		if(fASLogoBlend > 1.0f) 
			fASLogoBlend = 1.0f; 
	} 
 
	fGameTitleDarking += (float) g_lDeltatime/50000; 
	if(fGameTitleDarking > 0.8f) 
		fGameTitleDarking = 0.8f; 
 
	// Setup the grid: 
	for(iY = 0; iY < TITEL_GRID_Y_SIZE; iY++) 
	{ 
		for(iX = 0; iX < TITEL_GRID_X_SIZE; iX++) 
		{ // Set the z coordinate: 
			fTitelGridPoint[iX+iY*TITEL_GRID_X_SIZE][Z] = (float) ( 
														 0.6f*sin((float) iX+fGameTitleTimer)*fGameTitleBlend+ 
														 0.6f*sin((float) iY+fGameTitleTimer)*fGameTitleBlend); 
		} 
	} 
} // end CheckTitel() 
 
void InitTitel(void) 
{ // begin InitTitel() 
	int iX, iY; 
 
	fGameTitleTimer = fGameTitleBlend = fGameTitleDarking = 0.0f; 
	// Setup the grid: 
	for(iY = 0; iY < TITEL_GRID_Y_SIZE; iY++) 
	{ 
		for(iX = 0; iX < TITEL_GRID_X_SIZE; iX++) 
		{ // Set the coordinates: 
			fTitelGridTexture[iX+iY*TITEL_GRID_X_SIZE][X] = (float) iX/(TITEL_GRID_X_SIZE-2); 
			fTitelGridTexture[iX+iY*TITEL_GRID_X_SIZE][Y] = (float) iY/(TITEL_GRID_Y_SIZE-1); 
 
			fTitelGridPoint[iX+iY*TITEL_GRID_X_SIZE][X] = (float) iX*1.3f; 
			fTitelGridPoint[iX+iY*TITEL_GRID_X_SIZE][Y] = (float) iY/1.5f; 
			fTitelGridPoint[iX+iY*TITEL_GRID_X_SIZE][Z] = (float) ( 
														 0.2f*sin((float) iX+fGameTitleTimer)+ 
														 0.2f*sin((float) iY+fGameTitleTimer)); 
		} 
	} 
} // end InitTitel()