1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-07-22 17:18:39 +00:00

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).
This commit is contained in:
Dániel Juhász 2016-07-23 21:11:20 +02:00 committed by paramat
parent a80ecbee1e
commit 3caad3f3c9
25 changed files with 671 additions and 313 deletions

View file

@ -23,20 +23,47 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "../exceptions.h"
#include <sstream>
PointedThing::PointedThing(const v3s16 &under, const v3s16 &above,
const v3s16 &real_under, const v3f &point, const v3s16 &normal,
f32 distSq):
type(POINTEDTHING_NODE),
node_undersurface(under),
node_abovesurface(above),
node_real_undersurface(real_under),
intersection_point(point),
intersection_normal(normal),
distanceSq(distSq)
{}
PointedThing::PointedThing(s16 id, const v3f &point, const v3s16 &normal,
f32 distSq) :
type(POINTEDTHING_OBJECT),
object_id(id),
intersection_point(point),
intersection_normal(normal),
distanceSq(distSq)
{}
std::string PointedThing::dump() const
{
std::ostringstream os(std::ios::binary);
if (type == POINTEDTHING_NOTHING) {
os<<"[nothing]";
} else if (type == POINTEDTHING_NODE) {
switch (type) {
case POINTEDTHING_NOTHING:
os << "[nothing]";
break;
case POINTEDTHING_NODE:
{
const v3s16 &u = node_undersurface;
const v3s16 &a = node_abovesurface;
os<<"[node under="<<u.X<<","<<u.Y<<","<<u.Z
<< " above="<<a.X<<","<<a.Y<<","<<a.Z<<"]";
} else if (type == POINTEDTHING_OBJECT) {
os<<"[object "<<object_id<<"]";
} else {
os<<"[unknown PointedThing]";
os << "[node under=" << u.X << "," << u.Y << "," << u.Z << " above="
<< a.X << "," << a.Y << "," << a.Z << "]";
}
break;
case POINTEDTHING_OBJECT:
os << "[object " << object_id << "]";
break;
default:
os << "[unknown PointedThing]";
}
return os.str();
}
@ -104,4 +131,3 @@ bool PointedThing::operator!=(const PointedThing &pt2) const
{
return !(*this == pt2);
}

View file

@ -58,6 +58,11 @@ struct PointedThing
* point of the collision and the nodebox of the node.
*/
v3s16 node_real_undersurface;
/*!
* Only valid if type is POINTEDTHING_OBJECT.
* The ID of the object the ray hit.
*/
s16 object_id = -1;
/*!
* Only valid if type isn't POINTEDTHING_NONE.
* First intersection point of the ray and the nodebox.
@ -71,12 +76,19 @@ struct PointedThing
*/
v3s16 intersection_normal;
/*!
* Only valid if type is POINTEDTHING_OBJECT.
* The ID of the object the ray hit.
* Square of the distance between the pointing
* ray's start point and the intersection point.
*/
s16 object_id = -1;
f32 distanceSq = 0;
//! Constructor for POINTEDTHING_NOTHING
PointedThing() {};
//! Constructor for POINTEDTHING_NODE
PointedThing(const v3s16 &under, const v3s16 &above,
const v3s16 &real_under, const v3f &point, const v3s16 &normal,
f32 distSq);
//! Constructor for POINTEDTHING_OBJECT
PointedThing(s16 id, const v3f &point, const v3s16 &normal, f32 distSq);
std::string dump() const;
void serialize(std::ostream &os) const;
void deSerialize(std::istream &is);