add project method to Vector2/3
This commit is contained in:
parent
af93842f93
commit
037f4638ab
|
@ -121,11 +121,8 @@ Vector2 Vector2::rotated(real_t p_by) const {
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector2 Vector2::project(const Vector2 &p_vec) const {
|
Vector2 Vector2::project(const Vector2 &p_b) const {
|
||||||
|
return p_b * (dot(p_b) / p_b.dot(p_b));
|
||||||
Vector2 v1 = p_vec;
|
|
||||||
Vector2 v2 = *this;
|
|
||||||
return v2 * (v1.dot(v2) / v2.dot(v2));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector2 Vector2::snapped(const Vector2 &p_by) const {
|
Vector2 Vector2::snapped(const Vector2 &p_by) const {
|
||||||
|
|
|
@ -68,7 +68,7 @@ struct Vector2 {
|
||||||
|
|
||||||
real_t dot(const Vector2 &p_other) const;
|
real_t dot(const Vector2 &p_other) const;
|
||||||
real_t cross(const Vector2 &p_other) const;
|
real_t cross(const Vector2 &p_other) const;
|
||||||
Vector2 project(const Vector2 &p_vec) const;
|
Vector2 project(const Vector2 &p_b) const;
|
||||||
|
|
||||||
Vector2 plane_project(real_t p_d, const Vector2 &p_vec) const;
|
Vector2 plane_project(real_t p_d, const Vector2 &p_vec) const;
|
||||||
|
|
||||||
|
|
|
@ -109,6 +109,8 @@ struct Vector3 {
|
||||||
_FORCE_INLINE_ real_t distance_to(const Vector3 &p_b) const;
|
_FORCE_INLINE_ real_t distance_to(const Vector3 &p_b) const;
|
||||||
_FORCE_INLINE_ real_t distance_squared_to(const Vector3 &p_b) const;
|
_FORCE_INLINE_ real_t distance_squared_to(const Vector3 &p_b) const;
|
||||||
|
|
||||||
|
_FORCE_INLINE_ Vector3 project(const Vector3 &p_b) const;
|
||||||
|
|
||||||
_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_normal) const;
|
_FORCE_INLINE_ Vector3 slide(const Vector3 &p_normal) const;
|
||||||
|
@ -238,6 +240,10 @@ real_t Vector3::distance_squared_to(const Vector3 &p_b) const {
|
||||||
return (p_b - *this).length_squared();
|
return (p_b - *this).length_squared();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Vector3 Vector3::project(const Vector3 &p_b) const {
|
||||||
|
return p_b * (dot(p_b) / p_b.dot(p_b));
|
||||||
|
}
|
||||||
|
|
||||||
real_t Vector3::angle_to(const Vector3 &p_b) const {
|
real_t Vector3::angle_to(const Vector3 &p_b) const {
|
||||||
|
|
||||||
return Math::atan2(cross(p_b).length(), dot(p_b));
|
return Math::atan2(cross(p_b).length(), dot(p_b));
|
||||||
|
|
|
@ -339,6 +339,7 @@ struct _VariantCall {
|
||||||
VCALL_LOCALMEM0R(Vector2, is_normalized);
|
VCALL_LOCALMEM0R(Vector2, is_normalized);
|
||||||
VCALL_LOCALMEM1R(Vector2, distance_to);
|
VCALL_LOCALMEM1R(Vector2, distance_to);
|
||||||
VCALL_LOCALMEM1R(Vector2, distance_squared_to);
|
VCALL_LOCALMEM1R(Vector2, distance_squared_to);
|
||||||
|
VCALL_LOCALMEM1R(Vector2, project);
|
||||||
VCALL_LOCALMEM1R(Vector2, angle_to);
|
VCALL_LOCALMEM1R(Vector2, angle_to);
|
||||||
VCALL_LOCALMEM1R(Vector2, angle_to_point);
|
VCALL_LOCALMEM1R(Vector2, angle_to_point);
|
||||||
VCALL_LOCALMEM2R(Vector2, linear_interpolate);
|
VCALL_LOCALMEM2R(Vector2, linear_interpolate);
|
||||||
|
@ -395,6 +396,7 @@ struct _VariantCall {
|
||||||
VCALL_LOCALMEM0R(Vector3, round);
|
VCALL_LOCALMEM0R(Vector3, round);
|
||||||
VCALL_LOCALMEM1R(Vector3, distance_to);
|
VCALL_LOCALMEM1R(Vector3, distance_to);
|
||||||
VCALL_LOCALMEM1R(Vector3, distance_squared_to);
|
VCALL_LOCALMEM1R(Vector3, distance_squared_to);
|
||||||
|
VCALL_LOCALMEM1R(Vector3, project);
|
||||||
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, bounce);
|
||||||
|
@ -1551,6 +1553,7 @@ void register_variant_methods() {
|
||||||
ADDFUNC0R(VECTOR2, BOOL, Vector2, is_normalized, varray());
|
ADDFUNC0R(VECTOR2, BOOL, Vector2, is_normalized, varray());
|
||||||
ADDFUNC1R(VECTOR2, REAL, Vector2, distance_to, VECTOR2, "to", varray());
|
ADDFUNC1R(VECTOR2, REAL, Vector2, distance_to, VECTOR2, "to", varray());
|
||||||
ADDFUNC1R(VECTOR2, REAL, Vector2, distance_squared_to, VECTOR2, "to", varray());
|
ADDFUNC1R(VECTOR2, REAL, Vector2, distance_squared_to, VECTOR2, "to", varray());
|
||||||
|
ADDFUNC1R(VECTOR2, VECTOR2, Vector2, project, VECTOR2, "b", varray());
|
||||||
ADDFUNC1R(VECTOR2, REAL, Vector2, angle_to, VECTOR2, "to", varray());
|
ADDFUNC1R(VECTOR2, REAL, Vector2, angle_to, VECTOR2, "to", varray());
|
||||||
ADDFUNC1R(VECTOR2, REAL, Vector2, angle_to_point, VECTOR2, "to", varray());
|
ADDFUNC1R(VECTOR2, REAL, Vector2, angle_to_point, VECTOR2, "to", varray());
|
||||||
ADDFUNC2R(VECTOR2, VECTOR2, Vector2, linear_interpolate, VECTOR2, "b", REAL, "t", varray());
|
ADDFUNC2R(VECTOR2, VECTOR2, Vector2, linear_interpolate, VECTOR2, "b", REAL, "t", varray());
|
||||||
|
@ -1606,6 +1609,7 @@ void register_variant_methods() {
|
||||||
ADDFUNC0R(VECTOR3, VECTOR3, Vector3, round, varray());
|
ADDFUNC0R(VECTOR3, VECTOR3, Vector3, round, varray());
|
||||||
ADDFUNC1R(VECTOR3, REAL, Vector3, distance_to, VECTOR3, "b", varray());
|
ADDFUNC1R(VECTOR3, REAL, Vector3, distance_to, VECTOR3, "b", varray());
|
||||||
ADDFUNC1R(VECTOR3, REAL, Vector3, distance_squared_to, VECTOR3, "b", varray());
|
ADDFUNC1R(VECTOR3, REAL, Vector3, distance_squared_to, VECTOR3, "b", varray());
|
||||||
|
ADDFUNC1R(VECTOR3, VECTOR3, Vector3, project, VECTOR3, "b", varray());
|
||||||
ADDFUNC1R(VECTOR3, REAL, Vector3, angle_to, VECTOR3, "to", varray());
|
ADDFUNC1R(VECTOR3, REAL, Vector3, angle_to, VECTOR3, "to", varray());
|
||||||
ADDFUNC1R(VECTOR3, VECTOR3, Vector3, slide, VECTOR3, "n", varray());
|
ADDFUNC1R(VECTOR3, VECTOR3, Vector3, slide, VECTOR3, "n", varray());
|
||||||
ADDFUNC1R(VECTOR3, VECTOR3, Vector3, bounce, VECTOR3, "n", varray());
|
ADDFUNC1R(VECTOR3, VECTOR3, Vector3, bounce, VECTOR3, "n", varray());
|
||||||
|
|
|
@ -130,6 +130,15 @@
|
||||||
Returns the distance to vector [code]b[/code].
|
Returns the distance to vector [code]b[/code].
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
|
<method name="project">
|
||||||
|
<return type="Vector2">
|
||||||
|
</return>
|
||||||
|
<argument index="0" name="b" type="Vector2">
|
||||||
|
</argument>
|
||||||
|
<description>
|
||||||
|
Returns the vector projected onto the vector [code]b[/code].
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
<method name="dot">
|
<method name="dot">
|
||||||
<return type="float">
|
<return type="float">
|
||||||
</return>
|
</return>
|
||||||
|
|
|
@ -99,6 +99,15 @@
|
||||||
Returns the distance to [code]b[/code].
|
Returns the distance to [code]b[/code].
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
|
<method name="project_onto">
|
||||||
|
<return type="Vector3">
|
||||||
|
</return>
|
||||||
|
<argument index="0" name="b" type="Vector3">
|
||||||
|
</argument>
|
||||||
|
<description>
|
||||||
|
Returns the vector projected onto the vector [code]b[/code].
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
<method name="dot">
|
<method name="dot">
|
||||||
<return type="float">
|
<return type="float">
|
||||||
</return>
|
</return>
|
||||||
|
|
|
@ -321,7 +321,7 @@ void GrooveJoint2DSW::solve(real_t p_step) {
|
||||||
Vector2 jOld = jn_acc;
|
Vector2 jOld = jn_acc;
|
||||||
j += jOld;
|
j += jOld;
|
||||||
|
|
||||||
jn_acc = (((clamp * j.cross(xf_normal)) > 0) ? j : xf_normal.project(j)).clamped(jn_max);
|
jn_acc = (((clamp * j.cross(xf_normal)) > 0) ? j : j.project(xf_normal)).clamped(jn_max);
|
||||||
|
|
||||||
j = jn_acc - jOld;
|
j = jn_acc - jOld;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue