Skip to content

Commit cf7fda0

Browse files
pyrollorubenwardy
authored andcommittedDec 6, 2019
Add z-index management to HUD
1 parent f6de86c commit cf7fda0

File tree

10 files changed

+57
-7
lines changed

10 files changed

+57
-7
lines changed
 

‎doc/lua_api.txt

+8
Original file line numberDiff line numberDiff line change
@@ -1260,6 +1260,11 @@ precisely positioned items in the HUD.
12601260
**Note**: `offset` _will_ adapt to screen DPI as well as user defined scaling
12611261
factor!
12621262

1263+
The `z_index` field specifies the order of HUD elements from back to front.
1264+
Lower z-index elements are displayed behind higher z-index elements. Elements
1265+
with same z-index are displayed in an arbitrary order. Default 0.
1266+
Supports negative values.
1267+
12631268
Below are the specific uses for fields in each type; fields not listed for that
12641269
type are ignored.
12651270

@@ -7322,6 +7327,9 @@ Used by `Player:hud_add`. Returned by `Player:hud_get`.
73227327

73237328
size = { x=100, y=100 },
73247329
-- Size of element in pixels
7330+
7331+
z_index = 0,
7332+
-- Z index : lower z-index HUDs are displayed behind higher z-index HUDs
73257333
}
73267334

73277335
Particle definition

‎src/client/clientevent.h

+1
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ struct ClientEvent
131131
v2f *offset;
132132
v3f *world_pos;
133133
v2s32 *size;
134+
s16 z_index;
134135
} hudadd;
135136
struct
136137
{

‎src/client/game.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -2650,6 +2650,7 @@ void Game::handleClientEvent_HudAdd(ClientEvent *event, CameraOrientation *cam)
26502650
e->offset = *event->hudadd.offset;
26512651
e->world_pos = *event->hudadd.world_pos;
26522652
e->size = *event->hudadd.size;
2653+
e->z_index = event->hudadd.z_index;
26532654
hud_server_to_client[server_id] = player->addHud(e);
26542655

26552656
delete event->hudadd.pos;
@@ -2728,6 +2729,10 @@ void Game::handleClientEvent_HudChange(ClientEvent *event, CameraOrientation *ca
27282729
case HUD_STAT_SIZE:
27292730
e->size = *event->hudchange.v2s32data;
27302731
break;
2732+
2733+
case HUD_STAT_Z_INDEX:
2734+
e->z_index = event->hudchange.data;
2735+
break;
27312736
}
27322737

27332738
delete event->hudchange.v3fdata;

‎src/client/hud.cpp

+14
Original file line numberDiff line numberDiff line change
@@ -283,11 +283,25 @@ void Hud::drawLuaElements(const v3s16 &camera_offset)
283283
{
284284
u32 text_height = g_fontengine->getTextHeight();
285285
irr::gui::IGUIFont* font = g_fontengine->getFont();
286+
287+
// Reorder elements by z_index
288+
std::vector<size_t> ids;
289+
286290
for (size_t i = 0; i != player->maxHudId(); i++) {
287291
HudElement *e = player->getHud(i);
288292
if (!e)
289293
continue;
290294

295+
auto it = ids.begin();
296+
while (it != ids.end() && player->getHud(*it)->z_index <= e->z_index)
297+
++it;
298+
299+
ids.insert(it, i);
300+
}
301+
302+
for (size_t i : ids) {
303+
HudElement *e = player->getHud(i);
304+
291305
v2s32 pos(floor(e->pos.X * (float) m_screensize.X + 0.5),
292306
floor(e->pos.Y * (float) m_screensize.Y + 0.5));
293307
switch (e->type) {

‎src/hud.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ const struct EnumString es_HudElementStat[] =
4343
{HUD_STAT_ALIGN, "alignment"},
4444
{HUD_STAT_OFFSET, "offset"},
4545
{HUD_STAT_WORLD_POS, "world_pos"},
46+
{HUD_STAT_SIZE, "size"},
47+
{HUD_STAT_Z_INDEX, "z_index"},
4648
{0, NULL},
4749
};
4850

‎src/hud.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,8 @@ enum HudElementStat {
7474
HUD_STAT_ALIGN,
7575
HUD_STAT_OFFSET,
7676
HUD_STAT_WORLD_POS,
77-
HUD_STAT_SIZE
77+
HUD_STAT_SIZE,
78+
HUD_STAT_Z_INDEX,
7879
};
7980

8081
struct HudElement {
@@ -90,6 +91,7 @@ struct HudElement {
9091
v2f offset;
9192
v3f world_pos;
9293
v2s32 size;
94+
s16 z_index = 0;
9395
};
9496

9597
extern const EnumString es_HudElementType[];

‎src/network/clientpackethandler.cpp

+7
Original file line numberDiff line numberDiff line change
@@ -1081,6 +1081,7 @@ void Client::handleCommand_HudAdd(NetworkPacket* pkt)
10811081
v2f offset;
10821082
v3f world_pos;
10831083
v2s32 size;
1084+
s16 z_index = 0;
10841085

10851086
*pkt >> server_id >> type >> pos >> name >> scale >> text >> number >> item
10861087
>> dir >> align >> offset;
@@ -1093,6 +1094,11 @@ void Client::handleCommand_HudAdd(NetworkPacket* pkt)
10931094
*pkt >> size;
10941095
} catch(SerializationError &e) {};
10951096

1097+
try {
1098+
*pkt >> z_index;
1099+
}
1100+
catch(PacketError &e) {}
1101+
10961102
ClientEvent *event = new ClientEvent();
10971103
event->type = CE_HUDADD;
10981104
event->hudadd.server_id = server_id;
@@ -1108,6 +1114,7 @@ void Client::handleCommand_HudAdd(NetworkPacket* pkt)
11081114
event->hudadd.offset = new v2f(offset);
11091115
event->hudadd.world_pos = new v3f(world_pos);
11101116
event->hudadd.size = new v2s32(size);
1117+
event->hudadd.z_index = z_index;
11111118
m_client_event_queue.push(event);
11121119
}
11131120

‎src/network/networkprotocol.h

+1
Original file line numberDiff line numberDiff line change
@@ -563,6 +563,7 @@ enum ToClientCommand
563563
v2f1000 offset
564564
v3f1000 world_pos
565565
v2s32 size
566+
s16 z_index
566567
*/
567568

568569
TOCLIENT_HUDRM = 0x4a,

‎src/script/common/c_content.cpp

+14-5
Original file line numberDiff line numberDiff line change
@@ -1851,11 +1851,13 @@ void read_hud_element(lua_State *L, HudElement *elem)
18511851
elem->size = lua_istable(L, -1) ? read_v2s32(L, -1) : v2s32();
18521852
lua_pop(L, 1);
18531853

1854-
elem->name = getstringfield_default(L, 2, "name", "");
1855-
elem->text = getstringfield_default(L, 2, "text", "");
1856-
elem->number = getintfield_default(L, 2, "number", 0);
1857-
elem->item = getintfield_default(L, 2, "item", 0);
1858-
elem->dir = getintfield_default(L, 2, "direction", 0);
1854+
elem->name = getstringfield_default(L, 2, "name", "");
1855+
elem->text = getstringfield_default(L, 2, "text", "");
1856+
elem->number = getintfield_default(L, 2, "number", 0);
1857+
elem->item = getintfield_default(L, 2, "item", 0);
1858+
elem->dir = getintfield_default(L, 2, "direction", 0);
1859+
elem->z_index = MYMAX(S16_MIN, MYMIN(S16_MAX,
1860+
getintfield_default(L, 2, "z_index", 0)));
18591861

18601862
// Deprecated, only for compatibility's sake
18611863
if (elem->dir == 0)
@@ -1921,6 +1923,9 @@ void push_hud_element(lua_State *L, HudElement *elem)
19211923

19221924
push_v3f(L, elem->world_pos);
19231925
lua_setfield(L, -2, "world_pos");
1926+
1927+
lua_pushnumber(L, elem->z_index);
1928+
lua_setfield(L, -2, "z_index");
19241929
}
19251930

19261931
HudElementStat read_hud_change(lua_State *L, HudElement *elem, void **value)
@@ -1978,6 +1983,10 @@ HudElementStat read_hud_change(lua_State *L, HudElement *elem, void **value)
19781983
elem->size = read_v2s32(L, 4);
19791984
*value = &elem->size;
19801985
break;
1986+
case HUD_STAT_Z_INDEX:
1987+
elem->z_index = MYMAX(S16_MIN, MYMIN(S16_MAX, luaL_checknumber(L, 4)));
1988+
*value = &elem->z_index;
1989+
break;
19811990
}
19821991
return stat;
19831992
}

‎src/server.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -1654,7 +1654,8 @@ void Server::SendHUDAdd(session_t peer_id, u32 id, HudElement *form)
16541654

16551655
pkt << id << (u8) form->type << form->pos << form->name << form->scale
16561656
<< form->text << form->number << form->item << form->dir
1657-
<< form->align << form->offset << form->world_pos << form->size;
1657+
<< form->align << form->offset << form->world_pos << form->size
1658+
<< form->z_index;
16581659

16591660
Send(&pkt);
16601661
}

0 commit comments

Comments
 (0)
Please sign in to comment.