@@ -51,6 +51,7 @@ Hud::Hud(gui::IGUIEnvironment *guienv, Client *client, LocalPlayer *player,
51
51
this ->inventory = inventory;
52
52
53
53
m_hud_scaling = g_settings->getFloat (" hud_scaling" );
54
+ m_scale_factor = m_hud_scaling * RenderingEngine::getDisplayDensity ();
54
55
m_hotbar_imagesize = std::floor (HOTBAR_IMAGE_SIZE *
55
56
RenderingEngine::getDisplayDensity () + 0 .5f );
56
57
m_hotbar_imagesize *= m_hud_scaling;
@@ -213,9 +214,7 @@ void Hud::drawItems(v2s32 upperleftpos, v2s32 screen_offset, s32 itemcount,
213
214
}
214
215
215
216
// Position of upper left corner of bar
216
- v2s32 pos = screen_offset;
217
- pos.X *= m_hud_scaling * RenderingEngine::getDisplayDensity ();
218
- pos.Y *= m_hud_scaling * RenderingEngine::getDisplayDensity ();
217
+ v2s32 pos = screen_offset * m_scale_factor;
219
218
pos += upperleftpos;
220
219
221
220
// Store hotbar_image in member variable, used by drawItem()
@@ -320,20 +319,40 @@ void Hud::drawLuaElements(const v3s16 &camera_offset)
320
319
switch (e->type ) {
321
320
case HUD_ELEM_TEXT: {
322
321
irr::gui::IGUIFont *textfont = font;
322
+ unsigned int font_size = g_fontengine->getDefaultFontSize ();
323
+
323
324
if (e->size .X > 0 )
324
- textfont = g_fontengine->getFont (
325
- e->size .X * g_fontengine->getDefaultFontSize ());
325
+ font_size *= e->size .X ;
326
+
327
+ if (font_size != g_fontengine->getDefaultFontSize ())
328
+ textfont = g_fontengine->getFont (font_size);
326
329
327
330
video::SColor color (255 , (e->number >> 16 ) & 0xFF ,
328
331
(e->number >> 8 ) & 0xFF ,
329
332
(e->number >> 0 ) & 0xFF );
330
- core::rect<s32> size (0 , 0 , e->scale .X , text_height * e->scale .Y );
331
333
std::wstring text = unescape_translate (utf8_to_wide (e->text ));
332
334
core::dimension2d<u32> textsize = textfont->getDimension (text.c_str ());
335
+ #ifdef __ANDROID__
336
+ // The text size on Android is not proportional with the actual scaling
337
+ irr::gui::IGUIFont *font_scaled = font_size <= 3 ?
338
+ textfont : g_fontengine->getFont (font_size - 3 );
339
+ if (e->offset .X < -20 )
340
+ textsize = font_scaled->getDimension (text.c_str ());
341
+ #endif
333
342
v2s32 offset ((e->align .X - 1.0 ) * (textsize.Width / 2 ),
334
343
(e->align .Y - 1.0 ) * (textsize.Height / 2 ));
335
- v2s32 offs (e->offset .X , e->offset .Y );
336
- textfont->draw (text.c_str (), size + pos + offset + offs, color);
344
+ core::rect<s32> size (0 , 0 , e->scale .X * m_scale_factor,
345
+ text_height * e->scale .Y * m_scale_factor);
346
+ v2s32 offs (e->offset .X * m_scale_factor,
347
+ e->offset .Y * m_scale_factor);
348
+ #ifdef __ANDROID__
349
+ if (e->offset .X < -20 )
350
+ font_scaled->draw (text.c_str (), size + pos + offset + offs, color);
351
+ else
352
+ #endif
353
+ {
354
+ textfont->draw (text.c_str (), size + pos + offset + offs, color);
355
+ }
337
356
break ; }
338
357
case HUD_ELEM_STATBAR: {
339
358
v2s32 offs (e->offset .X , e->offset .Y );
@@ -385,16 +404,17 @@ void Hud::drawLuaElements(const v3s16 &camera_offset)
385
404
const video::SColor color (255 , 255 , 255 , 255 );
386
405
const video::SColor colors[] = {color, color, color, color};
387
406
core::dimension2di imgsize (texture->getOriginalSize ());
388
- v2s32 dstsize (imgsize.Width * e->scale .X ,
389
- imgsize.Height * e->scale .Y );
407
+ v2s32 dstsize (imgsize.Width * e->scale .X * m_scale_factor ,
408
+ imgsize.Height * e->scale .Y * m_scale_factor );
390
409
if (e->scale .X < 0 )
391
410
dstsize.X = m_screensize.X * (e->scale .X * -0.01 );
392
411
if (e->scale .Y < 0 )
393
412
dstsize.Y = m_screensize.Y * (e->scale .Y * -0.01 );
394
413
v2s32 offset ((e->align .X - 1.0 ) * dstsize.X / 2 ,
395
414
(e->align .Y - 1.0 ) * dstsize.Y / 2 );
396
415
core::rect<s32> rect (0 , 0 , dstsize.X , dstsize.Y );
397
- rect += pos + offset + v2s32 (e->offset .X , e->offset .Y );
416
+ rect += pos + offset + v2s32 (e->offset .X * m_scale_factor,
417
+ e->offset .Y * m_scale_factor);
398
418
draw2DImageFilterScaled (driver, texture, rect,
399
419
core::rect<s32>(core::position2d<s32>(0 ,0 ), imgsize),
400
420
NULL , colors, true );
@@ -427,12 +447,15 @@ void Hud::drawStatbar(v2s32 pos, u16 corner, u16 drawdir,
427
447
core::dimension2di dstd;
428
448
if (size == v2s32 ()) {
429
449
dstd = srcd;
450
+ dstd.Height *= m_scale_factor;
451
+ dstd.Width *= m_scale_factor;
452
+ offset.X *= m_scale_factor;
453
+ offset.Y *= m_scale_factor;
430
454
} else {
431
- float size_factor = m_hud_scaling * RenderingEngine::getDisplayDensity ();
432
- dstd.Height = size.Y * size_factor;
433
- dstd.Width = size.X * size_factor;
434
- offset.X *= size_factor;
435
- offset.Y *= size_factor;
455
+ dstd.Height = size.Y * m_scale_factor;
456
+ dstd.Width = size.X * m_scale_factor;
457
+ offset.X *= m_scale_factor;
458
+ offset.Y *= m_scale_factor;
436
459
}
437
460
438
461
v2s32 p = pos;
@@ -555,7 +578,7 @@ void Hud::drawHotbar(u16 playeritem) {
555
578
v2s32 pos = centerlowerpos - v2s32 (width / 2 , m_hotbar_imagesize + m_padding * 3 );
556
579
557
580
const v2u32 &window_size = RenderingEngine::get_instance ()->getWindowSize ();
558
- if ( (float ) width / (float ) window_size.X <=
581
+ if ((float ) width / (float ) window_size.X <=
559
582
g_settings->getFloat (" hud_hotbar_max_width" )) {
560
583
if (player->hud_flags & HUD_FLAG_HOTBAR_VISIBLE) {
561
584
drawItems (pos, v2s32 (0 , 0 ), hotbar_itemcount, 0 , mainlist, playeritem + 1 , 0 );
@@ -607,12 +630,10 @@ void Hud::drawSelectionMesh()
607
630
// Draw 3D selection boxes
608
631
video::SMaterial oldmaterial = driver->getMaterial2D ();
609
632
driver->setMaterial (m_selection_material);
610
- for (std::vector<aabb3f>::const_iterator
611
- i = m_selection_boxes.begin ();
612
- i != m_selection_boxes.end (); ++i) {
633
+ for (auto & selection_box : m_selection_boxes) {
613
634
aabb3f box = aabb3f (
614
- i-> MinEdge + m_selection_pos_with_offset,
615
- i-> MaxEdge + m_selection_pos_with_offset);
635
+ selection_box. MinEdge + m_selection_pos_with_offset,
636
+ selection_box. MaxEdge + m_selection_pos_with_offset);
616
637
617
638
u32 r = (selectionbox_argb.getRed () *
618
639
m_selection_mesh_color.getRed () / 255 );
0 commit comments