Vector2Array Curve2D::get_baked_points() const { if(baked_cache_dirty) _bake(); return baked_point_cache; }
float Curve2D::get_baked_length() const { if (baked_cache_dirty) _bake(); return baked_max_ofs; }
RealArray Curve3D::get_baked_tilts() const { if (baked_cache_dirty) _bake(); return baked_tilt_cache; }
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); } }
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); } }
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); }