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()