summaryrefslogtreecommitdiff
path: root/src/raycast.h
diff options
context:
space:
mode:
authorDániel Juhász <juhdanad@gmail.com>2016-07-23 21:11:20 +0200
committerparamat <mat.gregory@virginmedia.com>2017-07-07 22:28:23 +0100
commit3caad3f3c9e319ca67d63231e8c64b2ace855fff (patch)
treef3cb283b7aa28958e2deec7c70dad3a85e1236d4 /src/raycast.h
parenta80ecbee1e838491343af760539a37fac4232048 (diff)
downloadminetest-3caad3f3c9e319ca67d63231e8c64b2ace855fff.tar.gz
minetest-3caad3f3c9e319ca67d63231e8c64b2ace855fff.tar.bz2
minetest-3caad3f3c9e319ca67d63231e8c64b2ace855fff.zip
Expose getPointedThing to Lua
This commit introduces Raycast, a Lua user object, which can be used to perform a raycast on the map. The ray is continuable, so one can also get hidden nodes (for example to see trough glass).
Diffstat (limited to 'src/raycast.h')
-rw-r--r--src/raycast.h43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/raycast.h b/src/raycast.h
index d7ec8c843..d69d9339b 100644
--- a/src/raycast.h
+++ b/src/raycast.h
@@ -20,6 +20,49 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#ifndef SRC_RAYCAST_H_
#define SRC_RAYCAST_H_
+#include "voxelalgorithms.h"
+#include "util/pointedthing.h"
+
+//! Sorts PointedThings based on their distance.
+struct RaycastSort
+{
+ bool operator() (const PointedThing &pt1, const PointedThing &pt2) const;
+};
+
+//! Describes the state of a raycast.
+class RaycastState
+{
+public:
+ /*!
+ * Creates a raycast.
+ * @param objects_pointable if false, only nodes will be found
+ * @param liquids pointable if false, liquid nodes won't be found
+ */
+ RaycastState(const core::line3d<f32> &shootline, bool objects_pointable,
+ bool liquids_pointable);
+
+ //! Shootline of the raycast.
+ core::line3d<f32> m_shootline;
+ //! Iterator to store the progress of the raycast.
+ voxalgo::VoxelLineIterator m_iterator;
+ //! Previous tested node during the raycast.
+ v3s16 m_previous_node;
+
+ /*!
+ * This priority queue stores the found pointed things
+ * waiting to be returned.
+ */
+ std::priority_queue<PointedThing, std::vector<PointedThing>, RaycastSort> m_found;
+
+ bool m_objects_pointable;
+ bool m_liquids_pointable;
+
+ //! The code needs to search these nodes around the center node.
+ core::aabbox3d<s16> m_search_range { 0, 0, 0, 0, 0, 0 };
+
+ //! If true, the Environment will initialize this state.
+ bool m_initialization_needed = true;
+};
/*!
* Checks if a line and a box intersects.