Luanti 5.10.0-dev
 
Loading...
Searching...
No Matches
collision.cpp File Reference
#include "collision.h"
#include <cmath>
#include "mapblock.h"
#include "map.h"
#include "nodedef.h"
#include "gamedef.h"
#include "serverenvironment.h"
#include "server/serveractiveobject.h"
#include "util/timetaker.h"
#include "profiler.h"
+ Include dependency graph for collision.cpp:

Macros

#define PROFILER_NAME(text)   (dynamic_cast<ServerEnvironment*>(env) ? ("Server: " text) : ("Client: " text))
 

Functions

CollisionAxis axisAlignedCollision (const aabb3f &staticbox, const aabb3f &movingbox, const v3f speed, f32 *dtime)
 
bool wouldCollideWithCeiling (const std::vector< NearbyCollisionInfo > &cinfo, const aabb3f &movingbox, f32 y_increase, f32 d)
 
static bool add_area_node_boxes (const v3s16 min, const v3s16 max, IGameDef *gamedef, Environment *env, std::vector< NearbyCollisionInfo > &cinfo)
 
static void add_object_boxes (Environment *env, const aabb3f &box_0, f32 dtime, const v3f pos_f, const v3f speed_f, ActiveObject *self, std::vector< NearbyCollisionInfo > &cinfo)
 
collisionMoveResult collisionMoveSimple (Environment *env, IGameDef *gamedef, f32 pos_max_d, const aabb3f &box_0, f32 stepheight, f32 dtime, v3f *pos_f, v3f *speed_f, v3f accel_f, ActiveObject *self, bool collide_with_objects)
 Moves using a single iteration; speed should not exceed pos_max_d/dtime.
 
bool collision_check_intersection (Environment *env, IGameDef *gamedef, const aabb3f &box_0, const v3f &pos_f, ActiveObject *self, bool collide_with_objects)
 A simpler version of "collisionMoveSimple" that only checks whether a collision occurs at the given position.
 

Macro Definition Documentation

◆ PROFILER_NAME

#define PROFILER_NAME ( text)    (dynamic_cast<ServerEnvironment*>(env) ? ("Server: " text) : ("Client: " text))

Function Documentation

◆ add_area_node_boxes()

static bool add_area_node_boxes ( const v3s16 min,
const v3s16 max,
IGameDef * gamedef,
Environment * env,
std::vector< NearbyCollisionInfo > & cinfo )
static

References BS, CONTENT_IGNORE, MapNode::getCollisionBoxes(), MapNode::getContent(), Environment::getMap(), MapNode::getNeighbors(), Map::getNode(), getNodeBox(), IGameDef::getNodeDefManager(), ContentFeatures::groups, intToFloat(), itemgroup_get(), p(), and ContentFeatures::walkable.

Referenced by collision_check_intersection(), and collisionMoveSimple().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ add_object_boxes()

static void add_object_boxes ( Environment * env,
const aabb3f & box_0,
f32 dtime,
const v3f pos_f,
const v3f speed_f,
ActiveObject * self,
std::vector< NearbyCollisionInfo > & cinfo )
static

References BS, ClientEnvironment::getActiveObjects(), LocalPlayer::getCAO(), LocalPlayer::getCollisionbox(), ClientEnvironment::getLocalPlayer(), ServerEnvironment::getObjectsInsideRadius(), and LocalPlayer::getPosition().

Referenced by collision_check_intersection(), and collisionMoveSimple().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ axisAlignedCollision()

CollisionAxis axisAlignedCollision ( const aabb3f & staticbox,
const aabb3f & movingbox,
const v3f speed,
f32 * dtime )

References COLLISION_AXIS_NONE, COLLISION_AXIS_X, COLLISION_AXIS_Y, and COLLISION_AXIS_Z.

Referenced by collisionMoveSimple(), and TestCollision::testAxisAlignedCollision().

+ Here is the caller graph for this function:

◆ collision_check_intersection()

bool collision_check_intersection ( Environment * env,
IGameDef * gamedef,
const aabb3f & box_0,
const v3f & pos_f,
ActiveObject * self = nullptr,
bool collide_with_objects = true )

A simpler version of "collisionMoveSimple" that only checks whether a collision occurs at the given position.

Parameters
self(optional) ActiveObject to ignore in the collision detection.
Returns
true when box_0 truly intersects with a node or object. Touching faces are not counted as intersection.

References add_area_node_boxes(), add_object_boxes(), BS, floatToInt(), g_profiler, PRECISION_MICRO, PROFILER_NAME, and SPT_AVG.

Referenced by LocalPlayer::move().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ collisionMoveSimple()

collisionMoveResult collisionMoveSimple ( Environment * env,
IGameDef * gamedef,
f32 pos_max_d,
const aabb3f & box_0,
f32 stepheight,
f32 dtime,
v3f * pos_f,
v3f * speed_f,
v3f accel_f,
ActiveObject * self = NULL,
bool collide_with_objects = true )

Moves using a single iteration; speed should not exceed pos_max_d/dtime.

Parameters
self(optional) ActiveObject to ignore in the collision detection.

References add_area_node_boxes(), add_object_boxes(), CollisionInfo::axis, axisAlignedCollision(), BS, collisionMoveResult::collides, COLLISION_AXIS_NONE, COLLISION_AXIS_X, COLLISION_AXIS_Y, COLLISION_AXIS_Z, COLLISION_NODE, COLLISION_OBJECT, collisionMoveResult::collisions, DTIME_LIMIT, floatToInt(), g_profiler, MYMAX, MYMIN, CollisionInfo::new_pos, CollisionInfo::new_speed, CollisionInfo::node_p, CollisionInfo::object, CollisionInfo::old_speed, CollisionInfo::plane, PRECISION_MICRO, PROFILER_NAME, SPT_AVG, collisionMoveResult::standing_on_object, collisionMoveResult::touching_ground, CollisionInfo::type, warningstream, and wouldCollideWithCeiling().

Referenced by LocalPlayer::handleAutojump(), LocalPlayer::move(), LocalPlayer::old_move(), GenericCAO::step(), LuaEntitySAO::step(), and Particle::step().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ wouldCollideWithCeiling()

bool wouldCollideWithCeiling ( const std::vector< NearbyCollisionInfo > & cinfo,
const aabb3f & movingbox,
f32 y_increase,
f32 d )

Referenced by collisionMoveSimple().

+ Here is the caller graph for this function: