Added lighning support to minimal race gui.

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@8281 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
hikerstk
2011-04-10 22:10:33 +00:00
parent dcdb6f062c
commit 0fcfc3d5cf
8 changed files with 130 additions and 73 deletions

View File

@@ -353,6 +353,7 @@ supertuxkart_SOURCES = \
states_screens/options_screen_video.hpp \
states_screens/addons_screen.cpp \
states_screens/addons_screen.hpp \
states_screens/race_gui_base.cpp \
states_screens/race_gui_base.hpp \
states_screens/race_gui.cpp \
states_screens/race_gui.hpp \

View File

@@ -149,10 +149,9 @@ void Rain::update(float dt)
if (m_next_lightning < 0.0f)
{
RaceGUIBase* gui_base = World::getWorld()->getRaceGUI();
RaceGUI* gui = dynamic_cast<RaceGUI*>(gui_base);
if (gui != NULL)
if (gui_base != NULL)
{
gui->lightning();
gui_base->doLightning();
if (m_thunder_sound) m_thunder_sound->play();
}

View File

@@ -1058,6 +1058,10 @@
RelativePath="..\..\states_screens\race_gui.cpp"
>
</File>
<File
RelativePath="..\..\states_screens\race_gui_base.cpp"
>
</File>
<File
RelativePath="..\..\states_screens\race_result_gui.cpp"
>

View File

@@ -271,6 +271,7 @@ void MinimalRaceGUI::createRegularPolygon(unsigned int n, float radius,
*/
void MinimalRaceGUI::renderGlobal(float dt)
{
RaceGUIBase::renderGlobal(dt);
cleanupMessages(dt);
// Special case : when 3 players play, use 4th window to display such
@@ -359,6 +360,7 @@ void MinimalRaceGUI::renderPlayerView(const Kart *kart)
drawEnergyMeter (kart, viewport, scaling);
drawRankLap (info, kart, viewport);
RaceGUIBase::renderPlayerView(kart);
} // renderPlayerView
//-----------------------------------------------------------------------------

View File

@@ -49,12 +49,6 @@ using namespace irr;
#include "utils/string_utils.hpp"
#include "utils/translation.hpp"
#ifdef __APPLE__
#include <OpenGL/gl.h>
#else
#include <GL/gl.h>
#endif
/** The constructor is called before anything is attached to the scene node.
* So rendering to a texture can be done here. But world is not yet fully
* created, so only the race manager can be accessed safely.
@@ -73,7 +67,6 @@ RaceGUI::RaceGUI()
m_map_height = (int)(100.0f * scaling);
m_map_left = (int)( 10.0f * scaling);
m_map_bottom = (int)( 10.0f * scaling);
m_lightning = 0.0f;
// Minimap is also rendered bigger via OpenGL, so find power-of-two again
const int map_texture = 2 << ((int) ceil(1.0 + log(128.0 * scaling)));
@@ -274,10 +267,9 @@ void RaceGUI::createRegularPolygon(unsigned int n, float radius,
*/
void RaceGUI::renderGlobal(float dt)
{
RaceGUIBase::renderGlobal(dt);
cleanupMessages(dt);
if (m_lightning > 0.0f) m_lightning -= dt;
// Special case : when 3 players play, use 4th window to display such
// stuff (but we must clear it)
if (race_manager->getNumLocalPlayers() == 3 &&
@@ -370,59 +362,7 @@ void RaceGUI::renderPlayerView(const Kart *kart)
drawSpeedAndEnergy (kart, viewport, scaling);
drawRankLap (info, kart, viewport);
if (m_lightning > 0.0f)
{
GLint glviewport[4];
glviewport[0] = viewport.UpperLeftCorner.X;
glviewport[1] = viewport.UpperLeftCorner.Y;
glviewport[2] = viewport.LowerRightCorner.X;
glviewport[3] = viewport.LowerRightCorner.Y;
//glGetIntegerv(GL_VIEWPORT, glviewport);
glDisable(GL_TEXTURE_2D);
glDisable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE);
glColor4f(0.7f*m_lightning, 0.7f*m_lightning, 0.7f*std::min(1.0f, m_lightning*1.5f), 1.0f);
glEnable(GL_COLOR_MATERIAL);
glDisable(GL_CULL_FACE);
glBegin(GL_QUADS);
glVertex3d(glviewport[0],glviewport[1],0);
glVertex3d(glviewport[0],glviewport[3],0);
glVertex3d(glviewport[2],glviewport[3],0);
glVertex3d(glviewport[2],glviewport[1],0);
glEnd();
glEnable(GL_TEXTURE_2D);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
#if 0 // Rainy look, off, TODO: needs to be settable per track
else
{
GLint glviewport[4];
glGetIntegerv(GL_VIEWPORT, glviewport);
glDisable(GL_TEXTURE_2D);
glDisable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glColor4f(0.0f, 0.0f, 0.0f, 0.4f);
glEnable(GL_COLOR_MATERIAL);
glDisable(GL_CULL_FACE);
glBegin(GL_QUADS);
glVertex3d(glviewport[0],glviewport[1],0);
glVertex3d(glviewport[0],glviewport[3],0);
glVertex3d(glviewport[2],glviewport[3],0);
glVertex3d(glviewport[2],glviewport[1],0);
glEnd();
glEnable(GL_BLEND);
}
#endif
RaceGUIBase::renderPlayerView(kart);
} // renderPlayerView
//-----------------------------------------------------------------------------

View File

@@ -81,9 +81,7 @@ private:
Material *m_plunger_face;
typedef std::vector<TimedMessage> AllMessageType;
AllMessageType m_messages;
float m_lightning;
/** A texture with all mini dots to be displayed in the minimap for all karts. */
video::ITexture *m_marker;
@@ -206,7 +204,6 @@ public:
virtual const core::dimension2du getMiniMapSize() const
{ return core::dimension2du(m_map_width, m_map_height); }
void lightning() { m_lightning = 1.0f; }
}; // RaceGUI
#endif

View File

@@ -0,0 +1,107 @@
// $Id$
//
// SuperTuxKart - a fun racing game with go-kart
// Copyright (C) 2004-2005 Steve Baker <sjbaker1@airmail.net>
// Copyright (C) 2006 Joerg Henrichs, SuperTuxKart-Team, Steve Baker
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 3
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "states_screens/race_gui_base.hpp"
#ifdef __APPLE__
# include <OpenGL/gl.h>
#else
# define _WINSOCKAPI_
# include <windows.h>
# include <GL/gl.h>
#endif
#include "karts/kart.hpp"
RaceGUIBase::RaceGUIBase()
{
m_lightning = 0.0f;
} // RaceGUIBase
// ----------------------------------------------------------------------------
/** Updates lightning related information.
*/
void RaceGUIBase::renderGlobal(float dt)
{
if (m_lightning > 0.0f) m_lightning -= dt;
} // renderGlobal
// ----------------------------------------------------------------------------
void RaceGUIBase::renderPlayerView(const Kart *kart)
{
const core::recti &viewport = kart->getCamera()->getViewport();
if (m_lightning > 0.0f)
{
GLint glviewport[4];
glviewport[0] = viewport.UpperLeftCorner.X;
glviewport[1] = viewport.UpperLeftCorner.Y;
glviewport[2] = viewport.LowerRightCorner.X;
glviewport[3] = viewport.LowerRightCorner.Y;
//glGetIntegerv(GL_VIEWPORT, glviewport);
glDisable(GL_TEXTURE_2D);
glDisable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE);
glColor4f(0.7f*m_lightning, 0.7f*m_lightning, 0.7f*std::min(1.0f, m_lightning*1.5f), 1.0f);
glEnable(GL_COLOR_MATERIAL);
glDisable(GL_CULL_FACE);
glBegin(GL_QUADS);
glVertex3d(glviewport[0],glviewport[1],0);
glVertex3d(glviewport[0],glviewport[3],0);
glVertex3d(glviewport[2],glviewport[3],0);
glVertex3d(glviewport[2],glviewport[1],0);
glEnd();
glEnable(GL_TEXTURE_2D);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
#if 0 // Rainy look, off, TODO: needs to be settable per track
else
{
GLint glviewport[4];
glGetIntegerv(GL_VIEWPORT, glviewport);
glDisable(GL_TEXTURE_2D);
glDisable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glColor4f(0.0f, 0.0f, 0.0f, 0.4f);
glEnable(GL_COLOR_MATERIAL);
glDisable(GL_CULL_FACE);
glBegin(GL_QUADS);
glVertex3d(glviewport[0],glviewport[1],0);
glVertex3d(glviewport[0],glviewport[3],0);
glVertex3d(glviewport[2],glviewport[3],0);
glVertex3d(glviewport[2],glviewport[1],0);
glEnd();
glEnable(GL_BLEND);
}
#endif
} // renderPlayerView

View File

@@ -52,14 +52,15 @@ public:
int lap;
}; // KartIconDisplayInfo
/** Delight in seconds between lightnings. */
float m_lightning;
public:
bool m_enabled;
RaceGUIBase() {};
RaceGUIBase();
virtual ~RaceGUIBase() {};
virtual void renderGlobal(float dt) = 0;
virtual void renderPlayerView(const Kart *kart) = 0;
virtual void addMessage(const irr::core::stringw &m, const Kart *kart,
float time,
int fonst_size,
@@ -72,6 +73,12 @@ public:
/** Returns the size of the texture on which to render the minimap to. */
virtual const core::dimension2du
getMiniMapSize() const = 0;
virtual void renderGlobal(float dt);
virtual void renderPlayerView(const Kart *kart);
/** Set the flag that a lightning should be shown. */
void doLightning() { m_lightning = 1.0f; }
}; // RaceGUIBase
#endif