Merge pull request #8214 from tagcup/bounce_reflect_slide

Made slide and reflect active verbs acting on itself in Vector2 and V…
This commit is contained in:
Rémi Verschelde 2017-04-05 01:23:09 +02:00 committed by GitHub
commit 2c4e4432af
6 changed files with 73 additions and 24 deletions

View file

@ -61,6 +61,10 @@ Vector2 Vector2::normalized() const {
return v; return v;
} }
bool Vector2::is_normalized() const {
return Math::isequal_approx(length(), (real_t)1.0);
}
real_t Vector2::distance_to(const Vector2 &p_vector2) const { real_t Vector2::distance_to(const Vector2 &p_vector2) const {
return Math::sqrt((x - p_vector2.x) * (x - p_vector2.x) + (y - p_vector2.y) * (y - p_vector2.y)); return Math::sqrt((x - p_vector2.x) * (x - p_vector2.x) + (y - p_vector2.y) * (y - p_vector2.y));
@ -274,13 +278,23 @@ Vector2 Vector2::cubic_interpolate(const Vector2 &p_b, const Vector2 &p_pre_a, c
*/ */
} }
Vector2 Vector2::slide(const Vector2 &p_vec) const { // slide returns the component of the vector along the given plane, specified by its normal vector.
Vector2 Vector2::slide(const Vector2 &p_n) const {
return p_vec - *this * this->dot(p_vec); #ifdef DEBUG_ENABLED
ERR_FAIL_COND_V(p_n.is_normalized() == false, Vector2());
#endif
return *this - p_n * this->dot(p_n);
} }
Vector2 Vector2::reflect(const Vector2 &p_vec) const {
return p_vec - *this * this->dot(p_vec) * 2.0; Vector2 Vector2::bounce(const Vector2 &p_n) const {
return -reflect(p_n);
}
Vector2 Vector2::reflect(const Vector2 &p_n) const {
#ifdef DEBUG_ENABLED
ERR_FAIL_COND_V(p_n.is_normalized() == false, Vector2());
#endif
return 2.0 * p_n * this->dot(p_n) - *this;
} }
bool Rect2::intersects_segment(const Point2 &p_from, const Point2 &p_to, Point2 *r_pos, Point2 *r_normal) const { bool Rect2::intersects_segment(const Point2 &p_from, const Point2 &p_to, Point2 *r_pos, Point2 *r_normal) const {

View file

@ -82,6 +82,7 @@ struct Vector2 {
void normalize(); void normalize();
Vector2 normalized() const; Vector2 normalized() const;
bool is_normalized() const;
real_t length() const; real_t length() const;
real_t length_squared() const; real_t length_squared() const;
@ -106,6 +107,7 @@ struct Vector2 {
Vector2 cubic_interpolate_soft(const Vector2 &p_b, const Vector2 &p_pre_a, const Vector2 &p_post_b, real_t p_t) const; Vector2 cubic_interpolate_soft(const Vector2 &p_b, const Vector2 &p_pre_a, const Vector2 &p_post_b, real_t p_t) const;
Vector2 slide(const Vector2 &p_vec) const; Vector2 slide(const Vector2 &p_vec) const;
Vector2 bounce(const Vector2 &p_vec) const;
Vector2 reflect(const Vector2 &p_vec) const; Vector2 reflect(const Vector2 &p_vec) const;
Vector2 operator+(const Vector2 &p_v) const; Vector2 operator+(const Vector2 &p_v) const;

View file

@ -107,6 +107,7 @@ struct Vector3 {
_FORCE_INLINE_ real_t angle_to(const Vector3 &p_b) const; _FORCE_INLINE_ real_t angle_to(const Vector3 &p_b) const;
_FORCE_INLINE_ Vector3 slide(const Vector3 &p_vec) const; _FORCE_INLINE_ Vector3 slide(const Vector3 &p_vec) const;
_FORCE_INLINE_ Vector3 bounce(const Vector3 &p_vec) const;
_FORCE_INLINE_ Vector3 reflect(const Vector3 &p_vec) const; _FORCE_INLINE_ Vector3 reflect(const Vector3 &p_vec) const;
/* Operators */ /* Operators */
@ -400,14 +401,23 @@ void Vector3::zero() {
x = y = z = 0; x = y = z = 0;
} }
Vector3 Vector3::slide(const Vector3 &p_vec) const { // slide returns the component of the vector along the given plane, specified by its normal vector.
Vector3 Vector3::slide(const Vector3 &p_n) const {
return p_vec - *this * this->dot(p_vec); #ifdef DEBUG_ENABLED
ERR_FAIL_COND_V(p_n.is_normalized() == false, Vector3());
#endif
return *this - p_n * this->dot(p_n);
} }
Vector3 Vector3::reflect(const Vector3 &p_vec) const { Vector3 Vector3::bounce(const Vector3 &p_n) const {
return -reflect(p_n);
}
return p_vec - *this * this->dot(p_vec) * 2.0; Vector3 Vector3::reflect(const Vector3 &p_n) const {
#ifdef DEBUG_ENABLED
ERR_FAIL_COND_V(p_n.is_normalized() == false, Vector3());
#endif
return 2.0 * p_n * this->dot(p_n) - *this;
} }
#endif #endif

View file

@ -340,6 +340,7 @@ struct _VariantCall {
VCALL_LOCALMEM0R(Vector2, aspect); VCALL_LOCALMEM0R(Vector2, aspect);
VCALL_LOCALMEM1R(Vector2, dot); VCALL_LOCALMEM1R(Vector2, dot);
VCALL_LOCALMEM1R(Vector2, slide); VCALL_LOCALMEM1R(Vector2, slide);
VCALL_LOCALMEM1R(Vector2, bounce);
VCALL_LOCALMEM1R(Vector2, reflect); VCALL_LOCALMEM1R(Vector2, reflect);
VCALL_LOCALMEM0R(Vector2, angle); VCALL_LOCALMEM0R(Vector2, angle);
//VCALL_LOCALMEM1R(Vector2,cross); //VCALL_LOCALMEM1R(Vector2,cross);
@ -377,6 +378,7 @@ struct _VariantCall {
VCALL_LOCALMEM1R(Vector3, distance_squared_to); VCALL_LOCALMEM1R(Vector3, distance_squared_to);
VCALL_LOCALMEM1R(Vector3, angle_to); VCALL_LOCALMEM1R(Vector3, angle_to);
VCALL_LOCALMEM1R(Vector3, slide); VCALL_LOCALMEM1R(Vector3, slide);
VCALL_LOCALMEM1R(Vector3, bounce);
VCALL_LOCALMEM1R(Vector3, reflect); VCALL_LOCALMEM1R(Vector3, reflect);
VCALL_LOCALMEM0R(Plane, normalized); VCALL_LOCALMEM0R(Plane, normalized);
@ -1438,8 +1440,9 @@ void register_variant_methods() {
ADDFUNC1(VECTOR2, VECTOR2, Vector2, snapped, VECTOR2, "by", varray()); ADDFUNC1(VECTOR2, VECTOR2, Vector2, snapped, VECTOR2, "by", varray());
ADDFUNC0(VECTOR2, REAL, Vector2, aspect, varray()); ADDFUNC0(VECTOR2, REAL, Vector2, aspect, varray());
ADDFUNC1(VECTOR2, REAL, Vector2, dot, VECTOR2, "with", varray()); ADDFUNC1(VECTOR2, REAL, Vector2, dot, VECTOR2, "with", varray());
ADDFUNC1(VECTOR2, VECTOR2, Vector2, slide, VECTOR2, "vec", varray()); ADDFUNC1(VECTOR2, VECTOR2, Vector2, slide, VECTOR2, "n", varray());
ADDFUNC1(VECTOR2, VECTOR2, Vector2, reflect, VECTOR2, "vec", varray()); ADDFUNC1(VECTOR2, VECTOR2, Vector2, bounce, VECTOR2, "n", varray());
ADDFUNC1(VECTOR2, VECTOR2, Vector2, reflect, VECTOR2, "n", varray());
//ADDFUNC1(VECTOR2,REAL,Vector2,cross,VECTOR2,"with",varray()); //ADDFUNC1(VECTOR2,REAL,Vector2,cross,VECTOR2,"with",varray());
ADDFUNC0(VECTOR2, VECTOR2, Vector2, abs, varray()); ADDFUNC0(VECTOR2, VECTOR2, Vector2, abs, varray());
ADDFUNC1(VECTOR2, VECTOR2, Vector2, clamped, REAL, "length", varray()); ADDFUNC1(VECTOR2, VECTOR2, Vector2, clamped, REAL, "length", varray());
@ -1475,8 +1478,9 @@ void register_variant_methods() {
ADDFUNC1(VECTOR3, REAL, Vector3, distance_to, VECTOR3, "b", varray()); ADDFUNC1(VECTOR3, REAL, Vector3, distance_to, VECTOR3, "b", varray());
ADDFUNC1(VECTOR3, REAL, Vector3, distance_squared_to, VECTOR3, "b", varray()); ADDFUNC1(VECTOR3, REAL, Vector3, distance_squared_to, VECTOR3, "b", varray());
ADDFUNC1(VECTOR3, REAL, Vector3, angle_to, VECTOR3, "to", varray()); ADDFUNC1(VECTOR3, REAL, Vector3, angle_to, VECTOR3, "to", varray());
ADDFUNC1(VECTOR3, VECTOR3, Vector3, slide, VECTOR3, "by", varray()); ADDFUNC1(VECTOR3, VECTOR3, Vector3, slide, VECTOR3, "n", varray());
ADDFUNC1(VECTOR3, VECTOR3, Vector3, reflect, VECTOR3, "by", varray()); ADDFUNC1(VECTOR3, VECTOR3, Vector3, bounce, VECTOR3, "n", varray());
ADDFUNC1(VECTOR3, VECTOR3, Vector3, reflect, VECTOR3, "n", varray());
ADDFUNC0(PLANE, PLANE, Plane, normalized, varray()); ADDFUNC0(PLANE, PLANE, Plane, normalized, varray());
ADDFUNC0(PLANE, VECTOR3, Plane, center, varray()); ADDFUNC0(PLANE, VECTOR3, Plane, center, varray());

View file

@ -46992,6 +46992,15 @@ do_property].
Returns the ratio of X to Y. Returns the ratio of X to Y.
</description> </description>
</method> </method>
<method name="bounce">
<return type="Vector2">
</return>
<argument index="0" name="n" type="Vector2">
</argument>
<description>
Bounce returns the vector "bounced off" from the given plane, specified by its normal vector.
</description>
</method>
<method name="clamped"> <method name="clamped">
<return type="Vector2"> <return type="Vector2">
</return> </return>
@ -47084,10 +47093,10 @@ do_property].
<method name="reflect"> <method name="reflect">
<return type="Vector2"> <return type="Vector2">
</return> </return>
<argument index="0" name="vec" type="Vector2"> <argument index="0" name="n" type="Vector2">
</argument> </argument>
<description> <description>
Like "slide", but reflects the Vector instead of continuing along the wall. Reflects the vector along the given plane, specified by its normal vector.
</description> </description>
</method> </method>
<method name="rotated"> <method name="rotated">
@ -47102,10 +47111,10 @@ do_property].
<method name="slide"> <method name="slide">
<return type="Vector2"> <return type="Vector2">
</return> </return>
<argument index="0" name="vec" type="Vector2"> <argument index="0" name="n" type="Vector2">
</argument> </argument>
<description> <description>
Slides the vector by the other vector. Slide returns the component of the vector along the given plane, specified by its normal vector.
</description> </description>
</method> </method>
<method name="snapped"> <method name="snapped">
@ -47178,6 +47187,15 @@ do_property].
<description> <description>
</description> </description>
</method> </method>
<method name="bounce">
<return type="Vector3">
</return>
<argument index="0" name="n" type="Vector3">
</argument>
<description>
Bounce returns the vector "bounced off" from the given plane, specified by its normal vector.
</description>
</method>
<method name="ceil"> <method name="ceil">
<return type="Vector3"> <return type="Vector3">
</return> </return>
@ -47308,10 +47326,10 @@ do_property].
<method name="reflect"> <method name="reflect">
<return type="Vector3"> <return type="Vector3">
</return> </return>
<argument index="0" name="by" type="Vector3"> <argument index="0" name="n" type="Vector3">
</argument> </argument>
<description> <description>
Like "slide", but reflects the Vector instead of continuing along the wall. Reflects the vector along the given plane, specified by its normal vector.
</description> </description>
</method> </method>
<method name="rotated"> <method name="rotated">
@ -47328,10 +47346,10 @@ do_property].
<method name="slide"> <method name="slide">
<return type="Vector3"> <return type="Vector3">
</return> </return>
<argument index="0" name="by" type="Vector3"> <argument index="0" name="n" type="Vector3">
</argument> </argument>
<description> <description>
Slides the vector along a wall. Slide returns the component of the vector along the given plane, specified by its normal vector.
</description> </description>
</method> </method>
<method name="snapped"> <method name="snapped">

View file

@ -1205,8 +1205,9 @@ Vector2 KinematicBody2D::move_and_slide(const Vector2 &p_linear_velocity, const
} }
} }
motion = get_collision_normal().slide(motion); Vector2 n = get_collision_normal();
lv = get_collision_normal().slide(lv); motion = motion.slide(n);
lv = lv.slide(n);
Variant collider = _get_collider(); Variant collider = _get_collider();
if (collider.get_type() != Variant::NIL) { if (collider.get_type() != Variant::NIL) {
move_and_slide_colliders.push_back(collider); move_and_slide_colliders.push_back(collider);