1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-08-11 17:51:04 +00:00

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()).
This commit is contained in:
Dániel Juhász 2017-01-04 19:18:40 +01:00 committed by est31
parent 8aadc62856
commit 3f8261830e
20 changed files with 1046 additions and 433 deletions

View file

@ -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; }