Skip to content

Commit 7b3602b

Browse files
sapiersapier
sapier
authored and
sapier
committedJun 14, 2014
Fix regression dirt texture not beeing default in non cloud menu
1 parent 5b3bbde commit 7b3602b

File tree

6 files changed

+133
-57
lines changed

6 files changed

+133
-57
lines changed
 

‎builtin/mainmenu/textures.lua

+24-4
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,12 @@ function mm_texture.reset()
6060
mm_texture.set_generic("footer")
6161
mm_texture.set_generic("header")
6262

63-
if not have_bg and
64-
core.setting_getbool("menu_clouds") then
63+
if not have_bg then
64+
if core.setting_getbool("menu_clouds") then
6565
core.set_clouds(true)
66+
else
67+
mm_texture.set_dirt_bg()
68+
end
6669
end
6770
end
6871

@@ -83,9 +86,13 @@ function mm_texture.update_game(gamedetails)
8386
mm_texture.clear("footer")
8487
core.set_clouds(false)
8588

86-
if not have_bg and
87-
core.setting_getbool("menu_clouds") then
89+
if not have_bg then
90+
91+
if core.setting_getbool("menu_clouds") then
8892
core.set_clouds(true)
93+
else
94+
mm_texture.set_dirt_bg()
95+
end
8996
end
9097

9198
mm_texture.set_game("footer",gamedetails)
@@ -144,3 +151,16 @@ function mm_texture.set_game(identifier,gamedetails)
144151

145152
return false
146153
end
154+
155+
function mm_texture.set_dirt_bg()
156+
if mm_texture.texturepack ~= nil then
157+
local path = mm_texture.texturepack .. DIR_DELIM .."default_dirt.png"
158+
if core.set_background("background", path, true, 128) then
159+
return true
160+
end
161+
end
162+
163+
--use base pack
164+
local minimalpath = defaulttexturedir .. "dirt_bg.png"
165+
core.set_background("background", minimalpath, true, 128)
166+
end

‎doc/menu_lua_api.txt

+4-1
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,11 @@ core.explode_textlist_event(string) -> table
103103
^ type: "INV" (no row selected), "CHG" (selected) or "DCL" (double-click)
104104

105105
GUI:
106-
core.set_background(type, texturepath)
106+
core.set_background(type, texturepath,[tile],[minsize])
107107
^ type: "background", "overlay", "header" or "footer"
108+
^ tile: tile the image instead of scaling (background only)
109+
^ minsize: minimum tile size, images are scaled to at least this size prior
110+
^ doing tiling (background only)
108111
core.set_clouds(<true/false>)
109112
core.set_topleft_text(text)
110113
core.show_keys_menu()

‎src/guiEngine.cpp

+49-19
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
3131
#include "sound_openal.h"
3232
#include "clouds.h"
3333
#include "httpfetch.h"
34+
#include "util/numeric.h"
3435

3536
#include <IGUIStaticText.h>
3637
#include <ICameraSceneNode.h>
@@ -140,7 +141,7 @@ GUIEngine::GUIEngine( irr::IrrlichtDevice* dev,
140141
{
141142
//initialize texture pointers
142143
for (unsigned int i = 0; i < TEX_LAYER_MAX; i++) {
143-
m_textures[i] = 0;
144+
m_textures[i].texture = NULL;
144145
}
145146
// is deleted by guiformspec!
146147
m_buttonhandler = new TextDestGuiEngine(this);
@@ -238,7 +239,6 @@ bool GUIEngine::loadMainMenuScript()
238239
/******************************************************************************/
239240
void GUIEngine::run()
240241
{
241-
242242
// Always create clouds because they may or may not be
243243
// needed based on the game selected
244244
video::IVideoDriver* driver = m_device->getVideoDriver();
@@ -292,8 +292,8 @@ GUIEngine::~GUIEngine()
292292

293293
//clean up texture pointers
294294
for (unsigned int i = 0; i < TEX_LAYER_MAX; i++) {
295-
if (m_textures[i] != 0)
296-
driver->removeTexture(m_textures[i]);
295+
if (m_textures[i].texture != NULL)
296+
driver->removeTexture(m_textures[i].texture);
297297
}
298298

299299
delete m_texture_source;
@@ -362,7 +362,7 @@ void GUIEngine::drawBackground(video::IVideoDriver* driver)
362362
{
363363
v2u32 screensize = driver->getScreenSize();
364364

365-
video::ITexture* texture = m_textures[TEX_LAYER_BACKGROUND];
365+
video::ITexture* texture = m_textures[TEX_LAYER_BACKGROUND].texture;
366366

367367
/* If no texture, draw background of solid color */
368368
if(!texture){
@@ -372,8 +372,27 @@ void GUIEngine::drawBackground(video::IVideoDriver* driver)
372372
return;
373373
}
374374

375-
/* Draw background texture */
376375
v2u32 sourcesize = texture->getOriginalSize();
376+
377+
if (m_textures[TEX_LAYER_BACKGROUND].tile)
378+
{
379+
v2u32 tilesize(
380+
MYMAX(sourcesize.X,m_textures[TEX_LAYER_BACKGROUND].minsize),
381+
MYMAX(sourcesize.Y,m_textures[TEX_LAYER_BACKGROUND].minsize));
382+
for (unsigned int x = 0; x < screensize.X; x += tilesize.X )
383+
{
384+
for (unsigned int y = 0; y < screensize.Y; y += tilesize.Y )
385+
{
386+
driver->draw2DImage(texture,
387+
core::rect<s32>(x, y, x+tilesize.X, y+tilesize.Y),
388+
core::rect<s32>(0, 0, sourcesize.X, sourcesize.Y),
389+
NULL, NULL, true);
390+
}
391+
}
392+
return;
393+
}
394+
395+
/* Draw background texture */
377396
driver->draw2DImage(texture,
378397
core::rect<s32>(0, 0, screensize.X, screensize.Y),
379398
core::rect<s32>(0, 0, sourcesize.X, sourcesize.Y),
@@ -385,7 +404,7 @@ void GUIEngine::drawOverlay(video::IVideoDriver* driver)
385404
{
386405
v2u32 screensize = driver->getScreenSize();
387406

388-
video::ITexture* texture = m_textures[TEX_LAYER_OVERLAY];
407+
video::ITexture* texture = m_textures[TEX_LAYER_OVERLAY].texture;
389408

390409
/* If no texture, draw background of solid color */
391410
if(!texture)
@@ -404,7 +423,7 @@ void GUIEngine::drawHeader(video::IVideoDriver* driver)
404423
{
405424
core::dimension2d<u32> screensize = driver->getScreenSize();
406425

407-
video::ITexture* texture = m_textures[TEX_LAYER_HEADER];
426+
video::ITexture* texture = m_textures[TEX_LAYER_HEADER].texture;
408427

409428
/* If no texture, draw nothing */
410429
if(!texture)
@@ -438,7 +457,7 @@ void GUIEngine::drawFooter(video::IVideoDriver* driver)
438457
{
439458
core::dimension2d<u32> screensize = driver->getScreenSize();
440459

441-
video::ITexture* texture = m_textures[TEX_LAYER_FOOTER];
460+
video::ITexture* texture = m_textures[TEX_LAYER_FOOTER].texture;
442461

443462
/* If no texture, draw nothing */
444463
if(!texture)
@@ -466,29 +485,38 @@ void GUIEngine::drawFooter(video::IVideoDriver* driver)
466485
}
467486

468487
/******************************************************************************/
469-
bool GUIEngine::setTexture(texture_layer layer,std::string texturepath) {
470-
488+
bool GUIEngine::setTexture(texture_layer layer, std::string texturepath,
489+
bool tile_image, unsigned int minsize)
490+
{
471491
video::IVideoDriver* driver = m_device->getVideoDriver();
472492
assert(driver != 0);
473493

474-
if (m_textures[layer] != 0)
494+
if (m_textures[layer].texture != NULL)
475495
{
476-
driver->removeTexture(m_textures[layer]);
477-
m_textures[layer] = 0;
496+
driver->removeTexture(m_textures[layer].texture);
497+
m_textures[layer].texture = NULL;
478498
}
479499

480500
if ((texturepath == "") || !fs::PathExists(texturepath))
501+
{
481502
return false;
503+
}
482504

483-
m_textures[layer] = driver->getTexture(texturepath.c_str());
505+
m_textures[layer].texture = driver->getTexture(texturepath.c_str());
506+
m_textures[layer].tile = tile_image;
507+
m_textures[layer].minsize = minsize;
484508

485-
if (m_textures[layer] == 0) return false;
509+
if (m_textures[layer].texture == NULL)
510+
{
511+
return false;
512+
}
486513

487514
return true;
488515
}
489516

490517
/******************************************************************************/
491-
bool GUIEngine::downloadFile(std::string url,std::string target) {
518+
bool GUIEngine::downloadFile(std::string url,std::string target)
519+
{
492520
#if USE_CURL
493521
std::ofstream targetfile(target.c_str(), std::ios::out | std::ios::binary);
494522

@@ -515,7 +543,8 @@ bool GUIEngine::downloadFile(std::string url,std::string target) {
515543
}
516544

517545
/******************************************************************************/
518-
void GUIEngine::setTopleftText(std::string append) {
546+
void GUIEngine::setTopleftText(std::string append)
547+
{
519548
std::string toset = std::string("Minetest ") + minetest_version_hash;
520549

521550
if (append != "") {
@@ -541,7 +570,8 @@ void GUIEngine::stopSound(s32 handle)
541570

542571
/******************************************************************************/
543572
unsigned int GUIEngine::queueAsync(std::string serialized_func,
544-
std::string serialized_params) {
573+
std::string serialized_params)
574+
{
545575
return m_script->queueAsync(serialized_func, serialized_params);
546576
}
547577

‎src/guiEngine.h

+37-28
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@ typedef enum {
4141
TEX_LAYER_MAX
4242
} texture_layer;
4343

44+
typedef struct {
45+
video::ITexture* texture;
46+
bool tile;
47+
unsigned int minsize;
48+
} image_definition;
49+
4450
/******************************************************************************/
4551
/* forward declarations */
4652
/******************************************************************************/
@@ -143,26 +149,28 @@ class GUIEngine {
143149
* @param data struct to transfer data to main game handling
144150
*/
145151
GUIEngine( irr::IrrlichtDevice* dev,
146-
gui::IGUIElement* parent,
147-
IMenuManager *menumgr,
148-
scene::ISceneManager* smgr,
149-
MainMenuData* data,
150-
bool& kill);
152+
gui::IGUIElement* parent,
153+
IMenuManager *menumgr,
154+
scene::ISceneManager* smgr,
155+
MainMenuData* data,
156+
bool& kill);
151157

152158
/** default destructor */
153159
virtual ~GUIEngine();
154160

155161
/**
156162
* return MainMenuScripting interface
157163
*/
158-
MainMenuScripting* getScriptIface() {
164+
MainMenuScripting* getScriptIface()
165+
{
159166
return m_script;
160167
}
161168

162169
/**
163170
* return dir of current menuscript
164171
*/
165-
std::string getScriptDir() {
172+
std::string getScriptDir()
173+
{
166174
return m_scriptdir;
167175
}
168176

@@ -181,38 +189,38 @@ class GUIEngine {
181189
void limitFrameRate();
182190

183191
/** device to draw at */
184-
irr::IrrlichtDevice* m_device;
192+
irr::IrrlichtDevice* m_device;
185193
/** parent gui element */
186-
gui::IGUIElement* m_parent;
194+
gui::IGUIElement* m_parent;
187195
/** manager to add menus to */
188-
IMenuManager* m_menumanager;
196+
IMenuManager* m_menumanager;
189197
/** scene manager to add scene elements to */
190-
scene::ISceneManager* m_smgr;
198+
scene::ISceneManager* m_smgr;
191199
/** pointer to data beeing transfered back to main game handling */
192-
MainMenuData* m_data;
200+
MainMenuData* m_data;
193201
/** pointer to texture source */
194-
ISimpleTextureSource* m_texture_source;
202+
ISimpleTextureSource* m_texture_source;
195203
/** pointer to soundmanager*/
196-
ISoundManager* m_sound_manager;
204+
ISoundManager* m_sound_manager;
197205

198206
/** representation of form source to be used in mainmenu formspec */
199-
FormspecFormSource* m_formspecgui;
207+
FormspecFormSource* m_formspecgui;
200208
/** formspec input receiver */
201-
TextDestGuiEngine* m_buttonhandler;
209+
TextDestGuiEngine* m_buttonhandler;
202210
/** the formspec menu */
203-
GUIFormSpecMenu* m_menu;
211+
GUIFormSpecMenu* m_menu;
204212

205213
/** reference to kill variable managed by SIGINT handler */
206-
bool& m_kill;
214+
bool& m_kill;
207215

208216
/** variable used to abort menu and return back to main game handling */
209-
bool m_startgame;
217+
bool m_startgame;
210218

211219
/** scripting interface */
212-
MainMenuScripting* m_script;
220+
MainMenuScripting* m_script;
213221

214222
/** script basefolder */
215-
std::string m_scriptdir;
223+
std::string m_scriptdir;
216224

217225
/**
218226
* draw background layer
@@ -240,7 +248,8 @@ class GUIEngine {
240248
* @param layer draw layer to specify texture
241249
* @param texturepath full path of texture to load
242250
*/
243-
bool setTexture(texture_layer layer,std::string texturepath);
251+
bool setTexture(texture_layer layer, std::string texturepath,
252+
bool tile_image, unsigned int minsize);
244253

245254
/**
246255
* download a file using curl
@@ -250,7 +259,7 @@ class GUIEngine {
250259
static bool downloadFile(std::string url,std::string target);
251260

252261
/** array containing pointers to current specified texture layers */
253-
video::ITexture* m_textures[TEX_LAYER_MAX];
262+
image_definition m_textures[TEX_LAYER_MAX];
254263

255264
/** draw version string in topleft corner */
256265
void drawVersion();
@@ -274,19 +283,19 @@ class GUIEngine {
274283
/** internam data required for drawing clouds */
275284
struct clouddata {
276285
/** delta time since last cloud processing */
277-
f32 dtime;
286+
f32 dtime;
278287
/** absolute time of last cloud processing */
279-
u32 lasttime;
288+
u32 lasttime;
280289
/** pointer to cloud class */
281-
Clouds* clouds;
290+
Clouds* clouds;
282291
/** camera required for drawing clouds */
283292
scene::ICameraSceneNode* camera;
284293
};
285294

286295
/** is drawing of clouds enabled atm */
287-
bool m_clouds_enabled;
296+
bool m_clouds_enabled;
288297
/** data used to draw clouds */
289-
clouddata m_cloud;
298+
clouddata m_cloud;
290299

291300
/** start playing a sound and return handle */
292301
s32 playSound(SimpleSoundSpec spec, bool looped);

0 commit comments

Comments
 (0)
Please sign in to comment.