diff --git a/main/FunnyBones/all.html b/main/FunnyBones/all.html new file mode 100644 index 0000000..863cd56 --- /dev/null +++ b/main/FunnyBones/all.html @@ -0,0 +1 @@ +
pub(crate) enum Mode {
+ Bones,
+ Animation,
+}
parameters
when converting.self
into C
, using the provided parameters.clone_to_uninit
)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
.Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
+further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
+generate &Any
’s vtable from &Trait
’s.&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
+generate &mut Any
’s vtable from &mut Trait
’s.key
and return true
if they are equal.angle
.other
into Self
, while performing the appropriate scaling,
+rounding and clamping.T
.parameters
when converting.self
into C
, using the provided parameters.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 moreself
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 moreself
as a ReadOnly
.self
into T
, while performing the appropriate scaling,
+rounding and clamping.Value
].Value
].ReadEndian::read_from_little_endian()
.try_into_colors
fails to cast.OutOfBounds
error is returned which contains
+the unclamped color. Read moreSubscriber
to this type, returning a
+[WithDispatch
] wrapper. Read morepub(crate) fn add_bones_to_skeleton(
+ connected_to: BoneAxis,
+ bones: &Dynamic<Vec<SkeletalBone>>,
+ skeleton: &mut Skeleton,
+)
pub(crate) fn bone_editor(
+ bone: SkeletalBone,
+ watcher: &ChangeAggregator,
+) -> impl MakeWidget
pub(crate) fn bone_property_editor(
+ bone: SkeletalBone,
+ watcher: &ChangeAggregator,
+ is_root: bool,
+) -> impl MakeWidget
pub(crate) fn bones_editor(
+ label: &str,
+ bones: &Dynamic<Vec<SkeletalBone>>,
+ watcher: &ChangeAggregator,
+) -> impl MakeWidget
pub(crate) fn main() -> Result<()>
pub(crate) fn skeleton_editor(
+ skeleton: &EditingSkeleton,
+ watcher: &ChangeAggregator,
+) -> impl MakeWidget
pub(crate) struct ChangeAggregator(pub(crate) Dynamic<usize>);
0: Dynamic<usize>
source
. Read moreparameters
when converting.self
into C
, using the provided parameters.clone_to_uninit
)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
.Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
+further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
+generate &Any
’s vtable from &Trait
’s.&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
+generate &mut Any
’s vtable from &mut Trait
’s.angle
.other
into Self
, while performing the appropriate scaling,
+rounding and clamping.T
.parameters
when converting.self
into C
, using the provided parameters.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 moreself
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 moreself
as a ReadOnly
.self
into T
, while performing the appropriate scaling,
+rounding and clamping.Value
].Value
].try_into_colors
fails to cast.OutOfBounds
error is returned which contains
+the unclamped color. Read moreSubscriber
to this type, returning a
+[WithDispatch
] wrapper. Read morepub(crate) struct EditingSkeleton {
+ pub(crate) root: SkeletalBone,
+ pub(crate) a_bones: Dynamic<Vec<SkeletalBone>>,
+}
root: SkeletalBone
§a_bones: Dynamic<Vec<SkeletalBone>>
source
. Read moreparameters
when converting.self
into C
, using the provided parameters.clone_to_uninit
)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
.Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
+further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
+generate &Any
’s vtable from &Trait
’s.&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
+generate &mut Any
’s vtable from &mut Trait
’s.angle
.other
into Self
, while performing the appropriate scaling,
+rounding and clamping.T
.parameters
when converting.self
into C
, using the provided parameters.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 moreself
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 moreself
as a ReadOnly
.self
into T
, while performing the appropriate scaling,
+rounding and clamping.Value
].Value
].ReadEndian::read_from_little_endian()
.try_into_colors
fails to cast.OutOfBounds
error is returned which contains
+the unclamped color. Read moreSubscriber
to this type, returning a
+[WithDispatch
] wrapper. Read morepub(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<Option<f32>>,
+ pub(crate) inverse: Dynamic<bool>,
+ pub(crate) desired_end: Dynamic<Option<Vector>>,
+ pub(crate) connected_bones: Dynamic<Vec<SkeletalBone>>,
+}
label: Dynamic<String>
§joint_label: Dynamic<String>
§joint_angle: Dynamic<Angle>
§length: Dynamic<f32>
§jointed: Dynamic<Option<f32>>
§inverse: Dynamic<bool>
§desired_end: Dynamic<Option<Vector>>
§connected_bones: Dynamic<Vec<SkeletalBone>>
source
. Read moreparameters
when converting.self
into C
, using the provided parameters.clone_to_uninit
)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
.Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
+further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
+generate &Any
’s vtable from &Trait
’s.&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
+generate &mut Any
’s vtable from &mut Trait
’s.angle
.other
into Self
, while performing the appropriate scaling,
+rounding and clamping.T
.parameters
when converting.self
into C
, using the provided parameters.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 moreself
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 moreself
as a ReadOnly
.self
into T
, while performing the appropriate scaling,
+rounding and clamping.Value
].Value
].ReadEndian::read_from_little_endian()
.try_into_colors
fails to cast.OutOfBounds
error is returned which contains
+the unclamped color. Read moreSubscriber
to this type, returning a
+[WithDispatch
] wrapper. Read morepub enum ChangeKind {
+ChangeKind in funnybones::animation - Rust Enum funnybones::animation::ChangeKind
source · pub enum ChangeKind {
Bone {
bone: BoneId,
position: Vector,
},
Joint {
joint: JointId,
- rotation: Rotation,
+ rotation: Angle,
},
-}
Variants§
Implementations§
source§impl ChangeKind
sourcepub const fn with_easing(self, easing: StandardEasing) -> Change
Trait Implementations§
source§impl Clone for ChangeKind
source§fn clone(&self) -> ChangeKind
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 ChangeKind
source§impl<'de> Deserialize<'de> for ChangeKind
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<ChangeKind> for Change
source§fn from(kind: ChangeKind) -> Self
Converts to this type from the input type.source§impl PartialEq for ChangeKind
source§impl Serialize for ChangeKind
source§impl Copy for ChangeKind
source§impl StructuralPartialEq for ChangeKind
Auto Trait Implementations§
§impl Freeze for ChangeKind
§impl RefUnwindSafe for ChangeKind
§impl Send for ChangeKind
§impl Sync for ChangeKind
§impl Unpin for ChangeKind
§impl UnwindSafe for ChangeKind
Blanket Implementations§
source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
+}Variants§
Implementations§
source§impl ChangeKind
sourcepub const fn with_easing(self, easing: StandardEasing) -> Change
Trait Implementations§
source§impl Clone for ChangeKind
source§fn clone(&self) -> ChangeKind
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 ChangeKind
source§impl<'de> Deserialize<'de> for ChangeKind
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<ChangeKind> for Change
source§fn from(kind: ChangeKind) -> Self
Converts to this type from the input type.source§impl PartialEq for ChangeKind
source§impl Serialize for ChangeKind
source§impl Copy for ChangeKind
source§impl StructuralPartialEq for ChangeKind
Auto Trait Implementations§
§impl Freeze for ChangeKind
§impl RefUnwindSafe for ChangeKind
§impl Send for ChangeKind
§impl Sync for ChangeKind
§impl Unpin for ChangeKind
§impl UnwindSafe for ChangeKind
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>,
@@ -23,7 +23,7 @@
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>,
§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn cam16_into_unclamped(
+ T: FromCam16Unclamped<WpParam, U>,
source§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn cam16_into_unclamped(
self,
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
Converts self
into C
, using the provided parameters.§impl<A> Cast for A
§fn cast<To>(self) -> Towhere
@@ -36,7 +36,7 @@
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
§fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>
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,
@@ -48,7 +48,7 @@
From<T> for U
chooses to do.
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>,
§type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn into_cam16_unclamped(
+ 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.§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
- C: TryFromComponents<T>,
§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
+ T: Clone,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: Into<T>,
source§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
@@ -77,8 +77,8 @@
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
source§impl<T> DeserializeOwned for Twhere
+ T: for<'de> Deserialize<'de>,
§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/animation/index.html b/main/funnybones/animation/index.html
index 5439402..8f09d0a 100644
--- a/main/funnybones/animation/index.html
+++ b/main/funnybones/animation/index.html
@@ -1 +1 @@
-funnybones::animation - Rust Module funnybones::animation
source · Structs§
Enums§
\ No newline at end of file
+funnybones::animation - Rust Module funnybones::animation
source · Structs§
Enums§
\ No newline at end of file
diff --git a/main/funnybones/animation/struct.Animation.html b/main/funnybones/animation/struct.Animation.html
index c487d30..91ed3e7 100644
--- a/main/funnybones/animation/struct.Animation.html
+++ b/main/funnybones/animation/struct.Animation.html
@@ -1,5 +1,5 @@
-Animation in funnybones::animation - Rust Struct funnybones::animation::Animation
source · pub struct Animation(/* private fields */);
Implementations§
source§impl Animation
sourcepub fn push(&mut self, frame: Frame)
sourcepub fn with(self, frame: Frame) -> Self
sourcepub fn remove(&mut self, frame_index: usize) -> Frame
sourcepub fn insert(&mut self, index: usize, frame: Frame)
sourcepub fn with_variable(self, name: impl Into<String>, value: f32) -> Self
sourcepub fn set_variable<'a>(&mut self, name: impl Into<Cow<'a, str>>, value: f32)
sourcepub fn variable(&self, name: &str) -> Option<f32>
sourcepub fn start(&self) -> RunningAnimation
Methods from Deref<Target = [Frame]>§
sourcepub fn as_str(&self) -> &str
🔬This is a nightly-only experimental API. (ascii_char
)
Views this slice of ASCII characters as a UTF-8 str
.
-sourcepub fn as_bytes(&self) -> &[u8] ⓘ
🔬This is a nightly-only experimental API. (ascii_char
)
Views this slice of ASCII characters as a slice of u8
bytes.
+Animation in funnybones::animation - Rust Struct funnybones::animation::Animation
source · pub struct Animation(/* private fields */);
Implementations§
source§impl Animation
sourcepub fn push(&mut self, frame: Frame)
sourcepub fn with(self, frame: Frame) -> Self
sourcepub fn remove(&mut self, frame_index: usize) -> Frame
sourcepub fn insert(&mut self, index: usize, frame: Frame)
sourcepub fn with_variable(self, name: impl Into<String>, value: f32) -> Self
sourcepub fn set_variable<'a>(&mut self, name: impl Into<Cow<'a, str>>, value: f32)
sourcepub fn variable(&self, name: &str) -> Option<f32>
sourcepub fn start(&self) -> RunningAnimation
Methods from Deref<Target = [Frame]>§
sourcepub fn as_str(&self) -> &str
🔬This is a nightly-only experimental API. (ascii_char
)
Views this slice of ASCII characters as a UTF-8 str
.
+sourcepub fn as_bytes(&self) -> &[u8] ⓘ
🔬This is a nightly-only experimental API. (ascii_char
)
Views this slice of ASCII characters as a slice of u8
bytes.
1.23.0 · sourcepub fn is_ascii(&self) -> bool
Checks if all bytes in this slice are within the ASCII range.
sourcepub fn as_ascii(&self) -> Option<&[AsciiChar]>
🔬This is a nightly-only experimental API. (ascii_char
)
If this slice is_ascii
, returns it as a slice of
ASCII characters, otherwise returns None
.
@@ -2452,8 +2452,8 @@ §Examples<
ASCII letters ‘A’ to ‘Z’ are mapped to ‘a’ to ‘z’,
but non-ASCII letters are unchanged.
To lowercase the value in-place, use make_ascii_lowercase
.
-Trait Implementations§
source§impl StructuralPartialEq for Animation
Auto Trait Implementations§
§impl Freeze for Animation
§impl RefUnwindSafe for Animation
§impl Send for Animation
§impl Sync for Animation
§impl Unpin for Animation
§impl UnwindSafe for Animation
Blanket Implementations§
Trait Implementations§
source§impl StructuralPartialEq for Animation
Auto Trait Implementations§
§impl Freeze for Animation
§impl RefUnwindSafe for Animation
§impl Send for Animation
§impl Sync for Animation
§impl Unpin for Animation
§impl UnwindSafe for Animation
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>,
@@ -2466,7 +2466,7 @@ §Examples<
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>,
§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn cam16_into_unclamped(
+ T: FromCam16Unclamped<WpParam, U>,
source§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn cam16_into_unclamped(
self,
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
Converts self
into C
, using the provided parameters.§impl<A> Cast for A
§fn cast<To>(self) -> Towhere
@@ -2479,7 +2479,7 @@ §Examples<
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
§fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>
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
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>,
§type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn into_cam16_unclamped(
+ 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.§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>,
§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
+ T: Clone,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: Into<T>,
source§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
diff --git a/main/funnybones/animation/struct.Change.html b/main/funnybones/animation/struct.Change.html
index d724c06..ae8fb9c 100644
--- a/main/funnybones/animation/struct.Change.html
+++ b/main/funnybones/animation/struct.Change.html
@@ -1,7 +1,7 @@
-Change in funnybones::animation - Rust Struct funnybones::animation::Change
source · pub struct Change { /* private fields */ }
Trait Implementations§
source§impl<'de> Deserialize<'de> for Change
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<ChangeKind> for Change
source§fn from(kind: ChangeKind) -> Self
Converts to this type from the input type.source§impl Copy for Change
source§impl StructuralPartialEq for Change
Auto Trait Implementations§
§impl Freeze for Change
§impl RefUnwindSafe for Change
§impl Send for Change
§impl Sync for Change
§impl Unpin for Change
§impl UnwindSafe for Change
Blanket Implementations§
source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
+Change in funnybones::animation - Rust Struct funnybones::animation::Change
source · pub struct Change { /* private fields */ }
Trait Implementations§
source§impl<'de> Deserialize<'de> for Change
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<ChangeKind> for Change
source§fn from(kind: ChangeKind) -> Self
Converts to this type from the input type.source§impl Copy for Change
source§impl StructuralPartialEq for Change
Auto Trait Implementations§
§impl Freeze for Change
§impl RefUnwindSafe for Change
§impl Send for Change
§impl Sync for Change
§impl Unpin for Change
§impl UnwindSafe for Change
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>,
@@ -14,7 +14,7 @@
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>,
§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn cam16_into_unclamped(
+ T: FromCam16Unclamped<WpParam, U>,
source§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn cam16_into_unclamped(
self,
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
Converts self
into C
, using the provided parameters.§impl<A> Cast for A
§fn cast<To>(self) -> Towhere
@@ -27,7 +27,7 @@
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
§fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>
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,
@@ -39,7 +39,7 @@
From<T> for U
chooses to do.
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>,
§type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn into_cam16_unclamped(
+ 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.§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
- C: TryFromComponents<T>,
§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
+ T: Clone,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: Into<T>,
source§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
@@ -68,8 +68,8 @@
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
source§impl<T> DeserializeOwned for Twhere
+ T: for<'de> Deserialize<'de>,
§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/animation/struct.Frame.html b/main/funnybones/animation/struct.Frame.html
index 318fb21..c551305 100644
--- a/main/funnybones/animation/struct.Frame.html
+++ b/main/funnybones/animation/struct.Frame.html
@@ -1,5 +1,5 @@
-Frame in funnybones::animation - Rust Struct funnybones::animation::Frame
source · pub struct Frame { /* private fields */ }
Implementations§
Methods from Deref<Target = [Change]>§
sourcepub fn as_str(&self) -> &str
🔬This is a nightly-only experimental API. (ascii_char
)
Views this slice of ASCII characters as a UTF-8 str
.
-sourcepub fn as_bytes(&self) -> &[u8] ⓘ
🔬This is a nightly-only experimental API. (ascii_char
)
Views this slice of ASCII characters as a slice of u8
bytes.
+Frame in funnybones::animation - Rust Struct funnybones::animation::Frame
source · pub struct Frame { /* private fields */ }
Implementations§
Methods from Deref<Target = [Change]>§
sourcepub fn as_str(&self) -> &str
🔬This is a nightly-only experimental API. (ascii_char
)
Views this slice of ASCII characters as a UTF-8 str
.
+sourcepub fn as_bytes(&self) -> &[u8] ⓘ
🔬This is a nightly-only experimental API. (ascii_char
)
Views this slice of ASCII characters as a slice of u8
bytes.
1.23.0 · sourcepub fn is_ascii(&self) -> bool
Checks if all bytes in this slice are within the ASCII range.
sourcepub fn as_ascii(&self) -> Option<&[AsciiChar]>
🔬This is a nightly-only experimental API. (ascii_char
)
If this slice is_ascii
, returns it as a slice of
ASCII characters, otherwise returns None
.
@@ -2452,10 +2452,10 @@ §Examples<
ASCII letters ‘A’ to ‘Z’ are mapped to ‘a’ to ‘z’,
but non-ASCII letters are unchanged.
To lowercase the value in-place, use make_ascii_lowercase
.
-Trait Implementations§
source§impl<'de> Deserialize<'de> for Frame
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 Frame
Auto Trait Implementations§
§impl Freeze for Frame
§impl RefUnwindSafe for Frame
§impl Send for Frame
§impl Sync for Frame
§impl Unpin for Frame
§impl UnwindSafe for Frame
Blanket Implementations§
Trait Implementations§
source§impl<'de> Deserialize<'de> for Frame
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 Frame
Auto Trait Implementations§
§impl Freeze for Frame
§impl RefUnwindSafe for Frame
§impl Send for Frame
§impl Sync for Frame
§impl Unpin for Frame
§impl UnwindSafe for Frame
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>,
@@ -2468,7 +2468,7 @@ §Examples<
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>,
§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn cam16_into_unclamped(
+ T: FromCam16Unclamped<WpParam, U>,
source§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn cam16_into_unclamped(
self,
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
Converts self
into C
, using the provided parameters.§impl<A> Cast for A
§fn cast<To>(self) -> Towhere
@@ -2481,7 +2481,7 @@ §Examples<
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
§fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>
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
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>,
§type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn into_cam16_unclamped(
+ 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.§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
- C: TryFromComponents<T>,
§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
+ T: Clone,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: Into<T>,
source§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 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
source§impl<T> DeserializeOwned for Twhere
+ T: for<'de> Deserialize<'de>,
§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/animation/struct.RunningAnimation.html b/main/funnybones/animation/struct.RunningAnimation.html
index 92e33f7..4095959 100644
--- a/main/funnybones/animation/struct.RunningAnimation.html
+++ b/main/funnybones/animation/struct.RunningAnimation.html
@@ -1,4 +1,4 @@
-RunningAnimation in funnybones::animation - Rust Struct funnybones::animation::RunningAnimation
source · pub struct RunningAnimation { /* private fields */ }
Implementations§
Auto Trait Implementations§
§impl Freeze for RunningAnimation
§impl RefUnwindSafe for RunningAnimation
§impl Send for RunningAnimation
§impl Sync for RunningAnimation
§impl Unpin for RunningAnimation
§impl UnwindSafe for RunningAnimation
Blanket Implementations§
source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
+RunningAnimation in funnybones::animation - Rust Struct funnybones::animation::RunningAnimation
source · pub struct RunningAnimation { /* private fields */ }
Implementations§
Auto Trait Implementations§
§impl Freeze for RunningAnimation
§impl RefUnwindSafe for RunningAnimation
§impl Send for RunningAnimation
§impl Sync for RunningAnimation
§impl Unpin for RunningAnimation
§impl UnwindSafe for RunningAnimation
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>,
@@ -11,7 +11,7 @@
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>,
§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn cam16_into_unclamped(
+ T: FromCam16Unclamped<WpParam, U>,
source§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn cam16_into_unclamped(
self,
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
Converts self
into C
, using the provided parameters.§impl<A> Cast for A
§fn cast<To>(self) -> Towhere
@@ -23,7 +23,7 @@
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
§fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>
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,
@@ -35,7 +35,7 @@
From<T> for U
chooses to do.
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>,
§type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn into_cam16_unclamped(
+ 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.§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
- C: TryFromComponents<T>,
§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
+ 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: Into<T>,
source§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
diff --git a/main/funnybones/cushy/index.html b/main/funnybones/cushy/index.html
new file mode 100644
index 0000000..ee6337d
--- /dev/null
+++ b/main/funnybones/cushy/index.html
@@ -0,0 +1,2 @@
+funnybones::cushy - Rust Module funnybones::cushy
source · Expand description
Widgets for editing and rendering skeletons.
+Modules§
\ No newline at end of file
diff --git a/main/funnybones/cushy/sidebar-items.js b/main/funnybones/cushy/sidebar-items.js
new file mode 100644
index 0000000..5d9f7df
--- /dev/null
+++ b/main/funnybones/cushy/sidebar-items.js
@@ -0,0 +1 @@
+window.SIDEBAR_ITEMS = {"mod":["skeleton_canvas"]};
\ No newline at end of file
diff --git a/main/funnybones/cushy/skeleton_canvas/enum.SkeletonMutation.html b/main/funnybones/cushy/skeleton_canvas/enum.SkeletonMutation.html
new file mode 100644
index 0000000..19324b5
--- /dev/null
+++ b/main/funnybones/cushy/skeleton_canvas/enum.SkeletonMutation.html
@@ -0,0 +1,81 @@
+SkeletonMutation in funnybones::cushy::skeleton_canvas - Rust Enum funnybones::cushy::skeleton_canvas::SkeletonMutation
source · pub enum SkeletonMutation {
+ SetDesiredEnd {
+ bone: BoneId,
+ end: Vector,
+ },
+ SetJointRotation {
+ joint: JointId,
+ rotation: Angle,
+ },
+}
Variants§
Trait Implementations§
source§impl Clone for SkeletonMutation
source§fn clone(&self) -> SkeletonMutation
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 SkeletonMutation
source§impl PartialEq for SkeletonMutation
source§impl Copy for SkeletonMutation
source§impl StructuralPartialEq for SkeletonMutation
Auto Trait Implementations§
§impl Freeze for SkeletonMutation
§impl RefUnwindSafe for SkeletonMutation
§impl Send for SkeletonMutation
§impl Sync for SkeletonMutation
§impl Unpin for SkeletonMutation
§impl UnwindSafe for SkeletonMutation
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 more§impl<Unit> IntoComponents<Unit> for Unitwhere
+ Unit: Copy,
§fn into_components(self) -> (Unit, Unit)
Extracts this type’s 2d vector components.source§impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts self
into a Left
variant of Either<Self, Self>
+if into_left
is true
.
+Converts self
into a Right
variant of Either<Self, Self>
+otherwise. Read 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> Pointable for T
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/cushy/skeleton_canvas/enum.Target.html b/main/funnybones/cushy/skeleton_canvas/enum.Target.html
new file mode 100644
index 0000000..1d1a3dc
--- /dev/null
+++ b/main/funnybones/cushy/skeleton_canvas/enum.Target.html
@@ -0,0 +1,79 @@
+Target in funnybones::cushy::skeleton_canvas - Rust Enum funnybones::cushy::skeleton_canvas::Target
source · pub enum Target {
+ Joint(JointId),
+ DesiredEnd(BoneId),
+}
Variants§
Trait Implementations§
source§impl Copy for Target
source§impl Eq for Target
source§impl StructuralPartialEq for Target
Auto Trait Implementations§
§impl Freeze for Target
§impl RefUnwindSafe for Target
§impl Send for Target
§impl Sync for Target
§impl Unpin for Target
§impl UnwindSafe for Target
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
§impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
Checks if this value is equivalent to the given key. Read more§impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
Compare self to key
and return true
if they are equal.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 more§impl<Unit> IntoComponents<Unit> for Unitwhere
+ Unit: Copy,
§fn into_components(self) -> (Unit, Unit)
Extracts this type’s 2d vector components.source§impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts self
into a Left
variant of Either<Self, Self>
+if into_left
is true
.
+Converts self
into a Right
variant of Either<Self, Self>
+otherwise. Read 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> Pointable for T
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/cushy/skeleton_canvas/index.html b/main/funnybones/cushy/skeleton_canvas/index.html
new file mode 100644
index 0000000..b900700
--- /dev/null
+++ b/main/funnybones/cushy/skeleton_canvas/index.html
@@ -0,0 +1 @@
+funnybones::cushy::skeleton_canvas - Rust Module funnybones::cushy::skeleton_canvas
source · Structs§
Enums§
\ No newline at end of file
diff --git a/main/funnybones/cushy/skeleton_canvas/sidebar-items.js b/main/funnybones/cushy/skeleton_canvas/sidebar-items.js
new file mode 100644
index 0000000..f070b11
--- /dev/null
+++ b/main/funnybones/cushy/skeleton_canvas/sidebar-items.js
@@ -0,0 +1 @@
+window.SIDEBAR_ITEMS = {"enum":["SkeletonMutation","Target"],"struct":["SkeletonCanvas"]};
\ No newline at end of file
diff --git a/main/funnybones/cushy/skeleton_canvas/struct.SkeletonCanvas.html b/main/funnybones/cushy/skeleton_canvas/struct.SkeletonCanvas.html
new file mode 100644
index 0000000..a06272d
--- /dev/null
+++ b/main/funnybones/cushy/skeleton_canvas/struct.SkeletonCanvas.html
@@ -0,0 +1,168 @@
+SkeletonCanvas in funnybones::cushy::skeleton_canvas - Rust Struct funnybones::cushy::skeleton_canvas::SkeletonCanvas
source · pub struct SkeletonCanvas { /* private fields */ }
Implementations§
Trait Implementations§
source§impl Debug for SkeletonCanvas
source§impl Widget for SkeletonCanvas
source§fn redraw(&mut self, context: &mut GraphicsContext<'_, '_, '_, '_>)
Redraw the contents of this widget.source§fn layout(
+ &mut self,
+ available_space: Size<ConstraintLimit>,
+ _context: &mut LayoutContext<'_, '_, '_, '_>,
+) -> Size<UPx>
Layout this widget and returns the ideal size based on its contents and
+the available_space
.source§fn hover(
+ &mut self,
+ location: Point<Px>,
+ context: &mut EventContext<'_>,
+) -> Option<CursorIcon>
The widget is currently has a cursor hovering it at location
.source§fn mouse_down(
+ &mut self,
+ location: Point<Px>,
+ _device_id: DeviceId,
+ _button: MouseButton,
+ _context: &mut EventContext<'_>,
+) -> EventHandling
A mouse button event has occurred at location
. Returns whether the
+event has been handled or not. Read moresource§fn mouse_drag(
+ &mut self,
+ location: Point<Px>,
+ _device_id: DeviceId,
+ _button: MouseButton,
+ _context: &mut EventContext<'_>,
+)
A mouse button is being held down as the cursor is moved across the
+widget.source§fn mouse_up(
+ &mut self,
+ _location: Option<Point<Px>>,
+ _device_id: DeviceId,
+ _button: MouseButton,
+ _context: &mut EventContext<'_>,
+)
A mouse button is no longer being pressed.source§fn hit_test(
+ &mut self,
+ _location: Point<Px>,
+ _context: &mut EventContext<'_>,
+) -> bool
Returns true if this widget should respond to mouse input at location
.§fn summarize(&self, f: &mut Formatter<'_>) -> Result<(), Error>
Writes a summary of this widget into fmt
. Read more§fn full_control_redraw(&self) -> bool
Returns true if this widget handles all built-in style components that
+apply. Read more§fn mounted(&mut self, context: &mut EventContext<'_>)
The widget has been mounted into a parent widget. Read more§fn unmounted(&mut self, context: &mut EventContext<'_>)
The widget has been removed from its parent widget.§fn accept_focus(&mut self, context: &mut EventContext<'_>) -> bool
This widget has been targeted to be focused. If this function returns
+true, the widget will be focused. If false, Cushy will continue
+searching for another focus target.§fn advance_focus(
+ &mut self,
+ direction: VisualOrder,
+ context: &mut EventContext<'_>,
+) -> ControlFlow<EventHandled, EventIgnored>
The widget should switch to the next focusable area within this widget,
+honoring direction
in a consistent manner. Returning HANDLED
will
+cause the search for the next focus widget stop.§fn allow_blur(&mut self, context: &mut EventContext<'_>) -> bool
The widget is about to lose focus. Returning true allows the focus to
+switch away from this widget.§fn deactivate(&mut self, context: &mut EventContext<'_>)
The widget is no longer active.§fn keyboard_input(
+ &mut self,
+ device_id: DeviceId,
+ input: KeyEvent,
+ is_synthetic: bool,
+ context: &mut EventContext<'_>,
+) -> ControlFlow<EventHandled, EventIgnored>
A keyboard event has been sent to this widget. Returns whether the event
+has been handled or not.§fn ime(
+ &mut self,
+ ime: Ime,
+ context: &mut EventContext<'_>,
+) -> ControlFlow<EventHandled, EventIgnored>
An input manager event has been sent to this widget. Returns whether the
+event has been handled or not.§fn mouse_wheel(
+ &mut self,
+ device_id: DeviceId,
+ delta: MouseScrollDelta,
+ phase: TouchPhase,
+ context: &mut EventContext<'_>,
+) -> ControlFlow<EventHandled, EventIgnored>
A mouse wheel event has been sent to this widget. Returns whether the
+event has been handled or not.§fn root_behavior(
+ &mut self,
+ context: &mut EventContext<'_>,
+) -> Option<(RootBehavior, WidgetInstance)>
Returns a reference to a single child widget if this widget is a widget
+that primarily wraps a single other widget to customize its behavior.Auto Trait Implementations§
§impl Freeze for SkeletonCanvas
§impl !RefUnwindSafe for SkeletonCanvas
§impl Send for SkeletonCanvas
§impl !Sync for SkeletonCanvas
§impl Unpin for SkeletonCanvas
§impl !UnwindSafe for SkeletonCanvas
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, 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.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> MakeWidget for Twhere
+ T: MakeWidgetWithTag,
§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 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.
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 to_checkbox(&self, value: impl IntoDynamic<CheckboxState>) -> Checkboxwhere
+ Self: Clone,
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.§impl<T> MakeWidgetWithTag for Twhere
+ T: Widget,
§fn make_with_tag(self, id: WidgetTag) -> WidgetInstance
Returns a new [WidgetInstance
] whose [WidgetId
] comes from tag
.§impl<T> Open for Twhere
+ T: MakeWidget,
§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 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,
\ No newline at end of file
diff --git a/main/funnybones/enum.BoneEnd.html b/main/funnybones/enum.BoneEnd.html
index 39d5861..82cccff 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>,
@@ -23,7 +23,7 @@
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>,
§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn cam16_into_unclamped(
+ T: FromCam16Unclamped<WpParam, U>,
source§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn cam16_into_unclamped(
self,
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
Converts self
into C
, using the provided parameters.§impl<A> Cast for A
§fn cast<To>(self) -> Towhere
@@ -36,7 +36,7 @@
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, 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>,
§type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn into_cam16_unclamped(
+ 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.§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
- C: TryFromComponents<T>,
§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
+ T: Clone,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: Into<T>,
source§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
@@ -81,8 +81,8 @@
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
source§impl<T> DeserializeOwned for Twhere
+ T: for<'de> Deserialize<'de>,
§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.BoneKind.html b/main/funnybones/enum.BoneKind.html
index 6181280..cdd520f 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,11 +18,12 @@
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.
-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§
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.
+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>,
@@ -35,7 +36,7 @@
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>,
§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn cam16_into_unclamped(
+ T: FromCam16Unclamped<WpParam, U>,
source§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn cam16_into_unclamped(
self,
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
Converts self
into C
, using the provided parameters.§impl<A> Cast for A
§fn cast<To>(self) -> Towhere
@@ -48,7 +49,7 @@
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
§fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>
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,
@@ -60,7 +61,7 @@
From<T> for U
chooses to do.
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>,
§type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn into_cam16_unclamped(
+ 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.§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
- C: TryFromComponents<T>,
§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
+ T: Clone,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: Into<T>,
source§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
@@ -89,8 +90,8 @@
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
source§impl<T> DeserializeOwned for Twhere
+ T: for<'de> Deserialize<'de>,
§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/index.html b/main/funnybones/index.html
index 70d0273..501e49a 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§
Structs§
- A bone in a
Skeleton
. - A specific end of a specific bone.
- A connection between two bones.
- A
BoneKind
with an associated label. - A value representing a rotation between no rotation and a full rotation.
- A two dimensionsional offset/measurement.
Enums§
\ No newline at end of file
+Modules§
- Widgets for editing and rendering skeletons.
Structs§
- A value representing a direction.
- 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 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 a7c7cf6..cc49ffd 100644
--- a/main/funnybones/sidebar-items.js
+++ b/main/funnybones/sidebar-items.js
@@ -1 +1 @@
-window.SIDEBAR_ITEMS = {"enum":["BoneEnd","BoneKind"],"mod":["animation"],"struct":["Bone","BoneAxis","BoneId","Joint","JointId","LabeledBoneKind","Rotation","Skeleton","Vector"]};
\ No newline at end of file
+window.SIDEBAR_ITEMS = {"enum":["BoneEnd","BoneKind"],"mod":["animation","cushy"],"struct":["Angle","Bone","BoneAxis","BoneId","Coordinate","Joint","JointId","LabeledBoneKind","Skeleton","Vector"]};
\ No newline at end of file
diff --git a/main/funnybones/struct.Rotation.html b/main/funnybones/struct.Angle.html
similarity index 56%
rename from main/funnybones/struct.Rotation.html
rename to main/funnybones/struct.Angle.html
index 639f15c..a20c29e 100644
--- a/main/funnybones/struct.Rotation.html
+++ b/main/funnybones/struct.Angle.html
@@ -1,19 +1,23 @@
-Rotation in funnybones - Rust Struct funnybones::Rotation
source · pub struct Rotation { /* private fields */ }
Expand description
A value representing a rotation between no rotation and a full rotation.
-Implementations§
source§impl Rotation
sourcepub fn to_degrees(self) -> f32
Returns this rotation represented in degrees.
+Angle in funnybones - Rust Struct funnybones::Angle
source · pub struct Angle { /* private fields */ }
Expand description
A value representing a direction.
+Implementations§
source§impl Angle
sourcepub fn to_degrees(self) -> f32
Returns this rotation represented in degrees.
This value will always be greater than or equal to 0 and will always be
less than 360.0.
-sourcepub const fn to_radians(self) -> f32
Returns this rotation represented in radians.
+sourcepub const fn to_radians(self) -> f32
Returns this rotation represented in radians.
This value will always be greater than or equal to 0 and will always be
less than 2π
.
-Trait Implementations§
source§impl<'de> Deserialize<'de> for Rotation
source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
- __D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read moreTrait Implementations§
source§impl AddAssign for Angle
source§fn add_assign(&mut self, rhs: Self)
Performs the +=
operation. Read moresource§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 Rotation
source§fn percent_between(&self, min: &Self, max: &Self) -> ZeroToOne
Return the percentage that self
is between min
and max
.source§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 Angle
source§fn percent_between(&self, min: &Self, max: &Self) -> ZeroToOne
Return the percentage that self
is between min
and max
.source§impl SubAssign for Angle
source§fn sub_assign(&mut self, rhs: Self)
Performs the -=
operation. Read moresource§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>,
@@ -26,7 +30,7 @@
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>,
§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn cam16_into_unclamped(
+ T: FromCam16Unclamped<WpParam, U>,
source§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn cam16_into_unclamped(
self,
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
Converts self
into C
, using the provided parameters.§impl<A> Cast for A
§fn cast<To>(self) -> Towhere
@@ -39,7 +43,7 @@
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, 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>,
§type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn into_cam16_unclamped(
+ 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.§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<R, P> ReadPrimitive<R> for Pwhere
+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> ProgressValue for Twhere
+ T: Ranged + PercentBetween + 'static,
§fn to_progress(
+ &self,
+ range: Option<RangeInclusive<&<T as ProgressValue>::Value>>,
+) -> Progress
Converts this value to a progress using the range given, if provided. If
+no range is provided, the full range of the type should be considered.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()
.§impl<T> SliderValue for T
§const RANGED: bool = false
When true, this type is expected to represent two values: start and an
+ T: Clone + Debug + PartialOrd + LinearInterpolate + PercentBetween + Send + 'static,§const RANGED: bool = false
When true, this type is expected to represent two values: start and an
end.§fn into_parts(
self,
) -> (<T as SliderValue>::Value, Option<<T as SliderValue>::Value>)
Returns this value split into its start and end components.§fn from_parts(
min_or_value: <T as SliderValue>::Value,
_max: Option<<T as SliderValue>::Value>,
) -> T
Constructs a value from its start and end components.§impl<T> ToSmolStr for T
§fn to_smolstr(&self) -> SmolStr
source§impl<T, C> TryComponentsInto<C> for Twhere
- C: TryFromComponents<T>,
§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
+ 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: Into<T>,
source§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
@@ -100,8 +109,8 @@
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
source§impl<T> DeserializeOwned for Twhere
+ T: for<'de> Deserialize<'de>,
§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.Bone.html b/main/funnybones/struct.Bone.html
index a9809a1..8012eda 100644
--- a/main/funnybones/struct.Bone.html
+++ b/main/funnybones/struct.Bone.html
@@ -1,16 +1,22 @@
-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 set_desired_end(&mut self, end: Option<Vector>)
Sets the location 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 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 solved_joint(&self) -> Option<Vector>
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) -> Angle
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§
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§
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
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
@@ -23,7 +29,7 @@
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>,
§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn cam16_into_unclamped(
+ T: FromCam16Unclamped<WpParam, U>,
source§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn cam16_into_unclamped(
self,
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
Converts self
into C
, using the provided parameters.§impl<A> Cast for A
§fn cast<To>(self) -> Towhere
@@ -35,7 +41,7 @@
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
§fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>
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,
@@ -47,7 +53,7 @@
From<T> for U
chooses to do.
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>,
§type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn into_cam16_unclamped(
+ 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.§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
- C: TryFromComponents<T>,
§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
+ 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: Into<T>,
source§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
diff --git a/main/funnybones/struct.BoneAxis.html b/main/funnybones/struct.BoneAxis.html
index a8bb537..2d20672 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>,
@@ -23,7 +23,7 @@
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>,
§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn cam16_into_unclamped(
+ T: FromCam16Unclamped<WpParam, U>,
source§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn cam16_into_unclamped(
self,
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
Converts self
into C
, using the provided parameters.§impl<A> Cast for A
§fn cast<To>(self) -> Towhere
@@ -36,7 +36,7 @@
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, 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>,
§type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn into_cam16_unclamped(
+ 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.§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
- C: TryFromComponents<T>,
§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
+ T: Clone,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: Into<T>,
source§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
@@ -81,8 +81,8 @@
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
source§impl<T> DeserializeOwned for Twhere
+ T: for<'de> Deserialize<'de>,
§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.BoneId.html b/main/funnybones/struct.BoneId.html
index b3455f6..33536a7 100644
--- a/main/funnybones/struct.BoneId.html
+++ b/main/funnybones/struct.BoneId.html
@@ -1,18 +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>,
@@ -25,7 +26,7 @@
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>,
§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn cam16_into_unclamped(
+ T: FromCam16Unclamped<WpParam, U>,
source§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn cam16_into_unclamped(
self,
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
Converts self
into C
, using the provided parameters.§impl<A> Cast for A
§fn cast<To>(self) -> Towhere
@@ -40,7 +41,7 @@
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, 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>,
§type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn into_cam16_unclamped(
+ 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.§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<Key, SearchFor> Sort<SearchFor> for Keywhere
Key: Ord + PartialOrd<SearchFor>,
§fn compare(&self, b: &SearchFor) -> Ordering
source§impl<T, C> TryComponentsInto<C> for Twhere
- C: TryFromComponents<T>,
§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
+ T: Clone,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: Into<T>,
source§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
@@ -86,8 +87,8 @@
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
source§impl<T> DeserializeOwned for Twhere
+ T: for<'de> Deserialize<'de>,
§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.Coordinate.html b/main/funnybones/struct.Coordinate.html
new file mode 100644
index 0000000..d5c8d50
--- /dev/null
+++ b/main/funnybones/struct.Coordinate.html
@@ -0,0 +1,92 @@
+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) -> Angle
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<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 more§impl<Unit> IntoComponents<Unit> for Unitwhere
+ Unit: Copy,
§fn into_components(self) -> (Unit, Unit)
Extracts this type’s 2d vector components.source§impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts self
into a Left
variant of Either<Self, Self>
+if into_left
is true
.
+Converts self
into a Right
variant of Either<Self, Self>
+otherwise. Read 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> 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 moresource§impl<T> DeserializeOwned for Twhere
+ T: for<'de> Deserialize<'de>,
§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.Joint.html b/main/funnybones/struct.Joint.html
index 5be4771..974da0b 100644
--- a/main/funnybones/struct.Joint.html
+++ b/main/funnybones/struct.Joint.html
@@ -1,18 +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: Angle, 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: Angle)
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§
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§
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
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
@@ -25,7 +27,7 @@ §Panics
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>,
§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn cam16_into_unclamped(
+ T: FromCam16Unclamped<WpParam, U>,
source§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn cam16_into_unclamped(
self,
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
Converts self
into C
, using the provided parameters.§impl<A> Cast for A
§fn cast<To>(self) -> Towhere
@@ -37,7 +39,7 @@ §Panics
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
§fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>
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
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>,
§type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn into_cam16_unclamped(
+ 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.§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
- C: TryFromComponents<T>,
§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
+ 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: Into<T>,
source§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
diff --git a/main/funnybones/struct.JointId.html b/main/funnybones/struct.JointId.html
index cdc2502..be0408f 100644
--- a/main/funnybones/struct.JointId.html
+++ b/main/funnybones/struct.JointId.html
@@ -1,16 +1,17 @@
-JointId in funnybones - Rust Struct funnybones::JointId
source · pub struct JointId(/* private fields */);
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>,
@@ -23,7 +24,7 @@
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>,
§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn cam16_into_unclamped(
+ T: FromCam16Unclamped<WpParam, U>,
source§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn cam16_into_unclamped(
self,
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
Converts self
into C
, using the provided parameters.§impl<A> Cast for A
§fn cast<To>(self) -> Towhere
@@ -38,7 +39,7 @@
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, 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>,
§type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn into_cam16_unclamped(
+ 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.§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<Key, SearchFor> Sort<SearchFor> for Keywhere
Key: Ord + PartialOrd<SearchFor>,
§fn compare(&self, b: &SearchFor) -> Ordering
source§impl<T, C> TryComponentsInto<C> for Twhere
- C: TryFromComponents<T>,
§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
+ T: Clone,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: Into<T>,
source§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
@@ -84,8 +85,8 @@
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
source§impl<T> DeserializeOwned for Twhere
+ T: for<'de> Deserialize<'de>,
§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.LabeledBoneKind.html b/main/funnybones/struct.LabeledBoneKind.html
index d33b33e..31d59c4 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>,
@@ -17,7 +17,7 @@
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>,
§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn cam16_into_unclamped(
+ T: FromCam16Unclamped<WpParam, U>,
source§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn cam16_into_unclamped(
self,
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
Converts self
into C
, using the provided parameters.§impl<A> Cast for A
§fn cast<To>(self) -> Towhere
@@ -29,7 +29,7 @@
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
§fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>
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,
@@ -41,7 +41,7 @@
From<T> for U
chooses to do.
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>,
§type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn into_cam16_unclamped(
+ 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.§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
- C: TryFromComponents<T>,
§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
+ 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: Into<T>,
source§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
diff --git a/main/funnybones/struct.Skeleton.html b/main/funnybones/struct.Skeleton.html
index c6326ca..66b9e75 100644
--- a/main/funnybones/struct.Skeleton.html
+++ b/main/funnybones/struct.Skeleton.html
@@ -1,22 +1,26 @@
-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 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: Vector)
Sets a translation to be applied to the entire skeleton.
-sourcepub fn translation(&self) -> Vector
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 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: Angle)
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 moreAuto 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§
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 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>,
@@ -29,7 +33,7 @@
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>,
§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn cam16_into_unclamped(
+ T: FromCam16Unclamped<WpParam, U>,
source§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn cam16_into_unclamped(
self,
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
Converts self
into C
, using the provided parameters.§impl<A> Cast for A
§fn cast<To>(self) -> Towhere
@@ -41,7 +45,7 @@
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
§fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>
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,
@@ -53,7 +57,7 @@
From<T> for U
chooses to do.
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>,
§type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn into_cam16_unclamped(
+ 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.§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>,
§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
+ 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: Into<T>,
source§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
@@ -80,8 +84,8 @@
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
source§impl<T> DeserializeOwned for Twhere
+ T: for<'de> Deserialize<'de>,
§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.Vector.html b/main/funnybones/struct.Vector.html
index 6eaf676..7b93ec8 100644
--- a/main/funnybones/struct.Vector.html
+++ b/main/funnybones/struct.Vector.html
@@ -1,20 +1,14 @@
-Vector in funnybones - Rust Struct funnybones::Vector
source · pub struct Vector {
- 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§
Trait Implementations§
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 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
+Vector in funnybones - Rust Struct funnybones::Vector
source · pub struct Vector {
+ pub magnitude: f32,
+ pub direction: Angle,
+}
Expand description
A 2D Euclidean vector.
+Fields§
§magnitude: f32
The length of the vector.
+§direction: Angle
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
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
@@ -27,7 +21,7 @@
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>,
§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn cam16_into_unclamped(
+ T: FromCam16Unclamped<WpParam, U>,
source§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn cam16_into_unclamped(
self,
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
Converts self
into C
, using the provided parameters.§impl<A> Cast for A
§fn cast<To>(self) -> Towhere
@@ -40,8 +34,8 @@
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> From<T> 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
@@ -52,13 +46,13 @@
From<T> for U
chooses to do.
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>,
§type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
The number type that’s used in parameters
when converting.source§fn into_cam16_unclamped(
+ 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 more§impl<Unit> IntoComponents<Unit> for Unitwhere
- Unit: Copy,
§fn into_components(self) -> (Unit, Unit)
Extracts this type’s 2d vector components.§fn to_vec<Type>(self) -> Typewhere
+ Unit: Copy,
§fn into_components(self) -> (Unit, Unit)
Extracts this type’s 2d vector components.source§impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
@@ -71,11 +65,11 @@
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>,
§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
+ T: Clone,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: Into<T>,
source§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
@@ -83,8 +77,8 @@
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
source§impl<T> DeserializeOwned for Twhere
+ T: for<'de> Deserialize<'de>,
§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/help.html b/main/help.html
index a9e765b..2c023f8 100644
--- a/main/help.html
+++ b/main/help.html
@@ -1 +1 @@
-Help Rustdoc help
Back
\ No newline at end of file
+Help Rustdoc help
Back
\ No newline at end of file
diff --git a/main/search-index.js b/main/search-index.js
index f2a8699..a7a1610 100644
--- a/main/search-index.js
+++ b/main/search-index.js
@@ -1,5 +1,4 @@
-var searchIndex = new Map(JSON.parse('[\
-["funnybones",{"t":"PPFFGFGFFPFPFFFNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOFPFGFPFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOO","n":["A","B","Bone","BoneAxis","BoneEnd","BoneId","BoneKind","Joint","JointId","Jointed","LabeledBoneKind","Rigid","Rotation","Skeleton","Vector","adapt_into_using","adapt_into_using","adapt_into_using","adapt_into_using","adapt_into_using","adapt_into_using","adapt_into_using","adapt_into_using","adapt_into_using","adapt_into_using","adapt_into_using","add","angle","animation","arrays_from","arrays_from","arrays_from","arrays_from","arrays_from","arrays_from","arrays_from","arrays_from","arrays_from","arrays_from","arrays_from","arrays_into","arrays_into","arrays_into","arrays_into","arrays_into","arrays_into","arrays_into","arrays_into","arrays_into","arrays_into","arrays_into","as_any","as_any","as_any","as_any","as_any","as_any","as_any","as_any","as_any","as_any","as_any","as_any_mut","as_any_mut","as_any_mut","as_any_mut","as_any_mut","as_any_mut","as_any_mut","as_any_mut","as_any_mut","as_any_mut","as_any_mut","axis_a","axis_b","bone","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","cam16_into_unclamped","cam16_into_unclamped","cam16_into_unclamped","cam16_into_unclamped","cam16_into_unclamped","cam16_into_unclamped","cam16_into_unclamped","cam16_into_unclamped","cam16_into_unclamped","cam16_into_unclamped","cam16_into_unclamped","cast","cast","cast","cast","cast","cast","cast","cast","cast","cast","cast","cast_into","cast_into","cast_into","cast_into","cast_into","cast_into","cast_into","cast_into","cast_into","cast_into","cast_into","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","cmp","cmp","compare","compare","compare","compare","components_from","components_from","components_from","components_from","components_from","components_from","components_from","components_from","components_from","components_from","components_from","default","default","default","degrees","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","desired_end","downcast","downcast","downcast","downcast","downcast","downcast","downcast","downcast","downcast","downcast","downcast","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","drop","end","end","eq","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","find_bone_by_label","find_joint_by_label","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from_angle","from_angle","from_angle","from_angle","from_angle","from_angle","from_angle","from_angle","from_angle","from_angle","from_angle","from_cast","from_cast","from_cast","from_cast","from_cast","from_cast","from_cast","from_cast","from_cast","from_cast","from_cast","from_components","from_parts","from_stimulus","from_stimulus","from_stimulus","from_stimulus","from_stimulus","from_stimulus","from_stimulus","from_stimulus","from_stimulus","from_stimulus","from_stimulus","hash","hash","hash","hash","index","index","index_mut","index_mut","init","init","init","init","init","init","init","init","init","init","init","into","into","into","into","into","into","into","into","into","into","into","into_angle","into_angle","into_angle","into_angle","into_angle","into_angle","into_angle","into_angle","into_angle","into_angle","into_angle","into_any","into_any","into_any","into_any","into_any","into_any","into_any","into_any","into_any","into_any","into_any","into_any_arc","into_any_arc","into_any_arc","into_any_arc","into_any_arc","into_any_arc","into_any_arc","into_any_arc","into_any_arc","into_any_arc","into_any_arc","into_any_rc","into_any_rc","into_any_rc","into_any_rc","into_any_rc","into_any_rc","into_any_rc","into_any_rc","into_any_rc","into_any_rc","into_any_rc","into_cam16_unclamped","into_cam16_unclamped","into_cam16_unclamped","into_cam16_unclamped","into_cam16_unclamped","into_cam16_unclamped","into_cam16_unclamped","into_cam16_unclamped","into_cam16_unclamped","into_cam16_unclamped","into_cam16_unclamped","into_color","into_color","into_color","into_color","into_color","into_color","into_color","into_color","into_color","into_color","into_color","into_color_unclamped","into_color_unclamped","into_color_unclamped","into_color_unclamped","into_color_unclamped","into_color_unclamped","into_color_unclamped","into_color_unclamped","into_color_unclamped","into_color_unclamped","into_color_unclamped","into_components","into_components","into_components","into_components","into_components","into_components","into_components","into_components","into_parts","into_read_only","into_read_only","into_read_only","into_read_only","into_read_only","into_read_only","into_read_only","into_read_only","into_read_only","into_read_only","into_read_only","into_stimulus","into_stimulus","into_stimulus","into_stimulus","into_stimulus","into_stimulus","into_stimulus","into_stimulus","into_stimulus","into_stimulus","into_stimulus","into_value","into_value","into_value","into_value","into_value","into_value","into_value","into_value","into_value","into_value","into_value","into_value","into_value","into_value","into_value","into_value","into_value","into_value","into_value","into_value","into_value","into_value","inverse","inverse","kind","label","label","label","lerp","magnitude","map","neg","new","new","other_axis","partial_cmp","partial_cmp","partial_cmp","percent_between","push_bone","push_joint","radians","rotation","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","set_angle","set_desired_end","set_rotation","set_translation","solve","solved_joint","start","sub","sub","to_degrees","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_radians","to_smolstr","to_string","translation","try_components_into","try_components_into","try_components_into","try_components_into","try_components_into","try_components_into","try_components_into","try_components_into","try_components_into","try_components_into","try_components_into","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into_color","try_into_color","try_into_color","try_into_color","try_into_color","try_into_color","try_into_color","try_into_color","try_into_color","try_into_color","try_into_color","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","uints_from","uints_from","uints_from","uints_from","uints_from","uints_from","uints_from","uints_from","uints_from","uints_from","uints_from","uints_into","uints_into","uints_into","uints_into","uints_into","uints_into","uints_into","uints_into","uints_into","uints_into","uints_into","upcast","upcast","upcast","upcast","upcast","upcast","upcast","upcast","upcast","upcast","upcast","with_label","with_label","x","y","end_length","inverse","length","start_length","Animation","Bone","Change","ChangeKind","Frame","Joint","RunningAnimation","adapt_into_using","adapt_into_using","adapt_into_using","adapt_into_using","adapt_into_using","arrays_from","arrays_from","arrays_from","arrays_from","arrays_from","arrays_into","arrays_into","arrays_into","arrays_into","arrays_into","as_any","as_any","as_any","as_any","as_any","as_any_mut","as_any_mut","as_any_mut","as_any_mut","as_any_mut","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","cam16_into_unclamped","cam16_into_unclamped","cam16_into_unclamped","cam16_into_unclamped","cam16_into_unclamped","cast","cast","cast","cast","cast","cast_into","cast_into","cast_into","cast_into","cast_into","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_to_uninit","clone_to_uninit","clone_to_uninit","clone_to_uninit","components_from","components_from","components_from","components_from","components_from","default","deref","deref","deref","deref","deref","deref","deref","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deref_mut","deserialize","deserialize","deserialize","downcast","downcast","downcast","downcast","downcast","drop","drop","drop","drop","drop","duration","eq","eq","eq","eq","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from_angle","from_angle","from_angle","from_angle","from_angle","from_cast","from_cast","from_cast","from_cast","from_cast","from_stimulus","from_stimulus","from_stimulus","from_stimulus","from_stimulus","init","init","init","init","init","insert","into","into","into","into","into","into_angle","into_angle","into_angle","into_angle","into_angle","into_any","into_any","into_any","into_any","into_any","into_any_arc","into_any_arc","into_any_arc","into_any_arc","into_any_arc","into_any_rc","into_any_rc","into_any_rc","into_any_rc","into_any_rc","into_cam16_unclamped","into_cam16_unclamped","into_cam16_unclamped","into_cam16_unclamped","into_cam16_unclamped","into_color","into_color","into_color","into_color","into_color","into_color_unclamped","into_color_unclamped","into_color_unclamped","into_color_unclamped","into_color_unclamped","into_components","into_components","into_read_only","into_read_only","into_read_only","into_read_only","into_read_only","into_stimulus","into_stimulus","into_stimulus","into_stimulus","into_stimulus","into_value","into_value","into_value","into_value","into_value","into_value","into_value","into_value","into_value","into_value","looping","new","push","push_change","remove","serialize","serialize","serialize","set_duration","set_variable","start","to_owned","to_owned","to_owned","to_owned","try_components_into","try_components_into","try_components_into","try_components_into","try_components_into","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into_color","try_into_color","try_into_color","try_into_color","try_into_color","type_id","type_id","type_id","type_id","type_id","uints_from","uints_from","uints_from","uints_from","uints_from","uints_into","uints_into","uints_into","uints_into","uints_into","upcast","upcast","upcast","upcast","upcast","update","variable","with","with_change","with_easing","with_variable","bone","joint","position","rotation"],"q":[[0,"funnybones"],[612,"funnybones::BoneKind"],[616,"funnybones::animation"],[877,"funnybones::animation::ChangeKind"],[881,"palette::chromatic_adaptation"],[882,"core::any"],[883,"palette::cam16::parameters"],[884,"intentional::cast"],[885,"core::cmp"],[886,"core::result"],[887,"serde::de"],[888,"core::option"],[889,"core::fmt"],[890,"cushy::context"],[891,"core::hash"],[892,"alloc::boxed"],[893,"alloc::sync"],[894,"alloc::rc"],[895,"cushy::value"],[896,"core::ops::function"],[897,"cushy::animation"],[898,"core::convert"],[899,"serde::ser"],[900,"smol_str"],[901,"alloc::string"],[902,"palette::convert::try_from_into_color"],[903,"core::time"],[904,"alloc::borrow"],[905,"easing_function::easings"]],"i":[14,14,0,0,0,0,0,0,0,12,0,12,0,0,0,30,11,2,12,17,8,22,3,7,13,14,2,3,0,30,11,2,12,17,8,22,3,7,13,14,30,11,2,12,17,8,22,3,7,13,14,30,11,2,12,17,8,22,3,7,13,14,30,11,2,12,17,8,22,3,7,13,14,7,7,8,30,11,2,12,17,8,22,3,7,13,14,30,11,2,12,17,8,22,3,7,13,14,30,11,2,12,17,8,22,3,7,13,14,30,11,2,12,17,8,22,3,7,13,14,30,11,2,12,17,8,22,3,7,13,14,11,2,12,8,7,13,14,11,2,12,8,7,13,14,11,2,12,8,7,13,14,7,13,7,7,13,13,30,11,2,12,17,8,22,3,7,13,14,11,2,17,2,30,11,2,12,17,8,22,3,7,13,14,30,11,2,12,17,8,22,3,7,13,14,11,2,12,17,8,7,13,14,22,30,11,2,12,17,8,22,3,7,13,14,30,11,2,12,17,8,22,3,7,13,14,22,8,11,2,12,8,7,13,14,8,8,8,7,7,7,13,13,13,14,14,14,17,17,11,2,2,2,12,17,8,22,3,7,13,14,30,30,11,2,12,17,8,22,3,7,13,14,30,11,2,12,17,8,22,3,7,13,14,30,11,2,12,17,8,22,3,7,13,14,11,2,30,11,2,12,17,8,22,3,7,13,14,8,7,13,14,17,17,17,17,30,11,2,12,17,8,22,3,7,13,14,30,11,2,12,17,8,22,3,7,13,14,30,11,2,12,17,8,22,3,7,13,14,30,11,2,12,17,8,22,3,7,13,14,30,11,2,12,17,8,22,3,7,13,14,30,11,2,12,17,8,22,3,7,13,14,30,11,2,12,17,8,22,3,7,13,14,30,11,2,12,17,8,22,3,7,13,14,30,11,2,12,17,8,22,3,7,13,14,11,11,2,12,8,7,13,14,2,30,11,2,12,17,8,22,3,7,13,14,30,11,2,12,17,8,22,3,7,13,14,30,30,11,11,2,2,12,12,17,17,8,8,22,22,3,3,7,7,13,13,14,14,8,14,30,22,3,30,2,11,11,2,11,3,3,2,7,13,2,17,17,2,17,11,2,12,17,8,22,3,7,13,14,3,22,17,17,17,22,22,11,2,2,11,2,12,8,7,13,14,2,2,2,17,30,11,2,12,17,8,22,3,7,13,14,30,11,2,12,17,8,22,3,7,13,14,30,11,2,12,17,8,22,3,7,13,14,30,11,2,12,17,8,22,3,7,13,14,30,11,2,12,17,8,22,3,7,13,14,30,11,2,12,17,8,22,3,7,13,14,30,11,2,12,17,8,22,3,7,13,14,30,11,2,12,17,8,22,3,7,13,14,12,3,11,11,55,55,56,55,0,50,0,0,0,50,0,52,47,48,49,50,52,47,48,49,50,52,47,48,49,50,52,47,48,49,50,52,47,48,49,50,52,47,48,49,50,52,47,48,49,50,52,47,48,49,50,52,47,48,49,50,52,47,48,49,50,47,48,49,50,47,48,49,50,47,48,49,50,52,47,48,49,50,47,52,47,47,48,48,49,50,52,47,47,48,48,49,50,48,49,50,52,47,48,49,50,52,47,48,49,50,48,47,48,49,50,47,48,49,50,52,47,48,49,49,50,52,47,48,49,50,52,47,48,49,50,52,47,48,49,50,52,47,48,49,50,47,52,47,48,49,50,52,47,48,49,50,52,47,48,49,50,52,47,48,49,50,52,47,48,49,50,52,47,48,49,50,52,47,48,49,50,52,47,48,49,50,49,50,52,47,48,49,50,52,47,48,49,50,52,52,47,47,48,48,49,49,50,50,52,48,47,48,47,48,49,50,48,47,47,47,48,49,50,52,47,48,49,50,52,47,48,49,50,52,47,48,49,50,52,47,48,49,50,52,47,48,49,50,52,47,48,49,50,52,47,48,49,50,52,47,48,49,50,52,47,47,48,50,47,57,58,57,58],"f":"```````````````{eg{}{{b{c}}}{}}0000000000{{dd}c{}}{{{h{f}}}d}`{ce{}{}}0000000000{{}c{}}0000000000{h{{h{j}}}}0000000000{{{h{l}}}{{h{lj}}}}0000000000{nA`}0`{h{{h{c}}}{}}0000000000{{{h{l}}}{{h{lc}}}{}}0000000000{{{Ab{c}}}e{}{}}0000000000{{}e{}{{Ad{c}}}}000000000077777777777{{{h{Af}}}Af}{{{h{d}}}d}{{{h{Ah}}}Ah}{{{h{A`}}}A`}{{{h{n}}}n}{{{h{Aj}}}Aj}{{{h{Al}}}Al}{{h{h{lc}}}An{}}000000{hAn}000000{{{h{n}}{h{n}}}B`}{{{h{Aj}}{h{Aj}}}B`}{{h{h{c}}}B`{}}000{ce{}{}}0000000000{{}Af}{{}d}{{}Bb}{Bdd}{Bf{{h{c}}}{}}0000000000{Bf{{h{lc}}}{}}0000000000{c{{Bh{Af}}}Bj}{c{{Bh{d}}}Bj}{c{{Bh{Ah}}}Bj}{c{{Bh{Bb}}}Bj}{c{{Bh{A`}}}Bj}{c{{Bh{n}}}Bj}{c{{Bh{Aj}}}Bj}{c{{Bh{Al}}}Bj}{{{h{Bl}}}{{Bn{Af}}}}{h{{h{c}}}{}}0000000000{BfAn}0000000000{{{h{Bl}}}Af}`{{{h{Af}}{h{Af}}}C`}{{{h{d}}{h{d}}}C`}{{{h{Ah}}{h{Ah}}}C`}{{{h{A`}}{h{A`}}}C`}{{{h{n}}{h{n}}}C`}{{{h{Aj}}{h{Aj}}}C`}{{{h{Al}}{h{Al}}}C`}{{h{h{c}}}C`{}}00000000000{{{h{Bb}}{h{Cb}}}{{Bn{n}}}}{{{h{Bb}}{h{Cb}}}{{Bn{Aj}}}}{{{h{Af}}{h{lCd}}}Cf}{{h{h{Ch}}{h{lCd}}}{{Bh{AnCj}}}}{{{h{d}}{h{lCd}}}Cf}0{{{h{Ah}}{h{lCd}}}Cf}{{{h{Bb}}{h{lCd}}}Cf}{{{h{A`}}{h{lCd}}}Cf}{{{h{Bl}}{h{lCd}}}Cf}{{{h{f}}{h{lCd}}}Cf}{{{h{n}}{h{lCd}}}Cf}{{{h{Aj}}{h{lCd}}}Cf}{{{h{Al}}{h{lCd}}}Cf}{AhCl}{cc{}}00000000000000000000000000000000{{{Cn{BdBd}}}Af}{Bnc{}}{ce{}{}}0000000000{{{h{A`}}{h{lc}}}AnD`}{{{h{n}}{h{lc}}}AnD`}{{{h{Aj}}{h{lc}}}AnD`}{{{h{Al}}{h{lc}}}AnD`}{{{h{Bb}}Aj}{{h{c}}}{}}{{{h{Bb}}n}{{h{c}}}{}}{{{h{lBb}}Aj}{{h{lc}}}{}}{{{h{lBb}}n}{{h{lc}}}{}}{{}Bf}0000000000{{}c{}}000000000000000000000{{{Db{c}}}{{Db{j}}}{}}0000000000{{{Dd{c}}}{{Dd{j}}}{}}0000000000{{{Df{c}}}{{Df{j}}}{}}0000000000{{{Ab{c}}}e{}{}}00000000004444444444444444444444{{}{{Cn{cc}}}{}}{Af{{Cn{BdBd}}}}111111{{}{{Cn{Bn}}}}{{}{{Dh{c}}}{}}000000000088888888888{{}{{Dj{c}}}{}}{{}{{Dj{{Bn{c}}}}}{}}10101010101001100101{A`A`}{AlAl}`{{{h{Bl}}}{{h{Cb}}}}{{{h{f}}}{{h{Cb}}}}`{{{h{d}}{h{d}}Bd}d}{{{h{Af}}}Bd}{{Afc}Af{{Dn{Bd}{{Dl{Bd}}}}}}{dc{}}{{BdBd}Af}{{dA`A`}f}{{{h{f}}A`}A`}{{{h{d}}{h{d}}}{{Bn{B`}}}}{{{h{n}}{h{n}}}{{Bn{B`}}}}{{{h{Aj}}{h{Aj}}}{{Bn{B`}}}}{{{h{d}}{h{d}}{h{d}}}E`}{{{h{lBb}}c}n{{Eb{Cl}}}}{{{h{lBb}}f}Aj}{Bdd}{{{h{Bb}}}d}{{{h{Af}}c}BhEd}{{{h{d}}c}BhEd}{{{h{Ah}}c}BhEd}{{{h{Bb}}c}BhEd}{{{h{A`}}c}BhEd}{{{h{Bl}}c}BhEd}{{{h{f}}c}BhEd}{{{h{n}}c}BhEd}{{{h{Aj}}c}BhEd}{{{h{Al}}c}BhEd}{{{h{lf}}d}An}{{{h{lBl}}{Bn{Af}}}An}{{{h{lBb}}d}An}{{{h{lBb}}Af}An}{{{h{lBb}}}An}{{{h{Bl}}}{{Bn{Af}}}}{{{h{Bl}}}Af}{{AfAf}c{}}{{dd}c{}}{dBd}{hc{}}0000001{hEf}{hEh}{{{h{Bb}}}Af}{{}{{Bh{c}}}{}}0000000000{c{{Bh{e}}}{}{}}000000000011111111111{{}{{Bh{c{Ej{c}}}}}{}}0000000000{hEl}0000000000{ce{}{}}0000000000{{}c{}}0000000000{h{{Bn{{h{c}}}}}{}}0000000000{{Ahc}Cl{{Eb{Eh}}}}{{fc}f{{Eb{Eh}}}}`````````````{eg{}{{b{c}}}{}}00005555544444{h{{h{j}}}}0000{{{h{l}}}{{h{lj}}}}0000{h{{h{c}}}{}}0000{{{h{l}}}{{h{lc}}}{}}0000{{{Ab{c}}}e{}{}}0000{{}e{}{{Ad{c}}}}0000:::::{{{h{En}}}En}{{{h{F`}}}F`}{{{h{Fb}}}Fb}{{{h{Fd}}}Fd}{{h{h{lc}}}An{}}000{hAn}000{ce{}{}}0000{{}En}{Bf{{h{c}}}{}}{{{h{En}}}{{h{c}}}{}}11{{{h{F`}}}{{h{c}}}{}}22{Bf{{h{lc}}}{}}0{{{h{lEn}}}{{h{lc}}}{}}1{{{h{lF`}}}{{h{lc}}}{}}22{c{{Bh{F`}}}Bj}{c{{Bh{Fb}}}Bj}{c{{Bh{Fd}}}Bj}{h{{h{c}}}{}}0000{BfAn}0000{{{h{F`}}}Ff}{{{h{En}}{h{En}}}C`}{{{h{F`}}{h{F`}}}C`}{{{h{Fb}}{h{Fb}}}C`}{{{h{Fd}}{h{Fd}}}C`}{{{h{En}}{h{lCd}}}Cf}{{{h{F`}}{h{lCd}}}Cf}{{{h{Fb}}{h{lCd}}}Cf}{{{h{Fd}}{h{lCd}}}Cf}{cc{}}000{FdFb}11111111111{ce{}{}}0000{{}Bf}0000{{{h{lEn}}BfF`}An}{{}c{}}000000000{{{Db{c}}}{{Db{j}}}{}}0000{{{Dd{c}}}{{Dd{j}}}{}}0000{{{Df{c}}}{{Df{j}}}{}}0000{{{Ab{c}}}e{}{}}00004444444444{{}{{Cn{cc}}}{}}0{{}{{Dh{c}}}{}}000066666{{}{{Dj{{Bn{c}}}}}{}}{{}{{Dj{c}}}{}}01101010{FhFh}{FfF`}{{{h{lEn}}F`}An}{{{h{lF`}}c}An{{Eb{Fb}}}}{{{h{lEn}}Bf}F`}{{{h{F`}}c}BhEd}{{{h{Fb}}c}BhEd}{{{h{Fd}}c}BhEd}{{{h{lF`}}Ff}An}{{{h{lEn}}cBd}An{{Eb{{Fj{Cb}}}}}}{{{h{En}}}Fh}{hc{}}000{{}{{Bh{c}}}{}}0000{c{{Bh{e}}}{}{}}000011111{{}{{Bh{c{Ej{c}}}}}{}}0000{hEl}0000{ce{}{}}0000{{}c{}}0000{h{{Bn{{h{c}}}}}{}}0000{{{h{lFh}}Ff{h{lBb}}}C`}{{{h{En}}{h{Cb}}}{{Bn{Bd}}}}{{EnF`}En}{{F`c}F`{{Eb{Fb}}}}{{FdFl}Fb}{{EncBd}En{{Eb{Eh}}}}````","D":"Kf","p":[[10,"TransformMatrix",881],[5,"Rotation",0],[5,"Joint",0],[1,"reference"],[10,"Any",882],[0,"mut"],[5,"BoneId",0],[5,"BoneAxis",0],[5,"BakedParameters",883],[10,"CastFrom",884],[5,"Vector",0],[6,"BoneKind",0],[5,"JointId",0],[6,"BoneEnd",0],[1,"unit"],[6,"Ordering",885],[5,"Skeleton",0],[1,"f32"],[1,"usize"],[6,"Result",886],[10,"Deserializer",887],[5,"Bone",0],[6,"Option",888],[1,"bool"],[1,"str"],[5,"Formatter",889],[8,"Result",889],[5,"WidgetContext",890],[5,"Error",889],[5,"LabeledBoneKind",0],[1,"tuple"],[10,"Hasher",891],[5,"Box",892],[5,"Arc",893],[5,"Rc",894],[6,"ReadOnly",895],[6,"Value",895],[17,"Output"],[10,"FnMut",896],[5,"ZeroToOne",897],[10,"Into",898],[10,"Serializer",899],[5,"SmolStr",900],[5,"String",901],[5,"OutOfBounds",902],[5,"TypeId",882],[5,"Animation",616],[5,"Frame",616],[5,"Change",616],[6,"ChangeKind",616],[5,"Duration",903],[5,"RunningAnimation",616],[6,"Cow",904],[6,"StandardEasing",905],[15,"Jointed",612],[15,"Rigid",612],[15,"Bone",877],[15,"Joint",877]],"r":[],"b":[[251,"impl-Display-for-Rotation"],[252,"impl-Debug-for-Rotation"],[312,"impl-Index%3CJointId%3E-for-Skeleton"],[313,"impl-Index%3CBoneId%3E-for-Skeleton"],[314,"impl-IndexMut%3CJointId%3E-for-Skeleton"],[315,"impl-IndexMut%3CBoneId%3E-for-Skeleton"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAABYDFQAQAAsAHQAsAE0AXwCuAB0AzQAVAOUAEgD6AAwAEgE1AFMBgQDbAQAA3gEAAOIBAwDqAQkA+wEBAP4BBgAGAgEACQJXAGkCbgDcAgAA3gIUAPgCeQA="}]\
-]'));
+var searchIndex = new Map(JSON.parse('[["FunnyBones",{"t":"PPFFGFONNNNHNNNNNNNNNNNNNNNNNHHHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOHNOHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN","n":["Animation","Bones","ChangeAggregator","EditingSkeleton","Mode","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","","","","desired_end","downcast","","","","drop","","","","eq","","","equivalent","","","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_components","into_read_only","","","","into_stimulus","","","","into_value","","","","","","","","inverse","joint_angle","joint_label","jointed","label","length","main","new","root","skeleton_editor","to_owned","","","","try_components_into","","","","try_from","","","","try_into","","","","try_into_color","","","","type_id","","","","uints_from","","","","uints_into","","","","upcast","","","","watch"],"q":[[0,"FunnyBones"],[219,"palette::chromatic_adaptation"],[220,"funnybones"],[221,"alloc::vec"],[222,"cushy::value"],[223,"core::any"],[224,"cushy::widget"],[225,"palette::cam16::parameters"],[226,"intentional::cast"],[227,"core::option"],[228,"core::ops::control_flow"],[229,"core::fmt"],[230,"alloc::boxed"],[231,"alloc::sync"],[232,"alloc::rc"],[233,"anyhow"],[234,"core::cmp"],[235,"core::marker"],[236,"core::ops::function"],[237,"core::result"],[238,"palette::convert::try_from_into_color"]],"i":"Bd0````Bf1Ah1f`31203120312031200```31203120312031203120312031203120312003203120312003120312032033322223120312031203120312031203120312031203120312031203120312033120312033112200000000`12`3120312031203120312031203120312031201","f":"```````{eg{}{{b{c}}}{}}000{{d{l{{j{{h{f}}}}}}{l{nA`}}}Ab}{ce{}{}}000{{}c{}}000{l{{l{Ad}}}}000{{{l{n}}}{{l{nAd}}}}000{{{l{f}}}Af}{{f{l{Ah}}}{{`{Aj}}}}{{f{l{Ah}}Al}{{`{Aj}}}}{{{l{An}}{l{{j{{h{f}}}}}}{l{Ah}}}{{`{Aj}}}}{l{{l{c}}}{}}000{{{l{n}}}{{l{nc}}}{}}000{{{B`{c}}}e{}{}}000{{}e{}{{Bb{c}}}}000::::{{{l{Bd}}}Bd}{{{l{Ah}}}Ah}{{{l{Bf}}}Bf}{{{l{f}}}f}{{l{l{nc}}}Ab{}}000{lAb}000{ce{}{}}000`{{}Bd}{{}Bf}{{}f}{Bh{{l{c}}}{}}000{Bh{{l{nc}}}{}}000`????{BhAb}000{{{l{Bd}}{l{Bd}}}Al}{{{l{Bf}}{l{Bf}}}Al}{{{l{f}}{l{f}}}Al}{{l{l{c}}}Al{}}00{{{l{Bf}}Bj}{{Bl{f}}}}{{{l{{j{{h{f}}}}}}Bh}{{Bn{fBh}}}}{{{l{Bf}}C`}{{Bl{f}}}}1{{{l{Bd}}{l{nCb}}}Cd}{{{l{Ah}}{l{nCb}}}Cd}{{{l{Bf}}{l{nCb}}}Cd}{{{l{f}}{l{nCb}}}Cd}{cc{}}00000000000{ce{}{}}000{{}Bh}000{{}c{}}0000000{{{Cf{c}}}{{Cf{Ad}}}{}}000{{{Ch{c}}}{{Ch{Ad}}}{}}000{{{Cj{c}}}{{Cj{Ad}}}{}}000{{{B`{c}}}e{}{}}00044444444{{}{{Cl{cc}}}{}}{{}{{Cn{c}}}{}}0006666{{}{{D`{c}}}{}}{{}{{D`{{Bl{c}}}}}{}}100110``````{{}{{Db{Ab}}}}{e{{Cl{Ah{j{c}}}}}{DdDf}{{Dj{}{{Dh{c}}}}Df}}`{{{l{Bf}}{l{Ah}}}{{`{Aj}}}}{lc{}}000{{}{{Dl{c}}}{}}000{c{{Dl{e}}}{}{}}0001111{{}{{Dl{c{Dn{c}}}}}{}}000{lE`}000{ce{}{}}000{{}c{}}000{l{{Bl{{l{c}}}}}{}}000{{{l{Ah}}{l{{j{c}}}}}AbDf}","D":"Ab","p":[[10,"TransformMatrix",219],[5,"BoneAxis",220],[5,"SkeletalBone",0],[5,"Vec",221],[5,"Dynamic",222],[1,"reference"],[0,"mut"],[5,"Skeleton",220],[1,"unit"],[10,"Any",223],[5,"LabeledBoneKind",220],[5,"ChangeAggregator",0],[10,"MakeWidget",224],[1,"bool"],[1,"str"],[5,"BakedParameters",225],[10,"CastFrom",226],[6,"Mode",0],[5,"EditingSkeleton",0],[1,"usize"],[5,"BoneId",220],[6,"Option",227],[6,"ControlFlow",228],[5,"JointId",220],[5,"Formatter",229],[8,"Result",229],[5,"Box",230],[5,"Arc",231],[5,"Rc",232],[1,"tuple"],[6,"ReadOnly",222],[6,"Value",222],[8,"Result",233],[10,"PartialEq",234],[10,"Send",235],[17,"Output"],[10,"FnMut",236],[6,"Result",237],[5,"OutOfBounds",238],[5,"TypeId",223]],"r":[],"b":[],"c":"OjAAAAAAAAA=","e":"OzAAAAEAANIAAwABAGYAbAAPAIAAWwA="}],["funnybones",{"t":"PFPFFGFGFFFPFTTPFFNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNONNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOFPFGFPFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOCPPPPFGGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOO","n":["A","Angle","B","Bone","BoneAxis","BoneEnd","BoneId","BoneKind","Coordinate","Joint","JointId","Jointed","LabeledBoneKind","MAX","MIN","Rigid","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","bones","borrow","","","","","","","","","","","","borrow_mut","","","","","","","","","","","","cam16_into_unclamped","","","","","","","","","","","","cast","","","","","","","","","","","","cast_into","","","","","","","","","","","","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_root","joints","kind","","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_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","Animation","Bone","Change","ChangeKind","Frame","Joint","RunningAnimation","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","","","","","","","deserialize","","","downcast","","","","","drop","","","","","duration","eq","","","","fmt","","","","from","","","","","","from_angle","","","","","from_cast","","","","","from_stimulus","","","","","init","","","","","insert","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","push","push_change","remove","serialize","","","set_duration","set_variable","start","to_owned","","","","try_components_into","","","","","try_from","","","","","try_into","","","","","try_into_color","","","","","type_id","","","","","uints_from","","","","","uints_into","","","","","upcast","","","","","update","variable","with","with_change","with_easing","with_variable","bone","joint","position","rotation","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_with_tag","mouse_down","mouse_drag","mouse_up","new","on_mutate","open","redraw","run","run_in","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"],[701,"funnybones::BoneKind"],[705,"funnybones::animation"],[966,"funnybones::animation::ChangeKind"],[970,"funnybones::cushy"],[971,"funnybones::cushy::skeleton_canvas"],[1130,"funnybones::cushy::skeleton_canvas::SkeletonMutation"],[1134,"palette::chromatic_adaptation"],[1135,"core::any"],[1136,"palette::cam16::parameters"],[1137,"intentional::cast"],[1138,"core::cmp"],[1139,"core::option"],[1140,"core::result"],[1141,"serde::de"],[1142,"core::fmt"],[1143,"cushy::context"],[1144,"core::hash"],[1145,"alloc::boxed"],[1146,"alloc::sync"],[1147,"alloc::rc"],[1148,"cushy::value"],[1149,"core::ops::function"],[1150,"cushy::animation"],[1151,"core::convert"],[1152,"serde::ser"],[1153,"core::ops::range"],[1154,"cushy::widgets::progress"],[1155,"smol_str"],[1156,"alloc::string"],[1157,"palette::convert::try_from_into_color"],[1158,"core::time"],[1159,"alloc::borrow"],[1160,"easing_function::easings"],[1161,"figures::units"],[1162,"figures::point"],[1163,"cursor_icon"],[1164,"cushy"],[1165,"figures::size"],[1166,"cushy::widget"],[1167,"cushy::window"],[1168,"winit::event"],[1169,"core::marker"],[1170,"winit::error"],[1171,"cushy::app"]],"i":"Bf`0````````Bb`h01``D`d2f4AhAfAjA`AdBd;779692`8796:543210;8796:543210;8796:543210;8796:543210;711458796:543210;8796:543210;8796:543210;8796:543210;8796:543210;796:410;796:410;796:410;1011008796:543210;59`796598796:543210;8796:543210;796:5410;3678796:543210;8796:543210;343796:543210;444111000;;;35579996:543210;8877966:543210;8796:543210;8796:543210;798796:543210;:410;325510558796:543210;8796:543210;8796:543210;8796:543210;8796:543210;8796:543210;8796:543210;8796:543210;8796:543210;7796:410;98796:543210;8796:543210;88779966::554433221100;;4;35383289676779762291095595796:543210;23559533779699796:410;999958796:543210;8796:543210;8796:543210;8796:543210;8796:543210;8796:543210;8796:543210;8796:543210;7:277Jf0Jh1`Fl```0`G`FfFhFj4321043210432104321043210432104321043210432104210421042104321042322110432211041043210432104121042104321004321043210432104321042321043210432104321043210432104321043210404321043210433221100443121210412221043210432104321043210432104321043210432104322142JjJl10`Gf0Gh0```Gj2102102102102102102102102102121212102102102102102121222021021021021021000210210210212102102102102121021021002211000000000000210210210210210210210210021Jn0K`0","f":"``````````````````{eg{}{{b{c}}}{}}00000000000{{dd}c{}}{{df}c{}}{{hh}c{}}{{fh}c{}}{{{l{jh}}h}n}{{{l{A`}}}h}`{ce{}{}}00000000000{{}c{}}00000000000{l{{l{Ab}}}}00000000000{{{l{j}}}{{l{jAb}}}}00000000000{dh}{AdAf}0`{{{l{Ah}}}{{l{{Al{Aj}}}}}}{l{{l{c}}}{}}00000000000{{{l{j}}}{{l{jc}}}{}}00000000000{{{An{c}}}e{}{}}00000000000{{}e{}{{B`{c}}}}00000000000999999999999{{{l{d}}}d}{{{l{h}}}h}{{{l{f}}}f}{{{l{Bb}}}Bb}{{{l{Af}}}Af}{{{l{Ad}}}Ad}{{{l{Bd}}}Bd}{{{l{Bf}}}Bf}{{l{l{jc}}}n{}}0000000{ln}0000000{{{l{Ad}}{l{Ad}}}Bh}{{{l{Bd}}{l{Bd}}}Bh}{{l{l{c}}}Bh{}}000{ce{}{}}00000000000{{{l{Ah}}Af}{{Bj{{l{{Al{Bd}}}}}}}}{hBl}`{{}d}{{}h}{{}f}{{}Ah}{Blh}{Bn{{l{c}}}{}}00000000000{Bn{{l{jc}}}{}}00000000000{c{{C`{d}}}Cb}{c{{C`{h}}}Cb}{c{{C`{f}}}Cb}{c{{C`{Bb}}}Cb}{c{{C`{Ah}}}Cb}{c{{C`{Af}}}Cb}{c{{C`{Ad}}}Cb}{c{{C`{Bd}}}Cb}{c{{C`{Bf}}}Cb}{{{l{Aj}}}{{Bj{f}}}}`{{dBl}c{}}{l{{l{c}}}{}}00000000000{Bnn}00000000000{{{l{Aj}}}d}`{{{l{Aj}}}h}{{{l{d}}{l{d}}}Cd}{{{l{h}}{l{h}}}Cd}{{{l{f}}{l{f}}}Cd}{{{l{Bb}}{l{Bb}}}Cd}{{{l{Ah}}{l{Ah}}}Cd}{{{l{Af}}{l{Af}}}Cd}{{{l{Aj}}{l{Aj}}}Cd}{{{l{A`}}{l{A`}}}Cd}{{{l{Ad}}{l{Ad}}}Cd}{{{l{Bd}}{l{Bd}}}Cd}{{{l{Bf}}{l{Bf}}}Cd}{{l{l{c}}}Cd{}}00000000000{{{l{Aj}}}f}{{{l{Ah}}{l{Cf}}}{{Bj{Ad}}}}{{{l{Ah}}{l{Cf}}}{{Bj{Bd}}}}{{{l{d}}{l{jCh}}}Cj}{{{l{h}}{l{jCh}}}Cj}{{l{l{Cl}}{l{jCh}}}{{C`{nCn}}}}1{{{l{f}}{l{jCh}}}Cj}{{{l{Bb}}{l{jCh}}}Cj}{{{l{Ah}}{l{jCh}}}Cj}{{{l{Af}}{l{jCh}}}Cj}{{{l{Aj}}{l{jCh}}}Cj}{{{l{A`}}{l{jCh}}}Cj}{{{l{Ad}}{l{jCh}}}Cj}{{{l{Bd}}{l{jCh}}}Cj}{{{l{Bf}}{l{jCh}}}Cj}{BbD`}{cc{}}0{fd}11{df}22222222222222222222222222222222{{{Db{BlBl}}}d}{Bjc{}}{ce{}{}}00000000000{{{l{Bb}}}Bl}{{{l{Af}}{l{jc}}}nDd}{{{l{Ad}}{l{jc}}}nDd}{{{l{Bd}}{l{jc}}}nDd}{{{l{Bf}}{l{jc}}}nDd}{{{l{Aj}}}Ad}{{{l{A`}}}Bd}{{{l{Ah}}Bd}{{l{c}}}{}}{{{l{Ah}}Ad}{{l{c}}}{}}{AdBn}{BdBn}{{{l{jAh}}Ad}{{l{jc}}}{}}{{{l{jAh}}Bd}{{l{jc}}}{}}{{}Bn}00000000000{{}c{}}00000000000000000000000{{{Df{c}}}{{Df{Ab}}}{}}00000000000{{{Dh{c}}}{{Dh{Ab}}}{}}00000000000{{{Dj{c}}}{{Dj{Ab}}}{}}00000000000{{{An{c}}}e{}{}}00000000000444444444444444444444444{{}{{Db{cc}}}{}}{d{{Db{BlBl}}}}1111111{{}{{Db{Bj}}}}{{}{{Dl{c}}}{}}00000000000888888888888{{}{{Dn{{Bj{c}}}}}{}}{{}{{Dn{c}}}{}}1010100110101001100101{AfAf}{BfBf}{{{l{Aj}}}Cd}{{{l{Ah}}}{{l{{Al{A`}}}}}}{{{l{Aj}}}{{l{Bb}}}}`{{{l{Aj}}}{{l{Cf}}}}{{{l{A`}}}{{l{Cf}}}}`{{{l{h}}{l{h}}Bl}h}{{{l{f}}{l{f}}Bl}f}{{{l{d}}}Bl}`{{dc}d{{Eb{Bl}{{E`{Bl}}}}}}{{dBl}c{}}{hc{}}{{BlBl}d}{{Blh}f}{{hAfAf}A`}{{{l{A`}}Af}Af}{{{l{h}}{l{h}}}{{Bj{Bh}}}}{{{l{Ad}}{l{Ad}}}{{Bj{Bh}}}}{{{l{Bd}}{l{Bd}}}{{Bj{Bh}}}}{{{l{h}}{l{h}}{l{h}}}Ed}{{{l{jAh}}c}Ad{{Ef{D`}}}}{{{l{jAh}}A`}Bd}{Blh}{{{l{Ah}}}h}{{{l{d}}c}C`Eh}{{{l{h}}c}C`Eh}{{{l{f}}c}C`Eh}{{{l{Bb}}c}C`Eh}{{{l{Ah}}c}C`Eh}{{{l{Af}}c}C`Eh}{{{l{Aj}}c}C`Eh}{{{l{A`}}c}C`Eh}{{{l{Ad}}c}C`Eh}{{{l{Bd}}c}C`Eh}{{{l{Bf}}c}C`Eh}{{{l{jA`}}h}n}{{{l{jAj}}{Bj{f}}}n}{{{l{jAh}}h}n}{{{l{jAh}}d}n}{hBl}{{{l{jAh}}}n}{{{l{Aj}}}{{Bj{d}}}}{{{l{Aj}}}d}{{dd}c{}}{{df}c{}}{{hh}c{}}{{fh}c{}}{{{l{jh}}h}n}8{lc{}}0000000{{l{Bj{{Ej{l}}}}}El}:{lEn}{lF`}{{{l{Ah}}}d}{{}{{C`{c}}}{}}00000000000{c{{C`{e}}}{}{}}00000000000111111111111{{}{{C`{c{Fb{c}}}}}{}}00000000000{lFd}00000000000{ce{}{}}00000000000{{}c{}}00000000000{l{{Bj{{l{c}}}}}{}}00000000000{{dd}f}{{Bbc}D`{{Ef{F`}}}}{{A`c}A`{{Ef{F`}}}}`````````````{eg{}{{b{c}}}{}}00006666655555{l{{l{Ab}}}}0000{{{l{j}}}{{l{jAb}}}}0000{l{{l{c}}}{}}0000{{{l{j}}}{{l{jc}}}{}}0000{{{An{c}}}e{}{}}0000{{}e{}{{B`{c}}}}0000;;;;;{{{l{Ff}}}Ff}{{{l{Fh}}}Fh}{{{l{Fj}}}Fj}{{{l{Fl}}}Fl}{{l{l{jc}}}n{}}000{ln}000{ce{}{}}0000{{}Ff}{Bn{{l{c}}}{}}{{{l{Ff}}}{{l{c}}}{}}11{{{l{Fh}}}{{l{c}}}{}}22{Bn{{l{jc}}}{}}{{{l{jFf}}}{{l{jc}}}{}}1{{{l{jFh}}}{{l{jc}}}{}}222{c{{C`{Fh}}}Cb}{c{{C`{Fj}}}Cb}{c{{C`{Fl}}}Cb}{l{{l{c}}}{}}0000{Bnn}0000{{{l{Fh}}}Fn}{{{l{Ff}}{l{Ff}}}Cd}{{{l{Fh}}{l{Fh}}}Cd}{{{l{Fj}}{l{Fj}}}Cd}{{{l{Fl}}{l{Fl}}}Cd}{{{l{Ff}}{l{jCh}}}Cj}{{{l{Fh}}{l{jCh}}}Cj}{{{l{Fj}}{l{jCh}}}Cj}{{{l{Fl}}{l{jCh}}}Cj}{cc{}}00{FlFj}111111111111{ce{}{}}0000{{}Bn}0000{{{l{jFf}}BnFh}n}{{}c{}}000000000{{{Df{c}}}{{Df{Ab}}}{}}0000{{{Dh{c}}}{{Dh{Ab}}}{}}0000{{{Dj{c}}}{{Dj{Ab}}}{}}0000{{{An{c}}}e{}{}}00004444444444{{}{{Db{cc}}}{}}0{{}{{Dl{c}}}{}}000066666{{}{{Dn{{Bj{c}}}}}{}}{{}{{Dn{c}}}{}}10010101{G`G`}{FnFh}{{{l{jFf}}Fh}n}{{{l{jFh}}c}n{{Ef{Fj}}}}{{{l{jFf}}Bn}Fh}{{{l{Fh}}c}C`Eh}{{{l{Fj}}c}C`Eh}{{{l{Fl}}c}C`Eh}{{{l{jFh}}Fn}n}{{{l{jFf}}cBl}n{{Ef{{Gb{Cf}}}}}}{{{l{Ff}}}G`}{lc{}}000{{}{{C`{c}}}{}}0000{c{{C`{e}}}{}{}}000011111{{}{{C`{c{Fb{c}}}}}{}}0000{lFd}0000{ce{}{}}0000{{}c{}}0000{l{{Bj{{l{c}}}}}{}}0000{{{l{jG`}}Fn{l{jAh}}}Cd}{{{l{Ff}}{l{Cf}}}{{Bj{Bl}}}}{{FfFh}Ff}{{Fhc}Fh{{Ef{Fj}}}}{{FlGd}Fj}{{FfcBl}Ff{{Ef{F`}}}}````````````{eg{}{{b{c}}}{}}00999888{l{{l{Ab}}}}00{{{l{j}}}{{l{jAb}}}}00{l{{l{c}}}{}}00{{{l{j}}}{{l{jc}}}{}}00{{{An{c}}}e{}{}}00{{}e{}{{B`{c}}}}00>>>{{{l{Gf}}}Gf}{{{l{Gh}}}Gh}{{l{l{jc}}}n{}}0{ln}0{ce{}{}}00{Bn{{l{c}}}{}}00{Bn{{l{jc}}}{}}00:::{Bnn}00{{{l{Gf}}{l{Gf}}}Cd}{{{l{Gh}}{l{Gh}}}Cd}{{l{l{c}}}Cd{}}00{{{l{Gj}}{l{jCh}}}Cj}{{{l{Gf}}{l{jCh}}}Cj}{{{l{Gh}}{l{jCh}}}Cj}{cc{}}00000000:::{{{l{jGj}}{Gn{Gl}}{l{jH`}}}Cd}{{{l{jGj}}{Gn{Gl}}{l{jH`}}}{{Bj{Hb}}}}{{}Bn}00{{}c{}}00000{{{Df{c}}}{{Df{Ab}}}{}}00{{{Dh{c}}}{{Dh{Ab}}}{}}0{{{Dj{c}}}{{Dj{Ab}}}{}}00{{{An{c}}}e{}{}}00444444{{}{{Db{cc}}}{}}0{{}{{Dl{c}}}{}}00666{{}{{Dn{{Bj{c}}}}}{}}{{}{{Dn{c}}}{}}0110{{{l{jGj}}{Hf{Hd}}{l{jHh}}}{{Hf{Hj}}}}{{}Hl}{HnHl}{{{l{jGj}}{Gn{Gl}}I`Ib{l{jH`}}}Id}{{{l{jGj}}{Gn{Gl}}I`Ib{l{jH`}}}n}{{{l{jGj}}{Bj{{Gn{Gl}}}}I`Ib{l{jH`}}}n}{{{If{Ah}}}Gj}{{Gjc}Gj{{Eb{Gh}}Ih}}{{{l{jc}}}{{C`{{Bj{Ij}}Il}}}{InJ`}}{{{l{jGj}}{l{jJb}}}n}{{}{{C`{nIl}}}}{Jd{{C`{nIl}}}}{lc{}}0{{}{{C`{c}}}{}}00{c{{C`{e}}}{}{}}00111{{}{{C`{c{Fb{c}}}}}{}}00{lFd}00{ce{}{}}00{{}c{}}00{{{l{jGj}}{l{jH`}}}n}{l{{Bj{{l{c}}}}}{}}00````","D":"Od","p":[[10,"TransformMatrix",1134],[5,"Coordinate",0],[5,"Vector",0],[5,"Angle",0],[0,"mut"],[1,"reference"],[1,"unit"],[5,"Joint",0],[10,"Any",1135],[5,"BoneId",0],[5,"BoneAxis",0],[5,"Skeleton",0],[5,"Bone",0],[1,"slice"],[5,"BakedParameters",1136],[10,"CastFrom",1137],[6,"BoneKind",0],[5,"JointId",0],[6,"BoneEnd",0],[6,"Ordering",1138],[6,"Option",1139],[1,"f32"],[1,"usize"],[6,"Result",1140],[10,"Deserializer",1141],[1,"bool"],[1,"str"],[5,"Formatter",1142],[8,"Result",1142],[5,"WidgetContext",1143],[5,"Error",1142],[5,"LabeledBoneKind",0],[1,"tuple"],[10,"Hasher",1144],[5,"Box",1145],[5,"Arc",1146],[5,"Rc",1147],[6,"ReadOnly",1148],[6,"Value",1148],[17,"Output"],[10,"FnMut",1149],[5,"ZeroToOne",1150],[10,"Into",1151],[10,"Serializer",1152],[5,"RangeInclusive",1153],[6,"Progress",1154],[5,"SmolStr",1155],[5,"String",1156],[5,"OutOfBounds",1157],[5,"TypeId",1135],[5,"Animation",705],[5,"Frame",705],[5,"Change",705],[6,"ChangeKind",705],[5,"Duration",1158],[5,"RunningAnimation",705],[6,"Cow",1159],[6,"StandardEasing",1160],[6,"Target",971],[6,"SkeletonMutation",971],[5,"SkeletonCanvas",971],[5,"Px",1161],[5,"Point",1162],[5,"EventContext",1143],[6,"CursorIcon",1163],[6,"ConstraintLimit",1164],[5,"Size",1165],[5,"LayoutContext",1143],[5,"UPx",1161],[5,"WidgetInstance",1166],[5,"WidgetTag",1166],[6,"DeviceId",1167],[6,"MouseButton",1168],[8,"EventHandling",1166],[5,"Dynamic",1148],[10,"Send",1169],[5,"WindowHandle",1167],[6,"EventLoopError",1170],[10,"Application",1171],[10,"Sized",1169],[5,"GraphicsContext",1143],[5,"PendingApp",1171],[15,"Jointed",701],[15,"Rigid",701],[15,"Bone",966],[15,"Joint",966],[15,"SetDesiredEnd",1130],[15,"SetJointRotation",1130]],"r":[],"b":[[30,"impl-Add-for-Coordinate"],[31,"impl-Add%3CVector%3E-for-Coordinate"],[290,"impl-Debug-for-Angle"],[292,"impl-Display-for-Angle"],[362,"impl-Index%3CJointId%3E-for-Skeleton"],[363,"impl-Index%3CBoneId%3E-for-Skeleton"],[366,"impl-IndexMut%3CBoneId%3E-for-Skeleton"],[367,"impl-IndexMut%3CJointId%3E-for-Skeleton"],[581,"impl-Sub-for-Coordinate"],[582,"impl-Sub%3CVector%3E-for-Coordinate"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAPQDHQATABAAJQAwAFsAZQDEAAMAyQAgAOwAGAAIARYAIgENADIBAAA1AQAAPgElAGUBAwBrAQEAbwENAIkBjQAgAgEAJQIBACsCAwAzAgoARgIEAEwCCABWAgEAWQJfAMICbgA0AwAANwMUAFEDvAARBA0AIgRMAA=="}]]'));
if (typeof exports !== 'undefined') exports.searchIndex = searchIndex;
else if (window.initSearch) window.initSearch(searchIndex);
+//{"start":39,"fragment_lengths":[4360,17353]}
\ 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
new file mode 100644
index 0000000..7960dd8
--- /dev/null
+++ b/main/search.desc/FunnyBones/FunnyBones-desc-0-.js
@@ -0,0 +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.\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/search.desc/funnybones/funnybones-desc-0-.js b/main/search.desc/funnybones/funnybones-desc-0-.js
index e700f1f..dd03ac7 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.\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 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.\nA single bone of a fixed length.\nA value representing a rotation between no rotation and a …\nA collection of Bone
s. connected by Joint
s.\nA two dimensionsional offset/measurement.\nReturns the rotation of this joint.\nReturns the first axis of this bone.\nReturns the second axis of this bone.\nThe unique id of the bone of this axis.\nReturns a rotation representing the given degrees.\nReturns the location this bone is being aimed towards.\nReturns the solved end position of this bone.\nThe end of the bone being referenced.\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.\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
.\nThe bone to create.\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.\nReturns the result of mapping x
and y
to f
.\nReturns a new vector from the x and y values.\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 a rotation representing the given radians.\nReturns the base rotation being applied to the entire …\nSets the angle to form between these joints.\nSets the location to aim the end of this bone towards.\nSets a base rotation to apply to the entire skeleton.\nSets a translation to be applied to the entire skeleton.\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.\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.\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, "FunnyBones is considered experimental and unsupported …\nThe first end of a bone.\nA value representing a direction.\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 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.\nThe unique id of the bone of this axis.\nReturns the list of bones in this skeleton.\nReturns a list of joints connected to a specific bone axis.\nReturns the cosine of this angle.\nWidgets for editing and rendering skeletons.\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 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)
.\nReturns the opposite axis on the same bone.\nReturns the opposite end of self
.\nReturns true if this bone is the root of the skeleton.\nReturns the list of joints in this skeleton.\nReturns the kind of this bone.\nThe bone to create.\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 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 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.\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
diff --git a/main/settings.html b/main/settings.html
index 64b7f77..3df7636 100644
--- a/main/settings.html
+++ b/main/settings.html
@@ -1 +1 @@
-Settings Rustdoc settings
Back
\ No newline at end of file
+Settings Rustdoc settings
Back
\ No newline at end of file
diff --git a/main/src-files.js b/main/src-files.js
index 1728f46..768fc28 100644
--- a/main/src-files.js
+++ b/main/src-files.js
@@ -1,4 +1,3 @@
-var srcIndex = new Map(JSON.parse('[\
-["funnybones",["",[],["animation.rs","lib.rs","serde.rs"]]]\
-]'));
+var srcIndex = new Map(JSON.parse('[["FunnyBones",["",[],["funnybones.rs"]]],["funnybones",["",[["cushy",[],["skeleton_canvas.rs"]]],["animation.rs","cushy.rs","lib.rs","serde.rs"]]]]'));
createSrcSidebar();
+//{"start":36,"fragment_lengths":[40,106]}
\ No newline at end of file
diff --git a/main/src/FunnyBones/funnybones.rs.html b/main/src/FunnyBones/funnybones.rs.html
new file mode 100644
index 0000000..6f5d5c1
--- /dev/null
+++ b/main/src/FunnyBones/funnybones.rs.html
@@ -0,0 +1,849 @@
+funnybones.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
+
//! The FunnyBones 2D Animation Editor.
+
+use std::ops::ControlFlow;
+
+use cushy::{
+ value::{Destination, Dynamic, DynamicRead, ForEach, Source, Switchable},
+ widget::{MakeWidget, WidgetList},
+ widgets::{checkbox::Checkable, input::InputValue, slider::Slidable, Space},
+ Run,
+};
+use funnybones::{
+ cushy::skeleton_canvas::{SkeletonCanvas, SkeletonMutation},
+ Angle, BoneAxis, BoneId, BoneKind, Joint, JointId, LabeledBoneKind, Skeleton, Vector,
+};
+
+#[derive(Default, Eq, PartialEq, Debug, Clone, Copy)]
+enum Mode {
+ #[default]
+ Bones,
+ Animation,
+}
+
+#[derive(Debug, Clone)]
+struct ChangeAggregator(Dynamic<usize>);
+
+impl ChangeAggregator {
+ pub fn new<F, T>(mut when_changed: F) -> (Self, Dynamic<T>)
+ where
+ F: FnMut() -> T + Send + 'static,
+ T: PartialEq + Send + 'static,
+ {
+ let counter = Dynamic::new(0);
+ let result = counter.map_each(move |_| when_changed());
+
+ (Self(counter), result)
+ }
+
+ pub fn watch<T>(&self, other: &Dynamic<T>)
+ where
+ T: Send + 'static,
+ {
+ let counter = self.0.clone();
+ other
+ .for_each_subsequent_generational(move |guard| {
+ drop(guard);
+ *counter.lock() += 1;
+ })
+ .persist();
+ }
+}
+
+// TODO we want joint labels here somehow
+fn add_bones_to_skeleton(
+ connected_to: BoneAxis,
+ bones: &Dynamic<Vec<SkeletalBone>>,
+ skeleton: &mut Skeleton,
+) {
+ let bones = bones.read();
+ for bone in &*bones {
+ let new_bone = skeleton.push_bone(bone.as_bone_kind());
+ if let Some(desired_end) = bone.desired_end.get() {
+ skeleton[new_bone].set_desired_end(Some(desired_end));
+ }
+ skeleton.push_joint(
+ Joint::new(bone.joint_angle.get(), connected_to, new_bone.axis_a())
+ .with_label(bone.joint_label.get()),
+ );
+ add_bones_to_skeleton(new_bone.axis_b(), &bone.connected_bones, skeleton);
+ }
+}
+
+fn main() -> anyhow::Result<()> {
+ let editing_skeleton = EditingSkeleton::default();
+ let (watcher, skeleton) = ChangeAggregator::new({
+ let editing_skeleton = editing_skeleton.clone();
+ move || {
+ let mut skeleton = Skeleton::default();
+ let root = skeleton.push_bone(editing_skeleton.root.as_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 mode = Dynamic::<Mode>::default();
+
+ [(Mode::Bones, "Bones"), (Mode::Animation, "Animation")]
+ .into_iter()
+ .map(|(selected, label)| mode.new_select(selected, label))
+ .collect::<WidgetList>()
+ .into_columns()
+ .centered()
+ .and(
+ mode.switcher(move |mode, _mode_dynamic| match mode {
+ Mode::Animation => "Animation Editor".make_widget(),
+ Mode::Bones => bones_editor.clone(),
+ })
+ .expand(),
+ )
+ .into_rows()
+ .expand()
+ .and(
+ SkeletonCanvas::new(skeleton)
+ .on_mutate({
+ move |mutation| match mutation {
+ SkeletonMutation::SetDesiredEnd { bone, end } => editing_skeleton
+ .find_bone(bone)
+ .expect("missing bone")
+ .desired_end
+ .set(Some(end)),
+ SkeletonMutation::SetJointRotation { joint, rotation } => editing_skeleton
+ .find_joint(joint)
+ .expect("missing joint")
+ .joint_angle
+ .set(rotation),
+ }
+ })
+ .expand(),
+ )
+ .into_columns()
+ .run()?;
+ Ok(())
+}
+
+#[derive(Clone, Debug, PartialEq, Default)]
+struct EditingSkeleton {
+ root: SkeletalBone,
+ a_bones: Dynamic<Vec<SkeletalBone>>,
+}
+
+impl EditingSkeleton {
+ 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)
+ }
+}
+
+#[derive(Clone, Debug, PartialEq)]
+struct SkeletalBone {
+ label: Dynamic<String>,
+ joint_label: Dynamic<String>,
+ joint_angle: Dynamic<Angle>,
+ length: Dynamic<f32>,
+ jointed: Dynamic<Option<f32>>,
+ inverse: Dynamic<bool>,
+ desired_end: Dynamic<Option<Vector>>,
+ connected_bones: Dynamic<Vec<SkeletalBone>>,
+}
+
+impl SkeletalBone {
+ pub fn as_bone_kind(&self) -> LabeledBoneKind {
+ match self.jointed.get() {
+ Some(joint) => BoneKind::Jointed {
+ start_length: self.length.get(),
+ end_length: joint,
+ inverse: self.inverse.get(),
+ },
+ None => BoneKind::Rigid {
+ length: self.length.get(),
+ },
+ }
+ .with_label(self.label.get())
+ }
+}
+
+impl Default for SkeletalBone {
+ fn default() -> Self {
+ Self {
+ joint_label: Dynamic::default(),
+ joint_angle: Dynamic::new(Angle::degrees(90.)),
+ label: Dynamic::default(),
+ length: Dynamic::new(1.),
+ jointed: Dynamic::default(),
+ inverse: Dynamic::default(),
+ desired_end: Dynamic::default(),
+ connected_bones: Dynamic::default(),
+ }
+ }
+}
+
+fn skeleton_editor(skeleton: &EditingSkeleton, watcher: &ChangeAggregator) -> 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: &ChangeAggregator,
+) -> 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: &ChangeAggregator) -> 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: &ChangeAggregator,
+ 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.desired_end);
+ let (second, jointed) = if let Some(length) = bone.jointed.get() {
+ (length, true)
+ } else {
+ (1., false)
+ };
+ let jointed = Dynamic::new(jointed);
+
+ 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 second = Dynamic::new(second.to_string());
+ let second_parsed = second.map_each(|s| s.parse::<f32>());
+ (&jointed, &second_parsed)
+ .for_each(move |(jointed, result)| {
+ if *jointed {
+ let Ok(new_value) = result else { return };
+ bone.jointed.set(Some(*new_value));
+ } else {
+ bone.jointed.set(None);
+ }
+ })
+ .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 = jointed.clone().into_checkbox("Jointed");
+
+ let rotation = bone.joint_angle.slider();
+
+ let joint_row = "Second Bone Segment Length"
+ .align_left()
+ .and(
+ second
+ .into_input()
+ .with_enabled(jointed.clone())
+ .validation(second_parsed),
+ )
+ .into_rows()
+ .fit_horizontally()
+ .align_top()
+ .expand()
+ .and(
+ bone.inverse
+ .into_checkbox("Inverse")
+ .with_enabled(jointed.clone())
+ .fit_horizontally(),
+ )
+ .and(Space::clear().expand_weighted(2))
+ .into_columns()
+ .make_widget();
+
+ let non_joint_row = "Joint Angle"
+ .align_left()
+ .and(rotation)
+ .into_rows()
+ .expand()
+ .and(Space::clear().expand_weighted(4))
+ .into_columns()
+ .make_widget();
+
+ let second_row = if is_root {
+ joint_row
+ .collapse_vertically(jointed.map_each_cloned(|j| !j))
+ .make_widget()
+ } else {
+ jointed
+ .clone()
+ .switcher(move |jointed, _| {
+ if *jointed {
+ joint_row.clone()
+ } else {
+ non_joint_row.clone()
+ }
+ })
+ .make_widget()
+ };
+
+ "Joint Name"
+ .align_left()
+ .and(joint_label_editor)
+ .into_rows()
+ .fit_horizontally()
+ .align_top()
+ .expand()
+ .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/animation.rs.html b/main/src/funnybones/animation.rs.html
index 4ce61d1..efb3209 100644
--- a/main/src/funnybones/animation.rs.html
+++ b/main/src/funnybones/animation.rs.html
@@ -1,4 +1,4 @@
-animation.rs - source 1
+animation.rs - source #![allow(missing_docs)]
use std::{
borrow::Cow,
@@ -323,9 +324,10 @@
time::Duration,
};
+use cushy::animation::LinearInterpolate;
use easing_function::{easings::StandardEasing, Easing};
-use crate::{BoneId, JointId, Rotation, Skeleton, Vector};
+use crate::{Angle, BoneId, Coordinate, JointId, Skeleton, Vector};
#[derive(Default, Debug, PartialEq, Clone)]
pub struct Animation(Arc<AnimationData>);
@@ -483,7 +485,7 @@
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ChangeKind {
Bone { bone: BoneId, position: Vector },
- Joint { joint: JointId, rotation: Rotation },
+ Joint { joint: JointId, rotation: Angle },
}
impl ChangeKind {
@@ -494,7 +496,7 @@
}
enum OriginalProperty {
- Rotation(Rotation),
+ Rotation(Angle),
Vector(Vector),
}
@@ -553,9 +555,9 @@
self.frame_props.reserve(frame.changes.len());
for change in &frame.changes {
self.frame_props.push(match change.kind {
- ChangeKind::Bone { bone, .. } => {
- OriginalProperty::Vector(skeleton[bone].end())
- }
+ ChangeKind::Bone { bone, .. } => OriginalProperty::Vector(
+ skeleton[bone].start().vector_to(skeleton[bone].end()),
+ ),
ChangeKind::Joint { joint, .. } => {
OriginalProperty::Rotation(skeleton[joint].angle())
@@ -575,7 +577,7 @@
},
OriginalProperty::Vector(original),
) => {
- skeleton[bone].set_desired_end(Some(original.lerp(target, factor)));
+ skeleton[bone].set_desired_end(Some(original.lerp(&target, factor)));
}
(
ChangeKind::Joint {
@@ -584,7 +586,7 @@
},
OriginalProperty::Rotation(original),
) => {
- skeleton[joint].set_angle(original.lerp(target, factor));
+ skeleton[joint].set_angle(original.lerp(&target, factor));
}
_ => unreachable!(),
}
@@ -606,16 +608,16 @@
}
}
-impl Lerp for Vector {
+impl Lerp for Coordinate {
fn lerp(self, target: Self, percent: f32) -> Self {
- Vector::new(
+ Coordinate::new(
self.x.lerp(target.x, percent),
self.y.lerp(target.y, percent),
)
}
}
-impl Lerp for Rotation {
+impl Lerp for Angle {
fn lerp(self, target: Self, percent: f32) -> Self {
let delta_neg = self.radians - target.radians;
let delta_pos = target.radians - self.radians;
diff --git a/main/src/funnybones/cushy.rs.html b/main/src/funnybones/cushy.rs.html
new file mode 100644
index 0000000..075b18c
--- /dev/null
+++ b/main/src/funnybones/cushy.rs.html
@@ -0,0 +1,101 @@
+cushy.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
+
//! Widgets for editing and rendering skeletons.
+
+use cushy::{
+ animation::{LinearInterpolate, PercentBetween},
+ figures::{IntoComponents, Ranged},
+};
+
+use crate::{Angle, Coordinate, Vector};
+
+pub mod skeleton_canvas;
+
+impl PercentBetween for Angle {
+ fn percent_between(&self, min: &Self, max: &Self) -> cushy::animation::ZeroToOne {
+ self.radians.percent_between(&min.radians, &max.radians)
+ }
+}
+
+impl LinearInterpolate for Angle {
+ fn lerp(&self, target: &Self, percent: f32) -> Self {
+ Self {
+ radians: self.radians.lerp(&target.radians, percent),
+ }
+ }
+}
+
+impl LinearInterpolate for Vector {
+ fn lerp(&self, target: &Self, percent: f32) -> Self {
+ Self {
+ magnitude: self.magnitude.lerp(&target.magnitude, percent),
+ direction: self.direction.lerp(&target.direction, percent),
+ }
+ }
+}
+
+impl IntoComponents<f32> for Coordinate {
+ fn into_components(self) -> (f32, f32) {
+ (self.x, self.y)
+ }
+}
+
+impl cushy::figures::FromComponents<f32> for Coordinate {
+ fn from_components(components: (f32, f32)) -> Self {
+ Self::new(components.0, components.1)
+ }
+}
+
+impl Ranged for Angle {
+ const MIN: Self = Self::MIN;
+ const MAX: Self = Self::MAX;
+}
+
\ No newline at end of file
diff --git a/main/src/funnybones/cushy/skeleton_canvas.rs.html b/main/src/funnybones/cushy/skeleton_canvas.rs.html
new file mode 100644
index 0000000..73e0723
--- /dev/null
+++ b/main/src/funnybones/cushy/skeleton_canvas.rs.html
@@ -0,0 +1,705 @@
+skeleton_canvas.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
+
#![allow(missing_docs)]
+use core::f32;
+
+use crate::{Angle, BoneEnd, BoneId, Coordinate, JointId, Skeleton, Vector};
+use cushy::{
+ context::{EventContext, GraphicsContext, LayoutContext},
+ figures::{
+ units::{Px, UPx},
+ FloatConversion, IntoComponents, Point, Round, Size,
+ },
+ kludgine::{
+ app::winit::{event::MouseButton, window::CursorIcon},
+ shapes::{PathBuilder, Shape, StrokeOptions},
+ DrawableExt, Origin,
+ },
+ styles::Color,
+ value::{Dynamic, DynamicRead},
+ widget::{Callback, EventHandling, Widget, HANDLED, IGNORED},
+ window::DeviceId,
+ ConstraintLimit,
+};
+
+#[derive(Debug)]
+pub struct SkeletonCanvas {
+ skeleton: Dynamic<Skeleton>,
+ hovering: Option<Target>,
+ scale: f32,
+ maximum_scale: f32,
+ offset: Point<Px>,
+ drag: Option<DragInfo>,
+ on_mutate: Option<Callback<SkeletonMutation>>,
+}
+
+impl SkeletonCanvas {
+ #[must_use]
+ pub fn new(skeleton: Dynamic<Skeleton>) -> Self {
+ Self {
+ skeleton,
+ hovering: None,
+ scale: f32::MAX,
+ maximum_scale: 0.,
+ offset: Point::default(),
+ drag: None,
+ on_mutate: None,
+ }
+ }
+
+ #[must_use]
+ pub fn on_mutate<F>(mut self, on_mutate: F) -> Self
+ where
+ F: FnMut(SkeletonMutation) + Send + 'static,
+ {
+ self.on_mutate = Some(Callback::new(on_mutate));
+ self
+ }
+
+ fn vector_position(&self, vector: Coordinate) -> Point<Px> {
+ (vector * self.scale).to_vec::<Point<f32>>().map(Px::from) + self.offset
+ }
+
+ fn position_to_vector(&self, position: Point<Px>) -> Coordinate {
+ (position - self.offset)
+ .map(FloatConversion::into_float)
+ .to_vec::<Coordinate>()
+ / self.scale
+ }
+}
+
+impl Widget for SkeletonCanvas {
+ fn redraw(&mut self, context: &mut GraphicsContext<'_, '_, '_, '_>) {
+ context.redraw_when_changed(&self.skeleton);
+ let mut skeleton = self.skeleton.lock();
+ skeleton.prevent_notifications();
+ if skeleton.bones().is_empty() {
+ return;
+ }
+ skeleton.solve();
+ let root_start = skeleton.bones()[0].start();
+ let (min, max) = skeleton.bones().iter().fold(
+ (Coordinate::new(f32::MAX, f32::MAX), Coordinate::default()),
+ |(min, max), bone| {
+ let start = bone.start() - root_start;
+ let end = bone.end() - root_start;
+ (
+ Coordinate::new(min.x.min(start.x).min(end.x), min.y.min(start.y).min(end.y)),
+ Coordinate::new(max.x.max(start.x).max(end.x), max.y.max(start.y).max(end.y)),
+ )
+ },
+ );
+
+ let skeleton_extent =
+ Coordinate::new(min.x.abs().max(max.x.abs()), min.y.abs().max(max.y.abs()));
+
+ let middle = context.gfx.size().into_float().to_vec::<Coordinate>() / 2.;
+ let height_ratio = middle.y / skeleton_extent.y;
+ let width_ratio = middle.x / skeleton_extent.x;
+ let zero_width = width_ratio.is_nan();
+ let zero_height = height_ratio.is_nan();
+ if zero_height && zero_width {
+ return;
+ }
+
+ self.maximum_scale = if zero_height || width_ratio < height_ratio {
+ width_ratio
+ } else {
+ height_ratio
+ };
+ if self.scale > self.maximum_scale {
+ self.scale = self.maximum_scale;
+ }
+ let root = root_start * self.scale;
+
+ self.offset = (middle - root).to_vec::<Point<f32>>().map(Px::from).floor();
+
+ let selected = self.drag.as_ref().map_or(self.hovering, |d| Some(d.target));
+
+ for bone in skeleton.bones() {
+ let path = if let Some(joint) = bone.solved_joint() {
+ let joint = self.vector_position(joint);
+ context.gfx.draw_shape(
+ Shape::filled_circle(Px::new(4), Color::WHITE, Origin::Center)
+ .translate_by(joint),
+ );
+ PathBuilder::new(self.vector_position(bone.start()))
+ .line_to(joint)
+ .line_to(self.vector_position(bone.end()))
+ .build()
+ } else {
+ PathBuilder::new(self.vector_position(bone.start()))
+ .line_to(self.vector_position(bone.end()))
+ .build()
+ };
+ let (selected, stroke) = match selected {
+ Some(Target::DesiredEnd(id)) if id == bone.id() => {
+ (true, StrokeOptions::px_wide(2).colored(Color::RED))
+ }
+ Some(Target::Joint(joint)) if skeleton[joint].bone_b == bone.id().axis_a() => {
+ (true, StrokeOptions::px_wide(2).colored(Color::RED))
+ }
+ Some(Target::Joint(joint)) if skeleton[joint].bone_a.bone == bone.id() => {
+ (false, StrokeOptions::px_wide(2).colored(Color::BLUE))
+ }
+ _ => (false, StrokeOptions::px_wide(1).colored(Color::WHITE)),
+ };
+ context.gfx.draw_shape(&path.stroke(stroke));
+
+ if selected {
+ let end = if let Some(desired_end) =
+ bone.solved_joint().and_then(|_| bone.desired_end())
+ {
+ bone.start() + (desired_end + bone.entry_angle())
+ } else {
+ bone.end()
+ };
+ let end = self.vector_position(end);
+
+ context.gfx.draw_shape(
+ Shape::filled_circle(Px::new(10), stroke.color, Origin::Center)
+ .translate_by(end),
+ );
+ }
+ }
+ }
+
+ fn layout(
+ &mut self,
+ available_space: Size<ConstraintLimit>,
+ _context: &mut LayoutContext<'_, '_, '_, '_>,
+ ) -> Size<UPx> {
+ available_space.map(ConstraintLimit::max)
+ }
+
+ fn hover(&mut self, location: Point<Px>, context: &mut EventContext<'_>) -> Option<CursorIcon> {
+ let location = self.position_to_vector(location);
+ let skeleton = self.skeleton.read();
+ let mut closest_match = 0.1;
+ let current_hover = self.hovering.take();
+ for bone in skeleton.bones() {
+ let mut distance = (location - bone.end()).magnitude() / 10.;
+ if let Some(mid) = bone.solved_joint() {
+ // This can have its desired_end set
+ distance = distance.min(
+ distance_to_line(location, bone.start(), mid).min(distance_to_line(
+ location,
+ mid,
+ bone.end(),
+ )),
+ );
+ if let Some(desired_end) = bone.desired_end() {
+ distance = distance.min((location - desired_end).magnitude());
+ }
+
+ if distance < closest_match {
+ closest_match = distance;
+ self.hovering = Some(Target::DesiredEnd(bone.id()));
+ }
+ } else if !bone.is_root() {
+ // Single line segment
+ let distance = distance_to_line(location, bone.start(), bone.end());
+ if distance < closest_match {
+ closest_match = distance;
+ // For a non-jointed bone, interacting with it adjusts the
+ // joint angle.
+ if let Some(joint) = skeleton
+ .connections_to(bone.id().axis_a())
+ .and_then(|joints| joints.first())
+ {
+ self.hovering = Some(Target::Joint(*joint));
+ }
+ }
+ }
+ }
+
+ if self.hovering != current_hover {
+ context.set_needs_redraw();
+ }
+
+ None
+ }
+
+ fn unhover(&mut self, context: &mut EventContext<'_>) {
+ if self.hovering.take().is_some() {
+ context.set_needs_redraw();
+ }
+ }
+
+ fn mouse_down(
+ &mut self,
+ location: Point<Px>,
+ _device_id: DeviceId,
+ _button: MouseButton,
+ _context: &mut EventContext<'_>,
+ ) -> EventHandling {
+ if let Some(target) = self.hovering {
+ self.drag = Some(DragInfo {
+ target,
+ last: self.position_to_vector(location),
+ });
+ HANDLED
+ } else {
+ IGNORED
+ }
+ }
+
+ fn mouse_drag(
+ &mut self,
+ location: Point<Px>,
+ _device_id: DeviceId,
+ _button: MouseButton,
+ _context: &mut EventContext<'_>,
+ ) {
+ let location = self.position_to_vector(location);
+ if let Some(drag) = &mut self.drag {
+ let delta = location - drag.last;
+ if delta.magnitude() > f32::EPSILON {
+ drag.last = location;
+ match drag.target {
+ Target::Joint(joint_id) => {
+ // Calculate the angle needed to make the second bone's
+ // line pass through location.
+ let mut skeleton = self.skeleton.lock();
+ if skeleton.generation == 0 {
+ skeleton.solve();
+ }
+ let joint = &skeleton[joint_id];
+ let bone_a = &skeleton[joint.bone_a.bone];
+ let bone_b = &skeleton[joint.bone_b.bone];
+ let bone_a_rotation = bone_b.entry_angle();
+ let start = bone_a.solved_joint().unwrap_or_else(|| bone_a.start());
+ let end = match joint.bone_a.end {
+ BoneEnd::A => start,
+ BoneEnd::B => bone_a.end(),
+ };
+ let new_bone_rotation = (location - end).as_rotation();
+ let rotation = new_bone_rotation - bone_a_rotation;
+ drop(skeleton);
+
+ if let Some(on_mutate) = &mut self.on_mutate {
+ on_mutate.invoke(SkeletonMutation::SetJointRotation {
+ joint: joint_id,
+ rotation,
+ });
+ }
+ }
+ Target::DesiredEnd(bone) => {
+ if let Some(on_mutate) = &mut self.on_mutate {
+ let mut skeleton = self.skeleton.lock();
+ if skeleton.generation == 0 {
+ skeleton.solve();
+ }
+ let end = Vector::from(location - skeleton[bone].start())
+ - skeleton[bone].entry_angle();
+ drop(skeleton);
+ on_mutate.invoke(SkeletonMutation::SetDesiredEnd { bone, end });
+ }
+ }
+ }
+ }
+ }
+ }
+
+ fn mouse_up(
+ &mut self,
+ _location: Option<Point<Px>>,
+ _device_id: DeviceId,
+ _button: MouseButton,
+ _context: &mut EventContext<'_>,
+ ) {
+ self.drag = None;
+ }
+
+ fn hit_test(&mut self, _location: Point<Px>, _context: &mut EventContext<'_>) -> bool {
+ true
+ }
+}
+
+fn distance_to_line(test: Coordinate, p1: Coordinate, p2: Coordinate) -> f32 {
+ let delta = p2 - p1;
+ let segment_length = delta.magnitude();
+
+ let p1_distance = (test - p1).magnitude();
+ let p2_distance = (test - p2).magnitude();
+
+ match (p1_distance >= segment_length, p2_distance >= segment_length) {
+ (true, true) => p1_distance.min(p2_distance),
+ (true, false) => p2_distance,
+ (false, true) => p1_distance,
+ _ => {
+ let numerator = delta.y * test.x - delta.x * test.y + p2.x * p1.y - p2.y * p1.x;
+
+ numerator.abs() / segment_length
+ }
+ }
+}
+
+#[derive(Debug, Clone, Copy, Eq, PartialEq)]
+pub enum Target {
+ Joint(JointId),
+ DesiredEnd(BoneId),
+}
+
+#[derive(Debug)]
+struct DragInfo {
+ target: Target,
+ last: Coordinate,
+}
+
+#[derive(Clone, Copy, Debug, PartialEq)]
+pub enum SkeletonMutation {
+ SetDesiredEnd { bone: BoneId, end: Vector },
+ SetJointRotation { joint: JointId, rotation: Angle },
+}
+
\ No newline at end of file
diff --git a/main/src/funnybones/lib.rs.html b/main/src/funnybones/lib.rs.html
index 4d01654..d0a6962 100644
--- a/main/src/funnybones/lib.rs.html
+++ b/main/src/funnybones/lib.rs.html
@@ -1,4 +1,4 @@
-lib.rs - source 1
+lib.rs - source 1
2
3
4
@@ -773,6 +773,193 @@
773
774
775
+776
+777
+778
+779
+780
+781
+782
+783
+784
+785
+786
+787
+788
+789
+790
+791
+792
+793
+794
+795
+796
+797
+798
+799
+800
+801
+802
+803
+804
+805
+806
+807
+808
+809
+810
+811
+812
+813
+814
+815
+816
+817
+818
+819
+820
+821
+822
+823
+824
+825
+826
+827
+828
+829
+830
+831
+832
+833
+834
+835
+836
+837
+838
+839
+840
+841
+842
+843
+844
+845
+846
+847
+848
+849
+850
+851
+852
+853
+854
+855
+856
+857
+858
+859
+860
+861
+862
+863
+864
+865
+866
+867
+868
+869
+870
+871
+872
+873
+874
+875
+876
+877
+878
+879
+880
+881
+882
+883
+884
+885
+886
+887
+888
+889
+890
+891
+892
+893
+894
+895
+896
+897
+898
+899
+900
+901
+902
+903
+904
+905
+906
+907
+908
+909
+910
+911
+912
+913
+914
+915
+916
+917
+918
+919
+920
+921
+922
+923
+924
+925
+926
+927
+928
+929
+930
+931
+932
+933
+934
+935
+936
+937
+938
+939
+940
+941
+942
+943
+944
+945
+946
+947
+948
+949
+950
+951
+952
+953
+954
+955
+956
+957
+958
+959
+960
+961
+962
#![doc = include_str!(".crate-docs.md")]
use std::{
@@ -780,25 +967,28 @@
collections::{HashMap, HashSet},
f32::consts::PI,
fmt::{Debug, Display},
- ops::{Add, Deref, Index, IndexMut, Neg, Sub},
+ ops::{Add, AddAssign, Deref, Div, Index, IndexMut, Mul, Neg, Sub, SubAssign},
sync::Arc,
+ vec::Vec,
};
pub mod animation;
+#[cfg(feature = "cushy")]
+pub mod cushy;
#[cfg(feature = "serde")]
mod serde;
/// A two dimensionsional offset/measurement.
#[derive(Default, Clone, Copy, PartialEq, Debug)]
#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))]
-pub struct Vector {
+pub struct Coordinate {
/// The x-axis component of this vector.
pub x: f32,
/// The y-axis component of this vector.
pub y: f32,
}
-impl Vector {
+impl Coordinate {
/// Returns a new vector from the x and y values.
#[must_use]
pub const fn new(x: f32, y: f32) -> Self {
@@ -819,9 +1009,32 @@
y: f(self.y),
}
}
+
+ /// Returns the angle formed a line passing through 0,0 towards this vector.
+ #[must_use]
+ pub fn as_rotation(self) -> Angle {
+ Angle::radians(self.y.atan2(self.x))
+ }
+
+ /// Returns a vector pointing from `self` to `other`.
+ #[must_use]
+ pub fn vector_to(self, other: Coordinate) -> Vector {
+ Vector::from(other - self)
+ }
+}
+
+impl Add for Coordinate {
+ type Output = Self;
+
+ fn add(self, rhs: Self) -> Self::Output {
+ Self {
+ x: self.x + rhs.x,
+ y: self.y + rhs.y,
+ }
+ }
}
-impl Sub for Vector {
+impl Sub for Coordinate {
type Output = Self;
fn sub(self, rhs: Self) -> Self::Output {
@@ -832,28 +1045,43 @@
}
}
-#[cfg(feature = "cushy")]
-impl cushy::figures::IntoComponents<f32> for Vector {
- fn into_components(self) -> (f32, f32) {
- (self.x, self.y)
+impl Mul<f32> for Coordinate {
+ type Output = Self;
+
+ fn mul(self, rhs: f32) -> Self::Output {
+ Self {
+ x: self.x * rhs,
+ y: self.y * rhs,
+ }
}
}
-#[cfg(feature = "cushy")]
-impl cushy::figures::FromComponents<f32> for Vector {
- fn from_components(components: (f32, f32)) -> Self {
- Self::new(components.0, components.1)
+impl Div<f32> for Coordinate {
+ type Output = Self;
+
+ fn div(self, rhs: f32) -> Self::Output {
+ Self {
+ x: self.x / rhs,
+ y: self.y / rhs,
+ }
}
}
-/// A value representing a rotation between no rotation and a full rotation.
+/// A value representing a direction.
#[derive(Clone, Copy, PartialEq, PartialOrd)]
#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))]
-pub struct Rotation {
+pub struct Angle {
radians: f32,
}
-impl Rotation {
+impl Angle {
+ /// The minimum rotation represented by this type.
+ pub const MIN: Self = Self { radians: 0. };
+ /// The maximum rotation represented by this type.
+ pub const MAX: Self = Self {
+ radians: PI * 2. - f32::EPSILON,
+ };
+
/// Returns a rotation representing the given radians.
#[must_use]
pub fn radians(radians: f32) -> Self {
@@ -894,43 +1122,39 @@
}
self
}
-}
-#[cfg(feature = "cushy")]
-impl cushy::animation::PercentBetween for Rotation {
- fn percent_between(&self, min: &Self, max: &Self) -> cushy::animation::ZeroToOne {
- self.radians.percent_between(&min.radians, &max.radians)
+ /// Returns the cosine of this angle.
+ #[must_use]
+ pub fn cos(self) -> f32 {
+ self.radians.cos()
}
-}
-#[cfg(feature = "cushy")]
-impl cushy::animation::LinearInterpolate for Rotation {
- fn lerp(&self, target: &Self, percent: f32) -> Self {
- Self {
- radians: self.radians.lerp(&target.radians, percent),
- }
+ /// Returns the sine of this angle.
+ #[must_use]
+ pub fn sin(self) -> f32 {
+ self.radians.sin()
}
}
-impl Debug for Rotation {
+impl Debug for Angle {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
Display::fmt(self, f)
}
}
-impl Display for Rotation {
+impl Display for Angle {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}°", self.to_degrees())
}
}
-impl Default for Rotation {
+impl Default for Angle {
fn default() -> Self {
Self { radians: 0. }
}
}
-impl Add for Rotation {
+impl Add for Angle {
type Output = Self;
fn add(self, rhs: Self) -> Self::Output {
@@ -938,7 +1162,13 @@
}
}
-impl Sub for Rotation {
+impl AddAssign for Angle {
+ fn add_assign(&mut self, rhs: Self) {
+ self.radians = (*self + rhs).radians;
+ }
+}
+
+impl Sub for Angle {
type Output = Self;
fn sub(self, rhs: Self) -> Self::Output {
@@ -946,7 +1176,13 @@
}
}
-impl Neg for Rotation {
+impl SubAssign for Angle {
+ fn sub_assign(&mut self, rhs: Self) {
+ self.radians = (*self - rhs).radians;
+ }
+}
+
+impl Neg for Angle {
type Output = Self;
fn neg(self) -> Self::Output {
@@ -954,6 +1190,79 @@
}
}
+/// A 2D Euclidean vector.
+#[derive(Clone, Copy, PartialEq, Debug, Default)]
+#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))]
+pub struct Vector {
+ /// The length of the vector.
+ pub magnitude: f32,
+ /// The direction the vector is heading.
+ pub direction: Angle,
+}
+
+impl Vector {
+ /// Returns a new vector for the given magnitude and direction.
+ #[must_use]
+ pub const fn new(magnitude: f32, direction: Angle) -> Self {
+ Self {
+ magnitude,
+ direction,
+ }
+ }
+}
+
+impl From<Vector> for Coordinate {
+ fn from(vec: Vector) -> Self {
+ Self {
+ x: vec.magnitude * vec.direction.cos(),
+ y: vec.magnitude * vec.direction.sin(),
+ }
+ }
+}
+
+impl From<Coordinate> for Vector {
+ fn from(pt: Coordinate) -> Self {
+ Self {
+ direction: pt.as_rotation(),
+ magnitude: pt.magnitude(),
+ }
+ }
+}
+
+impl Add<Vector> for Coordinate {
+ type Output = Self;
+
+ fn add(self, rhs: Vector) -> Self::Output {
+ self + Coordinate::from(rhs)
+ }
+}
+
+impl Sub<Vector> for Coordinate {
+ type Output = Self;
+
+ fn sub(self, rhs: Vector) -> Self::Output {
+ self - Coordinate::from(rhs)
+ }
+}
+
+impl Add<Angle> for Vector {
+ type Output = Self;
+
+ fn add(mut self, rhs: Angle) -> Self::Output {
+ self.direction += rhs;
+ self
+ }
+}
+
+impl Sub<Angle> for Vector {
+ type Output = Self;
+
+ fn sub(mut self, rhs: Angle) -> Self::Output {
+ self.direction -= rhs;
+ self
+ }
+}
+
/// A representation of a bone structure inside of a [`Skeleton`].
#[derive(Debug, Clone, Copy, PartialEq)]
#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))]
@@ -987,6 +1296,19 @@
label: label.into(),
}
}
+
+ /// Returns the full length of this bone.
+ #[must_use]
+ pub fn full_length(&self) -> f32 {
+ match self {
+ BoneKind::Rigid { length } => *length,
+ BoneKind::Jointed {
+ start_length,
+ end_length,
+ ..
+ } => *start_length + *end_length,
+ }
+ }
}
/// A [`BoneKind`] with an associated label.
@@ -1027,10 +1349,10 @@
}
/// A collection of [`Bone`]s. connected by [`Joint`]s.
-#[derive(Default, Debug)]
+#[derive(Default, Debug, PartialEq)]
pub struct Skeleton {
- initial_joint: Option<JointId>,
bones: Vec<Bone>,
+ rotation: Angle,
joints: Vec<Joint>,
connections: HashMap<BoneAxis, Vec<JointId>>,
generation: usize,
@@ -1047,12 +1369,8 @@
/// [`Joint`]s.
pub fn push_bone(&mut self, bone: impl Into<LabeledBoneKind>) -> BoneId {
let bone = bone.into();
- let id = BoneId(u8::try_from(self.bones.len()).expect("too many bones"));
- if id == BoneId(0) {
- let joint = self.push_joint(Joint::new(Rotation::default(), id.axis_a(), id.axis_a()));
- self.initial_joint = Some(joint);
- self.connections.insert(id.axis_a(), vec![joint]);
- }
+ let id = BoneId(u16::try_from(self.bones.len()).expect("too many bones"));
+
let label = if bone.label.is_empty() {
None
} else {
@@ -1061,21 +1379,42 @@
Some(label)
};
self.bones.push(Bone {
+ id,
generation: self.generation,
label,
kind: bone.kind,
- start: Vector::default(),
+ start: Coordinate::default(),
joint_pos: None,
- end: Vector::default(),
+ end: Coordinate::default(),
desired_end: None,
+ entry_angle: Angle::default(),
});
id
}
+ /// Returns the list of bones in this skeleton.
+ #[must_use]
+ pub fn bones(&self) -> &[Bone] {
+ &self.bones
+ }
+
+ /// Returns the list of joints in this skeleton.
+ #[must_use]
+ pub fn joints(&self) -> &[Joint] {
+ &self.joints
+ }
+
+ /// Returns a list of joints connected to a specific bone axis.
+ #[must_use]
+ pub fn connections_to(&self, axis: BoneAxis) -> Option<&[JointId]> {
+ self.connections.get(&axis).map(Vec::as_slice)
+ }
+
/// Creates a new [`Joint`] in the skeleton, connecting two bones together
/// by their [axis](BoneAxis). Returns the unique id of the created joint.
- pub fn push_joint(&mut self, joint: Joint) -> JointId {
- let id = JointId(u8::try_from(self.joints.len()).expect("too many joints"));
+ pub fn push_joint(&mut self, mut joint: Joint) -> JointId {
+ let id = JointId(u16::try_from(self.joints.len()).expect("too many joints"));
+ joint.id = id;
let bone_a = joint.bone_a;
let bone_b = joint.bone_b;
if let Some(label) = joint.label.clone() {
@@ -1102,29 +1441,26 @@
}
/// Sets a translation to be applied to the entire skeleton.
- pub fn set_translation(&mut self, translation: Vector) {
+ pub fn set_translation(&mut self, translation: Coordinate) {
let bone = self.bones.first_mut().expect("root bone must be defined");
bone.start = translation;
}
/// Returns the translation applied to the entire skeleton.
#[must_use]
- pub fn translation(&self) -> Vector {
+ pub fn translation(&self) -> Coordinate {
self.bones.first().expect("root bone must be defined").start
}
/// Sets a base rotation to apply to the entire skeleton.
- pub fn set_rotation(&mut self, rotation: Rotation) {
- let joint = self.initial_joint.expect("root bone must be defined");
- let joint = &mut self[joint];
- joint.angle = rotation;
+ pub fn set_rotation(&mut self, rotation: Angle) {
+ self.rotation = rotation;
}
/// Returns the base rotation being applied to the entire skeleton.
#[must_use]
- pub fn rotation(&self) -> Rotation {
- let joint = self.initial_joint.expect("root bone must be defined");
- self[joint].angle
+ pub const fn rotation(&self) -> Angle {
+ self.rotation
}
/// Updates the solved positions of all bones in this skeleton that are
@@ -1132,14 +1468,34 @@
pub fn solve(&mut self) {
if !self.bones.is_empty() {
self.generation = self.generation.wrapping_add(1);
- self.solve_axis(BoneId(0).axis_a());
+ self.solve_axis();
}
}
- fn solve_axis(&mut self, axis: BoneAxis) {
+ fn solve_axis(&mut self) {
let mut axis_solved = HashSet::new();
- let mut to_solve = vec![(axis, None, Rotation::default(), false)];
- while let Some((axis, current_position, current_rotation, inverse_root)) = to_solve.pop() {
+ let root_bone = &mut self.bones[0];
+ let (end, mid) = determine_end_position(
+ root_bone.start,
+ root_bone.desired_end,
+ self.rotation,
+ Angle::radians(0.),
+ &root_bone.kind,
+ );
+ root_bone.entry_angle = self.rotation;
+ root_bone.end = end;
+ root_bone.joint_pos = mid;
+ let angle = root_bone.final_vector().direction;
+
+ let mut to_solve = vec![
+ (
+ root_bone.id.axis_a(),
+ root_bone.start,
+ angle + Angle::radians(PI),
+ ),
+ (root_bone.id.axis_b(), root_bone.end, angle),
+ ];
+ while let Some((axis, current_position, current_rotation)) = to_solve.pop() {
if !axis_solved.insert(axis) {
continue;
}
@@ -1149,120 +1505,83 @@
};
println!(
- "Solving {}:{:?} at {current_position:?} - {current_rotation} - {inverse_root}",
- self.bones[usize::from(axis.bone.0)].label(),
- axis.end
+ "Solving {axis:?} - {}",
+ self.bones[axis.bone.index()]
+ .label
+ .as_ref()
+ .map_or("", |s| s)
);
-
for joint_id in connections {
- let joint = &mut self.joints[usize::from(joint_id.0)];
+ let joint = &mut self.joints[joint_id.index()];
let other_axis = joint.other_axis(axis);
- let bone = &mut self.bones[usize::from(other_axis.bone.0)];
+ let bone = &mut self.bones[other_axis.bone.index()];
if bone.generation == self.generation {
// We store connections in both directions, which means we
// can visit bones twice. We want to ensure we only follow
// each bone a single time.
continue;
}
- bone.generation = self.generation;
println!(
- " -> {joint_id:?} -> {}:{:?} ({})",
- bone.label(),
- other_axis.end,
- joint.angle
+ "{joint_id:?}{} -> {other_axis:?}{} at {current_rotation}",
+ joint.label.as_ref().map_or("", |s| s),
+ bone.label.as_ref().map_or("", |s| s)
);
- joint.calculated_position = if let Some(current_position) = current_position {
- bone.start = current_position;
- current_position
- } else {
- debug_assert_eq!(axis.bone.0, 0);
- bone.start
- };
-
- let angle = if inverse_root {
- Rotation::radians(PI) - joint.angle
- } else {
- joint.angle
- };
+ bone.generation = self.generation;
+ bone.entry_angle = current_rotation;
+ bone.start = current_position;
+ joint.calculated_position = current_position;
- let mut next_rotation = current_rotation + angle;
let (end, mid) = determine_end_position(
- joint.calculated_position,
+ current_position,
bone.desired_end,
- next_rotation,
+ current_rotation,
+ joint.angle,
&bone.kind,
);
bone.end = end;
bone.joint_pos = mid;
- if let Some(mid) = mid {
- let final_delta = end - mid;
- let rotation = Rotation::radians(final_delta.y.atan2(final_delta.x));
- // TODO I don't know why rotating by 90 degrees fixes
- // everything here. It feels like atan2 should be giving us
- // the correct rotation, or the correction amount should be
- // driven by an input angle, but a fixed correction amount
- // seems to be the correct answer. Without this, a joint
- // angle of 0 sticks out at a perpendicular angle.
- next_rotation = rotation + Rotation::radians(PI / 2.);
- }
- if axis == BoneId(0).axis_a() && other_axis == axis {
- // The first joint doesn't have any real connection, so we
- // must manually traverse the other side of the root bone.
- to_solve.push((
- axis.bone.axis_b(),
- Some(self.bones[0].end),
- current_rotation,
- true,
- ));
- } else {
- to_solve.push((other_axis.inverse(), Some(bone.end), next_rotation, true));
- }
+ to_solve.push((
+ other_axis.inverse(),
+ bone.end,
+ bone.final_vector().direction,
+ ));
}
}
}
}
-fn next_point(mut point: Vector, angle: Rotation, length: f32) -> Vector {
- point.x += length * angle.radians.sin();
- point.y -= length * angle.radians.cos();
- point
-}
-
fn determine_end_position(
- start: Vector,
+ start: Coordinate,
desired_end: Option<Vector>,
- angle: Rotation,
+ current_rotation: Angle,
+ joint_angle: Angle,
bone: &BoneKind,
-) -> (Vector, Option<Vector>) {
+) -> (Coordinate, Option<Coordinate>) {
match bone {
- BoneKind::Rigid { length } => (next_point(start, angle, *length), None),
+ BoneKind::Rigid { length } => (
+ start + Vector::new(*length, current_rotation + joint_angle),
+ None,
+ ),
BoneKind::Jointed {
start_length,
end_length,
inverse,
} => {
if let Some(desired_end) = desired_end {
- let delta = desired_end - start;
- let desired_angle = Rotation::radians(delta.y.atan2(delta.x) + PI / 2.);
- let distance = delta.magnitude();
+ let desired_angle = desired_end.direction + current_rotation;
+ let distance = desired_end.magnitude;
let full_length = start_length + end_length;
let minimum_size = (start_length - end_length).abs();
- let (capped, desired_length) = if distance < minimum_size {
- (true, minimum_size)
+ let desired_length = if distance < minimum_size {
+ minimum_size
} else if distance > full_length {
- (true, full_length)
+ full_length
} else {
- (false, distance)
+ distance
};
- let end = if capped {
- // We need to cap the end point along this sloped line
- next_point(start, desired_angle, desired_length)
- } else {
- // The end position is valid
- desired_end
- };
+ let end = start + Vector::new(desired_length, desired_angle);
let joint = get_third_point(
*inverse,
@@ -1275,8 +1594,8 @@
(end, Some(joint))
} else {
- let joint = next_point(start, angle, *start_length);
- let end = next_point(joint, angle, *end_length);
+ let joint = start + Vector::new(*start_length, current_rotation);
+ let end = joint + Vector::new(*end_length, current_rotation);
(end, Some(joint))
}
}
@@ -1285,22 +1604,22 @@
fn get_third_point(
inverse: bool,
- start: Vector,
+ start: Coordinate,
distance: f32,
- hyp_angle: Rotation,
+ hyp_angle: Angle,
first: f32,
second: f32,
-) -> Vector {
+) -> Coordinate {
let hyp = distance;
let first_angle = ((first * first + hyp * hyp - second * second) / (2. * first * hyp)).acos();
if first_angle.is_nan() {
- next_point(start, hyp_angle, first)
+ start + Vector::new(first, hyp_angle)
} else {
let first_angle = hyp_angle
- - Rotation {
+ - Angle {
radians: if inverse { -first_angle } else { first_angle },
};
- next_point(start, first_angle, first)
+ start + Vector::new(first, first_angle)
}
}
@@ -1308,13 +1627,13 @@
type Output = Bone;
fn index(&self, index: BoneId) -> &Self::Output {
- &self.bones[usize::from(index.0)]
+ &self.bones[index.index()]
}
}
impl IndexMut<BoneId> for Skeleton {
fn index_mut(&mut self, index: BoneId) -> &mut Self::Output {
- &mut self.bones[usize::from(index.0)]
+ &mut self.bones[index.index()]
}
}
@@ -1322,13 +1641,13 @@
type Output = Joint;
fn index(&self, index: JointId) -> &Self::Output {
- &self.joints[usize::from(index.0)]
+ &self.joints[index.index()]
}
}
impl IndexMut<JointId> for Skeleton {
fn index_mut(&mut self, index: JointId) -> &mut Self::Output {
- &mut self.joints[usize::from(index.0)]
+ &mut self.joints[index.index()]
}
}
@@ -1354,19 +1673,39 @@
}
/// A bone in a [`Skeleton`].
-#[derive(Debug)]
+#[derive(Debug, PartialEq)]
pub struct Bone {
+ id: BoneId,
generation: usize,
label: Option<ArcString>,
kind: BoneKind,
- start: Vector,
- joint_pos: Option<Vector>,
- end: Vector,
+ start: Coordinate,
+ joint_pos: Option<Coordinate>,
+ end: Coordinate,
desired_end: Option<Vector>,
+ entry_angle: Angle,
}
impl Bone {
- /// Sets the location to aim the end of this bone towards.
+ /// Returns the unique id of this bone.
+ #[must_use]
+ pub const fn id(&self) -> BoneId {
+ self.id
+ }
+
+ /// Returns true if this bone is the root of the skeleton.
+ #[must_use]
+ pub const fn is_root(&self) -> bool {
+ self.id.0 == 0
+ }
+
+ /// Returns the kind of this bone.
+ #[must_use]
+ pub const fn kind(&self) -> &BoneKind {
+ &self.kind
+ }
+
+ /// 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.
@@ -1382,22 +1721,35 @@
self.desired_end
}
+ /// Returns the angle of the previous bone segment connecting to this bone.
+ #[must_use]
+ pub const fn entry_angle(&self) -> Angle {
+ self.entry_angle
+ }
+
/// Returns the solved start position of this bone.
#[must_use]
- pub const fn start(&self) -> Vector {
+ pub const fn start(&self) -> Coordinate {
self.start
}
/// Returns the solved end position of this bone.
#[must_use]
- pub const fn end(&self) -> Vector {
+ pub const fn end(&self) -> Coordinate {
self.end
}
+ /// Returns a vector representing the final segment in this bone.
+ #[must_use]
+ pub fn final_vector(&self) -> Vector {
+ let start = self.joint_pos.unwrap_or(self.start);
+ start.vector_to(self.end)
+ }
+
/// If this is a [`BoneKind::Jointed`] bone, returns the solved position of
/// the joint.
#[must_use]
- pub const fn solved_joint(&self) -> Option<Vector> {
+ pub const fn solved_joint(&self) -> Option<Coordinate> {
self.joint_pos
}
@@ -1409,24 +1761,32 @@
}
/// A connection between two bones.
-#[derive(Debug)]
+#[derive(Debug, PartialEq)]
pub struct Joint {
+ id: JointId,
label: Option<ArcString>,
bone_a: BoneAxis,
bone_b: BoneAxis,
- calculated_position: Vector,
- angle: Rotation,
+ calculated_position: Coordinate,
+ angle: Angle,
}
impl Joint {
+ /// Returns the unique id of this joint.
+ #[must_use]
+ pub const fn id(&self) -> JointId {
+ self.id
+ }
+
/// Returns a new joint formed by joining `bone_a` and `bone_b` at `angle`.
#[must_use]
- pub const fn new(angle: Rotation, bone_a: BoneAxis, bone_b: BoneAxis) -> Self {
+ pub const fn new(angle: Angle, bone_a: BoneAxis, bone_b: BoneAxis) -> Self {
Self {
+ id: JointId(0),
label: None,
bone_a,
bone_b,
- calculated_position: Vector::new(0., 0.),
+ calculated_position: Coordinate::new(0., 0.),
angle,
}
}
@@ -1468,13 +1828,13 @@
///
/// This setting is ignored if the bone furthest from the root of the joint
/// is a [`BoneKind::Jointed`] bone.
- pub fn set_angle(&mut self, angle: Rotation) {
+ pub fn set_angle(&mut self, angle: Angle) {
self.angle = angle;
}
/// Returns the rotation of this joint.
#[must_use]
- pub const fn angle(&self) -> Rotation {
+ pub const fn angle(&self) -> Angle {
self.angle
}
}
@@ -1482,7 +1842,7 @@
/// The unique ID of a [`Bone`] in a [`Skeleton`].
#[derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash)]
#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))]
-pub struct BoneId(u8);
+pub struct BoneId(u16);
impl BoneId {
/// Returns the first axis of this bone.
@@ -1502,12 +1862,26 @@
end: BoneEnd::B,
}
}
+
+ /// Returns the index of this bone within the skeleton.
+ #[must_use]
+ pub fn index(self) -> usize {
+ usize::from(self.0)
+ }
}
/// The unique ID of a [`Joint`] in a [`Skeleton`].
#[derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash)]
#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))]
-pub struct JointId(u8);
+pub struct JointId(u16);
+
+impl JointId {
+ /// Returns the index of this joint within the skeleton.
+ #[must_use]
+ pub fn index(self) -> usize {
+ usize::from(self.0)
+ }
+}
/// A specific end of a [`Bone`].
#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
@@ -1534,14 +1908,14 @@
#[allow(clippy::cast_possible_truncation)]
fn rotation() {
assert_eq!(
- (Rotation::degrees(90.) + Rotation::degrees(180.))
+ (Angle::degrees(90.) + Angle::degrees(180.))
.normalized()
.to_degrees()
.round() as i32,
270,
);
assert_eq!(
- (Rotation::degrees(90.) + Rotation::degrees(-180.))
+ (Angle::degrees(90.) + Angle::degrees(-180.))
.normalized()
.to_degrees()
.round() as i32,
diff --git a/main/src/funnybones/serde.rs.html b/main/src/funnybones/serde.rs.html
index af4e5cf..1e5b274 100644
--- a/main/src/funnybones/serde.rs.html
+++ b/main/src/funnybones/serde.rs.html
@@ -1,4 +1,4 @@
-serde.rs - source 1
+serde.rs - source 1
2
3
4
@@ -163,7 +163,7 @@
Deserialize, Serialize,
};
-use crate::{Bone, BoneAxis, BoneKind, Joint, Rotation, Skeleton, Vector};
+use crate::{Angle, Bone, BoneAxis, BoneKind, Joint, Skeleton, Vector};
impl Serialize for Skeleton {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
@@ -287,7 +287,7 @@
struct DeserializedJoint {
from: BoneAxis,
to: BoneAxis,
- angle: Rotation,
+ angle: Angle,
#[serde(default)]
label: String,
}
@@ -302,7 +302,7 @@
inverse: true,
});
let joint = s.push_joint(Joint::new(
- Rotation::radians(0.),
+ Angle::radians(0.),
spine.axis_a(),
other.axis_b(),
));
@@ -310,6 +310,6 @@
let deserialized: Skeleton = dbg!(pot::from_slice(&serialized).unwrap());
assert_eq!(deserialized[spine].label(), "spine");
assert_eq!(deserialized[other].label(), "");
- assert_eq!(deserialized[joint].angle(), Rotation::radians(0.));
+ assert_eq!(deserialized[joint].angle(), Angle::radians(0.));
}
\ No newline at end of file
diff --git a/main/static.files/rustdoc-b25d77b18a16a9a4.css b/main/static.files/rustdoc-492a78a4a87dcc01.css
similarity index 93%
rename from main/static.files/rustdoc-b25d77b18a16a9a4.css
rename to main/static.files/rustdoc-492a78a4a87dcc01.css
index 5670bee..e9199f9 100644
--- a/main/static.files/rustdoc-b25d77b18a16a9a4.css
+++ b/main/static.files/rustdoc-492a78a4a87dcc01.css
@@ -14,7 +14,7 @@ xmlns="http://www.w3.org/2000/svg" fill="black" height="18px">\
');filter:var(--crate-search-div-filter);}#crate-search-div:hover::after,#crate-search-div:focus-within::after{filter:var(--crate-search-div-hover-filter);}#crate-search>option{font-size:1rem;}.search-input{-webkit-appearance:none;outline:none;border:1px solid var(--border-color);border-radius:2px;padding:8px;font-size:1rem;flex-grow:1;background-color:var(--button-background-color);color:var(--search-color);}.search-input:focus{border-color:var(--search-input-focused-border-color);}.search-results{display:none;}.search-results.active{display:block;}.search-results>a{display:flex;margin-left:2px;margin-right:2px;border-bottom:1px solid var(--search-result-border-color);gap:1em;}.search-results>a>div.desc{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;flex:2;}.search-results a:hover,.search-results a:focus{background-color:var(--search-result-link-focus-background-color);}.search-results .result-name{display:flex;align-items:center;justify-content:start;flex:3;}.search-results .result-name .alias{color:var(--search-results-alias-color);}.search-results .result-name .grey{color:var(--search-results-grey-color);}.search-results .result-name .typename{color:var(--search-results-grey-color);font-size:0.875rem;width:var(--search-typename-width);}.search-results .result-name .path{word-break:break-all;max-width:calc(100% - var(--search-typename-width));display:inline-block;}.search-results .result-name .path>*{display:inline;}.popover{position:absolute;top:100%;right:0;z-index:calc(var(--desktop-sidebar-z-index) + 1);margin-top:7px;border-radius:3px;border:1px solid var(--border-color);background-color:var(--main-background-color);color:var(--main-color);--popover-arrow-offset:11px;}.popover::before{content:'';position:absolute;right:var(--popover-arrow-offset);border:solid var(--border-color);border-width:1px 1px 0 0;background-color:var(--main-background-color);padding:4px;transform:rotate(-45deg);top:-5px;}.setting-line{margin:1.2em 0.6em;}.setting-radio input,.setting-check input{margin-right:0.3em;height:1.2rem;width:1.2rem;border:2px solid var(--settings-input-border-color);outline:none;-webkit-appearance:none;cursor:pointer;}.setting-radio input{border-radius:50%;}.setting-radio span,.setting-check span{padding-bottom:1px;}.setting-radio{margin-top:0.1em;margin-bottom:0.1em;min-width:3.8em;padding:0.3em;display:inline-flex;align-items:center;cursor:pointer;}.setting-radio+.setting-radio{margin-left:0.5em;}.setting-check{margin-right:20px;display:flex;align-items:center;cursor:pointer;}.setting-radio input:checked{box-shadow:inset 0 0 0 3px var(--main-background-color);background-color:var(--settings-input-color);}.setting-check input:checked{background-color:var(--settings-input-color);border-width:1px;content:url('data:image/svg+xml,');}.setting-radio input:focus,.setting-check input:focus{box-shadow:0 0 1px 1px var(--settings-input-color);}.setting-radio input:checked:focus{box-shadow:inset 0 0 0 3px var(--main-background-color),0 0 2px 2px var(--settings-input-color);}.setting-radio input:hover,.setting-check input:hover{border-color:var(--settings-input-color) !important;}#help.popover{max-width:600px;--popover-arrow-offset:48px;}#help dt{float:left;clear:left;margin-right:0.5rem;}#help span.top,#help span.bottom{text-align:center;display:block;font-size:1.125rem;}#help span.top{margin:10px 0;border-bottom:1px solid var(--border-color);padding-bottom:4px;margin-bottom:6px;}#help span.bottom{clear:both;border-top:1px solid var(--border-color);}.side-by-side>div{width:50%;float:left;padding:0 20px 20px 17px;}.item-info .stab{display:block;padding:3px;margin-bottom:5px;}.item-name .stab{margin-left:0.3125em;}.stab{padding:0 2px;font-size:0.875rem;font-weight:normal;color:var(--main-color);background-color:var(--stab-background-color);width:fit-content;white-space:pre-wrap;border-radius:3px;display:inline;vertical-align:baseline;}.stab.portability>code{background:none;color:var(--stab-code-color);}.stab .emoji,.item-info .stab::before{font-size:1.25rem;}.stab .emoji{margin-right:0.3rem;}.item-info .stab::before{content:"\0";width:0;display:inline-block;color:transparent;}.emoji{text-shadow:1px 0 0 black,-1px 0 0 black,0 1px 0 black,0 -1px 0 black;}.since{font-weight:normal;font-size:initial;}.rightside{padding-left:12px;float:right;}.rightside:not(a),.out-of-band{color:var(--right-side-color);}pre.rust{tab-size:4;-moz-tab-size:4;}pre.rust .kw{color:var(--code-highlight-kw-color);}pre.rust .kw-2{color:var(--code-highlight-kw-2-color);}pre.rust .lifetime{color:var(--code-highlight-lifetime-color);}pre.rust .prelude-ty{color:var(--code-highlight-prelude-color);}pre.rust .prelude-val{color:var(--code-highlight-prelude-val-color);}pre.rust .string{color:var(--code-highlight-string-color);}pre.rust .number{color:var(--code-highlight-number-color);}pre.rust .bool-val{color:var(--code-highlight-literal-color);}pre.rust .self{color:var(--code-highlight-self-color);}pre.rust .attr{color:var(--code-highlight-attribute-color);}pre.rust .macro,pre.rust .macro-nonterminal{color:var(--code-highlight-macro-color);}pre.rust .question-mark{font-weight:bold;color:var(--code-highlight-question-mark-color);}pre.rust .comment{color:var(--code-highlight-comment-color);}pre.rust .doccomment{color:var(--code-highlight-doc-comment-color);}.rustdoc.src .example-wrap pre.rust a{background:var(--codeblock-link-background);}.example-wrap.compile_fail,.example-wrap.should_panic{border-left:2px solid var(--codeblock-error-color);}.ignore.example-wrap{border-left:2px solid var(--codeblock-ignore-color);}.example-wrap.compile_fail:hover,.example-wrap.should_panic:hover{border-left:2px solid var(--codeblock-error-hover-color);}.example-wrap.ignore:hover{border-left:2px solid var(--codeblock-ignore-hover-color);}.example-wrap.compile_fail .tooltip,.example-wrap.should_panic .tooltip{color:var(--codeblock-error-color);}.example-wrap.ignore .tooltip{color:var(--codeblock-ignore-color);}.example-wrap.compile_fail:hover .tooltip,.example-wrap.should_panic:hover .tooltip{color:var(--codeblock-error-hover-color);}.example-wrap.ignore:hover .tooltip{color:var(--codeblock-ignore-hover-color);}.example-wrap .tooltip{position:absolute;display:block;left:-25px;top:5px;margin:0;line-height:1;}.example-wrap.compile_fail .tooltip,.example-wrap.should_panic .tooltip,.example-wrap.ignore .tooltip{font-weight:bold;font-size:1.25rem;}.content .docblock .warning{border-left:2px solid var(--warning-border-color);padding:14px;position:relative;overflow-x:visible !important;}.content .docblock .warning::before{color:var(--warning-border-color);content:"ⓘ";position:absolute;left:-25px;top:5px;font-weight:bold;font-size:1.25rem;}.top-doc>.docblock>.warning:first-child::before{top:20px;}.example-wrap>a.test-arrow,.example-wrap .button-holder{visibility:hidden;position:absolute;top:4px;right:4px;z-index:1;}a.test-arrow{height:var(--copy-path-height);padding:6px 4px 0 11px;}a.test-arrow::before{content:url('data:image/svg+xml,');}.example-wrap .button-holder{display:flex;}@media not (pointer:coarse){.example-wrap:hover>a.test-arrow,.example-wrap:hover>.button-holder{visibility:visible;}}.example-wrap .button-holder.keep-visible{visibility:visible;}.example-wrap .button-holder .copy-button,.example-wrap .test-arrow{background:var(--main-background-color);cursor:pointer;border-radius:var(--button-border-radius);height:var(--copy-path-height);width:var(--copy-path-width);}.example-wrap .button-holder .copy-button{margin-left:var(--button-left-margin);padding:2px 0 0 4px;border:0;}.example-wrap .button-holder .copy-button::before,.example-wrap .test-arrow::before{filter:var(--copy-path-img-filter);}.example-wrap .button-holder .copy-button::before{content:var(--clipboard-image);}.example-wrap .button-holder .copy-button:hover::before,.example-wrap .test-arrow:hover::before{filter:var(--copy-path-img-hover-filter);}.example-wrap .button-holder .copy-button.clicked::before{content:var(--checkmark-image);padding-right:5px;}.code-attribute{font-weight:300;color:var(--code-attribute-color);}.item-spacer{width:100%;height:12px;display:block;}.out-of-band>span.since{font-size:1.25rem;}.sub-variant h4{font-size:1rem;font-weight:400;margin-top:0;margin-bottom:0;}.sub-variant{margin-left:24px;margin-bottom:40px;}.sub-variant>.sub-variant-field{margin-left:24px;}:target{padding-right:3px;background-color:var(--target-background-color);border-right:3px solid var(--target-border-color);}.code-header a.tooltip{color:inherit;margin-right:15px;position:relative;}.code-header a.tooltip:hover{color:var(--link-color);}a.tooltip:hover::after{position:absolute;top:calc(100% - 10px);left:-15px;right:-15px;height:20px;content:"\00a0";}.fade-out{opacity:0;transition:opacity 0.45s cubic-bezier(0,0,0.1,1.0);}.popover.tooltip .content{margin:0.25em 0.5em;}.popover.tooltip .content pre,.popover.tooltip .content code{background:transparent;margin:0;padding:0;font-size:1.25rem;white-space:pre-wrap;}.popover.tooltip .content>h3:first-child{margin:0 0 5px 0;}.search-failed{text-align:center;margin-top:20px;display:none;}.search-failed.active{display:block;}.search-failed>ul{text-align:left;max-width:570px;margin-left:auto;margin-right:auto;}#search-tabs{display:flex;flex-direction:row;gap:1px;margin-bottom:4px;}#search-tabs button{text-align:center;font-size:1.125rem;border:0;border-top:2px solid;flex:1;line-height:1.5;color:inherit;}#search-tabs button:not(.selected){background-color:var(--search-tab-button-not-selected-background);border-top-color:var(--search-tab-button-not-selected-border-top-color);}#search-tabs button:hover,#search-tabs button.selected{background-color:var(--search-tab-button-selected-background);border-top-color:var(--search-tab-button-selected-border-top-color);}#search-tabs .count{font-size:1rem;font-variant-numeric:tabular-nums;color:var(--search-tab-title-count-color);}#search .error code{border-radius:3px;background-color:var(--search-error-code-background-color);}.search-corrections{font-weight:normal;}#src-sidebar{width:100%;overflow:auto;}#src-sidebar div.files>a:hover,details.dir-entry summary:hover,#src-sidebar div.files>a:focus,details.dir-entry summary:focus{background-color:var(--src-sidebar-background-hover);}#src-sidebar div.files>a.selected{background-color:var(--src-sidebar-background-selected);}.src-sidebar-title{position:sticky;top:0;display:flex;padding:8px 8px 0 48px;margin-bottom:7px;background:var(--sidebar-background-color);border-bottom:1px solid var(--border-color);}#settings-menu,#help-button{margin-left:var(--button-left-margin);display:flex;}#sidebar-button{display:none;line-height:0;}.hide-sidebar #sidebar-button,.src #sidebar-button{display:flex;margin-right:4px;position:fixed;left:6px;height:34px;width:34px;background-color:var(--main-background-color);z-index:1;}.src #sidebar-button{left:8px;z-index:calc(var(--desktop-sidebar-z-index) + 1);}.hide-sidebar .src #sidebar-button{position:static;}#settings-menu>a,#help-button>a,#sidebar-button>a{display:flex;align-items:center;justify-content:center;background-color:var(--button-background-color);border:1px solid var(--border-color);border-radius:var(--button-border-radius);color:var(--settings-button-color);font-size:20px;width:33px;}#settings-menu>a:hover,#settings-menu>a:focus,#help-button>a:hover,#help-button>a:focus,#sidebar-button>a:hover,#sidebar-button>a:focus{border-color:var(--settings-button-border-focus);}#settings-menu>a{line-height:0;font-size:0;}#settings-menu>a:before{content:url('data:image/svg+xml,');}.example-wrap .button-holder{display:flex;}@media not (pointer:coarse){.example-wrap:hover>a.test-arrow,.example-wrap:hover>.button-holder{visibility:visible;}}.example-wrap .button-holder.keep-visible{visibility:visible;}.example-wrap .button-holder .copy-button,.example-wrap .test-arrow{background:var(--main-background-color);cursor:pointer;border-radius:var(--button-border-radius);height:var(--copy-path-height);width:var(--copy-path-width);}.example-wrap .button-holder .copy-button{margin-left:var(--button-left-margin);padding:2px 0 0 4px;border:0;}.example-wrap .button-holder .copy-button::before,.example-wrap .test-arrow::before{filter:var(--copy-path-img-filter);}.example-wrap .button-holder .copy-button::before{content:var(--clipboard-image);}.example-wrap .button-holder .copy-button:hover::before,.example-wrap .test-arrow:hover::before{filter:var(--copy-path-img-hover-filter);}.example-wrap .button-holder .copy-button.clicked::before{content:var(--checkmark-image);padding-right:5px;}.code-attribute{font-weight:300;color:var(--code-attribute-color);}.item-spacer{width:100%;height:12px;display:block;}.out-of-band>span.since{font-size:1.25rem;}.sub-variant h4{font-size:1rem;font-weight:400;margin-top:0;margin-bottom:0;}.sub-variant{margin-left:24px;margin-bottom:40px;}.sub-variant>.sub-variant-field{margin-left:24px;}@keyframes targetfadein{from{background-color:var(--main-background-color);}10%{background-color:var(--target-border-color);}to{background-color:var(--target-background-color);}}:target{padding-right:3px;background-color:var(--target-background-color);border-right:3px solid var(--target-border-color);animation:0.65s cubic-bezier(0,0,0.1,1.0) 0.1s targetfadein;}.code-header a.tooltip{color:inherit;margin-right:15px;position:relative;}.code-header a.tooltip:hover{color:var(--link-color);}a.tooltip:hover::after{position:absolute;top:calc(100% - 10px);left:-15px;right:-15px;height:20px;content:"\00a0";}.fade-out{opacity:0;transition:opacity 0.45s cubic-bezier(0,0,0.1,1.0);}.popover.tooltip .content{margin:0.25em 0.5em;}.popover.tooltip .content pre,.popover.tooltip .content code{background:transparent;margin:0;padding:0;font-size:1.25rem;white-space:pre-wrap;}.popover.tooltip .content>h3:first-child{margin:0 0 5px 0;}.search-failed{text-align:center;margin-top:20px;display:none;}.search-failed.active{display:block;}.search-failed>ul{text-align:left;max-width:570px;margin-left:auto;margin-right:auto;}#search-tabs{display:flex;flex-direction:row;gap:1px;margin-bottom:4px;}#search-tabs button{text-align:center;font-size:1.125rem;border:0;border-top:2px solid;flex:1;line-height:1.5;color:inherit;}#search-tabs button:not(.selected){background-color:var(--search-tab-button-not-selected-background);border-top-color:var(--search-tab-button-not-selected-border-top-color);}#search-tabs button:hover,#search-tabs button.selected{background-color:var(--search-tab-button-selected-background);border-top-color:var(--search-tab-button-selected-border-top-color);}#search-tabs .count{font-size:1rem;font-variant-numeric:tabular-nums;color:var(--search-tab-title-count-color);}#search .error code{border-radius:3px;background-color:var(--search-error-code-background-color);}.search-corrections{font-weight:normal;}#src-sidebar{width:100%;overflow:auto;}#src-sidebar div.files>a:hover,details.dir-entry summary:hover,#src-sidebar div.files>a:focus,details.dir-entry summary:focus{background-color:var(--src-sidebar-background-hover);}#src-sidebar div.files>a.selected{background-color:var(--src-sidebar-background-selected);}.src-sidebar-title{position:sticky;top:0;display:flex;padding:8px 8px 0 48px;margin-bottom:7px;background:var(--sidebar-background-color);border-bottom:1px solid var(--border-color);}#settings-menu,#help-button{margin-left:var(--button-left-margin);display:flex;}#sidebar-button{display:none;line-height:0;}.hide-sidebar #sidebar-button,.src #sidebar-button{display:flex;margin-right:4px;position:fixed;left:6px;height:34px;width:34px;background-color:var(--main-background-color);z-index:1;}.src #sidebar-button{left:8px;z-index:calc(var(--desktop-sidebar-z-index) + 1);}.hide-sidebar .src #sidebar-button{position:static;}#settings-menu>a,#help-button>a,#sidebar-button>a{display:flex;align-items:center;justify-content:center;background-color:var(--button-background-color);border:1px solid var(--border-color);border-radius:var(--button-border-radius);color:var(--settings-button-color);font-size:20px;width:33px;}#settings-menu>a:hover,#settings-menu>a:focus,#help-button>a:hover,#help-button>a:focus,#sidebar-button>a:hover,#sidebar-button>a:focus{border-color:var(--settings-button-border-focus);}#settings-menu>a{line-height:0;font-size:0;}#settings-menu>a:before{content:url('data:image/svg+xml,