diff options
| author | Juan Linietsky <reduzio@gmail.com> | 2015-06-22 23:57:10 -0300 | 
|---|---|---|
| committer | Juan Linietsky <reduzio@gmail.com> | 2015-06-22 23:57:10 -0300 | 
| commit | 3abb54871f53a767d52aa16f0c8637531a6e547c (patch) | |
| tree | 0bccfb466993f5320bfb47627109bc53b7cd8b28 | |
| parent | db43b9bcf0bf4ccc4867198528fbe9b6f0d18ea6 (diff) | |
| parent | 2e6d3b7fadc524f8bdc19929659da365d14ad759 (diff) | |
Merge pull request #2072 from jrimclean/master
Interpolation for affine transformations/Bound rot/pos Matrix32 constructor
| -rw-r--r-- | core/math/math_2d.cpp | 34 | ||||
| -rw-r--r-- | core/variant_call.cpp | 7 | 
2 files changed, 39 insertions, 2 deletions
| diff --git a/core/math/math_2d.cpp b/core/math/math_2d.cpp index 0a3963f88f..88717723ce 100644 --- a/core/math/math_2d.cpp +++ b/core/math/math_2d.cpp @@ -622,9 +622,39 @@ float Matrix32::basis_determinant() 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; - -	return Matrix32(); +	if (dot > 0.9995) { +		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 { diff --git a/core/variant_call.cpp b/core/variant_call.cpp index 2f7e0205dc..7dd0eb8a0c 100644 --- a/core/variant_call.cpp +++ b/core/variant_call.cpp @@ -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]);  	} +	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) {  		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_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::Vector3_init1,Variant::VECTOR3,"x",Variant::REAL,"y",Variant::REAL,"z",Variant::REAL); |