Remove useless RTT and simplify rendering of icons on the minimap
This commit is contained in:
parent
a17e4c47f9
commit
6f0e3c0c08
@ -21,6 +21,7 @@
|
|||||||
#include "addons/addon.hpp"
|
#include "addons/addon.hpp"
|
||||||
#include "config/stk_config.hpp"
|
#include "config/stk_config.hpp"
|
||||||
#include "config/player_manager.hpp"
|
#include "config/player_manager.hpp"
|
||||||
|
#include "graphics/glwrap.hpp"
|
||||||
#include "graphics/irr_driver.hpp"
|
#include "graphics/irr_driver.hpp"
|
||||||
#include "graphics/material_manager.hpp"
|
#include "graphics/material_manager.hpp"
|
||||||
#include "io/file_manager.hpp"
|
#include "io/file_manager.hpp"
|
||||||
@ -243,6 +244,11 @@ void KartProperties::load(const std::string &filename, const std::string &node)
|
|||||||
else
|
else
|
||||||
m_minimap_icon = NULL;
|
m_minimap_icon = NULL;
|
||||||
|
|
||||||
|
if (m_minimap_icon == NULL)
|
||||||
|
{
|
||||||
|
m_minimap_icon = getUnicolorTexture(m_color);
|
||||||
|
}
|
||||||
|
|
||||||
// Only load the model if the .kart file has the appropriate version,
|
// Only load the model if the .kart file has the appropriate version,
|
||||||
// otherwise warnings are printed.
|
// otherwise warnings are printed.
|
||||||
if (m_version >= 1)
|
if (m_version >= 1)
|
||||||
|
@ -63,9 +63,9 @@ RaceGUI::RaceGUI()
|
|||||||
// Originally m_map_height was 100, and we take 480 as minimum res
|
// Originally m_map_height was 100, and we take 480 as minimum res
|
||||||
const float scaling = irr_driver->getFrameSize().Height / 480.0f;
|
const float scaling = irr_driver->getFrameSize().Height / 480.0f;
|
||||||
// Marker texture has to be power-of-two for (old) OpenGL compliance
|
// 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_rendered_size = 2 << ((int) ceil(1.0 + log(32.0 * scaling)));
|
||||||
m_marker_ai_size = (int)( 14.0f * scaling);
|
m_minimap_ai_size = (int)( 14.0f * scaling);
|
||||||
m_marker_player_size = (int)( 16.0f * scaling);
|
m_minimap_player_size = (int)( 16.0f * scaling);
|
||||||
m_map_width = (int)(100.0f * scaling);
|
m_map_width = (int)(100.0f * scaling);
|
||||||
m_map_height = (int)(100.0f * scaling);
|
m_map_height = (int)(100.0f * scaling);
|
||||||
m_map_left = (int)( 10.0f * scaling);
|
m_map_left = (int)( 10.0f * scaling);
|
||||||
@ -87,7 +87,7 @@ RaceGUI::RaceGUI()
|
|||||||
|
|
||||||
m_speed_meter_icon = material_manager->getMaterial("speedback.png");
|
m_speed_meter_icon = material_manager->getMaterial("speedback.png");
|
||||||
m_speed_bar_icon = material_manager->getMaterial("speedfore.png");
|
m_speed_bar_icon = material_manager->getMaterial("speedfore.png");
|
||||||
createMarkerTexture();
|
//createMarkerTexture();
|
||||||
|
|
||||||
// Determine maximum length of the rank/lap text, in order to
|
// Determine maximum length of the rank/lap text, in order to
|
||||||
// align those texts properly on the right side of the viewport.
|
// align those texts properly on the right side of the viewport.
|
||||||
@ -238,15 +238,17 @@ void RaceGUI::drawScores()
|
|||||||
irr::video::ITexture *team_icon;
|
irr::video::ITexture *team_icon;
|
||||||
|
|
||||||
int numLeader = 1;
|
int numLeader = 1;
|
||||||
for(unsigned int i=0; i<soccerWorld->getNumKarts(); i++){
|
for(unsigned int i=0; i<soccerWorld->getNumKarts(); i++)
|
||||||
|
{
|
||||||
int j = soccerWorld->getTeamLeader(i);
|
int j = soccerWorld->getTeamLeader(i);
|
||||||
if(j < 0) break;
|
if(j < 0) break;
|
||||||
|
|
||||||
core::rect<s32> source(j*m_marker_rendered_size, 0,
|
AbstractKart* kart = soccerWorld->getKart(i);
|
||||||
(j+1)*m_marker_rendered_size,m_marker_rendered_size);
|
video::ITexture* icon = kart->getKartProperties()->getMinimapIcon();
|
||||||
|
core::rect<s32> source(core::position2di(0, 0), icon->getSize());
|
||||||
core::recti position(offsetX, offsetY,
|
core::recti position(offsetX, offsetY,
|
||||||
offsetX + 2*m_marker_player_size, offsetY + 2*m_marker_player_size);
|
offsetX + 2*m_minimap_player_size, offsetY + 2*m_minimap_player_size);
|
||||||
draw2DImage(m_marker, position, source,
|
draw2DImage(icon, position, source,
|
||||||
NULL, NULL, true);
|
NULL, NULL, true);
|
||||||
core::stringw score = StringUtils::toWString(soccerWorld->getScore(i));
|
core::stringw score = StringUtils::toWString(soccerWorld->getScore(i));
|
||||||
int string_height =
|
int string_height =
|
||||||
@ -265,8 +267,8 @@ void RaceGUI::drawScores()
|
|||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
core::rect<s32> indicatorPos(offsetX, offsetY,
|
core::rect<s32> indicatorPos(offsetX, offsetY,
|
||||||
offsetX + (int)(m_marker_player_size/1.25f),
|
offsetX + (int)(m_minimap_player_size/1.25f),
|
||||||
offsetY + (int)(m_marker_player_size/1.25f));
|
offsetY + (int)(m_minimap_player_size/1.25f));
|
||||||
core::rect<s32> sourceRect(core::position2d<s32>(0,0),
|
core::rect<s32> sourceRect(core::position2d<s32>(0,0),
|
||||||
team_icon->getOriginalSize());
|
team_icon->getOriginalSize());
|
||||||
draw2DImage(team_icon,indicatorPos,sourceRect,
|
draw2DImage(team_icon,indicatorPos,sourceRect,
|
||||||
@ -373,20 +375,19 @@ void RaceGUI::drawGlobalMiniMap()
|
|||||||
const Vec3& xyz = kart->getXYZ();
|
const Vec3& xyz = kart->getXYZ();
|
||||||
Vec3 draw_at;
|
Vec3 draw_at;
|
||||||
world->getTrack()->mapPoint2MiniMap(xyz, &draw_at);
|
world->getTrack()->mapPoint2MiniMap(xyz, &draw_at);
|
||||||
|
|
||||||
|
video::ITexture* icon = kart->getKartProperties()->getMinimapIcon();
|
||||||
|
|
||||||
// int marker_height = m_marker->getOriginalSize().Height;
|
// int marker_height = m_marker->getOriginalSize().Height;
|
||||||
core::rect<s32> source(i *m_marker_rendered_size,
|
core::rect<s32> source(core::position2di(0, 0), icon->getSize());
|
||||||
0,
|
|
||||||
(i+1)*m_marker_rendered_size,
|
|
||||||
m_marker_rendered_size);
|
|
||||||
int marker_half_size = (kart->getController()->isPlayerController()
|
int marker_half_size = (kart->getController()->isPlayerController()
|
||||||
? m_marker_player_size
|
? m_minimap_player_size
|
||||||
: m_marker_ai_size )>>1;
|
: m_minimap_ai_size )>>1;
|
||||||
core::rect<s32> position(m_map_left+(int)(draw_at.getX()-marker_half_size),
|
core::rect<s32> position(m_map_left+(int)(draw_at.getX()-marker_half_size),
|
||||||
lower_y -(int)(draw_at.getY()+marker_half_size),
|
lower_y -(int)(draw_at.getY()+marker_half_size),
|
||||||
m_map_left+(int)(draw_at.getX()+marker_half_size),
|
m_map_left+(int)(draw_at.getX()+marker_half_size),
|
||||||
lower_y -(int)(draw_at.getY()-marker_half_size));
|
lower_y -(int)(draw_at.getY()-marker_half_size));
|
||||||
draw2DImage(m_marker, position, source,
|
draw2DImage(icon, position, source, NULL, NULL, true);
|
||||||
NULL, NULL, true);
|
|
||||||
} // for i<getNumKarts
|
} // for i<getNumKarts
|
||||||
} // drawGlobalMiniMap
|
} // drawGlobalMiniMap
|
||||||
|
|
||||||
|
@ -51,11 +51,11 @@ private:
|
|||||||
|
|
||||||
/** The size of a single marker on the screen for AI karts,
|
/** The size of a single marker on the screen for AI karts,
|
||||||
* need not be a power of 2. */
|
* need not be a power of 2. */
|
||||||
int m_marker_ai_size;
|
int m_minimap_ai_size;
|
||||||
|
|
||||||
/** The size of a single marker on the screen or player karts,
|
/** The size of a single marker on the screen or player karts,
|
||||||
* need not be a power of 2. */
|
* need not be a power of 2. */
|
||||||
int m_marker_player_size;
|
int m_minimap_player_size;
|
||||||
|
|
||||||
/** The width of the rendered mini map in pixels, must be a power of 2. */
|
/** The width of the rendered mini map in pixels, must be a power of 2. */
|
||||||
int m_map_rendered_width;
|
int m_map_rendered_width;
|
||||||
|
@ -151,101 +151,13 @@ void RaceGUIBase::reset()
|
|||||||
*/
|
*/
|
||||||
RaceGUIBase::~RaceGUIBase()
|
RaceGUIBase::~RaceGUIBase()
|
||||||
{
|
{
|
||||||
irr_driver->removeTexture(m_marker);
|
//irr_driver->removeTexture(m_marker);
|
||||||
|
|
||||||
// If the referee is currently being shown,
|
// If the referee is currently being shown,
|
||||||
// remove it from the scene graph.
|
// remove it from the scene graph.
|
||||||
delete m_referee;
|
delete m_referee;
|
||||||
} // ~RaceGUIBase
|
} // ~RaceGUIBase
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
/** Creates a texture with the markers for all karts in the current race
|
|
||||||
* on it. This assumes that nothing is attached to the scene node at
|
|
||||||
* this stage.
|
|
||||||
*/
|
|
||||||
void RaceGUIBase::createMarkerTexture()
|
|
||||||
{
|
|
||||||
unsigned int num_karts = race_manager->getNumberOfKarts();
|
|
||||||
unsigned int npower2 = 1;
|
|
||||||
// Textures must be power of 2, so
|
|
||||||
while(npower2<num_karts) npower2*=2;
|
|
||||||
|
|
||||||
int radius = (m_marker_rendered_size>>1)-1;
|
|
||||||
IrrDriver::RTTProvider rttProvider(core::dimension2du(m_marker_rendered_size
|
|
||||||
*npower2,
|
|
||||||
m_marker_rendered_size),
|
|
||||||
"RaceGUI::markers", true);
|
|
||||||
scene::ICameraSceneNode *camera = irr_driver->addCameraSceneNode();
|
|
||||||
core::matrix4 projection;
|
|
||||||
projection.buildProjectionMatrixOrthoLH((float)(m_marker_rendered_size*npower2),
|
|
||||||
(float)(m_marker_rendered_size),
|
|
||||||
-1.0f, 1.0f);
|
|
||||||
camera->setProjectionMatrix(projection, true);
|
|
||||||
core::vector3df center( (float)(m_marker_rendered_size*npower2>>1),
|
|
||||||
(float)(m_marker_rendered_size>>1), 0.0f);
|
|
||||||
camera->setPosition(center);
|
|
||||||
camera->setUpVector(core::vector3df(0,1,0));
|
|
||||||
camera->setTarget(center + core::vector3df(0,0,4));
|
|
||||||
// The call to render sets the projection matrix etc. So we have to call
|
|
||||||
// this now before doing the direct OpenGL calls.
|
|
||||||
// FIXME: perhaps we should use three calls to irr_driver: begin(),
|
|
||||||
// render(), end() - so we could do the rendering by calling to
|
|
||||||
// draw2DPolygon() between render() and end(), avoiding the
|
|
||||||
// call to camera->render()
|
|
||||||
camera->render();
|
|
||||||
// We have to reset the material here, since otherwise the last
|
|
||||||
// set material (i.e from the kart selection screen) will be used
|
|
||||||
// when rednering to the texture.
|
|
||||||
video::SMaterial m;
|
|
||||||
m.setTexture(0, NULL);
|
|
||||||
irr_driver->getVideoDriver()->setMaterial(m);
|
|
||||||
for(unsigned int i=0; i<num_karts; i++)
|
|
||||||
{
|
|
||||||
const std::string& kart_ident = race_manager->getKartIdent(i);
|
|
||||||
assert(kart_ident.size() > 0);
|
|
||||||
|
|
||||||
const KartProperties *kp=kart_properties_manager->getKart(kart_ident);
|
|
||||||
assert(kp != NULL);
|
|
||||||
|
|
||||||
core::vector2df center((float)((m_marker_rendered_size>>1)
|
|
||||||
+i*m_marker_rendered_size),
|
|
||||||
(float)(m_marker_rendered_size>>1) );
|
|
||||||
int count = kp->getShape();
|
|
||||||
video::ITexture *t = kp->getMinimapIcon();
|
|
||||||
if(t)
|
|
||||||
{
|
|
||||||
video::ITexture *t = kp->getIconMaterial()->getTexture();
|
|
||||||
core::recti dest_rect(i*m_marker_rendered_size,
|
|
||||||
0,
|
|
||||||
(i+1)*m_marker_rendered_size,
|
|
||||||
m_marker_rendered_size);
|
|
||||||
core::recti source_rect(core::vector2di(0,0), t->getSize());
|
|
||||||
draw2DImage(t, dest_rect,
|
|
||||||
source_rect,
|
|
||||||
/*clipRect*/0,
|
|
||||||
/*color*/ 0,
|
|
||||||
/*useAlpha*/true);
|
|
||||||
}
|
|
||||||
else // no special minimap icon defined
|
|
||||||
{
|
|
||||||
video::S3DVertex *vertices = new video::S3DVertex[count+1];
|
|
||||||
unsigned short int *index = new unsigned short int[count+1];
|
|
||||||
video::SColor color = kp->getColor();
|
|
||||||
createRegularPolygon(count, (float)radius, center, color,
|
|
||||||
vertices, index);
|
|
||||||
irr_driver->getVideoDriver()->draw2DVertexPrimitiveList(vertices,
|
|
||||||
count, index, count-2,
|
|
||||||
video::EVT_STANDARD,
|
|
||||||
scene::EPT_TRIANGLE_FAN);
|
|
||||||
delete [] vertices;
|
|
||||||
delete [] index;
|
|
||||||
} // if special minimap icon defined
|
|
||||||
}
|
|
||||||
|
|
||||||
m_marker = rttProvider.renderToTexture(-1, /*is_2d_render*/true);
|
|
||||||
irr_driver->removeCameraSceneNode(camera);
|
|
||||||
} // createMarkerTexture
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
/** Creates the 2D vertices for a regular polygon. Adopted from Irrlicht.
|
/** Creates the 2D vertices for a regular polygon. Adopted from Irrlicht.
|
||||||
* \param n Number of vertices to use.
|
* \param n Number of vertices to use.
|
||||||
|
@ -170,10 +170,10 @@ protected:
|
|||||||
core::vector2df m_plunger_speed;
|
core::vector2df m_plunger_speed;
|
||||||
|
|
||||||
/** The size of a single marker in pixels, must be a power of 2. */
|
/** The size of a single marker in pixels, must be a power of 2. */
|
||||||
int m_marker_rendered_size;
|
//int m_marker_rendered_size;
|
||||||
|
|
||||||
/** A texture with all mini dots to be displayed in the minimap for all karts. */
|
/** A texture with all mini dots to be displayed in the minimap for all karts. */
|
||||||
video::ITexture *m_marker;
|
//video::ITexture *m_marker;
|
||||||
video::ITexture *m_gauge_empty;
|
video::ITexture *m_gauge_empty;
|
||||||
/** Default texture for nitro gauge. */
|
/** Default texture for nitro gauge. */
|
||||||
video::ITexture *m_gauge_full;
|
video::ITexture *m_gauge_full;
|
||||||
@ -186,7 +186,7 @@ protected:
|
|||||||
Material *m_icons_frame;
|
Material *m_icons_frame;
|
||||||
|
|
||||||
void cleanupMessages(const float dt);
|
void cleanupMessages(const float dt);
|
||||||
void createMarkerTexture();
|
//void createMarkerTexture();
|
||||||
void createRegularPolygon(unsigned int n, float radius,
|
void createRegularPolygon(unsigned int n, float radius,
|
||||||
const core::vector2df ¢er,
|
const core::vector2df ¢er,
|
||||||
const video::SColor &color,
|
const video::SColor &color,
|
||||||
|
@ -77,11 +77,11 @@ RaceGUIOverworld::RaceGUIOverworld()
|
|||||||
|
|
||||||
const float scaling = irr_driver->getFrameSize().Height / 420.0f;
|
const float scaling = irr_driver->getFrameSize().Height / 420.0f;
|
||||||
// Marker texture has to be power-of-two for (old) OpenGL compliance
|
// 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_rendered_size = 2 << ((int) ceil(1.0 + log(32.0 * scaling)));
|
||||||
m_marker_challenge_size = (int)( 12.0f * scaling);
|
m_minimap_challenge_size = (int)( 12.0f * scaling);
|
||||||
m_marker_player_size = (int)( 24.0f * scaling);
|
m_minimap_player_size = (int)( 24.0f * scaling);
|
||||||
m_map_width = (int)(250.0f * scaling);
|
m_map_width = (int)(250.0f * scaling);
|
||||||
m_map_height = (int)(250.0f * scaling);
|
m_map_height = (int)(250.0f * scaling);
|
||||||
|
|
||||||
m_map_left = 20;
|
m_map_left = 20;
|
||||||
m_map_bottom = UserConfigParams::m_height-10;
|
m_map_bottom = UserConfigParams::m_height-10;
|
||||||
@ -100,7 +100,7 @@ RaceGUIOverworld::RaceGUIOverworld()
|
|||||||
|
|
||||||
m_speed_meter_icon = material_manager->getMaterial("speedback.png");
|
m_speed_meter_icon = material_manager->getMaterial("speedback.png");
|
||||||
m_speed_bar_icon = material_manager->getMaterial("speedfore.png");
|
m_speed_bar_icon = material_manager->getMaterial("speedfore.png");
|
||||||
createMarkerTexture();
|
//createMarkerTexture();
|
||||||
|
|
||||||
// Translate strings only one in constructor to avoid calling
|
// Translate strings only one in constructor to avoid calling
|
||||||
// gettext in each frame.
|
// gettext in each frame.
|
||||||
@ -363,13 +363,11 @@ void RaceGUIOverworld::drawGlobalMiniMap()
|
|||||||
Vec3 draw_at;
|
Vec3 draw_at;
|
||||||
track->mapPoint2MiniMap(kart_xyz, &draw_at);
|
track->mapPoint2MiniMap(kart_xyz, &draw_at);
|
||||||
|
|
||||||
core::rect<s32> source(i *m_marker_rendered_size,
|
video::ITexture* icon = kart->getKartProperties()->getMinimapIcon();
|
||||||
0,
|
core::rect<s32> source(core::position2di(0, 0), icon->getSize());
|
||||||
(i+1)*m_marker_rendered_size,
|
|
||||||
m_marker_rendered_size);
|
|
||||||
int marker_half_size = (kart->getController()->isPlayerController()
|
int marker_half_size = (kart->getController()->isPlayerController()
|
||||||
? m_marker_player_size
|
? m_minimap_player_size
|
||||||
: m_marker_challenge_size )>>1;
|
: m_minimap_challenge_size )>>1;
|
||||||
core::rect<s32> position(m_map_left+(int)(draw_at.getX()-marker_half_size),
|
core::rect<s32> position(m_map_left+(int)(draw_at.getX()-marker_half_size),
|
||||||
lower_y -(int)(draw_at.getY()+marker_half_size),
|
lower_y -(int)(draw_at.getY()+marker_half_size),
|
||||||
m_map_left+(int)(draw_at.getX()+marker_half_size),
|
m_map_left+(int)(draw_at.getX()+marker_half_size),
|
||||||
@ -390,8 +388,7 @@ void RaceGUIOverworld::drawGlobalMiniMap()
|
|||||||
rect, NULL, colors, true);
|
rect, NULL, colors, true);
|
||||||
} // if isPlayerController
|
} // if isPlayerController
|
||||||
|
|
||||||
draw2DImage(m_marker, position, source,
|
draw2DImage(icon, position, source, NULL, NULL, true);
|
||||||
NULL, NULL, true);
|
|
||||||
} // for i<getNumKarts
|
} // for i<getNumKarts
|
||||||
} // for only_draw_player_kart
|
} // for only_draw_player_kart
|
||||||
|
|
||||||
@ -416,7 +413,7 @@ void RaceGUIOverworld::drawGlobalMiniMap()
|
|||||||
const core::rect<s32> source(core::position2d<s32>(0,0),
|
const core::rect<s32> source(core::position2d<s32>(0,0),
|
||||||
m_icons[state]->getOriginalSize());
|
m_icons[state]->getOriginalSize());
|
||||||
|
|
||||||
int marker_size = m_marker_challenge_size;
|
int marker_size = m_minimap_challenge_size;
|
||||||
core::position2di mouse = irr_driver->getMouseLocation();
|
core::position2di mouse = irr_driver->getMouseLocation();
|
||||||
core::rect<s32> dest(m_map_left+(int)(draw_at.getX()-marker_size/2),
|
core::rect<s32> dest(m_map_left+(int)(draw_at.getX()-marker_size/2),
|
||||||
lower_y -(int)(draw_at.getY()+marker_size/2),
|
lower_y -(int)(draw_at.getY()+marker_size/2),
|
||||||
|
@ -75,11 +75,11 @@ private:
|
|||||||
|
|
||||||
/** The size of a single marker on the screen for AI karts,
|
/** The size of a single marker on the screen for AI karts,
|
||||||
* need not be a power of 2. */
|
* need not be a power of 2. */
|
||||||
int m_marker_challenge_size;
|
int m_minimap_challenge_size;
|
||||||
|
|
||||||
/** The size of a single marker on the screen or player karts,
|
/** The size of a single marker on the screen or player karts,
|
||||||
* need not be a power of 2. */
|
* need not be a power of 2. */
|
||||||
int m_marker_player_size;
|
int m_minimap_player_size;
|
||||||
|
|
||||||
/** The width of the rendered mini map in pixels, must be a power of 2. */
|
/** The width of the rendered mini map in pixels, must be a power of 2. */
|
||||||
int m_map_rendered_width;
|
int m_map_rendered_width;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user