summaryrefslogtreecommitdiff
path: root/src/camera.cpp
diff options
context:
space:
mode:
authorRealBadAngel <maciej.kasatkin@o2.pl>2016-02-15 14:01:01 +0100
committerest31 <MTest31@outlook.com>2016-02-18 16:43:29 +0100
commitc3b279750ece0b5144bf8e973d55108347462223 (patch)
tree1c7acbe456ed6e29a34fd7486c7d888df4d8f2fa /src/camera.cpp
parent4c654557ecc32620b78c146bd6d90f531a71d25a (diff)
downloadminetest-c3b279750ece0b5144bf8e973d55108347462223.tar.gz
minetest-c3b279750ece0b5144bf8e973d55108347462223.tar.bz2
minetest-c3b279750ece0b5144bf8e973d55108347462223.zip
Move object nametags to camera
Diffstat (limited to 'src/camera.cpp')
-rw-r--r--src/camera.cpp49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/camera.cpp b/src/camera.cpp
index 94bbe9880..8aac32123 100644
--- a/src/camera.cpp
+++ b/src/camera.cpp
@@ -34,6 +34,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "util/numeric.h"
#include "util/mathconstants.h"
#include "constants.h"
+#include "fontengine.h"
#define CAMERA_OFFSET_STEP 200
@@ -81,6 +82,7 @@ Camera::Camera(scene::ISceneManager* smgr, MapDrawControl& draw_control,
{
//dstream<<FUNCTION_NAME<<std::endl;
+ m_driver = smgr->getVideoDriver();
// note: making the camera node a child of the player node
// would lead to unexpected behaviour, so we don't do that.
m_playernode = smgr->addEmptySceneNode(smgr->getRootSceneNode());
@@ -110,6 +112,7 @@ Camera::Camera(scene::ISceneManager* smgr, MapDrawControl& draw_control,
m_cache_wanted_fps = g_settings->getFloat("wanted_fps");
m_cache_fov = g_settings->getFloat("fov");
m_cache_view_bobbing = g_settings->getBool("view_bobbing");
+ m_nametags.clear();
}
Camera::~Camera()
@@ -662,3 +665,49 @@ void Camera::drawWieldedTool(irr::core::matrix4* translation)
}
m_wieldmgr->drawAll();
}
+
+void Camera::drawNametags()
+{
+ core::matrix4 trans = m_cameranode->getProjectionMatrix();
+ trans *= m_cameranode->getViewMatrix();
+
+ for (std::list<Nametag *>::const_iterator
+ i = m_nametags.begin();
+ i != m_nametags.end(); ++i) {
+ Nametag *nametag = *i;
+ v3f pos = nametag->parent_node->getPosition() -
+ intToFloat(m_camera_offset, BS) + v3f(0.0, 1.1 * BS, 0.0);
+ f32 transformed_pos[4] = { pos.X, pos.Y, pos.Z, 1.0f };
+ trans.multiplyWith1x4Matrix(transformed_pos);
+ if (transformed_pos[3] > 0) {
+ core::dimension2d<u32> textsize =
+ g_fontengine->getFont()->getDimension(
+ utf8_to_wide(nametag->nametag_text).c_str());
+ f32 zDiv = transformed_pos[3] == 0.0f ? 1.0f :
+ core::reciprocal(transformed_pos[3]);
+ v2u32 screensize = m_driver->getScreenSize();
+ v2s32 screen_pos;
+ screen_pos.X = screensize.X *
+ (0.5 * transformed_pos[0] * zDiv + 0.5) - textsize.Width / 2;
+ screen_pos.Y = screensize.Y *
+ (0.5 - transformed_pos[1] * zDiv * 0.5) - textsize.Height / 2;
+ core::rect<s32> size(0, 0, textsize.Width, textsize.Height);
+ g_fontengine->getFont()->draw(utf8_to_wide(nametag->nametag_text).c_str(),
+ size + screen_pos, nametag->nametag_color);
+ }
+ }
+}
+
+Nametag *Camera::addNametag(scene::ISceneNode *parent_node,
+ std::string nametag_text, video::SColor nametag_color)
+{
+ Nametag *nametag = new Nametag(parent_node, nametag_text, nametag_color);
+ m_nametags.push_back(nametag);
+ return nametag;
+}
+
+void Camera::removeNametag(Nametag *nametag)
+{
+ m_nametags.remove(nametag);
+ delete nametag;
+}