1
0
mirror of https://github.com/moparisthebest/minetest synced 2024-08-13 16:53:49 -04:00
minetest/src/util/pointedthing.h
Dániel Juhász 3f8261830e 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()).
2017-01-04 19:18:40 +01:00

92 lines
2.6 KiB
C++

/*
Minetest
Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef UTIL_POINTEDTHING_HEADER
#define UTIL_POINTEDTHING_HEADER
#include "../irrlichttypes.h"
#include "../irr_v3d.h"
#include <iostream>
#include <string>
enum PointedThingType
{
POINTEDTHING_NOTHING,
POINTEDTHING_NODE,
POINTEDTHING_OBJECT
};
//! An active object or node which is selected by a ray on the map.
struct PointedThing
{
//! The type of the pointed object.
PointedThingType type;
/*!
* Only valid if type is POINTEDTHING_NODE.
* The coordinates of the node which owns the
* nodebox that the ray hits first.
* This may differ from node_real_undersurface if
* a nodebox exceeds the limits of its node.
*/
v3s16 node_undersurface;
/*!
* Only valid if type is POINTEDTHING_NODE.
* The coordinates of the last node the ray intersects
* before node_undersurface. Same as node_undersurface
* if the ray starts in a nodebox.
*/
v3s16 node_abovesurface;
/*!
* Only valid if type is POINTEDTHING_NODE.
* The coordinates of the node which contains the
* point of the collision and the nodebox of the node.
*/
v3s16 node_real_undersurface;
/*!
* Only valid if type isn't POINTEDTHING_NONE.
* First intersection point of the ray and the nodebox.
*/
v3f intersection_point;
/*!
* Only valid if type isn't POINTEDTHING_NONE.
* Normal vector of the intersection.
* This is perpendicular to the face the ray hits,
* points outside of the box and it's length is 1.
*/
v3s16 intersection_normal;
/*!
* Only valid if type is POINTEDTHING_OBJECT.
* The ID of the object the ray hit.
*/
s16 object_id;
PointedThing();
std::string dump() const;
void serialize(std::ostream &os) const;
void deSerialize(std::istream &is);
/*!
* This function ignores the intersection point and normal.
*/
bool operator==(const PointedThing &pt2) const;
bool operator!=(const PointedThing &pt2) const;
};
#endif