#include "inventory.h"
#include "tile.h"
#include "localplayer.h"
+#include "camera.h"
#include <IGUIStaticText.h>
-Hud::Hud(video::IVideoDriver *driver, gui::IGUIEnvironment* guienv,
- gui::IGUIFont *font, u32 text_height, IGameDef *gamedef,
+Hud::Hud(video::IVideoDriver *driver, scene::ISceneManager* smgr,
+ gui::IGUIEnvironment* guienv, gui::IGUIFont *font,
+ u32 text_height, IGameDef *gamedef,
LocalPlayer *player, Inventory *inventory) {
this->driver = driver;
+ this->smgr = smgr;
this->guienv = guienv;
this->font = font;
this->text_height = text_height;
selectionbox_argb = video::SColor(255, sbox_r, sbox_g, sbox_b);
use_crosshair_image = tsrc->isKnownSourceImage("crosshair.png");
+
+ hotbar_image = "";
+ use_hotbar_image = false;
+ hotbar_selected_image = "";
+ use_hotbar_selected_image = false;
}
driver->draw2DRectangle(bgcolor, barrect, NULL);*/
core::rect<s32> imgrect(0, 0, imgsize, imgsize);
+ const video::SColor hbar_color(255, 255, 255, 255);
+ const video::SColor hbar_colors[] = {hbar_color, hbar_color, hbar_color, hbar_color};
+
+ 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;
+ }
+
+ if (use_hotbar_image) {
+ core::rect<s32> imgrect2(-padding/2, -padding/2, width+padding/2, height+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 = 0; i < itemcount; i++)
{
core::rect<s32> rect = imgrect + pos + steppos;
- if (selectitem == i + 1)
- {
- video::SColor c_outside(255,255,0,0);
- //video::SColor c_outside(255,0,0,0);
- //video::SColor c_inside(255,192,192,192);
- s32 x1 = rect.UpperLeftCorner.X;
- s32 y1 = rect.UpperLeftCorner.Y;
- s32 x2 = rect.LowerRightCorner.X;
- s32 y2 = rect.LowerRightCorner.Y;
- // Black base borders
- driver->draw2DRectangle(c_outside,
+ if (selectitem == i + 1) {
+ if (use_hotbar_selected_image) {
+ core::rect<s32> imgrect2(-padding*2, -padding*2, height, height);
+ rect = imgrect2 + pos + steppos;
+ video::ITexture *texture = tsrc->getTexture(hotbar_selected_image);
+ core::dimension2di imgsize(texture->getOriginalSize());
+ driver->draw2DImage(texture, rect,
+ core::rect<s32>(core::position2d<s32>(0,0), imgsize),
+ NULL, hbar_colors, true);
+ rect = imgrect + pos + steppos;
+ } else {
+ rect = imgrect + pos + steppos;
+ video::SColor c_outside(255,255,0,0);
+ //video::SColor c_outside(255,0,0,0);
+ //video::SColor c_inside(255,192,192,192);
+ s32 x1 = rect.UpperLeftCorner.X;
+ s32 y1 = rect.UpperLeftCorner.Y;
+ s32 x2 = rect.LowerRightCorner.X;
+ s32 y2 = rect.LowerRightCorner.Y;
+ // Black base borders
+ driver->draw2DRectangle(c_outside,
core::rect<s32>(
v2s32(x1 - padding, y1 - padding),
v2s32(x2 + padding, y1)
), NULL);
- driver->draw2DRectangle(c_outside,
+ driver->draw2DRectangle(c_outside,
core::rect<s32>(
v2s32(x1 - padding, y2),
v2s32(x2 + padding, y2 + padding)
), NULL);
- driver->draw2DRectangle(c_outside,
+ driver->draw2DRectangle(c_outside,
core::rect<s32>(
v2s32(x1 - padding, y1),
v2s32(x1, y2)
), NULL);
- driver->draw2DRectangle(c_outside,
+ driver->draw2DRectangle(c_outside,
core::rect<s32>(
v2s32(x2, y1),
v2s32(x2 + padding, y2)
), NULL);
- /*// Light inside borders
- driver->draw2DRectangle(c_inside,
+ /*// Light inside borders
+ driver->draw2DRectangle(c_inside,
core::rect<s32>(
v2s32(x1 - padding/2, y1 - padding/2),
v2s32(x2 + padding/2, y1)
), NULL);
- driver->draw2DRectangle(c_inside,
+ driver->draw2DRectangle(c_inside,
core::rect<s32>(
v2s32(x1 - padding/2, y2),
v2s32(x2 + padding/2, y2 + padding/2)
), NULL);
- driver->draw2DRectangle(c_inside,
+ driver->draw2DRectangle(c_inside,
core::rect<s32>(
v2s32(x1 - padding/2, y1),
v2s32(x1, y2)
), NULL);
- driver->draw2DRectangle(c_inside,
+ driver->draw2DRectangle(c_inside,
core::rect<s32>(
v2s32(x2, y1),
v2s32(x2 + padding/2, y2)
), NULL);
- */
+ */
+ }
}
video::SColor bgcolor2(128, 0, 0, 0);
- driver->draw2DRectangle(bgcolor2, rect, NULL);
+ if (!use_hotbar_image)
+ driver->draw2DRectangle(bgcolor2, rect, NULL);
drawItemStack(driver, font, item, rect, NULL, gamedef);
}
}
const video::SColor color(255, 255, 255, 255);
const video::SColor colors[] = {color, color, color, color};
core::dimension2di imgsize(texture->getOriginalSize());
- core::rect<s32> rect(0, 0, imgsize.Width * e->scale.X,
- imgsize.Height * e->scale.X);
- rect += pos;
- v2s32 offset((e->align.X - 1.0) * ((imgsize.Width * e->scale.X) / 2),
- (e->align.Y - 1.0) * ((imgsize.Height * e->scale.X) / 2));
- rect += offset;
- rect += v2s32(e->offset.X, e->offset.Y);
+ v2s32 dstsize(imgsize.Width * e->scale.X,
+ imgsize.Height * e->scale.Y);
+ if (e->scale.X < 0)
+ dstsize.X = screensize.X * (e->scale.X * -0.01);
+ if (e->scale.Y < 0)
+ dstsize.Y = 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);
InventoryList *inv = inventory->getList(e->text);
drawItem(pos, hotbar_imagesize, e->number, 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();
+ 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 = screensize.X * (0.5 * transformed_pos[0] * zDiv + 0.5);
+ pos.Y = 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;
+ " of hud element ID " << i << " due to unrecognized type" << std::endl;
}
}
}
s32 hotbar_itemcount = player->hud_hotbar_itemcount;
s32 padding = hotbar_imagesize / 12;
s32 width = hotbar_itemcount * (hotbar_imagesize + padding * 2);
- v2s32 pos = centerlowerpos - v2s32(width / 2, hotbar_imagesize + padding * 2);
+ v2s32 pos = centerlowerpos - v2s32(width / 2, hotbar_imagesize + padding * 3);
if (player->hud_flags & HUD_FLAG_HOTBAR_VISIBLE)
drawItem(pos, hotbar_imagesize, hotbar_itemcount, mainlist, playeritem + 1, 0);
font->draw(text.c_str(), rect2, color, false, false, clip);
}
}
-