Merge branch 'renderFactorisation'
This commit is contained in:
commit
abe8275969
@ -21,6 +21,7 @@
|
||||
#include "addons/addon.hpp"
|
||||
#include "config/stk_config.hpp"
|
||||
#include "config/player_manager.hpp"
|
||||
#include "graphics/glwrap.hpp"
|
||||
#include "graphics/irr_driver.hpp"
|
||||
#include "graphics/material_manager.hpp"
|
||||
#include "io/file_manager.hpp"
|
||||
@ -243,6 +244,11 @@ void KartProperties::load(const std::string &filename, const std::string &node)
|
||||
else
|
||||
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,
|
||||
// otherwise warnings are printed.
|
||||
if (m_version >= 1)
|
||||
|
@ -63,9 +63,9 @@ RaceGUI::RaceGUI()
|
||||
// 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_marker_rendered_size = 2 << ((int) ceil(1.0 + log(32.0 * scaling)));
|
||||
m_minimap_ai_size = (int)( 14.0f * scaling);
|
||||
m_minimap_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);
|
||||
@ -87,7 +87,7 @@ RaceGUI::RaceGUI()
|
||||
|
||||
m_speed_meter_icon = material_manager->getMaterial("speedback.png");
|
||||
m_speed_bar_icon = material_manager->getMaterial("speedfore.png");
|
||||
createMarkerTexture();
|
||||
//createMarkerTexture();
|
||||
|
||||
// Determine maximum length of the rank/lap text, in order to
|
||||
// align those texts properly on the right side of the viewport.
|
||||
@ -238,15 +238,17 @@ void RaceGUI::drawScores()
|
||||
irr::video::ITexture *team_icon;
|
||||
|
||||
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);
|
||||
if(j < 0) break;
|
||||
|
||||
core::rect<s32> source(j*m_marker_rendered_size, 0,
|
||||
(j+1)*m_marker_rendered_size,m_marker_rendered_size);
|
||||
AbstractKart* kart = soccerWorld->getKart(i);
|
||||
video::ITexture* icon = kart->getKartProperties()->getMinimapIcon();
|
||||
core::rect<s32> source(core::position2di(0, 0), icon->getSize());
|
||||
core::recti position(offsetX, offsetY,
|
||||
offsetX + 2*m_marker_player_size, offsetY + 2*m_marker_player_size);
|
||||
draw2DImage(m_marker, position, source,
|
||||
offsetX + 2*m_minimap_player_size, offsetY + 2*m_minimap_player_size);
|
||||
draw2DImage(icon, position, source,
|
||||
NULL, NULL, true);
|
||||
core::stringw score = StringUtils::toWString(soccerWorld->getScore(i));
|
||||
int string_height =
|
||||
@ -265,8 +267,8 @@ void RaceGUI::drawScores()
|
||||
default: break;
|
||||
}
|
||||
core::rect<s32> indicatorPos(offsetX, offsetY,
|
||||
offsetX + (int)(m_marker_player_size/1.25f),
|
||||
offsetY + (int)(m_marker_player_size/1.25f));
|
||||
offsetX + (int)(m_minimap_player_size/1.25f),
|
||||
offsetY + (int)(m_minimap_player_size/1.25f));
|
||||
core::rect<s32> sourceRect(core::position2d<s32>(0,0),
|
||||
team_icon->getOriginalSize());
|
||||
draw2DImage(team_icon,indicatorPos,sourceRect,
|
||||
@ -373,20 +375,19 @@ void RaceGUI::drawGlobalMiniMap()
|
||||
const Vec3& xyz = kart->getXYZ();
|
||||
Vec3 draw_at;
|
||||
world->getTrack()->mapPoint2MiniMap(xyz, &draw_at);
|
||||
|
||||
video::ITexture* icon = kart->getKartProperties()->getMinimapIcon();
|
||||
|
||||
// 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);
|
||||
core::rect<s32> source(core::position2di(0, 0), icon->getSize());
|
||||
int marker_half_size = (kart->getController()->isPlayerController()
|
||||
? m_marker_player_size
|
||||
: m_marker_ai_size )>>1;
|
||||
? m_minimap_player_size
|
||||
: m_minimap_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));
|
||||
draw2DImage(m_marker, position, source,
|
||||
NULL, NULL, true);
|
||||
draw2DImage(icon, position, source, NULL, NULL, true);
|
||||
} // for i<getNumKarts
|
||||
} // drawGlobalMiniMap
|
||||
|
||||
|
@ -51,11 +51,11 @@ private:
|
||||
|
||||
/** The size of a single marker on the screen for AI karts,
|
||||
* 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,
|
||||
* 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. */
|
||||
int m_map_rendered_width;
|
||||
|
@ -151,101 +151,13 @@ void RaceGUIBase::reset()
|
||||
*/
|
||||
RaceGUIBase::~RaceGUIBase()
|
||||
{
|
||||
irr_driver->removeTexture(m_marker);
|
||||
//irr_driver->removeTexture(m_marker);
|
||||
|
||||
// If the referee is currently being shown,
|
||||
// remove it from the scene graph.
|
||||
delete m_referee;
|
||||
} // ~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.
|
||||
* \param n Number of vertices to use.
|
||||
|
@ -170,10 +170,10 @@ protected:
|
||||
core::vector2df m_plunger_speed;
|
||||
|
||||
/** 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. */
|
||||
video::ITexture *m_marker;
|
||||
//video::ITexture *m_marker;
|
||||
video::ITexture *m_gauge_empty;
|
||||
/** Default texture for nitro gauge. */
|
||||
video::ITexture *m_gauge_full;
|
||||
@ -186,7 +186,7 @@ protected:
|
||||
Material *m_icons_frame;
|
||||
|
||||
void cleanupMessages(const float dt);
|
||||
void createMarkerTexture();
|
||||
//void createMarkerTexture();
|
||||
void createRegularPolygon(unsigned int n, float radius,
|
||||
const core::vector2df ¢er,
|
||||
const video::SColor &color,
|
||||
|
@ -77,11 +77,11 @@ RaceGUIOverworld::RaceGUIOverworld()
|
||||
|
||||
const float scaling = irr_driver->getFrameSize().Height / 420.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_challenge_size = (int)( 12.0f * scaling);
|
||||
m_marker_player_size = (int)( 24.0f * scaling);
|
||||
m_map_width = (int)(250.0f * scaling);
|
||||
m_map_height = (int)(250.0f * scaling);
|
||||
//m_marker_rendered_size = 2 << ((int) ceil(1.0 + log(32.0 * scaling)));
|
||||
m_minimap_challenge_size = (int)( 12.0f * scaling);
|
||||
m_minimap_player_size = (int)( 24.0f * scaling);
|
||||
m_map_width = (int)(250.0f * scaling);
|
||||
m_map_height = (int)(250.0f * scaling);
|
||||
|
||||
m_map_left = 20;
|
||||
m_map_bottom = UserConfigParams::m_height-10;
|
||||
@ -100,7 +100,7 @@ RaceGUIOverworld::RaceGUIOverworld()
|
||||
|
||||
m_speed_meter_icon = material_manager->getMaterial("speedback.png");
|
||||
m_speed_bar_icon = material_manager->getMaterial("speedfore.png");
|
||||
createMarkerTexture();
|
||||
//createMarkerTexture();
|
||||
|
||||
// Translate strings only one in constructor to avoid calling
|
||||
// gettext in each frame.
|
||||
@ -363,13 +363,11 @@ void RaceGUIOverworld::drawGlobalMiniMap()
|
||||
Vec3 draw_at;
|
||||
track->mapPoint2MiniMap(kart_xyz, &draw_at);
|
||||
|
||||
core::rect<s32> source(i *m_marker_rendered_size,
|
||||
0,
|
||||
(i+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());
|
||||
int marker_half_size = (kart->getController()->isPlayerController()
|
||||
? m_marker_player_size
|
||||
: m_marker_challenge_size )>>1;
|
||||
? m_minimap_player_size
|
||||
: m_minimap_challenge_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),
|
||||
@ -390,8 +388,7 @@ void RaceGUIOverworld::drawGlobalMiniMap()
|
||||
rect, NULL, colors, true);
|
||||
} // if isPlayerController
|
||||
|
||||
draw2DImage(m_marker, position, source,
|
||||
NULL, NULL, true);
|
||||
draw2DImage(icon, position, source, NULL, NULL, true);
|
||||
} // for i<getNumKarts
|
||||
} // for only_draw_player_kart
|
||||
|
||||
@ -416,7 +413,7 @@ void RaceGUIOverworld::drawGlobalMiniMap()
|
||||
const core::rect<s32> source(core::position2d<s32>(0,0),
|
||||
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::rect<s32> dest(m_map_left+(int)(draw_at.getX()-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,
|
||||
* 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,
|
||||
* 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. */
|
||||
int m_map_rendered_width;
|
||||
|
Loading…
Reference in New Issue
Block a user