X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fhud.h;h=15c115d89e9b0046cc018dcc842eff79ee0d1c07;hb=dd0a058e1fc74f37605022b52fa1f6b04086bbbf;hp=00e44dd8000318304091f82a0296f7da667be796;hpb=97cddd1b960e3b60ce74ff9ad16307b39676144e;p=minetest.git diff --git a/src/hud.h b/src/hud.h index 00e44dd80..15c115d89 100644 --- a/src/hud.h +++ b/src/hud.h @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #define HUD_HEADER #include "irrlichttypes_extrabloated.h" +#include #define HUD_DIR_LEFT_RIGHT 0 #define HUD_DIR_RIGHT_LEFT 1 @@ -31,22 +32,36 @@ with this program; if not, write to the Free Software Foundation, Inc., #define HUD_CORNER_LOWER 1 #define HUD_CORNER_CENTER 2 +// Note that these visibility flags do not determine if the hud items are +// actually drawn, but rather, whether to draw the item should the rest +// of the game state permit it. #define HUD_FLAG_HOTBAR_VISIBLE (1 << 0) #define HUD_FLAG_HEALTHBAR_VISIBLE (1 << 1) #define HUD_FLAG_CROSSHAIR_VISIBLE (1 << 2) #define HUD_FLAG_WIELDITEM_VISIBLE (1 << 3) +#define HUD_FLAG_BREATHBAR_VISIBLE (1 << 4) +#define HUD_FLAG_MINIMAP_VISIBLE (1 << 5) -class Player; +#define HUD_PARAM_HOTBAR_ITEMCOUNT 1 +#define HUD_PARAM_HOTBAR_IMAGE 2 +#define HUD_PARAM_HOTBAR_SELECTED_IMAGE 3 + +#define HUD_HOTBAR_ITEMCOUNT_DEFAULT 8 +#define HUD_HOTBAR_ITEMCOUNT_MAX 23 + + +#define HOTBAR_IMAGE_SIZE 48 enum HudElementType { HUD_ELEM_IMAGE = 0, HUD_ELEM_TEXT = 1, HUD_ELEM_STATBAR = 2, - HUD_ELEM_INVENTORY = 3 + HUD_ELEM_INVENTORY = 3, + HUD_ELEM_WAYPOINT = 4, }; enum HudElementStat { - HUD_STAT_POS, + HUD_STAT_POS = 0, HUD_STAT_NAME, HUD_STAT_SCALE, HUD_STAT_TEXT, @@ -54,7 +69,9 @@ enum HudElementStat { HUD_STAT_ITEM, HUD_STAT_DIR, HUD_STAT_ALIGN, - HUD_STAT_OFFSET + HUD_STAT_OFFSET, + HUD_STAT_WORLD_POS, + HUD_STAT_SIZE }; struct HudElement { @@ -68,63 +85,118 @@ struct HudElement { u32 dir; v2f align; v2f offset; + v3f world_pos; + v2s32 size; }; - -inline u32 hud_get_free_id(Player *player) { - size_t size = player->hud.size(); - for (size_t i = 0; i != size; i++) { - if (!player->hud[i]) - return i; - } - return size; -} - #ifndef SERVER +#include #include +#include "irr_aabb3d.h" -#include "gamedef.h" -#include "inventory.h" -#include "localplayer.h" +class Client; +class ITextureSource; +class Inventory; +class InventoryList; +class LocalPlayer; +struct ItemStack; class Hud { public: video::IVideoDriver *driver; + scene::ISceneManager* smgr; gui::IGUIEnvironment *guienv; - gui::IGUIFont *font; - u32 text_height; - IGameDef *gamedef; + Client *client; LocalPlayer *player; Inventory *inventory; ITextureSource *tsrc; - v2u32 screensize; - v2s32 displaycenter; - s32 hotbar_imagesize; - s32 hotbar_itemcount; - video::SColor crosshair_argb; video::SColor selectionbox_argb; bool use_crosshair_image; - - Hud(video::IVideoDriver *driver, gui::IGUIEnvironment* guienv, - gui::IGUIFont *font, u32 text_height, IGameDef *gamedef, - LocalPlayer *player, Inventory *inventory); - - void drawItem(v2s32 upperleftpos, s32 imgsize, s32 itemcount, - InventoryList *mainlist, u16 selectitem, u16 direction); - void drawLuaElements(); - void drawStatbar(v2s32 pos, u16 corner, u16 drawdir, - std::string texture, s32 count, v2s32 offset); - - void drawHotbar(v2s32 centerlowerpos, s32 halfheartcount, u16 playeritem); + std::string hotbar_image; + bool use_hotbar_image; + std::string hotbar_selected_image; + bool use_hotbar_selected_image; + + Hud(video::IVideoDriver *driver,scene::ISceneManager* smgr, + gui::IGUIEnvironment* guienv, Client *client, LocalPlayer *player, + Inventory *inventory); + ~Hud(); + + void drawHotbar(u16 playeritem); void resizeHotbar(); - void drawCrosshair(); - void drawSelectionBoxes(std::vector &hilightboxes); + void drawSelectionMesh(); + void updateSelectionMesh(const v3s16 &camera_offset); + + std::vector *getSelectionBoxes() + { return &m_selection_boxes; } + + void setSelectionPos(const v3f &pos, const v3s16 &camera_offset); + + v3f getSelectionPos() const + { return m_selection_pos; } + + void setSelectionMeshColor(const video::SColor &color) + { m_selection_mesh_color = color; } + + void setSelectedFaceNormal(const v3f &face_normal) + { m_selected_face_normal = face_normal; } + + void drawLuaElements(const v3s16 &camera_offset); + +private: + void drawStatbar(v2s32 pos, u16 corner, u16 drawdir, std::string texture, + s32 count, v2s32 offset, v2s32 size=v2s32()); + + void drawItems(v2s32 upperleftpos, v2s32 screen_offset, s32 itemcount, + s32 inv_offset, InventoryList *mainlist, u16 selectitem, u16 direction); + + void drawItem(const ItemStack &item, const core::rect& rect, + bool selected); + + float m_hud_scaling; // cached minetest setting + v3s16 m_camera_offset; + v2u32 m_screensize; + v2s32 m_displaycenter; + s32 m_hotbar_imagesize; // Takes hud_scaling into account, updated by resizeHotbar() + s32 m_padding; // Takes hud_scaling into account, updated by resizeHotbar() + video::SColor hbar_colors[4]; + + std::vector m_selection_boxes; + std::vector m_halo_boxes; + v3f m_selection_pos; + v3f m_selection_pos_with_offset; + + scene::IMesh* m_selection_mesh; + video::SColor m_selection_mesh_color; + v3f m_selected_face_normal; + + video::SMaterial m_selection_material; + + enum { + HIGHLIGHT_BOX, + HIGHLIGHT_HALO, + HIGHLIGHT_NONE } m_mode; }; +enum ItemRotationKind { + IT_ROT_SELECTED, + IT_ROT_HOVERED, + IT_ROT_DRAGGED, + IT_ROT_NONE, // Must be last, also serves as number +}; + +void drawItemStack(video::IVideoDriver *driver, + gui::IGUIFont *font, + const ItemStack &item, + const core::rect &rect, + const core::rect *clip, + Client *client, + ItemRotationKind rotation_kind); + #endif #endif