Improved main menu appearance

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/branches/irrlicht@3368 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
auria 2009-04-06 20:07:21 +00:00
parent 309528a7fc
commit 060720c454
4 changed files with 57 additions and 3 deletions

BIN
data/gui/background.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -1,6 +1,6 @@
<div x="5%" y="2%" width="90%" height="96%" layout="vertical-row" >
<icon id="logo" align="center" icon="gui/logo.png"/>
<icon id="logo" align="center" proportion="3" width="100%" icon="gui/logo.png"/>
<spacer proportion="1" width="10"/>

View File

@ -6,6 +6,7 @@
#include "gui/skin.hpp"
#include "gui/widget.hpp"
#include "io/file_manager.hpp"
#include "gui/state_manager.hpp"
namespace GUIEngine
{
@ -112,6 +113,50 @@ void transmitEvent(Widget* widget, std::string& name)
// -----------------------------------------------------------------------------
void render()
{
// on one end, making these static is not too clean.
// on another end, these variables are really only used locally,
// and making them static avoids doing the same stupid computations every frame
// FIXME - not totally true, resolution switches need to be handled
static ITexture* bg_image = NULL;
static core::rect<s32> dest;
static core::rect<s32> source_area;
if(bg_image == NULL)
{
int texture_w, texture_h;
// TODO/FIXME? - user preferences still include a background image choice
bg_image = GUIEngine::getDriver()->getTexture( (file_manager->getGUIDir() + "/background.jpg").c_str() );
assert(bg_image != NULL);
texture_w = bg_image->getSize().Width;
texture_h = bg_image->getSize().Height;
source_area = core::rect<s32>(0, 0, texture_w, texture_h);
core::dimension2d<s32> frame_size = GUIEngine::getDriver()->getCurrentRenderTargetSize();
const int screen_w = frame_size.Width;
const int screen_h = frame_size.Height;
// stretch image vertically to fit
float ratio = (float)screen_h / texture_h;
// check that with the vertical stretching, it still fits horizontally
while(texture_w*ratio < screen_w) ratio += 0.1;
texture_w *= ratio;
texture_h *= ratio;
const int clipped_x_space = (texture_w - screen_w);
dest = core::rect<s32>(-clipped_x_space/2, 0, screen_w+clipped_x_space/2, texture_h);
}
if(!StateManager::isGameState())
GUIEngine::getDriver()->draw2DImage(bg_image, dest, source_area,
0 /* no clipping */, 0, false /* alpha */);
//GUIEngine::getDriver()->draw2DRectangle( SColor(255, 0, 150, 0), rect );
g_env->drawAll();
}

View File

@ -279,14 +279,15 @@ IconButtonWidget::IconButtonWidget(const bool clickable)
void IconButtonWidget::add()
{
ITexture* texture = GUIEngine::getDriver()->getTexture((file_manager->getDataDir() + "/" +m_properties[PROP_ICON]).c_str());
//const int texture_w = texture->getSize().Width, texture_h = texture->getSize().Height;
const int texture_w = texture->getSize().Width, texture_h = texture->getSize().Height;
/*
if(w < texture_w) ... ;
if(h < texture_h) ... ;
*/
rect<s32> widget_size = rect<s32>(x, y, x + w, y + h);
rect<s32> widget_size;
if(clickable)
{
widget_size = rect<s32>(x, y, x + w, y + h);
IGUIButton* btn = GUIEngine::getGUIEnv()->addButton(widget_size, NULL, ++id_counter, L"");
m_element = btn;
btn->setUseAlphaChannel(true);
@ -296,6 +297,14 @@ void IconButtonWidget::add()
}
else
{
// irrlicht widgets don't support scaling while keeping aspect ratio
// so, happily, let's implement it ourselves
const int x_gap = (float)w - (float)texture_w * (float)h / texture_h;
std::cout << "x_gap = " << x_gap << std::endl;
widget_size = rect<s32>(x + x_gap/2, y, x + w - x_gap/2, y + h);
IGUIImage* btn = GUIEngine::getGUIEnv()->addImage(widget_size, NULL, ++id_counter_2);
m_element = btn;
btn->setUseAlphaChannel(true);