Skip to content

Commit c3b2797

Browse files
RealBadAngelest31
authored andcommittedFeb 18, 2016
Move object nametags to camera
1 parent 4c65455 commit c3b2797

9 files changed

+138
-54
lines changed
 

‎src/camera.cpp

+49
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
3434
#include "util/numeric.h"
3535
#include "util/mathconstants.h"
3636
#include "constants.h"
37+
#include "fontengine.h"
3738

3839
#define CAMERA_OFFSET_STEP 200
3940

@@ -81,6 +82,7 @@ Camera::Camera(scene::ISceneManager* smgr, MapDrawControl& draw_control,
8182
{
8283
//dstream<<FUNCTION_NAME<<std::endl;
8384

85+
m_driver = smgr->getVideoDriver();
8486
// note: making the camera node a child of the player node
8587
// would lead to unexpected behaviour, so we don't do that.
8688
m_playernode = smgr->addEmptySceneNode(smgr->getRootSceneNode());
@@ -110,6 +112,7 @@ Camera::Camera(scene::ISceneManager* smgr, MapDrawControl& draw_control,
110112
m_cache_wanted_fps = g_settings->getFloat("wanted_fps");
111113
m_cache_fov = g_settings->getFloat("fov");
112114
m_cache_view_bobbing = g_settings->getBool("view_bobbing");
115+
m_nametags.clear();
113116
}
114117

115118
Camera::~Camera()
@@ -662,3 +665,49 @@ void Camera::drawWieldedTool(irr::core::matrix4* translation)
662665
}
663666
m_wieldmgr->drawAll();
664667
}
668+
669+
void Camera::drawNametags()
670+
{
671+
core::matrix4 trans = m_cameranode->getProjectionMatrix();
672+
trans *= m_cameranode->getViewMatrix();
673+
674+
for (std::list<Nametag *>::const_iterator
675+
i = m_nametags.begin();
676+
i != m_nametags.end(); ++i) {
677+
Nametag *nametag = *i;
678+
v3f pos = nametag->parent_node->getPosition() -
679+
intToFloat(m_camera_offset, BS) + v3f(0.0, 1.1 * BS, 0.0);
680+
f32 transformed_pos[4] = { pos.X, pos.Y, pos.Z, 1.0f };
681+
trans.multiplyWith1x4Matrix(transformed_pos);
682+
if (transformed_pos[3] > 0) {
683+
core::dimension2d<u32> textsize =
684+
g_fontengine->getFont()->getDimension(
685+
utf8_to_wide(nametag->nametag_text).c_str());
686+
f32 zDiv = transformed_pos[3] == 0.0f ? 1.0f :
687+
core::reciprocal(transformed_pos[3]);
688+
v2u32 screensize = m_driver->getScreenSize();
689+
v2s32 screen_pos;
690+
screen_pos.X = screensize.X *
691+
(0.5 * transformed_pos[0] * zDiv + 0.5) - textsize.Width / 2;
692+
screen_pos.Y = screensize.Y *
693+
(0.5 - transformed_pos[1] * zDiv * 0.5) - textsize.Height / 2;
694+
core::rect<s32> size(0, 0, textsize.Width, textsize.Height);
695+
g_fontengine->getFont()->draw(utf8_to_wide(nametag->nametag_text).c_str(),
696+
size + screen_pos, nametag->nametag_color);
697+
}
698+
}
699+
}
700+
701+
Nametag *Camera::addNametag(scene::ISceneNode *parent_node,
702+
std::string nametag_text, video::SColor nametag_color)
703+
{
704+
Nametag *nametag = new Nametag(parent_node, nametag_text, nametag_color);
705+
m_nametags.push_back(nametag);
706+
return nametag;
707+
}
708+
709+
void Camera::removeNametag(Nametag *nametag)
710+
{
711+
m_nametags.remove(nametag);
712+
delete nametag;
713+
}

‎src/camera.h

+28-2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
2626
#include "client/tile.h"
2727
#include "util/numeric.h"
2828
#include <ICameraSceneNode.h>
29+
#include <ISceneNode.h>
30+
#include <list>
2931

3032
#include "client.h"
3133

@@ -34,6 +36,20 @@ struct MapDrawControl;
3436
class IGameDef;
3537
class WieldMeshSceneNode;
3638

39+
struct Nametag {
40+
Nametag(scene::ISceneNode *a_parent_node,
41+
const std::string &a_nametag_text,
42+
const video::SColor &a_nametag_color):
43+
parent_node(a_parent_node),
44+
nametag_text(a_nametag_text),
45+
nametag_color(a_nametag_color)
46+
{
47+
}
48+
scene::ISceneNode *parent_node;
49+
std::string nametag_text;
50+
video::SColor nametag_color;
51+
};
52+
3753
enum CameraMode {CAMERA_MODE_FIRST, CAMERA_MODE_THIRD, CAMERA_MODE_THIRD_FRONT};
3854

3955
/*
@@ -84,7 +100,7 @@ class Camera
84100
{
85101
return m_camera_direction;
86102
}
87-
103+
88104
// Get the camera offset
89105
inline v3s16 getOffset() const
90106
{
@@ -151,6 +167,13 @@ class Camera
151167
return m_camera_mode;
152168
}
153169

170+
Nametag *addNametag(scene::ISceneNode *parent_node,
171+
std::string nametag_text, video::SColor nametag_color);
172+
173+
void removeNametag(Nametag *nametag);
174+
175+
void drawNametags();
176+
154177
private:
155178
// Nodes
156179
scene::ISceneNode* m_playernode;
@@ -162,8 +185,9 @@ class Camera
162185

163186
// draw control
164187
MapDrawControl& m_draw_control;
165-
188+
166189
IGameDef *m_gamedef;
190+
video::IVideoDriver *m_driver;
167191

168192
// Absolute camera position
169193
v3f m_camera_position;
@@ -214,6 +238,8 @@ class Camera
214238
f32 m_cache_wanted_fps;
215239
f32 m_cache_fov;
216240
bool m_cache_view_bobbing;
241+
242+
std::list<Nametag *> m_nametags;
217243
};
218244

219245
#endif

‎src/client.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,7 @@ Client::Client(
228228
m_particle_manager(&m_env),
229229
m_con(PROTOCOL_ID, 512, CONNECTION_TIMEOUT, ipv6, this),
230230
m_device(device),
231+
m_camera(NULL),
231232
m_minimap_disabled_by_server(false),
232233
m_server_ser_ver(SER_FMT_VER_INVALID),
233234
m_proto_ver(0),

‎src/client.h

+8
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ struct PointedThing;
5050
class Database;
5151
class Mapper;
5252
struct MinimapMapblock;
53+
class Camera;
5354

5455
struct QueuedMeshUpdate
5556
{
@@ -507,6 +508,12 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
507508
Mapper* getMapper ()
508509
{ return m_mapper; }
509510

511+
void setCamera(Camera* camera)
512+
{ m_camera = camera; }
513+
514+
Camera* getCamera ()
515+
{ return m_camera; }
516+
510517
bool isMinimapDisabledByServer()
511518
{ return m_minimap_disabled_by_server; }
512519

@@ -589,6 +596,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
589596
ParticleManager m_particle_manager;
590597
con::Connection m_con;
591598
IrrlichtDevice *m_device;
599+
Camera *m_camera;
592600
Mapper *m_mapper;
593601
bool m_minimap_disabled_by_server;
594602
// Server serialization version

‎src/content_cao.cpp

+33-50
Original file line numberDiff line numberDiff line change
@@ -546,12 +546,14 @@ GenericCAO::GenericCAO(IGameDef *gamedef, ClientEnvironment *env):
546546
//
547547
m_smgr(NULL),
548548
m_irr(NULL),
549+
m_camera(NULL),
550+
m_gamedef(NULL),
549551
m_selection_box(-BS/3.,-BS/3.,-BS/3., BS/3.,BS/3.,BS/3.),
550552
m_meshnode(NULL),
551553
m_animated_meshnode(NULL),
552554
m_wield_meshnode(NULL),
553555
m_spritenode(NULL),
554-
m_textnode(NULL),
556+
m_nametag(NULL),
555557
m_position(v3f(0,10*BS,0)),
556558
m_velocity(v3f(0,0,0)),
557559
m_acceleration(v3f(0,0,0)),
@@ -580,8 +582,11 @@ GenericCAO::GenericCAO(IGameDef *gamedef, ClientEnvironment *env):
580582
m_last_light(255),
581583
m_is_visible(false)
582584
{
583-
if(gamedef == NULL)
585+
if (gamedef == NULL) {
584586
ClientActiveObject::registerType(getType(), create);
587+
} else {
588+
m_gamedef = gamedef;
589+
}
585590
}
586591

587592
bool GenericCAO::getCollisionBox(aabb3f *toset)
@@ -667,8 +672,7 @@ void GenericCAO::initialize(const std::string &data)
667672

668673
GenericCAO::~GenericCAO()
669674
{
670-
if(m_is_player)
671-
{
675+
if (m_is_player) {
672676
m_env->removePlayerName(m_name.c_str());
673677
}
674678
removeFromScene(true);
@@ -695,14 +699,15 @@ v3f GenericCAO::getPosition()
695699

696700
scene::ISceneNode* GenericCAO::getSceneNode()
697701
{
698-
if (m_meshnode)
702+
if (m_meshnode) {
699703
return m_meshnode;
700-
if (m_animated_meshnode)
704+
} else if (m_animated_meshnode) {
701705
return m_animated_meshnode;
702-
if (m_wield_meshnode)
706+
} else if (m_wield_meshnode) {
703707
return m_wield_meshnode;
704-
if (m_spritenode)
708+
} else if (m_spritenode) {
705709
return m_spritenode;
710+
}
706711
return NULL;
707712
}
708713

@@ -775,56 +780,47 @@ void GenericCAO::removeFromScene(bool permanent)
775780
}
776781
}
777782

778-
if(m_meshnode)
779-
{
783+
if (m_meshnode) {
780784
m_meshnode->remove();
781785
m_meshnode->drop();
782786
m_meshnode = NULL;
783-
}
784-
if(m_animated_meshnode)
785-
{
787+
} else if (m_animated_meshnode) {
786788
m_animated_meshnode->remove();
787789
m_animated_meshnode->drop();
788790
m_animated_meshnode = NULL;
789-
}
790-
if(m_wield_meshnode)
791-
{
791+
} else if (m_wield_meshnode) {
792792
m_wield_meshnode->remove();
793793
m_wield_meshnode->drop();
794794
m_wield_meshnode = NULL;
795-
}
796-
if(m_spritenode)
797-
{
795+
} else if (m_spritenode) {
798796
m_spritenode->remove();
799797
m_spritenode->drop();
800798
m_spritenode = NULL;
801799
}
802-
if (m_textnode)
803-
{
804-
m_textnode->remove();
805-
m_textnode->drop();
806-
m_textnode = NULL;
800+
801+
if (m_nametag) {
802+
m_gamedef->getCamera()->removeNametag(m_nametag);
803+
m_nametag = NULL;
807804
}
808805
}
809806

810-
void GenericCAO::addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc,
811-
IrrlichtDevice *irr)
807+
void GenericCAO::addToScene(scene::ISceneManager *smgr,
808+
ITextureSource *tsrc, IrrlichtDevice *irr)
812809
{
813810
m_smgr = smgr;
814811
m_irr = irr;
815812

816-
if (getSceneNode() != NULL)
813+
if (getSceneNode() != NULL) {
817814
return;
815+
}
818816

819817
m_visuals_expired = false;
820818

821-
if(!m_prop.is_visible)
819+
if (!m_prop.is_visible) {
822820
return;
821+
}
823822

824-
//video::IVideoDriver* driver = smgr->getVideoDriver();
825-
826-
if(m_prop.visual == "sprite")
827-
{
823+
if (m_prop.visual == "sprite") {
828824
infostream<<"GenericCAO::addToScene(): single_sprite"<<std::endl;
829825
m_spritenode = smgr->addBillboardSceneNode(
830826
NULL, v2f(1, 1), v3f(0,0,0), -1);
@@ -972,18 +968,9 @@ void GenericCAO::addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc,
972968

973969
scene::ISceneNode *node = getSceneNode();
974970
if (node && m_prop.nametag != "" && !m_is_local_player) {
975-
// Add a text node for showing the name
976-
gui::IGUIEnvironment* gui = irr->getGUIEnvironment();
977-
std::wstring nametag_text = utf8_to_wide(m_prop.nametag);
978-
m_textnode = smgr->addTextSceneNode(gui->getSkin()->getFont(),
979-
nametag_text.c_str(), m_prop.nametag_color, node);
980-
m_textnode->grab();
981-
m_textnode->setPosition(v3f(0, BS*1.1, 0));
982-
983-
// Enforce hiding nametag,
984-
// because if freetype is enabled, a grey
985-
// shadow can remain.
986-
m_textnode->setVisible(m_prop.nametag_color.getAlpha() > 0);
971+
// Add nametag
972+
m_nametag = m_gamedef->getCamera()->addNametag(node,
973+
m_prop.nametag, m_prop.nametag_color);
987974
}
988975

989976
updateNodePos();
@@ -1785,12 +1772,8 @@ void GenericCAO::processMessage(const std::string &data)
17851772
// Deprecated, for backwards compatibility only.
17861773
readU8(is); // version
17871774
m_prop.nametag_color = readARGB8(is);
1788-
if (m_textnode != NULL) {
1789-
m_textnode->setTextColor(m_prop.nametag_color);
1790-
1791-
// Enforce hiding nametag,
1792-
// because if freetype is enabled, a grey shadow can remain.
1793-
m_textnode->setVisible(m_prop.nametag_color.getAlpha() > 0);
1775+
if (m_nametag != NULL) {
1776+
m_nametag->nametag_color = m_prop.nametag_color;
17941777
}
17951778
}
17961779
}

‎src/content_cao.h

+6-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
2626
#include "object_properties.h"
2727
#include "itemgroup.h"
2828

29+
class Camera;
30+
struct Nametag;
31+
2932
/*
3033
SmoothTranslator
3134
*/
@@ -65,12 +68,14 @@ class GenericCAO : public ClientActiveObject
6568
//
6669
scene::ISceneManager *m_smgr;
6770
IrrlichtDevice *m_irr;
71+
Camera* m_camera;
72+
IGameDef *m_gamedef;
6873
aabb3f m_selection_box;
6974
scene::IMeshSceneNode *m_meshnode;
7075
scene::IAnimatedMeshSceneNode *m_animated_meshnode;
7176
WieldMeshSceneNode *m_wield_meshnode;
7277
scene::IBillboardSceneNode *m_spritenode;
73-
scene::ITextSceneNode* m_textnode;
78+
Nametag* m_nametag;
7479
v3f m_position;
7580
v3f m_velocity;
7681
v3f m_acceleration;

‎src/drawscene.cpp

+6-1
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ video::ITexture* draw_hud(video::IVideoDriver* driver, const v2u32& screensize,
195195
hud.drawCrosshair();
196196
hud.drawHotbar(client.getPlayerItem());
197197
hud.drawLuaElements(camera.getOffset());
198-
198+
camera.drawNametags();
199199
guienv->drawAll();
200200
}
201201

@@ -416,6 +416,7 @@ void draw_pageflip_3d_mode(Camera& camera, bool show_hud,
416416
camera.drawWieldedTool(&leftMove);
417417
hud.drawHotbar(client.getPlayerItem());
418418
hud.drawLuaElements(camera.getOffset());
419+
camera.drawNametags();
419420
}
420421

421422
guienv->drawAll();
@@ -443,6 +444,7 @@ void draw_pageflip_3d_mode(Camera& camera, bool show_hud,
443444
camera.drawWieldedTool(&rightMove);
444445
hud.drawHotbar(client.getPlayerItem());
445446
hud.drawLuaElements(camera.getOffset());
447+
camera.drawNametags();
446448
}
447449

448450
guienv->drawAll();
@@ -538,8 +540,11 @@ void draw_scene(video::IVideoDriver *driver, scene::ISceneManager *smgr,
538540
{
539541
if (draw_crosshair)
540542
hud.drawCrosshair();
543+
541544
hud.drawHotbar(client.getPlayerItem());
542545
hud.drawLuaElements(camera.getOffset());
546+
camera.drawNametags();
547+
543548
if (show_minimap)
544549
mapper.drawMinimap();
545550
}

‎src/game.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -2087,6 +2087,7 @@ bool Game::createClient(const std::string &playername,
20872087
camera = new Camera(smgr, *draw_control, gamedef);
20882088
if (!camera || !camera->successfullyCreated(*error_message))
20892089
return false;
2090+
client->setCamera(camera);
20902091

20912092
/* Clouds
20922093
*/

‎src/gamedef.h

+6
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ class IShaderSource;
3232
class MtEventManager;
3333
class IRollbackManager;
3434
class EmergeManager;
35+
class Camera;
36+
3537
namespace irr { namespace scene {
3638
class IAnimatedMesh;
3739
class ISceneManager;
@@ -67,6 +69,10 @@ class IGameDef
6769
{ return NULL; }
6870
virtual scene::ISceneManager* getSceneManager()=0;
6971

72+
virtual Camera* getCamera()
73+
{ return NULL; }
74+
virtual void setCamera(Camera *camera) {}
75+
7076
// Only usable on the server, and NOT thread-safe. It is usable from the
7177
// environment thread.
7278
virtual IRollbackManager* getRollbackManager(){return NULL;}

0 commit comments

Comments
 (0)
Please sign in to comment.