diff options
author | Dániel Juhász <juhdanad@gmail.com> | 2017-01-04 19:18:40 +0100 |
---|---|---|
committer | est31 <est31@users.noreply.github.com> | 2017-01-04 19:18:40 +0100 |
commit | 3f8261830e0503cd59d8713d5c9aab12fc1491db (patch) | |
tree | b49d898815a6c2e692cfe2fc0978cfedd49cd34f /src/environment.h | |
parent | 8aadc62856cc3789ed345ddf3870e311af60afe9 (diff) | |
download | minetest-3f8261830e0503cd59d8713d5c9aab12fc1491db.tar.gz minetest-3f8261830e0503cd59d8713d5c9aab12fc1491db.tar.bz2 minetest-3f8261830e0503cd59d8713d5c9aab12fc1491db.zip |
Improve getPointedThing() (#4346)
* Improved getPointedThing()
The new algorithm checks every node exactly once.
Now the point and normal vector of the collision is also returned in the
PointedThing (currently they are not used outside of the function).
Now the CNodeDefManager keeps the union of all possible nodeboxes, so
the raycast won't miss any nodes. Also if there are only small
nodeboxes, getPointedThing() is exceptionally fast.
Also adds unit test for VoxelLineIterator.
* Cleanup, code move
This commit moves getPointedThing() and
Client::getSelectedActiveObject() to ClientEnvironment.
The map nodes now can decide which neighbors they are connecting to
(MapNode::getNeighbors()).
Diffstat (limited to 'src/environment.h')
-rw-r--r-- | src/environment.h | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/environment.h b/src/environment.h index 4bee40e57..84805b462 100644 --- a/src/environment.h +++ b/src/environment.h @@ -55,6 +55,7 @@ class GameScripting; class Player; class RemotePlayer; class PlayerSAO; +class PointedThing; class Environment { @@ -627,6 +628,41 @@ public: // Get event from queue. CEE_NONE is returned if queue is empty. ClientEnvEvent getClientEvent(); + /*! + * Gets closest object pointed by the shootline. + * Returns NULL if not found. + * + * \param[in] shootline_on_map the shootline for + * the test in world coordinates + * \param[out] intersection_point the first point where + * the shootline meets the object. Valid only if + * not NULL is returned. + * \param[out] intersection_normal the normal vector of + * the intersection, pointing outwards. Zero vector if + * the shootline starts in an active object. + * Valid only if not NULL is returned. + */ + ClientActiveObject * getSelectedActiveObject( + const core::line3d<f32> &shootline_on_map, + v3f *intersection_point, + v3s16 *intersection_normal + ); + + /*! + * Performs a raycast on the world. + * Returns the first thing the shootline meets. + * + * @param[in] shootline the shootline, starting from + * the camera position. This also gives the maximal distance + * of the search. + * @param[in] liquids_pointable if false, liquids are ignored + * @param[in] look_for_object if false, objects are ignored + */ + PointedThing getPointedThing( + core::line3d<f32> shootline, + bool liquids_pointable, + bool look_for_object); + u16 attachement_parent_ids[USHRT_MAX + 1]; const std::list<std::string> &getPlayerNames() { return m_player_names; } |