Merge pull request #2072 from jrimclean/master
Interpolation for affine transformations/Bound rot/pos Matrix32 constructor
This commit is contained in:
commit
3abb54871f
|
@ -622,9 +622,39 @@ float Matrix32::basis_determinant() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
Matrix32 Matrix32::interpolate_with(const Matrix32& p_transform, float p_c) const {
|
Matrix32 Matrix32::interpolate_with(const Matrix32& p_transform, float p_c) const {
|
||||||
|
|
||||||
|
//extract parameters
|
||||||
|
Vector2 p1 = get_origin();
|
||||||
|
Vector2 p2 = p_transform.get_origin();
|
||||||
|
|
||||||
|
real_t r1 = get_rotation();
|
||||||
|
real_t r2 = p_transform.get_rotation();
|
||||||
|
|
||||||
|
Vector2 s1 = get_scale();
|
||||||
|
Vector2 s2 = p_transform.get_scale();
|
||||||
|
|
||||||
|
//slerp rotation
|
||||||
|
Vector2 v1(Math::cos(r1), Math::sin(r1));
|
||||||
|
Vector2 v2(Math::cos(r2), Math::sin(r2));
|
||||||
|
|
||||||
|
real_t dot = v1.dot(v2);
|
||||||
|
|
||||||
|
dot = (dot < -1.0) ? -1.0 : ((dot > 1.0) ? 1.0 : dot); //clamp dot to [-1,1]
|
||||||
|
|
||||||
|
Vector2 v;
|
||||||
|
|
||||||
|
if (dot > 0.9995) {
|
||||||
return Matrix32();
|
v = Vector2::linear_interpolate(v1, v2, p_c).normalized(); //linearly interpolate to avoid numerical precision issues
|
||||||
|
} else {
|
||||||
|
real_t angle = p_c*Math::acos(dot);
|
||||||
|
Vector2 v3 = (v2 - v1*dot).normalized();
|
||||||
|
v = v1*Math::cos(angle) + v3*Math::sin(angle);
|
||||||
|
}
|
||||||
|
|
||||||
|
//construct matrix
|
||||||
|
Matrix32 res(Math::atan2(v.y, v.x), Vector2::linear_interpolate(p1, p2, p_c));
|
||||||
|
res.scale_basis(Vector2::linear_interpolate(s1, s2, p_c));
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
Matrix32::operator String() const {
|
Matrix32::operator String() const {
|
||||||
|
|
|
@ -750,6 +750,12 @@ static void _call_##m_type##_##m_method(Variant& r_ret,Variant& p_self,const Var
|
||||||
r_ret=Rect2(*p_args[0],*p_args[1],*p_args[2],*p_args[3]);
|
r_ret=Rect2(*p_args[0],*p_args[1],*p_args[2],*p_args[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void Matrix32_init2(Variant& r_ret,const Variant** p_args) {
|
||||||
|
|
||||||
|
Matrix32 m(*p_args[0], *p_args[1]);
|
||||||
|
r_ret=m;
|
||||||
|
}
|
||||||
|
|
||||||
static void Matrix32_init3(Variant& r_ret,const Variant** p_args) {
|
static void Matrix32_init3(Variant& r_ret,const Variant** p_args) {
|
||||||
|
|
||||||
Matrix32 m;
|
Matrix32 m;
|
||||||
|
@ -1544,6 +1550,7 @@ _VariantCall::addfunc(Variant::m_vtype,Variant::m_ret,_SCS(#m_method),VCALL(m_cl
|
||||||
_VariantCall::add_constructor(_VariantCall::Rect2_init1,Variant::RECT2,"pos",Variant::VECTOR2,"size",Variant::VECTOR2);
|
_VariantCall::add_constructor(_VariantCall::Rect2_init1,Variant::RECT2,"pos",Variant::VECTOR2,"size",Variant::VECTOR2);
|
||||||
_VariantCall::add_constructor(_VariantCall::Rect2_init2,Variant::RECT2,"x",Variant::REAL,"y",Variant::REAL,"width",Variant::REAL,"height",Variant::REAL);
|
_VariantCall::add_constructor(_VariantCall::Rect2_init2,Variant::RECT2,"x",Variant::REAL,"y",Variant::REAL,"width",Variant::REAL,"height",Variant::REAL);
|
||||||
|
|
||||||
|
_VariantCall::add_constructor(_VariantCall::Matrix32_init2,Variant::MATRIX32,"rot",Variant::REAL,"pos",Variant::VECTOR2);
|
||||||
_VariantCall::add_constructor(_VariantCall::Matrix32_init3,Variant::MATRIX32,"x_axis",Variant::VECTOR2,"y_axis",Variant::VECTOR2,"origin",Variant::VECTOR2);
|
_VariantCall::add_constructor(_VariantCall::Matrix32_init3,Variant::MATRIX32,"x_axis",Variant::VECTOR2,"y_axis",Variant::VECTOR2,"origin",Variant::VECTOR2);
|
||||||
|
|
||||||
_VariantCall::add_constructor(_VariantCall::Vector3_init1,Variant::VECTOR3,"x",Variant::REAL,"y",Variant::REAL,"z",Variant::REAL);
|
_VariantCall::add_constructor(_VariantCall::Vector3_init1,Variant::VECTOR3,"x",Variant::REAL,"y",Variant::REAL,"z",Variant::REAL);
|
||||||
|
|
Loading…
Reference in a new issue