1use core::f32::consts::FRAC_PI_2;
2use core::mem;
3
4use crate::{primitives::dim3::triangle3d, Indices, Mesh, PerimeterSegment, VertexAttributeValues};
5use bevy_asset::RenderAssetUsages;
6
7use super::{Extrudable, MeshBuilder, Meshable};
8use bevy_math::{ops, FloatExt, Vec2, Vec3};
9use bevy_reflect::prelude::*;
10use bevy_shape::{
11 Annulus, Capsule2d, Circle, CircularSector, CircularSegment, ConvexPolygon, Ellipse,
12 Polyline2d, Primitive2d, Rectangle, RegularPolygon, Rhombus, Ring, Segment2d, Triangle2d,
13 Triangle3d, WindingOrder,
14};
15use wgpu_types::PrimitiveTopology;
16
17#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for CircleMeshBuilder { }
#[automatically_derived]
impl ::core::clone::Clone for CircleMeshBuilder {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Circle>;
let _: ::core::clone::AssertParamIsClone<u32>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for CircleMeshBuilder { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for CircleMeshBuilder {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"CircleMeshBuilder", "circle", &self.circle, "resolution",
&&self.resolution)
}
}Debug, const _: () =
{
impl bevy_reflect::GetTypeRegistration for CircleMeshBuilder where {
fn get_type_registration() -> bevy_reflect::TypeRegistration {
let mut registration =
bevy_reflect::TypeRegistration::of::<Self>();
registration.insert(<bevy_reflect::ReflectFromPtr as
bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
registration.insert(<bevy_reflect::ReflectFromReflect as
bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
registration.register_type_data_with::<ReflectDefault, Self,
_>(());
registration
}
#[inline(never)]
fn register_type_dependencies(registry:
&mut bevy_reflect::TypeRegistry) {
<Circle as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
<u32 as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
}
}
impl bevy_reflect::Typed for CircleMeshBuilder where {
#[inline(never)]
fn type_info() -> &'static bevy_reflect::TypeInfo {
static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
bevy_reflect::utility::NonGenericTypeInfoCell::new();
CELL.get_or_set(#[inline(never)] ||
{
bevy_reflect::TypeInfo::Struct(bevy_reflect::structs::StructInfo::new::<Self>(&[bevy_reflect::NamedField::new::<Circle>("circle"),
bevy_reflect::NamedField::new::<u32>("resolution")]))
})
}
}
#[allow(deprecated, reason =
"derives on a deprecated type shouldn't be considered a usage")]
impl bevy_reflect::TypePath for CircleMeshBuilder where {
fn type_path() -> &'static str {
"bevy_mesh::primitives::dim2::CircleMeshBuilder"
}
fn short_type_path() -> &'static str { "CircleMeshBuilder" }
fn type_ident() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("CircleMeshBuilder")
}
fn crate_name() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_mesh::primitives::dim2".split(':').next().unwrap())
}
fn module_path() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_mesh::primitives::dim2")
}
}
impl bevy_reflect::Reflect for CircleMeshBuilder where {
#[inline]
fn into_any(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn ::core::any::Any> {
self
}
#[inline]
fn as_any(&self) -> &dyn ::core::any::Any { self }
#[inline]
fn as_any_mut(&mut self) -> &mut dyn ::core::any::Any { self }
#[inline]
fn into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect> {
self
}
#[inline]
fn as_reflect(&self) -> &dyn bevy_reflect::Reflect { self }
#[inline]
fn as_reflect_mut(&mut self) -> &mut dyn bevy_reflect::Reflect {
self
}
#[inline]
fn set(&mut self,
value:
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>)
->
::core::result::Result<(),
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>> {
*self = <dyn bevy_reflect::Reflect>::take(value)?;
::core::result::Result::Ok(())
}
}
#[allow(non_upper_case_globals)]
const _: () =
{
static __INVENTORY: ::inventory::Node =
::inventory::Node {
value: &{
bevy_reflect::__macro_exports::auto_register::AutomaticReflectRegistrations(<CircleMeshBuilder
as
bevy_reflect::__macro_exports::auto_register::RegisterForReflection>::__register)
},
next: ::inventory::__private::UnsafeCell::new(::inventory::__private::Option::None),
};
#[link_section = ".text.startup"]
unsafe extern "C" fn __ctor() {
unsafe {
::inventory::ErasedNode::submit(__INVENTORY.value,
&__INVENTORY)
}
}
#[used]
#[link_section = ".init_array"]
static __CTOR: unsafe extern "C" fn() = __ctor;
};
impl bevy_reflect::structs::Struct for CircleMeshBuilder where {
fn field(&self, name: &str)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match name {
"circle" => ::core::option::Option::Some(&self.circle),
"resolution" =>
::core::option::Option::Some(&self.resolution),
_ => ::core::option::Option::None,
}
}
fn field_mut(&mut self, name: &str)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match name {
"circle" => ::core::option::Option::Some(&mut self.circle),
"resolution" =>
::core::option::Option::Some(&mut self.resolution),
_ => ::core::option::Option::None,
}
}
fn field_at(&self, index: usize)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match index {
0usize => ::core::option::Option::Some(&self.circle),
1usize => ::core::option::Option::Some(&self.resolution),
_ => ::core::option::Option::None,
}
}
fn field_at_mut(&mut self, index: usize)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match index {
0usize => ::core::option::Option::Some(&mut self.circle),
1usize =>
::core::option::Option::Some(&mut self.resolution),
_ => ::core::option::Option::None,
}
}
fn name_at(&self, index: usize) -> ::core::option::Option<&str> {
match index {
0usize => ::core::option::Option::Some("circle"),
1usize => ::core::option::Option::Some("resolution"),
_ => ::core::option::Option::None,
}
}
fn index_of_name(&self, name: &str)
-> ::core::option::Option<usize> {
match name {
"circle" => ::core::option::Option::Some(0usize),
"resolution" => ::core::option::Option::Some(1usize),
_ => ::core::option::Option::None,
}
}
fn field_len(&self) -> usize { 2usize }
fn iter_fields(&self) -> bevy_reflect::structs::FieldIter {
bevy_reflect::structs::FieldIter::new(self)
}
fn to_dynamic_struct(&self)
->
::core::result::Result<bevy_reflect::structs::DynamicStruct,
bevy_reflect::ReflectCloneError> {
let mut dynamic: bevy_reflect::structs::DynamicStruct =
::core::default::Default::default();
dynamic.set_represented_type(bevy_reflect::PartialReflect::get_represented_type_info(self));
dynamic.insert_boxed("circle",
bevy_reflect::PartialReflect::to_dynamic(&self.circle)?);
dynamic.insert_boxed("resolution",
bevy_reflect::PartialReflect::to_dynamic(&self.resolution)?);
::core::result::Result::Ok(dynamic)
}
}
impl bevy_reflect::PartialReflect for CircleMeshBuilder where {
#[inline]
fn get_represented_type_info(&self)
-> ::core::option::Option<&'static bevy_reflect::TypeInfo> {
::core::option::Option::Some(<Self as
bevy_reflect::Typed>::type_info())
}
#[inline]
fn try_apply(&mut self, value: &dyn bevy_reflect::PartialReflect)
-> ::core::result::Result<(), bevy_reflect::ApplyError> {
if let bevy_reflect::ReflectRef::Struct(struct_value) =
bevy_reflect::PartialReflect::reflect_ref(value) {
for (name, value) in
bevy_reflect::structs::Struct::iter_fields(struct_value) {
if let ::core::option::Option::Some(v) =
bevy_reflect::structs::Struct::field_mut(self, name) {
bevy_reflect::PartialReflect::try_apply(v, value)?;
}
}
} else {
return ::core::result::Result::Err(bevy_reflect::ApplyError::MismatchedKinds {
from_kind: bevy_reflect::PartialReflect::reflect_kind(value),
to_kind: bevy_reflect::ReflectKind::Struct,
});
}
::core::result::Result::Ok(())
}
#[inline]
fn reflect_kind(&self) -> bevy_reflect::ReflectKind {
bevy_reflect::ReflectKind::Struct
}
#[inline]
fn reflect_ref(&self) -> bevy_reflect::ReflectRef {
bevy_reflect::ReflectRef::Struct(self)
}
#[inline]
fn reflect_mut(&mut self) -> bevy_reflect::ReflectMut {
bevy_reflect::ReflectMut::Struct(self)
}
#[inline]
fn reflect_owned(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
-> bevy_reflect::ReflectOwned {
bevy_reflect::ReflectOwned::Struct(self)
}
#[inline]
fn try_into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect>> {
::core::result::Result::Ok(self)
}
#[inline]
fn try_as_reflect(&self)
-> ::core::option::Option<&dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn try_as_reflect_mut(&mut self)
-> ::core::option::Option<&mut dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn into_partial_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect> {
self
}
#[inline]
fn as_partial_reflect(&self)
-> &dyn bevy_reflect::PartialReflect {
self
}
#[inline]
fn as_partial_reflect_mut(&mut self)
-> &mut dyn bevy_reflect::PartialReflect {
self
}
fn reflect_partial_eq(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<bool> {
(bevy_reflect::structs::struct_partial_eq)(self, value)
}
fn reflect_partial_cmp(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<::core::cmp::Ordering> {
(bevy_reflect::structs::struct_partial_cmp)(self, value)
}
fn debug(&self, f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
::core::fmt::Debug::fmt(self, f)
}
#[inline]
fn reflect_clone(&self)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::ReflectCloneError> {
::core::result::Result::Ok(bevy_reflect::__macro_exports::alloc_utils::Box::new(::core::clone::Clone::clone(self)))
}
}
impl bevy_reflect::FromReflect for CircleMeshBuilder where {
fn from_reflect(reflect: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<Self> {
if let bevy_reflect::ReflectRef::Struct(__ref_struct) =
bevy_reflect::PartialReflect::reflect_ref(reflect) {
let mut __this =
<Self as ::core::default::Default>::default();
if let ::core::option::Option::Some(__field) =
(||
<Circle as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
"circle")?))() {
__this.circle = __field;
}
if let ::core::option::Option::Some(__field) =
(||
<u32 as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
"resolution")?))() {
__this.resolution = __field;
}
::core::option::Option::Some(__this)
} else { ::core::option::Option::None }
}
}
};Reflect)]
19#[reflect(Default, Debug, Clone)]
20pub struct CircleMeshBuilder {
21 pub circle: Circle,
23 #[doc(alias = "vertices")]
26 pub resolution: u32,
27}
28
29impl Default for CircleMeshBuilder {
30 fn default() -> Self {
31 Self {
32 circle: Circle::default(),
33 resolution: 32,
34 }
35 }
36}
37
38impl CircleMeshBuilder {
39 #[inline]
41 pub const fn new(radius: f32, resolution: u32) -> Self {
42 Self {
43 circle: Circle { radius },
44 resolution,
45 }
46 }
47
48 #[inline]
50 #[doc(alias = "vertices")]
51 pub const fn resolution(mut self, resolution: u32) -> Self {
52 self.resolution = resolution;
53 self
54 }
55}
56
57impl MeshBuilder for CircleMeshBuilder {
58 fn build(&self) -> Mesh {
59 Ellipse::new(self.circle.radius, self.circle.radius)
60 .mesh()
61 .resolution(self.resolution)
62 .build()
63 }
64}
65
66impl Extrudable for CircleMeshBuilder {
67 fn perimeter(&self) -> Vec<PerimeterSegment> {
68 ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[PerimeterSegment::Smooth {
first_normal: Vec2::Y,
last_normal: Vec2::Y,
indices: (0..self.resolution).chain([0]).collect(),
}]))vec![PerimeterSegment::Smooth {
69 first_normal: Vec2::Y,
70 last_normal: Vec2::Y,
71 indices: (0..self.resolution).chain([0]).collect(),
72 }]
73 }
74}
75
76impl Meshable for Circle {
77 type Output = CircleMeshBuilder;
78
79 fn mesh(&self) -> Self::Output {
80 CircleMeshBuilder {
81 circle: *self,
82 ..Default::default()
83 }
84 }
85}
86
87impl From<Circle> for Mesh {
88 fn from(circle: Circle) -> Self {
89 circle.mesh().build()
90 }
91}
92
93#[derive(#[automatically_derived]
impl ::core::marker::Copy for CircularMeshUvMode { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for CircularMeshUvMode { }
#[automatically_derived]
impl ::core::clone::Clone for CircularMeshUvMode {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<f32>;
*self
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for CircularMeshUvMode {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Mask { angle: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Mask",
"angle", &__self_0),
}
}
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for CircularMeshUvMode { }
#[automatically_derived]
impl ::core::cmp::PartialEq for CircularMeshUvMode {
#[inline]
fn eq(&self, other: &Self) -> bool {
match (self, other) {
(Self::Mask { angle: __self_0 }, Self::Mask { angle: __arg1_0 })
=> __self_0 == __arg1_0,
}
}
}PartialEq, const _: () =
{
impl bevy_reflect::GetTypeRegistration for CircularMeshUvMode where {
fn get_type_registration() -> bevy_reflect::TypeRegistration {
let mut registration =
bevy_reflect::TypeRegistration::of::<Self>();
registration.insert(<bevy_reflect::ReflectFromPtr as
bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
registration.insert(<bevy_reflect::ReflectFromReflect as
bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
registration.register_type_data_with::<ReflectDefault, Self,
_>(());
registration
}
#[inline(never)]
fn register_type_dependencies(registry:
&mut bevy_reflect::TypeRegistry) {
<f32 as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
}
}
impl bevy_reflect::Typed for CircularMeshUvMode where {
#[inline(never)]
fn type_info() -> &'static bevy_reflect::TypeInfo {
static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
bevy_reflect::utility::NonGenericTypeInfoCell::new();
CELL.get_or_set(#[inline(never)] ||
{
bevy_reflect::TypeInfo::Enum(bevy_reflect::enums::EnumInfo::new::<Self>(&[bevy_reflect::enums::VariantInfo::Struct(bevy_reflect::enums::StructVariantInfo::new("Mask",
&[bevy_reflect::NamedField::new::<f32>("angle")]))]))
})
}
}
#[allow(deprecated, reason =
"derives on a deprecated type shouldn't be considered a usage")]
impl bevy_reflect::TypePath for CircularMeshUvMode where {
fn type_path() -> &'static str {
"bevy_mesh::primitives::dim2::CircularMeshUvMode"
}
fn short_type_path() -> &'static str { "CircularMeshUvMode" }
fn type_ident() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("CircularMeshUvMode")
}
fn crate_name() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_mesh::primitives::dim2".split(':').next().unwrap())
}
fn module_path() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_mesh::primitives::dim2")
}
}
impl bevy_reflect::Reflect for CircularMeshUvMode where {
#[inline]
fn into_any(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn ::core::any::Any> {
self
}
#[inline]
fn as_any(&self) -> &dyn ::core::any::Any { self }
#[inline]
fn as_any_mut(&mut self) -> &mut dyn ::core::any::Any { self }
#[inline]
fn into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect> {
self
}
#[inline]
fn as_reflect(&self) -> &dyn bevy_reflect::Reflect { self }
#[inline]
fn as_reflect_mut(&mut self) -> &mut dyn bevy_reflect::Reflect {
self
}
#[inline]
fn set(&mut self,
value:
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>)
->
::core::result::Result<(),
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>> {
*self = <dyn bevy_reflect::Reflect>::take(value)?;
::core::result::Result::Ok(())
}
}
#[allow(non_upper_case_globals)]
const _: () =
{
static __INVENTORY: ::inventory::Node =
::inventory::Node {
value: &{
bevy_reflect::__macro_exports::auto_register::AutomaticReflectRegistrations(<CircularMeshUvMode
as
bevy_reflect::__macro_exports::auto_register::RegisterForReflection>::__register)
},
next: ::inventory::__private::UnsafeCell::new(::inventory::__private::Option::None),
};
#[link_section = ".text.startup"]
unsafe extern "C" fn __ctor() {
unsafe {
::inventory::ErasedNode::submit(__INVENTORY.value,
&__INVENTORY)
}
}
#[used]
#[link_section = ".init_array"]
static __CTOR: unsafe extern "C" fn() = __ctor;
};
impl bevy_reflect::enums::Enum for CircularMeshUvMode where {
fn field(&self, __name_param: &str)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match self {
CircularMeshUvMode::Mask { angle: __value, .. } if
__name_param == "angle" =>
::core::option::Option::Some(__value),
_ => ::core::option::Option::None,
}
}
fn field_at(&self, __index_param: usize)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match self {
CircularMeshUvMode::Mask { angle: __value, .. } if
__index_param == 0usize =>
::core::option::Option::Some(__value),
_ => ::core::option::Option::None,
}
}
fn field_mut(&mut self, __name_param: &str)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match self {
CircularMeshUvMode::Mask { angle: __value, .. } if
__name_param == "angle" =>
::core::option::Option::Some(__value),
_ => ::core::option::Option::None,
}
}
fn field_at_mut(&mut self, __index_param: usize)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match self {
CircularMeshUvMode::Mask { angle: __value, .. } if
__index_param == 0usize =>
::core::option::Option::Some(__value),
_ => ::core::option::Option::None,
}
}
fn index_of(&self, __name_param: &str)
-> ::core::option::Option<usize> {
match self {
CircularMeshUvMode::Mask { .. } if __name_param == "angle"
=> ::core::option::Option::Some(0usize),
_ => ::core::option::Option::None,
}
}
fn name_at(&self, __index_param: usize)
-> ::core::option::Option<&str> {
match self {
CircularMeshUvMode::Mask { .. } if __index_param == 0usize
=> ::core::option::Option::Some("angle"),
_ => ::core::option::Option::None,
}
}
fn iter_fields(&self) -> bevy_reflect::enums::VariantFieldIter {
bevy_reflect::enums::VariantFieldIter::new(self)
}
#[inline]
fn field_len(&self) -> usize {
match self {
CircularMeshUvMode::Mask { .. } => 1usize,
_ => 0,
}
}
#[inline]
fn variant_name(&self) -> &str {
match self {
CircularMeshUvMode::Mask { .. } => "Mask",
_ =>
::core::panicking::panic("internal error: entered unreachable code"),
}
}
#[inline]
fn variant_index(&self) -> usize {
match self {
CircularMeshUvMode::Mask { .. } => 0usize,
_ =>
::core::panicking::panic("internal error: entered unreachable code"),
}
}
#[inline]
fn variant_type(&self) -> bevy_reflect::enums::VariantType {
match self {
CircularMeshUvMode::Mask { .. } =>
bevy_reflect::enums::VariantType::Struct,
_ =>
::core::panicking::panic("internal error: entered unreachable code"),
}
}
fn to_dynamic_enum(&self)
->
::core::result::Result<bevy_reflect::enums::DynamicEnum,
bevy_reflect::ReflectCloneError> {
bevy_reflect::enums::DynamicEnum::try_from_ref::<Self>(self)
}
}
impl bevy_reflect::PartialReflect for CircularMeshUvMode where {
#[inline]
fn get_represented_type_info(&self)
-> ::core::option::Option<&'static bevy_reflect::TypeInfo> {
::core::option::Option::Some(<Self as
bevy_reflect::Typed>::type_info())
}
#[inline]
fn try_apply(&mut self,
__value_param: &dyn bevy_reflect::PartialReflect)
-> ::core::result::Result<(), bevy_reflect::ApplyError> {
if let bevy_reflect::ReflectRef::Enum(__value_param) =
bevy_reflect::PartialReflect::reflect_ref(__value_param) {
if bevy_reflect::enums::Enum::variant_name(self) ==
bevy_reflect::enums::Enum::variant_name(__value_param) {
match bevy_reflect::enums::Enum::variant_type(__value_param)
{
bevy_reflect::enums::VariantType::Struct => {
for field in
bevy_reflect::enums::Enum::iter_fields(__value_param) {
let name = field.name().unwrap();
if let ::core::option::Option::Some(v) =
bevy_reflect::enums::Enum::field_mut(self, name) {
bevy_reflect::PartialReflect::try_apply(v, field.value())?;
}
}
}
bevy_reflect::enums::VariantType::Tuple => {
for (index, field) in
::core::iter::Iterator::enumerate(bevy_reflect::enums::Enum::iter_fields(__value_param))
{
if let ::core::option::Option::Some(v) =
bevy_reflect::enums::Enum::field_at_mut(self, index) {
bevy_reflect::PartialReflect::try_apply(v, field.value())?;
}
}
}
_ => {}
}
} else {
match bevy_reflect::enums::Enum::variant_name(__value_param)
{
"Mask" => {
*self =
CircularMeshUvMode::Mask {
angle: {
let __angle = __value_param.field("angle");
let __angle =
__angle.ok_or(bevy_reflect::ApplyError::MissingEnumField {
variant_name: ::core::convert::Into::into("Mask"),
field_name: ::core::convert::Into::into("angle"),
})?;
<f32 as
bevy_reflect::FromReflect>::from_reflect(__angle).ok_or(bevy_reflect::ApplyError::MismatchedTypes {
from_type: ::core::convert::Into::into(bevy_reflect::DynamicTypePath::reflect_type_path(__angle)),
to_type: ::core::convert::Into::into(<f32 as
bevy_reflect::TypePath>::type_path()),
})?
},
}
}
name => {
return ::core::result::Result::Err(bevy_reflect::ApplyError::UnknownVariant {
enum_name: ::core::convert::Into::into(bevy_reflect::DynamicTypePath::reflect_type_path(self)),
variant_name: ::core::convert::Into::into(name),
});
}
}
}
} else {
return ::core::result::Result::Err(bevy_reflect::ApplyError::MismatchedKinds {
from_kind: bevy_reflect::PartialReflect::reflect_kind(__value_param),
to_kind: bevy_reflect::ReflectKind::Enum,
});
}
::core::result::Result::Ok(())
}
fn reflect_kind(&self) -> bevy_reflect::ReflectKind {
bevy_reflect::ReflectKind::Enum
}
fn reflect_ref(&self) -> bevy_reflect::ReflectRef {
bevy_reflect::ReflectRef::Enum(self)
}
fn reflect_mut(&mut self) -> bevy_reflect::ReflectMut {
bevy_reflect::ReflectMut::Enum(self)
}
fn reflect_owned(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
-> bevy_reflect::ReflectOwned {
bevy_reflect::ReflectOwned::Enum(self)
}
#[inline]
fn try_into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect>> {
::core::result::Result::Ok(self)
}
#[inline]
fn try_as_reflect(&self)
-> ::core::option::Option<&dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn try_as_reflect_mut(&mut self)
-> ::core::option::Option<&mut dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn into_partial_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect> {
self
}
#[inline]
fn as_partial_reflect(&self)
-> &dyn bevy_reflect::PartialReflect {
self
}
#[inline]
fn as_partial_reflect_mut(&mut self)
-> &mut dyn bevy_reflect::PartialReflect {
self
}
fn reflect_hash(&self) -> ::core::option::Option<u64> {
(bevy_reflect::enums::enum_hash)(self)
}
fn reflect_partial_eq(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<bool> {
(bevy_reflect::enums::enum_partial_eq)(self, value)
}
fn reflect_partial_cmp(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<::core::cmp::Ordering> {
(bevy_reflect::enums::enum_partial_cmp)(self, value)
}
fn debug(&self, f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
::core::fmt::Debug::fmt(self, f)
}
#[inline]
fn reflect_clone(&self)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::ReflectCloneError> {
::core::result::Result::Ok(bevy_reflect::__macro_exports::alloc_utils::Box::new(::core::clone::Clone::clone(self)))
}
}
impl bevy_reflect::FromReflect for CircularMeshUvMode where {
fn from_reflect(__param0: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<Self> {
if let bevy_reflect::ReflectRef::Enum(__param0) =
bevy_reflect::PartialReflect::reflect_ref(__param0) {
match bevy_reflect::enums::Enum::variant_name(__param0) {
"Mask" =>
::core::option::Option::Some(CircularMeshUvMode::Mask {
angle: {
let __angle = __param0.field("angle");
let __angle = __angle?;
<f32 as bevy_reflect::FromReflect>::from_reflect(__angle)?
},
}),
name => ::core::option::Option::None,
}
} else { ::core::option::Option::None }
}
}
};Reflect)]
103#[reflect(Default, Debug, Clone)]
104#[non_exhaustive]
105pub enum CircularMeshUvMode {
106 Mask {
109 angle: f32,
111 },
112}
113
114impl Default for CircularMeshUvMode {
115 fn default() -> Self {
116 CircularMeshUvMode::Mask { angle: 0.0 }
117 }
118}
119
120#[derive(#[automatically_derived]
impl ::core::clone::Clone for CircularSectorMeshBuilder {
#[inline]
fn clone(&self) -> Self {
Self {
sector: ::core::clone::Clone::clone(&self.sector),
resolution: ::core::clone::Clone::clone(&self.resolution),
uv_mode: ::core::clone::Clone::clone(&self.uv_mode),
}
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for CircularSectorMeshBuilder {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f,
"CircularSectorMeshBuilder", "sector", &self.sector, "resolution",
&self.resolution, "uv_mode", &&self.uv_mode)
}
}Debug, const _: () =
{
impl bevy_reflect::GetTypeRegistration for CircularSectorMeshBuilder
where {
fn get_type_registration() -> bevy_reflect::TypeRegistration {
let mut registration =
bevy_reflect::TypeRegistration::of::<Self>();
registration.insert(<bevy_reflect::ReflectFromPtr as
bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
registration.insert(<bevy_reflect::ReflectFromReflect as
bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
registration.register_type_data_with::<ReflectDefault, Self,
_>(());
registration
}
#[inline(never)]
fn register_type_dependencies(registry:
&mut bevy_reflect::TypeRegistry) {
<CircularSector as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
<u32 as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
<CircularMeshUvMode as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
}
}
impl bevy_reflect::Typed for CircularSectorMeshBuilder where {
#[inline(never)]
fn type_info() -> &'static bevy_reflect::TypeInfo {
static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
bevy_reflect::utility::NonGenericTypeInfoCell::new();
CELL.get_or_set(#[inline(never)] ||
{
bevy_reflect::TypeInfo::Struct(bevy_reflect::structs::StructInfo::new::<Self>(&[bevy_reflect::NamedField::new::<CircularSector>("sector"),
bevy_reflect::NamedField::new::<u32>("resolution"),
bevy_reflect::NamedField::new::<CircularMeshUvMode>("uv_mode")]))
})
}
}
#[allow(deprecated, reason =
"derives on a deprecated type shouldn't be considered a usage")]
impl bevy_reflect::TypePath for CircularSectorMeshBuilder where {
fn type_path() -> &'static str {
"bevy_mesh::primitives::dim2::CircularSectorMeshBuilder"
}
fn short_type_path() -> &'static str {
"CircularSectorMeshBuilder"
}
fn type_ident() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("CircularSectorMeshBuilder")
}
fn crate_name() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_mesh::primitives::dim2".split(':').next().unwrap())
}
fn module_path() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_mesh::primitives::dim2")
}
}
impl bevy_reflect::Reflect for CircularSectorMeshBuilder where {
#[inline]
fn into_any(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn ::core::any::Any> {
self
}
#[inline]
fn as_any(&self) -> &dyn ::core::any::Any { self }
#[inline]
fn as_any_mut(&mut self) -> &mut dyn ::core::any::Any { self }
#[inline]
fn into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect> {
self
}
#[inline]
fn as_reflect(&self) -> &dyn bevy_reflect::Reflect { self }
#[inline]
fn as_reflect_mut(&mut self) -> &mut dyn bevy_reflect::Reflect {
self
}
#[inline]
fn set(&mut self,
value:
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>)
->
::core::result::Result<(),
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>> {
*self = <dyn bevy_reflect::Reflect>::take(value)?;
::core::result::Result::Ok(())
}
}
#[allow(non_upper_case_globals)]
const _: () =
{
static __INVENTORY: ::inventory::Node =
::inventory::Node {
value: &{
bevy_reflect::__macro_exports::auto_register::AutomaticReflectRegistrations(<CircularSectorMeshBuilder
as
bevy_reflect::__macro_exports::auto_register::RegisterForReflection>::__register)
},
next: ::inventory::__private::UnsafeCell::new(::inventory::__private::Option::None),
};
#[link_section = ".text.startup"]
unsafe extern "C" fn __ctor() {
unsafe {
::inventory::ErasedNode::submit(__INVENTORY.value,
&__INVENTORY)
}
}
#[used]
#[link_section = ".init_array"]
static __CTOR: unsafe extern "C" fn() = __ctor;
};
impl bevy_reflect::structs::Struct for CircularSectorMeshBuilder where
{
fn field(&self, name: &str)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match name {
"sector" => ::core::option::Option::Some(&self.sector),
"resolution" =>
::core::option::Option::Some(&self.resolution),
"uv_mode" => ::core::option::Option::Some(&self.uv_mode),
_ => ::core::option::Option::None,
}
}
fn field_mut(&mut self, name: &str)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match name {
"sector" => ::core::option::Option::Some(&mut self.sector),
"resolution" =>
::core::option::Option::Some(&mut self.resolution),
"uv_mode" =>
::core::option::Option::Some(&mut self.uv_mode),
_ => ::core::option::Option::None,
}
}
fn field_at(&self, index: usize)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match index {
0usize => ::core::option::Option::Some(&self.sector),
1usize => ::core::option::Option::Some(&self.resolution),
2usize => ::core::option::Option::Some(&self.uv_mode),
_ => ::core::option::Option::None,
}
}
fn field_at_mut(&mut self, index: usize)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match index {
0usize => ::core::option::Option::Some(&mut self.sector),
1usize =>
::core::option::Option::Some(&mut self.resolution),
2usize => ::core::option::Option::Some(&mut self.uv_mode),
_ => ::core::option::Option::None,
}
}
fn name_at(&self, index: usize) -> ::core::option::Option<&str> {
match index {
0usize => ::core::option::Option::Some("sector"),
1usize => ::core::option::Option::Some("resolution"),
2usize => ::core::option::Option::Some("uv_mode"),
_ => ::core::option::Option::None,
}
}
fn index_of_name(&self, name: &str)
-> ::core::option::Option<usize> {
match name {
"sector" => ::core::option::Option::Some(0usize),
"resolution" => ::core::option::Option::Some(1usize),
"uv_mode" => ::core::option::Option::Some(2usize),
_ => ::core::option::Option::None,
}
}
fn field_len(&self) -> usize { 3usize }
fn iter_fields(&self) -> bevy_reflect::structs::FieldIter {
bevy_reflect::structs::FieldIter::new(self)
}
fn to_dynamic_struct(&self)
->
::core::result::Result<bevy_reflect::structs::DynamicStruct,
bevy_reflect::ReflectCloneError> {
let mut dynamic: bevy_reflect::structs::DynamicStruct =
::core::default::Default::default();
dynamic.set_represented_type(bevy_reflect::PartialReflect::get_represented_type_info(self));
dynamic.insert_boxed("sector",
bevy_reflect::PartialReflect::to_dynamic(&self.sector)?);
dynamic.insert_boxed("resolution",
bevy_reflect::PartialReflect::to_dynamic(&self.resolution)?);
dynamic.insert_boxed("uv_mode",
bevy_reflect::PartialReflect::to_dynamic(&self.uv_mode)?);
::core::result::Result::Ok(dynamic)
}
}
impl bevy_reflect::PartialReflect for CircularSectorMeshBuilder where
{
#[inline]
fn get_represented_type_info(&self)
-> ::core::option::Option<&'static bevy_reflect::TypeInfo> {
::core::option::Option::Some(<Self as
bevy_reflect::Typed>::type_info())
}
#[inline]
fn try_apply(&mut self, value: &dyn bevy_reflect::PartialReflect)
-> ::core::result::Result<(), bevy_reflect::ApplyError> {
if let bevy_reflect::ReflectRef::Struct(struct_value) =
bevy_reflect::PartialReflect::reflect_ref(value) {
for (name, value) in
bevy_reflect::structs::Struct::iter_fields(struct_value) {
if let ::core::option::Option::Some(v) =
bevy_reflect::structs::Struct::field_mut(self, name) {
bevy_reflect::PartialReflect::try_apply(v, value)?;
}
}
} else {
return ::core::result::Result::Err(bevy_reflect::ApplyError::MismatchedKinds {
from_kind: bevy_reflect::PartialReflect::reflect_kind(value),
to_kind: bevy_reflect::ReflectKind::Struct,
});
}
::core::result::Result::Ok(())
}
#[inline]
fn reflect_kind(&self) -> bevy_reflect::ReflectKind {
bevy_reflect::ReflectKind::Struct
}
#[inline]
fn reflect_ref(&self) -> bevy_reflect::ReflectRef {
bevy_reflect::ReflectRef::Struct(self)
}
#[inline]
fn reflect_mut(&mut self) -> bevy_reflect::ReflectMut {
bevy_reflect::ReflectMut::Struct(self)
}
#[inline]
fn reflect_owned(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
-> bevy_reflect::ReflectOwned {
bevy_reflect::ReflectOwned::Struct(self)
}
#[inline]
fn try_into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect>> {
::core::result::Result::Ok(self)
}
#[inline]
fn try_as_reflect(&self)
-> ::core::option::Option<&dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn try_as_reflect_mut(&mut self)
-> ::core::option::Option<&mut dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn into_partial_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect> {
self
}
#[inline]
fn as_partial_reflect(&self)
-> &dyn bevy_reflect::PartialReflect {
self
}
#[inline]
fn as_partial_reflect_mut(&mut self)
-> &mut dyn bevy_reflect::PartialReflect {
self
}
fn reflect_partial_eq(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<bool> {
(bevy_reflect::structs::struct_partial_eq)(self, value)
}
fn reflect_partial_cmp(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<::core::cmp::Ordering> {
(bevy_reflect::structs::struct_partial_cmp)(self, value)
}
fn debug(&self, f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
::core::fmt::Debug::fmt(self, f)
}
#[inline]
fn reflect_clone(&self)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::ReflectCloneError> {
::core::result::Result::Ok(bevy_reflect::__macro_exports::alloc_utils::Box::new(::core::clone::Clone::clone(self)))
}
}
impl bevy_reflect::FromReflect for CircularSectorMeshBuilder where {
fn from_reflect(reflect: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<Self> {
if let bevy_reflect::ReflectRef::Struct(__ref_struct) =
bevy_reflect::PartialReflect::reflect_ref(reflect) {
let mut __this =
<Self as ::core::default::Default>::default();
if let ::core::option::Option::Some(__field) =
(||
<CircularSector as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
"sector")?))() {
__this.sector = __field;
}
if let ::core::option::Option::Some(__field) =
(||
<u32 as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
"resolution")?))() {
__this.resolution = __field;
}
if let ::core::option::Option::Some(__field) =
(||
<CircularMeshUvMode as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
"uv_mode")?))() {
__this.uv_mode = __field;
}
::core::option::Option::Some(__this)
} else { ::core::option::Option::None }
}
}
};Reflect)]
125#[reflect(Default, Debug, Clone)]
126pub struct CircularSectorMeshBuilder {
127 pub sector: CircularSector,
129 #[doc(alias = "vertices")]
132 pub resolution: u32,
133 pub uv_mode: CircularMeshUvMode,
135}
136
137impl Default for CircularSectorMeshBuilder {
138 fn default() -> Self {
139 Self {
140 sector: CircularSector::default(),
141 resolution: 32,
142 uv_mode: CircularMeshUvMode::default(),
143 }
144 }
145}
146
147impl CircularSectorMeshBuilder {
148 #[inline]
150 pub fn new(sector: CircularSector) -> Self {
151 Self {
152 sector,
153 ..Self::default()
154 }
155 }
156
157 #[inline]
159 #[doc(alias = "vertices")]
160 pub const fn resolution(mut self, resolution: u32) -> Self {
161 self.resolution = resolution;
162 self
163 }
164
165 #[inline]
167 pub const fn uv_mode(mut self, uv_mode: CircularMeshUvMode) -> Self {
168 self.uv_mode = uv_mode;
169 self
170 }
171}
172
173impl MeshBuilder for CircularSectorMeshBuilder {
174 fn build(&self) -> Mesh {
175 let resolution = self.resolution as usize;
176 let mut indices = Vec::with_capacity((resolution - 1) * 3);
177 let mut positions = Vec::with_capacity(resolution + 1);
178 let normals = ::alloc::vec::from_elem([0.0, 0.0, 1.0], resolution + 1)vec![[0.0, 0.0, 1.0]; resolution + 1];
179 let mut uvs = Vec::with_capacity(resolution + 1);
180
181 let CircularMeshUvMode::Mask { angle: uv_angle } = self.uv_mode;
182
183 positions.push([0.0; 3]);
185 uvs.push([0.5; 2]);
186
187 let first_angle = FRAC_PI_2 - self.sector.half_angle();
188 let last_angle = FRAC_PI_2 + self.sector.half_angle();
189 let last_i = (self.resolution - 1) as f32;
190 for i in 0..self.resolution {
191 let angle = f32::lerp(first_angle, last_angle, i as f32 / last_i);
192
193 let vertex = self.sector.radius() * Vec2::from_angle(angle);
195 let uv =
198 Vec2::from_angle(-(angle + uv_angle)).mul_add(Vec2::splat(0.5), Vec2::splat(0.5));
199
200 positions.push([vertex.x, vertex.y, 0.0]);
201 uvs.push([uv.x, uv.y]);
202 }
203
204 for i in 1..self.resolution {
205 indices.extend_from_slice(&[0, i, i + 1]);
207 }
208
209 Mesh::new(
210 PrimitiveTopology::TriangleList,
211 RenderAssetUsages::default(),
212 )
213 .with_inserted_attribute(Mesh::ATTRIBUTE_POSITION, positions)
214 .with_inserted_attribute(Mesh::ATTRIBUTE_NORMAL, normals)
215 .with_inserted_attribute(Mesh::ATTRIBUTE_UV_0, uvs)
216 .with_inserted_indices(Indices::U32(indices))
217 }
218}
219
220impl Extrudable for CircularSectorMeshBuilder {
221 fn perimeter(&self) -> Vec<PerimeterSegment> {
222 let (sin, cos) = ops::sin_cos(self.sector.arc.half_angle);
223 let first_normal = Vec2::new(sin, cos);
224 let last_normal = Vec2::new(-sin, cos);
225 ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[PerimeterSegment::Flat {
indices: ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[self.resolution, 0, 1])),
},
PerimeterSegment::Smooth {
first_normal,
last_normal,
indices: (1..=self.resolution).collect(),
}]))vec![
226 PerimeterSegment::Flat {
227 indices: vec![self.resolution, 0, 1],
228 },
229 PerimeterSegment::Smooth {
230 first_normal,
231 last_normal,
232 indices: (1..=self.resolution).collect(),
233 },
234 ]
235 }
236}
237
238impl Meshable for CircularSector {
239 type Output = CircularSectorMeshBuilder;
240
241 fn mesh(&self) -> Self::Output {
242 CircularSectorMeshBuilder {
243 sector: *self,
244 ..Default::default()
245 }
246 }
247}
248
249impl From<CircularSector> for Mesh {
250 fn from(sector: CircularSector) -> Self {
254 sector.mesh().build()
255 }
256}
257
258#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for CircularSegmentMeshBuilder { }
#[automatically_derived]
impl ::core::clone::Clone for CircularSegmentMeshBuilder {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<CircularSegment>;
let _: ::core::clone::AssertParamIsClone<u32>;
let _: ::core::clone::AssertParamIsClone<CircularMeshUvMode>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for CircularSegmentMeshBuilder { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for CircularSegmentMeshBuilder {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f,
"CircularSegmentMeshBuilder", "segment", &self.segment,
"resolution", &self.resolution, "uv_mode", &&self.uv_mode)
}
}Debug, const _: () =
{
impl bevy_reflect::GetTypeRegistration for CircularSegmentMeshBuilder
where {
fn get_type_registration() -> bevy_reflect::TypeRegistration {
let mut registration =
bevy_reflect::TypeRegistration::of::<Self>();
registration.insert(<bevy_reflect::ReflectFromPtr as
bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
registration.insert(<bevy_reflect::ReflectFromReflect as
bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
registration.register_type_data_with::<ReflectDefault, Self,
_>(());
registration
}
#[inline(never)]
fn register_type_dependencies(registry:
&mut bevy_reflect::TypeRegistry) {
<CircularSegment as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
<u32 as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
<CircularMeshUvMode as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
}
}
impl bevy_reflect::Typed for CircularSegmentMeshBuilder where {
#[inline(never)]
fn type_info() -> &'static bevy_reflect::TypeInfo {
static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
bevy_reflect::utility::NonGenericTypeInfoCell::new();
CELL.get_or_set(#[inline(never)] ||
{
bevy_reflect::TypeInfo::Struct(bevy_reflect::structs::StructInfo::new::<Self>(&[bevy_reflect::NamedField::new::<CircularSegment>("segment"),
bevy_reflect::NamedField::new::<u32>("resolution"),
bevy_reflect::NamedField::new::<CircularMeshUvMode>("uv_mode")]))
})
}
}
#[allow(deprecated, reason =
"derives on a deprecated type shouldn't be considered a usage")]
impl bevy_reflect::TypePath for CircularSegmentMeshBuilder where {
fn type_path() -> &'static str {
"bevy_mesh::primitives::dim2::CircularSegmentMeshBuilder"
}
fn short_type_path() -> &'static str {
"CircularSegmentMeshBuilder"
}
fn type_ident() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("CircularSegmentMeshBuilder")
}
fn crate_name() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_mesh::primitives::dim2".split(':').next().unwrap())
}
fn module_path() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_mesh::primitives::dim2")
}
}
impl bevy_reflect::Reflect for CircularSegmentMeshBuilder where {
#[inline]
fn into_any(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn ::core::any::Any> {
self
}
#[inline]
fn as_any(&self) -> &dyn ::core::any::Any { self }
#[inline]
fn as_any_mut(&mut self) -> &mut dyn ::core::any::Any { self }
#[inline]
fn into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect> {
self
}
#[inline]
fn as_reflect(&self) -> &dyn bevy_reflect::Reflect { self }
#[inline]
fn as_reflect_mut(&mut self) -> &mut dyn bevy_reflect::Reflect {
self
}
#[inline]
fn set(&mut self,
value:
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>)
->
::core::result::Result<(),
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>> {
*self = <dyn bevy_reflect::Reflect>::take(value)?;
::core::result::Result::Ok(())
}
}
#[allow(non_upper_case_globals)]
const _: () =
{
static __INVENTORY: ::inventory::Node =
::inventory::Node {
value: &{
bevy_reflect::__macro_exports::auto_register::AutomaticReflectRegistrations(<CircularSegmentMeshBuilder
as
bevy_reflect::__macro_exports::auto_register::RegisterForReflection>::__register)
},
next: ::inventory::__private::UnsafeCell::new(::inventory::__private::Option::None),
};
#[link_section = ".text.startup"]
unsafe extern "C" fn __ctor() {
unsafe {
::inventory::ErasedNode::submit(__INVENTORY.value,
&__INVENTORY)
}
}
#[used]
#[link_section = ".init_array"]
static __CTOR: unsafe extern "C" fn() = __ctor;
};
impl bevy_reflect::structs::Struct for CircularSegmentMeshBuilder
where {
fn field(&self, name: &str)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match name {
"segment" => ::core::option::Option::Some(&self.segment),
"resolution" =>
::core::option::Option::Some(&self.resolution),
"uv_mode" => ::core::option::Option::Some(&self.uv_mode),
_ => ::core::option::Option::None,
}
}
fn field_mut(&mut self, name: &str)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match name {
"segment" =>
::core::option::Option::Some(&mut self.segment),
"resolution" =>
::core::option::Option::Some(&mut self.resolution),
"uv_mode" =>
::core::option::Option::Some(&mut self.uv_mode),
_ => ::core::option::Option::None,
}
}
fn field_at(&self, index: usize)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match index {
0usize => ::core::option::Option::Some(&self.segment),
1usize => ::core::option::Option::Some(&self.resolution),
2usize => ::core::option::Option::Some(&self.uv_mode),
_ => ::core::option::Option::None,
}
}
fn field_at_mut(&mut self, index: usize)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match index {
0usize => ::core::option::Option::Some(&mut self.segment),
1usize =>
::core::option::Option::Some(&mut self.resolution),
2usize => ::core::option::Option::Some(&mut self.uv_mode),
_ => ::core::option::Option::None,
}
}
fn name_at(&self, index: usize) -> ::core::option::Option<&str> {
match index {
0usize => ::core::option::Option::Some("segment"),
1usize => ::core::option::Option::Some("resolution"),
2usize => ::core::option::Option::Some("uv_mode"),
_ => ::core::option::Option::None,
}
}
fn index_of_name(&self, name: &str)
-> ::core::option::Option<usize> {
match name {
"segment" => ::core::option::Option::Some(0usize),
"resolution" => ::core::option::Option::Some(1usize),
"uv_mode" => ::core::option::Option::Some(2usize),
_ => ::core::option::Option::None,
}
}
fn field_len(&self) -> usize { 3usize }
fn iter_fields(&self) -> bevy_reflect::structs::FieldIter {
bevy_reflect::structs::FieldIter::new(self)
}
fn to_dynamic_struct(&self)
->
::core::result::Result<bevy_reflect::structs::DynamicStruct,
bevy_reflect::ReflectCloneError> {
let mut dynamic: bevy_reflect::structs::DynamicStruct =
::core::default::Default::default();
dynamic.set_represented_type(bevy_reflect::PartialReflect::get_represented_type_info(self));
dynamic.insert_boxed("segment",
bevy_reflect::PartialReflect::to_dynamic(&self.segment)?);
dynamic.insert_boxed("resolution",
bevy_reflect::PartialReflect::to_dynamic(&self.resolution)?);
dynamic.insert_boxed("uv_mode",
bevy_reflect::PartialReflect::to_dynamic(&self.uv_mode)?);
::core::result::Result::Ok(dynamic)
}
}
impl bevy_reflect::PartialReflect for CircularSegmentMeshBuilder where
{
#[inline]
fn get_represented_type_info(&self)
-> ::core::option::Option<&'static bevy_reflect::TypeInfo> {
::core::option::Option::Some(<Self as
bevy_reflect::Typed>::type_info())
}
#[inline]
fn try_apply(&mut self, value: &dyn bevy_reflect::PartialReflect)
-> ::core::result::Result<(), bevy_reflect::ApplyError> {
if let bevy_reflect::ReflectRef::Struct(struct_value) =
bevy_reflect::PartialReflect::reflect_ref(value) {
for (name, value) in
bevy_reflect::structs::Struct::iter_fields(struct_value) {
if let ::core::option::Option::Some(v) =
bevy_reflect::structs::Struct::field_mut(self, name) {
bevy_reflect::PartialReflect::try_apply(v, value)?;
}
}
} else {
return ::core::result::Result::Err(bevy_reflect::ApplyError::MismatchedKinds {
from_kind: bevy_reflect::PartialReflect::reflect_kind(value),
to_kind: bevy_reflect::ReflectKind::Struct,
});
}
::core::result::Result::Ok(())
}
#[inline]
fn reflect_kind(&self) -> bevy_reflect::ReflectKind {
bevy_reflect::ReflectKind::Struct
}
#[inline]
fn reflect_ref(&self) -> bevy_reflect::ReflectRef {
bevy_reflect::ReflectRef::Struct(self)
}
#[inline]
fn reflect_mut(&mut self) -> bevy_reflect::ReflectMut {
bevy_reflect::ReflectMut::Struct(self)
}
#[inline]
fn reflect_owned(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
-> bevy_reflect::ReflectOwned {
bevy_reflect::ReflectOwned::Struct(self)
}
#[inline]
fn try_into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect>> {
::core::result::Result::Ok(self)
}
#[inline]
fn try_as_reflect(&self)
-> ::core::option::Option<&dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn try_as_reflect_mut(&mut self)
-> ::core::option::Option<&mut dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn into_partial_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect> {
self
}
#[inline]
fn as_partial_reflect(&self)
-> &dyn bevy_reflect::PartialReflect {
self
}
#[inline]
fn as_partial_reflect_mut(&mut self)
-> &mut dyn bevy_reflect::PartialReflect {
self
}
fn reflect_partial_eq(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<bool> {
(bevy_reflect::structs::struct_partial_eq)(self, value)
}
fn reflect_partial_cmp(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<::core::cmp::Ordering> {
(bevy_reflect::structs::struct_partial_cmp)(self, value)
}
fn debug(&self, f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
::core::fmt::Debug::fmt(self, f)
}
#[inline]
fn reflect_clone(&self)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::ReflectCloneError> {
::core::result::Result::Ok(bevy_reflect::__macro_exports::alloc_utils::Box::new(::core::clone::Clone::clone(self)))
}
}
impl bevy_reflect::FromReflect for CircularSegmentMeshBuilder where {
fn from_reflect(reflect: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<Self> {
if let bevy_reflect::ReflectRef::Struct(__ref_struct) =
bevy_reflect::PartialReflect::reflect_ref(reflect) {
let mut __this =
<Self as ::core::default::Default>::default();
if let ::core::option::Option::Some(__field) =
(||
<CircularSegment as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
"segment")?))() {
__this.segment = __field;
}
if let ::core::option::Option::Some(__field) =
(||
<u32 as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
"resolution")?))() {
__this.resolution = __field;
}
if let ::core::option::Option::Some(__field) =
(||
<CircularMeshUvMode as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
"uv_mode")?))() {
__this.uv_mode = __field;
}
::core::option::Option::Some(__this)
} else { ::core::option::Option::None }
}
}
};Reflect)]
263#[reflect(Default, Debug, Clone)]
264pub struct CircularSegmentMeshBuilder {
265 pub segment: CircularSegment,
267 #[doc(alias = "vertices")]
270 pub resolution: u32,
271 pub uv_mode: CircularMeshUvMode,
273}
274
275impl Default for CircularSegmentMeshBuilder {
276 fn default() -> Self {
277 Self {
278 segment: CircularSegment::default(),
279 resolution: 32,
280 uv_mode: CircularMeshUvMode::default(),
281 }
282 }
283}
284
285impl CircularSegmentMeshBuilder {
286 #[inline]
288 pub fn new(segment: CircularSegment) -> Self {
289 Self {
290 segment,
291 ..Self::default()
292 }
293 }
294
295 #[inline]
297 #[doc(alias = "vertices")]
298 pub const fn resolution(mut self, resolution: u32) -> Self {
299 self.resolution = resolution;
300 self
301 }
302
303 #[inline]
305 pub const fn uv_mode(mut self, uv_mode: CircularMeshUvMode) -> Self {
306 self.uv_mode = uv_mode;
307 self
308 }
309}
310
311impl MeshBuilder for CircularSegmentMeshBuilder {
312 fn build(&self) -> Mesh {
313 let resolution = self.resolution as usize;
314 let mut indices = Vec::with_capacity((resolution - 1) * 3);
315 let mut positions = Vec::with_capacity(resolution + 1);
316 let normals = ::alloc::vec::from_elem([0.0, 0.0, 1.0], resolution + 1)vec![[0.0, 0.0, 1.0]; resolution + 1];
317 let mut uvs = Vec::with_capacity(resolution + 1);
318
319 let CircularMeshUvMode::Mask { angle: uv_angle } = self.uv_mode;
320
321 let midpoint_vertex = self.segment.chord_midpoint();
323 positions.push([midpoint_vertex.x, midpoint_vertex.y, 0.0]);
324 let midpoint_uv = Vec2::from_angle(-uv_angle - FRAC_PI_2).mul_add(
329 Vec2::splat(0.5 * (self.segment.apothem() / self.segment.radius())),
330 Vec2::splat(0.5),
331 );
332 uvs.push([midpoint_uv.x, midpoint_uv.y]);
333
334 let first_angle = FRAC_PI_2 - self.segment.half_angle();
335 let last_angle = FRAC_PI_2 + self.segment.half_angle();
336 let last_i = (self.resolution - 1) as f32;
337 for i in 0..self.resolution {
338 let angle = f32::lerp(first_angle, last_angle, i as f32 / last_i);
339
340 let vertex = self.segment.radius() * Vec2::from_angle(angle);
342 let uv =
345 Vec2::from_angle(-(angle + uv_angle)).mul_add(Vec2::splat(0.5), Vec2::splat(0.5));
346
347 positions.push([vertex.x, vertex.y, 0.0]);
348 uvs.push([uv.x, uv.y]);
349 }
350
351 for i in 1..self.resolution {
352 indices.extend_from_slice(&[0, i, i + 1]);
354 }
355
356 Mesh::new(
357 PrimitiveTopology::TriangleList,
358 RenderAssetUsages::default(),
359 )
360 .with_inserted_attribute(Mesh::ATTRIBUTE_POSITION, positions)
361 .with_inserted_attribute(Mesh::ATTRIBUTE_NORMAL, normals)
362 .with_inserted_attribute(Mesh::ATTRIBUTE_UV_0, uvs)
363 .with_inserted_indices(Indices::U32(indices))
364 }
365}
366
367impl Extrudable for CircularSegmentMeshBuilder {
368 fn perimeter(&self) -> Vec<PerimeterSegment> {
369 let (sin, cos) = ops::sin_cos(self.segment.arc.half_angle);
370 let first_normal = Vec2::new(sin, cos);
371 let last_normal = Vec2::new(-sin, cos);
372 ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[PerimeterSegment::Flat {
indices: ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[self.resolution, 0, 1])),
},
PerimeterSegment::Smooth {
first_normal,
last_normal,
indices: (1..=self.resolution).collect(),
}]))vec![
373 PerimeterSegment::Flat {
374 indices: vec![self.resolution, 0, 1],
375 },
376 PerimeterSegment::Smooth {
377 first_normal,
378 last_normal,
379 indices: (1..=self.resolution).collect(),
380 },
381 ]
382 }
383}
384
385impl Meshable for CircularSegment {
386 type Output = CircularSegmentMeshBuilder;
387
388 fn mesh(&self) -> Self::Output {
389 CircularSegmentMeshBuilder {
390 segment: *self,
391 ..Default::default()
392 }
393 }
394}
395
396impl From<CircularSegment> for Mesh {
397 fn from(segment: CircularSegment) -> Self {
401 segment.mesh().build()
402 }
403}
404
405#[derive(#[automatically_derived]
impl ::core::clone::Clone for ConvexPolygonMeshBuilder {
#[inline]
fn clone(&self) -> Self {
Self { vertices: ::core::clone::Clone::clone(&self.vertices) }
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for ConvexPolygonMeshBuilder {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f,
"ConvexPolygonMeshBuilder", "vertices", &&self.vertices)
}
}Debug, const _: () =
{
impl bevy_reflect::GetTypeRegistration for ConvexPolygonMeshBuilder
where {
fn get_type_registration() -> bevy_reflect::TypeRegistration {
let mut registration =
bevy_reflect::TypeRegistration::of::<Self>();
registration.insert(<bevy_reflect::ReflectFromPtr as
bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
registration.insert(<bevy_reflect::ReflectFromReflect as
bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
registration
}
#[inline(never)]
fn register_type_dependencies(registry:
&mut bevy_reflect::TypeRegistry) {
<Vec<Vec2> as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
}
}
impl bevy_reflect::Typed for ConvexPolygonMeshBuilder where {
#[inline(never)]
fn type_info() -> &'static bevy_reflect::TypeInfo {
static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
bevy_reflect::utility::NonGenericTypeInfoCell::new();
CELL.get_or_set(#[inline(never)] ||
{
bevy_reflect::TypeInfo::Struct(bevy_reflect::structs::StructInfo::new::<Self>(&[bevy_reflect::NamedField::new::<Vec<Vec2>>("vertices")]))
})
}
}
#[allow(deprecated, reason =
"derives on a deprecated type shouldn't be considered a usage")]
impl bevy_reflect::TypePath for ConvexPolygonMeshBuilder where {
fn type_path() -> &'static str {
"bevy_mesh::primitives::dim2::ConvexPolygonMeshBuilder"
}
fn short_type_path() -> &'static str {
"ConvexPolygonMeshBuilder"
}
fn type_ident() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("ConvexPolygonMeshBuilder")
}
fn crate_name() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_mesh::primitives::dim2".split(':').next().unwrap())
}
fn module_path() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_mesh::primitives::dim2")
}
}
impl bevy_reflect::Reflect for ConvexPolygonMeshBuilder where {
#[inline]
fn into_any(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn ::core::any::Any> {
self
}
#[inline]
fn as_any(&self) -> &dyn ::core::any::Any { self }
#[inline]
fn as_any_mut(&mut self) -> &mut dyn ::core::any::Any { self }
#[inline]
fn into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect> {
self
}
#[inline]
fn as_reflect(&self) -> &dyn bevy_reflect::Reflect { self }
#[inline]
fn as_reflect_mut(&mut self) -> &mut dyn bevy_reflect::Reflect {
self
}
#[inline]
fn set(&mut self,
value:
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>)
->
::core::result::Result<(),
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>> {
*self = <dyn bevy_reflect::Reflect>::take(value)?;
::core::result::Result::Ok(())
}
}
#[allow(non_upper_case_globals)]
const _: () =
{
static __INVENTORY: ::inventory::Node =
::inventory::Node {
value: &{
bevy_reflect::__macro_exports::auto_register::AutomaticReflectRegistrations(<ConvexPolygonMeshBuilder
as
bevy_reflect::__macro_exports::auto_register::RegisterForReflection>::__register)
},
next: ::inventory::__private::UnsafeCell::new(::inventory::__private::Option::None),
};
#[link_section = ".text.startup"]
unsafe extern "C" fn __ctor() {
unsafe {
::inventory::ErasedNode::submit(__INVENTORY.value,
&__INVENTORY)
}
}
#[used]
#[link_section = ".init_array"]
static __CTOR: unsafe extern "C" fn() = __ctor;
};
impl bevy_reflect::structs::Struct for ConvexPolygonMeshBuilder where
{
fn field(&self, name: &str)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match name {
"vertices" => ::core::option::Option::Some(&self.vertices),
_ => ::core::option::Option::None,
}
}
fn field_mut(&mut self, name: &str)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match name {
"vertices" =>
::core::option::Option::Some(&mut self.vertices),
_ => ::core::option::Option::None,
}
}
fn field_at(&self, index: usize)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match index {
0usize => ::core::option::Option::Some(&self.vertices),
_ => ::core::option::Option::None,
}
}
fn field_at_mut(&mut self, index: usize)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match index {
0usize => ::core::option::Option::Some(&mut self.vertices),
_ => ::core::option::Option::None,
}
}
fn name_at(&self, index: usize) -> ::core::option::Option<&str> {
match index {
0usize => ::core::option::Option::Some("vertices"),
_ => ::core::option::Option::None,
}
}
fn index_of_name(&self, name: &str)
-> ::core::option::Option<usize> {
match name {
"vertices" => ::core::option::Option::Some(0usize),
_ => ::core::option::Option::None,
}
}
fn field_len(&self) -> usize { 1usize }
fn iter_fields(&self) -> bevy_reflect::structs::FieldIter {
bevy_reflect::structs::FieldIter::new(self)
}
fn to_dynamic_struct(&self)
->
::core::result::Result<bevy_reflect::structs::DynamicStruct,
bevy_reflect::ReflectCloneError> {
let mut dynamic: bevy_reflect::structs::DynamicStruct =
::core::default::Default::default();
dynamic.set_represented_type(bevy_reflect::PartialReflect::get_represented_type_info(self));
dynamic.insert_boxed("vertices",
bevy_reflect::PartialReflect::to_dynamic(&self.vertices)?);
::core::result::Result::Ok(dynamic)
}
}
impl bevy_reflect::PartialReflect for ConvexPolygonMeshBuilder where
{
#[inline]
fn get_represented_type_info(&self)
-> ::core::option::Option<&'static bevy_reflect::TypeInfo> {
::core::option::Option::Some(<Self as
bevy_reflect::Typed>::type_info())
}
#[inline]
fn try_apply(&mut self, value: &dyn bevy_reflect::PartialReflect)
-> ::core::result::Result<(), bevy_reflect::ApplyError> {
if let bevy_reflect::ReflectRef::Struct(struct_value) =
bevy_reflect::PartialReflect::reflect_ref(value) {
for (name, value) in
bevy_reflect::structs::Struct::iter_fields(struct_value) {
if let ::core::option::Option::Some(v) =
bevy_reflect::structs::Struct::field_mut(self, name) {
bevy_reflect::PartialReflect::try_apply(v, value)?;
}
}
} else {
return ::core::result::Result::Err(bevy_reflect::ApplyError::MismatchedKinds {
from_kind: bevy_reflect::PartialReflect::reflect_kind(value),
to_kind: bevy_reflect::ReflectKind::Struct,
});
}
::core::result::Result::Ok(())
}
#[inline]
fn reflect_kind(&self) -> bevy_reflect::ReflectKind {
bevy_reflect::ReflectKind::Struct
}
#[inline]
fn reflect_ref(&self) -> bevy_reflect::ReflectRef {
bevy_reflect::ReflectRef::Struct(self)
}
#[inline]
fn reflect_mut(&mut self) -> bevy_reflect::ReflectMut {
bevy_reflect::ReflectMut::Struct(self)
}
#[inline]
fn reflect_owned(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
-> bevy_reflect::ReflectOwned {
bevy_reflect::ReflectOwned::Struct(self)
}
#[inline]
fn try_into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect>> {
::core::result::Result::Ok(self)
}
#[inline]
fn try_as_reflect(&self)
-> ::core::option::Option<&dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn try_as_reflect_mut(&mut self)
-> ::core::option::Option<&mut dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn into_partial_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect> {
self
}
#[inline]
fn as_partial_reflect(&self)
-> &dyn bevy_reflect::PartialReflect {
self
}
#[inline]
fn as_partial_reflect_mut(&mut self)
-> &mut dyn bevy_reflect::PartialReflect {
self
}
fn reflect_partial_eq(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<bool> {
(bevy_reflect::structs::struct_partial_eq)(self, value)
}
fn reflect_partial_cmp(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<::core::cmp::Ordering> {
(bevy_reflect::structs::struct_partial_cmp)(self, value)
}
fn debug(&self, f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
::core::fmt::Debug::fmt(self, f)
}
#[inline]
fn reflect_clone(&self)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::ReflectCloneError> {
::core::result::Result::Ok(bevy_reflect::__macro_exports::alloc_utils::Box::new(::core::clone::Clone::clone(self)))
}
}
impl bevy_reflect::FromReflect for ConvexPolygonMeshBuilder where {
fn from_reflect(reflect: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<Self> {
if let bevy_reflect::ReflectRef::Struct(__ref_struct) =
bevy_reflect::PartialReflect::reflect_ref(reflect) {
let __this =
Self {
vertices: <Vec<Vec2> as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
"vertices")?)?,
};
::core::option::Option::Some(__this)
} else { ::core::option::Option::None }
}
}
};Reflect)]
410#[reflect(Debug, Clone)]
411pub struct ConvexPolygonMeshBuilder {
412 pub vertices: Vec<Vec2>,
413}
414
415impl Meshable for ConvexPolygon {
416 type Output = ConvexPolygonMeshBuilder;
417
418 fn mesh(&self) -> Self::Output {
419 Self::Output {
420 vertices: self.vertices().to_vec(),
421 }
422 }
423}
424
425impl MeshBuilder for ConvexPolygonMeshBuilder {
426 fn build(&self) -> Mesh {
427 let len = self.vertices.len();
428 let mut indices = Vec::with_capacity((len - 2) * 3);
429 let mut positions = Vec::with_capacity(len);
430 let normals = ::alloc::vec::from_elem([0.0, 0.0, 1.0], len)vec![[0.0, 0.0, 1.0]; len];
431 let mut uvs = Vec::with_capacity(len);
432
433 let mut min = Vec2::splat(f32::INFINITY);
434 let mut max = Vec2::splat(f32::NEG_INFINITY);
435
436 for vertex in &self.vertices {
437 min = min.min(*vertex);
438 max = max.max(*vertex);
439 }
440
441 let size = (max - min).max(Vec2::splat(f32::EPSILON));
442
443 for vertex in &self.vertices {
444 positions.push([vertex.x, vertex.y, 0.0]);
445 let uv = (*vertex - min) / size;
446 uvs.push([uv.x, uv.y]);
448 }
449 for i in 2..len as u32 {
450 indices.extend_from_slice(&[0, i - 1, i]);
451 }
452 Mesh::new(
453 PrimitiveTopology::TriangleList,
454 RenderAssetUsages::default(),
455 )
456 .with_inserted_attribute(Mesh::ATTRIBUTE_POSITION, positions)
457 .with_inserted_attribute(Mesh::ATTRIBUTE_NORMAL, normals)
458 .with_inserted_attribute(Mesh::ATTRIBUTE_UV_0, uvs)
459 .with_inserted_indices(Indices::U32(indices))
460 }
461}
462
463impl Extrudable for ConvexPolygonMeshBuilder {
464 fn perimeter(&self) -> Vec<PerimeterSegment> {
465 ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[PerimeterSegment::Flat {
indices: (0..self.vertices.len() as
u32).chain([0]).collect(),
}]))vec![PerimeterSegment::Flat {
466 indices: (0..self.vertices.len() as u32).chain([0]).collect(),
467 }]
468 }
469}
470
471impl From<ConvexPolygon> for Mesh {
472 fn from(polygon: ConvexPolygon) -> Self {
473 polygon.mesh().build()
474 }
475}
476
477#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for RegularPolygonMeshBuilder { }
#[automatically_derived]
impl ::core::clone::Clone for RegularPolygonMeshBuilder {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<f32>;
let _: ::core::clone::AssertParamIsClone<u32>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for RegularPolygonMeshBuilder { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for RegularPolygonMeshBuilder {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"RegularPolygonMeshBuilder", "circumradius", &self.circumradius,
"sides", &&self.sides)
}
}Debug, const _: () =
{
impl bevy_reflect::GetTypeRegistration for RegularPolygonMeshBuilder
where {
fn get_type_registration() -> bevy_reflect::TypeRegistration {
let mut registration =
bevy_reflect::TypeRegistration::of::<Self>();
registration.insert(<bevy_reflect::ReflectFromPtr as
bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
registration.insert(<bevy_reflect::ReflectFromReflect as
bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
registration.register_type_data_with::<ReflectDefault, Self,
_>(());
registration
}
#[inline(never)]
fn register_type_dependencies(registry:
&mut bevy_reflect::TypeRegistry) {
<f32 as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
<u32 as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
}
}
impl bevy_reflect::Typed for RegularPolygonMeshBuilder where {
#[inline(never)]
fn type_info() -> &'static bevy_reflect::TypeInfo {
static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
bevy_reflect::utility::NonGenericTypeInfoCell::new();
CELL.get_or_set(#[inline(never)] ||
{
bevy_reflect::TypeInfo::Struct(bevy_reflect::structs::StructInfo::new::<Self>(&[bevy_reflect::NamedField::new::<f32>("circumradius"),
bevy_reflect::NamedField::new::<u32>("sides")]))
})
}
}
#[allow(deprecated, reason =
"derives on a deprecated type shouldn't be considered a usage")]
impl bevy_reflect::TypePath for RegularPolygonMeshBuilder where {
fn type_path() -> &'static str {
"bevy_mesh::primitives::dim2::RegularPolygonMeshBuilder"
}
fn short_type_path() -> &'static str {
"RegularPolygonMeshBuilder"
}
fn type_ident() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("RegularPolygonMeshBuilder")
}
fn crate_name() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_mesh::primitives::dim2".split(':').next().unwrap())
}
fn module_path() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_mesh::primitives::dim2")
}
}
impl bevy_reflect::Reflect for RegularPolygonMeshBuilder where {
#[inline]
fn into_any(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn ::core::any::Any> {
self
}
#[inline]
fn as_any(&self) -> &dyn ::core::any::Any { self }
#[inline]
fn as_any_mut(&mut self) -> &mut dyn ::core::any::Any { self }
#[inline]
fn into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect> {
self
}
#[inline]
fn as_reflect(&self) -> &dyn bevy_reflect::Reflect { self }
#[inline]
fn as_reflect_mut(&mut self) -> &mut dyn bevy_reflect::Reflect {
self
}
#[inline]
fn set(&mut self,
value:
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>)
->
::core::result::Result<(),
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>> {
*self = <dyn bevy_reflect::Reflect>::take(value)?;
::core::result::Result::Ok(())
}
}
#[allow(non_upper_case_globals)]
const _: () =
{
static __INVENTORY: ::inventory::Node =
::inventory::Node {
value: &{
bevy_reflect::__macro_exports::auto_register::AutomaticReflectRegistrations(<RegularPolygonMeshBuilder
as
bevy_reflect::__macro_exports::auto_register::RegisterForReflection>::__register)
},
next: ::inventory::__private::UnsafeCell::new(::inventory::__private::Option::None),
};
#[link_section = ".text.startup"]
unsafe extern "C" fn __ctor() {
unsafe {
::inventory::ErasedNode::submit(__INVENTORY.value,
&__INVENTORY)
}
}
#[used]
#[link_section = ".init_array"]
static __CTOR: unsafe extern "C" fn() = __ctor;
};
impl bevy_reflect::structs::Struct for RegularPolygonMeshBuilder where
{
fn field(&self, name: &str)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match name {
"circumradius" =>
::core::option::Option::Some(&self.circumradius),
"sides" => ::core::option::Option::Some(&self.sides),
_ => ::core::option::Option::None,
}
}
fn field_mut(&mut self, name: &str)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match name {
"circumradius" =>
::core::option::Option::Some(&mut self.circumradius),
"sides" => ::core::option::Option::Some(&mut self.sides),
_ => ::core::option::Option::None,
}
}
fn field_at(&self, index: usize)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match index {
0usize => ::core::option::Option::Some(&self.circumradius),
1usize => ::core::option::Option::Some(&self.sides),
_ => ::core::option::Option::None,
}
}
fn field_at_mut(&mut self, index: usize)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match index {
0usize =>
::core::option::Option::Some(&mut self.circumradius),
1usize => ::core::option::Option::Some(&mut self.sides),
_ => ::core::option::Option::None,
}
}
fn name_at(&self, index: usize) -> ::core::option::Option<&str> {
match index {
0usize => ::core::option::Option::Some("circumradius"),
1usize => ::core::option::Option::Some("sides"),
_ => ::core::option::Option::None,
}
}
fn index_of_name(&self, name: &str)
-> ::core::option::Option<usize> {
match name {
"circumradius" => ::core::option::Option::Some(0usize),
"sides" => ::core::option::Option::Some(1usize),
_ => ::core::option::Option::None,
}
}
fn field_len(&self) -> usize { 2usize }
fn iter_fields(&self) -> bevy_reflect::structs::FieldIter {
bevy_reflect::structs::FieldIter::new(self)
}
fn to_dynamic_struct(&self)
->
::core::result::Result<bevy_reflect::structs::DynamicStruct,
bevy_reflect::ReflectCloneError> {
let mut dynamic: bevy_reflect::structs::DynamicStruct =
::core::default::Default::default();
dynamic.set_represented_type(bevy_reflect::PartialReflect::get_represented_type_info(self));
dynamic.insert_boxed("circumradius",
bevy_reflect::PartialReflect::to_dynamic(&self.circumradius)?);
dynamic.insert_boxed("sides",
bevy_reflect::PartialReflect::to_dynamic(&self.sides)?);
::core::result::Result::Ok(dynamic)
}
}
impl bevy_reflect::PartialReflect for RegularPolygonMeshBuilder where
{
#[inline]
fn get_represented_type_info(&self)
-> ::core::option::Option<&'static bevy_reflect::TypeInfo> {
::core::option::Option::Some(<Self as
bevy_reflect::Typed>::type_info())
}
#[inline]
fn try_apply(&mut self, value: &dyn bevy_reflect::PartialReflect)
-> ::core::result::Result<(), bevy_reflect::ApplyError> {
if let bevy_reflect::ReflectRef::Struct(struct_value) =
bevy_reflect::PartialReflect::reflect_ref(value) {
for (name, value) in
bevy_reflect::structs::Struct::iter_fields(struct_value) {
if let ::core::option::Option::Some(v) =
bevy_reflect::structs::Struct::field_mut(self, name) {
bevy_reflect::PartialReflect::try_apply(v, value)?;
}
}
} else {
return ::core::result::Result::Err(bevy_reflect::ApplyError::MismatchedKinds {
from_kind: bevy_reflect::PartialReflect::reflect_kind(value),
to_kind: bevy_reflect::ReflectKind::Struct,
});
}
::core::result::Result::Ok(())
}
#[inline]
fn reflect_kind(&self) -> bevy_reflect::ReflectKind {
bevy_reflect::ReflectKind::Struct
}
#[inline]
fn reflect_ref(&self) -> bevy_reflect::ReflectRef {
bevy_reflect::ReflectRef::Struct(self)
}
#[inline]
fn reflect_mut(&mut self) -> bevy_reflect::ReflectMut {
bevy_reflect::ReflectMut::Struct(self)
}
#[inline]
fn reflect_owned(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
-> bevy_reflect::ReflectOwned {
bevy_reflect::ReflectOwned::Struct(self)
}
#[inline]
fn try_into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect>> {
::core::result::Result::Ok(self)
}
#[inline]
fn try_as_reflect(&self)
-> ::core::option::Option<&dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn try_as_reflect_mut(&mut self)
-> ::core::option::Option<&mut dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn into_partial_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect> {
self
}
#[inline]
fn as_partial_reflect(&self)
-> &dyn bevy_reflect::PartialReflect {
self
}
#[inline]
fn as_partial_reflect_mut(&mut self)
-> &mut dyn bevy_reflect::PartialReflect {
self
}
fn reflect_partial_eq(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<bool> {
(bevy_reflect::structs::struct_partial_eq)(self, value)
}
fn reflect_partial_cmp(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<::core::cmp::Ordering> {
(bevy_reflect::structs::struct_partial_cmp)(self, value)
}
fn debug(&self, f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
::core::fmt::Debug::fmt(self, f)
}
#[inline]
fn reflect_clone(&self)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::ReflectCloneError> {
::core::result::Result::Ok(bevy_reflect::__macro_exports::alloc_utils::Box::new(::core::clone::Clone::clone(self)))
}
}
impl bevy_reflect::FromReflect for RegularPolygonMeshBuilder where {
fn from_reflect(reflect: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<Self> {
if let bevy_reflect::ReflectRef::Struct(__ref_struct) =
bevy_reflect::PartialReflect::reflect_ref(reflect) {
let mut __this =
<Self as ::core::default::Default>::default();
if let ::core::option::Option::Some(__field) =
(||
<f32 as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
"circumradius")?))() {
__this.circumradius = __field;
}
if let ::core::option::Option::Some(__field) =
(||
<u32 as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
"sides")?))() {
__this.sides = __field;
}
::core::option::Option::Some(__this)
} else { ::core::option::Option::None }
}
}
};Reflect)]
479#[reflect(Default, Debug, Clone)]
480pub struct RegularPolygonMeshBuilder {
481 circumradius: f32,
482 sides: u32,
483}
484
485impl Default for RegularPolygonMeshBuilder {
486 fn default() -> Self {
488 Self {
489 circumradius: 0.5,
490 sides: 6,
491 }
492 }
493}
494
495impl RegularPolygonMeshBuilder {
496 pub const fn new(circumradius: f32, sides: u32) -> Self {
503 if true {
if !circumradius.is_sign_positive() {
{
::core::panicking::panic_fmt(format_args!("polygon has a negative radius"));
}
};
};debug_assert!(
504 circumradius.is_sign_positive(),
505 "polygon has a negative radius"
506 );
507 if true {
if !(sides > 2) {
{
::core::panicking::panic_fmt(format_args!("polygon has less than 3 sides"));
}
};
};debug_assert!(sides > 2, "polygon has less than 3 sides");
508
509 Self {
510 circumradius,
511 sides,
512 }
513 }
514}
515
516impl Meshable for RegularPolygon {
517 type Output = RegularPolygonMeshBuilder;
518
519 fn mesh(&self) -> Self::Output {
520 Self::Output {
521 circumradius: self.circumcircle.radius,
522 sides: self.sides,
523 }
524 }
525}
526
527impl MeshBuilder for RegularPolygonMeshBuilder {
528 fn build(&self) -> Mesh {
529 Ellipse::new(self.circumradius, self.circumradius)
531 .mesh()
532 .resolution(self.sides)
533 .build()
534 }
535}
536
537impl Extrudable for RegularPolygonMeshBuilder {
538 fn perimeter(&self) -> Vec<PerimeterSegment> {
539 ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[PerimeterSegment::Flat {
indices: (0..self.sides).chain([0]).collect(),
}]))vec![PerimeterSegment::Flat {
540 indices: (0..self.sides).chain([0]).collect(),
541 }]
542 }
543}
544
545impl From<RegularPolygon> for Mesh {
546 fn from(polygon: RegularPolygon) -> Self {
547 polygon.mesh().build()
548 }
549}
550
551#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for EllipseMeshBuilder { }
#[automatically_derived]
impl ::core::clone::Clone for EllipseMeshBuilder {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Ellipse>;
let _: ::core::clone::AssertParamIsClone<u32>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for EllipseMeshBuilder { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for EllipseMeshBuilder {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"EllipseMeshBuilder", "ellipse", &self.ellipse, "resolution",
&&self.resolution)
}
}Debug, const _: () =
{
impl bevy_reflect::GetTypeRegistration for EllipseMeshBuilder where {
fn get_type_registration() -> bevy_reflect::TypeRegistration {
let mut registration =
bevy_reflect::TypeRegistration::of::<Self>();
registration.insert(<bevy_reflect::ReflectFromPtr as
bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
registration.insert(<bevy_reflect::ReflectFromReflect as
bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
registration.register_type_data_with::<ReflectDefault, Self,
_>(());
registration
}
#[inline(never)]
fn register_type_dependencies(registry:
&mut bevy_reflect::TypeRegistry) {
<Ellipse as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
<u32 as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
}
}
impl bevy_reflect::Typed for EllipseMeshBuilder where {
#[inline(never)]
fn type_info() -> &'static bevy_reflect::TypeInfo {
static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
bevy_reflect::utility::NonGenericTypeInfoCell::new();
CELL.get_or_set(#[inline(never)] ||
{
bevy_reflect::TypeInfo::Struct(bevy_reflect::structs::StructInfo::new::<Self>(&[bevy_reflect::NamedField::new::<Ellipse>("ellipse"),
bevy_reflect::NamedField::new::<u32>("resolution")]))
})
}
}
#[allow(deprecated, reason =
"derives on a deprecated type shouldn't be considered a usage")]
impl bevy_reflect::TypePath for EllipseMeshBuilder where {
fn type_path() -> &'static str {
"bevy_mesh::primitives::dim2::EllipseMeshBuilder"
}
fn short_type_path() -> &'static str { "EllipseMeshBuilder" }
fn type_ident() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("EllipseMeshBuilder")
}
fn crate_name() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_mesh::primitives::dim2".split(':').next().unwrap())
}
fn module_path() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_mesh::primitives::dim2")
}
}
impl bevy_reflect::Reflect for EllipseMeshBuilder where {
#[inline]
fn into_any(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn ::core::any::Any> {
self
}
#[inline]
fn as_any(&self) -> &dyn ::core::any::Any { self }
#[inline]
fn as_any_mut(&mut self) -> &mut dyn ::core::any::Any { self }
#[inline]
fn into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect> {
self
}
#[inline]
fn as_reflect(&self) -> &dyn bevy_reflect::Reflect { self }
#[inline]
fn as_reflect_mut(&mut self) -> &mut dyn bevy_reflect::Reflect {
self
}
#[inline]
fn set(&mut self,
value:
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>)
->
::core::result::Result<(),
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>> {
*self = <dyn bevy_reflect::Reflect>::take(value)?;
::core::result::Result::Ok(())
}
}
#[allow(non_upper_case_globals)]
const _: () =
{
static __INVENTORY: ::inventory::Node =
::inventory::Node {
value: &{
bevy_reflect::__macro_exports::auto_register::AutomaticReflectRegistrations(<EllipseMeshBuilder
as
bevy_reflect::__macro_exports::auto_register::RegisterForReflection>::__register)
},
next: ::inventory::__private::UnsafeCell::new(::inventory::__private::Option::None),
};
#[link_section = ".text.startup"]
unsafe extern "C" fn __ctor() {
unsafe {
::inventory::ErasedNode::submit(__INVENTORY.value,
&__INVENTORY)
}
}
#[used]
#[link_section = ".init_array"]
static __CTOR: unsafe extern "C" fn() = __ctor;
};
impl bevy_reflect::structs::Struct for EllipseMeshBuilder where {
fn field(&self, name: &str)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match name {
"ellipse" => ::core::option::Option::Some(&self.ellipse),
"resolution" =>
::core::option::Option::Some(&self.resolution),
_ => ::core::option::Option::None,
}
}
fn field_mut(&mut self, name: &str)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match name {
"ellipse" =>
::core::option::Option::Some(&mut self.ellipse),
"resolution" =>
::core::option::Option::Some(&mut self.resolution),
_ => ::core::option::Option::None,
}
}
fn field_at(&self, index: usize)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match index {
0usize => ::core::option::Option::Some(&self.ellipse),
1usize => ::core::option::Option::Some(&self.resolution),
_ => ::core::option::Option::None,
}
}
fn field_at_mut(&mut self, index: usize)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match index {
0usize => ::core::option::Option::Some(&mut self.ellipse),
1usize =>
::core::option::Option::Some(&mut self.resolution),
_ => ::core::option::Option::None,
}
}
fn name_at(&self, index: usize) -> ::core::option::Option<&str> {
match index {
0usize => ::core::option::Option::Some("ellipse"),
1usize => ::core::option::Option::Some("resolution"),
_ => ::core::option::Option::None,
}
}
fn index_of_name(&self, name: &str)
-> ::core::option::Option<usize> {
match name {
"ellipse" => ::core::option::Option::Some(0usize),
"resolution" => ::core::option::Option::Some(1usize),
_ => ::core::option::Option::None,
}
}
fn field_len(&self) -> usize { 2usize }
fn iter_fields(&self) -> bevy_reflect::structs::FieldIter {
bevy_reflect::structs::FieldIter::new(self)
}
fn to_dynamic_struct(&self)
->
::core::result::Result<bevy_reflect::structs::DynamicStruct,
bevy_reflect::ReflectCloneError> {
let mut dynamic: bevy_reflect::structs::DynamicStruct =
::core::default::Default::default();
dynamic.set_represented_type(bevy_reflect::PartialReflect::get_represented_type_info(self));
dynamic.insert_boxed("ellipse",
bevy_reflect::PartialReflect::to_dynamic(&self.ellipse)?);
dynamic.insert_boxed("resolution",
bevy_reflect::PartialReflect::to_dynamic(&self.resolution)?);
::core::result::Result::Ok(dynamic)
}
}
impl bevy_reflect::PartialReflect for EllipseMeshBuilder where {
#[inline]
fn get_represented_type_info(&self)
-> ::core::option::Option<&'static bevy_reflect::TypeInfo> {
::core::option::Option::Some(<Self as
bevy_reflect::Typed>::type_info())
}
#[inline]
fn try_apply(&mut self, value: &dyn bevy_reflect::PartialReflect)
-> ::core::result::Result<(), bevy_reflect::ApplyError> {
if let bevy_reflect::ReflectRef::Struct(struct_value) =
bevy_reflect::PartialReflect::reflect_ref(value) {
for (name, value) in
bevy_reflect::structs::Struct::iter_fields(struct_value) {
if let ::core::option::Option::Some(v) =
bevy_reflect::structs::Struct::field_mut(self, name) {
bevy_reflect::PartialReflect::try_apply(v, value)?;
}
}
} else {
return ::core::result::Result::Err(bevy_reflect::ApplyError::MismatchedKinds {
from_kind: bevy_reflect::PartialReflect::reflect_kind(value),
to_kind: bevy_reflect::ReflectKind::Struct,
});
}
::core::result::Result::Ok(())
}
#[inline]
fn reflect_kind(&self) -> bevy_reflect::ReflectKind {
bevy_reflect::ReflectKind::Struct
}
#[inline]
fn reflect_ref(&self) -> bevy_reflect::ReflectRef {
bevy_reflect::ReflectRef::Struct(self)
}
#[inline]
fn reflect_mut(&mut self) -> bevy_reflect::ReflectMut {
bevy_reflect::ReflectMut::Struct(self)
}
#[inline]
fn reflect_owned(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
-> bevy_reflect::ReflectOwned {
bevy_reflect::ReflectOwned::Struct(self)
}
#[inline]
fn try_into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect>> {
::core::result::Result::Ok(self)
}
#[inline]
fn try_as_reflect(&self)
-> ::core::option::Option<&dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn try_as_reflect_mut(&mut self)
-> ::core::option::Option<&mut dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn into_partial_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect> {
self
}
#[inline]
fn as_partial_reflect(&self)
-> &dyn bevy_reflect::PartialReflect {
self
}
#[inline]
fn as_partial_reflect_mut(&mut self)
-> &mut dyn bevy_reflect::PartialReflect {
self
}
fn reflect_partial_eq(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<bool> {
(bevy_reflect::structs::struct_partial_eq)(self, value)
}
fn reflect_partial_cmp(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<::core::cmp::Ordering> {
(bevy_reflect::structs::struct_partial_cmp)(self, value)
}
fn debug(&self, f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
::core::fmt::Debug::fmt(self, f)
}
#[inline]
fn reflect_clone(&self)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::ReflectCloneError> {
::core::result::Result::Ok(bevy_reflect::__macro_exports::alloc_utils::Box::new(::core::clone::Clone::clone(self)))
}
}
impl bevy_reflect::FromReflect for EllipseMeshBuilder where {
fn from_reflect(reflect: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<Self> {
if let bevy_reflect::ReflectRef::Struct(__ref_struct) =
bevy_reflect::PartialReflect::reflect_ref(reflect) {
let mut __this =
<Self as ::core::default::Default>::default();
if let ::core::option::Option::Some(__field) =
(||
<Ellipse as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
"ellipse")?))() {
__this.ellipse = __field;
}
if let ::core::option::Option::Some(__field) =
(||
<u32 as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
"resolution")?))() {
__this.resolution = __field;
}
::core::option::Option::Some(__this)
} else { ::core::option::Option::None }
}
}
};Reflect)]
553#[reflect(Default, Debug, Clone)]
554pub struct EllipseMeshBuilder {
555 pub ellipse: Ellipse,
557 #[doc(alias = "vertices")]
560 pub resolution: u32,
561}
562
563impl Default for EllipseMeshBuilder {
564 fn default() -> Self {
565 Self {
566 ellipse: Ellipse::default(),
567 resolution: 32,
568 }
569 }
570}
571
572impl EllipseMeshBuilder {
573 #[inline]
575 pub const fn new(half_width: f32, half_height: f32, resolution: u32) -> Self {
576 Self {
577 ellipse: Ellipse::new(half_width, half_height),
578 resolution,
579 }
580 }
581
582 #[inline]
584 #[doc(alias = "vertices")]
585 pub const fn resolution(mut self, resolution: u32) -> Self {
586 self.resolution = resolution;
587 self
588 }
589}
590
591impl MeshBuilder for EllipseMeshBuilder {
592 fn build(&self) -> Mesh {
593 let resolution = self.resolution as usize;
594 let mut indices = Vec::with_capacity((resolution - 2) * 3);
595 let mut positions = Vec::with_capacity(resolution);
596 let normals = ::alloc::vec::from_elem([0.0, 0.0, 1.0], resolution)vec![[0.0, 0.0, 1.0]; resolution];
597 let mut uvs = Vec::with_capacity(resolution);
598
599 let start_angle = FRAC_PI_2;
601 let step = core::f32::consts::TAU / self.resolution as f32;
602
603 for i in 0..self.resolution {
604 let theta = start_angle + i as f32 * step;
606 let (sin, cos) = ops::sin_cos(theta);
607 let x = cos * self.ellipse.half_size.x;
608 let y = sin * self.ellipse.half_size.y;
609
610 positions.push([x, y, 0.0]);
611 uvs.push([0.5 * (cos + 1.0), 1.0 - 0.5 * (sin + 1.0)]);
612 }
613
614 for i in 1..(self.resolution - 1) {
615 indices.extend_from_slice(&[0, i, i + 1]);
616 }
617
618 Mesh::new(
619 PrimitiveTopology::TriangleList,
620 RenderAssetUsages::default(),
621 )
622 .with_inserted_attribute(Mesh::ATTRIBUTE_POSITION, positions)
623 .with_inserted_attribute(Mesh::ATTRIBUTE_NORMAL, normals)
624 .with_inserted_attribute(Mesh::ATTRIBUTE_UV_0, uvs)
625 .with_inserted_indices(Indices::U32(indices))
626 }
627}
628
629impl Extrudable for EllipseMeshBuilder {
630 fn perimeter(&self) -> Vec<PerimeterSegment> {
631 ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[PerimeterSegment::Smooth {
first_normal: Vec2::Y,
last_normal: Vec2::Y,
indices: (0..self.resolution).chain([0]).collect(),
}]))vec![PerimeterSegment::Smooth {
632 first_normal: Vec2::Y,
633 last_normal: Vec2::Y,
634 indices: (0..self.resolution).chain([0]).collect(),
635 }]
636 }
637}
638
639impl Meshable for Ellipse {
640 type Output = EllipseMeshBuilder;
641
642 fn mesh(&self) -> Self::Output {
643 EllipseMeshBuilder {
644 ellipse: *self,
645 ..Default::default()
646 }
647 }
648}
649
650impl From<Ellipse> for Mesh {
651 fn from(ellipse: Ellipse) -> Self {
652 ellipse.mesh().build()
653 }
654}
655
656pub struct Segment2dMeshBuilder {
658 pub segment: Segment2d,
660}
661
662impl Segment2dMeshBuilder {
663 #[inline]
665 pub const fn new(line: Segment2d) -> Self {
666 Self { segment: line }
667 }
668}
669
670impl MeshBuilder for Segment2dMeshBuilder {
671 fn build(&self) -> Mesh {
672 let positions = self.segment.vertices.map(|v| v.extend(0.0)).to_vec();
673 let indices = Indices::U32(::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[0, 1]))vec![0, 1]);
674
675 Mesh::new(PrimitiveTopology::LineList, RenderAssetUsages::default())
676 .with_inserted_attribute(Mesh::ATTRIBUTE_POSITION, positions)
677 .with_inserted_indices(indices)
678 }
679}
680
681impl Meshable for Segment2d {
682 type Output = Segment2dMeshBuilder;
683
684 fn mesh(&self) -> Self::Output {
685 Segment2dMeshBuilder::new(*self)
686 }
687}
688
689impl From<Segment2d> for Mesh {
690 fn from(segment: Segment2d) -> Self {
692 segment.mesh().build()
693 }
694}
695
696#[derive(#[automatically_derived]
impl ::core::clone::Clone for Polyline2dMeshBuilder {
#[inline]
fn clone(&self) -> Self {
Self { polyline: ::core::clone::Clone::clone(&self.polyline) }
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for Polyline2dMeshBuilder {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Polyline2dMeshBuilder", "polyline", &&self.polyline)
}
}Debug, #[automatically_derived]
impl ::core::default::Default for Polyline2dMeshBuilder {
#[inline]
fn default() -> Self {
Self { polyline: ::core::default::Default::default() }
}
}Default, const _: () =
{
impl bevy_reflect::GetTypeRegistration for Polyline2dMeshBuilder where
{
fn get_type_registration() -> bevy_reflect::TypeRegistration {
let mut registration =
bevy_reflect::TypeRegistration::of::<Self>();
registration.insert(<bevy_reflect::ReflectFromPtr as
bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
registration.insert(<bevy_reflect::ReflectFromReflect as
bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
registration.register_type_data_with::<ReflectDefault, Self,
_>(());
registration
}
#[inline(never)]
fn register_type_dependencies(registry:
&mut bevy_reflect::TypeRegistry) {
<Polyline2d as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
}
}
impl bevy_reflect::Typed for Polyline2dMeshBuilder where {
#[inline(never)]
fn type_info() -> &'static bevy_reflect::TypeInfo {
static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
bevy_reflect::utility::NonGenericTypeInfoCell::new();
CELL.get_or_set(#[inline(never)] ||
{
bevy_reflect::TypeInfo::Struct(bevy_reflect::structs::StructInfo::new::<Self>(&[bevy_reflect::NamedField::new::<Polyline2d>("polyline")]))
})
}
}
#[allow(deprecated, reason =
"derives on a deprecated type shouldn't be considered a usage")]
impl bevy_reflect::TypePath for Polyline2dMeshBuilder where {
fn type_path() -> &'static str {
"bevy_mesh::primitives::dim2::Polyline2dMeshBuilder"
}
fn short_type_path() -> &'static str { "Polyline2dMeshBuilder" }
fn type_ident() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("Polyline2dMeshBuilder")
}
fn crate_name() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_mesh::primitives::dim2".split(':').next().unwrap())
}
fn module_path() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_mesh::primitives::dim2")
}
}
impl bevy_reflect::Reflect for Polyline2dMeshBuilder where {
#[inline]
fn into_any(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn ::core::any::Any> {
self
}
#[inline]
fn as_any(&self) -> &dyn ::core::any::Any { self }
#[inline]
fn as_any_mut(&mut self) -> &mut dyn ::core::any::Any { self }
#[inline]
fn into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect> {
self
}
#[inline]
fn as_reflect(&self) -> &dyn bevy_reflect::Reflect { self }
#[inline]
fn as_reflect_mut(&mut self) -> &mut dyn bevy_reflect::Reflect {
self
}
#[inline]
fn set(&mut self,
value:
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>)
->
::core::result::Result<(),
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>> {
*self = <dyn bevy_reflect::Reflect>::take(value)?;
::core::result::Result::Ok(())
}
}
#[allow(non_upper_case_globals)]
const _: () =
{
static __INVENTORY: ::inventory::Node =
::inventory::Node {
value: &{
bevy_reflect::__macro_exports::auto_register::AutomaticReflectRegistrations(<Polyline2dMeshBuilder
as
bevy_reflect::__macro_exports::auto_register::RegisterForReflection>::__register)
},
next: ::inventory::__private::UnsafeCell::new(::inventory::__private::Option::None),
};
#[link_section = ".text.startup"]
unsafe extern "C" fn __ctor() {
unsafe {
::inventory::ErasedNode::submit(__INVENTORY.value,
&__INVENTORY)
}
}
#[used]
#[link_section = ".init_array"]
static __CTOR: unsafe extern "C" fn() = __ctor;
};
impl bevy_reflect::structs::Struct for Polyline2dMeshBuilder where {
fn field(&self, name: &str)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match name {
"polyline" => ::core::option::Option::Some(&self.polyline),
_ => ::core::option::Option::None,
}
}
fn field_mut(&mut self, name: &str)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match name {
"polyline" =>
::core::option::Option::Some(&mut self.polyline),
_ => ::core::option::Option::None,
}
}
fn field_at(&self, index: usize)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match index {
0usize => ::core::option::Option::Some(&self.polyline),
_ => ::core::option::Option::None,
}
}
fn field_at_mut(&mut self, index: usize)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match index {
0usize => ::core::option::Option::Some(&mut self.polyline),
_ => ::core::option::Option::None,
}
}
fn name_at(&self, index: usize) -> ::core::option::Option<&str> {
match index {
0usize => ::core::option::Option::Some("polyline"),
_ => ::core::option::Option::None,
}
}
fn index_of_name(&self, name: &str)
-> ::core::option::Option<usize> {
match name {
"polyline" => ::core::option::Option::Some(0usize),
_ => ::core::option::Option::None,
}
}
fn field_len(&self) -> usize { 1usize }
fn iter_fields(&self) -> bevy_reflect::structs::FieldIter {
bevy_reflect::structs::FieldIter::new(self)
}
fn to_dynamic_struct(&self)
->
::core::result::Result<bevy_reflect::structs::DynamicStruct,
bevy_reflect::ReflectCloneError> {
let mut dynamic: bevy_reflect::structs::DynamicStruct =
::core::default::Default::default();
dynamic.set_represented_type(bevy_reflect::PartialReflect::get_represented_type_info(self));
dynamic.insert_boxed("polyline",
bevy_reflect::PartialReflect::to_dynamic(&self.polyline)?);
::core::result::Result::Ok(dynamic)
}
}
impl bevy_reflect::PartialReflect for Polyline2dMeshBuilder where {
#[inline]
fn get_represented_type_info(&self)
-> ::core::option::Option<&'static bevy_reflect::TypeInfo> {
::core::option::Option::Some(<Self as
bevy_reflect::Typed>::type_info())
}
#[inline]
fn try_apply(&mut self, value: &dyn bevy_reflect::PartialReflect)
-> ::core::result::Result<(), bevy_reflect::ApplyError> {
if let bevy_reflect::ReflectRef::Struct(struct_value) =
bevy_reflect::PartialReflect::reflect_ref(value) {
for (name, value) in
bevy_reflect::structs::Struct::iter_fields(struct_value) {
if let ::core::option::Option::Some(v) =
bevy_reflect::structs::Struct::field_mut(self, name) {
bevy_reflect::PartialReflect::try_apply(v, value)?;
}
}
} else {
return ::core::result::Result::Err(bevy_reflect::ApplyError::MismatchedKinds {
from_kind: bevy_reflect::PartialReflect::reflect_kind(value),
to_kind: bevy_reflect::ReflectKind::Struct,
});
}
::core::result::Result::Ok(())
}
#[inline]
fn reflect_kind(&self) -> bevy_reflect::ReflectKind {
bevy_reflect::ReflectKind::Struct
}
#[inline]
fn reflect_ref(&self) -> bevy_reflect::ReflectRef {
bevy_reflect::ReflectRef::Struct(self)
}
#[inline]
fn reflect_mut(&mut self) -> bevy_reflect::ReflectMut {
bevy_reflect::ReflectMut::Struct(self)
}
#[inline]
fn reflect_owned(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
-> bevy_reflect::ReflectOwned {
bevy_reflect::ReflectOwned::Struct(self)
}
#[inline]
fn try_into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect>> {
::core::result::Result::Ok(self)
}
#[inline]
fn try_as_reflect(&self)
-> ::core::option::Option<&dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn try_as_reflect_mut(&mut self)
-> ::core::option::Option<&mut dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn into_partial_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect> {
self
}
#[inline]
fn as_partial_reflect(&self)
-> &dyn bevy_reflect::PartialReflect {
self
}
#[inline]
fn as_partial_reflect_mut(&mut self)
-> &mut dyn bevy_reflect::PartialReflect {
self
}
fn reflect_partial_eq(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<bool> {
(bevy_reflect::structs::struct_partial_eq)(self, value)
}
fn reflect_partial_cmp(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<::core::cmp::Ordering> {
(bevy_reflect::structs::struct_partial_cmp)(self, value)
}
fn debug(&self, f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
::core::fmt::Debug::fmt(self, f)
}
#[inline]
fn reflect_clone(&self)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::ReflectCloneError> {
::core::result::Result::Ok(bevy_reflect::__macro_exports::alloc_utils::Box::new(::core::clone::Clone::clone(self)))
}
}
impl bevy_reflect::FromReflect for Polyline2dMeshBuilder where {
fn from_reflect(reflect: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<Self> {
if let bevy_reflect::ReflectRef::Struct(__ref_struct) =
bevy_reflect::PartialReflect::reflect_ref(reflect) {
let mut __this =
<Self as ::core::default::Default>::default();
if let ::core::option::Option::Some(__field) =
(||
<Polyline2d as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
"polyline")?))() {
__this.polyline = __field;
}
::core::option::Option::Some(__this)
} else { ::core::option::Option::None }
}
}
};Reflect)]
698#[reflect(Default, Debug, Clone)]
699pub struct Polyline2dMeshBuilder {
700 polyline: Polyline2d,
701}
702
703impl MeshBuilder for Polyline2dMeshBuilder {
704 fn build(&self) -> Mesh {
705 let positions: Vec<_> = self
706 .polyline
707 .vertices
708 .iter()
709 .map(|v| v.extend(0.0))
710 .collect();
711
712 let indices = Indices::U32(
713 (0..self.polyline.vertices.len() as u32 - 1)
714 .flat_map(|i| [i, i + 1])
715 .collect(),
716 );
717
718 Mesh::new(PrimitiveTopology::LineList, RenderAssetUsages::default())
719 .with_inserted_indices(indices)
720 .with_inserted_attribute(Mesh::ATTRIBUTE_POSITION, positions)
721 }
722}
723
724impl Meshable for Polyline2d {
725 type Output = Polyline2dMeshBuilder;
726
727 fn mesh(&self) -> Self::Output {
728 Polyline2dMeshBuilder {
729 polyline: self.clone(),
730 }
731 }
732}
733
734impl From<Polyline2d> for Mesh {
735 fn from(polyline: Polyline2d) -> Self {
736 polyline.mesh().build()
737 }
738}
739
740#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for AnnulusMeshBuilder { }
#[automatically_derived]
impl ::core::clone::Clone for AnnulusMeshBuilder {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Annulus>;
let _: ::core::clone::AssertParamIsClone<u32>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for AnnulusMeshBuilder { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for AnnulusMeshBuilder {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"AnnulusMeshBuilder", "annulus", &self.annulus, "resolution",
&&self.resolution)
}
}Debug, const _: () =
{
impl bevy_reflect::GetTypeRegistration for AnnulusMeshBuilder where {
fn get_type_registration() -> bevy_reflect::TypeRegistration {
let mut registration =
bevy_reflect::TypeRegistration::of::<Self>();
registration.insert(<bevy_reflect::ReflectFromPtr as
bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
registration.insert(<bevy_reflect::ReflectFromReflect as
bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
registration.register_type_data_with::<ReflectDefault, Self,
_>(());
registration
}
#[inline(never)]
fn register_type_dependencies(registry:
&mut bevy_reflect::TypeRegistry) {
<Annulus as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
<u32 as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
}
}
impl bevy_reflect::Typed for AnnulusMeshBuilder where {
#[inline(never)]
fn type_info() -> &'static bevy_reflect::TypeInfo {
static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
bevy_reflect::utility::NonGenericTypeInfoCell::new();
CELL.get_or_set(#[inline(never)] ||
{
bevy_reflect::TypeInfo::Struct(bevy_reflect::structs::StructInfo::new::<Self>(&[bevy_reflect::NamedField::new::<Annulus>("annulus"),
bevy_reflect::NamedField::new::<u32>("resolution")]))
})
}
}
#[allow(deprecated, reason =
"derives on a deprecated type shouldn't be considered a usage")]
impl bevy_reflect::TypePath for AnnulusMeshBuilder where {
fn type_path() -> &'static str {
"bevy_mesh::primitives::dim2::AnnulusMeshBuilder"
}
fn short_type_path() -> &'static str { "AnnulusMeshBuilder" }
fn type_ident() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("AnnulusMeshBuilder")
}
fn crate_name() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_mesh::primitives::dim2".split(':').next().unwrap())
}
fn module_path() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_mesh::primitives::dim2")
}
}
impl bevy_reflect::Reflect for AnnulusMeshBuilder where {
#[inline]
fn into_any(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn ::core::any::Any> {
self
}
#[inline]
fn as_any(&self) -> &dyn ::core::any::Any { self }
#[inline]
fn as_any_mut(&mut self) -> &mut dyn ::core::any::Any { self }
#[inline]
fn into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect> {
self
}
#[inline]
fn as_reflect(&self) -> &dyn bevy_reflect::Reflect { self }
#[inline]
fn as_reflect_mut(&mut self) -> &mut dyn bevy_reflect::Reflect {
self
}
#[inline]
fn set(&mut self,
value:
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>)
->
::core::result::Result<(),
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>> {
*self = <dyn bevy_reflect::Reflect>::take(value)?;
::core::result::Result::Ok(())
}
}
#[allow(non_upper_case_globals)]
const _: () =
{
static __INVENTORY: ::inventory::Node =
::inventory::Node {
value: &{
bevy_reflect::__macro_exports::auto_register::AutomaticReflectRegistrations(<AnnulusMeshBuilder
as
bevy_reflect::__macro_exports::auto_register::RegisterForReflection>::__register)
},
next: ::inventory::__private::UnsafeCell::new(::inventory::__private::Option::None),
};
#[link_section = ".text.startup"]
unsafe extern "C" fn __ctor() {
unsafe {
::inventory::ErasedNode::submit(__INVENTORY.value,
&__INVENTORY)
}
}
#[used]
#[link_section = ".init_array"]
static __CTOR: unsafe extern "C" fn() = __ctor;
};
impl bevy_reflect::structs::Struct for AnnulusMeshBuilder where {
fn field(&self, name: &str)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match name {
"annulus" => ::core::option::Option::Some(&self.annulus),
"resolution" =>
::core::option::Option::Some(&self.resolution),
_ => ::core::option::Option::None,
}
}
fn field_mut(&mut self, name: &str)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match name {
"annulus" =>
::core::option::Option::Some(&mut self.annulus),
"resolution" =>
::core::option::Option::Some(&mut self.resolution),
_ => ::core::option::Option::None,
}
}
fn field_at(&self, index: usize)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match index {
0usize => ::core::option::Option::Some(&self.annulus),
1usize => ::core::option::Option::Some(&self.resolution),
_ => ::core::option::Option::None,
}
}
fn field_at_mut(&mut self, index: usize)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match index {
0usize => ::core::option::Option::Some(&mut self.annulus),
1usize =>
::core::option::Option::Some(&mut self.resolution),
_ => ::core::option::Option::None,
}
}
fn name_at(&self, index: usize) -> ::core::option::Option<&str> {
match index {
0usize => ::core::option::Option::Some("annulus"),
1usize => ::core::option::Option::Some("resolution"),
_ => ::core::option::Option::None,
}
}
fn index_of_name(&self, name: &str)
-> ::core::option::Option<usize> {
match name {
"annulus" => ::core::option::Option::Some(0usize),
"resolution" => ::core::option::Option::Some(1usize),
_ => ::core::option::Option::None,
}
}
fn field_len(&self) -> usize { 2usize }
fn iter_fields(&self) -> bevy_reflect::structs::FieldIter {
bevy_reflect::structs::FieldIter::new(self)
}
fn to_dynamic_struct(&self)
->
::core::result::Result<bevy_reflect::structs::DynamicStruct,
bevy_reflect::ReflectCloneError> {
let mut dynamic: bevy_reflect::structs::DynamicStruct =
::core::default::Default::default();
dynamic.set_represented_type(bevy_reflect::PartialReflect::get_represented_type_info(self));
dynamic.insert_boxed("annulus",
bevy_reflect::PartialReflect::to_dynamic(&self.annulus)?);
dynamic.insert_boxed("resolution",
bevy_reflect::PartialReflect::to_dynamic(&self.resolution)?);
::core::result::Result::Ok(dynamic)
}
}
impl bevy_reflect::PartialReflect for AnnulusMeshBuilder where {
#[inline]
fn get_represented_type_info(&self)
-> ::core::option::Option<&'static bevy_reflect::TypeInfo> {
::core::option::Option::Some(<Self as
bevy_reflect::Typed>::type_info())
}
#[inline]
fn try_apply(&mut self, value: &dyn bevy_reflect::PartialReflect)
-> ::core::result::Result<(), bevy_reflect::ApplyError> {
if let bevy_reflect::ReflectRef::Struct(struct_value) =
bevy_reflect::PartialReflect::reflect_ref(value) {
for (name, value) in
bevy_reflect::structs::Struct::iter_fields(struct_value) {
if let ::core::option::Option::Some(v) =
bevy_reflect::structs::Struct::field_mut(self, name) {
bevy_reflect::PartialReflect::try_apply(v, value)?;
}
}
} else {
return ::core::result::Result::Err(bevy_reflect::ApplyError::MismatchedKinds {
from_kind: bevy_reflect::PartialReflect::reflect_kind(value),
to_kind: bevy_reflect::ReflectKind::Struct,
});
}
::core::result::Result::Ok(())
}
#[inline]
fn reflect_kind(&self) -> bevy_reflect::ReflectKind {
bevy_reflect::ReflectKind::Struct
}
#[inline]
fn reflect_ref(&self) -> bevy_reflect::ReflectRef {
bevy_reflect::ReflectRef::Struct(self)
}
#[inline]
fn reflect_mut(&mut self) -> bevy_reflect::ReflectMut {
bevy_reflect::ReflectMut::Struct(self)
}
#[inline]
fn reflect_owned(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
-> bevy_reflect::ReflectOwned {
bevy_reflect::ReflectOwned::Struct(self)
}
#[inline]
fn try_into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect>> {
::core::result::Result::Ok(self)
}
#[inline]
fn try_as_reflect(&self)
-> ::core::option::Option<&dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn try_as_reflect_mut(&mut self)
-> ::core::option::Option<&mut dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn into_partial_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect> {
self
}
#[inline]
fn as_partial_reflect(&self)
-> &dyn bevy_reflect::PartialReflect {
self
}
#[inline]
fn as_partial_reflect_mut(&mut self)
-> &mut dyn bevy_reflect::PartialReflect {
self
}
fn reflect_partial_eq(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<bool> {
(bevy_reflect::structs::struct_partial_eq)(self, value)
}
fn reflect_partial_cmp(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<::core::cmp::Ordering> {
(bevy_reflect::structs::struct_partial_cmp)(self, value)
}
fn debug(&self, f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
::core::fmt::Debug::fmt(self, f)
}
#[inline]
fn reflect_clone(&self)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::ReflectCloneError> {
::core::result::Result::Ok(bevy_reflect::__macro_exports::alloc_utils::Box::new(::core::clone::Clone::clone(self)))
}
}
impl bevy_reflect::FromReflect for AnnulusMeshBuilder where {
fn from_reflect(reflect: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<Self> {
if let bevy_reflect::ReflectRef::Struct(__ref_struct) =
bevy_reflect::PartialReflect::reflect_ref(reflect) {
let mut __this =
<Self as ::core::default::Default>::default();
if let ::core::option::Option::Some(__field) =
(||
<Annulus as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
"annulus")?))() {
__this.annulus = __field;
}
if let ::core::option::Option::Some(__field) =
(||
<u32 as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
"resolution")?))() {
__this.resolution = __field;
}
::core::option::Option::Some(__this)
} else { ::core::option::Option::None }
}
}
};Reflect)]
742#[reflect(Default, Debug, Clone)]
743pub struct AnnulusMeshBuilder {
744 pub annulus: Annulus,
746
747 pub resolution: u32,
750}
751
752impl Default for AnnulusMeshBuilder {
753 fn default() -> Self {
754 Self {
755 annulus: Annulus::default(),
756 resolution: 32,
757 }
758 }
759}
760
761impl AnnulusMeshBuilder {
762 #[inline]
764 pub fn new(inner_radius: f32, outer_radius: f32, resolution: u32) -> Self {
765 Self {
766 annulus: Annulus::new(inner_radius, outer_radius),
767 resolution,
768 }
769 }
770
771 #[inline]
773 pub fn resolution(mut self, resolution: u32) -> Self {
774 self.resolution = resolution;
775 self
776 }
777}
778
779impl MeshBuilder for AnnulusMeshBuilder {
780 fn build(&self) -> Mesh {
781 let inner_radius = self.annulus.inner_circle.radius;
782 let outer_radius = self.annulus.outer_circle.radius;
783
784 let num_vertices = (self.resolution as usize + 1) * 2;
785 let mut indices = Vec::with_capacity(self.resolution as usize * 6);
786 let mut positions = Vec::with_capacity(num_vertices);
787 let mut uvs = Vec::with_capacity(num_vertices);
788 let normals = ::alloc::vec::from_elem([0.0, 0.0, 1.0], num_vertices)vec![[0.0, 0.0, 1.0]; num_vertices];
789
790 let start_angle = FRAC_PI_2;
795 let step = core::f32::consts::TAU / self.resolution as f32;
796 for i in 0..=self.resolution {
797 let theta = start_angle + (i % self.resolution) as f32 * step;
798 let (sin, cos) = ops::sin_cos(theta);
799 let inner_pos = [cos * inner_radius, sin * inner_radius, 0.];
800 let outer_pos = [cos * outer_radius, sin * outer_radius, 0.];
801 positions.push(inner_pos);
802 positions.push(outer_pos);
803
804 let inner_uv = [0., i as f32 / self.resolution as f32];
809 let outer_uv = [1., i as f32 / self.resolution as f32];
810 uvs.push(inner_uv);
811 uvs.push(outer_uv);
812 }
813
814 for i in 0..self.resolution {
819 let inner_vertex = 2 * i;
820 let outer_vertex = 2 * i + 1;
821 let next_inner = inner_vertex + 2;
822 let next_outer = outer_vertex + 2;
823 indices.extend_from_slice(&[inner_vertex, outer_vertex, next_outer]);
824 indices.extend_from_slice(&[next_outer, next_inner, inner_vertex]);
825 }
826
827 Mesh::new(
828 PrimitiveTopology::TriangleList,
829 RenderAssetUsages::default(),
830 )
831 .with_inserted_attribute(Mesh::ATTRIBUTE_POSITION, positions)
832 .with_inserted_attribute(Mesh::ATTRIBUTE_NORMAL, normals)
833 .with_inserted_attribute(Mesh::ATTRIBUTE_UV_0, uvs)
834 .with_inserted_indices(Indices::U32(indices))
835 }
836}
837
838impl Extrudable for AnnulusMeshBuilder {
839 fn perimeter(&self) -> Vec<PerimeterSegment> {
840 let vert_count = 2 * self.resolution;
841 ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[PerimeterSegment::Smooth {
first_normal: Vec2::NEG_Y,
last_normal: Vec2::NEG_Y,
indices: (0..vert_count).step_by(2).chain([0]).rev().collect(),
},
PerimeterSegment::Smooth {
first_normal: Vec2::Y,
last_normal: Vec2::Y,
indices: (1..vert_count).step_by(2).chain([1]).collect(),
}]))vec![
842 PerimeterSegment::Smooth {
843 first_normal: Vec2::NEG_Y,
844 last_normal: Vec2::NEG_Y,
845 indices: (0..vert_count).step_by(2).chain([0]).rev().collect(), },
847 PerimeterSegment::Smooth {
848 first_normal: Vec2::Y,
849 last_normal: Vec2::Y,
850 indices: (1..vert_count).step_by(2).chain([1]).collect(), },
852 ]
853 }
854}
855
856impl Meshable for Annulus {
857 type Output = AnnulusMeshBuilder;
858
859 fn mesh(&self) -> Self::Output {
860 AnnulusMeshBuilder {
861 annulus: *self,
862 ..Default::default()
863 }
864 }
865}
866
867impl From<Annulus> for Mesh {
868 fn from(annulus: Annulus) -> Self {
869 annulus.mesh().build()
870 }
871}
872
873#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for RhombusMeshBuilder { }
#[automatically_derived]
impl ::core::clone::Clone for RhombusMeshBuilder {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Vec2>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for RhombusMeshBuilder { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for RhombusMeshBuilder {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f,
"RhombusMeshBuilder", "half_diagonals", &&self.half_diagonals)
}
}Debug, const _: () =
{
impl bevy_reflect::GetTypeRegistration for RhombusMeshBuilder where {
fn get_type_registration() -> bevy_reflect::TypeRegistration {
let mut registration =
bevy_reflect::TypeRegistration::of::<Self>();
registration.insert(<bevy_reflect::ReflectFromPtr as
bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
registration.insert(<bevy_reflect::ReflectFromReflect as
bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
registration.register_type_data_with::<ReflectDefault, Self,
_>(());
registration
}
#[inline(never)]
fn register_type_dependencies(registry:
&mut bevy_reflect::TypeRegistry) {
<Vec2 as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
}
}
impl bevy_reflect::Typed for RhombusMeshBuilder where {
#[inline(never)]
fn type_info() -> &'static bevy_reflect::TypeInfo {
static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
bevy_reflect::utility::NonGenericTypeInfoCell::new();
CELL.get_or_set(#[inline(never)] ||
{
bevy_reflect::TypeInfo::Struct(bevy_reflect::structs::StructInfo::new::<Self>(&[bevy_reflect::NamedField::new::<Vec2>("half_diagonals")]))
})
}
}
#[allow(deprecated, reason =
"derives on a deprecated type shouldn't be considered a usage")]
impl bevy_reflect::TypePath for RhombusMeshBuilder where {
fn type_path() -> &'static str {
"bevy_mesh::primitives::dim2::RhombusMeshBuilder"
}
fn short_type_path() -> &'static str { "RhombusMeshBuilder" }
fn type_ident() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("RhombusMeshBuilder")
}
fn crate_name() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_mesh::primitives::dim2".split(':').next().unwrap())
}
fn module_path() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_mesh::primitives::dim2")
}
}
impl bevy_reflect::Reflect for RhombusMeshBuilder where {
#[inline]
fn into_any(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn ::core::any::Any> {
self
}
#[inline]
fn as_any(&self) -> &dyn ::core::any::Any { self }
#[inline]
fn as_any_mut(&mut self) -> &mut dyn ::core::any::Any { self }
#[inline]
fn into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect> {
self
}
#[inline]
fn as_reflect(&self) -> &dyn bevy_reflect::Reflect { self }
#[inline]
fn as_reflect_mut(&mut self) -> &mut dyn bevy_reflect::Reflect {
self
}
#[inline]
fn set(&mut self,
value:
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>)
->
::core::result::Result<(),
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>> {
*self = <dyn bevy_reflect::Reflect>::take(value)?;
::core::result::Result::Ok(())
}
}
#[allow(non_upper_case_globals)]
const _: () =
{
static __INVENTORY: ::inventory::Node =
::inventory::Node {
value: &{
bevy_reflect::__macro_exports::auto_register::AutomaticReflectRegistrations(<RhombusMeshBuilder
as
bevy_reflect::__macro_exports::auto_register::RegisterForReflection>::__register)
},
next: ::inventory::__private::UnsafeCell::new(::inventory::__private::Option::None),
};
#[link_section = ".text.startup"]
unsafe extern "C" fn __ctor() {
unsafe {
::inventory::ErasedNode::submit(__INVENTORY.value,
&__INVENTORY)
}
}
#[used]
#[link_section = ".init_array"]
static __CTOR: unsafe extern "C" fn() = __ctor;
};
impl bevy_reflect::structs::Struct for RhombusMeshBuilder where {
fn field(&self, name: &str)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match name {
"half_diagonals" =>
::core::option::Option::Some(&self.half_diagonals),
_ => ::core::option::Option::None,
}
}
fn field_mut(&mut self, name: &str)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match name {
"half_diagonals" =>
::core::option::Option::Some(&mut self.half_diagonals),
_ => ::core::option::Option::None,
}
}
fn field_at(&self, index: usize)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match index {
0usize =>
::core::option::Option::Some(&self.half_diagonals),
_ => ::core::option::Option::None,
}
}
fn field_at_mut(&mut self, index: usize)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match index {
0usize =>
::core::option::Option::Some(&mut self.half_diagonals),
_ => ::core::option::Option::None,
}
}
fn name_at(&self, index: usize) -> ::core::option::Option<&str> {
match index {
0usize => ::core::option::Option::Some("half_diagonals"),
_ => ::core::option::Option::None,
}
}
fn index_of_name(&self, name: &str)
-> ::core::option::Option<usize> {
match name {
"half_diagonals" => ::core::option::Option::Some(0usize),
_ => ::core::option::Option::None,
}
}
fn field_len(&self) -> usize { 1usize }
fn iter_fields(&self) -> bevy_reflect::structs::FieldIter {
bevy_reflect::structs::FieldIter::new(self)
}
fn to_dynamic_struct(&self)
->
::core::result::Result<bevy_reflect::structs::DynamicStruct,
bevy_reflect::ReflectCloneError> {
let mut dynamic: bevy_reflect::structs::DynamicStruct =
::core::default::Default::default();
dynamic.set_represented_type(bevy_reflect::PartialReflect::get_represented_type_info(self));
dynamic.insert_boxed("half_diagonals",
bevy_reflect::PartialReflect::to_dynamic(&self.half_diagonals)?);
::core::result::Result::Ok(dynamic)
}
}
impl bevy_reflect::PartialReflect for RhombusMeshBuilder where {
#[inline]
fn get_represented_type_info(&self)
-> ::core::option::Option<&'static bevy_reflect::TypeInfo> {
::core::option::Option::Some(<Self as
bevy_reflect::Typed>::type_info())
}
#[inline]
fn try_apply(&mut self, value: &dyn bevy_reflect::PartialReflect)
-> ::core::result::Result<(), bevy_reflect::ApplyError> {
if let bevy_reflect::ReflectRef::Struct(struct_value) =
bevy_reflect::PartialReflect::reflect_ref(value) {
for (name, value) in
bevy_reflect::structs::Struct::iter_fields(struct_value) {
if let ::core::option::Option::Some(v) =
bevy_reflect::structs::Struct::field_mut(self, name) {
bevy_reflect::PartialReflect::try_apply(v, value)?;
}
}
} else {
return ::core::result::Result::Err(bevy_reflect::ApplyError::MismatchedKinds {
from_kind: bevy_reflect::PartialReflect::reflect_kind(value),
to_kind: bevy_reflect::ReflectKind::Struct,
});
}
::core::result::Result::Ok(())
}
#[inline]
fn reflect_kind(&self) -> bevy_reflect::ReflectKind {
bevy_reflect::ReflectKind::Struct
}
#[inline]
fn reflect_ref(&self) -> bevy_reflect::ReflectRef {
bevy_reflect::ReflectRef::Struct(self)
}
#[inline]
fn reflect_mut(&mut self) -> bevy_reflect::ReflectMut {
bevy_reflect::ReflectMut::Struct(self)
}
#[inline]
fn reflect_owned(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
-> bevy_reflect::ReflectOwned {
bevy_reflect::ReflectOwned::Struct(self)
}
#[inline]
fn try_into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect>> {
::core::result::Result::Ok(self)
}
#[inline]
fn try_as_reflect(&self)
-> ::core::option::Option<&dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn try_as_reflect_mut(&mut self)
-> ::core::option::Option<&mut dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn into_partial_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect> {
self
}
#[inline]
fn as_partial_reflect(&self)
-> &dyn bevy_reflect::PartialReflect {
self
}
#[inline]
fn as_partial_reflect_mut(&mut self)
-> &mut dyn bevy_reflect::PartialReflect {
self
}
fn reflect_partial_eq(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<bool> {
(bevy_reflect::structs::struct_partial_eq)(self, value)
}
fn reflect_partial_cmp(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<::core::cmp::Ordering> {
(bevy_reflect::structs::struct_partial_cmp)(self, value)
}
fn debug(&self, f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
::core::fmt::Debug::fmt(self, f)
}
#[inline]
fn reflect_clone(&self)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::ReflectCloneError> {
::core::result::Result::Ok(bevy_reflect::__macro_exports::alloc_utils::Box::new(::core::clone::Clone::clone(self)))
}
}
impl bevy_reflect::FromReflect for RhombusMeshBuilder where {
fn from_reflect(reflect: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<Self> {
if let bevy_reflect::ReflectRef::Struct(__ref_struct) =
bevy_reflect::PartialReflect::reflect_ref(reflect) {
let mut __this =
<Self as ::core::default::Default>::default();
if let ::core::option::Option::Some(__field) =
(||
<Vec2 as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
"half_diagonals")?))() {
__this.half_diagonals = __field;
}
::core::option::Option::Some(__this)
} else { ::core::option::Option::None }
}
}
};Reflect)]
875#[reflect(Default, Debug, Clone)]
876pub struct RhombusMeshBuilder {
877 half_diagonals: Vec2,
878}
879
880impl Default for RhombusMeshBuilder {
881 fn default() -> Self {
883 Self {
884 half_diagonals: Vec2::splat(0.5),
885 }
886 }
887}
888
889impl RhombusMeshBuilder {
890 pub const fn new(horizontal_diagonal: f32, vertical_diagonal: f32) -> Self {
896 if true {
if !(horizontal_diagonal >= 0.0) {
{
::core::panicking::panic_fmt(format_args!("rhombus has a negative horizontal size"));
}
};
};debug_assert!(
897 horizontal_diagonal >= 0.0,
898 "rhombus has a negative horizontal size",
899 );
900 if true {
if !(vertical_diagonal >= 0.0) {
{
::core::panicking::panic_fmt(format_args!("rhombus has a negative vertical size"));
}
};
};debug_assert!(
901 vertical_diagonal >= 0.0,
902 "rhombus has a negative vertical size"
903 );
904
905 Self {
906 half_diagonals: Vec2::new(horizontal_diagonal / 2.0, vertical_diagonal / 2.0),
907 }
908 }
909}
910
911impl MeshBuilder for RhombusMeshBuilder {
912 fn build(&self) -> Mesh {
913 let [hhd, vhd] = [self.half_diagonals.x, self.half_diagonals.y];
914 let positions = ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[[hhd, 0.0, 0.0], [0.0, vhd, 0.0], [-hhd, 0.0, 0.0],
[0.0, -vhd, 0.0]]))vec![
915 [hhd, 0.0, 0.0],
916 [0.0, vhd, 0.0],
917 [-hhd, 0.0, 0.0],
918 [0.0, -vhd, 0.0],
919 ];
920 let normals = ::alloc::vec::from_elem([0.0, 0.0, 1.0], 4)vec![[0.0, 0.0, 1.0]; 4];
921 let uvs = ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[[1.0, 0.5], [0.5, 0.0], [0.0, 0.5], [0.5, 1.0]]))vec![[1.0, 0.5], [0.5, 0.0], [0.0, 0.5], [0.5, 1.0]];
922 let indices = Indices::U32(::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[2, 0, 1, 2, 3, 0]))vec![2, 0, 1, 2, 3, 0]);
923
924 Mesh::new(
925 PrimitiveTopology::TriangleList,
926 RenderAssetUsages::default(),
927 )
928 .with_inserted_indices(indices)
929 .with_inserted_attribute(Mesh::ATTRIBUTE_POSITION, positions)
930 .with_inserted_attribute(Mesh::ATTRIBUTE_NORMAL, normals)
931 .with_inserted_attribute(Mesh::ATTRIBUTE_UV_0, uvs)
932 }
933}
934
935impl Extrudable for RhombusMeshBuilder {
936 fn perimeter(&self) -> Vec<PerimeterSegment> {
937 ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[PerimeterSegment::Flat {
indices: ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[0, 1, 2, 3, 0])),
}]))vec![PerimeterSegment::Flat {
938 indices: vec![0, 1, 2, 3, 0],
939 }]
940 }
941}
942
943impl Meshable for Rhombus {
944 type Output = RhombusMeshBuilder;
945
946 fn mesh(&self) -> Self::Output {
947 Self::Output {
948 half_diagonals: self.half_diagonals,
949 }
950 }
951}
952
953impl From<Rhombus> for Mesh {
954 fn from(rhombus: Rhombus) -> Self {
955 rhombus.mesh().build()
956 }
957}
958
959#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for Triangle2dMeshBuilder { }
#[automatically_derived]
impl ::core::clone::Clone for Triangle2dMeshBuilder {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Triangle2d>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for Triangle2dMeshBuilder { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for Triangle2dMeshBuilder {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Triangle2dMeshBuilder", "triangle", &&self.triangle)
}
}Debug, #[automatically_derived]
impl ::core::default::Default for Triangle2dMeshBuilder {
#[inline]
fn default() -> Self {
Self { triangle: ::core::default::Default::default() }
}
}Default, const _: () =
{
impl bevy_reflect::GetTypeRegistration for Triangle2dMeshBuilder where
{
fn get_type_registration() -> bevy_reflect::TypeRegistration {
let mut registration =
bevy_reflect::TypeRegistration::of::<Self>();
registration.insert(<bevy_reflect::ReflectFromPtr as
bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
registration.insert(<bevy_reflect::ReflectFromReflect as
bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
registration.register_type_data_with::<ReflectDefault, Self,
_>(());
registration
}
#[inline(never)]
fn register_type_dependencies(registry:
&mut bevy_reflect::TypeRegistry) {
<Triangle2d as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
}
}
impl bevy_reflect::Typed for Triangle2dMeshBuilder where {
#[inline(never)]
fn type_info() -> &'static bevy_reflect::TypeInfo {
static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
bevy_reflect::utility::NonGenericTypeInfoCell::new();
CELL.get_or_set(#[inline(never)] ||
{
bevy_reflect::TypeInfo::Struct(bevy_reflect::structs::StructInfo::new::<Self>(&[bevy_reflect::NamedField::new::<Triangle2d>("triangle")]))
})
}
}
#[allow(deprecated, reason =
"derives on a deprecated type shouldn't be considered a usage")]
impl bevy_reflect::TypePath for Triangle2dMeshBuilder where {
fn type_path() -> &'static str {
"bevy_mesh::primitives::dim2::Triangle2dMeshBuilder"
}
fn short_type_path() -> &'static str { "Triangle2dMeshBuilder" }
fn type_ident() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("Triangle2dMeshBuilder")
}
fn crate_name() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_mesh::primitives::dim2".split(':').next().unwrap())
}
fn module_path() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_mesh::primitives::dim2")
}
}
impl bevy_reflect::Reflect for Triangle2dMeshBuilder where {
#[inline]
fn into_any(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn ::core::any::Any> {
self
}
#[inline]
fn as_any(&self) -> &dyn ::core::any::Any { self }
#[inline]
fn as_any_mut(&mut self) -> &mut dyn ::core::any::Any { self }
#[inline]
fn into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect> {
self
}
#[inline]
fn as_reflect(&self) -> &dyn bevy_reflect::Reflect { self }
#[inline]
fn as_reflect_mut(&mut self) -> &mut dyn bevy_reflect::Reflect {
self
}
#[inline]
fn set(&mut self,
value:
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>)
->
::core::result::Result<(),
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>> {
*self = <dyn bevy_reflect::Reflect>::take(value)?;
::core::result::Result::Ok(())
}
}
#[allow(non_upper_case_globals)]
const _: () =
{
static __INVENTORY: ::inventory::Node =
::inventory::Node {
value: &{
bevy_reflect::__macro_exports::auto_register::AutomaticReflectRegistrations(<Triangle2dMeshBuilder
as
bevy_reflect::__macro_exports::auto_register::RegisterForReflection>::__register)
},
next: ::inventory::__private::UnsafeCell::new(::inventory::__private::Option::None),
};
#[link_section = ".text.startup"]
unsafe extern "C" fn __ctor() {
unsafe {
::inventory::ErasedNode::submit(__INVENTORY.value,
&__INVENTORY)
}
}
#[used]
#[link_section = ".init_array"]
static __CTOR: unsafe extern "C" fn() = __ctor;
};
impl bevy_reflect::structs::Struct for Triangle2dMeshBuilder where {
fn field(&self, name: &str)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match name {
"triangle" => ::core::option::Option::Some(&self.triangle),
_ => ::core::option::Option::None,
}
}
fn field_mut(&mut self, name: &str)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match name {
"triangle" =>
::core::option::Option::Some(&mut self.triangle),
_ => ::core::option::Option::None,
}
}
fn field_at(&self, index: usize)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match index {
0usize => ::core::option::Option::Some(&self.triangle),
_ => ::core::option::Option::None,
}
}
fn field_at_mut(&mut self, index: usize)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match index {
0usize => ::core::option::Option::Some(&mut self.triangle),
_ => ::core::option::Option::None,
}
}
fn name_at(&self, index: usize) -> ::core::option::Option<&str> {
match index {
0usize => ::core::option::Option::Some("triangle"),
_ => ::core::option::Option::None,
}
}
fn index_of_name(&self, name: &str)
-> ::core::option::Option<usize> {
match name {
"triangle" => ::core::option::Option::Some(0usize),
_ => ::core::option::Option::None,
}
}
fn field_len(&self) -> usize { 1usize }
fn iter_fields(&self) -> bevy_reflect::structs::FieldIter {
bevy_reflect::structs::FieldIter::new(self)
}
fn to_dynamic_struct(&self)
->
::core::result::Result<bevy_reflect::structs::DynamicStruct,
bevy_reflect::ReflectCloneError> {
let mut dynamic: bevy_reflect::structs::DynamicStruct =
::core::default::Default::default();
dynamic.set_represented_type(bevy_reflect::PartialReflect::get_represented_type_info(self));
dynamic.insert_boxed("triangle",
bevy_reflect::PartialReflect::to_dynamic(&self.triangle)?);
::core::result::Result::Ok(dynamic)
}
}
impl bevy_reflect::PartialReflect for Triangle2dMeshBuilder where {
#[inline]
fn get_represented_type_info(&self)
-> ::core::option::Option<&'static bevy_reflect::TypeInfo> {
::core::option::Option::Some(<Self as
bevy_reflect::Typed>::type_info())
}
#[inline]
fn try_apply(&mut self, value: &dyn bevy_reflect::PartialReflect)
-> ::core::result::Result<(), bevy_reflect::ApplyError> {
if let bevy_reflect::ReflectRef::Struct(struct_value) =
bevy_reflect::PartialReflect::reflect_ref(value) {
for (name, value) in
bevy_reflect::structs::Struct::iter_fields(struct_value) {
if let ::core::option::Option::Some(v) =
bevy_reflect::structs::Struct::field_mut(self, name) {
bevy_reflect::PartialReflect::try_apply(v, value)?;
}
}
} else {
return ::core::result::Result::Err(bevy_reflect::ApplyError::MismatchedKinds {
from_kind: bevy_reflect::PartialReflect::reflect_kind(value),
to_kind: bevy_reflect::ReflectKind::Struct,
});
}
::core::result::Result::Ok(())
}
#[inline]
fn reflect_kind(&self) -> bevy_reflect::ReflectKind {
bevy_reflect::ReflectKind::Struct
}
#[inline]
fn reflect_ref(&self) -> bevy_reflect::ReflectRef {
bevy_reflect::ReflectRef::Struct(self)
}
#[inline]
fn reflect_mut(&mut self) -> bevy_reflect::ReflectMut {
bevy_reflect::ReflectMut::Struct(self)
}
#[inline]
fn reflect_owned(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
-> bevy_reflect::ReflectOwned {
bevy_reflect::ReflectOwned::Struct(self)
}
#[inline]
fn try_into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect>> {
::core::result::Result::Ok(self)
}
#[inline]
fn try_as_reflect(&self)
-> ::core::option::Option<&dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn try_as_reflect_mut(&mut self)
-> ::core::option::Option<&mut dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn into_partial_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect> {
self
}
#[inline]
fn as_partial_reflect(&self)
-> &dyn bevy_reflect::PartialReflect {
self
}
#[inline]
fn as_partial_reflect_mut(&mut self)
-> &mut dyn bevy_reflect::PartialReflect {
self
}
fn reflect_partial_eq(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<bool> {
(bevy_reflect::structs::struct_partial_eq)(self, value)
}
fn reflect_partial_cmp(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<::core::cmp::Ordering> {
(bevy_reflect::structs::struct_partial_cmp)(self, value)
}
fn debug(&self, f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
::core::fmt::Debug::fmt(self, f)
}
#[inline]
fn reflect_clone(&self)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::ReflectCloneError> {
::core::result::Result::Ok(bevy_reflect::__macro_exports::alloc_utils::Box::new(::core::clone::Clone::clone(self)))
}
}
impl bevy_reflect::FromReflect for Triangle2dMeshBuilder where {
fn from_reflect(reflect: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<Self> {
if let bevy_reflect::ReflectRef::Struct(__ref_struct) =
bevy_reflect::PartialReflect::reflect_ref(reflect) {
let mut __this =
<Self as ::core::default::Default>::default();
if let ::core::option::Option::Some(__field) =
(||
<Triangle2d as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
"triangle")?))() {
__this.triangle = __field;
}
::core::option::Option::Some(__this)
} else { ::core::option::Option::None }
}
}
};Reflect)]
961#[reflect(Default, Debug, Clone)]
962pub struct Triangle2dMeshBuilder {
963 triangle: Triangle2d,
964}
965
966impl Triangle2dMeshBuilder {
967 pub const fn new(a: Vec2, b: Vec2, c: Vec2) -> Self {
969 Self {
970 triangle: Triangle2d::new(a, b, c),
971 }
972 }
973}
974
975impl Meshable for Triangle2d {
976 type Output = Triangle2dMeshBuilder;
977
978 fn mesh(&self) -> Self::Output {
979 Self::Output { triangle: *self }
980 }
981}
982
983impl MeshBuilder for Triangle2dMeshBuilder {
984 fn build(&self) -> Mesh {
985 let vertices_3d = self.triangle.vertices.map(|v| v.extend(0.));
986
987 let positions: Vec<_> = vertices_3d.into();
988 let normals = ::alloc::vec::from_elem([0.0, 0.0, 1.0], 3)vec![[0.0, 0.0, 1.0]; 3];
989
990 let uvs: Vec<_> = triangle3d::uv_coords(&Triangle3d::new(
991 vertices_3d[0],
992 vertices_3d[1],
993 vertices_3d[2],
994 ))
995 .into();
996
997 let is_ccw = self.triangle.winding_order() == WindingOrder::CounterClockwise;
998 let indices = if is_ccw {
999 Indices::U32(::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[0, 1, 2]))vec![0, 1, 2])
1000 } else {
1001 Indices::U32(::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[2, 1, 0]))vec![2, 1, 0])
1002 };
1003
1004 Mesh::new(
1005 PrimitiveTopology::TriangleList,
1006 RenderAssetUsages::default(),
1007 )
1008 .with_inserted_indices(indices)
1009 .with_inserted_attribute(Mesh::ATTRIBUTE_POSITION, positions)
1010 .with_inserted_attribute(Mesh::ATTRIBUTE_NORMAL, normals)
1011 .with_inserted_attribute(Mesh::ATTRIBUTE_UV_0, uvs)
1012 }
1013}
1014
1015impl Extrudable for Triangle2dMeshBuilder {
1016 fn perimeter(&self) -> Vec<PerimeterSegment> {
1017 let is_ccw = self.triangle.winding_order() == WindingOrder::CounterClockwise;
1018 if is_ccw {
1019 ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[PerimeterSegment::Flat {
indices: ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[0, 1, 2, 0])),
}]))vec![PerimeterSegment::Flat {
1020 indices: vec![0, 1, 2, 0],
1021 }]
1022 } else {
1023 ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[PerimeterSegment::Flat {
indices: ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[2, 1, 0, 2])),
}]))vec![PerimeterSegment::Flat {
1024 indices: vec![2, 1, 0, 2],
1025 }]
1026 }
1027 }
1028}
1029
1030impl From<Triangle2d> for Mesh {
1031 fn from(triangle: Triangle2d) -> Self {
1032 triangle.mesh().build()
1033 }
1034}
1035
1036#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for RectangleMeshBuilder { }
#[automatically_derived]
impl ::core::clone::Clone for RectangleMeshBuilder {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Vec2>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for RectangleMeshBuilder { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for RectangleMeshBuilder {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f,
"RectangleMeshBuilder", "half_size", &&self.half_size)
}
}Debug, const _: () =
{
impl bevy_reflect::GetTypeRegistration for RectangleMeshBuilder where
{
fn get_type_registration() -> bevy_reflect::TypeRegistration {
let mut registration =
bevy_reflect::TypeRegistration::of::<Self>();
registration.insert(<bevy_reflect::ReflectFromPtr as
bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
registration.insert(<bevy_reflect::ReflectFromReflect as
bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
registration.register_type_data_with::<ReflectDefault, Self,
_>(());
registration
}
#[inline(never)]
fn register_type_dependencies(registry:
&mut bevy_reflect::TypeRegistry) {
<Vec2 as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
}
}
impl bevy_reflect::Typed for RectangleMeshBuilder where {
#[inline(never)]
fn type_info() -> &'static bevy_reflect::TypeInfo {
static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
bevy_reflect::utility::NonGenericTypeInfoCell::new();
CELL.get_or_set(#[inline(never)] ||
{
bevy_reflect::TypeInfo::Struct(bevy_reflect::structs::StructInfo::new::<Self>(&[bevy_reflect::NamedField::new::<Vec2>("half_size")]))
})
}
}
#[allow(deprecated, reason =
"derives on a deprecated type shouldn't be considered a usage")]
impl bevy_reflect::TypePath for RectangleMeshBuilder where {
fn type_path() -> &'static str {
"bevy_mesh::primitives::dim2::RectangleMeshBuilder"
}
fn short_type_path() -> &'static str { "RectangleMeshBuilder" }
fn type_ident() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("RectangleMeshBuilder")
}
fn crate_name() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_mesh::primitives::dim2".split(':').next().unwrap())
}
fn module_path() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_mesh::primitives::dim2")
}
}
impl bevy_reflect::Reflect for RectangleMeshBuilder where {
#[inline]
fn into_any(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn ::core::any::Any> {
self
}
#[inline]
fn as_any(&self) -> &dyn ::core::any::Any { self }
#[inline]
fn as_any_mut(&mut self) -> &mut dyn ::core::any::Any { self }
#[inline]
fn into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect> {
self
}
#[inline]
fn as_reflect(&self) -> &dyn bevy_reflect::Reflect { self }
#[inline]
fn as_reflect_mut(&mut self) -> &mut dyn bevy_reflect::Reflect {
self
}
#[inline]
fn set(&mut self,
value:
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>)
->
::core::result::Result<(),
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>> {
*self = <dyn bevy_reflect::Reflect>::take(value)?;
::core::result::Result::Ok(())
}
}
#[allow(non_upper_case_globals)]
const _: () =
{
static __INVENTORY: ::inventory::Node =
::inventory::Node {
value: &{
bevy_reflect::__macro_exports::auto_register::AutomaticReflectRegistrations(<RectangleMeshBuilder
as
bevy_reflect::__macro_exports::auto_register::RegisterForReflection>::__register)
},
next: ::inventory::__private::UnsafeCell::new(::inventory::__private::Option::None),
};
#[link_section = ".text.startup"]
unsafe extern "C" fn __ctor() {
unsafe {
::inventory::ErasedNode::submit(__INVENTORY.value,
&__INVENTORY)
}
}
#[used]
#[link_section = ".init_array"]
static __CTOR: unsafe extern "C" fn() = __ctor;
};
impl bevy_reflect::structs::Struct for RectangleMeshBuilder where {
fn field(&self, name: &str)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match name {
"half_size" =>
::core::option::Option::Some(&self.half_size),
_ => ::core::option::Option::None,
}
}
fn field_mut(&mut self, name: &str)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match name {
"half_size" =>
::core::option::Option::Some(&mut self.half_size),
_ => ::core::option::Option::None,
}
}
fn field_at(&self, index: usize)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match index {
0usize => ::core::option::Option::Some(&self.half_size),
_ => ::core::option::Option::None,
}
}
fn field_at_mut(&mut self, index: usize)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match index {
0usize => ::core::option::Option::Some(&mut self.half_size),
_ => ::core::option::Option::None,
}
}
fn name_at(&self, index: usize) -> ::core::option::Option<&str> {
match index {
0usize => ::core::option::Option::Some("half_size"),
_ => ::core::option::Option::None,
}
}
fn index_of_name(&self, name: &str)
-> ::core::option::Option<usize> {
match name {
"half_size" => ::core::option::Option::Some(0usize),
_ => ::core::option::Option::None,
}
}
fn field_len(&self) -> usize { 1usize }
fn iter_fields(&self) -> bevy_reflect::structs::FieldIter {
bevy_reflect::structs::FieldIter::new(self)
}
fn to_dynamic_struct(&self)
->
::core::result::Result<bevy_reflect::structs::DynamicStruct,
bevy_reflect::ReflectCloneError> {
let mut dynamic: bevy_reflect::structs::DynamicStruct =
::core::default::Default::default();
dynamic.set_represented_type(bevy_reflect::PartialReflect::get_represented_type_info(self));
dynamic.insert_boxed("half_size",
bevy_reflect::PartialReflect::to_dynamic(&self.half_size)?);
::core::result::Result::Ok(dynamic)
}
}
impl bevy_reflect::PartialReflect for RectangleMeshBuilder where {
#[inline]
fn get_represented_type_info(&self)
-> ::core::option::Option<&'static bevy_reflect::TypeInfo> {
::core::option::Option::Some(<Self as
bevy_reflect::Typed>::type_info())
}
#[inline]
fn try_apply(&mut self, value: &dyn bevy_reflect::PartialReflect)
-> ::core::result::Result<(), bevy_reflect::ApplyError> {
if let bevy_reflect::ReflectRef::Struct(struct_value) =
bevy_reflect::PartialReflect::reflect_ref(value) {
for (name, value) in
bevy_reflect::structs::Struct::iter_fields(struct_value) {
if let ::core::option::Option::Some(v) =
bevy_reflect::structs::Struct::field_mut(self, name) {
bevy_reflect::PartialReflect::try_apply(v, value)?;
}
}
} else {
return ::core::result::Result::Err(bevy_reflect::ApplyError::MismatchedKinds {
from_kind: bevy_reflect::PartialReflect::reflect_kind(value),
to_kind: bevy_reflect::ReflectKind::Struct,
});
}
::core::result::Result::Ok(())
}
#[inline]
fn reflect_kind(&self) -> bevy_reflect::ReflectKind {
bevy_reflect::ReflectKind::Struct
}
#[inline]
fn reflect_ref(&self) -> bevy_reflect::ReflectRef {
bevy_reflect::ReflectRef::Struct(self)
}
#[inline]
fn reflect_mut(&mut self) -> bevy_reflect::ReflectMut {
bevy_reflect::ReflectMut::Struct(self)
}
#[inline]
fn reflect_owned(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
-> bevy_reflect::ReflectOwned {
bevy_reflect::ReflectOwned::Struct(self)
}
#[inline]
fn try_into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect>> {
::core::result::Result::Ok(self)
}
#[inline]
fn try_as_reflect(&self)
-> ::core::option::Option<&dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn try_as_reflect_mut(&mut self)
-> ::core::option::Option<&mut dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn into_partial_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect> {
self
}
#[inline]
fn as_partial_reflect(&self)
-> &dyn bevy_reflect::PartialReflect {
self
}
#[inline]
fn as_partial_reflect_mut(&mut self)
-> &mut dyn bevy_reflect::PartialReflect {
self
}
fn reflect_partial_eq(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<bool> {
(bevy_reflect::structs::struct_partial_eq)(self, value)
}
fn reflect_partial_cmp(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<::core::cmp::Ordering> {
(bevy_reflect::structs::struct_partial_cmp)(self, value)
}
fn debug(&self, f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
::core::fmt::Debug::fmt(self, f)
}
#[inline]
fn reflect_clone(&self)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::ReflectCloneError> {
::core::result::Result::Ok(bevy_reflect::__macro_exports::alloc_utils::Box::new(::core::clone::Clone::clone(self)))
}
}
impl bevy_reflect::FromReflect for RectangleMeshBuilder where {
fn from_reflect(reflect: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<Self> {
if let bevy_reflect::ReflectRef::Struct(__ref_struct) =
bevy_reflect::PartialReflect::reflect_ref(reflect) {
let mut __this =
<Self as ::core::default::Default>::default();
if let ::core::option::Option::Some(__field) =
(||
<Vec2 as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
"half_size")?))() {
__this.half_size = __field;
}
::core::option::Option::Some(__this)
} else { ::core::option::Option::None }
}
}
};Reflect)]
1038#[reflect(Default, Debug, Clone)]
1039pub struct RectangleMeshBuilder {
1040 half_size: Vec2,
1041}
1042
1043impl Default for RectangleMeshBuilder {
1044 fn default() -> Self {
1046 Self {
1047 half_size: Vec2::splat(0.5),
1048 }
1049 }
1050}
1051
1052impl RectangleMeshBuilder {
1053 pub const fn new(width: f32, height: f32) -> Self {
1059 if true {
if !(width >= 0.0) {
{
::core::panicking::panic_fmt(format_args!("rectangle has a negative width"));
}
};
};debug_assert!(width >= 0.0, "rectangle has a negative width");
1060 if true {
if !(height >= 0.0) {
{
::core::panicking::panic_fmt(format_args!("rectangle has a negative height"));
}
};
};debug_assert!(height >= 0.0, "rectangle has a negative height");
1061
1062 Self {
1063 half_size: Vec2::new(width / 2.0, height / 2.0),
1064 }
1065 }
1066}
1067
1068impl MeshBuilder for RectangleMeshBuilder {
1069 fn build(&self) -> Mesh {
1070 let [hw, hh] = [self.half_size.x, self.half_size.y];
1071 let positions = ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[[hw, hh, 0.0], [-hw, hh, 0.0], [-hw, -hh, 0.0], [hw, -hh, 0.0]]))vec![
1072 [hw, hh, 0.0],
1073 [-hw, hh, 0.0],
1074 [-hw, -hh, 0.0],
1075 [hw, -hh, 0.0],
1076 ];
1077 let normals = ::alloc::vec::from_elem([0.0, 0.0, 1.0], 4)vec![[0.0, 0.0, 1.0]; 4];
1078 let uvs = ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[[1.0, 0.0], [0.0, 0.0], [0.0, 1.0], [1.0, 1.0]]))vec![[1.0, 0.0], [0.0, 0.0], [0.0, 1.0], [1.0, 1.0]];
1079 let indices = Indices::U32(::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[0, 1, 2, 0, 2, 3]))vec![0, 1, 2, 0, 2, 3]);
1080
1081 Mesh::new(
1082 PrimitiveTopology::TriangleList,
1083 RenderAssetUsages::default(),
1084 )
1085 .with_inserted_indices(indices)
1086 .with_inserted_attribute(Mesh::ATTRIBUTE_POSITION, positions)
1087 .with_inserted_attribute(Mesh::ATTRIBUTE_NORMAL, normals)
1088 .with_inserted_attribute(Mesh::ATTRIBUTE_UV_0, uvs)
1089 }
1090}
1091
1092impl Extrudable for RectangleMeshBuilder {
1093 fn perimeter(&self) -> Vec<PerimeterSegment> {
1094 ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[PerimeterSegment::Flat {
indices: ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[0, 1, 2, 3, 0])),
}]))vec![PerimeterSegment::Flat {
1095 indices: vec![0, 1, 2, 3, 0],
1096 }]
1097 }
1098}
1099
1100impl Meshable for Rectangle {
1101 type Output = RectangleMeshBuilder;
1102
1103 fn mesh(&self) -> Self::Output {
1104 RectangleMeshBuilder {
1105 half_size: self.half_size,
1106 }
1107 }
1108}
1109
1110impl From<Rectangle> for Mesh {
1111 fn from(rectangle: Rectangle) -> Self {
1112 rectangle.mesh().build()
1113 }
1114}
1115
1116#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for Capsule2dMeshBuilder { }
#[automatically_derived]
impl ::core::clone::Clone for Capsule2dMeshBuilder {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Capsule2d>;
let _: ::core::clone::AssertParamIsClone<u32>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for Capsule2dMeshBuilder { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for Capsule2dMeshBuilder {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"Capsule2dMeshBuilder", "capsule", &self.capsule, "resolution",
&&self.resolution)
}
}Debug, const _: () =
{
impl bevy_reflect::GetTypeRegistration for Capsule2dMeshBuilder where
{
fn get_type_registration() -> bevy_reflect::TypeRegistration {
let mut registration =
bevy_reflect::TypeRegistration::of::<Self>();
registration.insert(<bevy_reflect::ReflectFromPtr as
bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
registration.insert(<bevy_reflect::ReflectFromReflect as
bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
registration.register_type_data_with::<ReflectDefault, Self,
_>(());
registration
}
#[inline(never)]
fn register_type_dependencies(registry:
&mut bevy_reflect::TypeRegistry) {
<Capsule2d as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
<u32 as
bevy_reflect::__macro_exports::RegisterForReflection>::__register(registry);
}
}
impl bevy_reflect::Typed for Capsule2dMeshBuilder where {
#[inline(never)]
fn type_info() -> &'static bevy_reflect::TypeInfo {
static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
bevy_reflect::utility::NonGenericTypeInfoCell::new();
CELL.get_or_set(#[inline(never)] ||
{
bevy_reflect::TypeInfo::Struct(bevy_reflect::structs::StructInfo::new::<Self>(&[bevy_reflect::NamedField::new::<Capsule2d>("capsule"),
bevy_reflect::NamedField::new::<u32>("resolution")]))
})
}
}
#[allow(deprecated, reason =
"derives on a deprecated type shouldn't be considered a usage")]
impl bevy_reflect::TypePath for Capsule2dMeshBuilder where {
fn type_path() -> &'static str {
"bevy_mesh::primitives::dim2::Capsule2dMeshBuilder"
}
fn short_type_path() -> &'static str { "Capsule2dMeshBuilder" }
fn type_ident() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("Capsule2dMeshBuilder")
}
fn crate_name() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_mesh::primitives::dim2".split(':').next().unwrap())
}
fn module_path() -> ::core::option::Option<&'static str> {
::core::option::Option::Some("bevy_mesh::primitives::dim2")
}
}
impl bevy_reflect::Reflect for Capsule2dMeshBuilder where {
#[inline]
fn into_any(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn ::core::any::Any> {
self
}
#[inline]
fn as_any(&self) -> &dyn ::core::any::Any { self }
#[inline]
fn as_any_mut(&mut self) -> &mut dyn ::core::any::Any { self }
#[inline]
fn into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect> {
self
}
#[inline]
fn as_reflect(&self) -> &dyn bevy_reflect::Reflect { self }
#[inline]
fn as_reflect_mut(&mut self) -> &mut dyn bevy_reflect::Reflect {
self
}
#[inline]
fn set(&mut self,
value:
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>)
->
::core::result::Result<(),
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>> {
*self = <dyn bevy_reflect::Reflect>::take(value)?;
::core::result::Result::Ok(())
}
}
#[allow(non_upper_case_globals)]
const _: () =
{
static __INVENTORY: ::inventory::Node =
::inventory::Node {
value: &{
bevy_reflect::__macro_exports::auto_register::AutomaticReflectRegistrations(<Capsule2dMeshBuilder
as
bevy_reflect::__macro_exports::auto_register::RegisterForReflection>::__register)
},
next: ::inventory::__private::UnsafeCell::new(::inventory::__private::Option::None),
};
#[link_section = ".text.startup"]
unsafe extern "C" fn __ctor() {
unsafe {
::inventory::ErasedNode::submit(__INVENTORY.value,
&__INVENTORY)
}
}
#[used]
#[link_section = ".init_array"]
static __CTOR: unsafe extern "C" fn() = __ctor;
};
impl bevy_reflect::structs::Struct for Capsule2dMeshBuilder where {
fn field(&self, name: &str)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match name {
"capsule" => ::core::option::Option::Some(&self.capsule),
"resolution" =>
::core::option::Option::Some(&self.resolution),
_ => ::core::option::Option::None,
}
}
fn field_mut(&mut self, name: &str)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match name {
"capsule" =>
::core::option::Option::Some(&mut self.capsule),
"resolution" =>
::core::option::Option::Some(&mut self.resolution),
_ => ::core::option::Option::None,
}
}
fn field_at(&self, index: usize)
-> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
match index {
0usize => ::core::option::Option::Some(&self.capsule),
1usize => ::core::option::Option::Some(&self.resolution),
_ => ::core::option::Option::None,
}
}
fn field_at_mut(&mut self, index: usize)
->
::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
match index {
0usize => ::core::option::Option::Some(&mut self.capsule),
1usize =>
::core::option::Option::Some(&mut self.resolution),
_ => ::core::option::Option::None,
}
}
fn name_at(&self, index: usize) -> ::core::option::Option<&str> {
match index {
0usize => ::core::option::Option::Some("capsule"),
1usize => ::core::option::Option::Some("resolution"),
_ => ::core::option::Option::None,
}
}
fn index_of_name(&self, name: &str)
-> ::core::option::Option<usize> {
match name {
"capsule" => ::core::option::Option::Some(0usize),
"resolution" => ::core::option::Option::Some(1usize),
_ => ::core::option::Option::None,
}
}
fn field_len(&self) -> usize { 2usize }
fn iter_fields(&self) -> bevy_reflect::structs::FieldIter {
bevy_reflect::structs::FieldIter::new(self)
}
fn to_dynamic_struct(&self)
->
::core::result::Result<bevy_reflect::structs::DynamicStruct,
bevy_reflect::ReflectCloneError> {
let mut dynamic: bevy_reflect::structs::DynamicStruct =
::core::default::Default::default();
dynamic.set_represented_type(bevy_reflect::PartialReflect::get_represented_type_info(self));
dynamic.insert_boxed("capsule",
bevy_reflect::PartialReflect::to_dynamic(&self.capsule)?);
dynamic.insert_boxed("resolution",
bevy_reflect::PartialReflect::to_dynamic(&self.resolution)?);
::core::result::Result::Ok(dynamic)
}
}
impl bevy_reflect::PartialReflect for Capsule2dMeshBuilder where {
#[inline]
fn get_represented_type_info(&self)
-> ::core::option::Option<&'static bevy_reflect::TypeInfo> {
::core::option::Option::Some(<Self as
bevy_reflect::Typed>::type_info())
}
#[inline]
fn try_apply(&mut self, value: &dyn bevy_reflect::PartialReflect)
-> ::core::result::Result<(), bevy_reflect::ApplyError> {
if let bevy_reflect::ReflectRef::Struct(struct_value) =
bevy_reflect::PartialReflect::reflect_ref(value) {
for (name, value) in
bevy_reflect::structs::Struct::iter_fields(struct_value) {
if let ::core::option::Option::Some(v) =
bevy_reflect::structs::Struct::field_mut(self, name) {
bevy_reflect::PartialReflect::try_apply(v, value)?;
}
}
} else {
return ::core::result::Result::Err(bevy_reflect::ApplyError::MismatchedKinds {
from_kind: bevy_reflect::PartialReflect::reflect_kind(value),
to_kind: bevy_reflect::ReflectKind::Struct,
});
}
::core::result::Result::Ok(())
}
#[inline]
fn reflect_kind(&self) -> bevy_reflect::ReflectKind {
bevy_reflect::ReflectKind::Struct
}
#[inline]
fn reflect_ref(&self) -> bevy_reflect::ReflectRef {
bevy_reflect::ReflectRef::Struct(self)
}
#[inline]
fn reflect_mut(&mut self) -> bevy_reflect::ReflectMut {
bevy_reflect::ReflectMut::Struct(self)
}
#[inline]
fn reflect_owned(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
-> bevy_reflect::ReflectOwned {
bevy_reflect::ReflectOwned::Struct(self)
}
#[inline]
fn try_into_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect>> {
::core::result::Result::Ok(self)
}
#[inline]
fn try_as_reflect(&self)
-> ::core::option::Option<&dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn try_as_reflect_mut(&mut self)
-> ::core::option::Option<&mut dyn bevy_reflect::Reflect> {
::core::option::Option::Some(self)
}
#[inline]
fn into_partial_reflect(self:
bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
->
bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect> {
self
}
#[inline]
fn as_partial_reflect(&self)
-> &dyn bevy_reflect::PartialReflect {
self
}
#[inline]
fn as_partial_reflect_mut(&mut self)
-> &mut dyn bevy_reflect::PartialReflect {
self
}
fn reflect_partial_eq(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<bool> {
(bevy_reflect::structs::struct_partial_eq)(self, value)
}
fn reflect_partial_cmp(&self,
value: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<::core::cmp::Ordering> {
(bevy_reflect::structs::struct_partial_cmp)(self, value)
}
fn debug(&self, f: &mut ::core::fmt::Formatter<'_>)
-> ::core::fmt::Result {
::core::fmt::Debug::fmt(self, f)
}
#[inline]
fn reflect_clone(&self)
->
::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
bevy_reflect::ReflectCloneError> {
::core::result::Result::Ok(bevy_reflect::__macro_exports::alloc_utils::Box::new(::core::clone::Clone::clone(self)))
}
}
impl bevy_reflect::FromReflect for Capsule2dMeshBuilder where {
fn from_reflect(reflect: &dyn bevy_reflect::PartialReflect)
-> ::core::option::Option<Self> {
if let bevy_reflect::ReflectRef::Struct(__ref_struct) =
bevy_reflect::PartialReflect::reflect_ref(reflect) {
let mut __this =
<Self as ::core::default::Default>::default();
if let ::core::option::Option::Some(__field) =
(||
<Capsule2d as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
"capsule")?))() {
__this.capsule = __field;
}
if let ::core::option::Option::Some(__field) =
(||
<u32 as
bevy_reflect::FromReflect>::from_reflect(bevy_reflect::structs::Struct::field(__ref_struct,
"resolution")?))() {
__this.resolution = __field;
}
::core::option::Option::Some(__this)
} else { ::core::option::Option::None }
}
}
};Reflect)]
1118#[reflect(Default, Debug, Clone)]
1119pub struct Capsule2dMeshBuilder {
1120 pub capsule: Capsule2d,
1122 pub resolution: u32,
1127}
1128
1129impl Default for Capsule2dMeshBuilder {
1130 fn default() -> Self {
1131 Self {
1132 capsule: Capsule2d::default(),
1133 resolution: 16,
1134 }
1135 }
1136}
1137
1138impl Capsule2dMeshBuilder {
1139 #[inline]
1142 pub fn new(radius: f32, length: f32, resolution: u32) -> Self {
1143 Self {
1144 capsule: Capsule2d::new(radius, length),
1145 resolution,
1146 }
1147 }
1148
1149 #[inline]
1152 pub const fn resolution(mut self, resolution: u32) -> Self {
1153 self.resolution = resolution;
1154 self
1155 }
1156}
1157
1158impl MeshBuilder for Capsule2dMeshBuilder {
1159 fn build(&self) -> Mesh {
1160 let resolution = self.resolution;
1162 let vertex_count = 2 * resolution;
1163
1164 let mut indices = Vec::with_capacity((resolution as usize - 2) * 2 * 3 + 6);
1166 let mut positions = Vec::with_capacity(vertex_count as usize);
1167 let normals = ::alloc::vec::from_elem([0.0, 0.0, 1.0], vertex_count as usize)vec![[0.0, 0.0, 1.0]; vertex_count as usize];
1168 let mut uvs = Vec::with_capacity(vertex_count as usize);
1169
1170 let radius = self.capsule.radius;
1171 let step = core::f32::consts::TAU / vertex_count as f32;
1172
1173 let start_angle = if vertex_count.is_multiple_of(2) {
1176 step / 2.0
1177 } else {
1178 0.0
1179 };
1180
1181 let radius_frac = self.capsule.radius / (self.capsule.half_length + self.capsule.radius);
1184
1185 for i in 0..resolution {
1187 let theta = start_angle + i as f32 * step;
1189 let (sin, cos) = ops::sin_cos(theta);
1190 let (x, y) = (cos * radius, sin * radius + self.capsule.half_length);
1191
1192 positions.push([x, y, 0.0]);
1193 uvs.push([0.5 * (cos + 1.0), radius_frac * (1.0 - 0.5 * (sin + 1.0))]);
1194 }
1195
1196 for i in 1..resolution - 1 {
1198 indices.extend_from_slice(&[0, i, i + 1]);
1199 }
1200
1201 indices.extend_from_slice(&[0, resolution - 1, resolution]);
1203
1204 for i in resolution..vertex_count {
1206 let theta = start_angle + i as f32 * step;
1208 let (sin, cos) = ops::sin_cos(theta);
1209 let (x, y) = (cos * radius, sin * radius - self.capsule.half_length);
1210
1211 positions.push([x, y, 0.0]);
1212 uvs.push([0.5 * (cos + 1.0), 1.0 - radius_frac * 0.5 * (sin + 1.0)]);
1213 }
1214
1215 for i in 1..resolution - 1 {
1217 indices.extend_from_slice(&[resolution, resolution + i, resolution + i + 1]);
1218 }
1219
1220 indices.extend_from_slice(&[resolution, vertex_count - 1, 0]);
1222
1223 Mesh::new(
1224 PrimitiveTopology::TriangleList,
1225 RenderAssetUsages::default(),
1226 )
1227 .with_inserted_attribute(Mesh::ATTRIBUTE_POSITION, positions)
1228 .with_inserted_attribute(Mesh::ATTRIBUTE_NORMAL, normals)
1229 .with_inserted_attribute(Mesh::ATTRIBUTE_UV_0, uvs)
1230 .with_inserted_indices(Indices::U32(indices))
1231 }
1232}
1233
1234impl Extrudable for Capsule2dMeshBuilder {
1235 fn perimeter(&self) -> Vec<PerimeterSegment> {
1236 let resolution = self.resolution;
1237 let top_semi_indices = (0..resolution).collect();
1238 let bottom_semi_indices = (resolution..(2 * resolution)).collect();
1239 ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[PerimeterSegment::Smooth {
first_normal: Vec2::X,
last_normal: Vec2::NEG_X,
indices: top_semi_indices,
},
PerimeterSegment::Flat {
indices: ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[resolution - 1, resolution])),
},
PerimeterSegment::Smooth {
first_normal: Vec2::NEG_X,
last_normal: Vec2::X,
indices: bottom_semi_indices,
},
PerimeterSegment::Flat {
indices: ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[2 * resolution - 1, 0])),
}]))vec![
1240 PerimeterSegment::Smooth {
1241 first_normal: Vec2::X,
1242 last_normal: Vec2::NEG_X,
1243 indices: top_semi_indices,
1244 }, PerimeterSegment::Flat {
1246 indices: vec![resolution - 1, resolution],
1247 }, PerimeterSegment::Smooth {
1249 first_normal: Vec2::NEG_X,
1250 last_normal: Vec2::X,
1251 indices: bottom_semi_indices,
1252 }, PerimeterSegment::Flat {
1254 indices: vec![2 * resolution - 1, 0],
1255 }, ]
1257 }
1258}
1259
1260impl Meshable for Capsule2d {
1261 type Output = Capsule2dMeshBuilder;
1262
1263 fn mesh(&self) -> Self::Output {
1264 Capsule2dMeshBuilder {
1265 capsule: *self,
1266 ..Default::default()
1267 }
1268 }
1269}
1270
1271impl From<Capsule2d> for Mesh {
1272 fn from(capsule: Capsule2d) -> Self {
1273 capsule.mesh().build()
1274 }
1275}
1276
1277pub struct RingMeshBuilder<P>
1279where
1280 P: Primitive2d + Meshable,
1281{
1282 pub outer_shape_builder: P::Output,
1283 pub inner_shape_builder: P::Output,
1284}
1285
1286impl<P> RingMeshBuilder<P>
1287where
1288 P: Primitive2d + Meshable,
1289{
1290 pub fn new(ring: &Ring<P>) -> Self {
1292 Self {
1293 outer_shape_builder: ring.outer_shape.mesh(),
1294 inner_shape_builder: ring.inner_shape.mesh(),
1295 }
1296 }
1297
1298 pub fn with_inner(mut self, func: impl Fn(P::Output) -> P::Output) -> Self {
1300 self.outer_shape_builder = func(self.outer_shape_builder);
1301 self.inner_shape_builder = func(self.inner_shape_builder);
1302 self
1303 }
1304
1305 fn get_vertex_attributes(&self) -> Option<RingMeshBuilderVertexAttributes> {
1306 fn get_positions(mesh: &mut Mesh) -> Option<&mut Vec<[f32; 3]>> {
1307 if let VertexAttributeValues::Float32x3(data) =
1308 mesh.attribute_mut(Mesh::ATTRIBUTE_POSITION)?
1309 {
1310 Some(data)
1311 } else {
1312 None
1313 }
1314 }
1315
1316 fn get_uvs(mesh: &mut Mesh) -> Option<&mut Vec<[f32; 2]>> {
1317 if let VertexAttributeValues::Float32x2(data) =
1318 mesh.attribute_mut(Mesh::ATTRIBUTE_UV_0)?
1319 {
1320 Some(data)
1321 } else {
1322 None
1323 }
1324 }
1325
1326 fn get_normals(mesh: &mut Mesh) -> Option<&mut Vec<[f32; 3]>> {
1327 if let VertexAttributeValues::Float32x3(data) =
1328 mesh.attribute_mut(Mesh::ATTRIBUTE_NORMAL)?
1329 {
1330 Some(data)
1331 } else {
1332 None
1333 }
1334 }
1335
1336 let mut outer = self.outer_shape_builder.build();
1337 let mut inner = self.inner_shape_builder.build();
1338
1339 {
match (&outer.primitive_topology(), &PrimitiveTopology::TriangleList) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val,
::core::option::Option::Some(format_args!("PrimitiveTopology must be a TriangleList, mesh builder not compatible")));
}
}
}
};assert_eq!(
1340 outer.primitive_topology(),
1341 PrimitiveTopology::TriangleList,
1342 "PrimitiveTopology must be a TriangleList, mesh builder not compatible"
1343 );
1344 {
match (&inner.primitive_topology(), &PrimitiveTopology::TriangleList) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val,
::core::option::Option::Some(format_args!("PrimitiveTopology must be a TriangleList, mesh builder not compatible")));
}
}
}
};assert_eq!(
1345 inner.primitive_topology(),
1346 PrimitiveTopology::TriangleList,
1347 "PrimitiveTopology must be a TriangleList, mesh builder not compatible"
1348 );
1349
1350 Some(RingMeshBuilderVertexAttributes {
1351 outer_positions: mem::take(get_positions(&mut outer)?),
1352 inner_positions: mem::take(get_positions(&mut inner)?),
1353 outer_normals: mem::take(get_normals(&mut outer)?),
1354 inner_normals: mem::take(get_normals(&mut inner)?),
1355 outer_uvs: mem::take(get_uvs(&mut outer)?),
1356 inner_uvs: mem::take(get_uvs(&mut inner)?),
1357 })
1358 }
1359}
1360
1361struct RingMeshBuilderVertexAttributes {
1362 outer_positions: Vec<[f32; 3]>,
1363 inner_positions: Vec<[f32; 3]>,
1364 outer_normals: Vec<[f32; 3]>,
1365 inner_normals: Vec<[f32; 3]>,
1366 outer_uvs: Vec<[f32; 2]>,
1367 inner_uvs: Vec<[f32; 2]>,
1368}
1369
1370impl<P> MeshBuilder for RingMeshBuilder<P>
1371where
1372 P: Primitive2d + Meshable,
1373{
1374 fn build(&self) -> Mesh {
1388 if let Some(RingMeshBuilderVertexAttributes {
1389 outer_uvs,
1390 inner_uvs,
1391 outer_positions,
1392 inner_positions,
1393 outer_normals,
1394 inner_normals,
1395 }) = self.get_vertex_attributes()
1396 && outer_uvs.len() == inner_uvs.len()
1397 && outer_positions.len() == inner_positions.len()
1398 && outer_normals.len() == inner_normals.len()
1399 {
1400 let mut uvs = outer_uvs;
1401 let inner_uvs = inner_positions
1402 .iter()
1403 .zip(&outer_positions)
1404 .zip(&inner_uvs)
1405 .map(|((inner_position, outer_position), inner_uv)| -> [f32; 2] {
1406 const UV_CENTER: Vec2 = Vec2::splat(0.5);
1407 let ip = Vec3::from(*inner_position).truncate();
1408 let op = Vec3::from(*outer_position).truncate();
1409 let uv = Vec2::from(*inner_uv) - UV_CENTER;
1410 (uv * ip.length() / op.length() + UV_CENTER).into()
1411 });
1412 uvs.extend(inner_uvs);
1413
1414 let mut normals = outer_normals;
1415 normals.extend(inner_normals);
1416
1417 let points = outer_positions.len() as u32;
1418 let mut indices = Vec::with_capacity(outer_positions.len() * 6);
1419 for i in 0..points {
1420 indices.push(i); indices.push(i + 1); indices.push(points + i); indices.push(points + i); indices.push(i + 1); indices.push(points + i + 1); }
1428 let indices_length = indices.len();
1429 if let (_, [_, b, _, _, e, f]) = indices.split_at_mut(indices_length.saturating_sub(6))
1431 {
1432 *b = 0;
1433 *e = 0;
1434 *f = points;
1435 }
1436
1437 let mut positions = outer_positions;
1438 positions.extend_from_slice(&inner_positions);
1439
1440 Mesh::new(
1441 PrimitiveTopology::TriangleList,
1442 RenderAssetUsages::default(),
1443 )
1444 .with_inserted_attribute(Mesh::ATTRIBUTE_POSITION, positions)
1445 .with_inserted_attribute(Mesh::ATTRIBUTE_NORMAL, normals)
1446 .with_inserted_attribute(Mesh::ATTRIBUTE_UV_0, uvs)
1447 .with_inserted_indices(Indices::U32(indices))
1448 } else {
1449 {
::core::panicking::panic_fmt(format_args!("The inner and outer meshes should have the same number of vertices, and have required attributes"));
};panic!("The inner and outer meshes should have the same number of vertices, and have required attributes");
1450 }
1451 }
1452}
1453
1454impl<P> Extrudable for RingMeshBuilder<P>
1455where
1456 P: Primitive2d + Meshable,
1457 P::Output: Extrudable,
1458{
1459 fn perimeter(&self) -> Vec<PerimeterSegment> {
1473 let outer_vertex_count = self
1474 .get_vertex_attributes()
1475 .filter(|r| r.outer_positions.len() == r.inner_positions.len())
1476 .expect("The inner and outer meshes should have the same number of vertices, and have required attributes")
1477 .outer_positions
1478 .len();
1479
1480 let mut outer_perimeter = self.outer_shape_builder.perimeter();
1481 let inner_perimeter =
1482 self.inner_shape_builder
1483 .perimeter()
1484 .into_iter()
1485 .rev()
1486 .map(|segment| match segment {
1487 PerimeterSegment::Smooth {
1488 first_normal,
1489 last_normal,
1490 mut indices,
1491 } => PerimeterSegment::Smooth {
1492 first_normal: -last_normal,
1493 last_normal: -first_normal,
1494 indices: {
1495 let outer_perimeter_vertex_count = outer_vertex_count as u32;
1496 indices.reverse();
1497 for i in &mut indices {
1498 *i += outer_perimeter_vertex_count;
1499 }
1500 indices
1501 },
1502 },
1503 PerimeterSegment::Flat { mut indices } => PerimeterSegment::Flat {
1504 indices: {
1505 let outer_perimeter_vertex_count = outer_vertex_count as u32;
1506 indices.reverse();
1507 for i in &mut indices {
1508 *i += outer_perimeter_vertex_count;
1509 }
1510 indices
1511 },
1512 },
1513 });
1514
1515 outer_perimeter.extend(inner_perimeter);
1516 outer_perimeter
1517 }
1518}
1519
1520impl<P> Meshable for Ring<P>
1521where
1522 P: Primitive2d + Meshable,
1523{
1524 type Output = RingMeshBuilder<P>;
1525
1526 fn mesh(&self) -> Self::Output {
1527 RingMeshBuilder::new(self)
1528 }
1529}
1530
1531impl<P> From<Ring<P>> for Mesh
1532where
1533 P: Primitive2d + Meshable,
1534{
1535 fn from(ring: Ring<P>) -> Self {
1536 ring.mesh().build()
1537 }
1538}
1539
1540#[cfg(test)]
1541mod tests {
1542 use bevy_math::{FloatOrd, Vec2};
1543 use bevy_platform::collections::HashSet;
1544 use bevy_shape::{Annulus, ConvexPolygon, RegularPolygon};
1545
1546 use crate::{Mesh, MeshBuilder, Meshable, VertexAttributeValues};
1547
1548 fn count_distinct_positions(points: &[[f32; 3]]) -> usize {
1549 let mut map = <HashSet<_>>::default();
1550 for point in points {
1551 map.insert(point.map(FloatOrd));
1552 }
1553 map.len()
1554 }
1555
1556 #[test]
1557 fn test_annulus() {
1558 let mesh = Annulus::new(1.0, 1.2).mesh().resolution(16).build();
1559
1560 assert_eq!(
1561 32,
1562 count_distinct_positions(
1563 mesh.attribute(Mesh::ATTRIBUTE_POSITION)
1564 .unwrap()
1565 .as_float3()
1566 .unwrap()
1567 )
1568 );
1569 }
1570
1571 fn fix_floats<const N: usize>(points: &mut [[f32; N]]) {
1574 for point in points.iter_mut() {
1575 for coord in point.iter_mut() {
1576 let round = (*coord * 2.).round() / 2.;
1577 if (*coord - round).abs() < 0.00001 {
1578 *coord = round;
1579 }
1580 }
1581 }
1582 }
1583
1584 #[test]
1585 fn test_regular_polygon() {
1586 let mut mesh = Mesh::from(RegularPolygon::new(7.0, 4));
1587
1588 let Some(VertexAttributeValues::Float32x3(mut positions)) =
1589 mesh.remove_attribute(Mesh::ATTRIBUTE_POSITION)
1590 else {
1591 panic!("Expected positions f32x3");
1592 };
1593 let Some(VertexAttributeValues::Float32x2(mut uvs)) =
1594 mesh.remove_attribute(Mesh::ATTRIBUTE_UV_0)
1595 else {
1596 panic!("Expected uvs f32x2");
1597 };
1598 let Some(VertexAttributeValues::Float32x3(normals)) =
1599 mesh.remove_attribute(Mesh::ATTRIBUTE_NORMAL)
1600 else {
1601 panic!("Expected normals f32x3");
1602 };
1603
1604 fix_floats(&mut positions);
1605 fix_floats(&mut uvs);
1606
1607 assert_eq!(
1608 [
1609 [0.0, 7.0, 0.0],
1610 [-7.0, 0.0, 0.0],
1611 [0.0, -7.0, 0.0],
1612 [7.0, 0.0, 0.0],
1613 ],
1614 &positions[..]
1615 );
1616
1617 assert_eq!([[0.5, 0.0], [0.0, 0.5], [0.5, 1.0], [1.0, 0.5],], &uvs[..]);
1619
1620 assert_eq!(&[[0.0, 0.0, 1.0]; 4], &normals[..]);
1621 }
1622
1623 #[test]
1624 fn test_convex_polygon() {
1625 let polygon = ConvexPolygon::new(vec![
1626 Vec2::new(-2.0, -1.0),
1627 Vec2::new(2.0, -1.0),
1628 Vec2::new(1.0, 3.0),
1629 Vec2::new(-1.0, 2.0),
1630 ])
1631 .unwrap();
1632
1633 let mut mesh = Mesh::from(polygon);
1634
1635 let Some(VertexAttributeValues::Float32x3(mut positions)) =
1636 mesh.remove_attribute(Mesh::ATTRIBUTE_POSITION)
1637 else {
1638 panic!("Expected positions f32x3");
1639 };
1640 let Some(VertexAttributeValues::Float32x2(mut uvs)) =
1641 mesh.remove_attribute(Mesh::ATTRIBUTE_UV_0)
1642 else {
1643 panic!("Expected uvs f32x2");
1644 };
1645 let Some(VertexAttributeValues::Float32x3(normals)) =
1646 mesh.remove_attribute(Mesh::ATTRIBUTE_NORMAL)
1647 else {
1648 panic!("Expected normals f32x3");
1649 };
1650
1651 fix_floats(&mut positions);
1652 fix_floats(&mut uvs);
1653
1654 assert_eq!(
1655 [
1656 [-2.0, -1.0, 0.0],
1657 [2.0, -1.0, 0.0],
1658 [1.0, 3.0, 0.0],
1659 [-1.0, 2.0, 0.0],
1660 ],
1661 &positions[..]
1662 );
1663
1664 assert_eq!(
1665 [[0.0, 0.0], [1.0, 0.0], [0.75, 1.0], [0.25, 0.75]],
1666 &uvs[..]
1667 );
1668
1669 assert_eq!(&[[0.0, 0.0, 1.0]; 4], &normals[..]);
1670 }
1671}