Improve drivelines on overworld

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@10618 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
auria
2012-01-09 01:20:32 +00:00
parent 9e9f4f7223
commit 67cc863331

View File

@@ -54,16 +54,38 @@ RaceGUIOverworld::RaceGUIOverworld()
m_enabled = true;
m_trophy = irr_driver->getTexture( file_manager->getTextureFile("cup_gold.png") );
// Originally m_map_height was 100, and we take 480 as minimum res
const float scaling = irr_driver->getFrameSize().Height / 480.0f;
// Marker texture has to be power-of-two for (old) OpenGL compliance
m_marker_rendered_size = 2 << ((int) ceil(1.0 + log(32.0 * scaling)));
m_marker_ai_size = (int)( 14.0f * scaling);
m_marker_player_size = (int)( 16.0f * scaling);
m_map_width = (int)(100.0f * scaling);
m_map_height = (int)(100.0f * scaling);
m_map_left = (int)( 10.0f * scaling);
m_map_bottom = (int)( 10.0f * scaling);
m_marker_player_size = (int)( 24.0f * scaling);
m_map_width = (int)(250.0f * scaling);
m_map_height = (int)(250.0f * scaling);
// The location of the minimap varies with number of
// splitscreen players:
switch(race_manager->getNumLocalPlayers())
{
case 0 : // In case of profile mode
case 1 : // Lower left corner
m_map_left = 10;
m_map_bottom = UserConfigParams::m_height-10;
break;
case 2: // Middle of left side
m_map_left = 10;
m_map_bottom = UserConfigParams::m_height/2 + m_map_height/2;
break;
case 3: // Lower right quarter (which is not used by a player)
m_map_left = UserConfigParams::m_width/2 + 10;
m_map_bottom = UserConfigParams::m_height-10;
break;
case 4: // Middle of the screen.
m_map_left = UserConfigParams::m_width/2-m_map_width/2;
m_map_bottom = UserConfigParams::m_height/2 + m_map_height/2;
break;
}
// 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)));
@@ -162,32 +184,6 @@ void RaceGUIOverworld::renderPlayerView(const Kart *kart)
//std::cout << "Scale : " << scaling.X << ", " << scaling.Y << std::endl;
if (kart->hasViewBlockedByPlunger())
{
const int screen_width = viewport.LowerRightCorner.X
- viewport.UpperLeftCorner.X;
const int plunger_size = (int)(0.6f * screen_width);
int plunger_x = viewport.UpperLeftCorner.X + screen_width/2
- plunger_size/2;
int offset_y = viewport.UpperLeftCorner.Y + viewport.getHeight()/2 - plunger_size/2;
video::ITexture *t=m_plunger_face->getTexture();
core::rect<s32> dest(plunger_x, offset_y,
plunger_x+plunger_size, offset_y+plunger_size);
const core::rect<s32> source(core::position2d<s32>(0,0),
t->getOriginalSize());
//static const video::SColor white = video::SColor(255, 255, 255, 255);
irr_driver->getVideoDriver()->draw2DImage(t, dest, source,
&viewport /* clip */,
NULL /* color */,
true /* alpha */);
}
drawAllMessages (kart, viewport, scaling);
if(!World::getWorld()->isRacePhase()) return;
@@ -249,8 +245,8 @@ void RaceGUIOverworld::drawGlobalMiniMap()
const video::ITexture *mini_map = world->getTrack()->getMiniMap();
int upper_y = UserConfigParams::m_height - m_map_bottom - m_map_height;
int lower_y = UserConfigParams::m_height - m_map_bottom;
int upper_y = m_map_bottom - m_map_height;
int lower_y = m_map_bottom;
if (mini_map != NULL)
{
@@ -260,28 +256,56 @@ void RaceGUIOverworld::drawGlobalMiniMap()
irr_driver->getVideoDriver()->draw2DImage(mini_map, dest, source, 0, 0, true);
}
for(unsigned int i=0; i<world->getNumKarts(); i++)
// In the first iteration, only draw AI karts, then only draw
// player karts. This guarantees that player kart icons are always
// on top of AI kart icons.
for(unsigned int only_draw_player_kart=0; only_draw_player_kart<=1;
only_draw_player_kart++)
{
const Kart *kart = world->getKart(i);
if(kart->isEliminated()) continue; // don't draw eliminated kart
const Vec3& xyz = kart->getXYZ();
Vec3 draw_at;
world->getTrack()->mapPoint2MiniMap(xyz, &draw_at);
// int marker_height = m_marker->getOriginalSize().Height;
core::rect<s32> source(i *m_marker_rendered_size,
0,
(i+1)*m_marker_rendered_size,
m_marker_rendered_size);
int marker_half_size = (kart->getController()->isPlayerController()
? m_marker_player_size
: m_marker_ai_size )>>1;
core::rect<s32> position(m_map_left+(int)(draw_at.getX()-marker_half_size),
lower_y -(int)(draw_at.getY()+marker_half_size),
m_map_left+(int)(draw_at.getX()+marker_half_size),
lower_y -(int)(draw_at.getY()-marker_half_size));
irr_driver->getVideoDriver()->draw2DImage(m_marker, position, source,
NULL, NULL, true);
} // for i<getNumKarts
for(unsigned int i=0; i<world->getNumKarts(); i++)
{
const Kart *kart = world->getKart(i);
if(kart->isEliminated()) continue; // don't draw eliminated kart
// Make sure to only draw AI kart icons first, then
// only player karts.
if(kart->getController()->isPlayerController()
!=(only_draw_player_kart==1)) continue;
const Vec3& xyz = kart->getXYZ();
Vec3 draw_at;
world->getTrack()->mapPoint2MiniMap(xyz, &draw_at);
core::rect<s32> source(i *m_marker_rendered_size,
0,
(i+1)*m_marker_rendered_size,
m_marker_rendered_size);
int marker_half_size = (kart->getController()->isPlayerController()
? m_marker_player_size
: m_marker_ai_size )>>1;
core::rect<s32> position(m_map_left+(int)(draw_at.getX()-marker_half_size),
lower_y -(int)(draw_at.getY()+marker_half_size),
m_map_left+(int)(draw_at.getX()+marker_half_size),
lower_y -(int)(draw_at.getY()-marker_half_size));
// Highlight the player icons with some backgorund image.
if (kart->getController()->isPlayerController())
{
video::SColor colors[4];
for (unsigned int i=0;i<4;i++)
{
colors[i]=kart->getKartProperties()->getColor();
}
const core::rect<s32> rect(core::position2d<s32>(0,0),
m_icons_frame->getTexture()->getOriginalSize());
irr_driver->getVideoDriver()->draw2DImage(
m_icons_frame->getTexture(), position, rect,
NULL, colors, true);
} // if isPlayerController
irr_driver->getVideoDriver()->draw2DImage(m_marker, position, source,
NULL, NULL, true);
} // for i<getNumKarts
} // for only_draw_player_kart
} // drawGlobalMiniMap
//-----------------------------------------------------------------------------
@@ -365,6 +389,7 @@ void RaceGUIOverworld::drawSpeedAndEnergy(const Kart* kart, const core::recti &v
(int)(viewport.LowerRightCorner.Y - meter_height*0.75f),
kart, viewport, scaling);
/*
// First draw the meter (i.e. the background which contains the numbers etc.
// -------------------------------------------------------------------------
@@ -462,6 +487,7 @@ void RaceGUIOverworld::drawSpeedAndEnergy(const Kart* kart, const core::recti &v
irr_driver->getVideoDriver()->setMaterial(m);
irr_driver->getVideoDriver()->draw2DVertexPrimitiveList(vertices, count,
index, count-2, video::EVT_STANDARD, scene::EPT_TRIANGLE_FAN);
*/
} // drawSpeed
//-----------------------------------------------------------------------------