diff --git a/main/FunnyBones/all.html b/main/FunnyBones/all.html index f6c07f0..794a556 100644 --- a/main/FunnyBones/all.html +++ b/main/FunnyBones/all.html @@ -1 +1 @@ -List of all items in this crate

List of all items

Structs

Enums

Functions

\ No newline at end of file +List of all items in this crate

List of all items

Functions

\ No newline at end of file diff --git a/main/FunnyBones/fn.add_bones_to_skeleton.html b/main/FunnyBones/fn.add_bones_to_skeleton.html deleted file mode 100644 index 5af3275..0000000 --- a/main/FunnyBones/fn.add_bones_to_skeleton.html +++ /dev/null @@ -1,5 +0,0 @@ -add_bones_to_skeleton in FunnyBones - Rust

Function FunnyBones::add_bones_to_skeleton

source ·
pub(crate) fn add_bones_to_skeleton(
-    connected_to: BoneAxis,
-    bones: &Dynamic<Vec<SkeletalBone>>,
-    skeleton: &mut Skeleton,
-)
\ No newline at end of file diff --git a/main/FunnyBones/fn.bone_editor.html b/main/FunnyBones/fn.bone_editor.html deleted file mode 100644 index e2c8b71..0000000 --- a/main/FunnyBones/fn.bone_editor.html +++ /dev/null @@ -1,4 +0,0 @@ -bone_editor in FunnyBones - Rust

Function FunnyBones::bone_editor

source ·
pub(crate) fn bone_editor(
-    bone: SkeletalBone,
-    watcher: &Watcher,
-) -> impl MakeWidget
\ No newline at end of file diff --git a/main/FunnyBones/fn.bone_property_editor.html b/main/FunnyBones/fn.bone_property_editor.html deleted file mode 100644 index b7090f0..0000000 --- a/main/FunnyBones/fn.bone_property_editor.html +++ /dev/null @@ -1,5 +0,0 @@ -bone_property_editor in FunnyBones - Rust

Function FunnyBones::bone_property_editor

source ·
pub(crate) fn bone_property_editor(
-    bone: SkeletalBone,
-    watcher: &Watcher,
-    is_root: bool,
-) -> impl MakeWidget
\ No newline at end of file diff --git a/main/FunnyBones/fn.bones_editor.html b/main/FunnyBones/fn.bones_editor.html deleted file mode 100644 index bbcb0e1..0000000 --- a/main/FunnyBones/fn.bones_editor.html +++ /dev/null @@ -1,5 +0,0 @@ -bones_editor in FunnyBones - Rust

Function FunnyBones::bones_editor

source ·
pub(crate) fn bones_editor(
-    label: &str,
-    bones: &Dynamic<Vec<SkeletalBone>>,
-    watcher: &Watcher,
-) -> impl MakeWidget
\ No newline at end of file diff --git a/main/FunnyBones/fn.main.html b/main/FunnyBones/fn.main.html index fe76932..22595ba 100644 --- a/main/FunnyBones/fn.main.html +++ b/main/FunnyBones/fn.main.html @@ -1 +1 @@ -main in FunnyBones - Rust

Function FunnyBones::main

source ·
pub(crate) fn main() -> Result
\ No newline at end of file +main in FunnyBones - Rust

Function FunnyBones::main

source ·
pub(crate) fn main() -> Result
\ No newline at end of file diff --git a/main/FunnyBones/fn.main_menu_window.html b/main/FunnyBones/fn.main_menu_window.html index 05d368e..70e1a04 100644 --- a/main/FunnyBones/fn.main_menu_window.html +++ b/main/FunnyBones/fn.main_menu_window.html @@ -1 +1 @@ -main_menu_window in FunnyBones - Rust

Function FunnyBones::main_menu_window

source ·
pub(crate) fn main_menu_window(app: &impl Application) -> Window
\ No newline at end of file +main_menu_window in FunnyBones - Rust

Function FunnyBones::main_menu_window

source ·
pub(crate) fn main_menu_window(app: &impl Application) -> Window
\ No newline at end of file diff --git a/main/FunnyBones/fn.open_file.html b/main/FunnyBones/fn.open_file.html index 34eb077..e53f884 100644 --- a/main/FunnyBones/fn.open_file.html +++ b/main/FunnyBones/fn.open_file.html @@ -1,4 +1,4 @@ -open_file in FunnyBones - Rust

Function FunnyBones::open_file

source ·
pub(crate) fn open_file(
+open_file in FunnyBones - Rust

Function FunnyBones::open_file

source ·
pub(crate) fn open_file(
     app: &mut App,
     parent_window: &WindowHandle,
     close: bool,
diff --git a/main/FunnyBones/fn.save.html b/main/FunnyBones/fn.save.html
index 4dce823..237c049 100644
--- a/main/FunnyBones/fn.save.html
+++ b/main/FunnyBones/fn.save.html
@@ -1,6 +1,6 @@
-save in FunnyBones - Rust

Function FunnyBones::save

source ·
pub(crate) fn save(
+save in FunnyBones - Rust

Function FunnyBones::save

source ·
pub(crate) fn save(
     path: &Dynamic<Option<PathBuf>>,
-    skeleton: &EditingSkeleton,
-    on_error: &SharedCallback<SaveError>,
+    skeleton: &EditingSkeleton,
+    on_error: &SharedCallback<SaveError>,
     modals: &Modal,
-) -> Result<(), SaveError>
\ No newline at end of file +) -> Result<(), SaveError>
\ No newline at end of file diff --git a/main/FunnyBones/fn.save_as.html b/main/FunnyBones/fn.save_as.html index e5ee795..fcd8bf9 100644 --- a/main/FunnyBones/fn.save_as.html +++ b/main/FunnyBones/fn.save_as.html @@ -1,6 +1,6 @@ -save_as in FunnyBones - Rust

Function FunnyBones::save_as

source ·
pub(crate) fn save_as(
+save_as in FunnyBones - Rust

Function FunnyBones::save_as

source ·
pub(crate) fn save_as(
     path: &Dynamic<Option<PathBuf>>,
-    skeleton: &EditingSkeleton,
-    on_error: &SharedCallback<SaveError>,
+    skeleton: &EditingSkeleton,
+    on_error: &SharedCallback<SaveError>,
     modals: &Modal,
 )
\ No newline at end of file diff --git a/main/FunnyBones/fn.skeleton_editor.html b/main/FunnyBones/fn.skeleton_editor.html deleted file mode 100644 index e5c9162..0000000 --- a/main/FunnyBones/fn.skeleton_editor.html +++ /dev/null @@ -1,4 +0,0 @@ -skeleton_editor in FunnyBones - Rust

Function FunnyBones::skeleton_editor

source ·
pub(crate) fn skeleton_editor(
-    skeleton: &EditingSkeleton,
-    watcher: &Watcher,
-) -> impl MakeWidget
\ No newline at end of file diff --git a/main/FunnyBones/fn.skeleton_window.html b/main/FunnyBones/fn.skeleton_window.html index 494be23..6a3f66c 100644 --- a/main/FunnyBones/fn.skeleton_window.html +++ b/main/FunnyBones/fn.skeleton_window.html @@ -1 +1 @@ -skeleton_window in FunnyBones - Rust

Function FunnyBones::skeleton_window

source ·
pub(crate) fn skeleton_window(path: Option<PathBuf>) -> Window
\ No newline at end of file +skeleton_window in FunnyBones - Rust

Function FunnyBones::skeleton_window

source ·
pub(crate) fn skeleton_window(path: Option<PathBuf>) -> Window
\ No newline at end of file diff --git a/main/FunnyBones/index.html b/main/FunnyBones/index.html index 0e55c16..35d075b 100644 --- a/main/FunnyBones/index.html +++ b/main/FunnyBones/index.html @@ -1,2 +1,2 @@ -FunnyBones - Rust

Crate FunnyBones

source ·
Expand description

The FunnyBones 2D Animation Editor.

-

Structs§

Enums§

Functions§

\ No newline at end of file +FunnyBones - Rust

Crate FunnyBones

source ·
Expand description

The FunnyBones 2D Animation Editor.

+

Functions§

\ No newline at end of file diff --git a/main/FunnyBones/sidebar-items.js b/main/FunnyBones/sidebar-items.js index 8b1d791..9084a9b 100644 --- a/main/FunnyBones/sidebar-items.js +++ b/main/FunnyBones/sidebar-items.js @@ -1 +1 @@ -window.SIDEBAR_ITEMS = {"enum":["ReadError","SaveError"],"fn":["add_bones_to_skeleton","bone_editor","bone_property_editor","bones_editor","main","main_menu_window","open_file","save","save_as","skeleton_editor","skeleton_window"],"struct":["EditingSkeleton","SerializedBone","SerializedSkeleton","SkeletalBone"]}; \ No newline at end of file +window.SIDEBAR_ITEMS = {"fn":["main","main_menu_window","open_file","save","save_as","skeleton_window"]}; \ No newline at end of file diff --git a/main/FunnyBones/struct.EditingSkeleton.html b/main/FunnyBones/struct.EditingSkeleton.html deleted file mode 100644 index d399321..0000000 --- a/main/FunnyBones/struct.EditingSkeleton.html +++ /dev/null @@ -1,82 +0,0 @@ -EditingSkeleton in FunnyBones - Rust

Struct FunnyBones::EditingSkeleton

source ·
pub(crate) struct EditingSkeleton {
-    pub(crate) root: SkeletalBone,
-    pub(crate) a_bones: Dynamic<Vec<SkeletalBone>>,
-}

Fields§

§root: SkeletalBone§a_bones: Dynamic<Vec<SkeletalBone>>

Implementations§

source§

impl EditingSkeleton

source

pub(crate) fn read_from(path: &Path) -> Result<Self, ReadError>

source

pub(crate) fn write_to(&self, path: &Path) -> Result<(), SaveError>

source

pub(crate) fn find_bone(&self, id: BoneId) -> Option<SkeletalBone>

source

pub(crate) fn find_bone_in( - bones: &Dynamic<Vec<SkeletalBone>>, - index: usize, -) -> ControlFlow<SkeletalBone, usize>

source

pub(crate) fn find_joint(&self, id: JointId) -> Option<SkeletalBone>

source

pub(crate) fn find_joint_in( - bones: &Dynamic<Vec<SkeletalBone>>, - index: usize, -) -> ControlFlow<SkeletalBone, usize>

Trait Implementations§

source§

impl Clone for EditingSkeleton

source§

fn clone(&self) -> EditingSkeleton

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for EditingSkeleton

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for EditingSkeleton

source§

fn default() -> EditingSkeleton

Returns the “default value” for a type. Read more
source§

impl From<&EditingSkeleton> for SerializedSkeleton

source§

fn from(skeleton: &EditingSkeleton) -> Self

Converts to this type from the input type.
source§

impl From<SerializedSkeleton> for EditingSkeleton

source§

fn from(skeleton: SerializedSkeleton) -> Self

Converts to this type from the input type.
source§

impl PartialEq for EditingSkeleton

source§

fn eq(&self, other: &EditingSkeleton) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, -and should not be overridden without very good reason.
source§

impl StructuralPartialEq for EditingSkeleton

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where - T: Real + Zero + Arithmetics + Clone, - Swp: WhitePoint<T>, - Dwp: WhitePoint<T>, - D: AdaptFrom<S, Swp, Dwp, T>,

source§

fn adapt_into_using<M>(self, method: M) -> D
where - M: TransformMatrix<T>,

Convert the source color to the destination color using the specified -method.
source§

fn adapt_into(self) -> D

Convert the source color to the destination color using the bradford -method by default.
source§

impl<T> Any for T
where - T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T, C> ArraysFrom<C> for T
where - C: IntoArrays<T>,

source§

fn arrays_from(colors: C) -> T

Cast a collection of colors into a collection of arrays.
source§

impl<T, C> ArraysInto<C> for T
where - C: FromArrays<T>,

source§

fn arrays_into(self) -> C

Cast this collection of arrays into a collection of colors.
source§

impl<T> Borrow<T> for T
where - T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where - T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for U
where - T: FromCam16Unclamped<WpParam, U>,

source§

type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar

The number type that’s used in parameters when converting.
source§

fn cam16_into_unclamped( - self, - parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>, -) -> T

Converts self into C, using the provided parameters.
§

impl<A> Cast for A

§

fn cast<To>(self) -> To
where - To: CastFrom<A>,

Casts self to the To type. This may be a lossy operation.
§

impl<A> CastFrom<A> for A

§

fn from_cast(from: A) -> A

Returns from as Self.
§

impl<A, B> CastInto<A> for B
where - A: CastFrom<B>,

§

fn cast_into(self) -> A

Returns self as To.
source§

impl<T> CloneToUninit for T
where - T: Clone,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T, C> ComponentsFrom<C> for T
where - C: IntoComponents<T>,

source§

fn components_from(colors: C) -> T

Cast a collection of colors into a collection of color components.
§

impl<T> Downcast<T> for T

§

fn downcast(&self) -> &T

§

impl<T> Downcast for T
where - T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can -then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be -further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot -generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot -generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where - T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be -further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

-
source§

impl<T> FromAngle<T> for T

source§

fn from_angle(angle: T) -> T

Performs a conversion from angle.
source§

impl<T, U> FromStimulus<U> for T
where - U: IntoStimulus<T>,

source§

fn from_stimulus(other: U) -> T

Converts other into Self, while performing the appropriate scaling, -rounding and clamping.
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an -Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an -Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where - U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

-

That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

-
source§

impl<T, U> IntoAngle<U> for T
where - U: FromAngle<T>,

source§

fn into_angle(self) -> U

Performs a conversion into T.
source§

impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for U
where - T: Cam16FromUnclamped<WpParam, U>,

source§

type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar

The number type that’s used in parameters when converting.
source§

fn into_cam16_unclamped( - self, - parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>, -) -> T

Converts self into C, using the provided parameters.
source§

impl<T, U> IntoColor<U> for T
where - U: FromColor<T>,

source§

fn into_color(self) -> U

Convert into T with values clamped to the color defined bounds Read more
source§

impl<T, U> IntoColorUnclamped<U> for T
where - U: FromColorUnclamped<T>,

source§

fn into_color_unclamped(self) -> U

Convert into T. The resulting color might be invalid in its color space Read more
source§

impl<T> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> -if into_left is true. -Converts self into a Right variant of Either<Self, Self> -otherwise. Read more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where - F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> -if into_left(&self) returns true. -Converts self into a Right variant of Either<Self, Self> -otherwise. Read more
§

impl<T> IntoReadOnly<T> for T

§

fn into_read_only(self) -> ReadOnly<T>

Returns self as a ReadOnly.
source§

impl<T> IntoStimulus<T> for T

source§

fn into_stimulus(self) -> T

Converts self into T, while performing the appropriate scaling, -rounding and clamping.
§

impl<T> IntoValue<Option<T>> for T

§

fn into_value(self) -> Value<Option<T>>

Returns this type as a [Value].
§

impl<T> IntoValue<T> for T

§

fn into_value(self) -> Value<T>

Returns this type as a [Value].
§

impl<T> NoneValue for T
where - T: Default,

§

type NoneType = T

§

fn null_value() -> T

The none-equivalent value.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<R, P> ReadPrimitive<R> for P
where - R: Read + ReadEndian<P>, - P: Default,

source§

fn read_from_little_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_little_endian().
source§

fn read_from_big_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_big_endian().
source§

fn read_from_native_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_native_endian().
source§

impl<T> Same for T

source§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where - T: Clone,

source§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, C> TryComponentsInto<C> for T
where - C: TryFromComponents<T>,

source§

type Error = <C as TryFromComponents<T>>::Error

The error for when try_into_colors fails to cast.
source§

fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>

Try to cast this collection of color components into a collection of -colors. Read more
source§

impl<T, U> TryFrom<U> for T
where - U: Into<T>,

source§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where - U: TryFrom<T>,

source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T, U> TryIntoColor<U> for T
where - U: TryFromColor<T>,

source§

fn try_into_color(self) -> Result<U, OutOfBounds<U>>

Convert into T, returning ok if the color is inside of its defined -range, otherwise an OutOfBounds error is returned which contains -the unclamped color. Read more
source§

impl<C, U> UintsFrom<C> for U
where - C: IntoUints<U>,

source§

fn uints_from(colors: C) -> U

Cast a collection of colors into a collection of unsigned integers.
source§

impl<C, U> UintsInto<C> for U
where - C: FromUints<U>,

source§

fn uints_into(self) -> C

Cast this collection of unsigned integers into a collection of colors.
§

impl<T> Upcast<T> for T

§

fn upcast(&self) -> Option<&T>

§

impl<V, T> VZip<V> for T
where - V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where - S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a -[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a -[WithDispatch] wrapper. Read more
§

impl<T> WasmNotSend for T
where - T: Send,

§

impl<T> WasmNotSendSync for T
where - T: WasmNotSend + WasmNotSync,

§

impl<T> WasmNotSync for T
where - T: Sync,

\ No newline at end of file diff --git a/main/FunnyBones/struct.SkeletalBone.html b/main/FunnyBones/struct.SkeletalBone.html deleted file mode 100644 index a1932a2..0000000 --- a/main/FunnyBones/struct.SkeletalBone.html +++ /dev/null @@ -1,83 +0,0 @@ -SkeletalBone in FunnyBones - Rust

Struct FunnyBones::SkeletalBone

source ·
pub(crate) struct SkeletalBone {
-    pub(crate) label: Dynamic<String>,
-    pub(crate) joint_label: Dynamic<String>,
-    pub(crate) joint_angle: Dynamic<Angle>,
-    pub(crate) length: Dynamic<f32>,
-    pub(crate) jointed: Dynamic<bool>,
-    pub(crate) joint_ratio: Dynamic<ZeroToOne>,
-    pub(crate) inverse: Dynamic<bool>,
-    pub(crate) desired_length: Dynamic<f32>,
-    pub(crate) connected_bones: Dynamic<Vec<SkeletalBone>>,
-}

Fields§

§label: Dynamic<String>§joint_label: Dynamic<String>§joint_angle: Dynamic<Angle>§length: Dynamic<f32>§jointed: Dynamic<bool>§joint_ratio: Dynamic<ZeroToOne>§inverse: Dynamic<bool>§desired_length: Dynamic<f32>§connected_bones: Dynamic<Vec<SkeletalBone>>

Implementations§

Trait Implementations§

source§

impl Clone for SkeletalBone

source§

fn clone(&self) -> SkeletalBone

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for SkeletalBone

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for SkeletalBone

source§

fn default() -> Self

Returns the “default value” for a type. Read more
source§

impl From<&SkeletalBone> for SerializedBone

source§

fn from(bone: &SkeletalBone) -> Self

Converts to this type from the input type.
source§

impl From<SerializedBone> for SkeletalBone

source§

fn from(bone: SerializedBone) -> Self

Converts to this type from the input type.
source§

impl PartialEq for SkeletalBone

source§

fn eq(&self, other: &SkeletalBone) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, -and should not be overridden without very good reason.
source§

impl StructuralPartialEq for SkeletalBone

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where - T: Real + Zero + Arithmetics + Clone, - Swp: WhitePoint<T>, - Dwp: WhitePoint<T>, - D: AdaptFrom<S, Swp, Dwp, T>,

source§

fn adapt_into_using<M>(self, method: M) -> D
where - M: TransformMatrix<T>,

Convert the source color to the destination color using the specified -method.
source§

fn adapt_into(self) -> D

Convert the source color to the destination color using the bradford -method by default.
source§

impl<T> Any for T
where - T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T, C> ArraysFrom<C> for T
where - C: IntoArrays<T>,

source§

fn arrays_from(colors: C) -> T

Cast a collection of colors into a collection of arrays.
source§

impl<T, C> ArraysInto<C> for T
where - C: FromArrays<T>,

source§

fn arrays_into(self) -> C

Cast this collection of arrays into a collection of colors.
source§

impl<T> Borrow<T> for T
where - T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where - T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for U
where - T: FromCam16Unclamped<WpParam, U>,

source§

type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar

The number type that’s used in parameters when converting.
source§

fn cam16_into_unclamped( - self, - parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>, -) -> T

Converts self into C, using the provided parameters.
§

impl<A> Cast for A

§

fn cast<To>(self) -> To
where - To: CastFrom<A>,

Casts self to the To type. This may be a lossy operation.
§

impl<A> CastFrom<A> for A

§

fn from_cast(from: A) -> A

Returns from as Self.
§

impl<A, B> CastInto<A> for B
where - A: CastFrom<B>,

§

fn cast_into(self) -> A

Returns self as To.
source§

impl<T> CloneToUninit for T
where - T: Clone,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T, C> ComponentsFrom<C> for T
where - C: IntoComponents<T>,

source§

fn components_from(colors: C) -> T

Cast a collection of colors into a collection of color components.
§

impl<T> Downcast<T> for T

§

fn downcast(&self) -> &T

§

impl<T> Downcast for T
where - T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can -then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be -further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot -generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot -generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where - T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be -further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

-
source§

impl<T> FromAngle<T> for T

source§

fn from_angle(angle: T) -> T

Performs a conversion from angle.
source§

impl<T, U> FromStimulus<U> for T
where - U: IntoStimulus<T>,

source§

fn from_stimulus(other: U) -> T

Converts other into Self, while performing the appropriate scaling, -rounding and clamping.
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an -Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an -Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where - U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

-

That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

-
source§

impl<T, U> IntoAngle<U> for T
where - U: FromAngle<T>,

source§

fn into_angle(self) -> U

Performs a conversion into T.
source§

impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for U
where - T: Cam16FromUnclamped<WpParam, U>,

source§

type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar

The number type that’s used in parameters when converting.
source§

fn into_cam16_unclamped( - self, - parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>, -) -> T

Converts self into C, using the provided parameters.
source§

impl<T, U> IntoColor<U> for T
where - U: FromColor<T>,

source§

fn into_color(self) -> U

Convert into T with values clamped to the color defined bounds Read more
source§

impl<T, U> IntoColorUnclamped<U> for T
where - U: FromColorUnclamped<T>,

source§

fn into_color_unclamped(self) -> U

Convert into T. The resulting color might be invalid in its color space Read more
source§

impl<T> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> -if into_left is true. -Converts self into a Right variant of Either<Self, Self> -otherwise. Read more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where - F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> -if into_left(&self) returns true. -Converts self into a Right variant of Either<Self, Self> -otherwise. Read more
§

impl<T> IntoReadOnly<T> for T

§

fn into_read_only(self) -> ReadOnly<T>

Returns self as a ReadOnly.
source§

impl<T> IntoStimulus<T> for T

source§

fn into_stimulus(self) -> T

Converts self into T, while performing the appropriate scaling, -rounding and clamping.
§

impl<T> IntoValue<Option<T>> for T

§

fn into_value(self) -> Value<Option<T>>

Returns this type as a [Value].
§

impl<T> IntoValue<T> for T

§

fn into_value(self) -> Value<T>

Returns this type as a [Value].
§

impl<T> NoneValue for T
where - T: Default,

§

type NoneType = T

§

fn null_value() -> T

The none-equivalent value.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<R, P> ReadPrimitive<R> for P
where - R: Read + ReadEndian<P>, - P: Default,

source§

fn read_from_little_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_little_endian().
source§

fn read_from_big_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_big_endian().
source§

fn read_from_native_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_native_endian().
source§

impl<T> Same for T

source§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where - T: Clone,

source§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, C> TryComponentsInto<C> for T
where - C: TryFromComponents<T>,

source§

type Error = <C as TryFromComponents<T>>::Error

The error for when try_into_colors fails to cast.
source§

fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>

Try to cast this collection of color components into a collection of -colors. Read more
source§

impl<T, U> TryFrom<U> for T
where - U: Into<T>,

source§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where - U: TryFrom<T>,

source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T, U> TryIntoColor<U> for T
where - U: TryFromColor<T>,

source§

fn try_into_color(self) -> Result<U, OutOfBounds<U>>

Convert into T, returning ok if the color is inside of its defined -range, otherwise an OutOfBounds error is returned which contains -the unclamped color. Read more
source§

impl<C, U> UintsFrom<C> for U
where - C: IntoUints<U>,

source§

fn uints_from(colors: C) -> U

Cast a collection of colors into a collection of unsigned integers.
source§

impl<C, U> UintsInto<C> for U
where - C: FromUints<U>,

source§

fn uints_into(self) -> C

Cast this collection of unsigned integers into a collection of colors.
§

impl<T> Upcast<T> for T

§

fn upcast(&self) -> Option<&T>

§

impl<V, T> VZip<V> for T
where - V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where - S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a -[WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a -[WithDispatch] wrapper. Read more
§

impl<T> WasmNotSend for T
where - T: Send,

§

impl<T> WasmNotSendSync for T
where - T: WasmNotSend + WasmNotSync,

§

impl<T> WasmNotSync for T
where - T: Sync,

\ No newline at end of file diff --git a/main/funnybones/all.html b/main/funnybones/all.html index feefe01..3cd7bec 100644 --- a/main/funnybones/all.html +++ b/main/funnybones/all.html @@ -1 +1 @@ -List of all items in this crate
\ No newline at end of file +List of all items in this crate
\ No newline at end of file diff --git a/main/FunnyBones/enum.ReadError.html b/main/funnybones/editor/enum.ReadError.html similarity index 78% rename from main/FunnyBones/enum.ReadError.html rename to main/funnybones/editor/enum.ReadError.html index deff532..75db4a3 100644 --- a/main/FunnyBones/enum.ReadError.html +++ b/main/funnybones/editor/enum.ReadError.html @@ -1,7 +1,7 @@ -ReadError in FunnyBones - Rust

Enum FunnyBones::ReadError

source ·
pub(crate) enum ReadError {
+ReadError in funnybones::editor - Rust

Enum funnybones::editor::ReadError

source ·
pub enum ReadError {
     Io(Error),
     Rsn(Error),
-}

Variants§

§

Io(Error)

§

Rsn(Error)

Trait Implementations§

source§

impl Debug for ReadError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for ReadError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl From<Error> for ReadError

source§

fn from(value: Error) -> Self

Converts to this type from the input type.
source§

impl From<Error> for ReadError

source§

fn from(value: Error) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where +}

Variants§

§

Io(Error)

§

Rsn(Error)

Trait Implementations§

source§

impl Debug for ReadError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for ReadError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl From<Error> for ReadError

source§

fn from(value: Error) -> Self

Converts to this type from the input type.
source§

impl From<Error> for ReadError

source§

fn from(value: Error) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, @@ -60,7 +60,7 @@ if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more

§

impl<T> IntoReadOnly<T> for T

§

fn into_read_only(self) -> ReadOnly<T>

Returns self as a ReadOnly.
source§

impl<T> IntoStimulus<T> for T

source§

fn into_stimulus(self) -> T

Converts self into T, while performing the appropriate scaling, -rounding and clamping.
§

impl<T> IntoValue<Option<T>> for T

§

fn into_value(self) -> Value<Option<T>>

Returns this type as a [Value].
§

impl<T> IntoValue<T> for T

§

fn into_value(self) -> Value<T>

Returns this type as a [Value].
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T> Same for T

source§

type Output = T

Should always be Self
§

impl<T> ToSmolStr for T
where +rounding and clamping.

§

impl<T> IntoValue<Option<T>> for T

§

fn into_value(self) -> Value<Option<T>>

Returns this type as a [Value].
§

impl<T> IntoValue<T> for T

§

fn into_value(self) -> Value<T>

Returns this type as a [Value].
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> ToSmolStr for T
where T: Display + ?Sized,

§

fn to_smolstr(&self) -> SmolStr

source§

impl<T> ToString for T
where T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, C> TryComponentsInto<C> for T
where C: TryFromComponents<T>,

source§

type Error = <C as TryFromComponents<T>>::Error

The error for when try_into_colors fails to cast.
source§

fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>

Try to cast this collection of color components into a collection of @@ -71,8 +71,7 @@ range, otherwise an OutOfBounds error is returned which contains the unclamped color. Read more
source§

impl<C, U> UintsFrom<C> for U
where C: IntoUints<U>,

source§

fn uints_from(colors: C) -> U

Cast a collection of colors into a collection of unsigned integers.
source§

impl<C, U> UintsInto<C> for U
where - C: FromUints<U>,

source§

fn uints_into(self) -> C

Cast this collection of unsigned integers into a collection of colors.
§

impl<T> Upcast<T> for T

§

fn upcast(&self) -> Option<&T>

§

impl<V, T> VZip<V> for T
where - V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + C: FromUints<U>,

source§

fn uints_into(self) -> C

Cast this collection of unsigned integers into a collection of colors.
§

impl<T> Upcast<T> for T

§

fn upcast(&self) -> Option<&T>

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

impl<T> WasmNotSend for T
where diff --git a/main/FunnyBones/enum.SaveError.html b/main/funnybones/editor/enum.SaveError.html similarity index 78% rename from main/FunnyBones/enum.SaveError.html rename to main/funnybones/editor/enum.SaveError.html index 179087c..feae07e 100644 --- a/main/FunnyBones/enum.SaveError.html +++ b/main/funnybones/editor/enum.SaveError.html @@ -1,7 +1,7 @@ -SaveError in FunnyBones - Rust

Enum FunnyBones::SaveError

source ·
pub(crate) enum SaveError {
+SaveError in funnybones::editor - Rust

Enum funnybones::editor::SaveError

source ·
pub enum SaveError {
     Io(Error),
     InvalidPath,
-}

Variants§

§

Io(Error)

§

InvalidPath

Trait Implementations§

source§

impl Debug for SaveError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for SaveError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl From<Error> for SaveError

source§

fn from(err: Error) -> Self

Converts to this type from the input type.
source§

impl From<PersistError> for SaveError

source§

fn from(err: PersistError) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where +}

Variants§

§

Io(Error)

§

InvalidPath

Trait Implementations§

source§

impl Debug for SaveError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for SaveError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl From<Error> for SaveError

source§

fn from(err: Error) -> Self

Converts to this type from the input type.
source§

impl From<PersistError> for SaveError

source§

fn from(err: PersistError) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, @@ -60,7 +60,7 @@ if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more

§

impl<T> IntoReadOnly<T> for T

§

fn into_read_only(self) -> ReadOnly<T>

Returns self as a ReadOnly.
source§

impl<T> IntoStimulus<T> for T

source§

fn into_stimulus(self) -> T

Converts self into T, while performing the appropriate scaling, -rounding and clamping.
§

impl<T> IntoValue<Option<T>> for T

§

fn into_value(self) -> Value<Option<T>>

Returns this type as a [Value].
§

impl<T> IntoValue<T> for T

§

fn into_value(self) -> Value<T>

Returns this type as a [Value].
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T> Same for T

source§

type Output = T

Should always be Self
§

impl<T> ToSmolStr for T
where +rounding and clamping.

§

impl<T> IntoValue<Option<T>> for T

§

fn into_value(self) -> Value<Option<T>>

Returns this type as a [Value].
§

impl<T> IntoValue<T> for T

§

fn into_value(self) -> Value<T>

Returns this type as a [Value].
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> ToSmolStr for T
where T: Display + ?Sized,

§

fn to_smolstr(&self) -> SmolStr

source§

impl<T> ToString for T
where T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, C> TryComponentsInto<C> for T
where C: TryFromComponents<T>,

source§

type Error = <C as TryFromComponents<T>>::Error

The error for when try_into_colors fails to cast.
source§

fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>

Try to cast this collection of color components into a collection of @@ -71,8 +71,7 @@ range, otherwise an OutOfBounds error is returned which contains the unclamped color. Read more
source§

impl<C, U> UintsFrom<C> for U
where C: IntoUints<U>,

source§

fn uints_from(colors: C) -> U

Cast a collection of colors into a collection of unsigned integers.
source§

impl<C, U> UintsInto<C> for U
where - C: FromUints<U>,

source§

fn uints_into(self) -> C

Cast this collection of unsigned integers into a collection of colors.
§

impl<T> Upcast<T> for T

§

fn upcast(&self) -> Option<&T>

§

impl<V, T> VZip<V> for T
where - V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + C: FromUints<U>,

source§

fn uints_into(self) -> C

Cast this collection of unsigned integers into a collection of colors.
§

impl<T> Upcast<T> for T

§

fn upcast(&self) -> Option<&T>

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

impl<T> WasmNotSend for T
where diff --git a/main/funnybones/editor/fn.skeleton_editor.html b/main/funnybones/editor/fn.skeleton_editor.html new file mode 100644 index 0000000..289dfdc --- /dev/null +++ b/main/funnybones/editor/fn.skeleton_editor.html @@ -0,0 +1 @@ +skeleton_editor in funnybones::editor - Rust

Function funnybones::editor::skeleton_editor

source ·
pub fn skeleton_editor(editing_skeleton: EditingSkeleton) -> SkeletonEditor
\ No newline at end of file diff --git a/main/funnybones/editor/index.html b/main/funnybones/editor/index.html new file mode 100644 index 0000000..4b93a31 --- /dev/null +++ b/main/funnybones/editor/index.html @@ -0,0 +1 @@ +funnybones::editor - Rust
\ No newline at end of file diff --git a/main/funnybones/editor/sidebar-items.js b/main/funnybones/editor/sidebar-items.js new file mode 100644 index 0000000..86f640e --- /dev/null +++ b/main/funnybones/editor/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["ReadError","SaveError"],"fn":["skeleton_editor"],"struct":["EditingSkeleton","SkeletonEditor"]}; \ No newline at end of file diff --git a/main/FunnyBones/struct.SerializedBone.html b/main/funnybones/editor/struct.EditingSkeleton.html similarity index 67% rename from main/FunnyBones/struct.SerializedBone.html rename to main/funnybones/editor/struct.EditingSkeleton.html index bedca62..37d409a 100644 --- a/main/FunnyBones/struct.SerializedBone.html +++ b/main/funnybones/editor/struct.EditingSkeleton.html @@ -1,16 +1,5 @@ -SerializedBone in FunnyBones - Rust

Struct FunnyBones::SerializedBone

source ·
pub(crate) struct SerializedBone {
-    pub(crate) label: String,
-    pub(crate) joint_label: String,
-    pub(crate) joint_angle: Angle,
-    pub(crate) length: f32,
-    pub(crate) jointed: bool,
-    pub(crate) joint_ratio: ZeroToOne,
-    pub(crate) inverse: bool,
-    pub(crate) desired_length: f32,
-    pub(crate) connected_bones: Vec<SerializedBone>,
-}

Fields§

§label: String§joint_label: String§joint_angle: Angle§length: f32§jointed: bool§joint_ratio: ZeroToOne§inverse: bool§desired_length: f32§connected_bones: Vec<SerializedBone>

Trait Implementations§

source§

impl Debug for SerializedBone

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for SerializedBone

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where - __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl From<&SkeletalBone> for SerializedBone

source§

fn from(bone: &SkeletalBone) -> Self

Converts to this type from the input type.
source§

impl From<SerializedBone> for SkeletalBone

source§

fn from(bone: SerializedBone) -> Self

Converts to this type from the input type.
source§

impl Serialize for SerializedBone

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where - __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where +EditingSkeleton in funnybones::editor - Rust

Struct funnybones::editor::EditingSkeleton

source ·
pub struct EditingSkeleton { /* private fields */ }

Implementations§

source§

impl EditingSkeleton

source

pub fn read_from(path: &Path) -> Result<Self, ReadError>

source

pub fn write_to(&self, path: &Path) -> Result<(), SaveError>

Trait Implementations§

source§

impl Clone for EditingSkeleton

source§

fn clone(&self) -> EditingSkeleton

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for EditingSkeleton

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for EditingSkeleton

source§

fn default() -> EditingSkeleton

Returns the “default value” for a type. Read more
source§

impl PartialEq for EditingSkeleton

source§

fn eq(&self, other: &EditingSkeleton) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
source§

impl StructuralPartialEq for EditingSkeleton

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, @@ -28,7 +17,8 @@ parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>, ) -> T

Converts self into C, using the provided parameters.

§

impl<A> Cast for A

§

fn cast<To>(self) -> To
where To: CastFrom<A>,

Casts self to the To type. This may be a lossy operation.
§

impl<A> CastFrom<A> for A

§

fn from_cast(from: A) -> A

Returns from as Self.
§

impl<A, B> CastInto<A> for B
where - A: CastFrom<B>,

§

fn cast_into(self) -> A

Returns self as To.
source§

impl<T, C> ComponentsFrom<C> for T
where + A: CastFrom<B>,

§

fn cast_into(self) -> A

Returns self as To.
source§

impl<T> CloneToUninit for T
where + T: Clone,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T, C> ComponentsFrom<C> for T
where C: IntoComponents<T>,

source§

fn components_from(colors: C) -> T

Cast a collection of colors into a collection of color components.
§

impl<T> Downcast<T> for T

§

fn downcast(&self) -> &T

§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be @@ -36,7 +26,7 @@ generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be -further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> FromAngle<T> for T

source§

fn from_angle(angle: T) -> T

Performs a conversion from angle.
source§

impl<T, U> FromStimulus<U> for T
where U: IntoStimulus<T>,

source§

fn from_stimulus(other: U) -> T

Converts other into Self, while performing the appropriate scaling, rounding and clamping.
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an @@ -60,7 +50,10 @@ if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> IntoReadOnly<T> for T

§

fn into_read_only(self) -> ReadOnly<T>

Returns self as a ReadOnly.
source§

impl<T> IntoStimulus<T> for T

source§

fn into_stimulus(self) -> T

Converts self into T, while performing the appropriate scaling, -rounding and clamping.
§

impl<T> IntoValue<Option<T>> for T

§

fn into_value(self) -> Value<Option<T>>

Returns this type as a [Value].
§

impl<T> IntoValue<T> for T

§

fn into_value(self) -> Value<T>

Returns this type as a [Value].
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T> Same for T

source§

type Output = T

Should always be Self
source§

impl<T, C> TryComponentsInto<C> for T
where +rounding and clamping.

§

impl<T> IntoValue<Option<T>> for T

§

fn into_value(self) -> Value<Option<T>>

Returns this type as a [Value].
§

impl<T> IntoValue<T> for T

§

fn into_value(self) -> Value<T>

Returns this type as a [Value].
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<R, P> ReadPrimitive<R> for P
where + R: Read + ReadEndian<P>, + P: Default,

source§

fn read_from_little_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_little_endian().
source§

fn read_from_big_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_big_endian().
source§

fn read_from_native_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_native_endian().
source§

impl<T> ToOwned for T
where + T: Clone,

source§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, C> TryComponentsInto<C> for T
where C: TryFromComponents<T>,

source§

type Error = <C as TryFromComponents<T>>::Error

The error for when try_into_colors fails to cast.
source§

fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>

Try to cast this collection of color components into a collection of colors. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

source§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where @@ -69,12 +62,10 @@ range, otherwise an OutOfBounds error is returned which contains the unclamped color. Read more

source§

impl<C, U> UintsFrom<C> for U
where C: IntoUints<U>,

source§

fn uints_from(colors: C) -> U

Cast a collection of colors into a collection of unsigned integers.
source§

impl<C, U> UintsInto<C> for U
where - C: FromUints<U>,

source§

fn uints_into(self) -> C

Cast this collection of unsigned integers into a collection of colors.
§

impl<T> Upcast<T> for T

§

fn upcast(&self) -> Option<&T>

§

impl<V, T> VZip<V> for T
where - V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + C: FromUints<U>,

source§

fn uints_into(self) -> C

Cast this collection of unsigned integers into a collection of colors.
§

impl<T> Upcast<T> for T

§

fn upcast(&self) -> Option<&T>

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a -[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where - T: for<'de> Deserialize<'de>,

§

impl<T> WasmNotSend for T
where +[WithDispatch] wrapper. Read more

§

impl<T> WasmNotSend for T
where T: Send,

§

impl<T> WasmNotSendSync for T
where T: WasmNotSend + WasmNotSync,

§

impl<T> WasmNotSync for T
where T: Sync,

\ No newline at end of file diff --git a/main/FunnyBones/struct.SerializedSkeleton.html b/main/funnybones/editor/struct.SkeletonEditor.html similarity index 55% rename from main/FunnyBones/struct.SerializedSkeleton.html rename to main/funnybones/editor/struct.SkeletonEditor.html index 3461c74..2b06055 100644 --- a/main/FunnyBones/struct.SerializedSkeleton.html +++ b/main/funnybones/editor/struct.SkeletonEditor.html @@ -1,9 +1,45 @@ -SerializedSkeleton in FunnyBones - Rust

Struct FunnyBones::SerializedSkeleton

source ·
pub(crate) struct SerializedSkeleton {
-    pub(crate) root: SerializedBone,
-    pub(crate) a_bones: Vec<SerializedBone>,
-}

Fields§

§root: SerializedBone§a_bones: Vec<SerializedBone>

Trait Implementations§

source§

impl Debug for SerializedSkeleton

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for SerializedSkeleton

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where - __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl From<&EditingSkeleton> for SerializedSkeleton

source§

fn from(skeleton: &EditingSkeleton) -> Self

Converts to this type from the input type.
source§

impl From<SerializedSkeleton> for EditingSkeleton

source§

fn from(skeleton: SerializedSkeleton) -> Self

Converts to this type from the input type.
source§

impl Serialize for SerializedSkeleton

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where - __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where +SkeletonEditor in funnybones::editor - Rust

Struct funnybones::editor::SkeletonEditor

source ·
pub struct SkeletonEditor {
+    pub editor: WidgetInstance,
+    pub skeleton: Dynamic<Skeleton>,
+}

Fields§

§editor: WidgetInstance§skeleton: Dynamic<Skeleton>

Trait Implementations§

source§

impl MakeWidget for SkeletonEditor

source§

fn make_widget(self) -> WidgetInstance

Returns a new widget.
§

fn into_window(self) -> Window

Returns a new window containing self as the root widget.
§

fn build_standalone_window(self) -> StandaloneWindowBuilder

Returns a builder for a standalone window. Read more
§

fn build_recorder(self) -> VirtualRecorderBuilder<Rgb8>

Returns a builder for a VirtualRecorder
§

fn with_styles(self, styles: impl IntoValue<Styles>) -> Style
where + Self: Sized,

Associates styles with this widget. Read more
§

fn with<C>( + self, + name: &C, + component: impl IntoValue<<C as ComponentDefinition>::ComponentType>, +) -> Style
where + C: ComponentDefinition, + Value<<C as ComponentDefinition>::ComponentType>: IntoComponentValue,

Associates a style component with self.
§

fn with_dynamic<C>( + self, + name: &C, + dynamic: impl IntoDynamicComponentValue, +) -> Style
where + C: ComponentDefinition, + Value<<C as ComponentDefinition>::ComponentType>: IntoComponentValue,

Associates a style component with self, resolving its value using +dynamic at runtime.
§

fn with_shortcut<F>( + self, + key: impl Into<ShortcutKey>, + modifiers: ModifiersState, + callback: F, +) -> Shortcuts
where + F: FnMut(KeyEvent) -> ControlFlow<EventHandled, EventIgnored> + Send + 'static,

Invokes callback when key is pressed while modifiers are pressed. Read more
§

fn with_repeating_shortcut<F>( + self, + key: impl Into<ShortcutKey>, + modifiers: ModifiersState, + callback: F, +) -> Shortcuts
where + F: FnMut(KeyEvent) -> ControlFlow<EventHandled, EventIgnored> + Send + 'static,

Invokes callback when key is pressed while modifiers are pressed. +If the shortcut is held, the callback will be invoked on repeat events. Read more
§

fn h1(self) -> Style

Styles self with the largest of 6 heading styles.
§

fn h2(self) -> Style

Styles self with the second largest of 6 heading styles.
§

fn h3(self) -> Style

Styles self with the third largest of 6 heading styles.
§

fn h4(self) -> Style

Styles self with the third smallest of 6 heading styles.
§

fn h5(self) -> Style

Styles self with the second smallest of 6 heading styles.
§

fn h6(self) -> Style

Styles self with the smallest of 6 heading styles.
§

fn xxxx_large(self) -> Style

Styles self with the largest text size.
§

fn xxx_large(self) -> Style

Styles self with the second largest text size.
§

fn xx_large(self) -> Style

Styles self with the third largest text size.
§

fn x_large(self) -> Style

Styles self with the fourth largest text size.
§

fn large(self) -> Style

Styles self with the fifth largest text size.
§

fn default_size(self) -> Style

Styles self with the third smallest text size.
§

fn small(self) -> Style

Styles self with the second smallest text size.
§

fn x_small(self) -> Style

Styles self with the smallest text size.
§

fn with_next_focus( + self, + next_focus: impl IntoValue<Option<WidgetId>>, +) -> WidgetInstance

Sets the widget that should be focused next. Read more
§

fn with_enabled(self, enabled: impl IntoValue<bool>) -> WidgetInstance

Sets this widget to be enabled/disabled based on enabled and returns +self. Read more
§

fn into_default(self) -> WidgetInstance

Sets this widget as a “default” widget. Read more
§

fn into_escape(self) -> WidgetInstance

Sets this widget as an “escape” widget. Read more
§

fn and(self, other: impl MakeWidget) -> WidgetList

Returns a collection of widgets using self and other.
§

fn chain<W>(self, others: impl IntoIterator<Item = W>) -> WidgetList
where + W: MakeWidget,

Chains self and others into a [WidgetList].
§

fn expand(self) -> Expand

Expands self to grow to fill its parent.
§

fn expand_weighted(self, weight: u8) -> Expand

Expands self to grow to fill its parent proportionally with other +weighted siblings.
§

fn expand_horizontally(self) -> Expand

Expands self to grow to fill its parent horizontally.
§

fn expand_vertically(self) -> Expand

Expands self to grow to fill its parent vertically.
§

fn size<T>(self, size: Size<T>) -> Resize
where + T: Into<DimensionRange>,

Resizes self to size.
§

fn width(self, width: impl Into<DimensionRange>) -> Resize

Resizes self to width. Read more
§

fn height(self, height: impl Into<DimensionRange>) -> Resize

Resizes self to height. Read more
§

fn into_button(self) -> Button

Returns this widget as the contents of a clickable button.
§

fn into_checkbox(self, value: impl IntoDynamic<CheckboxState>) -> Checkbox

Returns this widget as the label of a Checkbox.
§

fn centered(self) -> Align

Aligns self to the center vertically and horizontally.
§

fn align_left(self) -> Align

Aligns self to the left.
§

fn align_right(self) -> Align

Aligns self to the right.
§

fn align_top(self) -> Align

Aligns self to the top.
§

fn align_bottom(self) -> Align

Aligns self to the bottom.
§

fn fit_horizontally(self) -> Align

Fits self horizontally within its parent.
§

fn fit_vertically(self) -> Align

Fits self vertically within its parent.
§

fn scroll(self) -> Scroll

Allows scrolling self both vertically and horizontally.
§

fn vertical_scroll(self) -> Scroll

Allows scrolling self vertically.
§

fn horizontal_scroll(self) -> Scroll

Allows scrolling self horizontally.
§

fn widget_ref(self) -> WidgetRef

Creates a [WidgetRef] for use as child widget.
§

fn contain(self) -> Container

Wraps self in a [Container].
§

fn contain_level(self, level: impl IntoValue<ContainerLevel>) -> Container

Wraps self in a [Container] with the specified level.
§

fn background_color(self, color: impl IntoValue<Color>) -> Container

Returns a new widget that renders color behind self.
§

fn pad(self) -> Container

Wraps self with the default padding.
§

fn pad_by(self, padding: impl IntoValue<Edges<Dimension>>) -> Container

Wraps self with the specified padding.
§

fn themed(self, theme: impl IntoValue<ThemePair>) -> Themed

Applies theme to self and its children.
§

fn themed_mode(self, mode: impl IntoValue<ThemeMode>) -> ThemedMode

Applies mode to self and its children.
§

fn collapse_horizontally( + self, + collapse_when: impl IntoDynamic<bool>, +) -> Collapse

Returns a widget that collapses self horizontally based on the dynamic boolean value. Read more
§

fn collapse_vertically(self, collapse_when: impl IntoDynamic<bool>) -> Collapse

Returns a widget that collapses self vertically based on the dynamic +boolean value. Read more
§

fn disclose(self) -> Disclose

Returns a new widget that allows hiding and showing contents.
§

fn validation(self, validation: impl IntoDynamic<Validation>) -> Validated

Returns a widget that shows validation errors and/or hints.
§

fn tooltip(self, layer: &OverlayLayer, tip: impl MakeWidget) -> Tooltipped

Returns a widget that shows tip on layer when self is hovered.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, @@ -29,7 +65,7 @@ generate &Any’s vtable from &Trait’s.

§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.

§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be -further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> FromAngle<T> for T

source§

fn from_angle(angle: T) -> T

Performs a conversion from angle.
source§

impl<T, U> FromStimulus<U> for T
where U: IntoStimulus<T>,

source§

fn from_stimulus(other: U) -> T

Converts other into Self, while performing the appropriate scaling, rounding and clamping.
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an @@ -53,7 +89,25 @@ if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> IntoReadOnly<T> for T

§

fn into_read_only(self) -> ReadOnly<T>

Returns self as a ReadOnly.
source§

impl<T> IntoStimulus<T> for T

source§

fn into_stimulus(self) -> T

Converts self into T, while performing the appropriate scaling, -rounding and clamping.
§

impl<T> IntoValue<Option<T>> for T

§

fn into_value(self) -> Value<Option<T>>

Returns this type as a [Value].
§

impl<T> IntoValue<T> for T

§

fn into_value(self) -> Value<T>

Returns this type as a [Value].
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T> Same for T

source§

type Output = T

Should always be Self
source§

impl<T, C> TryComponentsInto<C> for T
where +rounding and clamping.

§

impl<T> IntoValue<Option<T>> for T

§

fn into_value(self) -> Value<Option<T>>

Returns this type as a [Value].
§

impl<T> IntoValue<T> for T

§

fn into_value(self) -> Value<T>

Returns this type as a [Value].
§

impl<T> MakeWindow for T
where + T: MakeWidget,

§

type Behavior = WidgetInstance

The behavior associated with this window.
§

fn make_window(self) -> Window<<T as MakeWindow>::Behavior>

Returns a new window from self.
§

fn open_centered<App>( + self, + app: &mut App, +) -> Result<WindowHandle, EventLoopError>
where + Self: Sized, + App: Application + ?Sized,

Opens self in the center of the monitor the window initially appears +on.
§

fn run_centered(self) -> Result<(), EventLoopError>
where + Self: Sized,

Runs self in the center of the monitor the window +initially appears on.
§

fn run_centered_in(self, app: PendingApp) -> Result<(), EventLoopError>
where + Self: Sized,

Runs app after opening self in the center of the monitor the window +initially appears on.
§

impl<T> Open for T
where + T: MakeWindow,

§

fn open<App>(self, app: &mut App) -> Result<WindowHandle, EventLoopError>
where + App: Application + ?Sized,

Opens the provided type as a window inside of app.
§

fn run_in(self, app: PendingApp) -> Result<(), EventLoopError>

Runs the provided type inside of the pending app, returning Ok(()) +upon successful execution and program exit. Note that this function may +not ever return on some platforms.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Run for T
where + T: MakeWidget,

§

fn run(self) -> Result<(), EventLoopError>

Runs the provided type, returning Ok(()) upon successful execution and +program exit. Note that this function may not ever return on some +platforms.
source§

impl<T, C> TryComponentsInto<C> for T
where C: TryFromComponents<T>,

source§

type Error = <C as TryFromComponents<T>>::Error

The error for when try_into_colors fails to cast.
source§

fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>

Try to cast this collection of color components into a collection of colors. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

source§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where @@ -62,12 +116,10 @@ range, otherwise an OutOfBounds error is returned which contains the unclamped color. Read more

source§

impl<C, U> UintsFrom<C> for U
where C: IntoUints<U>,

source§

fn uints_from(colors: C) -> U

Cast a collection of colors into a collection of unsigned integers.
source§

impl<C, U> UintsInto<C> for U
where - C: FromUints<U>,

source§

fn uints_into(self) -> C

Cast this collection of unsigned integers into a collection of colors.
§

impl<T> Upcast<T> for T

§

fn upcast(&self) -> Option<&T>

§

impl<V, T> VZip<V> for T
where - V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where + C: FromUints<U>,

source§

fn uints_into(self) -> C

Cast this collection of unsigned integers into a collection of colors.
§

impl<T> Upcast<T> for T

§

fn upcast(&self) -> Option<&T>

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a -[WithDispatch] wrapper. Read more
source§

impl<T> DeserializeOwned for T
where - T: for<'de> Deserialize<'de>,

§

impl<T> WasmNotSend for T
where +[WithDispatch] wrapper. Read more

§

impl<T> WasmNotSend for T
where T: Send,

§

impl<T> WasmNotSendSync for T
where T: WasmNotSend + WasmNotSync,

§

impl<T> WasmNotSync for T
where T: Sync,

\ No newline at end of file diff --git a/main/funnybones/enum.BoneEnd.html b/main/funnybones/enum.BoneEnd.html index af1903a..40b6633 100644 --- a/main/funnybones/enum.BoneEnd.html +++ b/main/funnybones/enum.BoneEnd.html @@ -1,16 +1,16 @@ -BoneEnd in funnybones - Rust

Enum funnybones::BoneEnd

source ·
pub enum BoneEnd {
+BoneEnd in funnybones - Rust

Enum funnybones::BoneEnd

source ·
pub enum BoneEnd {
     A,
     B,
 }
Expand description

A specific end of a Bone.

Variants§

§

A

The first end of a bone.

§

B

The second end of a bone.

-

Implementations§

source§

impl BoneEnd

source

pub const fn inverse(self) -> Self

Returns the opposite end of self.

-

Trait Implementations§

source§

impl Clone for BoneEnd

source§

fn clone(&self) -> BoneEnd

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for BoneEnd

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for BoneEnd

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where - __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Hash for BoneEnd

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where +

Implementations§

source§

impl BoneEnd

source

pub const fn inverse(self) -> Self

Returns the opposite end of self.

+

Trait Implementations§

source§

impl Clone for BoneEnd

source§

fn clone(&self) -> BoneEnd

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for BoneEnd

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for BoneEnd

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Hash for BoneEnd

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, - Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq for BoneEnd

source§

fn eq(&self, other: &BoneEnd) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, -and should not be overridden without very good reason.
source§

impl Serialize for BoneEnd

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where - __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for BoneEnd

source§

impl Eq for BoneEnd

source§

impl StructuralPartialEq for BoneEnd

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq for BoneEnd

source§

fn eq(&self, other: &BoneEnd) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
source§

impl Serialize for BoneEnd

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for BoneEnd

source§

impl Eq for BoneEnd

source§

impl StructuralPartialEq for BoneEnd

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, diff --git a/main/funnybones/enum.BoneKind.html b/main/funnybones/enum.BoneKind.html index 7fc36ea..67820ce 100644 --- a/main/funnybones/enum.BoneKind.html +++ b/main/funnybones/enum.BoneKind.html @@ -1,4 +1,4 @@ -BoneKind in funnybones - Rust

Enum funnybones::BoneKind

source ·
pub enum BoneKind {
+BoneKind in funnybones - Rust

Enum funnybones::BoneKind

source ·
pub enum BoneKind {
     Rigid {
         length: f32,
     },
@@ -18,15 +18,15 @@
 skeleton.

§inverse: bool

The bend of the simulated joint always goes in one of two directions. This boolean toggles which direction the bend goes in.

-

Implementations§

source§

impl BoneKind

source

pub fn with_label(self, label: impl Into<String>) -> LabeledBoneKind

Attaches a label to this bone when pushed into a skeleton.

-
source

pub fn full_length(&self) -> f32

Returns the full length of this bone.

-
source

pub fn is_inverse(&self) -> bool

Returns true if this is a jointed bone that bends inversely.

-
source

pub fn set_inverse(&mut self, new_inverse: bool)

Sets whether to bend inversely.

+

Implementations§

source§

impl BoneKind

source

pub fn with_label(self, label: impl Into<String>) -> LabeledBoneKind

Attaches a label to this bone when pushed into a skeleton.

+
source

pub fn full_length(&self) -> f32

Returns the full length of this bone.

+
source

pub fn is_inverse(&self) -> bool

Returns true if this is a jointed bone that bends inversely.

+
source

pub fn set_inverse(&mut self, new_inverse: bool)

Sets whether to bend inversely.

This function only affects a jointed bone kind.

-

Trait Implementations§

source§

impl Clone for BoneKind

source§

fn clone(&self) -> BoneKind

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for BoneKind

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for BoneKind

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where - __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl From<BoneKind> for LabeledBoneKind

source§

fn from(kind: BoneKind) -> Self

Converts to this type from the input type.
source§

impl PartialEq for BoneKind

source§

fn eq(&self, other: &BoneKind) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, -and should not be overridden without very good reason.
source§

impl Serialize for BoneKind

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where - __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for BoneKind

source§

impl StructuralPartialEq for BoneKind

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where +

Trait Implementations§

source§

impl Clone for BoneKind

source§

fn clone(&self) -> BoneKind

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for BoneKind

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for BoneKind

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl From<BoneKind> for LabeledBoneKind

source§

fn from(kind: BoneKind) -> Self

Converts to this type from the input type.
source§

impl PartialEq for BoneKind

source§

fn eq(&self, other: &BoneKind) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
source§

impl Serialize for BoneKind

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for BoneKind

source§

impl StructuralPartialEq for BoneKind

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, diff --git a/main/funnybones/index.html b/main/funnybones/index.html index 396d671..62b41cf 100644 --- a/main/funnybones/index.html +++ b/main/funnybones/index.html @@ -1,4 +1,4 @@ -funnybones - Rust

Crate funnybones

source ·
Expand description
+funnybones - Rust

Crate funnybones

source ·
Expand description

FunnyBones is considered experimental and unsupported crate version @@ -94,4 +94,4 @@

MIT License or the Apache License 2.0.

To learn more about contributing, please see CONTRIBUTING.md.

-

Modules§

Structs§

Enums§

\ No newline at end of file +

Modules§

Structs§

Enums§

\ No newline at end of file diff --git a/main/funnybones/sidebar-items.js b/main/funnybones/sidebar-items.js index 1083812..0c50774 100644 --- a/main/funnybones/sidebar-items.js +++ b/main/funnybones/sidebar-items.js @@ -1 +1 @@ -window.SIDEBAR_ITEMS = {"enum":["BoneEnd","BoneKind"],"mod":["animation","cushy"],"struct":["Angle","Bone","BoneAxis","BoneId","Coordinate","Joint","JointId","LabeledBoneKind","Rotation","Skeleton","Vector"]}; \ No newline at end of file +window.SIDEBAR_ITEMS = {"enum":["BoneEnd","BoneKind"],"mod":["animation","cushy","editor"],"struct":["Angle","Bone","BoneAxis","BoneId","Coordinate","Joint","JointId","LabeledBoneKind","Rotation","Skeleton","Vector"]}; \ No newline at end of file diff --git a/main/funnybones/struct.Angle.html b/main/funnybones/struct.Angle.html index 3f514b4..fe5f1af 100644 --- a/main/funnybones/struct.Angle.html +++ b/main/funnybones/struct.Angle.html @@ -1,15 +1,15 @@ -Angle in funnybones - Rust

Struct funnybones::Angle

source ·
pub struct Angle(/* private fields */);
Expand description

A value representing a rotation between 0. and .

-

Implementations§

source§

impl Angle

source

pub const MIN: Self = _

The minimum rotation represented by this type.

-
source

pub const MAX: Self = _

The maximum rotation represented by this type.

-
source

pub fn radians(radians: f32) -> Self

Returns an angle representing the given radians.

-
source

pub fn degrees(degrees: f32) -> Self

Returns an angle representing the given degrees.

-

Trait Implementations§

source§

impl Clone for Angle

source§

fn clone(&self) -> Angle

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Angle

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for Angle

source§

fn default() -> Angle

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for Angle

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where - __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for Angle

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl From<Angle> for Rotation

source§

fn from(value: Angle) -> Self

Converts to this type from the input type.
source§

impl From<Rotation> for Angle

source§

fn from(value: Rotation) -> Self

Converts to this type from the input type.
source§

impl LinearInterpolate for Angle

source§

fn lerp(&self, target: &Self, percent: f32) -> Self

Interpolate linearly between self and target using percent.
source§

impl PartialEq for Angle

source§

fn eq(&self, other: &Angle) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, -and should not be overridden without very good reason.
source§

impl PartialOrd for Angle

source§

fn partial_cmp(&self, other: &Angle) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +Angle in funnybones - Rust

Struct funnybones::Angle

source ·
pub struct Angle(/* private fields */);
Expand description

A value representing a rotation between 0. and .

+

Implementations§

source§

impl Angle

source

pub const MIN: Self = _

The minimum rotation represented by this type.

+
source

pub const MAX: Self = _

The maximum rotation represented by this type.

+
source

pub fn radians(radians: f32) -> Self

Returns an angle representing the given radians.

+
source

pub fn degrees(degrees: f32) -> Self

Returns an angle representing the given degrees.

+

Trait Implementations§

source§

impl Clone for Angle

source§

fn clone(&self) -> Angle

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Angle

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for Angle

source§

fn default() -> Angle

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for Angle

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for Angle

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl From<Angle> for Rotation

source§

fn from(value: Angle) -> Self

Converts to this type from the input type.
source§

impl From<Rotation> for Angle

source§

fn from(value: Rotation) -> Self

Converts to this type from the input type.
source§

impl LinearInterpolate for Angle

source§

fn lerp(&self, target: &Self, percent: f32) -> Self

Interpolate linearly between self and target using percent.
source§

impl PartialEq for Angle

source§

fn eq(&self, other: &Angle) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
source§

impl PartialOrd for Angle

source§

fn partial_cmp(&self, other: &Angle) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by -the >= operator. Read more
source§

impl PercentBetween for Angle

source§

fn percent_between(&self, min: &Self, max: &Self) -> ZeroToOne

Return the percentage that self is between min and max.
source§

impl Ranged for Angle

source§

const MIN: Self = Self::MIN

The minimum value for this type.
source§

const MAX: Self = Self::MAX

The maximum value for this type.
source§

impl Serialize for Angle

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where - __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for Angle

source§

impl StructuralPartialEq for Angle

Auto Trait Implementations§

§

impl Freeze for Angle

§

impl RefUnwindSafe for Angle

§

impl Send for Angle

§

impl Sync for Angle

§

impl Unpin for Angle

§

impl UnwindSafe for Angle

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where +the >= operator. Read more

source§

impl PercentBetween for Angle

source§

fn percent_between(&self, min: &Self, max: &Self) -> ZeroToOne

Return the percentage that self is between min and max.
source§

impl Ranged for Angle

source§

const MIN: Self = Self::MIN

The minimum value for this type.
source§

const MAX: Self = Self::MAX

The maximum value for this type.
source§

impl Serialize for Angle

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for Angle

source§

impl StructuralPartialEq for Angle

Auto Trait Implementations§

§

impl Freeze for Angle

§

impl RefUnwindSafe for Angle

§

impl Send for Angle

§

impl Sync for Angle

§

impl Unpin for Angle

§

impl UnwindSafe for Angle

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, diff --git a/main/funnybones/struct.Bone.html b/main/funnybones/struct.Bone.html index e60cb04..f1da249 100644 --- a/main/funnybones/struct.Bone.html +++ b/main/funnybones/struct.Bone.html @@ -1,23 +1,23 @@ -Bone in funnybones - Rust

Struct funnybones::Bone

source ·
pub struct Bone { /* private fields */ }
Expand description

A bone in a Skeleton.

-

Implementations§

source§

impl Bone

source

pub const fn id(&self) -> BoneId

Returns the unique id of this bone.

-
source

pub const fn is_root(&self) -> bool

Returns true if this bone is the root of the skeleton.

-
source

pub const fn kind(&self) -> &BoneKind

Returns the kind of this bone.

-
source

pub fn kind_mut(&mut self) -> &mut BoneKind

Returns an exclusive reference to the kind of this bone.

-
source

pub fn set_desired_end(&mut self, end: Option<Vector>)

Sets a relative position to aim the end of this bone towards.

+Bone in funnybones - Rust

Struct funnybones::Bone

source ·
pub struct Bone { /* private fields */ }
Expand description

A bone in a Skeleton.

+

Implementations§

source§

impl Bone

source

pub const fn id(&self) -> BoneId

Returns the unique id of this bone.

+
source

pub const fn is_root(&self) -> bool

Returns true if this bone is the root of the skeleton.

+
source

pub const fn kind(&self) -> &BoneKind

Returns the kind of this bone.

+
source

pub fn kind_mut(&mut self) -> &mut BoneKind

Returns an exclusive reference to the kind of this bone.

+
source

pub fn set_desired_end(&mut self, end: Option<Vector>)

Sets a relative position to aim the end of this bone towards.

The end of the bone that is aimed is the end that is furthest from the root of the skeleton.

This setting only impacts BoneKind::Jointed bones.

-
source

pub const fn desired_end(&self) -> Option<Vector>

Returns the location this bone is being aimed towards.

-
source

pub const fn entry_angle(&self) -> Rotation

Returns the angle of the previous bone segment connecting to this bone.

-
source

pub const fn start(&self) -> Coordinate

Returns the solved start position of this bone.

-
source

pub const fn end(&self) -> Coordinate

Returns the solved end position of this bone.

-
source

pub fn final_vector(&self) -> Vector

Returns a vector representing the final segment in this bone.

-
source

pub const fn solved_joint(&self) -> Option<Coordinate>

If this is a BoneKind::Jointed bone, returns the solved position of +

source

pub const fn desired_end(&self) -> Option<Vector>

Returns the location this bone is being aimed towards.

+
source

pub const fn entry_angle(&self) -> Rotation

Returns the angle of the previous bone segment connecting to this bone.

+
source

pub const fn start(&self) -> Coordinate

Returns the solved start position of this bone.

+
source

pub const fn end(&self) -> Coordinate

Returns the solved end position of this bone.

+
source

pub fn final_vector(&self) -> Vector

Returns a vector representing the final segment in this bone.

+
source

pub const fn solved_joint(&self) -> Option<Coordinate>

If this is a BoneKind::Jointed bone, returns the solved position of the joint.

-
source

pub fn label(&self) -> &str

Returns the label this bone was created with.

-

Trait Implementations§

source§

impl Debug for Bone

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl PartialEq for Bone

source§

fn eq(&self, other: &Bone) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +
source

pub fn label(&self) -> &str

Returns the label this bone was created with.

+

Trait Implementations§

source§

impl Debug for Bone

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl PartialEq for Bone

source§

fn eq(&self, other: &Bone) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl Serialize for Bone

source§

fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where - S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl StructuralPartialEq for Bone

Auto Trait Implementations§

§

impl Freeze for Bone

§

impl RefUnwindSafe for Bone

§

impl Send for Bone

§

impl Sync for Bone

§

impl Unpin for Bone

§

impl UnwindSafe for Bone

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where + S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl StructuralPartialEq for Bone

Auto Trait Implementations§

§

impl Freeze for Bone

§

impl RefUnwindSafe for Bone

§

impl Send for Bone

§

impl Sync for Bone

§

impl Unpin for Bone

§

impl UnwindSafe for Bone

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, diff --git a/main/funnybones/struct.BoneAxis.html b/main/funnybones/struct.BoneAxis.html index e18c657..d209bc5 100644 --- a/main/funnybones/struct.BoneAxis.html +++ b/main/funnybones/struct.BoneAxis.html @@ -1,16 +1,16 @@ -BoneAxis in funnybones - Rust

Struct funnybones::BoneAxis

source ·
pub struct BoneAxis {
+BoneAxis in funnybones - Rust

Struct funnybones::BoneAxis

source ·
pub struct BoneAxis {
     pub bone: BoneId,
     pub end: BoneEnd,
 }
Expand description

A specific end of a specific bone.

Fields§

§bone: BoneId

The unique id of the bone of this axis.

§end: BoneEnd

The end of the bone being referenced.

-

Implementations§

source§

impl BoneAxis

source

pub const fn inverse(self) -> Self

Returns the opposite axis on the same bone.

-

Trait Implementations§

source§

impl Clone for BoneAxis

source§

fn clone(&self) -> BoneAxis

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for BoneAxis

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for BoneAxis

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where - __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Hash for BoneAxis

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where +

Implementations§

source§

impl BoneAxis

source

pub const fn inverse(self) -> Self

Returns the opposite axis on the same bone.

+

Trait Implementations§

source§

impl Clone for BoneAxis

source§

fn clone(&self) -> BoneAxis

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for BoneAxis

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for BoneAxis

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Hash for BoneAxis

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, - Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq for BoneAxis

source§

fn eq(&self, other: &BoneAxis) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, -and should not be overridden without very good reason.
source§

impl Serialize for BoneAxis

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where - __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for BoneAxis

source§

impl Eq for BoneAxis

source§

impl StructuralPartialEq for BoneAxis

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq for BoneAxis

source§

fn eq(&self, other: &BoneAxis) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
source§

impl Serialize for BoneAxis

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for BoneAxis

source§

impl Eq for BoneAxis

source§

impl StructuralPartialEq for BoneAxis

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, diff --git a/main/funnybones/struct.BoneId.html b/main/funnybones/struct.BoneId.html index 37b2cfb..f4cf550 100644 --- a/main/funnybones/struct.BoneId.html +++ b/main/funnybones/struct.BoneId.html @@ -1,19 +1,19 @@ -BoneId in funnybones - Rust

Struct funnybones::BoneId

source ·
pub struct BoneId(/* private fields */);
Expand description

The unique ID of a Bone in a Skeleton.

-

Implementations§

source§

impl BoneId

source

pub const fn axis_a(self) -> BoneAxis

Returns the first axis of this bone.

-
source

pub const fn axis_b(self) -> BoneAxis

Returns the second axis of this bone.

-
source

pub fn index(self) -> usize

Returns the index of this bone within the skeleton.

-

Trait Implementations§

source§

impl Clone for BoneId

source§

fn clone(&self) -> BoneId

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for BoneId

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for BoneId

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where - __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Hash for BoneId

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where +BoneId in funnybones - Rust

Struct funnybones::BoneId

source ·
pub struct BoneId(/* private fields */);
Expand description

The unique ID of a Bone in a Skeleton.

+

Implementations§

source§

impl BoneId

source

pub const fn axis_a(self) -> BoneAxis

Returns the first axis of this bone.

+
source

pub const fn axis_b(self) -> BoneAxis

Returns the second axis of this bone.

+
source

pub fn index(self) -> usize

Returns the index of this bone within the skeleton.

+

Trait Implementations§

source§

impl Clone for BoneId

source§

fn clone(&self) -> BoneId

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for BoneId

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for BoneId

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Hash for BoneId

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, - Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl Index<BoneId> for Skeleton

source§

type Output = Bone

The returned type after indexing.
source§

fn index(&self, index: BoneId) -> &Self::Output

Performs the indexing (container[index]) operation. Read more
source§

impl IndexMut<BoneId> for Skeleton

source§

fn index_mut(&mut self, index: BoneId) -> &mut Self::Output

Performs the mutable indexing (container[index]) operation. Read more
source§

impl Ord for BoneId

source§

fn cmp(&self, other: &BoneId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl Index<BoneId> for Skeleton

source§

type Output = Bone

The returned type after indexing.
source§

fn index(&self, index: BoneId) -> &Self::Output

Performs the indexing (container[index]) operation. Read more
source§

impl IndexMut<BoneId> for Skeleton

source§

fn index_mut(&mut self, index: BoneId) -> &mut Self::Output

Performs the mutable indexing (container[index]) operation. Read more
source§

impl Ord for BoneId

source§

fn cmp(&self, other: &BoneId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Self
where Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Self
where Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Self
where - Self: Sized + PartialOrd,

Restrict a value to a certain interval. Read more
source§

impl PartialEq for BoneId

source§

fn eq(&self, other: &BoneId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, -and should not be overridden without very good reason.
source§

impl PartialOrd for BoneId

source§

fn partial_cmp(&self, other: &BoneId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the + Self: Sized + PartialOrd,

Restrict a value to a certain interval. Read more
source§

impl PartialEq for BoneId

source§

fn eq(&self, other: &BoneId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
source§

impl PartialOrd for BoneId

source§

fn partial_cmp(&self, other: &BoneId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by -the >= operator. Read more
source§

impl Serialize for BoneId

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where - __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for BoneId

source§

impl Eq for BoneId

source§

impl StructuralPartialEq for BoneId

Auto Trait Implementations§

§

impl Freeze for BoneId

§

impl RefUnwindSafe for BoneId

§

impl Send for BoneId

§

impl Sync for BoneId

§

impl Unpin for BoneId

§

impl UnwindSafe for BoneId

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where +the >= operator. Read more

source§

impl Serialize for BoneId

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for BoneId

source§

impl Eq for BoneId

source§

impl StructuralPartialEq for BoneId

Auto Trait Implementations§

§

impl Freeze for BoneId

§

impl RefUnwindSafe for BoneId

§

impl Send for BoneId

§

impl Sync for BoneId

§

impl Unpin for BoneId

§

impl UnwindSafe for BoneId

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, diff --git a/main/funnybones/struct.Coordinate.html b/main/funnybones/struct.Coordinate.html index 83b4cf4..e431230 100644 --- a/main/funnybones/struct.Coordinate.html +++ b/main/funnybones/struct.Coordinate.html @@ -1,22 +1,22 @@ -Coordinate in funnybones - Rust

Struct funnybones::Coordinate

source ·
pub struct Coordinate {
+Coordinate in funnybones - Rust

Struct funnybones::Coordinate

source ·
pub struct Coordinate {
     pub x: f32,
     pub y: f32,
 }
Expand description

A two dimensionsional offset/measurement.

Fields§

§x: f32

The x-axis component of this vector.

§y: f32

The y-axis component of this vector.

-

Implementations§

source§

impl Coordinate

source

pub const fn new(x: f32, y: f32) -> Self

Returns a new vector from the x and y values.

-
source

pub fn magnitude(&self) -> f32

Returns the magnitude of this vector.

-
source

pub fn map(self, f: impl FnMut(f32) -> f32) -> Self

Returns the result of mapping x and y to f.

-
source

pub fn as_rotation(self) -> Rotation

Returns the angle formed a line passing through 0,0 towards this vector.

-
source

pub fn vector_to(self, other: Coordinate) -> Vector

Returns a vector pointing from self to other.

-

Trait Implementations§

source§

impl Add<Vector> for Coordinate

source§

type Output = Coordinate

The resulting type after applying the + operator.
source§

fn add(self, rhs: Vector) -> Self::Output

Performs the + operation. Read more
source§

impl Add for Coordinate

source§

type Output = Coordinate

The resulting type after applying the + operator.
source§

fn add(self, rhs: Self) -> Self::Output

Performs the + operation. Read more
source§

impl Clone for Coordinate

source§

fn clone(&self) -> Coordinate

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Coordinate

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for Coordinate

source§

fn default() -> Coordinate

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for Coordinate

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where - __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Div<f32> for Coordinate

source§

type Output = Coordinate

The resulting type after applying the / operator.
source§

fn div(self, rhs: f32) -> Self::Output

Performs the / operation. Read more
source§

impl From<Coordinate> for Vector

source§

fn from(pt: Coordinate) -> Self

Converts to this type from the input type.
source§

impl From<Vector> for Coordinate

source§

fn from(vec: Vector) -> Self

Converts to this type from the input type.
source§

impl FromComponents<f32> for Coordinate

source§

fn from_components(components: (f32, f32)) -> Self

Returns a new instance from the 2d vector components provided.
§

fn from_vec<Type>(other: Type) -> Self
where +

Implementations§

source§

impl Coordinate

source

pub const fn new(x: f32, y: f32) -> Self

Returns a new vector from the x and y values.

+
source

pub fn magnitude(&self) -> f32

Returns the magnitude of this vector.

+
source

pub fn map(self, f: impl FnMut(f32) -> f32) -> Self

Returns the result of mapping x and y to f.

+
source

pub fn as_rotation(self) -> Rotation

Returns the angle formed a line passing through 0,0 towards this vector.

+
source

pub fn vector_to(self, other: Coordinate) -> Vector

Returns a vector pointing from self to other.

+

Trait Implementations§

source§

impl Add<Vector> for Coordinate

source§

type Output = Coordinate

The resulting type after applying the + operator.
source§

fn add(self, rhs: Vector) -> Self::Output

Performs the + operation. Read more
source§

impl Add for Coordinate

source§

type Output = Coordinate

The resulting type after applying the + operator.
source§

fn add(self, rhs: Self) -> Self::Output

Performs the + operation. Read more
source§

impl Clone for Coordinate

source§

fn clone(&self) -> Coordinate

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Coordinate

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for Coordinate

source§

fn default() -> Coordinate

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for Coordinate

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Div<f32> for Coordinate

source§

type Output = Coordinate

The resulting type after applying the / operator.
source§

fn div(self, rhs: f32) -> Self::Output

Performs the / operation. Read more
source§

impl From<Coordinate> for Vector

source§

fn from(pt: Coordinate) -> Self

Converts to this type from the input type.
source§

impl From<Vector> for Coordinate

source§

fn from(vec: Vector) -> Self

Converts to this type from the input type.
source§

impl FromComponents<f32> for Coordinate

source§

fn from_components(components: (f32, f32)) -> Self

Returns a new instance from the 2d vector components provided.
§

fn from_vec<Type>(other: Type) -> Self
where Type: IntoComponents<Unit>,

Converts this type to another type using [FromComponents] and [IntoComponents].
source§

impl IntoComponents<f32> for Coordinate

source§

fn into_components(self) -> (f32, f32)

Extracts this type’s 2d vector components.
§

fn to_vec<Type>(self) -> Type
where Type: FromComponents<Unit>,

Converts this type to another type using [FromComponents] and -[IntoComponents].
source§

impl Mul<f32> for Coordinate

source§

type Output = Coordinate

The resulting type after applying the * operator.
source§

fn mul(self, rhs: f32) -> Self::Output

Performs the * operation. Read more
source§

impl PartialEq for Coordinate

source§

fn eq(&self, other: &Coordinate) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, -and should not be overridden without very good reason.
source§

impl Serialize for Coordinate

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where - __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Sub<Vector> for Coordinate

source§

type Output = Coordinate

The resulting type after applying the - operator.
source§

fn sub(self, rhs: Vector) -> Self::Output

Performs the - operation. Read more
source§

impl Sub for Coordinate

source§

type Output = Coordinate

The resulting type after applying the - operator.
source§

fn sub(self, rhs: Self) -> Self::Output

Performs the - operation. Read more
source§

impl Copy for Coordinate

source§

impl StructuralPartialEq for Coordinate

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where +[IntoComponents].

source§

impl Mul<f32> for Coordinate

source§

type Output = Coordinate

The resulting type after applying the * operator.
source§

fn mul(self, rhs: f32) -> Self::Output

Performs the * operation. Read more
source§

impl PartialEq for Coordinate

source§

fn eq(&self, other: &Coordinate) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
source§

impl Serialize for Coordinate

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Sub<Vector> for Coordinate

source§

type Output = Coordinate

The resulting type after applying the - operator.
source§

fn sub(self, rhs: Vector) -> Self::Output

Performs the - operation. Read more
source§

impl Sub for Coordinate

source§

type Output = Coordinate

The resulting type after applying the - operator.
source§

fn sub(self, rhs: Self) -> Self::Output

Performs the - operation. Read more
source§

impl Copy for Coordinate

source§

impl StructuralPartialEq for Coordinate

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, diff --git a/main/funnybones/struct.Joint.html b/main/funnybones/struct.Joint.html index e937ed6..f74d19f 100644 --- a/main/funnybones/struct.Joint.html +++ b/main/funnybones/struct.Joint.html @@ -1,20 +1,20 @@ -Joint in funnybones - Rust

Struct funnybones::Joint

source ·
pub struct Joint { /* private fields */ }
Expand description

A connection between two bones.

-

Implementations§

source§

impl Joint

source

pub const fn id(&self) -> JointId

Returns the unique id of this joint.

-
source

pub const fn new(angle: Rotation, bone_a: BoneAxis, bone_b: BoneAxis) -> Self

Returns a new joint formed by joining bone_a and bone_b at angle.

-
source

pub fn with_label(self, label: impl Into<String>) -> Self

Labels this joint and returns self.

-
source

pub fn label(&self) -> &str

Returns the label of this joint.

-
source

pub fn other_axis(&self, axis: BoneAxis) -> BoneAxis

Given axis is one of the two connections in this joint, return the +Joint in funnybones - Rust

Struct funnybones::Joint

source ·
pub struct Joint { /* private fields */ }
Expand description

A connection between two bones.

+

Implementations§

source§

impl Joint

source

pub const fn id(&self) -> JointId

Returns the unique id of this joint.

+
source

pub const fn new(angle: Rotation, bone_a: BoneAxis, bone_b: BoneAxis) -> Self

Returns a new joint formed by joining bone_a and bone_b at angle.

+
source

pub fn with_label(self, label: impl Into<String>) -> Self

Labels this joint and returns self.

+
source

pub fn label(&self) -> &str

Returns the label of this joint.

+
source

pub fn other_axis(&self, axis: BoneAxis) -> BoneAxis

Given axis is one of the two connections in this joint, return the other axis.

§Panics

This function has a debug assertion that ensures that axis is one of the bones in this joint.

-
source

pub fn set_angle(&mut self, angle: Rotation)

Sets the angle to form between these joints.

+
source

pub fn set_angle(&mut self, angle: Rotation)

Sets the angle to form between these joints.

This setting is ignored if the bone furthest from the root of the joint is a BoneKind::Jointed bone.

-
source

pub const fn angle(&self) -> Rotation

Returns the rotation of this joint.

-

Trait Implementations§

source§

impl Debug for Joint

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl PartialEq for Joint

source§

fn eq(&self, other: &Joint) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +
source

pub const fn angle(&self) -> Rotation

Returns the rotation of this joint.

+

Trait Implementations§

source§

impl Debug for Joint

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl PartialEq for Joint

source§

fn eq(&self, other: &Joint) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl Serialize for Joint

source§

fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where - S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl StructuralPartialEq for Joint

Auto Trait Implementations§

§

impl Freeze for Joint

§

impl RefUnwindSafe for Joint

§

impl Send for Joint

§

impl Sync for Joint

§

impl Unpin for Joint

§

impl UnwindSafe for Joint

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where + S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl StructuralPartialEq for Joint

Auto Trait Implementations§

§

impl Freeze for Joint

§

impl RefUnwindSafe for Joint

§

impl Send for Joint

§

impl Sync for Joint

§

impl Unpin for Joint

§

impl UnwindSafe for Joint

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, diff --git a/main/funnybones/struct.JointId.html b/main/funnybones/struct.JointId.html index afdd0bb..01ff73d 100644 --- a/main/funnybones/struct.JointId.html +++ b/main/funnybones/struct.JointId.html @@ -1,17 +1,17 @@ -JointId in funnybones - Rust

Struct funnybones::JointId

source ·
pub struct JointId(/* private fields */);
Expand description

The unique ID of a Joint in a Skeleton.

-

Implementations§

source§

impl JointId

source

pub fn index(self) -> usize

Returns the index of this joint within the skeleton.

-

Trait Implementations§

source§

impl Clone for JointId

source§

fn clone(&self) -> JointId

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for JointId

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for JointId

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where - __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Hash for JointId

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where +JointId in funnybones - Rust

Struct funnybones::JointId

source ·
pub struct JointId(/* private fields */);
Expand description

The unique ID of a Joint in a Skeleton.

+

Implementations§

source§

impl JointId

source

pub fn index(self) -> usize

Returns the index of this joint within the skeleton.

+

Trait Implementations§

source§

impl Clone for JointId

source§

fn clone(&self) -> JointId

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for JointId

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for JointId

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Hash for JointId

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, - Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl Index<JointId> for Skeleton

source§

type Output = Joint

The returned type after indexing.
source§

fn index(&self, index: JointId) -> &Self::Output

Performs the indexing (container[index]) operation. Read more
source§

impl IndexMut<JointId> for Skeleton

source§

fn index_mut(&mut self, index: JointId) -> &mut Self::Output

Performs the mutable indexing (container[index]) operation. Read more
source§

impl Ord for JointId

source§

fn cmp(&self, other: &JointId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl Index<JointId> for Skeleton

source§

type Output = Joint

The returned type after indexing.
source§

fn index(&self, index: JointId) -> &Self::Output

Performs the indexing (container[index]) operation. Read more
source§

impl IndexMut<JointId> for Skeleton

source§

fn index_mut(&mut self, index: JointId) -> &mut Self::Output

Performs the mutable indexing (container[index]) operation. Read more
source§

impl Ord for JointId

source§

fn cmp(&self, other: &JointId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Self
where Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Self
where Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Self
where - Self: Sized + PartialOrd,

Restrict a value to a certain interval. Read more
source§

impl PartialEq for JointId

source§

fn eq(&self, other: &JointId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, -and should not be overridden without very good reason.
source§

impl PartialOrd for JointId

source§

fn partial_cmp(&self, other: &JointId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the + Self: Sized + PartialOrd,

Restrict a value to a certain interval. Read more
source§

impl PartialEq for JointId

source§

fn eq(&self, other: &JointId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
source§

impl PartialOrd for JointId

source§

fn partial_cmp(&self, other: &JointId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by -the >= operator. Read more
source§

impl Serialize for JointId

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where - __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for JointId

source§

impl Eq for JointId

source§

impl StructuralPartialEq for JointId

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where +the >= operator. Read more

source§

impl Serialize for JointId

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for JointId

source§

impl Eq for JointId

source§

impl StructuralPartialEq for JointId

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, diff --git a/main/funnybones/struct.LabeledBoneKind.html b/main/funnybones/struct.LabeledBoneKind.html index c0e0514..dc76fc6 100644 --- a/main/funnybones/struct.LabeledBoneKind.html +++ b/main/funnybones/struct.LabeledBoneKind.html @@ -1,10 +1,10 @@ -LabeledBoneKind in funnybones - Rust

Struct funnybones::LabeledBoneKind

source ·
pub struct LabeledBoneKind {
+LabeledBoneKind in funnybones - Rust

Struct funnybones::LabeledBoneKind

source ·
pub struct LabeledBoneKind {
     pub kind: BoneKind,
     pub label: String,
 }
Expand description

A BoneKind with an associated label.

Fields§

§kind: BoneKind

The bone to create.

§label: String

The label of the bone.

-

Trait Implementations§

source§

impl From<BoneKind> for LabeledBoneKind

source§

fn from(kind: BoneKind) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where +

Trait Implementations§

source§

impl From<BoneKind> for LabeledBoneKind

source§

fn from(kind: BoneKind) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, diff --git a/main/funnybones/struct.Rotation.html b/main/funnybones/struct.Rotation.html index b3eb356..7ff3be6 100644 --- a/main/funnybones/struct.Rotation.html +++ b/main/funnybones/struct.Rotation.html @@ -1,18 +1,18 @@ -Rotation in funnybones - Rust

Struct funnybones::Rotation

source ·
pub struct Rotation { /* private fields */ }
Expand description

A value representing a rotation in 2d space.

-

Implementations§

source§

impl Rotation

source

pub const fn radians(radians: f32) -> Self

Returns a rotation representing the given radians.

-
source

pub fn degrees(degrees: f32) -> Self

Returns a rotation representing the given degrees.

-
source

pub fn to_degrees(self) -> f32

Returns this rotation represented in degrees.

-
source

pub const fn to_radians(self) -> f32

Returns this rotation represented in radians.

-
source

pub fn clamped(self) -> Self

Returns this angle constrained between 0 and .

-
source

pub fn cos(self) -> f32

Returns the cosine of this angle.

-
source

pub fn sin(self) -> f32

Returns the sine of this angle.

-

Trait Implementations§

source§

impl Add<Rotation> for Vector

source§

type Output = Vector

The resulting type after applying the + operator.
source§

fn add(self, rhs: Rotation) -> Self::Output

Performs the + operation. Read more
source§

impl Add for Rotation

source§

type Output = Rotation

The resulting type after applying the + operator.
source§

fn add(self, rhs: Self) -> Self::Output

Performs the + operation. Read more
source§

impl AddAssign for Rotation

source§

fn add_assign(&mut self, rhs: Self)

Performs the += operation. Read more
source§

impl Clone for Rotation

source§

fn clone(&self) -> Rotation

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Rotation

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for Rotation

source§

fn default() -> Self

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for Rotation

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where - __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for Rotation

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl From<Angle> for Rotation

source§

fn from(value: Angle) -> Self

Converts to this type from the input type.
source§

impl From<Rotation> for Angle

source§

fn from(value: Rotation) -> Self

Converts to this type from the input type.
source§

impl LinearInterpolate for Rotation

source§

fn lerp(&self, target: &Self, percent: f32) -> Self

Interpolate linearly between self and target using percent.
source§

impl Neg for Rotation

source§

type Output = Rotation

The resulting type after applying the - operator.
source§

fn neg(self) -> Self::Output

Performs the unary - operation. Read more
source§

impl PartialEq for Rotation

source§

fn eq(&self, other: &Rotation) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, -and should not be overridden without very good reason.
source§

impl PartialOrd for Rotation

source§

fn partial_cmp(&self, other: &Rotation) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +Rotation in funnybones - Rust

Struct funnybones::Rotation

source ·
pub struct Rotation { /* private fields */ }
Expand description

A value representing a rotation in 2d space.

+

Implementations§

source§

impl Rotation

source

pub const fn radians(radians: f32) -> Self

Returns a rotation representing the given radians.

+
source

pub fn degrees(degrees: f32) -> Self

Returns a rotation representing the given degrees.

+
source

pub fn to_degrees(self) -> f32

Returns this rotation represented in degrees.

+
source

pub const fn to_radians(self) -> f32

Returns this rotation represented in radians.

+
source

pub fn clamped(self) -> Self

Returns this angle constrained between 0 and .

+
source

pub fn cos(self) -> f32

Returns the cosine of this angle.

+
source

pub fn sin(self) -> f32

Returns the sine of this angle.

+

Trait Implementations§

source§

impl Add<Rotation> for Vector

source§

type Output = Vector

The resulting type after applying the + operator.
source§

fn add(self, rhs: Rotation) -> Self::Output

Performs the + operation. Read more
source§

impl Add for Rotation

source§

type Output = Rotation

The resulting type after applying the + operator.
source§

fn add(self, rhs: Self) -> Self::Output

Performs the + operation. Read more
source§

impl AddAssign for Rotation

source§

fn add_assign(&mut self, rhs: Self)

Performs the += operation. Read more
source§

impl Clone for Rotation

source§

fn clone(&self) -> Rotation

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Rotation

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for Rotation

source§

fn default() -> Self

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for Rotation

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for Rotation

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl From<Angle> for Rotation

source§

fn from(value: Angle) -> Self

Converts to this type from the input type.
source§

impl From<Rotation> for Angle

source§

fn from(value: Rotation) -> Self

Converts to this type from the input type.
source§

impl LinearInterpolate for Rotation

source§

fn lerp(&self, target: &Self, percent: f32) -> Self

Interpolate linearly between self and target using percent.
source§

impl Neg for Rotation

source§

type Output = Rotation

The resulting type after applying the - operator.
source§

fn neg(self) -> Self::Output

Performs the unary - operation. Read more
source§

impl PartialEq for Rotation

source§

fn eq(&self, other: &Rotation) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
source§

impl PartialOrd for Rotation

source§

fn partial_cmp(&self, other: &Rotation) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by -the >= operator. Read more
source§

impl PercentBetween for Rotation

source§

fn percent_between(&self, min: &Self, max: &Self) -> ZeroToOne

Return the percentage that self is between min and max.
source§

impl Serialize for Rotation

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where - __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Sub<Rotation> for Vector

source§

type Output = Vector

The resulting type after applying the - operator.
source§

fn sub(self, rhs: Rotation) -> Self::Output

Performs the - operation. Read more
source§

impl Sub for Rotation

source§

type Output = Rotation

The resulting type after applying the - operator.
source§

fn sub(self, rhs: Self) -> Self::Output

Performs the - operation. Read more
source§

impl SubAssign for Rotation

source§

fn sub_assign(&mut self, rhs: Self)

Performs the -= operation. Read more
source§

impl Copy for Rotation

source§

impl StructuralPartialEq for Rotation

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where +the >= operator. Read more

source§

impl PercentBetween for Rotation

source§

fn percent_between(&self, min: &Self, max: &Self) -> ZeroToOne

Return the percentage that self is between min and max.
source§

impl Serialize for Rotation

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Sub<Rotation> for Vector

source§

type Output = Vector

The resulting type after applying the - operator.
source§

fn sub(self, rhs: Rotation) -> Self::Output

Performs the - operation. Read more
source§

impl Sub for Rotation

source§

type Output = Rotation

The resulting type after applying the - operator.
source§

fn sub(self, rhs: Self) -> Self::Output

Performs the - operation. Read more
source§

impl SubAssign for Rotation

source§

fn sub_assign(&mut self, rhs: Self)

Performs the -= operation. Read more
source§

impl Copy for Rotation

source§

impl StructuralPartialEq for Rotation

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, diff --git a/main/funnybones/struct.Skeleton.html b/main/funnybones/struct.Skeleton.html index 0c3855a..88d98a3 100644 --- a/main/funnybones/struct.Skeleton.html +++ b/main/funnybones/struct.Skeleton.html @@ -1,32 +1,32 @@ -Skeleton in funnybones - Rust

Struct funnybones::Skeleton

source ·
pub struct Skeleton { /* private fields */ }
Expand description

A collection of Bones. connected by Joints.

-

Implementations§

source§

impl Skeleton

source

pub fn push_bone(&mut self, bone: impl Into<LabeledBoneKind>) -> BoneId

Creates a new Bone into the skeleton. Returns the unique id of the +Skeleton in funnybones - Rust

Struct funnybones::Skeleton

source ·
pub struct Skeleton { /* private fields */ }
Expand description

A collection of Bones. connected by Joints.

+

Implementations§

source§

impl Skeleton

source

pub fn push_bone(&mut self, bone: impl Into<LabeledBoneKind>) -> BoneId

Creates a new Bone into the skeleton. Returns the unique id of the created bone.

The first bone pushed is considered the root of the skeleton. All other bones must be connected to the root directly or indirectly through Joints.

-
source

pub fn bones(&self) -> &[Bone]

Returns the list of bones in this skeleton.

-
source

pub fn joints(&self) -> &[Joint]

Returns the list of joints in this skeleton.

-
source

pub fn bone(&self, id: BoneId) -> Option<&Bone>

Returns the bone for a given id, or none if not found.

-
source

pub fn bone_mut(&mut self, id: BoneId) -> Option<&mut Bone>

Returns an exclusive reference to the bone for a given id, or none if +

source

pub fn bones(&self) -> &[Bone]

Returns the list of bones in this skeleton.

+
source

pub fn joints(&self) -> &[Joint]

Returns the list of joints in this skeleton.

+
source

pub fn bone(&self, id: BoneId) -> Option<&Bone>

Returns the bone for a given id, or none if not found.

+
source

pub fn bone_mut(&mut self, id: BoneId) -> Option<&mut Bone>

Returns an exclusive reference to the bone for a given id, or none if not found.

-
source

pub fn joint(&self, id: JointId) -> Option<&Joint>

Returns the joint for a given id, or none if not found.

-
source

pub fn joint_mut(&mut self, id: JointId) -> Option<&mut Joint>

Returns an exclusive reference to the joint for a given id, or none if +

source

pub fn joint(&self, id: JointId) -> Option<&Joint>

Returns the joint for a given id, or none if not found.

+
source

pub fn joint_mut(&mut self, id: JointId) -> Option<&mut Joint>

Returns an exclusive reference to the joint for a given id, or none if not found.

-
source

pub fn connections_to(&self, axis: BoneAxis) -> Option<&[JointId]>

Returns a list of joints connected to a specific bone axis.

-
source

pub fn push_joint(&mut self, joint: Joint) -> JointId

Creates a new Joint in the skeleton, connecting two bones together +

source

pub fn connections_to(&self, axis: BoneAxis) -> Option<&[JointId]>

Returns a list of joints connected to a specific bone axis.

+
source

pub fn push_joint(&mut self, joint: Joint) -> JointId

Creates a new Joint in the skeleton, connecting two bones together by their axis. Returns the unique id of the created joint.

-
source

pub fn find_joint_by_label(&self, label: &str) -> Option<JointId>

Finds an existing Joint by its label.

-
source

pub fn find_bone_by_label(&self, label: &str) -> Option<BoneId>

Finds an existing Bone by its label.

-
source

pub fn set_translation(&mut self, translation: Coordinate)

Sets a translation to be applied to the entire skeleton.

-
source

pub fn translation(&self) -> Coordinate

Returns the translation applied to the entire skeleton.

-
source

pub fn set_rotation(&mut self, rotation: Rotation)

Sets a base rotation to apply to the entire skeleton.

-
source

pub const fn rotation(&self) -> Rotation

Returns the base rotation being applied to the entire skeleton.

-
source

pub fn solve(&mut self)

Updates the solved positions of all bones in this skeleton that are +

source

pub fn find_joint_by_label(&self, label: &str) -> Option<JointId>

Finds an existing Joint by its label.

+
source

pub fn find_bone_by_label(&self, label: &str) -> Option<BoneId>

Finds an existing Bone by its label.

+
source

pub fn set_translation(&mut self, translation: Coordinate)

Sets a translation to be applied to the entire skeleton.

+
source

pub fn translation(&self) -> Coordinate

Returns the translation applied to the entire skeleton.

+
source

pub fn set_rotation(&mut self, rotation: Rotation)

Sets a base rotation to apply to the entire skeleton.

+
source

pub const fn rotation(&self) -> Rotation

Returns the base rotation being applied to the entire skeleton.

+
source

pub fn solve(&mut self)

Updates the solved positions of all bones in this skeleton that are connected either directly or indirectly to the root bone via Joints.

-

Trait Implementations§

source§

impl Debug for Skeleton

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for Skeleton

source§

fn default() -> Skeleton

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for Skeleton

source§

fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where - D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Index<BoneId> for Skeleton

source§

type Output = Bone

The returned type after indexing.
source§

fn index(&self, index: BoneId) -> &Self::Output

Performs the indexing (container[index]) operation. Read more
source§

impl Index<JointId> for Skeleton

source§

type Output = Joint

The returned type after indexing.
source§

fn index(&self, index: JointId) -> &Self::Output

Performs the indexing (container[index]) operation. Read more
source§

impl IndexMut<BoneId> for Skeleton

source§

fn index_mut(&mut self, index: BoneId) -> &mut Self::Output

Performs the mutable indexing (container[index]) operation. Read more
source§

impl IndexMut<JointId> for Skeleton

source§

fn index_mut(&mut self, index: JointId) -> &mut Self::Output

Performs the mutable indexing (container[index]) operation. Read more
source§

impl PartialEq for Skeleton

source§

fn eq(&self, other: &Skeleton) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +

Trait Implementations§

source§

impl Debug for Skeleton

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for Skeleton

source§

fn default() -> Skeleton

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for Skeleton

source§

fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where + D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Index<BoneId> for Skeleton

source§

type Output = Bone

The returned type after indexing.
source§

fn index(&self, index: BoneId) -> &Self::Output

Performs the indexing (container[index]) operation. Read more
source§

impl Index<JointId> for Skeleton

source§

type Output = Joint

The returned type after indexing.
source§

fn index(&self, index: JointId) -> &Self::Output

Performs the indexing (container[index]) operation. Read more
source§

impl IndexMut<BoneId> for Skeleton

source§

fn index_mut(&mut self, index: BoneId) -> &mut Self::Output

Performs the mutable indexing (container[index]) operation. Read more
source§

impl IndexMut<JointId> for Skeleton

source§

fn index_mut(&mut self, index: JointId) -> &mut Self::Output

Performs the mutable indexing (container[index]) operation. Read more
source§

impl PartialEq for Skeleton

source§

fn eq(&self, other: &Skeleton) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl Serialize for Skeleton

source§

fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where - S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl StructuralPartialEq for Skeleton

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where + S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl StructuralPartialEq for Skeleton

Auto Trait Implementations§

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, diff --git a/main/funnybones/struct.Vector.html b/main/funnybones/struct.Vector.html index 78b75cb..b733cfc 100644 --- a/main/funnybones/struct.Vector.html +++ b/main/funnybones/struct.Vector.html @@ -1,14 +1,14 @@ -Vector in funnybones - Rust

Struct funnybones::Vector

source ·
pub struct Vector {
+Vector in funnybones - Rust

Struct funnybones::Vector

source ·
pub struct Vector {
     pub magnitude: f32,
     pub direction: Rotation,
 }
Expand description

A 2D Euclidean vector.

Fields§

§magnitude: f32

The length of the vector.

§direction: Rotation

The direction the vector is heading.

-

Implementations§

source§

impl Vector

source

pub const fn new(magnitude: f32, direction: Rotation) -> Self

Returns a new vector for the given magnitude and direction.

-

Trait Implementations§

source§

impl Add<Rotation> for Vector

source§

type Output = Vector

The resulting type after applying the + operator.
source§

fn add(self, rhs: Rotation) -> Self::Output

Performs the + operation. Read more
source§

impl Add<Vector> for Coordinate

source§

type Output = Coordinate

The resulting type after applying the + operator.
source§

fn add(self, rhs: Vector) -> Self::Output

Performs the + operation. Read more
source§

impl Add for Vector

source§

type Output = Vector

The resulting type after applying the + operator.
source§

fn add(self, rhs: Vector) -> Self::Output

Performs the + operation. Read more
source§

impl Clone for Vector

source§

fn clone(&self) -> Vector

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Vector

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for Vector

source§

fn default() -> Vector

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for Vector

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where - __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl From<Coordinate> for Vector

source§

fn from(pt: Coordinate) -> Self

Converts to this type from the input type.
source§

impl From<Vector> for Coordinate

source§

fn from(vec: Vector) -> Self

Converts to this type from the input type.
source§

impl From<Vector> for Value

source§

fn from(value: Vector) -> Self

Converts to this type from the input type.
source§

impl LinearInterpolate for Vector

source§

fn lerp(&self, target: &Self, percent: f32) -> Self

Interpolate linearly between self and target using percent.
source§

impl PartialEq for Vector

source§

fn eq(&self, other: &Vector) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, -and should not be overridden without very good reason.
source§

impl Serialize for Vector

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where - __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Sub<Rotation> for Vector

source§

type Output = Vector

The resulting type after applying the - operator.
source§

fn sub(self, rhs: Rotation) -> Self::Output

Performs the - operation. Read more
source§

impl Sub<Vector> for Coordinate

source§

type Output = Coordinate

The resulting type after applying the - operator.
source§

fn sub(self, rhs: Vector) -> Self::Output

Performs the - operation. Read more
source§

impl Copy for Vector

source§

impl StructuralPartialEq for Vector

Auto Trait Implementations§

§

impl Freeze for Vector

§

impl RefUnwindSafe for Vector

§

impl Send for Vector

§

impl Sync for Vector

§

impl Unpin for Vector

§

impl UnwindSafe for Vector

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where +

Implementations§

source§

impl Vector

source

pub const fn new(magnitude: f32, direction: Rotation) -> Self

Returns a new vector for the given magnitude and direction.

+

Trait Implementations§

source§

impl Add<Rotation> for Vector

source§

type Output = Vector

The resulting type after applying the + operator.
source§

fn add(self, rhs: Rotation) -> Self::Output

Performs the + operation. Read more
source§

impl Add<Vector> for Coordinate

source§

type Output = Coordinate

The resulting type after applying the + operator.
source§

fn add(self, rhs: Vector) -> Self::Output

Performs the + operation. Read more
source§

impl Add for Vector

source§

type Output = Vector

The resulting type after applying the + operator.
source§

fn add(self, rhs: Vector) -> Self::Output

Performs the + operation. Read more
source§

impl Clone for Vector

source§

fn clone(&self) -> Vector

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Vector

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for Vector

source§

fn default() -> Vector

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for Vector

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl From<Coordinate> for Vector

source§

fn from(pt: Coordinate) -> Self

Converts to this type from the input type.
source§

impl From<Vector> for Coordinate

source§

fn from(vec: Vector) -> Self

Converts to this type from the input type.
source§

impl From<Vector> for Value

source§

fn from(value: Vector) -> Self

Converts to this type from the input type.
source§

impl LinearInterpolate for Vector

source§

fn lerp(&self, target: &Self, percent: f32) -> Self

Interpolate linearly between self and target using percent.
source§

impl PartialEq for Vector

source§

fn eq(&self, other: &Vector) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
source§

impl Serialize for Vector

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Sub<Rotation> for Vector

source§

type Output = Vector

The resulting type after applying the - operator.
source§

fn sub(self, rhs: Rotation) -> Self::Output

Performs the - operation. Read more
source§

impl Sub<Vector> for Coordinate

source§

type Output = Coordinate

The resulting type after applying the - operator.
source§

fn sub(self, rhs: Vector) -> Self::Output

Performs the - operation. Read more
source§

impl Copy for Vector

source§

impl StructuralPartialEq for Vector

Auto Trait Implementations§

§

impl Freeze for Vector

§

impl RefUnwindSafe for Vector

§

impl Send for Vector

§

impl Sync for Vector

§

impl Unpin for Vector

§

impl UnwindSafe for Vector

Blanket Implementations§

source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, diff --git a/main/search-index.js b/main/search-index.js index fb17446..f2b72eb 100644 --- a/main/search-index.js +++ b/main/search-index.js @@ -1,4 +1,4 @@ -var searchIndex = new Map(JSON.parse('[["FunnyBones",{"t":"FPPPGPGFFFOONNNNNNHNNNNNNNNNNNNNNNNNNNNNNNNNHHHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOHHNNHNOOHHNNHHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN","n":["EditingSkeleton","InvalidPath","Io","","ReadError","Rsn","SaveError","SerializedBone","SerializedSkeleton","SkeletalBone","a_bones","","adapt_into_using","","","","","","add_bones_to_skeleton","arrays_from","","","","","","arrays_into","","","","","","as_any","","","","","","as_any_mut","","","","","","as_bone_kind","bone_editor","bone_property_editor","bones_editor","borrow","","","","","","borrow_mut","","","","","","cam16_into_unclamped","","","","","","cast","","","","","","cast_into","","","","","","clone","","clone_into","","clone_to_uninit","","components_from","","","","","","connected_bones","","default","","deref","","","","","","deref_mut","","","","","","deserialize","","desired_length","","downcast","","","","","","drop","","","","","","eq","","find_bone","find_bone_in","find_joint","find_joint_in","fmt","","","","","","","","","","from","","","","","","","","","","","","","","from_angle","","","","","","from_cast","","","","","","from_stimulus","","","","","","init","","","","","","into","","","","","","into_angle","","","","","","into_any","","","","","","into_any_arc","","","","","","into_any_rc","","","","","","into_cam16_unclamped","","","","","","into_color","","","","","","into_color_unclamped","","","","","","into_read_only","","","","","","into_stimulus","","","","","","into_value","","","","","","","","","","","","inverse","","joint_angle","","joint_label","","joint_ratio","","jointed","","label","","length","","main","main_menu_window","null_value","","open_file","read_from","root","","save","save_as","serialize","","skeleton_editor","skeleton_window","to_owned","","to_smolstr","","to_string","","try_components_into","","","","","","try_from","","","","","","try_into","","","","","","try_into_color","","","","","","type_id","","","","","","uints_from","","","","","","uints_into","","","","","","upcast","","","","","","vzip","","","","","","write_to"],"q":[[0,"FunnyBones"],[336,"palette::chromatic_adaptation"],[337,"funnybones"],[338,"alloc::vec"],[339,"cushy::value"],[340,"core::any"],[341,"cushy::widget"],[342,"palette::cam16::parameters"],[343,"intentional::cast"],[344,"core::result"],[345,"serde::de"],[346,"core::option"],[347,"core::ops::control_flow"],[348,"core::fmt"],[349,"cushy::context"],[350,"std::io::error"],[351,"rsn::de"],[352,"tempfile::file"],[353,"alloc::boxed"],[354,"alloc::sync"],[355,"alloc::rc"],[356,"cushy"],[357,"cushy::window"],[358,"cushy::app"],[359,"std::path"],[360,"cushy::widgets::layers"],[361,"serde::ser"],[362,"smol_str"],[363,"alloc::string"],[364,"palette::convert::try_from_into_color"]],"i":"`DfD`1`0````BlBh1Cb341f`3145203145203145203145200```3145203145203145203145203145202020203145201020314520314520311031452031452020222231444555203311444555220031452031452031452031452031452031452031452031452031452031452031452031452031452031452033114455220010101010101010``20`232``31``2045453145203145203145203145203145203145203145203145203145202","f":"````````````{eg{}{{b{c}}}{}}00000{{d{l{{j{{h{f}}}}}}{l{nA`}}}Ab}{ce{}{}}00000{{}c{}}00000{l{{l{Ad}}}}00000{{{l{n}}}{{l{nAd}}}}00000{{{l{f}}}{{Aj{AfAh}}}}{{f{l{Al}}}{{`{An}}}}{{f{l{Al}}B`}{{`{An}}}}{{{l{Bb}}{l{{j{{h{f}}}}}}{l{Al}}}{{`{An}}}}{l{{l{c}}}{}}00000{{{l{n}}}{{l{nc}}}{}}00000{{{Bd{c}}}e{}{}}00000{{}e{}{{Bf{c}}}}00000::::::{{{l{Bh}}}Bh}{{{l{f}}}f}{{l{l{nc}}}Ab{}}0{lAb}0??????``{{}Bh}{{}f}{Bj{{l{c}}}{}}00000{Bj{{l{nc}}}{}}00000{c{{Bn{Bl}}}C`}{c{{Bn{Cb}}}C`}``======{BjAb}00000{{{l{Bh}}{l{Bh}}}B`}{{{l{f}}{l{f}}}B`}{{{l{Bh}}Cd}{{Cf{f}}}}{{{l{{j{{h{f}}}}}}Bj}{{Ch{fBj}}}}{{{l{Bh}}Cj}{{Cf{f}}}}1{{{l{Bl}}{l{nCl}}}Cn}{{{l{Cb}}{l{nCl}}}Cn}{{{l{D`}}{l{nCl}}}Cn}{{l{l{Db}}{l{nCl}}}{{Bn{AbDd}}}}1{{{l{Df}}{l{nCl}}}Cn}01{{{l{Bh}}{l{nCl}}}Cn}{{{l{f}}{l{nCl}}}Cn}{{{l{Bh}}}Bl}{cc{}}0{{{l{f}}}Cb}{DhD`}2{DjD`}3{DlDf}{DhDf}{BlBh}66{Cbf}777777777777{ce{}{}}00000{{}Bj}00000{{}c{}}00000000000{{{Dn{c}}}{{Dn{Ad}}}{}}00000{{{E`{c}}}{{E`{Ad}}}{}}00000{{{Eb{c}}}{{Eb{Ad}}}{}}00000{{{Bd{c}}}e{}{}}00000444444444444{{}{{Ed{c}}}{}}00000555555{{}{{Ef{{Cf{c}}}}}{}}{{}{{Ef{c}}}{}}1001101001``````````````{{}Eh}{{{l{c}}}EjEl}99{{{l{nEn}}{l{F`}}B`}Ab}{{{l{Fb}}}{{Bn{BhD`}}}}``{{{l{{j{{Cf{Fd}}}}}}{l{Bh}}{l{{Ff{Df}}}}{l{Fh}}}{{Bn{AbDf}}}}{{{l{{j{{Cf{Fd}}}}}}{l{Bh}}{l{{Ff{Df}}}}{l{Fh}}}Ab}{{{l{Bl}}c}BnFj}{{{l{Cb}}c}BnFj}{{{l{Bh}}{l{Al}}}{{`{An}}}}{{{Cf{Fd}}}Ej}{lc{}}0{lFl}0{lFn}0{{}{{Bn{c}}}{}}00000{c{{Bn{e}}}{}{}}00000111111{{}{{Bn{c{G`{c}}}}}{}}00000{lGb}00000{ce{}{}}00000{{}c{}}00000{l{{Cf{{l{c}}}}}{}}00000111111{{{l{Bh}}{l{Fb}}}{{Bn{AbDf}}}}","D":"Aj","p":[[10,"TransformMatrix",336],[5,"BoneAxis",337],[5,"SkeletalBone",0],[5,"Vec",338],[5,"Dynamic",339],[1,"reference"],[0,"mut"],[5,"Skeleton",337],[1,"unit"],[10,"Any",340],[5,"LabeledBoneKind",337],[5,"Vector",337],[1,"tuple"],[5,"Watcher",339],[10,"MakeWidget",341],[1,"bool"],[1,"str"],[5,"BakedParameters",342],[10,"CastFrom",343],[5,"EditingSkeleton",0],[1,"usize"],[5,"SerializedSkeleton",0],[6,"Result",344],[10,"Deserializer",345],[5,"SerializedBone",0],[5,"BoneId",337],[6,"Option",346],[6,"ControlFlow",347],[5,"JointId",337],[5,"Formatter",348],[8,"Result",348],[6,"ReadError",0],[5,"WidgetContext",349],[5,"Error",348],[6,"SaveError",0],[5,"Error",350],[5,"Error",351],[5,"PersistError",352],[5,"Box",353],[5,"Arc",354],[5,"Rc",355],[6,"ReadOnly",339],[6,"Value",339],[8,"Result",356],[5,"Window",357],[10,"Application",358],[5,"App",358],[5,"WindowHandle",357],[5,"Path",359],[5,"PathBuf",359],[5,"SharedCallback",341],[5,"Modal",360],[10,"Serializer",361],[5,"SmolStr",362],[5,"String",363],[5,"OutOfBounds",364],[5,"TypeId",340]],"r":[],"b":[[129,"impl-Display-for-ReadError"],[131,"impl-Debug-for-ReadError"],[132,"impl-Debug-for-SaveError"],[133,"impl-Display-for-SaveError"],[141,"impl-From%3CError%3E-for-ReadError"],[143,"impl-From%3CError%3E-for-ReadError"],[145,"impl-From%3CPersistError%3E-for-SaveError"],[146,"impl-From%3CError%3E-for-SaveError"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAEMBBgABAIkAjQABAJAAAACSAAIAlwAYALYAmgA="}],["funnybones",{"t":"PFPFFGFGFFFPFTTPFFFNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNONNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOPPFPGPPFPPPGFTTPGFGPFGPTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNOOOOCPPPPFGGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOO","n":["A","Angle","B","Bone","BoneAxis","BoneEnd","BoneId","BoneKind","Coordinate","Joint","JointId","Jointed","LabeledBoneKind","MAX","MIN","Rigid","Rotation","Skeleton","Vector","adapt_into_using","","","","","","","","","","","","","add","","","","","add_assign","angle","animation","arrays_from","","","","","","","","","","","","","arrays_into","","","","","","","","","","","","","as_any","","","","","","","","","","","","","as_any_mut","","","","","","","","","","","","","as_rotation","axis_a","axis_b","bone","","bone_mut","bones","borrow","","","","","","","","","","","","","borrow_mut","","","","","","","","","","","","","cam16_into_unclamped","","","","","","","","","","","","","cast","","","","","","","","","","","","","cast_into","","","","","","","","","","","","","clamped","clone","","","","","","","","","clone_into","","","","","","","","","clone_to_uninit","","","","","","","","","cmp","","compare","","","","components_from","","","","","","","","","","","","","connections_to","cos","cushy","default","","","","","degrees","","deref","","","","","","","","","","","","","deref_mut","","","","","","","","","","","","","deserialize","","","","","","","","","","desired_end","direction","div","downcast","","","","","","","","","","","","","drop","","","","","","","","","","","","","end","","entry_angle","eq","","","","","","","","","","","","equivalent","","","","","","","","","","","","final_vector","find_bone_by_label","find_joint_by_label","fmt","","","","","","","","","","","","","","","","from","","","","","","","","","","","","","","","","","","from_angle","","","","","","","","","","","","","from_cast","","","","","","","","","","","","","from_components","from_parts","","from_stimulus","","","","","","","","","","","","","full_length","hash","","","","id","","index","","","","index_mut","","init","","","","","","","","","","","","","into","","","","","","","","","","","","","into_angle","","","","","","","","","","","","","into_any","","","","","","","","","","","","","into_any_arc","","","","","","","","","","","","","into_any_rc","","","","","","","","","","","","","into_cam16_unclamped","","","","","","","","","","","","","into_color","","","","","","","","","","","","","into_color_unclamped","","","","","","","","","","","","","into_components","","","","","","","","","","into_parts","","into_read_only","","","","","","","","","","","","","into_stimulus","","","","","","","","","","","","","into_value","","","","","","","","","","","","","","","","","","","","","","","","","","inverse","","is_inverse","is_root","joint","joint_mut","joints","kind","","kind_mut","label","","","lerp","","","magnitude","","map","mul","neg","new","","","other_axis","partial_cmp","","","","percent_between","","push_bone","push_joint","radians","","rotation","serialize","","","","","","","","","","","","set_angle","set_desired_end","set_inverse","set_rotation","set_translation","sin","solve","solved_joint","start","sub","","","","sub_assign","to_degrees","to_owned","","","","","","","","","to_progress","to_radians","to_smolstr","","to_string","","translation","try_components_into","","","","","","","","","","","","","try_from","","","","","","","","","","","","","try_into","","","","","","","","","","","","","try_into_color","","","","","","","","","","","","","type_id","","","","","","","","","","","","","uints_from","","","","","","","","","","","","","uints_into","","","","","","","","","","","","","upcast","","","","","","","","","","","","","vector_to","with_label","","x","y","end_length","inverse","length","start_length","Add","Angle","Animation","Bone","BoneProperty","Bool","ChangeTo","Frame","Invalid","Inverse","Joint","JointProperty","Keyframe","MAX","MIN","Number","PropertyUpdate","RunningAnimation","Target","","Timeline","Value","Vector","ZERO","adapt_into_using","","","","","","","","","","add","arrays_from","","","","","","","","","","arrays_into","","","","","","","","","","as_any","","","","","","","","","","as_any_mut","","","","","","","","","","borrow","","","","","","","","","","borrow_mut","","","","","","","","","","cam16_into_unclamped","","","","","","","","","","cast","","","","","","","","","","cast_into","","","","","","","","","","clone","","","","","","","","","clone_into","","","","","","","","","clone_to_uninit","","","","","","","","","cmp","compare","","components_from","","","","","","","","","","default","","deref","","","","","","","","","","","","deref_mut","","","","","","","","","","","","deserialize","","","","","","","","downcast","","","","","","","","","","drop","","","","","","","","","","easing","eq","","","","","","","","","equivalent","","","fmt","","","","","","","","","from","","","","","","","","","","","","","","from_angle","","","","","","","","","","from_cast","","","","","","","","","","from_stimulus","","","","","","","","","","get","","","init","","","","","","","","","","insert","insert_frame","into","","","","","","","","","","into_angle","","","","","","","","","","into_any","","","","","","","","","","into_any_arc","","","","","","","","","","into_any_rc","","","","","","","","","","into_cam16_unclamped","","","","","","","","","","into_color","","","","","","","","","","into_color_unclamped","","","","","","","","","","into_components","","","","into_read_only","","","","","","","","","","into_stimulus","","","","","","","","","","into_value","","","","","","","","","","","","","","","","","","","","looping","new","","partial_cmp","push","remove","serialize","","","","","","","","set_frame_offset","set_variable","start","sub","target","to_owned","","","","","","","","","try_components_into","","","","","","","","","","try_from","","","","","","","","","","","try_into","","","","","","","","","","try_into_color","","","","","","","","","","type_id","","","","","","","","","","uints_from","","","","","","","","","","uints_into","","","","","","","","","","upcast","","","","","","","","","","update","","","","","variable","with","with_easing","with_frame","with_variable","bone","joint","property","","skeleton_canvas","DesiredEnd","Joint","SetDesiredEnd","SetJointRotation","SkeletonCanvas","SkeletonMutation","Target","adapt_into_using","","","arrays_from","","","arrays_into","","","as_any","","","as_any_mut","","","borrow","","","borrow_mut","","","cam16_into_unclamped","","","cast","","","cast_into","","","clone","","clone_into","","clone_to_uninit","","components_from","","","deref","","","deref_mut","","","downcast","","","drop","","","eq","","equivalent","","","fmt","","","from","","","from_angle","","","from_cast","","","from_stimulus","","","hit_test","hover","init","","","into","","","into_angle","","","into_any","","","into_any_arc","","into_any_rc","","","into_cam16_unclamped","","","into_color","","","into_color_unclamped","","","into_components","","into_read_only","","","into_stimulus","","","into_value","","","","","","layout","make_widget","make_window","make_with_tag","maximum_scale","minimum_scale","mouse_down","mouse_drag","mouse_up","mouse_wheel","new","on_mutate","open","redraw","run","run_in","scale","to_owned","","try_components_into","","","try_from","","","try_into","","","try_into_color","","","type_id","","","uints_from","","","uints_into","","","unhover","upcast","","","bone","end","joint","rotation"],"q":[[0,"funnybones"],[774,"funnybones::BoneKind"],[778,"funnybones::animation"],[1321,"funnybones::animation::Target"],[1325,"funnybones::cushy"],[1326,"funnybones::cushy::skeleton_canvas"],[1490,"funnybones::cushy::skeleton_canvas::SkeletonMutation"],[1494,"palette::chromatic_adaptation"],[1495,"core::any"],[1496,"core::option"],[1497,"palette::cam16::parameters"],[1498,"intentional::cast"],[1499,"core::cmp"],[1500,"core::result"],[1501,"serde::de"],[1502,"core::fmt"],[1503,"cushy::context"],[1504,"core::hash"],[1505,"alloc::boxed"],[1506,"alloc::sync"],[1507,"alloc::rc"],[1508,"cushy::value"],[1509,"core::ops::function"],[1510,"cushy::animation"],[1511,"core::convert"],[1512,"serde::ser"],[1513,"core::ops::range"],[1514,"cushy::widgets::progress"],[1515,"smol_str"],[1516,"alloc::string"],[1517,"palette::convert::try_from_into_color"],[1518,"alloc::borrow"],[1519,"core::time"],[1520,"easing_function::easings"],[1521,"figures::units"],[1522,"figures::point"],[1523,"cursor_icon"],[1524,"cushy"],[1525,"figures::size"],[1526,"cushy::widget"],[1527,"cushy::window"],[1528,"winit::event"],[1529,"core::marker"],[1530,"winit::error"],[1531,"cushy::app"]],"i":"Bj`0````````Bf`Bd01```Dbd2hf5AhAfAjA`AdBh<8876672`98:76;543210<98:76;543210<98:76;543210<98:76;543210<811545598:76;543210<98:76;543210<98:76;543210<98:76;543210<98:76;543210<78:76;410<8:76;410<8:76;410<10110098:76;543210<57`8:765:798:76;543210<98:76;543210<8:76;5410<36898:76;543210<98:76;543210<3438:76;543210<444111000<<<3558:::7776;543210<9988::7766;543210<98:76;543210<98:76;543210<8:798:76;543210<;410<3255105598:76;543210<98:76;543210<98:76;543210<98:76;543210<98:76;543210<98:76;543210<98:76;543210<98:76;543210<98:76;543210<88:76;410<:798:76;543210<98:76;543210<9988::7766;;554433221100<<4<;3555393329:76868878622:710:755:758:76;543210<23;5575338876778:76;410<:7:7:7598:76;543210<98:76;543210<98:76;543210<98:76;543210<98:76;543210<98:76;543210<98:76;543210<98:76;543210<8;288Kj0Kl1GfGd`G``Fh3`0Gb2``Gh02```1``20GlFjFlFn75869463210758694321075869432107586943210758694321075869432107586943210758694321075869432107586942107586942107586942107586944443210758694243221107586943221107586941075869432107586943210758694021075869444421075869432107586666944321075869432107586943210758694758321075869421321075869432107586943210758694321075869432107586943210758694321075869432107586940694321075869432107586943322110077558866994431042210758694122492107586943210758694321075869443210758694321075869432107586943210758694321075869432107586943758022012KnL`10`Hd0Hf0```Hh210210210210210210210210210212121210210210210210212122202102102102102100021021021021210210210210212102102100221100000000000000000210210210210210210210210021Lb0Ld0","f":"```````````````````{eg{}{{b{c}}}{}}000000000000{{dd}c{}}{{df}c{}}{{hh}c{}}{{ff}c{}}{{fh}c{}}{{{l{jh}}h}n}{{{l{A`}}}h}`{ce{}{}}000000000000{{}c{}}000000000000{l{{l{Ab}}}}000000000000{{{l{j}}}{{l{jAb}}}}000000000000{dh}{AdAf}0{{{l{Ah}}Ad}{{Al{{l{Aj}}}}}}`{{{l{jAh}}Ad}{{Al{{l{jAj}}}}}}{{{l{Ah}}}{{l{{An{Aj}}}}}}{l{{l{c}}}{}}000000000000{{{l{j}}}{{l{jc}}}{}}000000000000{{{B`{c}}}e{}{}}000000000000{{}e{}{{Bb{c}}}}000000000000;;;;;;;;;;;;;{hh}{{{l{d}}}d}{{{l{Bd}}}Bd}{{{l{h}}}h}{{{l{f}}}f}{{{l{Bf}}}Bf}{{{l{Af}}}Af}{{{l{Ad}}}Ad}{{{l{Bh}}}Bh}{{{l{Bj}}}Bj}{{l{l{jc}}}n{}}00000000{ln}00000000{{{l{Ad}}{l{Ad}}}Bl}{{{l{Bh}}{l{Bh}}}Bl}{{l{l{c}}}Bl{}}000{ce{}{}}000000000000{{{l{Ah}}Af}{{Al{{l{{An{Bh}}}}}}}}{hBn}`{{}d}{{}Bd}{{}h}{{}f}{{}Ah}{BnBd}{Bnh}{C`{{l{c}}}{}}000000000000{C`{{l{jc}}}{}}000000000000{c{{Cb{d}}}Cd}{c{{Cb{Bd}}}Cd}{c{{Cb{h}}}Cd}{c{{Cb{f}}}Cd}{c{{Cb{Bf}}}Cd}{c{{Cb{Ah}}}Cd}{c{{Cb{Af}}}Cd}{c{{Cb{Ad}}}Cd}{c{{Cb{Bh}}}Cd}{c{{Cb{Bj}}}Cd}{{{l{Aj}}}{{Al{f}}}}`{{dBn}c{}}{l{{l{c}}}{}}000000000000{C`n}000000000000{{{l{Aj}}}d}`{{{l{Aj}}}h}{{{l{d}}{l{d}}}Cf}{{{l{Bd}}{l{Bd}}}Cf}{{{l{h}}{l{h}}}Cf}{{{l{f}}{l{f}}}Cf}{{{l{Bf}}{l{Bf}}}Cf}{{{l{Ah}}{l{Ah}}}Cf}{{{l{Af}}{l{Af}}}Cf}{{{l{Aj}}{l{Aj}}}Cf}{{{l{A`}}{l{A`}}}Cf}{{{l{Ad}}{l{Ad}}}Cf}{{{l{Bh}}{l{Bh}}}Cf}{{{l{Bj}}{l{Bj}}}Cf}{{l{l{c}}}Cf{}}00000000000{{{l{Aj}}}f}{{{l{Ah}}{l{Ch}}}{{Al{Ad}}}}{{{l{Ah}}{l{Ch}}}{{Al{Bh}}}}{{{l{d}}{l{jCj}}}Cl}{{{l{Bd}}{l{jCj}}}Cl}0{{l{l{Cn}}{l{jCj}}}{{Cb{nD`}}}}0{{{l{h}}{l{jCj}}}Cl}0{{{l{f}}{l{jCj}}}Cl}{{{l{Bf}}{l{jCj}}}Cl}{{{l{Ah}}{l{jCj}}}Cl}{{{l{Af}}{l{jCj}}}Cl}{{{l{Aj}}{l{jCj}}}Cl}{{{l{A`}}{l{jCj}}}Cl}{{{l{Ad}}{l{jCj}}}Cl}{{{l{Bh}}{l{jCj}}}Cl}{{{l{Bj}}{l{jCj}}}Cl}{BfDb}{cc{}}{fd}1{hBd}22{Bdh}{df}44444444444444444444444444444444444{{{Dd{BnBn}}}d}{Alc{}}0{ce{}{}}000000000000{{{l{Bf}}}Bn}{{{l{Af}}{l{jc}}}nDf}{{{l{Ad}}{l{jc}}}nDf}{{{l{Bh}}{l{jc}}}nDf}{{{l{Bj}}{l{jc}}}nDf}{{{l{Aj}}}Ad}{{{l{A`}}}Bh}{{{l{Ah}}Bh}{{l{c}}}{}}{{{l{Ah}}Ad}{{l{c}}}{}}{AdC`}{BhC`}{{{l{jAh}}Ad}{{l{jc}}}{}}{{{l{jAh}}Bh}{{l{jc}}}{}}{{}C`}000000000000{{}c{}}0000000000000000000000000{{{Dh{c}}}{{Dh{Ab}}}{}}000000000000{{{Dj{c}}}{{Dj{Ab}}}{}}000000000000{{{Dl{c}}}{{Dl{Ab}}}{}}000000000000{{{B`{c}}}e{}{}}00000000000044444444444444444444444444{d{{Dd{BnBn}}}}{{}{{Dd{cc}}}{}}00000000{{}{{Dd{Al}}}}0{{}{{Dn{c}}}{}}0000000000008888888888888{{}{{E`{{Al{c}}}}}{}}{{}{{E`{c}}}{}}100101011010101010011010{AfAf}{BjBj}{{{l{Bf}}}Cf}{{{l{Aj}}}Cf}{{{l{Ah}}Bh}{{Al{{l{A`}}}}}}{{{l{jAh}}Bh}{{Al{{l{jA`}}}}}}{{{l{Ah}}}{{l{{An{A`}}}}}}{{{l{Aj}}}{{l{Bf}}}}`{{{l{jAj}}}{{l{jBf}}}}{{{l{Aj}}}{{l{Ch}}}}{{{l{A`}}}{{l{Ch}}}}`{{{l{Bd}}{l{Bd}}Bn}Bd}{{{l{h}}{l{h}}Bn}h}{{{l{f}}{l{f}}Bn}f}{{{l{d}}}Bn}`{{dc}d{{Ed{Bn}{{Eb{Bn}}}}}}{{dBn}c{}}{hc{}}{{BnBn}d}{{Bnh}f}{{hAfAf}A`}{{{l{A`}}Af}Af}{{{l{Bd}}{l{Bd}}}{{Al{Bl}}}}{{{l{h}}{l{h}}}{{Al{Bl}}}}{{{l{Ad}}{l{Ad}}}{{Al{Bl}}}}{{{l{Bh}}{l{Bh}}}{{Al{Bl}}}}{{{l{Bd}}{l{Bd}}{l{Bd}}}Ef}{{{l{h}}{l{h}}{l{h}}}Ef}{{{l{jAh}}c}Ad{{Eh{Db}}}}{{{l{jAh}}A`}Bh}{BnBd}{Bnh}{{{l{Ah}}}h}{{{l{d}}c}CbEj}{{{l{Bd}}c}CbEj}{{{l{h}}c}CbEj}{{{l{f}}c}CbEj}{{{l{Bf}}c}CbEj}{{{l{Ah}}c}CbEj}{{{l{Af}}c}CbEj}{{{l{Aj}}c}CbEj}{{{l{A`}}c}CbEj}{{{l{Ad}}c}CbEj}{{{l{Bh}}c}CbEj}{{{l{Bj}}c}CbEj}{{{l{jA`}}h}n}{{{l{jAj}}{Al{f}}}n}{{{l{jBf}}Cf}n}{{{l{jAh}}h}n}{{{l{jAh}}d}n}{hBn}{{{l{jAh}}}n}{{{l{Aj}}}{{Al{d}}}}{{{l{Aj}}}d}{{dd}c{}}{{df}c{}}{{hh}c{}}{{fh}c{}}{{{l{jh}}h}n}8{lc{}}00000000{{l{Al{{El{l}}}}}En}:{lF`}0{lFb}0{{{l{Ah}}}d}{{}{{Cb{c}}}{}}000000000000{c{{Cb{e}}}{}{}}0000000000001111111111111{{}{{Cb{c{Fd{c}}}}}{}}000000000000{lFf}000000000000{ce{}{}}000000000000{{}c{}}000000000000{l{{Al{{l{c}}}}}{}}000000000000{{dd}f}{{Bfc}Db{{Eh{Fb}}}}{{A`c}A`{{Eh{Fb}}}}``````````````````````````````{eg{}{{b{c}}}{}}000000000{{FhFh}c{}}77777777776666666666{l{{l{Ab}}}}000000000{{{l{j}}}{{l{jAb}}}}000000000{l{{l{c}}}{}}000000000{{{l{j}}}{{l{jc}}}{}}000000000{{{B`{c}}}e{}{}}000000000{{}e{}{{Bb{c}}}}000000000<<<<<<<<<<{{{l{Fj}}}Fj}{{{l{Fl}}}Fl}{{{l{Fn}}}Fn}{{{l{G`}}}G`}{{{l{Gb}}}Gb}{{{l{Gd}}}Gd}{{{l{Fh}}}Fh}{{{l{Gf}}}Gf}{{{l{Gh}}}Gh}{{l{l{jc}}}n{}}00000000{ln}00000000{{{l{Gh}}{l{Gh}}}Bl}{{l{l{c}}}Bl{}}0{ce{}{}}000000000{{}Fj}{{}Gh}{C`{{l{c}}}{}}0{{{l{Fj}}}{{l{c}}}{}}{{{l{Fl}}}{{l{c}}}{}}22222222{C`{{l{jc}}}{}}{{{l{jFj}}}{{l{jc}}}{}}11{{{l{jFl}}}{{l{jc}}}{}}2222222{c{{Cb{Fl}}}Cd}{c{{Cb{Fn}}}Cd}{c{{Cb{G`}}}Cd}{c{{Cb{Gb}}}Cd}{c{{Cb{Gd}}}Cd}{c{{Cb{Fh}}}Cd}{c{{Cb{Gf}}}Cd}{c{{Cb{Gh}}}Cd}{l{{l{c}}}{}}000000000{C`n}000000000`{{{l{Fj}}{l{Fj}}}Cf}{{{l{Fl}}{l{Fl}}}Cf}{{{l{Fn}}{l{Fn}}}Cf}{{{l{G`}}{l{G`}}}Cf}{{{l{Gb}}{l{Gb}}}Cf}{{{l{Gd}}{l{Gd}}}Cf}{{{l{Fh}}{l{Fh}}}Cf}{{{l{Gf}}{l{Gf}}}Cf}{{{l{Gh}}{l{Gh}}}Cf}{{l{l{c}}}Cf{}}00{{{l{Fj}}{l{jCj}}}Cl}{{{l{Fl}}{l{jCj}}}Cl}{{{l{Fn}}{l{jCj}}}Cl}{{{l{G`}}{l{jCj}}}Cl}{{{l{Gb}}{l{jCj}}}Cl}{{{l{Gd}}{l{jCj}}}Cl}{{{l{Fh}}{l{jCj}}}Cl}{{{l{Gf}}{l{jCj}}}Cl}{{{l{Gh}}{l{jCj}}}Cl}{cc{}}0000000{CfFh}{fFh}{BnFh}3{GjGh}444444444444444444444{ce{}{}}000000000{{{l{G`}}{l{Ah}}}Fh}{{{l{Gb}}{l{Aj}}}Fh}{{{l{Gd}}{l{A`}}}Fh}{{}C`}000000000{{{l{jFj}}C`Fl}n}{{{l{jFl}}Fn}n}{{}c{}}0000000000000000000{{{Dh{c}}}{{Dh{Ab}}}{}}000000000{{{Dj{c}}}{{Dj{Ab}}}{}}000000000{{{Dl{c}}}{{Dl{Ab}}}{}}000000000{{{B`{c}}}e{}{}}00000000044444444444444444444{{}{{Dd{cc}}}{}}000{{}{{Dn{c}}}{}}0000000006666666666{{}{{E`{{Al{c}}}}}{}}{{}{{E`{c}}}{}}011010100101010110{GlGl}{G`Fl}{{GhGf}Fn}{{{l{Gh}}{l{Gh}}}{{Al{Bl}}}}{{{l{jFj}}Fl}n}{{{l{jFj}}C`}Fl}{{{l{Fl}}c}CbEj}{{{l{Fn}}c}CbEj}{{{l{G`}}c}CbEj}{{{l{Gb}}c}CbEj}{{{l{Gd}}c}CbEj}{{{l{Fh}}c}CbEj}{{{l{Gf}}c}CbEj}{{{l{Gh}}c}CbEj}{{{l{jFl}}C`Gh}n}{{{l{jFj}}cBn}n{{Eh{{Gn{Ch}}}}}}{{{l{Fj}}}Gl}{{GhGh}c{}}{{{l{Gf}}Fh}Fh}{lc{}}00000000{{}{{Cb{c}}}{}}000000000{c{{Cb{e}}}{}{}}000000000{H`{{Cb{Ghc}}}{}}2222222222{{}{{Cb{c{Fd{c}}}}}{}}000000000{lFf}000000000{ce{}{}}000000000{{}c{}}000000000{l{{Al{{l{c}}}}}{}}000000000{{{l{jGl}}H`{l{jAh}}}Cf}{{{l{G`}}Fh{l{jAh}}}n}{{{l{Gb}}Fh{l{jAj}}}n}{{{l{Gd}}Fh{l{jA`}}}n}`{{{l{Fj}}{l{Ch}}}{{Al{Bn}}}}{{FjFl}Fj}{{FnHb}Fn}{{FlFn}Fl}{{FjcBn}Fj{{Eh{Fb}}}}````````````{eg{}{{b{c}}}{}}00<<<;;;{l{{l{Ab}}}}00{{{l{j}}}{{l{jAb}}}}00{l{{l{c}}}{}}00{{{l{j}}}{{l{jc}}}{}}00{{{B`{c}}}e{}{}}00{{}e{}{{Bb{c}}}}00{{}c{}}00{{{l{Hd}}}Hd}{{{l{Hf}}}Hf}{{l{l{jc}}}n{}}0{ln}0{ce{}{}}00{C`{{l{c}}}{}}00{C`{{l{jc}}}{}}00;;;{C`n}00{{{l{Hd}}{l{Hd}}}Cf}{{{l{Hf}}{l{Hf}}}Cf}{{l{l{c}}}Cf{}}00{{{l{Hh}}{l{jCj}}}Cl}{{{l{Hd}}{l{jCj}}}Cl}{{{l{Hf}}{l{jCj}}}Cl}{cc{}}00000000:::{{{l{jHh}}{Hl{Hj}}{l{jHn}}}Cf}{{{l{jHh}}{Hl{Hj}}{l{jHn}}}{{Al{I`}}}}{{}C`}00{{}c{}}00000{{{Dh{c}}}{{Dh{Ab}}}{}}00{{{Dj{c}}}{{Dj{Ab}}}{}}0{{{Dl{c}}}{{Dl{Ab}}}{}}00{{{B`{c}}}e{}{}}00444444{{}{{Dd{cc}}}{}}0{{}{{Dn{c}}}{}}00666{{}{{E`{{Al{c}}}}}{}}{{}{{E`{c}}}{}}1001{{{l{jHh}}{Id{Ib}}{l{jIf}}}{{Id{Ih}}}}{{}Ij}{{}Il}{InIj}{{{l{Hh}}}{{l{{J`{Bn}}}}}}0{{{l{jHh}}{Hl{Hj}}JbJd{l{jHn}}}Jf}{{{l{jHh}}{Hl{Hj}}JbJd{l{jHn}}}n}{{{l{jHh}}{Al{{Hl{Hj}}}}JbJd{l{jHn}}}n}{{{l{jHh}}JbJhJj{l{jHn}}}Jf}{{{J`{Ah}}}Hh}{{Hhc}Hh{{Ed{Hf}}Jl}}{{{l{jc}}}{{Cb{JnK`}}}{KbKd}}{{{l{jHh}}{l{jKf}}}n}{{}{{Cb{nK`}}}}{Kh{{Cb{nK`}}}}:{lc{}}0{{}{{Cb{c}}}{}}00{c{{Cb{e}}}{}{}}00111{{}{{Cb{c{Fd{c}}}}}{}}00{lFf}00{ce{}{}}00{{}c{}}00{{{l{jHh}}{l{jHn}}}n}{l{{Al{{l{c}}}}}{}}00````","D":"ABb","p":[[10,"TransformMatrix",1494],[5,"Coordinate",0],[5,"Vector",0],[5,"Rotation",0],[0,"mut"],[1,"reference"],[1,"unit"],[5,"Joint",0],[10,"Any",1495],[5,"BoneId",0],[5,"BoneAxis",0],[5,"Skeleton",0],[5,"Bone",0],[6,"Option",1496],[1,"slice"],[5,"BakedParameters",1497],[10,"CastFrom",1498],[5,"Angle",0],[6,"BoneKind",0],[5,"JointId",0],[6,"BoneEnd",0],[6,"Ordering",1499],[1,"f32"],[1,"usize"],[6,"Result",1500],[10,"Deserializer",1501],[1,"bool"],[1,"str"],[5,"Formatter",1502],[8,"Result",1502],[5,"WidgetContext",1503],[5,"Error",1502],[5,"LabeledBoneKind",0],[1,"tuple"],[10,"Hasher",1504],[5,"Box",1505],[5,"Arc",1506],[5,"Rc",1507],[6,"ReadOnly",1508],[6,"Value",1508],[17,"Output"],[10,"FnMut",1509],[5,"ZeroToOne",1510],[10,"Into",1511],[10,"Serializer",1512],[5,"RangeInclusive",1513],[6,"Progress",1514],[5,"SmolStr",1515],[5,"String",1516],[5,"OutOfBounds",1517],[5,"TypeId",1495],[6,"Value",778],[5,"Animation",778],[5,"Timeline",778],[5,"Keyframe",778],[6,"Target",778],[6,"BoneProperty",778],[6,"JointProperty",778],[6,"PropertyUpdate",778],[5,"Frame",778],[1,"u32"],[5,"RunningAnimation",778],[6,"Cow",1518],[5,"Duration",1519],[6,"StandardEasing",1520],[6,"Target",1326],[6,"SkeletonMutation",1326],[5,"SkeletonCanvas",1326],[5,"Px",1521],[5,"Point",1522],[5,"EventContext",1503],[6,"CursorIcon",1523],[6,"ConstraintLimit",1524],[5,"Size",1525],[5,"LayoutContext",1503],[5,"UPx",1521],[5,"WidgetInstance",1526],[5,"Window",1527],[5,"WidgetTag",1526],[5,"Dynamic",1508],[6,"DeviceId",1527],[6,"MouseButton",1528],[8,"EventHandling",1526],[6,"MouseScrollDelta",1528],[6,"TouchPhase",1528],[10,"Send",1529],[5,"WindowHandle",1527],[6,"EventLoopError",1530],[10,"Application",1531],[10,"Sized",1529],[5,"GraphicsContext",1503],[5,"PendingApp",1531],[15,"Jointed",774],[15,"Rigid",774],[15,"Bone",1321],[15,"Joint",1321],[15,"SetDesiredEnd",1490],[15,"SetJointRotation",1490]],"r":[],"b":[[32,"impl-Add-for-Coordinate"],[33,"impl-Add%3CVector%3E-for-Coordinate"],[35,"impl-Add-for-Vector"],[36,"impl-Add%3CRotation%3E-for-Vector"],[317,"impl-Debug-for-Angle"],[318,"impl-Display-for-Angle"],[321,"impl-Debug-for-Rotation"],[322,"impl-Display-for-Rotation"],[399,"impl-Index%3CJointId%3E-for-Skeleton"],[400,"impl-Index%3CBoneId%3E-for-Skeleton"],[403,"impl-IndexMut%3CBoneId%3E-for-Skeleton"],[404,"impl-IndexMut%3CJointId%3E-for-Skeleton"],[643,"impl-Sub-for-Coordinate"],[644,"impl-Sub%3CVector%3E-for-Coordinate"],[1027,"impl-From%3Cbool%3E-for-Value"],[1028,"impl-From%3CVector%3E-for-Value"],[1029,"impl-From%3Cf32%3E-for-Value"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAEUFIAAUABIAKAA0AGQAQACmAC0A1wAEAN4AIwAEARoAIgEXAD0BEABPAQAAUQEAAFQBAQBfASkAigEDAJABAQCUAQ4AsAGaAFgCAgBeAgEAZAIFAG8CCwCEAgQAigIJAJUCAwCaAmcACwPwAAQEAgAIBAAACgQsAEEELwF0BQ0AhQVRAA=="}]]')); +var searchIndex = new Map(JSON.parse('[["FunnyBones",{"t":"HHHHHH","n":["main","main_menu_window","open_file","save","save_as","skeleton_window"],"q":[[0,"FunnyBones"],[6,"cushy"],[7,"cushy::window"],[8,"cushy::app"],[9,"std::path"],[10,"core::option"],[11,"cushy::value"],[12,"funnybones::editor"],[13,"cushy::widget"],[14,"cushy::widgets::layers"],[15,"core::result"]],"i":"``````","f":"{{}b}{{{d{c}}}fh}{{{d{jl}}{d{n}}A`}Ab}{{{d{{Ah{{Af{Ad}}}}}}{d{Aj}}{d{{An{Al}}}}{d{B`}}}{{Bb{AbAl}}}}{{{d{{Ah{{Af{Ad}}}}}}{d{Aj}}{d{{An{Al}}}}{d{B`}}}Ab}{{{Af{Ad}}}f}","D":"b","p":[[8,"Result",6],[1,"reference"],[5,"Window",7],[10,"Application",8],[0,"mut"],[5,"App",8],[5,"WindowHandle",7],[1,"bool"],[1,"unit"],[5,"PathBuf",9],[6,"Option",10],[5,"Dynamic",11],[5,"EditingSkeleton",12],[6,"SaveError",12],[5,"SharedCallback",13],[5,"Modal",14],[6,"Result",15]],"r":[],"b":[],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAAUAAQABAAUA"}],["funnybones",{"t":"PFPFFGFGFFFPFTTPFFFNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNCNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNONNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOPPFPGPPFPPPGFTTPGFGPFGPTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNOOOOCPPPPFGGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOFPPPGPGFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN","n":["A","Angle","B","Bone","BoneAxis","BoneEnd","BoneId","BoneKind","Coordinate","Joint","JointId","Jointed","LabeledBoneKind","MAX","MIN","Rigid","Rotation","Skeleton","Vector","adapt_into_using","","","","","","","","","","","","","add","","","","","add_assign","angle","animation","arrays_from","","","","","","","","","","","","","arrays_into","","","","","","","","","","","","","as_any","","","","","","","","","","","","","as_any_mut","","","","","","","","","","","","","as_rotation","axis_a","axis_b","bone","","bone_mut","bones","borrow","","","","","","","","","","","","","borrow_mut","","","","","","","","","","","","","cam16_into_unclamped","","","","","","","","","","","","","cast","","","","","","","","","","","","","cast_into","","","","","","","","","","","","","clamped","clone","","","","","","","","","clone_into","","","","","","","","","clone_to_uninit","","","","","","","","","cmp","","compare","","","","components_from","","","","","","","","","","","","","connections_to","cos","cushy","default","","","","","degrees","","deref","","","","","","","","","","","","","deref_mut","","","","","","","","","","","","","deserialize","","","","","","","","","","desired_end","direction","div","downcast","","","","","","","","","","","","","drop","","","","","","","","","","","","","editor","end","","entry_angle","eq","","","","","","","","","","","","equivalent","","","","","","","","","","","","final_vector","find_bone_by_label","find_joint_by_label","fmt","","","","","","","","","","","","","","","","from","","","","","","","","","","","","","","","","","","from_angle","","","","","","","","","","","","","from_cast","","","","","","","","","","","","","from_components","from_parts","","from_stimulus","","","","","","","","","","","","","full_length","hash","","","","id","","index","","","","index_mut","","init","","","","","","","","","","","","","into","","","","","","","","","","","","","into_angle","","","","","","","","","","","","","into_any","","","","","","","","","","","","","into_any_arc","","","","","","","","","","","","","into_any_rc","","","","","","","","","","","","","into_cam16_unclamped","","","","","","","","","","","","","into_color","","","","","","","","","","","","","into_color_unclamped","","","","","","","","","","","","","into_components","","","","","","","","","","into_parts","","into_read_only","","","","","","","","","","","","","into_stimulus","","","","","","","","","","","","","into_value","","","","","","","","","","","","","","","","","","","","","","","","","","inverse","","is_inverse","is_root","joint","joint_mut","joints","kind","","kind_mut","label","","","lerp","","","magnitude","","map","mul","neg","new","","","other_axis","partial_cmp","","","","percent_between","","push_bone","push_joint","radians","","rotation","serialize","","","","","","","","","","","","set_angle","set_desired_end","set_inverse","set_rotation","set_translation","sin","solve","solved_joint","start","sub","","","","sub_assign","to_degrees","to_owned","","","","","","","","","to_progress","to_radians","to_smolstr","","to_string","","translation","try_components_into","","","","","","","","","","","","","try_from","","","","","","","","","","","","","try_into","","","","","","","","","","","","","try_into_color","","","","","","","","","","","","","type_id","","","","","","","","","","","","","uints_from","","","","","","","","","","","","","uints_into","","","","","","","","","","","","","upcast","","","","","","","","","","","","","vector_to","with_label","","x","y","end_length","inverse","length","start_length","Add","Angle","Animation","Bone","BoneProperty","Bool","ChangeTo","Frame","Invalid","Inverse","Joint","JointProperty","Keyframe","MAX","MIN","Number","PropertyUpdate","RunningAnimation","Target","","Timeline","Value","Vector","ZERO","adapt_into_using","","","","","","","","","","add","arrays_from","","","","","","","","","","arrays_into","","","","","","","","","","as_any","","","","","","","","","","as_any_mut","","","","","","","","","","borrow","","","","","","","","","","borrow_mut","","","","","","","","","","cam16_into_unclamped","","","","","","","","","","cast","","","","","","","","","","cast_into","","","","","","","","","","clone","","","","","","","","","clone_into","","","","","","","","","clone_to_uninit","","","","","","","","","cmp","compare","","components_from","","","","","","","","","","default","","deref","","","","","","","","","","","","deref_mut","","","","","","","","","","","","deserialize","","","","","","","","downcast","","","","","","","","","","drop","","","","","","","","","","easing","eq","","","","","","","","","equivalent","","","fmt","","","","","","","","","from","","","","","","","","","","","","","","from_angle","","","","","","","","","","from_cast","","","","","","","","","","from_stimulus","","","","","","","","","","get","","","init","","","","","","","","","","insert","insert_frame","into","","","","","","","","","","into_angle","","","","","","","","","","into_any","","","","","","","","","","into_any_arc","","","","","","","","","","into_any_rc","","","","","","","","","","into_cam16_unclamped","","","","","","","","","","into_color","","","","","","","","","","into_color_unclamped","","","","","","","","","","into_components","","","","into_read_only","","","","","","","","","","into_stimulus","","","","","","","","","","into_value","","","","","","","","","","","","","","","","","","","","looping","new","","partial_cmp","push","remove","serialize","","","","","","","","set_frame_offset","set_variable","start","sub","target","to_owned","","","","","","","","","try_components_into","","","","","","","","","","try_from","","","","","","","","","","","try_into","","","","","","","","","","try_into_color","","","","","","","","","","type_id","","","","","","","","","","uints_from","","","","","","","","","","uints_into","","","","","","","","","","upcast","","","","","","","","","","update","","","","","variable","with","with_easing","with_frame","with_variable","bone","joint","property","","skeleton_canvas","DesiredEnd","Joint","SetDesiredEnd","SetJointRotation","SkeletonCanvas","SkeletonMutation","Target","adapt_into_using","","","arrays_from","","","arrays_into","","","as_any","","","as_any_mut","","","borrow","","","borrow_mut","","","cam16_into_unclamped","","","cast","","","cast_into","","","clone","","clone_into","","clone_to_uninit","","components_from","","","deref","","","deref_mut","","","downcast","","","drop","","","eq","","equivalent","","","fmt","","","from","","","from_angle","","","from_cast","","","from_stimulus","","","hit_test","hover","init","","","into","","","into_angle","","","into_any","","","into_any_arc","","into_any_rc","","","into_cam16_unclamped","","","into_color","","","into_color_unclamped","","","into_components","","into_read_only","","","into_stimulus","","","into_value","","","","","","layout","make_widget","make_window","make_with_tag","maximum_scale","minimum_scale","mouse_down","mouse_drag","mouse_up","mouse_wheel","new","on_mutate","open","redraw","run","run_in","scale","to_owned","","try_components_into","","","try_from","","","try_into","","","try_into_color","","","type_id","","","uints_from","","","uints_into","","","unhover","upcast","","","bone","end","joint","rotation","EditingSkeleton","InvalidPath","Io","","ReadError","Rsn","SaveError","SkeletonEditor","adapt_into_using","","","","arrays_from","","","","arrays_into","","","","as_any","","","","as_any_mut","","","","borrow","","","","borrow_mut","","","","cam16_into_unclamped","","","","cast","","","","cast_into","","","","clone","clone_into","clone_to_uninit","components_from","","","","default","deref","","","","deref_mut","","","","downcast","","","","drop","","","","editor","eq","fmt","","","","","","","from","","","","","","","","from_angle","","","","from_cast","","","","from_stimulus","","","","init","","","","into","","","","into_angle","","","","into_any","","","","into_any_arc","","","","into_any_rc","","","","into_cam16_unclamped","","","","into_color","","","","into_color_unclamped","","","","into_read_only","","","","into_stimulus","","","","into_value","","","","","","","","make_widget","make_window","open","read_from","run","run_in","skeleton","skeleton_editor","to_owned","to_smolstr","","to_string","","try_components_into","","","","try_from","","","","try_into","","","","try_into_color","","","","type_id","","","","uints_from","","","","uints_into","","","","upcast","","","","write_to"],"q":[[0,"funnybones"],[775,"funnybones::BoneKind"],[779,"funnybones::animation"],[1322,"funnybones::animation::Target"],[1326,"funnybones::cushy"],[1327,"funnybones::cushy::skeleton_canvas"],[1491,"funnybones::cushy::skeleton_canvas::SkeletonMutation"],[1495,"funnybones::editor"],[1694,"palette::chromatic_adaptation"],[1695,"core::any"],[1696,"core::option"],[1697,"palette::cam16::parameters"],[1698,"intentional::cast"],[1699,"core::cmp"],[1700,"core::result"],[1701,"serde::de"],[1702,"core::fmt"],[1703,"cushy::context"],[1704,"core::hash"],[1705,"alloc::boxed"],[1706,"alloc::sync"],[1707,"alloc::rc"],[1708,"cushy::value"],[1709,"core::ops::function"],[1710,"cushy::animation"],[1711,"core::convert"],[1712,"serde::ser"],[1713,"core::ops::range"],[1714,"cushy::widgets::progress"],[1715,"smol_str"],[1716,"alloc::string"],[1717,"palette::convert::try_from_into_color"],[1718,"alloc::borrow"],[1719,"core::time"],[1720,"easing_function::easings"],[1721,"figures::units"],[1722,"figures::point"],[1723,"cursor_icon"],[1724,"cushy"],[1725,"figures::size"],[1726,"cushy::widget"],[1727,"cushy::window"],[1728,"winit::event"],[1729,"core::marker"],[1730,"winit::error"],[1731,"cushy::app"],[1732,"std::io::error"],[1733,"rsn::de"],[1734,"tempfile::file"],[1735,"std::path"]],"i":"Bj`0````````Bf`Bd01```Dbd2hf5AhAfAjA`AdBh<8876672`98:76;543210<98:76;543210<98:76;543210<98:76;543210<811545598:76;543210<98:76;543210<98:76;543210<98:76;543210<98:76;543210<78:76;410<8:76;410<8:76;410<10110098:76;543210<57`8:765:798:76;543210<98:76;543210<8:76;5410<36898:76;543210<98:76;543210<`3438:76;543210<444111000<<<3558:::7776;543210<9988::7766;543210<98:76;543210<98:76;543210<8:798:76;543210<;410<3255105598:76;543210<98:76;543210<98:76;543210<98:76;543210<98:76;543210<98:76;543210<98:76;543210<98:76;543210<98:76;543210<88:76;410<:798:76;543210<98:76;543210<9988::7766;;554433221100<<4<;3555393329:76868878622:710:755:758:76;543210<23;5575338876778:76;410<:7:7:7598:76;543210<98:76;543210<98:76;543210<98:76;543210<98:76;543210<98:76;543210<98:76;543210<98:76;543210<8;288Lj0Ll1GfGd`G``Fh3`0Gb2``Gh02```1``20GlFjFlFn75869463210758694321075869432107586943210758694321075869432107586943210758694321075869432107586942107586942107586942107586944443210758694243221107586943221107586941075869432107586943210758694021075869444421075869432107586666944321075869432107586943210758694758321075869421321075869432107586943210758694321075869432107586943210758694321075869432107586940694321075869432107586943322110077558866994431042210758694122492107586943210758694321075869443210758694321075869432107586943210758694321075869432107586943758022012LnM`10`Hd0Hf0```Hh210210210210210210210210210212121210210210210210212122202102102102102100021021021021210210210210212102102100221100000000000000000210210210210210210210210021Mb0Md0`KnKl1`0``Lf12Kj1230123012301230123012301230123012300001230012301230123012301022233301222333012301230123012301230123012301230123012301230123012301230112233001110111`02323123012301230123012301230123012300","f":"```````````````````{eg{}{{b{c}}}{}}000000000000{{dd}c{}}{{df}c{}}{{hh}c{}}{{ff}c{}}{{fh}c{}}{{{l{jh}}h}n}{{{l{A`}}}h}`{ce{}{}}000000000000{{}c{}}000000000000{l{{l{Ab}}}}000000000000{{{l{j}}}{{l{jAb}}}}000000000000{dh}{AdAf}0{{{l{Ah}}Ad}{{Al{{l{Aj}}}}}}`{{{l{jAh}}Ad}{{Al{{l{jAj}}}}}}{{{l{Ah}}}{{l{{An{Aj}}}}}}{l{{l{c}}}{}}000000000000{{{l{j}}}{{l{jc}}}{}}000000000000{{{B`{c}}}e{}{}}000000000000{{}e{}{{Bb{c}}}}000000000000;;;;;;;;;;;;;{hh}{{{l{d}}}d}{{{l{Bd}}}Bd}{{{l{h}}}h}{{{l{f}}}f}{{{l{Bf}}}Bf}{{{l{Af}}}Af}{{{l{Ad}}}Ad}{{{l{Bh}}}Bh}{{{l{Bj}}}Bj}{{l{l{jc}}}n{}}00000000{ln}00000000{{{l{Ad}}{l{Ad}}}Bl}{{{l{Bh}}{l{Bh}}}Bl}{{l{l{c}}}Bl{}}000{ce{}{}}000000000000{{{l{Ah}}Af}{{Al{{l{{An{Bh}}}}}}}}{hBn}`{{}d}{{}Bd}{{}h}{{}f}{{}Ah}{BnBd}{Bnh}{C`{{l{c}}}{}}000000000000{C`{{l{jc}}}{}}000000000000{c{{Cb{d}}}Cd}{c{{Cb{Bd}}}Cd}{c{{Cb{h}}}Cd}{c{{Cb{f}}}Cd}{c{{Cb{Bf}}}Cd}{c{{Cb{Ah}}}Cd}{c{{Cb{Af}}}Cd}{c{{Cb{Ad}}}Cd}{c{{Cb{Bh}}}Cd}{c{{Cb{Bj}}}Cd}{{{l{Aj}}}{{Al{f}}}}`{{dBn}c{}}{l{{l{c}}}{}}000000000000{C`n}000000000000`{{{l{Aj}}}d}`{{{l{Aj}}}h}{{{l{d}}{l{d}}}Cf}{{{l{Bd}}{l{Bd}}}Cf}{{{l{h}}{l{h}}}Cf}{{{l{f}}{l{f}}}Cf}{{{l{Bf}}{l{Bf}}}Cf}{{{l{Ah}}{l{Ah}}}Cf}{{{l{Af}}{l{Af}}}Cf}{{{l{Aj}}{l{Aj}}}Cf}{{{l{A`}}{l{A`}}}Cf}{{{l{Ad}}{l{Ad}}}Cf}{{{l{Bh}}{l{Bh}}}Cf}{{{l{Bj}}{l{Bj}}}Cf}{{l{l{c}}}Cf{}}00000000000{{{l{Aj}}}f}{{{l{Ah}}{l{Ch}}}{{Al{Ad}}}}{{{l{Ah}}{l{Ch}}}{{Al{Bh}}}}{{{l{d}}{l{jCj}}}Cl}{{{l{Bd}}{l{jCj}}}Cl}0{{l{l{Cn}}{l{jCj}}}{{Cb{nD`}}}}0{{{l{h}}{l{jCj}}}Cl}0{{{l{f}}{l{jCj}}}Cl}{{{l{Bf}}{l{jCj}}}Cl}{{{l{Ah}}{l{jCj}}}Cl}{{{l{Af}}{l{jCj}}}Cl}{{{l{Aj}}{l{jCj}}}Cl}{{{l{A`}}{l{jCj}}}Cl}{{{l{Ad}}{l{jCj}}}Cl}{{{l{Bh}}{l{jCj}}}Cl}{{{l{Bj}}{l{jCj}}}Cl}{BfDb}{cc{}}0{fd}1{hBd}2{Bdh}3{df}4444444444444444444444444444444444{{{Dd{BnBn}}}d}{Alc{}}0{ce{}{}}000000000000{{{l{Bf}}}Bn}{{{l{Af}}{l{jc}}}nDf}{{{l{Ad}}{l{jc}}}nDf}{{{l{Bh}}{l{jc}}}nDf}{{{l{Bj}}{l{jc}}}nDf}{{{l{Aj}}}Ad}{{{l{A`}}}Bh}{{{l{Ah}}Bh}{{l{c}}}{}}{{{l{Ah}}Ad}{{l{c}}}{}}{AdC`}{BhC`}{{{l{jAh}}Ad}{{l{jc}}}{}}{{{l{jAh}}Bh}{{l{jc}}}{}}{{}C`}000000000000{{}c{}}0000000000000000000000000{{{Dh{c}}}{{Dh{Ab}}}{}}000000000000{{{Dj{c}}}{{Dj{Ab}}}{}}000000000000{{{Dl{c}}}{{Dl{Ab}}}{}}000000000000{{{B`{c}}}e{}{}}00000000000044444444444444444444444444{d{{Dd{BnBn}}}}{{}{{Dd{cc}}}{}}00000000{{}{{Dd{Al}}}}0{{}{{Dn{c}}}{}}0000000000008888888888888{{}{{E`{c}}}{}}{{}{{E`{{Al{c}}}}}{}}010101011001101001010110{AfAf}{BjBj}{{{l{Bf}}}Cf}{{{l{Aj}}}Cf}{{{l{Ah}}Bh}{{Al{{l{A`}}}}}}{{{l{jAh}}Bh}{{Al{{l{jA`}}}}}}{{{l{Ah}}}{{l{{An{A`}}}}}}{{{l{Aj}}}{{l{Bf}}}}`{{{l{jAj}}}{{l{jBf}}}}{{{l{Aj}}}{{l{Ch}}}}{{{l{A`}}}{{l{Ch}}}}`{{{l{Bd}}{l{Bd}}Bn}Bd}{{{l{h}}{l{h}}Bn}h}{{{l{f}}{l{f}}Bn}f}{{{l{d}}}Bn}`{{dc}d{{Ed{Bn}{{Eb{Bn}}}}}}{{dBn}c{}}{hc{}}{{BnBn}d}{{Bnh}f}{{hAfAf}A`}{{{l{A`}}Af}Af}{{{l{Bd}}{l{Bd}}}{{Al{Bl}}}}{{{l{h}}{l{h}}}{{Al{Bl}}}}{{{l{Ad}}{l{Ad}}}{{Al{Bl}}}}{{{l{Bh}}{l{Bh}}}{{Al{Bl}}}}{{{l{Bd}}{l{Bd}}{l{Bd}}}Ef}{{{l{h}}{l{h}}{l{h}}}Ef}{{{l{jAh}}c}Ad{{Eh{Db}}}}{{{l{jAh}}A`}Bh}{BnBd}{Bnh}{{{l{Ah}}}h}{{{l{d}}c}CbEj}{{{l{Bd}}c}CbEj}{{{l{h}}c}CbEj}{{{l{f}}c}CbEj}{{{l{Bf}}c}CbEj}{{{l{Ah}}c}CbEj}{{{l{Af}}c}CbEj}{{{l{Aj}}c}CbEj}{{{l{A`}}c}CbEj}{{{l{Ad}}c}CbEj}{{{l{Bh}}c}CbEj}{{{l{Bj}}c}CbEj}{{{l{jA`}}h}n}{{{l{jAj}}{Al{f}}}n}{{{l{jBf}}Cf}n}{{{l{jAh}}h}n}{{{l{jAh}}d}n}{hBn}{{{l{jAh}}}n}{{{l{Aj}}}{{Al{d}}}}{{{l{Aj}}}d}{{df}c{}}{{dd}c{}}{{hh}c{}}{{fh}c{}}{{{l{jh}}h}n}8{lc{}}00000000{{l{Al{{El{l}}}}}En}:{lF`}0{lFb}0{{{l{Ah}}}d}{{}{{Cb{c}}}{}}000000000000{c{{Cb{e}}}{}{}}0000000000001111111111111{{}{{Cb{c{Fd{c}}}}}{}}000000000000{lFf}000000000000{ce{}{}}000000000000{{}c{}}000000000000{l{{Al{{l{c}}}}}{}}000000000000{{dd}f}{{Bfc}Db{{Eh{Fb}}}}{{A`c}A`{{Eh{Fb}}}}``````````````````````````````{eg{}{{b{c}}}{}}000000000{{FhFh}c{}}77777777776666666666{l{{l{Ab}}}}000000000{{{l{j}}}{{l{jAb}}}}000000000{l{{l{c}}}{}}000000000{{{l{j}}}{{l{jc}}}{}}000000000{{{B`{c}}}e{}{}}000000000{{}e{}{{Bb{c}}}}000000000<<<<<<<<<<{{{l{Fj}}}Fj}{{{l{Fl}}}Fl}{{{l{Fn}}}Fn}{{{l{G`}}}G`}{{{l{Gb}}}Gb}{{{l{Gd}}}Gd}{{{l{Fh}}}Fh}{{{l{Gf}}}Gf}{{{l{Gh}}}Gh}{{l{l{jc}}}n{}}00000000{ln}00000000{{{l{Gh}}{l{Gh}}}Bl}{{l{l{c}}}Bl{}}0{ce{}{}}000000000{{}Fj}{{}Gh}{C`{{l{c}}}{}}{{{l{Fj}}}{{l{c}}}{}}1{{{l{Fl}}}{{l{c}}}{}}22222222{C`{{l{jc}}}{}}0{{{l{jFj}}}{{l{jc}}}{}}{{{l{jFl}}}{{l{jc}}}{}}22222222{c{{Cb{Fl}}}Cd}{c{{Cb{Fn}}}Cd}{c{{Cb{G`}}}Cd}{c{{Cb{Gb}}}Cd}{c{{Cb{Gd}}}Cd}{c{{Cb{Fh}}}Cd}{c{{Cb{Gf}}}Cd}{c{{Cb{Gh}}}Cd}{l{{l{c}}}{}}000000000{C`n}000000000`{{{l{Fj}}{l{Fj}}}Cf}{{{l{Fl}}{l{Fl}}}Cf}{{{l{Fn}}{l{Fn}}}Cf}{{{l{G`}}{l{G`}}}Cf}{{{l{Gb}}{l{Gb}}}Cf}{{{l{Gd}}{l{Gd}}}Cf}{{{l{Fh}}{l{Fh}}}Cf}{{{l{Gf}}{l{Gf}}}Cf}{{{l{Gh}}{l{Gh}}}Cf}{{l{l{c}}}Cf{}}00{{{l{Fj}}{l{jCj}}}Cl}{{{l{Fl}}{l{jCj}}}Cl}{{{l{Fn}}{l{jCj}}}Cl}{{{l{G`}}{l{jCj}}}Cl}{{{l{Gb}}{l{jCj}}}Cl}{{{l{Gd}}{l{jCj}}}Cl}{{{l{Fh}}{l{jCj}}}Cl}{{{l{Gf}}{l{jCj}}}Cl}{{{l{Gh}}{l{jCj}}}Cl}{cc{}}000000{CfFh}{fFh}{BnFh}333{GjGh}44444444444444444444{ce{}{}}000000000{{{l{G`}}{l{Ah}}}Fh}{{{l{Gb}}{l{Aj}}}Fh}{{{l{Gd}}{l{A`}}}Fh}{{}C`}000000000{{{l{jFj}}C`Fl}n}{{{l{jFl}}Fn}n}{{}c{}}0000000000000000000{{{Dh{c}}}{{Dh{Ab}}}{}}000000000{{{Dj{c}}}{{Dj{Ab}}}{}}000000000{{{Dl{c}}}{{Dl{Ab}}}{}}000000000{{{B`{c}}}e{}{}}00000000044444444444444444444{{}{{Dd{cc}}}{}}000{{}{{Dn{c}}}{}}0000000006666666666{{}{{E`{c}}}{}}{{}{{E`{{Al{c}}}}}{}}101010011001010101{GlGl}{G`Fl}{{GhGf}Fn}{{{l{Gh}}{l{Gh}}}{{Al{Bl}}}}{{{l{jFj}}Fl}n}{{{l{jFj}}C`}Fl}{{{l{Fl}}c}CbEj}{{{l{Fn}}c}CbEj}{{{l{G`}}c}CbEj}{{{l{Gb}}c}CbEj}{{{l{Gd}}c}CbEj}{{{l{Fh}}c}CbEj}{{{l{Gf}}c}CbEj}{{{l{Gh}}c}CbEj}{{{l{jFl}}C`Gh}n}{{{l{jFj}}cBn}n{{Eh{{Gn{Ch}}}}}}{{{l{Fj}}}Gl}{{GhGh}c{}}{{{l{Gf}}Fh}Fh}{lc{}}00000000{{}{{Cb{c}}}{}}000000000{c{{Cb{e}}}{}{}}00000000{H`{{Cb{Ghc}}}{}}12222222222{{}{{Cb{c{Fd{c}}}}}{}}000000000{lFf}000000000{ce{}{}}000000000{{}c{}}000000000{l{{Al{{l{c}}}}}{}}000000000{{{l{jGl}}H`{l{jAh}}}Cf}{{{l{G`}}Fh{l{jAh}}}n}{{{l{Gb}}Fh{l{jAj}}}n}{{{l{Gd}}Fh{l{jA`}}}n}`{{{l{Fj}}{l{Ch}}}{{Al{Bn}}}}{{FjFl}Fj}{{FnHb}Fn}{{FlFn}Fl}{{FjcBn}Fj{{Eh{Fb}}}}````````````{eg{}{{b{c}}}{}}00<<<;;;{l{{l{Ab}}}}00{{{l{j}}}{{l{jAb}}}}00{l{{l{c}}}{}}00{{{l{j}}}{{l{jc}}}{}}00{{{B`{c}}}e{}{}}00{{}e{}{{Bb{c}}}}00{{}c{}}00{{{l{Hd}}}Hd}{{{l{Hf}}}Hf}{{l{l{jc}}}n{}}0{ln}0{ce{}{}}00{C`{{l{c}}}{}}00{C`{{l{jc}}}{}}00;;;{C`n}00{{{l{Hd}}{l{Hd}}}Cf}{{{l{Hf}}{l{Hf}}}Cf}{{l{l{c}}}Cf{}}00{{{l{Hh}}{l{jCj}}}Cl}{{{l{Hd}}{l{jCj}}}Cl}{{{l{Hf}}{l{jCj}}}Cl}{cc{}}00000000:::{{{l{jHh}}{Hl{Hj}}{l{jHn}}}Cf}{{{l{jHh}}{Hl{Hj}}{l{jHn}}}{{Al{I`}}}}{{}C`}00{{}c{}}00000{{{Dh{c}}}{{Dh{Ab}}}{}}00{{{Dj{c}}}{{Dj{Ab}}}{}}0{{{Dl{c}}}{{Dl{Ab}}}{}}00{{{B`{c}}}e{}{}}00444444{{}{{Dd{cc}}}{}}0{{}{{Dn{c}}}{}}00666{{}{{E`{c}}}{}}{{}{{E`{{Al{c}}}}}{}}0101{{{l{jHh}}{Id{Ib}}{l{jIf}}}{{Id{Ih}}}}{{}Ij}{{}Il}{InIj}{{{l{Hh}}}{{l{{J`{Bn}}}}}}0{{{l{jHh}}{Hl{Hj}}JbJd{l{jHn}}}Jf}{{{l{jHh}}{Hl{Hj}}JbJd{l{jHn}}}n}{{{l{jHh}}{Al{{Hl{Hj}}}}JbJd{l{jHn}}}n}{{{l{jHh}}JbJhJj{l{jHn}}}Jf}{{{J`{Ah}}}Hh}{{Hhc}Hh{{Ed{Hf}}Jl}}{{{l{jc}}}{{Cb{JnK`}}}{KbKd}}{{{l{jHh}}{l{jKf}}}n}{{}{{Cb{nK`}}}}{Kh{{Cb{nK`}}}}:{lc{}}0{{}{{Cb{c}}}{}}00{c{{Cb{e}}}{}{}}00111{{}{{Cb{c{Fd{c}}}}}{}}00{lFf}00{ce{}{}}00{{}c{}}00{{{l{jHh}}{l{jHn}}}n}{l{{Al{{l{c}}}}}{}}00````````````{eg{}{{b{c}}}{}}00044443333{l{{l{Ab}}}}000{{{l{j}}}{{l{jAb}}}}000{l{{l{c}}}{}}000{{{l{j}}}{{l{jc}}}{}}000{{{B`{c}}}e{}{}}000{{}e{}{{Bb{c}}}}0009999{{{l{Kj}}}Kj}{{l{l{jc}}}n{}}{ln}===={{}Kj}{C`{{l{c}}}{}}000{C`{{l{jc}}}{}}0009999{C`n}000`{{{l{Kj}}{l{Kj}}}Cf}{{{l{Kl}}{l{jCj}}}Cl}0{{l{l{Cn}}{l{jCj}}}{{Cb{nD`}}}}0{{{l{Kn}}{l{jCj}}}Cl}0{{{l{Kj}}{l{jCj}}}Cl}{cc{}}{L`Kl}{LbKl}2{L`Kn}{LdKn}4444444444{ce{}{}}000{{}C`}000{{}c{}}0000000{{{Dh{c}}}{{Dh{Ab}}}{}}000{{{Dj{c}}}{{Dj{Ab}}}{}}000{{{Dl{c}}}{{Dl{Ab}}}{}}000{{{B`{c}}}e{}{}}00044444444{{}{{Dn{c}}}{}}0005555{{}{{E`{c}}}{}}{{}{{E`{{Al{c}}}}}{}}100101{LfIj}{{}Il}{{{l{jc}}}{{Cb{JnK`}}}{KbKd}}{{{l{Lh}}}{{Cb{KjKl}}}}{{}{{Cb{nK`}}}}{Kh{{Cb{nK`}}}}`{KjLf}{lc{}}{lF`}0{lFb}0{{}{{Cb{c}}}{}}000{c{{Cb{e}}}{}{}}0001111{{}{{Cb{c{Fd{c}}}}}{}}000{lFf}000{ce{}{}}000{{}c{}}000{l{{Al{{l{c}}}}}{}}000{{{l{Kj}}{l{Lh}}}{{Cb{nKn}}}}","D":"ACb","p":[[10,"TransformMatrix",1694],[5,"Coordinate",0],[5,"Vector",0],[5,"Rotation",0],[0,"mut"],[1,"reference"],[1,"unit"],[5,"Joint",0],[10,"Any",1695],[5,"BoneId",0],[5,"BoneAxis",0],[5,"Skeleton",0],[5,"Bone",0],[6,"Option",1696],[1,"slice"],[5,"BakedParameters",1697],[10,"CastFrom",1698],[5,"Angle",0],[6,"BoneKind",0],[5,"JointId",0],[6,"BoneEnd",0],[6,"Ordering",1699],[1,"f32"],[1,"usize"],[6,"Result",1700],[10,"Deserializer",1701],[1,"bool"],[1,"str"],[5,"Formatter",1702],[8,"Result",1702],[5,"WidgetContext",1703],[5,"Error",1702],[5,"LabeledBoneKind",0],[1,"tuple"],[10,"Hasher",1704],[5,"Box",1705],[5,"Arc",1706],[5,"Rc",1707],[6,"ReadOnly",1708],[6,"Value",1708],[17,"Output"],[10,"FnMut",1709],[5,"ZeroToOne",1710],[10,"Into",1711],[10,"Serializer",1712],[5,"RangeInclusive",1713],[6,"Progress",1714],[5,"SmolStr",1715],[5,"String",1716],[5,"OutOfBounds",1717],[5,"TypeId",1695],[6,"Value",779],[5,"Animation",779],[5,"Timeline",779],[5,"Keyframe",779],[6,"Target",779],[6,"BoneProperty",779],[6,"JointProperty",779],[6,"PropertyUpdate",779],[5,"Frame",779],[1,"u32"],[5,"RunningAnimation",779],[6,"Cow",1718],[5,"Duration",1719],[6,"StandardEasing",1720],[6,"Target",1327],[6,"SkeletonMutation",1327],[5,"SkeletonCanvas",1327],[5,"Px",1721],[5,"Point",1722],[5,"EventContext",1703],[6,"CursorIcon",1723],[6,"ConstraintLimit",1724],[5,"Size",1725],[5,"LayoutContext",1703],[5,"UPx",1721],[5,"WidgetInstance",1726],[5,"Window",1727],[5,"WidgetTag",1726],[5,"Dynamic",1708],[6,"DeviceId",1727],[6,"MouseButton",1728],[8,"EventHandling",1726],[6,"MouseScrollDelta",1728],[6,"TouchPhase",1728],[10,"Send",1729],[5,"WindowHandle",1727],[6,"EventLoopError",1730],[10,"Application",1731],[10,"Sized",1729],[5,"GraphicsContext",1703],[5,"PendingApp",1731],[5,"EditingSkeleton",1495],[6,"ReadError",1495],[6,"SaveError",1495],[5,"Error",1732],[5,"Error",1733],[5,"PersistError",1734],[5,"SkeletonEditor",1495],[5,"Path",1735],[15,"Jointed",775],[15,"Rigid",775],[15,"Bone",1322],[15,"Joint",1322],[15,"SetDesiredEnd",1491],[15,"SetJointRotation",1491]],"r":[],"b":[[32,"impl-Add-for-Coordinate"],[33,"impl-Add%3CVector%3E-for-Coordinate"],[35,"impl-Add-for-Vector"],[36,"impl-Add%3CRotation%3E-for-Vector"],[318,"impl-Display-for-Angle"],[319,"impl-Debug-for-Angle"],[322,"impl-Display-for-Rotation"],[323,"impl-Debug-for-Rotation"],[400,"impl-Index%3CJointId%3E-for-Skeleton"],[401,"impl-Index%3CBoneId%3E-for-Skeleton"],[404,"impl-IndexMut%3CBoneId%3E-for-Skeleton"],[405,"impl-IndexMut%3CJointId%3E-for-Skeleton"],[644,"impl-Sub%3CVector%3E-for-Coordinate"],[645,"impl-Sub-for-Coordinate"],[1027,"impl-From%3Cbool%3E-for-Value"],[1028,"impl-From%3CVector%3E-for-Value"],[1029,"impl-From%3Cf32%3E-for-Value"],[1569,"impl-Display-for-ReadError"],[1570,"impl-Debug-for-ReadError"],[1573,"impl-Debug-for-SaveError"],[1574,"impl-Display-for-SaveError"],[1577,"impl-From%3CError%3E-for-ReadError"],[1578,"impl-From%3CError%3E-for-ReadError"],[1580,"impl-From%3CError%3E-for-SaveError"],[1581,"impl-From%3CPersistError%3E-for-SaveError"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAAUGJAAUABIAKAA0AGQAQACmAC0A1wAEAN4AIwAEARsAIwEXAD4BEABRAQAAUwEAAFUBAABXAQAAYAEpAIsBAwCRAQEAlQEOALEBmgBZAgIAXwIBAGUCBQBwAgsAhQIEAIsCCQCWAgMAmwJnAAwD8AAEBAIACgQtAEIELwF1BQ0AhgWiACoGAQAtBgEAMQYPAEUGWQA="}]]')); if (typeof exports !== 'undefined') exports.searchIndex = searchIndex; else if (window.initSearch) window.initSearch(searchIndex); -//{"start":39,"fragment_lengths":[6301,21305]} \ No newline at end of file +//{"start":39,"fragment_lengths":[872,24422]} \ No newline at end of file diff --git a/main/search.desc/FunnyBones/FunnyBones-desc-0-.js b/main/search.desc/FunnyBones/FunnyBones-desc-0-.js index ee95455..0ddc89f 100644 --- a/main/search.desc/FunnyBones/FunnyBones-desc-0-.js +++ b/main/search.desc/FunnyBones/FunnyBones-desc-0-.js @@ -1 +1 @@ -searchState.loadedDescShard("FunnyBones", 0, "The FunnyBones 2D Animation Editor.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).") \ No newline at end of file +searchState.loadedDescShard("FunnyBones", 0, "The FunnyBones 2D Animation Editor.") \ No newline at end of file diff --git a/main/search.desc/funnybones/funnybones-desc-0-.js b/main/search.desc/funnybones/funnybones-desc-0-.js index e0c74ff..456e8dd 100644 --- a/main/search.desc/funnybones/funnybones-desc-0-.js +++ b/main/search.desc/funnybones/funnybones-desc-0-.js @@ -1 +1 @@ -searchState.loadedDescShard("funnybones", 0, "FunnyBones is considered experimental and unsupported …\nThe first end of a bone.\nA value representing a rotation between 0. and .\nThe second end of a bone.\nA bone in a Skeleton.\nA specific end of a specific bone.\nA specific end of a Bone.\nThe unique ID of a Bone in a Skeleton.\nA representation of a bone structure inside of a Skeleton.\nA two dimensionsional offset/measurement.\nA connection between two bones.\nThe unique ID of a Joint in a Skeleton.\nTwo bones connected with a joint that automatically …\nA BoneKind with an associated label.\nThe maximum rotation represented by this type.\nThe minimum rotation represented by this type.\nA single bone of a fixed length.\nA value representing a rotation in 2d space.\nA collection of Bones. connected by Joints.\nA 2D Euclidean vector.\nReturns the rotation of this joint.\nReturns the angle formed a line passing through 0,0 …\nReturns the first axis of this bone.\nReturns the second axis of this bone.\nReturns the bone for a given id, or none if not found.\nThe unique id of the bone of this axis.\nReturns an exclusive reference to the bone for a given id, …\nReturns the list of bones in this skeleton.\nReturns this angle constrained between 0 and .\nReturns a list of joints connected to a specific bone axis.\nReturns the cosine of this angle.\nWidgets for editing and rendering skeletons.\nReturns an angle representing the given degrees.\nReturns a rotation representing the given degrees.\nReturns the location this bone is being aimed towards.\nThe direction the vector is heading.\nReturns the solved end position of this bone.\nThe end of the bone being referenced.\nReturns the angle of the previous bone segment connecting …\nReturns a vector representing the final segment in this …\nFinds an existing Bone by its label.\nFinds an existing Joint by its label.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the full length of this bone.\nReturns the unique id of this bone.\nReturns the unique id of this joint.\nReturns the index of this bone within the skeleton.\nReturns the index of this joint within the skeleton.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns the opposite axis on the same bone.\nReturns the opposite end of self.\nReturns true if this is a jointed bone that bends …\nReturns true if this bone is the root of the skeleton.\nReturns the joint for a given id, or none if not found.\nReturns an exclusive reference to the joint for a given …\nReturns the list of joints in this skeleton.\nReturns the kind of this bone.\nThe bone to create.\nReturns an exclusive reference to the kind of this bone.\nReturns the label this bone was created with.\nReturns the label of this joint.\nThe label of the bone.\nReturns the magnitude of this vector.\nThe length of the vector.\nReturns the result of mapping x and y to f.\nReturns a new vector from the x and y values.\nReturns a new vector for the given magnitude and direction.\nReturns a new joint formed by joining bone_a and bone_b at …\nGiven axis is one of the two connections in this joint, …\nCreates a new Bone into the skeleton. Returns the unique …\nCreates a new Joint in the skeleton, connecting two bones …\nReturns an angle representing the given radians.\nReturns a rotation representing the given radians.\nReturns the base rotation being applied to the entire …\nSets the angle to form between these joints.\nSets a relative position to aim the end of this bone …\nSets whether to bend inversely.\nSets a base rotation to apply to the entire skeleton.\nSets a translation to be applied to the entire skeleton.\nReturns the sine of this angle.\nUpdates the solved positions of all bones in this skeleton …\nIf this is a BoneKind::Jointed bone, returns the solved …\nReturns the solved start position of this bone.\nReturns this rotation represented in degrees.\nReturns this rotation represented in radians.\nReturns the translation applied to the entire skeleton.\nReturns a vector pointing from self to other.\nAttaches a label to this bone when pushed into a skeleton.\nLabels this joint and returns self.\nThe x-axis component of this vector.\nThe y-axis component of this vector.\nThe length of the bone connected furthes from the root of …\nThe bend of the simulated joint always goes in one of two …\nThe length of the bone.\nThe length of the bone connected closest to the root of the\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).") \ No newline at end of file +searchState.loadedDescShard("funnybones", 0, "FunnyBones is considered experimental and unsupported …\nThe first end of a bone.\nA value representing a rotation between 0. and .\nThe second end of a bone.\nA bone in a Skeleton.\nA specific end of a specific bone.\nA specific end of a Bone.\nThe unique ID of a Bone in a Skeleton.\nA representation of a bone structure inside of a Skeleton.\nA two dimensionsional offset/measurement.\nA connection between two bones.\nThe unique ID of a Joint in a Skeleton.\nTwo bones connected with a joint that automatically …\nA BoneKind with an associated label.\nThe maximum rotation represented by this type.\nThe minimum rotation represented by this type.\nA single bone of a fixed length.\nA value representing a rotation in 2d space.\nA collection of Bones. connected by Joints.\nA 2D Euclidean vector.\nReturns the rotation of this joint.\nReturns the angle formed a line passing through 0,0 …\nReturns the first axis of this bone.\nReturns the second axis of this bone.\nReturns the bone for a given id, or none if not found.\nThe unique id of the bone of this axis.\nReturns an exclusive reference to the bone for a given id, …\nReturns the list of bones in this skeleton.\nReturns this angle constrained between 0 and .\nReturns a list of joints connected to a specific bone axis.\nReturns the cosine of this angle.\nWidgets for editing and rendering skeletons.\nReturns an angle representing the given degrees.\nReturns a rotation representing the given degrees.\nReturns the location this bone is being aimed towards.\nThe direction the vector is heading.\nReturns the solved end position of this bone.\nThe end of the bone being referenced.\nReturns the angle of the previous bone segment connecting …\nReturns a vector representing the final segment in this …\nFinds an existing Bone by its label.\nFinds an existing Joint by its label.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the full length of this bone.\nReturns the unique id of this bone.\nReturns the unique id of this joint.\nReturns the index of this bone within the skeleton.\nReturns the index of this joint within the skeleton.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns the opposite axis on the same bone.\nReturns the opposite end of self.\nReturns true if this is a jointed bone that bends …\nReturns true if this bone is the root of the skeleton.\nReturns the joint for a given id, or none if not found.\nReturns an exclusive reference to the joint for a given …\nReturns the list of joints in this skeleton.\nReturns the kind of this bone.\nThe bone to create.\nReturns an exclusive reference to the kind of this bone.\nReturns the label this bone was created with.\nReturns the label of this joint.\nThe label of the bone.\nReturns the magnitude of this vector.\nThe length of the vector.\nReturns the result of mapping x and y to f.\nReturns a new vector from the x and y values.\nReturns a new vector for the given magnitude and direction.\nReturns a new joint formed by joining bone_a and bone_b at …\nGiven axis is one of the two connections in this joint, …\nCreates a new Bone into the skeleton. Returns the unique …\nCreates a new Joint in the skeleton, connecting two bones …\nReturns an angle representing the given radians.\nReturns a rotation representing the given radians.\nReturns the base rotation being applied to the entire …\nSets the angle to form between these joints.\nSets a relative position to aim the end of this bone …\nSets whether to bend inversely.\nSets a base rotation to apply to the entire skeleton.\nSets a translation to be applied to the entire skeleton.\nReturns the sine of this angle.\nUpdates the solved positions of all bones in this skeleton …\nIf this is a BoneKind::Jointed bone, returns the solved …\nReturns the solved start position of this bone.\nReturns this rotation represented in degrees.\nReturns this rotation represented in radians.\nReturns the translation applied to the entire skeleton.\nReturns a vector pointing from self to other.\nAttaches a label to this bone when pushed into a skeleton.\nLabels this joint and returns self.\nThe x-axis component of this vector.\nThe y-axis component of this vector.\nThe length of the bone connected furthes from the root of …\nThe bend of the simulated joint always goes in one of two …\nThe length of the bone.\nThe length of the bone connected closest to the root of the\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).") \ No newline at end of file diff --git a/main/src-files.js b/main/src-files.js index 768fc28..c58d59d 100644 --- a/main/src-files.js +++ b/main/src-files.js @@ -1,3 +1,3 @@ -var srcIndex = new Map(JSON.parse('[["FunnyBones",["",[],["funnybones.rs"]]],["funnybones",["",[["cushy",[],["skeleton_canvas.rs"]]],["animation.rs","cushy.rs","lib.rs","serde.rs"]]]]')); +var srcIndex = new Map(JSON.parse('[["FunnyBones",["",[],["funnybones.rs"]]],["funnybones",["",[["cushy",[],["skeleton_canvas.rs"]]],["animation.rs","cushy.rs","editor.rs","lib.rs","serde.rs"]]]]')); createSrcSidebar(); -//{"start":36,"fragment_lengths":[40,106]} \ No newline at end of file +//{"start":36,"fragment_lengths":[40,118]} \ No newline at end of file diff --git a/main/src/FunnyBones/funnybones.rs.html b/main/src/FunnyBones/funnybones.rs.html index feb407c..fe92367 100644 --- a/main/src/FunnyBones/funnybones.rs.html +++ b/main/src/FunnyBones/funnybones.rs.html @@ -158,577 +158,19 @@ 157 158 159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331 -332 -333 -334 -335 -336 -337 -338 -339 -340 -341 -342 -343 -344 -345 -346 -347 -348 -349 -350 -351 -352 -353 -354 -355 -356 -357 -358 -359 -360 -361 -362 -363 -364 -365 -366 -367 -368 -369 -370 -371 -372 -373 -374 -375 -376 -377 -378 -379 -380 -381 -382 -383 -384 -385 -386 -387 -388 -389 -390 -391 -392 -393 -394 -395 -396 -397 -398 -399 -400 -401 -402 -403 -404 -405 -406 -407 -408 -409 -410 -411 -412 -413 -414 -415 -416 -417 -418 -419 -420 -421 -422 -423 -424 -425 -426 -427 -428 -429 -430 -431 -432 -433 -434 -435 -436 -437 -438 -439 -440 -441 -442 -443 -444 -445 -446 -447 -448 -449 -450 -451 -452 -453 -454 -455 -456 -457 -458 -459 -460 -461 -462 -463 -464 -465 -466 -467 -468 -469 -470 -471 -472 -473 -474 -475 -476 -477 -478 -479 -480 -481 -482 -483 -484 -485 -486 -487 -488 -489 -490 -491 -492 -493 -494 -495 -496 -497 -498 -499 -500 -501 -502 -503 -504 -505 -506 -507 -508 -509 -510 -511 -512 -513 -514 -515 -516 -517 -518 -519 -520 -521 -522 -523 -524 -525 -526 -527 -528 -529 -530 -531 -532 -533 -534 -535 -536 -537 -538 -539 -540 -541 -542 -543 -544 -545 -546 -547 -548 -549 -550 -551 -552 -553 -554 -555 -556 -557 -558 -559 -560 -561 -562 -563 -564 -565 -566 -567 -568 -569 -570 -571 -572 -573 -574 -575 -576 -577 -578 -579 -580 -581 -582 -583 -584 -585 -586 -587 -588 -589 -590 -591 -592 -593 -594 -595 -596 -597 -598 -599 -600 -601 -602 -603 -604 -605 -606 -607 -608 -609 -610 -611 -612 -613 -614 -615 -616 -617 -618 -619 -620 -621 -622 -623 -624 -625 -626 -627 -628 -629 -630 -631 -632 -633 -634 -635 -636 -637 -638 -639 -640 -641 -642 -643 -644 -645 -646 -647 -648 -649 -650 -651 -652 -653 -654 -655 -656 -657 -658 -659 -660 -661 -662 -663 -664 -665 -666 -667 -668 -669 -670 -671 -672 -673 -674 -675 -676 -677 -678 -679 -680 -681 -682 -683 -684 -685 -686 -687 -688 -689 -690 -691 -692 -693 -694 -695 -696 -697 -698 -699 -700 -701 -702 -703 -704 -705 -706

//! The FunnyBones 2D Animation Editor.
+160
//! The FunnyBones 2D Animation Editor.
 
-use std::{
-    fmt::Display,
-    fs,
-    io::{self, BufWriter},
-    ops::ControlFlow,
-    path::{Path, PathBuf},
-};
+use std::path::PathBuf;
 
 use cushy::{
-    animation::ZeroToOne,
     kludgine::app::winit::keyboard::ModifiersState,
-    value::{Destination, Dynamic, DynamicRead, Source, Switchable, Watcher},
-    widget::{MakeWidget, SharedCallback, WidgetList, HANDLED},
-    widgets::{checkbox::Checkable, input::InputValue, layers::Modal, slider::Slidable, Space},
+    value::{Destination, Dynamic, DynamicRead},
+    widget::{MakeWidget, SharedCallback, HANDLED},
+    widgets::layers::Modal,
     window::{MakeWindow, PendingWindow, Window, WindowHandle},
     App, Application, ModifiersStateExt, Open, PendingApp, WithClone,
 };
-use funnybones::{
-    cushy::skeleton_canvas::{SkeletonCanvas, SkeletonMutation},
-    Angle, BoneAxis, BoneId, BoneKind, Joint, JointId, LabeledBoneKind, Rotation, Skeleton, Vector,
-};
-use serde::{Deserialize, Serialize};
-use tempfile::{NamedTempFile, PersistError};
+use funnybones::editor::{EditingSkeleton, SaveError};
 
 fn main() -> cushy::Result {
     let pending_app = PendingApp::default();
@@ -747,55 +189,13 @@
         EditingSkeleton::default()
     };
     let path = Dynamic::new(path);
-    let watcher = Watcher::default();
-    let skeleton = watcher.map_changed({
-        let editing_skeleton = editing_skeleton.clone();
-        move || {
-            let mut skeleton = Skeleton::default();
-            skeleton.set_rotation(editing_skeleton.root.joint_angle.get().into());
-            let (kind, _vector) = editing_skeleton.root.as_bone_kind();
-            let root = skeleton.push_bone(kind);
-
-            add_bones_to_skeleton(
-                root.axis_b(),
-                &editing_skeleton.root.connected_bones,
-                &mut skeleton,
-            );
-            add_bones_to_skeleton(root.axis_a(), &editing_skeleton.a_bones, &mut skeleton);
-            skeleton
-        }
-    });
-    let bones_editor = skeleton_editor(&editing_skeleton, &watcher).make_widget();
-
-    let canvas = SkeletonCanvas::new(skeleton).on_mutate({
-        let editing_skeleton = editing_skeleton.clone();
-        move |mutation| match mutation {
-            SkeletonMutation::SetDesiredEnd { bone, end } => {
-                let bone = editing_skeleton.find_bone(bone).expect("missing bone");
-                bone.desired_length.set(end.magnitude);
-                bone.joint_angle.set(end.direction.into());
-            }
-            SkeletonMutation::SetJointRotation { joint, rotation } => editing_skeleton
-                .find_joint(joint)
-                .expect("missing joint")
-                .joint_angle
-                .set(rotation.into()),
-        }
-    });
-    let zoom = canvas
-        .scale()
-        .clone()
-        .slider_between(canvas.minimum_scale(), canvas.maximum_scale());
 
     let on_error = SharedCallback::new(|err: SaveError| {
         todo!("show {err}");
     });
+    let skeleton_editor = funnybones::editor::skeleton_editor(editing_skeleton.clone());
 
-    bones_editor
-        .vertical_scroll()
-        .expand()
-        .and(canvas.expand().and(zoom).into_rows().expand())
-        .into_columns()
+    skeleton_editor
         .expand()
         .and(modals.clone())
         .into_layers()
@@ -895,498 +295,6 @@
         .visible(visible)
 }
 
-fn add_bones_to_skeleton(
-    connected_to: BoneAxis,
-    bones: &Dynamic<Vec<SkeletalBone>>,
-    skeleton: &mut Skeleton,
-) {
-    let bones = bones.read();
-    for bone in &*bones {
-        let (kind, vector) = bone.as_bone_kind();
-        let angle = if let BoneKind::Jointed { .. } = &kind.kind {
-            Rotation::default()
-        } else {
-            bone.joint_angle.get().into()
-        };
-        let new_bone = skeleton.push_bone(kind);
-        skeleton[new_bone].set_desired_end(Some(vector));
-        skeleton.push_joint(
-            Joint::new(angle, connected_to, new_bone.axis_a()).with_label(bone.joint_label.get()),
-        );
-        add_bones_to_skeleton(new_bone.axis_b(), &bone.connected_bones, skeleton);
-    }
-}
-
-#[derive(Serialize, Deserialize, Debug)]
-struct SerializedSkeleton {
-    root: SerializedBone,
-    a_bones: Vec<SerializedBone>,
-}
-
-#[derive(Serialize, Deserialize, Debug)]
-struct SerializedBone {
-    label: String,
-    joint_label: String,
-    joint_angle: Angle,
-    length: f32,
-    jointed: bool,
-    joint_ratio: ZeroToOne,
-    inverse: bool,
-    desired_length: f32,
-    connected_bones: Vec<SerializedBone>,
-}
-
-#[derive(Debug)]
-enum ReadError {
-    Io(io::Error),
-    Rsn(rsn::de::Error),
-}
-
-impl From<io::Error> for ReadError {
-    fn from(value: io::Error) -> Self {
-        Self::Io(value)
-    }
-}
-
-impl From<rsn::de::Error> for ReadError {
-    fn from(value: rsn::de::Error) -> Self {
-        Self::Rsn(value)
-    }
-}
-
-impl Display for ReadError {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        match self {
-            ReadError::Io(err) => Display::fmt(err, f),
-            ReadError::Rsn(err) => Display::fmt(err, f),
-        }
-    }
-}
-
-#[derive(Debug)]
-enum SaveError {
-    Io(io::Error),
-    InvalidPath,
-}
-
-impl From<io::Error> for SaveError {
-    fn from(err: io::Error) -> Self {
-        Self::Io(err)
-    }
-}
-
-impl From<PersistError> for SaveError {
-    fn from(err: PersistError) -> Self {
-        Self::Io(err.error)
-    }
-}
-
-impl Display for SaveError {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        match self {
-            SaveError::Io(err) => Display::fmt(err, f),
-            SaveError::InvalidPath => f.write_str("invalid file path"),
-        }
-    }
-}
-
-#[derive(Clone, Debug, PartialEq, Default)]
-struct EditingSkeleton {
-    root: SkeletalBone,
-    a_bones: Dynamic<Vec<SkeletalBone>>,
-}
-
-impl EditingSkeleton {
-    fn read_from(path: &Path) -> Result<Self, ReadError> {
-        let contents = fs::read(path)?;
-        let skeleton = rsn::from_slice::<SerializedSkeleton>(&contents)?;
-        Ok(Self::from(skeleton))
-    }
-
-    fn write_to(&self, path: &Path) -> Result<(), SaveError> {
-        let skeleton = SerializedSkeleton::from(self);
-        let parent = path.parent().ok_or(SaveError::InvalidPath)?;
-        let mut temp_file = NamedTempFile::new_in(parent)?;
-        let mut writer = BufWriter::new(temp_file.as_file_mut());
-        rsn::ser::Config::pretty().serialize_to_writer(&skeleton, &mut writer)?;
-        writer
-            .into_inner()
-            .map_err(io::IntoInnerError::into_error)?;
-        temp_file.persist(path)?;
-
-        Ok(())
-    }
-
-    fn find_bone(&self, id: BoneId) -> Option<SkeletalBone> {
-        let mut index = id.index();
-        if index == 0 {
-            Some(self.root.clone())
-        } else {
-            index -= 1;
-            match Self::find_bone_in(&self.root.connected_bones, index) {
-                ControlFlow::Continue(index) => match Self::find_bone_in(&self.a_bones, index) {
-                    ControlFlow::Break(bone) => Some(bone),
-                    ControlFlow::Continue(_) => None,
-                },
-                ControlFlow::Break(bone) => Some(bone),
-            }
-        }
-    }
-
-    fn find_bone_in(
-        bones: &Dynamic<Vec<SkeletalBone>>,
-        mut index: usize,
-    ) -> ControlFlow<SkeletalBone, usize> {
-        let bones = bones.read();
-        for bone in &*bones {
-            if index == 0 {
-                return ControlFlow::Break(bone.clone());
-            }
-
-            index -= 1;
-            index = Self::find_bone_in(&bone.connected_bones, index)?;
-        }
-
-        ControlFlow::Continue(index)
-    }
-
-    fn find_joint(&self, id: JointId) -> Option<SkeletalBone> {
-        let index = id.index();
-        match Self::find_joint_in(&self.root.connected_bones, index) {
-            ControlFlow::Continue(index) => match Self::find_joint_in(&self.a_bones, index) {
-                ControlFlow::Break(bone) => Some(bone),
-                ControlFlow::Continue(_) => None,
-            },
-            ControlFlow::Break(bone) => Some(bone),
-        }
-    }
-
-    fn find_joint_in(
-        bones: &Dynamic<Vec<SkeletalBone>>,
-        mut index: usize,
-    ) -> ControlFlow<SkeletalBone, usize> {
-        let bones = bones.read();
-        for bone in &*bones {
-            if index == 0 {
-                return ControlFlow::Break(bone.clone());
-            }
-
-            index -= 1;
-            index = Self::find_bone_in(&bone.connected_bones, index)?;
-        }
-
-        ControlFlow::Continue(index)
-    }
-}
-
-impl From<&'_ EditingSkeleton> for SerializedSkeleton {
-    fn from(skeleton: &'_ EditingSkeleton) -> Self {
-        Self {
-            root: SerializedBone::from(&skeleton.root),
-            a_bones: skeleton
-                .a_bones
-                .map_ref(|bones| bones.iter().map(SerializedBone::from).collect()),
-        }
-    }
-}
-
-impl From<SerializedSkeleton> for EditingSkeleton {
-    fn from(skeleton: SerializedSkeleton) -> Self {
-        Self {
-            root: SkeletalBone::from(skeleton.root),
-            a_bones: Dynamic::new(
-                skeleton
-                    .a_bones
-                    .into_iter()
-                    .map(SkeletalBone::from)
-                    .collect(),
-            ),
-        }
-    }
-}
-
-#[derive(Clone, Debug, PartialEq)]
-struct SkeletalBone {
-    label: Dynamic<String>,
-    joint_label: Dynamic<String>,
-    joint_angle: Dynamic<Angle>,
-    length: Dynamic<f32>,
-    jointed: Dynamic<bool>,
-    joint_ratio: Dynamic<ZeroToOne>,
-    inverse: Dynamic<bool>,
-    desired_length: Dynamic<f32>,
-    connected_bones: Dynamic<Vec<SkeletalBone>>,
-}
-
-impl SkeletalBone {
-    pub fn as_bone_kind(&self) -> (LabeledBoneKind, Vector) {
-        let length = self.length.get();
-        let (vector_length, kind) = if self.jointed.get() {
-            let joint_ratio = self.joint_ratio.get();
-            let start_length = length * *joint_ratio;
-            let end_length = length - start_length;
-            (
-                self.desired_length.get(),
-                BoneKind::Jointed {
-                    start_length,
-                    end_length,
-                    inverse: self.inverse.get(),
-                },
-            )
-        } else {
-            (
-                length,
-                BoneKind::Rigid {
-                    length: self.length.get(),
-                },
-            )
-        };
-
-        (
-            kind.with_label(self.label.get()),
-            Vector::new(vector_length, self.joint_angle.get().into()),
-        )
-    }
-}
-
-impl Default for SkeletalBone {
-    fn default() -> Self {
-        Self {
-            joint_label: Dynamic::default(),
-            joint_angle: Dynamic::default(),
-            label: Dynamic::default(),
-            length: Dynamic::new(1.),
-            jointed: Dynamic::default(),
-            joint_ratio: Dynamic::new(ZeroToOne::new(0.5)),
-            inverse: Dynamic::default(),
-            desired_length: Dynamic::default(),
-            connected_bones: Dynamic::default(),
-        }
-    }
-}
-
-impl From<&'_ SkeletalBone> for SerializedBone {
-    fn from(bone: &'_ SkeletalBone) -> Self {
-        Self {
-            label: bone.label.get(),
-            joint_label: bone.joint_label.get(),
-            joint_angle: bone.joint_angle.get(),
-            length: bone.length.get(),
-            jointed: bone.jointed.get(),
-            joint_ratio: bone.joint_ratio.get(),
-            inverse: bone.inverse.get(),
-            desired_length: bone.desired_length.get(),
-            connected_bones: bone
-                .connected_bones
-                .map_ref(|bones| bones.iter().map(Self::from).collect()),
-        }
-    }
-}
-
-impl From<SerializedBone> for SkeletalBone {
-    fn from(bone: SerializedBone) -> Self {
-        Self {
-            label: Dynamic::new(bone.label),
-            joint_label: Dynamic::new(bone.joint_label),
-            joint_angle: Dynamic::new(bone.joint_angle),
-            length: Dynamic::new(bone.length),
-            jointed: Dynamic::new(bone.jointed),
-            joint_ratio: Dynamic::new(bone.joint_ratio),
-            inverse: Dynamic::new(bone.inverse),
-            desired_length: Dynamic::new(bone.desired_length),
-            connected_bones: Dynamic::new(
-                bone.connected_bones.into_iter().map(Self::from).collect(),
-            ),
-        }
-    }
-}
-
-fn skeleton_editor(skeleton: &EditingSkeleton, watcher: &Watcher) -> impl MakeWidget {
-    bone_property_editor(skeleton.root.clone(), watcher, true)
-        .and(bones_editor(
-            "Upper Root Bones",
-            &skeleton.root.connected_bones,
-            watcher,
-        ))
-        .and(bones_editor("Lower Root Bones", &skeleton.a_bones, watcher))
-        .into_rows()
-        .pad()
-        .vertical_scroll()
-}
-
-fn bones_editor(
-    label: &str,
-    bones: &Dynamic<Vec<SkeletalBone>>,
-    watcher: &Watcher,
-) -> impl MakeWidget {
-    watcher.watch(bones);
-    let bone_editors = Dynamic::new(
-        bones
-            .read()
-            .iter()
-            .map(|bone| bone_editor(bone.clone(), watcher).make_widget())
-            .collect::<WidgetList>(),
-    );
-    let collapsed = Dynamic::new(true);
-    let add = "+".into_button().on_click({
-        let bones = bones.clone();
-        let bone_editors = bone_editors.clone();
-        let watcher = watcher.clone();
-        let collapsed = collapsed.clone();
-        move |_| {
-            let new_bone = SkeletalBone::default();
-            bones.lock().push(new_bone.clone());
-            bone_editors.lock().push(bone_editor(new_bone, &watcher));
-            collapsed.set(false);
-        }
-    });
-    bone_editors
-        .into_rows()
-        .disclose()
-        .labelled_by(label.align_left().expand().and(add).into_columns())
-        .collapsed(collapsed)
-        .contain()
-}
-fn bone_editor(bone: SkeletalBone, watcher: &Watcher) -> impl MakeWidget {
-    let bones = bones_editor("Connected Bones", &bone.connected_bones, watcher);
-    bone_property_editor(bone, watcher, false)
-        .and(bones)
-        .into_rows()
-}
-
-#[allow(clippy::too_many_lines)]
-fn bone_property_editor(bone: SkeletalBone, watcher: &Watcher, is_root: bool) -> impl MakeWidget {
-    watcher.watch(&bone.joint_label);
-    watcher.watch(&bone.inverse);
-    watcher.watch(&bone.jointed);
-    watcher.watch(&bone.label);
-    watcher.watch(&bone.length);
-    watcher.watch(&bone.joint_angle);
-    watcher.watch(&bone.joint_ratio);
-    watcher.watch(&bone.desired_length);
-
-    let columns_wide = 3 + u8::from(!is_root);
-
-    bone.jointed
-        .for_each_cloned({
-            let mut was_jointed = bone.jointed.get();
-            let desired_length = bone.desired_length.clone();
-            let length = bone.length.clone();
-            move |jointed| {
-                if jointed && !was_jointed {
-                    // When enabling jointed, we want to initialize the desired
-                    // length to the current length.
-                    desired_length.set(length.get());
-                }
-                was_jointed = jointed;
-            }
-        })
-        .persist();
-
-    let first = Dynamic::new(bone.length.get().to_string());
-    let first_parsed = first.map_each(|s| s.parse::<f32>());
-    first_parsed
-        .for_each(move |result| {
-            let Ok(new_value) = result else { return };
-            bone.length.set(*new_value);
-        })
-        .persist();
-
-    let joint_label_editor = bone.joint_label.into_input().placeholder("Joint Name");
-    let label_editor = bone.label.into_input().placeholder("Bone Name");
-    let length_editor = first
-        .into_input()
-        .placeholder("Length")
-        .validation(first_parsed);
-
-    let jointed_editor = bone.jointed.clone().into_checkbox("Jointed");
-
-    let rotation = bone.joint_angle.slider();
-
-    let joint_angle = if is_root { "Rotation" } else { "Joint Angle" }
-        .align_left()
-        .and(rotation.clone())
-        .into_rows()
-        .expand()
-        .make_widget();
-
-    let joint_row = joint_angle
-        .clone()
-        .and(
-            "Midpoint"
-                .align_left()
-                .and(bone.joint_ratio.slider().with_enabled(bone.jointed.clone()))
-                .into_rows()
-                .fit_horizontally()
-                .align_top()
-                .expand(),
-        )
-        .and(
-            bone.inverse
-                .into_checkbox("Inverse")
-                .with_enabled(bone.jointed.clone())
-                .fit_horizontally(),
-        )
-        .and(Space::clear().expand_weighted(columns_wide - 3))
-        .into_columns()
-        .make_widget();
-
-    let non_joint_row = joint_angle
-        .and(Space::clear().expand_weighted(columns_wide - 1))
-        .into_columns()
-        .make_widget();
-
-    let second_row = bone
-        .jointed
-        .clone()
-        .switcher(move |jointed, _| {
-            if *jointed {
-                joint_row.clone()
-            } else {
-                non_joint_row.clone()
-            }
-        })
-        .make_widget();
-
-    let first_row = if is_root {
-        WidgetList::new()
-    } else {
-        WidgetList::new().and(
-            "Joint Name"
-                .align_left()
-                .and(joint_label_editor)
-                .into_rows()
-                .fit_horizontally()
-                .align_top()
-                .expand(),
-        )
-    };
-
-    first_row
-        .and(
-            "Bone Name"
-                .align_left()
-                .and(label_editor)
-                .into_rows()
-                .fit_horizontally()
-                .align_top()
-                .expand(),
-        )
-        .and(
-            "Bone Length"
-                .align_left()
-                .and(length_editor)
-                .into_rows()
-                .fit_horizontally()
-                .align_top()
-                .expand(),
-        )
-        .and(jointed_editor.fit_horizontally().expand())
-        .into_columns()
-        .and(second_row)
-        .into_rows()
-}
-
 fn open_file(app: &mut App, parent_window: &WindowHandle, close: bool) {
     parent_window.execute({
         let mut app = app.clone();
diff --git a/main/src/funnybones/editor.rs.html b/main/src/funnybones/editor.rs.html
new file mode 100644
index 0000000..ce86202
--- /dev/null
+++ b/main/src/funnybones/editor.rs.html
@@ -0,0 +1,1157 @@
+editor.rs - source
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
#![allow(missing_docs)]
+
+use std::{
+    fmt::Display,
+    fs,
+    io::{self, BufWriter},
+    ops::ControlFlow,
+    path::Path,
+};
+
+use cushy::{
+    animation::ZeroToOne,
+    value::{Destination, Dynamic, DynamicRead, Source, Switchable, Watcher},
+    widget::{MakeWidget, WidgetInstance, WidgetList},
+    widgets::{checkbox::Checkable, input::InputValue, slider::Slidable, Space},
+};
+use serde::{Deserialize, Serialize};
+use tempfile::{NamedTempFile, PersistError};
+
+use crate::{
+    cushy::skeleton_canvas::{SkeletonCanvas, SkeletonMutation},
+    Angle, BoneAxis, BoneId, BoneKind, Joint, JointId, LabeledBoneKind, Rotation, Skeleton, Vector,
+};
+
+pub struct SkeletonEditor {
+    pub editor: WidgetInstance,
+    pub skeleton: Dynamic<Skeleton>,
+}
+
+impl MakeWidget for SkeletonEditor {
+    fn make_widget(self) -> WidgetInstance {
+        self.editor
+    }
+}
+
+#[must_use]
+pub fn skeleton_editor(editing_skeleton: EditingSkeleton) -> SkeletonEditor {
+    let watcher = Watcher::default();
+    let skeleton = watcher.map_changed({
+        let editing_skeleton = editing_skeleton.clone();
+        move || {
+            let mut skeleton = Skeleton::default();
+            skeleton.set_rotation(editing_skeleton.root.joint_angle.get().into());
+            let (kind, _vector) = editing_skeleton.root.as_bone_kind();
+            let root = skeleton.push_bone(kind);
+
+            add_bones_to_skeleton(
+                root.axis_b(),
+                &editing_skeleton.root.connected_bones,
+                &mut skeleton,
+            );
+            add_bones_to_skeleton(root.axis_a(), &editing_skeleton.a_bones, &mut skeleton);
+            skeleton
+        }
+    });
+    let bones_editor = editing_skeleton.editor(&watcher);
+
+    let canvas = SkeletonCanvas::new(skeleton.clone()).on_mutate({
+        move |mutation| match mutation {
+            SkeletonMutation::SetDesiredEnd { bone, end } => {
+                let bone = editing_skeleton.find_bone(bone).expect("missing bone");
+                bone.desired_length.set(end.magnitude);
+                bone.joint_angle.set(end.direction.into());
+            }
+            SkeletonMutation::SetJointRotation { joint, rotation } => editing_skeleton
+                .find_joint(joint)
+                .expect("missing joint")
+                .joint_angle
+                .set(rotation.into()),
+        }
+    });
+    let zoom = canvas
+        .scale()
+        .clone()
+        .slider_between(canvas.minimum_scale(), canvas.maximum_scale());
+
+    SkeletonEditor {
+        editor: bones_editor
+            .vertical_scroll()
+            .expand()
+            .and(canvas.expand().and(zoom).into_rows().expand())
+            .into_columns()
+            .make_widget(),
+        skeleton,
+    }
+}
+
+fn add_bones_to_skeleton(
+    connected_to: BoneAxis,
+    bones: &Dynamic<Vec<SkeletalBone>>,
+    skeleton: &mut Skeleton,
+) {
+    let bones = bones.read();
+    for bone in &*bones {
+        let (kind, vector) = bone.as_bone_kind();
+        let angle = if let BoneKind::Jointed { .. } = &kind.kind {
+            Rotation::default()
+        } else {
+            bone.joint_angle.get().into()
+        };
+        let new_bone = skeleton.push_bone(kind);
+        skeleton[new_bone].set_desired_end(Some(vector));
+        skeleton.push_joint(
+            Joint::new(angle, connected_to, new_bone.axis_a()).with_label(bone.joint_label.get()),
+        );
+        add_bones_to_skeleton(new_bone.axis_b(), &bone.connected_bones, skeleton);
+    }
+}
+
+#[derive(Serialize, Deserialize, Debug)]
+struct SerializedSkeleton {
+    root: SerializedBone,
+    a_bones: Vec<SerializedBone>,
+}
+
+#[derive(Serialize, Deserialize, Debug)]
+struct SerializedBone {
+    label: String,
+    joint_label: String,
+    joint_angle: Angle,
+    length: f32,
+    jointed: bool,
+    joint_ratio: ZeroToOne,
+    inverse: bool,
+    desired_length: f32,
+    connected_bones: Vec<SerializedBone>,
+}
+
+#[derive(Debug)]
+pub enum ReadError {
+    Io(io::Error),
+    Rsn(rsn::de::Error),
+}
+
+impl From<io::Error> for ReadError {
+    fn from(value: io::Error) -> Self {
+        Self::Io(value)
+    }
+}
+
+impl From<rsn::de::Error> for ReadError {
+    fn from(value: rsn::de::Error) -> Self {
+        Self::Rsn(value)
+    }
+}
+
+impl Display for ReadError {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        match self {
+            ReadError::Io(err) => Display::fmt(err, f),
+            ReadError::Rsn(err) => Display::fmt(err, f),
+        }
+    }
+}
+
+#[derive(Debug)]
+pub enum SaveError {
+    Io(io::Error),
+    InvalidPath,
+}
+
+impl From<io::Error> for SaveError {
+    fn from(err: io::Error) -> Self {
+        Self::Io(err)
+    }
+}
+
+impl From<PersistError> for SaveError {
+    fn from(err: PersistError) -> Self {
+        Self::Io(err.error)
+    }
+}
+
+impl Display for SaveError {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        match self {
+            SaveError::Io(err) => Display::fmt(err, f),
+            SaveError::InvalidPath => f.write_str("invalid file path"),
+        }
+    }
+}
+
+#[derive(Clone, Debug, PartialEq, Default)]
+pub struct EditingSkeleton {
+    root: SkeletalBone,
+    a_bones: Dynamic<Vec<SkeletalBone>>,
+}
+
+impl EditingSkeleton {
+    pub fn read_from(path: &Path) -> Result<Self, ReadError> {
+        let contents = fs::read(path)?;
+        let skeleton = rsn::from_slice::<SerializedSkeleton>(&contents)?;
+        Ok(Self::from(skeleton))
+    }
+
+    pub fn write_to(&self, path: &Path) -> Result<(), SaveError> {
+        let skeleton = SerializedSkeleton::from(self);
+        let parent = path.parent().ok_or(SaveError::InvalidPath)?;
+        let mut temp_file = NamedTempFile::new_in(parent)?;
+        let mut writer = BufWriter::new(temp_file.as_file_mut());
+        rsn::ser::Config::pretty().serialize_to_writer(&skeleton, &mut writer)?;
+        writer
+            .into_inner()
+            .map_err(io::IntoInnerError::into_error)?;
+        temp_file.persist(path)?;
+
+        Ok(())
+    }
+
+    fn find_bone(&self, id: BoneId) -> Option<SkeletalBone> {
+        let mut index = id.index();
+        if index == 0 {
+            Some(self.root.clone())
+        } else {
+            index -= 1;
+            match Self::find_bone_in(&self.root.connected_bones, index) {
+                ControlFlow::Continue(index) => match Self::find_bone_in(&self.a_bones, index) {
+                    ControlFlow::Break(bone) => Some(bone),
+                    ControlFlow::Continue(_) => None,
+                },
+                ControlFlow::Break(bone) => Some(bone),
+            }
+        }
+    }
+
+    fn find_bone_in(
+        bones: &Dynamic<Vec<SkeletalBone>>,
+        mut index: usize,
+    ) -> ControlFlow<SkeletalBone, usize> {
+        let bones = bones.read();
+        for bone in &*bones {
+            if index == 0 {
+                return ControlFlow::Break(bone.clone());
+            }
+
+            index -= 1;
+            index = Self::find_bone_in(&bone.connected_bones, index)?;
+        }
+
+        ControlFlow::Continue(index)
+    }
+
+    fn find_joint(&self, id: JointId) -> Option<SkeletalBone> {
+        let index = id.index();
+        match Self::find_joint_in(&self.root.connected_bones, index) {
+            ControlFlow::Continue(index) => match Self::find_joint_in(&self.a_bones, index) {
+                ControlFlow::Break(bone) => Some(bone),
+                ControlFlow::Continue(_) => None,
+            },
+            ControlFlow::Break(bone) => Some(bone),
+        }
+    }
+
+    fn find_joint_in(
+        bones: &Dynamic<Vec<SkeletalBone>>,
+        mut index: usize,
+    ) -> ControlFlow<SkeletalBone, usize> {
+        let bones = bones.read();
+        for bone in &*bones {
+            if index == 0 {
+                return ControlFlow::Break(bone.clone());
+            }
+
+            index -= 1;
+            index = Self::find_bone_in(&bone.connected_bones, index)?;
+        }
+
+        ControlFlow::Continue(index)
+    }
+
+    fn editor(&self, watcher: &Watcher) -> impl MakeWidget {
+        bone_property_editor(self.root.clone(), watcher, true)
+            .and(bones_editor(
+                "Upper Root Bones",
+                &self.root.connected_bones,
+                watcher,
+            ))
+            .and(bones_editor("Lower Root Bones", &self.a_bones, watcher))
+            .into_rows()
+            .pad()
+            .vertical_scroll()
+    }
+}
+
+impl From<&'_ EditingSkeleton> for SerializedSkeleton {
+    fn from(skeleton: &'_ EditingSkeleton) -> Self {
+        Self {
+            root: SerializedBone::from(&skeleton.root),
+            a_bones: skeleton
+                .a_bones
+                .map_ref(|bones| bones.iter().map(SerializedBone::from).collect()),
+        }
+    }
+}
+
+impl From<SerializedSkeleton> for EditingSkeleton {
+    fn from(skeleton: SerializedSkeleton) -> Self {
+        Self {
+            root: SkeletalBone::from(skeleton.root),
+            a_bones: Dynamic::new(
+                skeleton
+                    .a_bones
+                    .into_iter()
+                    .map(SkeletalBone::from)
+                    .collect(),
+            ),
+        }
+    }
+}
+
+#[derive(Clone, Debug, PartialEq)]
+struct SkeletalBone {
+    label: Dynamic<String>,
+    joint_label: Dynamic<String>,
+    joint_angle: Dynamic<Angle>,
+    length: Dynamic<f32>,
+    jointed: Dynamic<bool>,
+    joint_ratio: Dynamic<ZeroToOne>,
+    inverse: Dynamic<bool>,
+    desired_length: Dynamic<f32>,
+    connected_bones: Dynamic<Vec<SkeletalBone>>,
+}
+
+impl SkeletalBone {
+    pub fn as_bone_kind(&self) -> (LabeledBoneKind, Vector) {
+        let length = self.length.get();
+        let (vector_length, kind) = if self.jointed.get() {
+            let joint_ratio = self.joint_ratio.get();
+            let start_length = length * *joint_ratio;
+            let end_length = length - start_length;
+            (
+                self.desired_length.get(),
+                BoneKind::Jointed {
+                    start_length,
+                    end_length,
+                    inverse: self.inverse.get(),
+                },
+            )
+        } else {
+            (
+                length,
+                BoneKind::Rigid {
+                    length: self.length.get(),
+                },
+            )
+        };
+
+        (
+            kind.with_label(self.label.get()),
+            Vector::new(vector_length, self.joint_angle.get().into()),
+        )
+    }
+}
+
+impl Default for SkeletalBone {
+    fn default() -> Self {
+        Self {
+            joint_label: Dynamic::default(),
+            joint_angle: Dynamic::default(),
+            label: Dynamic::default(),
+            length: Dynamic::new(1.),
+            jointed: Dynamic::default(),
+            joint_ratio: Dynamic::new(ZeroToOne::new(0.5)),
+            inverse: Dynamic::default(),
+            desired_length: Dynamic::default(),
+            connected_bones: Dynamic::default(),
+        }
+    }
+}
+
+impl From<&'_ SkeletalBone> for SerializedBone {
+    fn from(bone: &'_ SkeletalBone) -> Self {
+        Self {
+            label: bone.label.get(),
+            joint_label: bone.joint_label.get(),
+            joint_angle: bone.joint_angle.get(),
+            length: bone.length.get(),
+            jointed: bone.jointed.get(),
+            joint_ratio: bone.joint_ratio.get(),
+            inverse: bone.inverse.get(),
+            desired_length: bone.desired_length.get(),
+            connected_bones: bone
+                .connected_bones
+                .map_ref(|bones| bones.iter().map(Self::from).collect()),
+        }
+    }
+}
+
+impl From<SerializedBone> for SkeletalBone {
+    fn from(bone: SerializedBone) -> Self {
+        Self {
+            label: Dynamic::new(bone.label),
+            joint_label: Dynamic::new(bone.joint_label),
+            joint_angle: Dynamic::new(bone.joint_angle),
+            length: Dynamic::new(bone.length),
+            jointed: Dynamic::new(bone.jointed),
+            joint_ratio: Dynamic::new(bone.joint_ratio),
+            inverse: Dynamic::new(bone.inverse),
+            desired_length: Dynamic::new(bone.desired_length),
+            connected_bones: Dynamic::new(
+                bone.connected_bones.into_iter().map(Self::from).collect(),
+            ),
+        }
+    }
+}
+
+fn bones_editor(
+    label: &str,
+    bones: &Dynamic<Vec<SkeletalBone>>,
+    watcher: &Watcher,
+) -> impl MakeWidget {
+    watcher.watch(bones);
+    let bone_editors = Dynamic::new(
+        bones
+            .read()
+            .iter()
+            .map(|bone| bone_editor(bone.clone(), watcher).make_widget())
+            .collect::<WidgetList>(),
+    );
+    let collapsed = Dynamic::new(true);
+    let add = "+".into_button().on_click({
+        let bones = bones.clone();
+        let bone_editors = bone_editors.clone();
+        let watcher = watcher.clone();
+        let collapsed = collapsed.clone();
+        move |_| {
+            let new_bone = SkeletalBone::default();
+            bones.lock().push(new_bone.clone());
+            bone_editors.lock().push(bone_editor(new_bone, &watcher));
+            collapsed.set(false);
+        }
+    });
+    bone_editors
+        .into_rows()
+        .disclose()
+        .labelled_by(label.align_left().expand().and(add).into_columns())
+        .collapsed(collapsed)
+        .contain()
+}
+fn bone_editor(bone: SkeletalBone, watcher: &Watcher) -> impl MakeWidget {
+    let bones = bones_editor("Connected Bones", &bone.connected_bones, watcher);
+    bone_property_editor(bone, watcher, false)
+        .and(bones)
+        .into_rows()
+}
+
+#[allow(clippy::too_many_lines)]
+fn bone_property_editor(bone: SkeletalBone, watcher: &Watcher, is_root: bool) -> impl MakeWidget {
+    watcher.watch(&bone.joint_label);
+    watcher.watch(&bone.inverse);
+    watcher.watch(&bone.jointed);
+    watcher.watch(&bone.label);
+    watcher.watch(&bone.length);
+    watcher.watch(&bone.joint_angle);
+    watcher.watch(&bone.joint_ratio);
+    watcher.watch(&bone.desired_length);
+
+    let columns_wide = 3 + u8::from(!is_root);
+
+    bone.jointed
+        .for_each_cloned({
+            let mut was_jointed = bone.jointed.get();
+            let desired_length = bone.desired_length.clone();
+            let length = bone.length.clone();
+            move |jointed| {
+                if jointed && !was_jointed {
+                    // When enabling jointed, we want to initialize the desired
+                    // length to the current length.
+                    desired_length.set(length.get());
+                }
+                was_jointed = jointed;
+            }
+        })
+        .persist();
+
+    let first = Dynamic::new(bone.length.get().to_string());
+    let first_parsed = first.map_each(|s| s.parse::<f32>());
+    first_parsed
+        .for_each(move |result| {
+            let Ok(new_value) = result else { return };
+            bone.length.set(*new_value);
+        })
+        .persist();
+
+    let joint_label_editor = bone.joint_label.into_input().placeholder("Joint Name");
+    let label_editor = bone.label.into_input().placeholder("Bone Name");
+    let length_editor = first
+        .into_input()
+        .placeholder("Length")
+        .validation(first_parsed);
+
+    let jointed_editor = bone.jointed.clone().into_checkbox("Jointed");
+
+    let rotation = bone.joint_angle.slider();
+
+    let joint_angle = if is_root { "Rotation" } else { "Joint Angle" }
+        .align_left()
+        .and(rotation.clone())
+        .into_rows()
+        .expand()
+        .make_widget();
+
+    let joint_row = joint_angle
+        .clone()
+        .and(
+            "Midpoint"
+                .align_left()
+                .and(bone.joint_ratio.slider().with_enabled(bone.jointed.clone()))
+                .into_rows()
+                .fit_horizontally()
+                .align_top()
+                .expand(),
+        )
+        .and(
+            bone.inverse
+                .into_checkbox("Inverse")
+                .with_enabled(bone.jointed.clone())
+                .fit_horizontally(),
+        )
+        .and(Space::clear().expand_weighted(columns_wide - 3))
+        .into_columns()
+        .make_widget();
+
+    let non_joint_row = joint_angle
+        .and(Space::clear().expand_weighted(columns_wide - 1))
+        .into_columns()
+        .make_widget();
+
+    let second_row = bone
+        .jointed
+        .clone()
+        .switcher(move |jointed, _| {
+            if *jointed {
+                joint_row.clone()
+            } else {
+                non_joint_row.clone()
+            }
+        })
+        .make_widget();
+
+    let first_row = if is_root {
+        WidgetList::new()
+    } else {
+        WidgetList::new().and(
+            "Joint Name"
+                .align_left()
+                .and(joint_label_editor)
+                .into_rows()
+                .fit_horizontally()
+                .align_top()
+                .expand(),
+        )
+    };
+
+    first_row
+        .and(
+            "Bone Name"
+                .align_left()
+                .and(label_editor)
+                .into_rows()
+                .fit_horizontally()
+                .align_top()
+                .expand(),
+        )
+        .and(
+            "Bone Length"
+                .align_left()
+                .and(length_editor)
+                .into_rows()
+                .fit_horizontally()
+                .align_top()
+                .expand(),
+        )
+        .and(jointed_editor.fit_horizontally().expand())
+        .into_columns()
+        .and(second_row)
+        .into_rows()
+}
+
\ No newline at end of file diff --git a/main/src/funnybones/lib.rs.html b/main/src/funnybones/lib.rs.html index 8cb2f43..6412702 100644 --- a/main/src/funnybones/lib.rs.html +++ b/main/src/funnybones/lib.rs.html @@ -1042,7 +1042,9 @@ 1041 1042 1043 -1044

#![doc = include_str!(".crate-docs.md")]
+1044
+1045
+1046
#![doc = include_str!(".crate-docs.md")]
 
 use std::{
     borrow::Borrow,
@@ -1057,6 +1059,8 @@
 pub mod animation;
 #[cfg(feature = "cushy")]
 pub mod cushy;
+#[cfg(feature = "editor")]
+pub mod editor;
 #[cfg(feature = "serde")]
 mod serde;
 
diff --git a/main/trait.impl/core/clone/trait.Clone.js b/main/trait.impl/core/clone/trait.Clone.js
index bfe9440..4a93efa 100644
--- a/main/trait.impl/core/clone/trait.Clone.js
+++ b/main/trait.impl/core/clone/trait.Clone.js
@@ -1,9 +1,9 @@
 (function() {
-    var implementors = Object.fromEntries([["FunnyBones",[["impl Clone for EditingSkeleton"],["impl Clone for SkeletalBone"]]],["funnybones",[["impl Clone for BoneProperty"],["impl Clone for JointProperty"],["impl Clone for PropertyUpdate"],["impl Clone for Target"],["impl Clone for Value"],["impl Clone for SkeletonMutation"],["impl Clone for Target"],["impl Clone for BoneEnd"],["impl Clone for BoneKind"],["impl Clone for Animation"],["impl Clone for Frame"],["impl Clone for Keyframe"],["impl Clone for Timeline"],["impl Clone for Angle"],["impl Clone for BoneAxis"],["impl Clone for BoneId"],["impl Clone for Coordinate"],["impl Clone for JointId"],["impl Clone for Rotation"],["impl Clone for Vector"]]]]);
+    var implementors = Object.fromEntries([["funnybones",[["impl Clone for BoneProperty"],["impl Clone for JointProperty"],["impl Clone for PropertyUpdate"],["impl Clone for Target"],["impl Clone for Value"],["impl Clone for SkeletonMutation"],["impl Clone for Target"],["impl Clone for BoneEnd"],["impl Clone for BoneKind"],["impl Clone for Animation"],["impl Clone for Frame"],["impl Clone for Keyframe"],["impl Clone for Timeline"],["impl Clone for EditingSkeleton"],["impl Clone for Angle"],["impl Clone for BoneAxis"],["impl Clone for BoneId"],["impl Clone for Coordinate"],["impl Clone for JointId"],["impl Clone for Rotation"],["impl Clone for Vector"]]]]);
     if (window.register_implementors) {
         window.register_implementors(implementors);
     } else {
         window.pending_implementors = implementors;
     }
 })()
-//{"start":57,"fragment_lengths":[569,5465]}
\ No newline at end of file
+//{"start":57,"fragment_lengths":[5760]}
\ No newline at end of file
diff --git a/main/trait.impl/core/cmp/trait.PartialEq.js b/main/trait.impl/core/cmp/trait.PartialEq.js
index a28e53f..f0c1ae5 100644
--- a/main/trait.impl/core/cmp/trait.PartialEq.js
+++ b/main/trait.impl/core/cmp/trait.PartialEq.js
@@ -1,9 +1,9 @@
 (function() {
-    var implementors = Object.fromEntries([["FunnyBones",[["impl PartialEq for EditingSkeleton"],["impl PartialEq for SkeletalBone"]]],["funnybones",[["impl PartialEq for BoneProperty"],["impl PartialEq for JointProperty"],["impl PartialEq for PropertyUpdate"],["impl PartialEq for Target"],["impl PartialEq for Value"],["impl PartialEq for SkeletonMutation"],["impl PartialEq for Target"],["impl PartialEq for BoneEnd"],["impl PartialEq for BoneKind"],["impl PartialEq for Animation"],["impl PartialEq for Frame"],["impl PartialEq for Keyframe"],["impl PartialEq for Timeline"],["impl PartialEq for Angle"],["impl PartialEq for Bone"],["impl PartialEq for BoneAxis"],["impl PartialEq for BoneId"],["impl PartialEq for Coordinate"],["impl PartialEq for Joint"],["impl PartialEq for JointId"],["impl PartialEq for Rotation"],["impl PartialEq for Skeleton"],["impl PartialEq for Vector"]]]]);
+    var implementors = Object.fromEntries([["funnybones",[["impl PartialEq for BoneProperty"],["impl PartialEq for JointProperty"],["impl PartialEq for PropertyUpdate"],["impl PartialEq for Target"],["impl PartialEq for Value"],["impl PartialEq for SkeletonMutation"],["impl PartialEq for Target"],["impl PartialEq for BoneEnd"],["impl PartialEq for BoneKind"],["impl PartialEq for Animation"],["impl PartialEq for Frame"],["impl PartialEq for Keyframe"],["impl PartialEq for Timeline"],["impl PartialEq for EditingSkeleton"],["impl PartialEq for Angle"],["impl PartialEq for Bone"],["impl PartialEq for BoneAxis"],["impl PartialEq for BoneId"],["impl PartialEq for Coordinate"],["impl PartialEq for Joint"],["impl PartialEq for JointId"],["impl PartialEq for Rotation"],["impl PartialEq for Skeleton"],["impl PartialEq for Vector"]]]]);
     if (window.register_implementors) {
         window.register_implementors(implementors);
     } else {
         window.pending_implementors = implementors;
     }
 })()
-//{"start":57,"fragment_lengths":[585,6408]}
\ No newline at end of file
+//{"start":57,"fragment_lengths":[6711]}
\ No newline at end of file
diff --git a/main/trait.impl/core/convert/trait.From.js b/main/trait.impl/core/convert/trait.From.js
index 60a94e3..de568f8 100644
--- a/main/trait.impl/core/convert/trait.From.js
+++ b/main/trait.impl/core/convert/trait.From.js
@@ -1,9 +1,9 @@
 (function() {
-    var implementors = Object.fromEntries([["FunnyBones",[["impl From<&EditingSkeleton> for SerializedSkeleton"],["impl From<&SkeletalBone> for SerializedBone"],["impl From<SerializedBone> for SkeletalBone"],["impl From<SerializedSkeleton> for EditingSkeleton"],["impl From<Error> for ReadError"],["impl From<Error> for SaveError"],["impl From<PersistError> for SaveError"],["impl From<Error> for ReadError"]]],["funnybones",[["impl From<BoneKind> for LabeledBoneKind"],["impl From<bool> for Value"],["impl From<f32> for Value"],["impl From<u32> for Frame"],["impl From<Frame> for f32"],["impl From<Frame> for u32"],["impl From<Frame> for Duration"],["impl From<Angle> for Rotation"],["impl From<Coordinate> for Vector"],["impl From<Rotation> for Angle"],["impl From<Vector> for Value"],["impl From<Vector> for Coordinate"]]]]);
+    var implementors = Object.fromEntries([["funnybones",[["impl From<BoneKind> for LabeledBoneKind"],["impl From<bool> for Value"],["impl From<f32> for Value"],["impl From<u32> for Frame"],["impl From<Frame> for f32"],["impl From<Frame> for u32"],["impl From<Frame> for Duration"],["impl From<Angle> for Rotation"],["impl From<Coordinate> for Vector"],["impl From<Rotation> for Angle"],["impl From<Vector> for Value"],["impl From<Vector> for Coordinate"],["impl From<Error> for ReadError"],["impl From<Error> for SaveError"],["impl From<PersistError> for SaveError"],["impl From<Error> for ReadError"]]]]);
     if (window.register_implementors) {
         window.register_implementors(implementors);
     } else {
         window.pending_implementors = implementors;
     }
 })()
-//{"start":57,"fragment_lengths":[3223,4594]}
\ No newline at end of file
+//{"start":57,"fragment_lengths":[6168]}
\ No newline at end of file
diff --git a/main/trait.impl/core/default/trait.Default.js b/main/trait.impl/core/default/trait.Default.js
index a63f5c5..1c400ae 100644
--- a/main/trait.impl/core/default/trait.Default.js
+++ b/main/trait.impl/core/default/trait.Default.js
@@ -1,9 +1,9 @@
 (function() {
-    var implementors = Object.fromEntries([["FunnyBones",[["impl Default for EditingSkeleton"],["impl Default for SkeletalBone"]]],["funnybones",[["impl Default for Animation"],["impl Default for Frame"],["impl Default for Angle"],["impl Default for Coordinate"],["impl Default for Rotation"],["impl Default for Skeleton"],["impl Default for Vector"]]]]);
+    var implementors = Object.fromEntries([["funnybones",[["impl Default for Animation"],["impl Default for Frame"],["impl Default for EditingSkeleton"],["impl Default for Angle"],["impl Default for Coordinate"],["impl Default for Rotation"],["impl Default for Skeleton"],["impl Default for Vector"]]]]);
     if (window.register_implementors) {
         window.register_implementors(implementors);
     } else {
         window.pending_implementors = implementors;
     }
 })()
-//{"start":57,"fragment_lengths":[589,1934]}
\ No newline at end of file
+//{"start":57,"fragment_lengths":[2239]}
\ No newline at end of file
diff --git a/main/trait.impl/core/fmt/trait.Debug.js b/main/trait.impl/core/fmt/trait.Debug.js
index b61de2c..c8bdcbd 100644
--- a/main/trait.impl/core/fmt/trait.Debug.js
+++ b/main/trait.impl/core/fmt/trait.Debug.js
@@ -1,9 +1,9 @@
 (function() {
-    var implementors = Object.fromEntries([["FunnyBones",[["impl Debug for ReadError"],["impl Debug for SaveError"],["impl Debug for EditingSkeleton"],["impl Debug for SerializedBone"],["impl Debug for SerializedSkeleton"],["impl Debug for SkeletalBone"]]],["funnybones",[["impl Debug for BoneProperty"],["impl Debug for JointProperty"],["impl Debug for PropertyUpdate"],["impl Debug for Target"],["impl Debug for Value"],["impl Debug for SkeletonMutation"],["impl Debug for Target"],["impl Debug for BoneEnd"],["impl Debug for BoneKind"],["impl Debug for Animation"],["impl Debug for Frame"],["impl Debug for Keyframe"],["impl Debug for Timeline"],["impl Debug for SkeletonCanvas"],["impl Debug for Angle"],["impl Debug for Bone"],["impl Debug for BoneAxis"],["impl Debug for BoneId"],["impl Debug for Coordinate"],["impl Debug for Joint"],["impl Debug for JointId"],["impl Debug for Rotation"],["impl Debug for Skeleton"],["impl Debug for Vector"]]]]);
+    var implementors = Object.fromEntries([["funnybones",[["impl Debug for BoneProperty"],["impl Debug for JointProperty"],["impl Debug for PropertyUpdate"],["impl Debug for Target"],["impl Debug for Value"],["impl Debug for SkeletonMutation"],["impl Debug for Target"],["impl Debug for ReadError"],["impl Debug for SaveError"],["impl Debug for BoneEnd"],["impl Debug for BoneKind"],["impl Debug for Animation"],["impl Debug for Frame"],["impl Debug for Keyframe"],["impl Debug for Timeline"],["impl Debug for SkeletonCanvas"],["impl Debug for EditingSkeleton"],["impl Debug for Angle"],["impl Debug for Bone"],["impl Debug for BoneAxis"],["impl Debug for BoneId"],["impl Debug for Coordinate"],["impl Debug for Joint"],["impl Debug for JointId"],["impl Debug for Rotation"],["impl Debug for Skeleton"],["impl Debug for Vector"]]]]);
     if (window.register_implementors) {
         window.register_implementors(implementors);
     } else {
         window.pending_implementors = implementors;
     }
 })()
-//{"start":57,"fragment_lengths":[1627,6452]}
\ No newline at end of file
+//{"start":57,"fragment_lengths":[7279]}
\ No newline at end of file
diff --git a/main/trait.impl/core/fmt/trait.Display.js b/main/trait.impl/core/fmt/trait.Display.js
index 721a3c7..d29f8ed 100644
--- a/main/trait.impl/core/fmt/trait.Display.js
+++ b/main/trait.impl/core/fmt/trait.Display.js
@@ -1,9 +1,9 @@
 (function() {
-    var implementors = Object.fromEntries([["FunnyBones",[["impl Display for ReadError"],["impl Display for SaveError"]]],["funnybones",[["impl Display for Angle"],["impl Display for Rotation"]]]]);
+    var implementors = Object.fromEntries([["funnybones",[["impl Display for ReadError"],["impl Display for SaveError"],["impl Display for Angle"],["impl Display for Rotation"]]]]);
     if (window.register_implementors) {
         window.register_implementors(implementors);
     } else {
         window.pending_implementors = implementors;
     }
 })()
-//{"start":57,"fragment_lengths":[534,532]}
\ No newline at end of file
+//{"start":57,"fragment_lengths":[1079]}
\ No newline at end of file
diff --git a/main/trait.impl/core/marker/trait.Freeze.js b/main/trait.impl/core/marker/trait.Freeze.js
index 1b942c9..ee63fb4 100644
--- a/main/trait.impl/core/marker/trait.Freeze.js
+++ b/main/trait.impl/core/marker/trait.Freeze.js
@@ -1,9 +1,9 @@
 (function() {
-    var implementors = Object.fromEntries([["FunnyBones",[["impl Freeze for ReadError",1,["FunnyBones::ReadError"]],["impl Freeze for SaveError",1,["FunnyBones::SaveError"]],["impl Freeze for EditingSkeleton",1,["FunnyBones::EditingSkeleton"]],["impl Freeze for SerializedBone",1,["FunnyBones::SerializedBone"]],["impl Freeze for SerializedSkeleton",1,["FunnyBones::SerializedSkeleton"]],["impl Freeze for SkeletalBone",1,["FunnyBones::SkeletalBone"]]]],["funnybones",[["impl Freeze for BoneProperty",1,["funnybones::animation::BoneProperty"]],["impl Freeze for JointProperty",1,["funnybones::animation::JointProperty"]],["impl Freeze for PropertyUpdate",1,["funnybones::animation::PropertyUpdate"]],["impl Freeze for Target",1,["funnybones::animation::Target"]],["impl Freeze for Value",1,["funnybones::animation::Value"]],["impl Freeze for SkeletonMutation",1,["funnybones::cushy::skeleton_canvas::SkeletonMutation"]],["impl Freeze for Target",1,["funnybones::cushy::skeleton_canvas::Target"]],["impl Freeze for BoneEnd",1,["funnybones::BoneEnd"]],["impl Freeze for BoneKind",1,["funnybones::BoneKind"]],["impl Freeze for Animation",1,["funnybones::animation::Animation"]],["impl Freeze for Frame",1,["funnybones::animation::Frame"]],["impl Freeze for Keyframe",1,["funnybones::animation::Keyframe"]],["impl Freeze for RunningAnimation",1,["funnybones::animation::RunningAnimation"]],["impl Freeze for Timeline",1,["funnybones::animation::Timeline"]],["impl Freeze for SkeletonCanvas",1,["funnybones::cushy::skeleton_canvas::SkeletonCanvas"]],["impl Freeze for Angle",1,["funnybones::Angle"]],["impl Freeze for Bone",1,["funnybones::Bone"]],["impl Freeze for BoneAxis",1,["funnybones::BoneAxis"]],["impl Freeze for BoneId",1,["funnybones::BoneId"]],["impl Freeze for Coordinate",1,["funnybones::Coordinate"]],["impl Freeze for Joint",1,["funnybones::Joint"]],["impl Freeze for JointId",1,["funnybones::JointId"]],["impl Freeze for LabeledBoneKind",1,["funnybones::LabeledBoneKind"]],["impl Freeze for Rotation",1,["funnybones::Rotation"]],["impl Freeze for Skeleton",1,["funnybones::Skeleton"]],["impl Freeze for Vector",1,["funnybones::Vector"]]]]]);
+    var implementors = Object.fromEntries([["funnybones",[["impl Freeze for BoneProperty",1,["funnybones::animation::BoneProperty"]],["impl Freeze for JointProperty",1,["funnybones::animation::JointProperty"]],["impl Freeze for PropertyUpdate",1,["funnybones::animation::PropertyUpdate"]],["impl Freeze for Target",1,["funnybones::animation::Target"]],["impl Freeze for Value",1,["funnybones::animation::Value"]],["impl Freeze for SkeletonMutation",1,["funnybones::cushy::skeleton_canvas::SkeletonMutation"]],["impl Freeze for Target",1,["funnybones::cushy::skeleton_canvas::Target"]],["impl Freeze for ReadError",1,["funnybones::editor::ReadError"]],["impl Freeze for SaveError",1,["funnybones::editor::SaveError"]],["impl Freeze for BoneEnd",1,["funnybones::BoneEnd"]],["impl Freeze for BoneKind",1,["funnybones::BoneKind"]],["impl Freeze for Animation",1,["funnybones::animation::Animation"]],["impl Freeze for Frame",1,["funnybones::animation::Frame"]],["impl Freeze for Keyframe",1,["funnybones::animation::Keyframe"]],["impl Freeze for RunningAnimation",1,["funnybones::animation::RunningAnimation"]],["impl Freeze for Timeline",1,["funnybones::animation::Timeline"]],["impl Freeze for SkeletonCanvas",1,["funnybones::cushy::skeleton_canvas::SkeletonCanvas"]],["impl Freeze for EditingSkeleton",1,["funnybones::editor::EditingSkeleton"]],["impl Freeze for SkeletonEditor",1,["funnybones::editor::SkeletonEditor"]],["impl Freeze for Angle",1,["funnybones::Angle"]],["impl Freeze for Bone",1,["funnybones::Bone"]],["impl Freeze for BoneAxis",1,["funnybones::BoneAxis"]],["impl Freeze for BoneId",1,["funnybones::BoneId"]],["impl Freeze for Coordinate",1,["funnybones::Coordinate"]],["impl Freeze for Joint",1,["funnybones::Joint"]],["impl Freeze for JointId",1,["funnybones::JointId"]],["impl Freeze for LabeledBoneKind",1,["funnybones::LabeledBoneKind"]],["impl Freeze for Rotation",1,["funnybones::Rotation"]],["impl Freeze for Skeleton",1,["funnybones::Skeleton"]],["impl Freeze for Vector",1,["funnybones::Vector"]]]]]);
     if (window.register_implementors) {
         window.register_implementors(implementors);
     } else {
         window.pending_implementors = implementors;
     }
 })()
-//{"start":57,"fragment_lengths":[1872,8169]}
\ No newline at end of file
+//{"start":57,"fragment_lengths":[9476]}
\ No newline at end of file
diff --git a/main/trait.impl/core/marker/trait.Send.js b/main/trait.impl/core/marker/trait.Send.js
index ebd4e27..a401d74 100644
--- a/main/trait.impl/core/marker/trait.Send.js
+++ b/main/trait.impl/core/marker/trait.Send.js
@@ -1,9 +1,9 @@
 (function() {
-    var implementors = Object.fromEntries([["FunnyBones",[["impl Send for ReadError",1,["FunnyBones::ReadError"]],["impl Send for SaveError",1,["FunnyBones::SaveError"]],["impl Send for EditingSkeleton",1,["FunnyBones::EditingSkeleton"]],["impl Send for SerializedBone",1,["FunnyBones::SerializedBone"]],["impl Send for SerializedSkeleton",1,["FunnyBones::SerializedSkeleton"]],["impl Send for SkeletalBone",1,["FunnyBones::SkeletalBone"]]]],["funnybones",[["impl Send for BoneProperty",1,["funnybones::animation::BoneProperty"]],["impl Send for JointProperty",1,["funnybones::animation::JointProperty"]],["impl Send for PropertyUpdate",1,["funnybones::animation::PropertyUpdate"]],["impl Send for Target",1,["funnybones::animation::Target"]],["impl Send for Value",1,["funnybones::animation::Value"]],["impl Send for SkeletonMutation",1,["funnybones::cushy::skeleton_canvas::SkeletonMutation"]],["impl Send for Target",1,["funnybones::cushy::skeleton_canvas::Target"]],["impl Send for BoneEnd",1,["funnybones::BoneEnd"]],["impl Send for BoneKind",1,["funnybones::BoneKind"]],["impl Send for Animation",1,["funnybones::animation::Animation"]],["impl Send for Frame",1,["funnybones::animation::Frame"]],["impl Send for Keyframe",1,["funnybones::animation::Keyframe"]],["impl Send for RunningAnimation",1,["funnybones::animation::RunningAnimation"]],["impl Send for Timeline",1,["funnybones::animation::Timeline"]],["impl Send for SkeletonCanvas",1,["funnybones::cushy::skeleton_canvas::SkeletonCanvas"]],["impl Send for Angle",1,["funnybones::Angle"]],["impl Send for Bone",1,["funnybones::Bone"]],["impl Send for BoneAxis",1,["funnybones::BoneAxis"]],["impl Send for BoneId",1,["funnybones::BoneId"]],["impl Send for Coordinate",1,["funnybones::Coordinate"]],["impl Send for Joint",1,["funnybones::Joint"]],["impl Send for JointId",1,["funnybones::JointId"]],["impl Send for LabeledBoneKind",1,["funnybones::LabeledBoneKind"]],["impl Send for Rotation",1,["funnybones::Rotation"]],["impl Send for Skeleton",1,["funnybones::Skeleton"]],["impl Send for Vector",1,["funnybones::Vector"]]]]]);
+    var implementors = Object.fromEntries([["funnybones",[["impl Send for BoneProperty",1,["funnybones::animation::BoneProperty"]],["impl Send for JointProperty",1,["funnybones::animation::JointProperty"]],["impl Send for PropertyUpdate",1,["funnybones::animation::PropertyUpdate"]],["impl Send for Target",1,["funnybones::animation::Target"]],["impl Send for Value",1,["funnybones::animation::Value"]],["impl Send for SkeletonMutation",1,["funnybones::cushy::skeleton_canvas::SkeletonMutation"]],["impl Send for Target",1,["funnybones::cushy::skeleton_canvas::Target"]],["impl Send for ReadError",1,["funnybones::editor::ReadError"]],["impl Send for SaveError",1,["funnybones::editor::SaveError"]],["impl Send for BoneEnd",1,["funnybones::BoneEnd"]],["impl Send for BoneKind",1,["funnybones::BoneKind"]],["impl Send for Animation",1,["funnybones::animation::Animation"]],["impl Send for Frame",1,["funnybones::animation::Frame"]],["impl Send for Keyframe",1,["funnybones::animation::Keyframe"]],["impl Send for RunningAnimation",1,["funnybones::animation::RunningAnimation"]],["impl Send for Timeline",1,["funnybones::animation::Timeline"]],["impl Send for SkeletonCanvas",1,["funnybones::cushy::skeleton_canvas::SkeletonCanvas"]],["impl Send for EditingSkeleton",1,["funnybones::editor::EditingSkeleton"]],["impl Send for SkeletonEditor",1,["funnybones::editor::SkeletonEditor"]],["impl Send for Angle",1,["funnybones::Angle"]],["impl Send for Bone",1,["funnybones::Bone"]],["impl Send for BoneAxis",1,["funnybones::BoneAxis"]],["impl Send for BoneId",1,["funnybones::BoneId"]],["impl Send for Coordinate",1,["funnybones::Coordinate"]],["impl Send for Joint",1,["funnybones::Joint"]],["impl Send for JointId",1,["funnybones::JointId"]],["impl Send for LabeledBoneKind",1,["funnybones::LabeledBoneKind"]],["impl Send for Rotation",1,["funnybones::Rotation"]],["impl Send for Skeleton",1,["funnybones::Skeleton"]],["impl Send for Vector",1,["funnybones::Vector"]]]]]);
     if (window.register_implementors) {
         window.register_implementors(implementors);
     } else {
         window.pending_implementors = implementors;
     }
 })()
-//{"start":57,"fragment_lengths":[1836,8013]}
\ No newline at end of file
+//{"start":57,"fragment_lengths":[9296]}
\ No newline at end of file
diff --git a/main/trait.impl/core/marker/trait.StructuralPartialEq.js b/main/trait.impl/core/marker/trait.StructuralPartialEq.js
index 3bf9089..22f76ac 100644
--- a/main/trait.impl/core/marker/trait.StructuralPartialEq.js
+++ b/main/trait.impl/core/marker/trait.StructuralPartialEq.js
@@ -1,9 +1,9 @@
 (function() {
-    var implementors = Object.fromEntries([["FunnyBones",[["impl StructuralPartialEq for EditingSkeleton"],["impl StructuralPartialEq for SkeletalBone"]]],["funnybones",[["impl StructuralPartialEq for BoneProperty"],["impl StructuralPartialEq for JointProperty"],["impl StructuralPartialEq for PropertyUpdate"],["impl StructuralPartialEq for Target"],["impl StructuralPartialEq for Value"],["impl StructuralPartialEq for SkeletonMutation"],["impl StructuralPartialEq for Target"],["impl StructuralPartialEq for BoneEnd"],["impl StructuralPartialEq for BoneKind"],["impl StructuralPartialEq for Animation"],["impl StructuralPartialEq for Frame"],["impl StructuralPartialEq for Keyframe"],["impl StructuralPartialEq for Timeline"],["impl StructuralPartialEq for Angle"],["impl StructuralPartialEq for Bone"],["impl StructuralPartialEq for BoneAxis"],["impl StructuralPartialEq for BoneId"],["impl StructuralPartialEq for Coordinate"],["impl StructuralPartialEq for Joint"],["impl StructuralPartialEq for JointId"],["impl StructuralPartialEq for Rotation"],["impl StructuralPartialEq for Skeleton"],["impl StructuralPartialEq for Vector"]]]]);
+    var implementors = Object.fromEntries([["funnybones",[["impl StructuralPartialEq for BoneProperty"],["impl StructuralPartialEq for JointProperty"],["impl StructuralPartialEq for PropertyUpdate"],["impl StructuralPartialEq for Target"],["impl StructuralPartialEq for Value"],["impl StructuralPartialEq for SkeletonMutation"],["impl StructuralPartialEq for Target"],["impl StructuralPartialEq for BoneEnd"],["impl StructuralPartialEq for BoneKind"],["impl StructuralPartialEq for Animation"],["impl StructuralPartialEq for Frame"],["impl StructuralPartialEq for Keyframe"],["impl StructuralPartialEq for Timeline"],["impl StructuralPartialEq for EditingSkeleton"],["impl StructuralPartialEq for Angle"],["impl StructuralPartialEq for Bone"],["impl StructuralPartialEq for BoneAxis"],["impl StructuralPartialEq for BoneId"],["impl StructuralPartialEq for Coordinate"],["impl StructuralPartialEq for Joint"],["impl StructuralPartialEq for JointId"],["impl StructuralPartialEq for Rotation"],["impl StructuralPartialEq for Skeleton"],["impl StructuralPartialEq for Vector"]]]]);
     if (window.register_implementors) {
         window.register_implementors(implementors);
     } else {
         window.pending_implementors = implementors;
     }
 })()
-//{"start":57,"fragment_lengths":[657,7236]}
\ No newline at end of file
+//{"start":57,"fragment_lengths":[7575]}
\ No newline at end of file
diff --git a/main/trait.impl/core/marker/trait.Sync.js b/main/trait.impl/core/marker/trait.Sync.js
index 5596389..bce161c 100644
--- a/main/trait.impl/core/marker/trait.Sync.js
+++ b/main/trait.impl/core/marker/trait.Sync.js
@@ -1,9 +1,9 @@
 (function() {
-    var implementors = Object.fromEntries([["FunnyBones",[["impl Sync for ReadError",1,["FunnyBones::ReadError"]],["impl Sync for SaveError",1,["FunnyBones::SaveError"]],["impl Sync for EditingSkeleton",1,["FunnyBones::EditingSkeleton"]],["impl Sync for SerializedBone",1,["FunnyBones::SerializedBone"]],["impl Sync for SerializedSkeleton",1,["FunnyBones::SerializedSkeleton"]],["impl Sync for SkeletalBone",1,["FunnyBones::SkeletalBone"]]]],["funnybones",[["impl !Sync for SkeletonCanvas",1,["funnybones::cushy::skeleton_canvas::SkeletonCanvas"]],["impl Sync for BoneProperty",1,["funnybones::animation::BoneProperty"]],["impl Sync for JointProperty",1,["funnybones::animation::JointProperty"]],["impl Sync for PropertyUpdate",1,["funnybones::animation::PropertyUpdate"]],["impl Sync for Target",1,["funnybones::animation::Target"]],["impl Sync for Value",1,["funnybones::animation::Value"]],["impl Sync for SkeletonMutation",1,["funnybones::cushy::skeleton_canvas::SkeletonMutation"]],["impl Sync for Target",1,["funnybones::cushy::skeleton_canvas::Target"]],["impl Sync for BoneEnd",1,["funnybones::BoneEnd"]],["impl Sync for BoneKind",1,["funnybones::BoneKind"]],["impl Sync for Animation",1,["funnybones::animation::Animation"]],["impl Sync for Frame",1,["funnybones::animation::Frame"]],["impl Sync for Keyframe",1,["funnybones::animation::Keyframe"]],["impl Sync for RunningAnimation",1,["funnybones::animation::RunningAnimation"]],["impl Sync for Timeline",1,["funnybones::animation::Timeline"]],["impl Sync for Angle",1,["funnybones::Angle"]],["impl Sync for Bone",1,["funnybones::Bone"]],["impl Sync for BoneAxis",1,["funnybones::BoneAxis"]],["impl Sync for BoneId",1,["funnybones::BoneId"]],["impl Sync for Coordinate",1,["funnybones::Coordinate"]],["impl Sync for Joint",1,["funnybones::Joint"]],["impl Sync for JointId",1,["funnybones::JointId"]],["impl Sync for LabeledBoneKind",1,["funnybones::LabeledBoneKind"]],["impl Sync for Rotation",1,["funnybones::Rotation"]],["impl Sync for Skeleton",1,["funnybones::Skeleton"]],["impl Sync for Vector",1,["funnybones::Vector"]]]]]);
+    var implementors = Object.fromEntries([["funnybones",[["impl !Sync for SkeletonCanvas",1,["funnybones::cushy::skeleton_canvas::SkeletonCanvas"]],["impl Sync for BoneProperty",1,["funnybones::animation::BoneProperty"]],["impl Sync for JointProperty",1,["funnybones::animation::JointProperty"]],["impl Sync for PropertyUpdate",1,["funnybones::animation::PropertyUpdate"]],["impl Sync for Target",1,["funnybones::animation::Target"]],["impl Sync for Value",1,["funnybones::animation::Value"]],["impl Sync for SkeletonMutation",1,["funnybones::cushy::skeleton_canvas::SkeletonMutation"]],["impl Sync for Target",1,["funnybones::cushy::skeleton_canvas::Target"]],["impl Sync for ReadError",1,["funnybones::editor::ReadError"]],["impl Sync for SaveError",1,["funnybones::editor::SaveError"]],["impl Sync for BoneEnd",1,["funnybones::BoneEnd"]],["impl Sync for BoneKind",1,["funnybones::BoneKind"]],["impl Sync for Animation",1,["funnybones::animation::Animation"]],["impl Sync for Frame",1,["funnybones::animation::Frame"]],["impl Sync for Keyframe",1,["funnybones::animation::Keyframe"]],["impl Sync for RunningAnimation",1,["funnybones::animation::RunningAnimation"]],["impl Sync for Timeline",1,["funnybones::animation::Timeline"]],["impl Sync for EditingSkeleton",1,["funnybones::editor::EditingSkeleton"]],["impl Sync for SkeletonEditor",1,["funnybones::editor::SkeletonEditor"]],["impl Sync for Angle",1,["funnybones::Angle"]],["impl Sync for Bone",1,["funnybones::Bone"]],["impl Sync for BoneAxis",1,["funnybones::BoneAxis"]],["impl Sync for BoneId",1,["funnybones::BoneId"]],["impl Sync for Coordinate",1,["funnybones::Coordinate"]],["impl Sync for Joint",1,["funnybones::Joint"]],["impl Sync for JointId",1,["funnybones::JointId"]],["impl Sync for LabeledBoneKind",1,["funnybones::LabeledBoneKind"]],["impl Sync for Rotation",1,["funnybones::Rotation"]],["impl Sync for Skeleton",1,["funnybones::Skeleton"]],["impl Sync for Vector",1,["funnybones::Vector"]]]]]);
     if (window.register_implementors) {
         window.register_implementors(implementors);
     } else {
         window.pending_implementors = implementors;
     }
 })()
-//{"start":57,"fragment_lengths":[1836,8014]}
\ No newline at end of file
+//{"start":57,"fragment_lengths":[9297]}
\ No newline at end of file
diff --git a/main/trait.impl/core/marker/trait.Unpin.js b/main/trait.impl/core/marker/trait.Unpin.js
index 014d4b5..49c05e7 100644
--- a/main/trait.impl/core/marker/trait.Unpin.js
+++ b/main/trait.impl/core/marker/trait.Unpin.js
@@ -1,9 +1,9 @@
 (function() {
-    var implementors = Object.fromEntries([["FunnyBones",[["impl Unpin for ReadError",1,["FunnyBones::ReadError"]],["impl Unpin for SaveError",1,["FunnyBones::SaveError"]],["impl Unpin for EditingSkeleton",1,["FunnyBones::EditingSkeleton"]],["impl Unpin for SerializedBone",1,["FunnyBones::SerializedBone"]],["impl Unpin for SerializedSkeleton",1,["FunnyBones::SerializedSkeleton"]],["impl Unpin for SkeletalBone",1,["FunnyBones::SkeletalBone"]]]],["funnybones",[["impl Unpin for BoneProperty",1,["funnybones::animation::BoneProperty"]],["impl Unpin for JointProperty",1,["funnybones::animation::JointProperty"]],["impl Unpin for PropertyUpdate",1,["funnybones::animation::PropertyUpdate"]],["impl Unpin for Target",1,["funnybones::animation::Target"]],["impl Unpin for Value",1,["funnybones::animation::Value"]],["impl Unpin for SkeletonMutation",1,["funnybones::cushy::skeleton_canvas::SkeletonMutation"]],["impl Unpin for Target",1,["funnybones::cushy::skeleton_canvas::Target"]],["impl Unpin for BoneEnd",1,["funnybones::BoneEnd"]],["impl Unpin for BoneKind",1,["funnybones::BoneKind"]],["impl Unpin for Animation",1,["funnybones::animation::Animation"]],["impl Unpin for Frame",1,["funnybones::animation::Frame"]],["impl Unpin for Keyframe",1,["funnybones::animation::Keyframe"]],["impl Unpin for RunningAnimation",1,["funnybones::animation::RunningAnimation"]],["impl Unpin for Timeline",1,["funnybones::animation::Timeline"]],["impl Unpin for SkeletonCanvas",1,["funnybones::cushy::skeleton_canvas::SkeletonCanvas"]],["impl Unpin for Angle",1,["funnybones::Angle"]],["impl Unpin for Bone",1,["funnybones::Bone"]],["impl Unpin for BoneAxis",1,["funnybones::BoneAxis"]],["impl Unpin for BoneId",1,["funnybones::BoneId"]],["impl Unpin for Coordinate",1,["funnybones::Coordinate"]],["impl Unpin for Joint",1,["funnybones::Joint"]],["impl Unpin for JointId",1,["funnybones::JointId"]],["impl Unpin for LabeledBoneKind",1,["funnybones::LabeledBoneKind"]],["impl Unpin for Rotation",1,["funnybones::Rotation"]],["impl Unpin for Skeleton",1,["funnybones::Skeleton"]],["impl Unpin for Vector",1,["funnybones::Vector"]]]]]);
+    var implementors = Object.fromEntries([["funnybones",[["impl Unpin for BoneProperty",1,["funnybones::animation::BoneProperty"]],["impl Unpin for JointProperty",1,["funnybones::animation::JointProperty"]],["impl Unpin for PropertyUpdate",1,["funnybones::animation::PropertyUpdate"]],["impl Unpin for Target",1,["funnybones::animation::Target"]],["impl Unpin for Value",1,["funnybones::animation::Value"]],["impl Unpin for SkeletonMutation",1,["funnybones::cushy::skeleton_canvas::SkeletonMutation"]],["impl Unpin for Target",1,["funnybones::cushy::skeleton_canvas::Target"]],["impl Unpin for ReadError",1,["funnybones::editor::ReadError"]],["impl Unpin for SaveError",1,["funnybones::editor::SaveError"]],["impl Unpin for BoneEnd",1,["funnybones::BoneEnd"]],["impl Unpin for BoneKind",1,["funnybones::BoneKind"]],["impl Unpin for Animation",1,["funnybones::animation::Animation"]],["impl Unpin for Frame",1,["funnybones::animation::Frame"]],["impl Unpin for Keyframe",1,["funnybones::animation::Keyframe"]],["impl Unpin for RunningAnimation",1,["funnybones::animation::RunningAnimation"]],["impl Unpin for Timeline",1,["funnybones::animation::Timeline"]],["impl Unpin for SkeletonCanvas",1,["funnybones::cushy::skeleton_canvas::SkeletonCanvas"]],["impl Unpin for EditingSkeleton",1,["funnybones::editor::EditingSkeleton"]],["impl Unpin for SkeletonEditor",1,["funnybones::editor::SkeletonEditor"]],["impl Unpin for Angle",1,["funnybones::Angle"]],["impl Unpin for Bone",1,["funnybones::Bone"]],["impl Unpin for BoneAxis",1,["funnybones::BoneAxis"]],["impl Unpin for BoneId",1,["funnybones::BoneId"]],["impl Unpin for Coordinate",1,["funnybones::Coordinate"]],["impl Unpin for Joint",1,["funnybones::Joint"]],["impl Unpin for JointId",1,["funnybones::JointId"]],["impl Unpin for LabeledBoneKind",1,["funnybones::LabeledBoneKind"]],["impl Unpin for Rotation",1,["funnybones::Rotation"]],["impl Unpin for Skeleton",1,["funnybones::Skeleton"]],["impl Unpin for Vector",1,["funnybones::Vector"]]]]]);
     if (window.register_implementors) {
         window.register_implementors(implementors);
     } else {
         window.pending_implementors = implementors;
     }
 })()
-//{"start":57,"fragment_lengths":[1854,8091]}
\ No newline at end of file
+//{"start":57,"fragment_lengths":[9386]}
\ No newline at end of file
diff --git a/main/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js b/main/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js
index 7bf9478..fd4809a 100644
--- a/main/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js
+++ b/main/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js
@@ -1,9 +1,9 @@
 (function() {
-    var implementors = Object.fromEntries([["FunnyBones",[["impl !RefUnwindSafe for ReadError",1,["FunnyBones::ReadError"]],["impl !RefUnwindSafe for SaveError",1,["FunnyBones::SaveError"]],["impl !RefUnwindSafe for EditingSkeleton",1,["FunnyBones::EditingSkeleton"]],["impl !RefUnwindSafe for SkeletalBone",1,["FunnyBones::SkeletalBone"]],["impl RefUnwindSafe for SerializedBone",1,["FunnyBones::SerializedBone"]],["impl RefUnwindSafe for SerializedSkeleton",1,["FunnyBones::SerializedSkeleton"]]]],["funnybones",[["impl !RefUnwindSafe for SkeletonCanvas",1,["funnybones::cushy::skeleton_canvas::SkeletonCanvas"]],["impl RefUnwindSafe for BoneProperty",1,["funnybones::animation::BoneProperty"]],["impl RefUnwindSafe for JointProperty",1,["funnybones::animation::JointProperty"]],["impl RefUnwindSafe for PropertyUpdate",1,["funnybones::animation::PropertyUpdate"]],["impl RefUnwindSafe for Target",1,["funnybones::animation::Target"]],["impl RefUnwindSafe for Value",1,["funnybones::animation::Value"]],["impl RefUnwindSafe for SkeletonMutation",1,["funnybones::cushy::skeleton_canvas::SkeletonMutation"]],["impl RefUnwindSafe for Target",1,["funnybones::cushy::skeleton_canvas::Target"]],["impl RefUnwindSafe for BoneEnd",1,["funnybones::BoneEnd"]],["impl RefUnwindSafe for BoneKind",1,["funnybones::BoneKind"]],["impl RefUnwindSafe for Animation",1,["funnybones::animation::Animation"]],["impl RefUnwindSafe for Frame",1,["funnybones::animation::Frame"]],["impl RefUnwindSafe for Keyframe",1,["funnybones::animation::Keyframe"]],["impl RefUnwindSafe for RunningAnimation",1,["funnybones::animation::RunningAnimation"]],["impl RefUnwindSafe for Timeline",1,["funnybones::animation::Timeline"]],["impl RefUnwindSafe for Angle",1,["funnybones::Angle"]],["impl RefUnwindSafe for Bone",1,["funnybones::Bone"]],["impl RefUnwindSafe for BoneAxis",1,["funnybones::BoneAxis"]],["impl RefUnwindSafe for BoneId",1,["funnybones::BoneId"]],["impl RefUnwindSafe for Coordinate",1,["funnybones::Coordinate"]],["impl RefUnwindSafe for Joint",1,["funnybones::Joint"]],["impl RefUnwindSafe for JointId",1,["funnybones::JointId"]],["impl RefUnwindSafe for LabeledBoneKind",1,["funnybones::LabeledBoneKind"]],["impl RefUnwindSafe for Rotation",1,["funnybones::Rotation"]],["impl RefUnwindSafe for Skeleton",1,["funnybones::Skeleton"]],["impl RefUnwindSafe for Vector",1,["funnybones::Vector"]]]]]);
+    var implementors = Object.fromEntries([["funnybones",[["impl !RefUnwindSafe for ReadError",1,["funnybones::editor::ReadError"]],["impl !RefUnwindSafe for SaveError",1,["funnybones::editor::SaveError"]],["impl !RefUnwindSafe for SkeletonCanvas",1,["funnybones::cushy::skeleton_canvas::SkeletonCanvas"]],["impl !RefUnwindSafe for EditingSkeleton",1,["funnybones::editor::EditingSkeleton"]],["impl !RefUnwindSafe for SkeletonEditor",1,["funnybones::editor::SkeletonEditor"]],["impl RefUnwindSafe for BoneProperty",1,["funnybones::animation::BoneProperty"]],["impl RefUnwindSafe for JointProperty",1,["funnybones::animation::JointProperty"]],["impl RefUnwindSafe for PropertyUpdate",1,["funnybones::animation::PropertyUpdate"]],["impl RefUnwindSafe for Target",1,["funnybones::animation::Target"]],["impl RefUnwindSafe for Value",1,["funnybones::animation::Value"]],["impl RefUnwindSafe for SkeletonMutation",1,["funnybones::cushy::skeleton_canvas::SkeletonMutation"]],["impl RefUnwindSafe for Target",1,["funnybones::cushy::skeleton_canvas::Target"]],["impl RefUnwindSafe for BoneEnd",1,["funnybones::BoneEnd"]],["impl RefUnwindSafe for BoneKind",1,["funnybones::BoneKind"]],["impl RefUnwindSafe for Animation",1,["funnybones::animation::Animation"]],["impl RefUnwindSafe for Frame",1,["funnybones::animation::Frame"]],["impl RefUnwindSafe for Keyframe",1,["funnybones::animation::Keyframe"]],["impl RefUnwindSafe for RunningAnimation",1,["funnybones::animation::RunningAnimation"]],["impl RefUnwindSafe for Timeline",1,["funnybones::animation::Timeline"]],["impl RefUnwindSafe for Angle",1,["funnybones::Angle"]],["impl RefUnwindSafe for Bone",1,["funnybones::Bone"]],["impl RefUnwindSafe for BoneAxis",1,["funnybones::BoneAxis"]],["impl RefUnwindSafe for BoneId",1,["funnybones::BoneId"]],["impl RefUnwindSafe for Coordinate",1,["funnybones::Coordinate"]],["impl RefUnwindSafe for Joint",1,["funnybones::Joint"]],["impl RefUnwindSafe for JointId",1,["funnybones::JointId"]],["impl RefUnwindSafe for LabeledBoneKind",1,["funnybones::LabeledBoneKind"]],["impl RefUnwindSafe for Rotation",1,["funnybones::Rotation"]],["impl RefUnwindSafe for Skeleton",1,["funnybones::Skeleton"]],["impl RefUnwindSafe for Vector",1,["funnybones::Vector"]]]]]);
     if (window.register_implementors) {
         window.register_implementors(implementors);
     } else {
         window.pending_implementors = implementors;
     }
 })()
-//{"start":57,"fragment_lengths":[2140,9314]}
\ No newline at end of file
+//{"start":57,"fragment_lengths":[10801]}
\ No newline at end of file
diff --git a/main/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js b/main/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js
index e47fec1..a5dcfe4 100644
--- a/main/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js
+++ b/main/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js
@@ -1,9 +1,9 @@
 (function() {
-    var implementors = Object.fromEntries([["FunnyBones",[["impl !UnwindSafe for ReadError",1,["FunnyBones::ReadError"]],["impl !UnwindSafe for SaveError",1,["FunnyBones::SaveError"]],["impl !UnwindSafe for EditingSkeleton",1,["FunnyBones::EditingSkeleton"]],["impl !UnwindSafe for SkeletalBone",1,["FunnyBones::SkeletalBone"]],["impl UnwindSafe for SerializedBone",1,["FunnyBones::SerializedBone"]],["impl UnwindSafe for SerializedSkeleton",1,["FunnyBones::SerializedSkeleton"]]]],["funnybones",[["impl !UnwindSafe for SkeletonCanvas",1,["funnybones::cushy::skeleton_canvas::SkeletonCanvas"]],["impl UnwindSafe for BoneProperty",1,["funnybones::animation::BoneProperty"]],["impl UnwindSafe for JointProperty",1,["funnybones::animation::JointProperty"]],["impl UnwindSafe for PropertyUpdate",1,["funnybones::animation::PropertyUpdate"]],["impl UnwindSafe for Target",1,["funnybones::animation::Target"]],["impl UnwindSafe for Value",1,["funnybones::animation::Value"]],["impl UnwindSafe for SkeletonMutation",1,["funnybones::cushy::skeleton_canvas::SkeletonMutation"]],["impl UnwindSafe for Target",1,["funnybones::cushy::skeleton_canvas::Target"]],["impl UnwindSafe for BoneEnd",1,["funnybones::BoneEnd"]],["impl UnwindSafe for BoneKind",1,["funnybones::BoneKind"]],["impl UnwindSafe for Animation",1,["funnybones::animation::Animation"]],["impl UnwindSafe for Frame",1,["funnybones::animation::Frame"]],["impl UnwindSafe for Keyframe",1,["funnybones::animation::Keyframe"]],["impl UnwindSafe for RunningAnimation",1,["funnybones::animation::RunningAnimation"]],["impl UnwindSafe for Timeline",1,["funnybones::animation::Timeline"]],["impl UnwindSafe for Angle",1,["funnybones::Angle"]],["impl UnwindSafe for Bone",1,["funnybones::Bone"]],["impl UnwindSafe for BoneAxis",1,["funnybones::BoneAxis"]],["impl UnwindSafe for BoneId",1,["funnybones::BoneId"]],["impl UnwindSafe for Coordinate",1,["funnybones::Coordinate"]],["impl UnwindSafe for Joint",1,["funnybones::Joint"]],["impl UnwindSafe for JointId",1,["funnybones::JointId"]],["impl UnwindSafe for LabeledBoneKind",1,["funnybones::LabeledBoneKind"]],["impl UnwindSafe for Rotation",1,["funnybones::Rotation"]],["impl UnwindSafe for Skeleton",1,["funnybones::Skeleton"]],["impl UnwindSafe for Vector",1,["funnybones::Vector"]]]]]);
+    var implementors = Object.fromEntries([["funnybones",[["impl !UnwindSafe for ReadError",1,["funnybones::editor::ReadError"]],["impl !UnwindSafe for SaveError",1,["funnybones::editor::SaveError"]],["impl !UnwindSafe for SkeletonCanvas",1,["funnybones::cushy::skeleton_canvas::SkeletonCanvas"]],["impl !UnwindSafe for EditingSkeleton",1,["funnybones::editor::EditingSkeleton"]],["impl !UnwindSafe for SkeletonEditor",1,["funnybones::editor::SkeletonEditor"]],["impl UnwindSafe for BoneProperty",1,["funnybones::animation::BoneProperty"]],["impl UnwindSafe for JointProperty",1,["funnybones::animation::JointProperty"]],["impl UnwindSafe for PropertyUpdate",1,["funnybones::animation::PropertyUpdate"]],["impl UnwindSafe for Target",1,["funnybones::animation::Target"]],["impl UnwindSafe for Value",1,["funnybones::animation::Value"]],["impl UnwindSafe for SkeletonMutation",1,["funnybones::cushy::skeleton_canvas::SkeletonMutation"]],["impl UnwindSafe for Target",1,["funnybones::cushy::skeleton_canvas::Target"]],["impl UnwindSafe for BoneEnd",1,["funnybones::BoneEnd"]],["impl UnwindSafe for BoneKind",1,["funnybones::BoneKind"]],["impl UnwindSafe for Animation",1,["funnybones::animation::Animation"]],["impl UnwindSafe for Frame",1,["funnybones::animation::Frame"]],["impl UnwindSafe for Keyframe",1,["funnybones::animation::Keyframe"]],["impl UnwindSafe for RunningAnimation",1,["funnybones::animation::RunningAnimation"]],["impl UnwindSafe for Timeline",1,["funnybones::animation::Timeline"]],["impl UnwindSafe for Angle",1,["funnybones::Angle"]],["impl UnwindSafe for Bone",1,["funnybones::Bone"]],["impl UnwindSafe for BoneAxis",1,["funnybones::BoneAxis"]],["impl UnwindSafe for BoneId",1,["funnybones::BoneId"]],["impl UnwindSafe for Coordinate",1,["funnybones::Coordinate"]],["impl UnwindSafe for Joint",1,["funnybones::Joint"]],["impl UnwindSafe for JointId",1,["funnybones::JointId"]],["impl UnwindSafe for LabeledBoneKind",1,["funnybones::LabeledBoneKind"]],["impl UnwindSafe for Rotation",1,["funnybones::Rotation"]],["impl UnwindSafe for Skeleton",1,["funnybones::Skeleton"]],["impl UnwindSafe for Vector",1,["funnybones::Vector"]]]]]);
     if (window.register_implementors) {
         window.register_implementors(implementors);
     } else {
         window.pending_implementors = implementors;
     }
 })()
-//{"start":57,"fragment_lengths":[2086,9080]}
\ No newline at end of file
+//{"start":57,"fragment_lengths":[10531]}
\ No newline at end of file
diff --git a/main/trait.impl/cushy/widget/trait.MakeWidget.js b/main/trait.impl/cushy/widget/trait.MakeWidget.js
new file mode 100644
index 0000000..ce760c8
--- /dev/null
+++ b/main/trait.impl/cushy/widget/trait.MakeWidget.js
@@ -0,0 +1,9 @@
+(function() {
+    var implementors = Object.fromEntries([["funnybones",[["impl MakeWidget for SkeletonEditor"]]]]);
+    if (window.register_implementors) {
+        window.register_implementors(implementors);
+    } else {
+        window.pending_implementors = implementors;
+    }
+})()
+//{"start":57,"fragment_lengths":[185]}
\ No newline at end of file
diff --git a/main/trait.impl/serde/de/trait.Deserialize.js b/main/trait.impl/serde/de/trait.Deserialize.js
index 52bdceb..3b4d301 100644
--- a/main/trait.impl/serde/de/trait.Deserialize.js
+++ b/main/trait.impl/serde/de/trait.Deserialize.js
@@ -1,9 +1,9 @@
 (function() {
-    var implementors = Object.fromEntries([["FunnyBones",[["impl<'de> Deserialize<'de> for SerializedBone"],["impl<'de> Deserialize<'de> for SerializedSkeleton"]]],["funnybones",[["impl<'de> Deserialize<'de> for BoneProperty"],["impl<'de> Deserialize<'de> for JointProperty"],["impl<'de> Deserialize<'de> for PropertyUpdate"],["impl<'de> Deserialize<'de> for Target"],["impl<'de> Deserialize<'de> for Value"],["impl<'de> Deserialize<'de> for BoneEnd"],["impl<'de> Deserialize<'de> for BoneKind"],["impl<'de> Deserialize<'de> for Frame"],["impl<'de> Deserialize<'de> for Keyframe"],["impl<'de> Deserialize<'de> for Timeline"],["impl<'de> Deserialize<'de> for Angle"],["impl<'de> Deserialize<'de> for BoneAxis"],["impl<'de> Deserialize<'de> for BoneId"],["impl<'de> Deserialize<'de> for Coordinate"],["impl<'de> Deserialize<'de> for JointId"],["impl<'de> Deserialize<'de> for Rotation"],["impl<'de> Deserialize<'de> for Skeleton"],["impl<'de> Deserialize<'de> for Vector"]]]]);
+    var implementors = Object.fromEntries([["funnybones",[["impl<'de> Deserialize<'de> for BoneProperty"],["impl<'de> Deserialize<'de> for JointProperty"],["impl<'de> Deserialize<'de> for PropertyUpdate"],["impl<'de> Deserialize<'de> for Target"],["impl<'de> Deserialize<'de> for Value"],["impl<'de> Deserialize<'de> for BoneEnd"],["impl<'de> Deserialize<'de> for BoneKind"],["impl<'de> Deserialize<'de> for Frame"],["impl<'de> Deserialize<'de> for Keyframe"],["impl<'de> Deserialize<'de> for Timeline"],["impl<'de> Deserialize<'de> for Angle"],["impl<'de> Deserialize<'de> for BoneAxis"],["impl<'de> Deserialize<'de> for BoneId"],["impl<'de> Deserialize<'de> for Coordinate"],["impl<'de> Deserialize<'de> for JointId"],["impl<'de> Deserialize<'de> for Rotation"],["impl<'de> Deserialize<'de> for Skeleton"],["impl<'de> Deserialize<'de> for Vector"]]]]);
     if (window.register_implementors) {
         window.register_implementors(implementors);
     } else {
         window.pending_implementors = implementors;
     }
 })()
-//{"start":57,"fragment_lengths":[648,5399]}
\ No newline at end of file
+//{"start":57,"fragment_lengths":[5398]}
\ No newline at end of file
diff --git a/main/trait.impl/serde/ser/trait.Serialize.js b/main/trait.impl/serde/ser/trait.Serialize.js
index 7cc7eb8..f82a8a2 100644
--- a/main/trait.impl/serde/ser/trait.Serialize.js
+++ b/main/trait.impl/serde/ser/trait.Serialize.js
@@ -1,9 +1,9 @@
 (function() {
-    var implementors = Object.fromEntries([["FunnyBones",[["impl Serialize for SerializedBone"],["impl Serialize for SerializedSkeleton"]]],["funnybones",[["impl Serialize for BoneProperty"],["impl Serialize for JointProperty"],["impl Serialize for PropertyUpdate"],["impl Serialize for Target"],["impl Serialize for Value"],["impl Serialize for BoneEnd"],["impl Serialize for BoneKind"],["impl Serialize for Frame"],["impl Serialize for Keyframe"],["impl Serialize for Timeline"],["impl Serialize for Angle"],["impl Serialize for Bone"],["impl Serialize for BoneAxis"],["impl Serialize for BoneId"],["impl Serialize for Coordinate"],["impl Serialize for Joint"],["impl Serialize for JointId"],["impl Serialize for Rotation"],["impl Serialize for Skeleton"],["impl Serialize for Vector"]]]]);
+    var implementors = Object.fromEntries([["funnybones",[["impl Serialize for BoneProperty"],["impl Serialize for JointProperty"],["impl Serialize for PropertyUpdate"],["impl Serialize for Target"],["impl Serialize for Value"],["impl Serialize for BoneEnd"],["impl Serialize for BoneKind"],["impl Serialize for Frame"],["impl Serialize for Keyframe"],["impl Serialize for Timeline"],["impl Serialize for Angle"],["impl Serialize for Bone"],["impl Serialize for BoneAxis"],["impl Serialize for BoneId"],["impl Serialize for Coordinate"],["impl Serialize for Joint"],["impl Serialize for JointId"],["impl Serialize for Rotation"],["impl Serialize for Skeleton"],["impl Serialize for Vector"]]]]);
     if (window.register_implementors) {
         window.register_implementors(implementors);
     } else {
         window.pending_implementors = implementors;
     }
 })()
-//{"start":57,"fragment_lengths":[596,5442]}
\ No newline at end of file
+//{"start":57,"fragment_lengths":[5441]}
\ No newline at end of file