-#ifdef HAVE_TOUCHSCREENGUI
- if ( (g_touchscreengui) && (offset == 0))
- g_touchscreengui->resetHud();
-#endif
-
- s32 height = m_hotbar_imagesize + m_padding * 2;
- s32 width = (itemcount - offset) * (m_hotbar_imagesize + m_padding * 2);
-
- if (direction == HUD_DIR_TOP_BOTTOM || direction == HUD_DIR_BOTTOM_TOP) {
- width = m_hotbar_imagesize + m_padding * 2;
- height = (itemcount - offset) * (m_hotbar_imagesize + m_padding * 2);
- }
-
- // Position of upper left corner of bar
- v2s32 pos = upperleftpos;
-
- if (hotbar_image != player->hotbar_image) {
- hotbar_image = player->hotbar_image;
- if (hotbar_image != "")
- use_hotbar_image = tsrc->isKnownSourceImage(hotbar_image);
- else
- use_hotbar_image = false;
- }
-
- if (hotbar_selected_image != player->hotbar_selected_image) {
- hotbar_selected_image = player->hotbar_selected_image;
- if (hotbar_selected_image != "")
- use_hotbar_selected_image = tsrc->isKnownSourceImage(hotbar_selected_image);
- else
- use_hotbar_selected_image = false;
- }
-
- /* draw customized item background */
- if (use_hotbar_image) {
- core::rect<s32> imgrect2(-m_padding/2, -m_padding/2,
- width+m_padding/2, height+m_padding/2);
- core::rect<s32> rect2 = imgrect2 + pos;
- video::ITexture *texture = tsrc->getTexture(hotbar_image);
- core::dimension2di imgsize(texture->getOriginalSize());
- driver->draw2DImage(texture, rect2,
- core::rect<s32>(core::position2d<s32>(0,0), imgsize),
- NULL, hbar_colors, true);
- }
-
- for (s32 i = offset; i < itemcount && (size_t)i < mainlist->getSize(); i++)
- {
- v2s32 steppos;
- s32 fullimglen = m_hotbar_imagesize + m_padding * 2;
-
- core::rect<s32> imgrect(0, 0, m_hotbar_imagesize, m_hotbar_imagesize);
-
- switch (direction) {
- case HUD_DIR_RIGHT_LEFT:
- steppos = v2s32(-(m_padding + (i - offset) * fullimglen), m_padding);
- break;
- case HUD_DIR_TOP_BOTTOM:
- steppos = v2s32(m_padding, m_padding + (i - offset) * fullimglen);
- break;
- case HUD_DIR_BOTTOM_TOP:
- steppos = v2s32(m_padding, -(m_padding + (i - offset) * fullimglen));
- break;
- default:
- steppos = v2s32(m_padding + (i - offset) * fullimglen, m_padding);
- break;
- }
-
- drawItem(mainlist->getItem(i), (imgrect + pos + steppos), (i +1) == selectitem );
-
-#ifdef HAVE_TOUCHSCREENGUI
- if (g_touchscreengui)
- g_touchscreengui->registerHudItem(i, (imgrect + pos + steppos));
-#endif
- }
-}
-
-
-void Hud::drawLuaElements(v3s16 camera_offset) {
- u32 text_height = g_fontengine->getTextHeight();
- irr::gui::IGUIFont* font = g_fontengine->getFont();
- for (size_t i = 0; i != player->maxHudId(); i++) {
- HudElement *e = player->getHud(i);
- if (!e)
- continue;
-
- v2s32 pos(floor(e->pos.X * (float) m_screensize.X + 0.5),
- floor(e->pos.Y * (float) m_screensize.Y + 0.5));
- switch (e->type) {
- case HUD_ELEM_IMAGE: {
- video::ITexture *texture = tsrc->getTexture(e->text);
- if (!texture)
- continue;
-
- const video::SColor color(255, 255, 255, 255);
- const video::SColor colors[] = {color, color, color, color};
- core::dimension2di imgsize(texture->getOriginalSize());
- v2s32 dstsize(imgsize.Width * e->scale.X,
- imgsize.Height * e->scale.Y);
- if (e->scale.X < 0)
- dstsize.X = m_screensize.X * (e->scale.X * -0.01);
- if (e->scale.Y < 0)
- dstsize.Y = m_screensize.Y * (e->scale.Y * -0.01);
- v2s32 offset((e->align.X - 1.0) * dstsize.X / 2,
- (e->align.Y - 1.0) * dstsize.Y / 2);
- core::rect<s32> rect(0, 0, dstsize.X, dstsize.Y);
- rect += pos + offset + v2s32(e->offset.X, e->offset.Y);
- driver->draw2DImage(texture, rect,
- core::rect<s32>(core::position2d<s32>(0,0), imgsize),
- NULL, colors, true);
- break; }
- case HUD_ELEM_TEXT: {
- video::SColor color(255, (e->number >> 16) & 0xFF,
- (e->number >> 8) & 0xFF,
- (e->number >> 0) & 0xFF);
- core::rect<s32> size(0, 0, e->scale.X, text_height * e->scale.Y);
- std::wstring text = narrow_to_wide(e->text);
- core::dimension2d<u32> textsize = font->getDimension(text.c_str());
- v2s32 offset((e->align.X - 1.0) * (textsize.Width / 2),
- (e->align.Y - 1.0) * (textsize.Height / 2));
- v2s32 offs(e->offset.X, e->offset.Y);
- font->draw(text.c_str(), size + pos + offset + offs, color);
- break; }
- case HUD_ELEM_STATBAR: {
- v2s32 offs(e->offset.X, e->offset.Y);
- drawStatbar(pos, HUD_CORNER_UPPER, e->dir, e->text, e->number, offs, e->size);
- break; }
- case HUD_ELEM_INVENTORY: {
- InventoryList *inv = inventory->getList(e->text);
- drawItems(pos, e->number, 0, inv, e->item, e->dir);
- break; }
- case HUD_ELEM_WAYPOINT: {
- v3f p_pos = player->getPosition() / BS;
- v3f w_pos = e->world_pos * BS;
- float distance = floor(10 * p_pos.getDistanceFrom(e->world_pos)) / 10;
- scene::ICameraSceneNode* camera = smgr->getActiveCamera();
- w_pos -= intToFloat(camera_offset, BS);
- core::matrix4 trans = camera->getProjectionMatrix();
- trans *= camera->getViewMatrix();
- f32 transformed_pos[4] = { w_pos.X, w_pos.Y, w_pos.Z, 1.0f };
- trans.multiplyWith1x4Matrix(transformed_pos);
- if (transformed_pos[3] < 0)
- break;
- f32 zDiv = transformed_pos[3] == 0.0f ? 1.0f :
- core::reciprocal(transformed_pos[3]);
- pos.X = m_screensize.X * (0.5 * transformed_pos[0] * zDiv + 0.5);
- pos.Y = m_screensize.Y * (0.5 - transformed_pos[1] * zDiv * 0.5);
- video::SColor color(255, (e->number >> 16) & 0xFF,
- (e->number >> 8) & 0xFF,
- (e->number >> 0) & 0xFF);
- core::rect<s32> size(0, 0, 200, 2 * text_height);
- std::wstring text = narrow_to_wide(e->name);
- font->draw(text.c_str(), size + pos, color);
- std::ostringstream os;
- os<<distance<<e->text;
- text = narrow_to_wide(os.str());
- pos.Y += text_height;
- font->draw(text.c_str(), size + pos, color);
- break; }
- default:
- infostream << "Hud::drawLuaElements: ignoring drawform " << e->type <<
- " of hud element ID " << i << " due to unrecognized type" << std::endl;
- }
- }
-}
-
-
-void Hud::drawStatbar(v2s32 pos, u16 corner, u16 drawdir, std::string texture,
- s32 count, v2s32 offset, v2s32 size)