Skip to content

Commit 350596b

Browse files
ShadowNinjakwolekr
authored andcommittedMar 14, 2013
Add cloud menu background by Krisi, configurable with the menu_clouds option.
Also add a menuheader, menusplash, menufooter_clouds, and allow HD menu footers. And finally don't git-ignore textures/base/.
1 parent 66750dc commit 350596b

11 files changed

+177
-56
lines changed
 

‎.gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ tags
1212
/games/*
1313
!/games/minimal/
1414
/cache/
15-
/textures/
15+
/textures/*
16+
!/textures/base/
1617
/sounds/
1718
/mods/*
1819
!/mods/minetest/

‎minetest.conf.example

+2
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,8 @@
125125
#farmesh_distance = 40
126126
# Enable/disable clouds
127127
#enable_clouds = true
128+
# Use a cloud animation for the main menu background
129+
#menu_clouds = true
128130
# Path for screenshots
129131
#screenshot_path = .
130132
# Amount of view bobbing (0 = no view bobbing, 1.0 = normal, 2.0 = double)

‎src/clouds.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ Clouds::Clouds(
2929
scene::ISceneNode* parent,
3030
scene::ISceneManager* mgr,
3131
s32 id,
32-
u32 seed
32+
u32 seed,
33+
s16 cloudheight
3334
):
3435
scene::ISceneNode(parent, mgr, id),
3536
m_seed(seed),
@@ -45,7 +46,8 @@ Clouds::Clouds(
4546
//m_material.MaterialType = video::EMT_TRANSPARENT_VERTEX_ALPHA;
4647
m_material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
4748

48-
m_cloud_y = BS * g_settings->getS16("cloud_height");
49+
m_cloud_y = BS * (cloudheight ? cloudheight :
50+
g_settings->getS16("cloud_height"));
4951

5052
m_box = core::aabbox3d<f32>(-BS*1000000,m_cloud_y-BS,-BS*1000000,
5153
BS*1000000,m_cloud_y+BS,BS*1000000);

‎src/clouds.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ class Clouds : public scene::ISceneNode
3030
scene::ISceneNode* parent,
3131
scene::ISceneManager* mgr,
3232
s32 id,
33-
u32 seed
33+
u32 seed,
34+
s16 cloudheight=0
3435
);
3536

3637
~Clouds();

‎src/defaultsettings.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ void set_default_settings(Settings *settings)
109109
settings->setDefault("view_bobbing_amount", "1.0");
110110
settings->setDefault("enable_3d_clouds", "true");
111111
settings->setDefault("cloud_height", "120");
112+
settings->setDefault("menu_clouds", "true");
112113
settings->setDefault("opaque_water", "false");
113114
settings->setDefault("console_color", "(0,0,0)");
114115
settings->setDefault("console_alpha", "200");

‎src/guiMainMenu.cpp

+4-7
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,6 @@ void GUIMainMenu::regenerateGui(v2u32 screensize)
209209
changeCtype("");
210210

211211
// Version
212-
//if(m_data->selected_tab != TAB_CREDITS)
213212
{
214213
core::rect<s32> rect(0, 0, size.X, 40);
215214
rect += v2s32(4, 0);
@@ -219,7 +218,7 @@ void GUIMainMenu::regenerateGui(v2u32 screensize)
219218
}
220219

221220
//v2s32 center(size.X/2, size.Y/2);
222-
v2s32 c800(size.X/2-400, size.Y/2-300);
221+
v2s32 c800(size.X/2-400, size.Y/2-270);
223222

224223
m_topleft_client = c800 + v2s32(90, 70+50+30);
225224
m_size_client = v2s32(620, 270);
@@ -237,7 +236,6 @@ void GUIMainMenu::regenerateGui(v2u32 screensize)
237236
m_topleft_server = m_topleft_client + v2s32(0, m_size_client.Y+20);
238237

239238
// Tabs
240-
#if 1
241239
{
242240
core::rect<s32> rect(0, 0, m_size_client.X, 30);
243241
rect += m_topleft_client + v2s32(0, -30);
@@ -250,7 +248,6 @@ void GUIMainMenu::regenerateGui(v2u32 screensize)
250248
e->addTab(wgettext("Credits"));
251249
e->setActiveTab(m_data->selected_tab);
252250
}
253-
#endif
254251

255252
if(m_data->selected_tab == TAB_SINGLEPLAYER)
256253
{
@@ -786,15 +783,15 @@ void GUIMainMenu::drawMenu()
786783
driver->draw2DRectangle(bgcolor, rect, &AbsoluteClippingRect);
787784
}
788785
video::ITexture *logotexture =
789-
driver->getTexture(getTexturePath("menulogo.png").c_str());
786+
driver->getTexture(getTexturePath("logo.png").c_str());
790787
if(logotexture)
791788
{
792789
v2s32 logosize(logotexture->getOriginalSize().Width,
793790
logotexture->getOriginalSize().Height);
794-
logosize *= 2;
791+
795792
core::rect<s32> rect(0,0,logosize.X,logosize.Y);
796793
rect += AbsoluteRect.UpperLeftCorner + m_topleft_client;
797-
rect += v2s32(130, 50);
794+
rect += v2s32(500, 30);
798795
driver->draw2DImage(logotexture, rect,
799796
core::rect<s32>(core::position2d<s32>(0,0),
800797
core::dimension2di(logotexture->getSize())),

‎src/main.cpp

+162-45
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
5050
#include "irrlichttypes_extrabloated.h"
5151
#include "debug.h"
5252
#include "test.h"
53+
#include "clouds.h"
5354
#include "server.h"
5455
#include "constants.h"
5556
#include "porting.h"
@@ -596,50 +597,120 @@ class RandomInputHandler : public InputHandler
596597
bool rightreleased;
597598
};
598599

599-
void drawMenuBackground(video::IVideoDriver* driver)
600-
{
600+
//Draw the tiled menu background
601+
void drawMenuBackground(video::IVideoDriver* driver) {
601602
core::dimension2d<u32> screensize = driver->getScreenSize();
603+
604+
std::string path = getTexturePath("menubg.png");
605+
if (path[0]) {
606+
video::ITexture *bgtexture =
607+
driver->getTexture(path.c_str());
608+
609+
if (bgtexture) {
610+
s32 scaledsize = 128;
602611

603-
video::ITexture *bgtexture =
604-
driver->getTexture(getTexturePath("menubg.png").c_str());
605-
if(bgtexture)
606-
{
607-
s32 scaledsize = 128;
608-
609-
// The important difference between destsize and screensize is
610-
// that destsize is rounded to whole scaled pixels.
611-
// These formulas use component-wise multiplication and division of v2u32.
612-
v2u32 texturesize = bgtexture->getSize();
613-
v2u32 sourcesize = texturesize * screensize / scaledsize + v2u32(1,1);
614-
v2u32 destsize = scaledsize * sourcesize / texturesize;
612+
// The important difference between destsize and screensize is
613+
// that destsize is rounded to whole scaled pixels.
614+
// These formulas use component-wise multiplication and division of v2u32.
615+
v2u32 texturesize = bgtexture->getSize();
616+
v2u32 sourcesize = texturesize * screensize / scaledsize + v2u32(1,1);
617+
v2u32 destsize = scaledsize * sourcesize / texturesize;
615618

616-
// Default texture wrapping mode in Irrlicht is ETC_REPEAT.
617-
driver->draw2DImage(bgtexture,
618-
core::rect<s32>(0, 0, destsize.X, destsize.Y),
619-
core::rect<s32>(0, 0, sourcesize.X, sourcesize.Y),
620-
NULL, NULL, true);
619+
// Default texture wrapping mode in Irrlicht is ETC_REPEAT.
620+
driver->draw2DImage(bgtexture,
621+
core::rect<s32>(0, 0, destsize.X, destsize.Y),
622+
core::rect<s32>(0, 0, sourcesize.X, sourcesize.Y),
623+
NULL, NULL, true);
624+
}
621625
}
622-
623-
video::ITexture *logotexture =
624-
driver->getTexture(getTexturePath("menulogo.png").c_str());
625-
if(logotexture)
626-
{
627-
v2s32 logosize(logotexture->getOriginalSize().Width,
628-
logotexture->getOriginalSize().Height);
629-
logosize *= 4;
630-
631-
video::SColor bgcolor(255,50,50,50);
632-
core::rect<s32> bgrect(0, screensize.Height-logosize.Y-20,
633-
screensize.Width, screensize.Height);
634-
driver->draw2DRectangle(bgcolor, bgrect, NULL);
635-
636-
core::rect<s32> rect(0,0,logosize.X,logosize.Y);
637-
rect += v2s32(screensize.Width/2,screensize.Height-10-logosize.Y);
638-
rect -= v2s32(logosize.X/2, 0);
639-
driver->draw2DImage(logotexture, rect,
640-
core::rect<s32>(core::position2d<s32>(0,0),
641-
core::dimension2di(logotexture->getSize())),
642-
NULL, NULL, true);
626+
}
627+
628+
//Draw the footer at the bottom of the window
629+
void drawMenuFooter(video::IVideoDriver* driver, bool clouds) {
630+
core::dimension2d<u32> screensize = driver->getScreenSize();
631+
std::string path = getTexturePath(clouds ?
632+
"menufooter_clouds.png" : "menufooter.png");
633+
if (path[0]) {
634+
video::ITexture *footertexture =
635+
driver->getTexture(path.c_str());
636+
637+
if (footertexture) {
638+
f32 mult = (((f32)screensize.Width)) /
639+
((f32)footertexture->getOriginalSize().Width);
640+
641+
v2s32 footersize(((f32)footertexture->getOriginalSize().Width) * mult,
642+
((f32)footertexture->getOriginalSize().Height) * mult);
643+
644+
// Don't draw the footer if there isn't enough room
645+
s32 free_space = (((s32)screensize.Height)-320)/2;
646+
if (free_space > footersize.Y) {
647+
core::rect<s32> rect(0,0,footersize.X,footersize.Y);
648+
rect += v2s32(screensize.Width/2,screensize.Height-footersize.Y);
649+
rect -= v2s32(footersize.X/2, 0);
650+
651+
driver->draw2DImage(footertexture, rect,
652+
core::rect<s32>(core::position2d<s32>(0,0),
653+
core::dimension2di(footertexture->getSize())),
654+
NULL, NULL, true);
655+
}
656+
}
657+
}
658+
}
659+
660+
// Draw the Header over the main menu
661+
void drawMenuHeader(video::IVideoDriver* driver) {
662+
core::dimension2d<u32> screensize = driver->getScreenSize();
663+
664+
std::string path = getTexturePath("menuheader.png");
665+
if (path[0]) {
666+
video::ITexture *splashtexture =
667+
driver->getTexture(path.c_str());
668+
669+
if(splashtexture) {
670+
//v2s32 splashsize((splashtexture->getOriginalSize().Width*100)/
671+
// splashtexture->getOriginalSize().Height, 80);
672+
673+
f32 mult = (((f32)screensize.Width / 2)) /
674+
((f32)splashtexture->getOriginalSize().Width);
675+
676+
v2s32 splashsize(((f32)splashtexture->getOriginalSize().Width) * mult,
677+
((f32)splashtexture->getOriginalSize().Height) * mult);
678+
679+
// Don't draw the header is there isn't enough room
680+
s32 free_space = (((s32)screensize.Height)-320)/2;
681+
if (free_space > splashsize.Y) {
682+
core::rect<s32> splashrect(0, 0, splashsize.X, splashsize.Y);
683+
splashrect += v2s32((screensize.Width/2)-(splashsize.X/2),
684+
((free_space/2)-splashsize.Y/2)+10);
685+
686+
video::SColor bgcolor(255,50,50,50);
687+
688+
driver->draw2DImage(splashtexture, splashrect,
689+
core::rect<s32>(core::position2d<s32>(0,0),
690+
core::dimension2di(splashtexture->getSize())),
691+
NULL, NULL, true);
692+
}
693+
}
694+
}
695+
}
696+
697+
// Draw the Splash over the clouds and under the main menu
698+
void drawMenuSplash(video::IVideoDriver* driver) {
699+
core::dimension2d<u32> screensize = driver->getScreenSize();
700+
if (getTexturePath("menusplash.png") != "") {
701+
video::ITexture *splashtexture =
702+
driver->getTexture(getTexturePath("menusplash.png").c_str());
703+
704+
if(splashtexture) {
705+
core::rect<s32> splashrect(0, 0, screensize.Width, screensize.Height);
706+
707+
video::SColor bgcolor(255,50,50,50);
708+
709+
driver->draw2DImage(splashtexture, splashrect,
710+
core::rect<s32>(core::position2d<s32>(0,0),
711+
core::dimension2di(splashtexture->getSize())),
712+
NULL, NULL, true);
713+
}
643714
}
644715
}
645716

@@ -1540,6 +1611,22 @@ int main(int argc, char *argv[])
15401611
&g_menumgr, &menudata, g_gamecallback);
15411612
menu->allowFocusRemoval(true);
15421613

1614+
// Clouds for the main menu
1615+
bool cloud_menu_background = false;
1616+
Clouds *clouds = NULL;
1617+
if (g_settings->getBool("menu_clouds")) {
1618+
cloud_menu_background = true;
1619+
clouds = new Clouds(smgr->getRootSceneNode(),
1620+
smgr, -1, rand(), 100);
1621+
clouds->update(v2f(0, 0), video::SColor(255,200,200,255));
1622+
1623+
// A camera to see the clouds
1624+
scene::ICameraSceneNode* camera;
1625+
camera = smgr->addCameraSceneNode(0,
1626+
v3f(0,0,0), v3f(0, 60, 100));
1627+
camera->setFarValue(10000);
1628+
}
1629+
15431630
if(error_message != L"")
15441631
{
15451632
verbosestream<<"error_message = "
@@ -1552,30 +1639,60 @@ int main(int argc, char *argv[])
15521639
error_message = L"";
15531640
}
15541641

1642+
// Time is in milliseconds, for clouds
1643+
u32 lasttime = device->getTimer()->getTime();
1644+
15551645
infostream<<"Created main menu"<<std::endl;
15561646

15571647
while(device->run() && kill == false)
15581648
{
15591649
if(menu->getStatus() == true)
15601650
break;
15611651

1562-
//driver->beginScene(true, true, video::SColor(255,0,0,0));
1563-
driver->beginScene(true, true, video::SColor(255,128,128,128));
1652+
// Time calc for the clouds
1653+
f32 dtime; // in seconds
1654+
if (cloud_menu_background) {
1655+
u32 time = device->getTimer()->getTime();
1656+
if(time > lasttime)
1657+
dtime = (time - lasttime) / 1000.0;
1658+
else
1659+
dtime = 0;
1660+
lasttime = time;
1661+
}
15641662

1565-
drawMenuBackground(driver);
1663+
//driver->beginScene(true, true, video::SColor(255,0,0,0));
1664+
driver->beginScene(true, true, video::SColor(255,140,186,250));
1665+
1666+
if (cloud_menu_background) {
1667+
// *3 otherwise the clouds would move very slowly
1668+
clouds->step(dtime*3);
1669+
clouds->render();
1670+
smgr->drawAll();
1671+
drawMenuSplash(driver);
1672+
drawMenuFooter(driver, true);
1673+
drawMenuHeader(driver);
1674+
} else {
1675+
drawMenuBackground(driver);
1676+
drawMenuFooter(driver, false);
1677+
}
15661678

15671679
guienv->drawAll();
1568-
1680+
15691681
driver->endScene();
15701682

15711683
// On some computers framerate doesn't seem to be
15721684
// automatically limited
1573-
sleep_ms(25);
1685+
if (!cloud_menu_background)
1686+
sleep_ms(25);
15741687
}
15751688

15761689
infostream<<"Dropping main menu"<<std::endl;
15771690

15781691
menu->drop();
1692+
if (cloud_menu_background) {
1693+
clouds->drop();
1694+
smgr->clear();
1695+
}
15791696
}
15801697

15811698
playername = wide_to_narrow(menudata.name);

‎textures/base/pack/logo.png

12.8 KB
Loading

‎textures/base/pack/menufooter.png

356 Bytes
Loading

‎textures/base/pack/menuheader.png

578 Bytes
Loading

‎textures/base/pack/menulogo.png

-364 Bytes
Binary file not shown.

1 commit comments

Comments
 (1)

CasimirKaPazi commented on Mar 14, 2013

@CasimirKaPazi
Contributor

Beautiful.
One thing I noticed: The menu-clouds look better than the ingame-clouds. Can we change the ingame ones to look more like this?

Please sign in to comment.