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:
commit
2c4e4432af
6 changed files with 73 additions and 24 deletions
|
@ -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 {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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());
|
||||||
|
|
|
@ -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">
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue