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 @@ -
pub(crate) fn add_bones_to_skeleton(
- connected_to: BoneAxis,
- bones: &Dynamic<Vec<SkeletalBone>>,
- skeleton: &mut Skeleton,
-)
pub(crate) fn bone_editor(
- bone: SkeletalBone,
- watcher: &Watcher,
-) -> impl MakeWidget
pub(crate) fn bone_property_editor(
- bone: SkeletalBone,
- watcher: &Watcher,
- is_root: bool,
-) -> impl MakeWidget
pub(crate) fn bones_editor(
- label: &str,
- bones: &Dynamic<Vec<SkeletalBone>>,
- watcher: &Watcher,
-) -> impl MakeWidget
pub(crate) fn main() -> Result
pub(crate) fn main() -> Result
pub(crate) fn main_menu_window(app: &impl Application) -> Window
pub(crate) fn main_menu_window(app: &impl Application) -> Window
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
sourcepub(crate) fn read_from(path: &Path) -> Result<Self, ReadError>
sourcepub(crate) fn write_to(&self, path: &Path) -> Result<(), SaveError>
sourcepub(crate) fn find_bone(&self, id: BoneId) -> Option<SkeletalBone>
sourcepub(crate) fn find_bone_in(
- bones: &Dynamic<Vec<SkeletalBone>>,
- index: usize,
-) -> ControlFlow<SkeletalBone, usize>
sourcepub(crate) fn find_joint(&self, id: JointId) -> Option<SkeletalBone>
sourcepub(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 more1.0.0 · source§fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source
. Read moresource§impl Debug for EditingSkeleton
source§impl Default for EditingSkeleton
source§fn default() -> EditingSkeleton
Returns the “default value” for a type. Read moresource§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§impl StructuralPartialEq for EditingSkeleton
Auto Trait Implementations§
§impl Freeze for EditingSkeleton
§impl !RefUnwindSafe for EditingSkeleton
§impl Send for EditingSkeleton
§impl Sync for EditingSkeleton
§impl Unpin for EditingSkeleton
§impl !UnwindSafe for EditingSkeleton
Blanket Implementations§
source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
- 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) -> Dwhere
- 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, C> ArraysFrom<C> for Twhere
- 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 Twhere
- C: FromArrays<T>,
source§fn arrays_into(self) -> C
Cast this collection of arrays into a collection of colors.source§impl<T> BorrowMut<T> for Twhere
- T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read moresource§impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
- 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
source§impl<T> CloneToUninit for Twhere
- T: Clone,
source§unsafe fn clone_to_uninit(&self, dst: *mut T)
🔬This is a nightly-only experimental API. (clone_to_uninit
)source§impl<T, C> ComponentsFrom<C> for Twhere
- C: IntoComponents<T>,
source§fn components_from(colors: C) -> T
Cast a collection of colors into a collection of color components.§impl<T> Downcast for Twhere
- 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
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 Twhere
- 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>
§fn in_current_span(self) -> Instrumented<Self>
source§impl<T, U> IntoAngle<U> for Twhere
- U: FromAngle<T>,
source§fn into_angle(self) -> U
Performs a conversion into T
.source§impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
- 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 Twhere
- U: FromColor<T>,
source§fn into_color(self) -> U
Convert into T with values clamped to the color defined bounds Read moresource§impl<T, U> IntoColorUnclamped<U> for Twhere
- U: FromColorUnclamped<T>,
source§fn into_color_unclamped(self) -> U
Convert into T. The resulting color might be invalid in its color space Read moresource§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 moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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 Twhere
- T: Default,
§type NoneType = T
§fn null_value() -> T
The none-equivalent value.§impl<T> Pointable for T
source§impl<R, P> ReadPrimitive<R> for P
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§impl<T, C> TryComponentsInto<C> for Twhere
- 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 moresource§impl<T, U> TryIntoColor<U> for Twhere
- 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 moresource§impl<C, U> UintsFrom<C> for Uwhere
- 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 Uwhere
- C: FromUints<U>,
source§fn uints_into(self) -> C
Cast this collection of unsigned integers into a collection of colors.§impl<T> WithSubscriber for T
§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
- S: Into<Dispatch>,
§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 Twhere
- T: Send,
§impl<T> WasmNotSendSync for Twhere
- T: WasmNotSend + WasmNotSync,
§impl<T> WasmNotSync for Twhere
- 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§
source§impl SkeletalBone
sourcepub fn as_bone_kind(&self) -> (LabeledBoneKind, Vector)
Trait Implementations§
source§impl Clone for SkeletalBone
source§fn clone(&self) -> SkeletalBone
Returns a copy of the value. Read more1.0.0 · source§fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source
. Read moresource§impl Debug for SkeletalBone
source§impl Default for SkeletalBone
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§impl StructuralPartialEq for SkeletalBone
Auto Trait Implementations§
§impl Freeze for SkeletalBone
§impl !RefUnwindSafe for SkeletalBone
§impl Send for SkeletalBone
§impl Sync for SkeletalBone
§impl Unpin for SkeletalBone
§impl !UnwindSafe for SkeletalBone
Blanket Implementations§
source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
- 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) -> Dwhere
- 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, C> ArraysFrom<C> for Twhere
- 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 Twhere
- C: FromArrays<T>,
source§fn arrays_into(self) -> C
Cast this collection of arrays into a collection of colors.source§impl<T> BorrowMut<T> for Twhere
- T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read moresource§impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
- 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
source§impl<T> CloneToUninit for Twhere
- T: Clone,
source§unsafe fn clone_to_uninit(&self, dst: *mut T)
🔬This is a nightly-only experimental API. (clone_to_uninit
)source§impl<T, C> ComponentsFrom<C> for Twhere
- C: IntoComponents<T>,
source§fn components_from(colors: C) -> T
Cast a collection of colors into a collection of color components.§impl<T> Downcast for Twhere
- 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
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 Twhere
- 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>
§fn in_current_span(self) -> Instrumented<Self>
source§impl<T, U> IntoAngle<U> for Twhere
- U: FromAngle<T>,
source§fn into_angle(self) -> U
Performs a conversion into T
.source§impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
- 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 Twhere
- U: FromColor<T>,
source§fn into_color(self) -> U
Convert into T with values clamped to the color defined bounds Read moresource§impl<T, U> IntoColorUnclamped<U> for Twhere
- U: FromColorUnclamped<T>,
source§fn into_color_unclamped(self) -> U
Convert into T. The resulting color might be invalid in its color space Read moresource§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 moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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 Twhere
- T: Default,
§type NoneType = T
§fn null_value() -> T
The none-equivalent value.§impl<T> Pointable for T
source§impl<R, P> ReadPrimitive<R> for P
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§impl<T, C> TryComponentsInto<C> for Twhere
- 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 moresource§impl<T, U> TryIntoColor<U> for Twhere
- 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 moresource§impl<C, U> UintsFrom<C> for Uwhere
- 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 Uwhere
- C: FromUints<U>,
source§fn uints_into(self) -> C
Cast this collection of unsigned integers into a collection of colors.§impl<T> WithSubscriber for T
§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
- S: Into<Dispatch>,
§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 Twhere
- T: Send,
§impl<T> WasmNotSendSync for Twhere
- T: WasmNotSend + WasmNotSync,
§impl<T> WasmNotSync for Twhere
- 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 List of all items
Structs
- Angle
- Bone
- BoneAxis
- BoneId
- Coordinate
- Joint
- JointId
- LabeledBoneKind
- Rotation
- Skeleton
- Vector
- animation::Animation
- animation::Frame
- animation::Keyframe
- animation::RunningAnimation
- animation::Timeline
- cushy::skeleton_canvas::SkeletonCanvas
- editor::EditingSkeleton
- editor::SkeletonEditor
Enums
- BoneEnd
- BoneKind
- animation::BoneProperty
- animation::JointProperty
- animation::PropertyUpdate
- animation::Target
- animation::Value
- cushy::skeleton_canvas::SkeletonMutation
- cushy::skeleton_canvas::Target
- editor::ReadError
- editor::SaveError
Functions
\ 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§
Trait Implementations§
Auto Trait Implementations§
§impl Freeze for ReadError
§impl !RefUnwindSafe for ReadError
§impl Send for ReadError
§impl Sync for ReadError
§impl Unpin for ReadError
§impl !UnwindSafe for ReadError
Blanket Implementations§
source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
+}Variants§
Trait Implementations§
Auto Trait Implementations§
§impl Freeze for ReadError
§impl !RefUnwindSafe for ReadError
§impl Send for ReadError
§impl Sync for ReadError
§impl Unpin for ReadError
§impl !UnwindSafe for ReadError
Blanket Implementations§
source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
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
§impl<T> ToSmolStr for Twhere
+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
§impl<T> ToSmolStr for T
§fn to_smolstr(&self) -> SmolStr
source§impl<T, C> TryComponentsInto<C> for Twhere
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 moresource§impl<C, U> UintsFrom<C> for Uwhere
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 Uwhere
- C: FromUints<U>,
source§fn uints_into(self) -> C
Cast this collection of unsigned integers into a collection of colors.§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> WithSubscriber for T
§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
§fn with_current_subscriber(self) -> WithDispatch<Self>
§impl<T> WasmNotSend for Twhere
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§
Trait Implementations§
source§impl From<PersistError> for SaveError
source§fn from(err: PersistError) -> Self
Converts to this type from the input type.Auto Trait Implementations§
§impl Freeze for SaveError
§impl !RefUnwindSafe for SaveError
§impl Send for SaveError
§impl Sync for SaveError
§impl Unpin for SaveError
§impl !UnwindSafe for SaveError
Blanket Implementations§
source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
+}Variants§
Trait Implementations§
source§impl From<PersistError> for SaveError
source§fn from(err: PersistError) -> Self
Converts to this type from the input type.Auto Trait Implementations§
§impl Freeze for SaveError
§impl !RefUnwindSafe for SaveError
§impl Send for SaveError
§impl Sync for SaveError
§impl Unpin for SaveError
§impl !UnwindSafe for SaveError
Blanket Implementations§
source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
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
§impl<T> ToSmolStr for Twhere
+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
§impl<T> ToSmolStr for T
§fn to_smolstr(&self) -> SmolStr
source§impl<T, C> TryComponentsInto<C> for Twhere
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 moresource§impl<C, U> UintsFrom<C> for Uwhere
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 Uwhere
- C: FromUints<U>,
source§fn uints_into(self) -> C
Cast this collection of unsigned integers into a collection of colors.§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> WithSubscriber for T
§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
§fn with_current_subscriber(self) -> WithDispatch<Self>
§impl<T> WasmNotSend for Twhere
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§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 moresource§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.Auto Trait Implementations§
§impl Freeze for SerializedBone
§impl RefUnwindSafe for SerializedBone
§impl Send for SerializedBone
§impl Sync for SerializedBone
§impl Unpin for SerializedBone
§impl UnwindSafe for SerializedBone
Blanket Implementations§
source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
+EditingSkeleton in funnybones::editor - Rust Struct funnybones::editor::EditingSkeleton
source · pub struct EditingSkeleton { /* private fields */ }
Implementations§
Trait Implementations§
source§impl Clone for EditingSkeleton
source§fn clone(&self) -> EditingSkeleton
Returns a copy of the value. Read more1.0.0 · source§fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source
. Read moresource§impl Debug for EditingSkeleton
source§impl Default for EditingSkeleton
source§fn default() -> EditingSkeleton
Returns the “default value” for a type. Read moresource§impl PartialEq for EditingSkeleton
source§impl StructuralPartialEq for EditingSkeleton
Auto Trait Implementations§
§impl Freeze for EditingSkeleton
§impl !RefUnwindSafe for EditingSkeleton
§impl Send for EditingSkeleton
§impl Sync for EditingSkeleton
§impl Unpin for EditingSkeleton
§impl !UnwindSafe for EditingSkeleton
Blanket Implementations§
source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
@@ -28,7 +17,8 @@
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> TConverts self
into C
, using the provided parameters.
§impl<A> Cast for A
source§impl<T, C> ComponentsFrom<C> for Twhere
+ A: CastFrom<B>,
source§impl<T> CloneToUninit for Twhere
+ T: Clone,
source§unsafe fn clone_to_uninit(&self, dst: *mut T)
🔬This is a nightly-only experimental API. (clone_to_uninit
)source§impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
source§fn components_from(colors: C) -> T
Cast a collection of colors into a collection of color components.§impl<T> Downcast for Twhere
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
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 Twhere
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
source§impl<T, C> TryComponentsInto<C> for Twhere
+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
source§impl<R, P> ReadPrimitive<R> for P
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§impl<T, C> TryComponentsInto<C> for Twhere
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 moresource§impl<C, U> UintsFrom<C> for Uwhere
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 Uwhere
- C: FromUints<U>,
source§fn uints_into(self) -> C
Cast this collection of unsigned integers into a collection of colors.§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> WithSubscriber for T
§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
§fn with_current_subscriber(self) -> WithDispatch<Self>
Attaches the current default Subscriber
to this type, returning a
-[WithDispatch
] wrapper. Read moresource§impl<T> DeserializeOwned for Twhere
- T: for<'de> Deserialize<'de>,
§impl<T> WasmNotSend for Twhere
+[WithDispatch
] wrapper. Read more
§impl<T> WasmNotSend for Twhere
T: Send,
§impl<T> WasmNotSendSync for Twhere
T: WasmNotSend + WasmNotSync,
§impl<T> WasmNotSync for Twhere
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§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 moresource§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.Auto Trait Implementations§
§impl Freeze for SerializedSkeleton
§impl RefUnwindSafe for SerializedSkeleton
§impl Send for SerializedSkeleton
§impl Sync for SerializedSkeleton
§impl Unpin for SerializedSkeleton
§impl UnwindSafe for SerializedSkeleton
Blanket Implementations§
source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
+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>) -> Stylewhere
+ Self: Sized,
Associates styles
with this widget. Read more§fn with<C>(
+ self,
+ name: &C,
+ component: impl IntoValue<<C as ComponentDefinition>::ComponentType>,
+) -> Stylewhere
+ C: ComponentDefinition,
+ Value<<C as ComponentDefinition>::ComponentType>: IntoComponentValue,
Associates a style component with self
.§fn with_dynamic<C>(
+ self,
+ name: &C,
+ dynamic: impl IntoDynamicComponentValue,
+) -> Stylewhere
+ 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
§fn with_repeating_shortcut<F>(
+ self,
+ key: impl Into<ShortcutKey>,
+ modifiers: ModifiersState,
+ callback: F,
+) -> Shortcuts
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 xxxx_large(self) -> Style
Styles self
with the largest text size.§fn default_size(self) -> Style
Styles self
with the third 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>) -> WidgetListwhere
+ W: MakeWidget,
Chains self
and others
into a [WidgetList
].§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.
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 align_left(self) -> Align
Aligns self
to the left.§fn align_right(self) -> Align
Aligns self
to the right.§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 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_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_by(self, padding: impl IntoValue<Edges<Dimension>>) -> Container
Wraps self
with the specified padding.§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 validation(self, validation: impl IntoDynamic<Validation>) -> Validated
Returns a widget that shows validation errors and/or hints.Auto Trait Implementations§
§impl Freeze for SkeletonEditor
§impl !RefUnwindSafe for SkeletonEditor
§impl Send for SkeletonEditor
§impl Sync for SkeletonEditor
§impl Unpin for SkeletonEditor
§impl !UnwindSafe for SkeletonEditor
Blanket Implementations§
source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
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
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 Twhere
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
source§impl<T, C> TryComponentsInto<C> for Twhere
+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 Twhere
+ T: MakeWidget,
§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>
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 Twhere
+ T: MakeWindow,
§impl<T> Pointable for T
§impl<T> Run for Twhere
+ T: MakeWidget,
source§impl<T, C> TryComponentsInto<C> for Twhere
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<C, U> UintsFrom<C> for Uwhere
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 Uwhere
- C: FromUints<U>,
source§fn uints_into(self) -> C
Cast this collection of unsigned integers into a collection of colors.§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> WithSubscriber for T
§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where
S: Into<Dispatch>,
§fn with_current_subscriber(self) -> WithDispatch<Self>
Attaches the current default Subscriber
to this type, returning a
-[WithDispatch
] wrapper. Read moresource§impl<T> DeserializeOwned for Twhere
- T: for<'de> Deserialize<'de>,
§impl<T> WasmNotSend for Twhere
+[WithDispatch
] wrapper. Read more
§impl<T> WasmNotSend for Twhere
T: Send,
§impl<T> WasmNotSendSync for Twhere
T: WasmNotSend + WasmNotSync,
§impl<T> WasmNotSync for Twhere
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§
Implementations§
Trait Implementations§
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 moresource§impl Hash for BoneEnd
1.3.0 · source§fn hash_slice<H>(data: &[Self], state: &mut H)where
+
Implementations§
Trait Implementations§
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 moresource§impl Copy for BoneEnd
source§impl Eq for BoneEnd
source§impl StructuralPartialEq for BoneEnd
Auto Trait Implementations§
§impl Freeze for BoneEnd
§impl RefUnwindSafe for BoneEnd
§impl Send for BoneEnd
§impl Sync for BoneEnd
§impl Unpin for BoneEnd
§impl UnwindSafe for BoneEnd
Blanket Implementations§
source§impl Copy for BoneEnd
source§impl Eq for BoneEnd
source§impl StructuralPartialEq for BoneEnd
Auto Trait Implementations§
§impl Freeze for BoneEnd
§impl RefUnwindSafe for BoneEnd
§impl Send for BoneEnd
§impl Sync for BoneEnd
§impl Unpin for BoneEnd
§impl UnwindSafe for BoneEnd
Blanket Implementations§
source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
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.
Implementations§
source§impl BoneKind
sourcepub fn with_label(self, label: impl Into<String>) -> LabeledBoneKind
Attaches a label to this bone when pushed into a skeleton.
-sourcepub fn full_length(&self) -> f32
Returns the full length of this bone.
-sourcepub fn is_inverse(&self) -> bool
Returns true if this is a jointed bone that bends inversely.
-sourcepub fn set_inverse(&mut self, new_inverse: bool)
Sets whether to bend inversely.
+Implementations§
source§impl BoneKind
sourcepub fn with_label(self, label: impl Into<String>) -> LabeledBoneKind
Attaches a label to this bone when pushed into a skeleton.
+sourcepub fn full_length(&self) -> f32
Returns the full length of this bone.
+sourcepub fn is_inverse(&self) -> bool
Returns true if this is a jointed bone that bends inversely.
+sourcepub 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<'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 moresource§impl From<BoneKind> for LabeledBoneKind
source§impl Copy for BoneKind
source§impl StructuralPartialEq for BoneKind
Auto Trait Implementations§
§impl Freeze for BoneKind
§impl RefUnwindSafe for BoneKind
§impl Send for BoneKind
§impl Sync for BoneKind
§impl Unpin for BoneKind
§impl UnwindSafe for BoneKind
Blanket Implementations§
Trait Implementations§
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 moresource§impl From<BoneKind> for LabeledBoneKind
source§impl Copy for BoneKind
source§impl StructuralPartialEq for BoneKind
Auto Trait Implementations§
§impl Freeze for BoneKind
§impl RefUnwindSafe for BoneKind
§impl Send for BoneKind
§impl Sync for BoneKind
§impl Unpin for BoneKind
§impl UnwindSafe for BoneKind
Blanket Implementations§
source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
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
MIT License or the
Apache License 2.0.
To learn more about contributing, please see CONTRIBUTING.md.
-Modules§
- Widgets for editing and rendering skeletons.
Structs§
- A value representing a rotation between 0. and
2π
. - A bone in a
Skeleton
. - A specific end of a specific bone.
- A two dimensionsional offset/measurement.
- A connection between two bones.
- A
BoneKind
with an associated label. - A value representing a rotation in 2d space.
- A 2D Euclidean vector.
Enums§
\ No newline at end of file
+Modules§
- Widgets for editing and rendering skeletons.
Structs§
- A value representing a rotation between 0. and
2π
. - A bone in a
Skeleton
. - A specific end of a specific bone.
- A two dimensionsional offset/measurement.
- A connection between two bones.
- A
BoneKind
with an associated label. - A value representing a rotation in 2d space.
- A 2D Euclidean vector.
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 2π
.
-Implementations§
Trait Implementations§
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 moresource§impl PartialOrd for Angle
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 2π
.
+Implementations§
Trait Implementations§
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 moresource§impl PartialOrd for Angle
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 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 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 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 Swhere
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
sourcepub fn kind_mut(&mut self) -> &mut BoneKind
Returns an exclusive reference to the kind of this bone.
-sourcepub 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
sourcepub fn kind_mut(&mut self) -> &mut BoneKind
Returns an exclusive reference to the kind of this bone.
+sourcepub 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.
-sourcepub const fn desired_end(&self) -> Option<Vector>
Returns the location this bone is being aimed towards.
-sourcepub const fn entry_angle(&self) -> Rotation
Returns the angle of the previous bone segment connecting to this bone.
-sourcepub const fn start(&self) -> Coordinate
Returns the solved start position of this bone.
-sourcepub const fn end(&self) -> Coordinate
Returns the solved end position of this bone.
-sourcepub fn final_vector(&self) -> Vector
Returns a vector representing the final segment in this bone.
-sourcepub const fn solved_joint(&self) -> Option<Coordinate>
If this is a BoneKind::Jointed
bone, returns the solved position of
+
sourcepub const fn desired_end(&self) -> Option<Vector>
Returns the location this bone is being aimed towards.
+sourcepub const fn entry_angle(&self) -> Rotation
Returns the angle of the previous bone segment connecting to this bone.
+sourcepub const fn start(&self) -> Coordinate
Returns the solved start position of this bone.
+sourcepub const fn end(&self) -> Coordinate
Returns the solved end position of this bone.
+sourcepub fn final_vector(&self) -> Vector
Returns a vector representing the final segment in this bone.
+sourcepub const fn solved_joint(&self) -> Option<Coordinate>
If this is a BoneKind::Jointed
bone, returns the solved position of
the joint.
-Trait Implementations§
Trait Implementations§
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 Swhere
+ S: Serializer,
Serialize this value into the given Serde serializer. Read moresource§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 Swhere
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§
Trait Implementations§
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 moresource§impl Hash for BoneAxis
1.3.0 · source§fn hash_slice<H>(data: &[Self], state: &mut H)where
+Implementations§
Trait Implementations§
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 moresource§impl Copy for BoneAxis
source§impl Eq for BoneAxis
source§impl StructuralPartialEq for BoneAxis
Auto Trait Implementations§
§impl Freeze for BoneAxis
§impl RefUnwindSafe for BoneAxis
§impl Send for BoneAxis
§impl Sync for BoneAxis
§impl Unpin for BoneAxis
§impl UnwindSafe for BoneAxis
Blanket Implementations§
source§impl Copy for BoneAxis
source§impl Eq for BoneAxis
source§impl StructuralPartialEq for BoneAxis
Auto Trait Implementations§
§impl Freeze for BoneAxis
§impl RefUnwindSafe for BoneAxis
§impl Send for BoneAxis
§impl Sync for BoneAxis
§impl Unpin for BoneAxis
§impl UnwindSafe for BoneAxis
Blanket Implementations§
source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
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 */);
Implementations§
Trait Implementations§
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 moresource§impl Hash for BoneId
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 */);
Implementations§
Trait Implementations§
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 moresource§impl Ord for BoneId
source§impl PartialOrd for BoneId
source§impl PartialOrd for BoneId
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 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 Swhere
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
sourcepub fn map(self, f: impl FnMut(f32) -> f32) -> Self
Returns the result of mapping x
and y
to f
.
-sourcepub fn as_rotation(self) -> Rotation
Returns the angle formed a line passing through 0,0 towards this vector.
-sourcepub fn vector_to(self, other: Coordinate) -> Vector
Returns a vector pointing from self
to other
.
-Trait Implementations§
source§impl Add<Vector> for Coordinate
source§impl Add for Coordinate
source§impl Clone for Coordinate
source§fn clone(&self) -> Coordinate
Returns a copy of the value. Read more1.0.0 · source§fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source
. Read moresource§impl Debug for Coordinate
source§impl Default for Coordinate
source§fn default() -> Coordinate
Returns the “default value” for a type. Read moresource§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 moresource§impl Div<f32> for Coordinate
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§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) -> Selfwhere
+Implementations§
source§impl Coordinate
sourcepub fn map(self, f: impl FnMut(f32) -> f32) -> Self
Returns the result of mapping x
and y
to f
.
+sourcepub fn as_rotation(self) -> Rotation
Returns the angle formed a line passing through 0,0 towards this vector.
+sourcepub fn vector_to(self, other: Coordinate) -> Vector
Returns a vector pointing from self
to other
.
+Trait Implementations§
source§impl Add<Vector> for Coordinate
source§impl Add for Coordinate
source§impl Clone for Coordinate
source§fn clone(&self) -> Coordinate
Returns a copy of the value. Read more1.0.0 · source§fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source
. Read moresource§impl Debug for Coordinate
source§impl Default for Coordinate
source§fn default() -> Coordinate
Returns the “default value” for a type. Read moresource§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 moresource§impl Div<f32> for Coordinate
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§impl FromComponents<f32> for Coordinate
source§impl IntoComponents<f32> for Coordinate
source§impl Mul<f32> for Coordinate
source§impl PartialEq for Coordinate
source§impl Serialize for Coordinate
source§impl Sub<Vector> for Coordinate
source§impl Sub for Coordinate
source§impl Copy for Coordinate
source§impl StructuralPartialEq for Coordinate
Auto Trait Implementations§
§impl Freeze for Coordinate
§impl RefUnwindSafe for Coordinate
§impl Send for Coordinate
§impl Sync for Coordinate
§impl Unpin for Coordinate
§impl UnwindSafe for Coordinate
Blanket Implementations§
source§impl Mul<f32> for Coordinate
source§impl PartialEq for Coordinate
source§impl Serialize for Coordinate
source§impl Sub<Vector> for Coordinate
source§impl Sub for Coordinate
source§impl Copy for Coordinate
source§impl StructuralPartialEq for Coordinate
Auto Trait Implementations§
§impl Freeze for Coordinate
§impl RefUnwindSafe for Coordinate
§impl Send for Coordinate
§impl Sync for Coordinate
§impl Unpin for Coordinate
§impl UnwindSafe for Coordinate
Blanket Implementations§
source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
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
sourcepub 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
.
-sourcepub fn with_label(self, label: impl Into<String>) -> Self
Labels this joint and returns self.
-sourcepub 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
sourcepub 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
.
+sourcepub fn with_label(self, label: impl Into<String>) -> Self
Labels this joint and returns self.
+sourcepub 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.
-sourcepub 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.
-Trait Implementations§
Trait Implementations§
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 Swhere
+ S: Serializer,
Serialize this value into the given Serde serializer. Read moresource§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 Swhere
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 */);
Implementations§
Trait Implementations§
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 moresource§impl Hash for JointId
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 */);
Implementations§
Trait Implementations§
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 moresource§impl Ord for JointId
source§impl PartialOrd for JointId
source§impl PartialOrd for JointId
source§impl Copy for JointId
source§impl Eq for JointId
source§impl StructuralPartialEq for JointId
Auto Trait Implementations§
§impl Freeze for JointId
§impl RefUnwindSafe for JointId
§impl Send for JointId
§impl Sync for JointId
§impl Unpin for JointId
§impl UnwindSafe for JointId
Blanket Implementations§
source§impl Copy for JointId
source§impl Eq for JointId
source§impl StructuralPartialEq for JointId
Auto Trait Implementations§
§impl Freeze for JointId
§impl RefUnwindSafe for JointId
§impl Send for JointId
§impl Sync for JointId
§impl Unpin for JointId
§impl UnwindSafe for JointId
Blanket Implementations§
source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
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§
Auto Trait Implementations§
§impl Freeze for LabeledBoneKind
§impl RefUnwindSafe for LabeledBoneKind
§impl Send for LabeledBoneKind
§impl Sync for LabeledBoneKind
§impl Unpin for LabeledBoneKind
§impl UnwindSafe for LabeledBoneKind
Blanket Implementations§
source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
+Trait Implementations§
Auto Trait Implementations§
§impl Freeze for LabeledBoneKind
§impl RefUnwindSafe for LabeledBoneKind
§impl Send for LabeledBoneKind
§impl Sync for LabeledBoneKind
§impl Unpin for LabeledBoneKind
§impl UnwindSafe for LabeledBoneKind
Blanket Implementations§
source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
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§
Trait Implementations§
source§impl AddAssign for Rotation
source§fn add_assign(&mut self, rhs: Self)
Performs the +=
operation. Read moresource§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 moresource§impl PartialOrd for Rotation
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§
Trait Implementations§
source§impl AddAssign for Rotation
source§fn add_assign(&mut self, rhs: Self)
Performs the +=
operation. Read moresource§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 moresource§impl PartialOrd for Rotation
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 SubAssign for Rotation
source§fn sub_assign(&mut self, rhs: Self)
Performs the -=
operation. Read moresource§impl Copy for Rotation
source§impl StructuralPartialEq for Rotation
Auto Trait Implementations§
§impl Freeze for Rotation
§impl RefUnwindSafe for Rotation
§impl Send for Rotation
§impl Sync for Rotation
§impl Unpin for Rotation
§impl UnwindSafe for Rotation
Blanket Implementations§
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 SubAssign for Rotation
source§fn sub_assign(&mut self, rhs: Self)
Performs the -=
operation. Read moresource§impl Copy for Rotation
source§impl StructuralPartialEq for Rotation
Auto Trait Implementations§
§impl Freeze for Rotation
§impl RefUnwindSafe for Rotation
§impl Send for Rotation
§impl Sync for Rotation
§impl Unpin for Rotation
§impl UnwindSafe for Rotation
Blanket Implementations§
source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
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 */ }
Implementations§
source§impl Skeleton
sourcepub 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 */ }
Implementations§
source§impl Skeleton
sourcepub fn push_bone(&mut self, bone: impl Into<LabeledBoneKind>) -> BoneId
sourcepub fn bone(&self, id: BoneId) -> Option<&Bone>
Returns the bone for a given id, or none if not found.
-sourcepub fn bone_mut(&mut self, id: BoneId) -> Option<&mut Bone>
Returns an exclusive reference to the bone for a given id, or none if
+
sourcepub fn bone(&self, id: BoneId) -> Option<&Bone>
Returns the bone for a given id, or none if not found.
+sourcepub 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.
-sourcepub fn joint(&self, id: JointId) -> Option<&Joint>
Returns the joint for a given id, or none if not found.
-sourcepub fn joint_mut(&mut self, id: JointId) -> Option<&mut Joint>
Returns an exclusive reference to the joint for a given id, or none if
+
sourcepub fn joint(&self, id: JointId) -> Option<&Joint>
Returns the joint for a given id, or none if not found.
+sourcepub 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.
-sourcepub fn connections_to(&self, axis: BoneAxis) -> Option<&[JointId]>
Returns a list of joints connected to a specific bone axis.
-sourcepub fn push_joint(&mut self, joint: Joint) -> JointId
Creates a new Joint
in the skeleton, connecting two bones together
+
sourcepub fn connections_to(&self, axis: BoneAxis) -> Option<&[JointId]>
Returns a list of joints connected to a specific bone axis.
+sourcepub fn push_joint(&mut self, joint: Joint) -> JointId
sourcepub fn find_joint_by_label(&self, label: &str) -> Option<JointId>
Finds an existing Joint
by its label.
-sourcepub fn find_bone_by_label(&self, label: &str) -> Option<BoneId>
Finds an existing Bone
by its label.
-sourcepub fn set_translation(&mut self, translation: Coordinate)
Sets a translation to be applied to the entire skeleton.
-sourcepub fn translation(&self) -> Coordinate
Returns the translation applied to the entire skeleton.
-sourcepub fn set_rotation(&mut self, rotation: Rotation)
Sets a base rotation to apply to the entire skeleton.
-sourcepub const fn rotation(&self) -> Rotation
Returns the base rotation being applied to the entire skeleton.
-sourcepub fn find_joint_by_label(&self, label: &str) -> Option<JointId>
Finds an existing Joint
by its label.
+sourcepub fn find_bone_by_label(&self, label: &str) -> Option<BoneId>
Finds an existing Bone
by its label.
+sourcepub fn set_translation(&mut self, translation: Coordinate)
Sets a translation to be applied to the entire skeleton.
+sourcepub fn translation(&self) -> Coordinate
Returns the translation applied to the entire skeleton.
+sourcepub fn set_rotation(&mut self, rotation: Rotation)
Sets a base rotation to apply to the entire skeleton.
+Trait Implementations§
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 moreTrait Implementations§
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 moresource§impl StructuralPartialEq for Skeleton
Auto Trait Implementations§
§impl Freeze for Skeleton
§impl RefUnwindSafe for Skeleton
§impl Send for Skeleton
§impl Sync for Skeleton
§impl Unpin for Skeleton
§impl UnwindSafe for Skeleton
Blanket Implementations§
source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
+ S: Serializer,
Serialize this value into the given Serde serializer. Read moresource§impl StructuralPartialEq for Skeleton
Auto Trait Implementations§
§impl Freeze for Skeleton
§impl RefUnwindSafe for Skeleton
§impl Send for Skeleton
§impl Sync for Skeleton
§impl Unpin for Skeleton
§impl UnwindSafe for Skeleton
Blanket Implementations§
source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
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§
Trait Implementations§
source§impl Add<Vector> for Coordinate
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 moresource§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§impl Sub<Vector> for Coordinate
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 Swhere
+Implementations§
Trait Implementations§
source§impl Add<Vector> for Coordinate
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 moresource§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§impl Sub<Vector> for Coordinate
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 Swhere
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 2π
.\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 Bone
s. connected by Joint
s.\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 2π
.\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 2π
.\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 Bone
s. connected by Joint
s.\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 2π
.\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