Files
glest-source/source/glest_game/main/intro.cpp
andy5995 0f469061ec glest_game/main:reformat/restyle source code [skip ci]
* used 'indent -nut -i2 -bli0 -ppi 3 *`
2018-01-25 02:21:15 -06:00

1140 lines
36 KiB
C++

// ==============================================================
// This file is part of Glest (www.glest.org)
//
// Copyright (C) 2001-2008 Martiño Figueroa
//
// You can redistribute this code and/or modify it under
// the terms of the GNU General Public License as published
// by the Free Software Foundation; either version 2 of the
// License, or (at your option) any later version
// ==============================================================
#include "intro.h"
#include "main_menu.h"
#include "util.h"
#include "game_util.h"
#include "config.h"
#include "program.h"
#include "renderer.h"
#include "sound_renderer.h"
#include "core_data.h"
#include "metrics.h"
#include "auto_test.h"
#include "util.h"
//#include "glm.h"
//#include "md5util.h"
//#include "Mathlib.h"
#include "video_player.h"
#include "leak_dumper.h"
using namespace
Shared::Util;
using
namespace
Shared::Graphics;
using
namespace
Shared::Xml;
namespace Glest
{
namespace Game
{
//struct Timer {
//public:
// Timer ()
// : current_time (0.0), last_time (0.0) { }
//
//public:
// void update () {
// last_time = current_time;
// current_time = static_cast<double>(SDL_GetTicks ()) / 1000.0;
// }
//
// double deltaTime () const {
// return (current_time - last_time);
// }
//
//public:
// double current_time;
// double last_time;
//
//} animTimer;
// =====================================================
// class Text
// =====================================================
IntroText::IntroText (const string & text, const Vec2i & pos, int time,
Font2D * font, Font3D * font3D)
{
this->text = text;
this->pos = pos;
this->time = time;
this->texture = NULL;
this->font = font;
this->font3D = font3D;
}
IntroText::IntroText (const Texture2D * texture, const Vec2i & pos,
const Vec2i & size, int time)
{
this->pos = pos;
this->size = size;
this->time = time;
this->texture = texture;
this->font = NULL;
this->font3D = NULL;
}
// =====================================================
// class Intro
// =====================================================
int
Intro::introTime = 50000;
int
Intro::appearTime = 2500;
int
Intro::showTime = 3500;
int
Intro::disapearTime = 2500;
Intro::Intro (Program * program):
ProgramState (program)
{
if (SystemFlags::
getSystemSettingType (SystemFlags::debugSystem).enabled)
SystemFlags::OutputDebug (SystemFlags::debugSystem,
"In [%s::%s Line: %d]\n", __FILE__,
__FUNCTION__, __LINE__);
CoreData & coreData = CoreData::getInstance ();
SoundRenderer & soundRenderer = SoundRenderer::getInstance ();
if (GlobalStaticFlags::getIsNonGraphicalModeEnabled () == false &&
(::Shared::Graphics::VideoPlayer::hasBackEndVideoPlayer () == false
|| CoreData::getInstance ().hasIntroVideoFilename () == false))
{
soundRenderer.playMusic (CoreData::getInstance ().getIntroMusic ());
}
const
Metrics &
metrics = Metrics::getInstance ();
int
w = metrics.getVirtualW ();
int
h = metrics.getVirtualH ();
timer = 0;
mouseX = 0;
mouseY = 0;
mouse2d = 0;
exitAfterIntroVideo = false;
Renderer & renderer = Renderer::getInstance ();
//renderer.init3dListMenu(NULL);
renderer.initMenu (NULL);
fade = 0.f;
anim = 0.f;
targetCamera = NULL;
t = 0.f;
startPosition.x = 5;;
startPosition.y = 10;
startPosition.z = 40;
camera.setPosition (startPosition);
Vec3f startRotation;
startRotation.x = 0;
startRotation.y = 0;
startRotation.z = 0;
camera.setOrientation (Quaternion
(EulerAngles
(degToRad (startRotation.x),
degToRad (startRotation.y),
degToRad (startRotation.z))));
Intro::introTime = 3000;
Intro::appearTime = 500;
Intro::showTime = 500;
Intro::disapearTime = 500;
int
showIntroPics = 0;
int
showIntroPicsTime = 0;
bool showIntroPicsRandom = false;
bool showIntroModels = false;
bool showIntroModelsRandom = false;
modelMinAnimSpeed = 0;
modelMaxAnimSpeed = 0;
XmlTree xmlTree;
string
data_path =
getGameReadWritePath (GameConstants::path_data_CacheLookupKey);
xmlTree.load (getGameCustomCoreDataPath
(data_path, "data/core/menu/menu.xml"),
Properties::getTagReplacementValues ());
const XmlNode *
menuNode = xmlTree.getRootNode ();
if (menuNode->hasChild ("intro") == true)
{
const XmlNode *
introNode = menuNode->getChild ("intro");
if (SystemFlags::
getSystemSettingType (SystemFlags::debugSystem).enabled)
SystemFlags::OutputDebug (SystemFlags::debugSystem,
"In [%s::%s %d]\n", __FILE__,
__FUNCTION__, __LINE__);
//camera
const XmlNode *
cameraNode = introNode->getChild ("camera");
//position
const XmlNode *
positionNode = cameraNode->getChild ("start-position");
startPosition.x = positionNode->getAttribute ("x")->getFloatValue ();
startPosition.y = positionNode->getAttribute ("y")->getFloatValue ();
startPosition.z = positionNode->getAttribute ("z")->getFloatValue ();
camera.setPosition (startPosition);
//rotation
const XmlNode *
rotationNode = cameraNode->getChild ("start-rotation");
Vec3f startRotation;
startRotation.x = rotationNode->getAttribute ("x")->getFloatValue ();
startRotation.y = rotationNode->getAttribute ("y")->getFloatValue ();
startRotation.z = rotationNode->getAttribute ("z")->getFloatValue ();
camera.setOrientation (Quaternion
(EulerAngles
(degToRad (startRotation.x),
degToRad (startRotation.y),
degToRad (startRotation.z))));
// intro info
const XmlNode *
introTimeNode = introNode->getChild ("intro-time");
Intro::introTime =
introTimeNode->getAttribute ("value")->getIntValue ();
const XmlNode *
appearTimeNode = introNode->getChild ("appear-time");
Intro::appearTime =
appearTimeNode->getAttribute ("value")->getIntValue ();
const XmlNode *
showTimeNode = introNode->getChild ("show-time");
Intro::showTime =
showTimeNode->getAttribute ("value")->getIntValue ();
const XmlNode *
disappearTimeNode = introNode->getChild ("disappear-time");
Intro::disapearTime =
disappearTimeNode->getAttribute ("value")->getIntValue ();
const XmlNode *
showIntroPicturesNode = introNode->getChild ("show-intro-pictures");
showIntroPics =
showIntroPicturesNode->getAttribute ("value")->getIntValue ();
showIntroPicsTime =
showIntroPicturesNode->getAttribute ("time")->getIntValue ();
showIntroPicsRandom =
showIntroPicturesNode->getAttribute ("random")->getBoolValue ();
const XmlNode *
showIntroModelsNode = introNode->getChild ("show-intro-models");
showIntroModels =
showIntroModelsNode->getAttribute ("value")->getBoolValue ();
showIntroModelsRandom =
showIntroModelsNode->getAttribute ("random")->getBoolValue ();
modelMinAnimSpeed =
showIntroModelsNode->
getAttribute ("min-anim-speed")->getFloatValue ();
modelMaxAnimSpeed =
showIntroModelsNode->
getAttribute ("max-anim-speed")->getFloatValue ();
}
//load main model
modelIndex = 0;
models.clear ();
if (showIntroModels == true)
{
//getGameCustomCoreDataPath(data_path, "data/core/menu/menu.xml")
string
introPath =
getGameCustomCoreDataPath (data_path,
"") +
"data/core/menu/main_model/intro*.g3d";
vector < string > introModels;
findAll (introPath, introModels, false, false);
for (int i = 0; i < (int) introModels.size (); ++i)
{
string logo = introModels[i];
Model *
model = renderer.newModel (rsMenu,
getGameCustomCoreDataPath (data_path,
"") +
"data/core/menu/main_model/" + logo);
if (model)
{
models.push_back (model);
//printf("#1 Intro model [%s]\n",model->getFileName().c_str());
}
}
if (models.empty () == true)
{
introPath = data_path + "data/core/menu/main_model/intro*.g3d";
//vector<string> introModels;
findAll (introPath, introModels, false, false);
for (int i = 0; i < (int) introModels.size (); ++i)
{
string logo = introModels[i];
Model *
model = renderer.newModel (rsMenu,
data_path +
"data/core/menu/main_model/" + logo);
if (model)
{
models.push_back (model);
//printf("#2 Intro model [%s]\n",model->getFileName().c_str());
}
}
}
if (showIntroModelsRandom == true)
{
std::vector < Model * >modelList;
//unsigned int seed = time(NULL);
Chrono seed (true);
srand ((unsigned int) seed.getCurTicks ());
int
failedLookups = 0;
std::map < int,
bool >
usedIndex;
for (; modelList.size () < models.size ();)
{
int
index = rand () % models.size ();
if (usedIndex.find (index) != usedIndex.end ())
{
failedLookups++;
srand ((unsigned int) seed.getCurTicks () / failedLookups);
continue;
}
//printf("picIndex = %d list count = %d\n",picIndex,coreData.getMiscTextureList().size());
modelList.push_back (models[index]);
usedIndex[index] = true;
srand ((unsigned int) seed.getCurTicks () /
(unsigned int) modelList.size ());
}
models = modelList;
}
}
int
displayItemNumber = 1;
int
appear = Intro::appearTime;
int
disappear =
Intro::showTime + Intro::appearTime + (Intro::disapearTime * 2);
const unsigned int
maxIntroLines = 100;
Lang & lang = Lang::getInstance ();
for (unsigned int i = 1; i < maxIntroLines; ++i)
{
string introTagName = "IntroText" + intToStr (i);
string introTagTextureName = "IntroTexture" + intToStr (i);
if (lang.hasString (introTagName, "", true) == true ||
lang.hasString (introTagTextureName, "", true) == true)
{
string lineText = "";
if (lang.hasString (introTagName, "", true) == true)
{
lineText = lang.getString (introTagName, "", true);
}
string showStartTime = "IntroStartMilliseconds" + intToStr (i);
int
displayTime = appear;
if (lang.hasString (showStartTime, "", true) == true)
{
displayTime = strToInt (lang.getString (showStartTime, "", true));
}
else
{
if (i == 1)
{
displayTime = appear;
}
else if (i == 2)
{
displayTime = disappear;
}
else if (i >= 3)
{
displayTime = disappear * (++displayItemNumber);
}
}
// Is this a texture?
if (lang.hasString (introTagName, "", true) == false &&
lang.hasString (introTagTextureName, "", true) == true)
{
string
introTagTextureWidthName = "IntroTextureWidth" + intToStr (i);
string
introTagTextureHeightName = "IntroTextureHeight" + intToStr (i);
lineText = lang.getString (introTagTextureName, "", true);
Texture2D *
logoTexture = renderer.newTexture2D (rsGlobal);
if (logoTexture)
{
logoTexture->setMipmap (false);
logoTexture->getPixmap ()->load (lineText);
renderer.initTexture (rsGlobal, logoTexture);
}
int
textureWidth = 256;
if (logoTexture != NULL)
{
textureWidth = logoTexture->getTextureWidth ();
}
if (lang.hasString (introTagTextureWidthName, "", true) == true)
{
textureWidth =
strToInt (lang.getString
(introTagTextureWidthName, "", true));
}
int
textureHeight = 128;
if (logoTexture != NULL)
{
textureHeight = logoTexture->getTextureHeight ();
}
if (lang.hasString (introTagTextureHeightName, "", true) == true)
{
textureHeight =
strToInt (lang.getString
(introTagTextureHeightName, "", true));
}
texts.push_back (new
IntroText (logoTexture,
Vec2i (w / 2 - (textureWidth / 2),
h / 2 - (textureHeight / 2)),
Vec2i (textureWidth, textureHeight),
displayTime));
}
// This is a line of text
else
{
string introTagTextXName = "IntroTextX" + intToStr (i);
string introTagTextYName = "IntroTextY" + intToStr (i);
string
introTagTextFontTypeName = "IntroTextFontType" + intToStr (i);
int
textX = -1;
if (lang.hasString (introTagTextXName, "", true) == true)
{
string value = lang.getString (introTagTextXName, "", true);
if (value.length () > 0 && (value[0] == '+' || value[0] == '-'))
{
textX = w / 2 + strToInt (value);
}
else
{
textX = strToInt (value);
}
}
int
textY = -1;
if (lang.hasString (introTagTextYName, "", true) == true)
{
string value = lang.getString (introTagTextYName, "", true);
if (value.length () > 0 && (value[0] == '+' || value[0] == '-'))
{
textY = h / 2 + strToInt (value);
}
else
{
textY = strToInt (value);
}
}
Font2D *
font = coreData.getMenuFontVeryBig ();
Font3D *
font3d = coreData.getMenuFontVeryBig3D ();
if (lang.hasString (introTagTextFontTypeName, "", true) == true)
{
string
value = lang.getString (introTagTextFontTypeName, "", true);
if (value == "displaynormal")
{
font = coreData.getDisplayFont ();
font3d = coreData.getDisplayFont3D ();
}
else if (value == "displaysmall")
{
font = coreData.getDisplayFontSmall ();
font3d = coreData.getDisplayFontSmall3D ();
}
else if (value == "menunormal")
{
font = coreData.getMenuFontNormal ();
font3d = coreData.getMenuFontNormal3D ();
}
else if (value == "menubig")
{
font = coreData.getMenuFontBig ();
font3d = coreData.getMenuFontBig3D ();
}
else if (value == "menuverybig")
{
font = coreData.getMenuFontVeryBig ();
font3d = coreData.getMenuFontVeryBig3D ();
}
else if (value == "consolenormal")
{
font = coreData.getConsoleFont ();
font3d = coreData.getConsoleFont3D ();
}
}
texts.push_back (new
IntroText (lineText, Vec2i (textX, textY),
displayTime, font, font3d));
}
}
else
{
break;
}
}
modelShowTime = disappear * (displayItemNumber);
if (lang.hasString ("IntroModelStartMilliseconds", "", true) == true)
{
modelShowTime =
strToInt (lang.getString ("IntroModelStartMilliseconds", "", true));
}
else
{
modelShowTime = disappear * (displayItemNumber);
}
/*
string lineText = "Based on award-winning classic Glest";
texts.push_back(new Text(lineText, Vec2i(-1, -1), appear, coreData.getMenuFontVeryBig(),coreData.getMenuFontVeryBig3D()));
lineText = "the MegaGlest Team presents";
texts.push_back(new Text(lineText, Vec2i(-1, -1), disappear, coreData.getMenuFontVeryBig(),coreData.getMenuFontVeryBig3D()));
lineText = "a libre software real-time strategy game";
texts.push_back(new Text(lineText, Vec2i(-1, -1), disappear *(++displayItemNumber), coreData.getMenuFontVeryBig(),coreData.getMenuFontVeryBig3D()));
texts.push_back(new Text(coreData.getLogoTexture(), Vec2i(w/2-128, h/2-64), Vec2i(256, 128), disappear *(++displayItemNumber)));
texts.push_back(new Text(glestVersionString, Vec2i(w/2+45, h/2-45), disappear *(displayItemNumber++), coreData.getMenuFontNormal(),coreData.getMenuFontNormal3D()));
lineText = "www.megaglest.org";
//texts.push_back(new Text(lineText, Vec2i(-1, -1), disappear *(displayItemNumber++), coreData.getMenuFontVeryBig(),coreData.getMenuFontVeryBig3D()));
texts.push_back(new Text(lineText, Vec2i(-1, h/2-45-18), disappear *(displayItemNumber-1), coreData.getMenuFontVeryBig(),coreData.getMenuFontVeryBig3D()));
*/
if (showIntroPics > 0 && coreData.getMiscTextureList ().size () > 0)
{
const int
showMiscTime = showIntroPicsTime;
std::vector < Texture2D * >intoTexList;
if (showIntroPicsRandom == true)
{
//unsigned int seed = time(NULL);
Chrono seed (true);
srand ((unsigned int) seed.getCurTicks ());
int
failedLookups = 0;
std::map < int,
bool >
usedIndex;
for (; (int) intoTexList.size () < showIntroPics;)
{
int
picIndex = rand () % coreData.getMiscTextureList ().size ();
if (usedIndex.find (picIndex) != usedIndex.end ())
{
failedLookups++;
srand ((unsigned int) seed.getCurTicks () / failedLookups);
if (failedLookups > 10000)
{
for (unsigned int i = 0;
i < coreData.getMiscTextureList ().size (); ++i)
{
if (usedIndex.find (i) == usedIndex.end ())
{
picIndex = i;
break;
}
}
}
else
{
continue;
}
}
//printf("picIndex = %d list count = %d\n",picIndex,coreData.getMiscTextureList().size());
intoTexList.push_back (coreData.getMiscTextureList ()[picIndex]);
usedIndex[picIndex] = true;
srand ((unsigned int) seed.getCurTicks () /
(unsigned int) intoTexList.size ());
}
}
else
{
for (unsigned int i = 0;
i < (unsigned int) coreData.getMiscTextureList ().size () &&
i < (unsigned int) showIntroPics; ++i)
{
Texture2D *
tex = coreData.getMiscTextureList ()[i];
intoTexList.push_back (tex);
}
}
for (unsigned int i = 0; i < intoTexList.size (); ++i)
{
Texture2D *
tex = intoTexList[i];
//printf("tex # %d [%s]\n",i,tex->getPath().c_str());
Vec2i texPlacement;
if (i == 0 || i % 9 == 0)
{
texPlacement = Vec2i (1, h - tex->getTextureHeight ());
}
else if (i == 1 || i % 9 == 1)
{
texPlacement = Vec2i (1, 1);
}
else if (i == 2 || i % 9 == 2)
{
texPlacement = Vec2i (w - tex->getTextureWidth (), 1);
}
else if (i == 3 || i % 9 == 3)
{
texPlacement =
Vec2i (w - tex->getTextureWidth (),
h - tex->getTextureHeight ());
}
else if (i == 4 || i % 9 == 4)
{
texPlacement =
Vec2i (w / 2 - tex->getTextureWidth () / 2,
h - tex->getTextureHeight ());
}
else if (i == 5 || i % 9 == 5)
{
texPlacement = Vec2i (w / 2 - tex->getTextureWidth () / 2, 1);
}
else if (i == 6 || i % 9 == 6)
{
texPlacement =
Vec2i (1, (h / 2) - (tex->getTextureHeight () / 2));
}
else if (i == 7 || i % 9 == 7)
{
texPlacement =
Vec2i (w - tex->getTextureWidth (),
(h / 2) - (tex->getTextureHeight () / 2));
}
int
textureStartTime = disappear * displayItemNumber;
if (lang.hasString ("IntroTextureStartMilliseconds", "", true) ==
true)
{
textureStartTime =
strToInt (lang.getString ("IntroTextureStartMilliseconds", "",
true));
}
texts.push_back (new
IntroText (tex, texPlacement,
Vec2i (tex->getTextureWidth (),
tex->getTextureHeight ()),
textureStartTime +
(showMiscTime * (i + 1))));
}
}
if (GlobalStaticFlags::getIsNonGraphicalModeEnabled () == false)
{
renderer.swapBuffers ();
}
SystemFlags::OutputDebug (SystemFlags::debugSystem,
"In [%s::%s Line: %d]\n", __FILE__,
__FUNCTION__, __LINE__);
if (GlobalStaticFlags::getIsNonGraphicalModeEnabled () == false
&&::Shared::Graphics::VideoPlayer::hasBackEndVideoPlayer () == true
&& CoreData::getInstance ().hasIntroVideoFilename () == true)
{
string
introVideoFile = CoreData::getInstance ().getIntroVideoFilename ();
string
introVideoFileFallback =
CoreData::getInstance ().getIntroVideoFilenameFallback ();
if (SystemFlags::VERBOSE_MODE_ENABLED)
printf ("Intro Video [%s] [%s]\n", introVideoFile.c_str (),
introVideoFileFallback.c_str ());
Context *
c = GraphicsInterface::getInstance ().getCurrentContext ();
PlatformContextGl *
glCtx = static_cast < ContextGl * >(c)->getPlatformContextGlPtr ();
SDL_Window *
window = glCtx->getScreenWindow ();
SDL_Surface *
screen = glCtx->getScreenSurface ();
string
vlcPluginsPath =
Config::getInstance ().getString ("VideoPlayerPluginsPath", "");
//printf("screen->w = %d screen->h = %d screen->format->BitsPerPixel = %d\n",screen->w,screen->h,screen->format->BitsPerPixel);
::Shared::Graphics::VideoPlayer player (&Renderer::getInstance (),
introVideoFile,
introVideoFileFallback,
window,
0, 0,
screen->w,
screen->h,
screen->format->BitsPerPixel,
false,
vlcPluginsPath,
SystemFlags::VERBOSE_MODE_ENABLED);
player.PlayVideo ();
exitAfterIntroVideo = true;
return;
}
SystemFlags::OutputDebug (SystemFlags::debugSystem,
"In [%s::%s Line: %d]\n", __FILE__,
__FUNCTION__, __LINE__);
}
Intro::~Intro ()
{
deleteValues (texts.begin (), texts.end ());
//deleteValues(introTextureList.begin(),introTextureList.end());
// if(test) {
// glmDelete(test);
// }
//Shared::Graphics::md5::cleanupMD5OpenGL();
}
void
Intro::update ()
{
if (exitAfterIntroVideo == true)
{
mouseUpLeft (0, 0);
//cleanup();
return;
}
timer++;
if (timer > introTime * GameConstants::updateFps / 1000)
{
SystemFlags::OutputDebug (SystemFlags::debugSystem,
"In [%s::%s Line: %d]\n", __FILE__,
__FUNCTION__, __LINE__);
cleanup ();
return;
}
if (Config::getInstance ().getBool ("AutoTest"))
{
SystemFlags::OutputDebug (SystemFlags::debugSystem,
"In [%s::%s Line: %d]\n", __FILE__,
__FUNCTION__, __LINE__);
AutoTest::getInstance ().updateIntro (program);
return;
}
mouse2d = (mouse2d + 1) % Renderer::maxMouse2dAnim;
if (targetCamera != NULL)
{
t +=
((0.01f +
(1.f - t) / 10.f) / 20.f) * (60.f / GameConstants::updateFps);
//interpolate position
camera.setPosition (lastCamera.
getPosition ().lerp (t,
targetCamera->
getPosition ()));
//interpolate orientation
Quaternion
q =
lastCamera.getOrientation ().lerp (t,
targetCamera->getOrientation ());
camera.setOrientation (q);
if (t >= 1.f)
{
targetCamera = NULL;
t = 0.f;
}
}
//fade
if (fade <= 1.f)
{
fade += 0.6f / GameConstants::updateFps;
if (fade > 1.f)
{
fade = 1.f;
}
}
//animation
//const float minSpeed = 0.015f;
//const float minSpeed = 0.010f;
//const float maxSpeed = 0.6f;
const float
minSpeed = modelMinAnimSpeed;
const float
maxSpeed = modelMaxAnimSpeed;
anim +=
(maxSpeed / GameConstants::updateFps) / 5 +
random.randRange (minSpeed,
max (minSpeed + 0.0001f,
(maxSpeed / GameConstants::updateFps) / 5.f));
if (anim > 1.f)
{
anim = 0.f;
}
//animTimer.update();
}
void
Intro::renderModelBackground ()
{
// Black background
glClearColor (0, 0, 0, 1);
if (models.empty () == false)
{
int
difTime = 1000 * timer / GameConstants::updateFps - modelShowTime;
int
totalModelShowTime = Intro::introTime - modelShowTime;
int
individualModelShowTime = totalModelShowTime / (int) models.size ();
//printf("difTime = %d individualModelShowTime = %d modelIndex = %d\n",difTime,individualModelShowTime,modelIndex);
//int difTime= 1;
if (difTime > 0)
{
if (difTime > ((modelIndex + 1) * individualModelShowTime))
{
//int oldmodelIndex = modelIndex;
if (modelIndex + 1 < (int) models.size ())
{
modelIndex++;
//position
//nextCamera.setPosition(camera.getPosition());
// nextCamera.setPosition(Vec3f(84,-9,11));
//
// //rotation
// //Vec3f startRotation(0,12,0);
// Vec3f startRotation(0,-80,0);
// nextCamera.setOrientation(Quaternion(EulerAngles(
// degToRad(startRotation.x),
// degToRad(startRotation.y),
// degToRad(startRotation.z))));
//
// this->targetCamera = &nextCamera;
// this->lastCamera= camera;
// this->t= 0.f;
}
//printf("oldmodelIndex = %d, modelIndex = %d\n",oldmodelIndex,modelIndex);
}
Renderer & renderer = Renderer::getInstance ();
vector < Model * >characterModels;
characterModels.push_back (NULL);
characterModels.push_back (NULL);
characterModels.push_back (models[modelIndex]);
const
Vec3f
characterPosition = startPosition;
renderer.renderMenuBackground (&camera, fade, NULL, characterModels,
characterPosition, anim);
}
}
}
void
Intro::render ()
{
Renderer & renderer = Renderer::getInstance ();
if (GlobalStaticFlags::getIsNonGraphicalModeEnabled () == true)
{
return;
}
canRender ();
incrementFps ();
renderer.clearBuffers ();
renderer.reset3dMenu ();
renderer.clearZBuffer ();
renderer.loadCameraMatrix (&camera);
renderModelBackground ();
renderer.renderParticleManager (rsMenu);
renderer.reset2d ();
for (int i = 0; i < (int) texts.size (); ++i)
{
IntroText *
text = texts[i];
int
difTime =
1000 * timer / GameConstants::updateFps - text->getTime ();
if (difTime > 0 && difTime < appearTime + showTime + disapearTime)
{
float
alpha = 1.f;
if (difTime > 0 && difTime < appearTime)
{
//apearing
alpha = static_cast < float >(difTime) /
appearTime;
}
else if (difTime > 0
&& difTime < appearTime + showTime + disapearTime)
{
//disappearing
alpha =
1.f - static_cast < float >(difTime - appearTime - showTime) /
disapearTime;
}
if (text->getText ().empty () == false)
{
int
renderX = text->getPos ().x;
int
renderY = text->getPos ().y;
if (Renderer::renderText3DEnabled)
{
if (renderX < 0)
{
const
Metrics &
metrics = Metrics::getInstance ();
int
w = metrics.getVirtualW ();
renderX =
(w / 2) -
(text->getFont3D ()->
getMetrics ()->getTextWidth (text->getText ()) / 2);
}
if (renderY < 0)
{
const
Metrics &
metrics = Metrics::getInstance ();
int
h = metrics.getVirtualH ();
renderY =
(h / 2) +
(text->getFont3D ()->
getMetrics ()->getHeight (text->getText ()) / 2);
}
renderer.renderText3D (text->getText (), text->getFont3D (),
alpha, renderX, renderY, false);
}
else
{
if (renderX < 0)
{
const
Metrics &
metrics = Metrics::getInstance ();
int
w = metrics.getVirtualW ();
renderX = (w / 2);
}
if (renderY < 0)
{
const
Metrics &
metrics = Metrics::getInstance ();
int
h = metrics.getVirtualH ();
renderY = (h / 2);
}
renderer.renderText (text->getText (), text->getFont (), alpha,
renderX, renderY, true);
}
}
if (text->getTexture () != NULL)
{
renderer.renderTextureQuad (text->getPos ().x, text->getPos ().y,
text->getSize ().x,
text->getSize ().y,
text->getTexture (), alpha);
}
}
}
if (program != NULL)
program->renderProgramMsgBox ();
if (this->forceMouseRender == true)
renderer.renderMouse2d (mouseX, mouseY, mouse2d, 0.f);
bool
showIntroTiming =
Config::getInstance ().getBool ("ShowIntroTiming", "false");
if (showIntroTiming == true && Intro::introTime > 0)
{
CoreData & coreData = CoreData::getInstance ();
int
difTime = 1000 * timer / GameConstants::updateFps;
string
timingText =
intToStr (difTime) + " / " + intToStr (Intro::introTime);
if (Renderer::renderText3DEnabled)
{
//const Metrics &metrics= Metrics::getInstance();
//int w= metrics.getVirtualW();
//int h= metrics.getVirtualH();
renderer.renderText3D (timingText, coreData.getMenuFontVeryBig3D (),
1, 10, 20, false);
}
else
{
//const Metrics &metrics= Metrics::getInstance();
//int w= metrics.getVirtualW();
//int h= metrics.getVirtualH();
renderer.renderText (timingText, coreData.getMenuFontVeryBig (), 1,
10, 20, false);
}
}
renderer.renderFPSWhenEnabled (lastFps);
renderer.swapBuffers ();
}
void
Intro::keyDown (SDL_KeyboardEvent key)
{
SDL_keysym keystate = key.keysym;
//printf("keystate.mod = %d key = unicode[%d] regular[%d] lalt [%d] ralt [%d] alt [%d]\n",keystate.mod,key.keysym.unicode,key.keysym.sym,(keystate.mod & KMOD_LALT),(keystate.mod & KMOD_RALT),(keystate.mod & KMOD_ALT));
if (keystate.mod & (KMOD_LALT | KMOD_RALT))
{
//printf("ALT KEY #1\n");
if (isKeyPressed (SDLK_RETURN, key) == true ||
isKeyPressed (SDLK_RALT, key) == true ||
isKeyPressed (SDLK_LALT, key) == true)
{
return;
}
}
//printf("Exiting intro\n");
mouseUpLeft (0, 0);
}
void
Intro::mouseUpLeft (int x, int y)
{
SoundRenderer & soundRenderer = SoundRenderer::getInstance ();
SystemFlags::OutputDebug (SystemFlags::debugSystem,
"In [%s::%s Line: %d]\n", __FILE__,
__FUNCTION__, __LINE__);
soundRenderer.stopMusic (CoreData::getInstance ().getIntroMusic ());
SystemFlags::OutputDebug (SystemFlags::debugSystem,
"In [%s::%s Line: %d]\n", __FILE__,
__FUNCTION__, __LINE__);
if (CoreData::getInstance ().hasMainMenuVideoFilename () == false)
{
soundRenderer.playMusic (CoreData::getInstance ().getMenuMusic ());
}
SystemFlags::OutputDebug (SystemFlags::debugSystem,
"In [%s::%s Line: %d]\n", __FILE__,
__FUNCTION__, __LINE__);
cleanup ();
}
void
Intro::cleanup ()
{
Renderer::getInstance ().endMenu ();
program->setState (new MainMenu (program));
}
void
Intro::mouseMove (int x, int y, const MouseState * ms)
{
mouseX = x;
mouseY = y;
}
}} //end namespace