The main change is to caculate tangent directly from bezier curve, without going
through discretized polyline, avoiding pitfalls of discretization.
Other changes are:
1. Add an bezier_derivative() method for Vector3, Vector2, and Math;
2. Add an tesselate_even_length() method to Curve3D, which tesselate bezier curve to even length segments adaptively;
3. Cache the tangent vectors in baked_tangent_vector_cache;
AnimationLibrary now listens for the animation_changed signal on its
animations and emits this new signal, with the animation name added
on. AnimationPlayer now connects to this signal rather than connecting
to each individual animation, which was poor practice due to bypassing
encapsulation.
Somehow I missed the failing CI report from trailing whitespace.
Fixed a couple typos found by codespell while at it, and misc
trailing semicolons in one of the files.
This commit makes the following major changes
1. Add "sample_baked_with_rotation()" to Curve3D, making it usable independently. A similar change was made to Curve2D previously.
2. Refactor the _bake() method on Curve3D, using Parallel Transport Frame instead of Frenet Frame.
3. Refactor the sample_* methods, including:
i. Factor out common binary search code, following the DRY principe
ii. sample_up_vector() interpolated up vector as part of rotation frame(posture) for consistancy and accuracy.
A Vector<>-variant can't be used in an Object::cast_to, because
Vector doesn't inherit from Object and this cast always returns a nullptr.
This patch replaces the Object::cast_to and accesses the contained
Vector directly.
CanvasItemEditor:
- p_result == ADD_MOVE is always true in this switch-clause
- both parts of the if-else-clause do the same thing and simplified an affine_inverse call
ControlEditorToolbar:
- private function ControlEditorToolbar::_anchor_to_position is used nowhere. Looks like
copy and paste from CanvasItemEditor::_anchor_to_position
ScrollContainer:
- screen_is_touchscreen is always true, because otherwise the function already returned
TextLine:
- both parts of the if-else-clause do the same thing and simplified return statement
Antialiasing cannot be adjusted on fonts rendered with MSDF.
Internally, Godot always uses grayscale antialiasing for those fonts.
This also tweaks property hints for consistency, and renames
uses of "sub-pixel" to the more commonly used "subpixel".