]> git.lizzy.rs Git - minetest.git/blobdiff - src/collision.h
Use a safer implementation of gsub in core.chat_format_message (#9133)
[minetest.git] / src / collision.h
index 52a7bbb7dfe8ebb4f54b8df3978be9b0892ae2a0..85df02c965cc1118a699b06fb7ac59caceb0421e 100644 (file)
@@ -1,6 +1,6 @@
 /*
-Minetest-c55
-Copyright (C) 2010 celeron55, Perttu Ahola <celeron55@gmail.com>
+Minetest
+Copyright (C) 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
@@ -17,75 +17,67 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
 
-#ifndef COLLISION_HEADER
-#define COLLISION_HEADER
+#pragma once
 
 #include "irrlichttypes_bloated.h"
 #include <vector>
 
 class Map;
 class IGameDef;
+class Environment;
+class ActiveObject;
 
 enum CollisionType
 {
-       COLLISION_NODE
+       COLLISION_NODE,
+       COLLISION_OBJECT,
+};
+
+enum CollisionAxis
+{
+       COLLISION_AXIS_NONE = -1,
+       COLLISION_AXIS_X,
+       COLLISION_AXIS_Y,
+       COLLISION_AXIS_Z,
 };
 
 struct CollisionInfo
 {
-       enum CollisionType type;
-       v3s16 node_p; // COLLISION_NODE
-       bool bouncy;
+       CollisionInfo() = default;
+
+       CollisionType type = COLLISION_NODE;
+       CollisionAxis axis = COLLISION_AXIS_NONE;
+       v3s16 node_p = v3s16(-32768,-32768,-32768); // COLLISION_NODE
        v3f old_speed;
        v3f new_speed;
-
-       CollisionInfo():
-               type(COLLISION_NODE),
-               node_p(-32768,-32768,-32768),
-               bouncy(false),
-               old_speed(0,0,0),
-               new_speed(0,0,0)
-       {}
+       int plane = -1;
 };
 
 struct collisionMoveResult
 {
-       bool touching_ground;
-       bool collides;
-       bool collides_xz;
-       bool standing_on_unloaded;
-       std::vector<CollisionInfo> collisions;
+       collisionMoveResult() = default;
 
-       collisionMoveResult():
-               touching_ground(false),
-               collides(false),
-               collides_xz(false),
-               standing_on_unloaded(false)
-       {}
+       bool touching_ground = false;
+       bool collides = false;
+       bool standing_on_object = false;
+       std::vector<CollisionInfo> collisions;
 };
 
 // Moves using a single iteration; speed should not exceed pos_max_d/dtime
-collisionMoveResult collisionMoveSimple(Map *map, IGameDef *gamedef,
+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);
-
-#if 0
-// This doesn't seem to work and isn't used
-// Moves using as many iterations as needed
-collisionMoveResult collisionMovePrecise(Map *map, IGameDef *gamedef,
-               f32 pos_max_d, const aabb3f &box_0,
-               f32 stepheight, f32 dtime,
-               v3f &pos_f, v3f &speed_f, v3f &accel_f);
-#endif
+               v3f *pos_f, v3f *speed_f,
+               v3f accel_f, ActiveObject *self=NULL,
+               bool collideWithObjects=true);
 
 // Helper function:
 // Checks for collision of a moving aabbox with a static aabbox
 // Returns -1 if no collision, 0 if X collision, 1 if Y collision, 2 if Z collision
 // dtime receives time until first collision, invalid if -1 is returned
-int axisAlignedCollision(
+CollisionAxis axisAlignedCollision(
                const aabb3f &staticbox, const aabb3f &movingbox,
-               const v3f &speed, f32 d, f32 &dtime);
+               const v3f &speed, f32 d, f32 *dtime);
 
 // Helper function:
 // Checks if moving the movingbox up by the given distance would hit a ceiling.
@@ -93,7 +85,3 @@ bool wouldCollideWithCeiling(
                const std::vector<aabb3f> &staticboxes,
                const aabb3f &movingbox,
                f32 y_increase, f32 d);
-
-
-#endif
-