Beispiel #1
0
Vector2Array Curve2D::get_baked_points() const {

	if(baked_cache_dirty)
		_bake();

	return baked_point_cache;
}
Beispiel #2
0
float Curve2D::get_baked_length() const {

	if (baked_cache_dirty)
		_bake();

	return baked_max_ofs;
}
Beispiel #3
0
RealArray Curve3D::get_baked_tilts() const {

	if (baked_cache_dirty)
		_bake();

	return baked_tilt_cache;
}
Beispiel #4
0
Vector2 Curve2D::interpolate_baked(float p_offset,bool p_cubic) const{

	if (baked_cache_dirty)
		_bake();

	//validate//
	int pc = baked_point_cache.size();
	if (pc==0) {
		ERR_EXPLAIN("No points in Curve2D");
		ERR_FAIL_COND_V(pc==0,Vector2());
	}

	if (pc==1)
		return baked_point_cache.get(0);

	int bpc=baked_point_cache.size();
	Vector2Array::Read r = baked_point_cache.read();

	if (p_offset<0)
		return r[0];
	if (p_offset>=baked_max_ofs)
		return r[bpc-1];

	int idx = Math::floor(p_offset/bake_interval);
	float frac = Math::fmod(p_offset,bake_interval);

	if (idx>=bpc-1) {
		return r[bpc-1];
	} else if (idx==bpc-2) {
		frac/=Math::fmod(baked_max_ofs,bake_interval);
	} else {
		frac/=bake_interval;
	}

	if (p_cubic) {

		Vector2 pre = idx>0? r[idx-1] : r[idx];
		Vector2 post = (idx<(bpc-2))? r[idx+2] : r[idx+1];
		return r[idx].cubic_interpolate(r[idx+1],pre,post,frac);
	} else {
		return r[idx].linear_interpolate(r[idx+1],frac);
	}
}
Beispiel #5
0
Vector2 Curve2D::interpolate_baked(float p_offset,bool p_cubic) const{

	if(baked_cache_dirty)
		_bake();

	//validate//
	int pc = baked_point_cache.size();
	if(pc==0) {
// 		ERR_EXPLAIN("No points in Curve2D");
		return Vector2();
	}

	if(pc==1)
		return baked_point_cache[0];

	int bpc=baked_point_cache.size();

	if(p_offset<0)
		return baked_point_cache[0];
	if(p_offset>=baked_max_ofs)
		return baked_point_cache[bpc-1];

	int idx = floor(p_offset/bake_interval);
	float frac = fmod(p_offset,bake_interval);

	if(idx>=bpc-1) {
		return baked_point_cache[bpc-1];
	} else if(idx==bpc-2) {
		frac/=fmod(baked_max_ofs,bake_interval);
	} else {
		frac/=bake_interval;
	}

	if(p_cubic) {

		Vector2 pre = idx>0? baked_point_cache[idx-1] : baked_point_cache[idx];
		Vector2 post =(idx<(bpc-2))? baked_point_cache[idx+2] : baked_point_cache[idx+1];
		return baked_point_cache[idx].cubic_interpolate(baked_point_cache[idx+1],pre,post,frac);
	} else {
		return baked_point_cache[idx].linear_interpolate(baked_point_cache[idx+1],frac);
	}
}
Beispiel #6
0
float Curve3D::interpolate_baked_tilt(float p_offset) const{

	if (baked_cache_dirty)
		_bake();

	//validate//
	int pc = baked_tilt_cache.size();
	if (pc==0) {
		ERR_EXPLAIN("No tilts in Curve3D");
		ERR_FAIL_COND_V(pc==0,0);
	}

	if (pc==1)
		return baked_tilt_cache.get(0);

	int bpc=baked_tilt_cache.size();
	RealArray::Read r = baked_tilt_cache.read();

	if (p_offset<0)
		return r[0];
	if (p_offset>=baked_max_ofs)
		return r[bpc-1];

	int idx = Math::floor(p_offset/bake_interval);
	float frac = Math::fmod(p_offset,bake_interval);

	if (idx>=bpc-1) {
		return r[bpc-1];
	} else if (idx==bpc-2) {
		frac/=Math::fmod(baked_max_ofs,bake_interval);
	} else {
		frac/=bake_interval;
	}

	return Math::lerp(r[idx],r[idx+1],frac);


}