From 50632d09f0cb6b88773fc5a37e43cd9326496124 Mon Sep 17 00:00:00 2001 From: makspll Date: Fri, 1 May 2026 13:59:47 +0100 Subject: [PATCH 1/5] cook a bit --- Cargo.toml | 16 +- .../assets/definitions/bindings.d.lua | 31309 ++++ .../assets/definitions/bindings.lad.json | 142831 +++++++++++++++ .../assets/definitions/bindings.wit | 14415 ++ .../lad_backends/lad_wit_backend/Cargo.toml | 28 + .../lad_backends/lad_wit_backend/src/lib.rs | 475 + crates/ladfile_builder/Cargo.toml | 1 + crates/ladfile_builder/src/plugin.rs | 3 + .../bevy_mod_scripting_wasmtime/Cargo.toml | 29 + .../bevy_mod_scripting_wasmtime/src/lib.rs | 456 + examples/run_wasm.rs | 76 + guest_crate/Cargo.toml | 10 + guest_crate/bindings.wit | 14415 ++ guest_crate/src/lib.rs | 118 + src/prelude.rs | 1 + 15 files changed, 204181 insertions(+), 2 deletions(-) create mode 100644 crates/lad_backends/assets/definitions/bindings.d.lua create mode 100644 crates/lad_backends/assets/definitions/bindings.lad.json create mode 100644 crates/lad_backends/assets/definitions/bindings.wit create mode 100644 crates/lad_backends/lad_wit_backend/Cargo.toml create mode 100644 crates/lad_backends/lad_wit_backend/src/lib.rs create mode 100644 crates/languages/bevy_mod_scripting_wasmtime/Cargo.toml create mode 100644 crates/languages/bevy_mod_scripting_wasmtime/src/lib.rs create mode 100644 examples/run_wasm.rs create mode 100644 guest_crate/Cargo.toml create mode 100644 guest_crate/bindings.wit create mode 100644 guest_crate/src/lib.rs diff --git a/Cargo.toml b/Cargo.toml index f187c006ce..614296edb7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -60,6 +60,7 @@ lua_language_server_files = [ "ladfile_builder/lua_language_server_files", ] + # bindings core_functions = ["bevy_mod_scripting_functions/core_functions"] @@ -125,6 +126,7 @@ bevy_mod_scripting_bindings = { workspace = true } bevy_mod_scripting_bindings_domain = { workspace = true } bevy_mod_scripting_display = { workspace = true } bevy_mod_scripting_script = { workspace = true } +bevy_mod_scripting_wasmtime = { workspace = true } ladfile_builder = { workspace = true, optional = true } [workspace.dependencies] @@ -140,12 +142,16 @@ ladfile = { path = "crates/ladfile", version = "0.19.0" } ladfile_builder = { path = "crates/ladfile_builder", version = "0.19.0" } bevy_mod_scripting_lua = { path = "crates/languages/bevy_mod_scripting_lua", version = "0.19.0", default-features = false } bevy_mod_scripting_rhai = { path = "crates/languages/bevy_mod_scripting_rhai", version = "0.19.0", default-features = false } +bevy_mod_scripting_wasmtime = { path = "crates/languages/bevy_mod_scripting_wasmtime", version = "0.19.0", default-features = false } + bevy_mod_scripting_asset = { path = "crates/bevy_mod_scripting_asset", version = "0.19.0", default-features = false } bevy_mod_scripting_bindings = { path = "crates/bevy_mod_scripting_bindings", version = "0.19.0", default-features = false } bevy_mod_scripting_bindings_domain = { path = "crates/bevy_mod_scripting_bindings_domain", version = "0.19.0", default-features = false } bevy_mod_scripting_display = { path = "crates/bevy_mod_scripting_display", version = "0.19.0", default-features = false } bevy_mod_scripting_script = { path = "crates/bevy_mod_scripting_script", version = "0.19.0", default-features = false } lua_language_server_lad_backend = { path = "crates/lad_backends/lua_language_server_lad_backend", version = "0.19.0", default-features = false } +lad_wit_backend = { path = "crates/lad_backends/lad_wit_backend" , version = "0.19.0" } + bevy_mod_scripting_core = { path = "crates/bevy_mod_scripting_core", version = "0.19.0" } bevy_mod_scripting_world = { path = "crates/bevy_mod_scripting_world", version = "0.19.0", default-features = true} # bevy @@ -293,10 +299,10 @@ members = [ "crates/bevy_mod_scripting_script", "crates/bevy_mod_scripting_bindings_domain", "crates/bindings/*", - "crates/testing_crates/bevy_mod_scripting_test_scenario_syntax", "crates/bevy_mod_scripting_world", + "crates/testing_crates/bevy_mod_scripting_test_scenario_syntax", "crates/bevy_mod_scripting_world", "crates/languages/bevy_mod_scripting_wasmtime", "crates/lad_backends/lad_wit_backend", ] resolver = "2" -exclude = ["codegen", "crates/macro_tests", "xtask"] +exclude = ["codegen", "crates/macro_tests", "xtask", "guest_crate/"] [profile.dev] debug = 1 @@ -340,6 +346,12 @@ required-features = ["lua_language_server_files"] name = "runscript" path = "examples/run_script.rs" + +[[example]] +name = "run_wasm" +path = "examples/run_wasm.rs" + + [[example]] name = "script_loading" path = "examples/script_loading.rs" diff --git a/crates/lad_backends/assets/definitions/bindings.d.lua b/crates/lad_backends/assets/definitions/bindings.d.lua new file mode 100644 index 0000000000..98a2078488 --- /dev/null +++ b/crates/lad_backends/assets/definitions/bindings.d.lua @@ -0,0 +1,31309 @@ +---@meta +---@module "World" + + +---@class World +--- The ECS world containing all Components, Resources and Systems. Main point of interaction with a Bevy App. +World = {} + +---@return ScriptQueryBuilder +function World.query() end + +---@param entity Entity +--- The entity to remove the component from. +---@param registration ScriptComponentRegistration +--- The component to remove. +---@return nil +function World.remove_component(entity,registration) end + +---@param type_name string +--- The name of the type to retrieve. +---@return ScriptTypeRegistration | ScriptComponentRegistration | ScriptResourceRegistration | nil +function World.get_type_by_name(type_name) end + +---@param entity Entity +--- The entity to retrieve the children of. +---@return Entity[] +function World.get_children(entity) end + +---@param entity Entity +--- The parent entity to receive children +---@param index integer +--- The index to insert the children at +---@param children Entity[] +--- The children entities to insert +---@return nil +function World.insert_children(entity,index,children) end + +---@param handle_reference ReflectReference +--- The handle to the asset (as a reflect reference). +---@param registration ScriptTypeRegistration +--- The type registration of the asset type. +---@return ReflectReference | nil +function World.get_asset(handle_reference,registration) end + +---@param entity Entity +--- The entity to retrieve the parent of. +---@return Entity | nil +function World.get_parent(entity) end + +---@param registration ScriptResourceRegistration +--- The registration of the resource to retrieve. +---@return ReflectReference | nil +function World.get_resource(registration) end + +---@return Entity +function World.spawn() end + +---@param entity Entity +--- The entity to insert the component into. +---@param registration ScriptComponentRegistration +--- The component registration of the component to insert. +---@param value ReflectReference +--- The value of the component to insert. Can be constructed using `construct` +---@return nil +function World.insert_component(entity,registration,value) end + +---@return nil +function World.exit() end + +---@param entity Entity +--- The entity to despawn. +---@return nil +function World.despawn(entity) end + +---@param name string +--- The name of the component type +---@return ScriptComponentRegistration +function World.register_new_component(name) end + +---@param registration ScriptResourceRegistration +--- The registration of the resource to check for. +---@return boolean +function World.has_resource(registration) end + +---@param entity Entity +--- The entity to retrieve the component from. +---@param registration ScriptComponentRegistration +--- The component to retrieve. +---@return ReflectReference | nil +function World.get_component(entity,registration) end + +---@param schedule ReflectSchedule +--- The schedule to add the system to. +---@param builder ScriptSystemBuilder +--- The system builder specifying the system and its dependencies. +---@return ReflectSystem +function World.add_system(schedule,builder) end + +---@param entity Entity +--- The entity to despawn the descendants of. +---@return nil +function World.despawn_descendants(entity) end + +---@param handle_reference ReflectReference +---@return boolean +function World.has_asset(handle_reference) end + +---@param entity Entity +--- The entity to despawn recursively. +---@return nil +function World.despawn_recursive(entity) end + +---@param e Entity +---@return boolean +function World.has_entity(e) end + +---@param entity Entity +--- The entity to check. +---@param registration ScriptComponentRegistration +--- The component to check for. +---@return boolean +function World.has_component(entity,registration) end + +---@param name string +--- The name of the schedule to retrieve. +---@return ReflectSchedule | nil +function World.get_schedule_by_name(name) end + +---@param entity Entity +---@param registration ScriptComponentRegistration +--- The resource to add. +---@return nil +function World.add_default_component(entity,registration) end + +---@param entity Entity +--- The parent entity to receive children +---@param children Entity[] +--- The children entities to push +---@return nil +function World.push_children(entity,children) end + +---@param registration ScriptResourceRegistration +--- The resource to remove. +---@return nil +function World.remove_resource(registration) end + + + +---@class ScriptComponentRegistration : ReflectReference +--- A reference to a component type's reflection registration. +--- +--- In general think of this as a handle to a type. +--- +--- Not to be confused with script registered dynamic components, although this can point to a script registered component. +---@field registration ? ScriptTypeRegistration +---@field component_id ? ComponentId +---@field is_dynamic_script_component ? boolean +ScriptComponentRegistration = {} + +---@param registration ScriptComponentRegistration +--- The type registration. +---@return string +function ScriptComponentRegistration.short_name(registration) end + +---@param registration ScriptComponentRegistration +--- The type registration. +---@return string +function ScriptComponentRegistration.type_name(registration) end + + + +---@class ScriptQueryBuilder : ReflectReference +--- The query builder is used to build ECS queries which retrieve spefific components filtered by specific conditions. +--- +--- For example: +--- ```rust,ignore +--- builder.component(componentA) +--- .component(componentB) +--- .with(componentC) +--- .without(componentD) +--- ``` +--- +--- Will retrieve entities which: +--- - Have componentA +--- - Have componentB +--- - Have componentC +--- - Do not have componentD +--- +--- As well as references to components: +--- - componentA +--- - componentB +ScriptQueryBuilder = {} + +---@param query ScriptQueryBuilder +--- The query to add the component to +---@param without ScriptComponentRegistration +---@return ScriptQueryBuilder +function ScriptQueryBuilder.without(query,without) end + +---@param query ScriptQueryBuilder +--- The query to add the component to +---@param with ScriptComponentRegistration +---@return ScriptQueryBuilder +function ScriptQueryBuilder.with(query,with) end + +---@param query ScriptQueryBuilder +--- The query to build. +---@return ScriptQueryResult[] +function ScriptQueryBuilder.build(query) end + +---@param query ScriptQueryBuilder +--- The query to add the component to +---@param components ScriptComponentRegistration +---@return ScriptQueryBuilder +function ScriptQueryBuilder.component(query,components) end + + + +---@class ScriptQueryResult : ReflectReference +--- A result from a query. +ScriptQueryResult = {} + +---@param query ScriptQueryResult +--- The query result to retrieve the components from. +---@return ReflectReference[] +function ScriptQueryResult.components(query) end + +---@param query ScriptQueryResult +--- The query result to retrieve the entity from. +---@return Entity +function ScriptQueryResult.entity(query) end + + + +---@class ScriptResourceRegistration : ReflectReference +--- A reference to a resource type's reflection registration. +--- +--- In general think of this as a handle to a type. +---@field registration ? ScriptTypeRegistration +---@field resource_id ? ComponentId +ScriptResourceRegistration = {} + +---@param registration ScriptResourceRegistration +--- The type registration. +---@return string +function ScriptResourceRegistration.type_name(registration) end + +---@param registration ScriptResourceRegistration +--- The type registration. +---@return string +function ScriptResourceRegistration.short_name(registration) end + + + +---@class ScriptTypeRegistration : ReflectReference +--- A reference to a type which is not a `Resource` or `Component`. +--- +--- In general think of this as a handle to a type. +ScriptTypeRegistration = {} + +---@param registration ScriptTypeRegistration +--- The type registration. +---@return string +function ScriptTypeRegistration.short_name(registration) end + +---@param registration ScriptTypeRegistration +--- The type registration. +---@return string +function ScriptTypeRegistration.type_name(registration) end + + + +---@class ScriptSystemBuilder : ReflectReference +--- A builder for systems living in scripts +ScriptSystemBuilder = {} + +---@param builder ScriptSystemBuilder +--- The system builder to add the dependency to. +---@param system ReflectSystem +--- The system to run before. +---@return ScriptSystemBuilder +function ScriptSystemBuilder.before(builder,system) end + +---@param builder ScriptSystemBuilder +--- The system builder to add the resource to. +---@param resource ScriptResourceRegistration +--- The resource to add. +---@return ScriptSystemBuilder +function ScriptSystemBuilder.resource(builder,resource) end + +---@param builder ScriptSystemBuilder +--- The system builder to add the query to. +---@param query ScriptQueryBuilder +--- The query to add. +---@return ScriptSystemBuilder +function ScriptSystemBuilder.query(builder,query) end + +---@param builder ScriptSystemBuilder +--- The system builder to make exclusive. +---@return ScriptSystemBuilder +function ScriptSystemBuilder.exclusive(builder) end + +---@param builder ScriptSystemBuilder +--- The system builder to add the dependency to. +---@param system ReflectSystem +--- The system to run after. +---@return ScriptSystemBuilder +function ScriptSystemBuilder.after(builder,system) end + + + +---@class ScriptAttachment : ReflectReference +--- Specifies a unique attachment of a script. These attachments are mapped to [`bevy_mod_scripting_core::ContextKey`]'s depending on the context policy used. +ScriptAttachment = {} + + + + + +---@class ReflectSchedule : ReflectReference +--- A reflectable schedule. +---@field type_path ? string +---@field label ? ReflectableScheduleLabel +ReflectSchedule = {} + +---@param schedule ReflectSchedule +--- The schedule to retrieve the system from. +---@param name string +--- The identifier or full path of the system to retrieve. +---@return ReflectSystem | nil +function ReflectSchedule.get_system_by_name(schedule,name) end + +---@param schedule ReflectSchedule +--- The schedule to render. +---@return string +function ReflectSchedule.render_dot(schedule) end + +---@param schedule ReflectSchedule +--- The schedule to retrieve the systems from. +---@return ReflectSystem[] +function ReflectSchedule.systems(schedule) end + + + +---@class ReflectSystem : ReflectReference +--- A reflectable system. +ReflectSystem = {} + +---@param system ReflectSystem +--- The system to retrieve the identifier from. +---@return string +function ReflectSystem.identifier(system) end + +---@param system ReflectSystem +--- The system to retrieve the path from. +---@return string +function ReflectSystem.path(system) end + + + +---@class ReflectReference +--- A reference to a reflectable type +---@operator len: integer | nil +ReflectReference = {} + +---@param reference ReflectReference +--- The reference to insert the value into. +---@param key any +--- The index to insert the value at. +---@param value any +--- The value to insert. +---@return nil +function ReflectReference.insert(reference,key,value) end + +---@param reference ReflectReference +--- The reference to pop the value from. +---@return any +function ReflectReference.pop(reference) end + +---@param reference ReflectReference +--- The reference to get the length of. +---@return integer | nil +function ReflectReference.len(reference) end + +---@param reference ReflectReference +--- The reference to index into. +---@param key any +--- The key to index with. +---@return any | nil +function ReflectReference.map_get(reference,key) end + +---@param reference ReflectReference +--- The reference to push the value into. +---@param value any +--- The value to push. +---@return nil +function ReflectReference.push(reference,value) end + +---@param reference ReflectReference +--- The reference to iterate over. +---@return function +function ReflectReference.__pairs(reference) end + +---@param reference ReflectReference +--- The reference to iterate over. +---@return function +function ReflectReference.iter(reference) end + +---@param reference ReflectReference +--- The reference to clear. +---@return nil +function ReflectReference.clear(reference) end + +---@param reference ReflectReference +--- The reference to display. +---@return string +function ReflectReference.__tostring(reference) end + +---@param reference ReflectReference +--- The reference to display. +---@return string +function ReflectReference.display(reference) end + +---@param reference ReflectReference +--- The reference to get the variant name of. +---@return string | nil +function ReflectReference.variant_name(reference) end + +---@param reference ReflectReference +--- The reference to remove the value from. +---@param key any +--- The key to remove the value at. +---@return any +function ReflectReference.remove(reference,key) end + +---@param reference ReflectReference +--- The reference to list the functions of. +---@return FunctionInfo[] +function ReflectReference.functions(reference) end + +---@param reference ReflectReference +--- The reference to display. +---@return string +function ReflectReference.__tostring(reference) end + +---@param reference ReflectReference +--- The reference to display. +---@return string +function ReflectReference.debug(reference) end + + + +---@class Color : ReflectReference +--- An enumerated type that can represent any of the color types in this crate. +--- +--- This is useful when you need to store a color in a data structure that can't be generic over +--- the color type. +---
+---
+--- +--- # Operations +--- +--- [`Color`] supports all the standard color operations, such as [mixing](Mix), +--- [luminance](Luminance) and [hue](Hue) adjustment, +--- and [diffing](EuclideanDistance). These operations delegate to the concrete color space contained +--- by [`Color`], but will convert to [`Oklch`](Oklcha) for operations which aren't supported in the +--- current space. After performing the operation, if a conversion was required, the result will be +--- converted back into the original color space. +--- +--- ```rust +--- # use bevy_color::{Hue, Color}; +--- let red_hsv = Color::hsv(0., 1., 1.); +--- let red_srgb = Color::srgb(1., 0., 0.); +--- +--- // HSV has a definition of hue, so it will be returned. +--- red_hsv.hue(); +--- +--- // SRGB doesn't have a native definition for hue. +--- // Converts to Oklch and returns that result. +--- red_srgb.hue(); +--- ``` +--- +--- [`Oklch`](Oklcha) has been chosen as the intermediary space in cases where conversion is required +--- due to its perceptual uniformity and broad support for Bevy's color operations. +--- To avoid the cost of repeated conversion, and ensure consistent results where that is desired, +--- first convert this [`Color`] into your desired color space. +Color = {} + +---@param lightness number +--- Lightness channel. [0.0, 1.0] +---@param chroma number +--- Chroma channel. [0.0, 1.0] +---@param hue number +--- Hue channel. [0.0, 360.0] +---@return Color +function Color.oklch(lightness,chroma,hue) end + +---@param lightness number +--- Lightness channel. [0.0, 1.5] +---@param chroma number +--- Chroma channel. [0.0, 1.5] +---@param hue number +--- Hue channel. [0.0, 360.0] +---@param alpha number +--- Alpha channel. [0.0, 1.0] +---@return Color +function Color.lcha(lightness,chroma,hue,alpha) end + +---@param lightness number +--- Lightness channel. [0.0, 1.0] +---@param a number +--- Green-red channel. [-1.0, 1.0] +---@param b number +--- Blue-yellow channel. [-1.0, 1.0] +---@param alpha number +--- Alpha channel. [0.0, 1.0] +---@return Color +function Color.oklaba(lightness,a,b,alpha) end + +---@param _self Color +---@return Srgba +function Color.to_srgba(_self) end + +---@param _self Color +---@return LinearRgba +function Color.to_linear(_self) end + +---@param lightness number +--- Lightness channel. [0.0, 1.0] +---@param a number +--- Green-red channel. [-1.0, 1.0] +---@param b number +--- Blue-yellow channel. [-1.0, 1.0] +---@return Color +function Color.oklab(lightness,a,b) end + +---@param hue number +--- Hue channel. [0.0, 360.0] +---@param whiteness number +--- Whiteness channel. [0.0, 1.0] +---@param blackness number +--- Blackness channel. [0.0, 1.0] +---@param alpha number +--- Alpha channel. [0.0, 1.0] +---@return Color +function Color.hwba(hue,whiteness,blackness,alpha) end + +---@param x number +--- x-axis. [0.0, 1.0] +---@param y number +--- y-axis. [0.0, 1.0] +---@param z number +--- z-axis. [0.0, 1.0] +---@param alpha number +--- Alpha channel. [0.0, 1.0] +---@return Color +function Color.xyza(x,y,z,alpha) end + +---@param array number[] +--- Red, Green and Blue channels. Each channel is in the range [0.0, 1.0] +---@return Color +function Color.srgb_from_array(array) end + +---@param red number +--- Red channel. [0.0, 1.0] +---@param green number +--- Green channel. [0.0, 1.0] +---@param blue number +--- Blue channel. [0.0, 1.0] +---@return Color +function Color.srgb(red,green,blue) end + +---@param hue number +--- Hue channel. [0.0, 360.0] +---@param saturation number +--- Saturation channel. [0.0, 1.0] +---@param lightness number +--- Lightness channel. [0.0, 1.0] +---@return Color +function Color.hsl(hue,saturation,lightness) end + +---@param lightness number +--- Lightness channel. [0.0, 1.5] +---@param chroma number +--- Chroma channel. [0.0, 1.5] +---@param hue number +--- Hue channel. [0.0, 360.0] +---@return Color +function Color.lch(lightness,chroma,hue) end + +---@param hue number +--- Hue channel. [0.0, 360.0] +---@param saturation number +--- Saturation channel. [0.0, 1.0] +---@param lightness number +--- Lightness channel. [0.0, 1.0] +---@param alpha number +--- Alpha channel. [0.0, 1.0] +---@return Color +function Color.hsla(hue,saturation,lightness,alpha) end + +---@param red number +--- Red channel. [0.0, 1.0] +---@param green number +--- Green channel. [0.0, 1.0] +---@param blue number +--- Blue channel. [0.0, 1.0] +---@param alpha number +--- Alpha channel. [0.0, 1.0] +---@return Color +function Color.srgba(red,green,blue,alpha) end + +---@param red number +--- Red channel. [0.0, 1.0] +---@param green number +--- Green channel. [0.0, 1.0] +---@param blue number +--- Blue channel. [0.0, 1.0] +---@param alpha number +--- Alpha channel. [0.0, 1.0] +---@return Color +function Color.linear_rgba(red,green,blue,alpha) end + +---@param _self Color +---@param other Color +---@return boolean +function Color.__eq(_self,other) end + +---@param _self Color +---@param other Color +---@return boolean +function Color.eq(_self,other) end + +---@param red number +--- Red channel. [0.0, 1.0] +---@param green number +--- Green channel. [0.0, 1.0] +---@param blue number +--- Blue channel. [0.0, 1.0] +---@return Color +function Color.linear_rgb(red,green,blue) end + +---@param hue number +--- Hue channel. [0.0, 360.0] +---@param saturation number +--- Saturation channel. [0.0, 1.0] +---@param value number +--- Value channel. [0.0, 1.0] +---@param alpha number +--- Alpha channel. [0.0, 1.0] +---@return Color +function Color.hsva(hue,saturation,value,alpha) end + +---@param x number +--- x-axis. [0.0, 1.0] +---@param y number +--- y-axis. [0.0, 1.0] +---@param z number +--- z-axis. [0.0, 1.0] +---@return Color +function Color.xyz(x,y,z) end + +---@param red integer +--- Red channel. [0, 255] +---@param green integer +--- Green channel. [0, 255] +---@param blue integer +--- Blue channel. [0, 255] +---@return Color +function Color.srgb_u8(red,green,blue) end + +---@param hue number +--- Hue channel. [0.0, 360.0] +---@param whiteness number +--- Whiteness channel. [0.0, 1.0] +---@param blackness number +--- Blackness channel. [0.0, 1.0] +---@return Color +function Color.hwb(hue,whiteness,blackness) end + +---@param red integer +--- Red channel. [0, 255] +---@param green integer +--- Green channel. [0, 255] +---@param blue integer +--- Blue channel. [0, 255] +---@param alpha integer +--- Alpha channel. [0, 255] +---@return Color +function Color.srgba_u8(red,green,blue,alpha) end + +---@param hue number +--- Hue channel. [0.0, 360.0] +---@param saturation number +--- Saturation channel. [0.0, 1.0] +---@param value number +--- Value channel. [0.0, 1.0] +---@return Color +function Color.hsv(hue,saturation,value) end + +---@param _self Color +---@return Color +function Color.clone(_self) end + +---@param lightness number +--- Lightness channel. [0.0, 1.5] +---@param a number +--- a axis. [-1.5, 1.5] +---@param b number +--- b axis. [-1.5, 1.5] +---@return Color +function Color.lab(lightness,a,b) end + +---@param lightness number +--- Lightness channel. [0.0, 1.0] +---@param chroma number +--- Chroma channel. [0.0, 1.0] +---@param hue number +--- Hue channel. [0.0, 360.0] +---@param alpha number +--- Alpha channel. [0.0, 1.0] +---@return Color +function Color.oklcha(lightness,chroma,hue,alpha) end + +---@param lightness number +--- Lightness channel. [0.0, 1.5] +---@param a number +--- a axis. [-1.5, 1.5] +---@param b number +--- b axis. [-1.5, 1.5] +---@param alpha number +--- Alpha channel. [0.0, 1.0] +---@return Color +function Color.laba(lightness,a,b,alpha) end + + + +---@class Hsla : ReflectReference +--- Color in Hue-Saturation-Lightness (HSL) color space with alpha. +--- Further information on this color model can be found on [Wikipedia](https://en.wikipedia.org/wiki/HSL_and_HSV). +---
+---
+---@field hue ? number +---@field saturation ? number +---@field lightness ? number +---@field alpha ? number +Hsla = {} + +---@param _self Hsla +---@param saturation number +---@return Hsla +function Hsla.with_saturation(_self,saturation) end + +---@param _self Hsla +---@param lightness number +---@return Hsla +function Hsla.with_lightness(_self,lightness) end + +---@param _self Hsla +---@param other Hsla +---@return boolean +function Hsla.__eq(_self,other) end + +---@param _self Hsla +---@param other Hsla +---@return boolean +function Hsla.eq(_self,other) end + +---@param hue number +--- Hue channel. [0.0, 360.0] +---@param saturation number +--- Saturation channel. [0.0, 1.0] +---@param lightness number +--- Lightness channel. [0.0, 1.0] +---@return Hsla +function Hsla.hsl(hue,saturation,lightness) end + +---@param hue number +--- Hue channel. [0.0, 360.0] +---@param saturation number +--- Saturation channel. [0.0, 1.0] +---@param lightness number +--- Lightness channel. [0.0, 1.0] +---@param alpha number +--- Alpha channel. [0.0, 1.0] +---@return Hsla +function Hsla.new(hue,saturation,lightness,alpha) end + +---@param _self Hsla +---@return Hsla +function Hsla.clone(_self) end + +---@param index integer +---@return Hsla +function Hsla.sequential_dispersed(index) end + + + +---@class Hsva : ReflectReference +--- Color in Hue-Saturation-Value (HSV) color space with alpha. +--- Further information on this color model can be found on [Wikipedia](https://en.wikipedia.org/wiki/HSL_and_HSV). +---
+---
+---@field hue ? number +---@field saturation ? number +---@field value ? number +---@field alpha ? number +Hsva = {} + +---@param _self Hsva +---@param value number +---@return Hsva +function Hsva.with_value(_self,value) end + +---@param _self Hsva +---@param saturation number +---@return Hsva +function Hsva.with_saturation(_self,saturation) end + +---@param _self Hsva +---@param other Hsva +---@return boolean +function Hsva.__eq(_self,other) end + +---@param _self Hsva +---@param other Hsva +---@return boolean +function Hsva.eq(_self,other) end + +---@param hue number +--- Hue channel. [0.0, 360.0] +---@param saturation number +--- Saturation channel. [0.0, 1.0] +---@param value number +--- Value channel. [0.0, 1.0] +---@param alpha number +--- Alpha channel. [0.0, 1.0] +---@return Hsva +function Hsva.new(hue,saturation,value,alpha) end + +---@param hue number +--- Hue channel. [0.0, 360.0] +---@param saturation number +--- Saturation channel. [0.0, 1.0] +---@param value number +--- Value channel. [0.0, 1.0] +---@return Hsva +function Hsva.hsv(hue,saturation,value) end + +---@param _self Hsva +---@return Hsva +function Hsva.clone(_self) end + + + +---@class Hwba : ReflectReference +--- Color in Hue-Whiteness-Blackness (HWB) color space with alpha. +--- Further information on this color model can be found on [Wikipedia](https://en.wikipedia.org/wiki/HWB_color_model). +---
+---
+---@field hue ? number +---@field whiteness ? number +---@field blackness ? number +---@field alpha ? number +Hwba = {} + +---@param _self Hwba +---@param other Hwba +---@return boolean +function Hwba.__eq(_self,other) end + +---@param _self Hwba +---@param other Hwba +---@return boolean +function Hwba.eq(_self,other) end + +---@param _self Hwba +---@param blackness number +---@return Hwba +function Hwba.with_blackness(_self,blackness) end + +---@param _self Hwba +---@param whiteness number +---@return Hwba +function Hwba.with_whiteness(_self,whiteness) end + +---@param hue number +--- Hue channel. [0.0, 360.0] +---@param whiteness number +--- Whiteness channel. [0.0, 1.0] +---@param blackness number +--- Blackness channel. [0.0, 1.0] +---@param alpha number +--- Alpha channel. [0.0, 1.0] +---@return Hwba +function Hwba.new(hue,whiteness,blackness,alpha) end + +---@param hue number +--- Hue channel. [0.0, 360.0] +---@param whiteness number +--- Whiteness channel. [0.0, 1.0] +---@param blackness number +--- Blackness channel. [0.0, 1.0] +---@return Hwba +function Hwba.hwb(hue,whiteness,blackness) end + +---@param _self Hwba +---@return Hwba +function Hwba.clone(_self) end + + + +---@class Laba : ReflectReference +--- Color in LAB color space, with alpha +---
+---
+---@field lightness ? number +---@field a ? number +---@field b ? number +---@field alpha ? number +---@operator unm: Laba +---@operator div(number): Laba +---@operator sub(Laba): Laba +---@operator mul(number): Laba +---@operator add(Laba): Laba +Laba = {} + +---@param lightness number +--- Lightness channel. [0.0, 1.5] +---@param a number +--- a axis. [-1.5, 1.5] +---@param b number +--- b axis. [-1.5, 1.5] +---@param alpha number +--- Alpha channel. [0.0, 1.0] +---@return Laba +function Laba.new(lightness,a,b,alpha) end + +---@param _self Laba +---@return Laba +function Laba.neg(_self) end + +---@param _self Laba +---@param other Laba +---@return boolean +function Laba.__eq(_self,other) end + +---@param _self Laba +---@param other Laba +---@return boolean +function Laba.eq(_self,other) end + +---@param _self Laba +---@param lightness number +---@return Laba +function Laba.with_lightness(_self,lightness) end + +---@param _self Laba +---@param rhs number +---@return Laba +function Laba.div(_self,rhs) end + +---@param lightness number +--- Lightness channel. [0.0, 1.5] +---@param a number +--- a axis. [-1.5, 1.5] +---@param b number +--- b axis. [-1.5, 1.5] +---@return Laba +function Laba.lab(lightness,a,b) end + +---@param _self Laba +---@param rhs Laba +---@return Laba +function Laba.sub(_self,rhs) end + +---@param _self Laba +---@param rhs number +---@return Laba +function Laba.mul(_self,rhs) end + +---@param _self Laba +---@param rhs Laba +---@return Laba +function Laba.add(_self,rhs) end + +---@param _self Laba +---@return Laba +function Laba.clone(_self) end + + + +---@class Lcha : ReflectReference +--- Color in LCH color space, with alpha +---
+---
+---@field lightness ? number +---@field chroma ? number +---@field hue ? number +---@field alpha ? number +Lcha = {} + +---@param index integer +---@return Lcha +function Lcha.sequential_dispersed(index) end + +---@param _self Lcha +---@return Lcha +function Lcha.clone(_self) end + +---@param _self Lcha +---@param other Lcha +---@return boolean +function Lcha.__eq(_self,other) end + +---@param _self Lcha +---@param other Lcha +---@return boolean +function Lcha.eq(_self,other) end + +---@param lightness number +--- Lightness channel. [0.0, 1.5] +---@param chroma number +--- Chroma channel. [0.0, 1.5] +---@param hue number +--- Hue channel. [0.0, 360.0] +---@return Lcha +function Lcha.lch(lightness,chroma,hue) end + +---@param lightness number +--- Lightness channel. [0.0, 1.5] +---@param chroma number +--- Chroma channel. [0.0, 1.5] +---@param hue number +--- Hue channel. [0.0, 360.0] +---@param alpha number +--- Alpha channel. [0.0, 1.0] +---@return Lcha +function Lcha.new(lightness,chroma,hue,alpha) end + +---@param _self Lcha +---@param lightness number +---@return Lcha +function Lcha.with_lightness(_self,lightness) end + +---@param _self Lcha +---@param chroma number +---@return Lcha +function Lcha.with_chroma(_self,chroma) end + + + +---@class LinearRgba : ReflectReference +--- Linear RGB color with alpha. +---
+---
+---@field red ? number +---@field green ? number +---@field blue ? number +---@field alpha ? number +---@operator div(number): LinearRgba +---@operator unm: LinearRgba +---@operator mul(number): LinearRgba +---@operator add(LinearRgba): LinearRgba +---@operator sub(LinearRgba): LinearRgba +LinearRgba = {} + +---@param _self LinearRgba +---@param rhs number +---@return LinearRgba +function LinearRgba.div(_self,rhs) end + +---@param _self LinearRgba +---@return LinearRgba +function LinearRgba.neg(_self) end + +---@param _self LinearRgba +---@param rhs number +---@return LinearRgba +function LinearRgba.mul(_self,rhs) end + +---@param red number +--- Red channel. [0.0, 1.0] +---@param green number +--- Green channel. [0.0, 1.0] +---@param blue number +--- Blue channel. [0.0, 1.0] +---@return LinearRgba +function LinearRgba.rgb(red,green,blue) end + +---@param _self LinearRgba +---@param rhs LinearRgba +---@return LinearRgba +function LinearRgba.add(_self,rhs) end + +---@param _self LinearRgba +---@param blue number +---@return LinearRgba +function LinearRgba.with_blue(_self,blue) end + +---@param _self LinearRgba +---@return LinearRgba +function LinearRgba.clone(_self) end + +---@param _self LinearRgba +---@param green number +---@return LinearRgba +function LinearRgba.with_green(_self,green) end + +---@param _self LinearRgba +---@return integer +function LinearRgba.as_u32(_self) end + +---@param red number +---@param green number +---@param blue number +---@param alpha number +---@return LinearRgba +function LinearRgba.new(red,green,blue,alpha) end + +---@param _self LinearRgba +---@param other LinearRgba +---@return boolean +function LinearRgba.__eq(_self,other) end + +---@param _self LinearRgba +---@param other LinearRgba +---@return boolean +function LinearRgba.eq(_self,other) end + +---@param _self LinearRgba +---@param red number +---@return LinearRgba +function LinearRgba.with_red(_self,red) end + +---@param _self LinearRgba +---@param rhs LinearRgba +---@return LinearRgba +function LinearRgba.sub(_self,rhs) end + + + +---@class Oklaba : ReflectReference +--- Color in Oklab color space, with alpha +---
+---
+---@field lightness ? number +---@field a ? number +---@field b ? number +---@field alpha ? number +---@operator add(Oklaba): Oklaba +---@operator div(number): Oklaba +---@operator mul(number): Oklaba +---@operator sub(Oklaba): Oklaba +---@operator unm: Oklaba +Oklaba = {} + +---@param _self Oklaba +---@param lightness number +---@return Oklaba +function Oklaba.with_lightness(_self,lightness) end + +---@param _self Oklaba +---@param rhs Oklaba +---@return Oklaba +function Oklaba.add(_self,rhs) end + +---@param _self Oklaba +---@param a number +---@return Oklaba +function Oklaba.with_a(_self,a) end + +---@param lightness number +--- Lightness channel. [0.0, 1.0] +---@param a number +--- Green-red channel. [-1.0, 1.0] +---@param b number +--- Blue-yellow channel. [-1.0, 1.0] +---@param alpha number +--- Alpha channel. [0.0, 1.0] +---@return Oklaba +function Oklaba.new(lightness,a,b,alpha) end + +---@param _self Oklaba +---@return Oklaba +function Oklaba.clone(_self) end + +---@param _self Oklaba +---@param rhs number +---@return Oklaba +function Oklaba.div(_self,rhs) end + +---@param _self Oklaba +---@param rhs number +---@return Oklaba +function Oklaba.mul(_self,rhs) end + +---@param _self Oklaba +---@param rhs Oklaba +---@return Oklaba +function Oklaba.sub(_self,rhs) end + +---@param _self Oklaba +---@param b number +---@return Oklaba +function Oklaba.with_b(_self,b) end + +---@param _self Oklaba +---@param other Oklaba +---@return boolean +function Oklaba.__eq(_self,other) end + +---@param _self Oklaba +---@param other Oklaba +---@return boolean +function Oklaba.eq(_self,other) end + +---@param lightness number +--- Lightness channel. [0.0, 1.0] +---@param a number +--- Green-red channel. [-1.0, 1.0] +---@param b number +--- Blue-yellow channel. [-1.0, 1.0] +---@return Oklaba +function Oklaba.lab(lightness,a,b) end + +---@param _self Oklaba +---@return Oklaba +function Oklaba.neg(_self) end + + + +---@class Oklcha : ReflectReference +--- Color in Oklch color space, with alpha +---
+---
+---@field lightness ? number +---@field chroma ? number +---@field hue ? number +---@field alpha ? number +Oklcha = {} + +---@param _self Oklcha +---@param lightness number +---@return Oklcha +function Oklcha.with_lightness(_self,lightness) end + +---@param index integer +---@return Oklcha +function Oklcha.sequential_dispersed(index) end + +---@param _self Oklcha +---@param chroma number +---@return Oklcha +function Oklcha.with_chroma(_self,chroma) end + +---@param lightness number +--- Lightness channel. [0.0, 1.0] +---@param chroma number +--- Chroma channel. [0.0, 1.0] +---@param hue number +--- Hue channel. [0.0, 360.0] +---@return Oklcha +function Oklcha.lch(lightness,chroma,hue) end + +---@param lightness number +--- Lightness channel. [0.0, 1.0] +---@param chroma number +--- Chroma channel. [0.0, 1.0] +---@param hue number +--- Hue channel. [0.0, 360.0] +---@param alpha number +--- Alpha channel. [0.0, 1.0] +---@return Oklcha +function Oklcha.new(lightness,chroma,hue,alpha) end + +---@param _self Oklcha +---@return Oklcha +function Oklcha.clone(_self) end + +---@param _self Oklcha +---@param other Oklcha +---@return boolean +function Oklcha.__eq(_self,other) end + +---@param _self Oklcha +---@param other Oklcha +---@return boolean +function Oklcha.eq(_self,other) end + + + +---@class Srgba : ReflectReference +--- Non-linear standard RGB with alpha. +---
+---
+---@field red ? number +---@field green ? number +---@field blue ? number +---@field alpha ? number +---@operator div(number): Srgba +---@operator sub(Srgba): Srgba +---@operator unm: Srgba +---@operator mul(number): Srgba +---@operator add(Srgba): Srgba +Srgba = {} + +---@param _self Srgba +---@param rhs number +---@return Srgba +function Srgba.div(_self,rhs) end + +---@param _self Srgba +---@param rhs Srgba +---@return Srgba +function Srgba.sub(_self,rhs) end + +---@param r integer +--- Red channel. [0, 255] +---@param g integer +--- Green channel. [0, 255] +---@param b integer +--- Blue channel. [0, 255] +---@param a integer +--- Alpha channel. [0, 255] +---@return Srgba +function Srgba.rgba_u8(r,g,b,a) end + +---@param value number +---@return number +function Srgba.gamma_function_inverse(value) end + +---@param _self Srgba +---@return Srgba +function Srgba.neg(_self) end + +---@param _self Srgba +---@param rhs number +---@return Srgba +function Srgba.mul(_self,rhs) end + +---@param _self Srgba +---@param red number +---@return Srgba +function Srgba.with_red(_self,red) end + +---@param r integer +--- Red channel. [0, 255] +---@param g integer +--- Green channel. [0, 255] +---@param b integer +--- Blue channel. [0, 255] +---@return Srgba +function Srgba.rgb_u8(r,g,b) end + +---@param red number +--- Red channel. [0.0, 1.0] +---@param green number +--- Green channel. [0.0, 1.0] +---@param blue number +--- Blue channel. [0.0, 1.0] +---@return Srgba +function Srgba.rgb(red,green,blue) end + +---@param _self Srgba +---@return Srgba +function Srgba.clone(_self) end + +---@param red number +--- Red channel. [0.0, 1.0] +---@param green number +--- Green channel. [0.0, 1.0] +---@param blue number +--- Blue channel. [0.0, 1.0] +---@param alpha number +--- Alpha channel. [0.0, 1.0] +---@return Srgba +function Srgba.new(red,green,blue,alpha) end + +---@param _self Srgba +---@return string +function Srgba.to_hex(_self) end + +---@param _self Srgba +---@param other Srgba +---@return boolean +function Srgba.__eq(_self,other) end + +---@param _self Srgba +---@param other Srgba +---@return boolean +function Srgba.eq(_self,other) end + +---@param value number +---@return number +function Srgba.gamma_function(value) end + +---@param _self Srgba +---@param green number +---@return Srgba +function Srgba.with_green(_self,green) end + +---@param _self Srgba +---@param rhs Srgba +---@return Srgba +function Srgba.add(_self,rhs) end + +---@param _self Srgba +---@param blue number +---@return Srgba +function Srgba.with_blue(_self,blue) end + + + +---@class Xyza : ReflectReference +--- [CIE 1931](https://en.wikipedia.org/wiki/CIE_1931_color_space) color space, also known as XYZ, with an alpha channel. +---
+---
+---@field x ? number +---@field y ? number +---@field z ? number +---@field alpha ? number +---@operator sub(Xyza): Xyza +---@operator div(number): Xyza +---@operator mul(number): Xyza +---@operator unm: Xyza +---@operator add(Xyza): Xyza +Xyza = {} + +---@param _self Xyza +---@param rhs Xyza +---@return Xyza +function Xyza.sub(_self,rhs) end + +---@param _self Xyza +---@return Xyza +function Xyza.clone(_self) end + +---@param _self Xyza +---@param rhs number +---@return Xyza +function Xyza.div(_self,rhs) end + +---@param x number +--- x-axis. [0.0, 1.0] +---@param y number +--- y-axis. [0.0, 1.0] +---@param z number +--- z-axis. [0.0, 1.0] +---@param alpha number +--- Alpha channel. [0.0, 1.0] +---@return Xyza +function Xyza.new(x,y,z,alpha) end + +---@param x number +--- x-axis. [0.0, 1.0] +---@param y number +--- y-axis. [0.0, 1.0] +---@param z number +--- z-axis. [0.0, 1.0] +---@return Xyza +function Xyza.xyz(x,y,z) end + +---@param _self Xyza +---@param y number +---@return Xyza +function Xyza.with_y(_self,y) end + +---@param _self Xyza +---@param other Xyza +---@return boolean +function Xyza.__eq(_self,other) end + +---@param _self Xyza +---@param other Xyza +---@return boolean +function Xyza.eq(_self,other) end + +---@param _self Xyza +---@param rhs number +---@return Xyza +function Xyza.mul(_self,rhs) end + +---@param _self Xyza +---@param x number +---@return Xyza +function Xyza.with_x(_self,x) end + +---@param _self Xyza +---@return Xyza +function Xyza.neg(_self) end + +---@param _self Xyza +---@param z number +---@return Xyza +function Xyza.with_z(_self,z) end + +---@param _self Xyza +---@param rhs Xyza +---@return Xyza +function Xyza.add(_self,rhs) end + + + +---@class OrderIndependentTransparencySettings : ReflectReference +--- Used to identify which camera will use OIT to render transparent meshes +--- and to configure OIT. +---@field layer_count ? integer +---@field alpha_threshold ? number +OrderIndependentTransparencySettings = {} + +---@param _self OrderIndependentTransparencySettings +---@return OrderIndependentTransparencySettings +function OrderIndependentTransparencySettings.clone(_self) end + + + +---@class DeferredPrepassDoubleBuffer : ReflectReference +--- Allows querying the previous frame's [`DeferredPrepass`]. +DeferredPrepassDoubleBuffer = {} + +---@param _self DeferredPrepassDoubleBuffer +---@return DeferredPrepassDoubleBuffer +function DeferredPrepassDoubleBuffer.clone(_self) end + + + +---@class DepthPrepass : ReflectReference +--- If added to a [`bevy_camera::Camera3d`] then depth values will be copied to a separate texture available to the main pass. +DepthPrepass = {} + +---@param _self DepthPrepass +---@return DepthPrepass +function DepthPrepass.clone(_self) end + + + +---@class DepthPrepassDoubleBuffer : ReflectReference +--- Allows querying the previous frame's [`DepthPrepass`]. +DepthPrepassDoubleBuffer = {} + +---@param _self DepthPrepassDoubleBuffer +---@return DepthPrepassDoubleBuffer +function DepthPrepassDoubleBuffer.clone(_self) end + + + +---@class MotionVectorPrepass : ReflectReference +--- If added to a [`bevy_camera::Camera3d`] then screen space motion vectors will be copied to a separate texture available to the main pass. +--- +--- Motion vectors are stored in the range -1,1, with +x right and +y down. +--- A value of (1.0,1.0) indicates a pixel moved from the top left corner to the bottom right corner of the screen. +MotionVectorPrepass = {} + +---@param _self MotionVectorPrepass +---@return MotionVectorPrepass +function MotionVectorPrepass.clone(_self) end + + + +---@class NormalPrepass : ReflectReference +--- If added to a [`bevy_camera::Camera3d`] then vertex world normals will be copied to a separate texture available to the main pass. +--- Normals will have normal map textures already applied. +NormalPrepass = {} + +---@param _self NormalPrepass +---@return NormalPrepass +function NormalPrepass.clone(_self) end + + + +---@class Skybox : ReflectReference +--- Adds a skybox to a 3D camera, based on a cubemap texture. +--- +--- Note that this component does not (currently) affect the scene's lighting. +--- To do so, use `EnvironmentMapLight` alongside this component. +--- +--- See also . +---@field image ? any +---@field brightness ? number +---@field rotation ? Quat +Skybox = {} + +---@param _self Skybox +---@return Skybox +function Skybox.clone(_self) end + + + +---@class DebandDither : ReflectReference +--- Enables a debanding shader that applies dithering to mitigate color banding in the final image for a given [`Camera`] entity. +DebandDither = {} + +---@param _self DebandDither +---@param other DebandDither +---@return boolean +function DebandDither.__eq(_self,other) end + +---@param _self DebandDither +---@param other DebandDither +---@return boolean +function DebandDither.eq(_self,other) end + +---@param _self DebandDither +---@return DebandDither +function DebandDither.clone(_self) end + +---@param _self DebandDither +---@return nil +function DebandDither.assert_receiver_is_total_eq(_self) end + + + +---@class Tonemapping : ReflectReference +--- Optionally enables a tonemapping shader that attempts to map linear input stimulus into a perceptually uniform image for a given [`Camera`] entity. +Tonemapping = {} + +---@param _self Tonemapping +---@return Tonemapping +function Tonemapping.clone(_self) end + +---@param _self Tonemapping +---@return nil +function Tonemapping.assert_receiver_is_total_eq(_self) end + +---@param _self Tonemapping +---@param other Tonemapping +---@return boolean +function Tonemapping.__eq(_self,other) end + +---@param _self Tonemapping +---@param other Tonemapping +---@return boolean +function Tonemapping.eq(_self,other) end + +---@param _self Tonemapping +---@return boolean +function Tonemapping.is_enabled(_self) end + + + +---@class ComponentTicks : ReflectReference +--- Records when a component or resource was added and when it was last mutably dereferenced (or added). +---@field added ? Tick +---@field changed ? Tick +ComponentTicks = {} + +---@param change_tick Tick +---@return ComponentTicks +function ComponentTicks.new(change_tick) end + +---@param _self ComponentTicks +---@return ComponentTicks +function ComponentTicks.clone(_self) end + +---@param _self ComponentTicks +---@param last_run Tick +---@param this_run Tick +---@return boolean +function ComponentTicks.is_changed(_self,last_run,this_run) end + +---@param _self ComponentTicks +---@param change_tick Tick +---@return nil +function ComponentTicks.set_changed(_self,change_tick) end + +---@param _self ComponentTicks +---@param last_run Tick +---@param this_run Tick +---@return boolean +function ComponentTicks.is_added(_self,last_run,this_run) end + + + +---@class Tick : ReflectReference +--- A value that tracks when a system ran relative to other systems. +--- This is used to power change detection. +--- +--- *Note* that a system that hasn't been run yet has a `Tick` of 0. +---@field tick ? integer +Tick = {} + +---@param _self Tick +---@return nil +function Tick.assert_receiver_is_total_eq(_self) end + +---@param _self Tick +---@param last_run Tick +---@param this_run Tick +---@return boolean +function Tick.is_newer_than(_self,last_run,this_run) end + +---@param _self Tick +---@return integer +function Tick.get(_self) end + +---@param _self Tick +---@param tick integer +---@return nil +function Tick.set(_self,tick) end + +---@param tick integer +---@return Tick +function Tick.new(tick) end + +---@param _self Tick +---@return Tick +function Tick.clone(_self) end + +---@param _self Tick +---@param other Tick +---@return boolean +function Tick.__eq(_self,other) end + +---@param _self Tick +---@param other Tick +---@return boolean +function Tick.eq(_self,other) end + + + +---@class ComponentId : ReflectReference +--- A value which uniquely identifies the type of a [`Component`] or [`Resource`] within a +--- [`World`](crate::world::World). +--- +--- Each time a new `Component` type is registered within a `World` using +--- e.g. [`World::register_component`](crate::world::World::register_component) or +--- [`World::register_component_with_descriptor`](crate::world::World::register_component_with_descriptor) +--- or a Resource with e.g. [`World::init_resource`](crate::world::World::init_resource), +--- a corresponding `ComponentId` is created to track it. +--- +--- While the distinction between `ComponentId` and [`TypeId`] may seem superficial, breaking them +--- into two separate but related concepts allows components to exist outside of Rust's type system. +--- Each Rust type registered as a `Component` will have a corresponding `ComponentId`, but additional +--- `ComponentId`s may exist in a `World` to track components which cannot be +--- represented as Rust types for scripting or other advanced use-cases. +--- +--- A `ComponentId` is tightly coupled to its parent `World`. Attempting to use a `ComponentId` from +--- one `World` to access the metadata of a `Component` in a different `World` is undefined behavior +--- and must not be attempted. +--- +--- Given a type `T` which implements [`Component`], the `ComponentId` for `T` can be retrieved +--- from a `World` using [`World::component_id()`](crate::world::World::component_id) or via [`Components::component_id()`]. +--- Access to the `ComponentId` for a [`Resource`] is available via [`Components::resource_id()`]. +---@field [1] integer +ComponentId = {} + +---@param _self ComponentId +---@return integer +function ComponentId.index(_self) end + +---@param _self ComponentId +---@param other ComponentId +---@return boolean +function ComponentId.__eq(_self,other) end + +---@param _self ComponentId +---@param other ComponentId +---@return boolean +function ComponentId.eq(_self,other) end + +---@param _self ComponentId +---@return ComponentId +function ComponentId.clone(_self) end + +---@param index integer +---@return ComponentId +function ComponentId.new(index) end + +---@param _self ComponentId +---@return nil +function ComponentId.assert_receiver_is_total_eq(_self) end + + + +---@class Entity : ReflectReference +--- Unique identifier for an entity in a [`World`]. +--- Note that this is just an id, not the entity itself. +--- Further, the entity this id refers to may no longer exist in the [`World`]. +--- For more information about entities, their ids, and how to use them, see the module [docs](crate::entity). +--- +--- # Aliasing +--- +--- Once an entity is despawned, it ceases to exist. +--- However, its [`Entity`] id is still present, and may still be contained in some data. +--- This becomes problematic because it is possible for a later entity to be spawned at the exact same id! +--- If this happens, which is rare but very possible, it will be logged. +--- +--- Aliasing can happen without warning. +--- Holding onto a [`Entity`] id corresponding to an entity well after that entity was despawned can cause un-intuitive behavior for both ordering, and comparing in general. +--- To prevent these bugs, it is generally best practice to stop holding an [`Entity`] or [`EntityGeneration`] value as soon as you know it has been despawned. +--- If you must do otherwise, do not assume the [`Entity`] id corresponds to the same entity it originally did. +--- See [`EntityGeneration`]'s docs for more information about aliasing and why it occurs. +--- +--- # Stability warning +--- For all intents and purposes, `Entity` should be treated as an opaque identifier. The internal bit +--- representation is liable to change from release to release as are the behaviors or performance +--- characteristics of any of its trait implementations (i.e. `Ord`, `Hash`, etc.). This means that changes in +--- `Entity`'s representation, though made readable through various functions on the type, are not considered +--- breaking changes under [SemVer]. +--- +--- In particular, directly serializing with `Serialize` and `Deserialize` make zero guarantee of long +--- term wire format compatibility. Changes in behavior will cause serialized `Entity` values persisted +--- to long term storage (i.e. disk, databases, etc.) will fail to deserialize upon being updated. +--- +--- # Usage +--- +--- This data type is returned by iterating a `Query` that has `Entity` as part of its query fetch type parameter ([learn more]). +--- It can also be obtained by calling [`EntityCommands::id`] or [`EntityWorldMut::id`]. +--- +--- ``` +--- # use bevy_ecs::prelude::*; +--- # #[derive(Component)] +--- # struct SomeComponent; +--- fn setup(mut commands: Commands) { +--- // Calling `spawn` returns `EntityCommands`. +--- let entity = commands.spawn(SomeComponent).id(); +--- } +--- +--- fn exclusive_system(world: &mut World) { +--- // Calling `spawn` returns `EntityWorldMut`. +--- let entity = world.spawn(SomeComponent).id(); +--- } +--- # +--- # bevy_ecs::system::assert_is_system(setup); +--- # bevy_ecs::system::assert_is_system(exclusive_system); +--- ``` +--- +--- It can be used to refer to a specific entity to apply [`EntityCommands`], or to call [`Query::get`] (or similar methods) to access its components. +--- +--- ``` +--- # use bevy_ecs::prelude::*; +--- # +--- # #[derive(Component)] +--- # struct Expired; +--- # +--- fn dispose_expired_food(mut commands: Commands, query: Query>) { +--- for food_entity in &query { +--- commands.entity(food_entity).despawn(); +--- } +--- } +--- # +--- # bevy_ecs::system::assert_is_system(dispose_expired_food); +--- ``` +--- +--- [learn more]: crate::system::Query#entity-id-access +--- [`EntityCommands::id`]: crate::system::EntityCommands::id +--- [`EntityWorldMut::id`]: crate::world::EntityWorldMut::id +--- [`EntityCommands`]: crate::system::EntityCommands +--- [`Query::get`]: crate::system::Query::get +--- [`World`]: crate::world::World +--- [SemVer]: https://semver.org/ +Entity = {} + +---@param _self Entity +---@return integer +function Entity.to_bits(_self) end + +---@param _self Entity +---@param other Entity +---@return boolean +function Entity.__eq(_self,other) end + +---@param _self Entity +---@param other Entity +---@return boolean +function Entity.eq(_self,other) end + +---@param _self Entity +---@return integer +function Entity.index_u32(_self) end + +---@param _self Entity +---@return EntityGeneration +function Entity.generation(_self) end + +---@param bits integer +---@return Entity +function Entity.from_bits(bits) end + +---@param index EntityIndex +---@return Entity +function Entity.from_index(index) end + +---@param _self Entity +---@return Entity +function Entity.clone(_self) end + +---@param _self Entity +---@return EntityIndex +function Entity.index(_self) end + +---@param index EntityIndex +---@param generation EntityGeneration +---@return Entity +function Entity.from_index_and_generation(index,generation) end + + + +---@class EntityGeneration : ReflectReference +--- This tracks different versions or generations of an [`EntityIndex`]. +--- Importantly, this can wrap, meaning each generation is not necessarily unique per [`EntityIndex`]. +--- +--- This should be treated as a opaque identifier, and its internal representation may be subject to change. +--- +--- # Aliasing +--- +--- Internally [`EntityGeneration`] wraps a `u32`, so it can't represent *every* possible generation. +--- Eventually, generations can (and do) wrap or alias. +--- This can cause [`Entity`] and [`EntityGeneration`] values to be equal while still referring to different conceptual entities. +--- This can cause some surprising behavior: +--- +--- ``` +--- # use bevy_ecs::entity::EntityGeneration; +--- let (aliased, did_alias) = EntityGeneration::FIRST.after_versions(1u32 << 31).after_versions_and_could_alias(1u32 << 31); +--- assert!(did_alias); +--- assert!(EntityGeneration::FIRST == aliased); +--- ``` +--- +--- This can cause some unintended side effects. +--- See [`Entity`] docs for practical concerns and how to minimize any risks. +EntityGeneration = {} + +---@param _self EntityGeneration +---@return nil +function EntityGeneration.assert_receiver_is_total_eq(_self) end + +---@param _self EntityGeneration +---@param other EntityGeneration +---@return boolean +function EntityGeneration.__eq(_self,other) end + +---@param _self EntityGeneration +---@param other EntityGeneration +---@return boolean +function EntityGeneration.eq(_self,other) end + +---@param _self EntityGeneration +---@return EntityGeneration +function EntityGeneration.clone(_self) end + +---@param _self EntityGeneration +---@return integer +function EntityGeneration.to_bits(_self) end + +---@param _self EntityGeneration +---@param versions integer +---@return EntityGeneration +function EntityGeneration.after_versions(_self,versions) end + +---@param bits integer +---@return EntityGeneration +function EntityGeneration.from_bits(bits) end + + + +---@class EntityIndex : ReflectReference +--- This represents the index of an [`Entity`] within the [`Entities`] array. +--- This is a lighter weight version of [`Entity`]. +--- +--- This is a unique identifier for an entity in the world. +--- This differs from [`Entity`] in that [`Entity`] is unique for all entities total (unless the [`Entity::generation`] wraps), +--- but this is only unique for entities that are active. +--- +--- This can be used over [`Entity`] to improve performance in some cases, +--- but improper use can cause this to identify a different entity than intended. +--- Use with caution. +EntityIndex = {} + +---@param _self EntityIndex +---@param other EntityIndex +---@return boolean +function EntityIndex.__eq(_self,other) end + +---@param _self EntityIndex +---@param other EntityIndex +---@return boolean +function EntityIndex.eq(_self,other) end + +---@param _self EntityIndex +---@return integer +function EntityIndex.index(_self) end + +---@param _self EntityIndex +---@return nil +function EntityIndex.assert_receiver_is_total_eq(_self) end + +---@param _self EntityIndex +---@return EntityIndex +function EntityIndex.clone(_self) end + + + +---@class EntityHash : ReflectReference +--- A [`BuildHasher`] that results in a [`EntityHasher`]. +EntityHash = {} + +---@param _self EntityHash +---@return EntityHash +function EntityHash.clone(_self) end + + + +---@class EntityHashSet : ReflectReference +--- A [`HashSet`] pre-configured to use [`EntityHash`] hashing. +---@field [1] any +---@operator len: integer +EntityHashSet = {} + +---@param _self EntityHashSet +---@return nil +function EntityHashSet.assert_receiver_is_total_eq(_self) end + +---@param _self EntityHashSet +---@return EntityHashSet +function EntityHashSet.clone(_self) end + +---@param n integer +---@return EntityHashSet +function EntityHashSet.with_capacity(n) end + +---@param _self EntityHashSet +---@return integer +function EntityHashSet.len(_self) end + +---@return EntityHashSet +function EntityHashSet.new() end + +---@param _self EntityHashSet +---@param other EntityHashSet +---@return boolean +function EntityHashSet.__eq(_self,other) end + +---@param _self EntityHashSet +---@param other EntityHashSet +---@return boolean +function EntityHashSet.eq(_self,other) end + +---@param _self EntityHashSet +---@return boolean +function EntityHashSet.is_empty(_self) end + + + +---@class EntityIndexSet : ReflectReference +--- An [`IndexSet`] pre-configured to use [`EntityHash`] hashing. +---@field [1] any +EntityIndexSet = {} + +---@param n integer +---@return EntityIndexSet +function EntityIndexSet.with_capacity(n) end + +---@param _self EntityIndexSet +---@param other EntityIndexSet +---@return boolean +function EntityIndexSet.__eq(_self,other) end + +---@param _self EntityIndexSet +---@param other EntityIndexSet +---@return boolean +function EntityIndexSet.eq(_self,other) end + +---@return EntityIndexSet +function EntityIndexSet.new() end + +---@param _self EntityIndexSet +---@return EntityIndexSet +function EntityIndexSet.clone(_self) end + + + +---@class DefaultQueryFilters : ReflectReference +--- Default query filters work by excluding entities with certain components from most queries. +--- +--- If a query does not explicitly mention a given disabling component, it will not include entities with that component. +--- To be more precise, this checks if the query's [`FilteredAccess`] contains the component, +--- and if it does not, adds a [`Without`](crate::prelude::Without) filter for that component to the query. +--- +--- [`Allow`](crate::query::Allow) and [`Has`](crate::prelude::Has) can be used to include entities +--- with and without the disabling component. +--- [`Allow`](crate::query::Allow) is a [`QueryFilter`](crate::query::QueryFilter) and will simply change +--- the list of shown entities, while [`Has`](crate::prelude::Has) is a [`QueryData`](crate::query::QueryData) +--- and will allow you to see if each entity has the disabling component or not. +--- +--- This resource is initialized in the [`World`] whenever a new world is created, +--- with the [`Disabled`] component as a disabling component. +--- +--- Note that you can remove default query filters by overwriting the [`DefaultQueryFilters`] resource. +--- This can be useful as a last resort escape hatch, but is liable to break compatibility with other libraries. +--- +--- See the [module docs](crate::entity_disabling) for more info. +--- +--- +--- # Warning +--- +--- Default query filters are a global setting that affects all queries in the [`World`], +--- and incur a small performance cost for each query. +--- +--- They can cause significant interoperability issues within the ecosystem, +--- as users must be aware of each disabling component in use. +--- +--- Think carefully about whether you need to use a new disabling component, +--- and clearly communicate their presence in any libraries you publish. +---@field disabling ? ComponentId[] +DefaultQueryFilters = {} + +---@return DefaultQueryFilters +function DefaultQueryFilters.empty() end + +---@param _self DefaultQueryFilters +---@param component_id ComponentId +---@return nil +function DefaultQueryFilters.register_disabling_component(_self,component_id) end + + + +---@class Disabled : ReflectReference +--- A marker component for disabled entities. +--- +--- Semantically, this component is used to mark entities that are temporarily disabled (typically for gameplay reasons), +--- but will likely be re-enabled at some point. +--- +--- Like all disabling components, this only disables the entity itself, +--- not its children or other entities that reference it. +--- To disable an entire tree of entities, use [`EntityCommands::insert_recursive`](crate::prelude::EntityCommands::insert_recursive). +--- +--- Every [`World`] has a default query filter that excludes entities with this component, +--- registered in the [`DefaultQueryFilters`] resource. +--- See [the module docs] for more info. +--- +--- [the module docs]: crate::entity_disabling +Disabled = {} + +---@param _self Disabled +---@return Disabled +function Disabled.clone(_self) end + + + +---@class ChildOf : ReflectReference +--- Stores the parent entity of this child entity with this component. +--- +--- This is a [`Relationship`] component, and creates the canonical +--- "parent / child" hierarchy. This is the "source of truth" component, and it pairs with +--- the [`Children`] [`RelationshipTarget`](crate::relationship::RelationshipTarget). +--- +--- This relationship should be used for things like: +--- +--- 1. Organizing entities in a scene +--- 2. Propagating configuration or data inherited from a parent, such as "visibility" or "world-space global transforms". +--- 3. Ensuring a hierarchy is despawned when an entity is despawned. +--- +--- [`ChildOf`] contains a single "target" [`Entity`]. When [`ChildOf`] is inserted on a "source" entity, +--- the "target" entity will automatically (and immediately, via a component hook) have a [`Children`] +--- component inserted, and the "source" entity will be added to that [`Children`] instance. +--- +--- If the [`ChildOf`] component is replaced with a different "target" entity, the old target's [`Children`] +--- will be automatically (and immediately, via a component hook) be updated to reflect that change. +--- +--- Likewise, when the [`ChildOf`] component is removed, the "source" entity will be removed from the old +--- target's [`Children`]. If this results in [`Children`] being empty, [`Children`] will be automatically removed. +--- +--- When a parent is despawned, all children (and their descendants) will _also_ be despawned. +--- +--- You can create parent-child relationships in a variety of ways. The most direct way is to insert a [`ChildOf`] component: +--- +--- ``` +--- # use bevy_ecs::prelude::*; +--- # let mut world = World::new(); +--- let root = world.spawn_empty().id(); +--- let child1 = world.spawn(ChildOf(root)).id(); +--- let child2 = world.spawn(ChildOf(root)).id(); +--- let grandchild = world.spawn(ChildOf(child1)).id(); +--- +--- assert_eq!(&**world.entity(root).get::().unwrap(), &[child1, child2]); +--- assert_eq!(&**world.entity(child1).get::().unwrap(), &[grandchild]); +--- +--- world.entity_mut(child2).remove::(); +--- assert_eq!(&**world.entity(root).get::().unwrap(), &[child1]); +--- +--- world.entity_mut(root).despawn(); +--- assert!(world.get_entity(root).is_err()); +--- assert!(world.get_entity(child1).is_err()); +--- assert!(world.get_entity(grandchild).is_err()); +--- ``` +--- +--- However if you are spawning many children, you might want to use the [`EntityWorldMut::with_children`] helper instead: +--- +--- ``` +--- # use bevy_ecs::prelude::*; +--- # let mut world = World::new(); +--- let mut child1 = Entity::PLACEHOLDER; +--- let mut child2 = Entity::PLACEHOLDER; +--- let mut grandchild = Entity::PLACEHOLDER; +--- let root = world.spawn_empty().with_children(|p| { +--- child1 = p.spawn_empty().with_children(|p| { +--- grandchild = p.spawn_empty().id(); +--- }).id(); +--- child2 = p.spawn_empty().id(); +--- }).id(); +--- +--- assert_eq!(&**world.entity(root).get::().unwrap(), &[child1, child2]); +--- assert_eq!(&**world.entity(child1).get::().unwrap(), &[grandchild]); +--- ``` +--- +--- [`Relationship`]: crate::relationship::Relationship +---@field [1] Entity +ChildOf = {} + +---@param _self ChildOf +---@return Entity +function ChildOf.parent(_self) end + +---@param _self ChildOf +---@return nil +function ChildOf.assert_receiver_is_total_eq(_self) end + +---@param _self ChildOf +---@param other ChildOf +---@return boolean +function ChildOf.__eq(_self,other) end + +---@param _self ChildOf +---@param other ChildOf +---@return boolean +function ChildOf.eq(_self,other) end + +---@param _self ChildOf +---@return ChildOf +function ChildOf.clone(_self) end + + + +---@class Children : ReflectReference +--- Tracks which entities are children of this parent entity. +--- +--- A [`RelationshipTarget`] collection component that is populated +--- with entities that "target" this entity with the [`ChildOf`] [`Relationship`] component. +--- +--- Together, these components form the "canonical parent-child hierarchy". See the [`ChildOf`] component for the full +--- description of this relationship and instructions on how to use it. +--- +--- # Usage +--- +--- Like all [`RelationshipTarget`] components, this data should not be directly manipulated to avoid desynchronization. +--- Instead, modify the [`ChildOf`] components on the "source" entities. +--- +--- To access the children of an entity, you can iterate over the [`Children`] component, +--- using the [`IntoIterator`] trait. +--- For more complex access patterns, see the [`RelationshipTarget`] trait. +--- +--- [`Relationship`]: crate::relationship::Relationship +--- [`RelationshipTarget`]: crate::relationship::RelationshipTarget +---@field [1] Entity[] +Children = {} + +---@param _self Children +---@param a_index integer +---@param b_index integer +---@return nil +function Children.swap(_self,a_index,b_index) end + +---@param _self Children +---@return nil +function Children.assert_receiver_is_total_eq(_self) end + +---@param _self Children +---@param other Children +---@return boolean +function Children.__eq(_self,other) end + +---@param _self Children +---@param other Children +---@return boolean +function Children.eq(_self,other) end + + + +---@class Add : ReflectReference +--- Trigger emitted when a component is inserted onto an entity that does not already have that +--- component. Runs before `Insert`. +--- See [`ComponentHooks::on_add`](`crate::lifecycle::ComponentHooks::on_add`) for more information. +---@field entity ? Entity +Add = {} + +---@param _self Add +---@return Add +function Add.clone(_self) end + + + +---@class Despawn : ReflectReference +--- [`EntityEvent`] emitted for each component on an entity when it is despawned. +--- See [`ComponentHooks::on_despawn`](`crate::lifecycle::ComponentHooks::on_despawn`) for more information. +---@field entity ? Entity +Despawn = {} + +---@param _self Despawn +---@return Despawn +function Despawn.clone(_self) end + + + +---@class Insert : ReflectReference +--- Trigger emitted when a component is inserted, regardless of whether or not the entity already +--- had that component. Runs after `Add`, if it ran. +--- See [`ComponentHooks::on_insert`](`crate::lifecycle::ComponentHooks::on_insert`) for more information. +---@field entity ? Entity +Insert = {} + +---@param _self Insert +---@return Insert +function Insert.clone(_self) end + + + +---@class Remove : ReflectReference +--- Trigger emitted when a component is removed from an entity, and runs before the component is +--- removed, so you can still access the component data. +--- See [`ComponentHooks::on_remove`](`crate::lifecycle::ComponentHooks::on_remove`) for more information. +---@field entity ? Entity +Remove = {} + +---@param _self Remove +---@return Remove +function Remove.clone(_self) end + + + +---@class RemovedComponentEntity : ReflectReference +--- Wrapper around [`Entity`] for [`RemovedComponents`]. +--- Internally, `RemovedComponents` uses these as an [`Messages`]. +---@field [1] Entity +RemovedComponentEntity = {} + +---@param _self RemovedComponentEntity +---@return RemovedComponentEntity +function RemovedComponentEntity.clone(_self) end + + + +---@class Replace : ReflectReference +--- Trigger emitted when a component is removed from an entity, regardless +--- of whether or not it is later replaced. +--- +--- Runs before the value is replaced, so you can still access the original component data. +--- See [`ComponentHooks::on_replace`](`crate::lifecycle::ComponentHooks::on_replace`) for more information. +---@field entity ? Entity +Replace = {} + +---@param _self Replace +---@return Replace +function Replace.clone(_self) end + + + +---@class Name : ReflectReference +--- Component used to identify an entity. Stores a hash for faster comparisons. +--- +--- The hash is eagerly re-computed upon each update to the name. +--- +--- [`Name`] should not be treated as a globally unique identifier for entities, +--- as multiple entities can have the same name. [`Entity`] should be +--- used instead as the default unique identifier. +---@field hash ? integer +---@field name ? Cow +Name = {} + +---@param _self Name +---@return Name +function Name.clone(_self) end + +---@param _self Name +---@param other Name +---@return boolean +function Name.__eq(_self,other) end + +---@param _self Name +---@param other Name +---@return boolean +function Name.eq(_self,other) end + + + +---@class ButtonState : ReflectReference +--- The current "press" state of an element +ButtonState = {} + +---@param _self ButtonState +---@return ButtonState +function ButtonState.clone(_self) end + +---@param _self ButtonState +---@param other ButtonState +---@return boolean +function ButtonState.__eq(_self,other) end + +---@param _self ButtonState +---@param other ButtonState +---@return boolean +function ButtonState.eq(_self,other) end + +---@param _self ButtonState +---@return boolean +function ButtonState.is_pressed(_self) end + +---@param _self ButtonState +---@return nil +function ButtonState.assert_receiver_is_total_eq(_self) end + + + +---@class AxisSettings : ReflectReference +--- Settings for a [`GamepadAxis`]. +--- +--- It is used inside the [`GamepadSettings`] to define the sensitivity range and +--- threshold for an axis. +--- Values that are higher than `livezone_upperbound` will be rounded up to 1.0. +--- Values that are lower than `livezone_lowerbound` will be rounded down to -1.0. +--- Values that are in-between `deadzone_lowerbound` and `deadzone_upperbound` will be rounded to 0.0. +--- Otherwise, values will be linearly rescaled to fit into the sensitivity range. +--- For example, a value that is one fourth of the way from `deadzone_upperbound` to `livezone_upperbound` will be scaled to 0.25. +--- +--- The valid range is `[-1.0, 1.0]`. +---@field livezone_upperbound ? number +---@field deadzone_upperbound ? number +---@field deadzone_lowerbound ? number +---@field livezone_lowerbound ? number +---@field threshold ? number +AxisSettings = {} + +---@param _self AxisSettings +---@return number +function AxisSettings.threshold(_self) end + +---@param _self AxisSettings +---@param value number +---@return number +function AxisSettings.set_livezone_upperbound(_self,value) end + +---@param _self AxisSettings +---@return number +function AxisSettings.deadzone_lowerbound(_self) end + +---@param _self AxisSettings +---@param value number +---@return number +function AxisSettings.set_threshold(_self,value) end + +---@param _self AxisSettings +---@param value number +---@return number +function AxisSettings.set_deadzone_lowerbound(_self,value) end + +---@param _self AxisSettings +---@return number +function AxisSettings.livezone_lowerbound(_self) end + +---@param _self AxisSettings +---@return number +function AxisSettings.livezone_upperbound(_self) end + +---@param _self AxisSettings +---@return AxisSettings +function AxisSettings.clone(_self) end + +---@param _self AxisSettings +---@param value number +---@return number +function AxisSettings.set_deadzone_upperbound(_self,value) end + +---@param _self AxisSettings +---@param other AxisSettings +---@return boolean +function AxisSettings.__eq(_self,other) end + +---@param _self AxisSettings +---@param other AxisSettings +---@return boolean +function AxisSettings.eq(_self,other) end + +---@param _self AxisSettings +---@param raw_value number +---@return number +function AxisSettings.clamp(_self,raw_value) end + +---@param _self AxisSettings +---@return number +function AxisSettings.deadzone_upperbound(_self) end + +---@param _self AxisSettings +---@param value number +---@return number +function AxisSettings.set_livezone_lowerbound(_self,value) end + + + +---@class ButtonAxisSettings : ReflectReference +--- Settings for a [`GamepadButton`]. +--- +--- It is used inside the [`GamepadSettings`] to define the sensitivity range and +--- threshold for a button axis. +--- +--- ## Logic +--- +--- - Values that are higher than or equal to `high` will be rounded to 1.0. +--- - Values that are lower than or equal to `low` will be rounded to 0.0. +--- - Otherwise, values will not be rounded. +--- +--- The valid range is from 0.0 to 1.0, inclusive. +---@field high ? number +---@field low ? number +---@field threshold ? number +ButtonAxisSettings = {} + +---@param _self ButtonAxisSettings +---@return ButtonAxisSettings +function ButtonAxisSettings.clone(_self) end + + + +---@class ButtonSettings : ReflectReference +--- Manages settings for gamepad buttons. +--- +--- It is used inside [`GamepadSettings`] to define the threshold for a [`GamepadButton`] +--- to be considered pressed or released. A button is considered pressed if the `press_threshold` +--- value is surpassed and released if the `release_threshold` value is undercut. +--- +--- Allowed values: `0.0 <= ``release_threshold`` <= ``press_threshold`` <= 1.0` +---@field press_threshold ? number +---@field release_threshold ? number +ButtonSettings = {} + +---@param _self ButtonSettings +---@param value number +---@return number +function ButtonSettings.set_press_threshold(_self,value) end + +---@param _self ButtonSettings +---@return number +function ButtonSettings.release_threshold(_self) end + +---@param _self ButtonSettings +---@param other ButtonSettings +---@return boolean +function ButtonSettings.__eq(_self,other) end + +---@param _self ButtonSettings +---@param other ButtonSettings +---@return boolean +function ButtonSettings.eq(_self,other) end + +---@param _self ButtonSettings +---@param value number +---@return boolean +function ButtonSettings.is_released(_self,value) end + +---@param _self ButtonSettings +---@return number +function ButtonSettings.press_threshold(_self) end + +---@param _self ButtonSettings +---@return ButtonSettings +function ButtonSettings.clone(_self) end + +---@param _self ButtonSettings +---@param value number +---@return number +function ButtonSettings.set_release_threshold(_self,value) end + +---@param _self ButtonSettings +---@param value number +---@return boolean +function ButtonSettings.is_pressed(_self,value) end + + + +---@class Gamepad : ReflectReference +--- Stores a connected gamepad's metadata such as the name and its [`GamepadButton`] and [`GamepadAxis`]. +--- +--- An entity with this component is spawned automatically after [`GamepadConnectionEvent`] +--- and updated by [`gamepad_event_processing_system`]. +--- +--- See also [`GamepadSettings`] for configuration. +--- +--- # Examples +--- +--- ``` +--- # use bevy_input::gamepad::{Gamepad, GamepadAxis, GamepadButton}; +--- # use bevy_ecs::system::Query; +--- # use bevy_ecs::name::Name; +--- # +--- fn gamepad_usage_system(gamepads: Query<(&Name, &Gamepad)>) { +--- for (name, gamepad) in &gamepads { +--- println!("{name}"); +--- +--- if gamepad.just_pressed(GamepadButton::North) { +--- println!("{} just pressed North", name) +--- } +--- +--- if let Some(left_stick_x) = gamepad.get(GamepadAxis::LeftStickX) { +--- println!("left stick X: {}", left_stick_x) +--- } +--- } +--- } +--- ``` +---@field vendor_id ? integer | nil +---@field product_id ? integer | nil +---@field digital ? any +---@field analog ? any +Gamepad = {} + +---@param _self Gamepad +---@param button_type GamepadButton +---@return boolean +function Gamepad.just_released(_self,button_type) end + +---@param _self Gamepad +---@return Vec2 +function Gamepad.right_stick(_self) end + +---@param _self Gamepad +---@return integer | nil +function Gamepad.vendor_id(_self) end + +---@param _self Gamepad +---@return integer | nil +function Gamepad.product_id(_self) end + +---@param _self Gamepad +---@param button_type GamepadButton +---@return boolean +function Gamepad.pressed(_self,button_type) end + +---@param _self Gamepad +---@param button_type GamepadButton +---@return boolean +function Gamepad.just_pressed(_self,button_type) end + +---@param _self Gamepad +---@return Vec2 +function Gamepad.left_stick(_self) end + +---@param _self Gamepad +---@return Vec2 +function Gamepad.dpad(_self) end + + + +---@class GamepadAxis : ReflectReference +--- Represents gamepad input types that are mapped in the range [-1.0, 1.0]. +--- +--- ## Usage +--- +--- This is used to determine which axis has changed its value when receiving a +--- gamepad axis event. It is also used in the [`Gamepad`] component. +GamepadAxis = {} + +---@param _self GamepadAxis +---@return nil +function GamepadAxis.assert_receiver_is_total_eq(_self) end + +---@param _self GamepadAxis +---@param other GamepadAxis +---@return boolean +function GamepadAxis.__eq(_self,other) end + +---@param _self GamepadAxis +---@param other GamepadAxis +---@return boolean +function GamepadAxis.eq(_self,other) end + +---@param _self GamepadAxis +---@return GamepadAxis +function GamepadAxis.clone(_self) end + + + +---@class GamepadAxisChangedEvent : ReflectReference +--- [`GamepadAxis`] event triggered by an analog state change. +---@field entity ? Entity +---@field axis ? GamepadAxis +---@field value ? number +GamepadAxisChangedEvent = {} + +---@param _self GamepadAxisChangedEvent +---@return GamepadAxisChangedEvent +function GamepadAxisChangedEvent.clone(_self) end + +---@param entity Entity +---@param axis GamepadAxis +---@param value number +---@return GamepadAxisChangedEvent +function GamepadAxisChangedEvent.new(entity,axis,value) end + +---@param _self GamepadAxisChangedEvent +---@param other GamepadAxisChangedEvent +---@return boolean +function GamepadAxisChangedEvent.__eq(_self,other) end + +---@param _self GamepadAxisChangedEvent +---@param other GamepadAxisChangedEvent +---@return boolean +function GamepadAxisChangedEvent.eq(_self,other) end + + + +---@class GamepadButton : ReflectReference +--- Represents gamepad input types that are mapped in the range [0.0, 1.0]. +--- +--- ## Usage +--- +--- This is used to determine which button has changed its value when receiving gamepad button events. +--- It is also used in the [`Gamepad`] component. +GamepadButton = {} + +---@param _self GamepadButton +---@param other GamepadButton +---@return boolean +function GamepadButton.__eq(_self,other) end + +---@param _self GamepadButton +---@param other GamepadButton +---@return boolean +function GamepadButton.eq(_self,other) end + +---@param _self GamepadButton +---@return nil +function GamepadButton.assert_receiver_is_total_eq(_self) end + +---@param _self GamepadButton +---@return GamepadButton +function GamepadButton.clone(_self) end + + + +---@class GamepadButtonChangedEvent : ReflectReference +--- [`GamepadButton`] event triggered by an analog state change. +---@field entity ? Entity +---@field button ? GamepadButton +---@field state ? ButtonState +---@field value ? number +GamepadButtonChangedEvent = {} + +---@param entity Entity +---@param button GamepadButton +---@param state ButtonState +---@param value number +---@return GamepadButtonChangedEvent +function GamepadButtonChangedEvent.new(entity,button,state,value) end + +---@param _self GamepadButtonChangedEvent +---@param other GamepadButtonChangedEvent +---@return boolean +function GamepadButtonChangedEvent.__eq(_self,other) end + +---@param _self GamepadButtonChangedEvent +---@param other GamepadButtonChangedEvent +---@return boolean +function GamepadButtonChangedEvent.eq(_self,other) end + +---@param _self GamepadButtonChangedEvent +---@return GamepadButtonChangedEvent +function GamepadButtonChangedEvent.clone(_self) end + + + +---@class GamepadButtonStateChangedEvent : ReflectReference +--- [`GamepadButton`] event triggered by a digital state change. +---@field entity ? Entity +---@field button ? GamepadButton +---@field state ? ButtonState +GamepadButtonStateChangedEvent = {} + +---@param _self GamepadButtonStateChangedEvent +---@param other GamepadButtonStateChangedEvent +---@return boolean +function GamepadButtonStateChangedEvent.__eq(_self,other) end + +---@param _self GamepadButtonStateChangedEvent +---@param other GamepadButtonStateChangedEvent +---@return boolean +function GamepadButtonStateChangedEvent.eq(_self,other) end + +---@param _self GamepadButtonStateChangedEvent +---@return GamepadButtonStateChangedEvent +function GamepadButtonStateChangedEvent.clone(_self) end + +---@param entity Entity +---@param button GamepadButton +---@param state ButtonState +---@return GamepadButtonStateChangedEvent +function GamepadButtonStateChangedEvent.new(entity,button,state) end + +---@param _self GamepadButtonStateChangedEvent +---@return nil +function GamepadButtonStateChangedEvent.assert_receiver_is_total_eq(_self) end + + + +---@class GamepadConnection : ReflectReference +--- The connection status of a gamepad. +GamepadConnection = {} + +---@param _self GamepadConnection +---@return GamepadConnection +function GamepadConnection.clone(_self) end + +---@param _self GamepadConnection +---@param other GamepadConnection +---@return boolean +function GamepadConnection.__eq(_self,other) end + +---@param _self GamepadConnection +---@param other GamepadConnection +---@return boolean +function GamepadConnection.eq(_self,other) end + + + +---@class GamepadConnectionEvent : ReflectReference +--- A [`Gamepad`] connection event. Created when a connection to a gamepad +--- is established and when a gamepad is disconnected. +---@field gamepad ? Entity +---@field connection ? GamepadConnection +GamepadConnectionEvent = {} + +---@param _self GamepadConnectionEvent +---@return boolean +function GamepadConnectionEvent.disconnected(_self) end + +---@param _self GamepadConnectionEvent +---@return GamepadConnectionEvent +function GamepadConnectionEvent.clone(_self) end + +---@param _self GamepadConnectionEvent +---@param other GamepadConnectionEvent +---@return boolean +function GamepadConnectionEvent.__eq(_self,other) end + +---@param _self GamepadConnectionEvent +---@param other GamepadConnectionEvent +---@return boolean +function GamepadConnectionEvent.eq(_self,other) end + +---@param _self GamepadConnectionEvent +---@return boolean +function GamepadConnectionEvent.connected(_self) end + +---@param gamepad Entity +---@param connection GamepadConnection +---@return GamepadConnectionEvent +function GamepadConnectionEvent.new(gamepad,connection) end + + + +---@class GamepadEvent : ReflectReference +--- A gamepad event. +--- +--- This event type is used over the [`GamepadConnectionEvent`], +--- [`GamepadButtonChangedEvent`] and [`GamepadAxisChangedEvent`] when +--- the in-frame relative ordering of events is important. +--- +--- This event is produced by `bevy_input`. +GamepadEvent = {} + +---@param _self GamepadEvent +---@return GamepadEvent +function GamepadEvent.clone(_self) end + +---@param _self GamepadEvent +---@param other GamepadEvent +---@return boolean +function GamepadEvent.__eq(_self,other) end + +---@param _self GamepadEvent +---@param other GamepadEvent +---@return boolean +function GamepadEvent.eq(_self,other) end + + + +---@class GamepadInput : ReflectReference +--- Encapsulation over [`GamepadAxis`] and [`GamepadButton`]. +GamepadInput = {} + +---@param _self GamepadInput +---@return nil +function GamepadInput.assert_receiver_is_total_eq(_self) end + +---@param _self GamepadInput +---@return GamepadInput +function GamepadInput.clone(_self) end + +---@param _self GamepadInput +---@param other GamepadInput +---@return boolean +function GamepadInput.__eq(_self,other) end + +---@param _self GamepadInput +---@param other GamepadInput +---@return boolean +function GamepadInput.eq(_self,other) end + + + +---@class GamepadRumbleIntensity : ReflectReference +--- The intensity at which a gamepad's force-feedback motors may rumble. +---@field strong_motor ? number +---@field weak_motor ? number +GamepadRumbleIntensity = {} + +---@param _self GamepadRumbleIntensity +---@param other GamepadRumbleIntensity +---@return boolean +function GamepadRumbleIntensity.__eq(_self,other) end + +---@param _self GamepadRumbleIntensity +---@param other GamepadRumbleIntensity +---@return boolean +function GamepadRumbleIntensity.eq(_self,other) end + +---@param intensity number +---@return GamepadRumbleIntensity +function GamepadRumbleIntensity.strong_motor(intensity) end + +---@param intensity number +---@return GamepadRumbleIntensity +function GamepadRumbleIntensity.weak_motor(intensity) end + +---@param _self GamepadRumbleIntensity +---@return GamepadRumbleIntensity +function GamepadRumbleIntensity.clone(_self) end + + + +---@class GamepadRumbleRequest : ReflectReference +--- An event that controls force-feedback rumbling of a [`Gamepad`] [`entity`](Entity). +--- +--- # Notes +--- +--- Does nothing if the gamepad or platform does not support rumble. +--- +--- # Example +--- +--- ``` +--- # use bevy_input::gamepad::{Gamepad, GamepadRumbleRequest, GamepadRumbleIntensity}; +--- # use bevy_ecs::prelude::{MessageWriter, Res, Query, Entity, With}; +--- # use core::time::Duration; +--- fn rumble_gamepad_system( +--- mut rumble_requests: MessageWriter, +--- gamepads: Query>, +--- ) { +--- for entity in gamepads.iter() { +--- rumble_requests.write(GamepadRumbleRequest::Add { +--- gamepad: entity, +--- intensity: GamepadRumbleIntensity::MAX, +--- duration: Duration::from_secs_f32(0.5), +--- }); +--- } +--- } +--- ``` +GamepadRumbleRequest = {} + +---@param _self GamepadRumbleRequest +---@return GamepadRumbleRequest +function GamepadRumbleRequest.clone(_self) end + +---@param _self GamepadRumbleRequest +---@return Entity +function GamepadRumbleRequest.gamepad(_self) end + + + +---@class GamepadSettings : ReflectReference +--- Gamepad settings component. +--- +--- ## Usage +--- +--- It is used to create a `bevy` component that stores the settings of [`GamepadButton`] and [`GamepadAxis`] in [`Gamepad`]. +--- If no user defined [`ButtonSettings`], [`AxisSettings`], or [`ButtonAxisSettings`] +--- are defined, the default settings of each are used as a fallback accordingly. +--- +--- ## Note +--- +--- The [`GamepadSettings`] are used to determine when raw gamepad events +--- should register. Events that don't meet the change thresholds defined in [`GamepadSettings`] +--- will not register. To modify these settings, mutate the corresponding component. +---@field default_button_settings ? ButtonSettings +---@field default_axis_settings ? AxisSettings +---@field default_button_axis_settings ? ButtonAxisSettings +---@field button_settings ? table +---@field axis_settings ? table +---@field button_axis_settings ? table +GamepadSettings = {} + +---@param _self GamepadSettings +---@return GamepadSettings +function GamepadSettings.clone(_self) end + + + +---@class RawGamepadAxisChangedEvent : ReflectReference +--- [`GamepadAxis`] changed event unfiltered by [`GamepadSettings`]. +---@field gamepad ? Entity +---@field axis ? GamepadAxis +---@field value ? number +RawGamepadAxisChangedEvent = {} + +---@param _self RawGamepadAxisChangedEvent +---@param other RawGamepadAxisChangedEvent +---@return boolean +function RawGamepadAxisChangedEvent.__eq(_self,other) end + +---@param _self RawGamepadAxisChangedEvent +---@param other RawGamepadAxisChangedEvent +---@return boolean +function RawGamepadAxisChangedEvent.eq(_self,other) end + +---@param gamepad Entity +---@param axis_type GamepadAxis +---@param value number +---@return RawGamepadAxisChangedEvent +function RawGamepadAxisChangedEvent.new(gamepad,axis_type,value) end + +---@param _self RawGamepadAxisChangedEvent +---@return RawGamepadAxisChangedEvent +function RawGamepadAxisChangedEvent.clone(_self) end + + + +---@class RawGamepadButtonChangedEvent : ReflectReference +--- [`GamepadButton`] changed event unfiltered by [`GamepadSettings`]. +---@field gamepad ? Entity +---@field button ? GamepadButton +---@field value ? number +RawGamepadButtonChangedEvent = {} + +---@param _self RawGamepadButtonChangedEvent +---@param other RawGamepadButtonChangedEvent +---@return boolean +function RawGamepadButtonChangedEvent.__eq(_self,other) end + +---@param _self RawGamepadButtonChangedEvent +---@param other RawGamepadButtonChangedEvent +---@return boolean +function RawGamepadButtonChangedEvent.eq(_self,other) end + +---@param _self RawGamepadButtonChangedEvent +---@return RawGamepadButtonChangedEvent +function RawGamepadButtonChangedEvent.clone(_self) end + +---@param gamepad Entity +---@param button_type GamepadButton +---@param value number +---@return RawGamepadButtonChangedEvent +function RawGamepadButtonChangedEvent.new(gamepad,button_type,value) end + + + +---@class RawGamepadEvent : ReflectReference +--- A raw gamepad event. +--- +--- This event type is used over the [`GamepadConnectionEvent`], +--- [`RawGamepadButtonChangedEvent`] and [`RawGamepadAxisChangedEvent`] when +--- the in-frame relative ordering of events is important. +--- +--- This event type is used by `bevy_input` to feed its components. +RawGamepadEvent = {} + +---@param _self RawGamepadEvent +---@return RawGamepadEvent +function RawGamepadEvent.clone(_self) end + +---@param _self RawGamepadEvent +---@param other RawGamepadEvent +---@return boolean +function RawGamepadEvent.__eq(_self,other) end + +---@param _self RawGamepadEvent +---@param other RawGamepadEvent +---@return boolean +function RawGamepadEvent.eq(_self,other) end + + + +---@class DoubleTapGesture : ReflectReference +--- Double tap gesture. +--- +--- ## Platform-specific +--- +--- - Only available on **`macOS`** and **`iOS`**. +--- - On **`iOS`**, must be enabled first +DoubleTapGesture = {} + +---@param _self DoubleTapGesture +---@return DoubleTapGesture +function DoubleTapGesture.clone(_self) end + +---@param _self DoubleTapGesture +---@param other DoubleTapGesture +---@return boolean +function DoubleTapGesture.__eq(_self,other) end + +---@param _self DoubleTapGesture +---@param other DoubleTapGesture +---@return boolean +function DoubleTapGesture.eq(_self,other) end + + + +---@class PanGesture : ReflectReference +--- Pan gesture. +--- +--- ## Platform-specific +--- +--- - On **`iOS`**, must be enabled first +---@field [1] Vec2 +PanGesture = {} + +---@param _self PanGesture +---@return PanGesture +function PanGesture.clone(_self) end + +---@param _self PanGesture +---@param other PanGesture +---@return boolean +function PanGesture.__eq(_self,other) end + +---@param _self PanGesture +---@param other PanGesture +---@return boolean +function PanGesture.eq(_self,other) end + + + +---@class PinchGesture : ReflectReference +--- Two-finger pinch gesture, often used for magnifications. +--- +--- Positive delta values indicate magnification (zooming in) and +--- negative delta values indicate shrinking (zooming out). +--- +--- ## Platform-specific +--- +--- - Only available on **`macOS`** and **`iOS`**. +--- - On **`iOS`**, must be enabled first +---@field [1] number +PinchGesture = {} + +---@param _self PinchGesture +---@return PinchGesture +function PinchGesture.clone(_self) end + +---@param _self PinchGesture +---@param other PinchGesture +---@return boolean +function PinchGesture.__eq(_self,other) end + +---@param _self PinchGesture +---@param other PinchGesture +---@return boolean +function PinchGesture.eq(_self,other) end + + + +---@class RotationGesture : ReflectReference +--- Two-finger rotation gesture. +--- +--- Positive delta values indicate rotation counterclockwise and +--- negative delta values indicate rotation clockwise. +--- +--- ## Platform-specific +--- +--- - Only available on **`macOS`** and **`iOS`**. +--- - On **`iOS`**, must be enabled first +---@field [1] number +RotationGesture = {} + +---@param _self RotationGesture +---@return RotationGesture +function RotationGesture.clone(_self) end + +---@param _self RotationGesture +---@param other RotationGesture +---@return boolean +function RotationGesture.__eq(_self,other) end + +---@param _self RotationGesture +---@param other RotationGesture +---@return boolean +function RotationGesture.eq(_self,other) end + + + +---@class Key : ReflectReference +--- The logical key code of a [`KeyboardInput`]. +--- +--- This contains the actual value that is produced by pressing the key. This is +--- useful when you need the actual letters, and for symbols like `+` and `-` +--- when implementing zoom, as they can be in different locations depending on +--- the keyboard layout. +--- +--- In many cases you want the key location instead, for example when +--- implementing WASD controls so the keys are located the same place on QWERTY +--- and other layouts. In that case use [`KeyCode`] instead. +--- +--- ## Usage +--- +--- It is used as the generic `T` value of an [`ButtonInput`] to create a `Res>`. +--- +--- ## Technical +--- +--- Its values map 1 to 1 to winit's Key. +Key = {} + +---@param _self Key +---@param other Key +---@return boolean +function Key.__eq(_self,other) end + +---@param _self Key +---@param other Key +---@return boolean +function Key.eq(_self,other) end + +---@param _self Key +---@return nil +function Key.assert_receiver_is_total_eq(_self) end + +---@param _self Key +---@return Key +function Key.clone(_self) end + + + +---@class KeyCode : ReflectReference +--- The key code of a [`KeyboardInput`]. +--- +--- ## Usage +--- +--- It is used as the generic `T` value of an [`ButtonInput`] to create a `Res>`. +--- +--- Code representing the location of a physical key +--- This mostly conforms to the [`UI Events Specification's KeyboardEvent.code`] with a few +--- exceptions: +--- - The keys that the specification calls `MetaLeft` and `MetaRight` are named `SuperLeft` and +--- `SuperRight` here. +--- - The key that the specification calls "Super" is reported as `Unidentified` here. +--- +--- [`UI Events Specification's KeyboardEvent.code`]: https://w3c.github.io/uievents-code/#code-value-tables +--- +--- ## Updating +--- +--- The resource is updated inside of the [`keyboard_input_system`]. +KeyCode = {} + +---@param _self KeyCode +---@return nil +function KeyCode.assert_receiver_is_total_eq(_self) end + +---@param _self KeyCode +---@param other KeyCode +---@return boolean +function KeyCode.__eq(_self,other) end + +---@param _self KeyCode +---@param other KeyCode +---@return boolean +function KeyCode.eq(_self,other) end + +---@param _self KeyCode +---@return KeyCode +function KeyCode.clone(_self) end + + + +---@class KeyboardFocusLost : ReflectReference +--- Gets generated from `bevy_winit::winit_runner` +--- +--- Used for clearing all cached states to avoid having 'stuck' key presses +--- when, for example, switching between windows with 'Alt-Tab' or using any other +--- OS specific key combination that leads to Bevy window losing focus and not receiving any +--- input events +KeyboardFocusLost = {} + +---@param _self KeyboardFocusLost +---@return nil +function KeyboardFocusLost.assert_receiver_is_total_eq(_self) end + +---@param _self KeyboardFocusLost +---@param other KeyboardFocusLost +---@return boolean +function KeyboardFocusLost.__eq(_self,other) end + +---@param _self KeyboardFocusLost +---@param other KeyboardFocusLost +---@return boolean +function KeyboardFocusLost.eq(_self,other) end + +---@param _self KeyboardFocusLost +---@return KeyboardFocusLost +function KeyboardFocusLost.clone(_self) end + + + +---@class KeyboardInput : ReflectReference +--- A keyboard input event. +--- +--- This event is the translated version of the `WindowEvent::KeyboardInput` from the `winit` crate. +--- It is available to the end user and can be used for game logic. +--- +--- ## Usage +--- +--- The event is consumed inside of the [`keyboard_input_system`] to update the +--- [`ButtonInput`](ButtonInput) and +--- [`ButtonInput`](ButtonInput) resources. +---@field key_code ? KeyCode +---@field logical_key ? Key +---@field state ? ButtonState +---@field text ? SmolStr | nil +---@field repeat ? boolean +---@field window ? Entity +KeyboardInput = {} + +---@param _self KeyboardInput +---@return KeyboardInput +function KeyboardInput.clone(_self) end + +---@param _self KeyboardInput +---@return nil +function KeyboardInput.assert_receiver_is_total_eq(_self) end + +---@param _self KeyboardInput +---@param other KeyboardInput +---@return boolean +function KeyboardInput.__eq(_self,other) end + +---@param _self KeyboardInput +---@param other KeyboardInput +---@return boolean +function KeyboardInput.eq(_self,other) end + + + +---@class NativeKey : ReflectReference +--- Contains the platform-native logical key identifier, known as keysym. +--- +--- Exactly what that means differs from platform to platform, but the values are to some degree +--- tied to the currently active keyboard layout. The same key on the same keyboard may also report +--- different values on different platforms, which is one of the reasons this is a per-platform +--- enum. +--- +--- This enum is primarily used to store raw keysym when Winit doesn't map a given native logical +--- key identifier to a meaningful [`Key`] variant. This lets you use [`Key`], and let the user +--- define keybinds which work in the presence of identifiers we haven't mapped for you yet. +NativeKey = {} + +---@param _self NativeKey +---@return nil +function NativeKey.assert_receiver_is_total_eq(_self) end + +---@param _self NativeKey +---@return NativeKey +function NativeKey.clone(_self) end + +---@param _self NativeKey +---@param other NativeKey +---@return boolean +function NativeKey.__eq(_self,other) end + +---@param _self NativeKey +---@param other NativeKey +---@return boolean +function NativeKey.eq(_self,other) end + + + +---@class NativeKeyCode : ReflectReference +--- Contains the platform-native physical key identifier +--- +--- The exact values vary from platform to platform (which is part of why this is a per-platform +--- enum), but the values are primarily tied to the key's physical location on the keyboard. +--- +--- This enum is primarily used to store raw keycodes when Winit doesn't map a given native +--- physical key identifier to a meaningful [`KeyCode`] variant. In the presence of identifiers we +--- haven't mapped for you yet, this lets you use [`KeyCode`] to: +--- +--- - Correctly match key press and release events. +--- - On non-web platforms, support assigning keybinds to virtually any key through a UI. +NativeKeyCode = {} + +---@param _self NativeKeyCode +---@return nil +function NativeKeyCode.assert_receiver_is_total_eq(_self) end + +---@param _self NativeKeyCode +---@return NativeKeyCode +function NativeKeyCode.clone(_self) end + +---@param _self NativeKeyCode +---@param other NativeKeyCode +---@return boolean +function NativeKeyCode.__eq(_self,other) end + +---@param _self NativeKeyCode +---@param other NativeKeyCode +---@return boolean +function NativeKeyCode.eq(_self,other) end + + + +---@class AccumulatedMouseMotion : ReflectReference +--- Tracks how much the mouse has moved every frame. +--- +--- This resource is reset to zero every frame. +--- +--- This resource sums the total [`MouseMotion`] events received this frame. +---@field delta ? Vec2 +AccumulatedMouseMotion = {} + +---@param _self AccumulatedMouseMotion +---@return AccumulatedMouseMotion +function AccumulatedMouseMotion.clone(_self) end + +---@param _self AccumulatedMouseMotion +---@param other AccumulatedMouseMotion +---@return boolean +function AccumulatedMouseMotion.__eq(_self,other) end + +---@param _self AccumulatedMouseMotion +---@param other AccumulatedMouseMotion +---@return boolean +function AccumulatedMouseMotion.eq(_self,other) end + + + +---@class AccumulatedMouseScroll : ReflectReference +--- Tracks how much the mouse has scrolled every frame. +--- +--- This resource is reset to zero every frame. +--- +--- This resource sums the total [`MouseWheel`] events received this frame. +---@field unit ? MouseScrollUnit +---@field delta ? Vec2 +AccumulatedMouseScroll = {} + +---@param _self AccumulatedMouseScroll +---@return AccumulatedMouseScroll +function AccumulatedMouseScroll.clone(_self) end + +---@param _self AccumulatedMouseScroll +---@param other AccumulatedMouseScroll +---@return boolean +function AccumulatedMouseScroll.__eq(_self,other) end + +---@param _self AccumulatedMouseScroll +---@param other AccumulatedMouseScroll +---@return boolean +function AccumulatedMouseScroll.eq(_self,other) end + + + +---@class MouseButton : ReflectReference +--- A button on a mouse device. +--- +--- ## Usage +--- +--- It is used as the generic `T` value of an [`ButtonInput`] to create a `bevy` +--- resource. +--- +--- ## Updating +--- +--- The resource is updated inside of the [`mouse_button_input_system`]. +MouseButton = {} + +---@param _self MouseButton +---@param other MouseButton +---@return boolean +function MouseButton.__eq(_self,other) end + +---@param _self MouseButton +---@param other MouseButton +---@return boolean +function MouseButton.eq(_self,other) end + +---@param _self MouseButton +---@return MouseButton +function MouseButton.clone(_self) end + +---@param _self MouseButton +---@return nil +function MouseButton.assert_receiver_is_total_eq(_self) end + + + +---@class MouseButtonInput : ReflectReference +--- A mouse button input event. +--- +--- This event is the translated version of the `WindowEvent::MouseInput` from the `winit` crate. +--- +--- ## Usage +--- +--- The event is read inside of the [`mouse_button_input_system`] +--- to update the [`ButtonInput`] resource. +---@field button ? MouseButton +---@field state ? ButtonState +---@field window ? Entity +MouseButtonInput = {} + +---@param _self MouseButtonInput +---@return MouseButtonInput +function MouseButtonInput.clone(_self) end + +---@param _self MouseButtonInput +---@param other MouseButtonInput +---@return boolean +function MouseButtonInput.__eq(_self,other) end + +---@param _self MouseButtonInput +---@param other MouseButtonInput +---@return boolean +function MouseButtonInput.eq(_self,other) end + +---@param _self MouseButtonInput +---@return nil +function MouseButtonInput.assert_receiver_is_total_eq(_self) end + + + +---@class MouseMotion : ReflectReference +--- An event reporting the change in physical position of a pointing device. +--- +--- This represents raw, unfiltered physical motion. +--- It is the translated version of [`DeviceEvent::MouseMotion`] from the `winit` crate. +--- +--- All pointing devices connected to a single machine at the same time can emit the event independently. +--- However, the event data does not make it possible to distinguish which device it is referring to. +--- +--- [`DeviceEvent::MouseMotion`]: https://docs.rs/winit/latest/winit/event/enum.DeviceEvent.html#variant.MouseMotion +---@field delta ? Vec2 +MouseMotion = {} + +---@param _self MouseMotion +---@return MouseMotion +function MouseMotion.clone(_self) end + +---@param _self MouseMotion +---@param other MouseMotion +---@return boolean +function MouseMotion.__eq(_self,other) end + +---@param _self MouseMotion +---@param other MouseMotion +---@return boolean +function MouseMotion.eq(_self,other) end + + + +---@class MouseScrollUnit : ReflectReference +--- The scroll unit. +--- +--- Describes how a value of a [`MouseWheel`] event has to be interpreted. +--- +--- The value of the event can either be interpreted as the amount of lines or the amount of pixels +--- to scroll. +MouseScrollUnit = {} + +---@param _self MouseScrollUnit +---@return nil +function MouseScrollUnit.assert_receiver_is_total_eq(_self) end + +---@param _self MouseScrollUnit +---@param other MouseScrollUnit +---@return boolean +function MouseScrollUnit.__eq(_self,other) end + +---@param _self MouseScrollUnit +---@param other MouseScrollUnit +---@return boolean +function MouseScrollUnit.eq(_self,other) end + +---@param _self MouseScrollUnit +---@return MouseScrollUnit +function MouseScrollUnit.clone(_self) end + + + +---@class MouseWheel : ReflectReference +--- A mouse wheel event. +--- +--- This event is the translated version of the `WindowEvent::MouseWheel` from the `winit` crate. +---@field unit ? MouseScrollUnit +---@field x ? number +---@field y ? number +---@field window ? Entity +MouseWheel = {} + +---@param _self MouseWheel +---@return MouseWheel +function MouseWheel.clone(_self) end + +---@param _self MouseWheel +---@param other MouseWheel +---@return boolean +function MouseWheel.__eq(_self,other) end + +---@param _self MouseWheel +---@param other MouseWheel +---@return boolean +function MouseWheel.eq(_self,other) end + + + +---@class ForceTouch : ReflectReference +--- A force description of a [`Touch`] input. +ForceTouch = {} + +---@param _self ForceTouch +---@return ForceTouch +function ForceTouch.clone(_self) end + +---@param _self ForceTouch +---@param other ForceTouch +---@return boolean +function ForceTouch.__eq(_self,other) end + +---@param _self ForceTouch +---@param other ForceTouch +---@return boolean +function ForceTouch.eq(_self,other) end + + + +---@class TouchInput : ReflectReference +--- A touch input event. +--- +--- ## Logic +--- +--- Every time the user touches the screen, a new [`TouchPhase::Started`] event with an unique +--- identifier for the finger is generated. When the finger is lifted, the [`TouchPhase::Ended`] +--- event is generated with the same finger id. +--- +--- After a [`TouchPhase::Started`] event has been emitted, there may be zero or more [`TouchPhase::Moved`] +--- events when the finger is moved or the touch pressure changes. +--- +--- The finger id may be reused by the system after an [`TouchPhase::Ended`] event. The user +--- should assume that a new [`TouchPhase::Started`] event received with the same id has nothing +--- to do with the old finger and is a new finger. +--- +--- A [`TouchPhase::Canceled`] event is emitted when the system has canceled tracking this +--- touch, such as when the window loses focus, or on iOS if the user moves the +--- device against their face. +--- +--- ## Note +--- +--- This event is the translated version of the `WindowEvent::Touch` from the `winit` crate. +--- It is available to the end user and can be used for game logic. +---@field phase ? TouchPhase +---@field position ? Vec2 +---@field window ? Entity +---@field force ? ForceTouch | nil +---@field id ? integer +TouchInput = {} + +---@param _self TouchInput +---@return TouchInput +function TouchInput.clone(_self) end + +---@param _self TouchInput +---@param other TouchInput +---@return boolean +function TouchInput.__eq(_self,other) end + +---@param _self TouchInput +---@param other TouchInput +---@return boolean +function TouchInput.eq(_self,other) end + + + +---@class TouchPhase : ReflectReference +--- A phase of a [`TouchInput`]. +--- +--- ## Usage +--- +--- It is used to describe the phase of the touch input that is currently active. +--- This includes a phase that indicates that a touch input has started or ended, +--- or that a finger has moved. There is also a canceled phase that indicates that +--- the system canceled the tracking of the finger. +TouchPhase = {} + +---@param _self TouchPhase +---@return TouchPhase +function TouchPhase.clone(_self) end + +---@param _self TouchPhase +---@param other TouchPhase +---@return boolean +function TouchPhase.__eq(_self,other) end + +---@param _self TouchPhase +---@param other TouchPhase +---@return boolean +function TouchPhase.eq(_self,other) end + +---@param _self TouchPhase +---@return nil +function TouchPhase.assert_receiver_is_total_eq(_self) end + + + +---@class AspectRatio : ReflectReference +--- An `AspectRatio` is the ratio of width to height. +---@field [1] number +AspectRatio = {} + +---@param _self AspectRatio +---@return number +function AspectRatio.ratio(_self) end + +---@param _self AspectRatio +---@return AspectRatio +function AspectRatio.clone(_self) end + +---@param _self AspectRatio +---@return AspectRatio +function AspectRatio.inverse(_self) end + +---@param _self AspectRatio +---@return boolean +function AspectRatio.is_portrait(_self) end + +---@param _self AspectRatio +---@return boolean +function AspectRatio.is_square(_self) end + +---@param _self AspectRatio +---@return boolean +function AspectRatio.is_landscape(_self) end + +---@param _self AspectRatio +---@param other AspectRatio +---@return boolean +function AspectRatio.__eq(_self,other) end + +---@param _self AspectRatio +---@param other AspectRatio +---@return boolean +function AspectRatio.eq(_self,other) end + + + +---@class Aabb2d : ReflectReference +--- A 2D axis-aligned bounding box, or bounding rectangle +---@field min ? Vec2 +---@field max ? Vec2 +Aabb2d = {} + +---@param _self Aabb2d +---@param other Aabb2d +---@return boolean +function Aabb2d.__eq(_self,other) end + +---@param _self Aabb2d +---@param other Aabb2d +---@return boolean +function Aabb2d.eq(_self,other) end + +---@param _self Aabb2d +---@return Aabb2d +function Aabb2d.clone(_self) end + +---@param center Vec2 +---@param half_size Vec2 +---@return Aabb2d +function Aabb2d.new(center,half_size) end + +---@param _self Aabb2d +---@param point Vec2 +---@return Vec2 +function Aabb2d.closest_point(_self,point) end + +---@param _self Aabb2d +---@return BoundingCircle +function Aabb2d.bounding_circle(_self) end + + + +---@class BoundingCircle : ReflectReference +--- A bounding circle +---@field center ? Vec2 +---@field circle ? Circle +BoundingCircle = {} + +---@param _self BoundingCircle +---@return number +function BoundingCircle.radius(_self) end + +---@param _self BoundingCircle +---@return Aabb2d +function BoundingCircle.aabb_2d(_self) end + +---@param _self BoundingCircle +---@return BoundingCircle +function BoundingCircle.clone(_self) end + +---@param center Vec2 +---@param radius number +---@return BoundingCircle +function BoundingCircle.new(center,radius) end + +---@param _self BoundingCircle +---@param other BoundingCircle +---@return boolean +function BoundingCircle.__eq(_self,other) end + +---@param _self BoundingCircle +---@param other BoundingCircle +---@return boolean +function BoundingCircle.eq(_self,other) end + +---@param _self BoundingCircle +---@param point Vec2 +---@return Vec2 +function BoundingCircle.closest_point(_self,point) end + + + +---@class Aabb3d : ReflectReference +--- A 3D axis-aligned bounding box +---@field min ? Vec3A +---@field max ? Vec3A +Aabb3d = {} + +---@param _self Aabb3d +---@return Aabb3d +function Aabb3d.clone(_self) end + +---@param _self Aabb3d +---@return BoundingSphere +function Aabb3d.bounding_sphere(_self) end + +---@param _self Aabb3d +---@param other Aabb3d +---@return boolean +function Aabb3d.__eq(_self,other) end + +---@param _self Aabb3d +---@param other Aabb3d +---@return boolean +function Aabb3d.eq(_self,other) end + + + +---@class BoundingSphere : ReflectReference +--- A bounding sphere +---@field center ? Vec3A +---@field sphere ? Sphere +BoundingSphere = {} + +---@param _self BoundingSphere +---@param other BoundingSphere +---@return boolean +function BoundingSphere.__eq(_self,other) end + +---@param _self BoundingSphere +---@param other BoundingSphere +---@return boolean +function BoundingSphere.eq(_self,other) end + +---@param _self BoundingSphere +---@return Aabb3d +function BoundingSphere.aabb_3d(_self) end + +---@param _self BoundingSphere +---@return BoundingSphere +function BoundingSphere.clone(_self) end + +---@param _self BoundingSphere +---@return number +function BoundingSphere.radius(_self) end + + + +---@class AabbCast2d : ReflectReference +--- An intersection test that casts an [`Aabb2d`] along a ray. +---@field ray ? RayCast2d +---@field aabb ? Aabb2d +AabbCast2d = {} + +---@param aabb Aabb2d +---@param origin Vec2 +---@param direction Dir2 +---@param max number +---@return AabbCast2d +function AabbCast2d.new(aabb,origin,direction,max) end + +---@param _self AabbCast2d +---@param aabb Aabb2d +---@return number | nil +function AabbCast2d.aabb_collision_at(_self,aabb) end + +---@param aabb Aabb2d +---@param ray Ray2d +---@param max number +---@return AabbCast2d +function AabbCast2d.from_ray(aabb,ray,max) end + +---@param _self AabbCast2d +---@return AabbCast2d +function AabbCast2d.clone(_self) end + + + +---@class BoundingCircleCast : ReflectReference +--- An intersection test that casts a [`BoundingCircle`] along a ray. +---@field ray ? RayCast2d +---@field circle ? BoundingCircle +BoundingCircleCast = {} + +---@param _self BoundingCircleCast +---@param circle BoundingCircle +---@return number | nil +function BoundingCircleCast.circle_collision_at(_self,circle) end + +---@param _self BoundingCircleCast +---@return BoundingCircleCast +function BoundingCircleCast.clone(_self) end + +---@param circle BoundingCircle +---@param origin Vec2 +---@param direction Dir2 +---@param max number +---@return BoundingCircleCast +function BoundingCircleCast.new(circle,origin,direction,max) end + +---@param circle BoundingCircle +---@param ray Ray2d +---@param max number +---@return BoundingCircleCast +function BoundingCircleCast.from_ray(circle,ray,max) end + + + +---@class RayCast2d : ReflectReference +--- A raycast intersection test for 2D bounding volumes +---@field ray ? Ray2d +---@field max ? number +---@field direction_recip ? Vec2 +RayCast2d = {} + +---@param ray Ray2d +---@param max number +---@return RayCast2d +function RayCast2d.from_ray(ray,max) end + +---@param _self RayCast2d +---@return RayCast2d +function RayCast2d.clone(_self) end + +---@param _self RayCast2d +---@param circle BoundingCircle +---@return number | nil +function RayCast2d.circle_intersection_at(_self,circle) end + +---@param _self RayCast2d +---@return Vec2 +function RayCast2d.direction_recip(_self) end + +---@param _self RayCast2d +---@param aabb Aabb2d +---@return number | nil +function RayCast2d.aabb_intersection_at(_self,aabb) end + +---@param origin Vec2 +---@param direction Dir2 +---@param max number +---@return RayCast2d +function RayCast2d.new(origin,direction,max) end + + + +---@class AabbCast3d : ReflectReference +--- An intersection test that casts an [`Aabb3d`] along a ray. +---@field ray ? RayCast3d +---@field aabb ? Aabb3d +AabbCast3d = {} + +---@param aabb Aabb3d +---@param ray Ray3d +---@param max number +---@return AabbCast3d +function AabbCast3d.from_ray(aabb,ray,max) end + +---@param _self AabbCast3d +---@param aabb Aabb3d +---@return number | nil +function AabbCast3d.aabb_collision_at(_self,aabb) end + +---@param _self AabbCast3d +---@return AabbCast3d +function AabbCast3d.clone(_self) end + + + +---@class BoundingSphereCast : ReflectReference +--- An intersection test that casts a [`BoundingSphere`] along a ray. +---@field ray ? RayCast3d +---@field sphere ? BoundingSphere +BoundingSphereCast = {} + +---@param _self BoundingSphereCast +---@param sphere BoundingSphere +---@return number | nil +function BoundingSphereCast.sphere_collision_at(_self,sphere) end + +---@param sphere BoundingSphere +---@param ray Ray3d +---@param max number +---@return BoundingSphereCast +function BoundingSphereCast.from_ray(sphere,ray,max) end + +---@param _self BoundingSphereCast +---@return BoundingSphereCast +function BoundingSphereCast.clone(_self) end + + + +---@class RayCast3d : ReflectReference +--- A raycast intersection test for 3D bounding volumes +---@field origin ? Vec3A +---@field direction ? Dir3A +---@field max ? number +---@field direction_recip ? Vec3A +RayCast3d = {} + +---@param ray Ray3d +---@param max number +---@return RayCast3d +function RayCast3d.from_ray(ray,max) end + +---@param _self RayCast3d +---@param aabb Aabb3d +---@return number | nil +function RayCast3d.aabb_intersection_at(_self,aabb) end + +---@param _self RayCast3d +---@param sphere BoundingSphere +---@return number | nil +function RayCast3d.sphere_intersection_at(_self,sphere) end + +---@param _self RayCast3d +---@return Vec3A +function RayCast3d.direction_recip(_self) end + +---@param _self RayCast3d +---@return RayCast3d +function RayCast3d.clone(_self) end + + + +---@class CompassOctant : ReflectReference +--- A compass enum with 8 directions. +--- ```text +--- N (North) +--- ▲ +--- NW │ NE +--- ╲ │ ╱ +--- W (West) ┼─────► E (East) +--- ╱ │ ╲ +--- SW │ SE +--- ▼ +--- S (South) +--- ``` +---@operator unm: CompassOctant +CompassOctant = {} + +---@param _self CompassOctant +---@return nil +function CompassOctant.assert_receiver_is_total_eq(_self) end + +---@param _self CompassOctant +---@param other CompassOctant +---@return boolean +function CompassOctant.__eq(_self,other) end + +---@param _self CompassOctant +---@param other CompassOctant +---@return boolean +function CompassOctant.eq(_self,other) end + +---@param _self CompassOctant +---@return CompassOctant +function CompassOctant.clone(_self) end + +---@param _self CompassOctant +---@param origin Vec2 +--- The starting position +---@param candidate Vec2 +--- The target position to check +---@return boolean +function CompassOctant.is_in_direction(_self,origin,candidate) end + +---@param _self CompassOctant +---@return CompassOctant +function CompassOctant.neg(_self) end + +---@param _self CompassOctant +---@return integer +function CompassOctant.to_index(_self) end + +---@param _self CompassOctant +---@return CompassOctant +function CompassOctant.opposite(_self) end + + + +---@class CompassQuadrant : ReflectReference +--- A compass enum with 4 directions. +--- ```text +--- N (North) +--- ▲ +--- │ +--- │ +--- W (West) ┼─────► E (East) +--- │ +--- │ +--- ▼ +--- S (South) +--- ``` +---@operator unm: CompassQuadrant +CompassQuadrant = {} + +---@param _self CompassQuadrant +---@return CompassQuadrant +function CompassQuadrant.opposite(_self) end + +---@param _self CompassQuadrant +---@param origin Vec2 +--- The starting position +---@param candidate Vec2 +--- The target position to check +---@return boolean +function CompassQuadrant.is_in_direction(_self,origin,candidate) end + +---@param _self CompassQuadrant +---@return CompassQuadrant +function CompassQuadrant.neg(_self) end + +---@param _self CompassQuadrant +---@param other CompassQuadrant +---@return boolean +function CompassQuadrant.__eq(_self,other) end + +---@param _self CompassQuadrant +---@param other CompassQuadrant +---@return boolean +function CompassQuadrant.eq(_self,other) end + +---@param _self CompassQuadrant +---@return nil +function CompassQuadrant.assert_receiver_is_total_eq(_self) end + +---@param _self CompassQuadrant +---@return integer +function CompassQuadrant.to_index(_self) end + +---@param _self CompassQuadrant +---@return CompassQuadrant +function CompassQuadrant.clone(_self) end + + + +---@class EaseFunction : ReflectReference +--- Curve functions over the [unit interval], commonly used for easing transitions. +--- +--- `EaseFunction` can be used on its own to interpolate between `0.0` and `1.0`. +--- It can also be combined with [`EasingCurve`] to interpolate between other +--- intervals and types, including vectors and rotations. +--- +--- # Example +--- +--- [`sample`] the smoothstep function at various points. This will return `None` +--- if the parameter is outside the unit interval. +--- +--- ``` +--- # use bevy_math::prelude::*; +--- let f = EaseFunction::SmoothStep; +--- +--- assert_eq!(f.sample(-1.0), None); +--- assert_eq!(f.sample(0.0), Some(0.0)); +--- assert_eq!(f.sample(0.5), Some(0.5)); +--- assert_eq!(f.sample(1.0), Some(1.0)); +--- assert_eq!(f.sample(2.0), None); +--- ``` +--- +--- [`sample_clamped`] will clamp the parameter to the unit interval, so it +--- always returns a value. +--- +--- ``` +--- # use bevy_math::prelude::*; +--- # let f = EaseFunction::SmoothStep; +--- assert_eq!(f.sample_clamped(-1.0), 0.0); +--- assert_eq!(f.sample_clamped(0.0), 0.0); +--- assert_eq!(f.sample_clamped(0.5), 0.5); +--- assert_eq!(f.sample_clamped(1.0), 1.0); +--- assert_eq!(f.sample_clamped(2.0), 1.0); +--- ``` +--- +--- [`sample`]: EaseFunction::sample +--- [`sample_clamped`]: EaseFunction::sample_clamped +--- [unit interval]: `Interval::UNIT` +EaseFunction = {} + +---@param _self EaseFunction +---@return EaseFunction +function EaseFunction.clone(_self) end + +---@param _self EaseFunction +---@param other EaseFunction +---@return boolean +function EaseFunction.__eq(_self,other) end + +---@param _self EaseFunction +---@param other EaseFunction +---@return boolean +function EaseFunction.eq(_self,other) end + + + +---@class JumpAt : ReflectReference +--- Configuration options for the [`EaseFunction::Steps`] curves. This closely replicates the +--- [CSS step function specification]. +--- +--- [CSS step function specification]: https://developer.mozilla.org/en-US/docs/Web/CSS/easing-function/steps#description +JumpAt = {} + +---@param _self JumpAt +---@return nil +function JumpAt.assert_receiver_is_total_eq(_self) end + +---@param _self JumpAt +---@param other JumpAt +---@return boolean +function JumpAt.__eq(_self,other) end + +---@param _self JumpAt +---@param other JumpAt +---@return boolean +function JumpAt.eq(_self,other) end + +---@param _self JumpAt +---@return JumpAt +function JumpAt.clone(_self) end + + + +---@class Interval : ReflectReference +--- A nonempty closed interval, possibly unbounded in either direction. +--- +--- In other words, the interval may stretch all the way to positive or negative infinity, but it +--- will always have some nonempty interior. +---@field start ? number +---@field end ? number +Interval = {} + +---@param _self Interval +---@return boolean +function Interval.has_finite_start(_self) end + +---@param _self Interval +---@return Interval +function Interval.clone(_self) end + + +---@param _self Interval +---@return number +function Interval.start(_self) end + +---@param _self Interval +---@param other Interval +---@return boolean +function Interval.contains_interval(_self,other) end + +---@param _self Interval +---@param other Interval +---@return boolean +function Interval.__eq(_self,other) end + +---@param _self Interval +---@param other Interval +---@return boolean +function Interval.eq(_self,other) end + +---@param _self Interval +---@return boolean +function Interval.is_bounded(_self) end + +---@param _self Interval +---@param value number +---@return number +function Interval.clamp(_self,value) end + +---@param _self Interval +---@return boolean +function Interval.has_finite_end(_self) end + +---@param _self Interval +---@return number +function Interval.length(_self) end + +---@param _self Interval +---@param item number +---@return boolean +function Interval.contains(_self,item) end + + + +---@class Dir2 : ReflectReference +--- A normalized vector pointing in a direction in 2D space +---@field [1] Vec2 +---@operator unm: Dir2 +---@operator mul(number): Vec2 +Dir2 = {} + +---@param _self Dir2 +---@return Rot2 +function Dir2.rotation_from_x(_self) end + +---@param value Vec2 +---@return Dir2 +function Dir2.new_unchecked(value) end + +---@param _self Dir2 +---@param other Dir2 +---@return boolean +function Dir2.__eq(_self,other) end + +---@param _self Dir2 +---@param other Dir2 +---@return boolean +function Dir2.eq(_self,other) end + +---@param _self Dir2 +---@param rhs Dir2 +---@param s number +---@return Dir2 +function Dir2.slerp(_self,rhs,s) end + +---@param _self Dir2 +---@return Rot2 +function Dir2.rotation_to_x(_self) end + +---@param _self Dir2 +---@return Rot2 +function Dir2.rotation_from_y(_self) end + +---@param _self Dir2 +---@return Rot2 +function Dir2.rotation_to_y(_self) end + +---@param _self Dir2 +---@return Dir2 +function Dir2.neg(_self) end + +---@param _self Dir2 +---@param other Dir2 +---@return Rot2 +function Dir2.rotation_to(_self,other) end + +---@param _self Dir2 +---@return Dir2 +function Dir2.fast_renormalize(_self) end + +---@param _self Dir2 +---@param rhs number +---@return Vec2 +function Dir2.mul(_self,rhs) end + +---@param _self Dir2 +---@return Vec2 +function Dir2.as_vec2(_self) end + +---@param _self Dir2 +---@return Dir2 +function Dir2.clone(_self) end + +---@param x number +---@param y number +---@return Dir2 +function Dir2.from_xy_unchecked(x,y) end + +---@param _self Dir2 +---@param other Dir2 +---@return Rot2 +function Dir2.rotation_from(_self,other) end + + + +---@class Dir3 : ReflectReference +--- A normalized vector pointing in a direction in 3D space +---@field [1] Vec3 +---@operator unm: Dir3 +---@operator mul(number): Vec3 +Dir3 = {} + +---@param value Vec3 +---@return Dir3 +function Dir3.new_unchecked(value) end + +---@param _self Dir3 +---@return Dir3 +function Dir3.neg(_self) end + +---@param _self Dir3 +---@param other Dir3 +---@return boolean +function Dir3.__eq(_self,other) end + +---@param _self Dir3 +---@param other Dir3 +---@return boolean +function Dir3.eq(_self,other) end + +---@param x number +---@param y number +---@param z number +---@return Dir3 +function Dir3.from_xyz_unchecked(x,y,z) end + +---@param _self Dir3 +---@return Dir3 +function Dir3.fast_renormalize(_self) end + +---@param _self Dir3 +---@return Dir3 +function Dir3.clone(_self) end + +---@param _self Dir3 +---@param rhs Dir3 +---@param s number +---@return Dir3 +function Dir3.slerp(_self,rhs,s) end + +---@param _self Dir3 +---@return Vec3 +function Dir3.as_vec3(_self) end + +---@param _self Dir3 +---@param rhs number +---@return Vec3 +function Dir3.mul(_self,rhs) end + + + +---@class Dir3A : ReflectReference +--- A normalized SIMD vector pointing in a direction in 3D space. +--- +--- This type stores a 16 byte aligned [`Vec3A`]. +--- This may or may not be faster than [`Dir3`]: make sure to benchmark! +---@field [1] Vec3A +---@operator mul(number): Vec3A +---@operator unm: Dir3A +Dir3A = {} + +---@param x number +---@param y number +---@param z number +---@return Dir3A +function Dir3A.from_xyz_unchecked(x,y,z) end + +---@param _self Dir3A +---@param other Dir3A +---@return boolean +function Dir3A.__eq(_self,other) end + +---@param _self Dir3A +---@param other Dir3A +---@return boolean +function Dir3A.eq(_self,other) end + +---@param _self Dir3A +---@param rhs number +---@return Vec3A +function Dir3A.mul(_self,rhs) end + +---@param _self Dir3A +---@return Dir3A +function Dir3A.fast_renormalize(_self) end + +---@param value Vec3A +---@return Dir3A +function Dir3A.new_unchecked(value) end + +---@param _self Dir3A +---@return Vec3A +function Dir3A.as_vec3a(_self) end + +---@param _self Dir3A +---@return Dir3A +function Dir3A.clone(_self) end + +---@param _self Dir3A +---@return Dir3A +function Dir3A.neg(_self) end + +---@param _self Dir3A +---@param rhs Dir3A +---@param s number +---@return Dir3A +function Dir3A.slerp(_self,rhs,s) end + + + +---@class Dir4 : ReflectReference +--- A normalized vector pointing in a direction in 4D space +---@field [1] Vec4 +---@operator mul(number): Vec4 +---@operator unm: Dir4 +Dir4 = {} + +---@param _self Dir4 +---@param rhs number +---@return Vec4 +function Dir4.mul(_self,rhs) end + +---@param value Vec4 +---@return Dir4 +function Dir4.new_unchecked(value) end + +---@param _self Dir4 +---@return Dir4 +function Dir4.clone(_self) end + +---@param _self Dir4 +---@return Dir4 +function Dir4.fast_renormalize(_self) end + +---@param _self Dir4 +---@param other Dir4 +---@return boolean +function Dir4.__eq(_self,other) end + +---@param _self Dir4 +---@param other Dir4 +---@return boolean +function Dir4.eq(_self,other) end + +---@param _self Dir4 +---@return Dir4 +function Dir4.neg(_self) end + +---@param _self Dir4 +---@return Vec4 +function Dir4.as_vec4(_self) end + +---@param x number +---@param y number +---@param z number +---@param w number +---@return Dir4 +function Dir4.from_xyzw_unchecked(x,y,z,w) end + + + +---@class FloatOrd : ReflectReference +--- A wrapper for floats that implements [`Ord`], [`Eq`], and [`Hash`] traits. +--- +--- This is a work around for the fact that the IEEE 754-2008 standard, +--- implemented by Rust's [`f32`] type, +--- doesn't define an ordering for [`NaN`](f32::NAN), +--- and `NaN` is not considered equal to any other `NaN`. +--- +--- Wrapping a float with `FloatOrd` breaks conformance with the standard +--- by sorting `NaN` as less than all other numbers and equal to any other `NaN`. +---@field [1] number +---@operator unm: FloatOrd +FloatOrd = {} + +---@param _self FloatOrd +---@param other FloatOrd +---@return boolean +function FloatOrd.le(_self,other) end + +---@param _self FloatOrd +---@param other FloatOrd +---@return boolean +function FloatOrd.ge(_self,other) end + +---@param _self FloatOrd +---@param other FloatOrd +---@return boolean +function FloatOrd.__eq(_self,other) end + +---@param _self FloatOrd +---@param other FloatOrd +---@return boolean +function FloatOrd.eq(_self,other) end + +---@param _self FloatOrd +---@param other FloatOrd +---@return boolean +function FloatOrd.__lt(_self,other) end + +---@param _self FloatOrd +---@param other FloatOrd +---@return boolean +function FloatOrd.lt(_self,other) end + +---@param _self FloatOrd +---@param other FloatOrd +---@return boolean +function FloatOrd.gt(_self,other) end + +---@param _self FloatOrd +---@return FloatOrd +function FloatOrd.clone(_self) end + +---@param _self FloatOrd +---@return FloatOrd +function FloatOrd.neg(_self) end + + + +---@class Isometry2d : ReflectReference +--- An isometry in two dimensions, representing a rotation followed by a translation. +--- This can often be useful for expressing relative positions and transformations from one position to another. +--- +--- In particular, this type represents a distance-preserving transformation known as a *rigid motion* or a *direct motion*, +--- and belongs to the special [Euclidean group] SE(2). This includes translation and rotation, but excludes reflection. +--- +--- For the three-dimensional version, see [`Isometry3d`]. +--- +--- [Euclidean group]: https://en.wikipedia.org/wiki/Euclidean_group +--- +--- # Example +--- +--- Isometries can be created from a given translation and rotation: +--- +--- ``` +--- # use bevy_math::{Isometry2d, Rot2, Vec2}; +--- # +--- let iso = Isometry2d::new(Vec2::new(2.0, 1.0), Rot2::degrees(90.0)); +--- ``` +--- +--- Or from separate parts: +--- +--- ``` +--- # use bevy_math::{Isometry2d, Rot2, Vec2}; +--- # +--- let iso1 = Isometry2d::from_translation(Vec2::new(2.0, 1.0)); +--- let iso2 = Isometry2d::from_rotation(Rot2::degrees(90.0)); +--- ``` +--- +--- The isometries can be used to transform points: +--- +--- ``` +--- # use approx::assert_abs_diff_eq; +--- # use bevy_math::{Isometry2d, Rot2, Vec2}; +--- # +--- let iso = Isometry2d::new(Vec2::new(2.0, 1.0), Rot2::degrees(90.0)); +--- let point = Vec2::new(4.0, 4.0); +--- +--- // These are equivalent +--- let result = iso.transform_point(point); +--- let result = iso * point; +--- +--- assert_eq!(result, Vec2::new(-2.0, 5.0)); +--- ``` +--- +--- Isometries can also be composed together: +--- +--- ``` +--- # use bevy_math::{Isometry2d, Rot2, Vec2}; +--- # +--- # let iso = Isometry2d::new(Vec2::new(2.0, 1.0), Rot2::degrees(90.0)); +--- # let iso1 = Isometry2d::from_translation(Vec2::new(2.0, 1.0)); +--- # let iso2 = Isometry2d::from_rotation(Rot2::degrees(90.0)); +--- # +--- assert_eq!(iso1 * iso2, iso); +--- ``` +--- +--- One common operation is to compute an isometry representing the relative positions of two objects +--- for things like intersection tests. This can be done with an inverse transformation: +--- +--- ``` +--- # use bevy_math::{Isometry2d, Rot2, Vec2}; +--- # +--- let circle_iso = Isometry2d::from_translation(Vec2::new(2.0, 1.0)); +--- let rectangle_iso = Isometry2d::from_rotation(Rot2::degrees(90.0)); +--- +--- // Compute the relative position and orientation between the two shapes +--- let relative_iso = circle_iso.inverse() * rectangle_iso; +--- +--- // Or alternatively, to skip an extra rotation operation: +--- let relative_iso = circle_iso.inverse_mul(rectangle_iso); +--- ``` +---@field rotation ? Rot2 +---@field translation ? Vec2 +---@operator mul(Vec2): Vec2 +---@operator mul(Isometry2d): Isometry2d +---@operator mul(Dir2): Dir2 +Isometry2d = {} + +---@param translation Vec2 +---@param rotation Rot2 +---@return Isometry2d +function Isometry2d.new(translation,rotation) end + +---@param _self Isometry2d +---@param point Vec2 +---@return Vec2 +function Isometry2d.transform_point(_self,point) end + +---@param _self Isometry2d +---@return Isometry2d +function Isometry2d.clone(_self) end + +---@param p1 Isometry2d +---@param p2 Vec2 +---@return Vec2 +function Isometry2d.mul(p1,p2) end + +---@param _self Isometry2d +---@return Isometry2d +function Isometry2d.inverse(_self) end + +---@param x number +---@param y number +---@return Isometry2d +function Isometry2d.from_xy(x,y) end + +---@param p1 Isometry2d +---@param p2 Isometry2d +---@return Isometry2d +function Isometry2d.mul(p1,p2) end + +---@param translation Vec2 +---@return Isometry2d +function Isometry2d.from_translation(translation) end + +---@param _self Isometry2d +---@param rhs Dir2 +---@return Dir2 +function Isometry2d.mul(_self,rhs) end + +---@param rotation Rot2 +---@return Isometry2d +function Isometry2d.from_rotation(rotation) end + +---@param _self Isometry2d +---@param rhs Isometry2d +---@return Isometry2d +function Isometry2d.inverse_mul(_self,rhs) end + +---@param _self Isometry2d +---@param point Vec2 +---@return Vec2 +function Isometry2d.inverse_transform_point(_self,point) end + +---@param _self Isometry2d +---@param other Isometry2d +---@return boolean +function Isometry2d.__eq(_self,other) end + +---@param _self Isometry2d +---@param other Isometry2d +---@return boolean +function Isometry2d.eq(_self,other) end + + + +---@class Isometry3d : ReflectReference +--- An isometry in three dimensions, representing a rotation followed by a translation. +--- This can often be useful for expressing relative positions and transformations from one position to another. +--- +--- In particular, this type represents a distance-preserving transformation known as a *rigid motion* or a *direct motion*, +--- and belongs to the special [Euclidean group] SE(3). This includes translation and rotation, but excludes reflection. +--- +--- For the two-dimensional version, see [`Isometry2d`]. +--- +--- [Euclidean group]: https://en.wikipedia.org/wiki/Euclidean_group +--- +--- # Example +--- +--- Isometries can be created from a given translation and rotation: +--- +--- ``` +--- # use bevy_math::{Isometry3d, Quat, Vec3}; +--- # use std::f32::consts::FRAC_PI_2; +--- # +--- let iso = Isometry3d::new(Vec3::new(2.0, 1.0, 3.0), Quat::from_rotation_z(FRAC_PI_2)); +--- ``` +--- +--- Or from separate parts: +--- +--- ``` +--- # use bevy_math::{Isometry3d, Quat, Vec3}; +--- # use std::f32::consts::FRAC_PI_2; +--- # +--- let iso1 = Isometry3d::from_translation(Vec3::new(2.0, 1.0, 3.0)); +--- let iso2 = Isometry3d::from_rotation(Quat::from_rotation_z(FRAC_PI_2)); +--- ``` +--- +--- The isometries can be used to transform points: +--- +--- ``` +--- # use approx::assert_relative_eq; +--- # use bevy_math::{Isometry3d, Quat, Vec3}; +--- # use std::f32::consts::FRAC_PI_2; +--- # +--- let iso = Isometry3d::new(Vec3::new(2.0, 1.0, 3.0), Quat::from_rotation_z(FRAC_PI_2)); +--- let point = Vec3::new(4.0, 4.0, 4.0); +--- +--- // These are equivalent +--- let result = iso.transform_point(point); +--- let result = iso * point; +--- +--- assert_relative_eq!(result, Vec3::new(-2.0, 5.0, 7.0)); +--- ``` +--- +--- Isometries can also be composed together: +--- +--- ``` +--- # use bevy_math::{Isometry3d, Quat, Vec3}; +--- # use std::f32::consts::FRAC_PI_2; +--- # +--- # let iso = Isometry3d::new(Vec3::new(2.0, 1.0, 3.0), Quat::from_rotation_z(FRAC_PI_2)); +--- # let iso1 = Isometry3d::from_translation(Vec3::new(2.0, 1.0, 3.0)); +--- # let iso2 = Isometry3d::from_rotation(Quat::from_rotation_z(FRAC_PI_2)); +--- # +--- assert_eq!(iso1 * iso2, iso); +--- ``` +--- +--- One common operation is to compute an isometry representing the relative positions of two objects +--- for things like intersection tests. This can be done with an inverse transformation: +--- +--- ``` +--- # use bevy_math::{Isometry3d, Quat, Vec3}; +--- # use std::f32::consts::FRAC_PI_2; +--- # +--- let sphere_iso = Isometry3d::from_translation(Vec3::new(2.0, 1.0, 3.0)); +--- let cuboid_iso = Isometry3d::from_rotation(Quat::from_rotation_z(FRAC_PI_2)); +--- +--- // Compute the relative position and orientation between the two shapes +--- let relative_iso = sphere_iso.inverse() * cuboid_iso; +--- +--- // Or alternatively, to skip an extra rotation operation: +--- let relative_iso = sphere_iso.inverse_mul(cuboid_iso); +--- ``` +---@field rotation ? Quat +---@field translation ? Vec3A +---@operator mul(Vec3): Vec3 +---@operator mul(Dir3): Dir3 +---@operator mul(Isometry3d): Isometry3d +---@operator mul(Vec3A): Vec3A +Isometry3d = {} + +---@param _self Isometry3d +---@param other Isometry3d +---@return boolean +function Isometry3d.__eq(_self,other) end + +---@param _self Isometry3d +---@param other Isometry3d +---@return boolean +function Isometry3d.eq(_self,other) end + +---@param p1 Isometry3d +---@param p2 Vec3 +---@return Vec3 +function Isometry3d.mul(p1,p2) end + +---@param x number +---@param y number +---@param z number +---@return Isometry3d +function Isometry3d.from_xyz(x,y,z) end + +---@param _self Isometry3d +---@param rhs Isometry3d +---@return Isometry3d +function Isometry3d.inverse_mul(_self,rhs) end + +---@param _self Isometry3d +---@param rhs Dir3 +---@return Dir3 +function Isometry3d.mul(_self,rhs) end + +---@param p1 Isometry3d +---@param p2 Isometry3d +---@return Isometry3d +function Isometry3d.mul(p1,p2) end + +---@param p1 Isometry3d +---@param p2 Vec3A +---@return Vec3A +function Isometry3d.mul(p1,p2) end + +---@param _self Isometry3d +---@return Isometry3d +function Isometry3d.clone(_self) end + +---@param rotation Quat +---@return Isometry3d +function Isometry3d.from_rotation(rotation) end + +---@param _self Isometry3d +---@return Isometry3d +function Isometry3d.inverse(_self) end + + + +---@class Annulus : ReflectReference +--- A primitive shape formed by the region between two circles, also known as a ring. +---@field inner_circle ? Circle +---@field outer_circle ? Circle +Annulus = {} + +---@param _self Annulus +---@return number +function Annulus.thickness(_self) end + +---@param _self Annulus +---@return Annulus +function Annulus.clone(_self) end + +---@param inner_radius number +---@param outer_radius number +---@return Annulus +function Annulus.new(inner_radius,outer_radius) end + +---@param _self Annulus +---@return number +function Annulus.diameter(_self) end + +---@param _self Annulus +---@param other Annulus +---@return boolean +function Annulus.__eq(_self,other) end + +---@param _self Annulus +---@param other Annulus +---@return boolean +function Annulus.eq(_self,other) end + +---@param _self Annulus +---@param point Vec2 +---@return Vec2 +function Annulus.closest_point(_self,point) end + + + +---@class Arc2d : ReflectReference +--- A primitive representing an arc between two points on a circle. +--- +--- An arc has no area. +--- If you want to include the portion of a circle's area swept out by the arc, +--- use the pie-shaped [`CircularSector`]. +--- If you want to include only the space inside the convex hull of the arc, +--- use the bowl-shaped [`CircularSegment`]. +--- +--- The arc is drawn starting from [`Vec2::Y`], extending by `half_angle` radians on +--- either side. The center of the circle is the origin [`Vec2::ZERO`]. Note that this +--- means that the origin may not be within the `Arc2d`'s convex hull. +--- +--- **Warning:** Arcs with negative angle or radius, or with angle greater than an entire circle, are not officially supported. +--- It is recommended to normalize arcs to have an angle in [0, 2π]. +---@field radius ? number +---@field half_angle ? number +Arc2d = {} + +---@param _self Arc2d +---@return Arc2d +function Arc2d.clone(_self) end + +---@param _self Arc2d +---@return number +function Arc2d.half_chord_length(_self) end + +---@param _self Arc2d +---@return Vec2 +function Arc2d.right_endpoint(_self) end + +---@param _self Arc2d +---@return Vec2 +function Arc2d.chord_midpoint(_self) end + +---@param radius number +---@param angle number +---@return Arc2d +function Arc2d.from_radians(radius,angle) end + +---@param _self Arc2d +---@return Vec2 +function Arc2d.left_endpoint(_self) end + +---@param radius number +---@param fraction number +---@return Arc2d +function Arc2d.from_turns(radius,fraction) end + +---@param _self Arc2d +---@return number +function Arc2d.apothem(_self) end + +---@param _self Arc2d +---@return boolean +function Arc2d.is_minor(_self) end + +---@param radius number +---@param half_angle number +---@return Arc2d +function Arc2d.new(radius,half_angle) end + +---@param _self Arc2d +---@return number +function Arc2d.angle(_self) end + +---@param _self Arc2d +---@return number +function Arc2d.chord_length(_self) end + +---@param _self Arc2d +---@param other Arc2d +---@return boolean +function Arc2d.__eq(_self,other) end + +---@param _self Arc2d +---@param other Arc2d +---@return boolean +function Arc2d.eq(_self,other) end + +---@param _self Arc2d +---@return boolean +function Arc2d.is_major(_self) end + +---@param _self Arc2d +---@return Vec2 +function Arc2d.midpoint(_self) end + +---@param _self Arc2d +---@return number +function Arc2d.sagitta(_self) end + +---@param radius number +---@param angle number +---@return Arc2d +function Arc2d.from_degrees(radius,angle) end + +---@param _self Arc2d +---@return number +function Arc2d.length(_self) end + + + +---@class Capsule2d : ReflectReference +--- A 2D capsule primitive, also known as a stadium or pill shape. +--- +--- A two-dimensional capsule is defined as a neighborhood of points at a distance (radius) from a line +---@field radius ? number +---@field half_length ? number +Capsule2d = {} + +---@param radius number +---@param length number +---@return Capsule2d +function Capsule2d.new(radius,length) end + +---@param _self Capsule2d +---@return Capsule2d +function Capsule2d.clone(_self) end + +---@param _self Capsule2d +---@param other Capsule2d +---@return boolean +function Capsule2d.__eq(_self,other) end + +---@param _self Capsule2d +---@param other Capsule2d +---@return boolean +function Capsule2d.eq(_self,other) end + +---@param _self Capsule2d +---@return Rectangle +function Capsule2d.to_inner_rectangle(_self) end + + + +---@class Circle : ReflectReference +--- A circle primitive, representing the set of points some distance from the origin +---@field radius ? number +Circle = {} + +---@param _self Circle +---@return Circle +function Circle.clone(_self) end + +---@param _self Circle +---@return number +function Circle.diameter(_self) end + +---@param radius number +---@return Circle +function Circle.new(radius) end + +---@param _self Circle +---@param other Circle +---@return boolean +function Circle.__eq(_self,other) end + +---@param _self Circle +---@param other Circle +---@return boolean +function Circle.eq(_self,other) end + +---@param _self Circle +---@param point Vec2 +---@return Vec2 +function Circle.closest_point(_self,point) end + + + +---@class CircularSector : ReflectReference +--- A primitive representing a circular sector: a pie slice of a circle. +--- +--- The segment is positioned so that it always includes [`Vec2::Y`] and is vertically symmetrical. +--- To orient the sector differently, apply a rotation. +--- The sector is drawn with the center of its circle at the origin [`Vec2::ZERO`]. +--- +--- **Warning:** Circular sectors with negative angle or radius, or with angle greater than an entire circle, are not officially supported. +--- We recommend normalizing circular sectors to have an angle in [0, 2π]. +---@field arc ? Arc2d +CircularSector = {} + +---@param _self CircularSector +---@return number +function CircularSector.arc_length(_self) end + +---@param radius number +---@param angle number +---@return CircularSector +function CircularSector.new(radius,angle) end + +---@param _self CircularSector +---@return number +function CircularSector.radius(_self) end + +---@param _self CircularSector +---@param other CircularSector +---@return boolean +function CircularSector.__eq(_self,other) end + +---@param _self CircularSector +---@param other CircularSector +---@return boolean +function CircularSector.eq(_self,other) end + +---@param _self CircularSector +---@return number +function CircularSector.half_chord_length(_self) end + +---@param radius number +---@param angle number +---@return CircularSector +function CircularSector.from_radians(radius,angle) end + +---@param radius number +---@param fraction number +---@return CircularSector +function CircularSector.from_turns(radius,fraction) end + +---@param _self CircularSector +---@return number +function CircularSector.sagitta(_self) end + +---@param _self CircularSector +---@return number +function CircularSector.chord_length(_self) end + +---@param _self CircularSector +---@return Vec2 +function CircularSector.chord_midpoint(_self) end + +---@param _self CircularSector +---@return CircularSector +function CircularSector.clone(_self) end + +---@param radius number +---@param angle number +---@return CircularSector +function CircularSector.from_degrees(radius,angle) end + +---@param _self CircularSector +---@return number +function CircularSector.apothem(_self) end + +---@param _self CircularSector +---@return number +function CircularSector.angle(_self) end + +---@param _self CircularSector +---@return number +function CircularSector.half_angle(_self) end + + + +---@class CircularSegment : ReflectReference +--- A primitive representing a circular segment: +--- the area enclosed by the arc of a circle and its chord (the line between its endpoints). +--- +--- The segment is drawn starting from [`Vec2::Y`], extending equally on either side. +--- To orient the segment differently, apply a rotation. +--- The segment is drawn with the center of its circle at the origin [`Vec2::ZERO`]. +--- When positioning a segment, the [`apothem`](Self::apothem) function may be particularly useful. +--- +--- **Warning:** Circular segments with negative angle or radius, or with angle greater than an entire circle, are not officially supported. +--- We recommend normalizing circular segments to have an angle in [0, 2π]. +---@field arc ? Arc2d +CircularSegment = {} + +---@param radius number +---@param fraction number +---@return CircularSegment +function CircularSegment.from_turns(radius,fraction) end + +---@param _self CircularSegment +---@return number +function CircularSegment.angle(_self) end + +---@param _self CircularSegment +---@return number +function CircularSegment.half_chord_length(_self) end + +---@param radius number +---@param angle number +---@return CircularSegment +function CircularSegment.from_degrees(radius,angle) end + +---@param _self CircularSegment +---@return number +function CircularSegment.arc_length(_self) end + +---@param _self CircularSegment +---@return number +function CircularSegment.radius(_self) end + +---@param _self CircularSegment +---@return number +function CircularSegment.sagitta(_self) end + +---@param radius number +---@param half_angle number +---@return CircularSegment +function CircularSegment.new(radius,half_angle) end + +---@param _self CircularSegment +---@return number +function CircularSegment.half_angle(_self) end + +---@param _self CircularSegment +---@return number +function CircularSegment.apothem(_self) end + +---@param _self CircularSegment +---@return Vec2 +function CircularSegment.chord_midpoint(_self) end + +---@param _self CircularSegment +---@return CircularSegment +function CircularSegment.clone(_self) end + +---@param _self CircularSegment +---@return number +function CircularSegment.chord_length(_self) end + +---@param _self CircularSegment +---@param other CircularSegment +---@return boolean +function CircularSegment.__eq(_self,other) end + +---@param _self CircularSegment +---@param other CircularSegment +---@return boolean +function CircularSegment.eq(_self,other) end + +---@param radius number +---@param angle number +---@return CircularSegment +function CircularSegment.from_radians(radius,angle) end + + + +---@class ConvexPolygon : ReflectReference +--- A convex polygon with `N` vertices. +---@field vertices ? Vec2[] +ConvexPolygon = {} + +---@param _self ConvexPolygon +---@param other ConvexPolygon +---@return boolean +function ConvexPolygon.__eq(_self,other) end + +---@param _self ConvexPolygon +---@param other ConvexPolygon +---@return boolean +function ConvexPolygon.eq(_self,other) end + +---@param _self ConvexPolygon +---@return ConvexPolygon +function ConvexPolygon.clone(_self) end + + + +---@class Ellipse : ReflectReference +--- An ellipse primitive, which is like a circle, but the width and height can be different +--- +--- Ellipse does not implement [`Inset`] as concentric ellipses do not have parallel curves: +--- if the ellipse is not a circle, the inset shape is not actually an ellipse (although it may look like one) but can also be a lens-like shape. +---@field half_size ? Vec2 +Ellipse = {} + +---@param _self Ellipse +---@return number +function Ellipse.eccentricity(_self) end + +---@param _self Ellipse +---@return number +function Ellipse.semi_minor(_self) end + +---@param _self Ellipse +---@return Ellipse +function Ellipse.clone(_self) end + +---@param _self Ellipse +---@return number +function Ellipse.semi_major(_self) end + +---@param _self Ellipse +---@param other Ellipse +---@return boolean +function Ellipse.__eq(_self,other) end + +---@param _self Ellipse +---@param other Ellipse +---@return boolean +function Ellipse.eq(_self,other) end + +---@param size Vec2 +---@return Ellipse +function Ellipse.from_size(size) end + +---@param half_width number +---@param half_height number +---@return Ellipse +function Ellipse.new(half_width,half_height) end + +---@param _self Ellipse +---@return number +function Ellipse.focal_length(_self) end + + + +---@class Line2d : ReflectReference +--- An infinite line going through the origin along a direction in 2D space. +--- +--- For a finite line: [`Segment2d`] +---@field direction ? Dir2 +Line2d = {} + +---@param _self Line2d +---@return Line2d +function Line2d.clone(_self) end + +---@param _self Line2d +---@param other Line2d +---@return boolean +function Line2d.__eq(_self,other) end + +---@param _self Line2d +---@param other Line2d +---@return boolean +function Line2d.eq(_self,other) end + + + +---@class Plane2d : ReflectReference +--- An unbounded plane in 2D space. It forms a separating surface through the origin, +--- stretching infinitely far +---@field normal ? Dir2 +Plane2d = {} + +---@param _self Plane2d +---@param other Plane2d +---@return boolean +function Plane2d.__eq(_self,other) end + +---@param _self Plane2d +---@param other Plane2d +---@return boolean +function Plane2d.eq(_self,other) end + +---@param _self Plane2d +---@return Plane2d +function Plane2d.clone(_self) end + +---@param normal Vec2 +---@return Plane2d +function Plane2d.new(normal) end + + + +---@class Polygon : ReflectReference +--- A polygon with N vertices. +---@field vertices ? Vec2[] +Polygon = {} + +---@param _self Polygon +---@param other Polygon +---@return boolean +function Polygon.__eq(_self,other) end + +---@param _self Polygon +---@param other Polygon +---@return boolean +function Polygon.eq(_self,other) end + +---@param _self Polygon +---@return Polygon +function Polygon.clone(_self) end + +---@param _self Polygon +---@return boolean +function Polygon.is_simple(_self) end + + + +---@class Polyline2d : ReflectReference +--- A series of connected line segments in 2D space. +---@field vertices ? Vec2[] +Polyline2d = {} + +---@param _self Polyline2d +---@param other Polyline2d +---@return boolean +function Polyline2d.__eq(_self,other) end + +---@param _self Polyline2d +---@param other Polyline2d +---@return boolean +function Polyline2d.eq(_self,other) end + +---@param _self Polyline2d +---@return Polyline2d +function Polyline2d.clone(_self) end + +---@param start Vec2 +---@param _end Vec2 +---@param subdivisions integer +---@return Polyline2d +function Polyline2d.with_subdivisions(start,_end,subdivisions) end + + + +---@class Rectangle : ReflectReference +--- A rectangle primitive, which is like a square, except that the width and height can be different +---@field half_size ? Vec2 +Rectangle = {} + +---@param _self Rectangle +---@param point Vec2 +---@return Vec2 +function Rectangle.closest_point(_self,point) end + +---@param length number +---@return Rectangle +function Rectangle.from_length(length) end + +---@param _self Rectangle +---@return Rectangle +function Rectangle.clone(_self) end + +---@param _self Rectangle +---@return Vec2 +function Rectangle.size(_self) end + +---@param _self Rectangle +---@param other Rectangle +---@return boolean +function Rectangle.__eq(_self,other) end + +---@param _self Rectangle +---@param other Rectangle +---@return boolean +function Rectangle.eq(_self,other) end + +---@param size Vec2 +---@return Rectangle +function Rectangle.from_size(size) end + +---@param point1 Vec2 +---@param point2 Vec2 +---@return Rectangle +function Rectangle.from_corners(point1,point2) end + +---@param width number +---@param height number +---@return Rectangle +function Rectangle.new(width,height) end + + + +---@class RegularPolygon : ReflectReference +--- A polygon centered on the origin where all vertices lie on a circle, equally far apart. +---@field circumcircle ? Circle +---@field sides ? integer +RegularPolygon = {} + +---@param _self RegularPolygon +---@return number +function RegularPolygon.internal_angle_degrees(_self) end + +---@param _self RegularPolygon +---@return number +function RegularPolygon.inradius(_self) end + +---@param _self RegularPolygon +---@return number +function RegularPolygon.external_angle_degrees(_self) end + +---@param _self RegularPolygon +---@return number +function RegularPolygon.circumradius(_self) end + +---@param _self RegularPolygon +---@return number +function RegularPolygon.internal_angle_radians(_self) end + +---@param _self RegularPolygon +---@return number +function RegularPolygon.side_length(_self) end + +---@param _self RegularPolygon +---@return number +function RegularPolygon.external_angle_radians(_self) end + +---@param circumradius number +---@param sides integer +---@return RegularPolygon +function RegularPolygon.new(circumradius,sides) end + +---@param _self RegularPolygon +---@return RegularPolygon +function RegularPolygon.clone(_self) end + +---@param _self RegularPolygon +---@param other RegularPolygon +---@return boolean +function RegularPolygon.__eq(_self,other) end + +---@param _self RegularPolygon +---@param other RegularPolygon +---@return boolean +function RegularPolygon.eq(_self,other) end + + + +---@class Rhombus : ReflectReference +--- A rhombus primitive, also known as a diamond shape. +--- A four sided polygon, centered on the origin, where opposite sides are parallel but without +--- requiring right angles. +---@field half_diagonals ? Vec2 +Rhombus = {} + +---@param horizontal_diagonal number +---@param vertical_diagonal number +---@return Rhombus +function Rhombus.new(horizontal_diagonal,vertical_diagonal) end + +---@param _self Rhombus +---@return number +function Rhombus.inradius(_self) end + +---@param _self Rhombus +---@param other Rhombus +---@return boolean +function Rhombus.__eq(_self,other) end + +---@param _self Rhombus +---@param other Rhombus +---@return boolean +function Rhombus.eq(_self,other) end + +---@param _self Rhombus +---@return Rhombus +function Rhombus.clone(_self) end + +---@param inradius number +---@return Rhombus +function Rhombus.from_inradius(inradius) end + +---@param side number +---@return Rhombus +function Rhombus.from_side(side) end + +---@param _self Rhombus +---@return number +function Rhombus.side(_self) end + +---@param _self Rhombus +---@return number +function Rhombus.circumradius(_self) end + +---@param _self Rhombus +---@param point Vec2 +---@return Vec2 +function Rhombus.closest_point(_self,point) end + + + +---@class Segment2d : ReflectReference +--- A line segment defined by two endpoints in 2D space. +---@field vertices ? Vec2[] +Segment2d = {} + +---@param _self Segment2d +---@return Segment2d +function Segment2d.centered(_self) end + +---@param point1 Vec2 +---@param point2 Vec2 +---@return Segment2d +function Segment2d.new(point1,point2) end + +---@param _self Segment2d +---@return Vec2 +function Segment2d.center(_self) end + +---@param _self Segment2d +---@return Segment2d +function Segment2d.reversed(_self) end + +---@param _self Segment2d +---@return Dir2 +function Segment2d.right_normal(_self) end + +---@param _self Segment2d +---@param other Segment2d +---@return boolean +function Segment2d.__eq(_self,other) end + +---@param _self Segment2d +---@param other Segment2d +---@return boolean +function Segment2d.eq(_self,other) end + +---@param _self Segment2d +---@return Vec2 +function Segment2d.scaled_direction(_self) end + +---@param _self Segment2d +---@return number +function Segment2d.length_squared(_self) end + +---@param _self Segment2d +---@return Vec2 +function Segment2d.point1(_self) end + +---@param _self Segment2d +---@param point Vec2 +---@return Vec2 +function Segment2d.closest_point(_self,point) end + +---@param _self Segment2d +---@return Vec2 +function Segment2d.point2(_self) end + +---@param ray Ray2d +---@param length number +---@return Segment2d +function Segment2d.from_ray_and_length(ray,length) end + +---@param _self Segment2d +---@param length number +---@return Segment2d +function Segment2d.resized(_self,length) end + +---@param _self Segment2d +---@return Vec2 +function Segment2d.scaled_right_normal(_self) end + +---@param direction Dir2 +---@param length number +---@return Segment2d +function Segment2d.from_direction_and_length(direction,length) end + +---@param _self Segment2d +---@return Segment2d +function Segment2d.clone(_self) end + +---@param _self Segment2d +---@return Dir2 +function Segment2d.direction(_self) end + +---@param _self Segment2d +---@param rotation Rot2 +---@return Segment2d +function Segment2d.rotated_around_center(_self,rotation) end + +---@param _self Segment2d +---@return number +function Segment2d.length(_self) end + +---@param _self Segment2d +---@param rotation Rot2 +---@return Segment2d +function Segment2d.rotated(_self,rotation) end + +---@param _self Segment2d +---@return Dir2 +function Segment2d.left_normal(_self) end + +---@param _self Segment2d +---@param translation Vec2 +---@return Segment2d +function Segment2d.translated(_self,translation) end + +---@param _self Segment2d +---@return Vec2 +function Segment2d.scaled_left_normal(_self) end + +---@param scaled_direction Vec2 +---@return Segment2d +function Segment2d.from_scaled_direction(scaled_direction) end + +---@param _self Segment2d +---@param rotation Rot2 +---@param point Vec2 +---@return Segment2d +function Segment2d.rotated_around(_self,rotation,point) end + +---@param _self Segment2d +---@return nil +function Segment2d.reverse(_self) end + + + +---@class Triangle2d : ReflectReference +--- A triangle in 2D space +---@field vertices ? Vec2[] +Triangle2d = {} + +---@param a Vec2 +---@param b Vec2 +---@param c Vec2 +---@return Triangle2d +function Triangle2d.new(a,b,c) end + +---@param _self Triangle2d +---@return Triangle2d +function Triangle2d.reversed(_self) end + +---@param _self Triangle2d +---@return boolean +function Triangle2d.is_obtuse(_self) end + +---@param _self Triangle2d +---@return boolean +function Triangle2d.is_acute(_self) end + +---@param _self Triangle2d +---@return boolean +function Triangle2d.is_degenerate(_self) end + +---@param _self Triangle2d +---@param other Triangle2d +---@return boolean +function Triangle2d.__eq(_self,other) end + +---@param _self Triangle2d +---@param other Triangle2d +---@return boolean +function Triangle2d.eq(_self,other) end + +---@param _self Triangle2d +---@return Triangle2d +function Triangle2d.clone(_self) end + +---@param _self Triangle2d +---@return nil +function Triangle2d.reverse(_self) end + + + +---@class Capsule3d : ReflectReference +--- A 3D capsule primitive centered on the origin +--- A three-dimensional capsule is defined as a surface at a distance (radius) from a line +---@field radius ? number +---@field half_length ? number +Capsule3d = {} + +---@param radius number +---@param length number +---@return Capsule3d +function Capsule3d.new(radius,length) end + +---@param _self Capsule3d +---@param other Capsule3d +---@return boolean +function Capsule3d.__eq(_self,other) end + +---@param _self Capsule3d +---@param other Capsule3d +---@return boolean +function Capsule3d.eq(_self,other) end + +---@param _self Capsule3d +---@return Capsule3d +function Capsule3d.clone(_self) end + +---@param _self Capsule3d +---@return Cylinder +function Capsule3d.to_cylinder(_self) end + + + +---@class Cone : ReflectReference +--- A cone primitive centered on the midpoint between the tip of the cone and the center of its base. +--- +--- The cone is oriented with its tip pointing towards the Y axis. +---@field radius ? number +---@field height ? number +Cone = {} + +---@param _self Cone +---@return number +function Cone.slant_height(_self) end + +---@param _self Cone +---@return number +function Cone.base_area(_self) end + +---@param _self Cone +---@return Circle +function Cone.base(_self) end + +---@param radius number +---@param height number +---@return Cone +function Cone.new(radius,height) end + +---@param _self Cone +---@return Cone +function Cone.clone(_self) end + +---@param _self Cone +---@param other Cone +---@return boolean +function Cone.__eq(_self,other) end + +---@param _self Cone +---@param other Cone +---@return boolean +function Cone.eq(_self,other) end + +---@param _self Cone +---@return number +function Cone.lateral_area(_self) end + + + +---@class ConicalFrustum : ReflectReference +--- A conical frustum primitive. +--- A conical frustum can be created +--- by slicing off a section of a cone. +---@field radius_top ? number +---@field radius_bottom ? number +---@field height ? number +ConicalFrustum = {} + +---@param _self ConicalFrustum +---@return number +function ConicalFrustum.slant_height(_self) end + +---@param _self ConicalFrustum +---@return number +function ConicalFrustum.lateral_area(_self) end + +---@param _self ConicalFrustum +---@return number +function ConicalFrustum.bottom_base_area(_self) end + +---@param _self ConicalFrustum +---@return ConicalFrustum +function ConicalFrustum.clone(_self) end + +---@param _self ConicalFrustum +---@return Circle +function ConicalFrustum.bottom_base(_self) end + +---@param _self ConicalFrustum +---@param other ConicalFrustum +---@return boolean +function ConicalFrustum.__eq(_self,other) end + +---@param _self ConicalFrustum +---@param other ConicalFrustum +---@return boolean +function ConicalFrustum.eq(_self,other) end + +---@param _self ConicalFrustum +---@return Circle +function ConicalFrustum.top_base(_self) end + +---@param _self ConicalFrustum +---@return number +function ConicalFrustum.top_base_area(_self) end + + + +---@class Cuboid : ReflectReference +--- A cuboid primitive, which is like a cube, except that the x, y, and z dimensions are not +--- required to be the same. +---@field half_size ? Vec3 +Cuboid = {} + +---@param length number +---@return Cuboid +function Cuboid.from_length(length) end + +---@param size Vec3 +---@return Cuboid +function Cuboid.from_size(size) end + +---@param _self Cuboid +---@return Vec3 +function Cuboid.size(_self) end + +---@param _self Cuboid +---@param point Vec3 +---@return Vec3 +function Cuboid.closest_point(_self,point) end + +---@param _self Cuboid +---@param other Cuboid +---@return boolean +function Cuboid.__eq(_self,other) end + +---@param _self Cuboid +---@param other Cuboid +---@return boolean +function Cuboid.eq(_self,other) end + +---@param x_length number +---@param y_length number +---@param z_length number +---@return Cuboid +function Cuboid.new(x_length,y_length,z_length) end + +---@param point1 Vec3 +---@param point2 Vec3 +---@return Cuboid +function Cuboid.from_corners(point1,point2) end + +---@param _self Cuboid +---@return Cuboid +function Cuboid.clone(_self) end + + + +---@class Cylinder : ReflectReference +--- A cylinder primitive centered on the origin +---@field radius ? number +---@field half_height ? number +Cylinder = {} + +---@param _self Cylinder +---@return Circle +function Cylinder.base(_self) end + +---@param radius number +---@param height number +---@return Cylinder +function Cylinder.new(radius,height) end + +---@param _self Cylinder +---@return number +function Cylinder.base_area(_self) end + +---@param _self Cylinder +---@return number +function Cylinder.lateral_area(_self) end + +---@param _self Cylinder +---@return Cylinder +function Cylinder.clone(_self) end + +---@param _self Cylinder +---@param other Cylinder +---@return boolean +function Cylinder.__eq(_self,other) end + +---@param _self Cylinder +---@param other Cylinder +---@return boolean +function Cylinder.eq(_self,other) end + + + +---@class InfinitePlane3d : ReflectReference +--- An unbounded plane in 3D space. It forms a separating surface through the origin, +--- stretching infinitely far +---@field normal ? Dir3 +InfinitePlane3d = {} + +---@param _self InfinitePlane3d +---@return InfinitePlane3d +function InfinitePlane3d.clone(_self) end + +---@param _self InfinitePlane3d +---@param origin Vec3 +---@return Isometry3d +function InfinitePlane3d.isometry_into_xy(_self,origin) end + +---@param _self InfinitePlane3d +---@param other InfinitePlane3d +---@return boolean +function InfinitePlane3d.__eq(_self,other) end + +---@param _self InfinitePlane3d +---@param other InfinitePlane3d +---@return boolean +function InfinitePlane3d.eq(_self,other) end + +---@param _self InfinitePlane3d +---@param origin Vec3 +---@return Isometry3d +function InfinitePlane3d.isometry_from_xy(_self,origin) end + + + +---@class Line3d : ReflectReference +--- An infinite line going through the origin along a direction in 3D space. +--- +--- For a finite line: [`Segment3d`] +---@field direction ? Dir3 +Line3d = {} + +---@param _self Line3d +---@return Line3d +function Line3d.clone(_self) end + +---@param _self Line3d +---@param other Line3d +---@return boolean +function Line3d.__eq(_self,other) end + +---@param _self Line3d +---@param other Line3d +---@return boolean +function Line3d.eq(_self,other) end + + + +---@class Plane3d : ReflectReference +--- A bounded plane in 3D space. It forms a surface starting from the origin with a defined height and width. +---@field normal ? Dir3 +---@field half_size ? Vec2 +Plane3d = {} + +---@param _self Plane3d +---@param other Plane3d +---@return boolean +function Plane3d.__eq(_self,other) end + +---@param _self Plane3d +---@param other Plane3d +---@return boolean +function Plane3d.eq(_self,other) end + +---@param _self Plane3d +---@return Plane3d +function Plane3d.clone(_self) end + +---@param normal Vec3 +---@param half_size Vec2 +---@return Plane3d +function Plane3d.new(normal,half_size) end + + + +---@class Polyline3d : ReflectReference +--- A series of connected line segments in 3D space. +---@field vertices ? Vec3[] +Polyline3d = {} + +---@param _self Polyline3d +---@param other Polyline3d +---@return boolean +function Polyline3d.__eq(_self,other) end + +---@param _self Polyline3d +---@param other Polyline3d +---@return boolean +function Polyline3d.eq(_self,other) end + +---@param _self Polyline3d +---@return Polyline3d +function Polyline3d.clone(_self) end + +---@param start Vec3 +---@param _end Vec3 +---@param subdivisions integer +---@return Polyline3d +function Polyline3d.with_subdivisions(start,_end,subdivisions) end + + + +---@class Segment3d : ReflectReference +--- A line segment defined by two endpoints in 3D space. +---@field vertices ? Vec3[] +Segment3d = {} + +---@param _self Segment3d +---@return Dir3 +function Segment3d.direction(_self) end + +---@param _self Segment3d +---@param point Vec3 +---@return Vec3 +function Segment3d.closest_point(_self,point) end + +---@param ray Ray3d +---@param length number +---@return Segment3d +function Segment3d.from_ray_and_length(ray,length) end + +---@param _self Segment3d +---@return number +function Segment3d.length_squared(_self) end + +---@param _self Segment3d +---@param other Segment3d +---@return boolean +function Segment3d.__eq(_self,other) end + +---@param _self Segment3d +---@param other Segment3d +---@return boolean +function Segment3d.eq(_self,other) end + +---@param _self Segment3d +---@param translation Vec3 +---@return Segment3d +function Segment3d.translated(_self,translation) end + +---@param _self Segment3d +---@param rotation Quat +---@param point Vec3 +---@return Segment3d +function Segment3d.rotated_around(_self,rotation,point) end + +---@param _self Segment3d +---@return Segment3d +function Segment3d.reversed(_self) end + +---@param _self Segment3d +---@return nil +function Segment3d.reverse(_self) end + +---@param _self Segment3d +---@param rotation Quat +---@return Segment3d +function Segment3d.rotated(_self,rotation) end + +---@param _self Segment3d +---@return number +function Segment3d.length(_self) end + +---@param scaled_direction Vec3 +---@return Segment3d +function Segment3d.from_scaled_direction(scaled_direction) end + +---@param _self Segment3d +---@return Segment3d +function Segment3d.centered(_self) end + +---@param _self Segment3d +---@return Vec3 +function Segment3d.point1(_self) end + +---@param _self Segment3d +---@return Vec3 +function Segment3d.point2(_self) end + +---@param _self Segment3d +---@return Vec3 +function Segment3d.center(_self) end + +---@param _self Segment3d +---@param rotation Quat +---@return Segment3d +function Segment3d.rotated_around_center(_self,rotation) end + +---@param _self Segment3d +---@param length number +---@return Segment3d +function Segment3d.resized(_self,length) end + +---@param direction Dir3 +---@param length number +---@return Segment3d +function Segment3d.from_direction_and_length(direction,length) end + +---@param _self Segment3d +---@return Segment3d +function Segment3d.clone(_self) end + +---@param point1 Vec3 +---@param point2 Vec3 +---@return Segment3d +function Segment3d.new(point1,point2) end + +---@param _self Segment3d +---@return Vec3 +function Segment3d.scaled_direction(_self) end + + + +---@class Sphere : ReflectReference +--- A sphere primitive, representing the set of all points some distance from the origin +---@field radius ? number +Sphere = {} + +---@param _self Sphere +---@return Sphere +function Sphere.clone(_self) end + +---@param _self Sphere +---@param other Sphere +---@return boolean +function Sphere.__eq(_self,other) end + +---@param _self Sphere +---@param other Sphere +---@return boolean +function Sphere.eq(_self,other) end + +---@param radius number +---@return Sphere +function Sphere.new(radius) end + +---@param _self Sphere +---@param point Vec3 +---@return Vec3 +function Sphere.closest_point(_self,point) end + +---@param _self Sphere +---@return number +function Sphere.diameter(_self) end + + + +---@class Tetrahedron : ReflectReference +--- A tetrahedron primitive. +---@field vertices ? Vec3[] +Tetrahedron = {} + +---@param a Vec3 +---@param b Vec3 +---@param c Vec3 +---@param d Vec3 +---@return Tetrahedron +function Tetrahedron.new(a,b,c,d) end + +---@param _self Tetrahedron +---@return Vec3 +function Tetrahedron.centroid(_self) end + +---@param _self Tetrahedron +---@return number +function Tetrahedron.signed_volume(_self) end + +---@param _self Tetrahedron +---@param other Tetrahedron +---@return boolean +function Tetrahedron.__eq(_self,other) end + +---@param _self Tetrahedron +---@param other Tetrahedron +---@return boolean +function Tetrahedron.eq(_self,other) end + +---@param _self Tetrahedron +---@return Tetrahedron +function Tetrahedron.clone(_self) end + + + +---@class Torus : ReflectReference +--- A torus primitive, often representing a ring or donut shape +--- The set of points some distance from a circle centered at the origin +---@field minor_radius ? number +---@field major_radius ? number +Torus = {} + +---@param inner_radius number +---@param outer_radius number +---@return Torus +function Torus.new(inner_radius,outer_radius) end + +---@param _self Torus +---@param other Torus +---@return boolean +function Torus.__eq(_self,other) end + +---@param _self Torus +---@param other Torus +---@return boolean +function Torus.eq(_self,other) end + +---@param _self Torus +---@return Torus +function Torus.clone(_self) end + +---@param _self Torus +---@return number +function Torus.inner_radius(_self) end + +---@param _self Torus +---@return number +function Torus.outer_radius(_self) end + + + +---@class Triangle3d : ReflectReference +--- A 3D triangle primitive. +---@field vertices ? Vec3[] +Triangle3d = {} + +---@param _self Triangle3d +---@return Vec3 +function Triangle3d.centroid(_self) end + +---@param _self Triangle3d +---@param other Triangle3d +---@return boolean +function Triangle3d.__eq(_self,other) end + +---@param _self Triangle3d +---@param other Triangle3d +---@return boolean +function Triangle3d.eq(_self,other) end + +---@param a Vec3 +---@param b Vec3 +---@param c Vec3 +---@return Triangle3d +function Triangle3d.new(a,b,c) end + +---@param _self Triangle3d +---@return boolean +function Triangle3d.is_obtuse(_self) end + +---@param _self Triangle3d +---@return nil +function Triangle3d.reverse(_self) end + +---@param _self Triangle3d +---@return boolean +function Triangle3d.is_acute(_self) end + +---@param _self Triangle3d +---@return Triangle3d +function Triangle3d.reversed(_self) end + +---@param _self Triangle3d +---@return Triangle3d +function Triangle3d.clone(_self) end + +---@param _self Triangle3d +---@return Vec3 +function Triangle3d.circumcenter(_self) end + +---@param _self Triangle3d +---@return boolean +function Triangle3d.is_degenerate(_self) end + + + +---@class Ray2d : ReflectReference +--- An infinite half-line starting at `origin` and going in `direction` in 2D space. +---@field origin ? Vec2 +---@field direction ? Dir2 +Ray2d = {} + +---@param _self Ray2d +---@param plane_origin Vec2 +---@param plane Plane2d +---@return number | nil +function Ray2d.intersect_plane(_self,plane_origin,plane) end + +---@param origin Vec2 +---@param direction Dir2 +---@return Ray2d +function Ray2d.new(origin,direction) end + +---@param _self Ray2d +---@param distance number +---@return Vec2 +function Ray2d.get_point(_self,distance) end + +---@param _self Ray2d +---@return Ray2d +function Ray2d.clone(_self) end + +---@param _self Ray2d +---@param other Ray2d +---@return boolean +function Ray2d.__eq(_self,other) end + +---@param _self Ray2d +---@param other Ray2d +---@return boolean +function Ray2d.eq(_self,other) end + + + +---@class Ray3d : ReflectReference +--- An infinite half-line starting at `origin` and going in `direction` in 3D space. +---@field origin ? Vec3 +---@field direction ? Dir3 +Ray3d = {} + +---@param _self Ray3d +---@return Ray3d +function Ray3d.clone(_self) end + +---@param origin Vec3 +---@param direction Dir3 +---@return Ray3d +function Ray3d.new(origin,direction) end + +---@param _self Ray3d +---@param plane_origin Vec3 +---@param plane InfinitePlane3d +---@return number | nil +function Ray3d.intersect_plane(_self,plane_origin,plane) end + +---@param _self Ray3d +---@param other Ray3d +---@return boolean +function Ray3d.__eq(_self,other) end + +---@param _self Ray3d +---@param other Ray3d +---@return boolean +function Ray3d.eq(_self,other) end + +---@param _self Ray3d +---@param distance number +---@return Vec3 +function Ray3d.get_point(_self,distance) end + + + +---@class IRect : ReflectReference +--- A rectangle defined by two opposite corners. +--- +--- The rectangle is axis aligned, and defined by its minimum and maximum coordinates, +--- stored in `IRect::min` and `IRect::max`, respectively. The minimum/maximum invariant +--- must be upheld by the user when directly assigning the fields, otherwise some methods +--- produce invalid results. It is generally recommended to use one of the constructor +--- methods instead, which will ensure this invariant is met, unless you already have +--- the minimum and maximum corners. +---@field min ? IVec2 +---@field max ? IVec2 +IRect = {} + +---@param _self IRect +---@return IRect +function IRect.clone(_self) end + +---@param _self IRect +---@return IVec2 +function IRect.half_size(_self) end + +---@param x0 integer +---@param y0 integer +---@param x1 integer +---@param y1 integer +---@return IRect +function IRect.new(x0,y0,x1,y1) end + +---@param _self IRect +---@param other IVec2 +---@return IRect +function IRect.union_point(_self,other) end + +---@param _self IRect +---@return Rect +function IRect.as_rect(_self) end + +---@param _self IRect +---@return IVec2 +function IRect.center(_self) end + +---@param _self IRect +---@return boolean +function IRect.is_empty(_self) end + +---@param _self IRect +---@param other IRect +---@return boolean +function IRect.__eq(_self,other) end + +---@param _self IRect +---@param other IRect +---@return boolean +function IRect.eq(_self,other) end + +---@param origin IVec2 +---@param half_size IVec2 +---@return IRect +function IRect.from_center_half_size(origin,half_size) end + +---@param _self IRect +---@param other IRect +---@return IRect +function IRect.intersect(_self,other) end + +---@param _self IRect +---@param point IVec2 +---@return boolean +function IRect.contains(_self,point) end + +---@param _self IRect +---@return IVec2 +function IRect.size(_self) end + +---@param _self IRect +---@param other IRect +---@return IRect +function IRect.union(_self,other) end + +---@param _self IRect +---@return integer +function IRect.height(_self) end + +---@param _self IRect +---@param expansion integer +---@return IRect +function IRect.inflate(_self,expansion) end + +---@param p0 IVec2 +---@param p1 IVec2 +---@return IRect +function IRect.from_corners(p0,p1) end + +---@param origin IVec2 +---@param size IVec2 +---@return IRect +function IRect.from_center_size(origin,size) end + +---@param _self IRect +---@return URect +function IRect.as_urect(_self) end + +---@param _self IRect +---@return integer +function IRect.width(_self) end + +---@param _self IRect +---@return nil +function IRect.assert_receiver_is_total_eq(_self) end + + + +---@class Rect : ReflectReference +--- A rectangle defined by two opposite corners. +--- +--- The rectangle is axis aligned, and defined by its minimum and maximum coordinates, +--- stored in `Rect::min` and `Rect::max`, respectively. The minimum/maximum invariant +--- must be upheld by the user when directly assigning the fields, otherwise some methods +--- produce invalid results. It is generally recommended to use one of the constructor +--- methods instead, which will ensure this invariant is met, unless you already have +--- the minimum and maximum corners. +---@field min ? Vec2 +---@field max ? Vec2 +Rect = {} + +---@param _self Rect +---@return Vec2 +function Rect.center(_self) end + +---@param _self Rect +---@return Vec2 +function Rect.half_size(_self) end + +---@param _self Rect +---@return Vec2 +function Rect.size(_self) end + +---@param _self Rect +---@return boolean +function Rect.is_empty(_self) end + +---@param _self Rect +---@param other Vec2 +---@return Rect +function Rect.union_point(_self,other) end + +---@param x0 number +---@param y0 number +---@param x1 number +---@param y1 number +---@return Rect +function Rect.new(x0,y0,x1,y1) end + +---@param _self Rect +---@param other Rect +---@return Rect +function Rect.union(_self,other) end + +---@param _self Rect +---@param other Rect +---@return Rect +function Rect.intersect(_self,other) end + +---@param _self Rect +---@param point Vec2 +---@return boolean +function Rect.contains(_self,point) end + +---@param p0 Vec2 +---@param p1 Vec2 +---@return Rect +function Rect.from_corners(p0,p1) end + +---@param _self Rect +---@return number +function Rect.height(_self) end + +---@param _self Rect +---@param expansion number +---@return Rect +function Rect.inflate(_self,expansion) end + +---@param _self Rect +---@return URect +function Rect.as_urect(_self) end + +---@param origin Vec2 +---@param size Vec2 +---@return Rect +function Rect.from_center_size(origin,size) end + +---@param _self Rect +---@param other Rect +---@return Rect +function Rect.normalize(_self,other) end + +---@param origin Vec2 +---@param half_size Vec2 +---@return Rect +function Rect.from_center_half_size(origin,half_size) end + +---@param _self Rect +---@return number +function Rect.width(_self) end + +---@param _self Rect +---@param other Rect +---@return boolean +function Rect.__eq(_self,other) end + +---@param _self Rect +---@param other Rect +---@return boolean +function Rect.eq(_self,other) end + +---@param _self Rect +---@return IRect +function Rect.as_irect(_self) end + +---@param _self Rect +---@return number +function Rect.area(_self) end + +---@param _self Rect +---@return Rect +function Rect.clone(_self) end + + + +---@class URect : ReflectReference +--- A rectangle defined by two opposite corners. +--- +--- The rectangle is axis aligned, and defined by its minimum and maximum coordinates, +--- stored in `URect::min` and `URect::max`, respectively. The minimum/maximum invariant +--- must be upheld by the user when directly assigning the fields, otherwise some methods +--- produce invalid results. It is generally recommended to use one of the constructor +--- methods instead, which will ensure this invariant is met, unless you already have +--- the minimum and maximum corners. +---@field min ? UVec2 +---@field max ? UVec2 +URect = {} + +---@param _self URect +---@return boolean +function URect.is_empty(_self) end + +---@param _self URect +---@param other URect +---@return URect +function URect.intersect(_self,other) end + +---@param _self URect +---@param other UVec2 +---@return URect +function URect.union_point(_self,other) end + +---@param _self URect +---@return UVec2 +function URect.half_size(_self) end + +---@param _self URect +---@return UVec2 +function URect.center(_self) end + +---@param _self URect +---@return Rect +function URect.as_rect(_self) end + +---@param _self URect +---@param other URect +---@return boolean +function URect.__eq(_self,other) end + +---@param _self URect +---@param other URect +---@return boolean +function URect.eq(_self,other) end + +---@param _self URect +---@return UVec2 +function URect.size(_self) end + +---@param _self URect +---@return IRect +function URect.as_irect(_self) end + +---@param _self URect +---@return URect +function URect.clone(_self) end + +---@param origin UVec2 +---@param size UVec2 +---@return URect +function URect.from_center_size(origin,size) end + +---@param _self URect +---@return integer +function URect.width(_self) end + +---@param _self URect +---@param expansion integer +---@return URect +function URect.inflate(_self,expansion) end + +---@param _self URect +---@param point UVec2 +---@return boolean +function URect.contains(_self,point) end + +---@param p0 UVec2 +---@param p1 UVec2 +---@return URect +function URect.from_corners(p0,p1) end + +---@param _self URect +---@return nil +function URect.assert_receiver_is_total_eq(_self) end + +---@param _self URect +---@param other URect +---@return URect +function URect.union(_self,other) end + +---@param x0 integer +---@param y0 integer +---@param x1 integer +---@param y1 integer +---@return URect +function URect.new(x0,y0,x1,y1) end + +---@param origin UVec2 +---@param half_size UVec2 +---@return URect +function URect.from_center_half_size(origin,half_size) end + +---@param _self URect +---@return integer +function URect.height(_self) end + + + +---@class Rot2 : ReflectReference +--- A 2D rotation. +--- +--- # Example +--- +--- ``` +--- # use approx::assert_relative_eq; +--- # use bevy_math::{Rot2, Vec2}; +--- use std::f32::consts::PI; +--- +--- // Create rotations from counterclockwise angles in radians or degrees +--- let rotation1 = Rot2::radians(PI / 2.0); +--- let rotation2 = Rot2::degrees(45.0); +--- +--- // Get the angle back as radians or degrees +--- assert_eq!(rotation1.as_degrees(), 90.0); +--- assert_eq!(rotation2.as_radians(), PI / 4.0); +--- +--- // "Add" rotations together using `*` +--- #[cfg(feature = "approx")] +--- assert_relative_eq!(rotation1 * rotation2, Rot2::degrees(135.0)); +--- +--- // Rotate vectors +--- #[cfg(feature = "approx")] +--- assert_relative_eq!(rotation1 * Vec2::X, Vec2::Y); +--- ``` +---@field cos ? number +---@field sin ? number +---@operator mul(Vec2): Vec2 +---@operator mul(Dir2): Dir2 +---@operator mul(Rot2): Rot2 +Rot2 = {} + +---@param _self Rot2 +---@param _end Rot2 +---@param s number +---@return Rot2 +function Rot2.slerp(_self,_end,s) end + +---@param _self Rot2 +---@return [number, number] +function Rot2.sin_cos(_self) end + +---@param _self Rot2 +---@return boolean +function Rot2.is_finite(_self) end + +---@param _self Rot2 +---@return Rot2 +function Rot2.normalize(_self) end + +---@param _self Rot2 +---@return boolean +function Rot2.is_normalized(_self) end + +---@param _self Rot2 +---@return boolean +function Rot2.is_near_identity(_self) end + +---@param _self Rot2 +---@return Rot2 +function Rot2.clone(_self) end + +---@param _self Rot2 +---@return number +function Rot2.length(_self) end + +---@param _self Rot2 +---@return Rot2 +function Rot2.inverse(_self) end + +---@param _self Rot2 +---@return number +function Rot2.as_radians(_self) end + +---@param p1 Rot2 +---@param p2 Vec2 +---@return Vec2 +function Rot2.mul(p1,p2) end + +---@param _self Rot2 +---@param other Rot2 +---@return boolean +function Rot2.__eq(_self,other) end + +---@param _self Rot2 +---@param other Rot2 +---@return boolean +function Rot2.eq(_self,other) end + +---@param sin number +---@param cos number +---@return Rot2 +function Rot2.from_sin_cos(sin,cos) end + +---@param _self Rot2 +---@return number +function Rot2.length_squared(_self) end + +---@param _self Rot2 +---@return boolean +function Rot2.is_nan(_self) end + +---@param _self Rot2 +---@return number +function Rot2.length_recip(_self) end + +---@param radians number +---@return Rot2 +function Rot2.radians(radians) end + +---@param _self Rot2 +---@param other Rot2 +---@return number +function Rot2.angle_to(_self,other) end + +---@param degrees number +---@return Rot2 +function Rot2.degrees(degrees) end + +---@param _self Rot2 +---@param _end Rot2 +---@param s number +---@return Rot2 +function Rot2.nlerp(_self,_end,s) end + +---@param _self Rot2 +---@return Rot2 +function Rot2.fast_renormalize(_self) end + +---@param fraction number +---@return Rot2 +function Rot2.turn_fraction(fraction) end + +---@param _self Rot2 +---@param direction Dir2 +---@return Dir2 +function Rot2.mul(_self,direction) end + +---@param _self Rot2 +---@return number +function Rot2.as_degrees(_self) end + +---@param _self Rot2 +---@return number +function Rot2.as_turn_fraction(_self) end + +---@param p1 Rot2 +---@param p2 Rot2 +---@return Rot2 +function Rot2.mul(p1,p2) end + + + +---@class Instant : ReflectReference +---@operator sub(Instant): Duration +---@operator add(Duration): Instant +---@operator sub(Duration): Instant +Instant = {} + +---@param _self Instant +---@param other Instant +---@return boolean +function Instant.__eq(_self,other) end + +---@param _self Instant +---@param other Instant +---@return boolean +function Instant.eq(_self,other) end + +---@param _self Instant +---@param earlier Instant +---@return Duration +function Instant.saturating_duration_since(_self,earlier) end + +---@param _self Instant +---@return nil +function Instant.assert_receiver_is_total_eq(_self) end + +---@param _self Instant +---@return Duration +function Instant.elapsed(_self) end + +---@param _self Instant +---@param earlier Instant +---@return Duration +function Instant.duration_since(_self,earlier) end + +---@param p1 Instant +---@param p2 Instant +---@return Duration +function Instant.sub(p1,p2) end + +---@return Instant +function Instant.now() end + +---@param _self Instant +---@param other Duration +---@return Instant +function Instant.add(_self,other) end + +---@param _self Instant +---@param other Duration +---@return Instant +function Instant.sub(_self,other) end + +---@param _self Instant +---@return Instant +function Instant.clone(_self) end + + + +---@class Fixed : ReflectReference +--- The fixed timestep game clock following virtual time. +--- +--- A specialization of the [`Time`] structure. **For method documentation, see +--- [`Time#impl-Time`].** +--- +--- It is automatically inserted as a resource by +--- [`TimePlugin`](crate::TimePlugin) and updated based on +--- [`Time`](Virtual). The fixed clock is automatically set as the +--- generic [`Time`] resource during [`FixedUpdate`](bevy_app::FixedUpdate) +--- schedule processing. +--- +--- The fixed timestep clock advances in fixed-size increments, which is +--- extremely useful for writing logic (like physics) that should have +--- consistent behavior, regardless of framerate. +--- +--- The default [`timestep()`](Time::timestep) is 64 hertz, or 15625 +--- microseconds. This value was chosen because using 60 hertz has the potential +--- for a pathological interaction with the monitor refresh rate where the game +--- alternates between running two fixed timesteps and zero fixed timesteps per +--- frame (for example when running two fixed timesteps takes longer than a +--- frame). Additionally, the value is a power of two which losslessly converts +--- into [`f32`] and [`f64`]. +--- +--- To run a system on a fixed timestep, add it to one of the [`FixedMain`] +--- schedules, most commonly [`FixedUpdate`](bevy_app::FixedUpdate). +--- +--- This schedule is run a number of times between +--- [`PreUpdate`](bevy_app::PreUpdate) and [`Update`](bevy_app::Update) +--- according to the accumulated [`overstep()`](Time::overstep) time divided by +--- the [`timestep()`](Time::timestep). This means the schedule may run 0, 1 or +--- more times during a single update (which typically corresponds to a rendered +--- frame). +--- +--- `Time` and the generic [`Time`] resource will report a +--- [`delta()`](Time::delta) equal to [`timestep()`](Time::timestep) and always +--- grow [`elapsed()`](Time::elapsed) by one [`timestep()`](Time::timestep) per +--- iteration. +--- +--- The fixed timestep clock follows the [`Time`](Virtual) clock, which +--- means it is affected by [`pause()`](Time::pause), +--- [`set_relative_speed()`](Time::set_relative_speed) and +--- [`set_max_delta()`](Time::set_max_delta) from virtual time. If the virtual +--- clock is paused, the [`FixedUpdate`](bevy_app::FixedUpdate) schedule will +--- not run. It is guaranteed that the [`elapsed()`](Time::elapsed) time in +--- `Time` is always between the previous `elapsed()` and the current +--- `elapsed()` value in `Time`, so the values are compatible. +--- +--- Changing the timestep size while the game is running should not normally be +--- done, as having a regular interval is the point of this schedule, but it may +--- be necessary for effects like "bullet-time" if the normal granularity of the +--- fixed timestep is too big for the slowed down time. In this case, +--- [`set_timestep()`](Time::set_timestep) and be called to set a new value. The +--- new value will be used immediately for the next run of the +--- [`FixedUpdate`](bevy_app::FixedUpdate) schedule, meaning that it will affect +--- the [`delta()`](Time::delta) value for the very next +--- [`FixedUpdate`](bevy_app::FixedUpdate), even if it is still during the same +--- frame. Any [`overstep()`](Time::overstep) present in the accumulator will be +--- processed according to the new [`timestep()`](Time::timestep) value. +---@field timestep ? Duration +---@field overstep ? Duration +Fixed = {} + +---@param _self Fixed +---@return Fixed +function Fixed.clone(_self) end + + + +---@class Real : ReflectReference +--- Real time clock representing elapsed wall clock time. +--- +--- A specialization of the [`Time`] structure. **For method documentation, see +--- [`Time#impl-Time`].** +--- +--- It is automatically inserted as a resource by +--- [`TimePlugin`](crate::TimePlugin) and updated with time instants according +--- to [`TimeUpdateStrategy`](crate::TimeUpdateStrategy).[^disclaimer] +--- +--- Note: +--- Using [`TimeUpdateStrategy::ManualDuration`](crate::TimeUpdateStrategy::ManualDuration) +--- allows for mocking the wall clock for testing purposes. +--- Besides this use case, it is not recommended to do this, as it will no longer +--- represent "wall clock" time as intended. +--- +--- The [`delta()`](Time::delta) and [`elapsed()`](Time::elapsed) values of this +--- clock should be used for anything which deals specifically with real time +--- (wall clock time). It will not be affected by relative game speed +--- adjustments, pausing or other adjustments.[^disclaimer] +--- +--- The clock does not count time from [`startup()`](Time::startup) to +--- [`first_update()`](Time::first_update()) into elapsed, but instead will +--- start counting time from the first update call. [`delta()`](Time::delta) and +--- [`elapsed()`](Time::elapsed) will report zero on the first update as there +--- is no previous update instant. This means that a [`delta()`](Time::delta) of +--- zero must be handled without errors in application logic, as it may +--- theoretically also happen at other times. +--- +--- [`Instant`]s for [`startup()`](Time::startup), +--- [`first_update()`](Time::first_update) and +--- [`last_update()`](Time::last_update) are recorded and accessible. +--- +--- [^disclaimer]: When using [`TimeUpdateStrategy::ManualDuration`](crate::TimeUpdateStrategy::ManualDuration), +--- [`Time#impl-Time`] is only a *mock* of wall clock time. +--- +---@field startup ? Instant +---@field first_update ? Instant | nil +---@field last_update ? Instant | nil +Real = {} + +---@param _self Real +---@return Real +function Real.clone(_self) end + + + +---@class Stopwatch : ReflectReference +--- A Stopwatch is a struct that tracks elapsed time when started. +--- +--- Note that in order to advance the stopwatch [`tick`](Stopwatch::tick) **MUST** be called. +--- # Examples +--- +--- ``` +--- # use bevy_time::*; +--- use std::time::Duration; +--- let mut stopwatch = Stopwatch::new(); +--- assert_eq!(stopwatch.elapsed_secs(), 0.0); +--- +--- stopwatch.tick(Duration::from_secs_f32(1.0)); // tick one second +--- assert_eq!(stopwatch.elapsed_secs(), 1.0); +--- +--- stopwatch.pause(); +--- stopwatch.tick(Duration::from_secs_f32(1.0)); // paused stopwatches don't tick +--- assert_eq!(stopwatch.elapsed_secs(), 1.0); +--- +--- stopwatch.reset(); // reset the stopwatch +--- assert!(stopwatch.is_paused()); +--- assert_eq!(stopwatch.elapsed_secs(), 0.0); +--- ``` +---@field elapsed ? Duration +---@field is_paused ? boolean +Stopwatch = {} + +---@param _self Stopwatch +---@return number +function Stopwatch.elapsed_secs(_self) end + +---@param _self Stopwatch +---@return nil +function Stopwatch.pause(_self) end + +---@param _self Stopwatch +---@return Stopwatch +function Stopwatch.clone(_self) end + +---@param _self Stopwatch +---@return nil +function Stopwatch.reset(_self) end + +---@param _self Stopwatch +---@return nil +function Stopwatch.assert_receiver_is_total_eq(_self) end + +---@param _self Stopwatch +---@param time Duration +---@return nil +function Stopwatch.set_elapsed(_self,time) end + +---@param _self Stopwatch +---@param other Stopwatch +---@return boolean +function Stopwatch.__eq(_self,other) end + +---@param _self Stopwatch +---@param other Stopwatch +---@return boolean +function Stopwatch.eq(_self,other) end + +---@return Stopwatch +function Stopwatch.new() end + +---@param _self Stopwatch +---@return number +function Stopwatch.elapsed_secs_f64(_self) end + +---@param _self Stopwatch +---@return boolean +function Stopwatch.is_paused(_self) end + +---@param _self Stopwatch +---@return nil +function Stopwatch.unpause(_self) end + +---@param _self Stopwatch +---@return Duration +function Stopwatch.elapsed(_self) end + + + +---@class Timer : ReflectReference +--- Tracks elapsed time. Enters the finished state once `duration` is reached. +--- +--- Note that in order to advance the timer [`tick`](Timer::tick) **MUST** be called. +--- +--- # Timer modes +--- +--- There are two timer modes ([`TimerMode`]): +--- +--- - Non repeating timers will stop tracking and stay in the finished state until reset. +--- - Repeating timers will only be in the finished state on each tick `duration` is reached or +--- exceeded, and can still be reset at any given point. +--- +--- # Pausing timers +--- +--- You can pause a timer using [`Timer::pause`]. Paused timers will not have elapsed time increased. +--- +--- # Elapsing multiple times a frame +--- +--- Repeating timers might elapse multiple times per frame if the time is advanced by more than the timer duration. +--- You can check how many times a timer elapsed each tick with [`Timer::times_finished_this_tick`]. +--- For non-repeating timers, this will always be 0 or 1. +---@field stopwatch ? Stopwatch +---@field duration ? Duration +---@field mode ? TimerMode +---@field finished ? boolean +---@field times_finished_this_tick ? integer +Timer = {} + +---@param duration number +---@param mode TimerMode +---@return Timer +function Timer.from_seconds(duration,mode) end + +---@param _self Timer +---@return number +function Timer.elapsed_secs_f64(_self) end + +---@param _self Timer +---@return nil +function Timer.unpause(_self) end + +---@param _self Timer +---@return Timer +function Timer.clone(_self) end + +---@param _self Timer +---@return Duration +function Timer.remaining(_self) end + +---@param duration Duration +---@param mode TimerMode +---@return Timer +function Timer.new(duration,mode) end + +---@param _self Timer +---@return TimerMode +function Timer.mode(_self) end + +---@param _self Timer +---@return number +function Timer.fraction_remaining(_self) end + +---@param _self Timer +---@return nil +function Timer.assert_receiver_is_total_eq(_self) end + +---@param _self Timer +---@return number +function Timer.fraction(_self) end + +---@param _self Timer +---@param duration Duration +---@return nil +function Timer.set_duration(_self,duration) end + +---@param _self Timer +---@return nil +function Timer.reset(_self) end + +---@param _self Timer +---@return boolean +function Timer.is_paused(_self) end + +---@param _self Timer +---@param other Timer +---@return boolean +function Timer.__eq(_self,other) end + +---@param _self Timer +---@param other Timer +---@return boolean +function Timer.eq(_self,other) end + +---@param _self Timer +---@return Duration +function Timer.duration(_self) end + +---@param _self Timer +---@return number +function Timer.elapsed_secs(_self) end + +---@param _self Timer +---@return boolean +function Timer.just_finished(_self) end + +---@param _self Timer +---@return nil +function Timer.finish(_self) end + +---@param _self Timer +---@return nil +function Timer.pause(_self) end + +---@param _self Timer +---@return boolean +function Timer.is_finished(_self) end + +---@param _self Timer +---@return Duration +function Timer.elapsed(_self) end + +---@param _self Timer +---@param mode TimerMode +---@return nil +function Timer.set_mode(_self,mode) end + +---@param _self Timer +---@return nil +function Timer.almost_finish(_self) end + +---@param _self Timer +---@param time Duration +---@return nil +function Timer.set_elapsed(_self,time) end + +---@param _self Timer +---@return number +function Timer.remaining_secs(_self) end + +---@param _self Timer +---@return integer +function Timer.times_finished_this_tick(_self) end + + + +---@class TimerMode : ReflectReference +--- Specifies [`Timer`] behavior. +TimerMode = {} + +---@param _self TimerMode +---@return TimerMode +function TimerMode.clone(_self) end + +---@param _self TimerMode +---@param other TimerMode +---@return boolean +function TimerMode.__eq(_self,other) end + +---@param _self TimerMode +---@param other TimerMode +---@return boolean +function TimerMode.eq(_self,other) end + +---@param _self TimerMode +---@return nil +function TimerMode.assert_receiver_is_total_eq(_self) end + + + +---@class Virtual : ReflectReference +--- The virtual game clock representing game time. +--- +--- A specialization of the [`Time`] structure. **For method documentation, see +--- [`Time#impl-Time`].** +--- +--- Normally used as `Time`. It is automatically inserted as a resource +--- by [`TimePlugin`](crate::TimePlugin) and updated based on +--- [`Time`](Real). The virtual clock is automatically set as the default +--- generic [`Time`] resource for the update. +--- +--- The virtual clock differs from real time clock in that it can be paused, sped up +--- and slowed down. It also limits how much it can advance in a single update +--- in order to prevent unexpected behavior in cases where updates do not happen +--- at regular intervals (e.g. coming back after the program was suspended a long time). +--- +--- The virtual clock can be paused by calling [`pause()`](Time::pause) and +--- unpaused by calling [`unpause()`](Time::unpause). When the game clock is +--- paused [`delta()`](Time::delta) will be zero on each update, and +--- [`elapsed()`](Time::elapsed) will not grow. +--- [`effective_speed()`](Time::effective_speed) will return `0.0`. Calling +--- [`pause()`](Time::pause) will not affect value the [`delta()`](Time::delta) +--- value for the update currently being processed. +--- +--- The speed of the virtual clock can be changed by calling +--- [`set_relative_speed()`](Time::set_relative_speed). A value of `2.0` means +--- that virtual clock should advance twice as fast as real time, meaning that +--- [`delta()`](Time::delta) values will be double of what +--- [`Time::delta()`](Time::delta) reports and +--- [`elapsed()`](Time::elapsed) will go twice as fast as +--- [`Time::elapsed()`](Time::elapsed). Calling +--- [`set_relative_speed()`](Time::set_relative_speed) will not affect the +--- [`delta()`](Time::delta) value for the update currently being processed. +--- +--- The maximum amount of delta time that can be added by a single update can be +--- set by [`set_max_delta()`](Time::set_max_delta). This value serves a dual +--- purpose in the virtual clock. +--- +--- If the game temporarily freezes due to any reason, such as disk access, a +--- blocking system call, or operating system level suspend, reporting the full +--- elapsed delta time is likely to cause bugs in game logic. Usually if a +--- laptop is suspended for an hour, it doesn't make sense to try to simulate +--- the game logic for the elapsed hour when resuming. Instead it is better to +--- lose the extra time and pretend a shorter duration of time passed. Setting +--- [`max_delta()`](Time::max_delta) to a relatively short time means that the +--- impact on game logic will be minimal. +--- +--- If the game lags for some reason, meaning that it will take a longer time to +--- compute a frame than the real time that passes during the computation, then +--- we would fall behind in processing virtual time. If this situation persists, +--- and computing a frame takes longer depending on how much virtual time has +--- passed, the game would enter a "death spiral" where computing each frame +--- takes longer and longer and the game will appear to freeze. By limiting the +--- maximum time that can be added at once, we also limit the amount of virtual +--- time the game needs to compute for each frame. This means that the game will +--- run slow, and it will run slower than real time, but it will not freeze and +--- it will recover as soon as computation becomes fast again. +--- +--- You should set [`max_delta()`](Time::max_delta) to a value that is +--- approximately the minimum FPS your game should have even if heavily lagged +--- for a moment. The actual FPS when lagged will be somewhat lower than this, +--- depending on how much more time it takes to compute a frame compared to real +--- time. You should also consider how stable your FPS is, as the limit will +--- also dictate how big of an FPS drop you can accept without losing time and +--- falling behind real time. +---@field max_delta ? Duration +---@field paused ? boolean +---@field relative_speed ? number +---@field effective_speed ? number +Virtual = {} + +---@param _self Virtual +---@return Virtual +function Virtual.clone(_self) end + + + +---@class GlobalTransform : ReflectReference +--- [`GlobalTransform`] is an affine transformation from entity-local coordinates to worldspace coordinates. +--- +--- You cannot directly mutate [`GlobalTransform`]; instead, you change an entity's transform by manipulating +--- its [`Transform`], which indirectly causes Bevy to update its [`GlobalTransform`]. +--- +--- * To get the global transform of an entity, you should get its [`GlobalTransform`]. +--- * For transform hierarchies to work correctly, you must have both a [`Transform`] and a [`GlobalTransform`]. +--- [`GlobalTransform`] is automatically inserted whenever [`Transform`] is inserted. +--- +--- ## [`Transform`] and [`GlobalTransform`] +--- +--- [`Transform`] transforms an entity relative to its parent's reference frame, or relative to world space coordinates, +--- if it doesn't have a [`ChildOf`](bevy_ecs::hierarchy::ChildOf) component. +--- +--- [`GlobalTransform`] is managed by Bevy; it is computed by successively applying the [`Transform`] of each ancestor +--- entity which has a Transform. This is done automatically by Bevy-internal systems in the [`TransformSystems::Propagate`] +--- system set. +--- +--- This system runs during [`PostUpdate`](bevy_app::PostUpdate). If you +--- update the [`Transform`] of an entity in this schedule or after, you will notice a 1 frame lag +--- before the [`GlobalTransform`] is updated. +--- +--- [`TransformSystems::Propagate`]: crate::TransformSystems::Propagate +--- +--- # Examples +--- +--- - [`transform`][transform_example] +--- +--- [transform_example]: https://github.com/bevyengine/bevy/blob/latest/examples/transforms/transform.rs +---@field [1] Affine3A +---@operator mul(GlobalTransform): GlobalTransform +---@operator mul(Transform): GlobalTransform +---@operator mul(Vec3): Vec3 +GlobalTransform = {} + +---@param p1 GlobalTransform +---@param p2 GlobalTransform +---@return GlobalTransform +function GlobalTransform.mul(p1,p2) end + +---@param _self GlobalTransform +---@param parent GlobalTransform +---@return Transform +function GlobalTransform.reparented_to(_self,parent) end + +---@param _self GlobalTransform +---@return Vec3A +function GlobalTransform.translation_vec3a(_self) end + +---@param x number +---@param y number +---@param z number +---@return GlobalTransform +function GlobalTransform.from_xyz(x,y,z) end + +---@param translation Vec3 +---@return GlobalTransform +function GlobalTransform.from_translation(translation) end + +---@param iso Isometry3d +---@return GlobalTransform +function GlobalTransform.from_isometry(iso) end + +---@param _self GlobalTransform +---@return Mat4 +function GlobalTransform.to_matrix(_self) end + +---@param _self GlobalTransform +---@return Affine3A +function GlobalTransform.affine(_self) end + +---@param _self GlobalTransform +---@return Dir3 +function GlobalTransform.down(_self) end + +---@param rotation Quat +---@return GlobalTransform +function GlobalTransform.from_rotation(rotation) end + +---@param _self GlobalTransform +---@param point Vec3 +---@return Vec3 +function GlobalTransform.transform_point(_self,point) end + +---@param _self GlobalTransform +---@return Vec3 +function GlobalTransform.translation(_self) end + +---@param _self GlobalTransform +---@return GlobalTransform +function GlobalTransform.clone(_self) end + +---@param _self GlobalTransform +---@return Dir3 +function GlobalTransform.up(_self) end + +---@param _self GlobalTransform +---@return Transform +function GlobalTransform.compute_transform(_self) end + +---@param _self GlobalTransform +---@return Isometry3d +function GlobalTransform.to_isometry(_self) end + +---@param _self GlobalTransform +---@return Vec3 +function GlobalTransform.scale(_self) end + +---@param _self GlobalTransform +---@return Dir3 +function GlobalTransform.left(_self) end + +---@param _self GlobalTransform +---@return Quat +function GlobalTransform.rotation(_self) end + +---@param p1 GlobalTransform +---@param p2 Transform +---@return GlobalTransform +function GlobalTransform.mul(p1,p2) end + +---@param scale Vec3 +---@return GlobalTransform +function GlobalTransform.from_scale(scale) end + +---@param _self GlobalTransform +---@param transform Transform +---@return GlobalTransform +function GlobalTransform.mul_transform(_self,transform) end + +---@param _self GlobalTransform +---@param other GlobalTransform +---@return boolean +function GlobalTransform.__eq(_self,other) end + +---@param _self GlobalTransform +---@param other GlobalTransform +---@return boolean +function GlobalTransform.eq(_self,other) end + +---@param _self GlobalTransform +---@param value Vec3 +---@return Vec3 +function GlobalTransform.mul(_self,value) end + +---@param _self GlobalTransform +---@return Dir3 +function GlobalTransform.right(_self) end + +---@param _self GlobalTransform +---@return Dir3 +function GlobalTransform.forward(_self) end + +---@param _self GlobalTransform +---@param extents Vec3A +---@return number +function GlobalTransform.radius_vec3a(_self,extents) end + +---@param _self GlobalTransform +---@return Dir3 +function GlobalTransform.back(_self) end + + + +---@class Transform : ReflectReference +--- Describe the position of an entity. If the entity has a parent, the position is relative +--- to its parent position. +--- +--- * To place or move an entity, you should set its [`Transform`]. +--- * To get the global transform of an entity, you should get its [`GlobalTransform`]. +--- * To be displayed, an entity must have both a [`Transform`] and a [`GlobalTransform`]. +--- [`GlobalTransform`] is automatically inserted whenever [`Transform`] is inserted. +--- +--- ## [`Transform`] and [`GlobalTransform`] +--- +--- [`Transform`] is the position of an entity relative to its parent position, or the reference +--- frame if it doesn't have a [`ChildOf`](bevy_ecs::hierarchy::ChildOf) component. +--- +--- [`GlobalTransform`] is the position of an entity relative to the reference frame. +--- +--- [`GlobalTransform`] is updated from [`Transform`] in the [`TransformSystems::Propagate`] +--- system set. +--- +--- This system runs during [`PostUpdate`](bevy_app::PostUpdate). If you +--- update the [`Transform`] of an entity during this set or after, you will notice a 1 frame lag +--- before the [`GlobalTransform`] is updated. +--- +--- [`TransformSystems::Propagate`]: crate::TransformSystems::Propagate +--- +--- # Examples +--- +--- - [`transform`][transform_example] +--- +--- [transform_example]: https://github.com/bevyengine/bevy/blob/latest/examples/transforms/transform.rs +---@field translation ? Vec3 +---@field rotation ? Quat +---@field scale ? Vec3 +---@operator mul(Vec3): Vec3 +---@operator mul(GlobalTransform): GlobalTransform +---@operator mul(Transform): Transform +Transform = {} + +---@param _self Transform +---@return Dir3 +function Transform.up(_self) end + +---@param _self Transform +---@param other Transform +---@return boolean +function Transform.__eq(_self,other) end + +---@param _self Transform +---@param other Transform +---@return boolean +function Transform.eq(_self,other) end + +---@param _self Transform +---@param rotation Quat +---@return Transform +function Transform.with_rotation(_self,rotation) end + +---@param _self Transform +---@param point Vec3 +---@return Vec3 +function Transform.transform_point(_self,point) end + +---@param _self Transform +---@param angle number +---@return nil +function Transform.rotate_x(_self,angle) end + +---@param _self Transform +---@param point Vec3 +---@param rotation Quat +---@return nil +function Transform.rotate_around(_self,point,rotation) end + +---@param _self Transform +---@return Mat4 +function Transform.to_matrix(_self) end + +---@param _self Transform +---@param point Vec3 +---@param rotation Quat +---@return nil +function Transform.translate_around(_self,point,rotation) end + +---@param _self Transform +---@param angle number +---@return nil +function Transform.rotate_local_z(_self,angle) end + +---@param _self Transform +---@return Dir3 +function Transform.local_y(_self) end + +---@param _self Transform +---@return Dir3 +function Transform.right(_self) end + +---@param _self Transform +---@return Dir3 +function Transform.local_z(_self) end + +---@param scale Vec3 +---@return Transform +function Transform.from_scale(scale) end + +---@param _self Transform +---@return Dir3 +function Transform.back(_self) end + +---@param rotation Quat +---@return Transform +function Transform.from_rotation(rotation) end + +---@param _self Transform +---@return Dir3 +function Transform.down(_self) end + +---@param _self Transform +---@return Dir3 +function Transform.forward(_self) end + +---@param _self Transform +---@return Isometry3d +function Transform.to_isometry(_self) end + +---@param _self Transform +---@return Affine3A +function Transform.compute_affine(_self) end + +---@param _self Transform +---@param transform Transform +---@return Transform +function Transform.mul_transform(_self,transform) end + +---@param _self Transform +---@return Dir3 +function Transform.left(_self) end + +---@param _self Transform +---@return Transform +function Transform.clone(_self) end + +---@param _self Transform +---@return boolean +function Transform.is_finite(_self) end + +---@param _self Transform +---@param value Vec3 +---@return Vec3 +function Transform.mul(_self,value) end + +---@param p1 Transform +---@param p2 GlobalTransform +---@return GlobalTransform +function Transform.mul(p1,p2) end + +---@param _self Transform +---@param axis Dir3 +---@param angle number +---@return nil +function Transform.rotate_axis(_self,axis,angle) end + +---@param _self Transform +---@param angle number +---@return nil +function Transform.rotate_local_y(_self,angle) end + +---@param _self Transform +---@param axis Dir3 +---@param angle number +---@return nil +function Transform.rotate_local_axis(_self,axis,angle) end + +---@param x number +---@param y number +---@param z number +---@return Transform +function Transform.from_xyz(x,y,z) end + +---@param p1 Transform +---@param p2 Transform +---@return Transform +function Transform.mul(p1,p2) end + +---@param world_from_local Mat4 +---@return Transform +function Transform.from_matrix(world_from_local) end + +---@param _self Transform +---@param rotation Quat +---@return nil +function Transform.rotate(_self,rotation) end + +---@param _self Transform +---@param translation Vec3 +---@return Transform +function Transform.with_translation(_self,translation) end + +---@param _self Transform +---@param scale Vec3 +---@return Transform +function Transform.with_scale(_self,scale) end + +---@param iso Isometry3d +---@return Transform +function Transform.from_isometry(iso) end + +---@param _self Transform +---@param angle number +---@return nil +function Transform.rotate_y(_self,angle) end + +---@param _self Transform +---@param angle number +---@return nil +function Transform.rotate_local_x(_self,angle) end + +---@param _self Transform +---@param rotation Quat +---@return nil +function Transform.rotate_local(_self,rotation) end + +---@param _self Transform +---@param angle number +---@return nil +function Transform.rotate_z(_self,angle) end + +---@param translation Vec3 +---@return Transform +function Transform.from_translation(translation) end + +---@param _self Transform +---@return Dir3 +function Transform.local_x(_self) end + + + +---@class TransformTreeChanged : ReflectReference +--- An optimization for transform propagation. This ZST marker component uses change detection to +--- mark all entities of the hierarchy as "dirty" if any of their descendants have a changed +--- `Transform`. If this component is *not* marked `is_changed()`, propagation will halt. +TransformTreeChanged = {} + +---@param _self TransformTreeChanged +---@return TransformTreeChanged +function TransformTreeChanged.clone(_self) end + +---@param _self TransformTreeChanged +---@param other TransformTreeChanged +---@return boolean +function TransformTreeChanged.__eq(_self,other) end + +---@param _self TransformTreeChanged +---@param other TransformTreeChanged +---@return boolean +function TransformTreeChanged.eq(_self,other) end + + + +---@class StaticTransformOptimizations : ReflectReference +--- Configure the behavior of static scene optimizations for [`Transform`] propagation. +--- +--- For scenes with many static entities, it is much faster to track trees of unchanged +--- [`Transform`]s and skip these during the expensive transform propagation step. If your scene is +--- very dynamic, the cost of tracking these trees can exceed the performance benefits. By default, +--- static scene optimization is disabled for worlds with more than 30% of its entities moving. +--- +--- This resource allows you to configure that threshold at runtime. +---@field threshold ? number +---@field enabled ? boolean +StaticTransformOptimizations = {} + +---@return StaticTransformOptimizations +function StaticTransformOptimizations.disabled() end + +---@param threshold number +---@return StaticTransformOptimizations +function StaticTransformOptimizations.from_threshold(threshold) end + +---@return StaticTransformOptimizations +function StaticTransformOptimizations.enabled() end + + + +---@class TypeId : ReflectReference +TypeId = {} + +---@param _self TypeId +---@param other TypeId +---@return boolean +function TypeId.__eq(_self,other) end + +---@param _self TypeId +---@param other TypeId +---@return boolean +function TypeId.eq(_self,other) end + +---@param _self TypeId +---@return nil +function TypeId.assert_receiver_is_total_eq(_self) end + +---@param _self TypeId +---@return TypeId +function TypeId.clone(_self) end + + + +---@class SocketAddr : ReflectReference +SocketAddr = {} + +---@param _self SocketAddr +---@return boolean +function SocketAddr.is_ipv6(_self) end + +---@param _self SocketAddr +---@param other SocketAddr +---@return boolean +function SocketAddr.__eq(_self,other) end + +---@param _self SocketAddr +---@param other SocketAddr +---@return boolean +function SocketAddr.eq(_self,other) end + +---@param _self SocketAddr +---@return nil +function SocketAddr.assert_receiver_is_total_eq(_self) end + +---@param _self SocketAddr +---@return SocketAddr +function SocketAddr.clone(_self) end + +---@param _self SocketAddr +---@param new_port integer +---@return nil +function SocketAddr.set_port(_self,new_port) end + +---@param _self SocketAddr +---@return integer +function SocketAddr.port(_self) end + +---@param _self SocketAddr +---@return boolean +function SocketAddr.is_ipv4(_self) end + + + +---@class RangeFull : ReflectReference +RangeFull = {} + +---@param _self RangeFull +---@return RangeFull +function RangeFull.clone(_self) end + +---@param _self RangeFull +---@param other RangeFull +---@return boolean +function RangeFull.__eq(_self,other) end + +---@param _self RangeFull +---@param other RangeFull +---@return boolean +function RangeFull.eq(_self,other) end + +---@param _self RangeFull +---@return nil +function RangeFull.assert_receiver_is_total_eq(_self) end + + + +---@class AtomicBool : ReflectReference +AtomicBool = {} + +---@param _self AtomicBool +---@return boolean +function AtomicBool.into_inner(_self) end + +---@param v boolean +---@return AtomicBool +function AtomicBool.new(v) end + + + +---@class AtomicI16 : ReflectReference +AtomicI16 = {} + +---@param v integer +---@return AtomicI16 +function AtomicI16.new(v) end + +---@param _self AtomicI16 +---@return integer +function AtomicI16.into_inner(_self) end + + + +---@class AtomicI32 : ReflectReference +AtomicI32 = {} + +---@param _self AtomicI32 +---@return integer +function AtomicI32.into_inner(_self) end + +---@param v integer +---@return AtomicI32 +function AtomicI32.new(v) end + + + +---@class AtomicI64 : ReflectReference +AtomicI64 = {} + +---@param v integer +---@return AtomicI64 +function AtomicI64.new(v) end + +---@param _self AtomicI64 +---@return integer +function AtomicI64.into_inner(_self) end + + + +---@class AtomicI8 : ReflectReference +AtomicI8 = {} + +---@param v integer +---@return AtomicI8 +function AtomicI8.new(v) end + +---@param _self AtomicI8 +---@return integer +function AtomicI8.into_inner(_self) end + + + +---@class AtomicIsize : ReflectReference +AtomicIsize = {} + +---@param _self AtomicIsize +---@return integer +function AtomicIsize.into_inner(_self) end + +---@param v integer +---@return AtomicIsize +function AtomicIsize.new(v) end + + + +---@class AtomicU16 : ReflectReference +AtomicU16 = {} + +---@param v integer +---@return AtomicU16 +function AtomicU16.new(v) end + +---@param _self AtomicU16 +---@return integer +function AtomicU16.into_inner(_self) end + + + +---@class AtomicU32 : ReflectReference +AtomicU32 = {} + +---@param _self AtomicU32 +---@return integer +function AtomicU32.into_inner(_self) end + +---@param v integer +---@return AtomicU32 +function AtomicU32.new(v) end + + + +---@class AtomicU64 : ReflectReference +AtomicU64 = {} + +---@param _self AtomicU64 +---@return integer +function AtomicU64.into_inner(_self) end + +---@param v integer +---@return AtomicU64 +function AtomicU64.new(v) end + + + +---@class AtomicU8 : ReflectReference +AtomicU8 = {} + +---@param v integer +---@return AtomicU8 +function AtomicU8.new(v) end + +---@param _self AtomicU8 +---@return integer +function AtomicU8.into_inner(_self) end + + + +---@class AtomicUsize : ReflectReference +AtomicUsize = {} + +---@param v integer +---@return AtomicUsize +function AtomicUsize.new(v) end + +---@param _self AtomicUsize +---@return integer +function AtomicUsize.into_inner(_self) end + + + +---@class Duration : ReflectReference +---@operator add(Duration): Duration +---@operator div(integer): Duration +---@operator sub(Duration): Duration +---@operator mul(integer): Duration +Duration = {} + +---@param _self Duration +---@param rhs integer +---@return Duration +function Duration.saturating_mul(_self,rhs) end + +---@param _self Duration +---@return integer +function Duration.as_nanos(_self) end + +---@param _self Duration +---@return integer +function Duration.subsec_nanos(_self) end + +---@param _self Duration +---@return number +function Duration.as_secs_f32(_self) end + +---@param secs number +---@return Duration +function Duration.from_secs_f32(secs) end + +---@param _self Duration +---@param rhs number +---@return Duration +function Duration.mul_f32(_self,rhs) end + +---@param _self Duration +---@param rhs Duration +---@return Duration +function Duration.saturating_add(_self,rhs) end + +---@param millis integer +---@return Duration +function Duration.from_millis(millis) end + +---@param _self Duration +---@param rhs Duration +---@return number +function Duration.div_duration_f32(_self,rhs) end + +---@param secs integer +---@param nanos integer +---@return Duration +function Duration.new(secs,nanos) end + +---@param secs number +---@return Duration +function Duration.from_secs_f64(secs) end + +---@param _self Duration +---@param rhs Duration +---@return Duration +function Duration.add(_self,rhs) end + +---@param _self Duration +---@param other Duration +---@return boolean +function Duration.__eq(_self,other) end + +---@param _self Duration +---@param other Duration +---@return boolean +function Duration.eq(_self,other) end + +---@param _self Duration +---@return number +function Duration.as_secs_f64(_self) end + +---@param _self Duration +---@return integer +function Duration.subsec_micros(_self) end + +---@param _self Duration +---@return nil +function Duration.assert_receiver_is_total_eq(_self) end + +---@param _self Duration +---@return Duration +function Duration.clone(_self) end + +---@param _self Duration +---@return integer +function Duration.subsec_millis(_self) end + +---@param _self Duration +---@param other Duration +---@return Duration +function Duration.abs_diff(_self,other) end + +---@param _self Duration +---@param rhs integer +---@return Duration +function Duration.div(_self,rhs) end + +---@param _self Duration +---@param rhs Duration +---@return Duration +function Duration.sub(_self,rhs) end + +---@param _self Duration +---@return integer +function Duration.as_secs(_self) end + +---@param micros integer +---@return Duration +function Duration.from_micros(micros) end + +---@param _self Duration +---@param rhs Duration +---@return number +function Duration.div_duration_f64(_self,rhs) end + +---@param _self Duration +---@param rhs integer +---@return Duration +function Duration.mul(_self,rhs) end + +---@param _self Duration +---@return integer +function Duration.as_micros(_self) end + +---@param nanos integer +---@return Duration +function Duration.from_nanos(nanos) end + +---@param secs integer +---@return Duration +function Duration.from_secs(secs) end + +---@param _self Duration +---@param rhs number +---@return Duration +function Duration.div_f32(_self,rhs) end + +---@param _self Duration +---@return integer +function Duration.as_millis(_self) end + +---@param _self Duration +---@param rhs number +---@return Duration +function Duration.div_f64(_self,rhs) end + +---@param _self Duration +---@param rhs number +---@return Duration +function Duration.mul_f64(_self,rhs) end + +---@param _self Duration +---@param rhs Duration +---@return Duration +function Duration.saturating_sub(_self,rhs) end + +---@param _self Duration +---@return boolean +function Duration.is_zero(_self) end + + + +---@class Affine2 : ReflectReference +---@field matrix2 ? Mat2 +---@field translation ? Vec2 +---@operator mul(Affine2): Affine2 +---@operator mul(Mat3A): Mat3A +---@operator mul(Mat3): Mat3 +---@operator mul(Mat3): Mat3 +---@operator mul(Mat3A): Mat3A +---@operator mul(Affine2): Affine2 +Affine2 = {} + +---@param _self Affine2 +---@param rhs Vec2 +---@return Vec2 +function Affine2.transform_point2(_self,rhs) end + +---@param scale Vec2 +---@return Affine2 +function Affine2.from_scale(scale) end + +---@param _self Affine2 +---@param rhs Vec2 +---@return Vec2 +function Affine2.transform_vector2(_self,rhs) end + +---@param _self Affine2 +---@return DAffine2 +function Affine2.as_daffine2(_self) end + +---@param _self Affine2 +---@return boolean +function Affine2.is_finite(_self) end + +---@param _self Affine2 +---@param rhs Affine2 +---@param max_abs_diff number +---@return boolean +function Affine2.abs_diff_eq(_self,rhs,max_abs_diff) end + +---@param p1 Affine2 +---@param p2 Affine2 +---@return Affine2 +function Affine2.mul(p1,p2) end + +---@param _self Affine2 +---@return Affine2 +function Affine2.clone(_self) end + +---@param m Mat3 +---@return Affine2 +function Affine2.from_mat3(m) end + +---@param _self Affine2 +---@return number[][] +function Affine2.to_cols_array_2d(_self) end + +---@param _self Affine2 +---@param rhs Affine2 +---@return boolean +function Affine2.__eq(_self,rhs) end + +---@param _self Affine2 +---@param rhs Affine2 +---@return boolean +function Affine2.eq(_self,rhs) end + +---@param p1 Affine2 +---@param p2 Mat3A +---@return Mat3A +function Affine2.mul(p1,p2) end + +---@param matrix2 Mat2 +---@return Affine2 +function Affine2.from_mat2(matrix2) end + +---@param _self Affine2 +---@return number[] +function Affine2.to_cols_array(_self) end + +---@param p1 Affine2 +---@param p2 Mat3 +---@return Mat3 +function Affine2.mul(p1,p2) end + +---@param _self Affine2 +---@return Affine2 +function Affine2.inverse(_self) end + +---@param angle number +---@param translation Vec2 +---@return Affine2 +function Affine2.from_angle_translation(angle,translation) end + +---@param m Mat3A +---@return Affine2 +function Affine2.from_mat3a(m) end + +---@param translation Vec2 +---@return Affine2 +function Affine2.from_translation(translation) end + +---@param matrix2 Mat2 +---@param translation Vec2 +---@return Affine2 +function Affine2.from_mat2_translation(matrix2,translation) end + +---@param angle number +---@return Affine2 +function Affine2.from_angle(angle) end + +---@param p1 Affine2 +---@param p2 Mat3 +---@return Mat3 +function Affine2.mul(p1,p2) end + +---@param p1 Affine2 +---@param p2 Mat3A +---@return Mat3A +function Affine2.mul(p1,p2) end + +---@param _self Affine2 +---@param rhs Affine2 +---@return Affine2 +function Affine2.mul(_self,rhs) end + +---@param scale Vec2 +---@param angle number +---@param translation Vec2 +---@return Affine2 +function Affine2.from_scale_angle_translation(scale,angle,translation) end + +---@param _self Affine2 +---@return boolean +function Affine2.is_nan(_self) end + +---@param x_axis Vec2 +---@param y_axis Vec2 +---@param z_axis Vec2 +---@return Affine2 +function Affine2.from_cols(x_axis,y_axis,z_axis) end + + + +---@class Affine3A : ReflectReference +---@field matrix3 ? Mat3A +---@field translation ? Vec3A +---@operator mul(Affine3A): Affine3A +---@operator mul(Mat4): Mat4 +---@operator mul(Affine3A): Affine3A +---@operator mul(Mat4): Mat4 +Affine3A = {} + +---@param angle number +---@return Affine3A +function Affine3A.from_rotation_x(angle) end + +---@param _self Affine3A +---@return boolean +function Affine3A.is_nan(_self) end + +---@param axis Vec3 +---@param angle number +---@return Affine3A +function Affine3A.from_axis_angle(axis,angle) end + +---@param scale Vec3 +---@return Affine3A +function Affine3A.from_scale(scale) end + +---@param _self Affine3A +---@param rhs Affine3A +---@return Affine3A +function Affine3A.mul(_self,rhs) end + +---@param _self Affine3A +---@param rhs Vec3 +---@return Vec3 +function Affine3A.transform_point3(_self,rhs) end + +---@param eye Vec3 +---@param dir Vec3 +---@param up Vec3 +---@return Affine3A +function Affine3A.look_to_rh(eye,dir,up) end + +---@param p1 Affine3A +---@param p2 Mat4 +---@return Mat4 +function Affine3A.mul(p1,p2) end + +---@param mat3 Mat3 +---@param translation Vec3 +---@return Affine3A +function Affine3A.from_mat3_translation(mat3,translation) end + +---@param angle number +---@return Affine3A +function Affine3A.from_rotation_z(angle) end + +---@param _self Affine3A +---@param rhs Vec3A +---@return Vec3A +function Affine3A.transform_point3a(_self,rhs) end + +---@param rotation Quat +---@return Affine3A +function Affine3A.from_quat(rotation) end + +---@param p1 Affine3A +---@param p2 Affine3A +---@return Affine3A +function Affine3A.mul(p1,p2) end + +---@param _self Affine3A +---@return Affine3A +function Affine3A.clone(_self) end + +---@param _self Affine3A +---@return boolean +function Affine3A.is_finite(_self) end + +---@param _self Affine3A +---@param rhs Vec3A +---@return Vec3A +function Affine3A.transform_vector3a(_self,rhs) end + +---@param scale Vec3 +---@param rotation Quat +---@param translation Vec3 +---@return Affine3A +function Affine3A.from_scale_rotation_translation(scale,rotation,translation) end + +---@param eye Vec3 +---@param center Vec3 +---@param up Vec3 +---@return Affine3A +function Affine3A.look_at_rh(eye,center,up) end + +---@param _self Affine3A +---@param rhs Affine3A +---@param max_abs_diff number +---@return boolean +function Affine3A.abs_diff_eq(_self,rhs,max_abs_diff) end + +---@param eye Vec3 +---@param center Vec3 +---@param up Vec3 +---@return Affine3A +function Affine3A.look_at_lh(eye,center,up) end + +---@param m Mat4 +---@return Affine3A +function Affine3A.from_mat4(m) end + +---@param eye Vec3 +---@param dir Vec3 +---@param up Vec3 +---@return Affine3A +function Affine3A.look_to_lh(eye,dir,up) end + +---@param rotation Quat +---@param translation Vec3 +---@return Affine3A +function Affine3A.from_rotation_translation(rotation,translation) end + +---@param mat3 Mat3 +---@return Affine3A +function Affine3A.from_mat3(mat3) end + +---@param p1 Affine3A +---@param p2 Mat4 +---@return Mat4 +function Affine3A.mul(p1,p2) end + +---@param _self Affine3A +---@return number[] +function Affine3A.to_cols_array(_self) end + +---@param x_axis Vec3A +---@param y_axis Vec3A +---@param z_axis Vec3A +---@param w_axis Vec3A +---@return Affine3A +function Affine3A.from_cols(x_axis,y_axis,z_axis,w_axis) end + +---@param _self Affine3A +---@param rhs Vec3 +---@return Vec3 +function Affine3A.transform_vector3(_self,rhs) end + +---@param angle number +---@return Affine3A +function Affine3A.from_rotation_y(angle) end + +---@param translation Vec3 +---@return Affine3A +function Affine3A.from_translation(translation) end + +---@param _self Affine3A +---@return number[][] +function Affine3A.to_cols_array_2d(_self) end + +---@param _self Affine3A +---@return DAffine3 +function Affine3A.as_daffine3(_self) end + +---@param _self Affine3A +---@return Affine3A +function Affine3A.inverse(_self) end + +---@param _self Affine3A +---@param rhs Affine3A +---@return boolean +function Affine3A.__eq(_self,rhs) end + +---@param _self Affine3A +---@param rhs Affine3A +---@return boolean +function Affine3A.eq(_self,rhs) end + + + +---@class BVec2 : ReflectReference +---@field x ? boolean +---@field y ? boolean +BVec2 = {} + +---@param a boolean[] +---@return BVec2 +function BVec2.from_array(a) end + +---@param _self BVec2 +---@return integer +function BVec2.bitmask(_self) end + +---@param _self BVec2 +---@return BVec2 +function BVec2.clone(_self) end + +---@param _self BVec2 +---@param other BVec2 +---@return boolean +function BVec2.__eq(_self,other) end + +---@param _self BVec2 +---@param other BVec2 +---@return boolean +function BVec2.eq(_self,other) end + +---@param _self BVec2 +---@param index integer +---@param value boolean +---@return nil +function BVec2.set(_self,index,value) end + +---@param _self BVec2 +---@return nil +function BVec2.assert_receiver_is_total_eq(_self) end + +---@param _self BVec2 +---@param index integer +---@return boolean +function BVec2.test(_self,index) end + +---@param _self BVec2 +---@return boolean +function BVec2.all(_self) end + +---@param v boolean +---@return BVec2 +function BVec2.splat(v) end + +---@param _self BVec2 +---@return boolean +function BVec2.any(_self) end + +---@param x boolean +---@param y boolean +---@return BVec2 +function BVec2.new(x,y) end + + + +---@class BVec3 : ReflectReference +---@field x ? boolean +---@field y ? boolean +---@field z ? boolean +BVec3 = {} + +---@param _self BVec3 +---@return nil +function BVec3.assert_receiver_is_total_eq(_self) end + +---@param x boolean +---@param y boolean +---@param z boolean +---@return BVec3 +function BVec3.new(x,y,z) end + +---@param v boolean +---@return BVec3 +function BVec3.splat(v) end + +---@param _self BVec3 +---@return integer +function BVec3.bitmask(_self) end + +---@param a boolean[] +---@return BVec3 +function BVec3.from_array(a) end + +---@param _self BVec3 +---@param other BVec3 +---@return boolean +function BVec3.__eq(_self,other) end + +---@param _self BVec3 +---@param other BVec3 +---@return boolean +function BVec3.eq(_self,other) end + +---@param _self BVec3 +---@return boolean +function BVec3.all(_self) end + +---@param _self BVec3 +---@return boolean +function BVec3.any(_self) end + +---@param _self BVec3 +---@param index integer +---@param value boolean +---@return nil +function BVec3.set(_self,index,value) end + +---@param _self BVec3 +---@param index integer +---@return boolean +function BVec3.test(_self,index) end + +---@param _self BVec3 +---@return BVec3 +function BVec3.clone(_self) end + + + +---@class BVec3A : ReflectReference +BVec3A = {} + +---@param a boolean[] +---@return BVec3A +function BVec3A.from_array(a) end + +---@param _self BVec3A +---@return BVec3A +function BVec3A.clone(_self) end + +---@param x boolean +---@param y boolean +---@param z boolean +---@return BVec3A +function BVec3A.new(x,y,z) end + +---@param _self BVec3A +---@param index integer +---@return boolean +function BVec3A.test(_self,index) end + +---@param _self BVec3A +---@param index integer +---@param value boolean +---@return nil +function BVec3A.set(_self,index,value) end + +---@param _self BVec3A +---@param rhs BVec3A +---@return boolean +function BVec3A.__eq(_self,rhs) end + +---@param _self BVec3A +---@param rhs BVec3A +---@return boolean +function BVec3A.eq(_self,rhs) end + +---@param _self BVec3A +---@return boolean +function BVec3A.all(_self) end + +---@param v boolean +---@return BVec3A +function BVec3A.splat(v) end + +---@param _self BVec3A +---@return boolean +function BVec3A.any(_self) end + +---@param _self BVec3A +---@return integer +function BVec3A.bitmask(_self) end + + + +---@class BVec4 : ReflectReference +---@field x ? boolean +---@field y ? boolean +---@field z ? boolean +---@field w ? boolean +BVec4 = {} + +---@param _self BVec4 +---@return boolean +function BVec4.any(_self) end + +---@param _self BVec4 +---@return nil +function BVec4.assert_receiver_is_total_eq(_self) end + +---@param _self BVec4 +---@param index integer +---@return boolean +function BVec4.test(_self,index) end + +---@param _self BVec4 +---@return boolean +function BVec4.all(_self) end + +---@param _self BVec4 +---@param index integer +---@param value boolean +---@return nil +function BVec4.set(_self,index,value) end + +---@param _self BVec4 +---@return integer +function BVec4.bitmask(_self) end + +---@param _self BVec4 +---@return BVec4 +function BVec4.clone(_self) end + +---@param _self BVec4 +---@param other BVec4 +---@return boolean +function BVec4.__eq(_self,other) end + +---@param _self BVec4 +---@param other BVec4 +---@return boolean +function BVec4.eq(_self,other) end + +---@param v boolean +---@return BVec4 +function BVec4.splat(v) end + +---@param x boolean +---@param y boolean +---@param z boolean +---@param w boolean +---@return BVec4 +function BVec4.new(x,y,z,w) end + +---@param a boolean[] +---@return BVec4 +function BVec4.from_array(a) end + + + +---@class BVec4A : ReflectReference +BVec4A = {} + +---@param v boolean +---@return BVec4A +function BVec4A.splat(v) end + +---@param _self BVec4A +---@return integer +function BVec4A.bitmask(_self) end + +---@param a boolean[] +---@return BVec4A +function BVec4A.from_array(a) end + +---@param _self BVec4A +---@return boolean +function BVec4A.any(_self) end + +---@param _self BVec4A +---@param index integer +---@param value boolean +---@return nil +function BVec4A.set(_self,index,value) end + +---@param _self BVec4A +---@return BVec4A +function BVec4A.clone(_self) end + +---@param x boolean +---@param y boolean +---@param z boolean +---@param w boolean +---@return BVec4A +function BVec4A.new(x,y,z,w) end + +---@param _self BVec4A +---@param index integer +---@return boolean +function BVec4A.test(_self,index) end + +---@param _self BVec4A +---@return boolean +function BVec4A.all(_self) end + +---@param _self BVec4A +---@param rhs BVec4A +---@return boolean +function BVec4A.__eq(_self,rhs) end + +---@param _self BVec4A +---@param rhs BVec4A +---@return boolean +function BVec4A.eq(_self,rhs) end + + + +---@class DAffine2 : ReflectReference +---@field matrix2 ? DMat2 +---@field translation ? DVec2 +---@operator mul(DMat3): DMat3 +---@operator mul(DAffine2): DAffine2 +---@operator mul(DMat3): DMat3 +---@operator mul(DAffine2): DAffine2 +DAffine2 = {} + +---@param scale DVec2 +---@param angle number +---@param translation DVec2 +---@return DAffine2 +function DAffine2.from_scale_angle_translation(scale,angle,translation) end + +---@param angle number +---@return DAffine2 +function DAffine2.from_angle(angle) end + +---@param _self DAffine2 +---@return boolean +function DAffine2.is_finite(_self) end + +---@param x_axis DVec2 +---@param y_axis DVec2 +---@param z_axis DVec2 +---@return DAffine2 +function DAffine2.from_cols(x_axis,y_axis,z_axis) end + +---@param _self DAffine2 +---@param rhs DAffine2 +---@return boolean +function DAffine2.__eq(_self,rhs) end + +---@param _self DAffine2 +---@param rhs DAffine2 +---@return boolean +function DAffine2.eq(_self,rhs) end + +---@param scale DVec2 +---@return DAffine2 +function DAffine2.from_scale(scale) end + +---@param p1 DAffine2 +---@param p2 DMat3 +---@return DMat3 +function DAffine2.mul(p1,p2) end + +---@param angle number +---@param translation DVec2 +---@return DAffine2 +function DAffine2.from_angle_translation(angle,translation) end + +---@param _self DAffine2 +---@param rhs DAffine2 +---@param max_abs_diff number +---@return boolean +function DAffine2.abs_diff_eq(_self,rhs,max_abs_diff) end + +---@param _self DAffine2 +---@param rhs DVec2 +---@return DVec2 +function DAffine2.transform_vector2(_self,rhs) end + +---@param matrix2 DMat2 +---@param translation DVec2 +---@return DAffine2 +function DAffine2.from_mat2_translation(matrix2,translation) end + +---@param p1 DAffine2 +---@param p2 DAffine2 +---@return DAffine2 +function DAffine2.mul(p1,p2) end + +---@param _self DAffine2 +---@return number[] +function DAffine2.to_cols_array(_self) end + +---@param p1 DAffine2 +---@param p2 DMat3 +---@return DMat3 +function DAffine2.mul(p1,p2) end + +---@param _self DAffine2 +---@param rhs DVec2 +---@return DVec2 +function DAffine2.transform_point2(_self,rhs) end + +---@param _self DAffine2 +---@param rhs DAffine2 +---@return DAffine2 +function DAffine2.mul(_self,rhs) end + +---@param _self DAffine2 +---@return number[][] +function DAffine2.to_cols_array_2d(_self) end + +---@param _self DAffine2 +---@return boolean +function DAffine2.is_nan(_self) end + +---@param translation DVec2 +---@return DAffine2 +function DAffine2.from_translation(translation) end + +---@param _self DAffine2 +---@return Affine2 +function DAffine2.as_affine2(_self) end + +---@param m DMat3 +---@return DAffine2 +function DAffine2.from_mat3(m) end + +---@param _self DAffine2 +---@return DAffine2 +function DAffine2.clone(_self) end + +---@param matrix2 DMat2 +---@return DAffine2 +function DAffine2.from_mat2(matrix2) end + +---@param _self DAffine2 +---@return DAffine2 +function DAffine2.inverse(_self) end + + + +---@class DAffine3 : ReflectReference +---@field matrix3 ? DMat3 +---@field translation ? DVec3 +---@operator mul(DMat4): DMat4 +---@operator mul(DAffine3): DAffine3 +---@operator mul(DMat4): DMat4 +---@operator mul(DAffine3): DAffine3 +DAffine3 = {} + +---@param p1 DAffine3 +---@param p2 DMat4 +---@return DMat4 +function DAffine3.mul(p1,p2) end + +---@param translation DVec3 +---@return DAffine3 +function DAffine3.from_translation(translation) end + +---@param eye DVec3 +---@param center DVec3 +---@param up DVec3 +---@return DAffine3 +function DAffine3.look_at_lh(eye,center,up) end + +---@param _self DAffine3 +---@return number[][] +function DAffine3.to_cols_array_2d(_self) end + +---@param rotation DQuat +---@param translation DVec3 +---@return DAffine3 +function DAffine3.from_rotation_translation(rotation,translation) end + +---@param rotation DQuat +---@return DAffine3 +function DAffine3.from_quat(rotation) end + +---@param _self DAffine3 +---@return Affine3A +function DAffine3.as_affine3a(_self) end + +---@param m DMat4 +---@return DAffine3 +function DAffine3.from_mat4(m) end + +---@param _self DAffine3 +---@return boolean +function DAffine3.is_finite(_self) end + +---@param mat3 DMat3 +---@param translation DVec3 +---@return DAffine3 +function DAffine3.from_mat3_translation(mat3,translation) end + +---@param eye DVec3 +---@param center DVec3 +---@param up DVec3 +---@return DAffine3 +function DAffine3.look_at_rh(eye,center,up) end + +---@param _self DAffine3 +---@return DAffine3 +function DAffine3.inverse(_self) end + +---@param mat3 DMat3 +---@return DAffine3 +function DAffine3.from_mat3(mat3) end + +---@param p1 DAffine3 +---@param p2 DAffine3 +---@return DAffine3 +function DAffine3.mul(p1,p2) end + +---@param _self DAffine3 +---@param rhs DAffine3 +---@return boolean +function DAffine3.__eq(_self,rhs) end + +---@param _self DAffine3 +---@param rhs DAffine3 +---@return boolean +function DAffine3.eq(_self,rhs) end + +---@param _self DAffine3 +---@return number[] +function DAffine3.to_cols_array(_self) end + +---@param _self DAffine3 +---@param rhs DVec3 +---@return DVec3 +function DAffine3.transform_point3(_self,rhs) end + +---@param p1 DAffine3 +---@param p2 DMat4 +---@return DMat4 +function DAffine3.mul(p1,p2) end + +---@param scale DVec3 +---@param rotation DQuat +---@param translation DVec3 +---@return DAffine3 +function DAffine3.from_scale_rotation_translation(scale,rotation,translation) end + +---@param x_axis DVec3 +---@param y_axis DVec3 +---@param z_axis DVec3 +---@param w_axis DVec3 +---@return DAffine3 +function DAffine3.from_cols(x_axis,y_axis,z_axis,w_axis) end + +---@param _self DAffine3 +---@param rhs DVec3 +---@return DVec3 +function DAffine3.transform_vector3(_self,rhs) end + +---@param scale DVec3 +---@return DAffine3 +function DAffine3.from_scale(scale) end + +---@param angle number +---@return DAffine3 +function DAffine3.from_rotation_y(angle) end + +---@param eye DVec3 +---@param dir DVec3 +---@param up DVec3 +---@return DAffine3 +function DAffine3.look_to_rh(eye,dir,up) end + +---@param _self DAffine3 +---@return DAffine3 +function DAffine3.clone(_self) end + +---@param eye DVec3 +---@param dir DVec3 +---@param up DVec3 +---@return DAffine3 +function DAffine3.look_to_lh(eye,dir,up) end + +---@param angle number +---@return DAffine3 +function DAffine3.from_rotation_x(angle) end + +---@param axis DVec3 +---@param angle number +---@return DAffine3 +function DAffine3.from_axis_angle(axis,angle) end + +---@param _self DAffine3 +---@param rhs DAffine3 +---@return DAffine3 +function DAffine3.mul(_self,rhs) end + +---@param _self DAffine3 +---@return boolean +function DAffine3.is_nan(_self) end + +---@param angle number +---@return DAffine3 +function DAffine3.from_rotation_z(angle) end + +---@param _self DAffine3 +---@param rhs DAffine3 +---@param max_abs_diff number +---@return boolean +function DAffine3.abs_diff_eq(_self,rhs,max_abs_diff) end + + + +---@class DMat2 : ReflectReference +---@field x_axis ? DVec2 +---@field y_axis ? DVec2 +---@operator add(DMat2): DMat2 +---@operator unm: DMat2 +---@operator mul(DVec2): DVec2 +---@operator mul(number): DMat2 +---@operator mul(DMat2): DMat2 +---@operator add(DMat2): DMat2 +---@operator div(number): DMat2 +---@operator sub(DMat2): DMat2 +---@operator sub(DMat2): DMat2 +---@operator mul(DVec2): DVec2 +---@operator mul(DMat2): DMat2 +DMat2 = {} + +---@param p1 DMat2 +---@param p2 DMat2 +---@return DMat2 +function DMat2.add(p1,p2) end + +---@param _self DMat2 +---@param rhs DMat2 +---@return boolean +function DMat2.__eq(_self,rhs) end + +---@param _self DMat2 +---@param rhs DMat2 +---@return boolean +function DMat2.eq(_self,rhs) end + +---@param _self DMat2 +---@return number[] +function DMat2.to_cols_array(_self) end + +---@param _self DMat2 +---@param rhs DMat2 +---@param max_abs_diff number +---@return boolean +function DMat2.abs_diff_eq(_self,rhs,max_abs_diff) end + +---@param _self DMat2 +---@param rhs DMat2 +---@return DMat2 +function DMat2.add_mat2(_self,rhs) end + +---@param _self DMat2 +---@return DMat2 +function DMat2.neg(_self) end + +---@param x_axis DVec2 +---@param y_axis DVec2 +---@return DMat2 +function DMat2.from_cols(x_axis,y_axis) end + +---@param _self DMat2 +---@return DMat2 +function DMat2.abs(_self) end + +---@param p1 DMat2 +---@param p2 DVec2 +---@return DVec2 +function DMat2.mul(p1,p2) end + +---@param p1 DMat2 +---@param p2 number +---@return DMat2 +function DMat2.mul(p1,p2) end + +---@param _self DMat2 +---@param index integer +---@return DVec2 +function DMat2.row(_self,index) end + +---@param m DMat3 +---@param i integer +---@param j integer +---@return DMat2 +function DMat2.from_mat3_minor(m,i,j) end + +---@param _self DMat2 +---@return boolean +function DMat2.is_finite(_self) end + +---@param diagonal DVec2 +---@return DMat2 +function DMat2.from_diagonal(diagonal) end + +---@param _self DMat2 +---@return DMat2 +function DMat2.clone(_self) end + +---@param _self DMat2 +---@param rhs DMat2 +---@return DMat2 +function DMat2.mul_mat2(_self,rhs) end + +---@param _self DMat2 +---@return DMat2 +function DMat2.transpose(_self) end + +---@param p1 DMat2 +---@param p2 DMat2 +---@return DMat2 +function DMat2.mul(p1,p2) end + +---@param _self DMat2 +---@param rhs DMat2 +---@return DMat2 +function DMat2.sub_mat2(_self,rhs) end + +---@param _self DMat2 +---@param rhs DMat2 +---@return DMat2 +function DMat2.add(_self,rhs) end + +---@param _self DMat2 +---@param rhs number +---@return DMat2 +function DMat2.div(_self,rhs) end + +---@param angle number +---@return DMat2 +function DMat2.from_angle(angle) end + +---@param m DMat3 +---@return DMat2 +function DMat2.from_mat3(m) end + +---@param _self DMat2 +---@param rhs DMat2 +---@return DMat2 +function DMat2.sub(_self,rhs) end + +---@param _self DMat2 +---@return boolean +function DMat2.is_nan(_self) end + +---@param _self DMat2 +---@return number +function DMat2.determinant(_self) end + +---@param _self DMat2 +---@param rhs DVec2 +---@return DVec2 +function DMat2.mul_vec2(_self,rhs) end + +---@param _self DMat2 +---@return DMat2 +function DMat2.inverse(_self) end + +---@param _self DMat2 +---@param index integer +---@return DVec2 +function DMat2.col(_self,index) end + +---@param p1 DMat2 +---@param p2 DMat2 +---@return DMat2 +function DMat2.sub(p1,p2) end + +---@param _self DMat2 +---@return Mat2 +function DMat2.as_mat2(_self) end + +---@param _self DMat2 +---@param rhs number +---@return DMat2 +function DMat2.mul_scalar(_self,rhs) end + +---@param _self DMat2 +---@return number[][] +function DMat2.to_cols_array_2d(_self) end + +---@param _self DMat2 +---@param rhs number +---@return DMat2 +function DMat2.div_scalar(_self,rhs) end + +---@param scale DVec2 +---@param angle number +---@return DMat2 +function DMat2.from_scale_angle(scale,angle) end + +---@param p1 DMat2 +---@param p2 DVec2 +---@return DVec2 +function DMat2.mul(p1,p2) end + +---@param _self DMat2 +---@param rhs DMat2 +---@return DMat2 +function DMat2.mul(_self,rhs) end + + + +---@class DMat3 : ReflectReference +---@field x_axis ? DVec3 +---@field y_axis ? DVec3 +---@field z_axis ? DVec3 +---@operator add(DMat3): DMat3 +---@operator unm: DMat3 +---@operator mul(number): DMat3 +---@operator mul(DMat3): DMat3 +---@operator div(number): DMat3 +---@operator sub(DMat3): DMat3 +---@operator add(DMat3): DMat3 +---@operator mul(DVec3): DVec3 +---@operator mul(DMat3): DMat3 +---@operator mul(DVec3): DVec3 +---@operator sub(DMat3): DMat3 +---@operator mul(DAffine2): DMat3 +---@operator mul(DAffine2): DMat3 +DMat3 = {} + +---@param _self DMat3 +---@param rhs DMat3 +---@return DMat3 +function DMat3.add(_self,rhs) end + +---@param _self DMat3 +---@return DMat3 +function DMat3.neg(_self) end + +---@param p1 DMat3 +---@param p2 number +---@return DMat3 +function DMat3.mul(p1,p2) end + +---@param translation DVec2 +---@return DMat3 +function DMat3.from_translation(translation) end + +---@param _self DMat3 +---@param rhs DVec2 +---@return DVec2 +function DMat3.transform_point2(_self,rhs) end + +---@param _self DMat3 +---@param order EulerRot +---@return [number, number, number] +function DMat3.to_euler(_self,order) end + +---@param diagonal DVec3 +---@return DMat3 +function DMat3.from_diagonal(diagonal) end + +---@param _self DMat3 +---@param index integer +---@return DVec3 +function DMat3.row(_self,index) end + +---@param angle number +---@return DMat3 +function DMat3.from_rotation_z(angle) end + +---@param angle number +---@return DMat3 +function DMat3.from_rotation_x(angle) end + +---@param _self DMat3 +---@return DMat3 +function DMat3.abs(_self) end + +---@param _self DMat3 +---@param rhs DMat3 +---@return boolean +function DMat3.__eq(_self,rhs) end + +---@param _self DMat3 +---@param rhs DMat3 +---@return boolean +function DMat3.eq(_self,rhs) end + +---@param p1 DMat3 +---@param p2 DMat3 +---@return DMat3 +function DMat3.mul(p1,p2) end + +---@param m DMat2 +---@return DMat3 +function DMat3.from_mat2(m) end + +---@param _self DMat3 +---@return DMat3 +function DMat3.transpose(_self) end + +---@param scale DVec2 +---@param angle number +---@param translation DVec2 +---@return DMat3 +function DMat3.from_scale_angle_translation(scale,angle,translation) end + +---@param _self DMat3 +---@param rhs DMat3 +---@param max_abs_diff number +---@return boolean +function DMat3.abs_diff_eq(_self,rhs,max_abs_diff) end + +---@param _self DMat3 +---@param rhs number +---@return DMat3 +function DMat3.mul_scalar(_self,rhs) end + +---@param _self DMat3 +---@param rhs number +---@return DMat3 +function DMat3.div(_self,rhs) end + +---@param _self DMat3 +---@param rhs DMat3 +---@return DMat3 +function DMat3.sub_mat3(_self,rhs) end + +---@param _self DMat3 +---@param rhs DVec2 +---@return DVec2 +function DMat3.transform_vector2(_self,rhs) end + +---@param _self DMat3 +---@param rhs number +---@return DMat3 +function DMat3.div_scalar(_self,rhs) end + +---@param _self DMat3 +---@param rhs DMat3 +---@return DMat3 +function DMat3.sub(_self,rhs) end + +---@param p1 DMat3 +---@param p2 DMat3 +---@return DMat3 +function DMat3.add(p1,p2) end + +---@param p1 DMat3 +---@param p2 DVec3 +---@return DVec3 +function DMat3.mul(p1,p2) end + +---@param angle number +---@return DMat3 +function DMat3.from_angle(angle) end + +---@param eye DVec3 +---@param center DVec3 +---@param up DVec3 +---@return DMat3 +function DMat3.look_at_lh(eye,center,up) end + +---@param angle number +---@return DMat3 +function DMat3.from_rotation_y(angle) end + +---@param axis DVec3 +---@param angle number +---@return DMat3 +function DMat3.from_axis_angle(axis,angle) end + +---@param _self DMat3 +---@param rhs DMat3 +---@return DMat3 +function DMat3.mul_mat3(_self,rhs) end + +---@param _self DMat3 +---@param rhs DMat3 +---@return DMat3 +function DMat3.add_mat3(_self,rhs) end + +---@param rotation DQuat +---@return DMat3 +function DMat3.from_quat(rotation) end + +---@param dir DVec3 +---@param up DVec3 +---@return DMat3 +function DMat3.look_to_rh(dir,up) end + +---@param _self DMat3 +---@return boolean +function DMat3.is_nan(_self) end + +---@param _self DMat3 +---@param rhs DVec3 +---@return DVec3 +function DMat3.mul_vec3(_self,rhs) end + +---@param _self DMat3 +---@return number[][] +function DMat3.to_cols_array_2d(_self) end + +---@param _self DMat3 +---@return number[] +function DMat3.to_cols_array(_self) end + +---@param p1 DMat3 +---@param p2 DMat3 +---@return DMat3 +function DMat3.mul(p1,p2) end + +---@param _self DMat3 +---@return DMat3 +function DMat3.inverse(_self) end + +---@param m DMat4 +---@return DMat3 +function DMat3.from_mat4(m) end + +---@param _self DMat3 +---@return boolean +function DMat3.is_finite(_self) end + +---@param x_axis DVec3 +---@param y_axis DVec3 +---@param z_axis DVec3 +---@return DMat3 +function DMat3.from_cols(x_axis,y_axis,z_axis) end + +---@param eye DVec3 +---@param center DVec3 +---@param up DVec3 +---@return DMat3 +function DMat3.look_at_rh(eye,center,up) end + +---@param _self DMat3 +---@return DMat3 +function DMat3.clone(_self) end + +---@param m DMat4 +---@param i integer +---@param j integer +---@return DMat3 +function DMat3.from_mat4_minor(m,i,j) end + +---@param _self DMat3 +---@param index integer +---@return DVec3 +function DMat3.col(_self,index) end + +---@param _self DMat3 +---@return Mat3 +function DMat3.as_mat3(_self) end + +---@param _self DMat3 +---@return number +function DMat3.determinant(_self) end + +---@param p1 DMat3 +---@param p2 DVec3 +---@return DVec3 +function DMat3.mul(p1,p2) end + +---@param scale DVec2 +---@return DMat3 +function DMat3.from_scale(scale) end + +---@param order EulerRot +---@param a number +---@param b number +---@param c number +---@return DMat3 +function DMat3.from_euler(order,a,b,c) end + +---@param p1 DMat3 +---@param p2 DMat3 +---@return DMat3 +function DMat3.sub(p1,p2) end + +---@param dir DVec3 +---@param up DVec3 +---@return DMat3 +function DMat3.look_to_lh(dir,up) end + +---@param _self DMat3 +---@param rhs DAffine2 +---@return DMat3 +function DMat3.mul(_self,rhs) end + +---@param p1 DMat3 +---@param p2 DAffine2 +---@return DMat3 +function DMat3.mul(p1,p2) end + + + +---@class DMat4 : ReflectReference +---@field x_axis ? DVec4 +---@field y_axis ? DVec4 +---@field z_axis ? DVec4 +---@field w_axis ? DVec4 +---@operator add(DMat4): DMat4 +---@operator unm: DMat4 +---@operator mul(DAffine3): DMat4 +---@operator mul(DAffine3): DMat4 +---@operator sub(DMat4): DMat4 +---@operator mul(DMat4): DMat4 +---@operator div(number): DMat4 +---@operator mul(number): DMat4 +---@operator sub(DMat4): DMat4 +---@operator mul(DVec4): DVec4 +---@operator mul(DMat4): DMat4 +---@operator add(DMat4): DMat4 +---@operator mul(DVec4): DVec4 +DMat4 = {} + +---@param p1 DMat4 +---@param p2 DMat4 +---@return DMat4 +function DMat4.add(p1,p2) end + +---@param _self DMat4 +---@return DMat4 +function DMat4.neg(_self) end + +---@param fov_y_radians number +---@param aspect_ratio number +---@param z_near number +---@return DMat4 +function DMat4.perspective_infinite_reverse_lh(fov_y_radians,aspect_ratio,z_near) end + +---@param _self DMat4 +---@param rhs DVec3 +---@return DVec3 +function DMat4.transform_vector3(_self,rhs) end + +---@param left number +---@param right number +---@param bottom number +---@param top number +---@param z_near number +---@param z_far number +---@return DMat4 +function DMat4.frustum_rh(left,right,bottom,top,z_near,z_far) end + +---@param _self DMat4 +---@param rhs DVec3 +---@return DVec3 +function DMat4.transform_point3(_self,rhs) end + +---@param scale DVec3 +---@param rotation DQuat +---@param translation DVec3 +---@return DMat4 +function DMat4.from_scale_rotation_translation(scale,rotation,translation) end + +---@param m DMat3 +---@return DMat4 +function DMat4.from_mat3(m) end + +---@param left number +---@param right number +---@param bottom number +---@param top number +---@param z_near number +---@param z_far number +---@return DMat4 +function DMat4.frustum_lh(left,right,bottom,top,z_near,z_far) end + +---@param fov_y_radians number +---@param aspect_ratio number +---@param z_near number +---@return DMat4 +function DMat4.perspective_infinite_rh(fov_y_radians,aspect_ratio,z_near) end + +---@param _self DMat4 +---@param rhs DMat4 +---@return DMat4 +function DMat4.add_mat4(_self,rhs) end + +---@param _self DMat4 +---@return DMat4 +function DMat4.inverse(_self) end + +---@param fov_y_radians number +---@param aspect_ratio number +---@param z_near number +---@return DMat4 +function DMat4.perspective_infinite_lh(fov_y_radians,aspect_ratio,z_near) end + +---@param left number +---@param right number +---@param bottom number +---@param top number +---@param near number +---@param far number +---@return DMat4 +function DMat4.orthographic_rh(left,right,bottom,top,near,far) end + +---@param left number +---@param right number +---@param bottom number +---@param top number +---@param z_near number +---@param z_far number +---@return DMat4 +function DMat4.frustum_rh_gl(left,right,bottom,top,z_near,z_far) end + +---@param p1 DMat4 +---@param p2 DAffine3 +---@return DMat4 +function DMat4.mul(p1,p2) end + +---@param _self DMat4 +---@param rhs DMat4 +---@param max_abs_diff number +---@return boolean +function DMat4.abs_diff_eq(_self,rhs,max_abs_diff) end + +---@param fov_y_radians number +---@param aspect_ratio number +---@param z_near number +---@return DMat4 +function DMat4.perspective_infinite_reverse_rh(fov_y_radians,aspect_ratio,z_near) end + +---@param _self DMat4 +---@param rhs DMat4 +---@return DMat4 +function DMat4.mul_mat4(_self,rhs) end + +---@param eye DVec3 +---@param dir DVec3 +---@param up DVec3 +---@return DMat4 +function DMat4.look_to_rh(eye,dir,up) end + +---@param _self DMat4 +---@param rhs DAffine3 +---@return DMat4 +function DMat4.mul(_self,rhs) end + +---@param _self DMat4 +---@return DMat4 +function DMat4.clone(_self) end + +---@param _self DMat4 +---@param rhs DMat4 +---@return DMat4 +function DMat4.sub(_self,rhs) end + +---@param _self DMat4 +---@param rhs DMat4 +---@return boolean +function DMat4.__eq(_self,rhs) end + +---@param _self DMat4 +---@param rhs DMat4 +---@return boolean +function DMat4.eq(_self,rhs) end + +---@param mat3 DMat3 +---@param translation DVec3 +---@return DMat4 +function DMat4.from_mat3_translation(mat3,translation) end + +---@param order EulerRot +---@param a number +---@param b number +---@param c number +---@return DMat4 +function DMat4.from_euler(order,a,b,c) end + +---@param _self DMat4 +---@param index integer +---@return DVec4 +function DMat4.col(_self,index) end + +---@param angle number +---@return DMat4 +function DMat4.from_rotation_z(angle) end + +---@param _self DMat4 +---@param rhs DVec4 +---@return DVec4 +function DMat4.mul_vec4(_self,rhs) end + +---@param _self DMat4 +---@return number[][] +function DMat4.to_cols_array_2d(_self) end + +---@param p1 DMat4 +---@param p2 DMat4 +---@return DMat4 +function DMat4.mul(p1,p2) end + +---@param translation DVec3 +---@return DMat4 +function DMat4.from_translation(translation) end + +---@param _self DMat4 +---@param rhs number +---@return DMat4 +function DMat4.div_scalar(_self,rhs) end + +---@param angle number +---@return DMat4 +function DMat4.from_rotation_x(angle) end + +---@param _self DMat4 +---@return DMat4 +function DMat4.abs(_self) end + +---@param _self DMat4 +---@param rhs number +---@return DMat4 +function DMat4.div(_self,rhs) end + +---@param left number +---@param right number +---@param bottom number +---@param top number +---@param near number +---@param far number +---@return DMat4 +function DMat4.orthographic_lh(left,right,bottom,top,near,far) end + +---@param p1 DMat4 +---@param p2 number +---@return DMat4 +function DMat4.mul(p1,p2) end + +---@param _self DMat4 +---@return boolean +function DMat4.is_finite(_self) end + +---@param axis DVec3 +---@param angle number +---@return DMat4 +function DMat4.from_axis_angle(axis,angle) end + +---@param _self DMat4 +---@param rhs DMat4 +---@return DMat4 +function DMat4.sub_mat4(_self,rhs) end + +---@param left number +---@param right number +---@param bottom number +---@param top number +---@param near number +---@param far number +---@return DMat4 +function DMat4.orthographic_rh_gl(left,right,bottom,top,near,far) end + +---@param _self DMat4 +---@return number +function DMat4.determinant(_self) end + +---@param fov_y_radians number +---@param aspect_ratio number +---@param z_near number +---@param z_far number +---@return DMat4 +function DMat4.perspective_rh_gl(fov_y_radians,aspect_ratio,z_near,z_far) end + +---@param _self DMat4 +---@param index integer +---@return DVec4 +function DMat4.row(_self,index) end + +---@param eye DVec3 +---@param center DVec3 +---@param up DVec3 +---@return DMat4 +function DMat4.look_at_rh(eye,center,up) end + +---@param diagonal DVec4 +---@return DMat4 +function DMat4.from_diagonal(diagonal) end + +---@param _self DMat4 +---@param rhs number +---@return DMat4 +function DMat4.mul_scalar(_self,rhs) end + +---@param x_axis DVec4 +---@param y_axis DVec4 +---@param z_axis DVec4 +---@param w_axis DVec4 +---@return DMat4 +function DMat4.from_cols(x_axis,y_axis,z_axis,w_axis) end + +---@param _self DMat4 +---@return DMat4 +function DMat4.transpose(_self) end + +---@param eye DVec3 +---@param dir DVec3 +---@param up DVec3 +---@return DMat4 +function DMat4.look_to_lh(eye,dir,up) end + +---@param _self DMat4 +---@param rhs DVec3 +---@return DVec3 +function DMat4.project_point3(_self,rhs) end + +---@param angle number +---@return DMat4 +function DMat4.from_rotation_y(angle) end + +---@param p1 DMat4 +---@param p2 DMat4 +---@return DMat4 +function DMat4.sub(p1,p2) end + +---@param _self DMat4 +---@return boolean +function DMat4.is_nan(_self) end + +---@param fov_y_radians number +---@param aspect_ratio number +---@param z_near number +---@param z_far number +---@return DMat4 +function DMat4.perspective_lh(fov_y_radians,aspect_ratio,z_near,z_far) end + +---@param p1 DMat4 +---@param p2 DVec4 +---@return DVec4 +function DMat4.mul(p1,p2) end + +---@param p1 DMat4 +---@param p2 DMat4 +---@return DMat4 +function DMat4.mul(p1,p2) end + +---@param rotation DQuat +---@param translation DVec3 +---@return DMat4 +function DMat4.from_rotation_translation(rotation,translation) end + +---@param eye DVec3 +---@param center DVec3 +---@param up DVec3 +---@return DMat4 +function DMat4.look_at_lh(eye,center,up) end + +---@param _self DMat4 +---@param order EulerRot +---@return [number, number, number] +function DMat4.to_euler(_self,order) end + +---@param _self DMat4 +---@return number[] +function DMat4.to_cols_array(_self) end + +---@param _self DMat4 +---@param rhs DMat4 +---@return DMat4 +function DMat4.add(_self,rhs) end + +---@param p1 DMat4 +---@param p2 DVec4 +---@return DVec4 +function DMat4.mul(p1,p2) end + +---@param fov_y_radians number +---@param aspect_ratio number +---@param z_near number +---@param z_far number +---@return DMat4 +function DMat4.perspective_rh(fov_y_radians,aspect_ratio,z_near,z_far) end + +---@param rotation DQuat +---@return DMat4 +function DMat4.from_quat(rotation) end + +---@param _self DMat4 +---@return Mat4 +function DMat4.as_mat4(_self) end + +---@param scale DVec3 +---@return DMat4 +function DMat4.from_scale(scale) end + + + +---@class DQuat : ReflectReference +---@field x ? number +---@field y ? number +---@field z ? number +---@field w ? number +---@operator add(DQuat): DQuat +---@operator mul(number): DQuat +---@operator add(DQuat): DQuat +---@operator mul(DQuat): DQuat +---@operator sub(DQuat): DQuat +---@operator unm: DQuat +---@operator div(number): DQuat +---@operator mul(DVec3): DVec3 +---@operator mul(DVec3): DVec3 +---@operator mul(DQuat): DQuat +---@operator sub(DQuat): DQuat +DQuat = {} + +---@param _self DQuat +---@param rhs DQuat +---@return DQuat +function DQuat.add(_self,rhs) end + +---@param p1 DQuat +---@param p2 number +---@return DQuat +function DQuat.mul(p1,p2) end + +---@param _self DQuat +---@param rhs DQuat +---@return number +function DQuat.dot(_self,rhs) end + +---@param p1 DQuat +---@param p2 DQuat +---@return DQuat +function DQuat.add(p1,p2) end + +---@param from DVec3 +---@param to DVec3 +---@return DQuat +function DQuat.from_rotation_arc(from,to) end + +---@param _self DQuat +---@return DVec3 +function DQuat.to_scaled_axis(_self) end + +---@param angle number +---@return DQuat +function DQuat.from_rotation_z(angle) end + +---@param _self DQuat +---@param rhs DQuat +---@param max_abs_diff number +---@return boolean +function DQuat.abs_diff_eq(_self,rhs,max_abs_diff) end + +---@param _self DQuat +---@return boolean +function DQuat.is_near_identity(_self) end + +---@param euler EulerRot +---@param a number +---@param b number +---@param c number +---@return DQuat +function DQuat.from_euler(euler,a,b,c) end + +---@param _self DQuat +---@return number +function DQuat.length_squared(_self) end + +---@param a number[] +---@return DQuat +function DQuat.from_array(a) end + +---@param _self DQuat +---@param rhs DQuat +---@return DQuat +function DQuat.mul(_self,rhs) end + +---@param _self DQuat +---@return number +function DQuat.length(_self) end + +---@param _self DQuat +---@param rhs DQuat +---@return DQuat +function DQuat.sub(_self,rhs) end + +---@param v DVec3 +---@return DQuat +function DQuat.from_scaled_axis(v) end + +---@param v DVec4 +---@return DQuat +function DQuat.from_vec4(v) end + +---@param mat DMat4 +---@return DQuat +function DQuat.from_mat4(mat) end + +---@param _self DQuat +---@param rhs DVec3 +---@return DVec3 +function DQuat.mul_vec3(_self,rhs) end + +---@param _self DQuat +---@return DQuat +function DQuat.clone(_self) end + +---@param _self DQuat +---@return DQuat +function DQuat.inverse(_self) end + +---@param dir DVec3 +---@param up DVec3 +---@return DQuat +function DQuat.look_to_lh(dir,up) end + +---@param _self DQuat +---@return DQuat +function DQuat.neg(_self) end + +---@param _self DQuat +---@param rhs number +---@return DQuat +function DQuat.div(_self,rhs) end + +---@param _self DQuat +---@return boolean +function DQuat.is_normalized(_self) end + +---@param angle number +---@return DQuat +function DQuat.from_rotation_y(angle) end + +---@param _self DQuat +---@return boolean +function DQuat.is_nan(_self) end + +---@param _self DQuat +---@return DQuat +function DQuat.conjugate(_self) end + +---@param p1 DQuat +---@param p2 DVec3 +---@return DVec3 +function DQuat.mul(p1,p2) end + +---@param from DVec3 +---@param to DVec3 +---@return DQuat +function DQuat.from_rotation_arc_colinear(from,to) end + +---@param _self DQuat +---@param rhs DQuat +---@return DQuat +function DQuat.mul_quat(_self,rhs) end + +---@param axis DVec3 +---@param angle number +---@return DQuat +function DQuat.from_axis_angle(axis,angle) end + +---@param p1 DQuat +---@param p2 DVec3 +---@return DVec3 +function DQuat.mul(p1,p2) end + +---@param p1 DQuat +---@param p2 DQuat +---@return DQuat +function DQuat.mul(p1,p2) end + +---@param _self DQuat +---@return number +function DQuat.length_recip(_self) end + +---@param angle number +---@return DQuat +function DQuat.from_rotation_x(angle) end + +---@param _self DQuat +---@param rhs DQuat +---@return boolean +function DQuat.__eq(_self,rhs) end + +---@param _self DQuat +---@param rhs DQuat +---@return boolean +function DQuat.eq(_self,rhs) end + +---@param x number +---@param y number +---@param z number +---@param w number +---@return DQuat +function DQuat.from_xyzw(x,y,z,w) end + +---@param dir DVec3 +---@param up DVec3 +---@return DQuat +function DQuat.look_to_rh(dir,up) end + +---@param mat DMat3 +---@return DQuat +function DQuat.from_mat3(mat) end + +---@param _self DQuat +---@param rhs DQuat +---@param max_angle number +---@return DQuat +function DQuat.rotate_towards(_self,rhs,max_angle) end + +---@param _self DQuat +---@param rhs DQuat +---@return number +function DQuat.angle_between(_self,rhs) end + +---@param p1 DQuat +---@param p2 DQuat +---@return DQuat +function DQuat.sub(p1,p2) end + +---@param _self DQuat +---@param order EulerRot +---@return [number, number, number] +function DQuat.to_euler(_self,order) end + +---@param _self DQuat +---@return number[] +function DQuat.to_array(_self) end + +---@param a DAffine3 +---@return DQuat +function DQuat.from_affine3(a) end + +---@param _self DQuat +---@param _end DQuat +---@param s number +---@return DQuat +function DQuat.lerp(_self,_end,s) end + +---@param _self DQuat +---@return boolean +function DQuat.is_finite(_self) end + +---@param from DVec2 +---@param to DVec2 +---@return DQuat +function DQuat.from_rotation_arc_2d(from,to) end + +---@param _self DQuat +---@return DVec3 +function DQuat.xyz(_self) end + +---@param eye DVec3 +---@param center DVec3 +---@param up DVec3 +---@return DQuat +function DQuat.look_at_lh(eye,center,up) end + +---@param _self DQuat +---@return DQuat +function DQuat.normalize(_self) end + +---@param _self DQuat +---@param _end DQuat +---@param s number +---@return DQuat +function DQuat.slerp(_self,_end,s) end + +---@param eye DVec3 +---@param center DVec3 +---@param up DVec3 +---@return DQuat +function DQuat.look_at_rh(eye,center,up) end + +---@param _self DQuat +---@return Quat +function DQuat.as_quat(_self) end + + + +---@class DVec2 : ReflectReference +---@field x ? number +---@field y ? number +---@operator div(DVec2): DVec2 +---@operator mul(number): DVec2 +---@operator sub(number): DVec2 +---@operator mod(number): DVec2 +---@operator mul(DVec2): DVec2 +---@operator add(DVec2): DVec2 +---@operator div(number): DVec2 +---@operator unm: DVec2 +---@operator sub(DVec2): DVec2 +---@operator add(DVec2): DVec2 +---@operator div(DVec2): DVec2 +---@operator mul(DVec2): DVec2 +---@operator mod(DVec2): DVec2 +---@operator add(number): DVec2 +---@operator mod(DVec2): DVec2 +---@operator sub(DVec2): DVec2 +DVec2 = {} + +---@param _self DVec2 +---@param rhs DVec2 +---@return DVec2 +function DVec2.project_onto(_self,rhs) end + +---@param _self DVec2 +---@param normal DVec2 +---@param eta number +---@return DVec2 +function DVec2.refract(_self,normal,eta) end + +---@param _self DVec2 +---@param rhs DVec2 +---@return DVec2 +function DVec2.project_onto_normalized(_self,rhs) end + +---@param _self DVec2 +---@return DVec2 +function DVec2.ceil(_self) end + +---@param _self DVec2 +---@return number +function DVec2.min_element(_self) end + +---@param _self DVec2 +---@return DVec2 +function DVec2.ln(_self) end + +---@param _self DVec2 +---@return DVec2 +function DVec2.fract_gl(_self) end + +---@param _self DVec2 +---@return integer +function DVec2.is_negative_bitmask(_self) end + +---@param _self DVec2 +---@return DVec2 +function DVec2.trunc(_self) end + +---@param _self DVec2 +---@return I64Vec2 +function DVec2.as_i64vec2(_self) end + +---@param _self DVec2 +---@return number +function DVec2.length_recip(_self) end + +---@param _self DVec2 +---@return number +function DVec2.length(_self) end + +---@param _self DVec2 +---@return number +function DVec2.element_product(_self) end + +---@param _self DVec2 +---@param rhs DVec2 +---@param s number +---@return DVec2 +function DVec2.lerp(_self,rhs,s) end + +---@param _self DVec2 +---@return UVec2 +function DVec2.as_uvec2(_self) end + +---@param _self DVec2 +---@param rhs DVec2 +---@return DVec2 +function DVec2.div(_self,rhs) end + +---@param p1 DVec2 +---@param p2 number +---@return DVec2 +function DVec2.mul(p1,p2) end + +---@param _self DVec2 +---@param rhs DVec2 +---@return DVec2 +function DVec2.max(_self,rhs) end + +---@param _self DVec2 +---@return boolean +function DVec2.is_nan(_self) end + +---@param _self DVec2 +---@param rhs DVec2 +---@return number +function DVec2.angle_between(_self,rhs) end + +---@param _self DVec2 +---@return IVec2 +function DVec2.as_ivec2(_self) end + +---@param _self DVec2 +---@param rhs DVec2 +---@param d number +---@return DVec2 +function DVec2.move_towards(_self,rhs,d) end + +---@param _self DVec2 +---@param rhs DVec2 +---@return number +function DVec2.distance_squared(_self,rhs) end + +---@param _self DVec2 +---@return DVec2 +function DVec2.exp2(_self) end + +---@param _self DVec2 +---@param rhs DVec2 +---@return DVec2 +function DVec2.div_euclid(_self,rhs) end + +---@param _self DVec2 +---@return DVec2 +function DVec2.clone(_self) end + +---@param angle number +---@return DVec2 +function DVec2.from_angle(angle) end + +---@param _self DVec2 +---@param normal DVec2 +---@return DVec2 +function DVec2.reflect(_self,normal) end + +---@param mask BVec2 +---@param if_true DVec2 +---@param if_false DVec2 +---@return DVec2 +function DVec2.select(mask,if_true,if_false) end + +---@param x number +---@param y number +---@return DVec2 +function DVec2.new(x,y) end + +---@param _self DVec2 +---@param rhs DVec2 +---@return DVec2 +function DVec2.rem_euclid(_self,rhs) end + +---@param _self DVec2 +---@return number +function DVec2.element_sum(_self) end + +---@param _self DVec2 +---@param rhs DVec2 +---@param max_angle number +---@return DVec2 +function DVec2.rotate_towards(_self,rhs,max_angle) end + +---@param _self DVec2 +---@param rhs DVec2 +---@return BVec2 +function DVec2.cmpeq(_self,rhs) end + +---@param _self DVec2 +---@return BVec2 +function DVec2.is_nan_mask(_self) end + +---@param _self DVec2 +---@param rhs DVec2 +---@return DVec2 +function DVec2.min(_self,rhs) end + +---@param _self DVec2 +---@return U8Vec2 +function DVec2.as_u8vec2(_self) end + +---@param p1 DVec2 +---@param p2 number +---@return DVec2 +function DVec2.sub(p1,p2) end + +---@param p1 DVec2 +---@param p2 number +---@return DVec2 +function DVec2.rem(p1,p2) end + +---@param _self DVec2 +---@param rhs DVec2 +---@return DVec2 +function DVec2.copysign(_self,rhs) end + +---@param _self DVec2 +---@return boolean +function DVec2.is_normalized(_self) end + +---@param _self DVec2 +---@param max number +---@return DVec2 +function DVec2.clamp_length_max(_self,max) end + +---@param _self DVec2 +---@param rhs DVec2 +---@return DVec2 +function DVec2.rotate(_self,rhs) end + +---@param p1 DVec2 +---@param p2 DVec2 +---@return DVec2 +function DVec2.mul(p1,p2) end + +---@param _self DVec2 +---@param rhs DVec2 +---@return number +function DVec2.angle_to(_self,rhs) end + +---@param p1 DVec2 +---@param p2 DVec2 +---@return DVec2 +function DVec2.add(p1,p2) end + +---@param _self DVec2 +---@return DVec2 +function DVec2.floor(_self) end + +---@param _self DVec2 +---@param rhs DVec2 +---@return number +function DVec2.dot(_self,rhs) end + +---@param _self DVec2 +---@return DVec2 +function DVec2.normalize_or_zero(_self) end + +---@param p1 DVec2 +---@param p2 number +---@return DVec2 +function DVec2.div(p1,p2) end + +---@param _self DVec2 +---@param min number +---@param max number +---@return DVec2 +function DVec2.clamp_length(_self,min,max) end + +---@param _self DVec2 +---@return I16Vec2 +function DVec2.as_i16vec2(_self) end + +---@param a number[] +---@return DVec2 +function DVec2.from_array(a) end + +---@param _self DVec2 +---@return U16Vec2 +function DVec2.as_u16vec2(_self) end + +---@param _self DVec2 +---@param rhs DVec2 +---@return BVec2 +function DVec2.cmpge(_self,rhs) end + +---@param _self DVec2 +---@return boolean +function DVec2.is_finite(_self) end + +---@param _self DVec2 +---@param rhs DVec2 +---@return DVec2 +function DVec2.midpoint(_self,rhs) end + +---@param _self DVec2 +---@param rhs DVec2 +---@return BVec2 +function DVec2.cmplt(_self,rhs) end + +---@param _self DVec2 +---@return U64Vec2 +function DVec2.as_u64vec2(_self) end + +---@param _self DVec2 +---@return DVec2 +function DVec2.exp(_self) end + +---@param _self DVec2 +---@return BVec2 +function DVec2.is_finite_mask(_self) end + +---@param _self DVec2 +---@param rhs DVec2 +---@return BVec2 +function DVec2.cmpgt(_self,rhs) end + +---@param _self DVec2 +---@param n number +---@return DVec2 +function DVec2.powf(_self,n) end + +---@param _self DVec2 +---@param a DVec2 +---@param b DVec2 +---@return DVec2 +function DVec2.mul_add(_self,a,b) end + +---@param _self DVec2 +---@return DVec2 +function DVec2.neg(_self) end + +---@param _self DVec2 +---@param z number +---@return DVec3 +function DVec2.extend(_self,z) end + +---@param _self DVec2 +---@return DVec2 +function DVec2.signum(_self) end + +---@param _self DVec2 +---@return DVec2 +function DVec2.abs(_self) end + +---@param _self DVec2 +---@return DVec2 +function DVec2.fract(_self) end + +---@param _self DVec2 +---@param rhs DVec2 +---@return DVec2 +function DVec2.reject_from(_self,rhs) end + +---@param p1 DVec2 +---@param p2 DVec2 +---@return DVec2 +function DVec2.sub(p1,p2) end + +---@param _self DVec2 +---@param rhs DVec2 +---@return number +function DVec2.perp_dot(_self,rhs) end + +---@param _self DVec2 +---@return integer +function DVec2.max_position(_self) end + +---@param _self DVec2 +---@return number +function DVec2.length_squared(_self) end + +---@param _self DVec2 +---@param other DVec2 +---@return boolean +function DVec2.__eq(_self,other) end + +---@param _self DVec2 +---@param other DVec2 +---@return boolean +function DVec2.eq(_self,other) end + +---@param _self DVec2 +---@return DVec2 +function DVec2.recip(_self) end + +---@param _self DVec2 +---@return number[] +function DVec2.to_array(_self) end + +---@param _self DVec2 +---@param rhs DVec2 +---@param max_abs_diff number +---@return boolean +function DVec2.abs_diff_eq(_self,rhs,max_abs_diff) end + +---@param _self DVec2 +---@param rhs DVec2 +---@return DVec2 +function DVec2.add(_self,rhs) end + +---@param _self DVec2 +---@param min number +---@return DVec2 +function DVec2.clamp_length_min(_self,min) end + +---@param p1 DVec2 +---@param p2 DVec2 +---@return DVec2 +function DVec2.div(p1,p2) end + +---@param _self DVec2 +---@param rhs DVec2 +---@return BVec2 +function DVec2.cmple(_self,rhs) end + +---@param _self DVec2 +---@param rhs DVec2 +---@return DVec2 +function DVec2.dot_into_vec(_self,rhs) end + +---@param _self DVec2 +---@param rhs DVec2 +---@return DVec2 +function DVec2.reject_from_normalized(_self,rhs) end + +---@param v number +---@return DVec2 +function DVec2.splat(v) end + +---@param _self DVec2 +---@return DVec2 +function DVec2.round(_self) end + +---@param _self DVec2 +---@param rhs DVec2 +---@return DVec2 +function DVec2.mul(_self,rhs) end + +---@param _self DVec2 +---@param rhs DVec2 +---@return number +function DVec2.distance(_self,rhs) end + +---@param _self DVec2 +---@param min DVec2 +---@param max DVec2 +---@return DVec2 +function DVec2.clamp(_self,min,max) end + +---@param _self DVec2 +---@return DVec2 +function DVec2.normalize(_self) end + +---@param _self DVec2 +---@return DVec2 +function DVec2.log2(_self) end + +---@param _self DVec2 +---@param fallback DVec2 +---@return DVec2 +function DVec2.normalize_or(_self,fallback) end + +---@param _self DVec2 +---@param rhs DVec2 +---@return DVec2 +function DVec2.rem(_self,rhs) end + +---@param p1 DVec2 +---@param p2 number +---@return DVec2 +function DVec2.add(p1,p2) end + +---@param _self DVec2 +---@param y number +---@return DVec2 +function DVec2.with_y(_self,y) end + +---@param p1 DVec2 +---@param p2 DVec2 +---@return DVec2 +function DVec2.rem(p1,p2) end + +---@param _self DVec2 +---@return Vec2 +function DVec2.as_vec2(_self) end + +---@param _self DVec2 +---@param rhs DVec2 +---@return DVec2 +function DVec2.sub(_self,rhs) end + +---@param _self DVec2 +---@return number +function DVec2.max_element(_self) end + +---@param _self DVec2 +---@param x number +---@return DVec2 +function DVec2.with_x(_self,x) end + +---@param _self DVec2 +---@return number +function DVec2.to_angle(_self) end + +---@param _self DVec2 +---@param rhs DVec2 +---@return BVec2 +function DVec2.cmpne(_self,rhs) end + +---@param _self DVec2 +---@return I8Vec2 +function DVec2.as_i8vec2(_self) end + +---@param _self DVec2 +---@return DVec2 +function DVec2.perp(_self) end + +---@param _self DVec2 +---@return integer +function DVec2.min_position(_self) end + + + +---@class DVec3 : ReflectReference +---@field x ? number +---@field y ? number +---@field z ? number +---@operator div(DVec3): DVec3 +---@operator sub(number): DVec3 +---@operator mod(number): DVec3 +---@operator unm: DVec3 +---@operator sub(DVec3): DVec3 +---@operator div(number): DVec3 +---@operator mod(DVec3): DVec3 +---@operator mul(DVec3): DVec3 +---@operator div(DVec3): DVec3 +---@operator mul(DVec3): DVec3 +---@operator sub(DVec3): DVec3 +---@operator mul(number): DVec3 +---@operator mod(DVec3): DVec3 +---@operator add(number): DVec3 +---@operator add(DVec3): DVec3 +---@operator add(DVec3): DVec3 +DVec3 = {} + +---@param mask BVec3 +---@param if_true DVec3 +---@param if_false DVec3 +---@return DVec3 +function DVec3.select(mask,if_true,if_false) end + +---@param _self DVec3 +---@param rhs DVec3 +---@return DVec3 +function DVec3.div(_self,rhs) end + +---@param _self DVec3 +---@param rhs DVec3 +---@return BVec3 +function DVec3.cmpge(_self,rhs) end + +---@param _self DVec3 +---@return BVec3 +function DVec3.is_finite_mask(_self) end + +---@param _self DVec3 +---@return Vec3A +function DVec3.as_vec3a(_self) end + +---@param _self DVec3 +---@param rhs DVec3 +---@return number +function DVec3.angle_between(_self,rhs) end + +---@param _self DVec3 +---@param rhs DVec3 +---@return BVec3 +function DVec3.cmpgt(_self,rhs) end + +---@param _self DVec3 +---@return boolean +function DVec3.is_nan(_self) end + +---@param _self DVec3 +---@return DVec3 +function DVec3.fract(_self) end + +---@param _self DVec3 +---@param z number +---@return DVec3 +function DVec3.with_z(_self,z) end + +---@param _self DVec3 +---@param angle number +---@return DVec3 +function DVec3.rotate_x(_self,angle) end + +---@param _self DVec3 +---@return I64Vec3 +function DVec3.as_i64vec3(_self) end + +---@param _self DVec3 +---@param max number +---@return DVec3 +function DVec3.clamp_length_max(_self,max) end + +---@param _self DVec3 +---@param angle number +---@return DVec3 +function DVec3.rotate_z(_self,angle) end + +---@param _self DVec3 +---@return DVec3 +function DVec3.clone(_self) end + +---@param _self DVec3 +---@return number +function DVec3.element_product(_self) end + +---@param _self DVec3 +---@return number +function DVec3.length_squared(_self) end + +---@param _self DVec3 +---@return DVec3 +function DVec3.trunc(_self) end + +---@param p1 DVec3 +---@param p2 number +---@return DVec3 +function DVec3.sub(p1,p2) end + +---@param p1 DVec3 +---@param p2 number +---@return DVec3 +function DVec3.rem(p1,p2) end + +---@param _self DVec3 +---@return DVec3 +function DVec3.neg(_self) end + +---@param _self DVec3 +---@return DVec3 +function DVec3.floor(_self) end + +---@param _self DVec3 +---@param rhs DVec3 +---@return number +function DVec3.dot(_self,rhs) end + +---@param _self DVec3 +---@return integer +function DVec3.min_position(_self) end + +---@param _self DVec3 +---@return DVec3 +function DVec3.ceil(_self) end + +---@param _self DVec3 +---@return DVec3 +function DVec3.ln(_self) end + +---@param _self DVec3 +---@param axis DVec3 +---@param angle number +---@return DVec3 +function DVec3.rotate_axis(_self,axis,angle) end + +---@param _self DVec3 +---@return DVec3 +function DVec3.recip(_self) end + +---@param _self DVec3 +---@return boolean +function DVec3.is_finite(_self) end + +---@param _self DVec3 +---@param rhs DVec3 +---@return DVec3 +function DVec3.rem_euclid(_self,rhs) end + +---@param _self DVec3 +---@return BVec3 +function DVec3.is_nan_mask(_self) end + +---@param _self DVec3 +---@param min number +---@param max number +---@return DVec3 +function DVec3.clamp_length(_self,min,max) end + +---@param x number +---@param y number +---@param z number +---@return DVec3 +function DVec3.new(x,y,z) end + +---@param _self DVec3 +---@return DVec3 +function DVec3.exp2(_self) end + +---@param _self DVec3 +---@return DVec3 +function DVec3.normalize(_self) end + +---@param _self DVec3 +---@param rhs DVec3 +---@return DVec3 +function DVec3.sub(_self,rhs) end + +---@param _self DVec3 +---@param rhs DVec3 +---@return number +function DVec3.distance(_self,rhs) end + +---@param _self DVec3 +---@param rhs DVec3 +---@return DVec3 +function DVec3.dot_into_vec(_self,rhs) end + +---@param _self DVec3 +---@param rhs DVec3 +---@return DVec3 +function DVec3.min(_self,rhs) end + +---@param _self DVec3 +---@param rhs DVec3 +---@param d number +---@return DVec3 +function DVec3.move_towards(_self,rhs,d) end + +---@param _self DVec3 +---@return DVec3 +function DVec3.any_orthogonal_vector(_self) end + +---@param _self DVec3 +---@return I16Vec3 +function DVec3.as_i16vec3(_self) end + +---@param _self DVec3 +---@param rhs DVec3 +---@return DVec3 +function DVec3.max(_self,rhs) end + +---@param _self DVec3 +---@param rhs DVec3 +---@return DVec3 +function DVec3.reject_from_normalized(_self,rhs) end + +---@param p1 DVec3 +---@param p2 number +---@return DVec3 +function DVec3.div(p1,p2) end + +---@param _self DVec3 +---@return integer +function DVec3.max_position(_self) end + +---@param _self DVec3 +---@param y number +---@return DVec3 +function DVec3.with_y(_self,y) end + +---@param _self DVec3 +---@return DVec3 +function DVec3.fract_gl(_self) end + +---@param _self DVec3 +---@param rhs DVec3 +---@return DVec3 +function DVec3.reject_from(_self,rhs) end + +---@param _self DVec3 +---@param rhs DVec3 +---@param max_abs_diff number +---@return boolean +function DVec3.abs_diff_eq(_self,rhs,max_abs_diff) end + +---@param _self DVec3 +---@return UVec3 +function DVec3.as_uvec3(_self) end + +---@param _self DVec3 +---@param rhs DVec3 +---@return BVec3 +function DVec3.cmple(_self,rhs) end + +---@param _self DVec3 +---@return DVec4 +function DVec3.to_homogeneous(_self) end + +---@param _self DVec3 +---@param rhs DVec3 +---@return DVec3 +function DVec3.rem(_self,rhs) end + +---@param _self DVec3 +---@return U16Vec3 +function DVec3.as_u16vec3(_self) end + +---@param _self DVec3 +---@param rhs DVec3 +---@return number +function DVec3.distance_squared(_self,rhs) end + +---@param _self DVec3 +---@param fallback DVec3 +---@return DVec3 +function DVec3.normalize_or(_self,fallback) end + +---@param _self DVec3 +---@return number +function DVec3.length(_self) end + +---@param _self DVec3 +---@param rhs DVec3 +---@return DVec3 +function DVec3.mul(_self,rhs) end + +---@param _self DVec3 +---@return DVec3 +function DVec3.normalize_or_zero(_self) end + +---@param _self DVec3 +---@return DVec3 +function DVec3.abs(_self) end + +---@param a number[] +---@return DVec3 +function DVec3.from_array(a) end + +---@param _self DVec3 +---@return number +function DVec3.min_element(_self) end + +---@param _self DVec3 +---@return DVec3 +function DVec3.any_orthonormal_vector(_self) end + +---@param _self DVec3 +---@return I8Vec3 +function DVec3.as_i8vec3(_self) end + +---@param v number +---@return DVec3 +function DVec3.splat(v) end + +---@param _self DVec3 +---@return DVec2 +function DVec3.truncate(_self) end + +---@param _self DVec3 +---@param n number +---@return DVec3 +function DVec3.powf(_self,n) end + +---@param _self DVec3 +---@param rhs DVec3 +---@return BVec3 +function DVec3.cmpne(_self,rhs) end + +---@param _self DVec3 +---@param min number +---@return DVec3 +function DVec3.clamp_length_min(_self,min) end + +---@param _self DVec3 +---@return Vec3 +function DVec3.as_vec3(_self) end + +---@param _self DVec3 +---@return DVec3 +function DVec3.exp(_self) end + +---@param v DVec4 +---@return DVec3 +function DVec3.from_homogeneous(v) end + +---@param _self DVec3 +---@return IVec3 +function DVec3.as_ivec3(_self) end + +---@param _self DVec3 +---@return integer +function DVec3.is_negative_bitmask(_self) end + +---@param _self DVec3 +---@param rhs DVec3 +---@param s number +---@return DVec3 +function DVec3.slerp(_self,rhs,s) end + +---@param _self DVec3 +---@param normal DVec3 +---@return DVec3 +function DVec3.reflect(_self,normal) end + +---@param _self DVec3 +---@param rhs DVec3 +---@return BVec3 +function DVec3.cmpeq(_self,rhs) end + +---@param p1 DVec3 +---@param p2 DVec3 +---@return DVec3 +function DVec3.div(p1,p2) end + +---@param p1 DVec3 +---@param p2 DVec3 +---@return DVec3 +function DVec3.mul(p1,p2) end + +---@param _self DVec3 +---@param a DVec3 +---@param b DVec3 +---@return DVec3 +function DVec3.mul_add(_self,a,b) end + +---@param p1 DVec3 +---@param p2 DVec3 +---@return DVec3 +function DVec3.sub(p1,p2) end + +---@param _self DVec3 +---@param rhs DVec3 +---@param max_angle number +---@return DVec3 +function DVec3.rotate_towards(_self,rhs,max_angle) end + +---@param _self DVec3 +---@param x number +---@return DVec3 +function DVec3.with_x(_self,x) end + +---@param _self DVec3 +---@return number +function DVec3.element_sum(_self) end + +---@param p1 DVec3 +---@param p2 number +---@return DVec3 +function DVec3.mul(p1,p2) end + +---@param _self DVec3 +---@param min DVec3 +---@param max DVec3 +---@return DVec3 +function DVec3.clamp(_self,min,max) end + +---@param _self DVec3 +---@return U8Vec3 +function DVec3.as_u8vec3(_self) end + +---@param _self DVec3 +---@return DVec3 +function DVec3.log2(_self) end + +---@param _self DVec3 +---@param normal DVec3 +---@param eta number +---@return DVec3 +function DVec3.refract(_self,normal,eta) end + +---@param _self DVec3 +---@return number +function DVec3.max_element(_self) end + +---@param _self DVec3 +---@param rhs DVec3 +---@return DVec3 +function DVec3.project_onto_normalized(_self,rhs) end + +---@param p1 DVec3 +---@param p2 DVec3 +---@return DVec3 +function DVec3.rem(p1,p2) end + +---@param _self DVec3 +---@param rhs DVec3 +---@return DVec3 +function DVec3.cross(_self,rhs) end + +---@param _self DVec3 +---@param rhs DVec3 +---@return DVec3 +function DVec3.project_onto(_self,rhs) end + +---@param _self DVec3 +---@param rhs DVec3 +---@return DVec3 +function DVec3.midpoint(_self,rhs) end + +---@param _self DVec3 +---@return number +function DVec3.length_recip(_self) end + +---@param _self DVec3 +---@return number[] +function DVec3.to_array(_self) end + +---@param _self DVec3 +---@return DVec3 +function DVec3.round(_self) end + +---@param _self DVec3 +---@param rhs DVec3 +---@return DVec3 +function DVec3.div_euclid(_self,rhs) end + +---@param _self DVec3 +---@param rhs DVec3 +---@return BVec3 +function DVec3.cmplt(_self,rhs) end + +---@param _self DVec3 +---@return boolean +function DVec3.is_normalized(_self) end + +---@param p1 DVec3 +---@param p2 number +---@return DVec3 +function DVec3.add(p1,p2) end + +---@param _self DVec3 +---@return DVec3 +function DVec3.signum(_self) end + +---@param _self DVec3 +---@param other DVec3 +---@return boolean +function DVec3.__eq(_self,other) end + +---@param _self DVec3 +---@param other DVec3 +---@return boolean +function DVec3.eq(_self,other) end + +---@param _self DVec3 +---@param w number +---@return DVec4 +function DVec3.extend(_self,w) end + +---@param _self DVec3 +---@param rhs DVec3 +---@param s number +---@return DVec3 +function DVec3.lerp(_self,rhs,s) end + +---@param _self DVec3 +---@param rhs DVec3 +---@return DVec3 +function DVec3.copysign(_self,rhs) end + +---@param _self DVec3 +---@param angle number +---@return DVec3 +function DVec3.rotate_y(_self,angle) end + +---@param p1 DVec3 +---@param p2 DVec3 +---@return DVec3 +function DVec3.add(p1,p2) end + +---@param _self DVec3 +---@return U64Vec3 +function DVec3.as_u64vec3(_self) end + +---@param _self DVec3 +---@param rhs DVec3 +---@return DVec3 +function DVec3.add(_self,rhs) end + + + +---@class DVec4 : ReflectReference +---@field x ? number +---@field y ? number +---@field z ? number +---@field w ? number +---@operator div(DVec4): DVec4 +---@operator mod(number): DVec4 +---@operator unm: DVec4 +---@operator mul(number): DVec4 +---@operator sub(number): DVec4 +---@operator add(number): DVec4 +---@operator div(number): DVec4 +---@operator mod(DVec4): DVec4 +---@operator mul(DVec4): DVec4 +---@operator sub(DVec4): DVec4 +---@operator add(DVec4): DVec4 +---@operator mul(DVec4): DVec4 +---@operator mod(DVec4): DVec4 +---@operator sub(DVec4): DVec4 +---@operator add(DVec4): DVec4 +---@operator div(DVec4): DVec4 +DVec4 = {} + +---@param _self DVec4 +---@return DVec4 +function DVec4.exp2(_self) end + +---@param _self DVec4 +---@param rhs DVec4 +---@return DVec4 +function DVec4.div_euclid(_self,rhs) end + +---@param _self DVec4 +---@param rhs DVec4 +---@return DVec4 +function DVec4.min(_self,rhs) end + +---@param p1 DVec4 +---@param p2 DVec4 +---@return DVec4 +function DVec4.div(p1,p2) end + +---@param _self DVec4 +---@param rhs DVec4 +---@return DVec4 +function DVec4.copysign(_self,rhs) end + +---@param p1 DVec4 +---@param p2 number +---@return DVec4 +function DVec4.rem(p1,p2) end + +---@param _self DVec4 +---@param other DVec4 +---@return boolean +function DVec4.__eq(_self,other) end + +---@param _self DVec4 +---@param other DVec4 +---@return boolean +function DVec4.eq(_self,other) end + +---@param _self DVec4 +---@return boolean +function DVec4.is_nan(_self) end + +---@param _self DVec4 +---@return DVec4 +function DVec4.neg(_self) end + +---@param _self DVec4 +---@param rhs DVec4 +---@return BVec4 +function DVec4.cmpeq(_self,rhs) end + +---@param _self DVec4 +---@param rhs DVec4 +---@return BVec4 +function DVec4.cmpne(_self,rhs) end + +---@param _self DVec4 +---@return DVec4 +function DVec4.floor(_self) end + +---@param _self DVec4 +---@return number +function DVec4.element_product(_self) end + +---@param p1 DVec4 +---@param p2 number +---@return DVec4 +function DVec4.mul(p1,p2) end + +---@param _self DVec4 +---@return IVec4 +function DVec4.as_ivec4(_self) end + +---@param _self DVec4 +---@return DVec4 +function DVec4.normalize_or_zero(_self) end + +---@param p1 DVec4 +---@param p2 number +---@return DVec4 +function DVec4.sub(p1,p2) end + +---@param _self DVec4 +---@param min number +---@return DVec4 +function DVec4.clamp_length_min(_self,min) end + +---@param p1 DVec4 +---@param p2 number +---@return DVec4 +function DVec4.add(p1,p2) end + +---@param _self DVec4 +---@param rhs DVec4 +---@return DVec4 +function DVec4.rem_euclid(_self,rhs) end + +---@param _self DVec4 +---@return DVec4 +function DVec4.normalize(_self) end + +---@param _self DVec4 +---@param n number +---@return DVec4 +function DVec4.powf(_self,n) end + +---@param _self DVec4 +---@param rhs DVec4 +---@return DVec4 +function DVec4.midpoint(_self,rhs) end + +---@param _self DVec4 +---@param rhs DVec4 +---@return BVec4 +function DVec4.cmpgt(_self,rhs) end + +---@param _self DVec4 +---@param rhs DVec4 +---@return BVec4 +function DVec4.cmplt(_self,rhs) end + +---@param _self DVec4 +---@return U16Vec4 +function DVec4.as_u16vec4(_self) end + +---@param mask BVec4 +---@param if_true DVec4 +---@param if_false DVec4 +---@return DVec4 +function DVec4.select(mask,if_true,if_false) end + +---@param _self DVec4 +---@param rhs DVec4 +---@param max_abs_diff number +---@return boolean +function DVec4.abs_diff_eq(_self,rhs,max_abs_diff) end + +---@param _self DVec4 +---@param min number +---@param max number +---@return DVec4 +function DVec4.clamp_length(_self,min,max) end + +---@param _self DVec4 +---@return integer +function DVec4.max_position(_self) end + +---@param _self DVec4 +---@param z number +---@return DVec4 +function DVec4.with_z(_self,z) end + +---@param _self DVec4 +---@return boolean +function DVec4.is_normalized(_self) end + +---@param _self DVec4 +---@return DVec4 +function DVec4.ln(_self) end + +---@param p1 DVec4 +---@param p2 number +---@return DVec4 +function DVec4.div(p1,p2) end + +---@param _self DVec4 +---@param rhs DVec4 +---@return BVec4 +function DVec4.cmple(_self,rhs) end + +---@param _self DVec4 +---@return BVec4 +function DVec4.is_finite_mask(_self) end + +---@param _self DVec4 +---@param normal DVec4 +---@param eta number +---@return DVec4 +function DVec4.refract(_self,normal,eta) end + +---@param _self DVec4 +---@return U64Vec4 +function DVec4.as_u64vec4(_self) end + +---@param _self DVec4 +---@param rhs DVec4 +---@return DVec4 +function DVec4.rem(_self,rhs) end + +---@param _self DVec4 +---@param a DVec4 +---@param b DVec4 +---@return DVec4 +function DVec4.mul_add(_self,a,b) end + +---@param _self DVec4 +---@param normal DVec4 +---@return DVec4 +function DVec4.reflect(_self,normal) end + +---@param p1 DVec4 +---@param p2 DVec4 +---@return DVec4 +function DVec4.mul(p1,p2) end + +---@param x number +---@param y number +---@param z number +---@param w number +---@return DVec4 +function DVec4.new(x,y,z,w) end + +---@param _self DVec4 +---@param rhs DVec4 +---@return DVec4 +function DVec4.sub(_self,rhs) end + +---@param _self DVec4 +---@param rhs DVec4 +---@param s number +---@return DVec4 +function DVec4.lerp(_self,rhs,s) end + +---@param _self DVec4 +---@return DVec4 +function DVec4.ceil(_self) end + +---@param _self DVec4 +---@return DVec4 +function DVec4.round(_self) end + +---@param _self DVec4 +---@param rhs DVec4 +---@return DVec4 +function DVec4.reject_from_normalized(_self,rhs) end + +---@param p1 DVec4 +---@param p2 DVec4 +---@return DVec4 +function DVec4.add(p1,p2) end + +---@param _self DVec4 +---@param rhs DVec4 +---@return DVec4 +function DVec4.max(_self,rhs) end + +---@param _self DVec4 +---@param rhs DVec4 +---@return DVec4 +function DVec4.project_onto_normalized(_self,rhs) end + +---@param _self DVec4 +---@return number[] +function DVec4.to_array(_self) end + +---@param _self DVec4 +---@return DVec4 +function DVec4.abs(_self) end + +---@param _self DVec4 +---@return I16Vec4 +function DVec4.as_i16vec4(_self) end + +---@param _self DVec4 +---@return DVec4 +function DVec4.recip(_self) end + +---@param v number +---@return DVec4 +function DVec4.splat(v) end + +---@param _self DVec4 +---@return DVec3 +function DVec4.truncate(_self) end + +---@param _self DVec4 +---@param rhs DVec4 +---@return DVec4 +function DVec4.mul(_self,rhs) end + +---@param _self DVec4 +---@return DVec4 +function DVec4.trunc(_self) end + +---@param _self DVec4 +---@return DVec3 +function DVec4.project(_self) end + +---@param _self DVec4 +---@return number +function DVec4.length_squared(_self) end + +---@param _self DVec4 +---@param rhs DVec4 +---@return DVec4 +function DVec4.reject_from(_self,rhs) end + +---@param _self DVec4 +---@return DVec4 +function DVec4.signum(_self) end + +---@param _self DVec4 +---@return boolean +function DVec4.is_finite(_self) end + +---@param _self DVec4 +---@return BVec4 +function DVec4.is_nan_mask(_self) end + +---@param p1 DVec4 +---@param p2 DVec4 +---@return DVec4 +function DVec4.rem(p1,p2) end + +---@param _self DVec4 +---@param rhs DVec4 +---@return number +function DVec4.dot(_self,rhs) end + +---@param _self DVec4 +---@return number +function DVec4.element_sum(_self) end + +---@param _self DVec4 +---@return number +function DVec4.min_element(_self) end + +---@param a number[] +---@return DVec4 +function DVec4.from_array(a) end + +---@param _self DVec4 +---@return I8Vec4 +function DVec4.as_i8vec4(_self) end + +---@param _self DVec4 +---@param rhs DVec4 +---@return number +function DVec4.distance(_self,rhs) end + +---@param _self DVec4 +---@return DVec4 +function DVec4.fract(_self) end + +---@param _self DVec4 +---@param w number +---@return DVec4 +function DVec4.with_w(_self,w) end + +---@param _self DVec4 +---@return DVec4 +function DVec4.fract_gl(_self) end + +---@param _self DVec4 +---@param min DVec4 +---@param max DVec4 +---@return DVec4 +function DVec4.clamp(_self,min,max) end + +---@param _self DVec4 +---@return integer +function DVec4.is_negative_bitmask(_self) end + +---@param _self DVec4 +---@param y number +---@return DVec4 +function DVec4.with_y(_self,y) end + +---@param _self DVec4 +---@return DVec4 +function DVec4.exp(_self) end + +---@param _self DVec4 +---@return Vec4 +function DVec4.as_vec4(_self) end + +---@param p1 DVec4 +---@param p2 DVec4 +---@return DVec4 +function DVec4.sub(p1,p2) end + +---@param _self DVec4 +---@return I64Vec4 +function DVec4.as_i64vec4(_self) end + +---@param _self DVec4 +---@param fallback DVec4 +---@return DVec4 +function DVec4.normalize_or(_self,fallback) end + +---@param _self DVec4 +---@param rhs DVec4 +---@param d number +---@return DVec4 +function DVec4.move_towards(_self,rhs,d) end + +---@param _self DVec4 +---@param rhs DVec4 +---@return DVec4 +function DVec4.dot_into_vec(_self,rhs) end + +---@param _self DVec4 +---@return DVec4 +function DVec4.log2(_self) end + +---@param _self DVec4 +---@return number +function DVec4.max_element(_self) end + +---@param _self DVec4 +---@return U8Vec4 +function DVec4.as_u8vec4(_self) end + +---@param _self DVec4 +---@param max number +---@return DVec4 +function DVec4.clamp_length_max(_self,max) end + +---@param _self DVec4 +---@return number +function DVec4.length_recip(_self) end + +---@param _self DVec4 +---@return number +function DVec4.length(_self) end + +---@param _self DVec4 +---@param rhs DVec4 +---@return number +function DVec4.distance_squared(_self,rhs) end + +---@param _self DVec4 +---@param rhs DVec4 +---@return DVec4 +function DVec4.add(_self,rhs) end + +---@param _self DVec4 +---@param rhs DVec4 +---@return DVec4 +function DVec4.project_onto(_self,rhs) end + +---@param _self DVec4 +---@return integer +function DVec4.min_position(_self) end + +---@param _self DVec4 +---@return UVec4 +function DVec4.as_uvec4(_self) end + +---@param _self DVec4 +---@return DVec4 +function DVec4.clone(_self) end + +---@param _self DVec4 +---@param rhs DVec4 +---@return DVec4 +function DVec4.div(_self,rhs) end + +---@param _self DVec4 +---@param rhs DVec4 +---@return BVec4 +function DVec4.cmpge(_self,rhs) end + +---@param _self DVec4 +---@param x number +---@return DVec4 +function DVec4.with_x(_self,x) end + + + +---@class EulerRot : ReflectReference +EulerRot = {} + +---@param _self EulerRot +---@return EulerRot +function EulerRot.clone(_self) end + +---@param _self EulerRot +---@param other EulerRot +---@return boolean +function EulerRot.__eq(_self,other) end + +---@param _self EulerRot +---@param other EulerRot +---@return boolean +function EulerRot.eq(_self,other) end + +---@param _self EulerRot +---@return nil +function EulerRot.assert_receiver_is_total_eq(_self) end + + + +---@class I16Vec2 : ReflectReference +---@field x ? integer +---@field y ? integer +---@operator mod(I16Vec2): I16Vec2 +---@operator mod(integer): I16Vec2 +---@operator mul(I16Vec2): I16Vec2 +---@operator sub(integer): I16Vec2 +---@operator div(I16Vec2): I16Vec2 +---@operator sub(I16Vec2): I16Vec2 +---@operator mul(integer): I16Vec2 +---@operator sub(I16Vec2): I16Vec2 +---@operator mul(I16Vec2): I16Vec2 +---@operator mod(I16Vec2): I16Vec2 +---@operator add(I16Vec2): I16Vec2 +---@operator add(integer): I16Vec2 +---@operator add(I16Vec2): I16Vec2 +---@operator div(integer): I16Vec2 +---@operator unm: I16Vec2 +---@operator div(I16Vec2): I16Vec2 +I16Vec2 = {} + +---@param _self I16Vec2 +---@param rhs I16Vec2 +---@return I16Vec2 +function I16Vec2.wrapping_sub(_self,rhs) end + +---@param p1 I16Vec2 +---@param p2 I16Vec2 +---@return I16Vec2 +function I16Vec2.rem(p1,p2) end + +---@param _self I16Vec2 +---@return UVec2 +function I16Vec2.as_uvec2(_self) end + +---@param _self I16Vec2 +---@return I64Vec2 +function I16Vec2.as_i64vec2(_self) end + +---@param _self I16Vec2 +---@param rhs I16Vec2 +---@return I16Vec2 +function I16Vec2.saturating_add(_self,rhs) end + +---@param _self I16Vec2 +---@param y integer +---@return I16Vec2 +function I16Vec2.with_y(_self,y) end + +---@param _self I16Vec2 +---@return integer +function I16Vec2.is_negative_bitmask(_self) end + +---@param p1 I16Vec2 +---@param p2 integer +---@return I16Vec2 +function I16Vec2.rem(p1,p2) end + +---@param _self I16Vec2 +---@param rhs I16Vec2 +---@return I16Vec2 +function I16Vec2.saturating_sub(_self,rhs) end + +---@param _self I16Vec2 +---@param z integer +---@return I16Vec3 +function I16Vec2.extend(_self,z) end + +---@param _self I16Vec2 +---@param rhs I16Vec2 +---@return I16Vec2 +function I16Vec2.max(_self,rhs) end + +---@param _self I16Vec2 +---@param rhs U16Vec2 +---@return I16Vec2 +function I16Vec2.saturating_sub_unsigned(_self,rhs) end + +---@param _self I16Vec2 +---@param rhs I16Vec2 +---@return I16Vec2 +function I16Vec2.mul(_self,rhs) end + +---@param _self I16Vec2 +---@return integer +function I16Vec2.max_element(_self) end + +---@param p1 I16Vec2 +---@param p2 integer +---@return I16Vec2 +function I16Vec2.sub(p1,p2) end + +---@param mask BVec2 +---@param if_true I16Vec2 +---@param if_false I16Vec2 +---@return I16Vec2 +function I16Vec2.select(mask,if_true,if_false) end + +---@param p1 I16Vec2 +---@param p2 I16Vec2 +---@return I16Vec2 +function I16Vec2.div(p1,p2) end + +---@param p1 I16Vec2 +---@param p2 I16Vec2 +---@return I16Vec2 +function I16Vec2.sub(p1,p2) end + +---@param _self I16Vec2 +---@return U64Vec2 +function I16Vec2.as_u64vec2(_self) end + +---@param a integer[] +---@return I16Vec2 +function I16Vec2.from_array(a) end + +---@param _self I16Vec2 +---@return integer[] +function I16Vec2.to_array(_self) end + +---@param _self I16Vec2 +---@return nil +function I16Vec2.assert_receiver_is_total_eq(_self) end + +---@param _self I16Vec2 +---@param rhs I16Vec2 +---@return I16Vec2 +function I16Vec2.rotate(_self,rhs) end + +---@param _self I16Vec2 +---@param rhs I16Vec2 +---@return I16Vec2 +function I16Vec2.rem_euclid(_self,rhs) end + +---@param _self I16Vec2 +---@return I8Vec2 +function I16Vec2.as_i8vec2(_self) end + +---@param _self I16Vec2 +---@param rhs I16Vec2 +---@return I16Vec2 +function I16Vec2.min(_self,rhs) end + +---@param _self I16Vec2 +---@param rhs I16Vec2 +---@return I16Vec2 +function I16Vec2.wrapping_add(_self,rhs) end + +---@param p1 I16Vec2 +---@param p2 integer +---@return I16Vec2 +function I16Vec2.mul(p1,p2) end + +---@param _self I16Vec2 +---@param rhs U16Vec2 +---@return I16Vec2 +function I16Vec2.wrapping_add_unsigned(_self,rhs) end + +---@param _self I16Vec2 +---@param rhs I16Vec2 +---@return I16Vec2 +function I16Vec2.saturating_mul(_self,rhs) end + +---@param v integer +---@return I16Vec2 +function I16Vec2.splat(v) end + +---@param _self I16Vec2 +---@return U16Vec2 +function I16Vec2.as_u16vec2(_self) end + +---@param _self I16Vec2 +---@param rhs I16Vec2 +---@return I16Vec2 +function I16Vec2.sub(_self,rhs) end + +---@param _self I16Vec2 +---@param rhs I16Vec2 +---@return BVec2 +function I16Vec2.cmplt(_self,rhs) end + +---@param _self I16Vec2 +---@param rhs I16Vec2 +---@return integer +function I16Vec2.distance_squared(_self,rhs) end + +---@param p1 I16Vec2 +---@param p2 I16Vec2 +---@return I16Vec2 +function I16Vec2.mul(p1,p2) end + +---@param _self I16Vec2 +---@param min I16Vec2 +---@param max I16Vec2 +---@return I16Vec2 +function I16Vec2.clamp(_self,min,max) end + +---@param _self I16Vec2 +---@param rhs I16Vec2 +---@return I16Vec2 +function I16Vec2.rem(_self,rhs) end + +---@param _self I16Vec2 +---@param rhs I16Vec2 +---@return I16Vec2 +function I16Vec2.div_euclid(_self,rhs) end + +---@param _self I16Vec2 +---@param rhs I16Vec2 +---@return I16Vec2 +function I16Vec2.add(_self,rhs) end + +---@param x integer +---@param y integer +---@return I16Vec2 +function I16Vec2.new(x,y) end + +---@param _self I16Vec2 +---@return I16Vec2 +function I16Vec2.clone(_self) end + +---@param _self I16Vec2 +---@param rhs I16Vec2 +---@return integer | nil +function I16Vec2.checked_manhattan_distance(_self,rhs) end + +---@param _self I16Vec2 +---@param rhs U16Vec2 +---@return I16Vec2 +function I16Vec2.wrapping_sub_unsigned(_self,rhs) end + +---@param _self I16Vec2 +---@return DVec2 +function I16Vec2.as_dvec2(_self) end + +---@param _self I16Vec2 +---@param rhs U16Vec2 +---@return I16Vec2 +function I16Vec2.saturating_add_unsigned(_self,rhs) end + +---@param _self I16Vec2 +---@param x integer +---@return I16Vec2 +function I16Vec2.with_x(_self,x) end + +---@param _self I16Vec2 +---@param rhs I16Vec2 +---@return integer +function I16Vec2.dot(_self,rhs) end + +---@param p1 I16Vec2 +---@param p2 integer +---@return I16Vec2 +function I16Vec2.add(p1,p2) end + +---@param _self I16Vec2 +---@return integer +function I16Vec2.element_product(_self) end + +---@param _self I16Vec2 +---@param rhs I16Vec2 +---@return BVec2 +function I16Vec2.cmpeq(_self,rhs) end + +---@param _self I16Vec2 +---@param rhs I16Vec2 +---@return I16Vec2 +function I16Vec2.dot_into_vec(_self,rhs) end + +---@param _self I16Vec2 +---@return integer +function I16Vec2.length_squared(_self) end + +---@param _self I16Vec2 +---@return Vec2 +function I16Vec2.as_vec2(_self) end + +---@param _self I16Vec2 +---@param rhs I16Vec2 +---@return integer +function I16Vec2.manhattan_distance(_self,rhs) end + +---@param _self I16Vec2 +---@param rhs I16Vec2 +---@return I16Vec2 +function I16Vec2.wrapping_mul(_self,rhs) end + +---@param _self I16Vec2 +---@return IVec2 +function I16Vec2.as_ivec2(_self) end + +---@param _self I16Vec2 +---@param rhs I16Vec2 +---@return BVec2 +function I16Vec2.cmpgt(_self,rhs) end + +---@param _self I16Vec2 +---@param rhs I16Vec2 +---@return BVec2 +function I16Vec2.cmpne(_self,rhs) end + +---@param _self I16Vec2 +---@return U8Vec2 +function I16Vec2.as_u8vec2(_self) end + +---@param _self I16Vec2 +---@return I16Vec2 +function I16Vec2.abs(_self) end + +---@param _self I16Vec2 +---@return integer +function I16Vec2.element_sum(_self) end + +---@param _self I16Vec2 +---@return integer +function I16Vec2.min_element(_self) end + +---@param p1 I16Vec2 +---@param p2 I16Vec2 +---@return I16Vec2 +function I16Vec2.add(p1,p2) end + +---@param _self I16Vec2 +---@return integer +function I16Vec2.max_position(_self) end + +---@param _self I16Vec2 +---@param other I16Vec2 +---@return boolean +function I16Vec2.__eq(_self,other) end + +---@param _self I16Vec2 +---@param other I16Vec2 +---@return boolean +function I16Vec2.eq(_self,other) end + +---@param _self I16Vec2 +---@param rhs I16Vec2 +---@return BVec2 +function I16Vec2.cmple(_self,rhs) end + +---@param _self I16Vec2 +---@param rhs I16Vec2 +---@return integer +function I16Vec2.chebyshev_distance(_self,rhs) end + +---@param _self I16Vec2 +---@param rhs I16Vec2 +---@return I16Vec2 +function I16Vec2.saturating_div(_self,rhs) end + +---@param p1 I16Vec2 +---@param p2 integer +---@return I16Vec2 +function I16Vec2.div(p1,p2) end + +---@param _self I16Vec2 +---@return I16Vec2 +function I16Vec2.perp(_self) end + +---@param _self I16Vec2 +---@param rhs I16Vec2 +---@return integer +function I16Vec2.perp_dot(_self,rhs) end + +---@param _self I16Vec2 +---@return I16Vec2 +function I16Vec2.neg(_self) end + +---@param _self I16Vec2 +---@return integer +function I16Vec2.min_position(_self) end + +---@param _self I16Vec2 +---@param rhs I16Vec2 +---@return I16Vec2 +function I16Vec2.wrapping_div(_self,rhs) end + +---@param _self I16Vec2 +---@param rhs I16Vec2 +---@return BVec2 +function I16Vec2.cmpge(_self,rhs) end + +---@param _self I16Vec2 +---@param rhs I16Vec2 +---@return I16Vec2 +function I16Vec2.div(_self,rhs) end + +---@param _self I16Vec2 +---@return I16Vec2 +function I16Vec2.signum(_self) end + + + +---@class I16Vec3 : ReflectReference +---@field x ? integer +---@field y ? integer +---@field z ? integer +---@operator div(integer): I16Vec3 +---@operator unm: I16Vec3 +---@operator div(I16Vec3): I16Vec3 +---@operator mul(I16Vec3): I16Vec3 +---@operator mod(I16Vec3): I16Vec3 +---@operator add(I16Vec3): I16Vec3 +---@operator sub(I16Vec3): I16Vec3 +---@operator mod(integer): I16Vec3 +---@operator mod(I16Vec3): I16Vec3 +---@operator add(I16Vec3): I16Vec3 +---@operator add(integer): I16Vec3 +---@operator div(I16Vec3): I16Vec3 +---@operator sub(I16Vec3): I16Vec3 +---@operator mul(integer): I16Vec3 +---@operator sub(integer): I16Vec3 +---@operator mul(I16Vec3): I16Vec3 +I16Vec3 = {} + +---@param p1 I16Vec3 +---@param p2 integer +---@return I16Vec3 +function I16Vec3.div(p1,p2) end + +---@param _self I16Vec3 +---@return I16Vec3 +function I16Vec3.neg(_self) end + +---@param _self I16Vec3 +---@param rhs I16Vec3 +---@return I16Vec3 +function I16Vec3.div(_self,rhs) end + +---@param _self I16Vec3 +---@param rhs I16Vec3 +---@return I16Vec3 +function I16Vec3.saturating_add(_self,rhs) end + +---@param _self I16Vec3 +---@return integer +function I16Vec3.element_product(_self) end + +---@param _self I16Vec3 +---@param z integer +---@return I16Vec3 +function I16Vec3.with_z(_self,z) end + +---@param _self I16Vec3 +---@return Vec3A +function I16Vec3.as_vec3a(_self) end + +---@param p1 I16Vec3 +---@param p2 I16Vec3 +---@return I16Vec3 +function I16Vec3.mul(p1,p2) end + +---@param _self I16Vec3 +---@param rhs I16Vec3 +---@return I16Vec3 +function I16Vec3.saturating_div(_self,rhs) end + +---@param _self I16Vec3 +---@param rhs I16Vec3 +---@return I16Vec3 +function I16Vec3.wrapping_sub(_self,rhs) end + +---@param _self I16Vec3 +---@param rhs I16Vec3 +---@return integer | nil +function I16Vec3.checked_manhattan_distance(_self,rhs) end + +---@param _self I16Vec3 +---@return I64Vec3 +function I16Vec3.as_i64vec3(_self) end + +---@param _self I16Vec3 +---@param rhs I16Vec3 +---@return I16Vec3 +function I16Vec3.div_euclid(_self,rhs) end + +---@param p1 I16Vec3 +---@param p2 I16Vec3 +---@return I16Vec3 +function I16Vec3.rem(p1,p2) end + +---@param _self I16Vec3 +---@param rhs I16Vec3 +---@return I16Vec3 +function I16Vec3.max(_self,rhs) end + +---@param _self I16Vec3 +---@param rhs I16Vec3 +---@return I16Vec3 +function I16Vec3.wrapping_mul(_self,rhs) end + +---@param _self I16Vec3 +---@param rhs I16Vec3 +---@return I16Vec3 +function I16Vec3.saturating_sub(_self,rhs) end + +---@param _self I16Vec3 +---@param rhs I16Vec3 +---@return I16Vec3 +function I16Vec3.add(_self,rhs) end + +---@param _self I16Vec3 +---@param w integer +---@return I16Vec4 +function I16Vec3.extend(_self,w) end + +---@param _self I16Vec3 +---@param x integer +---@return I16Vec3 +function I16Vec3.with_x(_self,x) end + +---@param _self I16Vec3 +---@return integer +function I16Vec3.is_negative_bitmask(_self) end + +---@param _self I16Vec3 +---@param rhs I16Vec3 +---@return integer +function I16Vec3.chebyshev_distance(_self,rhs) end + +---@param _self I16Vec3 +---@return I16Vec3 +function I16Vec3.abs(_self) end + +---@param _self I16Vec3 +---@return nil +function I16Vec3.assert_receiver_is_total_eq(_self) end + +---@param _self I16Vec3 +---@return integer +function I16Vec3.max_element(_self) end + +---@param v integer +---@return I16Vec3 +function I16Vec3.splat(v) end + +---@param _self I16Vec3 +---@return U8Vec3 +function I16Vec3.as_u8vec3(_self) end + +---@param _self I16Vec3 +---@param rhs I16Vec3 +---@return BVec3 +function I16Vec3.cmpge(_self,rhs) end + +---@param _self I16Vec3 +---@param rhs I16Vec3 +---@return BVec3 +function I16Vec3.cmpgt(_self,rhs) end + +---@param _self I16Vec3 +---@return U16Vec3 +function I16Vec3.as_u16vec3(_self) end + +---@param _self I16Vec3 +---@return DVec3 +function I16Vec3.as_dvec3(_self) end + +---@param _self I16Vec3 +---@param rhs U16Vec3 +---@return I16Vec3 +function I16Vec3.saturating_add_unsigned(_self,rhs) end + +---@param _self I16Vec3 +---@return I16Vec2 +function I16Vec3.truncate(_self) end + +---@param _self I16Vec3 +---@param rhs I16Vec3 +---@return I16Vec3 +function I16Vec3.min(_self,rhs) end + +---@param _self I16Vec3 +---@param rhs I16Vec3 +---@return integer +function I16Vec3.dot(_self,rhs) end + +---@param _self I16Vec3 +---@return integer +function I16Vec3.element_sum(_self) end + +---@param _self I16Vec3 +---@param rhs U16Vec3 +---@return I16Vec3 +function I16Vec3.saturating_sub_unsigned(_self,rhs) end + +---@param _self I16Vec3 +---@return integer[] +function I16Vec3.to_array(_self) end + +---@param _self I16Vec3 +---@return I16Vec3 +function I16Vec3.clone(_self) end + +---@param _self I16Vec3 +---@param rhs I16Vec3 +---@return BVec3 +function I16Vec3.cmpeq(_self,rhs) end + +---@param _self I16Vec3 +---@return U64Vec3 +function I16Vec3.as_u64vec3(_self) end + +---@param _self I16Vec3 +---@param rhs I16Vec3 +---@return I16Vec3 +function I16Vec3.sub(_self,rhs) end + +---@param _self I16Vec3 +---@param min I16Vec3 +---@param max I16Vec3 +---@return I16Vec3 +function I16Vec3.clamp(_self,min,max) end + +---@param _self I16Vec3 +---@param rhs I16Vec3 +---@return I16Vec3 +function I16Vec3.wrapping_div(_self,rhs) end + +---@param _self I16Vec3 +---@return UVec3 +function I16Vec3.as_uvec3(_self) end + +---@param x integer +---@param y integer +---@param z integer +---@return I16Vec3 +function I16Vec3.new(x,y,z) end + +---@param p1 I16Vec3 +---@param p2 integer +---@return I16Vec3 +function I16Vec3.rem(p1,p2) end + +---@param _self I16Vec3 +---@return integer +function I16Vec3.min_position(_self) end + +---@param _self I16Vec3 +---@param y integer +---@return I16Vec3 +function I16Vec3.with_y(_self,y) end + +---@param _self I16Vec3 +---@return integer +function I16Vec3.max_position(_self) end + +---@param mask BVec3 +---@param if_true I16Vec3 +---@param if_false I16Vec3 +---@return I16Vec3 +function I16Vec3.select(mask,if_true,if_false) end + +---@param _self I16Vec3 +---@param rhs I16Vec3 +---@return I16Vec3 +function I16Vec3.rem(_self,rhs) end + +---@param _self I16Vec3 +---@return integer +function I16Vec3.min_element(_self) end + +---@param _self I16Vec3 +---@param rhs I16Vec3 +---@return BVec3 +function I16Vec3.cmple(_self,rhs) end + +---@param _self I16Vec3 +---@param rhs I16Vec3 +---@return I16Vec3 +function I16Vec3.dot_into_vec(_self,rhs) end + +---@param _self I16Vec3 +---@param rhs I16Vec3 +---@return I16Vec3 +function I16Vec3.wrapping_add(_self,rhs) end + +---@param _self I16Vec3 +---@return integer +function I16Vec3.length_squared(_self) end + +---@param _self I16Vec3 +---@param rhs U16Vec3 +---@return I16Vec3 +function I16Vec3.wrapping_sub_unsigned(_self,rhs) end + +---@param p1 I16Vec3 +---@param p2 I16Vec3 +---@return I16Vec3 +function I16Vec3.add(p1,p2) end + +---@param _self I16Vec3 +---@param rhs I16Vec3 +---@return I16Vec3 +function I16Vec3.saturating_mul(_self,rhs) end + +---@param _self I16Vec3 +---@param rhs I16Vec3 +---@return BVec3 +function I16Vec3.cmpne(_self,rhs) end + +---@param p1 I16Vec3 +---@param p2 integer +---@return I16Vec3 +function I16Vec3.add(p1,p2) end + +---@param _self I16Vec3 +---@param rhs I16Vec3 +---@return integer +function I16Vec3.distance_squared(_self,rhs) end + +---@param p1 I16Vec3 +---@param p2 I16Vec3 +---@return I16Vec3 +function I16Vec3.div(p1,p2) end + +---@param p1 I16Vec3 +---@param p2 I16Vec3 +---@return I16Vec3 +function I16Vec3.sub(p1,p2) end + +---@param _self I16Vec3 +---@return IVec3 +function I16Vec3.as_ivec3(_self) end + +---@param _self I16Vec3 +---@return I16Vec3 +function I16Vec3.signum(_self) end + +---@param _self I16Vec3 +---@param rhs I16Vec3 +---@return integer +function I16Vec3.manhattan_distance(_self,rhs) end + +---@param _self I16Vec3 +---@param rhs I16Vec3 +---@return BVec3 +function I16Vec3.cmplt(_self,rhs) end + +---@param p1 I16Vec3 +---@param p2 integer +---@return I16Vec3 +function I16Vec3.mul(p1,p2) end + +---@param p1 I16Vec3 +---@param p2 integer +---@return I16Vec3 +function I16Vec3.sub(p1,p2) end + +---@param a integer[] +---@return I16Vec3 +function I16Vec3.from_array(a) end + +---@param _self I16Vec3 +---@param other I16Vec3 +---@return boolean +function I16Vec3.__eq(_self,other) end + +---@param _self I16Vec3 +---@param other I16Vec3 +---@return boolean +function I16Vec3.eq(_self,other) end + +---@param _self I16Vec3 +---@param rhs I16Vec3 +---@return I16Vec3 +function I16Vec3.mul(_self,rhs) end + +---@param _self I16Vec3 +---@return I8Vec3 +function I16Vec3.as_i8vec3(_self) end + +---@param _self I16Vec3 +---@return Vec3 +function I16Vec3.as_vec3(_self) end + +---@param _self I16Vec3 +---@param rhs I16Vec3 +---@return I16Vec3 +function I16Vec3.rem_euclid(_self,rhs) end + +---@param _self I16Vec3 +---@param rhs I16Vec3 +---@return I16Vec3 +function I16Vec3.cross(_self,rhs) end + +---@param _self I16Vec3 +---@param rhs U16Vec3 +---@return I16Vec3 +function I16Vec3.wrapping_add_unsigned(_self,rhs) end + + + +---@class I16Vec4 : ReflectReference +---@field x ? integer +---@field y ? integer +---@field z ? integer +---@field w ? integer +---@operator sub(I16Vec4): I16Vec4 +---@operator div(I16Vec4): I16Vec4 +---@operator mul(I16Vec4): I16Vec4 +---@operator mod(integer): I16Vec4 +---@operator mod(I16Vec4): I16Vec4 +---@operator add(I16Vec4): I16Vec4 +---@operator sub(I16Vec4): I16Vec4 +---@operator unm: I16Vec4 +---@operator add(integer): I16Vec4 +---@operator div(integer): I16Vec4 +---@operator mul(I16Vec4): I16Vec4 +---@operator sub(integer): I16Vec4 +---@operator mod(I16Vec4): I16Vec4 +---@operator mul(integer): I16Vec4 +---@operator add(I16Vec4): I16Vec4 +---@operator div(I16Vec4): I16Vec4 +I16Vec4 = {} + +---@param p1 I16Vec4 +---@param p2 I16Vec4 +---@return I16Vec4 +function I16Vec4.sub(p1,p2) end + +---@param _self I16Vec4 +---@return I16Vec4 +function I16Vec4.abs(_self) end + +---@param p1 I16Vec4 +---@param p2 I16Vec4 +---@return I16Vec4 +function I16Vec4.div(p1,p2) end + +---@param _self I16Vec4 +---@param w integer +---@return I16Vec4 +function I16Vec4.with_w(_self,w) end + +---@param _self I16Vec4 +---@param rhs I16Vec4 +---@return integer +function I16Vec4.manhattan_distance(_self,rhs) end + +---@param _self I16Vec4 +---@return integer +function I16Vec4.length_squared(_self) end + +---@param _self I16Vec4 +---@param rhs I16Vec4 +---@return I16Vec4 +function I16Vec4.mul(_self,rhs) end + +---@param _self I16Vec4 +---@param rhs I16Vec4 +---@return integer | nil +function I16Vec4.checked_manhattan_distance(_self,rhs) end + +---@param _self I16Vec4 +---@return integer +function I16Vec4.min_position(_self) end + +---@param _self I16Vec4 +---@return I8Vec4 +function I16Vec4.as_i8vec4(_self) end + +---@param _self I16Vec4 +---@return Vec4 +function I16Vec4.as_vec4(_self) end + +---@param x integer +---@param y integer +---@param z integer +---@param w integer +---@return I16Vec4 +function I16Vec4.new(x,y,z,w) end + +---@param _self I16Vec4 +---@param min I16Vec4 +---@param max I16Vec4 +---@return I16Vec4 +function I16Vec4.clamp(_self,min,max) end + +---@param p1 I16Vec4 +---@param p2 integer +---@return I16Vec4 +function I16Vec4.rem(p1,p2) end + +---@param _self I16Vec4 +---@param rhs I16Vec4 +---@return integer +function I16Vec4.chebyshev_distance(_self,rhs) end + +---@param a integer[] +---@return I16Vec4 +function I16Vec4.from_array(a) end + +---@param _self I16Vec4 +---@return integer[] +function I16Vec4.to_array(_self) end + +---@param _self I16Vec4 +---@param rhs I16Vec4 +---@return I16Vec4 +function I16Vec4.saturating_mul(_self,rhs) end + +---@param _self I16Vec4 +---@return integer +function I16Vec4.element_product(_self) end + +---@param p1 I16Vec4 +---@param p2 I16Vec4 +---@return I16Vec4 +function I16Vec4.rem(p1,p2) end + +---@param _self I16Vec4 +---@param rhs U16Vec4 +---@return I16Vec4 +function I16Vec4.wrapping_add_unsigned(_self,rhs) end + +---@param _self I16Vec4 +---@return nil +function I16Vec4.assert_receiver_is_total_eq(_self) end + +---@param _self I16Vec4 +---@param rhs I16Vec4 +---@return I16Vec4 +function I16Vec4.wrapping_mul(_self,rhs) end + +---@param _self I16Vec4 +---@return UVec4 +function I16Vec4.as_uvec4(_self) end + +---@param _self I16Vec4 +---@param rhs I16Vec4 +---@return integer +function I16Vec4.distance_squared(_self,rhs) end + +---@param _self I16Vec4 +---@param rhs I16Vec4 +---@return I16Vec4 +function I16Vec4.add(_self,rhs) end + +---@param _self I16Vec4 +---@return integer +function I16Vec4.element_sum(_self) end + +---@param _self I16Vec4 +---@param rhs I16Vec4 +---@return I16Vec4 +function I16Vec4.min(_self,rhs) end + +---@param _self I16Vec4 +---@return integer +function I16Vec4.min_element(_self) end + +---@param _self I16Vec4 +---@return U8Vec4 +function I16Vec4.as_u8vec4(_self) end + +---@param _self I16Vec4 +---@param rhs I16Vec4 +---@return I16Vec4 +function I16Vec4.div_euclid(_self,rhs) end + +---@param _self I16Vec4 +---@param rhs I16Vec4 +---@return I16Vec4 +function I16Vec4.sub(_self,rhs) end + +---@param _self I16Vec4 +---@param rhs I16Vec4 +---@return BVec4 +function I16Vec4.cmpge(_self,rhs) end + +---@param _self I16Vec4 +---@return DVec4 +function I16Vec4.as_dvec4(_self) end + +---@param _self I16Vec4 +---@param rhs I16Vec4 +---@return I16Vec4 +function I16Vec4.saturating_sub(_self,rhs) end + +---@param _self I16Vec4 +---@param rhs I16Vec4 +---@return I16Vec4 +function I16Vec4.rem_euclid(_self,rhs) end + +---@param _self I16Vec4 +---@return I16Vec4 +function I16Vec4.signum(_self) end + +---@param _self I16Vec4 +---@param rhs I16Vec4 +---@return BVec4 +function I16Vec4.cmple(_self,rhs) end + +---@param _self I16Vec4 +---@param x integer +---@return I16Vec4 +function I16Vec4.with_x(_self,x) end + +---@param _self I16Vec4 +---@return I16Vec3 +function I16Vec4.truncate(_self) end + +---@param _self I16Vec4 +---@param rhs I16Vec4 +---@return integer +function I16Vec4.dot(_self,rhs) end + +---@param _self I16Vec4 +---@return I16Vec4 +function I16Vec4.neg(_self) end + +---@param _self I16Vec4 +---@return integer +function I16Vec4.max_position(_self) end + +---@param _self I16Vec4 +---@param rhs I16Vec4 +---@return I16Vec4 +function I16Vec4.wrapping_add(_self,rhs) end + +---@param _self I16Vec4 +---@param rhs U16Vec4 +---@return I16Vec4 +function I16Vec4.saturating_add_unsigned(_self,rhs) end + +---@param p1 I16Vec4 +---@param p2 integer +---@return I16Vec4 +function I16Vec4.add(p1,p2) end + +---@param p1 I16Vec4 +---@param p2 integer +---@return I16Vec4 +function I16Vec4.div(p1,p2) end + +---@param _self I16Vec4 +---@return I64Vec4 +function I16Vec4.as_i64vec4(_self) end + +---@param _self I16Vec4 +---@param rhs I16Vec4 +---@return I16Vec4 +function I16Vec4.dot_into_vec(_self,rhs) end + +---@param _self I16Vec4 +---@return integer +function I16Vec4.is_negative_bitmask(_self) end + +---@param _self I16Vec4 +---@return U64Vec4 +function I16Vec4.as_u64vec4(_self) end + +---@param _self I16Vec4 +---@param rhs I16Vec4 +---@return BVec4 +function I16Vec4.cmpne(_self,rhs) end + +---@param _self I16Vec4 +---@param rhs I16Vec4 +---@return BVec4 +function I16Vec4.cmpgt(_self,rhs) end + +---@param _self I16Vec4 +---@return IVec4 +function I16Vec4.as_ivec4(_self) end + +---@param _self I16Vec4 +---@return U16Vec4 +function I16Vec4.as_u16vec4(_self) end + +---@param _self I16Vec4 +---@param rhs I16Vec4 +---@return I16Vec4 +function I16Vec4.saturating_add(_self,rhs) end + +---@param _self I16Vec4 +---@param rhs U16Vec4 +---@return I16Vec4 +function I16Vec4.wrapping_sub_unsigned(_self,rhs) end + +---@param _self I16Vec4 +---@param other I16Vec4 +---@return boolean +function I16Vec4.__eq(_self,other) end + +---@param _self I16Vec4 +---@param other I16Vec4 +---@return boolean +function I16Vec4.eq(_self,other) end + +---@param p1 I16Vec4 +---@param p2 I16Vec4 +---@return I16Vec4 +function I16Vec4.mul(p1,p2) end + +---@param _self I16Vec4 +---@return I16Vec4 +function I16Vec4.clone(_self) end + +---@param _self I16Vec4 +---@param rhs I16Vec4 +---@return BVec4 +function I16Vec4.cmpeq(_self,rhs) end + +---@param _self I16Vec4 +---@param rhs I16Vec4 +---@return I16Vec4 +function I16Vec4.max(_self,rhs) end + +---@param p1 I16Vec4 +---@param p2 integer +---@return I16Vec4 +function I16Vec4.sub(p1,p2) end + +---@param v integer +---@return I16Vec4 +function I16Vec4.splat(v) end + +---@param _self I16Vec4 +---@param rhs I16Vec4 +---@return I16Vec4 +function I16Vec4.rem(_self,rhs) end + +---@param mask BVec4 +---@param if_true I16Vec4 +---@param if_false I16Vec4 +---@return I16Vec4 +function I16Vec4.select(mask,if_true,if_false) end + +---@param _self I16Vec4 +---@return integer +function I16Vec4.max_element(_self) end + +---@param _self I16Vec4 +---@param rhs U16Vec4 +---@return I16Vec4 +function I16Vec4.saturating_sub_unsigned(_self,rhs) end + +---@param p1 I16Vec4 +---@param p2 integer +---@return I16Vec4 +function I16Vec4.mul(p1,p2) end + +---@param _self I16Vec4 +---@param rhs I16Vec4 +---@return BVec4 +function I16Vec4.cmplt(_self,rhs) end + +---@param _self I16Vec4 +---@param rhs I16Vec4 +---@return I16Vec4 +function I16Vec4.wrapping_div(_self,rhs) end + +---@param _self I16Vec4 +---@param y integer +---@return I16Vec4 +function I16Vec4.with_y(_self,y) end + +---@param _self I16Vec4 +---@param rhs I16Vec4 +---@return I16Vec4 +function I16Vec4.saturating_div(_self,rhs) end + +---@param _self I16Vec4 +---@param rhs I16Vec4 +---@return I16Vec4 +function I16Vec4.wrapping_sub(_self,rhs) end + +---@param p1 I16Vec4 +---@param p2 I16Vec4 +---@return I16Vec4 +function I16Vec4.add(p1,p2) end + +---@param _self I16Vec4 +---@param rhs I16Vec4 +---@return I16Vec4 +function I16Vec4.div(_self,rhs) end + +---@param _self I16Vec4 +---@param z integer +---@return I16Vec4 +function I16Vec4.with_z(_self,z) end + + + +---@class I64Vec2 : ReflectReference +---@field x ? integer +---@field y ? integer +---@operator add(I64Vec2): I64Vec2 +---@operator sub(I64Vec2): I64Vec2 +---@operator mod(integer): I64Vec2 +---@operator add(I64Vec2): I64Vec2 +---@operator add(integer): I64Vec2 +---@operator sub(integer): I64Vec2 +---@operator unm: I64Vec2 +---@operator sub(I64Vec2): I64Vec2 +---@operator div(I64Vec2): I64Vec2 +---@operator mul(integer): I64Vec2 +---@operator mul(I64Vec2): I64Vec2 +---@operator mod(I64Vec2): I64Vec2 +---@operator div(integer): I64Vec2 +---@operator mod(I64Vec2): I64Vec2 +---@operator div(I64Vec2): I64Vec2 +---@operator mul(I64Vec2): I64Vec2 +I64Vec2 = {} + +---@param _self I64Vec2 +---@param rhs I64Vec2 +---@return BVec2 +function I64Vec2.cmple(_self,rhs) end + +---@param x integer +---@param y integer +---@return I64Vec2 +function I64Vec2.new(x,y) end + +---@param _self I64Vec2 +---@param rhs I64Vec2 +---@return I64Vec2 +function I64Vec2.div_euclid(_self,rhs) end + +---@param _self I64Vec2 +---@param other I64Vec2 +---@return boolean +function I64Vec2.__eq(_self,other) end + +---@param _self I64Vec2 +---@param other I64Vec2 +---@return boolean +function I64Vec2.eq(_self,other) end + +---@param p1 I64Vec2 +---@param p2 I64Vec2 +---@return I64Vec2 +function I64Vec2.add(p1,p2) end + +---@param p1 I64Vec2 +---@param p2 I64Vec2 +---@return I64Vec2 +function I64Vec2.sub(p1,p2) end + +---@param _self I64Vec2 +---@return UVec2 +function I64Vec2.as_uvec2(_self) end + +---@param _self I64Vec2 +---@param rhs I64Vec2 +---@return integer +function I64Vec2.chebyshev_distance(_self,rhs) end + +---@param p1 I64Vec2 +---@param p2 integer +---@return I64Vec2 +function I64Vec2.rem(p1,p2) end + +---@param _self I64Vec2 +---@return nil +function I64Vec2.assert_receiver_is_total_eq(_self) end + +---@param _self I64Vec2 +---@param rhs I64Vec2 +---@return I64Vec2 +function I64Vec2.add(_self,rhs) end + +---@param _self I64Vec2 +---@param rhs I64Vec2 +---@return I64Vec2 +function I64Vec2.wrapping_add(_self,rhs) end + +---@param _self I64Vec2 +---@param rhs I64Vec2 +---@return BVec2 +function I64Vec2.cmpne(_self,rhs) end + +---@param v integer +---@return I64Vec2 +function I64Vec2.splat(v) end + +---@param _self I64Vec2 +---@param rhs I64Vec2 +---@return I64Vec2 +function I64Vec2.saturating_add(_self,rhs) end + +---@param _self I64Vec2 +---@return integer +function I64Vec2.max_element(_self) end + +---@param _self I64Vec2 +---@return integer +function I64Vec2.length_squared(_self) end + +---@param p1 I64Vec2 +---@param p2 integer +---@return I64Vec2 +function I64Vec2.add(p1,p2) end + +---@param _self I64Vec2 +---@param rhs I64Vec2 +---@return integer | nil +function I64Vec2.checked_manhattan_distance(_self,rhs) end + +---@param _self I64Vec2 +---@return DVec2 +function I64Vec2.as_dvec2(_self) end + +---@param _self I64Vec2 +---@param rhs I64Vec2 +---@return integer +function I64Vec2.manhattan_distance(_self,rhs) end + +---@param _self I64Vec2 +---@param rhs I64Vec2 +---@return BVec2 +function I64Vec2.cmpge(_self,rhs) end + +---@param _self I64Vec2 +---@param rhs I64Vec2 +---@return integer +function I64Vec2.distance_squared(_self,rhs) end + +---@param _self I64Vec2 +---@param rhs I64Vec2 +---@return I64Vec2 +function I64Vec2.min(_self,rhs) end + +---@param _self I64Vec2 +---@param rhs I64Vec2 +---@return I64Vec2 +function I64Vec2.dot_into_vec(_self,rhs) end + +---@param _self I64Vec2 +---@param min I64Vec2 +---@param max I64Vec2 +---@return I64Vec2 +function I64Vec2.clamp(_self,min,max) end + +---@param p1 I64Vec2 +---@param p2 integer +---@return I64Vec2 +function I64Vec2.sub(p1,p2) end + +---@param _self I64Vec2 +---@return I64Vec2 +function I64Vec2.neg(_self) end + +---@param _self I64Vec2 +---@param rhs I64Vec2 +---@return I64Vec2 +function I64Vec2.sub(_self,rhs) end + +---@param _self I64Vec2 +---@param rhs I64Vec2 +---@return I64Vec2 +function I64Vec2.wrapping_mul(_self,rhs) end + +---@param _self I64Vec2 +---@param rhs I64Vec2 +---@return I64Vec2 +function I64Vec2.div(_self,rhs) end + +---@param p1 I64Vec2 +---@param p2 integer +---@return I64Vec2 +function I64Vec2.mul(p1,p2) end + +---@param _self I64Vec2 +---@return Vec2 +function I64Vec2.as_vec2(_self) end + +---@param _self I64Vec2 +---@return U8Vec2 +function I64Vec2.as_u8vec2(_self) end + +---@param p1 I64Vec2 +---@param p2 I64Vec2 +---@return I64Vec2 +function I64Vec2.mul(p1,p2) end + +---@param mask BVec2 +---@param if_true I64Vec2 +---@param if_false I64Vec2 +---@return I64Vec2 +function I64Vec2.select(mask,if_true,if_false) end + +---@param _self I64Vec2 +---@param rhs I64Vec2 +---@return I64Vec2 +function I64Vec2.rem(_self,rhs) end + +---@param p1 I64Vec2 +---@param p2 integer +---@return I64Vec2 +function I64Vec2.div(p1,p2) end + +---@param _self I64Vec2 +---@param rhs I64Vec2 +---@return I64Vec2 +function I64Vec2.saturating_sub(_self,rhs) end + +---@param _self I64Vec2 +---@param rhs U64Vec2 +---@return I64Vec2 +function I64Vec2.saturating_add_unsigned(_self,rhs) end + +---@param _self I64Vec2 +---@return IVec2 +function I64Vec2.as_ivec2(_self) end + +---@param _self I64Vec2 +---@param z integer +---@return I64Vec3 +function I64Vec2.extend(_self,z) end + +---@param _self I64Vec2 +---@param rhs I64Vec2 +---@return integer +function I64Vec2.perp_dot(_self,rhs) end + +---@param _self I64Vec2 +---@return integer +function I64Vec2.min_element(_self) end + +---@param _self I64Vec2 +---@param rhs I64Vec2 +---@return BVec2 +function I64Vec2.cmpgt(_self,rhs) end + +---@param _self I64Vec2 +---@param rhs I64Vec2 +---@return I64Vec2 +function I64Vec2.saturating_div(_self,rhs) end + +---@param _self I64Vec2 +---@return integer[] +function I64Vec2.to_array(_self) end + +---@param _self I64Vec2 +---@param rhs U64Vec2 +---@return I64Vec2 +function I64Vec2.saturating_sub_unsigned(_self,rhs) end + +---@param _self I64Vec2 +---@param rhs I64Vec2 +---@return I64Vec2 +function I64Vec2.wrapping_div(_self,rhs) end + +---@param _self I64Vec2 +---@param rhs U64Vec2 +---@return I64Vec2 +function I64Vec2.wrapping_add_unsigned(_self,rhs) end + +---@param _self I64Vec2 +---@param rhs I64Vec2 +---@return I64Vec2 +function I64Vec2.saturating_mul(_self,rhs) end + +---@param _self I64Vec2 +---@return integer +function I64Vec2.max_position(_self) end + +---@param _self I64Vec2 +---@param x integer +---@return I64Vec2 +function I64Vec2.with_x(_self,x) end + +---@param _self I64Vec2 +---@param rhs U64Vec2 +---@return I64Vec2 +function I64Vec2.wrapping_sub_unsigned(_self,rhs) end + +---@param _self I64Vec2 +---@return integer +function I64Vec2.element_product(_self) end + +---@param _self I64Vec2 +---@return U64Vec2 +function I64Vec2.as_u64vec2(_self) end + +---@param _self I64Vec2 +---@param rhs I64Vec2 +---@return I64Vec2 +function I64Vec2.rem_euclid(_self,rhs) end + +---@param a integer[] +---@return I64Vec2 +function I64Vec2.from_array(a) end + +---@param _self I64Vec2 +---@return integer +function I64Vec2.element_sum(_self) end + +---@param _self I64Vec2 +---@param rhs I64Vec2 +---@return BVec2 +function I64Vec2.cmplt(_self,rhs) end + +---@param _self I64Vec2 +---@param rhs I64Vec2 +---@return I64Vec2 +function I64Vec2.rotate(_self,rhs) end + +---@param p1 I64Vec2 +---@param p2 I64Vec2 +---@return I64Vec2 +function I64Vec2.rem(p1,p2) end + +---@param _self I64Vec2 +---@param rhs I64Vec2 +---@return BVec2 +function I64Vec2.cmpeq(_self,rhs) end + +---@param _self I64Vec2 +---@return I64Vec2 +function I64Vec2.abs(_self) end + +---@param _self I64Vec2 +---@return I64Vec2 +function I64Vec2.perp(_self) end + +---@param _self I64Vec2 +---@return integer +function I64Vec2.is_negative_bitmask(_self) end + +---@param _self I64Vec2 +---@param rhs I64Vec2 +---@return integer +function I64Vec2.dot(_self,rhs) end + +---@param p1 I64Vec2 +---@param p2 I64Vec2 +---@return I64Vec2 +function I64Vec2.div(p1,p2) end + +---@param _self I64Vec2 +---@param rhs I64Vec2 +---@return I64Vec2 +function I64Vec2.max(_self,rhs) end + +---@param _self I64Vec2 +---@param rhs I64Vec2 +---@return I64Vec2 +function I64Vec2.mul(_self,rhs) end + +---@param _self I64Vec2 +---@return I16Vec2 +function I64Vec2.as_i16vec2(_self) end + +---@param _self I64Vec2 +---@return U16Vec2 +function I64Vec2.as_u16vec2(_self) end + +---@param _self I64Vec2 +---@return integer +function I64Vec2.min_position(_self) end + +---@param _self I64Vec2 +---@return I64Vec2 +function I64Vec2.clone(_self) end + +---@param _self I64Vec2 +---@param y integer +---@return I64Vec2 +function I64Vec2.with_y(_self,y) end + +---@param _self I64Vec2 +---@return I8Vec2 +function I64Vec2.as_i8vec2(_self) end + +---@param _self I64Vec2 +---@param rhs I64Vec2 +---@return I64Vec2 +function I64Vec2.wrapping_sub(_self,rhs) end + +---@param _self I64Vec2 +---@return I64Vec2 +function I64Vec2.signum(_self) end + + + +---@class I64Vec3 : ReflectReference +---@field x ? integer +---@field y ? integer +---@field z ? integer +---@operator mod(I64Vec3): I64Vec3 +---@operator unm: I64Vec3 +---@operator sub(I64Vec3): I64Vec3 +---@operator div(integer): I64Vec3 +---@operator add(integer): I64Vec3 +---@operator div(I64Vec3): I64Vec3 +---@operator mod(I64Vec3): I64Vec3 +---@operator mod(integer): I64Vec3 +---@operator add(I64Vec3): I64Vec3 +---@operator mul(I64Vec3): I64Vec3 +---@operator div(I64Vec3): I64Vec3 +---@operator mul(I64Vec3): I64Vec3 +---@operator add(I64Vec3): I64Vec3 +---@operator mul(integer): I64Vec3 +---@operator sub(I64Vec3): I64Vec3 +---@operator sub(integer): I64Vec3 +I64Vec3 = {} + +---@param _self I64Vec3 +---@return integer +function I64Vec3.element_product(_self) end + +---@param _self I64Vec3 +---@param rhs I64Vec3 +---@return I64Vec3 +function I64Vec3.max(_self,rhs) end + +---@param _self I64Vec3 +---@param rhs I64Vec3 +---@return I64Vec3 +function I64Vec3.rem(_self,rhs) end + +---@param _self I64Vec3 +---@param rhs I64Vec3 +---@return I64Vec3 +function I64Vec3.wrapping_add(_self,rhs) end + +---@param _self I64Vec3 +---@return UVec3 +function I64Vec3.as_uvec3(_self) end + +---@param _self I64Vec3 +---@return I8Vec3 +function I64Vec3.as_i8vec3(_self) end + +---@param _self I64Vec3 +---@return DVec3 +function I64Vec3.as_dvec3(_self) end + +---@param _self I64Vec3 +---@return integer +function I64Vec3.max_position(_self) end + +---@param _self I64Vec3 +---@return U8Vec3 +function I64Vec3.as_u8vec3(_self) end + +---@param _self I64Vec3 +---@return integer +function I64Vec3.is_negative_bitmask(_self) end + +---@param _self I64Vec3 +---@return Vec3A +function I64Vec3.as_vec3a(_self) end + +---@param _self I64Vec3 +---@return I64Vec3 +function I64Vec3.neg(_self) end + +---@param _self I64Vec3 +---@param y integer +---@return I64Vec3 +function I64Vec3.with_y(_self,y) end + +---@param _self I64Vec3 +---@param rhs I64Vec3 +---@return I64Vec3 +function I64Vec3.wrapping_mul(_self,rhs) end + +---@param _self I64Vec3 +---@return integer[] +function I64Vec3.to_array(_self) end + +---@param _self I64Vec3 +---@param rhs I64Vec3 +---@return I64Vec3 +function I64Vec3.div_euclid(_self,rhs) end + +---@param _self I64Vec3 +---@param rhs I64Vec3 +---@return I64Vec3 +function I64Vec3.sub(_self,rhs) end + +---@param _self I64Vec3 +---@return U64Vec3 +function I64Vec3.as_u64vec3(_self) end + +---@param _self I64Vec3 +---@param rhs U64Vec3 +---@return I64Vec3 +function I64Vec3.saturating_add_unsigned(_self,rhs) end + +---@param _self I64Vec3 +---@return I64Vec2 +function I64Vec3.truncate(_self) end + +---@param _self I64Vec3 +---@param rhs I64Vec3 +---@return BVec3 +function I64Vec3.cmpne(_self,rhs) end + +---@param x integer +---@param y integer +---@param z integer +---@return I64Vec3 +function I64Vec3.new(x,y,z) end + +---@param _self I64Vec3 +---@param rhs I64Vec3 +---@return I64Vec3 +function I64Vec3.wrapping_div(_self,rhs) end + +---@param _self I64Vec3 +---@param rhs I64Vec3 +---@return BVec3 +function I64Vec3.cmpeq(_self,rhs) end + +---@param p1 I64Vec3 +---@param p2 integer +---@return I64Vec3 +function I64Vec3.div(p1,p2) end + +---@param _self I64Vec3 +---@param rhs U64Vec3 +---@return I64Vec3 +function I64Vec3.wrapping_sub_unsigned(_self,rhs) end + +---@param _self I64Vec3 +---@param rhs I64Vec3 +---@return integer | nil +function I64Vec3.checked_manhattan_distance(_self,rhs) end + +---@param _self I64Vec3 +---@return I64Vec3 +function I64Vec3.signum(_self) end + +---@param p1 I64Vec3 +---@param p2 integer +---@return I64Vec3 +function I64Vec3.add(p1,p2) end + +---@param _self I64Vec3 +---@param rhs I64Vec3 +---@return integer +function I64Vec3.manhattan_distance(_self,rhs) end + +---@param _self I64Vec3 +---@return integer +function I64Vec3.min_element(_self) end + +---@param _self I64Vec3 +---@return integer +function I64Vec3.length_squared(_self) end + +---@param _self I64Vec3 +---@param rhs I64Vec3 +---@return I64Vec3 +function I64Vec3.div(_self,rhs) end + +---@param _self I64Vec3 +---@param rhs I64Vec3 +---@return integer +function I64Vec3.distance_squared(_self,rhs) end + +---@param p1 I64Vec3 +---@param p2 I64Vec3 +---@return I64Vec3 +function I64Vec3.rem(p1,p2) end + +---@param p1 I64Vec3 +---@param p2 integer +---@return I64Vec3 +function I64Vec3.rem(p1,p2) end + +---@param _self I64Vec3 +---@param other I64Vec3 +---@return boolean +function I64Vec3.__eq(_self,other) end + +---@param _self I64Vec3 +---@param other I64Vec3 +---@return boolean +function I64Vec3.eq(_self,other) end + +---@param _self I64Vec3 +---@param rhs I64Vec3 +---@return BVec3 +function I64Vec3.cmpgt(_self,rhs) end + +---@param p1 I64Vec3 +---@param p2 I64Vec3 +---@return I64Vec3 +function I64Vec3.add(p1,p2) end + +---@param _self I64Vec3 +---@param rhs I64Vec3 +---@return I64Vec3 +function I64Vec3.rem_euclid(_self,rhs) end + +---@param _self I64Vec3 +---@param rhs I64Vec3 +---@return I64Vec3 +function I64Vec3.saturating_sub(_self,rhs) end + +---@param _self I64Vec3 +---@return I16Vec3 +function I64Vec3.as_i16vec3(_self) end + +---@param _self I64Vec3 +---@return integer +function I64Vec3.element_sum(_self) end + +---@param _self I64Vec3 +---@param min I64Vec3 +---@param max I64Vec3 +---@return I64Vec3 +function I64Vec3.clamp(_self,min,max) end + +---@param _self I64Vec3 +---@param rhs I64Vec3 +---@return I64Vec3 +function I64Vec3.mul(_self,rhs) end + +---@param _self I64Vec3 +---@param rhs I64Vec3 +---@return I64Vec3 +function I64Vec3.wrapping_sub(_self,rhs) end + +---@param p1 I64Vec3 +---@param p2 I64Vec3 +---@return I64Vec3 +function I64Vec3.div(p1,p2) end + +---@param p1 I64Vec3 +---@param p2 I64Vec3 +---@return I64Vec3 +function I64Vec3.mul(p1,p2) end + +---@param _self I64Vec3 +---@return U16Vec3 +function I64Vec3.as_u16vec3(_self) end + +---@param _self I64Vec3 +---@param rhs I64Vec3 +---@return I64Vec3 +function I64Vec3.add(_self,rhs) end + +---@param _self I64Vec3 +---@param w integer +---@return I64Vec4 +function I64Vec3.extend(_self,w) end + +---@param _self I64Vec3 +---@param rhs I64Vec3 +---@return integer +function I64Vec3.chebyshev_distance(_self,rhs) end + +---@param mask BVec3 +---@param if_true I64Vec3 +---@param if_false I64Vec3 +---@return I64Vec3 +function I64Vec3.select(mask,if_true,if_false) end + +---@param _self I64Vec3 +---@return IVec3 +function I64Vec3.as_ivec3(_self) end + +---@param _self I64Vec3 +---@return Vec3 +function I64Vec3.as_vec3(_self) end + +---@param _self I64Vec3 +---@param rhs I64Vec3 +---@return integer +function I64Vec3.dot(_self,rhs) end + +---@param _self I64Vec3 +---@return integer +function I64Vec3.min_position(_self) end + +---@param a integer[] +---@return I64Vec3 +function I64Vec3.from_array(a) end + +---@param _self I64Vec3 +---@param rhs I64Vec3 +---@return I64Vec3 +function I64Vec3.cross(_self,rhs) end + +---@param _self I64Vec3 +---@param rhs I64Vec3 +---@return I64Vec3 +function I64Vec3.saturating_div(_self,rhs) end + +---@param _self I64Vec3 +---@param rhs I64Vec3 +---@return I64Vec3 +function I64Vec3.min(_self,rhs) end + +---@param _self I64Vec3 +---@param rhs I64Vec3 +---@return I64Vec3 +function I64Vec3.saturating_mul(_self,rhs) end + +---@param _self I64Vec3 +---@return I64Vec3 +function I64Vec3.clone(_self) end + +---@param _self I64Vec3 +---@param rhs I64Vec3 +---@return BVec3 +function I64Vec3.cmpge(_self,rhs) end + +---@param _self I64Vec3 +---@param rhs I64Vec3 +---@return I64Vec3 +function I64Vec3.saturating_add(_self,rhs) end + +---@param _self I64Vec3 +---@return nil +function I64Vec3.assert_receiver_is_total_eq(_self) end + +---@param _self I64Vec3 +---@param rhs U64Vec3 +---@return I64Vec3 +function I64Vec3.wrapping_add_unsigned(_self,rhs) end + +---@param _self I64Vec3 +---@param rhs I64Vec3 +---@return BVec3 +function I64Vec3.cmplt(_self,rhs) end + +---@param _self I64Vec3 +---@param rhs I64Vec3 +---@return BVec3 +function I64Vec3.cmple(_self,rhs) end + +---@param _self I64Vec3 +---@return integer +function I64Vec3.max_element(_self) end + +---@param p1 I64Vec3 +---@param p2 integer +---@return I64Vec3 +function I64Vec3.mul(p1,p2) end + +---@param _self I64Vec3 +---@param z integer +---@return I64Vec3 +function I64Vec3.with_z(_self,z) end + +---@param _self I64Vec3 +---@param rhs U64Vec3 +---@return I64Vec3 +function I64Vec3.saturating_sub_unsigned(_self,rhs) end + +---@param v integer +---@return I64Vec3 +function I64Vec3.splat(v) end + +---@param _self I64Vec3 +---@param x integer +---@return I64Vec3 +function I64Vec3.with_x(_self,x) end + +---@param p1 I64Vec3 +---@param p2 I64Vec3 +---@return I64Vec3 +function I64Vec3.sub(p1,p2) end + +---@param p1 I64Vec3 +---@param p2 integer +---@return I64Vec3 +function I64Vec3.sub(p1,p2) end + +---@param _self I64Vec3 +---@return I64Vec3 +function I64Vec3.abs(_self) end + +---@param _self I64Vec3 +---@param rhs I64Vec3 +---@return I64Vec3 +function I64Vec3.dot_into_vec(_self,rhs) end + + + +---@class I64Vec4 : ReflectReference +---@field x ? integer +---@field y ? integer +---@field z ? integer +---@field w ? integer +---@operator mod(integer): I64Vec4 +---@operator unm: I64Vec4 +---@operator sub(I64Vec4): I64Vec4 +---@operator div(I64Vec4): I64Vec4 +---@operator add(integer): I64Vec4 +---@operator mul(I64Vec4): I64Vec4 +---@operator sub(integer): I64Vec4 +---@operator mul(integer): I64Vec4 +---@operator add(I64Vec4): I64Vec4 +---@operator mod(I64Vec4): I64Vec4 +---@operator div(integer): I64Vec4 +---@operator sub(I64Vec4): I64Vec4 +---@operator mod(I64Vec4): I64Vec4 +---@operator div(I64Vec4): I64Vec4 +---@operator mul(I64Vec4): I64Vec4 +---@operator add(I64Vec4): I64Vec4 +I64Vec4 = {} + +---@param _self I64Vec4 +---@return integer +function I64Vec4.element_product(_self) end + +---@param _self I64Vec4 +---@param rhs I64Vec4 +---@return integer +function I64Vec4.manhattan_distance(_self,rhs) end + +---@param _self I64Vec4 +---@param rhs I64Vec4 +---@return I64Vec4 +function I64Vec4.max(_self,rhs) end + +---@param p1 I64Vec4 +---@param p2 integer +---@return I64Vec4 +function I64Vec4.rem(p1,p2) end + +---@param _self I64Vec4 +---@return I64Vec4 +function I64Vec4.neg(_self) end + +---@param _self I64Vec4 +---@param rhs U64Vec4 +---@return I64Vec4 +function I64Vec4.wrapping_sub_unsigned(_self,rhs) end + +---@param _self I64Vec4 +---@param rhs I64Vec4 +---@return BVec4 +function I64Vec4.cmpne(_self,rhs) end + +---@param _self I64Vec4 +---@return U8Vec4 +function I64Vec4.as_u8vec4(_self) end + +---@param _self I64Vec4 +---@param rhs U64Vec4 +---@return I64Vec4 +function I64Vec4.saturating_add_unsigned(_self,rhs) end + +---@param _self I64Vec4 +---@param rhs I64Vec4 +---@return I64Vec4 +function I64Vec4.wrapping_sub(_self,rhs) end + +---@param _self I64Vec4 +---@param rhs I64Vec4 +---@return I64Vec4 +function I64Vec4.sub(_self,rhs) end + +---@param _self I64Vec4 +---@param w integer +---@return I64Vec4 +function I64Vec4.with_w(_self,w) end + +---@param _self I64Vec4 +---@param rhs I64Vec4 +---@return I64Vec4 +function I64Vec4.div(_self,rhs) end + +---@param _self I64Vec4 +---@return I64Vec4 +function I64Vec4.clone(_self) end + +---@param _self I64Vec4 +---@return U16Vec4 +function I64Vec4.as_u16vec4(_self) end + +---@param _self I64Vec4 +---@param y integer +---@return I64Vec4 +function I64Vec4.with_y(_self,y) end + +---@param _self I64Vec4 +---@param rhs I64Vec4 +---@return I64Vec4 +function I64Vec4.div_euclid(_self,rhs) end + +---@param _self I64Vec4 +---@return UVec4 +function I64Vec4.as_uvec4(_self) end + +---@param _self I64Vec4 +---@param rhs U64Vec4 +---@return I64Vec4 +function I64Vec4.wrapping_add_unsigned(_self,rhs) end + +---@param _self I64Vec4 +---@param rhs I64Vec4 +---@return I64Vec4 +function I64Vec4.wrapping_div(_self,rhs) end + +---@param _self I64Vec4 +---@param rhs I64Vec4 +---@return I64Vec4 +function I64Vec4.wrapping_mul(_self,rhs) end + +---@param _self I64Vec4 +---@param rhs I64Vec4 +---@return integer +function I64Vec4.chebyshev_distance(_self,rhs) end + +---@param _self I64Vec4 +---@param rhs I64Vec4 +---@return I64Vec4 +function I64Vec4.rem_euclid(_self,rhs) end + +---@param _self I64Vec4 +---@param z integer +---@return I64Vec4 +function I64Vec4.with_z(_self,z) end + +---@param _self I64Vec4 +---@return integer +function I64Vec4.min_element(_self) end + +---@param _self I64Vec4 +---@param rhs I64Vec4 +---@return BVec4 +function I64Vec4.cmpgt(_self,rhs) end + +---@param _self I64Vec4 +---@return integer +function I64Vec4.max_element(_self) end + +---@param _self I64Vec4 +---@param rhs U64Vec4 +---@return I64Vec4 +function I64Vec4.saturating_sub_unsigned(_self,rhs) end + +---@param _self I64Vec4 +---@return I64Vec3 +function I64Vec4.truncate(_self) end + +---@param _self I64Vec4 +---@param rhs I64Vec4 +---@return I64Vec4 +function I64Vec4.saturating_mul(_self,rhs) end + +---@param p1 I64Vec4 +---@param p2 integer +---@return I64Vec4 +function I64Vec4.add(p1,p2) end + +---@param _self I64Vec4 +---@param rhs I64Vec4 +---@return integer +function I64Vec4.dot(_self,rhs) end + +---@param v integer +---@return I64Vec4 +function I64Vec4.splat(v) end + +---@param _self I64Vec4 +---@param x integer +---@return I64Vec4 +function I64Vec4.with_x(_self,x) end + +---@param _self I64Vec4 +---@param rhs I64Vec4 +---@return I64Vec4 +function I64Vec4.mul(_self,rhs) end + +---@param _self I64Vec4 +---@return I16Vec4 +function I64Vec4.as_i16vec4(_self) end + +---@param _self I64Vec4 +---@return integer +function I64Vec4.element_sum(_self) end + +---@param p1 I64Vec4 +---@param p2 integer +---@return I64Vec4 +function I64Vec4.sub(p1,p2) end + +---@param _self I64Vec4 +---@param rhs I64Vec4 +---@return integer +function I64Vec4.distance_squared(_self,rhs) end + +---@param _self I64Vec4 +---@param rhs I64Vec4 +---@return I64Vec4 +function I64Vec4.saturating_div(_self,rhs) end + +---@param p1 I64Vec4 +---@param p2 integer +---@return I64Vec4 +function I64Vec4.mul(p1,p2) end + +---@param a integer[] +---@return I64Vec4 +function I64Vec4.from_array(a) end + +---@param _self I64Vec4 +---@param rhs I64Vec4 +---@return integer | nil +function I64Vec4.checked_manhattan_distance(_self,rhs) end + +---@param _self I64Vec4 +---@return I64Vec4 +function I64Vec4.abs(_self) end + +---@param _self I64Vec4 +---@param rhs I64Vec4 +---@return I64Vec4 +function I64Vec4.saturating_sub(_self,rhs) end + +---@param p1 I64Vec4 +---@param p2 I64Vec4 +---@return I64Vec4 +function I64Vec4.add(p1,p2) end + +---@param mask BVec4 +---@param if_true I64Vec4 +---@param if_false I64Vec4 +---@return I64Vec4 +function I64Vec4.select(mask,if_true,if_false) end + +---@param x integer +---@param y integer +---@param z integer +---@param w integer +---@return I64Vec4 +function I64Vec4.new(x,y,z,w) end + +---@param _self I64Vec4 +---@return integer +function I64Vec4.max_position(_self) end + +---@param _self I64Vec4 +---@param other I64Vec4 +---@return boolean +function I64Vec4.__eq(_self,other) end + +---@param _self I64Vec4 +---@param other I64Vec4 +---@return boolean +function I64Vec4.eq(_self,other) end + +---@param _self I64Vec4 +---@return DVec4 +function I64Vec4.as_dvec4(_self) end + +---@param p1 I64Vec4 +---@param p2 I64Vec4 +---@return I64Vec4 +function I64Vec4.rem(p1,p2) end + +---@param _self I64Vec4 +---@param rhs I64Vec4 +---@return BVec4 +function I64Vec4.cmple(_self,rhs) end + +---@param _self I64Vec4 +---@param rhs I64Vec4 +---@return I64Vec4 +function I64Vec4.saturating_add(_self,rhs) end + +---@param _self I64Vec4 +---@return integer[] +function I64Vec4.to_array(_self) end + +---@param _self I64Vec4 +---@return nil +function I64Vec4.assert_receiver_is_total_eq(_self) end + +---@param _self I64Vec4 +---@return I8Vec4 +function I64Vec4.as_i8vec4(_self) end + +---@param _self I64Vec4 +---@return integer +function I64Vec4.min_position(_self) end + +---@param _self I64Vec4 +---@param rhs I64Vec4 +---@return I64Vec4 +function I64Vec4.wrapping_add(_self,rhs) end + +---@param _self I64Vec4 +---@param rhs I64Vec4 +---@return I64Vec4 +function I64Vec4.min(_self,rhs) end + +---@param _self I64Vec4 +---@return Vec4 +function I64Vec4.as_vec4(_self) end + +---@param _self I64Vec4 +---@return integer +function I64Vec4.is_negative_bitmask(_self) end + +---@param _self I64Vec4 +---@return I64Vec4 +function I64Vec4.signum(_self) end + +---@param _self I64Vec4 +---@param rhs I64Vec4 +---@return I64Vec4 +function I64Vec4.dot_into_vec(_self,rhs) end + +---@param p1 I64Vec4 +---@param p2 integer +---@return I64Vec4 +function I64Vec4.div(p1,p2) end + +---@param _self I64Vec4 +---@return integer +function I64Vec4.length_squared(_self) end + +---@param p1 I64Vec4 +---@param p2 I64Vec4 +---@return I64Vec4 +function I64Vec4.sub(p1,p2) end + +---@param _self I64Vec4 +---@param min I64Vec4 +---@param max I64Vec4 +---@return I64Vec4 +function I64Vec4.clamp(_self,min,max) end + +---@param _self I64Vec4 +---@param rhs I64Vec4 +---@return BVec4 +function I64Vec4.cmpge(_self,rhs) end + +---@param _self I64Vec4 +---@return IVec4 +function I64Vec4.as_ivec4(_self) end + +---@param _self I64Vec4 +---@param rhs I64Vec4 +---@return I64Vec4 +function I64Vec4.rem(_self,rhs) end + +---@param p1 I64Vec4 +---@param p2 I64Vec4 +---@return I64Vec4 +function I64Vec4.div(p1,p2) end + +---@param _self I64Vec4 +---@param rhs I64Vec4 +---@return BVec4 +function I64Vec4.cmplt(_self,rhs) end + +---@param _self I64Vec4 +---@return U64Vec4 +function I64Vec4.as_u64vec4(_self) end + +---@param p1 I64Vec4 +---@param p2 I64Vec4 +---@return I64Vec4 +function I64Vec4.mul(p1,p2) end + +---@param _self I64Vec4 +---@param rhs I64Vec4 +---@return BVec4 +function I64Vec4.cmpeq(_self,rhs) end + +---@param _self I64Vec4 +---@param rhs I64Vec4 +---@return I64Vec4 +function I64Vec4.add(_self,rhs) end + + + +---@class I8Vec2 : ReflectReference +---@field x ? integer +---@field y ? integer +---@operator unm: I8Vec2 +---@operator mul(I8Vec2): I8Vec2 +---@operator div(I8Vec2): I8Vec2 +---@operator mod(integer): I8Vec2 +---@operator add(I8Vec2): I8Vec2 +---@operator add(integer): I8Vec2 +---@operator add(I8Vec2): I8Vec2 +---@operator sub(integer): I8Vec2 +---@operator mod(I8Vec2): I8Vec2 +---@operator sub(I8Vec2): I8Vec2 +---@operator mul(integer): I8Vec2 +---@operator sub(I8Vec2): I8Vec2 +---@operator div(I8Vec2): I8Vec2 +---@operator mod(I8Vec2): I8Vec2 +---@operator div(integer): I8Vec2 +---@operator mul(I8Vec2): I8Vec2 +I8Vec2 = {} + +---@param _self I8Vec2 +---@param rhs I8Vec2 +---@return I8Vec2 +function I8Vec2.wrapping_mul(_self,rhs) end + +---@param _self I8Vec2 +---@param rhs I8Vec2 +---@return I8Vec2 +function I8Vec2.dot_into_vec(_self,rhs) end + +---@param _self I8Vec2 +---@return integer +function I8Vec2.max_position(_self) end + +---@param _self I8Vec2 +---@param rhs I8Vec2 +---@return BVec2 +function I8Vec2.cmple(_self,rhs) end + +---@param _self I8Vec2 +---@param rhs U8Vec2 +---@return I8Vec2 +function I8Vec2.saturating_sub_unsigned(_self,rhs) end + +---@param _self I8Vec2 +---@param rhs U8Vec2 +---@return I8Vec2 +function I8Vec2.saturating_add_unsigned(_self,rhs) end + +---@param _self I8Vec2 +---@return I8Vec2 +function I8Vec2.neg(_self) end + +---@param _self I8Vec2 +---@param rhs I8Vec2 +---@return I8Vec2 +function I8Vec2.mul(_self,rhs) end + +---@param _self I8Vec2 +---@return I8Vec2 +function I8Vec2.clone(_self) end + +---@param _self I8Vec2 +---@return I64Vec2 +function I8Vec2.as_i64vec2(_self) end + +---@param p1 I8Vec2 +---@param p2 I8Vec2 +---@return I8Vec2 +function I8Vec2.div(p1,p2) end + +---@param _self I8Vec2 +---@param rhs I8Vec2 +---@return integer +function I8Vec2.perp_dot(_self,rhs) end + +---@param _self I8Vec2 +---@param rhs I8Vec2 +---@return I8Vec2 +function I8Vec2.div_euclid(_self,rhs) end + +---@param p1 I8Vec2 +---@param p2 integer +---@return I8Vec2 +function I8Vec2.rem(p1,p2) end + +---@param _self I8Vec2 +---@param rhs I8Vec2 +---@return integer +function I8Vec2.distance_squared(_self,rhs) end + +---@param _self I8Vec2 +---@return integer +function I8Vec2.min_position(_self) end + +---@param _self I8Vec2 +---@param rhs U8Vec2 +---@return I8Vec2 +function I8Vec2.wrapping_add_unsigned(_self,rhs) end + +---@param _self I8Vec2 +---@return U64Vec2 +function I8Vec2.as_u64vec2(_self) end + +---@param _self I8Vec2 +---@param rhs I8Vec2 +---@return integer +function I8Vec2.manhattan_distance(_self,rhs) end + +---@param _self I8Vec2 +---@return I16Vec2 +function I8Vec2.as_i16vec2(_self) end + +---@param _self I8Vec2 +---@param rhs I8Vec2 +---@return I8Vec2 +function I8Vec2.add(_self,rhs) end + +---@param _self I8Vec2 +---@param rhs I8Vec2 +---@return integer +function I8Vec2.chebyshev_distance(_self,rhs) end + +---@param _self I8Vec2 +---@param rhs I8Vec2 +---@return I8Vec2 +function I8Vec2.wrapping_add(_self,rhs) end + +---@param _self I8Vec2 +---@param rhs I8Vec2 +---@return BVec2 +function I8Vec2.cmplt(_self,rhs) end + +---@param _self I8Vec2 +---@return integer +function I8Vec2.max_element(_self) end + +---@param _self I8Vec2 +---@return integer +function I8Vec2.element_sum(_self) end + +---@param _self I8Vec2 +---@param rhs I8Vec2 +---@return I8Vec2 +function I8Vec2.saturating_mul(_self,rhs) end + +---@param _self I8Vec2 +---@param rhs I8Vec2 +---@return I8Vec2 +function I8Vec2.wrapping_div(_self,rhs) end + +---@param _self I8Vec2 +---@param rhs I8Vec2 +---@return integer | nil +function I8Vec2.checked_manhattan_distance(_self,rhs) end + +---@param _self I8Vec2 +---@return integer[] +function I8Vec2.to_array(_self) end + +---@param _self I8Vec2 +---@return I8Vec2 +function I8Vec2.abs(_self) end + +---@param x integer +---@param y integer +---@return I8Vec2 +function I8Vec2.new(x,y) end + +---@param _self I8Vec2 +---@param rhs I8Vec2 +---@return BVec2 +function I8Vec2.cmpne(_self,rhs) end + +---@param _self I8Vec2 +---@param x integer +---@return I8Vec2 +function I8Vec2.with_x(_self,x) end + +---@param _self I8Vec2 +---@return Vec2 +function I8Vec2.as_vec2(_self) end + +---@param _self I8Vec2 +---@param other I8Vec2 +---@return boolean +function I8Vec2.__eq(_self,other) end + +---@param _self I8Vec2 +---@param other I8Vec2 +---@return boolean +function I8Vec2.eq(_self,other) end + +---@param _self I8Vec2 +---@param min I8Vec2 +---@param max I8Vec2 +---@return I8Vec2 +function I8Vec2.clamp(_self,min,max) end + +---@param _self I8Vec2 +---@param rhs I8Vec2 +---@return I8Vec2 +function I8Vec2.saturating_add(_self,rhs) end + +---@param _self I8Vec2 +---@return U8Vec2 +function I8Vec2.as_u8vec2(_self) end + +---@param p1 I8Vec2 +---@param p2 integer +---@return I8Vec2 +function I8Vec2.add(p1,p2) end + +---@param _self I8Vec2 +---@return integer +function I8Vec2.is_negative_bitmask(_self) end + +---@param p1 I8Vec2 +---@param p2 I8Vec2 +---@return I8Vec2 +function I8Vec2.add(p1,p2) end + +---@param _self I8Vec2 +---@param rhs I8Vec2 +---@return I8Vec2 +function I8Vec2.saturating_div(_self,rhs) end + +---@param _self I8Vec2 +---@return integer +function I8Vec2.element_product(_self) end + +---@param _self I8Vec2 +---@return DVec2 +function I8Vec2.as_dvec2(_self) end + +---@param p1 I8Vec2 +---@param p2 integer +---@return I8Vec2 +function I8Vec2.sub(p1,p2) end + +---@param _self I8Vec2 +---@return nil +function I8Vec2.assert_receiver_is_total_eq(_self) end + +---@param p1 I8Vec2 +---@param p2 I8Vec2 +---@return I8Vec2 +function I8Vec2.rem(p1,p2) end + +---@param _self I8Vec2 +---@return U16Vec2 +function I8Vec2.as_u16vec2(_self) end + +---@param a integer[] +---@return I8Vec2 +function I8Vec2.from_array(a) end + +---@param _self I8Vec2 +---@param rhs I8Vec2 +---@return I8Vec2 +function I8Vec2.sub(_self,rhs) end + +---@param _self I8Vec2 +---@return I8Vec2 +function I8Vec2.signum(_self) end + +---@param _self I8Vec2 +---@param rhs I8Vec2 +---@return I8Vec2 +function I8Vec2.rem_euclid(_self,rhs) end + +---@param p1 I8Vec2 +---@param p2 integer +---@return I8Vec2 +function I8Vec2.mul(p1,p2) end + +---@param p1 I8Vec2 +---@param p2 I8Vec2 +---@return I8Vec2 +function I8Vec2.sub(p1,p2) end + +---@param _self I8Vec2 +---@param rhs U8Vec2 +---@return I8Vec2 +function I8Vec2.wrapping_sub_unsigned(_self,rhs) end + +---@param _self I8Vec2 +---@param y integer +---@return I8Vec2 +function I8Vec2.with_y(_self,y) end + +---@param _self I8Vec2 +---@return IVec2 +function I8Vec2.as_ivec2(_self) end + +---@param _self I8Vec2 +---@param rhs I8Vec2 +---@return integer +function I8Vec2.dot(_self,rhs) end + +---@param _self I8Vec2 +---@param rhs I8Vec2 +---@return BVec2 +function I8Vec2.cmpgt(_self,rhs) end + +---@param _self I8Vec2 +---@param rhs I8Vec2 +---@return I8Vec2 +function I8Vec2.min(_self,rhs) end + +---@param _self I8Vec2 +---@param rhs I8Vec2 +---@return I8Vec2 +function I8Vec2.rotate(_self,rhs) end + +---@param _self I8Vec2 +---@return I8Vec2 +function I8Vec2.perp(_self) end + +---@param _self I8Vec2 +---@param rhs I8Vec2 +---@return I8Vec2 +function I8Vec2.div(_self,rhs) end + +---@param _self I8Vec2 +---@param rhs I8Vec2 +---@return I8Vec2 +function I8Vec2.saturating_sub(_self,rhs) end + +---@param _self I8Vec2 +---@param rhs I8Vec2 +---@return I8Vec2 +function I8Vec2.rem(_self,rhs) end + +---@param _self I8Vec2 +---@param rhs I8Vec2 +---@return BVec2 +function I8Vec2.cmpge(_self,rhs) end + +---@param _self I8Vec2 +---@return integer +function I8Vec2.min_element(_self) end + +---@param _self I8Vec2 +---@param z integer +---@return I8Vec3 +function I8Vec2.extend(_self,z) end + +---@param _self I8Vec2 +---@return UVec2 +function I8Vec2.as_uvec2(_self) end + +---@param p1 I8Vec2 +---@param p2 integer +---@return I8Vec2 +function I8Vec2.div(p1,p2) end + +---@param _self I8Vec2 +---@return integer +function I8Vec2.length_squared(_self) end + +---@param mask BVec2 +---@param if_true I8Vec2 +---@param if_false I8Vec2 +---@return I8Vec2 +function I8Vec2.select(mask,if_true,if_false) end + +---@param p1 I8Vec2 +---@param p2 I8Vec2 +---@return I8Vec2 +function I8Vec2.mul(p1,p2) end + +---@param _self I8Vec2 +---@param rhs I8Vec2 +---@return I8Vec2 +function I8Vec2.wrapping_sub(_self,rhs) end + +---@param v integer +---@return I8Vec2 +function I8Vec2.splat(v) end + +---@param _self I8Vec2 +---@param rhs I8Vec2 +---@return I8Vec2 +function I8Vec2.max(_self,rhs) end + +---@param _self I8Vec2 +---@param rhs I8Vec2 +---@return BVec2 +function I8Vec2.cmpeq(_self,rhs) end + + + +---@class I8Vec3 : ReflectReference +---@field x ? integer +---@field y ? integer +---@field z ? integer +---@operator mul(I8Vec3): I8Vec3 +---@operator mod(integer): I8Vec3 +---@operator add(I8Vec3): I8Vec3 +---@operator div(I8Vec3): I8Vec3 +---@operator sub(integer): I8Vec3 +---@operator unm: I8Vec3 +---@operator mul(integer): I8Vec3 +---@operator mod(I8Vec3): I8Vec3 +---@operator sub(I8Vec3): I8Vec3 +---@operator div(integer): I8Vec3 +---@operator mod(I8Vec3): I8Vec3 +---@operator add(I8Vec3): I8Vec3 +---@operator add(integer): I8Vec3 +---@operator div(I8Vec3): I8Vec3 +---@operator sub(I8Vec3): I8Vec3 +---@operator mul(I8Vec3): I8Vec3 +I8Vec3 = {} + +---@param p1 I8Vec3 +---@param p2 I8Vec3 +---@return I8Vec3 +function I8Vec3.mul(p1,p2) end + +---@param _self I8Vec3 +---@param rhs U8Vec3 +---@return I8Vec3 +function I8Vec3.wrapping_sub_unsigned(_self,rhs) end + +---@param _self I8Vec3 +---@param rhs I8Vec3 +---@return BVec3 +function I8Vec3.cmpge(_self,rhs) end + +---@param _self I8Vec3 +---@return integer +function I8Vec3.min_element(_self) end + +---@param _self I8Vec3 +---@return Vec3 +function I8Vec3.as_vec3(_self) end + +---@param _self I8Vec3 +---@return Vec3A +function I8Vec3.as_vec3a(_self) end + +---@param _self I8Vec3 +---@return U16Vec3 +function I8Vec3.as_u16vec3(_self) end + +---@param p1 I8Vec3 +---@param p2 integer +---@return I8Vec3 +function I8Vec3.rem(p1,p2) end + +---@param p1 I8Vec3 +---@param p2 I8Vec3 +---@return I8Vec3 +function I8Vec3.add(p1,p2) end + +---@param _self I8Vec3 +---@return integer +function I8Vec3.element_product(_self) end + +---@param _self I8Vec3 +---@param rhs I8Vec3 +---@return BVec3 +function I8Vec3.cmplt(_self,rhs) end + +---@param _self I8Vec3 +---@param rhs I8Vec3 +---@return integer | nil +function I8Vec3.checked_manhattan_distance(_self,rhs) end + +---@param _self I8Vec3 +---@param rhs I8Vec3 +---@return I8Vec3 +function I8Vec3.saturating_div(_self,rhs) end + +---@param _self I8Vec3 +---@param rhs I8Vec3 +---@return I8Vec3 +function I8Vec3.div(_self,rhs) end + +---@param p1 I8Vec3 +---@param p2 integer +---@return I8Vec3 +function I8Vec3.sub(p1,p2) end + +---@param _self I8Vec3 +---@return DVec3 +function I8Vec3.as_dvec3(_self) end + +---@param _self I8Vec3 +---@param rhs I8Vec3 +---@return I8Vec3 +function I8Vec3.min(_self,rhs) end + +---@param a integer[] +---@return I8Vec3 +function I8Vec3.from_array(a) end + +---@param _self I8Vec3 +---@return I8Vec3 +function I8Vec3.clone(_self) end + +---@param _self I8Vec3 +---@param rhs I8Vec3 +---@return I8Vec3 +function I8Vec3.saturating_sub(_self,rhs) end + +---@param mask BVec3 +---@param if_true I8Vec3 +---@param if_false I8Vec3 +---@return I8Vec3 +function I8Vec3.select(mask,if_true,if_false) end + +---@param _self I8Vec3 +---@param rhs I8Vec3 +---@return BVec3 +function I8Vec3.cmple(_self,rhs) end + +---@param _self I8Vec3 +---@return UVec3 +function I8Vec3.as_uvec3(_self) end + +---@param _self I8Vec3 +---@param x integer +---@return I8Vec3 +function I8Vec3.with_x(_self,x) end + +---@param _self I8Vec3 +---@param rhs U8Vec3 +---@return I8Vec3 +function I8Vec3.saturating_sub_unsigned(_self,rhs) end + +---@param _self I8Vec3 +---@return IVec3 +function I8Vec3.as_ivec3(_self) end + +---@param _self I8Vec3 +---@param w integer +---@return I8Vec4 +function I8Vec3.extend(_self,w) end + +---@param _self I8Vec3 +---@param y integer +---@return I8Vec3 +function I8Vec3.with_y(_self,y) end + +---@param _self I8Vec3 +---@return I8Vec3 +function I8Vec3.neg(_self) end + +---@param _self I8Vec3 +---@param rhs I8Vec3 +---@return I8Vec3 +function I8Vec3.wrapping_sub(_self,rhs) end + +---@param p1 I8Vec3 +---@param p2 integer +---@return I8Vec3 +function I8Vec3.mul(p1,p2) end + +---@param _self I8Vec3 +---@return I8Vec3 +function I8Vec3.abs(_self) end + +---@param v integer +---@return I8Vec3 +function I8Vec3.splat(v) end + +---@param _self I8Vec3 +---@return integer[] +function I8Vec3.to_array(_self) end + +---@param _self I8Vec3 +---@param rhs I8Vec3 +---@return I8Vec3 +function I8Vec3.rem(_self,rhs) end + +---@param _self I8Vec3 +---@return U64Vec3 +function I8Vec3.as_u64vec3(_self) end + +---@param _self I8Vec3 +---@return integer +function I8Vec3.is_negative_bitmask(_self) end + +---@param _self I8Vec3 +---@param rhs I8Vec3 +---@return I8Vec3 +function I8Vec3.rem_euclid(_self,rhs) end + +---@param _self I8Vec3 +---@param rhs I8Vec3 +---@return BVec3 +function I8Vec3.cmpeq(_self,rhs) end + +---@param _self I8Vec3 +---@param rhs I8Vec3 +---@return I8Vec3 +function I8Vec3.saturating_add(_self,rhs) end + +---@param p1 I8Vec3 +---@param p2 I8Vec3 +---@return I8Vec3 +function I8Vec3.sub(p1,p2) end + +---@param _self I8Vec3 +---@return I8Vec3 +function I8Vec3.signum(_self) end + +---@param p1 I8Vec3 +---@param p2 integer +---@return I8Vec3 +function I8Vec3.div(p1,p2) end + +---@param _self I8Vec3 +---@param rhs I8Vec3 +---@return I8Vec3 +function I8Vec3.wrapping_add(_self,rhs) end + +---@param _self I8Vec3 +---@param rhs I8Vec3 +---@return integer +function I8Vec3.chebyshev_distance(_self,rhs) end + +---@param _self I8Vec3 +---@param rhs I8Vec3 +---@return I8Vec3 +function I8Vec3.div_euclid(_self,rhs) end + +---@param p1 I8Vec3 +---@param p2 I8Vec3 +---@return I8Vec3 +function I8Vec3.rem(p1,p2) end + +---@param _self I8Vec3 +---@param rhs I8Vec3 +---@return I8Vec3 +function I8Vec3.saturating_mul(_self,rhs) end + +---@param _self I8Vec3 +---@param rhs I8Vec3 +---@return I8Vec3 +function I8Vec3.add(_self,rhs) end + +---@param p1 I8Vec3 +---@param p2 integer +---@return I8Vec3 +function I8Vec3.add(p1,p2) end + +---@param _self I8Vec3 +---@return nil +function I8Vec3.assert_receiver_is_total_eq(_self) end + +---@param _self I8Vec3 +---@param rhs I8Vec3 +---@return BVec3 +function I8Vec3.cmpne(_self,rhs) end + +---@param _self I8Vec3 +---@return integer +function I8Vec3.element_sum(_self) end + +---@param _self I8Vec3 +---@param rhs I8Vec3 +---@return BVec3 +function I8Vec3.cmpgt(_self,rhs) end + +---@param _self I8Vec3 +---@return I8Vec2 +function I8Vec3.truncate(_self) end + +---@param _self I8Vec3 +---@param rhs I8Vec3 +---@return I8Vec3 +function I8Vec3.wrapping_mul(_self,rhs) end + +---@param _self I8Vec3 +---@param rhs I8Vec3 +---@return I8Vec3 +function I8Vec3.cross(_self,rhs) end + +---@param _self I8Vec3 +---@param rhs I8Vec3 +---@return integer +function I8Vec3.dot(_self,rhs) end + +---@param _self I8Vec3 +---@return integer +function I8Vec3.max_element(_self) end + +---@param _self I8Vec3 +---@param z integer +---@return I8Vec3 +function I8Vec3.with_z(_self,z) end + +---@param _self I8Vec3 +---@return integer +function I8Vec3.min_position(_self) end + +---@param _self I8Vec3 +---@return I64Vec3 +function I8Vec3.as_i64vec3(_self) end + +---@param p1 I8Vec3 +---@param p2 I8Vec3 +---@return I8Vec3 +function I8Vec3.div(p1,p2) end + +---@param _self I8Vec3 +---@param rhs U8Vec3 +---@return I8Vec3 +function I8Vec3.wrapping_add_unsigned(_self,rhs) end + +---@param _self I8Vec3 +---@param rhs U8Vec3 +---@return I8Vec3 +function I8Vec3.saturating_add_unsigned(_self,rhs) end + +---@param _self I8Vec3 +---@return I16Vec3 +function I8Vec3.as_i16vec3(_self) end + +---@param _self I8Vec3 +---@return U8Vec3 +function I8Vec3.as_u8vec3(_self) end + +---@param _self I8Vec3 +---@param other I8Vec3 +---@return boolean +function I8Vec3.__eq(_self,other) end + +---@param _self I8Vec3 +---@param other I8Vec3 +---@return boolean +function I8Vec3.eq(_self,other) end + +---@param _self I8Vec3 +---@param rhs I8Vec3 +---@return integer +function I8Vec3.manhattan_distance(_self,rhs) end + +---@param _self I8Vec3 +---@param rhs I8Vec3 +---@return integer +function I8Vec3.distance_squared(_self,rhs) end + +---@param _self I8Vec3 +---@param rhs I8Vec3 +---@return I8Vec3 +function I8Vec3.wrapping_div(_self,rhs) end + +---@param _self I8Vec3 +---@param rhs I8Vec3 +---@return I8Vec3 +function I8Vec3.sub(_self,rhs) end + +---@param _self I8Vec3 +---@param min I8Vec3 +---@param max I8Vec3 +---@return I8Vec3 +function I8Vec3.clamp(_self,min,max) end + +---@param _self I8Vec3 +---@param rhs I8Vec3 +---@return I8Vec3 +function I8Vec3.dot_into_vec(_self,rhs) end + +---@param _self I8Vec3 +---@param rhs I8Vec3 +---@return I8Vec3 +function I8Vec3.mul(_self,rhs) end + +---@param _self I8Vec3 +---@return integer +function I8Vec3.length_squared(_self) end + +---@param x integer +---@param y integer +---@param z integer +---@return I8Vec3 +function I8Vec3.new(x,y,z) end + +---@param _self I8Vec3 +---@param rhs I8Vec3 +---@return I8Vec3 +function I8Vec3.max(_self,rhs) end + +---@param _self I8Vec3 +---@return integer +function I8Vec3.max_position(_self) end + + + +---@class I8Vec4 : ReflectReference +---@field x ? integer +---@field y ? integer +---@field z ? integer +---@field w ? integer +---@operator add(I8Vec4): I8Vec4 +---@operator sub(I8Vec4): I8Vec4 +---@operator div(integer): I8Vec4 +---@operator div(I8Vec4): I8Vec4 +---@operator unm: I8Vec4 +---@operator div(I8Vec4): I8Vec4 +---@operator add(integer): I8Vec4 +---@operator mul(I8Vec4): I8Vec4 +---@operator mod(integer): I8Vec4 +---@operator add(I8Vec4): I8Vec4 +---@operator mod(I8Vec4): I8Vec4 +---@operator sub(integer): I8Vec4 +---@operator mul(I8Vec4): I8Vec4 +---@operator mul(integer): I8Vec4 +---@operator mod(I8Vec4): I8Vec4 +---@operator sub(I8Vec4): I8Vec4 +I8Vec4 = {} + +---@param _self I8Vec4 +---@return U8Vec4 +function I8Vec4.as_u8vec4(_self) end + +---@param _self I8Vec4 +---@param rhs I8Vec4 +---@return I8Vec4 +function I8Vec4.saturating_add(_self,rhs) end + +---@param _self I8Vec4 +---@param rhs I8Vec4 +---@return BVec4 +function I8Vec4.cmpge(_self,rhs) end + +---@param p1 I8Vec4 +---@param p2 I8Vec4 +---@return I8Vec4 +function I8Vec4.add(p1,p2) end + +---@param _self I8Vec4 +---@param z integer +---@return I8Vec4 +function I8Vec4.with_z(_self,z) end + +---@param _self I8Vec4 +---@return integer +function I8Vec4.element_sum(_self) end + +---@param _self I8Vec4 +---@param rhs I8Vec4 +---@return I8Vec4 +function I8Vec4.wrapping_mul(_self,rhs) end + +---@param _self I8Vec4 +---@param rhs I8Vec4 +---@return I8Vec4 +function I8Vec4.sub(_self,rhs) end + +---@param p1 I8Vec4 +---@param p2 integer +---@return I8Vec4 +function I8Vec4.div(p1,p2) end + +---@param _self I8Vec4 +---@param rhs I8Vec4 +---@return integer +function I8Vec4.distance_squared(_self,rhs) end + +---@param _self I8Vec4 +---@param rhs I8Vec4 +---@return I8Vec4 +function I8Vec4.wrapping_div(_self,rhs) end + +---@param p1 I8Vec4 +---@param p2 I8Vec4 +---@return I8Vec4 +function I8Vec4.div(p1,p2) end + +---@param _self I8Vec4 +---@param rhs I8Vec4 +---@return integer +function I8Vec4.chebyshev_distance(_self,rhs) end + +---@param _self I8Vec4 +---@return I8Vec4 +function I8Vec4.neg(_self) end + +---@param _self I8Vec4 +---@return integer +function I8Vec4.min_position(_self) end + +---@param _self I8Vec4 +---@return I16Vec4 +function I8Vec4.as_i16vec4(_self) end + +---@param x integer +---@param y integer +---@param z integer +---@param w integer +---@return I8Vec4 +function I8Vec4.new(x,y,z,w) end + +---@param _self I8Vec4 +---@param rhs I8Vec4 +---@return I8Vec4 +function I8Vec4.div(_self,rhs) end + +---@param _self I8Vec4 +---@param rhs U8Vec4 +---@return I8Vec4 +function I8Vec4.saturating_sub_unsigned(_self,rhs) end + +---@param _self I8Vec4 +---@param rhs I8Vec4 +---@return I8Vec4 +function I8Vec4.min(_self,rhs) end + +---@param _self I8Vec4 +---@param rhs U8Vec4 +---@return I8Vec4 +function I8Vec4.wrapping_sub_unsigned(_self,rhs) end + +---@param _self I8Vec4 +---@return DVec4 +function I8Vec4.as_dvec4(_self) end + +---@param _self I8Vec4 +---@return I8Vec4 +function I8Vec4.signum(_self) end + +---@param _self I8Vec4 +---@param rhs I8Vec4 +---@return I8Vec4 +function I8Vec4.saturating_sub(_self,rhs) end + +---@param _self I8Vec4 +---@return U16Vec4 +function I8Vec4.as_u16vec4(_self) end + +---@param _self I8Vec4 +---@param x integer +---@return I8Vec4 +function I8Vec4.with_x(_self,x) end + +---@param _self I8Vec4 +---@param rhs I8Vec4 +---@return I8Vec4 +function I8Vec4.wrapping_add(_self,rhs) end + +---@param _self I8Vec4 +---@param rhs I8Vec4 +---@return BVec4 +function I8Vec4.cmplt(_self,rhs) end + +---@param _self I8Vec4 +---@param rhs I8Vec4 +---@return BVec4 +function I8Vec4.cmpeq(_self,rhs) end + +---@param _self I8Vec4 +---@param rhs I8Vec4 +---@return BVec4 +function I8Vec4.cmpne(_self,rhs) end + +---@param _self I8Vec4 +---@param rhs I8Vec4 +---@return integer | nil +function I8Vec4.checked_manhattan_distance(_self,rhs) end + +---@param _self I8Vec4 +---@param y integer +---@return I8Vec4 +function I8Vec4.with_y(_self,y) end + +---@param p1 I8Vec4 +---@param p2 integer +---@return I8Vec4 +function I8Vec4.add(p1,p2) end + +---@param p1 I8Vec4 +---@param p2 I8Vec4 +---@return I8Vec4 +function I8Vec4.mul(p1,p2) end + +---@param _self I8Vec4 +---@return integer +function I8Vec4.element_product(_self) end + +---@param _self I8Vec4 +---@return IVec4 +function I8Vec4.as_ivec4(_self) end + +---@param _self I8Vec4 +---@return Vec4 +function I8Vec4.as_vec4(_self) end + +---@param _self I8Vec4 +---@param other I8Vec4 +---@return boolean +function I8Vec4.__eq(_self,other) end + +---@param _self I8Vec4 +---@param other I8Vec4 +---@return boolean +function I8Vec4.eq(_self,other) end + +---@param p1 I8Vec4 +---@param p2 integer +---@return I8Vec4 +function I8Vec4.rem(p1,p2) end + +---@param _self I8Vec4 +---@param min I8Vec4 +---@param max I8Vec4 +---@return I8Vec4 +function I8Vec4.clamp(_self,min,max) end + +---@param _self I8Vec4 +---@return integer +function I8Vec4.length_squared(_self) end + +---@param _self I8Vec4 +---@return integer +function I8Vec4.max_position(_self) end + +---@param a integer[] +---@return I8Vec4 +function I8Vec4.from_array(a) end + +---@param _self I8Vec4 +---@param w integer +---@return I8Vec4 +function I8Vec4.with_w(_self,w) end + +---@param _self I8Vec4 +---@return I64Vec4 +function I8Vec4.as_i64vec4(_self) end + +---@param _self I8Vec4 +---@param rhs I8Vec4 +---@return I8Vec4 +function I8Vec4.add(_self,rhs) end + +---@param _self I8Vec4 +---@return integer[] +function I8Vec4.to_array(_self) end + +---@param _self I8Vec4 +---@param rhs I8Vec4 +---@return I8Vec4 +function I8Vec4.rem(_self,rhs) end + +---@param _self I8Vec4 +---@param rhs I8Vec4 +---@return I8Vec4 +function I8Vec4.wrapping_sub(_self,rhs) end + +---@param _self I8Vec4 +---@param rhs I8Vec4 +---@return I8Vec4 +function I8Vec4.max(_self,rhs) end + +---@param p1 I8Vec4 +---@param p2 integer +---@return I8Vec4 +function I8Vec4.sub(p1,p2) end + +---@param _self I8Vec4 +---@return UVec4 +function I8Vec4.as_uvec4(_self) end + +---@param _self I8Vec4 +---@param rhs U8Vec4 +---@return I8Vec4 +function I8Vec4.wrapping_add_unsigned(_self,rhs) end + +---@param _self I8Vec4 +---@param rhs U8Vec4 +---@return I8Vec4 +function I8Vec4.saturating_add_unsigned(_self,rhs) end + +---@param _self I8Vec4 +---@param rhs I8Vec4 +---@return BVec4 +function I8Vec4.cmpgt(_self,rhs) end + +---@param _self I8Vec4 +---@param rhs I8Vec4 +---@return I8Vec4 +function I8Vec4.div_euclid(_self,rhs) end + +---@param _self I8Vec4 +---@return I8Vec4 +function I8Vec4.clone(_self) end + +---@param _self I8Vec4 +---@param rhs I8Vec4 +---@return BVec4 +function I8Vec4.cmple(_self,rhs) end + +---@param _self I8Vec4 +---@return U64Vec4 +function I8Vec4.as_u64vec4(_self) end + +---@param _self I8Vec4 +---@param rhs I8Vec4 +---@return integer +function I8Vec4.dot(_self,rhs) end + +---@param _self I8Vec4 +---@param rhs I8Vec4 +---@return I8Vec4 +function I8Vec4.mul(_self,rhs) end + +---@param _self I8Vec4 +---@return nil +function I8Vec4.assert_receiver_is_total_eq(_self) end + +---@param _self I8Vec4 +---@param rhs I8Vec4 +---@return I8Vec4 +function I8Vec4.dot_into_vec(_self,rhs) end + +---@param _self I8Vec4 +---@return I8Vec3 +function I8Vec4.truncate(_self) end + +---@param _self I8Vec4 +---@return integer +function I8Vec4.min_element(_self) end + +---@param v integer +---@return I8Vec4 +function I8Vec4.splat(v) end + +---@param mask BVec4 +---@param if_true I8Vec4 +---@param if_false I8Vec4 +---@return I8Vec4 +function I8Vec4.select(mask,if_true,if_false) end + +---@param p1 I8Vec4 +---@param p2 integer +---@return I8Vec4 +function I8Vec4.mul(p1,p2) end + +---@param _self I8Vec4 +---@return integer +function I8Vec4.is_negative_bitmask(_self) end + +---@param _self I8Vec4 +---@param rhs I8Vec4 +---@return I8Vec4 +function I8Vec4.saturating_div(_self,rhs) end + +---@param _self I8Vec4 +---@param rhs I8Vec4 +---@return I8Vec4 +function I8Vec4.rem_euclid(_self,rhs) end + +---@param _self I8Vec4 +---@param rhs I8Vec4 +---@return I8Vec4 +function I8Vec4.saturating_mul(_self,rhs) end + +---@param p1 I8Vec4 +---@param p2 I8Vec4 +---@return I8Vec4 +function I8Vec4.rem(p1,p2) end + +---@param _self I8Vec4 +---@return integer +function I8Vec4.max_element(_self) end + +---@param p1 I8Vec4 +---@param p2 I8Vec4 +---@return I8Vec4 +function I8Vec4.sub(p1,p2) end + +---@param _self I8Vec4 +---@return I8Vec4 +function I8Vec4.abs(_self) end + +---@param _self I8Vec4 +---@param rhs I8Vec4 +---@return integer +function I8Vec4.manhattan_distance(_self,rhs) end + + + +---@class IVec2 : ReflectReference +---@field x ? integer +---@field y ? integer +---@operator mul(IVec2): IVec2 +---@operator sub(IVec2): IVec2 +---@operator add(integer): IVec2 +---@operator div(IVec2): IVec2 +---@operator add(IVec2): IVec2 +---@operator add(IVec2): IVec2 +---@operator mod(integer): IVec2 +---@operator mod(IVec2): IVec2 +---@operator sub(integer): IVec2 +---@operator sub(IVec2): IVec2 +---@operator mul(integer): IVec2 +---@operator div(integer): IVec2 +---@operator unm: IVec2 +---@operator mul(IVec2): IVec2 +---@operator mod(IVec2): IVec2 +---@operator div(IVec2): IVec2 +IVec2 = {} + +---@param _self IVec2 +---@param rhs IVec2 +---@return IVec2 +function IVec2.mul(_self,rhs) end + +---@param _self IVec2 +---@param rhs UVec2 +---@return IVec2 +function IVec2.wrapping_sub_unsigned(_self,rhs) end + +---@param p1 IVec2 +---@param p2 IVec2 +---@return IVec2 +function IVec2.sub(p1,p2) end + +---@param _self IVec2 +---@param rhs IVec2 +---@return BVec2 +function IVec2.cmpeq(_self,rhs) end + +---@param _self IVec2 +---@param rhs IVec2 +---@return BVec2 +function IVec2.cmplt(_self,rhs) end + +---@param _self IVec2 +---@return I8Vec2 +function IVec2.as_i8vec2(_self) end + +---@param _self IVec2 +---@param rhs IVec2 +---@return integer +function IVec2.chebyshev_distance(_self,rhs) end + +---@param _self IVec2 +---@return U64Vec2 +function IVec2.as_u64vec2(_self) end + +---@param _self IVec2 +---@param rhs UVec2 +---@return IVec2 +function IVec2.wrapping_add_unsigned(_self,rhs) end + +---@param p1 IVec2 +---@param p2 integer +---@return IVec2 +function IVec2.add(p1,p2) end + +---@param _self IVec2 +---@return integer +function IVec2.min_element(_self) end + +---@param p1 IVec2 +---@param p2 IVec2 +---@return IVec2 +function IVec2.div(p1,p2) end + +---@param _self IVec2 +---@return IVec2 +function IVec2.perp(_self) end + +---@param _self IVec2 +---@param rhs IVec2 +---@return integer +function IVec2.manhattan_distance(_self,rhs) end + +---@param _self IVec2 +---@param rhs IVec2 +---@return IVec2 +function IVec2.min(_self,rhs) end + +---@param _self IVec2 +---@param rhs IVec2 +---@return IVec2 +function IVec2.wrapping_div(_self,rhs) end + +---@param _self IVec2 +---@return IVec2 +function IVec2.signum(_self) end + +---@param _self IVec2 +---@param rhs IVec2 +---@return integer +function IVec2.perp_dot(_self,rhs) end + +---@param p1 IVec2 +---@param p2 IVec2 +---@return IVec2 +function IVec2.add(p1,p2) end + +---@param _self IVec2 +---@param rhs UVec2 +---@return IVec2 +function IVec2.saturating_add_unsigned(_self,rhs) end + +---@param _self IVec2 +---@param rhs IVec2 +---@return IVec2 +function IVec2.add(_self,rhs) end + +---@param _self IVec2 +---@return integer +function IVec2.is_negative_bitmask(_self) end + +---@param _self IVec2 +---@return U8Vec2 +function IVec2.as_u8vec2(_self) end + +---@param a integer[] +---@return IVec2 +function IVec2.from_array(a) end + +---@param _self IVec2 +---@return DVec2 +function IVec2.as_dvec2(_self) end + +---@param _self IVec2 +---@return Vec2 +function IVec2.as_vec2(_self) end + +---@param _self IVec2 +---@return UVec2 +function IVec2.as_uvec2(_self) end + +---@param p1 IVec2 +---@param p2 integer +---@return IVec2 +function IVec2.rem(p1,p2) end + +---@param p1 IVec2 +---@param p2 IVec2 +---@return IVec2 +function IVec2.rem(p1,p2) end + +---@param p1 IVec2 +---@param p2 integer +---@return IVec2 +function IVec2.sub(p1,p2) end + +---@param _self IVec2 +---@param rhs IVec2 +---@return IVec2 +function IVec2.wrapping_sub(_self,rhs) end + +---@param _self IVec2 +---@return integer +function IVec2.element_sum(_self) end + +---@param _self IVec2 +---@param x integer +---@return IVec2 +function IVec2.with_x(_self,x) end + +---@param _self IVec2 +---@return integer +function IVec2.length_squared(_self) end + +---@param _self IVec2 +---@param rhs IVec2 +---@return IVec2 +function IVec2.sub(_self,rhs) end + +---@param _self IVec2 +---@param rhs IVec2 +---@return BVec2 +function IVec2.cmple(_self,rhs) end + +---@param _self IVec2 +---@param rhs IVec2 +---@return integer | nil +function IVec2.checked_manhattan_distance(_self,rhs) end + +---@param _self IVec2 +---@return integer[] +function IVec2.to_array(_self) end + +---@param _self IVec2 +---@return IVec2 +function IVec2.abs(_self) end + +---@param _self IVec2 +---@param y integer +---@return IVec2 +function IVec2.with_y(_self,y) end + +---@param _self IVec2 +---@param rhs IVec2 +---@return IVec2 +function IVec2.wrapping_add(_self,rhs) end + +---@param _self IVec2 +---@return integer +function IVec2.max_element(_self) end + +---@param _self IVec2 +---@param rhs IVec2 +---@return IVec2 +function IVec2.saturating_div(_self,rhs) end + +---@param p1 IVec2 +---@param p2 integer +---@return IVec2 +function IVec2.mul(p1,p2) end + +---@param _self IVec2 +---@param rhs IVec2 +---@return integer +function IVec2.dot(_self,rhs) end + +---@param p1 IVec2 +---@param p2 integer +---@return IVec2 +function IVec2.div(p1,p2) end + +---@param _self IVec2 +---@param rhs IVec2 +---@return IVec2 +function IVec2.dot_into_vec(_self,rhs) end + +---@param _self IVec2 +---@return integer +function IVec2.max_position(_self) end + +---@param _self IVec2 +---@param rhs IVec2 +---@return IVec2 +function IVec2.max(_self,rhs) end + +---@param _self IVec2 +---@param min IVec2 +---@param max IVec2 +---@return IVec2 +function IVec2.clamp(_self,min,max) end + +---@param _self IVec2 +---@param rhs IVec2 +---@return IVec2 +function IVec2.rem_euclid(_self,rhs) end + +---@param _self IVec2 +---@return IVec2 +function IVec2.clone(_self) end + +---@param _self IVec2 +---@return IVec2 +function IVec2.neg(_self) end + +---@param _self IVec2 +---@param rhs IVec2 +---@return BVec2 +function IVec2.cmpge(_self,rhs) end + +---@param _self IVec2 +---@param rhs IVec2 +---@return IVec2 +function IVec2.rotate(_self,rhs) end + +---@param _self IVec2 +---@param rhs IVec2 +---@return IVec2 +function IVec2.saturating_mul(_self,rhs) end + +---@param p1 IVec2 +---@param p2 IVec2 +---@return IVec2 +function IVec2.mul(p1,p2) end + +---@param _self IVec2 +---@param rhs IVec2 +---@return IVec2 +function IVec2.div_euclid(_self,rhs) end + +---@param _self IVec2 +---@param rhs IVec2 +---@return IVec2 +function IVec2.saturating_add(_self,rhs) end + +---@param _self IVec2 +---@return nil +function IVec2.assert_receiver_is_total_eq(_self) end + +---@param _self IVec2 +---@return U16Vec2 +function IVec2.as_u16vec2(_self) end + +---@param _self IVec2 +---@param rhs UVec2 +---@return IVec2 +function IVec2.saturating_sub_unsigned(_self,rhs) end + +---@param _self IVec2 +---@param rhs IVec2 +---@return BVec2 +function IVec2.cmpgt(_self,rhs) end + +---@param _self IVec2 +---@return I64Vec2 +function IVec2.as_i64vec2(_self) end + +---@param _self IVec2 +---@param other IVec2 +---@return boolean +function IVec2.__eq(_self,other) end + +---@param _self IVec2 +---@param other IVec2 +---@return boolean +function IVec2.eq(_self,other) end + +---@param _self IVec2 +---@param rhs IVec2 +---@return IVec2 +function IVec2.rem(_self,rhs) end + +---@param _self IVec2 +---@return integer +function IVec2.element_product(_self) end + +---@param v integer +---@return IVec2 +function IVec2.splat(v) end + +---@param _self IVec2 +---@param rhs IVec2 +---@return BVec2 +function IVec2.cmpne(_self,rhs) end + +---@param _self IVec2 +---@param z integer +---@return IVec3 +function IVec2.extend(_self,z) end + +---@param _self IVec2 +---@return I16Vec2 +function IVec2.as_i16vec2(_self) end + +---@param _self IVec2 +---@return integer +function IVec2.min_position(_self) end + +---@param _self IVec2 +---@param rhs IVec2 +---@return integer +function IVec2.distance_squared(_self,rhs) end + +---@param _self IVec2 +---@param rhs IVec2 +---@return IVec2 +function IVec2.saturating_sub(_self,rhs) end + +---@param mask BVec2 +---@param if_true IVec2 +---@param if_false IVec2 +---@return IVec2 +function IVec2.select(mask,if_true,if_false) end + +---@param _self IVec2 +---@param rhs IVec2 +---@return IVec2 +function IVec2.div(_self,rhs) end + +---@param x integer +---@param y integer +---@return IVec2 +function IVec2.new(x,y) end + +---@param _self IVec2 +---@param rhs IVec2 +---@return IVec2 +function IVec2.wrapping_mul(_self,rhs) end + + + +---@class IVec3 : ReflectReference +---@field x ? integer +---@field y ? integer +---@field z ? integer +---@operator div(integer): IVec3 +---@operator add(IVec3): IVec3 +---@operator div(IVec3): IVec3 +---@operator unm: IVec3 +---@operator add(IVec3): IVec3 +---@operator sub(IVec3): IVec3 +---@operator mul(IVec3): IVec3 +---@operator sub(IVec3): IVec3 +---@operator mod(IVec3): IVec3 +---@operator add(integer): IVec3 +---@operator mul(integer): IVec3 +---@operator mod(IVec3): IVec3 +---@operator mod(integer): IVec3 +---@operator sub(integer): IVec3 +---@operator mul(IVec3): IVec3 +---@operator div(IVec3): IVec3 +IVec3 = {} + +---@param a integer[] +---@return IVec3 +function IVec3.from_array(a) end + +---@param _self IVec3 +---@return integer[] +function IVec3.to_array(_self) end + +---@param _self IVec3 +---@return IVec2 +function IVec3.truncate(_self) end + +---@param p1 IVec3 +---@param p2 integer +---@return IVec3 +function IVec3.div(p1,p2) end + +---@param _self IVec3 +---@param rhs IVec3 +---@return integer +function IVec3.distance_squared(_self,rhs) end + +---@param _self IVec3 +---@return I64Vec3 +function IVec3.as_i64vec3(_self) end + +---@param _self IVec3 +---@param rhs IVec3 +---@return IVec3 +function IVec3.add(_self,rhs) end + +---@param p1 IVec3 +---@param p2 IVec3 +---@return IVec3 +function IVec3.div(p1,p2) end + +---@param _self IVec3 +---@param rhs IVec3 +---@return IVec3 +function IVec3.saturating_div(_self,rhs) end + +---@param _self IVec3 +---@return integer +function IVec3.min_position(_self) end + +---@param _self IVec3 +---@param rhs IVec3 +---@return IVec3 +function IVec3.saturating_mul(_self,rhs) end + +---@param _self IVec3 +---@return IVec3 +function IVec3.neg(_self) end + +---@param _self IVec3 +---@return integer +function IVec3.element_sum(_self) end + +---@param p1 IVec3 +---@param p2 IVec3 +---@return IVec3 +function IVec3.add(p1,p2) end + +---@param _self IVec3 +---@param other IVec3 +---@return boolean +function IVec3.__eq(_self,other) end + +---@param _self IVec3 +---@param other IVec3 +---@return boolean +function IVec3.eq(_self,other) end + +---@param _self IVec3 +---@param rhs IVec3 +---@return integer +function IVec3.dot(_self,rhs) end + +---@param _self IVec3 +---@return integer +function IVec3.length_squared(_self) end + +---@param _self IVec3 +---@return Vec3A +function IVec3.as_vec3a(_self) end + +---@param _self IVec3 +---@param rhs IVec3 +---@return IVec3 +function IVec3.sub(_self,rhs) end + +---@param _self IVec3 +---@param rhs IVec3 +---@return IVec3 +function IVec3.saturating_sub(_self,rhs) end + +---@param _self IVec3 +---@param rhs IVec3 +---@return IVec3 +function IVec3.mul(_self,rhs) end + +---@param p1 IVec3 +---@param p2 IVec3 +---@return IVec3 +function IVec3.sub(p1,p2) end + +---@param mask BVec3 +---@param if_true IVec3 +---@param if_false IVec3 +---@return IVec3 +function IVec3.select(mask,if_true,if_false) end + +---@param p1 IVec3 +---@param p2 IVec3 +---@return IVec3 +function IVec3.rem(p1,p2) end + +---@param p1 IVec3 +---@param p2 integer +---@return IVec3 +function IVec3.add(p1,p2) end + +---@param _self IVec3 +---@param rhs IVec3 +---@return BVec3 +function IVec3.cmpge(_self,rhs) end + +---@param _self IVec3 +---@param rhs IVec3 +---@return IVec3 +function IVec3.saturating_add(_self,rhs) end + +---@param _self IVec3 +---@return Vec3 +function IVec3.as_vec3(_self) end + +---@param _self IVec3 +---@return integer +function IVec3.element_product(_self) end + +---@param _self IVec3 +---@return integer +function IVec3.max_position(_self) end + +---@param _self IVec3 +---@param rhs IVec3 +---@return IVec3 +function IVec3.wrapping_div(_self,rhs) end + +---@param _self IVec3 +---@param rhs UVec3 +---@return IVec3 +function IVec3.saturating_sub_unsigned(_self,rhs) end + +---@param _self IVec3 +---@param rhs IVec3 +---@return BVec3 +function IVec3.cmpeq(_self,rhs) end + +---@param _self IVec3 +---@return nil +function IVec3.assert_receiver_is_total_eq(_self) end + +---@param p1 IVec3 +---@param p2 integer +---@return IVec3 +function IVec3.mul(p1,p2) end + +---@param v integer +---@return IVec3 +function IVec3.splat(v) end + +---@param _self IVec3 +---@param rhs IVec3 +---@return IVec3 +function IVec3.rem(_self,rhs) end + +---@param _self IVec3 +---@return DVec3 +function IVec3.as_dvec3(_self) end + +---@param _self IVec3 +---@return integer +function IVec3.max_element(_self) end + +---@param _self IVec3 +---@param rhs UVec3 +---@return IVec3 +function IVec3.wrapping_sub_unsigned(_self,rhs) end + +---@param _self IVec3 +---@return IVec3 +function IVec3.abs(_self) end + +---@param _self IVec3 +---@return UVec3 +function IVec3.as_uvec3(_self) end + +---@param _self IVec3 +---@param rhs IVec3 +---@return integer +function IVec3.manhattan_distance(_self,rhs) end + +---@param _self IVec3 +---@return U16Vec3 +function IVec3.as_u16vec3(_self) end + +---@param _self IVec3 +---@param x integer +---@return IVec3 +function IVec3.with_x(_self,x) end + +---@param _self IVec3 +---@param z integer +---@return IVec3 +function IVec3.with_z(_self,z) end + +---@param _self IVec3 +---@param rhs UVec3 +---@return IVec3 +function IVec3.saturating_add_unsigned(_self,rhs) end + +---@param _self IVec3 +---@param rhs IVec3 +---@return IVec3 +function IVec3.min(_self,rhs) end + +---@param _self IVec3 +---@param rhs IVec3 +---@return BVec3 +function IVec3.cmple(_self,rhs) end + +---@param _self IVec3 +---@return U8Vec3 +function IVec3.as_u8vec3(_self) end + +---@param _self IVec3 +---@return U64Vec3 +function IVec3.as_u64vec3(_self) end + +---@param _self IVec3 +---@param rhs IVec3 +---@return BVec3 +function IVec3.cmpgt(_self,rhs) end + +---@param _self IVec3 +---@return I16Vec3 +function IVec3.as_i16vec3(_self) end + +---@param _self IVec3 +---@param rhs IVec3 +---@return BVec3 +function IVec3.cmplt(_self,rhs) end + +---@param _self IVec3 +---@param rhs IVec3 +---@return integer | nil +function IVec3.checked_manhattan_distance(_self,rhs) end + +---@param _self IVec3 +---@param min IVec3 +---@param max IVec3 +---@return IVec3 +function IVec3.clamp(_self,min,max) end + +---@param p1 IVec3 +---@param p2 integer +---@return IVec3 +function IVec3.rem(p1,p2) end + +---@param _self IVec3 +---@param rhs IVec3 +---@return IVec3 +function IVec3.dot_into_vec(_self,rhs) end + +---@param _self IVec3 +---@param rhs IVec3 +---@return IVec3 +function IVec3.max(_self,rhs) end + +---@param _self IVec3 +---@param rhs IVec3 +---@return IVec3 +function IVec3.wrapping_sub(_self,rhs) end + +---@param _self IVec3 +---@return IVec3 +function IVec3.clone(_self) end + +---@param _self IVec3 +---@param rhs IVec3 +---@return BVec3 +function IVec3.cmpne(_self,rhs) end + +---@param _self IVec3 +---@param rhs IVec3 +---@return integer +function IVec3.chebyshev_distance(_self,rhs) end + +---@param x integer +---@param y integer +---@param z integer +---@return IVec3 +function IVec3.new(x,y,z) end + +---@param _self IVec3 +---@param rhs UVec3 +---@return IVec3 +function IVec3.wrapping_add_unsigned(_self,rhs) end + +---@param _self IVec3 +---@return integer +function IVec3.min_element(_self) end + +---@param _self IVec3 +---@return integer +function IVec3.is_negative_bitmask(_self) end + +---@param _self IVec3 +---@return IVec3 +function IVec3.signum(_self) end + +---@param _self IVec3 +---@param rhs IVec3 +---@return IVec3 +function IVec3.div_euclid(_self,rhs) end + +---@param p1 IVec3 +---@param p2 integer +---@return IVec3 +function IVec3.sub(p1,p2) end + +---@param _self IVec3 +---@param rhs IVec3 +---@return IVec3 +function IVec3.rem_euclid(_self,rhs) end + +---@param p1 IVec3 +---@param p2 IVec3 +---@return IVec3 +function IVec3.mul(p1,p2) end + +---@param _self IVec3 +---@param w integer +---@return IVec4 +function IVec3.extend(_self,w) end + +---@param _self IVec3 +---@return I8Vec3 +function IVec3.as_i8vec3(_self) end + +---@param _self IVec3 +---@param rhs IVec3 +---@return IVec3 +function IVec3.wrapping_add(_self,rhs) end + +---@param _self IVec3 +---@param rhs IVec3 +---@return IVec3 +function IVec3.wrapping_mul(_self,rhs) end + +---@param _self IVec3 +---@param rhs IVec3 +---@return IVec3 +function IVec3.cross(_self,rhs) end + +---@param _self IVec3 +---@param rhs IVec3 +---@return IVec3 +function IVec3.div(_self,rhs) end + +---@param _self IVec3 +---@param y integer +---@return IVec3 +function IVec3.with_y(_self,y) end + + + +---@class IVec4 : ReflectReference +---@field x ? integer +---@field y ? integer +---@field z ? integer +---@field w ? integer +---@operator mod(integer): IVec4 +---@operator add(integer): IVec4 +---@operator div(integer): IVec4 +---@operator sub(IVec4): IVec4 +---@operator div(IVec4): IVec4 +---@operator sub(integer): IVec4 +---@operator mul(IVec4): IVec4 +---@operator mod(IVec4): IVec4 +---@operator div(IVec4): IVec4 +---@operator sub(IVec4): IVec4 +---@operator add(IVec4): IVec4 +---@operator mul(integer): IVec4 +---@operator add(IVec4): IVec4 +---@operator mod(IVec4): IVec4 +---@operator mul(IVec4): IVec4 +---@operator unm: IVec4 +IVec4 = {} + +---@param _self IVec4 +---@param rhs IVec4 +---@return IVec4 +function IVec4.div_euclid(_self,rhs) end + +---@param _self IVec4 +---@param rhs IVec4 +---@return IVec4 +function IVec4.wrapping_div(_self,rhs) end + +---@param p1 IVec4 +---@param p2 integer +---@return IVec4 +function IVec4.rem(p1,p2) end + +---@param _self IVec4 +---@return integer +function IVec4.max_element(_self) end + +---@param _self IVec4 +---@return I64Vec4 +function IVec4.as_i64vec4(_self) end + +---@param p1 IVec4 +---@param p2 integer +---@return IVec4 +function IVec4.add(p1,p2) end + +---@param _self IVec4 +---@param rhs IVec4 +---@return IVec4 +function IVec4.saturating_add(_self,rhs) end + +---@param _self IVec4 +---@param rhs IVec4 +---@return integer | nil +function IVec4.checked_manhattan_distance(_self,rhs) end + +---@param p1 IVec4 +---@param p2 integer +---@return IVec4 +function IVec4.div(p1,p2) end + +---@param _self IVec4 +---@param rhs IVec4 +---@return IVec4 +function IVec4.saturating_sub(_self,rhs) end + +---@param _self IVec4 +---@return integer[] +function IVec4.to_array(_self) end + +---@param _self IVec4 +---@param rhs IVec4 +---@return IVec4 +function IVec4.sub(_self,rhs) end + +---@param _self IVec4 +---@param rhs IVec4 +---@return integer +function IVec4.manhattan_distance(_self,rhs) end + +---@param _self IVec4 +---@param rhs IVec4 +---@return BVec4 +function IVec4.cmpge(_self,rhs) end + +---@param _self IVec4 +---@return integer +function IVec4.element_sum(_self) end + +---@param _self IVec4 +---@param w integer +---@return IVec4 +function IVec4.with_w(_self,w) end + +---@param _self IVec4 +---@param rhs UVec4 +---@return IVec4 +function IVec4.wrapping_add_unsigned(_self,rhs) end + +---@param _self IVec4 +---@param rhs IVec4 +---@return IVec4 +function IVec4.saturating_div(_self,rhs) end + +---@param mask BVec4 +---@param if_true IVec4 +---@param if_false IVec4 +---@return IVec4 +function IVec4.select(mask,if_true,if_false) end + +---@param _self IVec4 +---@return U64Vec4 +function IVec4.as_u64vec4(_self) end + +---@param p1 IVec4 +---@param p2 IVec4 +---@return IVec4 +function IVec4.div(p1,p2) end + +---@param _self IVec4 +---@return Vec4 +function IVec4.as_vec4(_self) end + +---@param _self IVec4 +---@return IVec4 +function IVec4.abs(_self) end + +---@param _self IVec4 +---@param rhs UVec4 +---@return IVec4 +function IVec4.saturating_add_unsigned(_self,rhs) end + +---@param _self IVec4 +---@param rhs IVec4 +---@return BVec4 +function IVec4.cmple(_self,rhs) end + +---@param _self IVec4 +---@param rhs IVec4 +---@return IVec4 +function IVec4.min(_self,rhs) end + +---@param p1 IVec4 +---@param p2 integer +---@return IVec4 +function IVec4.sub(p1,p2) end + +---@param _self IVec4 +---@return U16Vec4 +function IVec4.as_u16vec4(_self) end + +---@param _self IVec4 +---@return I8Vec4 +function IVec4.as_i8vec4(_self) end + +---@param _self IVec4 +---@param rhs IVec4 +---@return IVec4 +function IVec4.dot_into_vec(_self,rhs) end + +---@param _self IVec4 +---@param rhs IVec4 +---@return integer +function IVec4.chebyshev_distance(_self,rhs) end + +---@param _self IVec4 +---@return integer +function IVec4.min_element(_self) end + +---@param _self IVec4 +---@param rhs IVec4 +---@return IVec4 +function IVec4.mul(_self,rhs) end + +---@param p1 IVec4 +---@param p2 IVec4 +---@return IVec4 +function IVec4.rem(p1,p2) end + +---@param _self IVec4 +---@return UVec4 +function IVec4.as_uvec4(_self) end + +---@param _self IVec4 +---@param rhs IVec4 +---@return integer +function IVec4.distance_squared(_self,rhs) end + +---@param _self IVec4 +---@param rhs IVec4 +---@return BVec4 +function IVec4.cmpgt(_self,rhs) end + +---@param v integer +---@return IVec4 +function IVec4.splat(v) end + +---@param _self IVec4 +---@param rhs IVec4 +---@return IVec4 +function IVec4.div(_self,rhs) end + +---@param _self IVec4 +---@return nil +function IVec4.assert_receiver_is_total_eq(_self) end + +---@param _self IVec4 +---@return integer +function IVec4.is_negative_bitmask(_self) end + +---@param _self IVec4 +---@return integer +function IVec4.element_product(_self) end + +---@param _self IVec4 +---@param rhs UVec4 +---@return IVec4 +function IVec4.saturating_sub_unsigned(_self,rhs) end + +---@param _self IVec4 +---@param rhs IVec4 +---@return BVec4 +function IVec4.cmplt(_self,rhs) end + +---@param _self IVec4 +---@param rhs IVec4 +---@return IVec4 +function IVec4.wrapping_mul(_self,rhs) end + +---@param p1 IVec4 +---@param p2 IVec4 +---@return IVec4 +function IVec4.sub(p1,p2) end + +---@param _self IVec4 +---@param x integer +---@return IVec4 +function IVec4.with_x(_self,x) end + +---@param _self IVec4 +---@return I16Vec4 +function IVec4.as_i16vec4(_self) end + +---@param _self IVec4 +---@param min IVec4 +---@param max IVec4 +---@return IVec4 +function IVec4.clamp(_self,min,max) end + +---@param _self IVec4 +---@return integer +function IVec4.max_position(_self) end + +---@param _self IVec4 +---@param rhs IVec4 +---@return IVec4 +function IVec4.wrapping_sub(_self,rhs) end + +---@param _self IVec4 +---@param rhs UVec4 +---@return IVec4 +function IVec4.wrapping_sub_unsigned(_self,rhs) end + +---@param _self IVec4 +---@param y integer +---@return IVec4 +function IVec4.with_y(_self,y) end + +---@param _self IVec4 +---@return DVec4 +function IVec4.as_dvec4(_self) end + +---@param _self IVec4 +---@param rhs IVec4 +---@return IVec4 +function IVec4.max(_self,rhs) end + +---@param p1 IVec4 +---@param p2 IVec4 +---@return IVec4 +function IVec4.add(p1,p2) end + +---@param _self IVec4 +---@return IVec4 +function IVec4.clone(_self) end + +---@param _self IVec4 +---@param other IVec4 +---@return boolean +function IVec4.__eq(_self,other) end + +---@param _self IVec4 +---@param other IVec4 +---@return boolean +function IVec4.eq(_self,other) end + +---@param x integer +---@param y integer +---@param z integer +---@param w integer +---@return IVec4 +function IVec4.new(x,y,z,w) end + +---@param p1 IVec4 +---@param p2 integer +---@return IVec4 +function IVec4.mul(p1,p2) end + +---@param _self IVec4 +---@param rhs IVec4 +---@return BVec4 +function IVec4.cmpeq(_self,rhs) end + +---@param _self IVec4 +---@return integer +function IVec4.min_position(_self) end + +---@param _self IVec4 +---@param rhs IVec4 +---@return BVec4 +function IVec4.cmpne(_self,rhs) end + +---@param _self IVec4 +---@return IVec4 +function IVec4.signum(_self) end + +---@param _self IVec4 +---@param rhs IVec4 +---@return IVec4 +function IVec4.add(_self,rhs) end + +---@param _self IVec4 +---@param rhs IVec4 +---@return IVec4 +function IVec4.saturating_mul(_self,rhs) end + +---@param a integer[] +---@return IVec4 +function IVec4.from_array(a) end + +---@param _self IVec4 +---@param rhs IVec4 +---@return IVec4 +function IVec4.rem(_self,rhs) end + +---@param p1 IVec4 +---@param p2 IVec4 +---@return IVec4 +function IVec4.mul(p1,p2) end + +---@param _self IVec4 +---@return integer +function IVec4.length_squared(_self) end + +---@param _self IVec4 +---@return U8Vec4 +function IVec4.as_u8vec4(_self) end + +---@param _self IVec4 +---@param rhs IVec4 +---@return IVec4 +function IVec4.rem_euclid(_self,rhs) end + +---@param _self IVec4 +---@param z integer +---@return IVec4 +function IVec4.with_z(_self,z) end + +---@param _self IVec4 +---@param rhs IVec4 +---@return integer +function IVec4.dot(_self,rhs) end + +---@param _self IVec4 +---@return IVec4 +function IVec4.neg(_self) end + +---@param _self IVec4 +---@return IVec3 +function IVec4.truncate(_self) end + +---@param _self IVec4 +---@param rhs IVec4 +---@return IVec4 +function IVec4.wrapping_add(_self,rhs) end + + + +---@class Mat2 : ReflectReference +---@field x_axis ? Vec2 +---@field y_axis ? Vec2 +---@operator add(Mat2): Mat2 +---@operator add(Mat2): Mat2 +---@operator mul(Mat2): Mat2 +---@operator mul(Vec2): Vec2 +---@operator mul(number): Mat2 +---@operator mul(Vec2): Vec2 +---@operator sub(Mat2): Mat2 +---@operator mul(Mat2): Mat2 +---@operator sub(Mat2): Mat2 +---@operator unm: Mat2 +---@operator div(number): Mat2 +Mat2 = {} + +---@param _self Mat2 +---@param rhs number +---@return Mat2 +function Mat2.div_scalar(_self,rhs) end + +---@param _self Mat2 +---@return Mat2 +function Mat2.transpose(_self) end + +---@param _self Mat2 +---@param index integer +---@return Vec2 +function Mat2.col(_self,index) end + +---@param _self Mat2 +---@return number[] +function Mat2.to_cols_array(_self) end + +---@param _self Mat2 +---@param rhs Vec2 +---@return Vec2 +function Mat2.mul_vec2(_self,rhs) end + +---@param _self Mat2 +---@param rhs Mat2 +---@return Mat2 +function Mat2.add(_self,rhs) end + +---@param p1 Mat2 +---@param p2 Mat2 +---@return Mat2 +function Mat2.add(p1,p2) end + +---@param m Mat3A +---@param i integer +---@param j integer +---@return Mat2 +function Mat2.from_mat3a_minor(m,i,j) end + +---@param scale Vec2 +---@param angle number +---@return Mat2 +function Mat2.from_scale_angle(scale,angle) end + +---@param m Mat3 +---@return Mat2 +function Mat2.from_mat3(m) end + +---@param _self Mat2 +---@param rhs Mat2 +---@return Mat2 +function Mat2.mul(_self,rhs) end + +---@param m Mat3A +---@return Mat2 +function Mat2.from_mat3a(m) end + +---@param _self Mat2 +---@param rhs Mat2 +---@return Mat2 +function Mat2.mul_mat2(_self,rhs) end + +---@param _self Mat2 +---@return number[][] +function Mat2.to_cols_array_2d(_self) end + +---@param _self Mat2 +---@param rhs Mat2 +---@return boolean +function Mat2.__eq(_self,rhs) end + +---@param _self Mat2 +---@param rhs Mat2 +---@return boolean +function Mat2.eq(_self,rhs) end + +---@param angle number +---@return Mat2 +function Mat2.from_angle(angle) end + +---@param _self Mat2 +---@param index integer +---@return Vec2 +function Mat2.row(_self,index) end + +---@param p1 Mat2 +---@param p2 Vec2 +---@return Vec2 +function Mat2.mul(p1,p2) end + +---@param _self Mat2 +---@return Mat2 +function Mat2.abs(_self) end + +---@param p1 Mat2 +---@param p2 number +---@return Mat2 +function Mat2.mul(p1,p2) end + +---@param _self Mat2 +---@return boolean +function Mat2.is_nan(_self) end + +---@param diagonal Vec2 +---@return Mat2 +function Mat2.from_diagonal(diagonal) end + +---@param _self Mat2 +---@param rhs Mat2 +---@return Mat2 +function Mat2.sub_mat2(_self,rhs) end + +---@param _self Mat2 +---@return Mat2 +function Mat2.inverse(_self) end + +---@param _self Mat2 +---@param rhs number +---@return Mat2 +function Mat2.mul_scalar(_self,rhs) end + +---@param p1 Mat2 +---@param p2 Vec2 +---@return Vec2 +function Mat2.mul(p1,p2) end + +---@param _self Mat2 +---@param rhs Mat2 +---@return Mat2 +function Mat2.sub(_self,rhs) end + +---@param _self Mat2 +---@return boolean +function Mat2.is_finite(_self) end + +---@param p1 Mat2 +---@param p2 Mat2 +---@return Mat2 +function Mat2.mul(p1,p2) end + +---@param _self Mat2 +---@param rhs Mat2 +---@return Mat2 +function Mat2.add_mat2(_self,rhs) end + +---@param m Mat3 +---@param i integer +---@param j integer +---@return Mat2 +function Mat2.from_mat3_minor(m,i,j) end + +---@param _self Mat2 +---@return Mat2 +function Mat2.clone(_self) end + +---@param _self Mat2 +---@param rhs Mat2 +---@param max_abs_diff number +---@return boolean +function Mat2.abs_diff_eq(_self,rhs,max_abs_diff) end + +---@param x_axis Vec2 +---@param y_axis Vec2 +---@return Mat2 +function Mat2.from_cols(x_axis,y_axis) end + +---@param _self Mat2 +---@return number +function Mat2.determinant(_self) end + +---@param _self Mat2 +---@return DMat2 +function Mat2.as_dmat2(_self) end + +---@param p1 Mat2 +---@param p2 Mat2 +---@return Mat2 +function Mat2.sub(p1,p2) end + +---@param _self Mat2 +---@return Mat2 +function Mat2.neg(_self) end + +---@param _self Mat2 +---@param rhs number +---@return Mat2 +function Mat2.div(_self,rhs) end + + + +---@class Mat3 : ReflectReference +---@field x_axis ? Vec3 +---@field y_axis ? Vec3 +---@field z_axis ? Vec3 +---@operator mul(Affine2): Mat3 +---@operator mul(Affine2): Mat3 +---@operator sub(Mat3): Mat3 +---@operator sub(Mat3): Mat3 +---@operator mul(Vec3): Vec3 +---@operator mul(Vec3): Vec3 +---@operator mul(Vec3A): Vec3A +---@operator unm: Mat3 +---@operator mul(Mat3): Mat3 +---@operator add(Mat3): Mat3 +---@operator mul(Mat3): Mat3 +---@operator mul(number): Mat3 +---@operator add(Mat3): Mat3 +---@operator div(number): Mat3 +---@operator mul(Vec3A): Vec3A +Mat3 = {} + +---@param _self Mat3 +---@return number +function Mat3.determinant(_self) end + +---@param translation Vec2 +---@return Mat3 +function Mat3.from_translation(translation) end + +---@param dir Vec3 +---@param up Vec3 +---@return Mat3 +function Mat3.look_to_lh(dir,up) end + +---@param m Mat4 +---@return Mat3 +function Mat3.from_mat4(m) end + +---@param _self Mat3 +---@return number[][] +function Mat3.to_cols_array_2d(_self) end + +---@param _self Mat3 +---@param rhs Mat3 +---@return Mat3 +function Mat3.sub_mat3(_self,rhs) end + +---@param _self Mat3 +---@param rhs Mat3 +---@param max_abs_diff number +---@return boolean +function Mat3.abs_diff_eq(_self,rhs,max_abs_diff) end + +---@param _self Mat3 +---@param rhs Affine2 +---@return Mat3 +function Mat3.mul(_self,rhs) end + +---@param _self Mat3 +---@return number[] +function Mat3.to_cols_array(_self) end + +---@param _self Mat3 +---@param rhs Vec2 +---@return Vec2 +function Mat3.transform_vector2(_self,rhs) end + +---@param p1 Mat3 +---@param p2 Affine2 +---@return Mat3 +function Mat3.mul(p1,p2) end + +---@param angle number +---@return Mat3 +function Mat3.from_rotation_x(angle) end + +---@param _self Mat3 +---@param rhs Vec3A +---@return Vec3A +function Mat3.mul_vec3a(_self,rhs) end + +---@param angle number +---@return Mat3 +function Mat3.from_rotation_y(angle) end + +---@param _self Mat3 +---@param rhs Vec2 +---@return Vec2 +function Mat3.transform_point2(_self,rhs) end + +---@param scale Vec2 +---@param angle number +---@param translation Vec2 +---@return Mat3 +function Mat3.from_scale_angle_translation(scale,angle,translation) end + +---@param order EulerRot +---@param a number +---@param b number +---@param c number +---@return Mat3 +function Mat3.from_euler(order,a,b,c) end + +---@param x_axis Vec3 +---@param y_axis Vec3 +---@param z_axis Vec3 +---@return Mat3 +function Mat3.from_cols(x_axis,y_axis,z_axis) end + +---@param _self Mat3 +---@param rhs Mat3 +---@return Mat3 +function Mat3.sub(_self,rhs) end + +---@param p1 Mat3 +---@param p2 Mat3 +---@return Mat3 +function Mat3.sub(p1,p2) end + +---@param _self Mat3 +---@param index integer +---@return Vec3 +function Mat3.row(_self,index) end + +---@param p1 Mat3 +---@param p2 Vec3 +---@return Vec3 +function Mat3.mul(p1,p2) end + +---@param _self Mat3 +---@param rhs Mat3 +---@return boolean +function Mat3.__eq(_self,rhs) end + +---@param _self Mat3 +---@param rhs Mat3 +---@return boolean +function Mat3.eq(_self,rhs) end + +---@param _self Mat3 +---@return DMat3 +function Mat3.as_dmat3(_self) end + +---@param p1 Mat3 +---@param p2 Vec3 +---@return Vec3 +function Mat3.mul(p1,p2) end + +---@param eye Vec3 +---@param center Vec3 +---@param up Vec3 +---@return Mat3 +function Mat3.look_at_rh(eye,center,up) end + +---@param p1 Mat3 +---@param p2 Vec3A +---@return Vec3A +function Mat3.mul(p1,p2) end + +---@param _self Mat3 +---@return Mat3 +function Mat3.abs(_self) end + +---@param eye Vec3 +---@param center Vec3 +---@param up Vec3 +---@return Mat3 +function Mat3.look_at_lh(eye,center,up) end + +---@param _self Mat3 +---@return Mat3 +function Mat3.transpose(_self) end + +---@param angle number +---@return Mat3 +function Mat3.from_rotation_z(angle) end + +---@param _self Mat3 +---@return Mat3 +function Mat3.neg(_self) end + +---@param scale Vec2 +---@return Mat3 +function Mat3.from_scale(scale) end + +---@param dir Vec3 +---@param up Vec3 +---@return Mat3 +function Mat3.look_to_rh(dir,up) end + +---@param _self Mat3 +---@param rhs Mat3 +---@return Mat3 +function Mat3.mul_mat3(_self,rhs) end + +---@param m Mat2 +---@return Mat3 +function Mat3.from_mat2(m) end + +---@param _self Mat3 +---@param rhs number +---@return Mat3 +function Mat3.mul_scalar(_self,rhs) end + +---@param _self Mat3 +---@return Mat3 +function Mat3.clone(_self) end + +---@param _self Mat3 +---@param rhs Vec3 +---@return Vec3 +function Mat3.mul_vec3(_self,rhs) end + +---@param axis Vec3 +---@param angle number +---@return Mat3 +function Mat3.from_axis_angle(axis,angle) end + +---@param _self Mat3 +---@return boolean +function Mat3.is_nan(_self) end + +---@param _self Mat3 +---@param rhs Mat3 +---@return Mat3 +function Mat3.add_mat3(_self,rhs) end + +---@param _self Mat3 +---@return Mat3 +function Mat3.inverse(_self) end + +---@param diagonal Vec3 +---@return Mat3 +function Mat3.from_diagonal(diagonal) end + +---@param p1 Mat3 +---@param p2 Mat3 +---@return Mat3 +function Mat3.mul(p1,p2) end + +---@param angle number +---@return Mat3 +function Mat3.from_angle(angle) end + +---@param _self Mat3 +---@param order EulerRot +---@return [number, number, number] +function Mat3.to_euler(_self,order) end + +---@param p1 Mat3 +---@param p2 Mat3 +---@return Mat3 +function Mat3.add(p1,p2) end + +---@param _self Mat3 +---@return boolean +function Mat3.is_finite(_self) end + +---@param rotation Quat +---@return Mat3 +function Mat3.from_quat(rotation) end + +---@param m Mat4 +---@param i integer +---@param j integer +---@return Mat3 +function Mat3.from_mat4_minor(m,i,j) end + +---@param p1 Mat3 +---@param p2 Mat3 +---@return Mat3 +function Mat3.mul(p1,p2) end + +---@param p1 Mat3 +---@param p2 number +---@return Mat3 +function Mat3.mul(p1,p2) end + +---@param _self Mat3 +---@param rhs Mat3 +---@return Mat3 +function Mat3.add(_self,rhs) end + +---@param _self Mat3 +---@param rhs number +---@return Mat3 +function Mat3.div(_self,rhs) end + +---@param p1 Mat3 +---@param p2 Vec3A +---@return Vec3A +function Mat3.mul(p1,p2) end + +---@param _self Mat3 +---@param rhs number +---@return Mat3 +function Mat3.div_scalar(_self,rhs) end + +---@param _self Mat3 +---@param index integer +---@return Vec3 +function Mat3.col(_self,index) end + + + +---@class Mat3A : ReflectReference +---@field x_axis ? Vec3A +---@field y_axis ? Vec3A +---@field z_axis ? Vec3A +---@operator mul(Affine2): Mat3A +---@operator div(number): Mat3A +---@operator mul(Vec3): Vec3 +---@operator mul(Vec3): Vec3 +---@operator mul(number): Mat3A +---@operator sub(Mat3A): Mat3A +---@operator add(Mat3A): Mat3A +---@operator mul(Vec3A): Vec3A +---@operator mul(Affine2): Mat3A +---@operator mul(Vec3A): Vec3A +---@operator add(Mat3A): Mat3A +---@operator mul(Mat3A): Mat3A +---@operator sub(Mat3A): Mat3A +---@operator mul(Mat3A): Mat3A +---@operator unm: Mat3A +Mat3A = {} + +---@param axis Vec3 +---@param angle number +---@return Mat3A +function Mat3A.from_axis_angle(axis,angle) end + +---@param _self Mat3A +---@return number[][] +function Mat3A.to_cols_array_2d(_self) end + +---@param _self Mat3A +---@param order EulerRot +---@return [number, number, number] +function Mat3A.to_euler(_self,order) end + +---@param _self Mat3A +---@param index integer +---@return Vec3A +function Mat3A.col(_self,index) end + +---@param _self Mat3A +---@param rhs Mat3A +---@return Mat3A +function Mat3A.sub_mat3(_self,rhs) end + +---@param p1 Mat3A +---@param p2 Affine2 +---@return Mat3A +function Mat3A.mul(p1,p2) end + +---@param _self Mat3A +---@param rhs number +---@return Mat3A +function Mat3A.div(_self,rhs) end + +---@param _self Mat3A +---@return Mat3A +function Mat3A.abs(_self) end + +---@param angle number +---@return Mat3A +function Mat3A.from_rotation_z(angle) end + +---@param rotation Quat +---@return Mat3A +function Mat3A.from_quat(rotation) end + +---@param scale Vec2 +---@param angle number +---@param translation Vec2 +---@return Mat3A +function Mat3A.from_scale_angle_translation(scale,angle,translation) end + +---@param _self Mat3A +---@return Mat3A +function Mat3A.clone(_self) end + +---@param _self Mat3A +---@param rhs Mat3A +---@return boolean +function Mat3A.__eq(_self,rhs) end + +---@param _self Mat3A +---@param rhs Mat3A +---@return boolean +function Mat3A.eq(_self,rhs) end + +---@param p1 Mat3A +---@param p2 Vec3 +---@return Vec3 +function Mat3A.mul(p1,p2) end + +---@param p1 Mat3A +---@param p2 Vec3 +---@return Vec3 +function Mat3A.mul(p1,p2) end + +---@param x_axis Vec3A +---@param y_axis Vec3A +---@param z_axis Vec3A +---@return Mat3A +function Mat3A.from_cols(x_axis,y_axis,z_axis) end + +---@param _self Mat3A +---@return DMat3 +function Mat3A.as_dmat3(_self) end + +---@param _self Mat3A +---@param rhs Mat3A +---@return Mat3A +function Mat3A.mul_mat3(_self,rhs) end + +---@param _self Mat3A +---@param rhs Vec3 +---@return Vec3 +function Mat3A.mul_vec3(_self,rhs) end + +---@param p1 Mat3A +---@param p2 number +---@return Mat3A +function Mat3A.mul(p1,p2) end + +---@param _self Mat3A +---@return boolean +function Mat3A.is_nan(_self) end + +---@param _self Mat3A +---@param index integer +---@return Vec3A +function Mat3A.row(_self,index) end + +---@param _self Mat3A +---@param rhs Mat3A +---@return Mat3A +function Mat3A.sub(_self,rhs) end + +---@param _self Mat3A +---@param rhs number +---@return Mat3A +function Mat3A.div_scalar(_self,rhs) end + +---@param eye Vec3 +---@param center Vec3 +---@param up Vec3 +---@return Mat3A +function Mat3A.look_at_rh(eye,center,up) end + +---@param p1 Mat3A +---@param p2 Mat3A +---@return Mat3A +function Mat3A.add(p1,p2) end + +---@param m Mat2 +---@return Mat3A +function Mat3A.from_mat2(m) end + +---@param p1 Mat3A +---@param p2 Vec3A +---@return Vec3A +function Mat3A.mul(p1,p2) end + +---@param m Mat4 +---@return Mat3A +function Mat3A.from_mat4(m) end + +---@param _self Mat3A +---@return Mat3A +function Mat3A.inverse(_self) end + +---@param order EulerRot +---@param a number +---@param b number +---@param c number +---@return Mat3A +function Mat3A.from_euler(order,a,b,c) end + +---@param _self Mat3A +---@param rhs Mat3A +---@return Mat3A +function Mat3A.add_mat3(_self,rhs) end + +---@param dir Vec3 +---@param up Vec3 +---@return Mat3A +function Mat3A.look_to_lh(dir,up) end + +---@param scale Vec2 +---@return Mat3A +function Mat3A.from_scale(scale) end + +---@param _self Mat3A +---@param rhs Affine2 +---@return Mat3A +function Mat3A.mul(_self,rhs) end + +---@param dir Vec3 +---@param up Vec3 +---@return Mat3A +function Mat3A.look_to_rh(dir,up) end + +---@param _self Mat3A +---@return boolean +function Mat3A.is_finite(_self) end + +---@param p1 Mat3A +---@param p2 Vec3A +---@return Vec3A +function Mat3A.mul(p1,p2) end + +---@param _self Mat3A +---@param rhs Vec2 +---@return Vec2 +function Mat3A.transform_point2(_self,rhs) end + +---@param _self Mat3A +---@return number +function Mat3A.determinant(_self) end + +---@param _self Mat3A +---@param rhs Vec2 +---@return Vec2 +function Mat3A.transform_vector2(_self,rhs) end + +---@param _self Mat3A +---@return number[] +function Mat3A.to_cols_array(_self) end + +---@param _self Mat3A +---@param rhs Vec3A +---@return Vec3A +function Mat3A.mul_vec3a(_self,rhs) end + +---@param m Mat4 +---@param i integer +---@param j integer +---@return Mat3A +function Mat3A.from_mat4_minor(m,i,j) end + +---@param diagonal Vec3 +---@return Mat3A +function Mat3A.from_diagonal(diagonal) end + +---@param _self Mat3A +---@param rhs Mat3A +---@return Mat3A +function Mat3A.add(_self,rhs) end + +---@param p1 Mat3A +---@param p2 Mat3A +---@return Mat3A +function Mat3A.mul(p1,p2) end + +---@param angle number +---@return Mat3A +function Mat3A.from_rotation_y(angle) end + +---@param _self Mat3A +---@return Mat3A +function Mat3A.transpose(_self) end + +---@param _self Mat3A +---@param rhs Mat3A +---@param max_abs_diff number +---@return boolean +function Mat3A.abs_diff_eq(_self,rhs,max_abs_diff) end + +---@param eye Vec3 +---@param center Vec3 +---@param up Vec3 +---@return Mat3A +function Mat3A.look_at_lh(eye,center,up) end + +---@param p1 Mat3A +---@param p2 Mat3A +---@return Mat3A +function Mat3A.sub(p1,p2) end + +---@param p1 Mat3A +---@param p2 Mat3A +---@return Mat3A +function Mat3A.mul(p1,p2) end + +---@param angle number +---@return Mat3A +function Mat3A.from_rotation_x(angle) end + +---@param translation Vec2 +---@return Mat3A +function Mat3A.from_translation(translation) end + +---@param _self Mat3A +---@return Mat3A +function Mat3A.neg(_self) end + +---@param angle number +---@return Mat3A +function Mat3A.from_angle(angle) end + +---@param _self Mat3A +---@param rhs number +---@return Mat3A +function Mat3A.mul_scalar(_self,rhs) end + + + +---@class Mat4 : ReflectReference +---@field x_axis ? Vec4 +---@field y_axis ? Vec4 +---@field z_axis ? Vec4 +---@field w_axis ? Vec4 +---@operator mul(number): Mat4 +---@operator mul(Affine3A): Mat4 +---@operator mul(Mat4): Mat4 +---@operator mul(Vec4): Vec4 +---@operator add(Mat4): Mat4 +---@operator sub(Mat4): Mat4 +---@operator unm: Mat4 +---@operator add(Mat4): Mat4 +---@operator sub(Mat4): Mat4 +---@operator mul(Affine3A): Mat4 +---@operator mul(Vec4): Vec4 +---@operator div(number): Mat4 +---@operator mul(Mat4): Mat4 +Mat4 = {} + +---@param eye Vec3 +---@param dir Vec3 +---@param up Vec3 +---@return Mat4 +function Mat4.look_to_rh(eye,dir,up) end + +---@param fov_y_radians number +---@param aspect_ratio number +---@param z_near number +---@return Mat4 +function Mat4.perspective_infinite_reverse_rh(fov_y_radians,aspect_ratio,z_near) end + +---@param fov_y_radians number +---@param aspect_ratio number +---@param z_near number +---@param z_far number +---@return Mat4 +function Mat4.perspective_rh(fov_y_radians,aspect_ratio,z_near,z_far) end + +---@param rotation Quat +---@param translation Vec3 +---@return Mat4 +function Mat4.from_rotation_translation(rotation,translation) end + +---@param _self Mat4 +---@return number +function Mat4.determinant(_self) end + +---@param _self Mat4 +---@param rhs Vec3A +---@return Vec3A +function Mat4.project_point3a(_self,rhs) end + +---@param p1 Mat4 +---@param p2 number +---@return Mat4 +function Mat4.mul(p1,p2) end + +---@param left number +---@param right number +---@param bottom number +---@param top number +---@param near number +---@param far number +---@return Mat4 +function Mat4.orthographic_lh(left,right,bottom,top,near,far) end + +---@param fov_y_radians number +---@param aspect_ratio number +---@param z_near number +---@return Mat4 +function Mat4.perspective_infinite_rh(fov_y_radians,aspect_ratio,z_near) end + +---@param axis Vec3 +---@param angle number +---@return Mat4 +function Mat4.from_axis_angle(axis,angle) end + +---@param _self Mat4 +---@return Mat4 +function Mat4.clone(_self) end + +---@param p1 Mat4 +---@param p2 Affine3A +---@return Mat4 +function Mat4.mul(p1,p2) end + +---@param _self Mat4 +---@param rhs Vec3 +---@return Vec3 +function Mat4.transform_point3(_self,rhs) end + +---@param _self Mat4 +---@param rhs Vec3A +---@return Vec3A +function Mat4.transform_vector3a(_self,rhs) end + +---@param _self Mat4 +---@param rhs number +---@return Mat4 +function Mat4.div_scalar(_self,rhs) end + +---@param scale Vec3 +---@return Mat4 +function Mat4.from_scale(scale) end + +---@param fov_y_radians number +---@param aspect_ratio number +---@param z_near number +---@param z_far number +---@return Mat4 +function Mat4.perspective_rh_gl(fov_y_radians,aspect_ratio,z_near,z_far) end + +---@param angle number +---@return Mat4 +function Mat4.from_rotation_x(angle) end + +---@param p1 Mat4 +---@param p2 Mat4 +---@return Mat4 +function Mat4.mul(p1,p2) end + +---@param _self Mat4 +---@param rhs Vec3A +---@return Vec3A +function Mat4.transform_point3a(_self,rhs) end + +---@param _self Mat4 +---@return number[][] +function Mat4.to_cols_array_2d(_self) end + +---@param _self Mat4 +---@return number[] +function Mat4.to_cols_array(_self) end + +---@param p1 Mat4 +---@param p2 Vec4 +---@return Vec4 +function Mat4.mul(p1,p2) end + +---@param p1 Mat4 +---@param p2 Mat4 +---@return Mat4 +function Mat4.add(p1,p2) end + +---@param _self Mat4 +---@return boolean +function Mat4.is_nan(_self) end + +---@param _self Mat4 +---@return Mat4 +function Mat4.transpose(_self) end + +---@param _self Mat4 +---@param rhs Mat4 +---@return boolean +function Mat4.__eq(_self,rhs) end + +---@param _self Mat4 +---@param rhs Mat4 +---@return boolean +function Mat4.eq(_self,rhs) end + +---@param scale Vec3 +---@param rotation Quat +---@param translation Vec3 +---@return Mat4 +function Mat4.from_scale_rotation_translation(scale,rotation,translation) end + +---@param _self Mat4 +---@return DMat4 +function Mat4.as_dmat4(_self) end + +---@param m Mat3 +---@return Mat4 +function Mat4.from_mat3(m) end + +---@param eye Vec3 +---@param dir Vec3 +---@param up Vec3 +---@return Mat4 +function Mat4.look_to_lh(eye,dir,up) end + +---@param left number +---@param right number +---@param bottom number +---@param top number +---@param z_near number +---@param z_far number +---@return Mat4 +function Mat4.frustum_rh_gl(left,right,bottom,top,z_near,z_far) end + +---@param p1 Mat4 +---@param p2 Mat4 +---@return Mat4 +function Mat4.sub(p1,p2) end + +---@param left number +---@param right number +---@param bottom number +---@param top number +---@param near number +---@param far number +---@return Mat4 +function Mat4.orthographic_rh_gl(left,right,bottom,top,near,far) end + +---@param diagonal Vec4 +---@return Mat4 +function Mat4.from_diagonal(diagonal) end + +---@param order EulerRot +---@param a number +---@param b number +---@param c number +---@return Mat4 +function Mat4.from_euler(order,a,b,c) end + +---@param _self Mat4 +---@return Mat4 +function Mat4.abs(_self) end + +---@param fov_y_radians number +---@param aspect_ratio number +---@param z_near number +---@param z_far number +---@return Mat4 +function Mat4.perspective_lh(fov_y_radians,aspect_ratio,z_near,z_far) end + +---@param _self Mat4 +---@param rhs number +---@return Mat4 +function Mat4.mul_scalar(_self,rhs) end + +---@param eye Vec3 +---@param center Vec3 +---@param up Vec3 +---@return Mat4 +function Mat4.look_at_lh(eye,center,up) end + +---@param _self Mat4 +---@param rhs Mat4 +---@return Mat4 +function Mat4.mul_mat4(_self,rhs) end + +---@param _self Mat4 +---@param index integer +---@return Vec4 +function Mat4.col(_self,index) end + +---@param _self Mat4 +---@return Mat4 +function Mat4.neg(_self) end + +---@param fov_y_radians number +---@param aspect_ratio number +---@param z_near number +---@return Mat4 +function Mat4.perspective_infinite_lh(fov_y_radians,aspect_ratio,z_near) end + +---@param m Mat3A +---@return Mat4 +function Mat4.from_mat3a(m) end + +---@param _self Mat4 +---@param rhs Mat4 +---@return Mat4 +function Mat4.add(_self,rhs) end + +---@param _self Mat4 +---@return boolean +function Mat4.is_finite(_self) end + +---@param left number +---@param right number +---@param bottom number +---@param top number +---@param near number +---@param far number +---@return Mat4 +function Mat4.orthographic_rh(left,right,bottom,top,near,far) end + +---@param _self Mat4 +---@param rhs Vec3 +---@return Vec3 +function Mat4.transform_vector3(_self,rhs) end + +---@param _self Mat4 +---@param rhs Mat4 +---@return Mat4 +function Mat4.sub(_self,rhs) end + +---@param rotation Quat +---@return Mat4 +function Mat4.from_quat(rotation) end + +---@param angle number +---@return Mat4 +function Mat4.from_rotation_z(angle) end + +---@param _self Mat4 +---@param rhs Vec4 +---@return Vec4 +function Mat4.mul_vec4(_self,rhs) end + +---@param _self Mat4 +---@param rhs Affine3A +---@return Mat4 +function Mat4.mul(_self,rhs) end + +---@param p1 Mat4 +---@param p2 Vec4 +---@return Vec4 +function Mat4.mul(p1,p2) end + +---@param mat3 Mat3 +---@param translation Vec3 +---@return Mat4 +function Mat4.from_mat3_translation(mat3,translation) end + +---@param _self Mat4 +---@param rhs number +---@return Mat4 +function Mat4.div(_self,rhs) end + +---@param _self Mat4 +---@param rhs Mat4 +---@return Mat4 +function Mat4.add_mat4(_self,rhs) end + +---@param _self Mat4 +---@param rhs Mat4 +---@param max_abs_diff number +---@return boolean +function Mat4.abs_diff_eq(_self,rhs,max_abs_diff) end + +---@param _self Mat4 +---@param index integer +---@return Vec4 +function Mat4.row(_self,index) end + +---@param angle number +---@return Mat4 +function Mat4.from_rotation_y(angle) end + +---@param left number +---@param right number +---@param bottom number +---@param top number +---@param z_near number +---@param z_far number +---@return Mat4 +function Mat4.frustum_lh(left,right,bottom,top,z_near,z_far) end + +---@param left number +---@param right number +---@param bottom number +---@param top number +---@param z_near number +---@param z_far number +---@return Mat4 +function Mat4.frustum_rh(left,right,bottom,top,z_near,z_far) end + +---@param translation Vec3 +---@return Mat4 +function Mat4.from_translation(translation) end + +---@param x_axis Vec4 +---@param y_axis Vec4 +---@param z_axis Vec4 +---@param w_axis Vec4 +---@return Mat4 +function Mat4.from_cols(x_axis,y_axis,z_axis,w_axis) end + +---@param eye Vec3 +---@param center Vec3 +---@param up Vec3 +---@return Mat4 +function Mat4.look_at_rh(eye,center,up) end + +---@param _self Mat4 +---@param rhs Vec3 +---@return Vec3 +function Mat4.project_point3(_self,rhs) end + +---@param _self Mat4 +---@param order EulerRot +---@return [number, number, number] +function Mat4.to_euler(_self,order) end + +---@param p1 Mat4 +---@param p2 Mat4 +---@return Mat4 +function Mat4.mul(p1,p2) end + +---@param _self Mat4 +---@param rhs Mat4 +---@return Mat4 +function Mat4.sub_mat4(_self,rhs) end + +---@param fov_y_radians number +---@param aspect_ratio number +---@param z_near number +---@return Mat4 +function Mat4.perspective_infinite_reverse_lh(fov_y_radians,aspect_ratio,z_near) end + +---@param _self Mat4 +---@return Mat4 +function Mat4.inverse(_self) end + + + +---@class Quat : ReflectReference +---@field x ? number +---@field y ? number +---@field z ? number +---@field w ? number +---@operator mul(Vec3): Vec3 +---@operator unm: Quat +---@operator add(Quat): Quat +---@operator mul(number): Quat +---@operator add(Quat): Quat +---@operator sub(Quat): Quat +---@operator mul(Vec3): Vec3 +---@operator sub(Quat): Quat +---@operator div(number): Quat +---@operator mul(Quat): Quat +---@operator mul(Vec3A): Vec3A +---@operator mul(Vec3A): Vec3A +---@operator mul(Quat): Quat +Quat = {} + +---@param _self Quat +---@param rhs Quat +---@return Quat +function Quat.mul_quat(_self,rhs) end + +---@param _self Quat +---@return number +function Quat.length_recip(_self) end + +---@param _self Quat +---@param rhs Quat +---@return number +function Quat.angle_between(_self,rhs) end + +---@param mat Mat3 +---@return Quat +function Quat.from_mat3(mat) end + +---@param dir Vec3 +---@param up Vec3 +---@return Quat +function Quat.look_to_lh(dir,up) end + +---@param dir Vec3 +---@param up Vec3 +---@return Quat +function Quat.look_to_rh(dir,up) end + +---@param _self Quat +---@return Quat +function Quat.conjugate(_self) end + +---@param from Vec3 +---@param to Vec3 +---@return Quat +function Quat.from_rotation_arc(from,to) end + +---@param _self Quat +---@param rhs Quat +---@return number +function Quat.dot(_self,rhs) end + +---@param _self Quat +---@return Vec3 +function Quat.xyz(_self) end + +---@param x number +---@param y number +---@param z number +---@param w number +---@return Quat +function Quat.from_xyzw(x,y,z,w) end + +---@param from Vec2 +---@param to Vec2 +---@return Quat +function Quat.from_rotation_arc_2d(from,to) end + +---@param a Affine3A +---@return Quat +function Quat.from_affine3(a) end + +---@param _self Quat +---@return number +function Quat.length_squared(_self) end + +---@param _self Quat +---@param _end Quat +---@param s number +---@return Quat +function Quat.slerp(_self,_end,s) end + +---@param _self Quat +---@param rhs Vec3 +---@return Vec3 +function Quat.mul_vec3(_self,rhs) end + +---@param p1 Quat +---@param p2 Vec3 +---@return Vec3 +function Quat.mul(p1,p2) end + +---@param _self Quat +---@param rhs Vec3A +---@return Vec3A +function Quat.mul_vec3a(_self,rhs) end + +---@param v Vec3 +---@return Quat +function Quat.from_scaled_axis(v) end + +---@param _self Quat +---@return number +function Quat.length(_self) end + +---@param _self Quat +---@return Quat +function Quat.neg(_self) end + +---@param _self Quat +---@param rhs Quat +---@return Quat +function Quat.add(_self,rhs) end + +---@param p1 Quat +---@param p2 number +---@return Quat +function Quat.mul(p1,p2) end + +---@param a number[] +---@return Quat +function Quat.from_array(a) end + +---@param axis Vec3 +---@param angle number +---@return Quat +function Quat.from_axis_angle(axis,angle) end + +---@param _self Quat +---@param rhs Quat +---@param max_angle number +---@return Quat +function Quat.rotate_towards(_self,rhs,max_angle) end + +---@param _self Quat +---@return Quat +function Quat.normalize(_self) end + +---@param _self Quat +---@param rhs Quat +---@return boolean +function Quat.__eq(_self,rhs) end + +---@param _self Quat +---@param rhs Quat +---@return boolean +function Quat.eq(_self,rhs) end + +---@param _self Quat +---@return boolean +function Quat.is_near_identity(_self) end + +---@param _self Quat +---@return Quat +function Quat.clone(_self) end + +---@param p1 Quat +---@param p2 Quat +---@return Quat +function Quat.add(p1,p2) end + +---@param mat Mat4 +---@return Quat +function Quat.from_mat4(mat) end + +---@param _self Quat +---@param rhs Quat +---@return Quat +function Quat.sub(_self,rhs) end + +---@param angle number +---@return Quat +function Quat.from_rotation_y(angle) end + +---@param eye Vec3 +---@param center Vec3 +---@param up Vec3 +---@return Quat +function Quat.look_at_lh(eye,center,up) end + +---@param _self Quat +---@return boolean +function Quat.is_finite(_self) end + +---@param angle number +---@return Quat +function Quat.from_rotation_x(angle) end + +---@param p1 Quat +---@param p2 Vec3 +---@return Vec3 +function Quat.mul(p1,p2) end + +---@param p1 Quat +---@param p2 Quat +---@return Quat +function Quat.sub(p1,p2) end + +---@param v Vec4 +---@return Quat +function Quat.from_vec4(v) end + +---@param _self Quat +---@return DQuat +function Quat.as_dquat(_self) end + +---@param _self Quat +---@param _end Quat +---@param s number +---@return Quat +function Quat.lerp(_self,_end,s) end + +---@param _self Quat +---@param rhs number +---@return Quat +function Quat.div(_self,rhs) end + +---@param _self Quat +---@param rhs Quat +---@param max_abs_diff number +---@return boolean +function Quat.abs_diff_eq(_self,rhs,max_abs_diff) end + +---@param p1 Quat +---@param p2 Quat +---@return Quat +function Quat.mul(p1,p2) end + +---@param eye Vec3 +---@param center Vec3 +---@param up Vec3 +---@return Quat +function Quat.look_at_rh(eye,center,up) end + +---@param from Vec3 +---@param to Vec3 +---@return Quat +function Quat.from_rotation_arc_colinear(from,to) end + +---@param p1 Quat +---@param p2 Vec3A +---@return Vec3A +function Quat.mul(p1,p2) end + +---@param mat Mat3A +---@return Quat +function Quat.from_mat3a(mat) end + +---@param _self Quat +---@return boolean +function Quat.is_normalized(_self) end + +---@param _self Quat +---@return Quat +function Quat.inverse(_self) end + +---@param p1 Quat +---@param p2 Vec3A +---@return Vec3A +function Quat.mul(p1,p2) end + +---@param _self Quat +---@return boolean +function Quat.is_nan(_self) end + +---@param _self Quat +---@param order EulerRot +---@return [number, number, number] +function Quat.to_euler(_self,order) end + +---@param angle number +---@return Quat +function Quat.from_rotation_z(angle) end + +---@param _self Quat +---@return number[] +function Quat.to_array(_self) end + +---@param _self Quat +---@return Vec3 +function Quat.to_scaled_axis(_self) end + +---@param _self Quat +---@param rhs Quat +---@return Quat +function Quat.mul(_self,rhs) end + +---@param euler EulerRot +---@param a number +---@param b number +---@param c number +---@return Quat +function Quat.from_euler(euler,a,b,c) end + + + +---@class U16Vec2 : ReflectReference +---@field x ? integer +---@field y ? integer +---@operator div(U16Vec2): U16Vec2 +---@operator div(U16Vec2): U16Vec2 +---@operator add(U16Vec2): U16Vec2 +---@operator mul(U16Vec2): U16Vec2 +---@operator add(integer): U16Vec2 +---@operator mod(U16Vec2): U16Vec2 +---@operator mod(integer): U16Vec2 +---@operator div(integer): U16Vec2 +---@operator mod(U16Vec2): U16Vec2 +---@operator add(U16Vec2): U16Vec2 +---@operator sub(U16Vec2): U16Vec2 +---@operator sub(U16Vec2): U16Vec2 +---@operator mul(U16Vec2): U16Vec2 +---@operator sub(integer): U16Vec2 +---@operator mul(integer): U16Vec2 +U16Vec2 = {} + +---@param _self U16Vec2 +---@return IVec2 +function U16Vec2.as_ivec2(_self) end + +---@param _self U16Vec2 +---@param rhs U16Vec2 +---@return U16Vec2 +function U16Vec2.div(_self,rhs) end + +---@param _self U16Vec2 +---@return nil +function U16Vec2.assert_receiver_is_total_eq(_self) end + +---@param _self U16Vec2 +---@param rhs U16Vec2 +---@return U16Vec2 +function U16Vec2.wrapping_mul(_self,rhs) end + +---@param _self U16Vec2 +---@param rhs U16Vec2 +---@return U16Vec2 +function U16Vec2.saturating_add(_self,rhs) end + +---@param _self U16Vec2 +---@param rhs U16Vec2 +---@return integer | nil +function U16Vec2.checked_manhattan_distance(_self,rhs) end + +---@param _self U16Vec2 +---@return integer[] +function U16Vec2.to_array(_self) end + +---@param _self U16Vec2 +---@param rhs U16Vec2 +---@return U16Vec2 +function U16Vec2.wrapping_add(_self,rhs) end + +---@param x integer +---@param y integer +---@return U16Vec2 +function U16Vec2.new(x,y) end + +---@param p1 U16Vec2 +---@param p2 U16Vec2 +---@return U16Vec2 +function U16Vec2.div(p1,p2) end + +---@param p1 U16Vec2 +---@param p2 U16Vec2 +---@return U16Vec2 +function U16Vec2.add(p1,p2) end + +---@param _self U16Vec2 +---@param rhs U16Vec2 +---@return U16Vec2 +function U16Vec2.saturating_sub(_self,rhs) end + +---@param _self U16Vec2 +---@return integer +function U16Vec2.element_product(_self) end + +---@param _self U16Vec2 +---@param rhs U16Vec2 +---@return U16Vec2 +function U16Vec2.mul(_self,rhs) end + +---@param _self U16Vec2 +---@return U64Vec2 +function U16Vec2.as_u64vec2(_self) end + +---@param p1 U16Vec2 +---@param p2 integer +---@return U16Vec2 +function U16Vec2.add(p1,p2) end + +---@param _self U16Vec2 +---@return DVec2 +function U16Vec2.as_dvec2(_self) end + +---@param _self U16Vec2 +---@param rhs U16Vec2 +---@return U16Vec2 +function U16Vec2.rem(_self,rhs) end + +---@param _self U16Vec2 +---@param y integer +---@return U16Vec2 +function U16Vec2.with_y(_self,y) end + +---@param _self U16Vec2 +---@param rhs U16Vec2 +---@return integer +function U16Vec2.chebyshev_distance(_self,rhs) end + +---@param a integer[] +---@return U16Vec2 +function U16Vec2.from_array(a) end + +---@param _self U16Vec2 +---@param rhs U16Vec2 +---@return integer +function U16Vec2.dot(_self,rhs) end + +---@param _self U16Vec2 +---@param z integer +---@return U16Vec3 +function U16Vec2.extend(_self,z) end + +---@param _self U16Vec2 +---@return Vec2 +function U16Vec2.as_vec2(_self) end + +---@param p1 U16Vec2 +---@param p2 integer +---@return U16Vec2 +function U16Vec2.rem(p1,p2) end + +---@param _self U16Vec2 +---@param rhs U16Vec2 +---@return integer +function U16Vec2.manhattan_distance(_self,rhs) end + +---@param _self U16Vec2 +---@return integer +function U16Vec2.min_position(_self) end + +---@param _self U16Vec2 +---@param rhs I16Vec2 +---@return U16Vec2 +function U16Vec2.saturating_add_signed(_self,rhs) end + +---@param p1 U16Vec2 +---@param p2 integer +---@return U16Vec2 +function U16Vec2.div(p1,p2) end + +---@param _self U16Vec2 +---@param rhs U16Vec2 +---@return U16Vec2 +function U16Vec2.saturating_mul(_self,rhs) end + +---@param _self U16Vec2 +---@return integer +function U16Vec2.max_position(_self) end + +---@param _self U16Vec2 +---@param rhs U16Vec2 +---@return BVec2 +function U16Vec2.cmpeq(_self,rhs) end + +---@param _self U16Vec2 +---@return U16Vec2 +function U16Vec2.clone(_self) end + +---@param _self U16Vec2 +---@param x integer +---@return U16Vec2 +function U16Vec2.with_x(_self,x) end + +---@param _self U16Vec2 +---@param other U16Vec2 +---@return boolean +function U16Vec2.__eq(_self,other) end + +---@param _self U16Vec2 +---@param other U16Vec2 +---@return boolean +function U16Vec2.eq(_self,other) end + +---@param p1 U16Vec2 +---@param p2 U16Vec2 +---@return U16Vec2 +function U16Vec2.rem(p1,p2) end + +---@param _self U16Vec2 +---@return U8Vec2 +function U16Vec2.as_u8vec2(_self) end + +---@param _self U16Vec2 +---@param rhs I16Vec2 +---@return U16Vec2 +function U16Vec2.wrapping_add_signed(_self,rhs) end + +---@param _self U16Vec2 +---@param rhs U16Vec2 +---@return U16Vec2 +function U16Vec2.add(_self,rhs) end + +---@param _self U16Vec2 +---@param rhs U16Vec2 +---@return U16Vec2 +function U16Vec2.wrapping_sub(_self,rhs) end + +---@param _self U16Vec2 +---@param rhs U16Vec2 +---@return BVec2 +function U16Vec2.cmpne(_self,rhs) end + +---@param p1 U16Vec2 +---@param p2 U16Vec2 +---@return U16Vec2 +function U16Vec2.sub(p1,p2) end + +---@param _self U16Vec2 +---@return integer +function U16Vec2.element_sum(_self) end + +---@param _self U16Vec2 +---@param rhs U16Vec2 +---@return U16Vec2 +function U16Vec2.min(_self,rhs) end + +---@param _self U16Vec2 +---@return I8Vec2 +function U16Vec2.as_i8vec2(_self) end + +---@param _self U16Vec2 +---@param rhs U16Vec2 +---@return U16Vec2 +function U16Vec2.sub(_self,rhs) end + +---@param _self U16Vec2 +---@return integer +function U16Vec2.max_element(_self) end + +---@param p1 U16Vec2 +---@param p2 U16Vec2 +---@return U16Vec2 +function U16Vec2.mul(p1,p2) end + +---@param _self U16Vec2 +---@param rhs U16Vec2 +---@return U16Vec2 +function U16Vec2.dot_into_vec(_self,rhs) end + +---@param p1 U16Vec2 +---@param p2 integer +---@return U16Vec2 +function U16Vec2.sub(p1,p2) end + +---@param _self U16Vec2 +---@param rhs U16Vec2 +---@return BVec2 +function U16Vec2.cmpge(_self,rhs) end + +---@param _self U16Vec2 +---@return I16Vec2 +function U16Vec2.as_i16vec2(_self) end + +---@param _self U16Vec2 +---@param min U16Vec2 +---@param max U16Vec2 +---@return U16Vec2 +function U16Vec2.clamp(_self,min,max) end + +---@param p1 U16Vec2 +---@param p2 integer +---@return U16Vec2 +function U16Vec2.mul(p1,p2) end + +---@param _self U16Vec2 +---@return UVec2 +function U16Vec2.as_uvec2(_self) end + +---@param _self U16Vec2 +---@param rhs U16Vec2 +---@return U16Vec2 +function U16Vec2.saturating_div(_self,rhs) end + +---@param v integer +---@return U16Vec2 +function U16Vec2.splat(v) end + +---@param _self U16Vec2 +---@param rhs U16Vec2 +---@return BVec2 +function U16Vec2.cmpgt(_self,rhs) end + +---@param _self U16Vec2 +---@param rhs U16Vec2 +---@return BVec2 +function U16Vec2.cmple(_self,rhs) end + +---@param _self U16Vec2 +---@param rhs U16Vec2 +---@return U16Vec2 +function U16Vec2.wrapping_div(_self,rhs) end + +---@param _self U16Vec2 +---@param rhs U16Vec2 +---@return U16Vec2 +function U16Vec2.max(_self,rhs) end + +---@param _self U16Vec2 +---@return integer +function U16Vec2.min_element(_self) end + +---@param mask BVec2 +---@param if_true U16Vec2 +---@param if_false U16Vec2 +---@return U16Vec2 +function U16Vec2.select(mask,if_true,if_false) end + +---@param _self U16Vec2 +---@param rhs U16Vec2 +---@return BVec2 +function U16Vec2.cmplt(_self,rhs) end + +---@param _self U16Vec2 +---@return integer +function U16Vec2.length_squared(_self) end + +---@param _self U16Vec2 +---@return I64Vec2 +function U16Vec2.as_i64vec2(_self) end + + + +---@class U16Vec3 : ReflectReference +---@field x ? integer +---@field y ? integer +---@field z ? integer +---@operator mul(integer): U16Vec3 +---@operator sub(integer): U16Vec3 +---@operator div(integer): U16Vec3 +---@operator add(U16Vec3): U16Vec3 +---@operator add(integer): U16Vec3 +---@operator mul(U16Vec3): U16Vec3 +---@operator mod(U16Vec3): U16Vec3 +---@operator add(U16Vec3): U16Vec3 +---@operator mod(integer): U16Vec3 +---@operator div(U16Vec3): U16Vec3 +---@operator mod(U16Vec3): U16Vec3 +---@operator sub(U16Vec3): U16Vec3 +---@operator div(U16Vec3): U16Vec3 +---@operator mul(U16Vec3): U16Vec3 +---@operator sub(U16Vec3): U16Vec3 +U16Vec3 = {} + +---@param p1 U16Vec3 +---@param p2 integer +---@return U16Vec3 +function U16Vec3.mul(p1,p2) end + +---@param _self U16Vec3 +---@return U64Vec3 +function U16Vec3.as_u64vec3(_self) end + +---@param p1 U16Vec3 +---@param p2 integer +---@return U16Vec3 +function U16Vec3.sub(p1,p2) end + +---@param _self U16Vec3 +---@return DVec3 +function U16Vec3.as_dvec3(_self) end + +---@param _self U16Vec3 +---@param rhs U16Vec3 +---@return U16Vec3 +function U16Vec3.wrapping_add(_self,rhs) end + +---@param _self U16Vec3 +---@return integer +function U16Vec3.min_element(_self) end + +---@param _self U16Vec3 +---@return Vec3 +function U16Vec3.as_vec3(_self) end + +---@param _self U16Vec3 +---@param rhs U16Vec3 +---@return BVec3 +function U16Vec3.cmpeq(_self,rhs) end + +---@param _self U16Vec3 +---@param rhs U16Vec3 +---@return U16Vec3 +function U16Vec3.wrapping_mul(_self,rhs) end + +---@param _self U16Vec3 +---@return nil +function U16Vec3.assert_receiver_is_total_eq(_self) end + +---@param _self U16Vec3 +---@param rhs U16Vec3 +---@return U16Vec3 +function U16Vec3.saturating_div(_self,rhs) end + +---@param _self U16Vec3 +---@return integer[] +function U16Vec3.to_array(_self) end + +---@param _self U16Vec3 +---@param rhs U16Vec3 +---@return U16Vec3 +function U16Vec3.dot_into_vec(_self,rhs) end + +---@param mask BVec3 +---@param if_true U16Vec3 +---@param if_false U16Vec3 +---@return U16Vec3 +function U16Vec3.select(mask,if_true,if_false) end + +---@param _self U16Vec3 +---@param rhs I16Vec3 +---@return U16Vec3 +function U16Vec3.saturating_add_signed(_self,rhs) end + +---@param _self U16Vec3 +---@param rhs U16Vec3 +---@return U16Vec3 +function U16Vec3.max(_self,rhs) end + +---@param _self U16Vec3 +---@return U16Vec2 +function U16Vec3.truncate(_self) end + +---@param _self U16Vec3 +---@param rhs U16Vec3 +---@return integer +function U16Vec3.dot(_self,rhs) end + +---@param p1 U16Vec3 +---@param p2 integer +---@return U16Vec3 +function U16Vec3.div(p1,p2) end + +---@param _self U16Vec3 +---@param rhs U16Vec3 +---@return U16Vec3 +function U16Vec3.add(_self,rhs) end + +---@param _self U16Vec3 +---@return integer +function U16Vec3.max_position(_self) end + +---@param _self U16Vec3 +---@param rhs U16Vec3 +---@return U16Vec3 +function U16Vec3.wrapping_sub(_self,rhs) end + +---@param _self U16Vec3 +---@param rhs U16Vec3 +---@return BVec3 +function U16Vec3.cmpne(_self,rhs) end + +---@param v integer +---@return U16Vec3 +function U16Vec3.splat(v) end + +---@param _self U16Vec3 +---@param min U16Vec3 +---@param max U16Vec3 +---@return U16Vec3 +function U16Vec3.clamp(_self,min,max) end + +---@param _self U16Vec3 +---@param rhs U16Vec3 +---@return U16Vec3 +function U16Vec3.min(_self,rhs) end + +---@param p1 U16Vec3 +---@param p2 integer +---@return U16Vec3 +function U16Vec3.add(p1,p2) end + +---@param _self U16Vec3 +---@param z integer +---@return U16Vec3 +function U16Vec3.with_z(_self,z) end + +---@param _self U16Vec3 +---@param rhs U16Vec3 +---@return U16Vec3 +function U16Vec3.mul(_self,rhs) end + +---@param _self U16Vec3 +---@return integer +function U16Vec3.min_position(_self) end + +---@param _self U16Vec3 +---@return U8Vec3 +function U16Vec3.as_u8vec3(_self) end + +---@param _self U16Vec3 +---@return integer +function U16Vec3.element_sum(_self) end + +---@param _self U16Vec3 +---@param rhs I16Vec3 +---@return U16Vec3 +function U16Vec3.wrapping_add_signed(_self,rhs) end + +---@param _self U16Vec3 +---@param rhs U16Vec3 +---@return integer +function U16Vec3.chebyshev_distance(_self,rhs) end + +---@param p1 U16Vec3 +---@param p2 U16Vec3 +---@return U16Vec3 +function U16Vec3.rem(p1,p2) end + +---@param p1 U16Vec3 +---@param p2 U16Vec3 +---@return U16Vec3 +function U16Vec3.add(p1,p2) end + +---@param p1 U16Vec3 +---@param p2 integer +---@return U16Vec3 +function U16Vec3.rem(p1,p2) end + +---@param _self U16Vec3 +---@return integer +function U16Vec3.element_product(_self) end + +---@param _self U16Vec3 +---@param rhs U16Vec3 +---@return BVec3 +function U16Vec3.cmplt(_self,rhs) end + +---@param _self U16Vec3 +---@return UVec3 +function U16Vec3.as_uvec3(_self) end + +---@param a integer[] +---@return U16Vec3 +function U16Vec3.from_array(a) end + +---@param _self U16Vec3 +---@param rhs U16Vec3 +---@return U16Vec3 +function U16Vec3.wrapping_div(_self,rhs) end + +---@param _self U16Vec3 +---@return I64Vec3 +function U16Vec3.as_i64vec3(_self) end + +---@param p1 U16Vec3 +---@param p2 U16Vec3 +---@return U16Vec3 +function U16Vec3.div(p1,p2) end + +---@param _self U16Vec3 +---@return I8Vec3 +function U16Vec3.as_i8vec3(_self) end + +---@param _self U16Vec3 +---@param rhs U16Vec3 +---@return U16Vec3 +function U16Vec3.rem(_self,rhs) end + +---@param _self U16Vec3 +---@param w integer +---@return U16Vec4 +function U16Vec3.extend(_self,w) end + +---@param _self U16Vec3 +---@param rhs U16Vec3 +---@return BVec3 +function U16Vec3.cmple(_self,rhs) end + +---@param _self U16Vec3 +---@return integer +function U16Vec3.length_squared(_self) end + +---@param _self U16Vec3 +---@param other U16Vec3 +---@return boolean +function U16Vec3.__eq(_self,other) end + +---@param _self U16Vec3 +---@param other U16Vec3 +---@return boolean +function U16Vec3.eq(_self,other) end + +---@param _self U16Vec3 +---@return integer +function U16Vec3.max_element(_self) end + +---@param _self U16Vec3 +---@return U16Vec3 +function U16Vec3.clone(_self) end + +---@param _self U16Vec3 +---@param rhs U16Vec3 +---@return BVec3 +function U16Vec3.cmpge(_self,rhs) end + +---@param _self U16Vec3 +---@param x integer +---@return U16Vec3 +function U16Vec3.with_x(_self,x) end + +---@param _self U16Vec3 +---@param rhs U16Vec3 +---@return integer | nil +function U16Vec3.checked_manhattan_distance(_self,rhs) end + +---@param _self U16Vec3 +---@param rhs U16Vec3 +---@return integer +function U16Vec3.manhattan_distance(_self,rhs) end + +---@param _self U16Vec3 +---@param y integer +---@return U16Vec3 +function U16Vec3.with_y(_self,y) end + +---@param _self U16Vec3 +---@param rhs U16Vec3 +---@return U16Vec3 +function U16Vec3.cross(_self,rhs) end + +---@param _self U16Vec3 +---@param rhs U16Vec3 +---@return U16Vec3 +function U16Vec3.saturating_add(_self,rhs) end + +---@param _self U16Vec3 +---@return I16Vec3 +function U16Vec3.as_i16vec3(_self) end + +---@param _self U16Vec3 +---@param rhs U16Vec3 +---@return BVec3 +function U16Vec3.cmpgt(_self,rhs) end + +---@param _self U16Vec3 +---@param rhs U16Vec3 +---@return U16Vec3 +function U16Vec3.saturating_mul(_self,rhs) end + +---@param _self U16Vec3 +---@return Vec3A +function U16Vec3.as_vec3a(_self) end + +---@param p1 U16Vec3 +---@param p2 U16Vec3 +---@return U16Vec3 +function U16Vec3.sub(p1,p2) end + +---@param x integer +---@param y integer +---@param z integer +---@return U16Vec3 +function U16Vec3.new(x,y,z) end + +---@param _self U16Vec3 +---@return IVec3 +function U16Vec3.as_ivec3(_self) end + +---@param _self U16Vec3 +---@param rhs U16Vec3 +---@return U16Vec3 +function U16Vec3.div(_self,rhs) end + +---@param p1 U16Vec3 +---@param p2 U16Vec3 +---@return U16Vec3 +function U16Vec3.mul(p1,p2) end + +---@param _self U16Vec3 +---@param rhs U16Vec3 +---@return U16Vec3 +function U16Vec3.sub(_self,rhs) end + +---@param _self U16Vec3 +---@param rhs U16Vec3 +---@return U16Vec3 +function U16Vec3.saturating_sub(_self,rhs) end + + + +---@class U16Vec4 : ReflectReference +---@field x ? integer +---@field y ? integer +---@field z ? integer +---@field w ? integer +---@operator sub(integer): U16Vec4 +---@operator add(integer): U16Vec4 +---@operator add(U16Vec4): U16Vec4 +---@operator div(U16Vec4): U16Vec4 +---@operator add(U16Vec4): U16Vec4 +---@operator mul(U16Vec4): U16Vec4 +---@operator div(integer): U16Vec4 +---@operator sub(U16Vec4): U16Vec4 +---@operator mul(U16Vec4): U16Vec4 +---@operator mod(integer): U16Vec4 +---@operator mod(U16Vec4): U16Vec4 +---@operator div(U16Vec4): U16Vec4 +---@operator sub(U16Vec4): U16Vec4 +---@operator mul(integer): U16Vec4 +---@operator mod(U16Vec4): U16Vec4 +U16Vec4 = {} + +---@param _self U16Vec4 +---@param rhs I16Vec4 +---@return U16Vec4 +function U16Vec4.saturating_add_signed(_self,rhs) end + +---@param _self U16Vec4 +---@param rhs U16Vec4 +---@return U16Vec4 +function U16Vec4.min(_self,rhs) end + +---@param _self U16Vec4 +---@param rhs U16Vec4 +---@return U16Vec4 +function U16Vec4.wrapping_add(_self,rhs) end + +---@param _self U16Vec4 +---@return I16Vec4 +function U16Vec4.as_i16vec4(_self) end + +---@param p1 U16Vec4 +---@param p2 integer +---@return U16Vec4 +function U16Vec4.sub(p1,p2) end + +---@param _self U16Vec4 +---@return integer +function U16Vec4.max_position(_self) end + +---@param _self U16Vec4 +---@param rhs U16Vec4 +---@return U16Vec4 +function U16Vec4.dot_into_vec(_self,rhs) end + +---@param _self U16Vec4 +---@return integer +function U16Vec4.min_element(_self) end + +---@param _self U16Vec4 +---@param rhs U16Vec4 +---@return integer +function U16Vec4.dot(_self,rhs) end + +---@param _self U16Vec4 +---@return nil +function U16Vec4.assert_receiver_is_total_eq(_self) end + +---@param _self U16Vec4 +---@return integer +function U16Vec4.element_product(_self) end + +---@param _self U16Vec4 +---@param rhs U16Vec4 +---@return U16Vec4 +function U16Vec4.saturating_mul(_self,rhs) end + +---@param _self U16Vec4 +---@return integer +function U16Vec4.min_position(_self) end + +---@param _self U16Vec4 +---@param rhs U16Vec4 +---@return BVec4 +function U16Vec4.cmplt(_self,rhs) end + +---@param _self U16Vec4 +---@return U16Vec4 +function U16Vec4.clone(_self) end + +---@param p1 U16Vec4 +---@param p2 integer +---@return U16Vec4 +function U16Vec4.add(p1,p2) end + +---@param _self U16Vec4 +---@return UVec4 +function U16Vec4.as_uvec4(_self) end + +---@param _self U16Vec4 +---@param rhs I16Vec4 +---@return U16Vec4 +function U16Vec4.wrapping_add_signed(_self,rhs) end + +---@param _self U16Vec4 +---@param rhs U16Vec4 +---@return BVec4 +function U16Vec4.cmpge(_self,rhs) end + +---@param _self U16Vec4 +---@param rhs U16Vec4 +---@return U16Vec4 +function U16Vec4.wrapping_div(_self,rhs) end + +---@param _self U16Vec4 +---@return integer[] +function U16Vec4.to_array(_self) end + +---@param _self U16Vec4 +---@param rhs U16Vec4 +---@return U16Vec4 +function U16Vec4.saturating_div(_self,rhs) end + +---@param _self U16Vec4 +---@param y integer +---@return U16Vec4 +function U16Vec4.with_y(_self,y) end + +---@param _self U16Vec4 +---@param rhs U16Vec4 +---@return U16Vec4 +function U16Vec4.add(_self,rhs) end + +---@param _self U16Vec4 +---@param rhs U16Vec4 +---@return BVec4 +function U16Vec4.cmpne(_self,rhs) end + +---@param _self U16Vec4 +---@param other U16Vec4 +---@return boolean +function U16Vec4.__eq(_self,other) end + +---@param _self U16Vec4 +---@param other U16Vec4 +---@return boolean +function U16Vec4.eq(_self,other) end + +---@param _self U16Vec4 +---@param rhs U16Vec4 +---@return U16Vec4 +function U16Vec4.saturating_add(_self,rhs) end + +---@param _self U16Vec4 +---@param rhs U16Vec4 +---@return integer | nil +function U16Vec4.checked_manhattan_distance(_self,rhs) end + +---@param p1 U16Vec4 +---@param p2 U16Vec4 +---@return U16Vec4 +function U16Vec4.div(p1,p2) end + +---@param _self U16Vec4 +---@param w integer +---@return U16Vec4 +function U16Vec4.with_w(_self,w) end + +---@param _self U16Vec4 +---@param rhs U16Vec4 +---@return U16Vec4 +function U16Vec4.wrapping_mul(_self,rhs) end + +---@param mask BVec4 +---@param if_true U16Vec4 +---@param if_false U16Vec4 +---@return U16Vec4 +function U16Vec4.select(mask,if_true,if_false) end + +---@param p1 U16Vec4 +---@param p2 U16Vec4 +---@return U16Vec4 +function U16Vec4.add(p1,p2) end + +---@param p1 U16Vec4 +---@param p2 U16Vec4 +---@return U16Vec4 +function U16Vec4.mul(p1,p2) end + +---@param p1 U16Vec4 +---@param p2 integer +---@return U16Vec4 +function U16Vec4.div(p1,p2) end + +---@param _self U16Vec4 +---@param rhs U16Vec4 +---@return U16Vec4 +function U16Vec4.saturating_sub(_self,rhs) end + +---@param p1 U16Vec4 +---@param p2 U16Vec4 +---@return U16Vec4 +function U16Vec4.sub(p1,p2) end + +---@param _self U16Vec4 +---@return I8Vec4 +function U16Vec4.as_i8vec4(_self) end + +---@param _self U16Vec4 +---@return integer +function U16Vec4.length_squared(_self) end + +---@param a integer[] +---@return U16Vec4 +function U16Vec4.from_array(a) end + +---@param _self U16Vec4 +---@param rhs U16Vec4 +---@return BVec4 +function U16Vec4.cmple(_self,rhs) end + +---@param _self U16Vec4 +---@return integer +function U16Vec4.element_sum(_self) end + +---@param _self U16Vec4 +---@param rhs U16Vec4 +---@return U16Vec4 +function U16Vec4.mul(_self,rhs) end + +---@param _self U16Vec4 +---@param rhs U16Vec4 +---@return integer +function U16Vec4.manhattan_distance(_self,rhs) end + +---@param _self U16Vec4 +---@param x integer +---@return U16Vec4 +function U16Vec4.with_x(_self,x) end + +---@param _self U16Vec4 +---@param min U16Vec4 +---@param max U16Vec4 +---@return U16Vec4 +function U16Vec4.clamp(_self,min,max) end + +---@param p1 U16Vec4 +---@param p2 integer +---@return U16Vec4 +function U16Vec4.rem(p1,p2) end + +---@param _self U16Vec4 +---@return Vec4 +function U16Vec4.as_vec4(_self) end + +---@param _self U16Vec4 +---@return integer +function U16Vec4.max_element(_self) end + +---@param _self U16Vec4 +---@param rhs U16Vec4 +---@return U16Vec4 +function U16Vec4.wrapping_sub(_self,rhs) end + +---@param _self U16Vec4 +---@param z integer +---@return U16Vec4 +function U16Vec4.with_z(_self,z) end + +---@param _self U16Vec4 +---@param rhs U16Vec4 +---@return U16Vec4 +function U16Vec4.rem(_self,rhs) end + +---@param _self U16Vec4 +---@return U8Vec4 +function U16Vec4.as_u8vec4(_self) end + +---@param _self U16Vec4 +---@return U16Vec3 +function U16Vec4.truncate(_self) end + +---@param _self U16Vec4 +---@param rhs U16Vec4 +---@return BVec4 +function U16Vec4.cmpgt(_self,rhs) end + +---@param _self U16Vec4 +---@param rhs U16Vec4 +---@return U16Vec4 +function U16Vec4.max(_self,rhs) end + +---@param _self U16Vec4 +---@return U64Vec4 +function U16Vec4.as_u64vec4(_self) end + +---@param _self U16Vec4 +---@param rhs U16Vec4 +---@return U16Vec4 +function U16Vec4.div(_self,rhs) end + +---@param _self U16Vec4 +---@param rhs U16Vec4 +---@return BVec4 +function U16Vec4.cmpeq(_self,rhs) end + +---@param _self U16Vec4 +---@return I64Vec4 +function U16Vec4.as_i64vec4(_self) end + +---@param _self U16Vec4 +---@param rhs U16Vec4 +---@return integer +function U16Vec4.chebyshev_distance(_self,rhs) end + +---@param _self U16Vec4 +---@param rhs U16Vec4 +---@return U16Vec4 +function U16Vec4.sub(_self,rhs) end + +---@param v integer +---@return U16Vec4 +function U16Vec4.splat(v) end + +---@param _self U16Vec4 +---@return DVec4 +function U16Vec4.as_dvec4(_self) end + +---@param p1 U16Vec4 +---@param p2 integer +---@return U16Vec4 +function U16Vec4.mul(p1,p2) end + +---@param p1 U16Vec4 +---@param p2 U16Vec4 +---@return U16Vec4 +function U16Vec4.rem(p1,p2) end + +---@param _self U16Vec4 +---@return IVec4 +function U16Vec4.as_ivec4(_self) end + +---@param x integer +---@param y integer +---@param z integer +---@param w integer +---@return U16Vec4 +function U16Vec4.new(x,y,z,w) end + + + +---@class U64Vec2 : ReflectReference +---@field x ? integer +---@field y ? integer +---@operator mul(U64Vec2): U64Vec2 +---@operator mod(integer): U64Vec2 +---@operator sub(integer): U64Vec2 +---@operator add(integer): U64Vec2 +---@operator sub(U64Vec2): U64Vec2 +---@operator mul(integer): U64Vec2 +---@operator div(integer): U64Vec2 +---@operator add(U64Vec2): U64Vec2 +---@operator mod(U64Vec2): U64Vec2 +---@operator add(U64Vec2): U64Vec2 +---@operator div(U64Vec2): U64Vec2 +---@operator mod(U64Vec2): U64Vec2 +---@operator sub(U64Vec2): U64Vec2 +---@operator div(U64Vec2): U64Vec2 +---@operator mul(U64Vec2): U64Vec2 +U64Vec2 = {} + +---@param _self U64Vec2 +---@param rhs U64Vec2 +---@return U64Vec2 +function U64Vec2.mul(_self,rhs) end + +---@param _self U64Vec2 +---@return I8Vec2 +function U64Vec2.as_i8vec2(_self) end + +---@param _self U64Vec2 +---@param rhs U64Vec2 +---@return integer +function U64Vec2.chebyshev_distance(_self,rhs) end + +---@param p1 U64Vec2 +---@param p2 integer +---@return U64Vec2 +function U64Vec2.rem(p1,p2) end + +---@param _self U64Vec2 +---@param rhs I64Vec2 +---@return U64Vec2 +function U64Vec2.saturating_add_signed(_self,rhs) end + +---@param _self U64Vec2 +---@param y integer +---@return U64Vec2 +function U64Vec2.with_y(_self,y) end + +---@param _self U64Vec2 +---@param rhs U64Vec2 +---@return U64Vec2 +function U64Vec2.saturating_div(_self,rhs) end + +---@param _self U64Vec2 +---@return U8Vec2 +function U64Vec2.as_u8vec2(_self) end + +---@param a integer[] +---@return U64Vec2 +function U64Vec2.from_array(a) end + +---@param _self U64Vec2 +---@return integer +function U64Vec2.element_sum(_self) end + +---@param _self U64Vec2 +---@param z integer +---@return U64Vec3 +function U64Vec2.extend(_self,z) end + +---@param _self U64Vec2 +---@return UVec2 +function U64Vec2.as_uvec2(_self) end + +---@param _self U64Vec2 +---@param rhs I64Vec2 +---@return U64Vec2 +function U64Vec2.wrapping_add_signed(_self,rhs) end + +---@param _self U64Vec2 +---@param min U64Vec2 +---@param max U64Vec2 +---@return U64Vec2 +function U64Vec2.clamp(_self,min,max) end + +---@param _self U64Vec2 +---@return U16Vec2 +function U64Vec2.as_u16vec2(_self) end + +---@param _self U64Vec2 +---@param rhs U64Vec2 +---@return U64Vec2 +function U64Vec2.wrapping_add(_self,rhs) end + +---@param _self U64Vec2 +---@return nil +function U64Vec2.assert_receiver_is_total_eq(_self) end + +---@param _self U64Vec2 +---@param other U64Vec2 +---@return boolean +function U64Vec2.__eq(_self,other) end + +---@param _self U64Vec2 +---@param other U64Vec2 +---@return boolean +function U64Vec2.eq(_self,other) end + +---@param _self U64Vec2 +---@param rhs U64Vec2 +---@return U64Vec2 +function U64Vec2.wrapping_sub(_self,rhs) end + +---@param _self U64Vec2 +---@param rhs U64Vec2 +---@return integer | nil +function U64Vec2.checked_manhattan_distance(_self,rhs) end + +---@param p1 U64Vec2 +---@param p2 integer +---@return U64Vec2 +function U64Vec2.sub(p1,p2) end + +---@param _self U64Vec2 +---@return I64Vec2 +function U64Vec2.as_i64vec2(_self) end + +---@param _self U64Vec2 +---@param rhs U64Vec2 +---@return BVec2 +function U64Vec2.cmpne(_self,rhs) end + +---@param _self U64Vec2 +---@return I16Vec2 +function U64Vec2.as_i16vec2(_self) end + +---@param p1 U64Vec2 +---@param p2 integer +---@return U64Vec2 +function U64Vec2.add(p1,p2) end + +---@param _self U64Vec2 +---@param rhs U64Vec2 +---@return BVec2 +function U64Vec2.cmplt(_self,rhs) end + +---@param _self U64Vec2 +---@param rhs U64Vec2 +---@return U64Vec2 +function U64Vec2.sub(_self,rhs) end + +---@param _self U64Vec2 +---@param rhs U64Vec2 +---@return U64Vec2 +function U64Vec2.dot_into_vec(_self,rhs) end + +---@param p1 U64Vec2 +---@param p2 integer +---@return U64Vec2 +function U64Vec2.mul(p1,p2) end + +---@param _self U64Vec2 +---@param rhs U64Vec2 +---@return integer +function U64Vec2.dot(_self,rhs) end + +---@param _self U64Vec2 +---@return integer +function U64Vec2.max_position(_self) end + +---@param p1 U64Vec2 +---@param p2 integer +---@return U64Vec2 +function U64Vec2.div(p1,p2) end + +---@param _self U64Vec2 +---@return integer +function U64Vec2.min_element(_self) end + +---@param _self U64Vec2 +---@return integer +function U64Vec2.max_element(_self) end + +---@param p1 U64Vec2 +---@param p2 U64Vec2 +---@return U64Vec2 +function U64Vec2.add(p1,p2) end + +---@param _self U64Vec2 +---@return integer +function U64Vec2.element_product(_self) end + +---@param _self U64Vec2 +---@param rhs U64Vec2 +---@return U64Vec2 +function U64Vec2.rem(_self,rhs) end + +---@param _self U64Vec2 +---@param rhs U64Vec2 +---@return U64Vec2 +function U64Vec2.add(_self,rhs) end + +---@param _self U64Vec2 +---@param rhs U64Vec2 +---@return U64Vec2 +function U64Vec2.div(_self,rhs) end + +---@param _self U64Vec2 +---@return Vec2 +function U64Vec2.as_vec2(_self) end + +---@param _self U64Vec2 +---@param rhs U64Vec2 +---@return integer +function U64Vec2.manhattan_distance(_self,rhs) end + +---@param _self U64Vec2 +---@param rhs U64Vec2 +---@return BVec2 +function U64Vec2.cmple(_self,rhs) end + +---@param p1 U64Vec2 +---@param p2 U64Vec2 +---@return U64Vec2 +function U64Vec2.rem(p1,p2) end + +---@param v integer +---@return U64Vec2 +function U64Vec2.splat(v) end + +---@param mask BVec2 +---@param if_true U64Vec2 +---@param if_false U64Vec2 +---@return U64Vec2 +function U64Vec2.select(mask,if_true,if_false) end + +---@param x integer +---@param y integer +---@return U64Vec2 +function U64Vec2.new(x,y) end + +---@param _self U64Vec2 +---@return integer +function U64Vec2.min_position(_self) end + +---@param _self U64Vec2 +---@param rhs U64Vec2 +---@return U64Vec2 +function U64Vec2.wrapping_div(_self,rhs) end + +---@param _self U64Vec2 +---@param rhs U64Vec2 +---@return U64Vec2 +function U64Vec2.max(_self,rhs) end + +---@param _self U64Vec2 +---@param x integer +---@return U64Vec2 +function U64Vec2.with_x(_self,x) end + +---@param _self U64Vec2 +---@param rhs U64Vec2 +---@return U64Vec2 +function U64Vec2.saturating_sub(_self,rhs) end + +---@param _self U64Vec2 +---@param rhs U64Vec2 +---@return U64Vec2 +function U64Vec2.saturating_add(_self,rhs) end + +---@param _self U64Vec2 +---@param rhs U64Vec2 +---@return U64Vec2 +function U64Vec2.wrapping_mul(_self,rhs) end + +---@param _self U64Vec2 +---@param rhs U64Vec2 +---@return BVec2 +function U64Vec2.cmpgt(_self,rhs) end + +---@param p1 U64Vec2 +---@param p2 U64Vec2 +---@return U64Vec2 +function U64Vec2.sub(p1,p2) end + +---@param _self U64Vec2 +---@return IVec2 +function U64Vec2.as_ivec2(_self) end + +---@param p1 U64Vec2 +---@param p2 U64Vec2 +---@return U64Vec2 +function U64Vec2.div(p1,p2) end + +---@param _self U64Vec2 +---@param rhs U64Vec2 +---@return U64Vec2 +function U64Vec2.min(_self,rhs) end + +---@param _self U64Vec2 +---@param rhs U64Vec2 +---@return U64Vec2 +function U64Vec2.saturating_mul(_self,rhs) end + +---@param _self U64Vec2 +---@return DVec2 +function U64Vec2.as_dvec2(_self) end + +---@param _self U64Vec2 +---@return integer +function U64Vec2.length_squared(_self) end + +---@param _self U64Vec2 +---@param rhs U64Vec2 +---@return BVec2 +function U64Vec2.cmpge(_self,rhs) end + +---@param _self U64Vec2 +---@param rhs U64Vec2 +---@return BVec2 +function U64Vec2.cmpeq(_self,rhs) end + +---@param p1 U64Vec2 +---@param p2 U64Vec2 +---@return U64Vec2 +function U64Vec2.mul(p1,p2) end + +---@param _self U64Vec2 +---@return U64Vec2 +function U64Vec2.clone(_self) end + +---@param _self U64Vec2 +---@return integer[] +function U64Vec2.to_array(_self) end + + + +---@class U64Vec3 : ReflectReference +---@field x ? integer +---@field y ? integer +---@field z ? integer +---@operator mul(integer): U64Vec3 +---@operator add(U64Vec3): U64Vec3 +---@operator div(integer): U64Vec3 +---@operator mul(U64Vec3): U64Vec3 +---@operator mul(U64Vec3): U64Vec3 +---@operator div(U64Vec3): U64Vec3 +---@operator mod(integer): U64Vec3 +---@operator sub(U64Vec3): U64Vec3 +---@operator add(integer): U64Vec3 +---@operator mod(U64Vec3): U64Vec3 +---@operator add(U64Vec3): U64Vec3 +---@operator sub(integer): U64Vec3 +---@operator sub(U64Vec3): U64Vec3 +---@operator mod(U64Vec3): U64Vec3 +---@operator div(U64Vec3): U64Vec3 +U64Vec3 = {} + +---@param a integer[] +---@return U64Vec3 +function U64Vec3.from_array(a) end + +---@param _self U64Vec3 +---@return integer +function U64Vec3.max_element(_self) end + +---@param _self U64Vec3 +---@param rhs U64Vec3 +---@return U64Vec3 +function U64Vec3.cross(_self,rhs) end + +---@param _self U64Vec3 +---@param rhs U64Vec3 +---@return U64Vec3 +function U64Vec3.saturating_div(_self,rhs) end + +---@param p1 U64Vec3 +---@param p2 integer +---@return U64Vec3 +function U64Vec3.mul(p1,p2) end + +---@param _self U64Vec3 +---@param rhs U64Vec3 +---@return U64Vec3 +function U64Vec3.add(_self,rhs) end + +---@param _self U64Vec3 +---@return integer +function U64Vec3.element_sum(_self) end + +---@param p1 U64Vec3 +---@param p2 integer +---@return U64Vec3 +function U64Vec3.div(p1,p2) end + +---@param _self U64Vec3 +---@param rhs U64Vec3 +---@return U64Vec3 +function U64Vec3.mul(_self,rhs) end + +---@param _self U64Vec3 +---@param rhs U64Vec3 +---@return U64Vec3 +function U64Vec3.wrapping_add(_self,rhs) end + +---@param _self U64Vec3 +---@return integer +function U64Vec3.element_product(_self) end + +---@param p1 U64Vec3 +---@param p2 U64Vec3 +---@return U64Vec3 +function U64Vec3.mul(p1,p2) end + +---@param _self U64Vec3 +---@param rhs U64Vec3 +---@return U64Vec3 +function U64Vec3.wrapping_mul(_self,rhs) end + +---@param _self U64Vec3 +---@param x integer +---@return U64Vec3 +function U64Vec3.with_x(_self,x) end + +---@param _self U64Vec3 +---@param rhs U64Vec3 +---@return U64Vec3 +function U64Vec3.saturating_add(_self,rhs) end + +---@param _self U64Vec3 +---@param rhs U64Vec3 +---@return U64Vec3 +function U64Vec3.div(_self,rhs) end + +---@param _self U64Vec3 +---@param rhs U64Vec3 +---@return U64Vec3 +function U64Vec3.dot_into_vec(_self,rhs) end + +---@param _self U64Vec3 +---@return Vec3 +function U64Vec3.as_vec3(_self) end + +---@param _self U64Vec3 +---@return integer[] +function U64Vec3.to_array(_self) end + +---@param _self U64Vec3 +---@param rhs U64Vec3 +---@return U64Vec3 +function U64Vec3.wrapping_sub(_self,rhs) end + +---@param _self U64Vec3 +---@param rhs U64Vec3 +---@return integer +function U64Vec3.dot(_self,rhs) end + +---@param p1 U64Vec3 +---@param p2 integer +---@return U64Vec3 +function U64Vec3.rem(p1,p2) end + +---@param _self U64Vec3 +---@param rhs U64Vec3 +---@return integer | nil +function U64Vec3.checked_manhattan_distance(_self,rhs) end + +---@param _self U64Vec3 +---@param other U64Vec3 +---@return boolean +function U64Vec3.__eq(_self,other) end + +---@param _self U64Vec3 +---@param other U64Vec3 +---@return boolean +function U64Vec3.eq(_self,other) end + +---@param _self U64Vec3 +---@return UVec3 +function U64Vec3.as_uvec3(_self) end + +---@param v integer +---@return U64Vec3 +function U64Vec3.splat(v) end + +---@param _self U64Vec3 +---@param rhs U64Vec3 +---@return U64Vec3 +function U64Vec3.sub(_self,rhs) end + +---@param _self U64Vec3 +---@return DVec3 +function U64Vec3.as_dvec3(_self) end + +---@param p1 U64Vec3 +---@param p2 integer +---@return U64Vec3 +function U64Vec3.add(p1,p2) end + +---@param _self U64Vec3 +---@param rhs U64Vec3 +---@return integer +function U64Vec3.chebyshev_distance(_self,rhs) end + +---@param _self U64Vec3 +---@return U8Vec3 +function U64Vec3.as_u8vec3(_self) end + +---@param _self U64Vec3 +---@param rhs I64Vec3 +---@return U64Vec3 +function U64Vec3.wrapping_add_signed(_self,rhs) end + +---@param _self U64Vec3 +---@param rhs U64Vec3 +---@return BVec3 +function U64Vec3.cmpne(_self,rhs) end + +---@param _self U64Vec3 +---@param rhs U64Vec3 +---@return BVec3 +function U64Vec3.cmpge(_self,rhs) end + +---@param _self U64Vec3 +---@param rhs U64Vec3 +---@return U64Vec3 +function U64Vec3.rem(_self,rhs) end + +---@param _self U64Vec3 +---@param rhs U64Vec3 +---@return U64Vec3 +function U64Vec3.wrapping_div(_self,rhs) end + +---@param _self U64Vec3 +---@return I8Vec3 +function U64Vec3.as_i8vec3(_self) end + +---@param _self U64Vec3 +---@return U16Vec3 +function U64Vec3.as_u16vec3(_self) end + +---@param _self U64Vec3 +---@return integer +function U64Vec3.min_element(_self) end + +---@param _self U64Vec3 +---@param rhs U64Vec3 +---@return U64Vec3 +function U64Vec3.min(_self,rhs) end + +---@param _self U64Vec3 +---@param rhs I64Vec3 +---@return U64Vec3 +function U64Vec3.saturating_add_signed(_self,rhs) end + +---@param _self U64Vec3 +---@param rhs U64Vec3 +---@return U64Vec3 +function U64Vec3.max(_self,rhs) end + +---@param _self U64Vec3 +---@return U64Vec3 +function U64Vec3.clone(_self) end + +---@param _self U64Vec3 +---@param rhs U64Vec3 +---@return U64Vec3 +function U64Vec3.saturating_sub(_self,rhs) end + +---@param _self U64Vec3 +---@return integer +function U64Vec3.length_squared(_self) end + +---@param _self U64Vec3 +---@param rhs U64Vec3 +---@return BVec3 +function U64Vec3.cmpgt(_self,rhs) end + +---@param p1 U64Vec3 +---@param p2 U64Vec3 +---@return U64Vec3 +function U64Vec3.add(p1,p2) end + +---@param _self U64Vec3 +---@return I16Vec3 +function U64Vec3.as_i16vec3(_self) end + +---@param _self U64Vec3 +---@param rhs U64Vec3 +---@return U64Vec3 +function U64Vec3.saturating_mul(_self,rhs) end + +---@param p1 U64Vec3 +---@param p2 integer +---@return U64Vec3 +function U64Vec3.sub(p1,p2) end + +---@param _self U64Vec3 +---@return IVec3 +function U64Vec3.as_ivec3(_self) end + +---@param _self U64Vec3 +---@param y integer +---@return U64Vec3 +function U64Vec3.with_y(_self,y) end + +---@param _self U64Vec3 +---@return integer +function U64Vec3.max_position(_self) end + +---@param _self U64Vec3 +---@return Vec3A +function U64Vec3.as_vec3a(_self) end + +---@param mask BVec3 +---@param if_true U64Vec3 +---@param if_false U64Vec3 +---@return U64Vec3 +function U64Vec3.select(mask,if_true,if_false) end + +---@param _self U64Vec3 +---@return I64Vec3 +function U64Vec3.as_i64vec3(_self) end + +---@param _self U64Vec3 +---@param min U64Vec3 +---@param max U64Vec3 +---@return U64Vec3 +function U64Vec3.clamp(_self,min,max) end + +---@param _self U64Vec3 +---@return U64Vec2 +function U64Vec3.truncate(_self) end + +---@param _self U64Vec3 +---@return integer +function U64Vec3.min_position(_self) end + +---@param _self U64Vec3 +---@param rhs U64Vec3 +---@return BVec3 +function U64Vec3.cmple(_self,rhs) end + +---@param _self U64Vec3 +---@param rhs U64Vec3 +---@return BVec3 +function U64Vec3.cmpeq(_self,rhs) end + +---@param p1 U64Vec3 +---@param p2 U64Vec3 +---@return U64Vec3 +function U64Vec3.sub(p1,p2) end + +---@param _self U64Vec3 +---@param rhs U64Vec3 +---@return integer +function U64Vec3.manhattan_distance(_self,rhs) end + +---@param _self U64Vec3 +---@param w integer +---@return U64Vec4 +function U64Vec3.extend(_self,w) end + +---@param p1 U64Vec3 +---@param p2 U64Vec3 +---@return U64Vec3 +function U64Vec3.rem(p1,p2) end + +---@param x integer +---@param y integer +---@param z integer +---@return U64Vec3 +function U64Vec3.new(x,y,z) end + +---@param _self U64Vec3 +---@return nil +function U64Vec3.assert_receiver_is_total_eq(_self) end + +---@param p1 U64Vec3 +---@param p2 U64Vec3 +---@return U64Vec3 +function U64Vec3.div(p1,p2) end + +---@param _self U64Vec3 +---@param rhs U64Vec3 +---@return BVec3 +function U64Vec3.cmplt(_self,rhs) end + +---@param _self U64Vec3 +---@param z integer +---@return U64Vec3 +function U64Vec3.with_z(_self,z) end + + + +---@class U64Vec4 : ReflectReference +---@field x ? integer +---@field y ? integer +---@field z ? integer +---@field w ? integer +---@operator mod(integer): U64Vec4 +---@operator sub(integer): U64Vec4 +---@operator mod(U64Vec4): U64Vec4 +---@operator sub(U64Vec4): U64Vec4 +---@operator div(U64Vec4): U64Vec4 +---@operator add(U64Vec4): U64Vec4 +---@operator add(U64Vec4): U64Vec4 +---@operator mod(U64Vec4): U64Vec4 +---@operator sub(U64Vec4): U64Vec4 +---@operator mul(U64Vec4): U64Vec4 +---@operator div(U64Vec4): U64Vec4 +---@operator mul(integer): U64Vec4 +---@operator div(integer): U64Vec4 +---@operator add(integer): U64Vec4 +---@operator mul(U64Vec4): U64Vec4 +U64Vec4 = {} + +---@param _self U64Vec4 +---@param w integer +---@return U64Vec4 +function U64Vec4.with_w(_self,w) end + +---@param _self U64Vec4 +---@param rhs U64Vec4 +---@return U64Vec4 +function U64Vec4.max(_self,rhs) end + +---@param _self U64Vec4 +---@param rhs U64Vec4 +---@return U64Vec4 +function U64Vec4.saturating_add(_self,rhs) end + +---@param _self U64Vec4 +---@return integer +function U64Vec4.element_sum(_self) end + +---@param _self U64Vec4 +---@param rhs U64Vec4 +---@return U64Vec4 +function U64Vec4.min(_self,rhs) end + +---@param _self U64Vec4 +---@param rhs U64Vec4 +---@return U64Vec4 +function U64Vec4.wrapping_div(_self,rhs) end + +---@param _self U64Vec4 +---@return nil +function U64Vec4.assert_receiver_is_total_eq(_self) end + +---@param _self U64Vec4 +---@return integer +function U64Vec4.length_squared(_self) end + +---@param _self U64Vec4 +---@param rhs U64Vec4 +---@return integer +function U64Vec4.chebyshev_distance(_self,rhs) end + +---@param _self U64Vec4 +---@param x integer +---@return U64Vec4 +function U64Vec4.with_x(_self,x) end + +---@param v integer +---@return U64Vec4 +function U64Vec4.splat(v) end + +---@param p1 U64Vec4 +---@param p2 integer +---@return U64Vec4 +function U64Vec4.rem(p1,p2) end + +---@param p1 U64Vec4 +---@param p2 integer +---@return U64Vec4 +function U64Vec4.sub(p1,p2) end + +---@param _self U64Vec4 +---@return integer +function U64Vec4.element_product(_self) end + +---@param _self U64Vec4 +---@return U16Vec4 +function U64Vec4.as_u16vec4(_self) end + +---@param _self U64Vec4 +---@param rhs U64Vec4 +---@return U64Vec4 +function U64Vec4.wrapping_add(_self,rhs) end + +---@param _self U64Vec4 +---@param rhs U64Vec4 +---@return U64Vec4 +function U64Vec4.rem(_self,rhs) end + +---@param _self U64Vec4 +---@return U8Vec4 +function U64Vec4.as_u8vec4(_self) end + +---@param p1 U64Vec4 +---@param p2 U64Vec4 +---@return U64Vec4 +function U64Vec4.sub(p1,p2) end + +---@param mask BVec4 +---@param if_true U64Vec4 +---@param if_false U64Vec4 +---@return U64Vec4 +function U64Vec4.select(mask,if_true,if_false) end + +---@param _self U64Vec4 +---@return DVec4 +function U64Vec4.as_dvec4(_self) end + +---@param _self U64Vec4 +---@param rhs I64Vec4 +---@return U64Vec4 +function U64Vec4.saturating_add_signed(_self,rhs) end + +---@param _self U64Vec4 +---@return U64Vec4 +function U64Vec4.clone(_self) end + +---@param _self U64Vec4 +---@param rhs U64Vec4 +---@return U64Vec4 +function U64Vec4.div(_self,rhs) end + +---@param _self U64Vec4 +---@param rhs U64Vec4 +---@return U64Vec4 +function U64Vec4.saturating_sub(_self,rhs) end + +---@param _self U64Vec4 +---@param rhs U64Vec4 +---@return U64Vec4 +function U64Vec4.add(_self,rhs) end + +---@param _self U64Vec4 +---@param min U64Vec4 +---@param max U64Vec4 +---@return U64Vec4 +function U64Vec4.clamp(_self,min,max) end + +---@param p1 U64Vec4 +---@param p2 U64Vec4 +---@return U64Vec4 +function U64Vec4.add(p1,p2) end + +---@param _self U64Vec4 +---@param rhs U64Vec4 +---@return integer | nil +function U64Vec4.checked_manhattan_distance(_self,rhs) end + +---@param _self U64Vec4 +---@param rhs U64Vec4 +---@return integer +function U64Vec4.manhattan_distance(_self,rhs) end + +---@param _self U64Vec4 +---@param rhs U64Vec4 +---@return BVec4 +function U64Vec4.cmpne(_self,rhs) end + +---@param _self U64Vec4 +---@return UVec4 +function U64Vec4.as_uvec4(_self) end + +---@param p1 U64Vec4 +---@param p2 U64Vec4 +---@return U64Vec4 +function U64Vec4.rem(p1,p2) end + +---@param _self U64Vec4 +---@param rhs U64Vec4 +---@return BVec4 +function U64Vec4.cmpeq(_self,rhs) end + +---@param _self U64Vec4 +---@return integer +function U64Vec4.max_position(_self) end + +---@param _self U64Vec4 +---@param other U64Vec4 +---@return boolean +function U64Vec4.__eq(_self,other) end + +---@param _self U64Vec4 +---@param other U64Vec4 +---@return boolean +function U64Vec4.eq(_self,other) end + +---@param _self U64Vec4 +---@param rhs U64Vec4 +---@return BVec4 +function U64Vec4.cmple(_self,rhs) end + +---@param _self U64Vec4 +---@return Vec4 +function U64Vec4.as_vec4(_self) end + +---@param _self U64Vec4 +---@param rhs U64Vec4 +---@return BVec4 +function U64Vec4.cmpgt(_self,rhs) end + +---@param _self U64Vec4 +---@param rhs U64Vec4 +---@return U64Vec4 +function U64Vec4.sub(_self,rhs) end + +---@param _self U64Vec4 +---@param rhs U64Vec4 +---@return U64Vec4 +function U64Vec4.mul(_self,rhs) end + +---@param _self U64Vec4 +---@param rhs U64Vec4 +---@return integer +function U64Vec4.dot(_self,rhs) end + +---@param x integer +---@param y integer +---@param z integer +---@param w integer +---@return U64Vec4 +function U64Vec4.new(x,y,z,w) end + +---@param _self U64Vec4 +---@param rhs U64Vec4 +---@return U64Vec4 +function U64Vec4.saturating_div(_self,rhs) end + +---@param p1 U64Vec4 +---@param p2 U64Vec4 +---@return U64Vec4 +function U64Vec4.div(p1,p2) end + +---@param _self U64Vec4 +---@return integer[] +function U64Vec4.to_array(_self) end + +---@param _self U64Vec4 +---@param rhs I64Vec4 +---@return U64Vec4 +function U64Vec4.wrapping_add_signed(_self,rhs) end + +---@param p1 U64Vec4 +---@param p2 integer +---@return U64Vec4 +function U64Vec4.mul(p1,p2) end + +---@param _self U64Vec4 +---@return I16Vec4 +function U64Vec4.as_i16vec4(_self) end + +---@param _self U64Vec4 +---@param rhs U64Vec4 +---@return U64Vec4 +function U64Vec4.wrapping_mul(_self,rhs) end + +---@param p1 U64Vec4 +---@param p2 integer +---@return U64Vec4 +function U64Vec4.div(p1,p2) end + +---@param _self U64Vec4 +---@param rhs U64Vec4 +---@return U64Vec4 +function U64Vec4.saturating_mul(_self,rhs) end + +---@param _self U64Vec4 +---@param rhs U64Vec4 +---@return BVec4 +function U64Vec4.cmpge(_self,rhs) end + +---@param p1 U64Vec4 +---@param p2 integer +---@return U64Vec4 +function U64Vec4.add(p1,p2) end + +---@param a integer[] +---@return U64Vec4 +function U64Vec4.from_array(a) end + +---@param _self U64Vec4 +---@param rhs U64Vec4 +---@return U64Vec4 +function U64Vec4.wrapping_sub(_self,rhs) end + +---@param _self U64Vec4 +---@return integer +function U64Vec4.max_element(_self) end + +---@param _self U64Vec4 +---@return I64Vec4 +function U64Vec4.as_i64vec4(_self) end + +---@param _self U64Vec4 +---@return integer +function U64Vec4.min_element(_self) end + +---@param _self U64Vec4 +---@return IVec4 +function U64Vec4.as_ivec4(_self) end + +---@param _self U64Vec4 +---@return I8Vec4 +function U64Vec4.as_i8vec4(_self) end + +---@param _self U64Vec4 +---@return integer +function U64Vec4.min_position(_self) end + +---@param _self U64Vec4 +---@param y integer +---@return U64Vec4 +function U64Vec4.with_y(_self,y) end + +---@param _self U64Vec4 +---@return U64Vec3 +function U64Vec4.truncate(_self) end + +---@param p1 U64Vec4 +---@param p2 U64Vec4 +---@return U64Vec4 +function U64Vec4.mul(p1,p2) end + +---@param _self U64Vec4 +---@param rhs U64Vec4 +---@return BVec4 +function U64Vec4.cmplt(_self,rhs) end + +---@param _self U64Vec4 +---@param z integer +---@return U64Vec4 +function U64Vec4.with_z(_self,z) end + +---@param _self U64Vec4 +---@param rhs U64Vec4 +---@return U64Vec4 +function U64Vec4.dot_into_vec(_self,rhs) end + + + +---@class U8Vec2 : ReflectReference +---@field x ? integer +---@field y ? integer +---@operator mod(integer): U8Vec2 +---@operator mod(U8Vec2): U8Vec2 +---@operator div(integer): U8Vec2 +---@operator mod(U8Vec2): U8Vec2 +---@operator sub(U8Vec2): U8Vec2 +---@operator add(integer): U8Vec2 +---@operator mul(U8Vec2): U8Vec2 +---@operator sub(integer): U8Vec2 +---@operator div(U8Vec2): U8Vec2 +---@operator add(U8Vec2): U8Vec2 +---@operator sub(U8Vec2): U8Vec2 +---@operator mul(U8Vec2): U8Vec2 +---@operator mul(integer): U8Vec2 +---@operator add(U8Vec2): U8Vec2 +---@operator div(U8Vec2): U8Vec2 +U8Vec2 = {} + +---@param _self U8Vec2 +---@return UVec2 +function U8Vec2.as_uvec2(_self) end + +---@param _self U8Vec2 +---@param z integer +---@return U8Vec3 +function U8Vec2.extend(_self,z) end + +---@param _self U8Vec2 +---@param rhs I8Vec2 +---@return U8Vec2 +function U8Vec2.saturating_add_signed(_self,rhs) end + +---@param _self U8Vec2 +---@param rhs U8Vec2 +---@return BVec2 +function U8Vec2.cmple(_self,rhs) end + +---@param mask BVec2 +---@param if_true U8Vec2 +---@param if_false U8Vec2 +---@return U8Vec2 +function U8Vec2.select(mask,if_true,if_false) end + +---@param _self U8Vec2 +---@return integer +function U8Vec2.element_sum(_self) end + +---@param _self U8Vec2 +---@param rhs U8Vec2 +---@return BVec2 +function U8Vec2.cmpgt(_self,rhs) end + +---@param _self U8Vec2 +---@return IVec2 +function U8Vec2.as_ivec2(_self) end + +---@param _self U8Vec2 +---@param rhs U8Vec2 +---@return U8Vec2 +function U8Vec2.saturating_sub(_self,rhs) end + +---@param _self U8Vec2 +---@return integer +function U8Vec2.min_element(_self) end + +---@param p1 U8Vec2 +---@param p2 integer +---@return U8Vec2 +function U8Vec2.rem(p1,p2) end + +---@param _self U8Vec2 +---@param rhs U8Vec2 +---@return U8Vec2 +function U8Vec2.wrapping_sub(_self,rhs) end + +---@param _self U8Vec2 +---@param rhs U8Vec2 +---@return integer +function U8Vec2.chebyshev_distance(_self,rhs) end + +---@param p1 U8Vec2 +---@param p2 U8Vec2 +---@return U8Vec2 +function U8Vec2.rem(p1,p2) end + +---@param _self U8Vec2 +---@return integer +function U8Vec2.min_position(_self) end + +---@param _self U8Vec2 +---@param rhs U8Vec2 +---@return U8Vec2 +function U8Vec2.max(_self,rhs) end + +---@param _self U8Vec2 +---@return I64Vec2 +function U8Vec2.as_i64vec2(_self) end + +---@param p1 U8Vec2 +---@param p2 integer +---@return U8Vec2 +function U8Vec2.div(p1,p2) end + +---@param _self U8Vec2 +---@param rhs U8Vec2 +---@return BVec2 +function U8Vec2.cmplt(_self,rhs) end + +---@param _self U8Vec2 +---@param rhs I8Vec2 +---@return U8Vec2 +function U8Vec2.wrapping_add_signed(_self,rhs) end + +---@param _self U8Vec2 +---@param rhs U8Vec2 +---@return U8Vec2 +function U8Vec2.rem(_self,rhs) end + +---@param _self U8Vec2 +---@return DVec2 +function U8Vec2.as_dvec2(_self) end + +---@param p1 U8Vec2 +---@param p2 U8Vec2 +---@return U8Vec2 +function U8Vec2.sub(p1,p2) end + +---@param p1 U8Vec2 +---@param p2 integer +---@return U8Vec2 +function U8Vec2.add(p1,p2) end + +---@param _self U8Vec2 +---@param rhs U8Vec2 +---@return U8Vec2 +function U8Vec2.wrapping_mul(_self,rhs) end + +---@param _self U8Vec2 +---@return I16Vec2 +function U8Vec2.as_i16vec2(_self) end + +---@param _self U8Vec2 +---@param rhs U8Vec2 +---@return U8Vec2 +function U8Vec2.wrapping_div(_self,rhs) end + +---@param _self U8Vec2 +---@param rhs U8Vec2 +---@return U8Vec2 +function U8Vec2.saturating_add(_self,rhs) end + +---@param a integer[] +---@return U8Vec2 +function U8Vec2.from_array(a) end + +---@param _self U8Vec2 +---@return Vec2 +function U8Vec2.as_vec2(_self) end + +---@param p1 U8Vec2 +---@param p2 U8Vec2 +---@return U8Vec2 +function U8Vec2.mul(p1,p2) end + +---@param _self U8Vec2 +---@param rhs U8Vec2 +---@return integer | nil +function U8Vec2.checked_manhattan_distance(_self,rhs) end + +---@param _self U8Vec2 +---@param other U8Vec2 +---@return boolean +function U8Vec2.__eq(_self,other) end + +---@param _self U8Vec2 +---@param other U8Vec2 +---@return boolean +function U8Vec2.eq(_self,other) end + +---@param _self U8Vec2 +---@param y integer +---@return U8Vec2 +function U8Vec2.with_y(_self,y) end + +---@param _self U8Vec2 +---@param rhs U8Vec2 +---@return integer +function U8Vec2.manhattan_distance(_self,rhs) end + +---@param _self U8Vec2 +---@return U16Vec2 +function U8Vec2.as_u16vec2(_self) end + +---@param _self U8Vec2 +---@param rhs U8Vec2 +---@return BVec2 +function U8Vec2.cmpge(_self,rhs) end + +---@param p1 U8Vec2 +---@param p2 integer +---@return U8Vec2 +function U8Vec2.sub(p1,p2) end + +---@param p1 U8Vec2 +---@param p2 U8Vec2 +---@return U8Vec2 +function U8Vec2.div(p1,p2) end + +---@param _self U8Vec2 +---@param min U8Vec2 +---@param max U8Vec2 +---@return U8Vec2 +function U8Vec2.clamp(_self,min,max) end + +---@param _self U8Vec2 +---@return U8Vec2 +function U8Vec2.clone(_self) end + +---@param _self U8Vec2 +---@return nil +function U8Vec2.assert_receiver_is_total_eq(_self) end + +---@param _self U8Vec2 +---@return integer +function U8Vec2.element_product(_self) end + +---@param p1 U8Vec2 +---@param p2 U8Vec2 +---@return U8Vec2 +function U8Vec2.add(p1,p2) end + +---@param _self U8Vec2 +---@return integer +function U8Vec2.max_position(_self) end + +---@param _self U8Vec2 +---@param rhs U8Vec2 +---@return U8Vec2 +function U8Vec2.sub(_self,rhs) end + +---@param _self U8Vec2 +---@param rhs U8Vec2 +---@return U8Vec2 +function U8Vec2.wrapping_add(_self,rhs) end + +---@param _self U8Vec2 +---@return integer[] +function U8Vec2.to_array(_self) end + +---@param _self U8Vec2 +---@param x integer +---@return U8Vec2 +function U8Vec2.with_x(_self,x) end + +---@param _self U8Vec2 +---@return I8Vec2 +function U8Vec2.as_i8vec2(_self) end + +---@param x integer +---@param y integer +---@return U8Vec2 +function U8Vec2.new(x,y) end + +---@param _self U8Vec2 +---@param rhs U8Vec2 +---@return U8Vec2 +function U8Vec2.mul(_self,rhs) end + +---@param v integer +---@return U8Vec2 +function U8Vec2.splat(v) end + +---@param _self U8Vec2 +---@param rhs U8Vec2 +---@return BVec2 +function U8Vec2.cmpeq(_self,rhs) end + +---@param _self U8Vec2 +---@return integer +function U8Vec2.length_squared(_self) end + +---@param _self U8Vec2 +---@param rhs U8Vec2 +---@return integer +function U8Vec2.dot(_self,rhs) end + +---@param _self U8Vec2 +---@param rhs U8Vec2 +---@return U8Vec2 +function U8Vec2.saturating_div(_self,rhs) end + +---@param _self U8Vec2 +---@return integer +function U8Vec2.max_element(_self) end + +---@param _self U8Vec2 +---@param rhs U8Vec2 +---@return U8Vec2 +function U8Vec2.saturating_mul(_self,rhs) end + +---@param _self U8Vec2 +---@param rhs U8Vec2 +---@return U8Vec2 +function U8Vec2.min(_self,rhs) end + +---@param _self U8Vec2 +---@param rhs U8Vec2 +---@return U8Vec2 +function U8Vec2.dot_into_vec(_self,rhs) end + +---@param p1 U8Vec2 +---@param p2 integer +---@return U8Vec2 +function U8Vec2.mul(p1,p2) end + +---@param _self U8Vec2 +---@return U64Vec2 +function U8Vec2.as_u64vec2(_self) end + +---@param _self U8Vec2 +---@param rhs U8Vec2 +---@return BVec2 +function U8Vec2.cmpne(_self,rhs) end + +---@param _self U8Vec2 +---@param rhs U8Vec2 +---@return U8Vec2 +function U8Vec2.add(_self,rhs) end + +---@param _self U8Vec2 +---@param rhs U8Vec2 +---@return U8Vec2 +function U8Vec2.div(_self,rhs) end + + + +---@class U8Vec3 : ReflectReference +---@field x ? integer +---@field y ? integer +---@field z ? integer +---@operator sub(U8Vec3): U8Vec3 +---@operator add(U8Vec3): U8Vec3 +---@operator add(integer): U8Vec3 +---@operator mul(U8Vec3): U8Vec3 +---@operator mod(U8Vec3): U8Vec3 +---@operator sub(integer): U8Vec3 +---@operator add(U8Vec3): U8Vec3 +---@operator div(U8Vec3): U8Vec3 +---@operator mod(integer): U8Vec3 +---@operator div(integer): U8Vec3 +---@operator mod(U8Vec3): U8Vec3 +---@operator mul(integer): U8Vec3 +---@operator mul(U8Vec3): U8Vec3 +---@operator div(U8Vec3): U8Vec3 +---@operator sub(U8Vec3): U8Vec3 +U8Vec3 = {} + +---@param _self U8Vec3 +---@param rhs U8Vec3 +---@return U8Vec3 +function U8Vec3.sub(_self,rhs) end + +---@param _self U8Vec3 +---@return integer +function U8Vec3.element_sum(_self) end + +---@param _self U8Vec3 +---@param rhs U8Vec3 +---@return U8Vec3 +function U8Vec3.saturating_add(_self,rhs) end + +---@param _self U8Vec3 +---@param rhs U8Vec3 +---@return integer +function U8Vec3.dot(_self,rhs) end + +---@param _self U8Vec3 +---@param rhs U8Vec3 +---@return BVec3 +function U8Vec3.cmpgt(_self,rhs) end + +---@param _self U8Vec3 +---@return integer +function U8Vec3.min_element(_self) end + +---@param p1 U8Vec3 +---@param p2 U8Vec3 +---@return U8Vec3 +function U8Vec3.add(p1,p2) end + +---@param _self U8Vec3 +---@return U8Vec2 +function U8Vec3.truncate(_self) end + +---@param _self U8Vec3 +---@param rhs U8Vec3 +---@return U8Vec3 +function U8Vec3.min(_self,rhs) end + +---@param p1 U8Vec3 +---@param p2 integer +---@return U8Vec3 +function U8Vec3.add(p1,p2) end + +---@param _self U8Vec3 +---@param rhs U8Vec3 +---@return U8Vec3 +function U8Vec3.cross(_self,rhs) end + +---@param _self U8Vec3 +---@return nil +function U8Vec3.assert_receiver_is_total_eq(_self) end + +---@param _self U8Vec3 +---@param rhs U8Vec3 +---@return integer +function U8Vec3.manhattan_distance(_self,rhs) end + +---@param _self U8Vec3 +---@return Vec3 +function U8Vec3.as_vec3(_self) end + +---@param _self U8Vec3 +---@return U64Vec3 +function U8Vec3.as_u64vec3(_self) end + +---@param _self U8Vec3 +---@param w integer +---@return U8Vec4 +function U8Vec3.extend(_self,w) end + +---@param _self U8Vec3 +---@return Vec3A +function U8Vec3.as_vec3a(_self) end + +---@param _self U8Vec3 +---@param rhs U8Vec3 +---@return integer | nil +function U8Vec3.checked_manhattan_distance(_self,rhs) end + +---@param _self U8Vec3 +---@param rhs I8Vec3 +---@return U8Vec3 +function U8Vec3.wrapping_add_signed(_self,rhs) end + +---@param _self U8Vec3 +---@return integer[] +function U8Vec3.to_array(_self) end + +---@param _self U8Vec3 +---@param rhs U8Vec3 +---@return U8Vec3 +function U8Vec3.wrapping_div(_self,rhs) end + +---@param _self U8Vec3 +---@param rhs U8Vec3 +---@return U8Vec3 +function U8Vec3.mul(_self,rhs) end + +---@param _self U8Vec3 +---@return I64Vec3 +function U8Vec3.as_i64vec3(_self) end + +---@param _self U8Vec3 +---@return UVec3 +function U8Vec3.as_uvec3(_self) end + +---@param _self U8Vec3 +---@param rhs U8Vec3 +---@return U8Vec3 +function U8Vec3.rem(_self,rhs) end + +---@param p1 U8Vec3 +---@param p2 integer +---@return U8Vec3 +function U8Vec3.sub(p1,p2) end + +---@param _self U8Vec3 +---@param rhs U8Vec3 +---@return BVec3 +function U8Vec3.cmpge(_self,rhs) end + +---@param _self U8Vec3 +---@param rhs U8Vec3 +---@return U8Vec3 +function U8Vec3.add(_self,rhs) end + +---@param _self U8Vec3 +---@param rhs U8Vec3 +---@return U8Vec3 +function U8Vec3.wrapping_add(_self,rhs) end + +---@param _self U8Vec3 +---@return integer +function U8Vec3.max_element(_self) end + +---@param _self U8Vec3 +---@param rhs U8Vec3 +---@return U8Vec3 +function U8Vec3.wrapping_sub(_self,rhs) end + +---@param _self U8Vec3 +---@param rhs U8Vec3 +---@return U8Vec3 +function U8Vec3.div(_self,rhs) end + +---@param v integer +---@return U8Vec3 +function U8Vec3.splat(v) end + +---@param _self U8Vec3 +---@param rhs I8Vec3 +---@return U8Vec3 +function U8Vec3.saturating_add_signed(_self,rhs) end + +---@param _self U8Vec3 +---@return DVec3 +function U8Vec3.as_dvec3(_self) end + +---@param _self U8Vec3 +---@return integer +function U8Vec3.max_position(_self) end + +---@param _self U8Vec3 +---@return integer +function U8Vec3.element_product(_self) end + +---@param _self U8Vec3 +---@param rhs U8Vec3 +---@return U8Vec3 +function U8Vec3.max(_self,rhs) end + +---@param _self U8Vec3 +---@param rhs U8Vec3 +---@return U8Vec3 +function U8Vec3.saturating_div(_self,rhs) end + +---@param mask BVec3 +---@param if_true U8Vec3 +---@param if_false U8Vec3 +---@return U8Vec3 +function U8Vec3.select(mask,if_true,if_false) end + +---@param _self U8Vec3 +---@param rhs U8Vec3 +---@return BVec3 +function U8Vec3.cmpne(_self,rhs) end + +---@param _self U8Vec3 +---@param rhs U8Vec3 +---@return BVec3 +function U8Vec3.cmplt(_self,rhs) end + +---@param p1 U8Vec3 +---@param p2 integer +---@return U8Vec3 +function U8Vec3.rem(p1,p2) end + +---@param _self U8Vec3 +---@param rhs U8Vec3 +---@return U8Vec3 +function U8Vec3.wrapping_mul(_self,rhs) end + +---@param _self U8Vec3 +---@return IVec3 +function U8Vec3.as_ivec3(_self) end + +---@param _self U8Vec3 +---@param rhs U8Vec3 +---@return BVec3 +function U8Vec3.cmple(_self,rhs) end + +---@param p1 U8Vec3 +---@param p2 integer +---@return U8Vec3 +function U8Vec3.div(p1,p2) end + +---@param _self U8Vec3 +---@param rhs U8Vec3 +---@return BVec3 +function U8Vec3.cmpeq(_self,rhs) end + +---@param a integer[] +---@return U8Vec3 +function U8Vec3.from_array(a) end + +---@param _self U8Vec3 +---@return U16Vec3 +function U8Vec3.as_u16vec3(_self) end + +---@param _self U8Vec3 +---@return integer +function U8Vec3.length_squared(_self) end + +---@param p1 U8Vec3 +---@param p2 U8Vec3 +---@return U8Vec3 +function U8Vec3.rem(p1,p2) end + +---@param p1 U8Vec3 +---@param p2 integer +---@return U8Vec3 +function U8Vec3.mul(p1,p2) end + +---@param _self U8Vec3 +---@return I8Vec3 +function U8Vec3.as_i8vec3(_self) end + +---@param x integer +---@param y integer +---@param z integer +---@return U8Vec3 +function U8Vec3.new(x,y,z) end + +---@param p1 U8Vec3 +---@param p2 U8Vec3 +---@return U8Vec3 +function U8Vec3.mul(p1,p2) end + +---@param _self U8Vec3 +---@param rhs U8Vec3 +---@return U8Vec3 +function U8Vec3.dot_into_vec(_self,rhs) end + +---@param _self U8Vec3 +---@param min U8Vec3 +---@param max U8Vec3 +---@return U8Vec3 +function U8Vec3.clamp(_self,min,max) end + +---@param _self U8Vec3 +---@param other U8Vec3 +---@return boolean +function U8Vec3.__eq(_self,other) end + +---@param _self U8Vec3 +---@param other U8Vec3 +---@return boolean +function U8Vec3.eq(_self,other) end + +---@param _self U8Vec3 +---@param z integer +---@return U8Vec3 +function U8Vec3.with_z(_self,z) end + +---@param _self U8Vec3 +---@return U8Vec3 +function U8Vec3.clone(_self) end + +---@param p1 U8Vec3 +---@param p2 U8Vec3 +---@return U8Vec3 +function U8Vec3.div(p1,p2) end + +---@param _self U8Vec3 +---@param x integer +---@return U8Vec3 +function U8Vec3.with_x(_self,x) end + +---@param _self U8Vec3 +---@param rhs U8Vec3 +---@return integer +function U8Vec3.chebyshev_distance(_self,rhs) end + +---@param _self U8Vec3 +---@return integer +function U8Vec3.min_position(_self) end + +---@param _self U8Vec3 +---@param rhs U8Vec3 +---@return U8Vec3 +function U8Vec3.saturating_sub(_self,rhs) end + +---@param _self U8Vec3 +---@param rhs U8Vec3 +---@return U8Vec3 +function U8Vec3.saturating_mul(_self,rhs) end + +---@param p1 U8Vec3 +---@param p2 U8Vec3 +---@return U8Vec3 +function U8Vec3.sub(p1,p2) end + +---@param _self U8Vec3 +---@param y integer +---@return U8Vec3 +function U8Vec3.with_y(_self,y) end + +---@param _self U8Vec3 +---@return I16Vec3 +function U8Vec3.as_i16vec3(_self) end + + + +---@class U8Vec4 : ReflectReference +---@field x ? integer +---@field y ? integer +---@field z ? integer +---@field w ? integer +---@operator add(U8Vec4): U8Vec4 +---@operator mod(U8Vec4): U8Vec4 +---@operator div(U8Vec4): U8Vec4 +---@operator div(integer): U8Vec4 +---@operator mod(integer): U8Vec4 +---@operator sub(U8Vec4): U8Vec4 +---@operator div(U8Vec4): U8Vec4 +---@operator mul(U8Vec4): U8Vec4 +---@operator add(U8Vec4): U8Vec4 +---@operator sub(U8Vec4): U8Vec4 +---@operator mul(integer): U8Vec4 +---@operator sub(integer): U8Vec4 +---@operator add(integer): U8Vec4 +---@operator mul(U8Vec4): U8Vec4 +---@operator mod(U8Vec4): U8Vec4 +U8Vec4 = {} + +---@param _self U8Vec4 +---@return integer +function U8Vec4.max_element(_self) end + +---@param _self U8Vec4 +---@param rhs U8Vec4 +---@return BVec4 +function U8Vec4.cmpeq(_self,rhs) end + +---@param _self U8Vec4 +---@return integer +function U8Vec4.min_position(_self) end + +---@param _self U8Vec4 +---@param rhs U8Vec4 +---@return BVec4 +function U8Vec4.cmpge(_self,rhs) end + +---@param _self U8Vec4 +---@return U8Vec4 +function U8Vec4.clone(_self) end + +---@param _self U8Vec4 +---@param other U8Vec4 +---@return boolean +function U8Vec4.__eq(_self,other) end + +---@param _self U8Vec4 +---@param other U8Vec4 +---@return boolean +function U8Vec4.eq(_self,other) end + +---@param _self U8Vec4 +---@param rhs U8Vec4 +---@return integer | nil +function U8Vec4.checked_manhattan_distance(_self,rhs) end + +---@param _self U8Vec4 +---@param rhs U8Vec4 +---@return U8Vec4 +function U8Vec4.wrapping_mul(_self,rhs) end + +---@param _self U8Vec4 +---@return I16Vec4 +function U8Vec4.as_i16vec4(_self) end + +---@param _self U8Vec4 +---@param rhs U8Vec4 +---@return U8Vec4 +function U8Vec4.max(_self,rhs) end + +---@param _self U8Vec4 +---@param rhs U8Vec4 +---@return BVec4 +function U8Vec4.cmplt(_self,rhs) end + +---@param _self U8Vec4 +---@param rhs U8Vec4 +---@return U8Vec4 +function U8Vec4.wrapping_add(_self,rhs) end + +---@param _self U8Vec4 +---@param rhs U8Vec4 +---@return U8Vec4 +function U8Vec4.add(_self,rhs) end + +---@param _self U8Vec4 +---@param rhs U8Vec4 +---@return BVec4 +function U8Vec4.cmple(_self,rhs) end + +---@param _self U8Vec4 +---@return nil +function U8Vec4.assert_receiver_is_total_eq(_self) end + +---@param _self U8Vec4 +---@param rhs U8Vec4 +---@return integer +function U8Vec4.manhattan_distance(_self,rhs) end + +---@param _self U8Vec4 +---@param rhs U8Vec4 +---@return U8Vec4 +function U8Vec4.wrapping_sub(_self,rhs) end + +---@param _self U8Vec4 +---@param rhs U8Vec4 +---@return BVec4 +function U8Vec4.cmpgt(_self,rhs) end + +---@param a integer[] +---@return U8Vec4 +function U8Vec4.from_array(a) end + +---@param _self U8Vec4 +---@return U64Vec4 +function U8Vec4.as_u64vec4(_self) end + +---@param _self U8Vec4 +---@param rhs U8Vec4 +---@return U8Vec4 +function U8Vec4.saturating_mul(_self,rhs) end + +---@param _self U8Vec4 +---@param rhs U8Vec4 +---@return BVec4 +function U8Vec4.cmpne(_self,rhs) end + +---@param _self U8Vec4 +---@param rhs U8Vec4 +---@return U8Vec4 +function U8Vec4.rem(_self,rhs) end + +---@param _self U8Vec4 +---@param rhs U8Vec4 +---@return U8Vec4 +function U8Vec4.saturating_div(_self,rhs) end + +---@param _self U8Vec4 +---@return I8Vec4 +function U8Vec4.as_i8vec4(_self) end + +---@param _self U8Vec4 +---@param rhs U8Vec4 +---@return U8Vec4 +function U8Vec4.div(_self,rhs) end + +---@param _self U8Vec4 +---@param rhs U8Vec4 +---@return integer +function U8Vec4.dot(_self,rhs) end + +---@param _self U8Vec4 +---@param min U8Vec4 +---@param max U8Vec4 +---@return U8Vec4 +function U8Vec4.clamp(_self,min,max) end + +---@param _self U8Vec4 +---@param rhs I8Vec4 +---@return U8Vec4 +function U8Vec4.wrapping_add_signed(_self,rhs) end + +---@param p1 U8Vec4 +---@param p2 integer +---@return U8Vec4 +function U8Vec4.div(p1,p2) end + +---@param p1 U8Vec4 +---@param p2 integer +---@return U8Vec4 +function U8Vec4.rem(p1,p2) end + +---@param _self U8Vec4 +---@param rhs U8Vec4 +---@return U8Vec4 +function U8Vec4.sub(_self,rhs) end + +---@param _self U8Vec4 +---@return UVec4 +function U8Vec4.as_uvec4(_self) end + +---@param _self U8Vec4 +---@param rhs U8Vec4 +---@return U8Vec4 +function U8Vec4.dot_into_vec(_self,rhs) end + +---@param _self U8Vec4 +---@param rhs I8Vec4 +---@return U8Vec4 +function U8Vec4.saturating_add_signed(_self,rhs) end + +---@param _self U8Vec4 +---@return DVec4 +function U8Vec4.as_dvec4(_self) end + +---@param _self U8Vec4 +---@param rhs U8Vec4 +---@return U8Vec4 +function U8Vec4.saturating_sub(_self,rhs) end + +---@param _self U8Vec4 +---@return Vec4 +function U8Vec4.as_vec4(_self) end + +---@param _self U8Vec4 +---@return integer +function U8Vec4.element_product(_self) end + +---@param _self U8Vec4 +---@param z integer +---@return U8Vec4 +function U8Vec4.with_z(_self,z) end + +---@param _self U8Vec4 +---@return U16Vec4 +function U8Vec4.as_u16vec4(_self) end + +---@param _self U8Vec4 +---@param rhs U8Vec4 +---@return U8Vec4 +function U8Vec4.saturating_add(_self,rhs) end + +---@param _self U8Vec4 +---@param w integer +---@return U8Vec4 +function U8Vec4.with_w(_self,w) end + +---@param x integer +---@param y integer +---@param z integer +---@param w integer +---@return U8Vec4 +function U8Vec4.new(x,y,z,w) end + +---@param mask BVec4 +---@param if_true U8Vec4 +---@param if_false U8Vec4 +---@return U8Vec4 +function U8Vec4.select(mask,if_true,if_false) end + +---@param _self U8Vec4 +---@return U8Vec3 +function U8Vec4.truncate(_self) end + +---@param v integer +---@return U8Vec4 +function U8Vec4.splat(v) end + +---@param p1 U8Vec4 +---@param p2 U8Vec4 +---@return U8Vec4 +function U8Vec4.div(p1,p2) end + +---@param _self U8Vec4 +---@param y integer +---@return U8Vec4 +function U8Vec4.with_y(_self,y) end + +---@param _self U8Vec4 +---@param rhs U8Vec4 +---@return U8Vec4 +function U8Vec4.min(_self,rhs) end + +---@param p1 U8Vec4 +---@param p2 U8Vec4 +---@return U8Vec4 +function U8Vec4.mul(p1,p2) end + +---@param p1 U8Vec4 +---@param p2 U8Vec4 +---@return U8Vec4 +function U8Vec4.add(p1,p2) end + +---@param _self U8Vec4 +---@return IVec4 +function U8Vec4.as_ivec4(_self) end + +---@param _self U8Vec4 +---@return integer +function U8Vec4.element_sum(_self) end + +---@param p1 U8Vec4 +---@param p2 U8Vec4 +---@return U8Vec4 +function U8Vec4.sub(p1,p2) end + +---@param _self U8Vec4 +---@param x integer +---@return U8Vec4 +function U8Vec4.with_x(_self,x) end + +---@param _self U8Vec4 +---@return integer +function U8Vec4.min_element(_self) end + +---@param p1 U8Vec4 +---@param p2 integer +---@return U8Vec4 +function U8Vec4.mul(p1,p2) end + +---@param p1 U8Vec4 +---@param p2 integer +---@return U8Vec4 +function U8Vec4.sub(p1,p2) end + +---@param p1 U8Vec4 +---@param p2 integer +---@return U8Vec4 +function U8Vec4.add(p1,p2) end + +---@param _self U8Vec4 +---@return I64Vec4 +function U8Vec4.as_i64vec4(_self) end + +---@param _self U8Vec4 +---@return integer[] +function U8Vec4.to_array(_self) end + +---@param _self U8Vec4 +---@return integer +function U8Vec4.length_squared(_self) end + +---@param _self U8Vec4 +---@param rhs U8Vec4 +---@return U8Vec4 +function U8Vec4.mul(_self,rhs) end + +---@param _self U8Vec4 +---@param rhs U8Vec4 +---@return U8Vec4 +function U8Vec4.wrapping_div(_self,rhs) end + +---@param _self U8Vec4 +---@return integer +function U8Vec4.max_position(_self) end + +---@param _self U8Vec4 +---@param rhs U8Vec4 +---@return integer +function U8Vec4.chebyshev_distance(_self,rhs) end + +---@param p1 U8Vec4 +---@param p2 U8Vec4 +---@return U8Vec4 +function U8Vec4.rem(p1,p2) end + + + +---@class UVec2 : ReflectReference +---@field x ? integer +---@field y ? integer +---@operator mod(UVec2): UVec2 +---@operator sub(integer): UVec2 +---@operator add(integer): UVec2 +---@operator mod(UVec2): UVec2 +---@operator sub(UVec2): UVec2 +---@operator add(UVec2): UVec2 +---@operator mod(integer): UVec2 +---@operator div(UVec2): UVec2 +---@operator mul(UVec2): UVec2 +---@operator div(UVec2): UVec2 +---@operator sub(UVec2): UVec2 +---@operator mul(integer): UVec2 +---@operator div(integer): UVec2 +---@operator add(UVec2): UVec2 +---@operator mul(UVec2): UVec2 +UVec2 = {} + +---@param _self UVec2 +---@param rhs IVec2 +---@return UVec2 +function UVec2.wrapping_add_signed(_self,rhs) end + +---@param _self UVec2 +---@param rhs UVec2 +---@return integer +function UVec2.manhattan_distance(_self,rhs) end + +---@param _self UVec2 +---@param y integer +---@return UVec2 +function UVec2.with_y(_self,y) end + +---@param _self UVec2 +---@return U64Vec2 +function UVec2.as_u64vec2(_self) end + +---@param _self UVec2 +---@return U16Vec2 +function UVec2.as_u16vec2(_self) end + +---@param _self UVec2 +---@param rhs UVec2 +---@return UVec2 +function UVec2.max(_self,rhs) end + +---@param mask BVec2 +---@param if_true UVec2 +---@param if_false UVec2 +---@return UVec2 +function UVec2.select(mask,if_true,if_false) end + +---@param _self UVec2 +---@return integer[] +function UVec2.to_array(_self) end + +---@param _self UVec2 +---@return integer +function UVec2.element_sum(_self) end + +---@param _self UVec2 +---@param z integer +---@return UVec3 +function UVec2.extend(_self,z) end + +---@param _self UVec2 +---@param rhs UVec2 +---@return UVec2 +function UVec2.wrapping_add(_self,rhs) end + +---@param _self UVec2 +---@return I16Vec2 +function UVec2.as_i16vec2(_self) end + +---@param _self UVec2 +---@param rhs IVec2 +---@return UVec2 +function UVec2.saturating_add_signed(_self,rhs) end + +---@param _self UVec2 +---@param rhs UVec2 +---@return BVec2 +function UVec2.cmplt(_self,rhs) end + +---@param _self UVec2 +---@param rhs UVec2 +---@return UVec2 +function UVec2.rem(_self,rhs) end + +---@param _self UVec2 +---@param rhs UVec2 +---@return UVec2 +function UVec2.wrapping_div(_self,rhs) end + +---@param p1 UVec2 +---@param p2 integer +---@return UVec2 +function UVec2.sub(p1,p2) end + +---@param _self UVec2 +---@return integer +function UVec2.min_position(_self) end + +---@param p1 UVec2 +---@param p2 integer +---@return UVec2 +function UVec2.add(p1,p2) end + +---@param _self UVec2 +---@return UVec2 +function UVec2.clone(_self) end + +---@param _self UVec2 +---@return I64Vec2 +function UVec2.as_i64vec2(_self) end + +---@param _self UVec2 +---@param x integer +---@return UVec2 +function UVec2.with_x(_self,x) end + +---@param _self UVec2 +---@param rhs UVec2 +---@return BVec2 +function UVec2.cmpgt(_self,rhs) end + +---@param p1 UVec2 +---@param p2 UVec2 +---@return UVec2 +function UVec2.rem(p1,p2) end + +---@param _self UVec2 +---@return IVec2 +function UVec2.as_ivec2(_self) end + +---@param _self UVec2 +---@param min UVec2 +---@param max UVec2 +---@return UVec2 +function UVec2.clamp(_self,min,max) end + +---@param _self UVec2 +---@return integer +function UVec2.element_product(_self) end + +---@param p1 UVec2 +---@param p2 UVec2 +---@return UVec2 +function UVec2.sub(p1,p2) end + +---@param _self UVec2 +---@return U8Vec2 +function UVec2.as_u8vec2(_self) end + +---@param _self UVec2 +---@param rhs UVec2 +---@return UVec2 +function UVec2.saturating_sub(_self,rhs) end + +---@param p1 UVec2 +---@param p2 UVec2 +---@return UVec2 +function UVec2.add(p1,p2) end + +---@param _self UVec2 +---@return integer +function UVec2.length_squared(_self) end + +---@param _self UVec2 +---@param rhs UVec2 +---@return UVec2 +function UVec2.wrapping_mul(_self,rhs) end + +---@param _self UVec2 +---@param other UVec2 +---@return boolean +function UVec2.__eq(_self,other) end + +---@param _self UVec2 +---@param other UVec2 +---@return boolean +function UVec2.eq(_self,other) end + +---@param _self UVec2 +---@param rhs UVec2 +---@return BVec2 +function UVec2.cmpne(_self,rhs) end + +---@param _self UVec2 +---@return I8Vec2 +function UVec2.as_i8vec2(_self) end + +---@param p1 UVec2 +---@param p2 integer +---@return UVec2 +function UVec2.rem(p1,p2) end + +---@param _self UVec2 +---@param rhs UVec2 +---@return UVec2 +function UVec2.wrapping_sub(_self,rhs) end + +---@param v integer +---@return UVec2 +function UVec2.splat(v) end + +---@param _self UVec2 +---@return nil +function UVec2.assert_receiver_is_total_eq(_self) end + +---@param p1 UVec2 +---@param p2 UVec2 +---@return UVec2 +function UVec2.div(p1,p2) end + +---@param _self UVec2 +---@param rhs UVec2 +---@return UVec2 +function UVec2.mul(_self,rhs) end + +---@param _self UVec2 +---@return Vec2 +function UVec2.as_vec2(_self) end + +---@param _self UVec2 +---@return integer +function UVec2.min_element(_self) end + +---@param _self UVec2 +---@param rhs UVec2 +---@return UVec2 +function UVec2.div(_self,rhs) end + +---@param _self UVec2 +---@return integer +function UVec2.max_element(_self) end + +---@param _self UVec2 +---@param rhs UVec2 +---@return UVec2 +function UVec2.saturating_add(_self,rhs) end + +---@param _self UVec2 +---@return DVec2 +function UVec2.as_dvec2(_self) end + +---@param x integer +---@param y integer +---@return UVec2 +function UVec2.new(x,y) end + +---@param _self UVec2 +---@param rhs UVec2 +---@return UVec2 +function UVec2.sub(_self,rhs) end + +---@param p1 UVec2 +---@param p2 integer +---@return UVec2 +function UVec2.mul(p1,p2) end + +---@param _self UVec2 +---@param rhs UVec2 +---@return integer +function UVec2.chebyshev_distance(_self,rhs) end + +---@param _self UVec2 +---@param rhs UVec2 +---@return UVec2 +function UVec2.saturating_mul(_self,rhs) end + +---@param p1 UVec2 +---@param p2 integer +---@return UVec2 +function UVec2.div(p1,p2) end + +---@param _self UVec2 +---@param rhs UVec2 +---@return UVec2 +function UVec2.add(_self,rhs) end + +---@param _self UVec2 +---@param rhs UVec2 +---@return integer +function UVec2.dot(_self,rhs) end + +---@param a integer[] +---@return UVec2 +function UVec2.from_array(a) end + +---@param _self UVec2 +---@param rhs UVec2 +---@return BVec2 +function UVec2.cmple(_self,rhs) end + +---@param _self UVec2 +---@param rhs UVec2 +---@return UVec2 +function UVec2.saturating_div(_self,rhs) end + +---@param _self UVec2 +---@param rhs UVec2 +---@return BVec2 +function UVec2.cmpeq(_self,rhs) end + +---@param _self UVec2 +---@return integer +function UVec2.max_position(_self) end + +---@param _self UVec2 +---@param rhs UVec2 +---@return BVec2 +function UVec2.cmpge(_self,rhs) end + +---@param _self UVec2 +---@param rhs UVec2 +---@return UVec2 +function UVec2.min(_self,rhs) end + +---@param _self UVec2 +---@param rhs UVec2 +---@return integer | nil +function UVec2.checked_manhattan_distance(_self,rhs) end + +---@param p1 UVec2 +---@param p2 UVec2 +---@return UVec2 +function UVec2.mul(p1,p2) end + +---@param _self UVec2 +---@param rhs UVec2 +---@return UVec2 +function UVec2.dot_into_vec(_self,rhs) end + + + +---@class UVec3 : ReflectReference +---@field x ? integer +---@field y ? integer +---@field z ? integer +---@operator div(UVec3): UVec3 +---@operator mod(UVec3): UVec3 +---@operator sub(UVec3): UVec3 +---@operator div(integer): UVec3 +---@operator mod(UVec3): UVec3 +---@operator mul(integer): UVec3 +---@operator sub(integer): UVec3 +---@operator mod(integer): UVec3 +---@operator mul(UVec3): UVec3 +---@operator div(UVec3): UVec3 +---@operator add(UVec3): UVec3 +---@operator mul(UVec3): UVec3 +---@operator sub(UVec3): UVec3 +---@operator add(UVec3): UVec3 +---@operator add(integer): UVec3 +UVec3 = {} + +---@param _self UVec3 +---@param rhs UVec3 +---@return UVec3 +function UVec3.div(_self,rhs) end + +---@param p1 UVec3 +---@param p2 UVec3 +---@return UVec3 +function UVec3.rem(p1,p2) end + +---@param _self UVec3 +---@param rhs UVec3 +---@return integer +function UVec3.dot(_self,rhs) end + +---@param _self UVec3 +---@param rhs UVec3 +---@return UVec3 +function UVec3.sub(_self,rhs) end + +---@param _self UVec3 +---@param rhs UVec3 +---@return integer | nil +function UVec3.checked_manhattan_distance(_self,rhs) end + +---@param _self UVec3 +---@param rhs UVec3 +---@return UVec3 +function UVec3.cross(_self,rhs) end + +---@param _self UVec3 +---@return UVec3 +function UVec3.clone(_self) end + +---@param x integer +---@param y integer +---@param z integer +---@return UVec3 +function UVec3.new(x,y,z) end + +---@param _self UVec3 +---@param rhs UVec3 +---@return UVec3 +function UVec3.saturating_add(_self,rhs) end + +---@param p1 UVec3 +---@param p2 integer +---@return UVec3 +function UVec3.div(p1,p2) end + +---@param _self UVec3 +---@param rhs UVec3 +---@return UVec3 +function UVec3.saturating_sub(_self,rhs) end + +---@param _self UVec3 +---@param rhs UVec3 +---@return UVec3 +function UVec3.min(_self,rhs) end + +---@param _self UVec3 +---@param rhs UVec3 +---@return BVec3 +function UVec3.cmpgt(_self,rhs) end + +---@param _self UVec3 +---@return U16Vec3 +function UVec3.as_u16vec3(_self) end + +---@param _self UVec3 +---@return nil +function UVec3.assert_receiver_is_total_eq(_self) end + +---@param _self UVec3 +---@param w integer +---@return UVec4 +function UVec3.extend(_self,w) end + +---@param _self UVec3 +---@param rhs UVec3 +---@return UVec3 +function UVec3.rem(_self,rhs) end + +---@param _self UVec3 +---@return integer[] +function UVec3.to_array(_self) end + +---@param _self UVec3 +---@param rhs UVec3 +---@return UVec3 +function UVec3.saturating_div(_self,rhs) end + +---@param p1 UVec3 +---@param p2 integer +---@return UVec3 +function UVec3.mul(p1,p2) end + +---@param _self UVec3 +---@param rhs UVec3 +---@return UVec3 +function UVec3.max(_self,rhs) end + +---@param p1 UVec3 +---@param p2 integer +---@return UVec3 +function UVec3.sub(p1,p2) end + +---@param _self UVec3 +---@return UVec2 +function UVec3.truncate(_self) end + +---@param _self UVec3 +---@return IVec3 +function UVec3.as_ivec3(_self) end + +---@param _self UVec3 +---@param min UVec3 +---@param max UVec3 +---@return UVec3 +function UVec3.clamp(_self,min,max) end + +---@param _self UVec3 +---@param y integer +---@return UVec3 +function UVec3.with_y(_self,y) end + +---@param _self UVec3 +---@return integer +function UVec3.length_squared(_self) end + +---@param p1 UVec3 +---@param p2 integer +---@return UVec3 +function UVec3.rem(p1,p2) end + +---@param _self UVec3 +---@param rhs UVec3 +---@return UVec3 +function UVec3.dot_into_vec(_self,rhs) end + +---@param p1 UVec3 +---@param p2 UVec3 +---@return UVec3 +function UVec3.mul(p1,p2) end + +---@param _self UVec3 +---@param rhs UVec3 +---@return integer +function UVec3.chebyshev_distance(_self,rhs) end + +---@param p1 UVec3 +---@param p2 UVec3 +---@return UVec3 +function UVec3.div(p1,p2) end + +---@param _self UVec3 +---@param rhs UVec3 +---@return BVec3 +function UVec3.cmple(_self,rhs) end + +---@param _self UVec3 +---@return I16Vec3 +function UVec3.as_i16vec3(_self) end + +---@param _self UVec3 +---@param rhs UVec3 +---@return BVec3 +function UVec3.cmpge(_self,rhs) end + +---@param _self UVec3 +---@param rhs UVec3 +---@return UVec3 +function UVec3.wrapping_add(_self,rhs) end + +---@param _self UVec3 +---@param z integer +---@return UVec3 +function UVec3.with_z(_self,z) end + +---@param _self UVec3 +---@return integer +function UVec3.element_sum(_self) end + +---@param _self UVec3 +---@param rhs UVec3 +---@return UVec3 +function UVec3.wrapping_sub(_self,rhs) end + +---@param _self UVec3 +---@return integer +function UVec3.max_position(_self) end + +---@param v integer +---@return UVec3 +function UVec3.splat(v) end + +---@param _self UVec3 +---@param rhs UVec3 +---@return UVec3 +function UVec3.wrapping_div(_self,rhs) end + +---@param _self UVec3 +---@return U8Vec3 +function UVec3.as_u8vec3(_self) end + +---@param a integer[] +---@return UVec3 +function UVec3.from_array(a) end + +---@param _self UVec3 +---@return I64Vec3 +function UVec3.as_i64vec3(_self) end + +---@param _self UVec3 +---@param rhs UVec3 +---@return UVec3 +function UVec3.saturating_mul(_self,rhs) end + +---@param _self UVec3 +---@param rhs UVec3 +---@return integer +function UVec3.manhattan_distance(_self,rhs) end + +---@param _self UVec3 +---@param x integer +---@return UVec3 +function UVec3.with_x(_self,x) end + +---@param _self UVec3 +---@return integer +function UVec3.min_element(_self) end + +---@param _self UVec3 +---@param rhs IVec3 +---@return UVec3 +function UVec3.saturating_add_signed(_self,rhs) end + +---@param _self UVec3 +---@param rhs UVec3 +---@return UVec3 +function UVec3.add(_self,rhs) end + +---@param _self UVec3 +---@return DVec3 +function UVec3.as_dvec3(_self) end + +---@param _self UVec3 +---@return integer +function UVec3.element_product(_self) end + +---@param _self UVec3 +---@param rhs UVec3 +---@return UVec3 +function UVec3.wrapping_mul(_self,rhs) end + +---@param _self UVec3 +---@param rhs UVec3 +---@return UVec3 +function UVec3.mul(_self,rhs) end + +---@param _self UVec3 +---@return Vec3A +function UVec3.as_vec3a(_self) end + +---@param _self UVec3 +---@return Vec3 +function UVec3.as_vec3(_self) end + +---@param _self UVec3 +---@param rhs IVec3 +---@return UVec3 +function UVec3.wrapping_add_signed(_self,rhs) end + +---@param p1 UVec3 +---@param p2 UVec3 +---@return UVec3 +function UVec3.sub(p1,p2) end + +---@param _self UVec3 +---@return integer +function UVec3.max_element(_self) end + +---@param mask BVec3 +---@param if_true UVec3 +---@param if_false UVec3 +---@return UVec3 +function UVec3.select(mask,if_true,if_false) end + +---@param _self UVec3 +---@param other UVec3 +---@return boolean +function UVec3.__eq(_self,other) end + +---@param _self UVec3 +---@param other UVec3 +---@return boolean +function UVec3.eq(_self,other) end + +---@param _self UVec3 +---@return U64Vec3 +function UVec3.as_u64vec3(_self) end + +---@param _self UVec3 +---@param rhs UVec3 +---@return BVec3 +function UVec3.cmpne(_self,rhs) end + +---@param _self UVec3 +---@param rhs UVec3 +---@return BVec3 +function UVec3.cmplt(_self,rhs) end + +---@param p1 UVec3 +---@param p2 UVec3 +---@return UVec3 +function UVec3.add(p1,p2) end + +---@param _self UVec3 +---@return integer +function UVec3.min_position(_self) end + +---@param p1 UVec3 +---@param p2 integer +---@return UVec3 +function UVec3.add(p1,p2) end + +---@param _self UVec3 +---@param rhs UVec3 +---@return BVec3 +function UVec3.cmpeq(_self,rhs) end + +---@param _self UVec3 +---@return I8Vec3 +function UVec3.as_i8vec3(_self) end + + + +---@class UVec4 : ReflectReference +---@field x ? integer +---@field y ? integer +---@field z ? integer +---@field w ? integer +---@operator mul(UVec4): UVec4 +---@operator add(UVec4): UVec4 +---@operator add(UVec4): UVec4 +---@operator div(UVec4): UVec4 +---@operator mod(UVec4): UVec4 +---@operator mod(UVec4): UVec4 +---@operator sub(UVec4): UVec4 +---@operator sub(integer): UVec4 +---@operator sub(UVec4): UVec4 +---@operator mul(integer): UVec4 +---@operator add(integer): UVec4 +---@operator div(UVec4): UVec4 +---@operator mod(integer): UVec4 +---@operator div(integer): UVec4 +---@operator mul(UVec4): UVec4 +UVec4 = {} + +---@param _self UVec4 +---@param rhs UVec4 +---@return UVec4 +function UVec4.min(_self,rhs) end + +---@param _self UVec4 +---@param rhs UVec4 +---@return UVec4 +function UVec4.saturating_add(_self,rhs) end + +---@param _self UVec4 +---@param rhs UVec4 +---@return UVec4 +function UVec4.mul(_self,rhs) end + +---@param _self UVec4 +---@return IVec4 +function UVec4.as_ivec4(_self) end + +---@param _self UVec4 +---@return integer +function UVec4.min_element(_self) end + +---@param _self UVec4 +---@return integer +function UVec4.element_sum(_self) end + +---@param _self UVec4 +---@param z integer +---@return UVec4 +function UVec4.with_z(_self,z) end + +---@param _self UVec4 +---@param rhs UVec4 +---@return UVec4 +function UVec4.wrapping_sub(_self,rhs) end + +---@param _self UVec4 +---@return UVec4 +function UVec4.clone(_self) end + +---@param p1 UVec4 +---@param p2 UVec4 +---@return UVec4 +function UVec4.add(p1,p2) end + +---@param _self UVec4 +---@param rhs UVec4 +---@return UVec4 +function UVec4.add(_self,rhs) end + +---@param _self UVec4 +---@param rhs UVec4 +---@return integer +function UVec4.dot(_self,rhs) end + +---@param _self UVec4 +---@param rhs UVec4 +---@return UVec4 +function UVec4.saturating_sub(_self,rhs) end + +---@param _self UVec4 +---@return Vec4 +function UVec4.as_vec4(_self) end + +---@param _self UVec4 +---@param other UVec4 +---@return boolean +function UVec4.__eq(_self,other) end + +---@param _self UVec4 +---@param other UVec4 +---@return boolean +function UVec4.eq(_self,other) end + +---@param _self UVec4 +---@return U8Vec4 +function UVec4.as_u8vec4(_self) end + +---@param _self UVec4 +---@param rhs IVec4 +---@return UVec4 +function UVec4.wrapping_add_signed(_self,rhs) end + +---@param _self UVec4 +---@param rhs UVec4 +---@return BVec4 +function UVec4.cmpne(_self,rhs) end + +---@param _self UVec4 +---@param y integer +---@return UVec4 +function UVec4.with_y(_self,y) end + +---@param _self UVec4 +---@return I64Vec4 +function UVec4.as_i64vec4(_self) end + +---@param mask BVec4 +---@param if_true UVec4 +---@param if_false UVec4 +---@return UVec4 +function UVec4.select(mask,if_true,if_false) end + +---@param _self UVec4 +---@param rhs UVec4 +---@return UVec4 +function UVec4.div(_self,rhs) end + +---@param v integer +---@return UVec4 +function UVec4.splat(v) end + +---@param a integer[] +---@return UVec4 +function UVec4.from_array(a) end + +---@param p1 UVec4 +---@param p2 UVec4 +---@return UVec4 +function UVec4.rem(p1,p2) end + +---@param _self UVec4 +---@return I8Vec4 +function UVec4.as_i8vec4(_self) end + +---@param _self UVec4 +---@return U64Vec4 +function UVec4.as_u64vec4(_self) end + +---@param _self UVec4 +---@param rhs UVec4 +---@return UVec4 +function UVec4.rem(_self,rhs) end + +---@param _self UVec4 +---@return integer +function UVec4.element_product(_self) end + +---@param _self UVec4 +---@param rhs UVec4 +---@return UVec4 +function UVec4.saturating_mul(_self,rhs) end + +---@param p1 UVec4 +---@param p2 UVec4 +---@return UVec4 +function UVec4.sub(p1,p2) end + +---@param _self UVec4 +---@param rhs UVec4 +---@return UVec4 +function UVec4.max(_self,rhs) end + +---@param _self UVec4 +---@param rhs UVec4 +---@return BVec4 +function UVec4.cmpeq(_self,rhs) end + +---@param _self UVec4 +---@param rhs UVec4 +---@return BVec4 +function UVec4.cmple(_self,rhs) end + +---@param _self UVec4 +---@param rhs UVec4 +---@return UVec4 +function UVec4.saturating_div(_self,rhs) end + +---@param x integer +---@param y integer +---@param z integer +---@param w integer +---@return UVec4 +function UVec4.new(x,y,z,w) end + +---@param _self UVec4 +---@param rhs IVec4 +---@return UVec4 +function UVec4.saturating_add_signed(_self,rhs) end + +---@param p1 UVec4 +---@param p2 integer +---@return UVec4 +function UVec4.sub(p1,p2) end + +---@param _self UVec4 +---@return integer +function UVec4.length_squared(_self) end + +---@param _self UVec4 +---@return UVec3 +function UVec4.truncate(_self) end + +---@param _self UVec4 +---@param rhs UVec4 +---@return BVec4 +function UVec4.cmpge(_self,rhs) end + +---@param _self UVec4 +---@param rhs UVec4 +---@return UVec4 +function UVec4.sub(_self,rhs) end + +---@param _self UVec4 +---@param w integer +---@return UVec4 +function UVec4.with_w(_self,w) end + +---@param _self UVec4 +---@return DVec4 +function UVec4.as_dvec4(_self) end + +---@param _self UVec4 +---@param rhs UVec4 +---@return BVec4 +function UVec4.cmpgt(_self,rhs) end + +---@param p1 UVec4 +---@param p2 integer +---@return UVec4 +function UVec4.mul(p1,p2) end + +---@param _self UVec4 +---@param rhs UVec4 +---@return integer +function UVec4.chebyshev_distance(_self,rhs) end + +---@param _self UVec4 +---@return integer +function UVec4.max_element(_self) end + +---@param p1 UVec4 +---@param p2 integer +---@return UVec4 +function UVec4.add(p1,p2) end + +---@param _self UVec4 +---@return U16Vec4 +function UVec4.as_u16vec4(_self) end + +---@param _self UVec4 +---@return I16Vec4 +function UVec4.as_i16vec4(_self) end + +---@param p1 UVec4 +---@param p2 UVec4 +---@return UVec4 +function UVec4.div(p1,p2) end + +---@param p1 UVec4 +---@param p2 integer +---@return UVec4 +function UVec4.rem(p1,p2) end + +---@param _self UVec4 +---@return integer +function UVec4.max_position(_self) end + +---@param _self UVec4 +---@return integer +function UVec4.min_position(_self) end + +---@param _self UVec4 +---@param rhs UVec4 +---@return UVec4 +function UVec4.dot_into_vec(_self,rhs) end + +---@param p1 UVec4 +---@param p2 integer +---@return UVec4 +function UVec4.div(p1,p2) end + +---@param _self UVec4 +---@param rhs UVec4 +---@return integer +function UVec4.manhattan_distance(_self,rhs) end + +---@param _self UVec4 +---@param min UVec4 +---@param max UVec4 +---@return UVec4 +function UVec4.clamp(_self,min,max) end + +---@param _self UVec4 +---@param rhs UVec4 +---@return UVec4 +function UVec4.wrapping_add(_self,rhs) end + +---@param _self UVec4 +---@param rhs UVec4 +---@return integer | nil +function UVec4.checked_manhattan_distance(_self,rhs) end + +---@param _self UVec4 +---@return nil +function UVec4.assert_receiver_is_total_eq(_self) end + +---@param _self UVec4 +---@param rhs UVec4 +---@return BVec4 +function UVec4.cmplt(_self,rhs) end + +---@param _self UVec4 +---@param rhs UVec4 +---@return UVec4 +function UVec4.wrapping_div(_self,rhs) end + +---@param _self UVec4 +---@return integer[] +function UVec4.to_array(_self) end + +---@param _self UVec4 +---@param rhs UVec4 +---@return UVec4 +function UVec4.wrapping_mul(_self,rhs) end + +---@param p1 UVec4 +---@param p2 UVec4 +---@return UVec4 +function UVec4.mul(p1,p2) end + +---@param _self UVec4 +---@param x integer +---@return UVec4 +function UVec4.with_x(_self,x) end + + + +---@class Vec2 : ReflectReference +---@field x ? number +---@field y ? number +---@operator mod(Vec2): Vec2 +---@operator add(Vec2): Vec2 +---@operator sub(Vec2): Vec2 +---@operator mul(number): Vec2 +---@operator mul(Vec2): Vec2 +---@operator sub(number): Vec2 +---@operator mod(Vec2): Vec2 +---@operator sub(Vec2): Vec2 +---@operator add(number): Vec2 +---@operator mod(number): Vec2 +---@operator div(Vec2): Vec2 +---@operator div(Vec2): Vec2 +---@operator unm: Vec2 +---@operator mul(Vec2): Vec2 +---@operator div(number): Vec2 +---@operator add(Vec2): Vec2 +Vec2 = {} + +---@param _self Vec2 +---@return number +function Vec2.to_angle(_self) end + +---@param _self Vec2 +---@return number +function Vec2.length_recip(_self) end + +---@param _self Vec2 +---@return Vec2 +function Vec2.round(_self) end + +---@param _self Vec2 +---@param rhs Vec2 +---@return Vec2 +function Vec2.project_onto_normalized(_self,rhs) end + +---@param _self Vec2 +---@return number +function Vec2.length(_self) end + +---@param p1 Vec2 +---@param p2 Vec2 +---@return Vec2 +function Vec2.rem(p1,p2) end + +---@param _self Vec2 +---@return number +function Vec2.element_sum(_self) end + +---@param _self Vec2 +---@param rhs Vec2 +---@return Vec2 +function Vec2.add(_self,rhs) end + +---@param _self Vec2 +---@param rhs Vec2 +---@return Vec2 +function Vec2.sub(_self,rhs) end + +---@param _self Vec2 +---@return number +function Vec2.length_squared(_self) end + +---@param _self Vec2 +---@return Vec2 +function Vec2.fract_gl(_self) end + +---@param _self Vec2 +---@param rhs Vec2 +---@return BVec2 +function Vec2.cmpeq(_self,rhs) end + +---@param _self Vec2 +---@return U8Vec2 +function Vec2.as_u8vec2(_self) end + +---@param _self Vec2 +---@return number +function Vec2.max_element(_self) end + +---@param p1 Vec2 +---@param p2 number +---@return Vec2 +function Vec2.mul(p1,p2) end + +---@param _self Vec2 +---@return integer +function Vec2.min_position(_self) end + +---@param _self Vec2 +---@param rhs Vec2 +---@return number +function Vec2.distance_squared(_self,rhs) end + +---@param p1 Vec2 +---@param p2 Vec2 +---@return Vec2 +function Vec2.mul(p1,p2) end + +---@param _self Vec2 +---@param rhs Vec2 +---@return number +function Vec2.perp_dot(_self,rhs) end + +---@param _self Vec2 +---@param rhs Vec2 +---@return BVec2 +function Vec2.cmplt(_self,rhs) end + +---@param _self Vec2 +---@return number +function Vec2.min_element(_self) end + +---@param p1 Vec2 +---@param p2 number +---@return Vec2 +function Vec2.sub(p1,p2) end + +---@param _self Vec2 +---@param rhs Vec2 +---@return Vec2 +function Vec2.rotate(_self,rhs) end + +---@param _self Vec2 +---@param rhs Vec2 +---@return number +function Vec2.dot(_self,rhs) end + +---@param _self Vec2 +---@return Vec2 +function Vec2.exp(_self) end + +---@param _self Vec2 +---@param rhs Vec2 +---@return number +function Vec2.distance(_self,rhs) end + +---@param _self Vec2 +---@return boolean +function Vec2.is_normalized(_self) end + +---@param _self Vec2 +---@param rhs Vec2 +---@return Vec2 +function Vec2.project_onto(_self,rhs) end + +---@param _self Vec2 +---@param rhs Vec2 +---@return Vec2 +function Vec2.rem_euclid(_self,rhs) end + +---@param _self Vec2 +---@param rhs Vec2 +---@return Vec2 +function Vec2.rem(_self,rhs) end + +---@param _self Vec2 +---@param rhs Vec2 +---@return BVec2 +function Vec2.cmple(_self,rhs) end + +---@param _self Vec2 +---@param rhs Vec2 +---@return Vec2 +function Vec2.dot_into_vec(_self,rhs) end + +---@param _self Vec2 +---@param normal Vec2 +---@param eta number +---@return Vec2 +function Vec2.refract(_self,normal,eta) end + +---@param _self Vec2 +---@param rhs Vec2 +---@return number +function Vec2.angle_to(_self,rhs) end + +---@param a number[] +---@return Vec2 +function Vec2.from_array(a) end + +---@param _self Vec2 +---@return number[] +function Vec2.to_array(_self) end + +---@param mask BVec2 +---@param if_true Vec2 +---@param if_false Vec2 +---@return Vec2 +function Vec2.select(mask,if_true,if_false) end + +---@param _self Vec2 +---@return Vec2 +function Vec2.ceil(_self) end + +---@param _self Vec2 +---@param a Vec2 +---@param b Vec2 +---@return Vec2 +function Vec2.mul_add(_self,a,b) end + +---@param p1 Vec2 +---@param p2 Vec2 +---@return Vec2 +function Vec2.sub(p1,p2) end + +---@param _self Vec2 +---@return U64Vec2 +function Vec2.as_u64vec2(_self) end + +---@param _self Vec2 +---@param rhs Vec2 +---@return Vec2 +function Vec2.copysign(_self,rhs) end + +---@param _self Vec2 +---@param rhs Vec2 +---@return BVec2 +function Vec2.cmpge(_self,rhs) end + +---@param _self Vec2 +---@param rhs Vec2 +---@return Vec2 +function Vec2.reject_from(_self,rhs) end + +---@param _self Vec2 +---@return Vec2 +function Vec2.normalize_or_zero(_self) end + +---@param _self Vec2 +---@param min Vec2 +---@param max Vec2 +---@return Vec2 +function Vec2.clamp(_self,min,max) end + +---@param _self Vec2 +---@return Vec2 +function Vec2.log2(_self) end + +---@param _self Vec2 +---@param rhs Vec2 +---@param d number +---@return Vec2 +function Vec2.move_towards(_self,rhs,d) end + +---@param _self Vec2 +---@param normal Vec2 +---@return Vec2 +function Vec2.reflect(_self,normal) end + +---@param _self Vec2 +---@return Vec2 +function Vec2.floor(_self) end + +---@param _self Vec2 +---@return U16Vec2 +function Vec2.as_u16vec2(_self) end + +---@param _self Vec2 +---@return Vec2 +function Vec2.normalize(_self) end + +---@param _self Vec2 +---@param x number +---@return Vec2 +function Vec2.with_x(_self,x) end + +---@param x number +---@param y number +---@return Vec2 +function Vec2.new(x,y) end + +---@param _self Vec2 +---@param rhs Vec2 +---@return Vec2 +function Vec2.reject_from_normalized(_self,rhs) end + +---@param _self Vec2 +---@return Vec2 +function Vec2.recip(_self) end + +---@param _self Vec2 +---@return I8Vec2 +function Vec2.as_i8vec2(_self) end + +---@param _self Vec2 +---@param rhs Vec2 +---@return BVec2 +function Vec2.cmpgt(_self,rhs) end + +---@param _self Vec2 +---@return Vec2 +function Vec2.trunc(_self) end + +---@param _self Vec2 +---@param fallback Vec2 +---@return Vec2 +function Vec2.normalize_or(_self,fallback) end + +---@param _self Vec2 +---@param rhs Vec2 +---@param max_angle number +---@return Vec2 +function Vec2.rotate_towards(_self,rhs,max_angle) end + +---@param _self Vec2 +---@return integer +function Vec2.is_negative_bitmask(_self) end + +---@param _self Vec2 +---@return DVec2 +function Vec2.as_dvec2(_self) end + +---@param _self Vec2 +---@return IVec2 +function Vec2.as_ivec2(_self) end + +---@param _self Vec2 +---@return Vec2 +function Vec2.fract(_self) end + +---@param _self Vec2 +---@return I64Vec2 +function Vec2.as_i64vec2(_self) end + +---@param _self Vec2 +---@param rhs Vec2 +---@return Vec2 +function Vec2.min(_self,rhs) end + +---@param _self Vec2 +---@return UVec2 +function Vec2.as_uvec2(_self) end + +---@param _self Vec2 +---@return boolean +function Vec2.is_nan(_self) end + +---@param p1 Vec2 +---@param p2 number +---@return Vec2 +function Vec2.add(p1,p2) end + +---@param _self Vec2 +---@return Vec2 +function Vec2.ln(_self) end + +---@param _self Vec2 +---@return number +function Vec2.element_product(_self) end + +---@param _self Vec2 +---@return Vec2 +function Vec2.perp(_self) end + +---@param _self Vec2 +---@return integer +function Vec2.max_position(_self) end + +---@param _self Vec2 +---@return boolean +function Vec2.is_finite(_self) end + +---@param _self Vec2 +---@return I16Vec2 +function Vec2.as_i16vec2(_self) end + +---@param _self Vec2 +---@param other Vec2 +---@return boolean +function Vec2.__eq(_self,other) end + +---@param _self Vec2 +---@param other Vec2 +---@return boolean +function Vec2.eq(_self,other) end + +---@param _self Vec2 +---@param min number +---@return Vec2 +function Vec2.clamp_length_min(_self,min) end + +---@param _self Vec2 +---@param rhs Vec2 +---@return BVec2 +function Vec2.cmpne(_self,rhs) end + +---@param p1 Vec2 +---@param p2 number +---@return Vec2 +function Vec2.rem(p1,p2) end + +---@param _self Vec2 +---@param rhs Vec2 +---@return Vec2 +function Vec2.div(_self,rhs) end + +---@param _self Vec2 +---@param rhs Vec2 +---@return number +function Vec2.angle_between(_self,rhs) end + +---@param p1 Vec2 +---@param p2 Vec2 +---@return Vec2 +function Vec2.div(p1,p2) end + +---@param _self Vec2 +---@return Vec2 +function Vec2.neg(_self) end + +---@param _self Vec2 +---@param rhs Vec2 +---@param s number +---@return Vec2 +function Vec2.lerp(_self,rhs,s) end + +---@param _self Vec2 +---@param max number +---@return Vec2 +function Vec2.clamp_length_max(_self,max) end + +---@param _self Vec2 +---@param rhs Vec2 +---@return Vec2 +function Vec2.div_euclid(_self,rhs) end + +---@param angle number +---@return Vec2 +function Vec2.from_angle(angle) end + +---@param _self Vec2 +---@return Vec2 +function Vec2.exp2(_self) end + +---@param _self Vec2 +---@param rhs Vec2 +---@return Vec2 +function Vec2.midpoint(_self,rhs) end + +---@param _self Vec2 +---@param rhs Vec2 +---@return Vec2 +function Vec2.mul(_self,rhs) end + +---@param _self Vec2 +---@return BVec2 +function Vec2.is_finite_mask(_self) end + +---@param _self Vec2 +---@return Vec2 +function Vec2.signum(_self) end + +---@param _self Vec2 +---@return Vec2 +function Vec2.abs(_self) end + +---@param _self Vec2 +---@return BVec2 +function Vec2.is_nan_mask(_self) end + +---@param _self Vec2 +---@param y number +---@return Vec2 +function Vec2.with_y(_self,y) end + +---@param _self Vec2 +---@return Vec2 +function Vec2.clone(_self) end + +---@param _self Vec2 +---@param rhs Vec2 +---@param max_abs_diff number +---@return boolean +function Vec2.abs_diff_eq(_self,rhs,max_abs_diff) end + +---@param _self Vec2 +---@param rhs Vec2 +---@return Vec2 +function Vec2.max(_self,rhs) end + +---@param p1 Vec2 +---@param p2 number +---@return Vec2 +function Vec2.div(p1,p2) end + +---@param _self Vec2 +---@param n number +---@return Vec2 +function Vec2.powf(_self,n) end + +---@param _self Vec2 +---@param z number +---@return Vec3 +function Vec2.extend(_self,z) end + +---@param p1 Vec2 +---@param p2 Vec2 +---@return Vec2 +function Vec2.add(p1,p2) end + +---@param v number +---@return Vec2 +function Vec2.splat(v) end + +---@param _self Vec2 +---@param min number +---@param max number +---@return Vec2 +function Vec2.clamp_length(_self,min,max) end + + + +---@class Vec3 : ReflectReference +---@field x ? number +---@field y ? number +---@field z ? number +---@operator mul(number): Vec3 +---@operator mod(Vec3): Vec3 +---@operator sub(Vec3): Vec3 +---@operator add(number): Vec3 +---@operator add(Vec3): Vec3 +---@operator sub(number): Vec3 +---@operator sub(Vec3): Vec3 +---@operator unm: Vec3 +---@operator mod(number): Vec3 +---@operator div(number): Vec3 +---@operator div(Vec3): Vec3 +---@operator mul(Vec3): Vec3 +---@operator mul(Vec3): Vec3 +---@operator mod(Vec3): Vec3 +---@operator add(Vec3): Vec3 +---@operator div(Vec3): Vec3 +Vec3 = {} + +---@param p1 Vec3 +---@param p2 number +---@return Vec3 +function Vec3.mul(p1,p2) end + +---@param _self Vec3 +---@param w number +---@return Vec4 +function Vec3.extend(_self,w) end + +---@param _self Vec3 +---@param rhs Vec3 +---@return Vec3 +function Vec3.cross(_self,rhs) end + +---@param _self Vec3 +---@return Vec3 +function Vec3.round(_self) end + +---@param v Vec4 +---@return Vec3 +function Vec3.from_homogeneous(v) end + +---@param _self Vec3 +---@param rhs Vec3 +---@return Vec3 +function Vec3.reject_from_normalized(_self,rhs) end + +---@param _self Vec3 +---@return boolean +function Vec3.is_finite(_self) end + +---@param p1 Vec3 +---@param p2 Vec3 +---@return Vec3 +function Vec3.rem(p1,p2) end + +---@param _self Vec3 +---@param angle number +---@return Vec3 +function Vec3.rotate_x(_self,angle) end + +---@param _self Vec3 +---@param rhs Vec3 +---@return Vec3 +function Vec3.sub(_self,rhs) end + +---@param _self Vec3 +---@return Vec3 +function Vec3.any_orthonormal_vector(_self) end + +---@param _self Vec3 +---@return number +function Vec3.max_element(_self) end + +---@param _self Vec3 +---@return Vec3 +function Vec3.ln(_self) end + +---@param _self Vec3 +---@return I16Vec3 +function Vec3.as_i16vec3(_self) end + +---@param _self Vec3 +---@return Vec3 +function Vec3.normalize(_self) end + +---@param _self Vec3 +---@param rhs Vec3 +---@return BVec3 +function Vec3.cmpeq(_self,rhs) end + +---@param _self Vec3 +---@param min number +---@param max number +---@return Vec3 +function Vec3.clamp_length(_self,min,max) end + +---@param _self Vec3 +---@return I64Vec3 +function Vec3.as_i64vec3(_self) end + +---@param _self Vec3 +---@return number +function Vec3.element_product(_self) end + +---@param _self Vec3 +---@param rhs Vec3 +---@return BVec3 +function Vec3.cmpge(_self,rhs) end + +---@param _self Vec3 +---@return Vec3 +function Vec3.floor(_self) end + +---@param _self Vec3 +---@return number +function Vec3.element_sum(_self) end + +---@param _self Vec3 +---@param rhs Vec3 +---@param max_abs_diff number +---@return boolean +function Vec3.abs_diff_eq(_self,rhs,max_abs_diff) end + +---@param _self Vec3 +---@param rhs Vec3 +---@return number +function Vec3.angle_between(_self,rhs) end + +---@param a number[] +---@return Vec3 +function Vec3.from_array(a) end + +---@param _self Vec3 +---@return Vec3A +function Vec3.to_vec3a(_self) end + +---@param _self Vec3 +---@param rhs Vec3 +---@param d number +---@return Vec3 +function Vec3.move_towards(_self,rhs,d) end + +---@param _self Vec3 +---@param rhs Vec3 +---@return BVec3 +function Vec3.cmple(_self,rhs) end + +---@param _self Vec3 +---@return Vec3 +function Vec3.any_orthogonal_vector(_self) end + +---@param _self Vec3 +---@return number +function Vec3.length(_self) end + +---@param _self Vec3 +---@param min Vec3 +---@param max Vec3 +---@return Vec3 +function Vec3.clamp(_self,min,max) end + +---@param _self Vec3 +---@return boolean +function Vec3.is_normalized(_self) end + +---@param _self Vec3 +---@return integer +function Vec3.max_position(_self) end + +---@param _self Vec3 +---@return U16Vec3 +function Vec3.as_u16vec3(_self) end + +---@param _self Vec3 +---@param fallback Vec3 +---@return Vec3 +function Vec3.normalize_or(_self,fallback) end + +---@param _self Vec3 +---@return Vec3 +function Vec3.signum(_self) end + +---@param _self Vec3 +---@return number +function Vec3.length_squared(_self) end + +---@param _self Vec3 +---@param rhs Vec3 +---@return Vec3 +function Vec3.midpoint(_self,rhs) end + +---@param _self Vec3 +---@return BVec3 +function Vec3.is_nan_mask(_self) end + +---@param _self Vec3 +---@return number[] +function Vec3.to_array(_self) end + +---@param _self Vec3 +---@param rhs Vec3 +---@return Vec3 +function Vec3.copysign(_self,rhs) end + +---@param _self Vec3 +---@param rhs Vec3 +---@return Vec3 +function Vec3.project_onto_normalized(_self,rhs) end + +---@param _self Vec3 +---@param rhs Vec3 +---@return number +function Vec3.distance(_self,rhs) end + +---@param p1 Vec3 +---@param p2 number +---@return Vec3 +function Vec3.add(p1,p2) end + +---@param _self Vec3 +---@return integer +function Vec3.is_negative_bitmask(_self) end + +---@param _self Vec3 +---@param rhs Vec3 +---@return Vec3 +function Vec3.rem_euclid(_self,rhs) end + +---@param _self Vec3 +---@return Vec3 +function Vec3.fract_gl(_self) end + +---@param p1 Vec3 +---@param p2 Vec3 +---@return Vec3 +function Vec3.add(p1,p2) end + +---@param p1 Vec3 +---@param p2 number +---@return Vec3 +function Vec3.sub(p1,p2) end + +---@param _self Vec3 +---@param rhs Vec3 +---@param max_angle number +---@return Vec3 +function Vec3.rotate_towards(_self,rhs,max_angle) end + +---@param _self Vec3 +---@param rhs Vec3 +---@return Vec3 +function Vec3.reject_from(_self,rhs) end + +---@param _self Vec3 +---@return Vec2 +function Vec3.truncate(_self) end + +---@param _self Vec3 +---@param z number +---@return Vec3 +function Vec3.with_z(_self,z) end + +---@param v number +---@return Vec3 +function Vec3.splat(v) end + +---@param _self Vec3 +---@return U64Vec3 +function Vec3.as_u64vec3(_self) end + +---@param p1 Vec3 +---@param p2 Vec3 +---@return Vec3 +function Vec3.sub(p1,p2) end + +---@param _self Vec3 +---@param rhs Vec3 +---@return BVec3 +function Vec3.cmplt(_self,rhs) end + +---@param _self Vec3 +---@return Vec3 +function Vec3.neg(_self) end + +---@param _self Vec3 +---@return Vec3 +function Vec3.trunc(_self) end + +---@param _self Vec3 +---@param angle number +---@return Vec3 +function Vec3.rotate_z(_self,angle) end + +---@param _self Vec3 +---@param max number +---@return Vec3 +function Vec3.clamp_length_max(_self,max) end + +---@param mask BVec3 +---@param if_true Vec3 +---@param if_false Vec3 +---@return Vec3 +function Vec3.select(mask,if_true,if_false) end + +---@param _self Vec3 +---@param rhs Vec3 +---@param s number +---@return Vec3 +function Vec3.lerp(_self,rhs,s) end + +---@param p1 Vec3 +---@param p2 number +---@return Vec3 +function Vec3.rem(p1,p2) end + +---@param _self Vec3 +---@return Vec3 +function Vec3.normalize_or_zero(_self) end + +---@param _self Vec3 +---@return Vec3 +function Vec3.exp2(_self) end + +---@param _self Vec3 +---@param n number +---@return Vec3 +function Vec3.powf(_self,n) end + +---@param p1 Vec3 +---@param p2 number +---@return Vec3 +function Vec3.div(p1,p2) end + +---@param _self Vec3 +---@param rhs Vec3 +---@return Vec3 +function Vec3.min(_self,rhs) end + +---@param _self Vec3 +---@param rhs Vec3 +---@return Vec3 +function Vec3.div(_self,rhs) end + +---@param _self Vec3 +---@return number +function Vec3.length_recip(_self) end + +---@param _self Vec3 +---@param other Vec3 +---@return boolean +function Vec3.__eq(_self,other) end + +---@param _self Vec3 +---@param other Vec3 +---@return boolean +function Vec3.eq(_self,other) end + +---@param _self Vec3 +---@param rhs Vec3 +---@return Vec3 +function Vec3.mul(_self,rhs) end + +---@param _self Vec3 +---@return IVec3 +function Vec3.as_ivec3(_self) end + +---@param _self Vec3 +---@return number +function Vec3.min_element(_self) end + +---@param _self Vec3 +---@param rhs Vec3 +---@return BVec3 +function Vec3.cmpne(_self,rhs) end + +---@param _self Vec3 +---@param min number +---@return Vec3 +function Vec3.clamp_length_min(_self,min) end + +---@param p1 Vec3 +---@param p2 Vec3 +---@return Vec3 +function Vec3.mul(p1,p2) end + +---@param _self Vec3 +---@param rhs Vec3 +---@return Vec3 +function Vec3.rem(_self,rhs) end + +---@param _self Vec3 +---@param rhs Vec3 +---@return number +function Vec3.distance_squared(_self,rhs) end + +---@param _self Vec3 +---@return integer +function Vec3.min_position(_self) end + +---@param _self Vec3 +---@return Vec3 +function Vec3.ceil(_self) end + +---@param _self Vec3 +---@param normal Vec3 +---@return Vec3 +function Vec3.reflect(_self,normal) end + +---@param _self Vec3 +---@param rhs Vec3 +---@return BVec3 +function Vec3.cmpgt(_self,rhs) end + +---@param _self Vec3 +---@param rhs Vec3 +---@return number +function Vec3.dot(_self,rhs) end + +---@param _self Vec3 +---@return Vec3 +function Vec3.abs(_self) end + +---@param _self Vec3 +---@return DVec3 +function Vec3.as_dvec3(_self) end + +---@param _self Vec3 +---@param normal Vec3 +---@param eta number +---@return Vec3 +function Vec3.refract(_self,normal,eta) end + +---@param _self Vec3 +---@return Vec4 +function Vec3.to_homogeneous(_self) end + +---@param _self Vec3 +---@return Vec3 +function Vec3.log2(_self) end + +---@param _self Vec3 +---@return boolean +function Vec3.is_nan(_self) end + +---@param _self Vec3 +---@return BVec3 +function Vec3.is_finite_mask(_self) end + +---@param _self Vec3 +---@param rhs Vec3 +---@return Vec3 +function Vec3.add(_self,rhs) end + +---@param _self Vec3 +---@return Vec3 +function Vec3.recip(_self) end + +---@param _self Vec3 +---@return U8Vec3 +function Vec3.as_u8vec3(_self) end + +---@param x number +---@param y number +---@param z number +---@return Vec3 +function Vec3.new(x,y,z) end + +---@param _self Vec3 +---@param rhs Vec3 +---@return Vec3 +function Vec3.dot_into_vec(_self,rhs) end + +---@param _self Vec3 +---@return UVec3 +function Vec3.as_uvec3(_self) end + +---@param p1 Vec3 +---@param p2 Vec3 +---@return Vec3 +function Vec3.div(p1,p2) end + +---@param _self Vec3 +---@param angle number +---@return Vec3 +function Vec3.rotate_y(_self,angle) end + +---@param _self Vec3 +---@return Vec3 +function Vec3.clone(_self) end + +---@param _self Vec3 +---@param x number +---@return Vec3 +function Vec3.with_x(_self,x) end + +---@param _self Vec3 +---@return Vec3 +function Vec3.fract(_self) end + +---@param _self Vec3 +---@return Vec3 +function Vec3.exp(_self) end + +---@param _self Vec3 +---@param axis Vec3 +---@param angle number +---@return Vec3 +function Vec3.rotate_axis(_self,axis,angle) end + +---@param _self Vec3 +---@return I8Vec3 +function Vec3.as_i8vec3(_self) end + +---@param _self Vec3 +---@param rhs Vec3 +---@param s number +---@return Vec3 +function Vec3.slerp(_self,rhs,s) end + +---@param _self Vec3 +---@param rhs Vec3 +---@return Vec3 +function Vec3.project_onto(_self,rhs) end + +---@param _self Vec3 +---@param rhs Vec3 +---@return Vec3 +function Vec3.div_euclid(_self,rhs) end + +---@param _self Vec3 +---@param rhs Vec3 +---@return Vec3 +function Vec3.max(_self,rhs) end + +---@param _self Vec3 +---@param a Vec3 +---@param b Vec3 +---@return Vec3 +function Vec3.mul_add(_self,a,b) end + +---@param _self Vec3 +---@param y number +---@return Vec3 +function Vec3.with_y(_self,y) end + + + +---@class Vec3A : ReflectReference +---@field x ? number +---@field y ? number +---@field z ? number +---@operator add(Vec3A): Vec3A +---@operator sub(Vec3A): Vec3A +---@operator add(Vec3A): Vec3A +---@operator div(number): Vec3A +---@operator add(number): Vec3A +---@operator mul(Vec3A): Vec3A +---@operator sub(number): Vec3A +---@operator unm: Vec3A +---@operator mul(number): Vec3A +---@operator sub(Vec3A): Vec3A +---@operator mod(number): Vec3A +---@operator div(Vec3A): Vec3A +---@operator mod(Vec3A): Vec3A +---@operator mod(Vec3A): Vec3A +---@operator div(Vec3A): Vec3A +---@operator mul(Vec3A): Vec3A +Vec3A = {} + +---@param _self Vec3A +---@return Vec3 +function Vec3A.to_vec3(_self) end + +---@param _self Vec3A +---@param rhs Vec3A +---@return Vec3A +function Vec3A.add(_self,rhs) end + +---@param p1 Vec3A +---@param p2 Vec3A +---@return Vec3A +function Vec3A.sub(p1,p2) end + +---@param _self Vec3A +---@return Vec3A +function Vec3A.round(_self) end + +---@param v Vec4 +---@return Vec3A +function Vec3A.from_homogeneous(v) end + +---@param _self Vec3A +---@return number +function Vec3A.element_product(_self) end + +---@param _self Vec3A +---@return number +function Vec3A.length(_self) end + +---@param _self Vec3A +---@return BVec3A +function Vec3A.is_nan_mask(_self) end + +---@param _self Vec3A +---@param rhs Vec3A +---@return Vec3A +function Vec3A.dot_into_vec(_self,rhs) end + +---@param _self Vec3A +---@param fallback Vec3A +---@return Vec3A +function Vec3A.normalize_or(_self,fallback) end + +---@param _self Vec3A +---@param min Vec3A +---@param max Vec3A +---@return Vec3A +function Vec3A.clamp(_self,min,max) end + +---@param _self Vec3A +---@param rhs Vec3A +---@return Vec3A +function Vec3A.midpoint(_self,rhs) end + +---@param _self Vec3A +---@param rhs Vec3A +---@return BVec3A +function Vec3A.cmpgt(_self,rhs) end + +---@param p1 Vec3A +---@param p2 Vec3A +---@return Vec3A +function Vec3A.add(p1,p2) end + +---@param _self Vec3A +---@return Vec3A +function Vec3A.floor(_self) end + +---@param _self Vec3A +---@return Vec3A +function Vec3A.fract(_self) end + +---@param _self Vec3A +---@param rhs Vec3A +---@return Vec3A +function Vec3A.reject_from(_self,rhs) end + +---@param _self Vec3A +---@return UVec3 +function Vec3A.as_uvec3(_self) end + +---@param _self Vec3A +---@return I64Vec3 +function Vec3A.as_i64vec3(_self) end + +---@param _self Vec3A +---@param rhs Vec3A +---@return BVec3A +function Vec3A.cmple(_self,rhs) end + +---@param p1 Vec3A +---@param p2 number +---@return Vec3A +function Vec3A.div(p1,p2) end + +---@param _self Vec3A +---@param normal Vec3A +---@param eta number +---@return Vec3A +function Vec3A.refract(_self,normal,eta) end + +---@param _self Vec3A +---@param axis Vec3A +---@param angle number +---@return Vec3A +function Vec3A.rotate_axis(_self,axis,angle) end + +---@param _self Vec3A +---@param z number +---@return Vec3A +function Vec3A.with_z(_self,z) end + +---@param x number +---@param y number +---@param z number +---@return Vec3A +function Vec3A.new(x,y,z) end + +---@param _self Vec3A +---@param rhs Vec3A +---@return number +function Vec3A.distance(_self,rhs) end + +---@param _self Vec3A +---@param rhs Vec3A +---@return number +function Vec3A.angle_between(_self,rhs) end + +---@param _self Vec3A +---@return boolean +function Vec3A.is_nan(_self) end + +---@param _self Vec3A +---@param rhs Vec3A +---@return boolean +function Vec3A.__eq(_self,rhs) end + +---@param _self Vec3A +---@param rhs Vec3A +---@return boolean +function Vec3A.eq(_self,rhs) end + +---@param _self Vec3A +---@return I16Vec3 +function Vec3A.as_i16vec3(_self) end + +---@param _self Vec3A +---@param rhs Vec3A +---@param s number +---@return Vec3A +function Vec3A.lerp(_self,rhs,s) end + +---@param _self Vec3A +---@param rhs Vec3A +---@return BVec3A +function Vec3A.cmpge(_self,rhs) end + +---@param _self Vec3A +---@return DVec3 +function Vec3A.as_dvec3(_self) end + +---@param _self Vec3A +---@return Vec3A +function Vec3A.exp2(_self) end + +---@param a number[] +---@return Vec3A +function Vec3A.from_array(a) end + +---@param _self Vec3A +---@return Vec3A +function Vec3A.exp(_self) end + +---@param _self Vec3A +---@param rhs Vec3A +---@return Vec3A +function Vec3A.project_onto_normalized(_self,rhs) end + +---@param _self Vec3A +---@param rhs Vec3A +---@param d number +---@return Vec3A +function Vec3A.move_towards(_self,rhs,d) end + +---@param _self Vec3A +---@param rhs Vec3A +---@return BVec3A +function Vec3A.cmpeq(_self,rhs) end + +---@param _self Vec3A +---@param x number +---@return Vec3A +function Vec3A.with_x(_self,x) end + +---@param _self Vec3A +---@return Vec3A +function Vec3A.log2(_self) end + +---@param _self Vec3A +---@return number +function Vec3A.element_sum(_self) end + +---@param _self Vec3A +---@return BVec3A +function Vec3A.is_finite_mask(_self) end + +---@param _self Vec3A +---@return Vec3A +function Vec3A.signum(_self) end + +---@param _self Vec3A +---@return Vec3A +function Vec3A.ln(_self) end + +---@param p1 Vec3A +---@param p2 number +---@return Vec3A +function Vec3A.add(p1,p2) end + +---@param _self Vec3A +---@param rhs Vec3A +---@return Vec3A +function Vec3A.div_euclid(_self,rhs) end + +---@param _self Vec3A +---@return Vec3A +function Vec3A.any_orthogonal_vector(_self) end + +---@param _self Vec3A +---@param max number +---@return Vec3A +function Vec3A.clamp_length_max(_self,max) end + +---@param _self Vec3A +---@param rhs Vec3A +---@return Vec3A +function Vec3A.reject_from_normalized(_self,rhs) end + +---@param _self Vec3A +---@return integer +function Vec3A.min_position(_self) end + +---@param _self Vec3A +---@return IVec3 +function Vec3A.as_ivec3(_self) end + +---@param _self Vec3A +---@return number +function Vec3A.max_element(_self) end + +---@param _self Vec3A +---@param y number +---@return Vec3A +function Vec3A.with_y(_self,y) end + +---@param _self Vec3A +---@return U8Vec3 +function Vec3A.as_u8vec3(_self) end + +---@param _self Vec3A +---@param n number +---@return Vec3A +function Vec3A.powf(_self,n) end + +---@param _self Vec3A +---@param rhs Vec3A +---@return Vec3A +function Vec3A.mul(_self,rhs) end + +---@param p1 Vec3A +---@param p2 number +---@return Vec3A +function Vec3A.sub(p1,p2) end + +---@param _self Vec3A +---@param rhs Vec3A +---@return number +function Vec3A.distance_squared(_self,rhs) end + +---@param _self Vec3A +---@return Vec3A +function Vec3A.trunc(_self) end + +---@param _self Vec3A +---@return U16Vec3 +function Vec3A.as_u16vec3(_self) end + +---@param _self Vec3A +---@param rhs Vec3A +---@param s number +---@return Vec3A +function Vec3A.slerp(_self,rhs,s) end + +---@param _self Vec3A +---@param rhs Vec3A +---@param max_angle number +---@return Vec3A +function Vec3A.rotate_towards(_self,rhs,max_angle) end + +---@param _self Vec3A +---@param rhs Vec3A +---@return number +function Vec3A.dot(_self,rhs) end + +---@param _self Vec3A +---@return Vec3A +function Vec3A.neg(_self) end + +---@param _self Vec3A +---@return integer +function Vec3A.is_negative_bitmask(_self) end + +---@param _self Vec3A +---@return Vec3A +function Vec3A.ceil(_self) end + +---@param v Vec4 +---@return Vec3A +function Vec3A.from_vec4(v) end + +---@param _self Vec3A +---@param angle number +---@return Vec3A +function Vec3A.rotate_z(_self,angle) end + +---@param _self Vec3A +---@return number +function Vec3A.length_recip(_self) end + +---@param _self Vec3A +---@param rhs Vec3A +---@return Vec3A +function Vec3A.copysign(_self,rhs) end + +---@param _self Vec3A +---@return U64Vec3 +function Vec3A.as_u64vec3(_self) end + +---@param _self Vec3A +---@return Vec3A +function Vec3A.normalize(_self) end + +---@param _self Vec3A +---@return integer +function Vec3A.max_position(_self) end + +---@param _self Vec3A +---@return number[] +function Vec3A.to_array(_self) end + +---@param _self Vec3A +---@param rhs Vec3A +---@return BVec3A +function Vec3A.cmpne(_self,rhs) end + +---@param p1 Vec3A +---@param p2 number +---@return Vec3A +function Vec3A.mul(p1,p2) end + +---@param _self Vec3A +---@param rhs Vec3A +---@return Vec3A +function Vec3A.min(_self,rhs) end + +---@param _self Vec3A +---@return number +function Vec3A.min_element(_self) end + +---@param _self Vec3A +---@return Vec3A +function Vec3A.any_orthonormal_vector(_self) end + +---@param _self Vec3A +---@return number +function Vec3A.length_squared(_self) end + +---@param _self Vec3A +---@param rhs Vec3A +---@return Vec3A +function Vec3A.sub(_self,rhs) end + +---@param p1 Vec3A +---@param p2 number +---@return Vec3A +function Vec3A.rem(p1,p2) end + +---@param p1 Vec3A +---@param p2 Vec3A +---@return Vec3A +function Vec3A.div(p1,p2) end + +---@param _self Vec3A +---@return Vec3A +function Vec3A.abs(_self) end + +---@param _self Vec3A +---@return Vec4 +function Vec3A.to_homogeneous(_self) end + +---@param _self Vec3A +---@return I8Vec3 +function Vec3A.as_i8vec3(_self) end + +---@param _self Vec3A +---@return Vec3A +function Vec3A.clone(_self) end + +---@param _self Vec3A +---@param rhs Vec3A +---@param max_abs_diff number +---@return boolean +function Vec3A.abs_diff_eq(_self,rhs,max_abs_diff) end + +---@param _self Vec3A +---@param rhs Vec3A +---@return Vec3A +function Vec3A.cross(_self,rhs) end + +---@param _self Vec3A +---@param rhs Vec3A +---@return Vec3A +function Vec3A.max(_self,rhs) end + +---@param mask BVec3A +---@param if_true Vec3A +---@param if_false Vec3A +---@return Vec3A +function Vec3A.select(mask,if_true,if_false) end + +---@param _self Vec3A +---@param rhs Vec3A +---@return Vec3A +function Vec3A.rem(_self,rhs) end + +---@param _self Vec3A +---@return Vec3A +function Vec3A.recip(_self) end + +---@param _self Vec3A +---@param rhs Vec3A +---@return Vec3A +function Vec3A.rem_euclid(_self,rhs) end + +---@param p1 Vec3A +---@param p2 Vec3A +---@return Vec3A +function Vec3A.rem(p1,p2) end + +---@param _self Vec3A +---@param w number +---@return Vec4 +function Vec3A.extend(_self,w) end + +---@param _self Vec3A +---@return boolean +function Vec3A.is_normalized(_self) end + +---@param _self Vec3A +---@param min number +---@return Vec3A +function Vec3A.clamp_length_min(_self,min) end + +---@param _self Vec3A +---@param rhs Vec3A +---@return Vec3A +function Vec3A.project_onto(_self,rhs) end + +---@param _self Vec3A +---@param rhs Vec3A +---@return BVec3A +function Vec3A.cmplt(_self,rhs) end + +---@param _self Vec3A +---@param angle number +---@return Vec3A +function Vec3A.rotate_x(_self,angle) end + +---@param _self Vec3A +---@param angle number +---@return Vec3A +function Vec3A.rotate_y(_self,angle) end + +---@param _self Vec3A +---@param rhs Vec3A +---@return Vec3A +function Vec3A.div(_self,rhs) end + +---@param _self Vec3A +---@return boolean +function Vec3A.is_finite(_self) end + +---@param p1 Vec3A +---@param p2 Vec3A +---@return Vec3A +function Vec3A.mul(p1,p2) end + +---@param _self Vec3A +---@param min number +---@param max number +---@return Vec3A +function Vec3A.clamp_length(_self,min,max) end + +---@param v number +---@return Vec3A +function Vec3A.splat(v) end + +---@param _self Vec3A +---@return Vec3A +function Vec3A.normalize_or_zero(_self) end + +---@param _self Vec3A +---@return Vec3A +function Vec3A.fract_gl(_self) end + +---@param _self Vec3A +---@param a Vec3A +---@param b Vec3A +---@return Vec3A +function Vec3A.mul_add(_self,a,b) end + +---@param _self Vec3A +---@return Vec2 +function Vec3A.truncate(_self) end + +---@param _self Vec3A +---@param normal Vec3A +---@return Vec3A +function Vec3A.reflect(_self,normal) end + + + +---@class Vec4 : ReflectReference +---@field x ? number +---@field y ? number +---@field z ? number +---@field w ? number +---@operator add(Vec4): Vec4 +---@operator mod(Vec4): Vec4 +---@operator mul(Vec4): Vec4 +---@operator unm: Vec4 +---@operator mod(Vec4): Vec4 +---@operator sub(number): Vec4 +---@operator add(Vec4): Vec4 +---@operator mul(Vec4): Vec4 +---@operator div(Vec4): Vec4 +---@operator div(number): Vec4 +---@operator div(Vec4): Vec4 +---@operator sub(Vec4): Vec4 +---@operator add(number): Vec4 +---@operator mul(number): Vec4 +---@operator sub(Vec4): Vec4 +---@operator mod(number): Vec4 +Vec4 = {} + +---@param _self Vec4 +---@param rhs Vec4 +---@param max_abs_diff number +---@return boolean +function Vec4.abs_diff_eq(_self,rhs,max_abs_diff) end + +---@param _self Vec4 +---@return BVec4A +function Vec4.is_nan_mask(_self) end + +---@param _self Vec4 +---@return Vec4 +function Vec4.fract(_self) end + +---@param _self Vec4 +---@param rhs Vec4 +---@return Vec4 +function Vec4.max(_self,rhs) end + +---@param _self Vec4 +---@return Vec4 +function Vec4.ceil(_self) end + +---@param _self Vec4 +---@param rhs Vec4 +---@return BVec4A +function Vec4.cmpgt(_self,rhs) end + +---@param _self Vec4 +---@return DVec4 +function Vec4.as_dvec4(_self) end + +---@param _self Vec4 +---@return number +function Vec4.min_element(_self) end + +---@param _self Vec4 +---@param w number +---@return Vec4 +function Vec4.with_w(_self,w) end + +---@param _self Vec4 +---@return number +function Vec4.length_recip(_self) end + +---@param _self Vec4 +---@param rhs Vec4 +---@return Vec4 +function Vec4.project_onto(_self,rhs) end + +---@param p1 Vec4 +---@param p2 Vec4 +---@return Vec4 +function Vec4.add(p1,p2) end + +---@param _self Vec4 +---@return I16Vec4 +function Vec4.as_i16vec4(_self) end + +---@param _self Vec4 +---@param rhs Vec4 +---@param s number +---@return Vec4 +function Vec4.lerp(_self,rhs,s) end + +---@param _self Vec4 +---@param normal Vec4 +---@param eta number +---@return Vec4 +function Vec4.refract(_self,normal,eta) end + +---@param p1 Vec4 +---@param p2 Vec4 +---@return Vec4 +function Vec4.rem(p1,p2) end + +---@param _self Vec4 +---@return number[] +function Vec4.to_array(_self) end + +---@param _self Vec4 +---@param rhs Vec4 +---@return Vec4 +function Vec4.mul(_self,rhs) end + +---@param _self Vec4 +---@return Vec4 +function Vec4.exp(_self) end + +---@param _self Vec4 +---@param n number +---@return Vec4 +function Vec4.powf(_self,n) end + +---@param _self Vec4 +---@param rhs Vec4 +---@return Vec4 +function Vec4.rem_euclid(_self,rhs) end + +---@param _self Vec4 +---@return number +function Vec4.element_product(_self) end + +---@param _self Vec4 +---@return UVec4 +function Vec4.as_uvec4(_self) end + +---@param _self Vec4 +---@return boolean +function Vec4.is_nan(_self) end + +---@param _self Vec4 +---@return Vec4 +function Vec4.neg(_self) end + +---@param _self Vec4 +---@return Vec3 +function Vec4.project(_self) end + +---@param mask BVec4A +---@param if_true Vec4 +---@param if_false Vec4 +---@return Vec4 +function Vec4.select(mask,if_true,if_false) end + +---@param _self Vec4 +---@param rhs Vec4 +---@return Vec4 +function Vec4.copysign(_self,rhs) end + +---@param _self Vec4 +---@return I8Vec4 +function Vec4.as_i8vec4(_self) end + +---@param _self Vec4 +---@param rhs Vec4 +---@return Vec4 +function Vec4.project_onto_normalized(_self,rhs) end + +---@param _self Vec4 +---@param rhs Vec4 +---@return Vec4 +function Vec4.reject_from(_self,rhs) end + +---@param _self Vec4 +---@param rhs Vec4 +---@return number +function Vec4.distance(_self,rhs) end + +---@param a number[] +---@return Vec4 +function Vec4.from_array(a) end + +---@param _self Vec4 +---@param a Vec4 +---@param b Vec4 +---@return Vec4 +function Vec4.mul_add(_self,a,b) end + +---@param _self Vec4 +---@param rhs Vec4 +---@return BVec4A +function Vec4.cmpeq(_self,rhs) end + +---@param _self Vec4 +---@param rhs Vec4 +---@return BVec4A +function Vec4.cmpne(_self,rhs) end + +---@param _self Vec4 +---@param rhs Vec4 +---@return Vec4 +function Vec4.reject_from_normalized(_self,rhs) end + +---@param _self Vec4 +---@return Vec4 +function Vec4.exp2(_self) end + +---@param _self Vec4 +---@param rhs Vec4 +---@return Vec4 +function Vec4.rem(_self,rhs) end + +---@param _self Vec4 +---@return I64Vec4 +function Vec4.as_i64vec4(_self) end + +---@param p1 Vec4 +---@param p2 number +---@return Vec4 +function Vec4.sub(p1,p2) end + +---@param _self Vec4 +---@param rhs Vec4 +---@return boolean +function Vec4.__eq(_self,rhs) end + +---@param _self Vec4 +---@param rhs Vec4 +---@return boolean +function Vec4.eq(_self,rhs) end + +---@param _self Vec4 +---@param normal Vec4 +---@return Vec4 +function Vec4.reflect(_self,normal) end + +---@param _self Vec4 +---@return U16Vec4 +function Vec4.as_u16vec4(_self) end + +---@param _self Vec4 +---@param fallback Vec4 +---@return Vec4 +function Vec4.normalize_or(_self,fallback) end + +---@param _self Vec4 +---@return BVec4A +function Vec4.is_finite_mask(_self) end + +---@param _self Vec4 +---@return boolean +function Vec4.is_finite(_self) end + +---@param _self Vec4 +---@param rhs Vec4 +---@return Vec4 +function Vec4.add(_self,rhs) end + +---@param _self Vec4 +---@return integer +function Vec4.max_position(_self) end + +---@param _self Vec4 +---@param max number +---@return Vec4 +function Vec4.clamp_length_max(_self,max) end + +---@param v number +---@return Vec4 +function Vec4.splat(v) end + +---@param _self Vec4 +---@return Vec4 +function Vec4.signum(_self) end + +---@param _self Vec4 +---@return U64Vec4 +function Vec4.as_u64vec4(_self) end + +---@param _self Vec4 +---@param rhs Vec4 +---@return Vec4 +function Vec4.div_euclid(_self,rhs) end + +---@param p1 Vec4 +---@param p2 Vec4 +---@return Vec4 +function Vec4.mul(p1,p2) end + +---@param _self Vec4 +---@param rhs Vec4 +---@return Vec4 +function Vec4.div(_self,rhs) end + +---@param _self Vec4 +---@param rhs Vec4 +---@return number +function Vec4.distance_squared(_self,rhs) end + +---@param _self Vec4 +---@return Vec4 +function Vec4.log2(_self) end + +---@param _self Vec4 +---@return U8Vec4 +function Vec4.as_u8vec4(_self) end + +---@param _self Vec4 +---@param min number +---@return Vec4 +function Vec4.clamp_length_min(_self,min) end + +---@param _self Vec4 +---@return IVec4 +function Vec4.as_ivec4(_self) end + +---@param _self Vec4 +---@return number +function Vec4.max_element(_self) end + +---@param _self Vec4 +---@param min Vec4 +---@param max Vec4 +---@return Vec4 +function Vec4.clamp(_self,min,max) end + +---@param _self Vec4 +---@return number +function Vec4.length_squared(_self) end + +---@param _self Vec4 +---@param rhs Vec4 +---@return Vec4 +function Vec4.midpoint(_self,rhs) end + +---@param _self Vec4 +---@return Vec4 +function Vec4.trunc(_self) end + +---@param _self Vec4 +---@return Vec3 +function Vec4.truncate(_self) end + +---@param _self Vec4 +---@param rhs Vec4 +---@return BVec4A +function Vec4.cmple(_self,rhs) end + +---@param _self Vec4 +---@param rhs Vec4 +---@return number +function Vec4.dot(_self,rhs) end + +---@param _self Vec4 +---@param min number +---@param max number +---@return Vec4 +function Vec4.clamp_length(_self,min,max) end + +---@param x number +---@param y number +---@param z number +---@param w number +---@return Vec4 +function Vec4.new(x,y,z,w) end + +---@param _self Vec4 +---@param rhs Vec4 +---@return Vec4 +function Vec4.min(_self,rhs) end + +---@param p1 Vec4 +---@param p2 number +---@return Vec4 +function Vec4.div(p1,p2) end + +---@param _self Vec4 +---@param rhs Vec4 +---@param d number +---@return Vec4 +function Vec4.move_towards(_self,rhs,d) end + +---@param p1 Vec4 +---@param p2 Vec4 +---@return Vec4 +function Vec4.div(p1,p2) end + +---@param _self Vec4 +---@param rhs Vec4 +---@return Vec4 +function Vec4.sub(_self,rhs) end + +---@param _self Vec4 +---@return Vec4 +function Vec4.round(_self) end + +---@param _self Vec4 +---@return number +function Vec4.element_sum(_self) end + +---@param _self Vec4 +---@return boolean +function Vec4.is_normalized(_self) end + +---@param _self Vec4 +---@return Vec4 +function Vec4.recip(_self) end + +---@param _self Vec4 +---@return number +function Vec4.length(_self) end + +---@param _self Vec4 +---@return Vec4 +function Vec4.floor(_self) end + +---@param p1 Vec4 +---@param p2 number +---@return Vec4 +function Vec4.add(p1,p2) end + +---@param _self Vec4 +---@return integer +function Vec4.is_negative_bitmask(_self) end + +---@param _self Vec4 +---@return integer +function Vec4.min_position(_self) end + +---@param _self Vec4 +---@return Vec4 +function Vec4.normalize_or_zero(_self) end + +---@param _self Vec4 +---@return Vec4 +function Vec4.fract_gl(_self) end + +---@param _self Vec4 +---@return Vec4 +function Vec4.abs(_self) end + +---@param _self Vec4 +---@param y number +---@return Vec4 +function Vec4.with_y(_self,y) end + +---@param _self Vec4 +---@param rhs Vec4 +---@return Vec4 +function Vec4.dot_into_vec(_self,rhs) end + +---@param _self Vec4 +---@param rhs Vec4 +---@return BVec4A +function Vec4.cmpge(_self,rhs) end + +---@param p1 Vec4 +---@param p2 number +---@return Vec4 +function Vec4.mul(p1,p2) end + +---@param _self Vec4 +---@return Vec4 +function Vec4.normalize(_self) end + +---@param _self Vec4 +---@param z number +---@return Vec4 +function Vec4.with_z(_self,z) end + +---@param _self Vec4 +---@param rhs Vec4 +---@return BVec4A +function Vec4.cmplt(_self,rhs) end + +---@param p1 Vec4 +---@param p2 Vec4 +---@return Vec4 +function Vec4.sub(p1,p2) end + +---@param _self Vec4 +---@return Vec4 +function Vec4.ln(_self) end + +---@param p1 Vec4 +---@param p2 number +---@return Vec4 +function Vec4.rem(p1,p2) end + +---@param _self Vec4 +---@param x number +---@return Vec4 +function Vec4.with_x(_self,x) end + +---@param _self Vec4 +---@return Vec4 +function Vec4.clone(_self) end + + + +---@class SmolStr : ReflectReference +---@operator len: integer +SmolStr = {} + +---@param _self SmolStr +---@return string +function SmolStr.to_string(_self) end + +---@param _self SmolStr +---@return boolean +function SmolStr.is_heap_allocated(_self) end + +---@param _self SmolStr +---@return SmolStr +function SmolStr.clone(_self) end + +---@param _self SmolStr +---@return boolean +function SmolStr.is_empty(_self) end + +---@param _self SmolStr +---@param other SmolStr +---@return boolean +function SmolStr.__eq(_self,other) end + +---@param _self SmolStr +---@param other SmolStr +---@return boolean +function SmolStr.eq(_self,other) end + +---@param _self SmolStr +---@return integer +function SmolStr.len(_self) end + + + +---@class NonNilUuid : ReflectReference +NonNilUuid = {} + +---@param _self NonNilUuid +---@return Uuid +function NonNilUuid.get(_self) end + +---@param _self NonNilUuid +---@param other NonNilUuid +---@return boolean +function NonNilUuid.__eq(_self,other) end + +---@param _self NonNilUuid +---@param other NonNilUuid +---@return boolean +function NonNilUuid.eq(_self,other) end + +---@param _self NonNilUuid +---@return NonNilUuid +function NonNilUuid.clone(_self) end + +---@param _self NonNilUuid +---@return nil +function NonNilUuid.assert_receiver_is_total_eq(_self) end + +---@param p1 NonNilUuid +---@param p2 Uuid +---@return boolean +function NonNilUuid.__eq(p1,p2) end + +---@param p1 NonNilUuid +---@param p2 Uuid +---@return boolean +function NonNilUuid.eq(p1,p2) end + + + +---@class Uuid : ReflectReference +Uuid = {} + +---@param _self Uuid +---@return integer[] | nil +function Uuid.get_node_id(_self) end + +---@return Uuid +function Uuid.new_v4() end + +---@param _self Uuid +---@return integer[] +function Uuid.into_bytes(_self) end + +---@param _self Uuid +---@return integer +function Uuid.get_version_num(_self) end + +---@param _self Uuid +---@return boolean +function Uuid.is_max(_self) end + +---@param _self Uuid +---@return integer[] +function Uuid.to_bytes_le(_self) end + +---@param b integer[] +---@return Uuid +function Uuid.from_bytes_le(b) end + + +---@param bytes integer[] +---@return Uuid +function Uuid.from_bytes(bytes) end + +---@param v integer +---@return Uuid +function Uuid.from_u128_le(v) end + +---@return Uuid +function Uuid.max() end + +---@param p1 Uuid +---@param p2 Uuid +---@return boolean +function Uuid.__eq(p1,p2) end + +---@param p1 Uuid +---@param p2 Uuid +---@return boolean +function Uuid.eq(p1,p2) end + +---@param _self Uuid +---@return [integer, integer] +function Uuid.as_u64_pair(_self) end + +---@param _self Uuid +---@return Uuid +function Uuid.clone(_self) end + +---@return integer[] +function Uuid.encode_buffer() end + +---@param _self Uuid +---@return boolean +function Uuid.is_nil(_self) end + +---@param _self Uuid +---@return integer +function Uuid.to_u128_le(_self) end + +---@param _self Uuid +---@return nil +function Uuid.assert_receiver_is_total_eq(_self) end + +---@param _self Uuid +---@param other NonNilUuid +---@return boolean +function Uuid.__eq(_self,other) end + +---@param _self Uuid +---@param other NonNilUuid +---@return boolean +function Uuid.eq(_self,other) end + +---@param v integer +---@return Uuid +function Uuid.from_u128(v) end + +---@param high_bits integer +---@param low_bits integer +---@return Uuid +function Uuid.from_u64_pair(high_bits,low_bits) end + +---@param _self Uuid +---@return integer +function Uuid.as_u128(_self) end + + + +---@class BlendState : ReflectReference +BlendState = {} + +---@param _self BlendState +---@param other BlendState +---@return boolean +function BlendState.__eq(_self,other) end + +---@param _self BlendState +---@param other BlendState +---@return boolean +function BlendState.eq(_self,other) end + +---@param _self BlendState +---@return BlendState +function BlendState.clone(_self) end + +---@param _self BlendState +---@return nil +function BlendState.assert_receiver_is_total_eq(_self) end + + + +---@class TextureFormat : ReflectReference +TextureFormat = {} + +---@param _self TextureFormat +---@return integer +function TextureFormat.components(_self) end + +---@param _self TextureFormat +---@return integer | nil +function TextureFormat.planes(_self) end + +---@param _self TextureFormat +---@return TextureFormat +function TextureFormat.clone(_self) end + +---@param _self TextureFormat +---@return boolean +function TextureFormat.is_srgb(_self) end + +---@param _self TextureFormat +---@return [integer, integer] +function TextureFormat.block_dimensions(_self) end + +---@param _self TextureFormat +---@return boolean +function TextureFormat.is_depth_stencil_format(_self) end + +---@param _self TextureFormat +---@param other TextureFormat +---@return boolean +function TextureFormat.__eq(_self,other) end + +---@param _self TextureFormat +---@param other TextureFormat +---@return boolean +function TextureFormat.eq(_self,other) end + +---@param _self TextureFormat +---@return [integer, integer] +function TextureFormat.size_multiple_requirement(_self) end + +---@param _self TextureFormat +---@return boolean +function TextureFormat.has_depth_aspect(_self) end + +---@param _self TextureFormat +---@return nil +function TextureFormat.assert_receiver_is_total_eq(_self) end + +---@param _self TextureFormat +---@return boolean +function TextureFormat.is_compressed(_self) end + +---@param _self TextureFormat +---@param combined_format TextureFormat +---@return boolean +function TextureFormat.is_depth_stencil_component(_self,combined_format) end + +---@param _self TextureFormat +---@return TextureFormat +function TextureFormat.remove_srgb_suffix(_self) end + +---@param _self TextureFormat +---@return boolean +function TextureFormat.is_combined_depth_stencil_format(_self) end + +---@param _self TextureFormat +---@return integer | nil +function TextureFormat.target_pixel_byte_cost(_self) end + +---@param _self TextureFormat +---@return TextureFormat +function TextureFormat.add_srgb_suffix(_self) end + +---@param _self TextureFormat +---@return boolean +function TextureFormat.is_astc(_self) end + +---@param _self TextureFormat +---@return boolean +function TextureFormat.has_color_aspect(_self) end + +---@param _self TextureFormat +---@return boolean +function TextureFormat.has_stencil_aspect(_self) end + +---@param _self TextureFormat +---@return boolean +function TextureFormat.is_bcn(_self) end + +---@param _self TextureFormat +---@return boolean +function TextureFormat.is_multi_planar_format(_self) end + +---@param _self TextureFormat +---@return integer | nil +function TextureFormat.target_component_alignment(_self) end + + + +---@class Bool +--- A boolean value +Bool = {} + + + +---@class Char +--- An 8-bit character +Char = {} + + + +---@class DynamicFunction +--- A callable dynamic function +DynamicFunction = {} + + + +---@class DynamicFunctionMut +--- A stateful and callable dynamic function +DynamicFunctionMut = {} + + + +---@class F32 +--- A 32-bit floating point number +F32 = {} + + + +---@class F64 +--- A 64-bit floating point number +F64 = {} + + + +---@class FunctionCallContext +--- Function call context, if accepted by a function, means the function can access the world in arbitrary ways. +FunctionCallContext = {} + + + +---@class I128 +--- A signed 128-bit integer +I128 = {} + + + +---@class I16 +--- A signed 16-bit integer +I16 = {} + + + +---@class I32 +--- A signed 32-bit integer +I32 = {} + + + +---@class I64 +--- A signed 64-bit integer +I64 = {} + + + +---@class I8 +--- A signed 8-bit integer +I8 = {} + + + +---@class Isize +--- A signed pointer-sized integer +Isize = {} + + + +---@class OsString +--- A heap allocated OS string +OsString = {} + + + +---@class PathBuf +--- A heap allocated file path +PathBuf = {} + + + +---@class ScriptValue : ReflectReference +--- An abstraction of values that can be passed to and from scripts. +--- This allows us to re-use logic between scripting languages. +ScriptValue = {} + + + +---@class Str +--- A string slice +Str = {} + + + +---@class String +--- A heap allocated string +String = {} + + + +---@class U128 +--- An unsigned 128-bit integer +U128 = {} + + + +---@class U16 +--- An unsigned 16-bit integer +U16 = {} + + + +---@class U32 +--- An unsigned 32-bit integer +U32 = {} + + + +---@class U64 +--- An unsigned 64-bit integer +U64 = {} + + + +---@class U8 +--- An unsigned 8-bit integer +U8 = {} + + + +---@class Usize +--- An unsigned pointer-sized integer +Usize = {} + + + +---@class AccessibilityRequested : ReflectReference +--- Tracks whether an assistive technology has requested accessibility +--- information. +--- +--- This type is a [`Resource`] initialized by the +--- [`AccessibilityPlugin`]. It may be useful if a third-party plugin needs to +--- conditionally integrate with `AccessKit`. +--- +--- In other words, this resource represents whether accessibility providers +--- are "turned on" or "turned off" across an entire Bevy `App`. +--- +--- By default, it is set to `false`, indicating that nothing has requested +--- accessibility information yet. +--- +--- [`Resource`]: bevy_ecs::resource::Resource +---@field [1] Arc +AccessibilityRequested = {} + + + +---@class AccessibilitySystems : ReflectReference +--- A system set relating to accessibility. +--- +--- Helps run accessibility updates all at once. +AccessibilitySystems = {} + + + +---@class ManageAccessibilityUpdates : ReflectReference +--- Determines whether Bevy's ECS updates the accessibility tree. +--- +--- This [`Resource`] tells Bevy internals whether it should be handling +--- `AccessKit` updates (`true`), or if something else is doing that (`false`). +--- +--- It defaults to `true`. So, by default, Bevy is configured to maintain the +--- `AccessKit` tree. +--- +--- Set to `false` in cases where an external GUI library is sending +--- accessibility updates instead. When this option is set inconsistently with +--- that requirement, the external library and ECS will generate conflicting +--- updates. +--- +--- [`Resource`]: bevy_ecs::resource::Resource +---@field [1] boolean +ManageAccessibilityUpdates = {} + + + +---@class AssetIndex : ReflectReference +--- A generational runtime-only identifier for a specific [`Asset`] stored in [`Assets`]. This is optimized for efficient runtime +--- usage and is not suitable for identifying assets across app runs. +---@field generation ? integer +---@field index ? integer +AssetIndex = {} + + + +---@class UntypedHandle : ReflectReference +--- An untyped variant of [`Handle`], which internally stores the [`Asset`] type information at runtime +--- as a [`TypeId`] instead of encoding it in the compile-time type. This allows handles across [`Asset`] types +--- to be stored together and compared. +--- +--- See [`Handle`] for more information. +UntypedHandle = {} + + + +---@class UntypedAssetId : ReflectReference +--- An "untyped" / "generic-less" [`Asset`] identifier that behaves much like [`AssetId`], but stores the [`Asset`] type +--- information at runtime instead of compile-time. This increases the size of the type, but it enables storing asset ids +--- across asset types together and enables comparisons between them. +UntypedAssetId = {} + + + +---@class AssetPath : ReflectReference +--- Represents a path to an asset in a "virtual filesystem". +--- +--- Asset paths consist of three main parts: +--- * [`AssetPath::source`]: The name of the [`AssetSource`](crate::io::AssetSource) to load the asset from. +--- This is optional. If one is not set the default source will be used (which is the `assets` folder by default). +--- * [`AssetPath::path`]: The "virtual filesystem path" pointing to an asset source file. +--- * [`AssetPath::label`]: An optional "named sub asset". When assets are loaded, they are +--- allowed to load "sub assets" of any type, which are identified by a named "label". +--- +--- Asset paths are generally constructed (and visualized) as strings: +--- +--- ```no_run +--- # use bevy_asset::{Asset, AssetServer, Handle}; +--- # use bevy_reflect::TypePath; +--- # +--- # #[derive(Asset, TypePath, Default)] +--- # struct Mesh; +--- # +--- # #[derive(Asset, TypePath, Default)] +--- # struct Scene; +--- # +--- # let asset_server: AssetServer = panic!(); +--- // This loads the `my_scene.scn` base asset from the default asset source. +--- let scene: Handle = asset_server.load("my_scene.scn"); +--- +--- // This loads the `PlayerMesh` labeled asset from the `my_scene.scn` base asset in the default asset source. +--- let mesh: Handle = asset_server.load("my_scene.scn#PlayerMesh"); +--- +--- // This loads the `my_scene.scn` base asset from a custom 'remote' asset source. +--- let scene: Handle = asset_server.load("remote://my_scene.scn"); +--- ``` +--- +--- [`AssetPath`] implements [`From`] for `&'static str`, `&'static Path`, and `&'a String`, +--- which allows us to optimize the static cases. +--- This means that the common case of `asset_server.load("my_scene.scn")` when it creates and +--- clones internal owned [`AssetPaths`](AssetPath). +--- This also means that you should use [`AssetPath::parse`] in cases where `&str` is the explicit type. +AssetPath = {} + + + +---@class RenderAssetUsages : ReflectReference +--- Defines where the asset will be used. +--- +--- If an asset is set to the `RENDER_WORLD` but not the `MAIN_WORLD`, the asset data (pixel data, +--- mesh vertex data, etc) will be removed from the cpu-side asset once it's been extracted and prepared +--- in the render world. The asset will remain in the assets collection, but with only metadata. +--- +--- Unloading the asset data saves on memory, as for most cases it is no longer necessary to keep +--- it in RAM once it's been uploaded to the GPU's VRAM. However, this means you cannot access the +--- asset data from the CPU (via the `Assets` resource) once unloaded (without re-loading it). +--- +--- If you never need access to the asset from the CPU past the first frame it's loaded on, +--- or only need very infrequent access, then set this to `RENDER_WORLD`. Otherwise, set this to +--- `RENDER_WORLD | MAIN_WORLD`. +--- +--- If you have an asset that doesn't actually need to end up in the render world, like an Image +--- that will be decoded into another Image asset, use `MAIN_WORLD` only. +--- +--- ## Platform-specific +--- +--- On Wasm, it is not possible for now to free reserved memory. To control memory usage, load assets +--- in sequence and unload one before loading the next. See this +--- [discussion about memory management](https://github.com/WebAssembly/design/issues/1397) for more +--- details. +RenderAssetUsages = {} + + + +---@class Camera : ReflectReference +--- The defining [`Component`] for camera entities, +--- storing information about how and what to render through this camera. +--- +--- The [`Camera`] component is added to an entity to define the properties of the viewpoint from +--- which rendering occurs. It defines the position of the view to render, the projection method +--- to transform the 3D objects into a 2D image, as well as the render target into which that image +--- is produced. +--- +--- Note that a [`Camera`] needs a `CameraRenderGraph` to render anything. +--- This is typically provided by adding a [`Camera2d`] or [`Camera3d`] component, +--- but custom render graphs can also be defined. Inserting a [`Camera`] with no render +--- graph will emit an error at runtime. +--- +--- [`Camera2d`]: crate::Camera2d +--- [`Camera3d`]: crate::Camera3d +---@field viewport ? Viewport | nil +---@field order ? integer +---@field is_active ? boolean +---@field output_mode ? CameraOutputMode +---@field msaa_writeback ? MsaaWriteback +---@field clear_color ? ClearColorConfig +---@field invert_culling ? boolean +---@field sub_camera_view ? SubCameraView | nil +Camera = {} + + + +---@class CameraMainTextureUsages : ReflectReference +--- This component lets you control the [`TextureUsages`] field of the main texture generated for the camera +CameraMainTextureUsages = {} + + + +---@class CameraOutputMode : ReflectReference +--- Control how this [`Camera`] outputs once rendering is completed. +CameraOutputMode = {} + + + +---@class Exposure : ReflectReference +--- How much energy a [`Camera3d`](crate::Camera3d) absorbs from incoming light. +--- +--- +Exposure = {} + + + +---@class ImageRenderTarget : ReflectReference +--- A render target that renders to an [`Image`]. +---@field handle ? any +---@field scale_factor ? number +ImageRenderTarget = {} + + + +---@class MainPassResolutionOverride : ReflectReference +--- Override the resolution a 3d camera's main pass is rendered at. +--- +--- Does not affect post processing. +--- +--- ## Usage +--- +--- * Insert this component on a 3d camera entity in the render world. +--- * The resolution override must be smaller than the camera's viewport size. +--- * The resolution override is specified in physical pixels. +--- * In shaders, use `View::main_pass_viewport` instead of `View::viewport`. +---@field [1] UVec2 +MainPassResolutionOverride = {} + + + +---@class ManualTextureViewHandle : ReflectReference +--- A unique id that corresponds to a specific `ManualTextureView` in the `ManualTextureViews` collection. +--- +--- See `ManualTextureViews` in `bevy_camera` for more details. +---@field [1] integer +ManualTextureViewHandle = {} + + + +---@class NormalizedRenderTarget : ReflectReference +--- Normalized version of the render target. +--- +--- Once we have this we shouldn't need to resolve it down anymore. +NormalizedRenderTarget = {} + + + +---@class RenderTarget : ReflectReference +--- The "target" that a [`Camera`] will render to. For example, this could be a `Window` +--- swapchain or an [`Image`]. +RenderTarget = {} + + + +---@class SubCameraView : ReflectReference +--- Settings to define a camera sub view. +--- +--- When [`Camera::sub_camera_view`] is `Some`, only the sub-section of the +--- image defined by `size` and `offset` (relative to the `full_size` of the +--- whole image) is projected to the cameras viewport. +--- +--- Take the example of the following multi-monitor setup: +--- ```css +--- ┌───┬───┐ +--- │ A │ B │ +--- ├───┼───┤ +--- │ C │ D │ +--- └───┴───┘ +--- ``` +--- If each monitor is 1920x1080, the whole image will have a resolution of +--- 3840x2160. For each monitor we can use a single camera with a viewport of +--- the same size as the monitor it corresponds to. To ensure that the image is +--- cohesive, we can use a different sub view on each camera: +--- - Camera A: `full_size` = 3840x2160, `size` = 1920x1080, `offset` = 0,0 +--- - Camera B: `full_size` = 3840x2160, `size` = 1920x1080, `offset` = 1920,0 +--- - Camera C: `full_size` = 3840x2160, `size` = 1920x1080, `offset` = 0,1080 +--- - Camera D: `full_size` = 3840x2160, `size` = 1920x1080, `offset` = +--- 1920,1080 +--- +--- However since only the ratio between the values is important, they could all +--- be divided by 120 and still produce the same image. Camera D would for +--- example have the following values: +--- `full_size` = 32x18, `size` = 16x9, `offset` = 16,9 +---@field full_size ? UVec2 +---@field offset ? Vec2 +---@field size ? UVec2 +SubCameraView = {} + + + +---@class Viewport : ReflectReference +--- Render viewport configuration for the [`Camera`] component. +--- +--- The viewport defines the area on the render target to which the camera renders its image. +--- You can overlay multiple cameras in a single window using viewports to create effects like +--- split screen, minimaps, and character viewers. +---@field physical_position ? UVec2 +---@field physical_size ? UVec2 +---@field depth ? Range +Viewport = {} + + + +---@class ClearColor : ReflectReference +--- A [`Resource`] that stores the default color that cameras use to clear the screen between frames. +--- +--- This color appears as the "background" color for simple apps, +--- when there are portions of the screen with nothing rendered. +--- +--- Individual cameras may use [`Camera.clear_color`] to specify a different +--- clear color or opt out of clearing their viewport. +--- +--- [`Camera.clear_color`]: crate::camera::Camera::clear_color +---@field [1] Color +ClearColor = {} + + + +---@class ClearColorConfig : ReflectReference +--- For a camera, specifies the color used to clear the viewport +--- [before rendering](crate::camera::Camera::clear_color) +--- or when [writing to the final render target texture](crate::camera::Camera::output_mode). +ClearColorConfig = {} + + + +---@class MsaaWriteback : ReflectReference +--- Controls when MSAA writeback occurs for a camera. +--- +--- MSAA writeback copies the previous camera's output into the MSAA sampled texture before +--- rendering, allowing multiple cameras to layer their results when MSAA is enabled. +MsaaWriteback = {} + + + +---@class Camera2d : ReflectReference +--- A 2D camera component. Enables the 2D render graph for a [`Camera`]. +Camera2d = {} + + + +---@class Camera3d : ReflectReference +--- A 3D camera component. Enables the main 3D render graph for a [`Camera`]. +--- +--- The camera coordinate space is right-handed X-right, Y-up, Z-back. +--- This means "forward" is -Z. +---@field depth_load_op ? Camera3dDepthLoadOp +---@field depth_texture_usages ? Camera3dDepthTextureUsage +---@field screen_space_specular_transmission_steps ? integer +---@field screen_space_specular_transmission_quality ? ScreenSpaceTransmissionQuality +Camera3d = {} + + + +---@class Camera3dDepthLoadOp : ReflectReference +--- The depth clear operation to perform for the main 3d pass. +Camera3dDepthLoadOp = {} + + + +---@class Camera3dDepthTextureUsage : ReflectReference +---@field [1] integer +Camera3dDepthTextureUsage = {} + + + +---@class ScreenSpaceTransmissionQuality : ReflectReference +--- The quality of the screen space transmission blur effect, applied to whatever's “behind” transmissive +--- objects when their `roughness` is greater than `0.0`. +--- +--- Higher qualities are more GPU-intensive. +--- +--- **Note:** You can get better-looking results at any quality level by enabling TAA. See: `TemporalAntiAliasPlugin` +ScreenSpaceTransmissionQuality = {} + + + +---@class Aabb : ReflectReference +--- An axis-aligned bounding box, defined by: +--- - a center, +--- - the distances from the center to each faces along the axis, +--- the faces are orthogonal to the axis. +--- +--- It is typically used as a component on an entity to represent the local space +--- occupied by this entity, with faces orthogonal to its local axis. +--- +--- This component is notably used during "frustum culling", a process to determine +--- if an entity should be rendered by a [`Camera`] if its bounding box intersects +--- with the camera's [`Frustum`]. +--- +--- It will be added automatically by the systems in [`CalculateBounds`] to entities that: +--- - could be subject to frustum culling, for example with a [`Mesh3d`] +--- or `Sprite` component, +--- - don't have the [`NoFrustumCulling`] component. +--- +--- It won't be updated automatically if the space occupied by the entity changes, +--- for example if the vertex positions of a [`Mesh3d`] are updated. +--- +--- [`Camera`]: crate::Camera +--- [`NoFrustumCulling`]: crate::visibility::NoFrustumCulling +--- [`CalculateBounds`]: crate::visibility::VisibilitySystems::CalculateBounds +--- [`Mesh3d`]: bevy_mesh::Mesh +---@field center ? Vec3A +---@field half_extents ? Vec3A +Aabb = {} + + + +---@class CascadesFrusta : ReflectReference +CascadesFrusta = {} + + + +---@class CubemapFrusta : ReflectReference +CubemapFrusta = {} + + + +---@class CubemapLayout : ReflectReference +--- Cubemap layout defines the order of images in a packed cubemap image. +CubemapLayout = {} + + + +---@class Frustum : ReflectReference +--- A region of 3D space defined by the intersection of 6 [`HalfSpace`]s. +--- +--- Frustums are typically an apex-truncated square pyramid (a pyramid without the top) or a cuboid. +--- +--- Half spaces are ordered left, right, top, bottom, near, far. The normal vectors +--- of the half-spaces point towards the interior of the frustum. +--- +--- A frustum component is used on an entity with a [`Camera`] component to +--- determine which entities will be considered for rendering by this camera. +--- All entities with an [`Aabb`] component that are not contained by (or crossing +--- the boundary of) the frustum will not be rendered, and not be used in rendering computations. +--- +--- This process is called frustum culling, and entities can opt out of it using +--- the [`NoFrustumCulling`] component. +--- +--- The frustum component is typically added automatically for cameras, either [`Camera2d`] or [`Camera3d`]. +--- It is usually updated automatically by [`update_frusta`] from the +--- [`CameraProjection`] component and [`GlobalTransform`] of the camera entity. +--- +--- [`Camera`]: crate::Camera +--- [`NoFrustumCulling`]: crate::visibility::NoFrustumCulling +--- [`update_frusta`]: crate::visibility::update_frusta +--- [`CameraProjection`]: crate::CameraProjection +--- [`GlobalTransform`]: bevy_transform::components::GlobalTransform +--- [`Camera2d`]: crate::Camera2d +--- [`Camera3d`]: crate::Camera3d +Frustum = {} + + + +---@class CustomProjection : ReflectReference +--- Holds a dynamic [`CameraProjection`] trait object. Use [`Projection::custom()`] to construct a +--- custom projection. +--- +--- The contained dynamic object can be downcast into a static type using [`CustomProjection::get`]. +CustomProjection = {} + + + +---@class OrthographicProjection : ReflectReference +--- Project a 3D space onto a 2D surface using parallel lines, i.e., unlike [`PerspectiveProjection`], +--- the size of objects remains the same regardless of their distance to the camera. +--- +--- The volume contained in the projection is called the *view frustum*. Since the viewport is rectangular +--- and projection lines are parallel, the view frustum takes the shape of a cuboid. +--- +--- Note that the scale of the projection and the apparent size of objects are inversely proportional. +--- As the size of the projection increases, the size of objects decreases. +--- +--- # Examples +--- +--- Configure the orthographic projection to one world unit per 100 window pixels: +--- +--- ``` +--- # use bevy_camera::{OrthographicProjection, Projection, ScalingMode}; +--- let projection = Projection::Orthographic(OrthographicProjection { +--- scaling_mode: ScalingMode::WindowSize, +--- scale: 0.01, +--- ..OrthographicProjection::default_2d() +--- }); +--- ``` +---@field near ? number +---@field far ? number +---@field viewport_origin ? Vec2 +---@field scaling_mode ? ScalingMode +---@field scale ? number +---@field area ? Rect +OrthographicProjection = {} + + + +---@class PerspectiveProjection : ReflectReference +--- A 3D camera projection in which distant objects appear smaller than close objects. +---@field fov ? number +---@field aspect_ratio ? number +---@field near ? number +---@field far ? number +---@field near_clip_plane ? Vec4 +PerspectiveProjection = {} + + + +---@class Projection : ReflectReference +--- Component that defines how to compute a [`Camera`]'s projection matrix. +--- +--- Common projections, like perspective and orthographic, are provided out of the box to handle the +--- majority of use cases. Custom projections can be added using the [`CameraProjection`] trait and +--- the [`Projection::custom`] constructor. +--- +--- ## What's a projection? +--- +--- A camera projection essentially describes how 3d points from the point of view of a camera are +--- projected onto a 2d screen. This is where properties like a camera's field of view are defined. +--- More specifically, a projection is a 4x4 matrix that transforms points from view space (the +--- point of view of the camera) into clip space. Clip space is almost, but not quite, equivalent to +--- the rectangle that is rendered to your screen, with a depth axis. Any points that land outside +--- the bounds of this cuboid are "clipped" and not rendered. +--- +--- You can also think of the projection as the thing that describes the shape of a camera's +--- frustum: the volume in 3d space that is visible to a camera. +--- +--- [`Camera`]: crate::camera::Camera +Projection = {} + + + +---@class ScalingMode : ReflectReference +--- Scaling mode for [`OrthographicProjection`]. +--- +--- The effect of these scaling modes are combined with the [`OrthographicProjection::scale`] property. +--- +--- For example, if the scaling mode is `ScalingMode::Fixed { width: 100.0, height: 300 }` and the scale is `2.0`, +--- the projection will be 200 world units wide and 600 world units tall. +--- +--- # Examples +--- +--- Configure the orthographic projection to two world units per window height: +--- +--- ``` +--- # use bevy_camera::{OrthographicProjection, Projection, ScalingMode}; +--- let projection = Projection::Orthographic(OrthographicProjection { +--- scaling_mode: ScalingMode::FixedVertical { viewport_height: 2.0 }, +--- ..OrthographicProjection::default_2d() +--- }); +--- ``` +ScalingMode = {} + + + +---@class CascadesVisibleEntities : ReflectReference +CascadesVisibleEntities = {} + + + +---@class CubemapVisibleEntities : ReflectReference +CubemapVisibleEntities = {} + + + +---@class InheritedVisibility : ReflectReference +--- Whether or not an entity is visible in the hierarchy. +--- This will not be accurate until [`VisibilityPropagate`] runs in the [`PostUpdate`] schedule. +--- +--- If this is false, then [`ViewVisibility`] should also be false. +--- +--- [`VisibilityPropagate`]: VisibilitySystems::VisibilityPropagate +---@field [1] boolean +InheritedVisibility = {} + + + +---@class NoAutoAabb : ReflectReference +--- Add this component to an entity to prevent its `AABB` from being automatically recomputed. +--- +--- This is useful if entities are already spawned with a correct `Aabb` component, or you have +--- many entities and want to avoid the cost of table scans searching for entities that need to have +--- their AABB recomputed. +NoAutoAabb = {} + + + +---@class NoFrustumCulling : ReflectReference +--- Use this component to opt-out of built-in frustum culling for entities, see +--- [`Frustum`]. +--- +--- It can be used for example: +--- - when a [`Mesh`] is updated but its [`Aabb`] is not, which might happen with animations, +--- - when using some light effects, like wanting a [`Mesh`] out of the [`Frustum`] +--- to appear in the reflection of a [`Mesh`] within. +NoFrustumCulling = {} + + + +---@class ViewVisibility : ReflectReference +--- Algorithmically computed indication of whether an entity is visible and should be extracted for +--- rendering. +--- +--- Each frame, this will be reset to `false` during [`VisibilityPropagate`] systems in +--- [`PostUpdate`]. Later in the frame, systems in [`CheckVisibility`] will mark any visible +--- entities using [`ViewVisibility::set`]. Because of this, values of this type will be marked as +--- changed every frame, even when they do not change. +--- +--- If you wish to add a custom visibility system that sets this value, be sure to add it to the +--- [`CheckVisibility`] set. +--- +--- [`VisibilityPropagate`]: VisibilitySystems::VisibilityPropagate +--- [`CheckVisibility`]: VisibilitySystems::CheckVisibility +---@field [1] integer +ViewVisibility = {} + + + +---@class Visibility : ReflectReference +--- User indication of whether an entity is visible. Propagates down the entity hierarchy. +--- +--- If an entity is hidden in this way, all [`Children`] (and all of their children and so on) who +--- are set to [`Inherited`](Self::Inherited) will also be hidden. +--- +--- This is done by the `visibility_propagate_system` which uses the entity hierarchy and +--- `Visibility` to set the values of each entity's [`InheritedVisibility`] component. +Visibility = {} + + + +---@class VisibilityClass : ReflectReference +--- A bucket into which we group entities for the purposes of visibility. +--- +--- Bevy's various rendering subsystems (3D, 2D, etc.) want to be able to +--- quickly winnow the set of entities to only those that the subsystem is +--- tasked with rendering, to avoid spending time examining irrelevant entities. +--- At the same time, Bevy wants the [`check_visibility`] system to determine +--- all entities' visibilities at the same time, regardless of what rendering +--- subsystem is responsible for drawing them. Additionally, your application +--- may want to add more types of renderable objects that Bevy determines +--- visibility for just as it does for Bevy's built-in objects. +--- +--- The solution to this problem is *visibility classes*. A visibility class is +--- a type, typically the type of a component, that represents the subsystem +--- that renders it: for example, `Mesh3d`, `Mesh2d`, and `Sprite`. The +--- [`VisibilityClass`] component stores the visibility class or classes that +--- the entity belongs to. (Generally, an object will belong to only one +--- visibility class, but in rare cases it may belong to multiple.) +--- +--- When adding a new renderable component, you'll typically want to write an +--- add-component hook that adds the type ID of that component to the +--- [`VisibilityClass`] array. See `custom_phase_item` for an example. +--- +--- `VisibilityClass` is automatically added by a hook on the `Mesh3d` and +--- `Mesh2d` components. To avoid duplicating the `VisibilityClass` and +--- causing issues when cloning, we use `#[component(clone_behavior=Ignore)]` +---@field [1] TypeId[] +VisibilityClass = {} + + + +---@class VisibleEntities : ReflectReference +--- Collection of entities visible from the current view. +--- +--- This component contains all entities which are visible from the currently +--- rendered view. The collection is updated automatically by the [`VisibilitySystems::CheckVisibility`] +--- system set. Renderers can use the equivalent `RenderVisibleEntities` to optimize rendering of +--- a particular view, to prevent drawing items not visible from that view. +--- +--- This component is intended to be attached to the same entity as the [`Camera`] and +--- the [`Frustum`] defining the view. +VisibleEntities = {} + + + +---@class VisibleMeshEntities : ReflectReference +--- Collection of mesh entities visible for 3D lighting. +--- +--- This component contains all mesh entities visible from the current light view. +--- The collection is updated automatically by `bevy_pbr::SimulationLightSystems`. +VisibleMeshEntities = {} + + + +---@class VisibilityRange : ReflectReference +--- Specifies the range of distances that this entity must be from the camera in +--- order to be rendered. +--- +--- This is also known as *hierarchical level of detail* or *HLOD*. +--- +--- Use this component when you want to render a high-polygon mesh when the +--- camera is close and a lower-polygon mesh when the camera is far away. This +--- is a common technique for improving performance, because fine details are +--- hard to see in a mesh at a distance. To avoid an artifact known as *popping* +--- between levels, each level has a *margin*, within which the object +--- transitions gradually from invisible to visible using a dithering effect. +--- +--- You can also use this feature to replace multiple meshes with a single mesh +--- when the camera is distant. This is the reason for the term "*hierarchical* +--- level of detail". Reducing the number of meshes can be useful for reducing +--- drawcall count. Note that you must place the [`VisibilityRange`] component +--- on each entity you want to be part of a LOD group, as [`VisibilityRange`] +--- isn't automatically propagated down to children. +--- +--- A typical use of this feature might look like this: +--- +--- | Entity | `start_margin` | `end_margin` | +--- |-------------------------|----------------|--------------| +--- | Root | N/A | N/A | +--- | ├─ High-poly mesh | [0, 0) | [20, 25) | +--- | ├─ Low-poly mesh | [20, 25) | [70, 75) | +--- | └─ Billboard *imposter* | [70, 75) | [150, 160) | +--- +--- With this setup, the user will see a high-poly mesh when the camera is +--- closer than 20 units. As the camera zooms out, between 20 units to 25 units, +--- the high-poly mesh will gradually fade to a low-poly mesh. When the camera +--- is 70 to 75 units away, the low-poly mesh will fade to a single textured +--- quad. And between 150 and 160 units, the object fades away entirely. Note +--- that the `end_margin` of a higher LOD is always identical to the +--- `start_margin` of the next lower LOD; this is important for the crossfade +--- effect to function properly. +---@field start_margin ? Range +---@field end_margin ? Range +---@field use_aabb ? boolean +VisibilityRange = {} + + + +---@class RenderLayers : ReflectReference +--- Defines which rendering layers an entity belongs to. +--- +--- A camera renders an entity only when their render layers intersect. +--- +--- The [`Default`] instance of `RenderLayers` contains layer `0`, the first layer. Entities +--- without this component also belong to layer `0`. +--- +--- An empty `RenderLayers` makes the entity invisible. +---@field [1] integer[] +RenderLayers = {} + + + +---@class DeferredPrepass : ReflectReference +--- If added to a [`bevy_camera::Camera3d`] then deferred materials will be rendered to the deferred gbuffer texture and will be available to subsequent passes. +--- Note the default deferred lighting plugin also requires `DepthPrepass` to work correctly. +DeferredPrepass = {} + + + +---@class ObservedBy : ReflectReference +--- Tracks a list of entity observers for the [`Entity`] [`ObservedBy`] is added to. +---@field [1] Entity[] +ObservedBy = {} + + + +---@class Image : ReflectReference +--- An image, optimized for usage in rendering. +--- +--- ## Remote Inspection +--- +--- To transmit an [`Image`] between two running Bevy apps, e.g. through BRP, use [`SerializedImage`](crate::SerializedImage). +--- This type is only meant for short-term transmission between same versions and should not be stored anywhere. +Image = {} + + + +---@class TextureAtlas : ReflectReference +--- An index into a [`TextureAtlasLayout`], which corresponds to a specific section of a texture. +--- +--- It stores a handle to [`TextureAtlasLayout`] and the index of the current section of the atlas. +--- The texture atlas contains various *sections* of a given texture, allowing users to have a single +--- image file for either sprite animation or global mapping. +--- You can change the texture [`index`](Self::index) of the atlas to animate the sprite or display only a *section* of the texture +--- for efficient rendering of related game objects. +--- +--- Check the following examples for usage: +--- - [`animated sprite sheet example`](https://github.com/bevyengine/bevy/blob/latest/examples/2d/sprite_sheet.rs) +--- - [`sprite animation event example`](https://github.com/bevyengine/bevy/blob/latest/examples/2d/sprite_animation.rs) +--- - [`texture atlas example`](https://github.com/bevyengine/bevy/blob/latest/examples/2d/texture_atlas.rs) +---@field layout ? any +---@field index ? integer +TextureAtlas = {} + + + +---@class TextureAtlasLayout : ReflectReference +--- Stores a map used to lookup the position of a texture in a [`TextureAtlas`]. +--- This can be used to either use and look up a specific section of a texture, or animate frame-by-frame as a sprite sheet. +--- +--- Optionally it can store a mapping from sub texture handles to the related area index (see +--- [`TextureAtlasBuilder`]). +--- +--- [Example usage animating sprite.](https://github.com/bevyengine/bevy/blob/latest/examples/2d/sprite_sheet.rs) +--- [Example usage animating sprite in response to an event.](https://github.com/bevyengine/bevy/blob/latest/examples/2d/sprite_animation.rs) +--- [Example usage loading sprite sheet.](https://github.com/bevyengine/bevy/blob/latest/examples/2d/texture_atlas.rs) +--- +--- [`TextureAtlasBuilder`]: crate::TextureAtlasBuilder +---@field size ? UVec2 +---@field textures ? URect[] +TextureAtlasLayout = {} + + + +---@class InputFocus : ReflectReference +--- Resource representing which entity has input focus, if any. Input events (other than pointer-like inputs) will be +--- dispatched to the current focus entity, or to the primary window if no entity has focus. +--- +--- Changing the input focus is as easy as modifying this resource. +--- +--- # Examples +--- +--- From within a system: +--- +--- ```rust +--- use bevy_ecs::prelude::*; +--- use bevy_input_focus::InputFocus; +--- +--- fn clear_focus(mut input_focus: ResMut) { +--- input_focus.clear(); +--- } +--- ``` +--- +--- With exclusive (or deferred) world access: +--- +--- ```rust +--- use bevy_ecs::prelude::*; +--- use bevy_input_focus::InputFocus; +--- +--- fn set_focus_from_world(world: &mut World) { +--- let entity = world.spawn_empty().id(); +--- +--- // Fetch the resource from the world +--- let mut input_focus = world.resource_mut::(); +--- // Then mutate it! +--- input_focus.set(entity); +--- +--- // Or you can just insert a fresh copy of the resource +--- // which will overwrite the existing one. +--- world.insert_resource(InputFocus::from_entity(entity)); +--- } +--- ``` +---@field [1] Entity | nil +InputFocus = {} + + + +---@class InputFocusVisible : ReflectReference +--- Resource representing whether the input focus indicator should be visible on UI elements. +--- +--- Note that this resource is not used by [`bevy_input_focus`](crate) itself, but is provided for +--- convenience to UI widgets or frameworks that want to display a focus indicator. +--- [`InputFocus`] may still be `Some` even if the focus indicator is not visible. +--- +--- The value of this resource should be set by your focus navigation solution. +--- For a desktop/web style of user interface this would be set to true when the user presses the tab key, +--- and set to false when the user clicks on a different element. +--- By contrast, a console-style UI intended to be navigated with a gamepad may always have the focus indicator visible. +--- +--- To easily access information about whether focus indicators should be shown for a given entity, use the [`IsFocused`] trait. +--- +--- By default, this resource is set to `false`. +---@field [1] boolean +InputFocusVisible = {} + + + +---@class AutoFocus : ReflectReference +--- Indicates that this widget should automatically receive [`InputFocus`]. +--- +--- This can be useful for things like dialog boxes, the first text input in a form, +--- or the first button in a game menu. +--- +--- The focus is swapped when this component is added +--- or an entity with this component is spawned. +AutoFocus = {} + + + +---@class AutoNavigationConfig : ReflectReference +--- Configuration resource for automatic directional navigation and for generating manual +--- navigation edges via [`auto_generate_navigation_edges`] +--- +--- This resource controls how nodes should be automatically connected in each direction. +---@field min_alignment_factor ? number +---@field max_search_distance ? number | nil +---@field prefer_aligned ? boolean +AutoNavigationConfig = {} + + + +---@class DirectionalNavigationMap : ReflectReference +--- A resource that stores the manually specified traversable graph of focusable entities. +--- +--- Each entity can have up to 8 neighbors, one for each [`CompassOctant`]. +--- +--- To ensure that your graph is intuitive to navigate and generally works correctly, it should be: +--- +--- - **Connected**: Every focusable entity should be reachable from every other focusable entity. +--- - **Symmetric**: If entity A is a neighbor of entity B, then entity B should be a neighbor of entity A, ideally in the reverse direction. +--- - **Physical**: The direction of navigation should match the layout of the entities when possible, +--- although looping around the edges of the screen is also acceptable. +--- - **Not self-connected**: An entity should not be a neighbor of itself; use [`None`] instead. +--- +--- This graph must be built and maintained manually, and the developer is responsible for ensuring that it meets the above criteria. +--- Notably, if the developer adds or removes the navigability of an entity, the developer should update the map as necessary. +---@field neighbors ? any +DirectionalNavigationMap = {} + + + +---@class FocusableArea : ReflectReference +--- A focusable area with position and size information. +--- +--- This struct represents a UI element used during directional navigation, +--- containing its entity ID, center position, and size for spatial navigation calculations. +--- +--- The term "focusable area" avoids confusion with UI `Node` components in `bevy_ui`. +---@field entity ? Entity +---@field position ? Vec2 +---@field size ? Vec2 +FocusableArea = {} + + + +---@class NavNeighbors : ReflectReference +--- The up-to-eight neighbors of a focusable entity, one for each [`CompassOctant`]. +---@field neighbors ? Entity | nil[] +NavNeighbors = {} + + + +---@class TabGroup : ReflectReference +--- A component used to mark a tree of entities as containing tabbable elements. +---@field order ? integer +---@field modal ? boolean +TabGroup = {} + + + +---@class TabIndex : ReflectReference +--- A component which indicates that an entity wants to participate in tab navigation. +--- +--- Note that you must also add the [`TabGroup`] component to the entity's ancestor in order +--- for this component to have any effect. +---@field [1] integer +TabIndex = {} + + + +---@class Affine3 : ReflectReference +--- Reduced-size version of `glam::Affine3A` for use when storage has +--- significant performance impact. Convert to `glam::Affine3A` to do +--- non-trivial calculations. +---@field matrix3 ? Mat3 +---@field translation ? Vec3 +Affine3 = {} + + + +---@class Mesh2d : ReflectReference +--- A component for 2D meshes. Requires a [`MeshMaterial2d`] to be rendered, commonly using a [`ColorMaterial`]. +--- +--- [`MeshMaterial2d`]: +--- [`ColorMaterial`]: +--- +--- # Example +--- +--- ```ignore +--- # use bevy_sprite::{ColorMaterial, MeshMaterial2d}; +--- # use bevy_ecs::prelude::*; +--- # use bevy_mesh::{Mesh, Mesh2d}; +--- # use bevy_color::palettes::basic::RED; +--- # use bevy_asset::Assets; +--- # use bevy_math::primitives::Circle; +--- # +--- // Spawn an entity with a mesh using `ColorMaterial`. +--- fn setup( +--- mut commands: Commands, +--- mut meshes: ResMut>, +--- mut materials: ResMut>, +--- ) { +--- commands.spawn(( +--- Mesh2d(meshes.add(Circle::new(50.0))), +--- MeshMaterial2d(materials.add(ColorMaterial::from_color(RED))), +--- )); +--- } +--- ``` +---@field [1] any +Mesh2d = {} + + + +---@class Mesh3d : ReflectReference +--- A component for 3D meshes. Requires a [`MeshMaterial3d`] to be rendered, commonly using a [`StandardMaterial`]. +--- +--- [`MeshMaterial3d`]: +--- [`StandardMaterial`]: +--- +--- # Example +--- +--- ```ignore +--- # use bevy_pbr::{Material, MeshMaterial3d, StandardMaterial}; +--- # use bevy_ecs::prelude::*; +--- # use bevy_mesh::{Mesh, Mesh3d}; +--- # use bevy_color::palettes::basic::RED; +--- # use bevy_asset::Assets; +--- # use bevy_math::primitives::Capsule3d; +--- # +--- // Spawn an entity with a mesh using `StandardMaterial`. +--- fn setup( +--- mut commands: Commands, +--- mut meshes: ResMut>, +--- mut materials: ResMut>, +--- ) { +--- commands.spawn(( +--- Mesh3d(meshes.add(Capsule3d::default())), +--- MeshMaterial3d(materials.add(StandardMaterial { +--- base_color: RED.into(), +--- ..Default::default() +--- })), +--- )); +--- } +--- ``` +---@field [1] any +Mesh3d = {} + + + +---@class MeshTag : ReflectReference +--- A component that stores an arbitrary index used to identify the mesh instance when rendering. +---@field [1] integer +MeshTag = {} + + + +---@class Indices : ReflectReference +--- An array of indices into the [`VertexAttributeValues`](super::VertexAttributeValues) for a mesh. +--- +--- It describes the order in which the vertex attributes should be joined into faces. +Indices = {} + + + +---@class Mesh : ReflectReference +--- A 3D object made out of vertices representing triangles, lines, or points, +--- with "attribute" values for each vertex. +--- +--- Meshes can be automatically generated by a bevy `AssetLoader` (generally by loading a `Gltf` file), +--- or by converting a [primitive](bevy_math::primitives) using [`into`](Into). +--- It is also possible to create one manually. They can be edited after creation. +--- +--- Meshes can be rendered with a [`Mesh2d`](crate::Mesh2d) and `MeshMaterial2d` +--- or [`Mesh3d`](crate::Mesh3d) and `MeshMaterial3d` for 2D and 3D respectively. +--- +--- A [`Mesh`] in Bevy is equivalent to a "primitive" in the glTF format, for a +--- glTF Mesh representation, see `GltfMesh`. +--- +--- ## Manual creation +--- +--- The following function will construct a flat mesh, to be rendered with a +--- `StandardMaterial` or `ColorMaterial`: +--- +--- ``` +--- # use bevy_mesh::{Mesh, Indices, PrimitiveTopology}; +--- # use bevy_asset::RenderAssetUsages; +--- fn create_simple_parallelogram() -> Mesh { +--- // Create a new mesh using a triangle list topology, where each set of 3 vertices composes a triangle. +--- Mesh::new(PrimitiveTopology::TriangleList, RenderAssetUsages::default()) +--- // Add 4 vertices, each with its own position attribute (coordinate in +--- // 3D space), for each of the corners of the parallelogram. +--- .with_inserted_attribute( +--- Mesh::ATTRIBUTE_POSITION, +--- vec![[0.0, 0.0, 0.0], [1.0, 2.0, 0.0], [2.0, 2.0, 0.0], [1.0, 0.0, 0.0]] +--- ) +--- // Assign a UV coordinate to each vertex. +--- .with_inserted_attribute( +--- Mesh::ATTRIBUTE_UV_0, +--- vec![[0.0, 1.0], [0.5, 0.0], [1.0, 0.0], [0.5, 1.0]] +--- ) +--- // Assign normals (everything points outwards) +--- .with_inserted_attribute( +--- Mesh::ATTRIBUTE_NORMAL, +--- vec![[0.0, 0.0, 1.0], [0.0, 0.0, 1.0], [0.0, 0.0, 1.0], [0.0, 0.0, 1.0]] +--- ) +--- // After defining all the vertices and their attributes, build each triangle using the +--- // indices of the vertices that make it up in a counter-clockwise order. +--- .with_inserted_indices(Indices::U32(vec![ +--- // First triangle +--- 0, 3, 1, +--- // Second triangle +--- 1, 3, 2 +--- ])) +--- } +--- ``` +--- +--- You can see how it looks like [here](https://github.com/bevyengine/bevy/blob/main/assets/docs/Mesh.png), +--- used in a [`Mesh3d`](crate::Mesh3d) with a square bevy logo texture, with added axis, points, +--- lines and text for clarity. +--- +--- ## Other examples +--- +--- For further visualization, explanation, and examples, see the built-in Bevy examples, +--- and the [implementation of the built-in shapes](https://github.com/bevyengine/bevy/tree/main/crates/bevy_mesh/src/primitives). +--- In particular, [generate_custom_mesh](https://github.com/bevyengine/bevy/blob/main/examples/3d/generate_custom_mesh.rs) +--- teaches you to access and modify the attributes of a [`Mesh`] after creating it. +--- +--- ## Common points of confusion +--- +--- - UV maps in Bevy start at the top-left, see [`ATTRIBUTE_UV_0`](Mesh::ATTRIBUTE_UV_0), +--- other APIs can have other conventions, `OpenGL` starts at bottom-left. +--- - It is possible and sometimes useful for multiple vertices to have the same +--- [position attribute](Mesh::ATTRIBUTE_POSITION) value, +--- it's a common technique in 3D modeling for complex UV mapping or other calculations. +--- - Bevy performs frustum culling based on the `Aabb` of meshes, which is calculated +--- and added automatically for new meshes only. If a mesh is modified, the entity's `Aabb` +--- needs to be updated manually or deleted so that it is re-calculated. +--- +--- ## Use with `StandardMaterial` +--- +--- To render correctly with `StandardMaterial`, a mesh needs to have properly defined: +--- - [`UVs`](Mesh::ATTRIBUTE_UV_0): Bevy needs to know how to map a texture onto the mesh +--- (also true for `ColorMaterial`). +--- - [`Normals`](Mesh::ATTRIBUTE_NORMAL): Bevy needs to know how light interacts with your mesh. +--- [0.0, 0.0, 1.0] is very common for simple flat meshes on the XY plane, +--- because simple meshes are smooth and they don't require complex light calculations. +--- - Vertex winding order: by default, `StandardMaterial.cull_mode` is `Some(Face::Back)`, +--- which means that Bevy would *only* render the "front" of each triangle, which +--- is the side of the triangle from where the vertices appear in a *counter-clockwise* order. +--- +--- ## Remote Inspection +--- +--- To transmit a [`Mesh`] between two running Bevy apps, e.g. through BRP, use [`SerializedMesh`]. +--- This type is only meant for short-term transmission between same versions and should not be stored anywhere. +---@field indices ? any +---@field morph_targets ? any +---@field morph_target_names ? any +---@field asset_usage ? RenderAssetUsages +---@field enable_raytracing ? boolean +---@field final_aabb ? Aabb3d | nil +Mesh = {} + + + +---@class MeshMorphWeights : ReflectReference +--- Control a specific [`Mesh`] instance's [morph targets]. These control the weights of +--- specific "mesh primitives" in scene formats like GLTF. They can be set manually, but +--- in most cases they should "automatically" synced by setting the [`MorphWeights`] component +--- on a parent entity. +--- +--- See [`MorphWeights`] for more details on Bevy's morph target implementation. +--- +--- Add this to an [`Entity`] with a [`Mesh3d`](crate::Mesh3d) with a [`MorphAttributes`] set +--- to control individual weights of each morph target. +--- +--- [morph targets]: https://en.wikipedia.org/wiki/Morph_target_animation +---@field weights ? number[] +MeshMorphWeights = {} + + + +---@class MorphWeights : ReflectReference +--- Controls the [morph targets] for all child [`Mesh3d`](crate::Mesh3d) entities. In most cases, [`MorphWeights`] should be considered +--- the "source of truth" when writing morph targets for meshes. However you can choose to write child [`MeshMorphWeights`] +--- if your situation requires more granularity. Just note that if you set [`MorphWeights`], it will overwrite child +--- [`MeshMorphWeights`] values. +--- +--- This exists because Bevy's [`Mesh`] corresponds to a _single_ surface / material, whereas morph targets +--- as defined in the GLTF spec exist on "multi-primitive meshes" (where each primitive is its own surface with its own material). +--- Therefore in Bevy [`MorphWeights`] an a parent entity are the "canonical weights" from a GLTF perspective, which then +--- synchronized to child [`Mesh3d`](crate::Mesh3d) / [`MeshMorphWeights`] (which correspond to "primitives" / "surfaces" from a GLTF perspective). +--- +--- Add this to the parent of one or more [`Entities`](`Entity`) with a [`Mesh3d`](crate::Mesh3d) with a [`MeshMorphWeights`]. +--- +--- [morph targets]: https://en.wikipedia.org/wiki/Morph_target_animation +---@field weights ? number[] +---@field first_mesh ? any +MorphWeights = {} + + + +---@class AnnulusMeshBuilder : ReflectReference +--- A builder for creating a [`Mesh`] with an [`Annulus`] shape. +---@field annulus ? Annulus +---@field resolution ? integer +AnnulusMeshBuilder = {} + + + +---@class Capsule2dMeshBuilder : ReflectReference +--- A builder used for creating a [`Mesh`] with a [`Capsule2d`] shape. +---@field capsule ? Capsule2d +---@field resolution ? integer +Capsule2dMeshBuilder = {} + + + +---@class CircleMeshBuilder : ReflectReference +--- A builder used for creating a [`Mesh`] with a [`Circle`] shape. +---@field circle ? Circle +---@field resolution ? integer +CircleMeshBuilder = {} + + + +---@class CircularMeshUvMode : ReflectReference +--- Specifies how to generate UV-mappings for the [`CircularSector`] and [`CircularSegment`] shapes. +--- +--- Currently the only variant is `Mask`, which is good for showing a portion of a texture that includes +--- the entire circle, particularly the same texture will be displayed with different fractions of a +--- complete circle. +--- +--- It's expected that more will be added in the future, such as a variant that causes the texture to be +--- scaled to fit the bounding box of the shape, which would be good for packed textures only including the +--- portion of the circle that is needed to display. +CircularMeshUvMode = {} + + + +---@class CircularSectorMeshBuilder : ReflectReference +--- A builder used for creating a [`Mesh`] with a [`CircularSector`] shape. +--- +--- The resulting mesh will have a UV-map such that the center of the circle is +--- at the center of the texture. +---@field sector ? CircularSector +---@field resolution ? integer +---@field uv_mode ? CircularMeshUvMode +CircularSectorMeshBuilder = {} + + + +---@class CircularSegmentMeshBuilder : ReflectReference +--- A builder used for creating a [`Mesh`] with a [`CircularSegment`] shape. +--- +--- The resulting mesh will have a UV-map such that the center of the circle is +--- at the center of the texture. +---@field segment ? CircularSegment +---@field resolution ? integer +---@field uv_mode ? CircularMeshUvMode +CircularSegmentMeshBuilder = {} + + + +---@class ConvexPolygonMeshBuilder : ReflectReference +--- A builder used for creating a [`Mesh`] with a [`ConvexPolygon`] shape. +--- +--- You must verify that the `vertices` are not concave when constructing this type. You can +--- guarantee this by creating a [`ConvexPolygon`] first, then calling [`ConvexPolygon::mesh()`]. +---@field vertices ? Vec2[] +ConvexPolygonMeshBuilder = {} + + + +---@class EllipseMeshBuilder : ReflectReference +--- A builder used for creating a [`Mesh`] with an [`Ellipse`] shape. +---@field ellipse ? Ellipse +---@field resolution ? integer +EllipseMeshBuilder = {} + + + +---@class Polyline2dMeshBuilder : ReflectReference +--- A builder used for creating a [`Mesh`] with a [`Polyline2d`] shape. +---@field polyline ? Polyline2d +Polyline2dMeshBuilder = {} + + + +---@class RectangleMeshBuilder : ReflectReference +--- A builder used for creating a [`Mesh`] with a [`Rectangle`] shape. +---@field half_size ? Vec2 +RectangleMeshBuilder = {} + + + +---@class RegularPolygonMeshBuilder : ReflectReference +--- A builder used for creating a [`Mesh`] with a [`RegularPolygon`] shape. +---@field circumradius ? number +---@field sides ? integer +RegularPolygonMeshBuilder = {} + + + +---@class RhombusMeshBuilder : ReflectReference +--- A builder for creating a [`Mesh`] with an [`Rhombus`] shape. +---@field half_diagonals ? Vec2 +RhombusMeshBuilder = {} + + + +---@class Triangle2dMeshBuilder : ReflectReference +--- A builder used for creating a [`Mesh`] with a [`Triangle2d`] shape. +---@field triangle ? Triangle2d +Triangle2dMeshBuilder = {} + + + +---@class Capsule3dMeshBuilder : ReflectReference +--- A builder used for creating a [`Mesh`] with a [`Capsule3d`] shape. +---@field capsule ? Capsule3d +---@field rings ? integer +---@field longitudes ? integer +---@field latitudes ? integer +---@field uv_profile ? CapsuleUvProfile +Capsule3dMeshBuilder = {} + + + +---@class CapsuleUvProfile : ReflectReference +--- Manner in which UV coordinates are distributed vertically. +CapsuleUvProfile = {} + + + +---@class ConeAnchor : ReflectReference +--- Anchoring options for [`ConeMeshBuilder`] +ConeAnchor = {} + + + +---@class ConeMeshBuilder : ReflectReference +--- A builder used for creating a [`Mesh`] with a [`Cone`] shape. +---@field cone ? Cone +---@field resolution ? integer +---@field anchor ? ConeAnchor +ConeMeshBuilder = {} + + + +---@class ConicalFrustumMeshBuilder : ReflectReference +--- A builder used for creating a [`Mesh`] with a [`ConicalFrustum`] shape. +---@field frustum ? ConicalFrustum +---@field resolution ? integer +---@field segments ? integer +ConicalFrustumMeshBuilder = {} + + + +---@class CuboidMeshBuilder : ReflectReference +--- A builder used for creating a [`Mesh`] with a [`Cuboid`] shape. +---@field half_size ? Vec3 +CuboidMeshBuilder = {} + + + +---@class CylinderAnchor : ReflectReference +--- Anchoring options for [`CylinderMeshBuilder`] +CylinderAnchor = {} + + + +---@class CylinderMeshBuilder : ReflectReference +--- A builder used for creating a [`Mesh`] with a [`Cylinder`] shape. +---@field cylinder ? Cylinder +---@field resolution ? integer +---@field segments ? integer +---@field caps ? boolean +---@field anchor ? CylinderAnchor +CylinderMeshBuilder = {} + + + +---@class PlaneMeshBuilder : ReflectReference +--- A builder used for creating a [`Mesh`] with a [`Plane3d`] shape. +---@field plane ? Plane3d +---@field subdivisions ? integer +PlaneMeshBuilder = {} + + + +---@class Polyline3dMeshBuilder : ReflectReference +--- A builder used for creating a [`Mesh`] with a [`Polyline3d`] shape. +---@field polyline ? Polyline3d +Polyline3dMeshBuilder = {} + + + +---@class Segment3dMeshBuilder : ReflectReference +--- A builder used for creating a [`Mesh`] with a [`Segment3d`] shape. +---@field segment ? Segment3d +Segment3dMeshBuilder = {} + + + +---@class SphereKind : ReflectReference +--- A type of sphere mesh. +SphereKind = {} + + + +---@class SphereMeshBuilder : ReflectReference +--- A builder used for creating a [`Mesh`] with an [`Sphere`] shape. +---@field sphere ? Sphere +---@field kind ? SphereKind +SphereMeshBuilder = {} + + + +---@class TetrahedronMeshBuilder : ReflectReference +--- A builder used for creating a [`Mesh`] with a [`Tetrahedron`] shape. +---@field tetrahedron ? Tetrahedron +TetrahedronMeshBuilder = {} + + + +---@class TorusMeshBuilder : ReflectReference +--- A builder used for creating a [`Mesh`] with a [`Torus`] shape. +---@field torus ? Torus +---@field minor_resolution ? integer +---@field major_resolution ? integer +---@field angle_range ? RangeInclusive +TorusMeshBuilder = {} + + + +---@class Triangle3dMeshBuilder : ReflectReference +--- A builder used for creating a [`Mesh`] with a [`Triangle3d`] shape. +---@field triangle ? Triangle3d +Triangle3dMeshBuilder = {} + + + +---@class SkinnedMesh : ReflectReference +---@field inverse_bindposes ? bevy_asset::handle::Handle +---@field joints ? Entity[] +SkinnedMesh = {} + + + +---@class ScriptAsset : ReflectReference +--- Represents a script loaded into memory as an asset +ScriptAsset = {} + + + +---@class FunctionArgInfo : ReflectReference +--- Information about a function argument. +---@field name ? Cow | nil +---@field arg_index ? integer +---@field type_id ? TypeId +FunctionArgInfo = {} + + + +---@class FunctionInfo : ReflectReference +--- Information about a function. +---@field name ? Cow +---@field namespace ? Namespace +---@field arg_info ? FunctionArgInfo[] +---@field return_info ? FunctionReturnInfo +---@field docs ? Cow | nil +FunctionInfo = {} + + + +---@class FunctionReturnInfo : ReflectReference +--- Information about a function return value. +---@field type_id ? TypeId +FunctionReturnInfo = {} + + + +---@class InteropError : ReflectReference +--- An error occurring when converting between rust and a script context. +InteropError = {} + + + +---@class Namespace : ReflectReference +--- A namespace for functions +Namespace = {} + + + +---@class LocationContext : ReflectReference +--- Describes a location within a script +---@field script_name ? string | nil +---@field line ? integer +---@field col ? integer | nil +LocationContext = {} + + + +---@class DynamicComponent : ReflectReference +--- A dynamic script component +---@field data ? ScriptValue +DynamicComponent = {} + + + +---@class VariadicTuple : ReflectReference +--- A tuple variant of script value +VariadicTuple = {} + + + +---@class ScriptError : ReflectReference +--- An error with an optional script Context +ScriptError = {} + + + +---@class CallbackLabel : ReflectReference +--- A string which disallows common invalid characters in callback labels, +--- particularly at the start of the string +--- +--- a valid callback label starts with a letter or underscore, and contains only ascii characters, as well as disallows some common keywords +---@field [1] string +CallbackLabel = {} + + + +---@class ScriptComponent : ReflectReference +--- A component which identifies the scripts existing on an entity. +--- +--- Event handlers search for components with this component to figure out which scripts to run and on which entities. +---@field [1] any +ScriptComponent = {} + + + +---@class ContextKey : ReflectReference +--- The key for a context. The context key is used for: +--- - Identifying the script itself, uniquely. +--- - later on it's mapped to a context, which will determine how the scripts are grouped in execution environments. +---@field entity ? Entity | nil +---@field script ? any +ContextKey = {} + + + +---@class AlphaMode : ReflectReference +--- Sets how a material's base color alpha channel is used for transparency. +AlphaMode = {} + + + +---@class CameraRenderGraph : ReflectReference +--- Configures the [`RenderGraph`] name assigned to be run for a given [`Camera`] entity. +CameraRenderGraph = {} + + + +---@class MipBias : ReflectReference +--- Camera component specifying a mip bias to apply when sampling from material textures. +--- +--- Often used in conjunction with antialiasing post-process effects to reduce textures blurriness. +---@field [1] number +MipBias = {} + + + +---@class TemporalJitter : ReflectReference +--- A subpixel offset to jitter a perspective camera's frustum by. +--- +--- Useful for temporal rendering techniques. +---@field offset ? Vec2 +TemporalJitter = {} + + + +---@class OcclusionCulling : ReflectReference +--- Add this component to a view in order to enable experimental GPU occlusion +--- culling. +--- +--- *Bevy's occlusion culling is currently marked as experimental.* There are +--- known issues whereby, in rare circumstances, occlusion culling can result in +--- meshes being culled that shouldn't be (i.e. meshes that turn invisible). +--- Please try it out and report issues. +--- +--- *Occlusion culling* allows Bevy to avoid rendering objects that are fully +--- behind other opaque or alpha tested objects. This is different from, and +--- complements, depth fragment rejection as the `DepthPrepass` enables. While +--- depth rejection allows Bevy to avoid rendering *pixels* that are behind +--- other objects, the GPU still has to examine those pixels to reject them, +--- which requires transforming the vertices of the objects and performing +--- skinning if the objects were skinned. Occlusion culling allows the GPU to go +--- a step further, avoiding even transforming the vertices of objects that it +--- can quickly prove to be behind other objects. +--- +--- Occlusion culling inherently has some overhead, because Bevy must examine +--- the objects' bounding boxes, and create an acceleration structure +--- (hierarchical Z-buffer) to perform the occlusion tests. Therefore, occlusion +--- culling is disabled by default. Only enable it if you measure it to be a +--- speedup on your scene. Note that, because Bevy's occlusion culling runs on +--- the GPU and is quite efficient, it's rare for occlusion culling to result in +--- a significant slowdown. +--- +--- Occlusion culling currently requires a `DepthPrepass`. If no depth prepass +--- is present on the view, the [`OcclusionCulling`] component will be ignored. +--- Additionally, occlusion culling is currently incompatible with deferred +--- shading; including both `DeferredPrepass` and [`OcclusionCulling`] results +--- in unspecified behavior. +--- +--- The algorithm that Bevy uses is known as [*two-phase occlusion culling*]. +--- When you enable occlusion culling, Bevy splits the depth prepass into two: +--- an *early* depth prepass and a *late* depth prepass. The early depth prepass +--- renders all the meshes that were visible last frame to produce a +--- conservative approximation of the depth buffer. Then, after producing an +--- acceleration structure known as a hierarchical Z-buffer or depth pyramid, +--- Bevy tests the bounding boxes of all meshes against that depth buffer. Those +--- that can be quickly proven to be behind the geometry rendered during the +--- early depth prepass are skipped entirely. The other potentially-visible +--- meshes are rendered during the late prepass, and finally all the visible +--- meshes are rendered as usual during the opaque, transparent, etc. passes. +--- +--- Unlike other occlusion culling systems you may be familiar with, Bevy's +--- occlusion culling is fully dynamic and requires no baking step. The CPU +--- overhead is minimal. Large skinned meshes and other dynamic objects can +--- occlude other objects. +--- +--- [*two-phase occlusion culling*]: +--- https://medium.com/@mil_kru/two-pass-occlusion-culling-4100edcad501 +OcclusionCulling = {} + + + +---@class GlobalsUniform : ReflectReference +--- Contains global values useful when writing shaders. +--- Currently only contains values related to time. +---@field time ? number +---@field delta_time ? number +---@field frame_count ? integer +GlobalsUniform = {} + + + +---@class ReadbackComplete : ReflectReference +--- An event that is triggered when a gpu readback is complete. +--- +--- The event contains the data as a `Vec`, which can be interpreted as the raw bytes of the +--- requested buffer or texture. +---@field entity ? Entity +---@field data ? integer[] +ReadbackComplete = {} + + + +---@class ShaderStorageBuffer : ReflectReference +--- A storage buffer that is prepared as a [`RenderAsset`] and uploaded to the GPU. +ShaderStorageBuffer = {} + + + +---@class MainEntity : ReflectReference +--- Component added on the render world entities to keep track of the corresponding main world entity. +--- +--- Can also be used as a newtype wrapper for main world entities. +---@field [1] Entity +MainEntity = {} + + + +---@class RenderEntity : ReflectReference +--- Component added on the main world entities that are synced to the Render World in order to keep track of the corresponding render world entity. +--- +--- Can also be used as a newtype wrapper for render world entities. +---@field [1] Entity +RenderEntity = {} + + + +---@class SyncToRenderWorld : ReflectReference +--- Marker component that indicates that its entity needs to be synchronized to the render world. +--- +--- This component is automatically added as a required component by [`ExtractComponentPlugin`] and [`SyncComponentPlugin`]. +--- For more information see [`SyncWorldPlugin`]. +--- +--- NOTE: This component should persist throughout the entity's entire lifecycle. +--- If this component is removed from its entity, the entity will be despawned. +--- +--- [`ExtractComponentPlugin`]: crate::extract_component::ExtractComponentPlugin +--- [`SyncComponentPlugin`]: crate::sync_component::SyncComponentPlugin +SyncToRenderWorld = {} + + + +---@class TemporaryRenderEntity : ReflectReference +--- Marker component that indicates that its entity needs to be despawned at the end of the frame. +TemporaryRenderEntity = {} + + + +---@class ColorGrading : ReflectReference +--- Configures filmic color grading parameters to adjust the image appearance. +--- +--- Color grading is applied just before tonemapping for a given +--- [`Camera`](bevy_camera::Camera) entity, with the sole exception of the +--- `post_saturation` value in [`ColorGradingGlobal`], which is applied after +--- tonemapping. +---@field global ? ColorGradingGlobal +---@field shadows ? ColorGradingSection +---@field midtones ? ColorGradingSection +---@field highlights ? ColorGradingSection +ColorGrading = {} + + + +---@class ColorGradingGlobal : ReflectReference +--- Filmic color grading values applied to the image as a whole (as opposed to +--- individual sections, like shadows and highlights). +---@field exposure ? number +---@field temperature ? number +---@field tint ? number +---@field hue ? number +---@field post_saturation ? number +---@field midtones_range ? Range +ColorGradingGlobal = {} + + + +---@class ColorGradingSection : ReflectReference +--- A section of color grading values that can be selectively applied to +--- shadows, midtones, and highlights. +---@field saturation ? number +---@field contrast ? number +---@field gamma ? number +---@field gain ? number +---@field lift ? number +ColorGradingSection = {} + + + +---@class Hdr : ReflectReference +--- If this component is added to a camera, the camera will use an intermediate "high dynamic range" render texture. +--- This allows rendering with a wider range of lighting values. However, this does *not* affect +--- whether the camera will render with hdr display output (which bevy does not support currently) +--- and only affects the intermediate render texture. +Hdr = {} + + + +---@class Msaa : ReflectReference +--- Component for configuring the number of samples for [Multi-Sample Anti-Aliasing](https://en.wikipedia.org/wiki/Multisample_anti-aliasing) +--- for a [`Camera`](bevy_camera::Camera). +--- +--- Defaults to 4 samples. A higher number of samples results in smoother edges. +--- +--- Some advanced rendering features may require that MSAA is disabled. +--- +--- Note that the web currently only supports 1 or 4 samples. +Msaa = {} + + + +---@class RenderVisibleEntities : ReflectReference +--- Collection of entities visible from the current view. +--- +--- This component is extracted from [`VisibleEntities`]. +RenderVisibleEntities = {} + + + +---@class Screenshot : ReflectReference +--- A component that signals to the renderer to capture a screenshot this frame. +--- +--- This component should be spawned on a new entity with an observer that will trigger +--- with [`ScreenshotCaptured`] when the screenshot is ready. +--- +--- Screenshots are captured asynchronously and may not be available immediately after the frame +--- that the component is spawned on. The observer should be used to handle the screenshot when it +--- is ready. +--- +--- Note that the screenshot entity will be despawned after the screenshot is captured and the +--- observer is triggered. +--- +--- # Usage +--- +--- ``` +--- # use bevy_ecs::prelude::*; +--- # use bevy_render::view::screenshot::{save_to_disk, Screenshot}; +--- +--- fn take_screenshot(mut commands: Commands) { +--- commands.spawn(Screenshot::primary_window()) +--- .observe(save_to_disk("screenshot.png")); +--- } +--- ``` +---@field [1] RenderTarget +Screenshot = {} + + + +---@class ScreenshotCaptured : ReflectReference +---@field entity ? Entity +---@field image ? Image +ScreenshotCaptured = {} + + + +---@class Anchor : ReflectReference +--- Normalized (relative to its size) offset of a 2d renderable entity from its [`Transform`]. +---@field [1] Vec2 +Anchor = {} + + + +---@class Sprite : ReflectReference +--- Describes a sprite to be rendered to a 2D camera +---@field image ? any +---@field texture_atlas ? TextureAtlas | nil +---@field color ? Color +---@field flip_x ? boolean +---@field flip_y ? boolean +---@field custom_size ? Vec2 | nil +---@field rect ? Rect | nil +---@field image_mode ? SpriteImageMode +Sprite = {} + + + +---@class SpriteImageMode : ReflectReference +--- Controls how the image is altered when scaled. +SpriteImageMode = {} + + + +---@class SpriteScalingMode : ReflectReference +--- Represents various modes for proportional scaling of a texture. +--- +--- Can be used in [`SpriteImageMode::Scale`]. +SpriteScalingMode = {} + + + +---@class Text2d : ReflectReference +--- The top-level 2D text component. +--- +--- Adding `Text2d` to an entity will pull in required components for setting up 2d text. +--- [Example usage.](https://github.com/bevyengine/bevy/blob/latest/examples/2d/text2d.rs) +--- +--- The string in this component is the first 'text span' in a hierarchy of text spans that are collected into +--- a [`ComputedTextBlock`]. See `TextSpan` for the component used by children of entities with [`Text2d`]. +--- +--- With `Text2d` the `justify` field of [`TextLayout`] only affects the internal alignment of a block of text and not its +--- relative position, which is controlled by the [`Anchor`] component. +--- This means that for a block of text consisting of only one line that doesn't wrap, the `justify` field will have no effect. +--- +--- +--- ``` +--- # use bevy_asset::Handle; +--- # use bevy_color::Color; +--- # use bevy_color::palettes::basic::BLUE; +--- # use bevy_ecs::world::World; +--- # use bevy_text::{Font, Justify, TextLayout, TextFont, TextColor, TextSpan}; +--- # use bevy_sprite::Text2d; +--- # +--- # let font_handle: Handle = Default::default(); +--- # let mut world = World::default(); +--- # +--- // Basic usage. +--- world.spawn(Text2d::new("hello world!")); +--- +--- // With non-default style. +--- world.spawn(( +--- Text2d::new("hello world!"), +--- TextFont { +--- font: font_handle.clone().into(), +--- font_size: 60.0, +--- ..Default::default() +--- }, +--- TextColor(BLUE.into()), +--- )); +--- +--- // With text justification. +--- world.spawn(( +--- Text2d::new("hello world\nand bevy!"), +--- TextLayout::new_with_justify(Justify::Center) +--- )); +--- +--- // With spans +--- world.spawn(Text2d::new("hello ")).with_children(|parent| { +--- parent.spawn(TextSpan::new("world")); +--- parent.spawn((TextSpan::new("!"), TextColor(BLUE.into()))); +--- }); +--- ``` +---@field [1] string +Text2d = {} + + + +---@class Text2dShadow : ReflectReference +--- Adds a shadow behind `Text2d` text +--- +--- Use `TextShadow` for text drawn with `bevy_ui` +---@field offset ? Vec2 +---@field color ? Color +Text2dShadow = {} + + + +---@class BorderRect : ReflectReference +--- Defines border insets that shrink a rectangle from its minimum and maximum corners. +--- +--- This struct is used to represent thickness or offsets from the four edges +--- of a rectangle, with values increasing inwards. +---@field min_inset ? Vec2 +---@field max_inset ? Vec2 +BorderRect = {} + + + +---@class SliceScaleMode : ReflectReference +--- Defines how a texture slice scales when resized +SliceScaleMode = {} + + + +---@class TextureSlicer : ReflectReference +--- Slices a texture using the **9-slicing** technique. This allows to reuse an image at various sizes +--- without needing to prepare multiple assets. The associated texture will be split into nine portions, +--- so that on resize the different portions scale or tile in different ways to keep the texture in proportion. +--- +--- For example, when resizing a 9-sliced texture the corners will remain unscaled while the other +--- sections will be scaled or tiled. +--- +--- See [9-sliced](https://en.wikipedia.org/wiki/9-slice_scaling) textures. +---@field border ? BorderRect +---@field center_scale_mode ? SliceScaleMode +---@field sides_scale_mode ? SliceScaleMode +---@field max_corner_scale ? number +TextureSlicer = {} + + + +---@class ColorMaterial : ReflectReference +--- A [2d material](Material2d) that renders [2d meshes](crate::Mesh2d) with a texture tinted by a uniform color +---@field color ? Color +---@field alpha_mode ? AlphaMode2d +---@field uv_transform ? Affine2 +---@field texture ? any +ColorMaterial = {} + + + +---@class AlphaMode2d : ReflectReference +--- Sets how a 2d material's base color alpha channel is used for transparency. +--- Currently, this only works with [`Mesh2d`]. Sprites are always transparent. +--- +--- This is very similar to [`AlphaMode`](bevy_render::alpha::AlphaMode) but this only applies to 2d meshes. +--- We use a separate type because 2d doesn't support all the transparency modes that 3d does. +AlphaMode2d = {} + + + +---@class Mesh2dWireframe : ReflectReference +---@field [1] any +Mesh2dWireframe = {} + + + +---@class NoWireframe2d : ReflectReference +--- Disables wireframe rendering for any entity it is attached to. +--- It will ignore the [`Wireframe2dConfig`] global setting. +--- +--- This requires the [`Wireframe2dPlugin`] to be enabled. +NoWireframe2d = {} + + + +---@class Wireframe2d : ReflectReference +--- Enables wireframe rendering for any entity it is attached to. +--- It will ignore the [`Wireframe2dConfig`] global setting. +--- +--- This requires the [`Wireframe2dPlugin`] to be enabled. +Wireframe2d = {} + + + +---@class Wireframe2dColor : ReflectReference +--- Sets the color of the [`Wireframe2d`] of the entity it is attached to. +--- +--- If this component is present but there's no [`Wireframe2d`] component, +--- it will still affect the color of the wireframe when [`Wireframe2dConfig::global`] is set to true. +--- +--- This overrides the [`Wireframe2dConfig::default_color`]. +---@field color ? Color +Wireframe2dColor = {} + + + +---@class Wireframe2dConfig : ReflectReference +---@field global ? boolean +---@field default_color ? Color +Wireframe2dConfig = {} + + + +---@class Wireframe2dMaterial : ReflectReference +---@field color ? Color +Wireframe2dMaterial = {} + + + +---@class TileData : ReflectReference +--- Data for a single tile in the tilemap chunk. +---@field tileset_index ? integer +---@field color ? Color +---@field visible ? boolean +TileData = {} + + + +---@class TilemapChunk : ReflectReference +--- A component representing a chunk of a tilemap. +--- Each chunk is a rectangular section of tiles that is rendered as a single mesh. +---@field chunk_size ? UVec2 +---@field tile_display_size ? UVec2 +---@field tileset ? any +---@field alpha_mode ? AlphaMode2d +TilemapChunk = {} + + + +---@class TilemapChunkMeshCache : ReflectReference +--- A resource storing the meshes for each tilemap chunk size. +---@field [1] any +TilemapChunkMeshCache = {} + + + +---@class TilemapChunkTileData : ReflectReference +--- Component storing the data of tiles within a chunk. +--- Each index corresponds to a specific tile in the tileset. `None` indicates an empty tile. +---@field [1] TileData | nil[] +TilemapChunkTileData = {} + + + +---@class Edge : ReflectReference +--- An edge in the graph +---@field from ? ReflectNodeId +---@field to ? ReflectNodeId +Edge = {} + + + +---@class ReflectNodeId : ReflectReference +ReflectNodeId = {} + + + +---@class ReflectSystemGraph : ReflectReference +--- A graph of systems and system sets for a single schedule +---@field schedule ? ReflectSchedule +---@field nodes ? ReflectSystemGraphNode[] +---@field dependencies ? Edge[] +---@field hierarchy ? Edge[] +ReflectSystemGraph = {} + + + +---@class ReflectSystemGraphNode : ReflectReference +--- A node in the reflectable system graph +ReflectSystemGraphNode = {} + + + +---@class ReflectSystemSet : ReflectReference +--- A reflectable system set. +---@field node_id ? ReflectNodeId +---@field debug ? string +---@field type_id ? TypeId | nil +ReflectSystemSet = {} + + + +---@class ReflectableScheduleLabel : ReflectReference +ReflectableScheduleLabel = {} + + + +---@class TextBounds : ReflectReference +--- The maximum width and height of text. The text will wrap according to the specified size. +--- +--- Characters out of the bounds after wrapping will be truncated. Text is aligned according to the +--- specified [`Justify`](crate::text::Justify). +--- +--- Note: only characters that are completely out of the bounds will be truncated, so this is not a +--- reliable limit if it is necessary to contain the text strictly in the bounds. Currently this +--- component is mainly useful for text wrapping only. +---@field width ? number | nil +---@field height ? number | nil +TextBounds = {} + + + +---@class GlyphAtlasInfo : ReflectReference +--- Information about a glyph in an atlas. +--- +--- Rasterized glyphs are stored as rectangles +--- in one or more [`FontAtlas`](crate::FontAtlas)es. +--- +--- Used in [`PositionedGlyph`] and [`FontAtlasSet`](crate::FontAtlasSet). +---@field texture ? any +---@field texture_atlas ? any +---@field location ? GlyphAtlasLocation +GlyphAtlasInfo = {} + + + +---@class GlyphAtlasLocation : ReflectReference +--- The location of a glyph in an atlas, +--- and how it should be positioned when placed. +--- +--- Used in [`GlyphAtlasInfo`] and [`FontAtlas`](crate::FontAtlas). +---@field glyph_index ? integer +---@field offset ? IVec2 +GlyphAtlasLocation = {} + + + +---@class PositionedGlyph : ReflectReference +--- A glyph of a font, typically representing a single character, positioned in screen space. +--- +--- Contains information about how and where to render a glyph. +--- +--- Used in [`TextPipeline::update_text_layout_info`](crate::TextPipeline::update_text_layout_info) and [`TextLayoutInfo`](`crate::TextLayoutInfo`) for rendering glyphs. +---@field position ? Vec2 +---@field size ? Vec2 +---@field atlas_info ? GlyphAtlasInfo +---@field span_index ? integer +---@field line_index ? integer +---@field byte_index ? integer +---@field byte_length ? integer +PositionedGlyph = {} + + + +---@class RunGeometry : ReflectReference +--- Geometry of a text run used to render text decorations like background colors, strikethrough, and underline. +--- A run in `bevy_text` is a contiguous sequence of glyphs on a line that share the same text attributes like font, +--- font size, and line height. +---@field span_index ? integer +---@field bounds ? Rect +---@field strikethrough_y ? number +---@field strikethrough_thickness ? number +---@field underline_y ? number +---@field underline_thickness ? number +RunGeometry = {} + + + +---@class TextLayoutInfo : ReflectReference +--- Render information for a corresponding text block. +--- +--- Contains scaled glyphs and their size. Generated via [`TextPipeline::update_text_layout_info`] when an entity has +--- [`TextLayout`] and [`ComputedTextBlock`] components. +---@field scale_factor ? number +---@field glyphs ? PositionedGlyph[] +---@field run_geometry ? RunGeometry[] +---@field size ? Vec2 +TextLayoutInfo = {} + + + +---@class ComputedTextBlock : ReflectReference +--- Computed information for a text block. +--- +--- See [`TextLayout`]. +--- +--- Automatically updated by 2d and UI text systems. +---@field entities ? TextEntity[] +---@field needs_rerender ? boolean +ComputedTextBlock = {} + + + +---@class FontFeatureTag : ReflectReference +--- An OpenType font feature tag. +---@field [1] integer[] +FontFeatureTag = {} + + + +---@class FontFeatures : ReflectReference +--- OpenType features for .otf fonts that support them. +--- +--- Examples features include ligatures, small-caps, and fractional number display. For the complete +--- list of OpenType features, see the spec at +--- ``. +--- +--- # Usage: +--- ``` +--- use bevy_text::{FontFeatureTag, FontFeatures}; +--- +--- // Create using the builder +--- let font_features = FontFeatures::builder() +--- .enable(FontFeatureTag::STANDARD_LIGATURES) +--- .set(FontFeatureTag::WEIGHT, 300) +--- .build(); +--- +--- // Create from a list +--- let more_font_features: FontFeatures = [ +--- FontFeatureTag::STANDARD_LIGATURES, +--- FontFeatureTag::OLDSTYLE_FIGURES, +--- FontFeatureTag::TABULAR_FIGURES +--- ].into(); +--- ``` +---@field features ? [FontFeatureTag, integer][] +FontFeatures = {} + + + +---@class FontHinting : ReflectReference +--- Font hinting strategy. +--- +--- The text bounds can underflow or overflow slightly with `FontHinting::Enabled`. +--- +--- +FontHinting = {} + + + +---@class FontSmoothing : ReflectReference +--- Determines which antialiasing method to use when rendering text. By default, text is +--- rendered with grayscale antialiasing, but this can be changed to achieve a pixelated look. +--- +--- **Note:** Subpixel antialiasing is not currently supported. +FontSmoothing = {} + + + +---@class FontWeight : ReflectReference +--- How thick or bold the strokes of a font appear. +--- +--- Valid font weights range from 1 to 1000, inclusive. +--- Weights above 1000 are clamped to 1000. +--- A weight of 0 is treated as [`FontWeight::DEFAULT`]. +--- +--- `` +---@field [1] integer +FontWeight = {} + + + +---@class Justify : ReflectReference +--- Describes the horizontal alignment of multiple lines of text relative to each other. +--- +--- This only affects the internal positioning of the lines of text within a text entity and +--- does not affect the text entity's position. +--- +--- _Has no affect on a single line text entity_, unless used together with a +--- [`TextBounds`](super::bounds::TextBounds) component with an explicit `width` value. +Justify = {} + + + +---@class LineBreak : ReflectReference +--- Determines how lines will be broken when preventing text from running out of bounds. +LineBreak = {} + + + +---@class LineHeight : ReflectReference +--- Specifies the height of each line of text for `Text` and `Text2d` +--- +--- Default is 1.2x the font size +LineHeight = {} + + + +---@class Strikethrough : ReflectReference +--- A text entity with this component is drawn with strikethrough. +Strikethrough = {} + + + +---@class StrikethroughColor : ReflectReference +--- Color for the text's strikethrough. If this component is not present, its `TextColor` will be used. +---@field [1] Color +StrikethroughColor = {} + + + +---@class TextBackgroundColor : ReflectReference +--- The background color of the text for this section. +---@field [1] Color +TextBackgroundColor = {} + + + +---@class TextColor : ReflectReference +--- The color of the text for this section. +---@field [1] Color +TextColor = {} + + + +---@class TextEntity : ReflectReference +--- A sub-entity of a [`ComputedTextBlock`]. +--- +--- Returned by [`ComputedTextBlock::entities`]. +---@field entity ? Entity +---@field depth ? integer +TextEntity = {} + + + +---@class TextFont : ReflectReference +--- `TextFont` determines the style of a text span within a [`ComputedTextBlock`], specifically +--- the font face, the font size, the line height, and the antialiasing method. +---@field font ? bevy_asset::handle::Handle +---@field font_size ? number +---@field weight ? FontWeight +---@field font_smoothing ? FontSmoothing +---@field font_features ? FontFeatures +TextFont = {} + + + +---@class TextLayout : ReflectReference +--- Component with text format settings for a block of text. +--- +--- A block of text is composed of text spans, which each have a separate string value and [`TextFont`]. Text +--- spans associated with a text block are collected into [`ComputedTextBlock`] for layout, and then inserted +--- to [`TextLayoutInfo`] for rendering. +--- +--- See `Text2d` in `bevy_sprite` for the core component of 2d text, and `Text` in `bevy_ui` for UI text. +---@field justify ? Justify +---@field linebreak ? LineBreak +TextLayout = {} + + + +---@class TextSpan : ReflectReference +--- A span of text in a tree of spans. +--- +--- A `TextSpan` is only valid when it exists as a child of a parent that has either `Text` or +--- `Text2d`. The parent's `Text` / `Text2d` component contains the base text content. Any children +--- with `TextSpan` extend this text by appending their content to the parent's text in sequence to +--- form a [`ComputedTextBlock`]. The parent's [`TextLayout`] determines the layout of the block +--- but each node has its own [`TextFont`] and [`TextColor`]. +---@field [1] string +TextSpan = {} + + + +---@class Underline : ReflectReference +--- Add to a text entity to draw its text with underline. +Underline = {} + + + +---@class UnderlineColor : ReflectReference +--- Color for the text's underline. If this component is not present, its `TextColor` will be used. +---@field [1] Color +UnderlineColor = {} + + + +---@class UiScale : ReflectReference +--- The current scale of the UI. +--- +--- A multiplier to fixed-sized ui values. +--- **Note:** This will only affect fixed ui values like [`Val::Px`] +---@field [1] number +UiScale = {} + + + +---@class AutoDirectionalNavigation : ReflectReference +--- Marker component to enable automatic directional navigation to and from the entity. +--- +--- Simply add this component to your UI entities so that the navigation algorithm will +--- consider this entity in its calculations: +--- +--- ```rust +--- # use bevy_ecs::prelude::*; +--- # use bevy_ui::auto_directional_navigation::AutoDirectionalNavigation; +--- fn spawn_auto_nav_button(mut commands: Commands) { +--- commands.spawn(( +--- // ... Button, Node, etc. ... +--- AutoDirectionalNavigation::default(), // That's it! +--- )); +--- } +--- ``` +--- +--- # Multi-Layer UIs and Z-Index +--- +--- **Important**: Automatic navigation is currently **z-index agnostic** and treats +--- all entities with `AutoDirectionalNavigation` as a flat set, regardless of which UI layer +--- or z-index they belong to. This means navigation may jump between different layers (e.g., +--- from a background menu to an overlay popup). +--- +--- **Workarounds** for multi-layer UIs: +--- +--- 1. **Per-layer manual edge generation**: Query entities by layer and call +--- [`auto_generate_navigation_edges()`](bevy_input_focus::directional_navigation::auto_generate_navigation_edges) +--- separately for each layer: +--- ```rust,ignore +--- for layer in &layers { +--- let nodes: Vec = query_layer(layer).collect(); +--- auto_generate_navigation_edges(&mut nav_map, &nodes, &config); +--- } +--- ``` +--- +--- 2. **Manual cross-layer navigation**: Use +--- [`DirectionalNavigationMap::add_edge()`](bevy_input_focus::directional_navigation::DirectionalNavigationMap::add_edge) +--- to define explicit connections between layers (e.g., "Back" button to main menu). +--- +--- 3. **Remove component when layer is hidden**: Dynamically add/remove +--- [`AutoDirectionalNavigation`] based on which layers are currently active. +--- +--- See issue [#21679](https://github.com/bevyengine/bevy/issues/21679) for planned +--- improvements to layer-aware automatic navigation. +--- +--- # Opting Out +--- +--- To disable automatic navigation for specific entities: +--- +--- - **Remove the component**: Simply don't add [`AutoDirectionalNavigation`] to entities +--- that should only use manual navigation edges. +--- - **Dynamically toggle**: Remove/insert the component at runtime to enable/disable +--- automatic navigation as needed. +--- +--- Manual edges defined via [`DirectionalNavigationMap`](bevy_input_focus::directional_navigation::DirectionalNavigationMap) +--- are completely independent and will continue to work regardless of this component. +--- +--- # Additional Requirements +--- +--- Entities must also have: +--- - [`ComputedNode`] - for size information +--- - [`UiGlobalTransform`] - for position information +--- +--- These are automatically added by `bevy_ui` when you spawn UI entities. +--- +--- # Custom UI Systems +--- +--- For custom UI frameworks, you can call +--- [`auto_generate_navigation_edges`](bevy_input_focus::directional_navigation::auto_generate_navigation_edges) +--- directly in your own system instead of using this component. +---@field respect_tab_order ? boolean +AutoDirectionalNavigation = {} + + + +---@class FocusPolicy : ReflectReference +--- Describes whether the node should block interactions with lower nodes +FocusPolicy = {} + + + +---@class Interaction : ReflectReference +--- Describes what type of input interaction has occurred for a UI node. +--- +--- This is commonly queried with a `Changed` filter. +--- +--- Updated in [`ui_focus_system`]. +--- +--- If a UI node has both [`Interaction`] and [`InheritedVisibility`] components, +--- [`Interaction`] will always be [`Interaction::None`] +--- when [`InheritedVisibility::get()`] is false. +--- This ensures that hidden UI nodes are not interactable, +--- and do not end up stuck in an active state if hidden at the wrong time. +--- +--- Note that you can also control the visibility of a node using the [`Display`](crate::ui_node::Display) property, +--- which fully collapses it during layout calculations. +--- +--- # See also +--- +--- - [`Button`](crate::widget::Button) which requires this component +--- - [`RelativeCursorPosition`] to obtain the position of the cursor relative to current node +Interaction = {} + + + +---@class RelativeCursorPosition : ReflectReference +--- A component storing the position of the mouse relative to the node, (0., 0.) being the center and (0.5, 0.5) being the bottom-right +--- If the mouse is not over the node, the value will go beyond the range of (-0.5, -0.5) to (0.5, 0.5) +--- +--- It can be used alongside [`Interaction`] to get the position of the press. +--- +--- The component is updated when it is in the same entity with [`Node`]. +---@field cursor_over ? boolean +---@field normalized ? Vec2 | nil +RelativeCursorPosition = {} + + + +---@class UiPosition : ReflectReference +--- Responsive position relative to a UI node. +---@field anchor ? Vec2 +---@field x ? Val +---@field y ? Val +UiPosition = {} + + + +---@class UiRect : ReflectReference +--- A type which is commonly used to define margins, paddings and borders. +--- +--- # Examples +--- +--- ## Margin +--- +--- A margin is used to create space around UI elements, outside of any defined borders. +--- +--- ``` +--- # use bevy_ui::{UiRect, Val}; +--- # +--- let margin = UiRect::all(Val::Auto); // Centers the UI element +--- ``` +--- +--- ## Padding +--- +--- A padding is used to create space around UI elements, inside of any defined borders. +--- +--- ``` +--- # use bevy_ui::{UiRect, Val}; +--- # +--- let padding = UiRect { +--- left: Val::Px(10.0), +--- right: Val::Px(20.0), +--- top: Val::Px(30.0), +--- bottom: Val::Px(40.0), +--- }; +--- ``` +--- +--- ## Borders +--- +--- A border is used to define the width of the border of a UI element. +--- +--- ``` +--- # use bevy_ui::{UiRect, Val}; +--- # +--- let border = UiRect { +--- left: Val::Px(10.0), +--- right: Val::Px(20.0), +--- top: Val::Px(30.0), +--- bottom: Val::Px(40.0), +--- }; +--- ``` +---@field left ? Val +---@field right ? Val +---@field top ? Val +---@field bottom ? Val +UiRect = {} + + + +---@class Val : ReflectReference +--- Represents the possible value types for layout properties. +--- +--- This enum allows specifying values for various [`Node`](crate::Node) properties in different units, +--- such as logical pixels, percentages, or automatically determined values. +--- +--- `Val` also implements [`core::str::FromStr`] to allow parsing values from strings in the format `#.#px`. Whitespaces between the value and unit is allowed. The following units are supported: +--- * `px`: logical pixels +--- * `%`: percentage +--- * `vw`: percentage of the viewport width +--- * `vh`: percentage of the viewport height +--- * `vmin`: percentage of the viewport's smaller dimension +--- * `vmax`: percentage of the viewport's larger dimension +--- +--- Additionally, `auto` will be parsed as [`Val::Auto`]. +Val = {} + + + +---@class AngularColorStop : ReflectReference +--- An angular color stop for a conic gradient +---@field color ? Color +---@field angle ? number | nil +---@field hint ? number +AngularColorStop = {} + + + +---@class BackgroundGradient : ReflectReference +--- A UI node that displays a gradient +---@field [1] Gradient[] +BackgroundGradient = {} + + + +---@class BorderGradient : ReflectReference +--- A UI node border that displays a gradient +---@field [1] Gradient[] +BorderGradient = {} + + + +---@class ColorStop : ReflectReference +--- A color stop for a gradient +---@field color ? Color +---@field point ? Val +---@field hint ? number +ColorStop = {} + + + +---@class ConicGradient : ReflectReference +--- A conic gradient +--- +--- +---@field color_space ? InterpolationColorSpace +---@field start ? number +---@field position ? UiPosition +---@field stops ? AngularColorStop[] +ConicGradient = {} + + + +---@class Gradient : ReflectReference +Gradient = {} + + + +---@class InterpolationColorSpace : ReflectReference +--- The color space used for interpolation. +InterpolationColorSpace = {} + + + +---@class LinearGradient : ReflectReference +--- A linear gradient +--- +--- +---@field color_space ? InterpolationColorSpace +---@field angle ? number +---@field stops ? ColorStop[] +LinearGradient = {} + + + +---@class RadialGradient : ReflectReference +--- A radial gradient +--- +--- +---@field color_space ? InterpolationColorSpace +---@field position ? UiPosition +---@field shape ? RadialGradientShape +---@field stops ? ColorStop[] +RadialGradient = {} + + + +---@class RadialGradientShape : ReflectReference +RadialGradientShape = {} + + + +---@class ContentSize : ReflectReference +--- A node with a `ContentSize` component is a node where its size +--- is based on its content. +ContentSize = {} + + + +---@class AlignContent : ReflectReference +--- Used to control how items are distributed. +--- - For Flexbox containers, controls alignment of lines if `flex_wrap` is set to [`FlexWrap::Wrap`] and there are multiple lines of items. +--- - For CSS Grid containers, controls alignment of grid rows. +--- +--- +AlignContent = {} + + + +---@class AlignItems : ReflectReference +--- Used to control how each individual item is aligned by default within the space they're given. +--- - For Flexbox containers, sets default cross axis alignment of the child items. +--- - For CSS Grid containers, controls block (vertical) axis alignment of children of this grid container within their grid areas. +--- +--- +AlignItems = {} + + + +---@class AlignSelf : ReflectReference +--- Used to control how the specified item is aligned within the space it's given. +--- - For Flexbox items, controls cross axis alignment of the item. +--- - For CSS Grid items, controls block (vertical) axis alignment of a grid item within its grid area. +--- +--- +AlignSelf = {} + + + +---@class BackgroundColor : ReflectReference +--- The background color of the node +--- +--- This serves as the "fill" color. +---@field [1] Color +BackgroundColor = {} + + + +---@class BorderColor : ReflectReference +--- The border color of the UI node. +---@field top ? Color +---@field right ? Color +---@field bottom ? Color +---@field left ? Color +BorderColor = {} + + + +---@class BorderRadius : ReflectReference +--- Used to add rounded corners to a UI node. You can set a UI node to have uniformly +--- rounded corners or specify different radii for each corner. If a given radius exceeds half +--- the length of the smallest dimension between the node's height or width, the radius will +--- calculated as half the smallest dimension. +--- +--- Elliptical nodes are not supported yet. Percentage values are based on the node's smallest +--- dimension, either width or height. +--- +--- # Example +--- ```rust +--- # use bevy_ecs::prelude::*; +--- # use bevy_ui::prelude::*; +--- # use bevy_color::palettes::basic::{BLUE}; +--- fn setup_ui(mut commands: Commands) { +--- commands.spawn(( +--- Node { +--- width: Val::Px(100.), +--- height: Val::Px(100.), +--- border: UiRect::all(Val::Px(2.)), +--- border_radius: BorderRadius::new( +--- // top left +--- Val::Px(10.), +--- // top right +--- Val::Px(20.), +--- // bottom right +--- Val::Px(30.), +--- // bottom left +--- Val::Px(40.), +--- ), +--- ..Default::default() +--- }, +--- BackgroundColor(BLUE.into()), +--- )); +--- } +--- ``` +--- +--- +---@field top_left ? Val +---@field top_right ? Val +---@field bottom_right ? Val +---@field bottom_left ? Val +BorderRadius = {} + + + +---@class BoxShadow : ReflectReference +--- List of shadows to draw for a [`Node`]. +--- +--- Draw order is determined implicitly from the vector of [`ShadowStyle`]s, back-to-front. +---@field [1] ShadowStyle[] +BoxShadow = {} + + + +---@class BoxSizing : ReflectReference +--- Which part of a Node's box length styles like width and height control +--- +--- See: +BoxSizing = {} + + + +---@class CalculatedClip : ReflectReference +--- The calculated clip of the node +---@field clip ? Rect +CalculatedClip = {} + + + +---@class ComputedNode : ReflectReference +--- Provides the computed size and layout properties of the node. +--- +--- Fields in this struct are public but should not be modified under most circumstances. +--- For example, in a scrollbar you may want to derive the handle's size from the proportion of +--- scrollable content in-view. You can directly modify `ComputedNode` after layout to set the +--- handle size without any delays. +---@field stack_index ? integer +---@field size ? Vec2 +---@field content_size ? Vec2 +---@field scrollbar_size ? Vec2 +---@field scroll_position ? Vec2 +---@field outline_width ? number +---@field outline_offset ? number +---@field unrounded_size ? Vec2 +---@field border ? BorderRect +---@field border_radius ? ResolvedBorderRadius +---@field padding ? BorderRect +---@field inverse_scale_factor ? number +ComputedNode = {} + + + +---@class ComputedUiRenderTargetInfo : ReflectReference +--- Derived information about the render target for this UI node. +---@field scale_factor ? number +---@field physical_size ? UVec2 +ComputedUiRenderTargetInfo = {} + + + +---@class ComputedUiTargetCamera : ReflectReference +--- Derived information about the camera target for this UI node. +--- +--- Updated in [`UiSystems::Prepare`](crate::UiSystems::Prepare) by [`propagate_ui_target_cameras`](crate::update::propagate_ui_target_cameras) +---@field camera ? Entity +ComputedUiTargetCamera = {} + + + +---@class Display : ReflectReference +--- Defines the layout model used by this node. +--- +--- Part of the [`Node`] component. +Display = {} + + + +---@class FlexDirection : ReflectReference +--- Defines how flexbox items are ordered within a flexbox +FlexDirection = {} + + + +---@class FlexWrap : ReflectReference +--- Defines if flexbox items appear on a single line or on multiple lines +FlexWrap = {} + + + +---@class GlobalZIndex : ReflectReference +--- `GlobalZIndex` allows a [`Node`] entity anywhere in the UI hierarchy to escape the implicit draw ordering of the UI's layout tree and +--- be rendered above or below other UI nodes. +--- Nodes with a `GlobalZIndex` of greater than 0 will be drawn on top of nodes without a `GlobalZIndex` or nodes with a lower `GlobalZIndex`. +--- Nodes with a `GlobalZIndex` of less than 0 will be drawn below nodes without a `GlobalZIndex` or nodes with a greater `GlobalZIndex`. +--- +--- If two Nodes have the same `GlobalZIndex`, the node with the greater [`ZIndex`] will be drawn on top. +---@field [1] integer +GlobalZIndex = {} + + + +---@class GridAutoFlow : ReflectReference +--- Controls whether grid items are placed row-wise or column-wise as well as whether the sparse or dense packing algorithm is used. +--- +--- The "dense" packing algorithm attempts to fill in holes earlier in the grid, if smaller items come up later. +--- This may cause items to appear out-of-order when doing so would fill in holes left by larger items. +--- +--- Defaults to [`GridAutoFlow::Row`]. +--- +--- +GridAutoFlow = {} + + + +---@class GridPlacement : ReflectReference +--- Represents the position of a grid item in a single axis. +--- +--- There are 3 fields which may be set: +--- - `start`: which grid line the item should start at +--- - `end`: which grid line the item should end at +--- - `span`: how many tracks the item should span +--- +--- The default `span` is 1. If neither `start` or `end` is set then the item will be placed automatically. +--- +--- Generally, at most two fields should be set. If all three fields are specified then `span` will be ignored. If `end` specifies an earlier +--- grid line than `start` then `end` will be ignored and the item will have a span of 1. +--- +--- +---@field start ? NonZeroI16 | nil +---@field span ? NonZeroU16 | nil +---@field end ? NonZeroI16 | nil +GridPlacement = {} + + + +---@class GridTrack : ReflectReference +--- A [`GridTrack`] is a Row or Column of a CSS Grid. This struct specifies what size the track should be. +--- See below for the different "track sizing functions" you can specify. +---@field min_sizing_function ? MinTrackSizingFunction +---@field max_sizing_function ? MaxTrackSizingFunction +GridTrack = {} + + + +---@class GridTrackRepetition : ReflectReference +--- How many times to repeat a repeated grid track +--- +--- +GridTrackRepetition = {} + + + +---@class IgnoreScroll : ReflectReference +--- Controls whether a UI element ignores its parent's [`ScrollPosition`] along specific axes. +--- +--- When an axis is set to `true`, the node will not have the parent’s scroll position applied +--- on that axis. This can be used to keep an element visually fixed along one or both axes +--- even when its parent UI element is scrolled. +---@field [1] BVec2 +IgnoreScroll = {} + + + +---@class JustifyContent : ReflectReference +--- Used to control how items are distributed. +--- - For Flexbox containers, controls alignment of items in the main axis. +--- - For CSS Grid containers, controls alignment of grid columns. +--- +--- +JustifyContent = {} + + + +---@class JustifyItems : ReflectReference +--- Used to control how each individual item is aligned by default within the space they're given. +--- - For Flexbox containers, this property has no effect. See `justify_content` for main axis alignment of flex items. +--- - For CSS Grid containers, sets default inline (horizontal) axis alignment of child items within their grid areas. +--- +--- +JustifyItems = {} + + + +---@class JustifySelf : ReflectReference +--- Used to control how the specified item is aligned within the space it's given. +--- - For children of flex nodes, this property has no effect. See `justify_content` for main axis alignment of flex items. +--- - For CSS Grid items, controls inline (horizontal) axis alignment of a grid item within its grid area. +--- +--- +JustifySelf = {} + + + +---@class LayoutConfig : ReflectReference +--- This component can be added to any UI node to modify its layout behavior. +---@field use_rounding ? boolean +LayoutConfig = {} + + + +---@class MaxTrackSizingFunction : ReflectReference +MaxTrackSizingFunction = {} + + + +---@class MinTrackSizingFunction : ReflectReference +MinTrackSizingFunction = {} + + + +---@class Node : ReflectReference +--- The base component for UI entities. It describes UI layout and style properties. +--- +--- When defining new types of UI entities, require [`Node`] to make them behave like UI nodes. +--- +--- Nodes can be laid out using either Flexbox or CSS Grid Layout. +--- +--- See below for general learning resources and for documentation on the individual style properties. +--- +--- ### Flexbox +--- +--- - [MDN: Basic Concepts of Flexbox](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Basic_Concepts_of_Flexbox) +--- - [A Complete Guide To Flexbox](https://css-tricks.com/snippets/css/a-guide-to-flexbox/) by CSS Tricks. This is detailed guide with illustrations and comprehensive written explanation of the different Flexbox properties and how they work. +--- - [Flexbox Froggy](https://flexboxfroggy.com/). An interactive tutorial/game that teaches the essential parts of Flexbox in a fun engaging way. +--- +--- ### CSS Grid +--- +--- - [MDN: Basic Concepts of Grid Layout](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout/Basic_Concepts_of_Grid_Layout) +--- - [A Complete Guide To CSS Grid](https://css-tricks.com/snippets/css/complete-guide-grid/) by CSS Tricks. This is detailed guide with illustrations and comprehensive written explanation of the different CSS Grid properties and how they work. +--- - [CSS Grid Garden](https://cssgridgarden.com/). An interactive tutorial/game that teaches the essential parts of CSS Grid in a fun engaging way. +--- +--- # See also +--- +--- - [`RelativeCursorPosition`](crate::RelativeCursorPosition) to obtain the cursor position relative to this node +--- - [`Interaction`](crate::Interaction) to obtain the interaction state of this node +---@field display ? Display +---@field box_sizing ? BoxSizing +---@field position_type ? PositionType +---@field overflow ? Overflow +---@field scrollbar_width ? number +---@field overflow_clip_margin ? OverflowClipMargin +---@field left ? Val +---@field right ? Val +---@field top ? Val +---@field bottom ? Val +---@field width ? Val +---@field height ? Val +---@field min_width ? Val +---@field min_height ? Val +---@field max_width ? Val +---@field max_height ? Val +---@field aspect_ratio ? number | nil +---@field align_items ? AlignItems +---@field justify_items ? JustifyItems +---@field align_self ? AlignSelf +---@field justify_self ? JustifySelf +---@field align_content ? AlignContent +---@field justify_content ? JustifyContent +---@field margin ? UiRect +---@field padding ? UiRect +---@field border ? UiRect +---@field border_radius ? BorderRadius +---@field flex_direction ? FlexDirection +---@field flex_wrap ? FlexWrap +---@field flex_grow ? number +---@field flex_shrink ? number +---@field flex_basis ? Val +---@field row_gap ? Val +---@field column_gap ? Val +---@field grid_auto_flow ? GridAutoFlow +---@field grid_template_rows ? RepeatedGridTrack[] +---@field grid_template_columns ? RepeatedGridTrack[] +---@field grid_auto_rows ? GridTrack[] +---@field grid_auto_columns ? GridTrack[] +---@field grid_row ? GridPlacement +---@field grid_column ? GridPlacement +Node = {} + + + +---@class Outline : ReflectReference +--- The [`Outline`] component adds an outline outside the edge of a UI node. +--- Outlines do not take up space in the layout. +--- +--- To add an [`Outline`] to a ui node you can spawn a `(Node, Outline)` tuple bundle: +--- ``` +--- # use bevy_ecs::prelude::*; +--- # use bevy_ui::prelude::*; +--- # use bevy_color::palettes::basic::{RED, BLUE}; +--- fn setup_ui(mut commands: Commands) { +--- commands.spawn(( +--- Node { +--- width: Val::Px(100.), +--- height: Val::Px(100.), +--- ..Default::default() +--- }, +--- BackgroundColor(BLUE.into()), +--- Outline::new(Val::Px(10.), Val::ZERO, RED.into()) +--- )); +--- } +--- ``` +--- +--- [`Outline`] components can also be added later to existing UI nodes: +--- ``` +--- # use bevy_ecs::prelude::*; +--- # use bevy_ui::prelude::*; +--- # use bevy_color::Color; +--- fn outline_hovered_button_system( +--- mut commands: Commands, +--- mut node_query: Query<(Entity, &Interaction, Option<&mut Outline>), Changed>, +--- ) { +--- for (entity, interaction, mut maybe_outline) in node_query.iter_mut() { +--- let outline_color = +--- if matches!(*interaction, Interaction::Hovered) { +--- Color::WHITE +--- } else { +--- Color::NONE +--- }; +--- if let Some(mut outline) = maybe_outline { +--- outline.color = outline_color; +--- } else { +--- commands.entity(entity).insert(Outline::new(Val::Px(10.), Val::ZERO, outline_color)); +--- } +--- } +--- } +--- ``` +--- Inserting and removing an [`Outline`] component repeatedly will result in table moves, so it is generally preferable to +--- set `Outline::color` to [`Color::NONE`] to hide an outline. +---@field width ? Val +---@field offset ? Val +---@field color ? Color +Outline = {} + + + +---@class Overflow : ReflectReference +--- Whether to show or hide overflowing items +---@field x ? OverflowAxis +---@field y ? OverflowAxis +Overflow = {} + + + +---@class OverflowAxis : ReflectReference +--- Whether to show or hide overflowing items +OverflowAxis = {} + + + +---@class OverflowClipBox : ReflectReference +--- Used to determine the bounds of the visible area when a UI node is clipped. +OverflowClipBox = {} + + + +---@class OverflowClipMargin : ReflectReference +--- The bounds of the visible area when a UI node is clipped. +---@field visual_box ? OverflowClipBox +---@field margin ? number +OverflowClipMargin = {} + + + +---@class PositionType : ReflectReference +--- The strategy used to position this node +PositionType = {} + + + +---@class RepeatedGridTrack : ReflectReference +--- Represents a *possibly* repeated [`GridTrack`]. +--- +--- The repetition parameter can either be: +--- - The integer `1`, in which case the track is non-repeated. +--- - a `u16` count to repeat the track N times. +--- - A `GridTrackRepetition::AutoFit` or `GridTrackRepetition::AutoFill`. +--- +--- Note: that in the common case you want a non-repeating track (repetition count 1), you may use the constructor methods on [`GridTrack`] +--- to create a `RepeatedGridTrack`. i.e. `GridTrack::px(10.0)` is equivalent to `RepeatedGridTrack::px(1, 10.0)`. +--- +--- You may only use one auto-repetition per track list. And if your track list contains an auto repetition +--- then all tracks (in and outside of the repetition) must be fixed size (px or percent). Integer repetitions are just shorthand for writing out +--- N tracks longhand and are not subject to the same limitations. +---@field repetition ? GridTrackRepetition +---@field tracks ? GridTrack[] +RepeatedGridTrack = {} + + + +---@class ResolvedBorderRadius : ReflectReference +--- Represents the resolved border radius values for a UI node. +--- +--- The values are in physical pixels. +---@field top_left ? number +---@field top_right ? number +---@field bottom_right ? number +---@field bottom_left ? number +ResolvedBorderRadius = {} + + + +---@class ScrollPosition : ReflectReference +--- The scroll position of the node. Values are in logical pixels, increasing from top-left to bottom-right. +--- +--- Increasing the x-coordinate causes the scrolled content to visibly move left on the screen, while increasing the y-coordinate causes the scrolled content to move up. +--- This might seem backwards, however what's really happening is that +--- the scroll position is moving the visible "window" in the local coordinate system of the scrolled content - +--- moving the window down causes the content to move up. +--- +--- Updating the values of `ScrollPosition` will reposition the children of the node by the offset amount in logical pixels. +--- `ScrollPosition` may be updated by the layout system when a layout change makes a previously valid `ScrollPosition` invalid. +--- Changing this does nothing on a `Node` without setting at least one `OverflowAxis` to `OverflowAxis::Scroll`. +---@field [1] Vec2 +ScrollPosition = {} + + + +---@class ShadowStyle : ReflectReference +---@field color ? Color +---@field x_offset ? Val +---@field y_offset ? Val +---@field spread_radius ? Val +---@field blur_radius ? Val +ShadowStyle = {} + + + +---@class UiTargetCamera : ReflectReference +--- Indicates that this root [`Node`] entity should be rendered to a specific camera. +--- +--- UI then will be laid out respecting the camera's viewport and scale factor, and +--- rendered to this camera's [`bevy_camera::RenderTarget`]. +--- +--- Setting this component on a non-root node will have no effect. It will be overridden +--- by the root node's component. +--- +--- Root node's without an explicit [`UiTargetCamera`] will be rendered to the default UI camera, +--- which is either a single camera with the [`IsDefaultUiCamera`] marker component or the highest +--- order camera targeting the primary window. +---@field [1] Entity +UiTargetCamera = {} + + + +---@class ZIndex : ReflectReference +--- Indicates that this [`Node`] entity's front-to-back ordering is not controlled solely +--- by its location in the UI hierarchy. A node with a higher z-index will appear on top +--- of sibling nodes with a lower z-index. +--- +--- UI nodes that have the same z-index will appear according to the order in which they +--- appear in the UI hierarchy. In such a case, the last node to be added to its parent +--- will appear in front of its siblings. +--- +--- Nodes without this component will be treated as if they had a value of +--- [ZIndex][ZIndex]\(0\). +--- +--- Use [`GlobalZIndex`] if you need to order separate UI hierarchies or nodes that are +--- not siblings in a given UI hierarchy. +---@field [1] integer +ZIndex = {} + + + +---@class UiGlobalTransform : ReflectReference +--- Absolute 2D transform for UI nodes +--- +--- [`UiGlobalTransform`]s are updated from [`UiTransform`] and [`Node`](crate::ui_node::Node) +--- in [`ui_layout_system`](crate::layout::ui_layout_system) +---@field [1] Affine2 +UiGlobalTransform = {} + + + +---@class UiTransform : ReflectReference +--- Relative 2D transform for UI nodes +--- +--- [`UiGlobalTransform`] is automatically inserted whenever [`UiTransform`] is inserted. +---@field translation ? Val2 +---@field scale ? Vec2 +---@field rotation ? Rot2 +UiTransform = {} + + + +---@class Val2 : ReflectReference +--- A pair of [`Val`]s used to represent a 2-dimensional size or offset. +---@field x ? Val +---@field y ? Val +Val2 = {} + + + +---@class Button : ReflectReference +--- Marker struct for buttons +Button = {} + + + +---@class ImageNode : ReflectReference +--- A UI Node that renders an image. +---@field color ? Color +---@field image ? any +---@field texture_atlas ? TextureAtlas | nil +---@field flip_x ? boolean +---@field flip_y ? boolean +---@field rect ? Rect | nil +---@field image_mode ? NodeImageMode +ImageNode = {} + + + +---@class ImageNodeSize : ReflectReference +--- The size of the image's texture +--- +--- This component is updated automatically by [`update_image_content_size_system`] +---@field size ? UVec2 +ImageNodeSize = {} + + + +---@class NodeImageMode : ReflectReference +--- Controls how the image is altered to fit within the layout and how the layout algorithm determines the space in the layout for the image +NodeImageMode = {} + + + +---@class Label : ReflectReference +--- Marker struct for labels +Label = {} + + + +---@class Text : ReflectReference +--- The top-level UI text component. +--- +--- Adding [`Text`] to an entity will pull in required components for setting up a UI text node. +--- +--- The string in this component is the first 'text span' in a hierarchy of text spans that are collected into +--- a [`ComputedTextBlock`]. See [`TextSpan`](bevy_text::TextSpan) for the component used by children of entities with [`Text`]. +--- +--- Note that [`Transform`](bevy_transform::components::Transform) on this entity is managed automatically by the UI layout system. +--- +--- +--- ``` +--- # use bevy_asset::Handle; +--- # use bevy_color::Color; +--- # use bevy_color::palettes::basic::BLUE; +--- # use bevy_ecs::world::World; +--- # use bevy_text::{Font, Justify, TextLayout, TextFont, TextColor, TextSpan}; +--- # use bevy_ui::prelude::Text; +--- # +--- # let font_handle: Handle = Default::default(); +--- # let mut world = World::default(); +--- # +--- // Basic usage. +--- world.spawn(Text::new("hello world!")); +--- +--- // With non-default style. +--- world.spawn(( +--- Text::new("hello world!"), +--- TextFont { +--- font: font_handle.clone().into(), +--- font_size: 60.0, +--- ..Default::default() +--- }, +--- TextColor(BLUE.into()), +--- )); +--- +--- // With text justification. +--- world.spawn(( +--- Text::new("hello world\nand bevy!"), +--- TextLayout::new_with_justify(Justify::Center) +--- )); +--- +--- // With spans +--- world.spawn(Text::new("hello ")).with_children(|parent| { +--- parent.spawn(TextSpan::new("world")); +--- parent.spawn((TextSpan::new("!"), TextColor(BLUE.into()))); +--- }); +--- ``` +---@field [1] string +Text = {} + + + +---@class TextNodeFlags : ReflectReference +--- UI text system flags. +--- +--- Used internally by [`measure_text_system`] and [`text_system`] to schedule text for processing. +---@field needs_measure_fn ? boolean +---@field needs_recompute ? boolean +TextNodeFlags = {} + + + +---@class TextShadow : ReflectReference +--- Adds a shadow behind text +--- +--- Use the `Text2dShadow` component for `Text2d` shadows +---@field offset ? Vec2 +---@field color ? Color +TextShadow = {} + + + +---@class ViewportNode : ReflectReference +--- Component used to render a [`RenderTarget`] to a node. +--- +--- # See Also +--- +--- [`update_viewport_render_target_size`] +---@field camera ? Entity +ViewportNode = {} + + + +---@class CursorIcon : ReflectReference +--- Insert into a window entity to set the cursor for that window. +CursorIcon = {} + + + +---@class CustomCursor : ReflectReference +--- Custom cursor image data. +CustomCursor = {} + + + +---@class CustomCursorImage : ReflectReference +--- A custom cursor created from an image. +---@field handle ? any +---@field texture_atlas ? TextureAtlas | nil +---@field flip_x ? boolean +---@field flip_y ? boolean +---@field rect ? URect | nil +---@field hotspot ? [integer, integer] +CustomCursorImage = {} + + + +---@class CustomCursorUrl : ReflectReference +--- A custom cursor created from a URL. Note that this currently only works on the web. +---@field url ? string +---@field hotspot ? [integer, integer] +CustomCursorUrl = {} + + + +---@class SystemCursorIcon : ReflectReference +--- The icon to display for a window. +--- +--- Examples of all of these cursors can be found [here](https://www.w3schools.com/cssref/playit.php?filename=playcss_cursor&preval=crosshair). +--- This `enum` is simply a copy of a similar `enum` found in [`winit`](https://docs.rs/winit/latest/winit/window/enum.CursorIcon.html). +--- `winit`, in turn, is based upon the [CSS3 UI spec](https://www.w3.org/TR/css-ui-3/#cursor). +--- +--- See the [`window_settings`] example for usage. +--- +--- [`window_settings`]: https://github.com/bevyengine/bevy/blob/latest/examples/window/window_settings.rs +SystemCursorIcon = {} + + + +---@class AppLifecycle : ReflectReference +--- Application lifetime events +AppLifecycle = {} + + + +---@class CursorEntered : ReflectReference +--- An event that is sent whenever the user's cursor enters a window. +---@field window ? Entity +CursorEntered = {} + + + +---@class CursorLeft : ReflectReference +--- An event that is sent whenever the user's cursor leaves a window. +---@field window ? Entity +CursorLeft = {} + + + +---@class CursorMoved : ReflectReference +--- An event reporting that the mouse cursor has moved inside a window. +--- +--- The event is sent only if the cursor is over one of the application's windows. +--- It is the translated version of [`WindowEvent::CursorMoved`] from the `winit` crate with the addition of `delta`. +--- +--- Not to be confused with the `MouseMotion` event from `bevy_input`. +--- +--- Because the range of data is limited by the window area and it may have been transformed by the OS to implement certain effects like acceleration, +--- you should not use it for non-cursor-like behavior such as 3D camera control. Please see `MouseMotion` instead. +--- +--- [`WindowEvent::CursorMoved`]: https://docs.rs/winit/latest/winit/event/enum.WindowEvent.html#variant.CursorMoved +---@field window ? Entity +---@field position ? Vec2 +---@field delta ? Vec2 | nil +CursorMoved = {} + + + +---@class FileDragAndDrop : ReflectReference +--- Events related to files being dragged and dropped on a window. +FileDragAndDrop = {} + + + +---@class Ime : ReflectReference +--- An Input Method Editor event. +--- +--- This event is the translated version of the `WindowEvent::Ime` from the `winit` crate. +--- +--- It is only sent if IME was enabled on the window with [`Window::ime_enabled`](crate::window::Window::ime_enabled). +Ime = {} + + + +---@class RequestRedraw : ReflectReference +--- An event that indicates all of the application's windows should be redrawn, +--- even if their control flow is set to `Wait` and there have been no window events. +RequestRedraw = {} + + + +---@class WindowBackendScaleFactorChanged : ReflectReference +--- An event that indicates a window's OS-reported scale factor has changed. +---@field window ? Entity +---@field scale_factor ? number +WindowBackendScaleFactorChanged = {} + + + +---@class WindowCloseRequested : ReflectReference +--- An event that is sent whenever the operating systems requests that a window +--- be closed. This will be sent when the close button of the window is pressed. +--- +--- If the default [`WindowPlugin`] is used, these events are handled +--- by closing the corresponding [`Window`]. +--- To disable this behavior, set `close_when_requested` on the [`WindowPlugin`] +--- to `false`. +--- +--- [`WindowPlugin`]: crate::WindowPlugin +--- [`Window`]: crate::Window +---@field window ? Entity +WindowCloseRequested = {} + + + +---@class WindowClosed : ReflectReference +--- An event that is sent whenever a window is closed. This will be sent when +--- the window entity loses its [`Window`](crate::window::Window) component or is despawned. +---@field window ? Entity +WindowClosed = {} + + + +---@class WindowClosing : ReflectReference +--- An event that is sent whenever a window is closing. This will be sent when +--- after a [`WindowCloseRequested`] event is received and the window is in the process of closing. +---@field window ? Entity +WindowClosing = {} + + + +---@class WindowCreated : ReflectReference +--- An event that is sent whenever a new window is created. +--- +--- To create a new window, spawn an entity with a [`Window`](`crate::Window`) on it. +---@field window ? Entity +WindowCreated = {} + + + +---@class WindowDestroyed : ReflectReference +--- An event that is sent whenever a window is destroyed by the underlying window system. +--- +--- Note that if your application only has a single window, this event may be your last chance to +--- persist state before the application terminates. +---@field window ? Entity +WindowDestroyed = {} + + + +---@class WindowEvent : ReflectReference +--- Wraps all `bevy_window` and `bevy_input` events in a common enum. +--- +--- Read these events with `MessageReader` if you need to +--- access window events in the order they were received from the +--- operating system. Otherwise, the event types are individually +--- readable with `MessageReader` (e.g. `MessageReader`). +WindowEvent = {} + + + +---@class WindowFocused : ReflectReference +--- An event that indicates a window has received or lost focus. +---@field window ? Entity +---@field focused ? boolean +WindowFocused = {} + + + +---@class WindowMoved : ReflectReference +--- An event that is sent when a window is repositioned in physical pixels. +---@field window ? Entity +---@field position ? IVec2 +WindowMoved = {} + + + +---@class WindowOccluded : ReflectReference +--- The window has been occluded (completely hidden from view). +--- +--- This is different to window visibility as it depends on +--- whether the window is closed, minimized, set invisible, +--- or fully occluded by another window. +--- +--- It is the translated version of [`WindowEvent::Occluded`] from the `winit` crate. +--- +--- [`WindowEvent::Occluded`]: https://docs.rs/winit/latest/winit/event/enum.WindowEvent.html#variant.Occluded +---@field window ? Entity +---@field occluded ? boolean +WindowOccluded = {} + + + +---@class WindowResized : ReflectReference +--- A window event that is sent whenever a window's logical size has changed. +---@field window ? Entity +---@field width ? number +---@field height ? number +WindowResized = {} + + + +---@class WindowScaleFactorChanged : ReflectReference +--- An event that indicates a window's scale factor has changed. +---@field window ? Entity +---@field scale_factor ? number +WindowScaleFactorChanged = {} + + + +---@class WindowThemeChanged : ReflectReference +--- An event sent when the system theme changes for a window. +--- +--- This event is only sent when the window is relying on the system theme to control its appearance. +--- i.e. It is only sent when [`Window::window_theme`](crate::window::Window::window_theme) is `None` and the system theme changes. +---@field window ? Entity +---@field theme ? WindowTheme +WindowThemeChanged = {} + + + +---@class Monitor : ReflectReference +--- Represents an available monitor as reported by the user's operating system, which can be used +--- to query information about the display, such as its size, position, and video modes. +--- +--- Each monitor corresponds to an entity and can be used to position a monitor using +--- [`MonitorSelection::Entity`](`crate::window::MonitorSelection::Entity`). +--- +--- # Warning +--- +--- This component is synchronized with `winit` through `bevy_winit`, but is effectively +--- read-only as `winit` does not support changing monitor properties. +---@field name ? string | nil +---@field physical_height ? integer +---@field physical_width ? integer +---@field physical_position ? IVec2 +---@field refresh_rate_millihertz ? integer | nil +---@field scale_factor ? number +---@field video_modes ? VideoMode[] +Monitor = {} + + + +---@class PrimaryMonitor : ReflectReference +--- A marker component for the primary monitor +PrimaryMonitor = {} + + + +---@class VideoMode : ReflectReference +--- Represents a video mode that a monitor supports +---@field physical_size ? UVec2 +---@field bit_depth ? integer +---@field refresh_rate_millihertz ? integer +VideoMode = {} + + + +---@class CompositeAlphaMode : ReflectReference +--- Specifies how the alpha channel of the textures should be handled during compositing, for a [`Window`]. +CompositeAlphaMode = {} + + + +---@class CursorGrabMode : ReflectReference +--- Defines if and how the cursor is grabbed by a [`Window`]. +--- +--- ## Platform-specific +--- +--- - **`macOS`** doesn't support [`CursorGrabMode::Confined`] +--- - **`X11`** doesn't support [`CursorGrabMode::Locked`] +--- - **`iOS/Android`** don't have cursors. +--- +--- Since `macOS` and `X11` don't have full [`CursorGrabMode`] support, we first try to set the grab mode that was asked for. If it doesn't work then use the alternate grab mode. +CursorGrabMode = {} + + + +---@class CursorOptions : ReflectReference +--- Cursor data for a [`Window`]. +---@field visible ? boolean +---@field grab_mode ? CursorGrabMode +---@field hit_test ? boolean +CursorOptions = {} + + + +---@class EnabledButtons : ReflectReference +--- Specifies which [`Window`] control buttons should be enabled. +--- +--- ## Platform-specific +--- +--- **`iOS`**, **`Android`**, and the **`Web`** do not have window control buttons. +--- +--- On some **`Linux`** environments these values have no effect. +---@field minimize ? boolean +---@field maximize ? boolean +---@field close ? boolean +EnabledButtons = {} + + + +---@class InternalWindowState : ReflectReference +--- Stores internal [`Window`] state that isn't directly accessible. +---@field minimize_request ? boolean | nil +---@field maximize_request ? boolean | nil +---@field drag_move_request ? boolean +---@field drag_resize_request ? CompassOctant | nil +---@field physical_cursor_position ? DVec2 | nil +InternalWindowState = {} + + + +---@class MonitorSelection : ReflectReference +--- References a screen monitor. +--- +--- Used when centering a [`Window`] on a monitor. +MonitorSelection = {} + + + +---@class NormalizedWindowRef : ReflectReference +--- A flattened representation of a window reference for equality/hashing purposes. +--- +--- For most purposes you probably want to use the unnormalized version [`WindowRef`]. +---@field [1] Entity +NormalizedWindowRef = {} + + + +---@class PresentMode : ReflectReference +--- Presentation mode for a [`Window`]. +--- +--- The presentation mode specifies when a frame is presented to the window. The [`Fifo`] +--- option corresponds to a traditional `VSync`, where the framerate is capped by the +--- display refresh rate. Both [`Immediate`] and [`Mailbox`] are low-latency and are not +--- capped by the refresh rate, but may not be available on all platforms. Tearing +--- may be observed with [`Immediate`] mode, but will not be observed with [`Mailbox`] or +--- [`Fifo`]. +--- +--- [`AutoVsync`] or [`AutoNoVsync`] will gracefully fallback to [`Fifo`] when unavailable. +--- +--- [`Immediate`] or [`Mailbox`] will panic if not supported by the platform. +--- +--- [`Fifo`]: PresentMode::Fifo +--- [`FifoRelaxed`]: PresentMode::FifoRelaxed +--- [`Immediate`]: PresentMode::Immediate +--- [`Mailbox`]: PresentMode::Mailbox +--- [`AutoVsync`]: PresentMode::AutoVsync +--- [`AutoNoVsync`]: PresentMode::AutoNoVsync +PresentMode = {} + + + +---@class PrimaryWindow : ReflectReference +--- Marker [`Component`] for the window considered the primary window. +--- +--- Currently this is assumed to only exist on 1 entity at a time. +--- +--- [`WindowPlugin`](crate::WindowPlugin) will spawn a [`Window`] entity +--- with this component if [`primary_window`](crate::WindowPlugin::primary_window) +--- is `Some`. +PrimaryWindow = {} + + + +---@class ScreenEdge : ReflectReference +--- The edges of a screen. Corresponds to [`winit::platform::ios::ScreenEdge`]. +--- +--- # Platform-specific +--- +--- - Only used on iOS. +--- +--- [`winit::platform::ios::ScreenEdge`]: https://docs.rs/winit/latest/x86_64-apple-darwin/winit/platform/ios/struct.ScreenEdge.html +ScreenEdge = {} + + + +---@class VideoModeSelection : ReflectReference +--- References an exclusive fullscreen video mode. +--- +--- Used when setting [`WindowMode::Fullscreen`] on a window. +VideoModeSelection = {} + + + +---@class Window : ReflectReference +--- The defining [`Component`] for window entities, +--- storing information about how it should appear and behave. +--- +--- Each window corresponds to an entity, and is uniquely identified by the value of their [`Entity`]. +--- When the [`Window`] component is added to an entity, a new window will be opened. +--- When it is removed or the entity is despawned, the window will close. +--- +--- The primary window entity (and the corresponding window) is spawned by default +--- by [`WindowPlugin`](crate::WindowPlugin) and is marked with the [`PrimaryWindow`] component. +--- +--- This component is synchronized with `winit` through `bevy_winit`: +--- it will reflect the current state of the window and can be modified to change this state. +--- +--- # Example +--- +--- Because this component is synchronized with `winit`, it can be used to perform +--- OS-integrated windowing operations. For example, here's a simple system +--- to change the window mode: +--- +--- ``` +--- # use bevy_ecs::query::With; +--- # use bevy_ecs::system::Query; +--- # use bevy_window::{WindowMode, PrimaryWindow, Window, MonitorSelection, VideoModeSelection}; +--- fn change_window_mode(mut windows: Query<&mut Window, With>) { +--- // Query returns one window typically. +--- for mut window in windows.iter_mut() { +--- window.mode = +--- WindowMode::Fullscreen(MonitorSelection::Current, VideoModeSelection::Current); +--- } +--- } +--- ``` +---@field present_mode ? PresentMode +---@field mode ? WindowMode +---@field position ? WindowPosition +---@field resolution ? WindowResolution +---@field title ? string +---@field name ? string | nil +---@field composite_alpha_mode ? CompositeAlphaMode +---@field resize_constraints ? WindowResizeConstraints +---@field resizable ? boolean +---@field enabled_buttons ? EnabledButtons +---@field decorations ? boolean +---@field transparent ? boolean +---@field focused ? boolean +---@field window_level ? WindowLevel +---@field canvas ? string | nil +---@field fit_canvas_to_parent ? boolean +---@field prevent_default_event_handling ? boolean +---@field internal ? InternalWindowState +---@field ime_enabled ? boolean +---@field ime_position ? Vec2 +---@field window_theme ? WindowTheme | nil +---@field visible ? boolean +---@field skip_taskbar ? boolean +---@field clip_children ? boolean +---@field desired_maximum_frame_latency ? NonZeroU32 | nil +---@field recognize_pinch_gesture ? boolean +---@field recognize_rotation_gesture ? boolean +---@field recognize_doubletap_gesture ? boolean +---@field recognize_pan_gesture ? [integer, integer] | nil +---@field movable_by_window_background ? boolean +---@field fullsize_content_view ? boolean +---@field has_shadow ? boolean +---@field titlebar_shown ? boolean +---@field titlebar_transparent ? boolean +---@field titlebar_show_title ? boolean +---@field titlebar_show_buttons ? boolean +---@field prefers_home_indicator_hidden ? boolean +---@field prefers_status_bar_hidden ? boolean +---@field preferred_screen_edges_deferring_system_gestures ? ScreenEdge +Window = {} + + + +---@class WindowLevel : ReflectReference +--- Specifies where a [`Window`] should appear relative to other overlapping windows (on top or under) . +--- +--- Levels are groups of windows with respect to their z-position. +--- +--- The relative ordering between windows in different window levels is fixed. +--- The z-order of windows within the same window level may change dynamically on user interaction. +--- +--- ## Platform-specific +--- +--- - **iOS / Android / Web / Wayland:** Unsupported. +WindowLevel = {} + + + +---@class WindowMode : ReflectReference +--- Defines the way a [`Window`] is displayed. +WindowMode = {} + + + +---@class WindowPosition : ReflectReference +--- Defines where a [`Window`] should be placed on the screen. +WindowPosition = {} + + + +---@class WindowRef : ReflectReference +--- Reference to a [`Window`], whether it be a direct link to a specific entity or +--- a more vague defaulting choice. +WindowRef = {} + + + +---@class WindowResizeConstraints : ReflectReference +--- The size limits on a [`Window`]. +--- +--- These values are measured in logical pixels (see [`WindowResolution`]), so the user's +--- scale factor does affect the size limits on the window. +--- +--- Please note that if the window is resizable, then when the window is +--- maximized it may have a size outside of these limits. The functionality +--- required to disable maximizing is not yet exposed by winit. +---@field min_width ? number +---@field min_height ? number +---@field max_width ? number +---@field max_height ? number +WindowResizeConstraints = {} + + + +---@class WindowResolution : ReflectReference +--- Controls the size of a [`Window`] +--- +--- ## Physical, logical and requested sizes +--- +--- There are three sizes associated with a window: +--- - the physical size, +--- which represents the actual height and width in physical pixels +--- the window occupies on the monitor, +--- - the logical size, +--- which represents the size that should be used to scale elements +--- inside the window, measured in logical pixels, +--- - the requested size, +--- measured in logical pixels, which is the value submitted +--- to the API when creating the window, or requesting that it be resized. +--- +--- ## Scale factor +--- +--- The reason logical size and physical size are separated and can be different +--- is to account for the cases where: +--- - several monitors have different pixel densities, +--- - the user has set up a pixel density preference in its operating system, +--- - the Bevy `App` has specified a specific scale factor between both. +--- +--- The factor between physical size and logical size can be retrieved with +--- [`WindowResolution::scale_factor`]. +--- +--- For the first two cases, a scale factor is set automatically by the operating +--- system through the window backend. You can get it with +--- [`WindowResolution::base_scale_factor`]. +--- +--- For the third case, you can override this automatic scale factor with +--- [`WindowResolution::set_scale_factor_override`]. +--- +--- ## Requested and obtained sizes +--- +--- The logical size should be equal to the requested size after creating/resizing, +--- when possible. +--- The reason the requested size and logical size might be different +--- is because the corresponding physical size might exceed limits (either the +--- size limits of the monitor, or limits defined in [`WindowResizeConstraints`]). +--- +--- Note: The requested size is not kept in memory, for example requesting a size +--- too big for the screen, making the logical size different from the requested size, +--- and then setting a scale factor that makes the previous requested size within +--- the limits of the screen will not get back that previous requested size. +---@field physical_width ? integer +---@field physical_height ? integer +---@field scale_factor_override ? number | nil +---@field scale_factor ? number +WindowResolution = {} + + + +---@class WindowTheme : ReflectReference +--- The [`Window`] theme variant to use. +WindowTheme = {} + + + +---@class WinitUserEvent : ReflectReference +--- Events that can be sent to perform actions inside the winit event loop. +--- +--- Sent via the [`EventLoopProxyWrapper`] resource. +--- +--- # Example +--- +--- ``` +--- # use bevy_ecs::prelude::*; +--- # use bevy_winit::{EventLoopProxyWrapper, WinitUserEvent}; +--- fn wakeup_system(event_loop_proxy: Res) -> Result { +--- event_loop_proxy.send_event(WinitUserEvent::WakeUp)?; +--- +--- Ok(()) +--- } +--- ``` +WinitUserEvent = {} + + + +---@class NonZeroI128 : ReflectReference +NonZeroI128 = {} + + + +---@class NonZeroI16 : ReflectReference +NonZeroI16 = {} + + + +---@class NonZeroI32 : ReflectReference +NonZeroI32 = {} + + + +---@class NonZeroI64 : ReflectReference +NonZeroI64 = {} + + + +---@class NonZeroI8 : ReflectReference +NonZeroI8 = {} + + + +---@class NonZeroIsize : ReflectReference +NonZeroIsize = {} + + + +---@class NonZeroU128 : ReflectReference +NonZeroU128 = {} + + + +---@class NonZeroU16 : ReflectReference +NonZeroU16 = {} + + + +---@class NonZeroU32 : ReflectReference +NonZeroU32 = {} + + + +---@class NonZeroU64 : ReflectReference +NonZeroU64 = {} + + + +---@class NonZeroU8 : ReflectReference +NonZeroU8 = {} + + + +---@class NonZeroUsize : ReflectReference +NonZeroUsize = {} + + + +---@class Cow : ReflectReference +Cow = {} + + + +---@class Range : ReflectReference +Range = {} + + + +---@class RangeInclusive : ReflectReference +RangeInclusive = {} + + + + +---@param registration ScriptTypeRegistration | ScriptComponentRegistration | ScriptResourceRegistration +--- The type to construct. +---@param payload table +--- The values to use to construct the type. +---@return ReflectReference +function construct(registration,payload) end + +---@param message string +---@return nil +function log_debug(message) end + +---@param message string +---@return nil +function log_error(message) end + +---@param message string +--- the message to log +---@return nil +function log_info(message) end + +---@param message string +---@return nil +function log_trace(message) end + +---@param message string +---@return nil +function log_warn(message) end + +---@param tuple ... any +--- The tuple of values to curry +---@return any[] +function pack_args(... tuple) end + +---@param callback string +--- the callback label to register this function against. +---@param _function function +--- the callback function which will be stored as a handler for this callback label. +---@return nil +function register_callback(callback,_function) end + +---@param callback string +--- The function name in the script this system should call when run. +---@param attachment ScriptAttachment +--- The script attachment to use for the system. This is the attachment that will be used for the system's callback. +---@return ScriptSystemBuilder +function system_builder(callback,attachment) end + +---@param values any[] +--- The list of values to uncurry +---@return any ... +function unpack_args(values) end + + +---@type ScalingMode +--- A static class allowing calls through the "." operator only. +ScalingMode = {} + +---@type GamepadButton +--- A static class allowing calls through the "." operator only. +GamepadButton = {} + +---@type Polyline2d +--- A static class allowing calls through the "." operator only. +Polyline2d = {} + +---@type Replace +--- A static class allowing calls through the "." operator only. +Replace = {} + +---@type RadialGradientShape +--- A static class allowing calls through the "." operator only. +RadialGradientShape = {} + +---@type I16Vec4 +--- A static class allowing calls through the "." operator only. +I16Vec4 = {} + +---@type TextureSlicer +--- A static class allowing calls through the "." operator only. +TextureSlicer = {} + +---@type AccessibilityRequested +--- A static class allowing calls through the "." operator only. +AccessibilityRequested = {} + +---@type AssetPath +--- A static class allowing calls through the "." operator only. +AssetPath = {} + +---@type MsaaWriteback +--- A static class allowing calls through the "." operator only. +MsaaWriteback = {} + +---@type LinearGradient +--- A static class allowing calls through the "." operator only. +LinearGradient = {} + +---@type SpriteScalingMode +--- A static class allowing calls through the "." operator only. +SpriteScalingMode = {} + +---@type SmolStr +--- A static class allowing calls through the "." operator only. +SmolStr = {} + +---@type InfinitePlane3d +--- A static class allowing calls through the "." operator only. +InfinitePlane3d = {} + +---@type SphereMeshBuilder +--- A static class allowing calls through the "." operator only. +SphereMeshBuilder = {} + +---@type RegularPolygon +--- A static class allowing calls through the "." operator only. +RegularPolygon = {} + +---@type GamepadConnection +--- A static class allowing calls through the "." operator only. +GamepadConnection = {} + +---@type OcclusionCulling +--- A static class allowing calls through the "." operator only. +OcclusionCulling = {} + +---@type Screenshot +--- A static class allowing calls through the "." operator only. +Screenshot = {} + +---@type Rect +--- A static class allowing calls through the "." operator only. +Rect = {} + +---@type ViewportNode +--- A static class allowing calls through the "." operator only. +ViewportNode = {} + +---@type table +--- An global instance of this type +types = {} + +---@type GlyphAtlasLocation +--- A static class allowing calls through the "." operator only. +GlyphAtlasLocation = {} + +---@type MorphWeights +--- A static class allowing calls through the "." operator only. +MorphWeights = {} + +---@type GlyphAtlasInfo +--- A static class allowing calls through the "." operator only. +GlyphAtlasInfo = {} + +---@type Oklcha +--- A static class allowing calls through the "." operator only. +Oklcha = {} + +---@type MotionVectorPrepass +--- A static class allowing calls through the "." operator only. +MotionVectorPrepass = {} + +---@type AlignSelf +--- A static class allowing calls through the "." operator only. +AlignSelf = {} + +---@type Window +--- A static class allowing calls through the "." operator only. +Window = {} + +---@type FloatOrd +--- A static class allowing calls through the "." operator only. +FloatOrd = {} + +---@type ButtonSettings +--- A static class allowing calls through the "." operator only. +ButtonSettings = {} + +---@type Affine3A +--- A static class allowing calls through the "." operator only. +Affine3A = {} + +---@type URect +--- A static class allowing calls through the "." operator only. +URect = {} + +---@type GamepadInput +--- A static class allowing calls through the "." operator only. +GamepadInput = {} + +---@type RepeatedGridTrack +--- A static class allowing calls through the "." operator only. +RepeatedGridTrack = {} + +---@type IVec4 +--- A static class allowing calls through the "." operator only. +IVec4 = {} + +---@type Wireframe2dConfig +--- A static class allowing calls through the "." operator only. +Wireframe2dConfig = {} + +---@type StaticTransformOptimizations +--- A static class allowing calls through the "." operator only. +StaticTransformOptimizations = {} + +---@type ScriptAttachment +--- A static class allowing calls through the "." operator only. +ScriptAttachment = {} + +---@type Hwba +--- A static class allowing calls through the "." operator only. +Hwba = {} + +---@type WindowBackendScaleFactorChanged +--- A static class allowing calls through the "." operator only. +WindowBackendScaleFactorChanged = {} + +---@type BorderRadius +--- A static class allowing calls through the "." operator only. +BorderRadius = {} + +---@type Polyline3d +--- A static class allowing calls through the "." operator only. +Polyline3d = {} + +---@type DMat3 +--- A static class allowing calls through the "." operator only. +DMat3 = {} + +---@type StrikethroughColor +--- A static class allowing calls through the "." operator only. +StrikethroughColor = {} + +---@type MainEntity +--- A static class allowing calls through the "." operator only. +MainEntity = {} + +---@type LineBreak +--- A static class allowing calls through the "." operator only. +LineBreak = {} + +---@type Polygon +--- A static class allowing calls through the "." operator only. +Polygon = {} + +---@type CircularSectorMeshBuilder +--- A static class allowing calls through the "." operator only. +CircularSectorMeshBuilder = {} + +---@type Cuboid +--- A static class allowing calls through the "." operator only. +Cuboid = {} + +---@type RayCast2d +--- A static class allowing calls through the "." operator only. +RayCast2d = {} + +---@type ManageAccessibilityUpdates +--- A static class allowing calls through the "." operator only. +ManageAccessibilityUpdates = {} + +---@type ConicGradient +--- A static class allowing calls through the "." operator only. +ConicGradient = {} + +---@type AtomicUsize +--- A static class allowing calls through the "." operator only. +AtomicUsize = {} + +---@type ScriptAsset +--- A static class allowing calls through the "." operator only. +ScriptAsset = {} + +---@type NonZeroU16 +--- A static class allowing calls through the "." operator only. +NonZeroU16 = {} + +---@type I16Vec3 +--- A static class allowing calls through the "." operator only. +I16Vec3 = {} + +---@type Rectangle +--- A static class allowing calls through the "." operator only. +Rectangle = {} + +---@type NonZeroUsize +--- A static class allowing calls through the "." operator only. +NonZeroUsize = {} + +---@type TextLayout +--- A static class allowing calls through the "." operator only. +TextLayout = {} + +---@type PrimaryWindow +--- A static class allowing calls through the "." operator only. +PrimaryWindow = {} + +---@type Quat +--- A static class allowing calls through the "." operator only. +Quat = {} + +---@type Underline +--- A static class allowing calls through the "." operator only. +Underline = {} + +---@type LinearRgba +--- A static class allowing calls through the "." operator only. +LinearRgba = {} + +---@type Segment3d +--- A static class allowing calls through the "." operator only. +Segment3d = {} + +---@type GamepadButtonStateChangedEvent +--- A static class allowing calls through the "." operator only. +GamepadButtonStateChangedEvent = {} + +---@type Camera2d +--- A static class allowing calls through the "." operator only. +Camera2d = {} + +---@type BoundingCircle +--- A static class allowing calls through the "." operator only. +BoundingCircle = {} + +---@type AlphaMode2d +--- A static class allowing calls through the "." operator only. +AlphaMode2d = {} + +---@type ShadowStyle +--- A static class allowing calls through the "." operator only. +ShadowStyle = {} + +---@type WinitUserEvent +--- A static class allowing calls through the "." operator only. +WinitUserEvent = {} + +---@type NativeKeyCode +--- A static class allowing calls through the "." operator only. +NativeKeyCode = {} + +---@type GlobalTransform +--- A static class allowing calls through the "." operator only. +GlobalTransform = {} + +---@type Vec4 +--- A static class allowing calls through the "." operator only. +Vec4 = {} + +---@type NonZeroU32 +--- A static class allowing calls through the "." operator only. +NonZeroU32 = {} + +---@type PresentMode +--- A static class allowing calls through the "." operator only. +PresentMode = {} + +---@type DepthPrepassDoubleBuffer +--- A static class allowing calls through the "." operator only. +DepthPrepassDoubleBuffer = {} + +---@type Xyza +--- A static class allowing calls through the "." operator only. +Xyza = {} + +---@type ScriptTypeRegistration +--- A static class allowing calls through the "." operator only. +ScriptTypeRegistration = {} + +---@type BorderColor +--- A static class allowing calls through the "." operator only. +BorderColor = {} + +---@type CustomCursorUrl +--- A static class allowing calls through the "." operator only. +CustomCursorUrl = {} + +---@type TextLayoutInfo +--- A static class allowing calls through the "." operator only. +TextLayoutInfo = {} + +---@type CalculatedClip +--- A static class allowing calls through the "." operator only. +CalculatedClip = {} + +---@type ConicalFrustumMeshBuilder +--- A static class allowing calls through the "." operator only. +ConicalFrustumMeshBuilder = {} + +---@type Stopwatch +--- A static class allowing calls through the "." operator only. +Stopwatch = {} + +---@type BorderGradient +--- A static class allowing calls through the "." operator only. +BorderGradient = {} + +---@type RangeInclusive +--- A static class allowing calls through the "." operator only. +RangeInclusive = {} + +---@type Cylinder +--- A static class allowing calls through the "." operator only. +Cylinder = {} + +---@type AtomicI16 +--- A static class allowing calls through the "." operator only. +AtomicI16 = {} + +---@type Real +--- A static class allowing calls through the "." operator only. +Real = {} + +---@type Polyline2dMeshBuilder +--- A static class allowing calls through the "." operator only. +Polyline2dMeshBuilder = {} + +---@type RenderEntity +--- A static class allowing calls through the "." operator only. +RenderEntity = {} + +---@type Line3d +--- A static class allowing calls through the "." operator only. +Line3d = {} + +---@type Cone +--- A static class allowing calls through the "." operator only. +Cone = {} + +---@type JustifyContent +--- A static class allowing calls through the "." operator only. +JustifyContent = {} + +---@type Add +--- A static class allowing calls through the "." operator only. +Add = {} + +---@type Edge +--- A static class allowing calls through the "." operator only. +Edge = {} + +---@type UVec2 +--- A static class allowing calls through the "." operator only. +UVec2 = {} + +---@type NonZeroI16 +--- A static class allowing calls through the "." operator only. +NonZeroI16 = {} + +---@type TextFont +--- A static class allowing calls through the "." operator only. +TextFont = {} + +---@type ColorGradingGlobal +--- A static class allowing calls through the "." operator only. +ColorGradingGlobal = {} + +---@type Rhombus +--- A static class allowing calls through the "." operator only. +Rhombus = {} + +---@type GlobalZIndex +--- A static class allowing calls through the "." operator only. +GlobalZIndex = {} + +---@type CascadesFrusta +--- A static class allowing calls through the "." operator only. +CascadesFrusta = {} + +---@type ImageNode +--- A static class allowing calls through the "." operator only. +ImageNode = {} + +---@type Dir2 +--- A static class allowing calls through the "." operator only. +Dir2 = {} + +---@type Wireframe2dMaterial +--- A static class allowing calls through the "." operator only. +Wireframe2dMaterial = {} + +---@type AccumulatedMouseMotion +--- A static class allowing calls through the "." operator only. +AccumulatedMouseMotion = {} + +---@type ScriptQueryResult +--- A static class allowing calls through the "." operator only. +ScriptQueryResult = {} + +---@type Cow +--- A static class allowing calls through the "." operator only. +Cow = {} + +---@type AtomicI64 +--- A static class allowing calls through the "." operator only. +AtomicI64 = {} + +---@type Hsva +--- A static class allowing calls through the "." operator only. +Hsva = {} + +---@type EulerRot +--- A static class allowing calls through the "." operator only. +EulerRot = {} + +---@type AccessibilitySystems +--- A static class allowing calls through the "." operator only. +AccessibilitySystems = {} + +---@type Color +--- A static class allowing calls through the "." operator only. +Color = {} + +---@type RenderTarget +--- A static class allowing calls through the "." operator only. +RenderTarget = {} + +---@type GamepadRumbleRequest +--- A static class allowing calls through the "." operator only. +GamepadRumbleRequest = {} + +---@type I8Vec4 +--- A static class allowing calls through the "." operator only. +I8Vec4 = {} + +---@type ClearColorConfig +--- A static class allowing calls through the "." operator only. +ClearColorConfig = {} + +---@type ConeMeshBuilder +--- A static class allowing calls through the "." operator only. +ConeMeshBuilder = {} + +---@type Rot2 +--- A static class allowing calls through the "." operator only. +Rot2 = {} + +---@type InputFocusVisible +--- A static class allowing calls through the "." operator only. +InputFocusVisible = {} + +---@type ChildOf +--- A static class allowing calls through the "." operator only. +ChildOf = {} + +---@type SphereKind +--- A static class allowing calls through the "." operator only. +SphereKind = {} + +---@type RenderVisibleEntities +--- A static class allowing calls through the "." operator only. +RenderVisibleEntities = {} + +---@type ScriptResourceRegistration +--- A static class allowing calls through the "." operator only. +ScriptResourceRegistration = {} + +---@type Text +--- A static class allowing calls through the "." operator only. +Text = {} + +---@type TransformTreeChanged +--- A static class allowing calls through the "." operator only. +TransformTreeChanged = {} + +---@type Camera +--- A static class allowing calls through the "." operator only. +Camera = {} + +---@type WindowMoved +--- A static class allowing calls through the "." operator only. +WindowMoved = {} + +---@type NormalPrepass +--- A static class allowing calls through the "." operator only. +NormalPrepass = {} + +---@type WindowScaleFactorChanged +--- A static class allowing calls through the "." operator only. +WindowScaleFactorChanged = {} + +---@type MouseMotion +--- A static class allowing calls through the "." operator only. +MouseMotion = {} + +---@type GridTrackRepetition +--- A static class allowing calls through the "." operator only. +GridTrackRepetition = {} + +---@type Key +--- A static class allowing calls through the "." operator only. +Key = {} + +---@type I8Vec2 +--- A static class allowing calls through the "." operator only. +I8Vec2 = {} + +---@type ColorMaterial +--- A static class allowing calls through the "." operator only. +ColorMaterial = {} + +---@type ZIndex +--- A static class allowing calls through the "." operator only. +ZIndex = {} + +---@type Visibility +--- A static class allowing calls through the "." operator only. +Visibility = {} + +---@type WindowPosition +--- A static class allowing calls through the "." operator only. +WindowPosition = {} + +---@type BlendState +--- A static class allowing calls through the "." operator only. +BlendState = {} + +---@type NoAutoAabb +--- A static class allowing calls through the "." operator only. +NoAutoAabb = {} + +---@type Affine3 +--- A static class allowing calls through the "." operator only. +Affine3 = {} + +---@type Triangle3dMeshBuilder +--- A static class allowing calls through the "." operator only. +Triangle3dMeshBuilder = {} + +---@type ColorGrading +--- A static class allowing calls through the "." operator only. +ColorGrading = {} + +---@type VisibilityRange +--- A static class allowing calls through the "." operator only. +VisibilityRange = {} + +---@type AutoNavigationConfig +--- A static class allowing calls through the "." operator only. +AutoNavigationConfig = {} + +---@type DeferredPrepass +--- A static class allowing calls through the "." operator only. +DeferredPrepass = {} + +---@type TextNodeFlags +--- A static class allowing calls through the "." operator only. +TextNodeFlags = {} + +---@type GamepadRumbleIntensity +--- A static class allowing calls through the "." operator only. +GamepadRumbleIntensity = {} + +---@type InteropError +--- A static class allowing calls through the "." operator only. +InteropError = {} + +---@type TilemapChunk +--- A static class allowing calls through the "." operator only. +TilemapChunk = {} + +---@type FunctionArgInfo +--- A static class allowing calls through the "." operator only. +FunctionArgInfo = {} + +---@type Name +--- A static class allowing calls through the "." operator only. +Name = {} + +---@type Justify +--- A static class allowing calls through the "." operator only. +Justify = {} + +---@type Triangle2dMeshBuilder +--- A static class allowing calls through the "." operator only. +Triangle2dMeshBuilder = {} + +---@type CylinderAnchor +--- A static class allowing calls through the "." operator only. +CylinderAnchor = {} + +---@type OverflowClipBox +--- A static class allowing calls through the "." operator only. +OverflowClipBox = {} + +---@type Range +--- A static class allowing calls through the "." operator only. +Range = {} + +---@type ButtonAxisSettings +--- A static class allowing calls through the "." operator only. +ButtonAxisSettings = {} + +---@type ShaderStorageBuffer +--- A static class allowing calls through the "." operator only. +ShaderStorageBuffer = {} + +---@type ComponentTicks +--- A static class allowing calls through the "." operator only. +ComponentTicks = {} + +---@type PlaneMeshBuilder +--- A static class allowing calls through the "." operator only. +PlaneMeshBuilder = {} + +---@type SyncToRenderWorld +--- A static class allowing calls through the "." operator only. +SyncToRenderWorld = {} + +---@type ScreenSpaceTransmissionQuality +--- A static class allowing calls through the "." operator only. +ScreenSpaceTransmissionQuality = {} + +---@type TilemapChunkMeshCache +--- A static class allowing calls through the "." operator only. +TilemapChunkMeshCache = {} + +---@type CylinderMeshBuilder +--- A static class allowing calls through the "." operator only. +CylinderMeshBuilder = {} + +---@type GlobalsUniform +--- A static class allowing calls through the "." operator only. +GlobalsUniform = {} + +---@type Duration +--- A static class allowing calls through the "." operator only. +Duration = {} + +---@type Fixed +--- A static class allowing calls through the "." operator only. +Fixed = {} + +---@type U8Vec4 +--- A static class allowing calls through the "." operator only. +U8Vec4 = {} + +---@type FontWeight +--- A static class allowing calls through the "." operator only. +FontWeight = {} + +---@type TemporaryRenderEntity +--- A static class allowing calls through the "." operator only. +TemporaryRenderEntity = {} + +---@type GamepadEvent +--- A static class allowing calls through the "." operator only. +GamepadEvent = {} + +---@type Children +--- A static class allowing calls through the "." operator only. +Children = {} + +---@type BoxShadow +--- A static class allowing calls through the "." operator only. +BoxShadow = {} + +---@type DVec2 +--- A static class allowing calls through the "." operator only. +DVec2 = {} + +---@type GamepadConnectionEvent +--- A static class allowing calls through the "." operator only. +GamepadConnectionEvent = {} + +---@type NormalizedRenderTarget +--- A static class allowing calls through the "." operator only. +NormalizedRenderTarget = {} + +---@type Mesh3d +--- A static class allowing calls through the "." operator only. +Mesh3d = {} + +---@type MipBias +--- A static class allowing calls through the "." operator only. +MipBias = {} + +---@type I64Vec3 +--- A static class allowing calls through the "." operator only. +I64Vec3 = {} + +---@type WindowResizeConstraints +--- A static class allowing calls through the "." operator only. +WindowResizeConstraints = {} + +---@type MouseScrollUnit +--- A static class allowing calls through the "." operator only. +MouseScrollUnit = {} + +---@type BVec3A +--- A static class allowing calls through the "." operator only. +BVec3A = {} + +---@type CuboidMeshBuilder +--- A static class allowing calls through the "." operator only. +CuboidMeshBuilder = {} + +---@type CapsuleUvProfile +--- A static class allowing calls through the "." operator only. +CapsuleUvProfile = {} + +---@type Wireframe2d +--- A static class allowing calls through the "." operator only. +Wireframe2d = {} + +---@type DefaultQueryFilters +--- A static class allowing calls through the "." operator only. +DefaultQueryFilters = {} + +---@type LayoutConfig +--- A static class allowing calls through the "." operator only. +LayoutConfig = {} + +---@type BoxSizing +--- A static class allowing calls through the "." operator only. +BoxSizing = {} + +---@type DoubleTapGesture +--- A static class allowing calls through the "." operator only. +DoubleTapGesture = {} + +---@type EnabledButtons +--- A static class allowing calls through the "." operator only. +EnabledButtons = {} + +---@type AxisSettings +--- A static class allowing calls through the "." operator only. +AxisSettings = {} + +---@type Laba +--- A static class allowing calls through the "." operator only. +Laba = {} + +---@type Exposure +--- A static class allowing calls through the "." operator only. +Exposure = {} + +---@type Wireframe2dColor +--- A static class allowing calls through the "." operator only. +Wireframe2dColor = {} + +---@type ContextKey +--- A static class allowing calls through the "." operator only. +ContextKey = {} + +---@type Dir3 +--- A static class allowing calls through the "." operator only. +Dir3 = {} + +---@type PositionedGlyph +--- A static class allowing calls through the "." operator only. +PositionedGlyph = {} + +---@type MonitorSelection +--- A static class allowing calls through the "." operator only. +MonitorSelection = {} + +---@type Sprite +--- A static class allowing calls through the "." operator only. +Sprite = {} + +---@type Ellipse +--- A static class allowing calls through the "." operator only. +Ellipse = {} + +---@type TabGroup +--- A static class allowing calls through the "." operator only. +TabGroup = {} + +---@type BVec3 +--- A static class allowing calls through the "." operator only. +BVec3 = {} + +---@type TextSpan +--- A static class allowing calls through the "." operator only. +TextSpan = {} + +---@type CallbackLabel +--- A static class allowing calls through the "." operator only. +CallbackLabel = {} + +---@type Tonemapping +--- A static class allowing calls through the "." operator only. +Tonemapping = {} + +---@type RunGeometry +--- A static class allowing calls through the "." operator only. +RunGeometry = {} + +---@type RayCast3d +--- A static class allowing calls through the "." operator only. +RayCast3d = {} + +---@type ScriptComponentRegistration +--- A static class allowing calls through the "." operator only. +ScriptComponentRegistration = {} + +---@type CursorOptions +--- A static class allowing calls through the "." operator only. +CursorOptions = {} + +---@type AtomicU8 +--- A static class allowing calls through the "." operator only. +AtomicU8 = {} + +---@type WindowLevel +--- A static class allowing calls through the "." operator only. +WindowLevel = {} + +---@type TorusMeshBuilder +--- A static class allowing calls through the "." operator only. +TorusMeshBuilder = {} + +---@type NonNilUuid +--- A static class allowing calls through the "." operator only. +NonNilUuid = {} + +---@type CubemapLayout +--- A static class allowing calls through the "." operator only. +CubemapLayout = {} + +---@type Tick +--- A static class allowing calls through the "." operator only. +Tick = {} + +---@type PinchGesture +--- A static class allowing calls through the "." operator only. +PinchGesture = {} + +---@type AtomicU32 +--- A static class allowing calls through the "." operator only. +AtomicU32 = {} + +---@type ReflectSystemGraphNode +--- A static class allowing calls through the "." operator only. +ReflectSystemGraphNode = {} + +---@type BVec4 +--- A static class allowing calls through the "." operator only. +BVec4 = {} + +---@type MaxTrackSizingFunction +--- A static class allowing calls through the "." operator only. +MaxTrackSizingFunction = {} + +---@type CameraRenderGraph +--- A static class allowing calls through the "." operator only. +CameraRenderGraph = {} + +---@type InputFocus +--- A static class allowing calls through the "." operator only. +InputFocus = {} + +---@type Ime +--- A static class allowing calls through the "." operator only. +Ime = {} + +---@type Frustum +--- A static class allowing calls through the "." operator only. +Frustum = {} + +---@type DebandDither +--- A static class allowing calls through the "." operator only. +DebandDither = {} + +---@type FocusableArea +--- A static class allowing calls through the "." operator only. +FocusableArea = {} + +---@type WindowResolution +--- A static class allowing calls through the "." operator only. +WindowResolution = {} + +---@type WindowOccluded +--- A static class allowing calls through the "." operator only. +WindowOccluded = {} + +---@type Mat3A +--- A static class allowing calls through the "." operator only. +Mat3A = {} + +---@type JustifySelf +--- A static class allowing calls through the "." operator only. +JustifySelf = {} + +---@type Indices +--- A static class allowing calls through the "." operator only. +Indices = {} + +---@type ResolvedBorderRadius +--- A static class allowing calls through the "." operator only. +ResolvedBorderRadius = {} + +---@type ReflectNodeId +--- A static class allowing calls through the "." operator only. +ReflectNodeId = {} + +---@type NoWireframe2d +--- A static class allowing calls through the "." operator only. +NoWireframe2d = {} + +---@type Camera3dDepthTextureUsage +--- A static class allowing calls through the "." operator only. +Camera3dDepthTextureUsage = {} + +---@type AtomicIsize +--- A static class allowing calls through the "." operator only. +AtomicIsize = {} + +---@type CursorMoved +--- A static class allowing calls through the "." operator only. +CursorMoved = {} + +---@type KeyboardFocusLost +--- A static class allowing calls through the "." operator only. +KeyboardFocusLost = {} + +---@type ImageRenderTarget +--- A static class allowing calls through the "." operator only. +ImageRenderTarget = {} + +---@type Text2d +--- A static class allowing calls through the "." operator only. +Text2d = {} + +---@type Polyline3dMeshBuilder +--- A static class allowing calls through the "." operator only. +Polyline3dMeshBuilder = {} + +---@type FontSmoothing +--- A static class allowing calls through the "." operator only. +FontSmoothing = {} + +---@type WindowFocused +--- A static class allowing calls through the "." operator only. +WindowFocused = {} + +---@type DAffine3 +--- A static class allowing calls through the "." operator only. +DAffine3 = {} + +---@type LocationContext +--- A static class allowing calls through the "." operator only. +LocationContext = {} + +---@type IgnoreScroll +--- A static class allowing calls through the "." operator only. +IgnoreScroll = {} + +---@type Plane3d +--- A static class allowing calls through the "." operator only. +Plane3d = {} + +---@type U64Vec3 +--- A static class allowing calls through the "." operator only. +U64Vec3 = {} + +---@type Text2dShadow +--- A static class allowing calls through the "." operator only. +Text2dShadow = {} + +---@type AlignItems +--- A static class allowing calls through the "." operator only. +AlignItems = {} + +---@type ImageNodeSize +--- A static class allowing calls through the "." operator only. +ImageNodeSize = {} + +---@type Val +--- A static class allowing calls through the "." operator only. +Val = {} + +---@type UVec3 +--- A static class allowing calls through the "." operator only. +UVec3 = {} + +---@type MainPassResolutionOverride +--- A static class allowing calls through the "." operator only. +MainPassResolutionOverride = {} + +---@type UiRect +--- A static class allowing calls through the "." operator only. +UiRect = {} + +---@type BoundingSphereCast +--- A static class allowing calls through the "." operator only. +BoundingSphereCast = {} + +---@type GridAutoFlow +--- A static class allowing calls through the "." operator only. +GridAutoFlow = {} + +---@type UntypedAssetId +--- A static class allowing calls through the "." operator only. +UntypedAssetId = {} + +---@type Capsule2d +--- A static class allowing calls through the "." operator only. +Capsule2d = {} + +---@type MinTrackSizingFunction +--- A static class allowing calls through the "." operator only. +MinTrackSizingFunction = {} + +---@type InheritedVisibility +--- A static class allowing calls through the "." operator only. +InheritedVisibility = {} + +---@type VideoMode +--- A static class allowing calls through the "." operator only. +VideoMode = {} + +---@type SliceScaleMode +--- A static class allowing calls through the "." operator only. +SliceScaleMode = {} + +---@type Arc2d +--- A static class allowing calls through the "." operator only. +Arc2d = {} + +---@type ReflectReference +--- A static class allowing calls through the "." operator only. +ReflectReference = {} + +---@type ClearColor +--- A static class allowing calls through the "." operator only. +ClearColor = {} + +---@type ScriptValue +--- A static class allowing calls through the "." operator only. +ScriptValue = {} + +---@type CircleMeshBuilder +--- A static class allowing calls through the "." operator only. +CircleMeshBuilder = {} + +---@type Label +--- A static class allowing calls through the "." operator only. +Label = {} + +---@type CursorIcon +--- A static class allowing calls through the "." operator only. +CursorIcon = {} + +---@type FocusPolicy +--- A static class allowing calls through the "." operator only. +FocusPolicy = {} + +---@type Vec3 +--- A static class allowing calls through the "." operator only. +Vec3 = {} + +---@type CircularSector +--- A static class allowing calls through the "." operator only. +CircularSector = {} + +---@type CustomCursor +--- A static class allowing calls through the "." operator only. +CustomCursor = {} + +---@type BackgroundGradient +--- A static class allowing calls through the "." operator only. +BackgroundGradient = {} + +---@type ObservedBy +--- A static class allowing calls through the "." operator only. +ObservedBy = {} + +---@type ReflectableScheduleLabel +--- A static class allowing calls through the "." operator only. +ReflectableScheduleLabel = {} + +---@type Tetrahedron +--- A static class allowing calls through the "." operator only. +Tetrahedron = {} + +---@type EaseFunction +--- A static class allowing calls through the "." operator only. +EaseFunction = {} + +---@type SubCameraView +--- A static class allowing calls through the "." operator only. +SubCameraView = {} + +---@type PanGesture +--- A static class allowing calls through the "." operator only. +PanGesture = {} + +---@type Projection +--- A static class allowing calls through the "." operator only. +Projection = {} + +---@type Oklaba +--- A static class allowing calls through the "." operator only. +Oklaba = {} + +---@type Capsule3dMeshBuilder +--- A static class allowing calls through the "." operator only. +Capsule3dMeshBuilder = {} + +---@type GamepadButtonChangedEvent +--- A static class allowing calls through the "." operator only. +GamepadButtonChangedEvent = {} + +---@type U16Vec3 +--- A static class allowing calls through the "." operator only. +U16Vec3 = {} + +---@type Segment2d +--- A static class allowing calls through the "." operator only. +Segment2d = {} + +---@type Triangle2d +--- A static class allowing calls through the "." operator only. +Triangle2d = {} + +---@type WindowRef +--- A static class allowing calls through the "." operator only. +WindowRef = {} + +---@type AutoDirectionalNavigation +--- A static class allowing calls through the "." operator only. +AutoDirectionalNavigation = {} + +---@type Isometry2d +--- A static class allowing calls through the "." operator only. +Isometry2d = {} + +---@type WindowEvent +--- A static class allowing calls through the "." operator only. +WindowEvent = {} + +---@type CircularSegmentMeshBuilder +--- A static class allowing calls through the "." operator only. +CircularSegmentMeshBuilder = {} + +---@type Strikethrough +--- A static class allowing calls through the "." operator only. +Strikethrough = {} + +---@type CompositeAlphaMode +--- A static class allowing calls through the "." operator only. +CompositeAlphaMode = {} + +---@type PrimaryMonitor +--- A static class allowing calls through the "." operator only. +PrimaryMonitor = {} + +---@type DirectionalNavigationMap +--- A static class allowing calls through the "." operator only. +DirectionalNavigationMap = {} + +---@type ComputedUiTargetCamera +--- A static class allowing calls through the "." operator only. +ComputedUiTargetCamera = {} + +---@type NodeImageMode +--- A static class allowing calls through the "." operator only. +NodeImageMode = {} + +---@type EntityGeneration +--- A static class allowing calls through the "." operator only. +EntityGeneration = {} + +---@type ContentSize +--- A static class allowing calls through the "." operator only. +ContentSize = {} + +---@type CascadesVisibleEntities +--- A static class allowing calls through the "." operator only. +CascadesVisibleEntities = {} + +---@type RenderLayers +--- A static class allowing calls through the "." operator only. +RenderLayers = {} + +---@type AtomicU16 +--- A static class allowing calls through the "." operator only. +AtomicU16 = {} + +---@type ButtonState +--- A static class allowing calls through the "." operator only. +ButtonState = {} + +---@type I64Vec4 +--- A static class allowing calls through the "." operator only. +I64Vec4 = {} + +---@type Ray3d +--- A static class allowing calls through the "." operator only. +Ray3d = {} + +---@type DMat2 +--- A static class allowing calls through the "." operator only. +DMat2 = {} + +---@type CubemapVisibleEntities +--- A static class allowing calls through the "." operator only. +CubemapVisibleEntities = {} + +---@type BackgroundColor +--- A static class allowing calls through the "." operator only. +BackgroundColor = {} + +---@type Node +--- A static class allowing calls through the "." operator only. +Node = {} + +---@type DVec3 +--- A static class allowing calls through the "." operator only. +DVec3 = {} + +---@type Transform +--- A static class allowing calls through the "." operator only. +Transform = {} + +---@type TileData +--- A static class allowing calls through the "." operator only. +TileData = {} + +---@type EntityHash +--- A static class allowing calls through the "." operator only. +EntityHash = {} + +---@type Aabb2d +--- A static class allowing calls through the "." operator only. +Aabb2d = {} + +---@type InterpolationColorSpace +--- A static class allowing calls through the "." operator only. +InterpolationColorSpace = {} + +---@type NonZeroU128 +--- A static class allowing calls through the "." operator only. +NonZeroU128 = {} + +---@type OverflowClipMargin +--- A static class allowing calls through the "." operator only. +OverflowClipMargin = {} + +---@type TouchInput +--- A static class allowing calls through the "." operator only. +TouchInput = {} + +---@type Namespace +--- A static class allowing calls through the "." operator only. +Namespace = {} + +---@type LineHeight +--- A static class allowing calls through the "." operator only. +LineHeight = {} + +---@type WindowClosed +--- A static class allowing calls through the "." operator only. +WindowClosed = {} + +---@type Ray2d +--- A static class allowing calls through the "." operator only. +Ray2d = {} + +---@type ScriptError +--- A static class allowing calls through the "." operator only. +ScriptError = {} + +---@type Aabb +--- A static class allowing calls through the "." operator only. +Aabb = {} + +---@type DepthPrepass +--- A static class allowing calls through the "." operator only. +DepthPrepass = {} + +---@type UVec4 +--- A static class allowing calls through the "." operator only. +UVec4 = {} + +---@type Instant +--- A static class allowing calls through the "." operator only. +Instant = {} + +---@type DVec4 +--- A static class allowing calls through the "." operator only. +DVec4 = {} + +---@type Circle +--- A static class allowing calls through the "." operator only. +Circle = {} + +---@type GridTrack +--- A static class allowing calls through the "." operator only. +GridTrack = {} + +---@type UiTransform +--- A static class allowing calls through the "." operator only. +UiTransform = {} + +---@type JumpAt +--- A static class allowing calls through the "." operator only. +JumpAt = {} + +---@type GamepadAxisChangedEvent +--- A static class allowing calls through the "." operator only. +GamepadAxisChangedEvent = {} + +---@type RawGamepadEvent +--- A static class allowing calls through the "." operator only. +RawGamepadEvent = {} + +---@type MeshMorphWeights +--- A static class allowing calls through the "." operator only. +MeshMorphWeights = {} + +---@type VariadicTuple +--- A static class allowing calls through the "." operator only. +VariadicTuple = {} + +---@type IRect +--- A static class allowing calls through the "." operator only. +IRect = {} + +---@type BoundingCircleCast +--- A static class allowing calls through the "." operator only. +BoundingCircleCast = {} + +---@type Segment3dMeshBuilder +--- A static class allowing calls through the "." operator only. +Segment3dMeshBuilder = {} + +---@type Triangle3d +--- A static class allowing calls through the "." operator only. +Triangle3d = {} + +---@type AngularColorStop +--- A static class allowing calls through the "." operator only. +AngularColorStop = {} + +---@type DMat4 +--- A static class allowing calls through the "." operator only. +DMat4 = {} + +---@type Image +--- A static class allowing calls through the "." operator only. +Image = {} + +---@type Mesh2d +--- A static class allowing calls through the "." operator only. +Mesh2d = {} + +---@type TabIndex +--- A static class allowing calls through the "." operator only. +TabIndex = {} + +---@type NonZeroI32 +--- A static class allowing calls through the "." operator only. +NonZeroI32 = {} + +---@type CustomProjection +--- A static class allowing calls through the "." operator only. +CustomProjection = {} + +---@type AtomicBool +--- A static class allowing calls through the "." operator only. +AtomicBool = {} + +---@type ReflectSystemSet +--- A static class allowing calls through the "." operator only. +ReflectSystemSet = {} + +---@type Entity +--- A static class allowing calls through the "." operator only. +Entity = {} + +---@type CircularSegment +--- A static class allowing calls through the "." operator only. +CircularSegment = {} + +---@type ComputedUiRenderTargetInfo +--- A static class allowing calls through the "." operator only. +ComputedUiRenderTargetInfo = {} + +---@type ColorStop +--- A static class allowing calls through the "." operator only. +ColorStop = {} + +---@type BVec4A +--- A static class allowing calls through the "." operator only. +BVec4A = {} + +---@type Dir3A +--- A static class allowing calls through the "." operator only. +Dir3A = {} + +---@type Gradient +--- A static class allowing calls through the "." operator only. +Gradient = {} + +---@type ScriptSystemBuilder +--- A static class allowing calls through the "." operator only. +ScriptSystemBuilder = {} + +---@type EllipseMeshBuilder +--- A static class allowing calls through the "." operator only. +EllipseMeshBuilder = {} + +---@type TextColor +--- A static class allowing calls through the "." operator only. +TextColor = {} + +---@type RadialGradient +--- A static class allowing calls through the "." operator only. +RadialGradient = {} + +---@type Vec2 +--- A static class allowing calls through the "." operator only. +Vec2 = {} + +---@type U64Vec2 +--- A static class allowing calls through the "." operator only. +U64Vec2 = {} + +---@type NonZeroI8 +--- A static class allowing calls through the "." operator only. +NonZeroI8 = {} + +---@type DAffine2 +--- A static class allowing calls through the "." operator only. +DAffine2 = {} + +---@type NonZeroI64 +--- A static class allowing calls through the "." operator only. +NonZeroI64 = {} + +---@type Lcha +--- A static class allowing calls through the "." operator only. +Lcha = {} + +---@type Vec3A +--- A static class allowing calls through the "." operator only. +Vec3A = {} + +---@type DynamicComponent +--- A static class allowing calls through the "." operator only. +DynamicComponent = {} + +---@type WindowResized +--- A static class allowing calls through the "." operator only. +WindowResized = {} + +---@type TypeId +--- A static class allowing calls through the "." operator only. +TypeId = {} + +---@type FlexDirection +--- A static class allowing calls through the "." operator only. +FlexDirection = {} + +---@type Disabled +--- A static class allowing calls through the "." operator only. +Disabled = {} + +---@type JustifyItems +--- A static class allowing calls through the "." operator only. +JustifyItems = {} + +---@type AnnulusMeshBuilder +--- A static class allowing calls through the "." operator only. +AnnulusMeshBuilder = {} + +---@type Val2 +--- A static class allowing calls through the "." operator only. +Val2 = {} + +---@type AlignContent +--- A static class allowing calls through the "." operator only. +AlignContent = {} + +---@type Interval +--- A static class allowing calls through the "." operator only. +Interval = {} + +---@type UiTargetCamera +--- A static class allowing calls through the "." operator only. +UiTargetCamera = {} + +---@type OrthographicProjection +--- A static class allowing calls through the "." operator only. +OrthographicProjection = {} + +---@type RawGamepadAxisChangedEvent +--- A static class allowing calls through the "." operator only. +RawGamepadAxisChangedEvent = {} + +---@type U16Vec4 +--- A static class allowing calls through the "." operator only. +U16Vec4 = {} + +---@type ScriptComponent +--- A static class allowing calls through the "." operator only. +ScriptComponent = {} + +---@type WindowThemeChanged +--- A static class allowing calls through the "." operator only. +WindowThemeChanged = {} + +---@type DeferredPrepassDoubleBuffer +--- A static class allowing calls through the "." operator only. +DeferredPrepassDoubleBuffer = {} + +---@type AlphaMode +--- A static class allowing calls through the "." operator only. +AlphaMode = {} + +---@type any +--- A static class allowing calls through the "." operator only. +FunctionCallContext = {} + +---@type AssetIndex +--- A static class allowing calls through the "." operator only. +AssetIndex = {} + +---@type CompassQuadrant +--- A static class allowing calls through the "." operator only. +CompassQuadrant = {} + +---@type CompassOctant +--- A static class allowing calls through the "." operator only. +CompassOctant = {} + +---@type FunctionInfo +--- A static class allowing calls through the "." operator only. +FunctionInfo = {} + +---@type RotationGesture +--- A static class allowing calls through the "." operator only. +RotationGesture = {} + +---@type TextBounds +--- A static class allowing calls through the "." operator only. +TextBounds = {} + +---@type ReflectSystemGraph +--- A static class allowing calls through the "." operator only. +ReflectSystemGraph = {} + +---@type Monitor +--- A static class allowing calls through the "." operator only. +Monitor = {} + +---@type Outline +--- A static class allowing calls through the "." operator only. +Outline = {} + +---@type Capsule3d +--- A static class allowing calls through the "." operator only. +Capsule3d = {} + +---@type Gamepad +--- A static class allowing calls through the "." operator only. +Gamepad = {} + +---@type EntityIndexSet +--- A static class allowing calls through the "." operator only. +EntityIndexSet = {} + +---@type RangeFull +--- A static class allowing calls through the "." operator only. +RangeFull = {} + +---@type Uuid +--- A static class allowing calls through the "." operator only. +Uuid = {} + +---@type ReflectSchedule +--- A static class allowing calls through the "." operator only. +ReflectSchedule = {} + +---@type BorderRect +--- A static class allowing calls through the "." operator only. +BorderRect = {} + +---@type UntypedHandle +--- A static class allowing calls through the "." operator only. +UntypedHandle = {} + +---@type Mesh2dWireframe +--- A static class allowing calls through the "." operator only. +Mesh2dWireframe = {} + +---@type ReflectSystem +--- A static class allowing calls through the "." operator only. +ReflectSystem = {} + +---@type ReadbackComplete +--- A static class allowing calls through the "." operator only. +ReadbackComplete = {} + +---@type U8Vec3 +--- A static class allowing calls through the "." operator only. +U8Vec3 = {} + +---@type Torus +--- A static class allowing calls through the "." operator only. +Torus = {} + +---@type ConeAnchor +--- A static class allowing calls through the "." operator only. +ConeAnchor = {} + +---@type FontFeatures +--- A static class allowing calls through the "." operator only. +FontFeatures = {} + +---@type Hsla +--- A static class allowing calls through the "." operator only. +Hsla = {} + +---@type DQuat +--- A static class allowing calls through the "." operator only. +DQuat = {} + +---@type U64Vec4 +--- A static class allowing calls through the "." operator only. +U64Vec4 = {} + +---@type WindowDestroyed +--- A static class allowing calls through the "." operator only. +WindowDestroyed = {} + +---@type I8Vec3 +--- A static class allowing calls through the "." operator only. +I8Vec3 = {} + +---@type SpriteImageMode +--- A static class allowing calls through the "." operator only. +SpriteImageMode = {} + +---@type BoundingSphere +--- A static class allowing calls through the "." operator only. +BoundingSphere = {} + +---@type Mesh +--- A static class allowing calls through the "." operator only. +Mesh = {} + +---@type NativeKey +--- A static class allowing calls through the "." operator only. +NativeKey = {} + +---@type UiScale +--- A static class allowing calls through the "." operator only. +UiScale = {} + +---@type Virtual +--- A static class allowing calls through the "." operator only. +Virtual = {} + +---@type TextEntity +--- A static class allowing calls through the "." operator only. +TextEntity = {} + +---@type OverflowAxis +--- A static class allowing calls through the "." operator only. +OverflowAxis = {} + +---@type ColorGradingSection +--- A static class allowing calls through the "." operator only. +ColorGradingSection = {} + +---@type AtomicU64 +--- A static class allowing calls through the "." operator only. +AtomicU64 = {} + +---@type AabbCast2d +--- A static class allowing calls through the "." operator only. +AabbCast2d = {} + +---@type Remove +--- A static class allowing calls through the "." operator only. +Remove = {} + +---@type CursorLeft +--- A static class allowing calls through the "." operator only. +CursorLeft = {} + +---@type Insert +--- A static class allowing calls through the "." operator only. +Insert = {} + +---@type OrderIndependentTransparencySettings +--- A static class allowing calls through the "." operator only. +OrderIndependentTransparencySettings = {} + +---@type TemporalJitter +--- A static class allowing calls through the "." operator only. +TemporalJitter = {} + +---@type WindowCloseRequested +--- A static class allowing calls through the "." operator only. +WindowCloseRequested = {} + +---@type Dir4 +--- A static class allowing calls through the "." operator only. +Dir4 = {} + +---@type ConicalFrustum +--- A static class allowing calls through the "." operator only. +ConicalFrustum = {} + +---@type CameraMainTextureUsages +--- A static class allowing calls through the "." operator only. +CameraMainTextureUsages = {} + +---@type RequestRedraw +--- A static class allowing calls through the "." operator only. +RequestRedraw = {} + +---@type NavNeighbors +--- A static class allowing calls through the "." operator only. +NavNeighbors = {} + +---@type RegularPolygonMeshBuilder +--- A static class allowing calls through the "." operator only. +RegularPolygonMeshBuilder = {} + +---@type Sphere +--- A static class allowing calls through the "." operator only. +Sphere = {} + +---@type TextBackgroundColor +--- A static class allowing calls through the "." operator only. +TextBackgroundColor = {} + +---@type ScreenshotCaptured +--- A static class allowing calls through the "." operator only. +ScreenshotCaptured = {} + +---@type WindowTheme +--- A static class allowing calls through the "." operator only. +WindowTheme = {} + +---@type TouchPhase +--- A static class allowing calls through the "." operator only. +TouchPhase = {} + +---@type BVec2 +--- A static class allowing calls through the "." operator only. +BVec2 = {} + +---@type Viewport +--- A static class allowing calls through the "." operator only. +Viewport = {} + +---@type Overflow +--- A static class allowing calls through the "." operator only. +Overflow = {} + +---@type U16Vec2 +--- A static class allowing calls through the "." operator only. +U16Vec2 = {} + +---@type SocketAddr +--- A static class allowing calls through the "." operator only. +SocketAddr = {} + +---@type ConvexPolygon +--- A static class allowing calls through the "." operator only. +ConvexPolygon = {} + +---@type Timer +--- A static class allowing calls through the "." operator only. +Timer = {} + +---@type NonZeroI128 +--- A static class allowing calls through the "." operator only. +NonZeroI128 = {} + +---@type NonZeroU8 +--- A static class allowing calls through the "." operator only. +NonZeroU8 = {} + +---@type MouseButtonInput +--- A static class allowing calls through the "." operator only. +MouseButtonInput = {} + +---@type CustomCursorImage +--- A static class allowing calls through the "." operator only. +CustomCursorImage = {} + +---@type VisibleEntities +--- A static class allowing calls through the "." operator only. +VisibleEntities = {} + +---@type ScreenEdge +--- A static class allowing calls through the "." operator only. +ScreenEdge = {} + +---@type CameraOutputMode +--- A static class allowing calls through the "." operator only. +CameraOutputMode = {} + +---@type TextureFormat +--- A static class allowing calls through the "." operator only. +TextureFormat = {} + +---@type WindowMode +--- A static class allowing calls through the "." operator only. +WindowMode = {} + +---@type Isometry3d +--- A static class allowing calls through the "." operator only. +Isometry3d = {} + +---@type IVec2 +--- A static class allowing calls through the "." operator only. +IVec2 = {} + +---@type VideoModeSelection +--- A static class allowing calls through the "." operator only. +VideoModeSelection = {} + +---@type RemovedComponentEntity +--- A static class allowing calls through the "." operator only. +RemovedComponentEntity = {} + +---@type I64Vec2 +--- A static class allowing calls through the "." operator only. +I64Vec2 = {} + +---@type TextureAtlas +--- A static class allowing calls through the "." operator only. +TextureAtlas = {} + +---@type FlexWrap +--- A static class allowing calls through the "." operator only. +FlexWrap = {} + +---@type UiPosition +--- A static class allowing calls through the "." operator only. +UiPosition = {} + +---@type CubemapFrusta +--- A static class allowing calls through the "." operator only. +CubemapFrusta = {} + +---@type Srgba +--- A static class allowing calls through the "." operator only. +Srgba = {} + +---@type Button +--- A static class allowing calls through the "." operator only. +Button = {} + +---@type KeyboardInput +--- A static class allowing calls through the "." operator only. +KeyboardInput = {} + +---@type Mat2 +--- A static class allowing calls through the "." operator only. +Mat2 = {} + +---@type PositionType +--- A static class allowing calls through the "." operator only. +PositionType = {} + +---@type GamepadAxis +--- A static class allowing calls through the "." operator only. +GamepadAxis = {} + +---@type NormalizedWindowRef +--- A static class allowing calls through the "." operator only. +NormalizedWindowRef = {} + +---@type NonZeroIsize +--- A static class allowing calls through the "." operator only. +NonZeroIsize = {} + +---@type AtomicI8 +--- A static class allowing calls through the "." operator only. +AtomicI8 = {} + +---@type CursorGrabMode +--- A static class allowing calls through the "." operator only. +CursorGrabMode = {} + +---@type CircularMeshUvMode +--- A static class allowing calls through the "." operator only. +CircularMeshUvMode = {} + +---@type GamepadSettings +--- A static class allowing calls through the "." operator only. +GamepadSettings = {} + +---@type VisibilityClass +--- A static class allowing calls through the "." operator only. +VisibilityClass = {} + +---@type ViewVisibility +--- A static class allowing calls through the "." operator only. +ViewVisibility = {} + +---@type Mat4 +--- A static class allowing calls through the "." operator only. +Mat4 = {} + +---@type AabbCast3d +--- A static class allowing calls through the "." operator only. +AabbCast3d = {} + +---@type GridPlacement +--- A static class allowing calls through the "." operator only. +GridPlacement = {} + +---@type ScriptQueryBuilder +--- A static class allowing calls through the "." operator only. +ScriptQueryBuilder = {} + +---@type U8Vec2 +--- A static class allowing calls through the "." operator only. +U8Vec2 = {} + +---@type AspectRatio +--- A static class allowing calls through the "." operator only. +AspectRatio = {} + +---@type UnderlineColor +--- A static class allowing calls through the "." operator only. +UnderlineColor = {} + +---@type Capsule2dMeshBuilder +--- A static class allowing calls through the "." operator only. +Capsule2dMeshBuilder = {} + +---@type ConvexPolygonMeshBuilder +--- A static class allowing calls through the "." operator only. +ConvexPolygonMeshBuilder = {} + +---@type Camera3d +--- A static class allowing calls through the "." operator only. +Camera3d = {} + +---@type NoFrustumCulling +--- A static class allowing calls through the "." operator only. +NoFrustumCulling = {} + +---@type ComputedTextBlock +--- A static class allowing calls through the "." operator only. +ComputedTextBlock = {} + +---@type CursorEntered +--- A static class allowing calls through the "." operator only. +CursorEntered = {} + +---@type FontFeatureTag +--- A static class allowing calls through the "." operator only. +FontFeatureTag = {} + +---@type ForceTouch +--- A static class allowing calls through the "." operator only. +ForceTouch = {} + +---@type WindowClosing +--- A static class allowing calls through the "." operator only. +WindowClosing = {} + +---@type InternalWindowState +--- A static class allowing calls through the "." operator only. +InternalWindowState = {} + +---@type WindowCreated +--- A static class allowing calls through the "." operator only. +WindowCreated = {} + +---@type TilemapChunkTileData +--- A static class allowing calls through the "." operator only. +TilemapChunkTileData = {} + +---@type Despawn +--- A static class allowing calls through the "." operator only. +Despawn = {} + +---@type RhombusMeshBuilder +--- A static class allowing calls through the "." operator only. +RhombusMeshBuilder = {} + +---@type Aabb3d +--- A static class allowing calls through the "." operator only. +Aabb3d = {} + +---@type SkinnedMesh +--- A static class allowing calls through the "." operator only. +SkinnedMesh = {} + +---@type Affine2 +--- A static class allowing calls through the "." operator only. +Affine2 = {} + +---@type VisibleMeshEntities +--- A static class allowing calls through the "." operator only. +VisibleMeshEntities = {} + +---@type Mat3 +--- A static class allowing calls through the "." operator only. +Mat3 = {} + +---@type ManualTextureViewHandle +--- A static class allowing calls through the "." operator only. +ManualTextureViewHandle = {} + +---@type EntityHashSet +--- A static class allowing calls through the "." operator only. +EntityHashSet = {} + +---@type TextShadow +--- A static class allowing calls through the "." operator only. +TextShadow = {} + +---@type Plane2d +--- A static class allowing calls through the "." operator only. +Plane2d = {} + +---@type RenderAssetUsages +--- A static class allowing calls through the "." operator only. +RenderAssetUsages = {} + +---@type Msaa +--- A static class allowing calls through the "." operator only. +Msaa = {} + +---@type AccumulatedMouseScroll +--- A static class allowing calls through the "." operator only. +AccumulatedMouseScroll = {} + +---@type Skybox +--- A static class allowing calls through the "." operator only. +Skybox = {} + +---@type FileDragAndDrop +--- A static class allowing calls through the "." operator only. +FileDragAndDrop = {} + +---@type MouseWheel +--- A static class allowing calls through the "." operator only. +MouseWheel = {} + +---@type Annulus +--- A static class allowing calls through the "." operator only. +Annulus = {} + +---@type ComponentId +--- A static class allowing calls through the "." operator only. +ComponentId = {} + +---@type KeyCode +--- A static class allowing calls through the "." operator only. +KeyCode = {} + +---@type ScrollPosition +--- A static class allowing calls through the "." operator only. +ScrollPosition = {} + +---@type EntityIndex +--- A static class allowing calls through the "." operator only. +EntityIndex = {} + +---@type FunctionReturnInfo +--- A static class allowing calls through the "." operator only. +FunctionReturnInfo = {} + +---@type ComputedNode +--- A static class allowing calls through the "." operator only. +ComputedNode = {} + +---@type MeshTag +--- A static class allowing calls through the "." operator only. +MeshTag = {} + +---@type Camera3dDepthLoadOp +--- A static class allowing calls through the "." operator only. +Camera3dDepthLoadOp = {} + +---@type Arc +--- A static class allowing calls through the "." operator only. +Arc = {} + +---@type Line2d +--- A static class allowing calls through the "." operator only. +Line2d = {} + +---@type NonZeroU64 +--- A static class allowing calls through the "." operator only. +NonZeroU64 = {} + +---@type AutoFocus +--- A static class allowing calls through the "." operator only. +AutoFocus = {} + +---@type Display +--- A static class allowing calls through the "." operator only. +Display = {} + +---@type AppLifecycle +--- A static class allowing calls through the "." operator only. +AppLifecycle = {} + +---@type PerspectiveProjection +--- A static class allowing calls through the "." operator only. +PerspectiveProjection = {} + +---@type Hdr +--- A static class allowing calls through the "." operator only. +Hdr = {} + +---@type FontHinting +--- A static class allowing calls through the "." operator only. +FontHinting = {} + +---@type TextureAtlasLayout +--- A static class allowing calls through the "." operator only. +TextureAtlasLayout = {} + +---@type TetrahedronMeshBuilder +--- A static class allowing calls through the "." operator only. +TetrahedronMeshBuilder = {} + +---@type SystemCursorIcon +--- A static class allowing calls through the "." operator only. +SystemCursorIcon = {} + +---@type UiGlobalTransform +--- A static class allowing calls through the "." operator only. +UiGlobalTransform = {} + +---@type AtomicI32 +--- A static class allowing calls through the "." operator only. +AtomicI32 = {} + +---@type RelativeCursorPosition +--- A static class allowing calls through the "." operator only. +RelativeCursorPosition = {} + +---@type RawGamepadButtonChangedEvent +--- A static class allowing calls through the "." operator only. +RawGamepadButtonChangedEvent = {} + +---@type MouseButton +--- A static class allowing calls through the "." operator only. +MouseButton = {} + +---@type Interaction +--- A static class allowing calls through the "." operator only. +Interaction = {} + +---@type IVec3 +--- A static class allowing calls through the "." operator only. +IVec3 = {} + +---@type TimerMode +--- A static class allowing calls through the "." operator only. +TimerMode = {} + +---@type I16Vec2 +--- A static class allowing calls through the "." operator only. +I16Vec2 = {} + +---@type Anchor +--- A static class allowing calls through the "." operator only. +Anchor = {} + +---@type RectangleMeshBuilder +--- A static class allowing calls through the "." operator only. +RectangleMeshBuilder = {} + +---@type World +--- An global instance of this type +world = {} + +---@type any +--- An global instance of this type +script_asset = {} + +---@type Entity +--- An global instance of this type +entity = {} + diff --git a/crates/lad_backends/assets/definitions/bindings.lad.json b/crates/lad_backends/assets/definitions/bindings.lad.json new file mode 100644 index 0000000000..92fe3cb1bf --- /dev/null +++ b/crates/lad_backends/assets/definitions/bindings.lad.json @@ -0,0 +1,142831 @@ +{ + "version": "0.19.0", + "globals": { + "ScalingMode": { + "type_kind": { + "val": "bevy_camera::projection::ScalingMode" + }, + "is_static": true + }, + "GamepadButton": { + "type_kind": { + "val": "bevy_input::gamepad::GamepadButton" + }, + "is_static": true + }, + "Polyline2d": { + "type_kind": { + "val": "bevy_math::primitives::dim2::Polyline2d" + }, + "is_static": true + }, + "Replace": { + "type_kind": { + "val": "bevy_ecs::lifecycle::Replace" + }, + "is_static": true + }, + "RadialGradientShape": { + "type_kind": { + "val": "bevy_ui::gradients::RadialGradientShape" + }, + "is_static": true + }, + "I16Vec4": { + "type_kind": { + "val": "glam::I16Vec4" + }, + "is_static": true + }, + "TextureSlicer": { + "type_kind": { + "val": "bevy_sprite::texture_slice::slicer::TextureSlicer" + }, + "is_static": true + }, + "AccessibilityRequested": { + "type_kind": { + "val": "bevy_a11y::AccessibilityRequested" + }, + "is_static": true + }, + "AssetPath": { + "type_kind": { + "val": "bevy_asset::path::AssetPath" + }, + "is_static": true + }, + "MsaaWriteback": { + "type_kind": { + "val": "bevy_camera::clear_color::MsaaWriteback" + }, + "is_static": true + }, + "LinearGradient": { + "type_kind": { + "val": "bevy_ui::gradients::LinearGradient" + }, + "is_static": true + }, + "SpriteScalingMode": { + "type_kind": { + "val": "bevy_sprite::sprite::SpriteScalingMode" + }, + "is_static": true + }, + "SmolStr": { + "type_kind": { + "val": "smol_str::SmolStr" + }, + "is_static": true + }, + "InfinitePlane3d": { + "type_kind": { + "val": "bevy_math::primitives::dim3::InfinitePlane3d" + }, + "is_static": true + }, + "SphereMeshBuilder": { + "type_kind": { + "val": "bevy_mesh::primitives::dim3::sphere::SphereMeshBuilder" + }, + "is_static": true + }, + "RegularPolygon": { + "type_kind": { + "val": "bevy_math::primitives::dim2::RegularPolygon" + }, + "is_static": true + }, + "GamepadConnection": { + "type_kind": { + "val": "bevy_input::gamepad::GamepadConnection" + }, + "is_static": true + }, + "OcclusionCulling": { + "type_kind": { + "val": "bevy_render::experimental::occlusion_culling::OcclusionCulling" + }, + "is_static": true + }, + "Screenshot": { + "type_kind": { + "val": "bevy_render::view::window::screenshot::Screenshot" + }, + "is_static": true + }, + "Rect": { + "type_kind": { + "val": "bevy_math::rects::rect::Rect" + }, + "is_static": true + }, + "ViewportNode": { + "type_kind": { + "val": "bevy_ui::widget::viewport::ViewportNode" + }, + "is_static": true + }, + "types": { + "type_kind": { + "hashMap": [ + { + "primitive": "string" + }, + { + "union": [ + { + "val": "bevy_mod_scripting_bindings::query::ScriptTypeRegistration" + }, + { + "union": [ + { + "val": "bevy_mod_scripting_bindings::query::ScriptComponentRegistration" + }, + { + "val": "bevy_mod_scripting_bindings::query::ScriptResourceRegistration" + } + ] + } + ] + } + ] + }, + "is_static": false + }, + "GlyphAtlasLocation": { + "type_kind": { + "val": "bevy_text::glyph::GlyphAtlasLocation" + }, + "is_static": true + }, + "MorphWeights": { + "type_kind": { + "val": "bevy_mesh::morph::MorphWeights" + }, + "is_static": true + }, + "GlyphAtlasInfo": { + "type_kind": { + "val": "bevy_text::glyph::GlyphAtlasInfo" + }, + "is_static": true + }, + "Oklcha": { + "type_kind": { + "val": "bevy_color::oklcha::Oklcha" + }, + "is_static": true + }, + "MotionVectorPrepass": { + "type_kind": { + "val": "bevy_core_pipeline::prepass::MotionVectorPrepass" + }, + "is_static": true + }, + "AlignSelf": { + "type_kind": { + "val": "bevy_ui::ui_node::AlignSelf" + }, + "is_static": true + }, + "Window": { + "type_kind": { + "val": "bevy_window::window::Window" + }, + "is_static": true + }, + "FloatOrd": { + "type_kind": { + "val": "bevy_math::float_ord::FloatOrd" + }, + "is_static": true + }, + "ButtonSettings": { + "type_kind": { + "val": "bevy_input::gamepad::ButtonSettings" + }, + "is_static": true + }, + "Affine3A": { + "type_kind": { + "val": "glam::Affine3A" + }, + "is_static": true + }, + "URect": { + "type_kind": { + "val": "bevy_math::rects::urect::URect" + }, + "is_static": true + }, + "GamepadInput": { + "type_kind": { + "val": "bevy_input::gamepad::GamepadInput" + }, + "is_static": true + }, + "RepeatedGridTrack": { + "type_kind": { + "val": "bevy_ui::ui_node::RepeatedGridTrack" + }, + "is_static": true + }, + "i8": { + "type_kind": { + "primitive": "i8" + }, + "is_static": true + }, + "bool": { + "type_kind": { + "primitive": "bool" + }, + "is_static": true + }, + "IVec4": { + "type_kind": { + "val": "glam::IVec4" + }, + "is_static": true + }, + "Wireframe2dConfig": { + "type_kind": { + "val": "bevy_sprite_render::mesh2d::wireframe2d::Wireframe2dConfig" + }, + "is_static": true + }, + "StaticTransformOptimizations": { + "type_kind": { + "val": "bevy_transform::systems::StaticTransformOptimizations" + }, + "is_static": true + }, + "ScriptAttachment": { + "type_kind": { + "val": "bevy_mod_scripting_script::ScriptAttachment" + }, + "is_static": true + }, + "Hwba": { + "type_kind": { + "val": "bevy_color::hwba::Hwba" + }, + "is_static": true + }, + "WindowBackendScaleFactorChanged": { + "type_kind": { + "val": "bevy_window::event::WindowBackendScaleFactorChanged" + }, + "is_static": true + }, + "BorderRadius": { + "type_kind": { + "val": "bevy_ui::ui_node::BorderRadius" + }, + "is_static": true + }, + "Polyline3d": { + "type_kind": { + "val": "bevy_math::primitives::dim3::Polyline3d" + }, + "is_static": true + }, + "DMat3": { + "type_kind": { + "val": "glam::DMat3" + }, + "is_static": true + }, + "StrikethroughColor": { + "type_kind": { + "val": "bevy_text::text::StrikethroughColor" + }, + "is_static": true + }, + "MainEntity": { + "type_kind": { + "val": "bevy_render::sync_world::MainEntity" + }, + "is_static": true + }, + "LineBreak": { + "type_kind": { + "val": "bevy_text::text::LineBreak" + }, + "is_static": true + }, + "Polygon": { + "type_kind": { + "val": "bevy_math::primitives::dim2::Polygon" + }, + "is_static": true + }, + "CircularSectorMeshBuilder": { + "type_kind": { + "val": "bevy_mesh::primitives::dim2::CircularSectorMeshBuilder" + }, + "is_static": true + }, + "Cuboid": { + "type_kind": { + "val": "bevy_math::primitives::dim3::Cuboid" + }, + "is_static": true + }, + "RayCast2d": { + "type_kind": { + "val": "bevy_math::bounding::raycast2d::RayCast2d" + }, + "is_static": true + }, + "ManageAccessibilityUpdates": { + "type_kind": { + "val": "bevy_a11y::ManageAccessibilityUpdates" + }, + "is_static": true + }, + "ConicGradient": { + "type_kind": { + "val": "bevy_ui::gradients::ConicGradient" + }, + "is_static": true + }, + "AtomicUsize": { + "type_kind": { + "val": "core::sync::atomic::AtomicUsize" + }, + "is_static": true + }, + "ScriptAsset": { + "type_kind": { + "val": "bevy_mod_scripting_asset::script_asset::ScriptAsset" + }, + "is_static": true + }, + "NonZeroU16": { + "type_kind": { + "val": "core::num::NonZeroU16" + }, + "is_static": true + }, + "I16Vec3": { + "type_kind": { + "val": "glam::I16Vec3" + }, + "is_static": true + }, + "Rectangle": { + "type_kind": { + "val": "bevy_math::primitives::dim2::Rectangle" + }, + "is_static": true + }, + "NonZeroUsize": { + "type_kind": { + "val": "core::num::NonZeroUsize" + }, + "is_static": true + }, + "TextLayout": { + "type_kind": { + "val": "bevy_text::text::TextLayout" + }, + "is_static": true + }, + "PrimaryWindow": { + "type_kind": { + "val": "bevy_window::window::PrimaryWindow" + }, + "is_static": true + }, + "Quat": { + "type_kind": { + "val": "glam::Quat" + }, + "is_static": true + }, + "Underline": { + "type_kind": { + "val": "bevy_text::text::Underline" + }, + "is_static": true + }, + "LinearRgba": { + "type_kind": { + "val": "bevy_color::linear_rgba::LinearRgba" + }, + "is_static": true + }, + "Segment3d": { + "type_kind": { + "val": "bevy_math::primitives::dim3::Segment3d" + }, + "is_static": true + }, + "GamepadButtonStateChangedEvent": { + "type_kind": { + "val": "bevy_input::gamepad::GamepadButtonStateChangedEvent" + }, + "is_static": true + }, + "Camera2d": { + "type_kind": { + "val": "bevy_camera::components::Camera2d" + }, + "is_static": true + }, + "BoundingCircle": { + "type_kind": { + "val": "bevy_math::bounding::bounded2d::BoundingCircle" + }, + "is_static": true + }, + "AlphaMode2d": { + "type_kind": { + "val": "bevy_sprite_render::mesh2d::material::AlphaMode2d" + }, + "is_static": true + }, + "ShadowStyle": { + "type_kind": { + "val": "bevy_ui::ui_node::ShadowStyle" + }, + "is_static": true + }, + "WinitUserEvent": { + "type_kind": { + "val": "bevy_winit::WinitUserEvent" + }, + "is_static": true + }, + "NativeKeyCode": { + "type_kind": { + "val": "bevy_input::keyboard::NativeKeyCode" + }, + "is_static": true + }, + "GlobalTransform": { + "type_kind": { + "val": "bevy_transform::components::global_transform::GlobalTransform" + }, + "is_static": true + }, + "Vec4": { + "type_kind": { + "val": "glam::Vec4" + }, + "is_static": true + }, + "NonZeroU32": { + "type_kind": { + "val": "core::num::NonZeroU32" + }, + "is_static": true + }, + "PresentMode": { + "type_kind": { + "val": "bevy_window::window::PresentMode" + }, + "is_static": true + }, + "DepthPrepassDoubleBuffer": { + "type_kind": { + "val": "bevy_core_pipeline::prepass::DepthPrepassDoubleBuffer" + }, + "is_static": true + }, + "Xyza": { + "type_kind": { + "val": "bevy_color::xyza::Xyza" + }, + "is_static": true + }, + "ScriptTypeRegistration": { + "type_kind": { + "val": "bevy_mod_scripting_bindings::query::ScriptTypeRegistration" + }, + "is_static": true + }, + "BorderColor": { + "type_kind": { + "val": "bevy_ui::ui_node::BorderColor" + }, + "is_static": true + }, + "CustomCursorUrl": { + "type_kind": { + "val": "bevy_window::cursor::custom_cursor::CustomCursorUrl" + }, + "is_static": true + }, + "TextLayoutInfo": { + "type_kind": { + "val": "bevy_text::pipeline::TextLayoutInfo" + }, + "is_static": true + }, + "CalculatedClip": { + "type_kind": { + "val": "bevy_ui::ui_node::CalculatedClip" + }, + "is_static": true + }, + "ConicalFrustumMeshBuilder": { + "type_kind": { + "val": "bevy_mesh::primitives::dim3::conical_frustum::ConicalFrustumMeshBuilder" + }, + "is_static": true + }, + "Stopwatch": { + "type_kind": { + "val": "bevy_time::stopwatch::Stopwatch" + }, + "is_static": true + }, + "BorderGradient": { + "type_kind": { + "val": "bevy_ui::gradients::BorderGradient" + }, + "is_static": true + }, + "RangeInclusive": { + "type_kind": { + "val": "core::ops::RangeInclusive" + }, + "is_static": true + }, + "Cylinder": { + "type_kind": { + "val": "bevy_math::primitives::dim3::Cylinder" + }, + "is_static": true + }, + "AtomicI16": { + "type_kind": { + "val": "core::sync::atomic::AtomicI16" + }, + "is_static": true + }, + "Real": { + "type_kind": { + "val": "bevy_time::real::Real" + }, + "is_static": true + }, + "Polyline2dMeshBuilder": { + "type_kind": { + "val": "bevy_mesh::primitives::dim2::Polyline2dMeshBuilder" + }, + "is_static": true + }, + "RenderEntity": { + "type_kind": { + "val": "bevy_render::sync_world::RenderEntity" + }, + "is_static": true + }, + "Line3d": { + "type_kind": { + "val": "bevy_math::primitives::dim3::Line3d" + }, + "is_static": true + }, + "Cone": { + "type_kind": { + "val": "bevy_math::primitives::dim3::Cone" + }, + "is_static": true + }, + "JustifyContent": { + "type_kind": { + "val": "bevy_ui::ui_node::JustifyContent" + }, + "is_static": true + }, + "Add": { + "type_kind": { + "val": "bevy_ecs::lifecycle::Add" + }, + "is_static": true + }, + "Edge": { + "type_kind": { + "val": "bevy_system_reflection::Edge" + }, + "is_static": true + }, + "UVec2": { + "type_kind": { + "val": "glam::UVec2" + }, + "is_static": true + }, + "NonZeroI16": { + "type_kind": { + "val": "core::num::NonZeroI16" + }, + "is_static": true + }, + "TextFont": { + "type_kind": { + "val": "bevy_text::text::TextFont" + }, + "is_static": true + }, + "ColorGradingGlobal": { + "type_kind": { + "val": "bevy_render::view::ColorGradingGlobal" + }, + "is_static": true + }, + "Rhombus": { + "type_kind": { + "val": "bevy_math::primitives::dim2::Rhombus" + }, + "is_static": true + }, + "GlobalZIndex": { + "type_kind": { + "val": "bevy_ui::ui_node::GlobalZIndex" + }, + "is_static": true + }, + "CascadesFrusta": { + "type_kind": { + "val": "bevy_camera::primitives::CascadesFrusta" + }, + "is_static": true + }, + "ImageNode": { + "type_kind": { + "val": "bevy_ui::widget::image::ImageNode" + }, + "is_static": true + }, + "Dir2": { + "type_kind": { + "val": "bevy_math::direction::Dir2" + }, + "is_static": true + }, + "Wireframe2dMaterial": { + "type_kind": { + "val": "bevy_sprite_render::mesh2d::wireframe2d::Wireframe2dMaterial" + }, + "is_static": true + }, + "AccumulatedMouseMotion": { + "type_kind": { + "val": "bevy_input::mouse::AccumulatedMouseMotion" + }, + "is_static": true + }, + "ScriptQueryResult": { + "type_kind": { + "val": "bevy_mod_scripting_bindings::query::ScriptQueryResult" + }, + "is_static": true + }, + "Cow": { + "type_kind": { + "val": "alloc::borrow::Cow" + }, + "is_static": true + }, + "AtomicI64": { + "type_kind": { + "val": "core::sync::atomic::AtomicI64" + }, + "is_static": true + }, + "Hsva": { + "type_kind": { + "val": "bevy_color::hsva::Hsva" + }, + "is_static": true + }, + "EulerRot": { + "type_kind": { + "val": "glam::EulerRot" + }, + "is_static": true + }, + "AccessibilitySystems": { + "type_kind": { + "val": "bevy_a11y::AccessibilitySystems" + }, + "is_static": true + }, + "Color": { + "type_kind": { + "val": "bevy_color::color::Color" + }, + "is_static": true + }, + "RenderTarget": { + "type_kind": { + "val": "bevy_camera::camera::RenderTarget" + }, + "is_static": true + }, + "GamepadRumbleRequest": { + "type_kind": { + "val": "bevy_input::gamepad::GamepadRumbleRequest" + }, + "is_static": true + }, + "I8Vec4": { + "type_kind": { + "val": "glam::I8Vec4" + }, + "is_static": true + }, + "ClearColorConfig": { + "type_kind": { + "val": "bevy_camera::clear_color::ClearColorConfig" + }, + "is_static": true + }, + "ConeMeshBuilder": { + "type_kind": { + "val": "bevy_mesh::primitives::dim3::cone::ConeMeshBuilder" + }, + "is_static": true + }, + "Rot2": { + "type_kind": { + "val": "bevy_math::rotation2d::Rot2" + }, + "is_static": true + }, + "InputFocusVisible": { + "type_kind": { + "val": "bevy_input_focus::InputFocusVisible" + }, + "is_static": true + }, + "ChildOf": { + "type_kind": { + "val": "bevy_ecs::hierarchy::ChildOf" + }, + "is_static": true + }, + "SphereKind": { + "type_kind": { + "val": "bevy_mesh::primitives::dim3::sphere::SphereKind" + }, + "is_static": true + }, + "RenderVisibleEntities": { + "type_kind": { + "val": "bevy_render::view::visibility::RenderVisibleEntities" + }, + "is_static": true + }, + "ScriptResourceRegistration": { + "type_kind": { + "val": "bevy_mod_scripting_bindings::query::ScriptResourceRegistration" + }, + "is_static": true + }, + "Text": { + "type_kind": { + "val": "bevy_ui::widget::text::Text" + }, + "is_static": true + }, + "TransformTreeChanged": { + "type_kind": { + "val": "bevy_transform::components::transform::TransformTreeChanged" + }, + "is_static": true + }, + "Camera": { + "type_kind": { + "val": "bevy_camera::camera::Camera" + }, + "is_static": true + }, + "WindowMoved": { + "type_kind": { + "val": "bevy_window::event::WindowMoved" + }, + "is_static": true + }, + "NormalPrepass": { + "type_kind": { + "val": "bevy_core_pipeline::prepass::NormalPrepass" + }, + "is_static": true + }, + "WindowScaleFactorChanged": { + "type_kind": { + "val": "bevy_window::event::WindowScaleFactorChanged" + }, + "is_static": true + }, + "MouseMotion": { + "type_kind": { + "val": "bevy_input::mouse::MouseMotion" + }, + "is_static": true + }, + "GridTrackRepetition": { + "type_kind": { + "val": "bevy_ui::ui_node::GridTrackRepetition" + }, + "is_static": true + }, + "Key": { + "type_kind": { + "val": "bevy_input::keyboard::Key" + }, + "is_static": true + }, + "I8Vec2": { + "type_kind": { + "val": "glam::I8Vec2" + }, + "is_static": true + }, + "ColorMaterial": { + "type_kind": { + "val": "bevy_sprite_render::mesh2d::color_material::ColorMaterial" + }, + "is_static": true + }, + "ZIndex": { + "type_kind": { + "val": "bevy_ui::ui_node::ZIndex" + }, + "is_static": true + }, + "Visibility": { + "type_kind": { + "val": "bevy_camera::visibility::Visibility" + }, + "is_static": true + }, + "WindowPosition": { + "type_kind": { + "val": "bevy_window::window::WindowPosition" + }, + "is_static": true + }, + "BlendState": { + "type_kind": { + "val": "wgpu_types::BlendState" + }, + "is_static": true + }, + "NoAutoAabb": { + "type_kind": { + "val": "bevy_camera::visibility::NoAutoAabb" + }, + "is_static": true + }, + "Affine3": { + "type_kind": { + "val": "bevy_math::affine3::Affine3" + }, + "is_static": true + }, + "Triangle3dMeshBuilder": { + "type_kind": { + "val": "bevy_mesh::primitives::dim3::triangle3d::Triangle3dMeshBuilder" + }, + "is_static": true + }, + "ColorGrading": { + "type_kind": { + "val": "bevy_render::view::ColorGrading" + }, + "is_static": true + }, + "VisibilityRange": { + "type_kind": { + "val": "bevy_camera::visibility::range::VisibilityRange" + }, + "is_static": true + }, + "AutoNavigationConfig": { + "type_kind": { + "val": "bevy_input_focus::directional_navigation::AutoNavigationConfig" + }, + "is_static": true + }, + "DeferredPrepass": { + "type_kind": { + "val": "bevy_core_pipeline::prepass::DeferredPrepass" + }, + "is_static": true + }, + "TextNodeFlags": { + "type_kind": { + "val": "bevy_ui::widget::text::TextNodeFlags" + }, + "is_static": true + }, + "GamepadRumbleIntensity": { + "type_kind": { + "val": "bevy_input::gamepad::GamepadRumbleIntensity" + }, + "is_static": true + }, + "InteropError": { + "type_kind": { + "val": "bevy_mod_scripting_bindings::error::InteropError" + }, + "is_static": true + }, + "TilemapChunk": { + "type_kind": { + "val": "bevy_sprite_render::tilemap_chunk::TilemapChunk" + }, + "is_static": true + }, + "FunctionArgInfo": { + "type_kind": { + "val": "bevy_mod_scripting_bindings::docgen::info::FunctionArgInfo" + }, + "is_static": true + }, + "Name": { + "type_kind": { + "val": "bevy_ecs::name::Name" + }, + "is_static": true + }, + "isize": { + "type_kind": { + "primitive": "isize" + }, + "is_static": true + }, + "Justify": { + "type_kind": { + "val": "bevy_text::text::Justify" + }, + "is_static": true + }, + "Triangle2dMeshBuilder": { + "type_kind": { + "val": "bevy_mesh::primitives::dim2::Triangle2dMeshBuilder" + }, + "is_static": true + }, + "CylinderAnchor": { + "type_kind": { + "val": "bevy_mesh::primitives::dim3::cylinder::CylinderAnchor" + }, + "is_static": true + }, + "OverflowClipBox": { + "type_kind": { + "val": "bevy_ui::ui_node::OverflowClipBox" + }, + "is_static": true + }, + "Range": { + "type_kind": { + "val": "core::ops::Range" + }, + "is_static": true + }, + "ButtonAxisSettings": { + "type_kind": { + "val": "bevy_input::gamepad::ButtonAxisSettings" + }, + "is_static": true + }, + "ShaderStorageBuffer": { + "type_kind": { + "val": "bevy_render::storage::ShaderStorageBuffer" + }, + "is_static": true + }, + "ComponentTicks": { + "type_kind": { + "val": "bevy_ecs::change_detection::tick::ComponentTicks" + }, + "is_static": true + }, + "PlaneMeshBuilder": { + "type_kind": { + "val": "bevy_mesh::primitives::dim3::plane::PlaneMeshBuilder" + }, + "is_static": true + }, + "SyncToRenderWorld": { + "type_kind": { + "val": "bevy_render::sync_world::SyncToRenderWorld" + }, + "is_static": true + }, + "ScreenSpaceTransmissionQuality": { + "type_kind": { + "val": "bevy_camera::components::ScreenSpaceTransmissionQuality" + }, + "is_static": true + }, + "TilemapChunkMeshCache": { + "type_kind": { + "val": "bevy_sprite_render::tilemap_chunk::TilemapChunkMeshCache" + }, + "is_static": true + }, + "CylinderMeshBuilder": { + "type_kind": { + "val": "bevy_mesh::primitives::dim3::cylinder::CylinderMeshBuilder" + }, + "is_static": true + }, + "GlobalsUniform": { + "type_kind": { + "val": "bevy_render::globals::GlobalsUniform" + }, + "is_static": true + }, + "Duration": { + "type_kind": { + "val": "core::time::Duration" + }, + "is_static": true + }, + "Fixed": { + "type_kind": { + "val": "bevy_time::fixed::Fixed" + }, + "is_static": true + }, + "U8Vec4": { + "type_kind": { + "val": "glam::U8Vec4" + }, + "is_static": true + }, + "FontWeight": { + "type_kind": { + "val": "bevy_text::text::FontWeight" + }, + "is_static": true + }, + "TemporaryRenderEntity": { + "type_kind": { + "val": "bevy_render::sync_world::TemporaryRenderEntity" + }, + "is_static": true + }, + "GamepadEvent": { + "type_kind": { + "val": "bevy_input::gamepad::GamepadEvent" + }, + "is_static": true + }, + "Children": { + "type_kind": { + "val": "bevy_ecs::hierarchy::Children" + }, + "is_static": true + }, + "BoxShadow": { + "type_kind": { + "val": "bevy_ui::ui_node::BoxShadow" + }, + "is_static": true + }, + "DVec2": { + "type_kind": { + "val": "glam::DVec2" + }, + "is_static": true + }, + "GamepadConnectionEvent": { + "type_kind": { + "val": "bevy_input::gamepad::GamepadConnectionEvent" + }, + "is_static": true + }, + "NormalizedRenderTarget": { + "type_kind": { + "val": "bevy_camera::camera::NormalizedRenderTarget" + }, + "is_static": true + }, + "Mesh3d": { + "type_kind": { + "val": "bevy_mesh::components::Mesh3d" + }, + "is_static": true + }, + "MipBias": { + "type_kind": { + "val": "bevy_render::camera::MipBias" + }, + "is_static": true + }, + "I64Vec3": { + "type_kind": { + "val": "glam::I64Vec3" + }, + "is_static": true + }, + "u64": { + "type_kind": { + "primitive": "u64" + }, + "is_static": true + }, + "WindowResizeConstraints": { + "type_kind": { + "val": "bevy_window::window::WindowResizeConstraints" + }, + "is_static": true + }, + "MouseScrollUnit": { + "type_kind": { + "val": "bevy_input::mouse::MouseScrollUnit" + }, + "is_static": true + }, + "BVec3A": { + "type_kind": { + "val": "glam::BVec3A" + }, + "is_static": true + }, + "CuboidMeshBuilder": { + "type_kind": { + "val": "bevy_mesh::primitives::dim3::cuboid::CuboidMeshBuilder" + }, + "is_static": true + }, + "CapsuleUvProfile": { + "type_kind": { + "val": "bevy_mesh::primitives::dim3::capsule::CapsuleUvProfile" + }, + "is_static": true + }, + "u128": { + "type_kind": { + "primitive": "u128" + }, + "is_static": true + }, + "Wireframe2d": { + "type_kind": { + "val": "bevy_sprite_render::mesh2d::wireframe2d::Wireframe2d" + }, + "is_static": true + }, + "DefaultQueryFilters": { + "type_kind": { + "val": "bevy_ecs::entity_disabling::DefaultQueryFilters" + }, + "is_static": true + }, + "LayoutConfig": { + "type_kind": { + "val": "bevy_ui::ui_node::LayoutConfig" + }, + "is_static": true + }, + "BoxSizing": { + "type_kind": { + "val": "bevy_ui::ui_node::BoxSizing" + }, + "is_static": true + }, + "DoubleTapGesture": { + "type_kind": { + "val": "bevy_input::gestures::DoubleTapGesture" + }, + "is_static": true + }, + "EnabledButtons": { + "type_kind": { + "val": "bevy_window::window::EnabledButtons" + }, + "is_static": true + }, + "AxisSettings": { + "type_kind": { + "val": "bevy_input::gamepad::AxisSettings" + }, + "is_static": true + }, + "Laba": { + "type_kind": { + "val": "bevy_color::laba::Laba" + }, + "is_static": true + }, + "Exposure": { + "type_kind": { + "val": "bevy_camera::camera::Exposure" + }, + "is_static": true + }, + "usize": { + "type_kind": { + "primitive": "usize" + }, + "is_static": true + }, + "Wireframe2dColor": { + "type_kind": { + "val": "bevy_sprite_render::mesh2d::wireframe2d::Wireframe2dColor" + }, + "is_static": true + }, + "ContextKey": { + "type_kind": { + "val": "bevy_mod_scripting_core::script::context_key::ContextKey" + }, + "is_static": true + }, + "Dir3": { + "type_kind": { + "val": "bevy_math::direction::Dir3" + }, + "is_static": true + }, + "i32": { + "type_kind": { + "primitive": "i32" + }, + "is_static": true + }, + "PositionedGlyph": { + "type_kind": { + "val": "bevy_text::glyph::PositionedGlyph" + }, + "is_static": true + }, + "MonitorSelection": { + "type_kind": { + "val": "bevy_window::window::MonitorSelection" + }, + "is_static": true + }, + "Sprite": { + "type_kind": { + "val": "bevy_sprite::sprite::Sprite" + }, + "is_static": true + }, + "Ellipse": { + "type_kind": { + "val": "bevy_math::primitives::dim2::Ellipse" + }, + "is_static": true + }, + "TabGroup": { + "type_kind": { + "val": "bevy_input_focus::tab_navigation::TabGroup" + }, + "is_static": true + }, + "BVec3": { + "type_kind": { + "val": "glam::BVec3" + }, + "is_static": true + }, + "TextSpan": { + "type_kind": { + "val": "bevy_text::text::TextSpan" + }, + "is_static": true + }, + "CallbackLabel": { + "type_kind": { + "val": "bevy_mod_scripting_core::event::CallbackLabel" + }, + "is_static": true + }, + "Tonemapping": { + "type_kind": { + "val": "bevy_core_pipeline::tonemapping::Tonemapping" + }, + "is_static": true + }, + "RunGeometry": { + "type_kind": { + "val": "bevy_text::pipeline::RunGeometry" + }, + "is_static": true + }, + "RayCast3d": { + "type_kind": { + "val": "bevy_math::bounding::raycast3d::RayCast3d" + }, + "is_static": true + }, + "ScriptComponentRegistration": { + "type_kind": { + "val": "bevy_mod_scripting_bindings::query::ScriptComponentRegistration" + }, + "is_static": true + }, + "CursorOptions": { + "type_kind": { + "val": "bevy_window::window::CursorOptions" + }, + "is_static": true + }, + "AtomicU8": { + "type_kind": { + "val": "core::sync::atomic::AtomicU8" + }, + "is_static": true + }, + "WindowLevel": { + "type_kind": { + "val": "bevy_window::window::WindowLevel" + }, + "is_static": true + }, + "TorusMeshBuilder": { + "type_kind": { + "val": "bevy_mesh::primitives::dim3::torus::TorusMeshBuilder" + }, + "is_static": true + }, + "OsString": { + "type_kind": { + "primitive": "osString" + }, + "is_static": true + }, + "NonNilUuid": { + "type_kind": { + "val": "uuid::NonNilUuid" + }, + "is_static": true + }, + "CubemapLayout": { + "type_kind": { + "val": "bevy_camera::primitives::CubemapLayout" + }, + "is_static": true + }, + "Tick": { + "type_kind": { + "val": "bevy_ecs::change_detection::tick::Tick" + }, + "is_static": true + }, + "PinchGesture": { + "type_kind": { + "val": "bevy_input::gestures::PinchGesture" + }, + "is_static": true + }, + "AtomicU32": { + "type_kind": { + "val": "core::sync::atomic::AtomicU32" + }, + "is_static": true + }, + "ReflectSystemGraphNode": { + "type_kind": { + "val": "bevy_system_reflection::ReflectSystemGraphNode" + }, + "is_static": true + }, + "BVec4": { + "type_kind": { + "val": "glam::BVec4" + }, + "is_static": true + }, + "MaxTrackSizingFunction": { + "type_kind": { + "val": "bevy_ui::ui_node::MaxTrackSizingFunction" + }, + "is_static": true + }, + "CameraRenderGraph": { + "type_kind": { + "val": "bevy_render::camera::CameraRenderGraph" + }, + "is_static": true + }, + "InputFocus": { + "type_kind": { + "val": "bevy_input_focus::InputFocus" + }, + "is_static": true + }, + "Ime": { + "type_kind": { + "val": "bevy_window::event::Ime" + }, + "is_static": true + }, + "Frustum": { + "type_kind": { + "val": "bevy_camera::primitives::Frustum" + }, + "is_static": true + }, + "DebandDither": { + "type_kind": { + "val": "bevy_core_pipeline::tonemapping::DebandDither" + }, + "is_static": true + }, + "FocusableArea": { + "type_kind": { + "val": "bevy_input_focus::directional_navigation::FocusableArea" + }, + "is_static": true + }, + "WindowResolution": { + "type_kind": { + "val": "bevy_window::window::WindowResolution" + }, + "is_static": true + }, + "WindowOccluded": { + "type_kind": { + "val": "bevy_window::event::WindowOccluded" + }, + "is_static": true + }, + "Mat3A": { + "type_kind": { + "val": "glam::Mat3A" + }, + "is_static": true + }, + "JustifySelf": { + "type_kind": { + "val": "bevy_ui::ui_node::JustifySelf" + }, + "is_static": true + }, + "Indices": { + "type_kind": { + "val": "bevy_mesh::index::Indices" + }, + "is_static": true + }, + "ResolvedBorderRadius": { + "type_kind": { + "val": "bevy_ui::ui_node::ResolvedBorderRadius" + }, + "is_static": true + }, + "ReflectNodeId": { + "type_kind": { + "val": "bevy_system_reflection::ReflectNodeId" + }, + "is_static": true + }, + "NoWireframe2d": { + "type_kind": { + "val": "bevy_sprite_render::mesh2d::wireframe2d::NoWireframe2d" + }, + "is_static": true + }, + "Camera3dDepthTextureUsage": { + "type_kind": { + "val": "bevy_camera::components::Camera3dDepthTextureUsage" + }, + "is_static": true + }, + "AtomicIsize": { + "type_kind": { + "val": "core::sync::atomic::AtomicIsize" + }, + "is_static": true + }, + "CursorMoved": { + "type_kind": { + "val": "bevy_window::event::CursorMoved" + }, + "is_static": true + }, + "KeyboardFocusLost": { + "type_kind": { + "val": "bevy_input::keyboard::KeyboardFocusLost" + }, + "is_static": true + }, + "ImageRenderTarget": { + "type_kind": { + "val": "bevy_camera::camera::ImageRenderTarget" + }, + "is_static": true + }, + "Text2d": { + "type_kind": { + "val": "bevy_sprite::text2d::Text2d" + }, + "is_static": true + }, + "Polyline3dMeshBuilder": { + "type_kind": { + "val": "bevy_mesh::primitives::dim3::polyline3d::Polyline3dMeshBuilder" + }, + "is_static": true + }, + "FontSmoothing": { + "type_kind": { + "val": "bevy_text::text::FontSmoothing" + }, + "is_static": true + }, + "WindowFocused": { + "type_kind": { + "val": "bevy_window::event::WindowFocused" + }, + "is_static": true + }, + "DAffine3": { + "type_kind": { + "val": "glam::DAffine3" + }, + "is_static": true + }, + "LocationContext": { + "type_kind": { + "val": "bevy_mod_scripting_bindings::function::script_function::LocationContext" + }, + "is_static": true + }, + "IgnoreScroll": { + "type_kind": { + "val": "bevy_ui::ui_node::IgnoreScroll" + }, + "is_static": true + }, + "Plane3d": { + "type_kind": { + "val": "bevy_math::primitives::dim3::Plane3d" + }, + "is_static": true + }, + "U64Vec3": { + "type_kind": { + "val": "glam::U64Vec3" + }, + "is_static": true + }, + "Text2dShadow": { + "type_kind": { + "val": "bevy_sprite::text2d::Text2dShadow" + }, + "is_static": true + }, + "AlignItems": { + "type_kind": { + "val": "bevy_ui::ui_node::AlignItems" + }, + "is_static": true + }, + "ImageNodeSize": { + "type_kind": { + "val": "bevy_ui::widget::image::ImageNodeSize" + }, + "is_static": true + }, + "Val": { + "type_kind": { + "val": "bevy_ui::geometry::Val" + }, + "is_static": true + }, + "UVec3": { + "type_kind": { + "val": "glam::UVec3" + }, + "is_static": true + }, + "i128": { + "type_kind": { + "primitive": "i128" + }, + "is_static": true + }, + "MainPassResolutionOverride": { + "type_kind": { + "val": "bevy_camera::camera::MainPassResolutionOverride" + }, + "is_static": true + }, + "UiRect": { + "type_kind": { + "val": "bevy_ui::geometry::UiRect" + }, + "is_static": true + }, + "BoundingSphereCast": { + "type_kind": { + "val": "bevy_math::bounding::raycast3d::BoundingSphereCast" + }, + "is_static": true + }, + "GridAutoFlow": { + "type_kind": { + "val": "bevy_ui::ui_node::GridAutoFlow" + }, + "is_static": true + }, + "UntypedAssetId": { + "type_kind": { + "val": "bevy_asset::id::UntypedAssetId" + }, + "is_static": true + }, + "Capsule2d": { + "type_kind": { + "val": "bevy_math::primitives::dim2::Capsule2d" + }, + "is_static": true + }, + "MinTrackSizingFunction": { + "type_kind": { + "val": "bevy_ui::ui_node::MinTrackSizingFunction" + }, + "is_static": true + }, + "InheritedVisibility": { + "type_kind": { + "val": "bevy_camera::visibility::InheritedVisibility" + }, + "is_static": true + }, + "VideoMode": { + "type_kind": { + "val": "bevy_window::monitor::VideoMode" + }, + "is_static": true + }, + "SliceScaleMode": { + "type_kind": { + "val": "bevy_sprite::texture_slice::slicer::SliceScaleMode" + }, + "is_static": true + }, + "Arc2d": { + "type_kind": { + "val": "bevy_math::primitives::dim2::Arc2d" + }, + "is_static": true + }, + "ReflectReference": { + "type_kind": { + "primitive": "reflectReference" + }, + "is_static": true + }, + "ClearColor": { + "type_kind": { + "val": "bevy_camera::clear_color::ClearColor" + }, + "is_static": true + }, + "ScriptValue": { + "type_kind": { + "val": "ScriptValue" + }, + "is_static": true + }, + "CircleMeshBuilder": { + "type_kind": { + "val": "bevy_mesh::primitives::dim2::CircleMeshBuilder" + }, + "is_static": true + }, + "Label": { + "type_kind": { + "val": "bevy_ui::widget::label::Label" + }, + "is_static": true + }, + "CursorIcon": { + "type_kind": { + "val": "bevy_window::cursor::CursorIcon" + }, + "is_static": true + }, + "FocusPolicy": { + "type_kind": { + "val": "bevy_ui::focus::FocusPolicy" + }, + "is_static": true + }, + "Vec3": { + "type_kind": { + "val": "glam::Vec3" + }, + "is_static": true + }, + "CircularSector": { + "type_kind": { + "val": "bevy_math::primitives::dim2::CircularSector" + }, + "is_static": true + }, + "CustomCursor": { + "type_kind": { + "val": "bevy_window::cursor::custom_cursor::CustomCursor" + }, + "is_static": true + }, + "BackgroundGradient": { + "type_kind": { + "val": "bevy_ui::gradients::BackgroundGradient" + }, + "is_static": true + }, + "ObservedBy": { + "type_kind": { + "val": "bevy_ecs::observer::distributed_storage::ObservedBy" + }, + "is_static": true + }, + "ReflectableScheduleLabel": { + "type_kind": { + "val": "bevy_system_reflection::ReflectableScheduleLabel" + }, + "is_static": true + }, + "Tetrahedron": { + "type_kind": { + "val": "bevy_math::primitives::dim3::Tetrahedron" + }, + "is_static": true + }, + "EaseFunction": { + "type_kind": { + "val": "bevy_math::curve::easing::EaseFunction" + }, + "is_static": true + }, + "SubCameraView": { + "type_kind": { + "val": "bevy_camera::camera::SubCameraView" + }, + "is_static": true + }, + "PanGesture": { + "type_kind": { + "val": "bevy_input::gestures::PanGesture" + }, + "is_static": true + }, + "Projection": { + "type_kind": { + "val": "bevy_camera::projection::Projection" + }, + "is_static": true + }, + "Oklaba": { + "type_kind": { + "val": "bevy_color::oklaba::Oklaba" + }, + "is_static": true + }, + "Capsule3dMeshBuilder": { + "type_kind": { + "val": "bevy_mesh::primitives::dim3::capsule::Capsule3dMeshBuilder" + }, + "is_static": true + }, + "GamepadButtonChangedEvent": { + "type_kind": { + "val": "bevy_input::gamepad::GamepadButtonChangedEvent" + }, + "is_static": true + }, + "U16Vec3": { + "type_kind": { + "val": "glam::U16Vec3" + }, + "is_static": true + }, + "Segment2d": { + "type_kind": { + "val": "bevy_math::primitives::dim2::Segment2d" + }, + "is_static": true + }, + "Triangle2d": { + "type_kind": { + "val": "bevy_math::primitives::dim2::Triangle2d" + }, + "is_static": true + }, + "u16": { + "type_kind": { + "primitive": "u16" + }, + "is_static": true + }, + "WindowRef": { + "type_kind": { + "val": "bevy_window::window::WindowRef" + }, + "is_static": true + }, + "AutoDirectionalNavigation": { + "type_kind": { + "val": "bevy_ui::auto_directional_navigation::AutoDirectionalNavigation" + }, + "is_static": true + }, + "Isometry2d": { + "type_kind": { + "val": "bevy_math::isometry::Isometry2d" + }, + "is_static": true + }, + "WindowEvent": { + "type_kind": { + "val": "bevy_window::event::WindowEvent" + }, + "is_static": true + }, + "CircularSegmentMeshBuilder": { + "type_kind": { + "val": "bevy_mesh::primitives::dim2::CircularSegmentMeshBuilder" + }, + "is_static": true + }, + "Strikethrough": { + "type_kind": { + "val": "bevy_text::text::Strikethrough" + }, + "is_static": true + }, + "CompositeAlphaMode": { + "type_kind": { + "val": "bevy_window::window::CompositeAlphaMode" + }, + "is_static": true + }, + "PrimaryMonitor": { + "type_kind": { + "val": "bevy_window::monitor::PrimaryMonitor" + }, + "is_static": true + }, + "DirectionalNavigationMap": { + "type_kind": { + "val": "bevy_input_focus::directional_navigation::DirectionalNavigationMap" + }, + "is_static": true + }, + "ComputedUiTargetCamera": { + "type_kind": { + "val": "bevy_ui::ui_node::ComputedUiTargetCamera" + }, + "is_static": true + }, + "f32": { + "type_kind": { + "primitive": "f32" + }, + "is_static": true + }, + "NodeImageMode": { + "type_kind": { + "val": "bevy_ui::widget::image::NodeImageMode" + }, + "is_static": true + }, + "EntityGeneration": { + "type_kind": { + "val": "bevy_ecs::entity::EntityGeneration" + }, + "is_static": true + }, + "ContentSize": { + "type_kind": { + "val": "bevy_ui::measurement::ContentSize" + }, + "is_static": true + }, + "CascadesVisibleEntities": { + "type_kind": { + "val": "bevy_camera::visibility::CascadesVisibleEntities" + }, + "is_static": true + }, + "RenderLayers": { + "type_kind": { + "val": "bevy_camera::visibility::render_layers::RenderLayers" + }, + "is_static": true + }, + "AtomicU16": { + "type_kind": { + "val": "core::sync::atomic::AtomicU16" + }, + "is_static": true + }, + "ButtonState": { + "type_kind": { + "val": "bevy_input::ButtonState" + }, + "is_static": true + }, + "I64Vec4": { + "type_kind": { + "val": "glam::I64Vec4" + }, + "is_static": true + }, + "Ray3d": { + "type_kind": { + "val": "bevy_math::ray::Ray3d" + }, + "is_static": true + }, + "DMat2": { + "type_kind": { + "val": "glam::DMat2" + }, + "is_static": true + }, + "CubemapVisibleEntities": { + "type_kind": { + "val": "bevy_camera::visibility::CubemapVisibleEntities" + }, + "is_static": true + }, + "BackgroundColor": { + "type_kind": { + "val": "bevy_ui::ui_node::BackgroundColor" + }, + "is_static": true + }, + "Node": { + "type_kind": { + "val": "bevy_ui::ui_node::Node" + }, + "is_static": true + }, + "DVec3": { + "type_kind": { + "val": "glam::DVec3" + }, + "is_static": true + }, + "Transform": { + "type_kind": { + "val": "bevy_transform::components::transform::Transform" + }, + "is_static": true + }, + "TileData": { + "type_kind": { + "val": "bevy_sprite_render::tilemap_chunk::TileData" + }, + "is_static": true + }, + "EntityHash": { + "type_kind": { + "val": "bevy_ecs::entity::hash::EntityHash" + }, + "is_static": true + }, + "Aabb2d": { + "type_kind": { + "val": "bevy_math::bounding::bounded2d::Aabb2d" + }, + "is_static": true + }, + "InterpolationColorSpace": { + "type_kind": { + "val": "bevy_ui::gradients::InterpolationColorSpace" + }, + "is_static": true + }, + "NonZeroU128": { + "type_kind": { + "val": "core::num::NonZeroU128" + }, + "is_static": true + }, + "OverflowClipMargin": { + "type_kind": { + "val": "bevy_ui::ui_node::OverflowClipMargin" + }, + "is_static": true + }, + "TouchInput": { + "type_kind": { + "val": "bevy_input::touch::TouchInput" + }, + "is_static": true + }, + "Namespace": { + "type_kind": { + "val": "bevy_mod_scripting_bindings::function::namespace::Namespace" + }, + "is_static": true + }, + "LineHeight": { + "type_kind": { + "val": "bevy_text::text::LineHeight" + }, + "is_static": true + }, + "WindowClosed": { + "type_kind": { + "val": "bevy_window::event::WindowClosed" + }, + "is_static": true + }, + "Ray2d": { + "type_kind": { + "val": "bevy_math::ray::Ray2d" + }, + "is_static": true + }, + "DynamicScriptFunctionMut": { + "type_kind": { + "primitive": "dynamicFunctionMut" + }, + "is_static": true + }, + "char": { + "type_kind": { + "primitive": "char" + }, + "is_static": true + }, + "ScriptError": { + "type_kind": { + "val": "bevy_mod_scripting_core::error::ScriptError" + }, + "is_static": true + }, + "Aabb": { + "type_kind": { + "val": "bevy_camera::primitives::Aabb" + }, + "is_static": true + }, + "DepthPrepass": { + "type_kind": { + "val": "bevy_core_pipeline::prepass::DepthPrepass" + }, + "is_static": true + }, + "UVec4": { + "type_kind": { + "val": "glam::UVec4" + }, + "is_static": true + }, + "DynamicScriptFunction": { + "type_kind": { + "primitive": "dynamicFunction" + }, + "is_static": true + }, + "Instant": { + "type_kind": { + "val": "bevy_platform::time::Instant" + }, + "is_static": true + }, + "DVec4": { + "type_kind": { + "val": "glam::DVec4" + }, + "is_static": true + }, + "Circle": { + "type_kind": { + "val": "bevy_math::primitives::dim2::Circle" + }, + "is_static": true + }, + "GridTrack": { + "type_kind": { + "val": "bevy_ui::ui_node::GridTrack" + }, + "is_static": true + }, + "UiTransform": { + "type_kind": { + "val": "bevy_ui::ui_transform::UiTransform" + }, + "is_static": true + }, + "JumpAt": { + "type_kind": { + "val": "bevy_math::curve::easing::JumpAt" + }, + "is_static": true + }, + "GamepadAxisChangedEvent": { + "type_kind": { + "val": "bevy_input::gamepad::GamepadAxisChangedEvent" + }, + "is_static": true + }, + "RawGamepadEvent": { + "type_kind": { + "val": "bevy_input::gamepad::RawGamepadEvent" + }, + "is_static": true + }, + "MeshMorphWeights": { + "type_kind": { + "val": "bevy_mesh::morph::MeshMorphWeights" + }, + "is_static": true + }, + "VariadicTuple": { + "type_kind": { + "val": "bevy_mod_scripting_bindings::script_value::VariadicTuple" + }, + "is_static": true + }, + "IRect": { + "type_kind": { + "val": "bevy_math::rects::irect::IRect" + }, + "is_static": true + }, + "BoundingCircleCast": { + "type_kind": { + "val": "bevy_math::bounding::raycast2d::BoundingCircleCast" + }, + "is_static": true + }, + "Segment3dMeshBuilder": { + "type_kind": { + "val": "bevy_mesh::primitives::dim3::segment3d::Segment3dMeshBuilder" + }, + "is_static": true + }, + "Triangle3d": { + "type_kind": { + "val": "bevy_math::primitives::dim3::Triangle3d" + }, + "is_static": true + }, + "AngularColorStop": { + "type_kind": { + "val": "bevy_ui::gradients::AngularColorStop" + }, + "is_static": true + }, + "DMat4": { + "type_kind": { + "val": "glam::DMat4" + }, + "is_static": true + }, + "Image": { + "type_kind": { + "val": "bevy_image::image::Image" + }, + "is_static": true + }, + "u32": { + "type_kind": { + "primitive": "u32" + }, + "is_static": true + }, + "Mesh2d": { + "type_kind": { + "val": "bevy_mesh::components::Mesh2d" + }, + "is_static": true + }, + "TabIndex": { + "type_kind": { + "val": "bevy_input_focus::tab_navigation::TabIndex" + }, + "is_static": true + }, + "NonZeroI32": { + "type_kind": { + "val": "core::num::NonZeroI32" + }, + "is_static": true + }, + "CustomProjection": { + "type_kind": { + "val": "bevy_camera::projection::CustomProjection" + }, + "is_static": true + }, + "AtomicBool": { + "type_kind": { + "val": "core::sync::atomic::AtomicBool" + }, + "is_static": true + }, + "ReflectSystemSet": { + "type_kind": { + "val": "bevy_system_reflection::ReflectSystemSet" + }, + "is_static": true + }, + "Entity": { + "type_kind": { + "val": "bevy_ecs::entity::Entity" + }, + "is_static": true + }, + "CircularSegment": { + "type_kind": { + "val": "bevy_math::primitives::dim2::CircularSegment" + }, + "is_static": true + }, + "ComputedUiRenderTargetInfo": { + "type_kind": { + "val": "bevy_ui::ui_node::ComputedUiRenderTargetInfo" + }, + "is_static": true + }, + "ColorStop": { + "type_kind": { + "val": "bevy_ui::gradients::ColorStop" + }, + "is_static": true + }, + "BVec4A": { + "type_kind": { + "val": "glam::BVec4A" + }, + "is_static": true + }, + "Dir3A": { + "type_kind": { + "val": "bevy_math::direction::Dir3A" + }, + "is_static": true + }, + "Gradient": { + "type_kind": { + "val": "bevy_ui::gradients::Gradient" + }, + "is_static": true + }, + "ScriptSystemBuilder": { + "type_kind": { + "val": "bevy_mod_scripting_core::script_system::ScriptSystemBuilder" + }, + "is_static": true + }, + "EllipseMeshBuilder": { + "type_kind": { + "val": "bevy_mesh::primitives::dim2::EllipseMeshBuilder" + }, + "is_static": true + }, + "TextColor": { + "type_kind": { + "val": "bevy_text::text::TextColor" + }, + "is_static": true + }, + "RadialGradient": { + "type_kind": { + "val": "bevy_ui::gradients::RadialGradient" + }, + "is_static": true + }, + "Vec2": { + "type_kind": { + "val": "glam::Vec2" + }, + "is_static": true + }, + "U64Vec2": { + "type_kind": { + "val": "glam::U64Vec2" + }, + "is_static": true + }, + "NonZeroI8": { + "type_kind": { + "val": "core::num::NonZeroI8" + }, + "is_static": true + }, + "DAffine2": { + "type_kind": { + "val": "glam::DAffine2" + }, + "is_static": true + }, + "NonZeroI64": { + "type_kind": { + "val": "core::num::NonZeroI64" + }, + "is_static": true + }, + "Lcha": { + "type_kind": { + "val": "bevy_color::lcha::Lcha" + }, + "is_static": true + }, + "Vec3A": { + "type_kind": { + "val": "glam::Vec3A" + }, + "is_static": true + }, + "DynamicComponent": { + "type_kind": { + "val": "bevy_mod_scripting_bindings::script_component::DynamicComponent" + }, + "is_static": true + }, + "WindowResized": { + "type_kind": { + "val": "bevy_window::event::WindowResized" + }, + "is_static": true + }, + "TypeId": { + "type_kind": { + "val": "core::any::TypeId" + }, + "is_static": true + }, + "FlexDirection": { + "type_kind": { + "val": "bevy_ui::ui_node::FlexDirection" + }, + "is_static": true + }, + "Disabled": { + "type_kind": { + "val": "bevy_ecs::entity_disabling::Disabled" + }, + "is_static": true + }, + "JustifyItems": { + "type_kind": { + "val": "bevy_ui::ui_node::JustifyItems" + }, + "is_static": true + }, + "AnnulusMeshBuilder": { + "type_kind": { + "val": "bevy_mesh::primitives::dim2::AnnulusMeshBuilder" + }, + "is_static": true + }, + "Val2": { + "type_kind": { + "val": "bevy_ui::ui_transform::Val2" + }, + "is_static": true + }, + "AlignContent": { + "type_kind": { + "val": "bevy_ui::ui_node::AlignContent" + }, + "is_static": true + }, + "Interval": { + "type_kind": { + "val": "bevy_math::curve::interval::Interval" + }, + "is_static": true + }, + "UiTargetCamera": { + "type_kind": { + "val": "bevy_ui::ui_node::UiTargetCamera" + }, + "is_static": true + }, + "OrthographicProjection": { + "type_kind": { + "val": "bevy_camera::projection::OrthographicProjection" + }, + "is_static": true + }, + "RawGamepadAxisChangedEvent": { + "type_kind": { + "val": "bevy_input::gamepad::RawGamepadAxisChangedEvent" + }, + "is_static": true + }, + "U16Vec4": { + "type_kind": { + "val": "glam::U16Vec4" + }, + "is_static": true + }, + "ScriptComponent": { + "type_kind": { + "val": "bevy_mod_scripting_core::script::ScriptComponent" + }, + "is_static": true + }, + "WindowThemeChanged": { + "type_kind": { + "val": "bevy_window::event::WindowThemeChanged" + }, + "is_static": true + }, + "DeferredPrepassDoubleBuffer": { + "type_kind": { + "val": "bevy_core_pipeline::prepass::DeferredPrepassDoubleBuffer" + }, + "is_static": true + }, + "AlphaMode": { + "type_kind": { + "val": "bevy_render::alpha::AlphaMode" + }, + "is_static": true + }, + "FunctionCallContext": { + "type_kind": { + "primitive": "functionCallContext" + }, + "is_static": true + }, + "AssetIndex": { + "type_kind": { + "val": "bevy_asset::assets::AssetIndex" + }, + "is_static": true + }, + "CompassQuadrant": { + "type_kind": { + "val": "bevy_math::compass::CompassQuadrant" + }, + "is_static": true + }, + "CompassOctant": { + "type_kind": { + "val": "bevy_math::compass::CompassOctant" + }, + "is_static": true + }, + "FunctionInfo": { + "type_kind": { + "val": "bevy_mod_scripting_bindings::docgen::info::FunctionInfo" + }, + "is_static": true + }, + "RotationGesture": { + "type_kind": { + "val": "bevy_input::gestures::RotationGesture" + }, + "is_static": true + }, + "TextBounds": { + "type_kind": { + "val": "bevy_text::bounds::TextBounds" + }, + "is_static": true + }, + "ReflectSystemGraph": { + "type_kind": { + "val": "bevy_system_reflection::ReflectSystemGraph" + }, + "is_static": true + }, + "Monitor": { + "type_kind": { + "val": "bevy_window::monitor::Monitor" + }, + "is_static": true + }, + "Outline": { + "type_kind": { + "val": "bevy_ui::ui_node::Outline" + }, + "is_static": true + }, + "Capsule3d": { + "type_kind": { + "val": "bevy_math::primitives::dim3::Capsule3d" + }, + "is_static": true + }, + "Gamepad": { + "type_kind": { + "val": "bevy_input::gamepad::Gamepad" + }, + "is_static": true + }, + "EntityIndexSet": { + "type_kind": { + "val": "bevy_ecs::entity::index_set::EntityIndexSet" + }, + "is_static": true + }, + "RangeFull": { + "type_kind": { + "val": "core::ops::RangeFull" + }, + "is_static": true + }, + "PathBuf": { + "type_kind": { + "primitive": "pathBuf" + }, + "is_static": true + }, + "Uuid": { + "type_kind": { + "val": "uuid::Uuid" + }, + "is_static": true + }, + "ReflectSchedule": { + "type_kind": { + "val": "bevy_system_reflection::ReflectSchedule" + }, + "is_static": true + }, + "BorderRect": { + "type_kind": { + "val": "bevy_sprite::texture_slice::border_rect::BorderRect" + }, + "is_static": true + }, + "UntypedHandle": { + "type_kind": { + "val": "bevy_asset::handle::UntypedHandle" + }, + "is_static": true + }, + "Mesh2dWireframe": { + "type_kind": { + "val": "bevy_sprite_render::mesh2d::wireframe2d::Mesh2dWireframe" + }, + "is_static": true + }, + "ReflectSystem": { + "type_kind": { + "val": "bevy_system_reflection::ReflectSystem" + }, + "is_static": true + }, + "ReadbackComplete": { + "type_kind": { + "val": "bevy_render::gpu_readback::ReadbackComplete" + }, + "is_static": true + }, + "U8Vec3": { + "type_kind": { + "val": "glam::U8Vec3" + }, + "is_static": true + }, + "Torus": { + "type_kind": { + "val": "bevy_math::primitives::dim3::Torus" + }, + "is_static": true + }, + "ConeAnchor": { + "type_kind": { + "val": "bevy_mesh::primitives::dim3::cone::ConeAnchor" + }, + "is_static": true + }, + "FontFeatures": { + "type_kind": { + "val": "bevy_text::text::FontFeatures" + }, + "is_static": true + }, + "Hsla": { + "type_kind": { + "val": "bevy_color::hsla::Hsla" + }, + "is_static": true + }, + "DQuat": { + "type_kind": { + "val": "glam::DQuat" + }, + "is_static": true + }, + "U64Vec4": { + "type_kind": { + "val": "glam::U64Vec4" + }, + "is_static": true + }, + "WindowDestroyed": { + "type_kind": { + "val": "bevy_window::event::WindowDestroyed" + }, + "is_static": true + }, + "f64": { + "type_kind": { + "primitive": "f64" + }, + "is_static": true + }, + "I8Vec3": { + "type_kind": { + "val": "glam::I8Vec3" + }, + "is_static": true + }, + "SpriteImageMode": { + "type_kind": { + "val": "bevy_sprite::sprite::SpriteImageMode" + }, + "is_static": true + }, + "BoundingSphere": { + "type_kind": { + "val": "bevy_math::bounding::bounded3d::BoundingSphere" + }, + "is_static": true + }, + "Mesh": { + "type_kind": { + "val": "bevy_mesh::mesh::Mesh" + }, + "is_static": true + }, + "NativeKey": { + "type_kind": { + "val": "bevy_input::keyboard::NativeKey" + }, + "is_static": true + }, + "UiScale": { + "type_kind": { + "val": "bevy_ui::UiScale" + }, + "is_static": true + }, + "Virtual": { + "type_kind": { + "val": "bevy_time::virt::Virtual" + }, + "is_static": true + }, + "TextEntity": { + "type_kind": { + "val": "bevy_text::text::TextEntity" + }, + "is_static": true + }, + "OverflowAxis": { + "type_kind": { + "val": "bevy_ui::ui_node::OverflowAxis" + }, + "is_static": true + }, + "ColorGradingSection": { + "type_kind": { + "val": "bevy_render::view::ColorGradingSection" + }, + "is_static": true + }, + "AtomicU64": { + "type_kind": { + "val": "core::sync::atomic::AtomicU64" + }, + "is_static": true + }, + "AabbCast2d": { + "type_kind": { + "val": "bevy_math::bounding::raycast2d::AabbCast2d" + }, + "is_static": true + }, + "Remove": { + "type_kind": { + "val": "bevy_ecs::lifecycle::Remove" + }, + "is_static": true + }, + "CursorLeft": { + "type_kind": { + "val": "bevy_window::event::CursorLeft" + }, + "is_static": true + }, + "Insert": { + "type_kind": { + "val": "bevy_ecs::lifecycle::Insert" + }, + "is_static": true + }, + "OrderIndependentTransparencySettings": { + "type_kind": { + "val": "bevy_core_pipeline::oit::OrderIndependentTransparencySettings" + }, + "is_static": true + }, + "TemporalJitter": { + "type_kind": { + "val": "bevy_render::camera::TemporalJitter" + }, + "is_static": true + }, + "WindowCloseRequested": { + "type_kind": { + "val": "bevy_window::event::WindowCloseRequested" + }, + "is_static": true + }, + "Dir4": { + "type_kind": { + "val": "bevy_math::direction::Dir4" + }, + "is_static": true + }, + "ConicalFrustum": { + "type_kind": { + "val": "bevy_math::primitives::dim3::ConicalFrustum" + }, + "is_static": true + }, + "i64": { + "type_kind": { + "primitive": "i64" + }, + "is_static": true + }, + "CameraMainTextureUsages": { + "type_kind": { + "val": "bevy_camera::camera::CameraMainTextureUsages" + }, + "is_static": true + }, + "RequestRedraw": { + "type_kind": { + "val": "bevy_window::event::RequestRedraw" + }, + "is_static": true + }, + "NavNeighbors": { + "type_kind": { + "val": "bevy_input_focus::directional_navigation::NavNeighbors" + }, + "is_static": true + }, + "RegularPolygonMeshBuilder": { + "type_kind": { + "val": "bevy_mesh::primitives::dim2::RegularPolygonMeshBuilder" + }, + "is_static": true + }, + "Sphere": { + "type_kind": { + "val": "bevy_math::primitives::dim3::Sphere" + }, + "is_static": true + }, + "TextBackgroundColor": { + "type_kind": { + "val": "bevy_text::text::TextBackgroundColor" + }, + "is_static": true + }, + "ScreenshotCaptured": { + "type_kind": { + "val": "bevy_render::view::window::screenshot::ScreenshotCaptured" + }, + "is_static": true + }, + "WindowTheme": { + "type_kind": { + "val": "bevy_window::window::WindowTheme" + }, + "is_static": true + }, + "TouchPhase": { + "type_kind": { + "val": "bevy_input::touch::TouchPhase" + }, + "is_static": true + }, + "BVec2": { + "type_kind": { + "val": "glam::BVec2" + }, + "is_static": true + }, + "Viewport": { + "type_kind": { + "val": "bevy_camera::camera::Viewport" + }, + "is_static": true + }, + "Overflow": { + "type_kind": { + "val": "bevy_ui::ui_node::Overflow" + }, + "is_static": true + }, + "U16Vec2": { + "type_kind": { + "val": "glam::U16Vec2" + }, + "is_static": true + }, + "SocketAddr": { + "type_kind": { + "val": "core::net::SocketAddr" + }, + "is_static": true + }, + "ConvexPolygon": { + "type_kind": { + "val": "bevy_math::primitives::dim2::ConvexPolygon" + }, + "is_static": true + }, + "Timer": { + "type_kind": { + "val": "bevy_time::timer::Timer" + }, + "is_static": true + }, + "NonZeroI128": { + "type_kind": { + "val": "core::num::NonZeroI128" + }, + "is_static": true + }, + "NonZeroU8": { + "type_kind": { + "val": "core::num::NonZeroU8" + }, + "is_static": true + }, + "u8": { + "type_kind": { + "primitive": "u8" + }, + "is_static": true + }, + "MouseButtonInput": { + "type_kind": { + "val": "bevy_input::mouse::MouseButtonInput" + }, + "is_static": true + }, + "CustomCursorImage": { + "type_kind": { + "val": "bevy_window::cursor::custom_cursor::CustomCursorImage" + }, + "is_static": true + }, + "VisibleEntities": { + "type_kind": { + "val": "bevy_camera::visibility::VisibleEntities" + }, + "is_static": true + }, + "ScreenEdge": { + "type_kind": { + "val": "bevy_window::window::ScreenEdge" + }, + "is_static": true + }, + "CameraOutputMode": { + "type_kind": { + "val": "bevy_camera::camera::CameraOutputMode" + }, + "is_static": true + }, + "TextureFormat": { + "type_kind": { + "val": "wgpu_types::TextureFormat" + }, + "is_static": true + }, + "WindowMode": { + "type_kind": { + "val": "bevy_window::window::WindowMode" + }, + "is_static": true + }, + "Isometry3d": { + "type_kind": { + "val": "bevy_math::isometry::Isometry3d" + }, + "is_static": true + }, + "IVec2": { + "type_kind": { + "val": "glam::IVec2" + }, + "is_static": true + }, + "VideoModeSelection": { + "type_kind": { + "val": "bevy_window::window::VideoModeSelection" + }, + "is_static": true + }, + "RemovedComponentEntity": { + "type_kind": { + "val": "bevy_ecs::lifecycle::RemovedComponentEntity" + }, + "is_static": true + }, + "I64Vec2": { + "type_kind": { + "val": "glam::I64Vec2" + }, + "is_static": true + }, + "TextureAtlas": { + "type_kind": { + "val": "bevy_image::texture_atlas::TextureAtlas" + }, + "is_static": true + }, + "FlexWrap": { + "type_kind": { + "val": "bevy_ui::ui_node::FlexWrap" + }, + "is_static": true + }, + "UiPosition": { + "type_kind": { + "val": "bevy_ui::geometry::UiPosition" + }, + "is_static": true + }, + "CubemapFrusta": { + "type_kind": { + "val": "bevy_camera::primitives::CubemapFrusta" + }, + "is_static": true + }, + "Srgba": { + "type_kind": { + "val": "bevy_color::srgba::Srgba" + }, + "is_static": true + }, + "Button": { + "type_kind": { + "val": "bevy_ui::widget::button::Button" + }, + "is_static": true + }, + "KeyboardInput": { + "type_kind": { + "val": "bevy_input::keyboard::KeyboardInput" + }, + "is_static": true + }, + "Mat2": { + "type_kind": { + "val": "glam::Mat2" + }, + "is_static": true + }, + "PositionType": { + "type_kind": { + "val": "bevy_ui::ui_node::PositionType" + }, + "is_static": true + }, + "GamepadAxis": { + "type_kind": { + "val": "bevy_input::gamepad::GamepadAxis" + }, + "is_static": true + }, + "NormalizedWindowRef": { + "type_kind": { + "val": "bevy_window::window::NormalizedWindowRef" + }, + "is_static": true + }, + "String": { + "type_kind": { + "primitive": "string" + }, + "is_static": true + }, + "NonZeroIsize": { + "type_kind": { + "val": "core::num::NonZeroIsize" + }, + "is_static": true + }, + "AtomicI8": { + "type_kind": { + "val": "core::sync::atomic::AtomicI8" + }, + "is_static": true + }, + "CursorGrabMode": { + "type_kind": { + "val": "bevy_window::window::CursorGrabMode" + }, + "is_static": true + }, + "CircularMeshUvMode": { + "type_kind": { + "val": "bevy_mesh::primitives::dim2::CircularMeshUvMode" + }, + "is_static": true + }, + "GamepadSettings": { + "type_kind": { + "val": "bevy_input::gamepad::GamepadSettings" + }, + "is_static": true + }, + "VisibilityClass": { + "type_kind": { + "val": "bevy_camera::visibility::VisibilityClass" + }, + "is_static": true + }, + "ViewVisibility": { + "type_kind": { + "val": "bevy_camera::visibility::ViewVisibility" + }, + "is_static": true + }, + "Mat4": { + "type_kind": { + "val": "glam::Mat4" + }, + "is_static": true + }, + "AabbCast3d": { + "type_kind": { + "val": "bevy_math::bounding::raycast3d::AabbCast3d" + }, + "is_static": true + }, + "GridPlacement": { + "type_kind": { + "val": "bevy_ui::ui_node::GridPlacement" + }, + "is_static": true + }, + "ScriptQueryBuilder": { + "type_kind": { + "val": "bevy_mod_scripting_bindings::query::ScriptQueryBuilder" + }, + "is_static": true + }, + "U8Vec2": { + "type_kind": { + "val": "glam::U8Vec2" + }, + "is_static": true + }, + "AspectRatio": { + "type_kind": { + "val": "bevy_math::aspect_ratio::AspectRatio" + }, + "is_static": true + }, + "UnderlineColor": { + "type_kind": { + "val": "bevy_text::text::UnderlineColor" + }, + "is_static": true + }, + "Capsule2dMeshBuilder": { + "type_kind": { + "val": "bevy_mesh::primitives::dim2::Capsule2dMeshBuilder" + }, + "is_static": true + }, + "i16": { + "type_kind": { + "primitive": "i16" + }, + "is_static": true + }, + "ConvexPolygonMeshBuilder": { + "type_kind": { + "val": "bevy_mesh::primitives::dim2::ConvexPolygonMeshBuilder" + }, + "is_static": true + }, + "Camera3d": { + "type_kind": { + "val": "bevy_camera::components::Camera3d" + }, + "is_static": true + }, + "NoFrustumCulling": { + "type_kind": { + "val": "bevy_camera::visibility::NoFrustumCulling" + }, + "is_static": true + }, + "ComputedTextBlock": { + "type_kind": { + "val": "bevy_text::text::ComputedTextBlock" + }, + "is_static": true + }, + "CursorEntered": { + "type_kind": { + "val": "bevy_window::event::CursorEntered" + }, + "is_static": true + }, + "FontFeatureTag": { + "type_kind": { + "val": "bevy_text::text::FontFeatureTag" + }, + "is_static": true + }, + "ForceTouch": { + "type_kind": { + "val": "bevy_input::touch::ForceTouch" + }, + "is_static": true + }, + "WindowClosing": { + "type_kind": { + "val": "bevy_window::event::WindowClosing" + }, + "is_static": true + }, + "InternalWindowState": { + "type_kind": { + "val": "bevy_window::window::InternalWindowState" + }, + "is_static": true + }, + "WindowCreated": { + "type_kind": { + "val": "bevy_window::event::WindowCreated" + }, + "is_static": true + }, + "TilemapChunkTileData": { + "type_kind": { + "val": "bevy_sprite_render::tilemap_chunk::TilemapChunkTileData" + }, + "is_static": true + }, + "Despawn": { + "type_kind": { + "val": "bevy_ecs::lifecycle::Despawn" + }, + "is_static": true + }, + "RhombusMeshBuilder": { + "type_kind": { + "val": "bevy_mesh::primitives::dim2::RhombusMeshBuilder" + }, + "is_static": true + }, + "Aabb3d": { + "type_kind": { + "val": "bevy_math::bounding::bounded3d::Aabb3d" + }, + "is_static": true + }, + "SkinnedMesh": { + "type_kind": { + "val": "bevy_mesh::skinning::SkinnedMesh" + }, + "is_static": true + }, + "Affine2": { + "type_kind": { + "val": "glam::Affine2" + }, + "is_static": true + }, + "VisibleMeshEntities": { + "type_kind": { + "val": "bevy_camera::visibility::VisibleMeshEntities" + }, + "is_static": true + }, + "Mat3": { + "type_kind": { + "val": "glam::Mat3" + }, + "is_static": true + }, + "ManualTextureViewHandle": { + "type_kind": { + "val": "bevy_camera::camera::ManualTextureViewHandle" + }, + "is_static": true + }, + "EntityHashSet": { + "type_kind": { + "val": "bevy_ecs::entity::hash_set::EntityHashSet" + }, + "is_static": true + }, + "TextShadow": { + "type_kind": { + "val": "bevy_ui::widget::text::TextShadow" + }, + "is_static": true + }, + "Plane2d": { + "type_kind": { + "val": "bevy_math::primitives::dim2::Plane2d" + }, + "is_static": true + }, + "RenderAssetUsages": { + "type_kind": { + "val": "bevy_asset::render_asset::RenderAssetUsages" + }, + "is_static": true + }, + "Msaa": { + "type_kind": { + "val": "bevy_render::view::Msaa" + }, + "is_static": true + }, + "AccumulatedMouseScroll": { + "type_kind": { + "val": "bevy_input::mouse::AccumulatedMouseScroll" + }, + "is_static": true + }, + "Skybox": { + "type_kind": { + "val": "bevy_core_pipeline::skybox::Skybox" + }, + "is_static": true + }, + "FileDragAndDrop": { + "type_kind": { + "val": "bevy_window::event::FileDragAndDrop" + }, + "is_static": true + }, + "MouseWheel": { + "type_kind": { + "val": "bevy_input::mouse::MouseWheel" + }, + "is_static": true + }, + "Annulus": { + "type_kind": { + "val": "bevy_math::primitives::dim2::Annulus" + }, + "is_static": true + }, + "ComponentId": { + "type_kind": { + "val": "bevy_ecs::component::info::ComponentId" + }, + "is_static": true + }, + "KeyCode": { + "type_kind": { + "val": "bevy_input::keyboard::KeyCode" + }, + "is_static": true + }, + "ScrollPosition": { + "type_kind": { + "val": "bevy_ui::ui_node::ScrollPosition" + }, + "is_static": true + }, + "EntityIndex": { + "type_kind": { + "val": "bevy_ecs::entity::EntityIndex" + }, + "is_static": true + }, + "FunctionReturnInfo": { + "type_kind": { + "val": "bevy_mod_scripting_bindings::docgen::info::FunctionReturnInfo" + }, + "is_static": true + }, + "ComputedNode": { + "type_kind": { + "val": "bevy_ui::ui_node::ComputedNode" + }, + "is_static": true + }, + "MeshTag": { + "type_kind": { + "val": "bevy_mesh::components::MeshTag" + }, + "is_static": true + }, + "Camera3dDepthLoadOp": { + "type_kind": { + "val": "bevy_camera::components::Camera3dDepthLoadOp" + }, + "is_static": true + }, + "Arc": { + "type_kind": { + "val": "bevy_platform::sync::Arc" + }, + "is_static": true + }, + "Line2d": { + "type_kind": { + "val": "bevy_math::primitives::dim2::Line2d" + }, + "is_static": true + }, + "NonZeroU64": { + "type_kind": { + "val": "core::num::NonZeroU64" + }, + "is_static": true + }, + "AutoFocus": { + "type_kind": { + "val": "bevy_input_focus::autofocus::AutoFocus" + }, + "is_static": true + }, + "Display": { + "type_kind": { + "val": "bevy_ui::ui_node::Display" + }, + "is_static": true + }, + "AppLifecycle": { + "type_kind": { + "val": "bevy_window::event::AppLifecycle" + }, + "is_static": true + }, + "PerspectiveProjection": { + "type_kind": { + "val": "bevy_camera::projection::PerspectiveProjection" + }, + "is_static": true + }, + "Hdr": { + "type_kind": { + "val": "bevy_render::view::Hdr" + }, + "is_static": true + }, + "FontHinting": { + "type_kind": { + "val": "bevy_text::text::FontHinting" + }, + "is_static": true + }, + "TextureAtlasLayout": { + "type_kind": { + "val": "bevy_image::texture_atlas::TextureAtlasLayout" + }, + "is_static": true + }, + "TetrahedronMeshBuilder": { + "type_kind": { + "val": "bevy_mesh::primitives::dim3::tetrahedron::TetrahedronMeshBuilder" + }, + "is_static": true + }, + "SystemCursorIcon": { + "type_kind": { + "val": "bevy_window::cursor::system_cursor::SystemCursorIcon" + }, + "is_static": true + }, + "UiGlobalTransform": { + "type_kind": { + "val": "bevy_ui::ui_transform::UiGlobalTransform" + }, + "is_static": true + }, + "AtomicI32": { + "type_kind": { + "val": "core::sync::atomic::AtomicI32" + }, + "is_static": true + }, + "RelativeCursorPosition": { + "type_kind": { + "val": "bevy_ui::focus::RelativeCursorPosition" + }, + "is_static": true + }, + "RawGamepadButtonChangedEvent": { + "type_kind": { + "val": "bevy_input::gamepad::RawGamepadButtonChangedEvent" + }, + "is_static": true + }, + "MouseButton": { + "type_kind": { + "val": "bevy_input::mouse::MouseButton" + }, + "is_static": true + }, + "Interaction": { + "type_kind": { + "val": "bevy_ui::focus::Interaction" + }, + "is_static": true + }, + "IVec3": { + "type_kind": { + "val": "glam::IVec3" + }, + "is_static": true + }, + "TimerMode": { + "type_kind": { + "val": "bevy_time::timer::TimerMode" + }, + "is_static": true + }, + "I16Vec2": { + "type_kind": { + "val": "glam::I16Vec2" + }, + "is_static": true + }, + "Anchor": { + "type_kind": { + "val": "bevy_sprite::sprite::Anchor" + }, + "is_static": true + }, + "RectangleMeshBuilder": { + "type_kind": { + "val": "bevy_mesh::primitives::dim2::RectangleMeshBuilder" + }, + "is_static": true + }, + "world": { + "type_kind": { + "val": "World" + }, + "is_static": false + }, + "script_asset": { + "type_kind": { + "val": "bevy_asset::handle::Handle" + }, + "is_static": false + }, + "entity": { + "type_kind": { + "val": "bevy_ecs::entity::Entity" + }, + "is_static": false + } + }, + "types": { + "World": { + "identifier": "World", + "crate": "bevy_ecs", + "path": "bevy_ecs::world::World", + "documentation": "The ECS world containing all Components, Resources and Systems. Main point of interaction with a Bevy App.", + "associated_functions": [ + "World::query", + "World::remove_component", + "World::get_type_by_name", + "World::get_children", + "World::insert_children", + "World::get_asset", + "World::get_parent", + "World::get_resource", + "World::spawn", + "World::insert_component", + "World::exit", + "World::despawn", + "World::register_new_component", + "World::has_resource", + "World::get_component", + "World::add_system", + "World::despawn_descendants", + "World::has_asset", + "World::despawn_recursive", + "World::has_entity", + "World::has_component", + "World::get_schedule_by_name", + "World::add_default_component", + "World::push_children", + "World::remove_resource" + ], + "layout": null, + "generated": false, + "insignificance": 499, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": false, + "mapped_to_primitive_kind": null + } + }, + "bevy_mod_scripting_bindings::query::ScriptComponentRegistration": { + "identifier": "ScriptComponentRegistration", + "crate": "bevy_mod_scripting_bindings", + "path": "bevy_mod_scripting_bindings::query::ScriptComponentRegistration", + "documentation": " A reference to a component type's reflection registration.\n\n In general think of this as a handle to a type.\n\n Not to be confused with script registered dynamic components, although this can point to a script registered component.", + "associated_functions": [ + "bevy_mod_scripting_bindings::query::ScriptComponentRegistration::short_name", + "bevy_mod_scripting_bindings::query::ScriptComponentRegistration::type_name" + ], + "layout": { + "kind": "Struct", + "name": "ScriptComponentRegistration", + "fields": [ + { + "name": "registration", + "type": { + "val": "bevy_mod_scripting_bindings::query::ScriptTypeRegistration" + } + }, + { + "name": "component_id", + "type": { + "val": "bevy_ecs::component::info::ComponentId" + } + }, + { + "name": "is_dynamic_script_component", + "type": { + "primitive": "bool" + } + } + ] + }, + "generated": false, + "insignificance": 500, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mod_scripting_bindings::query::ScriptQueryBuilder": { + "identifier": "ScriptQueryBuilder", + "crate": "bevy_mod_scripting_bindings", + "path": "bevy_mod_scripting_bindings::query::ScriptQueryBuilder", + "documentation": " The query builder is used to build ECS queries which retrieve spefific components filtered by specific conditions.\n\n For example:\n ```rust,ignore\n builder.component(componentA)\n .component(componentB)\n .with(componentC)\n .without(componentD) \n ```\n\n Will retrieve entities which:\n - Have componentA\n - Have componentB\n - Have componentC\n - Do not have componentD\n\n As well as references to components:\n - componentA\n - componentB", + "associated_functions": [ + "bevy_mod_scripting_bindings::query::ScriptQueryBuilder::without", + "bevy_mod_scripting_bindings::query::ScriptQueryBuilder::with", + "bevy_mod_scripting_bindings::query::ScriptQueryBuilder::build", + "bevy_mod_scripting_bindings::query::ScriptQueryBuilder::component" + ], + "layout": null, + "generated": false, + "insignificance": 500, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mod_scripting_bindings::query::ScriptQueryResult": { + "identifier": "ScriptQueryResult", + "crate": "bevy_mod_scripting_bindings", + "path": "bevy_mod_scripting_bindings::query::ScriptQueryResult", + "documentation": " A result from a query.", + "associated_functions": [ + "bevy_mod_scripting_bindings::query::ScriptQueryResult::components", + "bevy_mod_scripting_bindings::query::ScriptQueryResult::entity" + ], + "layout": null, + "generated": false, + "insignificance": 500, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mod_scripting_bindings::query::ScriptResourceRegistration": { + "identifier": "ScriptResourceRegistration", + "crate": "bevy_mod_scripting_bindings", + "path": "bevy_mod_scripting_bindings::query::ScriptResourceRegistration", + "documentation": " A reference to a resource type's reflection registration.\n\n In general think of this as a handle to a type.", + "associated_functions": [ + "bevy_mod_scripting_bindings::query::ScriptResourceRegistration::type_name", + "bevy_mod_scripting_bindings::query::ScriptResourceRegistration::short_name" + ], + "layout": { + "kind": "Struct", + "name": "ScriptResourceRegistration", + "fields": [ + { + "name": "registration", + "type": { + "val": "bevy_mod_scripting_bindings::query::ScriptTypeRegistration" + } + }, + { + "name": "resource_id", + "type": { + "val": "bevy_ecs::component::info::ComponentId" + } + } + ] + }, + "generated": false, + "insignificance": 500, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mod_scripting_bindings::query::ScriptTypeRegistration": { + "identifier": "ScriptTypeRegistration", + "crate": "bevy_mod_scripting_bindings", + "path": "bevy_mod_scripting_bindings::query::ScriptTypeRegistration", + "documentation": " A reference to a type which is not a `Resource` or `Component`.\n\n In general think of this as a handle to a type.", + "associated_functions": [ + "bevy_mod_scripting_bindings::query::ScriptTypeRegistration::short_name", + "bevy_mod_scripting_bindings::query::ScriptTypeRegistration::type_name" + ], + "layout": null, + "generated": false, + "insignificance": 500, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mod_scripting_core::script_system::ScriptSystemBuilder": { + "identifier": "ScriptSystemBuilder", + "crate": "bevy_mod_scripting_core", + "path": "bevy_mod_scripting_core::script_system::ScriptSystemBuilder", + "documentation": " A builder for systems living in scripts", + "associated_functions": [ + "bevy_mod_scripting_core::script_system::ScriptSystemBuilder::before", + "bevy_mod_scripting_core::script_system::ScriptSystemBuilder::resource", + "bevy_mod_scripting_core::script_system::ScriptSystemBuilder::query", + "bevy_mod_scripting_core::script_system::ScriptSystemBuilder::exclusive", + "bevy_mod_scripting_core::script_system::ScriptSystemBuilder::after" + ], + "layout": null, + "generated": false, + "insignificance": 500, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mod_scripting_script::ScriptAttachment": { + "identifier": "ScriptAttachment", + "crate": "bevy_mod_scripting_script", + "path": "bevy_mod_scripting_script::ScriptAttachment", + "documentation": " Specifies a unique attachment of a script. These attachments are mapped to [`bevy_mod_scripting_core::ContextKey`]'s depending on the context policy used.", + "associated_functions": [ + "bevy_mod_scripting_script::ScriptAttachment::new_static_script", + "bevy_mod_scripting_script::ScriptAttachment::new_entity_script" + ], + "layout": [ + { + "kind": "TupleStruct", + "name": "EntityScript", + "fields": [ + { + "type": { + "val": "bevy_ecs::entity::Entity" + } + }, + { + "type": { + "val": "bevy_asset::handle::Handle" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "StaticScript", + "fields": [ + { + "type": { + "val": "bevy_asset::handle::Handle" + } + } + ] + } + ], + "generated": false, + "insignificance": 500, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_system_reflection::ReflectSchedule": { + "identifier": "ReflectSchedule", + "crate": "bevy_system_reflection", + "path": "bevy_system_reflection::ReflectSchedule", + "documentation": " A reflectable schedule.", + "associated_functions": [ + "bevy_system_reflection::ReflectSchedule::get_system_by_name", + "bevy_system_reflection::ReflectSchedule::render_dot", + "bevy_system_reflection::ReflectSchedule::systems" + ], + "layout": { + "kind": "Struct", + "name": "ReflectSchedule", + "fields": [ + { + "name": "type_path", + "type": { + "primitive": "str" + } + }, + { + "name": "label", + "type": { + "val": "bevy_system_reflection::ReflectableScheduleLabel" + } + } + ] + }, + "generated": false, + "insignificance": 500, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_system_reflection::ReflectSystem": { + "identifier": "ReflectSystem", + "crate": "bevy_system_reflection", + "path": "bevy_system_reflection::ReflectSystem", + "documentation": " A reflectable system.", + "associated_functions": [ + "bevy_system_reflection::ReflectSystem::identifier", + "bevy_system_reflection::ReflectSystem::path" + ], + "layout": null, + "generated": false, + "insignificance": 500, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_asset::handle::Handle": { + "identifier": "Handle", + "crate": "bevy_asset", + "path": "bevy_asset::handle::Handle", + "generics": [ + { + "type_id": "bevy_mod_scripting_asset::script_asset::ScriptAsset", + "name": "A" + } + ], + "documentation": " A handle to a specific [`Asset`] of type `A`. Handles act as abstract \"references\" to\n assets, whose data are stored in the [`Assets`](crate::prelude::Assets) resource,\n avoiding the need to store multiple copies of the same data.\n\n If a [`Handle`] is [`Handle::Strong`], the [`Asset`] will be kept\n alive until the [`Handle`] is dropped. If a [`Handle`] is [`Handle::Uuid`], it does not necessarily reference a live [`Asset`],\n nor will it keep assets alive.\n\n Modifying a *handle* will change which existing asset is referenced, but modifying the *asset*\n (by mutating the [`Assets`](crate::prelude::Assets) resource) will change the asset for all handles referencing it.\n\n [`Handle`] can be cloned. If a [`Handle::Strong`] is cloned, the referenced [`Asset`] will not be freed until _all_ instances\n of the [`Handle`] are dropped.\n\n [`Handle::Strong`], via [`StrongHandle`] also provides access to useful [`Asset`] metadata, such as the [`AssetPath`] (if it exists).", + "associated_functions": [ + "bevy_asset::handle::Handle::asset_path" + ], + "layout": [ + { + "kind": "TupleStruct", + "name": "Strong", + "fields": [ + { + "type": { + "val": "bevy_platform::sync::Arc" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Uuid", + "fields": [ + { + "type": { + "val": "uuid::Uuid" + } + } + ] + } + ], + "generated": false, + "insignificance": 500, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "ReflectReference": { + "identifier": "ReflectReference", + "path": "ReflectReference", + "documentation": "A reference to a reflectable type", + "associated_functions": [ + "ReflectReference::insert", + "ReflectReference::pop", + "ReflectReference::len", + "ReflectReference::map_get", + "ReflectReference::push", + "ReflectReference::iter", + "ReflectReference::clear", + "ReflectReference::display", + "ReflectReference::variant_name", + "ReflectReference::remove", + "ReflectReference::functions", + "ReflectReference::debug" + ], + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": false, + "mapped_to_primitive_kind": "reflectReference" + } + }, + "bevy_color::color::Color": { + "identifier": "Color", + "crate": "bevy_color", + "path": "bevy_color::color::Color", + "documentation": " An enumerated type that can represent any of the color types in this crate.\n\n This is useful when you need to store a color in a data structure that can't be generic over\n the color type.\n
\n
\n\n # Operations\n\n [`Color`] supports all the standard color operations, such as [mixing](Mix),\n [luminance](Luminance) and [hue](Hue) adjustment,\n and [diffing](EuclideanDistance). These operations delegate to the concrete color space contained\n by [`Color`], but will convert to [`Oklch`](Oklcha) for operations which aren't supported in the\n current space. After performing the operation, if a conversion was required, the result will be\n converted back into the original color space.\n\n ```rust\n # use bevy_color::{Hue, Color};\n let red_hsv = Color::hsv(0., 1., 1.);\n let red_srgb = Color::srgb(1., 0., 0.);\n\n // HSV has a definition of hue, so it will be returned.\n red_hsv.hue();\n\n // SRGB doesn't have a native definition for hue.\n // Converts to Oklch and returns that result.\n red_srgb.hue();\n ```\n\n [`Oklch`](Oklcha) has been chosen as the intermediary space in cases where conversion is required\n due to its perceptual uniformity and broad support for Bevy's color operations.\n To avoid the cost of repeated conversion, and ensure consistent results where that is desired,\n first convert this [`Color`] into your desired color space.", + "associated_functions": [ + "bevy_color::color::Color::oklch", + "bevy_color::color::Color::lcha", + "bevy_color::color::Color::oklaba", + "bevy_color::color::Color::to_srgba", + "bevy_color::color::Color::to_linear", + "bevy_color::color::Color::oklab", + "bevy_color::color::Color::hwba", + "bevy_color::color::Color::xyza", + "bevy_color::color::Color::srgb_from_array", + "bevy_color::color::Color::srgb", + "bevy_color::color::Color::hsl", + "bevy_color::color::Color::lch", + "bevy_color::color::Color::hsla", + "bevy_color::color::Color::srgba", + "bevy_color::color::Color::linear_rgba", + "bevy_color::color::Color::eq", + "bevy_color::color::Color::linear_rgb", + "bevy_color::color::Color::hsva", + "bevy_color::color::Color::xyz", + "bevy_color::color::Color::srgb_u8", + "bevy_color::color::Color::hwb", + "bevy_color::color::Color::srgba_u8", + "bevy_color::color::Color::hsv", + "bevy_color::color::Color::clone", + "bevy_color::color::Color::lab", + "bevy_color::color::Color::oklcha", + "bevy_color::color::Color::laba" + ], + "layout": [ + { + "kind": "TupleStruct", + "name": "Srgba", + "fields": [ + { + "type": { + "val": "bevy_color::srgba::Srgba" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "LinearRgba", + "fields": [ + { + "type": { + "val": "bevy_color::linear_rgba::LinearRgba" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Hsla", + "fields": [ + { + "type": { + "val": "bevy_color::hsla::Hsla" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Hsva", + "fields": [ + { + "type": { + "val": "bevy_color::hsva::Hsva" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Hwba", + "fields": [ + { + "type": { + "val": "bevy_color::hwba::Hwba" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Laba", + "fields": [ + { + "type": { + "val": "bevy_color::laba::Laba" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Lcha", + "fields": [ + { + "type": { + "val": "bevy_color::lcha::Lcha" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Oklaba", + "fields": [ + { + "type": { + "val": "bevy_color::oklaba::Oklaba" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Oklcha", + "fields": [ + { + "type": { + "val": "bevy_color::oklcha::Oklcha" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Xyza", + "fields": [ + { + "type": { + "val": "bevy_color::xyza::Xyza" + } + } + ] + } + ], + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_color::hsla::Hsla": { + "identifier": "Hsla", + "crate": "bevy_color", + "path": "bevy_color::hsla::Hsla", + "documentation": " Color in Hue-Saturation-Lightness (HSL) color space with alpha.\n Further information on this color model can be found on [Wikipedia](https://en.wikipedia.org/wiki/HSL_and_HSV).\n
\n
", + "associated_functions": [ + "bevy_color::hsla::Hsla::with_saturation", + "bevy_color::hsla::Hsla::with_lightness", + "bevy_color::hsla::Hsla::eq", + "bevy_color::hsla::Hsla::hsl", + "bevy_color::hsla::Hsla::new", + "bevy_color::hsla::Hsla::clone", + "bevy_color::hsla::Hsla::sequential_dispersed" + ], + "layout": { + "kind": "Struct", + "name": "Hsla", + "fields": [ + { + "name": "hue", + "type": { + "primitive": "f32" + } + }, + { + "name": "saturation", + "type": { + "primitive": "f32" + } + }, + { + "name": "lightness", + "type": { + "primitive": "f32" + } + }, + { + "name": "alpha", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_color::hsva::Hsva": { + "identifier": "Hsva", + "crate": "bevy_color", + "path": "bevy_color::hsva::Hsva", + "documentation": " Color in Hue-Saturation-Value (HSV) color space with alpha.\n Further information on this color model can be found on [Wikipedia](https://en.wikipedia.org/wiki/HSL_and_HSV).\n
\n
", + "associated_functions": [ + "bevy_color::hsva::Hsva::with_value", + "bevy_color::hsva::Hsva::with_saturation", + "bevy_color::hsva::Hsva::eq", + "bevy_color::hsva::Hsva::new", + "bevy_color::hsva::Hsva::hsv", + "bevy_color::hsva::Hsva::clone" + ], + "layout": { + "kind": "Struct", + "name": "Hsva", + "fields": [ + { + "name": "hue", + "type": { + "primitive": "f32" + } + }, + { + "name": "saturation", + "type": { + "primitive": "f32" + } + }, + { + "name": "value", + "type": { + "primitive": "f32" + } + }, + { + "name": "alpha", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_color::hwba::Hwba": { + "identifier": "Hwba", + "crate": "bevy_color", + "path": "bevy_color::hwba::Hwba", + "documentation": " Color in Hue-Whiteness-Blackness (HWB) color space with alpha.\n Further information on this color model can be found on [Wikipedia](https://en.wikipedia.org/wiki/HWB_color_model).\n
\n
", + "associated_functions": [ + "bevy_color::hwba::Hwba::eq", + "bevy_color::hwba::Hwba::with_blackness", + "bevy_color::hwba::Hwba::with_whiteness", + "bevy_color::hwba::Hwba::new", + "bevy_color::hwba::Hwba::hwb", + "bevy_color::hwba::Hwba::clone" + ], + "layout": { + "kind": "Struct", + "name": "Hwba", + "fields": [ + { + "name": "hue", + "type": { + "primitive": "f32" + } + }, + { + "name": "whiteness", + "type": { + "primitive": "f32" + } + }, + { + "name": "blackness", + "type": { + "primitive": "f32" + } + }, + { + "name": "alpha", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_color::laba::Laba": { + "identifier": "Laba", + "crate": "bevy_color", + "path": "bevy_color::laba::Laba", + "documentation": " Color in LAB color space, with alpha\n
\n
", + "associated_functions": [ + "bevy_color::laba::Laba::new", + "bevy_color::laba::Laba::neg", + "bevy_color::laba::Laba::eq", + "bevy_color::laba::Laba::with_lightness", + "bevy_color::laba::Laba::div", + "bevy_color::laba::Laba::lab", + "bevy_color::laba::Laba::sub", + "bevy_color::laba::Laba::mul", + "bevy_color::laba::Laba::add", + "bevy_color::laba::Laba::clone" + ], + "layout": { + "kind": "Struct", + "name": "Laba", + "fields": [ + { + "name": "lightness", + "type": { + "primitive": "f32" + } + }, + { + "name": "a", + "type": { + "primitive": "f32" + } + }, + { + "name": "b", + "type": { + "primitive": "f32" + } + }, + { + "name": "alpha", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_color::lcha::Lcha": { + "identifier": "Lcha", + "crate": "bevy_color", + "path": "bevy_color::lcha::Lcha", + "documentation": " Color in LCH color space, with alpha\n
\n
", + "associated_functions": [ + "bevy_color::lcha::Lcha::sequential_dispersed", + "bevy_color::lcha::Lcha::clone", + "bevy_color::lcha::Lcha::eq", + "bevy_color::lcha::Lcha::lch", + "bevy_color::lcha::Lcha::new", + "bevy_color::lcha::Lcha::with_lightness", + "bevy_color::lcha::Lcha::with_chroma" + ], + "layout": { + "kind": "Struct", + "name": "Lcha", + "fields": [ + { + "name": "lightness", + "type": { + "primitive": "f32" + } + }, + { + "name": "chroma", + "type": { + "primitive": "f32" + } + }, + { + "name": "hue", + "type": { + "primitive": "f32" + } + }, + { + "name": "alpha", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_color::linear_rgba::LinearRgba": { + "identifier": "LinearRgba", + "crate": "bevy_color", + "path": "bevy_color::linear_rgba::LinearRgba", + "documentation": " Linear RGB color with alpha.\n
\n
", + "associated_functions": [ + "bevy_color::linear_rgba::LinearRgba::div", + "bevy_color::linear_rgba::LinearRgba::neg", + "bevy_color::linear_rgba::LinearRgba::mul", + "bevy_color::linear_rgba::LinearRgba::rgb", + "bevy_color::linear_rgba::LinearRgba::add", + "bevy_color::linear_rgba::LinearRgba::with_blue", + "bevy_color::linear_rgba::LinearRgba::clone", + "bevy_color::linear_rgba::LinearRgba::with_green", + "bevy_color::linear_rgba::LinearRgba::as_u32", + "bevy_color::linear_rgba::LinearRgba::new", + "bevy_color::linear_rgba::LinearRgba::eq", + "bevy_color::linear_rgba::LinearRgba::with_red", + "bevy_color::linear_rgba::LinearRgba::sub" + ], + "layout": { + "kind": "Struct", + "name": "LinearRgba", + "fields": [ + { + "name": "red", + "type": { + "primitive": "f32" + } + }, + { + "name": "green", + "type": { + "primitive": "f32" + } + }, + { + "name": "blue", + "type": { + "primitive": "f32" + } + }, + { + "name": "alpha", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_color::oklaba::Oklaba": { + "identifier": "Oklaba", + "crate": "bevy_color", + "path": "bevy_color::oklaba::Oklaba", + "documentation": " Color in Oklab color space, with alpha\n
\n
", + "associated_functions": [ + "bevy_color::oklaba::Oklaba::with_lightness", + "bevy_color::oklaba::Oklaba::add", + "bevy_color::oklaba::Oklaba::with_a", + "bevy_color::oklaba::Oklaba::new", + "bevy_color::oklaba::Oklaba::clone", + "bevy_color::oklaba::Oklaba::div", + "bevy_color::oklaba::Oklaba::mul", + "bevy_color::oklaba::Oklaba::sub", + "bevy_color::oklaba::Oklaba::with_b", + "bevy_color::oklaba::Oklaba::eq", + "bevy_color::oklaba::Oklaba::lab", + "bevy_color::oklaba::Oklaba::neg" + ], + "layout": { + "kind": "Struct", + "name": "Oklaba", + "fields": [ + { + "name": "lightness", + "type": { + "primitive": "f32" + } + }, + { + "name": "a", + "type": { + "primitive": "f32" + } + }, + { + "name": "b", + "type": { + "primitive": "f32" + } + }, + { + "name": "alpha", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_color::oklcha::Oklcha": { + "identifier": "Oklcha", + "crate": "bevy_color", + "path": "bevy_color::oklcha::Oklcha", + "documentation": " Color in Oklch color space, with alpha\n
\n
", + "associated_functions": [ + "bevy_color::oklcha::Oklcha::with_lightness", + "bevy_color::oklcha::Oklcha::sequential_dispersed", + "bevy_color::oklcha::Oklcha::with_chroma", + "bevy_color::oklcha::Oklcha::lch", + "bevy_color::oklcha::Oklcha::new", + "bevy_color::oklcha::Oklcha::clone", + "bevy_color::oklcha::Oklcha::eq" + ], + "layout": { + "kind": "Struct", + "name": "Oklcha", + "fields": [ + { + "name": "lightness", + "type": { + "primitive": "f32" + } + }, + { + "name": "chroma", + "type": { + "primitive": "f32" + } + }, + { + "name": "hue", + "type": { + "primitive": "f32" + } + }, + { + "name": "alpha", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_color::srgba::Srgba": { + "identifier": "Srgba", + "crate": "bevy_color", + "path": "bevy_color::srgba::Srgba", + "documentation": " Non-linear standard RGB with alpha.\n
\n
", + "associated_functions": [ + "bevy_color::srgba::Srgba::div", + "bevy_color::srgba::Srgba::sub", + "bevy_color::srgba::Srgba::rgba_u8", + "bevy_color::srgba::Srgba::gamma_function_inverse", + "bevy_color::srgba::Srgba::neg", + "bevy_color::srgba::Srgba::mul", + "bevy_color::srgba::Srgba::with_red", + "bevy_color::srgba::Srgba::rgb_u8", + "bevy_color::srgba::Srgba::rgb", + "bevy_color::srgba::Srgba::clone", + "bevy_color::srgba::Srgba::new", + "bevy_color::srgba::Srgba::to_hex", + "bevy_color::srgba::Srgba::eq", + "bevy_color::srgba::Srgba::gamma_function", + "bevy_color::srgba::Srgba::with_green", + "bevy_color::srgba::Srgba::add", + "bevy_color::srgba::Srgba::with_blue" + ], + "layout": { + "kind": "Struct", + "name": "Srgba", + "fields": [ + { + "name": "red", + "type": { + "primitive": "f32" + } + }, + { + "name": "green", + "type": { + "primitive": "f32" + } + }, + { + "name": "blue", + "type": { + "primitive": "f32" + } + }, + { + "name": "alpha", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_color::xyza::Xyza": { + "identifier": "Xyza", + "crate": "bevy_color", + "path": "bevy_color::xyza::Xyza", + "documentation": " [CIE 1931](https://en.wikipedia.org/wiki/CIE_1931_color_space) color space, also known as XYZ, with an alpha channel.\n
\n
", + "associated_functions": [ + "bevy_color::xyza::Xyza::sub", + "bevy_color::xyza::Xyza::clone", + "bevy_color::xyza::Xyza::div", + "bevy_color::xyza::Xyza::new", + "bevy_color::xyza::Xyza::xyz", + "bevy_color::xyza::Xyza::with_y", + "bevy_color::xyza::Xyza::eq", + "bevy_color::xyza::Xyza::mul", + "bevy_color::xyza::Xyza::with_x", + "bevy_color::xyza::Xyza::neg", + "bevy_color::xyza::Xyza::with_z", + "bevy_color::xyza::Xyza::add" + ], + "layout": { + "kind": "Struct", + "name": "Xyza", + "fields": [ + { + "name": "x", + "type": { + "primitive": "f32" + } + }, + { + "name": "y", + "type": { + "primitive": "f32" + } + }, + { + "name": "z", + "type": { + "primitive": "f32" + } + }, + { + "name": "alpha", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_core_pipeline::oit::OrderIndependentTransparencySettings": { + "identifier": "OrderIndependentTransparencySettings", + "crate": "bevy_core_pipeline", + "path": "bevy_core_pipeline::oit::OrderIndependentTransparencySettings", + "documentation": " Used to identify which camera will use OIT to render transparent meshes\n and to configure OIT.", + "associated_functions": [ + "bevy_core_pipeline::oit::OrderIndependentTransparencySettings::clone" + ], + "layout": { + "kind": "Struct", + "name": "OrderIndependentTransparencySettings", + "fields": [ + { + "name": "layer_count", + "type": { + "primitive": "i32" + } + }, + { + "name": "alpha_threshold", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_core_pipeline::prepass::DeferredPrepassDoubleBuffer": { + "identifier": "DeferredPrepassDoubleBuffer", + "crate": "bevy_core_pipeline", + "path": "bevy_core_pipeline::prepass::DeferredPrepassDoubleBuffer", + "documentation": " Allows querying the previous frame's [`DeferredPrepass`].", + "associated_functions": [ + "bevy_core_pipeline::prepass::DeferredPrepassDoubleBuffer::clone" + ], + "layout": { + "kind": "Struct", + "name": "DeferredPrepassDoubleBuffer" + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_core_pipeline::prepass::DepthPrepass": { + "identifier": "DepthPrepass", + "crate": "bevy_core_pipeline", + "path": "bevy_core_pipeline::prepass::DepthPrepass", + "documentation": " If added to a [`bevy_camera::Camera3d`] then depth values will be copied to a separate texture available to the main pass.", + "associated_functions": [ + "bevy_core_pipeline::prepass::DepthPrepass::clone" + ], + "layout": { + "kind": "Struct", + "name": "DepthPrepass" + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_core_pipeline::prepass::DepthPrepassDoubleBuffer": { + "identifier": "DepthPrepassDoubleBuffer", + "crate": "bevy_core_pipeline", + "path": "bevy_core_pipeline::prepass::DepthPrepassDoubleBuffer", + "documentation": " Allows querying the previous frame's [`DepthPrepass`].", + "associated_functions": [ + "bevy_core_pipeline::prepass::DepthPrepassDoubleBuffer::clone" + ], + "layout": { + "kind": "Struct", + "name": "DepthPrepassDoubleBuffer" + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_core_pipeline::prepass::MotionVectorPrepass": { + "identifier": "MotionVectorPrepass", + "crate": "bevy_core_pipeline", + "path": "bevy_core_pipeline::prepass::MotionVectorPrepass", + "documentation": " If added to a [`bevy_camera::Camera3d`] then screen space motion vectors will be copied to a separate texture available to the main pass.\n\n Motion vectors are stored in the range -1,1, with +x right and +y down.\n A value of (1.0,1.0) indicates a pixel moved from the top left corner to the bottom right corner of the screen.", + "associated_functions": [ + "bevy_core_pipeline::prepass::MotionVectorPrepass::clone" + ], + "layout": { + "kind": "Struct", + "name": "MotionVectorPrepass" + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_core_pipeline::prepass::NormalPrepass": { + "identifier": "NormalPrepass", + "crate": "bevy_core_pipeline", + "path": "bevy_core_pipeline::prepass::NormalPrepass", + "documentation": " If added to a [`bevy_camera::Camera3d`] then vertex world normals will be copied to a separate texture available to the main pass.\n Normals will have normal map textures already applied.", + "associated_functions": [ + "bevy_core_pipeline::prepass::NormalPrepass::clone" + ], + "layout": { + "kind": "Struct", + "name": "NormalPrepass" + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_core_pipeline::skybox::Skybox": { + "identifier": "Skybox", + "crate": "bevy_core_pipeline", + "path": "bevy_core_pipeline::skybox::Skybox", + "documentation": " Adds a skybox to a 3D camera, based on a cubemap texture.\n\n Note that this component does not (currently) affect the scene's lighting.\n To do so, use `EnvironmentMapLight` alongside this component.\n\n See also .", + "associated_functions": [ + "bevy_core_pipeline::skybox::Skybox::clone" + ], + "layout": { + "kind": "Struct", + "name": "Skybox", + "fields": [ + { + "name": "image", + "type": { + "val": "bevy_asset::handle::Handle" + } + }, + { + "name": "brightness", + "type": { + "primitive": "f32" + } + }, + { + "name": "rotation", + "type": { + "val": "glam::Quat" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_core_pipeline::tonemapping::DebandDither": { + "identifier": "DebandDither", + "crate": "bevy_core_pipeline", + "path": "bevy_core_pipeline::tonemapping::DebandDither", + "documentation": " Enables a debanding shader that applies dithering to mitigate color banding in the final image for a given [`Camera`] entity.", + "associated_functions": [ + "bevy_core_pipeline::tonemapping::DebandDither::eq", + "bevy_core_pipeline::tonemapping::DebandDither::clone", + "bevy_core_pipeline::tonemapping::DebandDither::assert_receiver_is_total_eq" + ], + "layout": [ + { + "kind": "Unit", + "name": "Disabled" + }, + { + "kind": "Unit", + "name": "Enabled" + } + ], + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_core_pipeline::tonemapping::Tonemapping": { + "identifier": "Tonemapping", + "crate": "bevy_core_pipeline", + "path": "bevy_core_pipeline::tonemapping::Tonemapping", + "documentation": " Optionally enables a tonemapping shader that attempts to map linear input stimulus into a perceptually uniform image for a given [`Camera`] entity.", + "associated_functions": [ + "bevy_core_pipeline::tonemapping::Tonemapping::clone", + "bevy_core_pipeline::tonemapping::Tonemapping::assert_receiver_is_total_eq", + "bevy_core_pipeline::tonemapping::Tonemapping::eq", + "bevy_core_pipeline::tonemapping::Tonemapping::is_enabled" + ], + "layout": [ + { + "kind": "Unit", + "name": "None" + }, + { + "kind": "Unit", + "name": "Reinhard" + }, + { + "kind": "Unit", + "name": "ReinhardLuminance" + }, + { + "kind": "Unit", + "name": "AcesFitted" + }, + { + "kind": "Unit", + "name": "AgX" + }, + { + "kind": "Unit", + "name": "SomewhatBoringDisplayTransform" + }, + { + "kind": "Unit", + "name": "TonyMcMapface" + }, + { + "kind": "Unit", + "name": "BlenderFilmic" + } + ], + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ecs::change_detection::tick::ComponentTicks": { + "identifier": "ComponentTicks", + "crate": "bevy_ecs", + "path": "bevy_ecs::change_detection::tick::ComponentTicks", + "documentation": " Records when a component or resource was added and when it was last mutably dereferenced (or added).", + "associated_functions": [ + "bevy_ecs::change_detection::tick::ComponentTicks::new", + "bevy_ecs::change_detection::tick::ComponentTicks::clone", + "bevy_ecs::change_detection::tick::ComponentTicks::is_changed", + "bevy_ecs::change_detection::tick::ComponentTicks::set_changed", + "bevy_ecs::change_detection::tick::ComponentTicks::is_added" + ], + "layout": { + "kind": "Struct", + "name": "ComponentTicks", + "fields": [ + { + "name": "added", + "type": { + "val": "bevy_ecs::change_detection::tick::Tick" + } + }, + { + "name": "changed", + "type": { + "val": "bevy_ecs::change_detection::tick::Tick" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ecs::change_detection::tick::Tick": { + "identifier": "Tick", + "crate": "bevy_ecs", + "path": "bevy_ecs::change_detection::tick::Tick", + "documentation": " A value that tracks when a system ran relative to other systems.\n This is used to power change detection.\n\n *Note* that a system that hasn't been run yet has a `Tick` of 0.", + "associated_functions": [ + "bevy_ecs::change_detection::tick::Tick::assert_receiver_is_total_eq", + "bevy_ecs::change_detection::tick::Tick::is_newer_than", + "bevy_ecs::change_detection::tick::Tick::get", + "bevy_ecs::change_detection::tick::Tick::set", + "bevy_ecs::change_detection::tick::Tick::new", + "bevy_ecs::change_detection::tick::Tick::clone", + "bevy_ecs::change_detection::tick::Tick::eq" + ], + "layout": { + "kind": "Struct", + "name": "Tick", + "fields": [ + { + "name": "tick", + "type": { + "primitive": "u32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ecs::component::info::ComponentId": { + "identifier": "ComponentId", + "crate": "bevy_ecs", + "path": "bevy_ecs::component::info::ComponentId", + "documentation": " A value which uniquely identifies the type of a [`Component`] or [`Resource`] within a\n [`World`](crate::world::World).\n\n Each time a new `Component` type is registered within a `World` using\n e.g. [`World::register_component`](crate::world::World::register_component) or\n [`World::register_component_with_descriptor`](crate::world::World::register_component_with_descriptor)\n or a Resource with e.g. [`World::init_resource`](crate::world::World::init_resource),\n a corresponding `ComponentId` is created to track it.\n\n While the distinction between `ComponentId` and [`TypeId`] may seem superficial, breaking them\n into two separate but related concepts allows components to exist outside of Rust's type system.\n Each Rust type registered as a `Component` will have a corresponding `ComponentId`, but additional\n `ComponentId`s may exist in a `World` to track components which cannot be\n represented as Rust types for scripting or other advanced use-cases.\n\n A `ComponentId` is tightly coupled to its parent `World`. Attempting to use a `ComponentId` from\n one `World` to access the metadata of a `Component` in a different `World` is undefined behavior\n and must not be attempted.\n\n Given a type `T` which implements [`Component`], the `ComponentId` for `T` can be retrieved\n from a `World` using [`World::component_id()`](crate::world::World::component_id) or via [`Components::component_id()`].\n Access to the `ComponentId` for a [`Resource`] is available via [`Components::resource_id()`].", + "associated_functions": [ + "bevy_ecs::component::info::ComponentId::index", + "bevy_ecs::component::info::ComponentId::eq", + "bevy_ecs::component::info::ComponentId::clone", + "bevy_ecs::component::info::ComponentId::new", + "bevy_ecs::component::info::ComponentId::assert_receiver_is_total_eq" + ], + "layout": { + "kind": "TupleStruct", + "name": "ComponentId", + "fields": [ + { + "type": { + "primitive": "usize" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ecs::entity::Entity": { + "identifier": "Entity", + "crate": "bevy_ecs", + "path": "bevy_ecs::entity::Entity", + "documentation": " Unique identifier for an entity in a [`World`].\n Note that this is just an id, not the entity itself.\n Further, the entity this id refers to may no longer exist in the [`World`].\n For more information about entities, their ids, and how to use them, see the module [docs](crate::entity).\n\n # Aliasing\n\n Once an entity is despawned, it ceases to exist.\n However, its [`Entity`] id is still present, and may still be contained in some data.\n This becomes problematic because it is possible for a later entity to be spawned at the exact same id!\n If this happens, which is rare but very possible, it will be logged.\n\n Aliasing can happen without warning.\n Holding onto a [`Entity`] id corresponding to an entity well after that entity was despawned can cause un-intuitive behavior for both ordering, and comparing in general.\n To prevent these bugs, it is generally best practice to stop holding an [`Entity`] or [`EntityGeneration`] value as soon as you know it has been despawned.\n If you must do otherwise, do not assume the [`Entity`] id corresponds to the same entity it originally did.\n See [`EntityGeneration`]'s docs for more information about aliasing and why it occurs.\n\n # Stability warning\n For all intents and purposes, `Entity` should be treated as an opaque identifier. The internal bit\n representation is liable to change from release to release as are the behaviors or performance\n characteristics of any of its trait implementations (i.e. `Ord`, `Hash`, etc.). This means that changes in\n `Entity`'s representation, though made readable through various functions on the type, are not considered\n breaking changes under [SemVer].\n\n In particular, directly serializing with `Serialize` and `Deserialize` make zero guarantee of long\n term wire format compatibility. Changes in behavior will cause serialized `Entity` values persisted\n to long term storage (i.e. disk, databases, etc.) will fail to deserialize upon being updated.\n\n # Usage\n\n This data type is returned by iterating a `Query` that has `Entity` as part of its query fetch type parameter ([learn more]).\n It can also be obtained by calling [`EntityCommands::id`] or [`EntityWorldMut::id`].\n\n ```\n # use bevy_ecs::prelude::*;\n # #[derive(Component)]\n # struct SomeComponent;\n fn setup(mut commands: Commands) {\n // Calling `spawn` returns `EntityCommands`.\n let entity = commands.spawn(SomeComponent).id();\n }\n\n fn exclusive_system(world: &mut World) {\n // Calling `spawn` returns `EntityWorldMut`.\n let entity = world.spawn(SomeComponent).id();\n }\n #\n # bevy_ecs::system::assert_is_system(setup);\n # bevy_ecs::system::assert_is_system(exclusive_system);\n ```\n\n It can be used to refer to a specific entity to apply [`EntityCommands`], or to call [`Query::get`] (or similar methods) to access its components.\n\n ```\n # use bevy_ecs::prelude::*;\n #\n # #[derive(Component)]\n # struct Expired;\n #\n fn dispose_expired_food(mut commands: Commands, query: Query>) {\n for food_entity in &query {\n commands.entity(food_entity).despawn();\n }\n }\n #\n # bevy_ecs::system::assert_is_system(dispose_expired_food);\n ```\n\n [learn more]: crate::system::Query#entity-id-access\n [`EntityCommands::id`]: crate::system::EntityCommands::id\n [`EntityWorldMut::id`]: crate::world::EntityWorldMut::id\n [`EntityCommands`]: crate::system::EntityCommands\n [`Query::get`]: crate::system::Query::get\n [`World`]: crate::world::World\n [SemVer]: https://semver.org/", + "associated_functions": [ + "bevy_ecs::entity::Entity::to_bits", + "bevy_ecs::entity::Entity::eq", + "bevy_ecs::entity::Entity::index_u32", + "bevy_ecs::entity::Entity::generation", + "bevy_ecs::entity::Entity::from_bits", + "bevy_ecs::entity::Entity::from_index", + "bevy_ecs::entity::Entity::clone", + "bevy_ecs::entity::Entity::index", + "bevy_ecs::entity::Entity::from_index_and_generation" + ], + "layout": null, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ecs::entity::EntityGeneration": { + "identifier": "EntityGeneration", + "crate": "bevy_ecs", + "path": "bevy_ecs::entity::EntityGeneration", + "documentation": " This tracks different versions or generations of an [`EntityIndex`].\n Importantly, this can wrap, meaning each generation is not necessarily unique per [`EntityIndex`].\n\n This should be treated as a opaque identifier, and its internal representation may be subject to change.\n\n # Aliasing\n\n Internally [`EntityGeneration`] wraps a `u32`, so it can't represent *every* possible generation.\n Eventually, generations can (and do) wrap or alias.\n This can cause [`Entity`] and [`EntityGeneration`] values to be equal while still referring to different conceptual entities.\n This can cause some surprising behavior:\n\n ```\n # use bevy_ecs::entity::EntityGeneration;\n let (aliased, did_alias) = EntityGeneration::FIRST.after_versions(1u32 << 31).after_versions_and_could_alias(1u32 << 31);\n assert!(did_alias);\n assert!(EntityGeneration::FIRST == aliased);\n ```\n\n This can cause some unintended side effects.\n See [`Entity`] docs for practical concerns and how to minimize any risks.", + "associated_functions": [ + "bevy_ecs::entity::EntityGeneration::assert_receiver_is_total_eq", + "bevy_ecs::entity::EntityGeneration::eq", + "bevy_ecs::entity::EntityGeneration::clone", + "bevy_ecs::entity::EntityGeneration::to_bits", + "bevy_ecs::entity::EntityGeneration::after_versions", + "bevy_ecs::entity::EntityGeneration::from_bits" + ], + "layout": null, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ecs::entity::EntityIndex": { + "identifier": "EntityIndex", + "crate": "bevy_ecs", + "path": "bevy_ecs::entity::EntityIndex", + "documentation": " This represents the index of an [`Entity`] within the [`Entities`] array.\n This is a lighter weight version of [`Entity`].\n\n This is a unique identifier for an entity in the world.\n This differs from [`Entity`] in that [`Entity`] is unique for all entities total (unless the [`Entity::generation`] wraps),\n but this is only unique for entities that are active.\n\n This can be used over [`Entity`] to improve performance in some cases,\n but improper use can cause this to identify a different entity than intended.\n Use with caution.", + "associated_functions": [ + "bevy_ecs::entity::EntityIndex::eq", + "bevy_ecs::entity::EntityIndex::index", + "bevy_ecs::entity::EntityIndex::assert_receiver_is_total_eq", + "bevy_ecs::entity::EntityIndex::clone" + ], + "layout": null, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ecs::entity::hash::EntityHash": { + "identifier": "EntityHash", + "crate": "bevy_ecs", + "path": "bevy_ecs::entity::hash::EntityHash", + "documentation": " A [`BuildHasher`] that results in a [`EntityHasher`].", + "associated_functions": [ + "bevy_ecs::entity::hash::EntityHash::clone" + ], + "layout": { + "kind": "Struct", + "name": "EntityHash" + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ecs::entity::hash_set::EntityHashSet": { + "identifier": "EntityHashSet", + "crate": "bevy_ecs", + "path": "bevy_ecs::entity::hash_set::EntityHashSet", + "documentation": " A [`HashSet`] pre-configured to use [`EntityHash`] hashing.", + "associated_functions": [ + "bevy_ecs::entity::hash_set::EntityHashSet::assert_receiver_is_total_eq", + "bevy_ecs::entity::hash_set::EntityHashSet::clone", + "bevy_ecs::entity::hash_set::EntityHashSet::with_capacity", + "bevy_ecs::entity::hash_set::EntityHashSet::len", + "bevy_ecs::entity::hash_set::EntityHashSet::new", + "bevy_ecs::entity::hash_set::EntityHashSet::eq", + "bevy_ecs::entity::hash_set::EntityHashSet::is_empty" + ], + "layout": { + "kind": "TupleStruct", + "name": "EntityHashSet", + "fields": [ + { + "type": { + "val": "bevy_platform::collections::HashSet" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ecs::entity::index_set::EntityIndexSet": { + "identifier": "EntityIndexSet", + "crate": "bevy_ecs", + "path": "bevy_ecs::entity::index_set::EntityIndexSet", + "documentation": " An [`IndexSet`] pre-configured to use [`EntityHash`] hashing.", + "associated_functions": [ + "bevy_ecs::entity::index_set::EntityIndexSet::with_capacity", + "bevy_ecs::entity::index_set::EntityIndexSet::eq", + "bevy_ecs::entity::index_set::EntityIndexSet::new", + "bevy_ecs::entity::index_set::EntityIndexSet::clone" + ], + "layout": { + "kind": "TupleStruct", + "name": "EntityIndexSet", + "fields": [ + { + "type": { + "val": "indexmap::IndexSet" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ecs::entity_disabling::DefaultQueryFilters": { + "identifier": "DefaultQueryFilters", + "crate": "bevy_ecs", + "path": "bevy_ecs::entity_disabling::DefaultQueryFilters", + "documentation": " Default query filters work by excluding entities with certain components from most queries.\n\n If a query does not explicitly mention a given disabling component, it will not include entities with that component.\n To be more precise, this checks if the query's [`FilteredAccess`] contains the component,\n and if it does not, adds a [`Without`](crate::prelude::Without) filter for that component to the query.\n\n [`Allow`](crate::query::Allow) and [`Has`](crate::prelude::Has) can be used to include entities\n with and without the disabling component.\n [`Allow`](crate::query::Allow) is a [`QueryFilter`](crate::query::QueryFilter) and will simply change\n the list of shown entities, while [`Has`](crate::prelude::Has) is a [`QueryData`](crate::query::QueryData)\n and will allow you to see if each entity has the disabling component or not.\n\n This resource is initialized in the [`World`] whenever a new world is created,\n with the [`Disabled`] component as a disabling component.\n\n Note that you can remove default query filters by overwriting the [`DefaultQueryFilters`] resource.\n This can be useful as a last resort escape hatch, but is liable to break compatibility with other libraries.\n\n See the [module docs](crate::entity_disabling) for more info.\n\n\n # Warning\n\n Default query filters are a global setting that affects all queries in the [`World`],\n and incur a small performance cost for each query.\n\n They can cause significant interoperability issues within the ecosystem,\n as users must be aware of each disabling component in use.\n\n Think carefully about whether you need to use a new disabling component,\n and clearly communicate their presence in any libraries you publish.", + "associated_functions": [ + "bevy_ecs::entity_disabling::DefaultQueryFilters::empty", + "bevy_ecs::entity_disabling::DefaultQueryFilters::register_disabling_component" + ], + "layout": { + "kind": "Struct", + "name": "DefaultQueryFilters", + "fields": [ + { + "name": "disabling", + "type": { + "vec": { + "val": "bevy_ecs::component::info::ComponentId" + } + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ecs::entity_disabling::Disabled": { + "identifier": "Disabled", + "crate": "bevy_ecs", + "path": "bevy_ecs::entity_disabling::Disabled", + "documentation": " A marker component for disabled entities.\n\n Semantically, this component is used to mark entities that are temporarily disabled (typically for gameplay reasons),\n but will likely be re-enabled at some point.\n\n Like all disabling components, this only disables the entity itself,\n not its children or other entities that reference it.\n To disable an entire tree of entities, use [`EntityCommands::insert_recursive`](crate::prelude::EntityCommands::insert_recursive).\n\n Every [`World`] has a default query filter that excludes entities with this component,\n registered in the [`DefaultQueryFilters`] resource.\n See [the module docs] for more info.\n\n [the module docs]: crate::entity_disabling", + "associated_functions": [ + "bevy_ecs::entity_disabling::Disabled::clone" + ], + "layout": { + "kind": "Struct", + "name": "Disabled" + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ecs::hierarchy::ChildOf": { + "identifier": "ChildOf", + "crate": "bevy_ecs", + "path": "bevy_ecs::hierarchy::ChildOf", + "documentation": " Stores the parent entity of this child entity with this component.\n\n This is a [`Relationship`] component, and creates the canonical\n \"parent / child\" hierarchy. This is the \"source of truth\" component, and it pairs with\n the [`Children`] [`RelationshipTarget`](crate::relationship::RelationshipTarget).\n\n This relationship should be used for things like:\n\n 1. Organizing entities in a scene\n 2. Propagating configuration or data inherited from a parent, such as \"visibility\" or \"world-space global transforms\".\n 3. Ensuring a hierarchy is despawned when an entity is despawned.\n\n [`ChildOf`] contains a single \"target\" [`Entity`]. When [`ChildOf`] is inserted on a \"source\" entity,\n the \"target\" entity will automatically (and immediately, via a component hook) have a [`Children`]\n component inserted, and the \"source\" entity will be added to that [`Children`] instance.\n\n If the [`ChildOf`] component is replaced with a different \"target\" entity, the old target's [`Children`]\n will be automatically (and immediately, via a component hook) be updated to reflect that change.\n\n Likewise, when the [`ChildOf`] component is removed, the \"source\" entity will be removed from the old\n target's [`Children`]. If this results in [`Children`] being empty, [`Children`] will be automatically removed.\n\n When a parent is despawned, all children (and their descendants) will _also_ be despawned.\n\n You can create parent-child relationships in a variety of ways. The most direct way is to insert a [`ChildOf`] component:\n\n ```\n # use bevy_ecs::prelude::*;\n # let mut world = World::new();\n let root = world.spawn_empty().id();\n let child1 = world.spawn(ChildOf(root)).id();\n let child2 = world.spawn(ChildOf(root)).id();\n let grandchild = world.spawn(ChildOf(child1)).id();\n\n assert_eq!(&**world.entity(root).get::().unwrap(), &[child1, child2]);\n assert_eq!(&**world.entity(child1).get::().unwrap(), &[grandchild]);\n\n world.entity_mut(child2).remove::();\n assert_eq!(&**world.entity(root).get::().unwrap(), &[child1]);\n\n world.entity_mut(root).despawn();\n assert!(world.get_entity(root).is_err());\n assert!(world.get_entity(child1).is_err());\n assert!(world.get_entity(grandchild).is_err());\n ```\n\n However if you are spawning many children, you might want to use the [`EntityWorldMut::with_children`] helper instead:\n\n ```\n # use bevy_ecs::prelude::*;\n # let mut world = World::new();\n let mut child1 = Entity::PLACEHOLDER;\n let mut child2 = Entity::PLACEHOLDER;\n let mut grandchild = Entity::PLACEHOLDER;\n let root = world.spawn_empty().with_children(|p| {\n child1 = p.spawn_empty().with_children(|p| {\n grandchild = p.spawn_empty().id();\n }).id();\n child2 = p.spawn_empty().id();\n }).id();\n\n assert_eq!(&**world.entity(root).get::().unwrap(), &[child1, child2]);\n assert_eq!(&**world.entity(child1).get::().unwrap(), &[grandchild]);\n ```\n\n [`Relationship`]: crate::relationship::Relationship", + "associated_functions": [ + "bevy_ecs::hierarchy::ChildOf::parent", + "bevy_ecs::hierarchy::ChildOf::assert_receiver_is_total_eq", + "bevy_ecs::hierarchy::ChildOf::eq", + "bevy_ecs::hierarchy::ChildOf::clone" + ], + "layout": { + "kind": "TupleStruct", + "name": "ChildOf", + "fields": [ + { + "type": { + "val": "bevy_ecs::entity::Entity" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ecs::hierarchy::Children": { + "identifier": "Children", + "crate": "bevy_ecs", + "path": "bevy_ecs::hierarchy::Children", + "documentation": " Tracks which entities are children of this parent entity.\n\n A [`RelationshipTarget`] collection component that is populated\n with entities that \"target\" this entity with the [`ChildOf`] [`Relationship`] component.\n\n Together, these components form the \"canonical parent-child hierarchy\". See the [`ChildOf`] component for the full\n description of this relationship and instructions on how to use it.\n\n # Usage\n\n Like all [`RelationshipTarget`] components, this data should not be directly manipulated to avoid desynchronization.\n Instead, modify the [`ChildOf`] components on the \"source\" entities.\n\n To access the children of an entity, you can iterate over the [`Children`] component,\n using the [`IntoIterator`] trait.\n For more complex access patterns, see the [`RelationshipTarget`] trait.\n\n [`Relationship`]: crate::relationship::Relationship\n [`RelationshipTarget`]: crate::relationship::RelationshipTarget", + "associated_functions": [ + "bevy_ecs::hierarchy::Children::swap", + "bevy_ecs::hierarchy::Children::assert_receiver_is_total_eq", + "bevy_ecs::hierarchy::Children::eq" + ], + "layout": { + "kind": "TupleStruct", + "name": "Children", + "fields": [ + { + "type": { + "vec": { + "val": "bevy_ecs::entity::Entity" + } + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ecs::lifecycle::Add": { + "identifier": "Add", + "crate": "bevy_ecs", + "path": "bevy_ecs::lifecycle::Add", + "documentation": " Trigger emitted when a component is inserted onto an entity that does not already have that\n component. Runs before `Insert`.\n See [`ComponentHooks::on_add`](`crate::lifecycle::ComponentHooks::on_add`) for more information.", + "associated_functions": [ + "bevy_ecs::lifecycle::Add::clone" + ], + "layout": { + "kind": "Struct", + "name": "Add", + "fields": [ + { + "name": "entity", + "type": { + "val": "bevy_ecs::entity::Entity" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ecs::lifecycle::Despawn": { + "identifier": "Despawn", + "crate": "bevy_ecs", + "path": "bevy_ecs::lifecycle::Despawn", + "documentation": " [`EntityEvent`] emitted for each component on an entity when it is despawned.\n See [`ComponentHooks::on_despawn`](`crate::lifecycle::ComponentHooks::on_despawn`) for more information.", + "associated_functions": [ + "bevy_ecs::lifecycle::Despawn::clone" + ], + "layout": { + "kind": "Struct", + "name": "Despawn", + "fields": [ + { + "name": "entity", + "type": { + "val": "bevy_ecs::entity::Entity" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ecs::lifecycle::Insert": { + "identifier": "Insert", + "crate": "bevy_ecs", + "path": "bevy_ecs::lifecycle::Insert", + "documentation": " Trigger emitted when a component is inserted, regardless of whether or not the entity already\n had that component. Runs after `Add`, if it ran.\n See [`ComponentHooks::on_insert`](`crate::lifecycle::ComponentHooks::on_insert`) for more information.", + "associated_functions": [ + "bevy_ecs::lifecycle::Insert::clone" + ], + "layout": { + "kind": "Struct", + "name": "Insert", + "fields": [ + { + "name": "entity", + "type": { + "val": "bevy_ecs::entity::Entity" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ecs::lifecycle::Remove": { + "identifier": "Remove", + "crate": "bevy_ecs", + "path": "bevy_ecs::lifecycle::Remove", + "documentation": " Trigger emitted when a component is removed from an entity, and runs before the component is\n removed, so you can still access the component data.\n See [`ComponentHooks::on_remove`](`crate::lifecycle::ComponentHooks::on_remove`) for more information.", + "associated_functions": [ + "bevy_ecs::lifecycle::Remove::clone" + ], + "layout": { + "kind": "Struct", + "name": "Remove", + "fields": [ + { + "name": "entity", + "type": { + "val": "bevy_ecs::entity::Entity" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ecs::lifecycle::RemovedComponentEntity": { + "identifier": "RemovedComponentEntity", + "crate": "bevy_ecs", + "path": "bevy_ecs::lifecycle::RemovedComponentEntity", + "documentation": " Wrapper around [`Entity`] for [`RemovedComponents`].\n Internally, `RemovedComponents` uses these as an [`Messages`].", + "associated_functions": [ + "bevy_ecs::lifecycle::RemovedComponentEntity::clone" + ], + "layout": { + "kind": "TupleStruct", + "name": "RemovedComponentEntity", + "fields": [ + { + "type": { + "val": "bevy_ecs::entity::Entity" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ecs::lifecycle::Replace": { + "identifier": "Replace", + "crate": "bevy_ecs", + "path": "bevy_ecs::lifecycle::Replace", + "documentation": " Trigger emitted when a component is removed from an entity, regardless\n of whether or not it is later replaced.\n\n Runs before the value is replaced, so you can still access the original component data.\n See [`ComponentHooks::on_replace`](`crate::lifecycle::ComponentHooks::on_replace`) for more information.", + "associated_functions": [ + "bevy_ecs::lifecycle::Replace::clone" + ], + "layout": { + "kind": "Struct", + "name": "Replace", + "fields": [ + { + "name": "entity", + "type": { + "val": "bevy_ecs::entity::Entity" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ecs::name::Name": { + "identifier": "Name", + "crate": "bevy_ecs", + "path": "bevy_ecs::name::Name", + "documentation": " Component used to identify an entity. Stores a hash for faster comparisons.\n\n The hash is eagerly re-computed upon each update to the name.\n\n [`Name`] should not be treated as a globally unique identifier for entities,\n as multiple entities can have the same name. [`Entity`] should be\n used instead as the default unique identifier.", + "associated_functions": [ + "bevy_ecs::name::Name::clone", + "bevy_ecs::name::Name::eq" + ], + "layout": { + "kind": "Struct", + "name": "Name", + "fields": [ + { + "name": "hash", + "type": { + "primitive": "u64" + } + }, + { + "name": "name", + "type": { + "val": "alloc::borrow::Cow" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::ButtonState": { + "identifier": "ButtonState", + "crate": "bevy_input", + "path": "bevy_input::ButtonState", + "documentation": " The current \"press\" state of an element", + "associated_functions": [ + "bevy_input::ButtonState::clone", + "bevy_input::ButtonState::eq", + "bevy_input::ButtonState::is_pressed", + "bevy_input::ButtonState::assert_receiver_is_total_eq" + ], + "layout": [ + { + "kind": "Unit", + "name": "Pressed" + }, + { + "kind": "Unit", + "name": "Released" + } + ], + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::gamepad::AxisSettings": { + "identifier": "AxisSettings", + "crate": "bevy_input", + "path": "bevy_input::gamepad::AxisSettings", + "documentation": " Settings for a [`GamepadAxis`].\n\n It is used inside the [`GamepadSettings`] to define the sensitivity range and\n threshold for an axis.\n Values that are higher than `livezone_upperbound` will be rounded up to 1.0.\n Values that are lower than `livezone_lowerbound` will be rounded down to -1.0.\n Values that are in-between `deadzone_lowerbound` and `deadzone_upperbound` will be rounded to 0.0.\n Otherwise, values will be linearly rescaled to fit into the sensitivity range.\n For example, a value that is one fourth of the way from `deadzone_upperbound` to `livezone_upperbound` will be scaled to 0.25.\n\n The valid range is `[-1.0, 1.0]`.", + "associated_functions": [ + "bevy_input::gamepad::AxisSettings::threshold", + "bevy_input::gamepad::AxisSettings::set_livezone_upperbound", + "bevy_input::gamepad::AxisSettings::deadzone_lowerbound", + "bevy_input::gamepad::AxisSettings::set_threshold", + "bevy_input::gamepad::AxisSettings::set_deadzone_lowerbound", + "bevy_input::gamepad::AxisSettings::livezone_lowerbound", + "bevy_input::gamepad::AxisSettings::livezone_upperbound", + "bevy_input::gamepad::AxisSettings::clone", + "bevy_input::gamepad::AxisSettings::set_deadzone_upperbound", + "bevy_input::gamepad::AxisSettings::eq", + "bevy_input::gamepad::AxisSettings::clamp", + "bevy_input::gamepad::AxisSettings::deadzone_upperbound", + "bevy_input::gamepad::AxisSettings::set_livezone_lowerbound" + ], + "layout": { + "kind": "Struct", + "name": "AxisSettings", + "fields": [ + { + "name": "livezone_upperbound", + "type": { + "primitive": "f32" + } + }, + { + "name": "deadzone_upperbound", + "type": { + "primitive": "f32" + } + }, + { + "name": "deadzone_lowerbound", + "type": { + "primitive": "f32" + } + }, + { + "name": "livezone_lowerbound", + "type": { + "primitive": "f32" + } + }, + { + "name": "threshold", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::gamepad::ButtonAxisSettings": { + "identifier": "ButtonAxisSettings", + "crate": "bevy_input", + "path": "bevy_input::gamepad::ButtonAxisSettings", + "documentation": " Settings for a [`GamepadButton`].\n\n It is used inside the [`GamepadSettings`] to define the sensitivity range and\n threshold for a button axis.\n\n ## Logic\n\n - Values that are higher than or equal to `high` will be rounded to 1.0.\n - Values that are lower than or equal to `low` will be rounded to 0.0.\n - Otherwise, values will not be rounded.\n\n The valid range is from 0.0 to 1.0, inclusive.", + "associated_functions": [ + "bevy_input::gamepad::ButtonAxisSettings::clone" + ], + "layout": { + "kind": "Struct", + "name": "ButtonAxisSettings", + "fields": [ + { + "name": "high", + "type": { + "primitive": "f32" + } + }, + { + "name": "low", + "type": { + "primitive": "f32" + } + }, + { + "name": "threshold", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::gamepad::ButtonSettings": { + "identifier": "ButtonSettings", + "crate": "bevy_input", + "path": "bevy_input::gamepad::ButtonSettings", + "documentation": " Manages settings for gamepad buttons.\n\n It is used inside [`GamepadSettings`] to define the threshold for a [`GamepadButton`]\n to be considered pressed or released. A button is considered pressed if the `press_threshold`\n value is surpassed and released if the `release_threshold` value is undercut.\n\n Allowed values: `0.0 <= ``release_threshold`` <= ``press_threshold`` <= 1.0`", + "associated_functions": [ + "bevy_input::gamepad::ButtonSettings::set_press_threshold", + "bevy_input::gamepad::ButtonSettings::release_threshold", + "bevy_input::gamepad::ButtonSettings::eq", + "bevy_input::gamepad::ButtonSettings::is_released", + "bevy_input::gamepad::ButtonSettings::press_threshold", + "bevy_input::gamepad::ButtonSettings::clone", + "bevy_input::gamepad::ButtonSettings::set_release_threshold", + "bevy_input::gamepad::ButtonSettings::is_pressed" + ], + "layout": { + "kind": "Struct", + "name": "ButtonSettings", + "fields": [ + { + "name": "press_threshold", + "type": { + "primitive": "f32" + } + }, + { + "name": "release_threshold", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::gamepad::Gamepad": { + "identifier": "Gamepad", + "crate": "bevy_input", + "path": "bevy_input::gamepad::Gamepad", + "documentation": " Stores a connected gamepad's metadata such as the name and its [`GamepadButton`] and [`GamepadAxis`].\n\n An entity with this component is spawned automatically after [`GamepadConnectionEvent`]\n and updated by [`gamepad_event_processing_system`].\n\n See also [`GamepadSettings`] for configuration.\n\n # Examples\n\n ```\n # use bevy_input::gamepad::{Gamepad, GamepadAxis, GamepadButton};\n # use bevy_ecs::system::Query;\n # use bevy_ecs::name::Name;\n #\n fn gamepad_usage_system(gamepads: Query<(&Name, &Gamepad)>) {\n for (name, gamepad) in &gamepads {\n println!(\"{name}\");\n\n if gamepad.just_pressed(GamepadButton::North) {\n println!(\"{} just pressed North\", name)\n }\n\n if let Some(left_stick_x) = gamepad.get(GamepadAxis::LeftStickX) {\n println!(\"left stick X: {}\", left_stick_x)\n }\n }\n }\n ```", + "associated_functions": [ + "bevy_input::gamepad::Gamepad::just_released", + "bevy_input::gamepad::Gamepad::right_stick", + "bevy_input::gamepad::Gamepad::vendor_id", + "bevy_input::gamepad::Gamepad::product_id", + "bevy_input::gamepad::Gamepad::pressed", + "bevy_input::gamepad::Gamepad::just_pressed", + "bevy_input::gamepad::Gamepad::left_stick", + "bevy_input::gamepad::Gamepad::dpad" + ], + "layout": { + "kind": "Struct", + "name": "Gamepad", + "fields": [ + { + "name": "vendor_id", + "type": { + "option": { + "primitive": "u16" + } + } + }, + { + "name": "product_id", + "type": { + "option": { + "primitive": "u16" + } + } + }, + { + "name": "digital", + "type": { + "val": "bevy_input::button_input::ButtonInput" + } + }, + { + "name": "analog", + "type": { + "val": "bevy_input::axis::Axis" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::gamepad::GamepadAxis": { + "identifier": "GamepadAxis", + "crate": "bevy_input", + "path": "bevy_input::gamepad::GamepadAxis", + "documentation": " Represents gamepad input types that are mapped in the range [-1.0, 1.0].\n\n ## Usage\n\n This is used to determine which axis has changed its value when receiving a\n gamepad axis event. It is also used in the [`Gamepad`] component.", + "associated_functions": [ + "bevy_input::gamepad::GamepadAxis::assert_receiver_is_total_eq", + "bevy_input::gamepad::GamepadAxis::eq", + "bevy_input::gamepad::GamepadAxis::clone" + ], + "layout": [ + { + "kind": "Unit", + "name": "LeftStickX" + }, + { + "kind": "Unit", + "name": "LeftStickY" + }, + { + "kind": "Unit", + "name": "LeftZ" + }, + { + "kind": "Unit", + "name": "RightStickX" + }, + { + "kind": "Unit", + "name": "RightStickY" + }, + { + "kind": "Unit", + "name": "RightZ" + }, + { + "kind": "TupleStruct", + "name": "Other", + "fields": [ + { + "type": { + "primitive": "u8" + } + } + ] + } + ], + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::gamepad::GamepadAxisChangedEvent": { + "identifier": "GamepadAxisChangedEvent", + "crate": "bevy_input", + "path": "bevy_input::gamepad::GamepadAxisChangedEvent", + "documentation": " [`GamepadAxis`] event triggered by an analog state change.", + "associated_functions": [ + "bevy_input::gamepad::GamepadAxisChangedEvent::clone", + "bevy_input::gamepad::GamepadAxisChangedEvent::new", + "bevy_input::gamepad::GamepadAxisChangedEvent::eq" + ], + "layout": { + "kind": "Struct", + "name": "GamepadAxisChangedEvent", + "fields": [ + { + "name": "entity", + "type": { + "val": "bevy_ecs::entity::Entity" + } + }, + { + "name": "axis", + "type": { + "val": "bevy_input::gamepad::GamepadAxis" + } + }, + { + "name": "value", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::gamepad::GamepadButton": { + "identifier": "GamepadButton", + "crate": "bevy_input", + "path": "bevy_input::gamepad::GamepadButton", + "documentation": " Represents gamepad input types that are mapped in the range [0.0, 1.0].\n\n ## Usage\n\n This is used to determine which button has changed its value when receiving gamepad button events.\n It is also used in the [`Gamepad`] component.", + "associated_functions": [ + "bevy_input::gamepad::GamepadButton::eq", + "bevy_input::gamepad::GamepadButton::assert_receiver_is_total_eq", + "bevy_input::gamepad::GamepadButton::clone" + ], + "layout": [ + { + "kind": "Unit", + "name": "South" + }, + { + "kind": "Unit", + "name": "East" + }, + { + "kind": "Unit", + "name": "North" + }, + { + "kind": "Unit", + "name": "West" + }, + { + "kind": "Unit", + "name": "C" + }, + { + "kind": "Unit", + "name": "Z" + }, + { + "kind": "Unit", + "name": "LeftTrigger" + }, + { + "kind": "Unit", + "name": "LeftTrigger2" + }, + { + "kind": "Unit", + "name": "RightTrigger" + }, + { + "kind": "Unit", + "name": "RightTrigger2" + }, + { + "kind": "Unit", + "name": "Select" + }, + { + "kind": "Unit", + "name": "Start" + }, + { + "kind": "Unit", + "name": "Mode" + }, + { + "kind": "Unit", + "name": "LeftThumb" + }, + { + "kind": "Unit", + "name": "RightThumb" + }, + { + "kind": "Unit", + "name": "DPadUp" + }, + { + "kind": "Unit", + "name": "DPadDown" + }, + { + "kind": "Unit", + "name": "DPadLeft" + }, + { + "kind": "Unit", + "name": "DPadRight" + }, + { + "kind": "TupleStruct", + "name": "Other", + "fields": [ + { + "type": { + "primitive": "u8" + } + } + ] + } + ], + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::gamepad::GamepadButtonChangedEvent": { + "identifier": "GamepadButtonChangedEvent", + "crate": "bevy_input", + "path": "bevy_input::gamepad::GamepadButtonChangedEvent", + "documentation": " [`GamepadButton`] event triggered by an analog state change.", + "associated_functions": [ + "bevy_input::gamepad::GamepadButtonChangedEvent::new", + "bevy_input::gamepad::GamepadButtonChangedEvent::eq", + "bevy_input::gamepad::GamepadButtonChangedEvent::clone" + ], + "layout": { + "kind": "Struct", + "name": "GamepadButtonChangedEvent", + "fields": [ + { + "name": "entity", + "type": { + "val": "bevy_ecs::entity::Entity" + } + }, + { + "name": "button", + "type": { + "val": "bevy_input::gamepad::GamepadButton" + } + }, + { + "name": "state", + "type": { + "val": "bevy_input::ButtonState" + } + }, + { + "name": "value", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::gamepad::GamepadButtonStateChangedEvent": { + "identifier": "GamepadButtonStateChangedEvent", + "crate": "bevy_input", + "path": "bevy_input::gamepad::GamepadButtonStateChangedEvent", + "documentation": " [`GamepadButton`] event triggered by a digital state change.", + "associated_functions": [ + "bevy_input::gamepad::GamepadButtonStateChangedEvent::eq", + "bevy_input::gamepad::GamepadButtonStateChangedEvent::clone", + "bevy_input::gamepad::GamepadButtonStateChangedEvent::new", + "bevy_input::gamepad::GamepadButtonStateChangedEvent::assert_receiver_is_total_eq" + ], + "layout": { + "kind": "Struct", + "name": "GamepadButtonStateChangedEvent", + "fields": [ + { + "name": "entity", + "type": { + "val": "bevy_ecs::entity::Entity" + } + }, + { + "name": "button", + "type": { + "val": "bevy_input::gamepad::GamepadButton" + } + }, + { + "name": "state", + "type": { + "val": "bevy_input::ButtonState" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::gamepad::GamepadConnection": { + "identifier": "GamepadConnection", + "crate": "bevy_input", + "path": "bevy_input::gamepad::GamepadConnection", + "documentation": " The connection status of a gamepad.", + "associated_functions": [ + "bevy_input::gamepad::GamepadConnection::clone", + "bevy_input::gamepad::GamepadConnection::eq" + ], + "layout": [ + { + "kind": "Struct", + "name": "Connected", + "fields": [ + { + "name": "name", + "type": { + "primitive": "string" + } + }, + { + "name": "vendor_id", + "type": { + "option": { + "primitive": "u16" + } + } + }, + { + "name": "product_id", + "type": { + "option": { + "primitive": "u16" + } + } + } + ] + }, + { + "kind": "Unit", + "name": "Disconnected" + } + ], + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::gamepad::GamepadConnectionEvent": { + "identifier": "GamepadConnectionEvent", + "crate": "bevy_input", + "path": "bevy_input::gamepad::GamepadConnectionEvent", + "documentation": " A [`Gamepad`] connection event. Created when a connection to a gamepad\n is established and when a gamepad is disconnected.", + "associated_functions": [ + "bevy_input::gamepad::GamepadConnectionEvent::disconnected", + "bevy_input::gamepad::GamepadConnectionEvent::clone", + "bevy_input::gamepad::GamepadConnectionEvent::eq", + "bevy_input::gamepad::GamepadConnectionEvent::connected", + "bevy_input::gamepad::GamepadConnectionEvent::new" + ], + "layout": { + "kind": "Struct", + "name": "GamepadConnectionEvent", + "fields": [ + { + "name": "gamepad", + "type": { + "val": "bevy_ecs::entity::Entity" + } + }, + { + "name": "connection", + "type": { + "val": "bevy_input::gamepad::GamepadConnection" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::gamepad::GamepadEvent": { + "identifier": "GamepadEvent", + "crate": "bevy_input", + "path": "bevy_input::gamepad::GamepadEvent", + "documentation": " A gamepad event.\n\n This event type is used over the [`GamepadConnectionEvent`],\n [`GamepadButtonChangedEvent`] and [`GamepadAxisChangedEvent`] when\n the in-frame relative ordering of events is important.\n\n This event is produced by `bevy_input`.", + "associated_functions": [ + "bevy_input::gamepad::GamepadEvent::clone", + "bevy_input::gamepad::GamepadEvent::eq" + ], + "layout": [ + { + "kind": "TupleStruct", + "name": "Connection", + "fields": [ + { + "type": { + "val": "bevy_input::gamepad::GamepadConnectionEvent" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Button", + "fields": [ + { + "type": { + "val": "bevy_input::gamepad::GamepadButtonChangedEvent" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Axis", + "fields": [ + { + "type": { + "val": "bevy_input::gamepad::GamepadAxisChangedEvent" + } + } + ] + } + ], + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::gamepad::GamepadInput": { + "identifier": "GamepadInput", + "crate": "bevy_input", + "path": "bevy_input::gamepad::GamepadInput", + "documentation": " Encapsulation over [`GamepadAxis`] and [`GamepadButton`].", + "associated_functions": [ + "bevy_input::gamepad::GamepadInput::assert_receiver_is_total_eq", + "bevy_input::gamepad::GamepadInput::clone", + "bevy_input::gamepad::GamepadInput::eq" + ], + "layout": [ + { + "kind": "TupleStruct", + "name": "Axis", + "fields": [ + { + "type": { + "val": "bevy_input::gamepad::GamepadAxis" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Button", + "fields": [ + { + "type": { + "val": "bevy_input::gamepad::GamepadButton" + } + } + ] + } + ], + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::gamepad::GamepadRumbleIntensity": { + "identifier": "GamepadRumbleIntensity", + "crate": "bevy_input", + "path": "bevy_input::gamepad::GamepadRumbleIntensity", + "documentation": " The intensity at which a gamepad's force-feedback motors may rumble.", + "associated_functions": [ + "bevy_input::gamepad::GamepadRumbleIntensity::eq", + "bevy_input::gamepad::GamepadRumbleIntensity::strong_motor", + "bevy_input::gamepad::GamepadRumbleIntensity::weak_motor", + "bevy_input::gamepad::GamepadRumbleIntensity::clone" + ], + "layout": { + "kind": "Struct", + "name": "GamepadRumbleIntensity", + "fields": [ + { + "name": "strong_motor", + "type": { + "primitive": "f32" + } + }, + { + "name": "weak_motor", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::gamepad::GamepadRumbleRequest": { + "identifier": "GamepadRumbleRequest", + "crate": "bevy_input", + "path": "bevy_input::gamepad::GamepadRumbleRequest", + "documentation": " An event that controls force-feedback rumbling of a [`Gamepad`] [`entity`](Entity).\n\n # Notes\n\n Does nothing if the gamepad or platform does not support rumble.\n\n # Example\n\n ```\n # use bevy_input::gamepad::{Gamepad, GamepadRumbleRequest, GamepadRumbleIntensity};\n # use bevy_ecs::prelude::{MessageWriter, Res, Query, Entity, With};\n # use core::time::Duration;\n fn rumble_gamepad_system(\n mut rumble_requests: MessageWriter,\n gamepads: Query>,\n ) {\n for entity in gamepads.iter() {\n rumble_requests.write(GamepadRumbleRequest::Add {\n gamepad: entity,\n intensity: GamepadRumbleIntensity::MAX,\n duration: Duration::from_secs_f32(0.5),\n });\n }\n }\n ```", + "associated_functions": [ + "bevy_input::gamepad::GamepadRumbleRequest::clone", + "bevy_input::gamepad::GamepadRumbleRequest::gamepad" + ], + "layout": [ + { + "kind": "Struct", + "name": "Add", + "fields": [ + { + "name": "duration", + "type": { + "val": "core::time::Duration" + } + }, + { + "name": "intensity", + "type": { + "val": "bevy_input::gamepad::GamepadRumbleIntensity" + } + }, + { + "name": "gamepad", + "type": { + "val": "bevy_ecs::entity::Entity" + } + } + ] + }, + { + "kind": "Struct", + "name": "Stop", + "fields": [ + { + "name": "gamepad", + "type": { + "val": "bevy_ecs::entity::Entity" + } + } + ] + } + ], + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::gamepad::GamepadSettings": { + "identifier": "GamepadSettings", + "crate": "bevy_input", + "path": "bevy_input::gamepad::GamepadSettings", + "documentation": " Gamepad settings component.\n\n ## Usage\n\n It is used to create a `bevy` component that stores the settings of [`GamepadButton`] and [`GamepadAxis`] in [`Gamepad`].\n If no user defined [`ButtonSettings`], [`AxisSettings`], or [`ButtonAxisSettings`]\n are defined, the default settings of each are used as a fallback accordingly.\n\n ## Note\n\n The [`GamepadSettings`] are used to determine when raw gamepad events\n should register. Events that don't meet the change thresholds defined in [`GamepadSettings`]\n will not register. To modify these settings, mutate the corresponding component.", + "associated_functions": [ + "bevy_input::gamepad::GamepadSettings::clone" + ], + "layout": { + "kind": "Struct", + "name": "GamepadSettings", + "fields": [ + { + "name": "default_button_settings", + "type": { + "val": "bevy_input::gamepad::ButtonSettings" + } + }, + { + "name": "default_axis_settings", + "type": { + "val": "bevy_input::gamepad::AxisSettings" + } + }, + { + "name": "default_button_axis_settings", + "type": { + "val": "bevy_input::gamepad::ButtonAxisSettings" + } + }, + { + "name": "button_settings", + "type": { + "hashMap": [ + { + "val": "bevy_input::gamepad::GamepadButton" + }, + { + "val": "bevy_input::gamepad::ButtonSettings" + } + ] + } + }, + { + "name": "axis_settings", + "type": { + "hashMap": [ + { + "val": "bevy_input::gamepad::GamepadAxis" + }, + { + "val": "bevy_input::gamepad::AxisSettings" + } + ] + } + }, + { + "name": "button_axis_settings", + "type": { + "hashMap": [ + { + "val": "bevy_input::gamepad::GamepadButton" + }, + { + "val": "bevy_input::gamepad::ButtonAxisSettings" + } + ] + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::gamepad::RawGamepadAxisChangedEvent": { + "identifier": "RawGamepadAxisChangedEvent", + "crate": "bevy_input", + "path": "bevy_input::gamepad::RawGamepadAxisChangedEvent", + "documentation": " [`GamepadAxis`] changed event unfiltered by [`GamepadSettings`].", + "associated_functions": [ + "bevy_input::gamepad::RawGamepadAxisChangedEvent::eq", + "bevy_input::gamepad::RawGamepadAxisChangedEvent::new", + "bevy_input::gamepad::RawGamepadAxisChangedEvent::clone" + ], + "layout": { + "kind": "Struct", + "name": "RawGamepadAxisChangedEvent", + "fields": [ + { + "name": "gamepad", + "type": { + "val": "bevy_ecs::entity::Entity" + } + }, + { + "name": "axis", + "type": { + "val": "bevy_input::gamepad::GamepadAxis" + } + }, + { + "name": "value", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::gamepad::RawGamepadButtonChangedEvent": { + "identifier": "RawGamepadButtonChangedEvent", + "crate": "bevy_input", + "path": "bevy_input::gamepad::RawGamepadButtonChangedEvent", + "documentation": " [`GamepadButton`] changed event unfiltered by [`GamepadSettings`].", + "associated_functions": [ + "bevy_input::gamepad::RawGamepadButtonChangedEvent::eq", + "bevy_input::gamepad::RawGamepadButtonChangedEvent::clone", + "bevy_input::gamepad::RawGamepadButtonChangedEvent::new" + ], + "layout": { + "kind": "Struct", + "name": "RawGamepadButtonChangedEvent", + "fields": [ + { + "name": "gamepad", + "type": { + "val": "bevy_ecs::entity::Entity" + } + }, + { + "name": "button", + "type": { + "val": "bevy_input::gamepad::GamepadButton" + } + }, + { + "name": "value", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::gamepad::RawGamepadEvent": { + "identifier": "RawGamepadEvent", + "crate": "bevy_input", + "path": "bevy_input::gamepad::RawGamepadEvent", + "documentation": " A raw gamepad event.\n\n This event type is used over the [`GamepadConnectionEvent`],\n [`RawGamepadButtonChangedEvent`] and [`RawGamepadAxisChangedEvent`] when\n the in-frame relative ordering of events is important.\n\n This event type is used by `bevy_input` to feed its components.", + "associated_functions": [ + "bevy_input::gamepad::RawGamepadEvent::clone", + "bevy_input::gamepad::RawGamepadEvent::eq" + ], + "layout": [ + { + "kind": "TupleStruct", + "name": "Connection", + "fields": [ + { + "type": { + "val": "bevy_input::gamepad::GamepadConnectionEvent" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Button", + "fields": [ + { + "type": { + "val": "bevy_input::gamepad::RawGamepadButtonChangedEvent" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Axis", + "fields": [ + { + "type": { + "val": "bevy_input::gamepad::RawGamepadAxisChangedEvent" + } + } + ] + } + ], + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::gestures::DoubleTapGesture": { + "identifier": "DoubleTapGesture", + "crate": "bevy_input", + "path": "bevy_input::gestures::DoubleTapGesture", + "documentation": " Double tap gesture.\n\n ## Platform-specific\n\n - Only available on **`macOS`** and **`iOS`**.\n - On **`iOS`**, must be enabled first", + "associated_functions": [ + "bevy_input::gestures::DoubleTapGesture::clone", + "bevy_input::gestures::DoubleTapGesture::eq" + ], + "layout": { + "kind": "Struct", + "name": "DoubleTapGesture" + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::gestures::PanGesture": { + "identifier": "PanGesture", + "crate": "bevy_input", + "path": "bevy_input::gestures::PanGesture", + "documentation": " Pan gesture.\n\n ## Platform-specific\n\n - On **`iOS`**, must be enabled first", + "associated_functions": [ + "bevy_input::gestures::PanGesture::clone", + "bevy_input::gestures::PanGesture::eq" + ], + "layout": { + "kind": "TupleStruct", + "name": "PanGesture", + "fields": [ + { + "type": { + "val": "glam::Vec2" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::gestures::PinchGesture": { + "identifier": "PinchGesture", + "crate": "bevy_input", + "path": "bevy_input::gestures::PinchGesture", + "documentation": " Two-finger pinch gesture, often used for magnifications.\n\n Positive delta values indicate magnification (zooming in) and\n negative delta values indicate shrinking (zooming out).\n\n ## Platform-specific\n\n - Only available on **`macOS`** and **`iOS`**.\n - On **`iOS`**, must be enabled first", + "associated_functions": [ + "bevy_input::gestures::PinchGesture::clone", + "bevy_input::gestures::PinchGesture::eq" + ], + "layout": { + "kind": "TupleStruct", + "name": "PinchGesture", + "fields": [ + { + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::gestures::RotationGesture": { + "identifier": "RotationGesture", + "crate": "bevy_input", + "path": "bevy_input::gestures::RotationGesture", + "documentation": " Two-finger rotation gesture.\n\n Positive delta values indicate rotation counterclockwise and\n negative delta values indicate rotation clockwise.\n\n ## Platform-specific\n\n - Only available on **`macOS`** and **`iOS`**.\n - On **`iOS`**, must be enabled first", + "associated_functions": [ + "bevy_input::gestures::RotationGesture::clone", + "bevy_input::gestures::RotationGesture::eq" + ], + "layout": { + "kind": "TupleStruct", + "name": "RotationGesture", + "fields": [ + { + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::keyboard::Key": { + "identifier": "Key", + "crate": "bevy_input", + "path": "bevy_input::keyboard::Key", + "documentation": " The logical key code of a [`KeyboardInput`].\n\n This contains the actual value that is produced by pressing the key. This is\n useful when you need the actual letters, and for symbols like `+` and `-`\n when implementing zoom, as they can be in different locations depending on\n the keyboard layout.\n\n In many cases you want the key location instead, for example when\n implementing WASD controls so the keys are located the same place on QWERTY\n and other layouts. In that case use [`KeyCode`] instead.\n\n ## Usage\n\n It is used as the generic `T` value of an [`ButtonInput`] to create a `Res>`.\n\n ## Technical\n\n Its values map 1 to 1 to winit's Key.", + "associated_functions": [ + "bevy_input::keyboard::Key::eq", + "bevy_input::keyboard::Key::assert_receiver_is_total_eq", + "bevy_input::keyboard::Key::clone" + ], + "layout": [ + { + "kind": "TupleStruct", + "name": "Character", + "fields": [ + { + "type": { + "val": "smol_str::SmolStr" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Unidentified", + "fields": [ + { + "type": { + "val": "bevy_input::keyboard::NativeKey" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Dead", + "fields": [ + { + "type": { + "option": { + "primitive": "char" + } + } + } + ] + }, + { + "kind": "Unit", + "name": "Alt" + }, + { + "kind": "Unit", + "name": "AltGraph" + }, + { + "kind": "Unit", + "name": "CapsLock" + }, + { + "kind": "Unit", + "name": "Control" + }, + { + "kind": "Unit", + "name": "Fn" + }, + { + "kind": "Unit", + "name": "FnLock" + }, + { + "kind": "Unit", + "name": "NumLock" + }, + { + "kind": "Unit", + "name": "ScrollLock" + }, + { + "kind": "Unit", + "name": "Shift" + }, + { + "kind": "Unit", + "name": "Symbol" + }, + { + "kind": "Unit", + "name": "SymbolLock" + }, + { + "kind": "Unit", + "name": "Meta" + }, + { + "kind": "Unit", + "name": "Hyper" + }, + { + "kind": "Unit", + "name": "Super" + }, + { + "kind": "Unit", + "name": "Enter" + }, + { + "kind": "Unit", + "name": "Tab" + }, + { + "kind": "Unit", + "name": "Space" + }, + { + "kind": "Unit", + "name": "ArrowDown" + }, + { + "kind": "Unit", + "name": "ArrowLeft" + }, + { + "kind": "Unit", + "name": "ArrowRight" + }, + { + "kind": "Unit", + "name": "ArrowUp" + }, + { + "kind": "Unit", + "name": "End" + }, + { + "kind": "Unit", + "name": "Home" + }, + { + "kind": "Unit", + "name": "PageDown" + }, + { + "kind": "Unit", + "name": "PageUp" + }, + { + "kind": "Unit", + "name": "Backspace" + }, + { + "kind": "Unit", + "name": "Clear" + }, + { + "kind": "Unit", + "name": "Copy" + }, + { + "kind": "Unit", + "name": "CrSel" + }, + { + "kind": "Unit", + "name": "Cut" + }, + { + "kind": "Unit", + "name": "Delete" + }, + { + "kind": "Unit", + "name": "EraseEof" + }, + { + "kind": "Unit", + "name": "ExSel" + }, + { + "kind": "Unit", + "name": "Insert" + }, + { + "kind": "Unit", + "name": "Paste" + }, + { + "kind": "Unit", + "name": "Redo" + }, + { + "kind": "Unit", + "name": "Undo" + }, + { + "kind": "Unit", + "name": "Accept" + }, + { + "kind": "Unit", + "name": "Again" + }, + { + "kind": "Unit", + "name": "Attn" + }, + { + "kind": "Unit", + "name": "Cancel" + }, + { + "kind": "Unit", + "name": "ContextMenu" + }, + { + "kind": "Unit", + "name": "Escape" + }, + { + "kind": "Unit", + "name": "Execute" + }, + { + "kind": "Unit", + "name": "Find" + }, + { + "kind": "Unit", + "name": "Help" + }, + { + "kind": "Unit", + "name": "Pause" + }, + { + "kind": "Unit", + "name": "Play" + }, + { + "kind": "Unit", + "name": "Props" + }, + { + "kind": "Unit", + "name": "Select" + }, + { + "kind": "Unit", + "name": "ZoomIn" + }, + { + "kind": "Unit", + "name": "ZoomOut" + }, + { + "kind": "Unit", + "name": "BrightnessDown" + }, + { + "kind": "Unit", + "name": "BrightnessUp" + }, + { + "kind": "Unit", + "name": "Eject" + }, + { + "kind": "Unit", + "name": "LogOff" + }, + { + "kind": "Unit", + "name": "Power" + }, + { + "kind": "Unit", + "name": "PowerOff" + }, + { + "kind": "Unit", + "name": "PrintScreen" + }, + { + "kind": "Unit", + "name": "Hibernate" + }, + { + "kind": "Unit", + "name": "Standby" + }, + { + "kind": "Unit", + "name": "WakeUp" + }, + { + "kind": "Unit", + "name": "AllCandidates" + }, + { + "kind": "Unit", + "name": "Alphanumeric" + }, + { + "kind": "Unit", + "name": "CodeInput" + }, + { + "kind": "Unit", + "name": "Compose" + }, + { + "kind": "Unit", + "name": "Convert" + }, + { + "kind": "Unit", + "name": "FinalMode" + }, + { + "kind": "Unit", + "name": "GroupFirst" + }, + { + "kind": "Unit", + "name": "GroupLast" + }, + { + "kind": "Unit", + "name": "GroupNext" + }, + { + "kind": "Unit", + "name": "GroupPrevious" + }, + { + "kind": "Unit", + "name": "ModeChange" + }, + { + "kind": "Unit", + "name": "NextCandidate" + }, + { + "kind": "Unit", + "name": "NonConvert" + }, + { + "kind": "Unit", + "name": "PreviousCandidate" + }, + { + "kind": "Unit", + "name": "Process" + }, + { + "kind": "Unit", + "name": "SingleCandidate" + }, + { + "kind": "Unit", + "name": "HangulMode" + }, + { + "kind": "Unit", + "name": "HanjaMode" + }, + { + "kind": "Unit", + "name": "JunjaMode" + }, + { + "kind": "Unit", + "name": "Eisu" + }, + { + "kind": "Unit", + "name": "Hankaku" + }, + { + "kind": "Unit", + "name": "Hiragana" + }, + { + "kind": "Unit", + "name": "HiraganaKatakana" + }, + { + "kind": "Unit", + "name": "KanaMode" + }, + { + "kind": "Unit", + "name": "KanjiMode" + }, + { + "kind": "Unit", + "name": "Katakana" + }, + { + "kind": "Unit", + "name": "Romaji" + }, + { + "kind": "Unit", + "name": "Zenkaku" + }, + { + "kind": "Unit", + "name": "ZenkakuHankaku" + }, + { + "kind": "Unit", + "name": "Soft1" + }, + { + "kind": "Unit", + "name": "Soft2" + }, + { + "kind": "Unit", + "name": "Soft3" + }, + { + "kind": "Unit", + "name": "Soft4" + }, + { + "kind": "Unit", + "name": "ChannelDown" + }, + { + "kind": "Unit", + "name": "ChannelUp" + }, + { + "kind": "Unit", + "name": "Close" + }, + { + "kind": "Unit", + "name": "MailForward" + }, + { + "kind": "Unit", + "name": "MailReply" + }, + { + "kind": "Unit", + "name": "MailSend" + }, + { + "kind": "Unit", + "name": "MediaClose" + }, + { + "kind": "Unit", + "name": "MediaFastForward" + }, + { + "kind": "Unit", + "name": "MediaPause" + }, + { + "kind": "Unit", + "name": "MediaPlay" + }, + { + "kind": "Unit", + "name": "MediaPlayPause" + }, + { + "kind": "Unit", + "name": "MediaRecord" + }, + { + "kind": "Unit", + "name": "MediaRewind" + }, + { + "kind": "Unit", + "name": "MediaStop" + }, + { + "kind": "Unit", + "name": "MediaTrackNext" + }, + { + "kind": "Unit", + "name": "MediaTrackPrevious" + }, + { + "kind": "Unit", + "name": "New" + }, + { + "kind": "Unit", + "name": "Open" + }, + { + "kind": "Unit", + "name": "Print" + }, + { + "kind": "Unit", + "name": "Save" + }, + { + "kind": "Unit", + "name": "SpellCheck" + }, + { + "kind": "Unit", + "name": "Key11" + }, + { + "kind": "Unit", + "name": "Key12" + }, + { + "kind": "Unit", + "name": "AudioBalanceLeft" + }, + { + "kind": "Unit", + "name": "AudioBalanceRight" + }, + { + "kind": "Unit", + "name": "AudioBassBoostDown" + }, + { + "kind": "Unit", + "name": "AudioBassBoostToggle" + }, + { + "kind": "Unit", + "name": "AudioBassBoostUp" + }, + { + "kind": "Unit", + "name": "AudioFaderFront" + }, + { + "kind": "Unit", + "name": "AudioFaderRear" + }, + { + "kind": "Unit", + "name": "AudioSurroundModeNext" + }, + { + "kind": "Unit", + "name": "AudioTrebleDown" + }, + { + "kind": "Unit", + "name": "AudioTrebleUp" + }, + { + "kind": "Unit", + "name": "AudioVolumeDown" + }, + { + "kind": "Unit", + "name": "AudioVolumeUp" + }, + { + "kind": "Unit", + "name": "AudioVolumeMute" + }, + { + "kind": "Unit", + "name": "MicrophoneToggle" + }, + { + "kind": "Unit", + "name": "MicrophoneVolumeDown" + }, + { + "kind": "Unit", + "name": "MicrophoneVolumeUp" + }, + { + "kind": "Unit", + "name": "MicrophoneVolumeMute" + }, + { + "kind": "Unit", + "name": "SpeechCorrectionList" + }, + { + "kind": "Unit", + "name": "SpeechInputToggle" + }, + { + "kind": "Unit", + "name": "LaunchApplication1" + }, + { + "kind": "Unit", + "name": "LaunchApplication2" + }, + { + "kind": "Unit", + "name": "LaunchCalendar" + }, + { + "kind": "Unit", + "name": "LaunchContacts" + }, + { + "kind": "Unit", + "name": "LaunchMail" + }, + { + "kind": "Unit", + "name": "LaunchMediaPlayer" + }, + { + "kind": "Unit", + "name": "LaunchMusicPlayer" + }, + { + "kind": "Unit", + "name": "LaunchPhone" + }, + { + "kind": "Unit", + "name": "LaunchScreenSaver" + }, + { + "kind": "Unit", + "name": "LaunchSpreadsheet" + }, + { + "kind": "Unit", + "name": "LaunchWebBrowser" + }, + { + "kind": "Unit", + "name": "LaunchWebCam" + }, + { + "kind": "Unit", + "name": "LaunchWordProcessor" + }, + { + "kind": "Unit", + "name": "BrowserBack" + }, + { + "kind": "Unit", + "name": "BrowserFavorites" + }, + { + "kind": "Unit", + "name": "BrowserForward" + }, + { + "kind": "Unit", + "name": "BrowserHome" + }, + { + "kind": "Unit", + "name": "BrowserRefresh" + }, + { + "kind": "Unit", + "name": "BrowserSearch" + }, + { + "kind": "Unit", + "name": "BrowserStop" + }, + { + "kind": "Unit", + "name": "AppSwitch" + }, + { + "kind": "Unit", + "name": "Call" + }, + { + "kind": "Unit", + "name": "Camera" + }, + { + "kind": "Unit", + "name": "CameraFocus" + }, + { + "kind": "Unit", + "name": "EndCall" + }, + { + "kind": "Unit", + "name": "GoBack" + }, + { + "kind": "Unit", + "name": "GoHome" + }, + { + "kind": "Unit", + "name": "HeadsetHook" + }, + { + "kind": "Unit", + "name": "LastNumberRedial" + }, + { + "kind": "Unit", + "name": "Notification" + }, + { + "kind": "Unit", + "name": "MannerMode" + }, + { + "kind": "Unit", + "name": "VoiceDial" + }, + { + "kind": "Unit", + "name": "TV" + }, + { + "kind": "Unit", + "name": "TV3DMode" + }, + { + "kind": "Unit", + "name": "TVAntennaCable" + }, + { + "kind": "Unit", + "name": "TVAudioDescription" + }, + { + "kind": "Unit", + "name": "TVAudioDescriptionMixDown" + }, + { + "kind": "Unit", + "name": "TVAudioDescriptionMixUp" + }, + { + "kind": "Unit", + "name": "TVContentsMenu" + }, + { + "kind": "Unit", + "name": "TVDataService" + }, + { + "kind": "Unit", + "name": "TVInput" + }, + { + "kind": "Unit", + "name": "TVInputComponent1" + }, + { + "kind": "Unit", + "name": "TVInputComponent2" + }, + { + "kind": "Unit", + "name": "TVInputComposite1" + }, + { + "kind": "Unit", + "name": "TVInputComposite2" + }, + { + "kind": "Unit", + "name": "TVInputHDMI1" + }, + { + "kind": "Unit", + "name": "TVInputHDMI2" + }, + { + "kind": "Unit", + "name": "TVInputHDMI3" + }, + { + "kind": "Unit", + "name": "TVInputHDMI4" + }, + { + "kind": "Unit", + "name": "TVInputVGA1" + }, + { + "kind": "Unit", + "name": "TVMediaContext" + }, + { + "kind": "Unit", + "name": "TVNetwork" + }, + { + "kind": "Unit", + "name": "TVNumberEntry" + }, + { + "kind": "Unit", + "name": "TVPower" + }, + { + "kind": "Unit", + "name": "TVRadioService" + }, + { + "kind": "Unit", + "name": "TVSatellite" + }, + { + "kind": "Unit", + "name": "TVSatelliteBS" + }, + { + "kind": "Unit", + "name": "TVSatelliteCS" + }, + { + "kind": "Unit", + "name": "TVSatelliteToggle" + }, + { + "kind": "Unit", + "name": "TVTerrestrialAnalog" + }, + { + "kind": "Unit", + "name": "TVTerrestrialDigital" + }, + { + "kind": "Unit", + "name": "TVTimer" + }, + { + "kind": "Unit", + "name": "AVRInput" + }, + { + "kind": "Unit", + "name": "AVRPower" + }, + { + "kind": "Unit", + "name": "ColorF0Red" + }, + { + "kind": "Unit", + "name": "ColorF1Green" + }, + { + "kind": "Unit", + "name": "ColorF2Yellow" + }, + { + "kind": "Unit", + "name": "ColorF3Blue" + }, + { + "kind": "Unit", + "name": "ColorF4Grey" + }, + { + "kind": "Unit", + "name": "ColorF5Brown" + }, + { + "kind": "Unit", + "name": "ClosedCaptionToggle" + }, + { + "kind": "Unit", + "name": "Dimmer" + }, + { + "kind": "Unit", + "name": "DisplaySwap" + }, + { + "kind": "Unit", + "name": "DVR" + }, + { + "kind": "Unit", + "name": "Exit" + }, + { + "kind": "Unit", + "name": "FavoriteClear0" + }, + { + "kind": "Unit", + "name": "FavoriteClear1" + }, + { + "kind": "Unit", + "name": "FavoriteClear2" + }, + { + "kind": "Unit", + "name": "FavoriteClear3" + }, + { + "kind": "Unit", + "name": "FavoriteRecall0" + }, + { + "kind": "Unit", + "name": "FavoriteRecall1" + }, + { + "kind": "Unit", + "name": "FavoriteRecall2" + }, + { + "kind": "Unit", + "name": "FavoriteRecall3" + }, + { + "kind": "Unit", + "name": "FavoriteStore0" + }, + { + "kind": "Unit", + "name": "FavoriteStore1" + }, + { + "kind": "Unit", + "name": "FavoriteStore2" + }, + { + "kind": "Unit", + "name": "FavoriteStore3" + }, + { + "kind": "Unit", + "name": "Guide" + }, + { + "kind": "Unit", + "name": "GuideNextDay" + }, + { + "kind": "Unit", + "name": "GuidePreviousDay" + }, + { + "kind": "Unit", + "name": "Info" + }, + { + "kind": "Unit", + "name": "InstantReplay" + }, + { + "kind": "Unit", + "name": "Link" + }, + { + "kind": "Unit", + "name": "ListProgram" + }, + { + "kind": "Unit", + "name": "LiveContent" + }, + { + "kind": "Unit", + "name": "Lock" + }, + { + "kind": "Unit", + "name": "MediaApps" + }, + { + "kind": "Unit", + "name": "MediaAudioTrack" + }, + { + "kind": "Unit", + "name": "MediaLast" + }, + { + "kind": "Unit", + "name": "MediaSkipBackward" + }, + { + "kind": "Unit", + "name": "MediaSkipForward" + }, + { + "kind": "Unit", + "name": "MediaStepBackward" + }, + { + "kind": "Unit", + "name": "MediaStepForward" + }, + { + "kind": "Unit", + "name": "MediaTopMenu" + }, + { + "kind": "Unit", + "name": "NavigateIn" + }, + { + "kind": "Unit", + "name": "NavigateNext" + }, + { + "kind": "Unit", + "name": "NavigateOut" + }, + { + "kind": "Unit", + "name": "NavigatePrevious" + }, + { + "kind": "Unit", + "name": "NextFavoriteChannel" + }, + { + "kind": "Unit", + "name": "NextUserProfile" + }, + { + "kind": "Unit", + "name": "OnDemand" + }, + { + "kind": "Unit", + "name": "Pairing" + }, + { + "kind": "Unit", + "name": "PinPDown" + }, + { + "kind": "Unit", + "name": "PinPMove" + }, + { + "kind": "Unit", + "name": "PinPToggle" + }, + { + "kind": "Unit", + "name": "PinPUp" + }, + { + "kind": "Unit", + "name": "PlaySpeedDown" + }, + { + "kind": "Unit", + "name": "PlaySpeedReset" + }, + { + "kind": "Unit", + "name": "PlaySpeedUp" + }, + { + "kind": "Unit", + "name": "RandomToggle" + }, + { + "kind": "Unit", + "name": "RcLowBattery" + }, + { + "kind": "Unit", + "name": "RecordSpeedNext" + }, + { + "kind": "Unit", + "name": "RfBypass" + }, + { + "kind": "Unit", + "name": "ScanChannelsToggle" + }, + { + "kind": "Unit", + "name": "ScreenModeNext" + }, + { + "kind": "Unit", + "name": "Settings" + }, + { + "kind": "Unit", + "name": "SplitScreenToggle" + }, + { + "kind": "Unit", + "name": "STBInput" + }, + { + "kind": "Unit", + "name": "STBPower" + }, + { + "kind": "Unit", + "name": "Subtitle" + }, + { + "kind": "Unit", + "name": "Teletext" + }, + { + "kind": "Unit", + "name": "VideoModeNext" + }, + { + "kind": "Unit", + "name": "Wink" + }, + { + "kind": "Unit", + "name": "ZoomToggle" + }, + { + "kind": "Unit", + "name": "F1" + }, + { + "kind": "Unit", + "name": "F2" + }, + { + "kind": "Unit", + "name": "F3" + }, + { + "kind": "Unit", + "name": "F4" + }, + { + "kind": "Unit", + "name": "F5" + }, + { + "kind": "Unit", + "name": "F6" + }, + { + "kind": "Unit", + "name": "F7" + }, + { + "kind": "Unit", + "name": "F8" + }, + { + "kind": "Unit", + "name": "F9" + }, + { + "kind": "Unit", + "name": "F10" + }, + { + "kind": "Unit", + "name": "F11" + }, + { + "kind": "Unit", + "name": "F12" + }, + { + "kind": "Unit", + "name": "F13" + }, + { + "kind": "Unit", + "name": "F14" + }, + { + "kind": "Unit", + "name": "F15" + }, + { + "kind": "Unit", + "name": "F16" + }, + { + "kind": "Unit", + "name": "F17" + }, + { + "kind": "Unit", + "name": "F18" + }, + { + "kind": "Unit", + "name": "F19" + }, + { + "kind": "Unit", + "name": "F20" + }, + { + "kind": "Unit", + "name": "F21" + }, + { + "kind": "Unit", + "name": "F22" + }, + { + "kind": "Unit", + "name": "F23" + }, + { + "kind": "Unit", + "name": "F24" + }, + { + "kind": "Unit", + "name": "F25" + }, + { + "kind": "Unit", + "name": "F26" + }, + { + "kind": "Unit", + "name": "F27" + }, + { + "kind": "Unit", + "name": "F28" + }, + { + "kind": "Unit", + "name": "F29" + }, + { + "kind": "Unit", + "name": "F30" + }, + { + "kind": "Unit", + "name": "F31" + }, + { + "kind": "Unit", + "name": "F32" + }, + { + "kind": "Unit", + "name": "F33" + }, + { + "kind": "Unit", + "name": "F34" + }, + { + "kind": "Unit", + "name": "F35" + } + ], + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::keyboard::KeyCode": { + "identifier": "KeyCode", + "crate": "bevy_input", + "path": "bevy_input::keyboard::KeyCode", + "documentation": " The key code of a [`KeyboardInput`].\n\n ## Usage\n\n It is used as the generic `T` value of an [`ButtonInput`] to create a `Res>`.\n\n Code representing the location of a physical key\n This mostly conforms to the [`UI Events Specification's KeyboardEvent.code`] with a few\n exceptions:\n - The keys that the specification calls `MetaLeft` and `MetaRight` are named `SuperLeft` and\n `SuperRight` here.\n - The key that the specification calls \"Super\" is reported as `Unidentified` here.\n\n [`UI Events Specification's KeyboardEvent.code`]: https://w3c.github.io/uievents-code/#code-value-tables\n\n ## Updating\n\n The resource is updated inside of the [`keyboard_input_system`].", + "associated_functions": [ + "bevy_input::keyboard::KeyCode::assert_receiver_is_total_eq", + "bevy_input::keyboard::KeyCode::eq", + "bevy_input::keyboard::KeyCode::clone" + ], + "layout": [ + { + "kind": "TupleStruct", + "name": "Unidentified", + "fields": [ + { + "type": { + "val": "bevy_input::keyboard::NativeKeyCode" + } + } + ] + }, + { + "kind": "Unit", + "name": "Backquote" + }, + { + "kind": "Unit", + "name": "Backslash" + }, + { + "kind": "Unit", + "name": "BracketLeft" + }, + { + "kind": "Unit", + "name": "BracketRight" + }, + { + "kind": "Unit", + "name": "Comma" + }, + { + "kind": "Unit", + "name": "Digit0" + }, + { + "kind": "Unit", + "name": "Digit1" + }, + { + "kind": "Unit", + "name": "Digit2" + }, + { + "kind": "Unit", + "name": "Digit3" + }, + { + "kind": "Unit", + "name": "Digit4" + }, + { + "kind": "Unit", + "name": "Digit5" + }, + { + "kind": "Unit", + "name": "Digit6" + }, + { + "kind": "Unit", + "name": "Digit7" + }, + { + "kind": "Unit", + "name": "Digit8" + }, + { + "kind": "Unit", + "name": "Digit9" + }, + { + "kind": "Unit", + "name": "Equal" + }, + { + "kind": "Unit", + "name": "IntlBackslash" + }, + { + "kind": "Unit", + "name": "IntlRo" + }, + { + "kind": "Unit", + "name": "IntlYen" + }, + { + "kind": "Unit", + "name": "KeyA" + }, + { + "kind": "Unit", + "name": "KeyB" + }, + { + "kind": "Unit", + "name": "KeyC" + }, + { + "kind": "Unit", + "name": "KeyD" + }, + { + "kind": "Unit", + "name": "KeyE" + }, + { + "kind": "Unit", + "name": "KeyF" + }, + { + "kind": "Unit", + "name": "KeyG" + }, + { + "kind": "Unit", + "name": "KeyH" + }, + { + "kind": "Unit", + "name": "KeyI" + }, + { + "kind": "Unit", + "name": "KeyJ" + }, + { + "kind": "Unit", + "name": "KeyK" + }, + { + "kind": "Unit", + "name": "KeyL" + }, + { + "kind": "Unit", + "name": "KeyM" + }, + { + "kind": "Unit", + "name": "KeyN" + }, + { + "kind": "Unit", + "name": "KeyO" + }, + { + "kind": "Unit", + "name": "KeyP" + }, + { + "kind": "Unit", + "name": "KeyQ" + }, + { + "kind": "Unit", + "name": "KeyR" + }, + { + "kind": "Unit", + "name": "KeyS" + }, + { + "kind": "Unit", + "name": "KeyT" + }, + { + "kind": "Unit", + "name": "KeyU" + }, + { + "kind": "Unit", + "name": "KeyV" + }, + { + "kind": "Unit", + "name": "KeyW" + }, + { + "kind": "Unit", + "name": "KeyX" + }, + { + "kind": "Unit", + "name": "KeyY" + }, + { + "kind": "Unit", + "name": "KeyZ" + }, + { + "kind": "Unit", + "name": "Minus" + }, + { + "kind": "Unit", + "name": "Period" + }, + { + "kind": "Unit", + "name": "Quote" + }, + { + "kind": "Unit", + "name": "Semicolon" + }, + { + "kind": "Unit", + "name": "Slash" + }, + { + "kind": "Unit", + "name": "AltLeft" + }, + { + "kind": "Unit", + "name": "AltRight" + }, + { + "kind": "Unit", + "name": "Backspace" + }, + { + "kind": "Unit", + "name": "CapsLock" + }, + { + "kind": "Unit", + "name": "ContextMenu" + }, + { + "kind": "Unit", + "name": "ControlLeft" + }, + { + "kind": "Unit", + "name": "ControlRight" + }, + { + "kind": "Unit", + "name": "Enter" + }, + { + "kind": "Unit", + "name": "SuperLeft" + }, + { + "kind": "Unit", + "name": "SuperRight" + }, + { + "kind": "Unit", + "name": "ShiftLeft" + }, + { + "kind": "Unit", + "name": "ShiftRight" + }, + { + "kind": "Unit", + "name": "Space" + }, + { + "kind": "Unit", + "name": "Tab" + }, + { + "kind": "Unit", + "name": "Convert" + }, + { + "kind": "Unit", + "name": "KanaMode" + }, + { + "kind": "Unit", + "name": "Lang1" + }, + { + "kind": "Unit", + "name": "Lang2" + }, + { + "kind": "Unit", + "name": "Lang3" + }, + { + "kind": "Unit", + "name": "Lang4" + }, + { + "kind": "Unit", + "name": "Lang5" + }, + { + "kind": "Unit", + "name": "NonConvert" + }, + { + "kind": "Unit", + "name": "Delete" + }, + { + "kind": "Unit", + "name": "End" + }, + { + "kind": "Unit", + "name": "Help" + }, + { + "kind": "Unit", + "name": "Home" + }, + { + "kind": "Unit", + "name": "Insert" + }, + { + "kind": "Unit", + "name": "PageDown" + }, + { + "kind": "Unit", + "name": "PageUp" + }, + { + "kind": "Unit", + "name": "ArrowDown" + }, + { + "kind": "Unit", + "name": "ArrowLeft" + }, + { + "kind": "Unit", + "name": "ArrowRight" + }, + { + "kind": "Unit", + "name": "ArrowUp" + }, + { + "kind": "Unit", + "name": "NumLock" + }, + { + "kind": "Unit", + "name": "Numpad0" + }, + { + "kind": "Unit", + "name": "Numpad1" + }, + { + "kind": "Unit", + "name": "Numpad2" + }, + { + "kind": "Unit", + "name": "Numpad3" + }, + { + "kind": "Unit", + "name": "Numpad4" + }, + { + "kind": "Unit", + "name": "Numpad5" + }, + { + "kind": "Unit", + "name": "Numpad6" + }, + { + "kind": "Unit", + "name": "Numpad7" + }, + { + "kind": "Unit", + "name": "Numpad8" + }, + { + "kind": "Unit", + "name": "Numpad9" + }, + { + "kind": "Unit", + "name": "NumpadAdd" + }, + { + "kind": "Unit", + "name": "NumpadBackspace" + }, + { + "kind": "Unit", + "name": "NumpadClear" + }, + { + "kind": "Unit", + "name": "NumpadClearEntry" + }, + { + "kind": "Unit", + "name": "NumpadComma" + }, + { + "kind": "Unit", + "name": "NumpadDecimal" + }, + { + "kind": "Unit", + "name": "NumpadDivide" + }, + { + "kind": "Unit", + "name": "NumpadEnter" + }, + { + "kind": "Unit", + "name": "NumpadEqual" + }, + { + "kind": "Unit", + "name": "NumpadHash" + }, + { + "kind": "Unit", + "name": "NumpadMemoryAdd" + }, + { + "kind": "Unit", + "name": "NumpadMemoryClear" + }, + { + "kind": "Unit", + "name": "NumpadMemoryRecall" + }, + { + "kind": "Unit", + "name": "NumpadMemoryStore" + }, + { + "kind": "Unit", + "name": "NumpadMemorySubtract" + }, + { + "kind": "Unit", + "name": "NumpadMultiply" + }, + { + "kind": "Unit", + "name": "NumpadParenLeft" + }, + { + "kind": "Unit", + "name": "NumpadParenRight" + }, + { + "kind": "Unit", + "name": "NumpadStar" + }, + { + "kind": "Unit", + "name": "NumpadSubtract" + }, + { + "kind": "Unit", + "name": "Escape" + }, + { + "kind": "Unit", + "name": "Fn" + }, + { + "kind": "Unit", + "name": "FnLock" + }, + { + "kind": "Unit", + "name": "PrintScreen" + }, + { + "kind": "Unit", + "name": "ScrollLock" + }, + { + "kind": "Unit", + "name": "Pause" + }, + { + "kind": "Unit", + "name": "BrowserBack" + }, + { + "kind": "Unit", + "name": "BrowserFavorites" + }, + { + "kind": "Unit", + "name": "BrowserForward" + }, + { + "kind": "Unit", + "name": "BrowserHome" + }, + { + "kind": "Unit", + "name": "BrowserRefresh" + }, + { + "kind": "Unit", + "name": "BrowserSearch" + }, + { + "kind": "Unit", + "name": "BrowserStop" + }, + { + "kind": "Unit", + "name": "Eject" + }, + { + "kind": "Unit", + "name": "LaunchApp1" + }, + { + "kind": "Unit", + "name": "LaunchApp2" + }, + { + "kind": "Unit", + "name": "LaunchMail" + }, + { + "kind": "Unit", + "name": "MediaPlayPause" + }, + { + "kind": "Unit", + "name": "MediaSelect" + }, + { + "kind": "Unit", + "name": "MediaStop" + }, + { + "kind": "Unit", + "name": "MediaTrackNext" + }, + { + "kind": "Unit", + "name": "MediaTrackPrevious" + }, + { + "kind": "Unit", + "name": "Power" + }, + { + "kind": "Unit", + "name": "Sleep" + }, + { + "kind": "Unit", + "name": "AudioVolumeDown" + }, + { + "kind": "Unit", + "name": "AudioVolumeMute" + }, + { + "kind": "Unit", + "name": "AudioVolumeUp" + }, + { + "kind": "Unit", + "name": "WakeUp" + }, + { + "kind": "Unit", + "name": "Meta" + }, + { + "kind": "Unit", + "name": "Hyper" + }, + { + "kind": "Unit", + "name": "Turbo" + }, + { + "kind": "Unit", + "name": "Abort" + }, + { + "kind": "Unit", + "name": "Resume" + }, + { + "kind": "Unit", + "name": "Suspend" + }, + { + "kind": "Unit", + "name": "Again" + }, + { + "kind": "Unit", + "name": "Copy" + }, + { + "kind": "Unit", + "name": "Cut" + }, + { + "kind": "Unit", + "name": "Find" + }, + { + "kind": "Unit", + "name": "Open" + }, + { + "kind": "Unit", + "name": "Paste" + }, + { + "kind": "Unit", + "name": "Props" + }, + { + "kind": "Unit", + "name": "Select" + }, + { + "kind": "Unit", + "name": "Undo" + }, + { + "kind": "Unit", + "name": "Hiragana" + }, + { + "kind": "Unit", + "name": "Katakana" + }, + { + "kind": "Unit", + "name": "F1" + }, + { + "kind": "Unit", + "name": "F2" + }, + { + "kind": "Unit", + "name": "F3" + }, + { + "kind": "Unit", + "name": "F4" + }, + { + "kind": "Unit", + "name": "F5" + }, + { + "kind": "Unit", + "name": "F6" + }, + { + "kind": "Unit", + "name": "F7" + }, + { + "kind": "Unit", + "name": "F8" + }, + { + "kind": "Unit", + "name": "F9" + }, + { + "kind": "Unit", + "name": "F10" + }, + { + "kind": "Unit", + "name": "F11" + }, + { + "kind": "Unit", + "name": "F12" + }, + { + "kind": "Unit", + "name": "F13" + }, + { + "kind": "Unit", + "name": "F14" + }, + { + "kind": "Unit", + "name": "F15" + }, + { + "kind": "Unit", + "name": "F16" + }, + { + "kind": "Unit", + "name": "F17" + }, + { + "kind": "Unit", + "name": "F18" + }, + { + "kind": "Unit", + "name": "F19" + }, + { + "kind": "Unit", + "name": "F20" + }, + { + "kind": "Unit", + "name": "F21" + }, + { + "kind": "Unit", + "name": "F22" + }, + { + "kind": "Unit", + "name": "F23" + }, + { + "kind": "Unit", + "name": "F24" + }, + { + "kind": "Unit", + "name": "F25" + }, + { + "kind": "Unit", + "name": "F26" + }, + { + "kind": "Unit", + "name": "F27" + }, + { + "kind": "Unit", + "name": "F28" + }, + { + "kind": "Unit", + "name": "F29" + }, + { + "kind": "Unit", + "name": "F30" + }, + { + "kind": "Unit", + "name": "F31" + }, + { + "kind": "Unit", + "name": "F32" + }, + { + "kind": "Unit", + "name": "F33" + }, + { + "kind": "Unit", + "name": "F34" + }, + { + "kind": "Unit", + "name": "F35" + } + ], + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::keyboard::KeyboardFocusLost": { + "identifier": "KeyboardFocusLost", + "crate": "bevy_input", + "path": "bevy_input::keyboard::KeyboardFocusLost", + "documentation": " Gets generated from `bevy_winit::winit_runner`\n\n Used for clearing all cached states to avoid having 'stuck' key presses\n when, for example, switching between windows with 'Alt-Tab' or using any other\n OS specific key combination that leads to Bevy window losing focus and not receiving any\n input events", + "associated_functions": [ + "bevy_input::keyboard::KeyboardFocusLost::assert_receiver_is_total_eq", + "bevy_input::keyboard::KeyboardFocusLost::eq", + "bevy_input::keyboard::KeyboardFocusLost::clone" + ], + "layout": { + "kind": "Struct", + "name": "KeyboardFocusLost" + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::keyboard::KeyboardInput": { + "identifier": "KeyboardInput", + "crate": "bevy_input", + "path": "bevy_input::keyboard::KeyboardInput", + "documentation": " A keyboard input event.\n\n This event is the translated version of the `WindowEvent::KeyboardInput` from the `winit` crate.\n It is available to the end user and can be used for game logic.\n\n ## Usage\n\n The event is consumed inside of the [`keyboard_input_system`] to update the\n [`ButtonInput`](ButtonInput) and\n [`ButtonInput`](ButtonInput) resources.", + "associated_functions": [ + "bevy_input::keyboard::KeyboardInput::clone", + "bevy_input::keyboard::KeyboardInput::assert_receiver_is_total_eq", + "bevy_input::keyboard::KeyboardInput::eq" + ], + "layout": { + "kind": "Struct", + "name": "KeyboardInput", + "fields": [ + { + "name": "key_code", + "type": { + "val": "bevy_input::keyboard::KeyCode" + } + }, + { + "name": "logical_key", + "type": { + "val": "bevy_input::keyboard::Key" + } + }, + { + "name": "state", + "type": { + "val": "bevy_input::ButtonState" + } + }, + { + "name": "text", + "type": { + "option": { + "val": "smol_str::SmolStr" + } + } + }, + { + "name": "repeat", + "type": { + "primitive": "bool" + } + }, + { + "name": "window", + "type": { + "val": "bevy_ecs::entity::Entity" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::keyboard::NativeKey": { + "identifier": "NativeKey", + "crate": "bevy_input", + "path": "bevy_input::keyboard::NativeKey", + "documentation": " Contains the platform-native logical key identifier, known as keysym.\n\n Exactly what that means differs from platform to platform, but the values are to some degree\n tied to the currently active keyboard layout. The same key on the same keyboard may also report\n different values on different platforms, which is one of the reasons this is a per-platform\n enum.\n\n This enum is primarily used to store raw keysym when Winit doesn't map a given native logical\n key identifier to a meaningful [`Key`] variant. This lets you use [`Key`], and let the user\n define keybinds which work in the presence of identifiers we haven't mapped for you yet.", + "associated_functions": [ + "bevy_input::keyboard::NativeKey::assert_receiver_is_total_eq", + "bevy_input::keyboard::NativeKey::clone", + "bevy_input::keyboard::NativeKey::eq" + ], + "layout": [ + { + "kind": "Unit", + "name": "Unidentified" + }, + { + "kind": "TupleStruct", + "name": "Android", + "fields": [ + { + "type": { + "primitive": "u32" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "MacOS", + "fields": [ + { + "type": { + "primitive": "u16" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Windows", + "fields": [ + { + "type": { + "primitive": "u16" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Xkb", + "fields": [ + { + "type": { + "primitive": "u32" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Web", + "fields": [ + { + "type": { + "val": "smol_str::SmolStr" + } + } + ] + } + ], + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::keyboard::NativeKeyCode": { + "identifier": "NativeKeyCode", + "crate": "bevy_input", + "path": "bevy_input::keyboard::NativeKeyCode", + "documentation": " Contains the platform-native physical key identifier\n\n The exact values vary from platform to platform (which is part of why this is a per-platform\n enum), but the values are primarily tied to the key's physical location on the keyboard.\n\n This enum is primarily used to store raw keycodes when Winit doesn't map a given native\n physical key identifier to a meaningful [`KeyCode`] variant. In the presence of identifiers we\n haven't mapped for you yet, this lets you use [`KeyCode`] to:\n\n - Correctly match key press and release events.\n - On non-web platforms, support assigning keybinds to virtually any key through a UI.", + "associated_functions": [ + "bevy_input::keyboard::NativeKeyCode::assert_receiver_is_total_eq", + "bevy_input::keyboard::NativeKeyCode::clone", + "bevy_input::keyboard::NativeKeyCode::eq" + ], + "layout": [ + { + "kind": "Unit", + "name": "Unidentified" + }, + { + "kind": "TupleStruct", + "name": "Android", + "fields": [ + { + "type": { + "primitive": "u32" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "MacOS", + "fields": [ + { + "type": { + "primitive": "u16" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Windows", + "fields": [ + { + "type": { + "primitive": "u16" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Xkb", + "fields": [ + { + "type": { + "primitive": "u32" + } + } + ] + } + ], + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::mouse::AccumulatedMouseMotion": { + "identifier": "AccumulatedMouseMotion", + "crate": "bevy_input", + "path": "bevy_input::mouse::AccumulatedMouseMotion", + "documentation": " Tracks how much the mouse has moved every frame.\n\n This resource is reset to zero every frame.\n\n This resource sums the total [`MouseMotion`] events received this frame.", + "associated_functions": [ + "bevy_input::mouse::AccumulatedMouseMotion::clone", + "bevy_input::mouse::AccumulatedMouseMotion::eq" + ], + "layout": { + "kind": "Struct", + "name": "AccumulatedMouseMotion", + "fields": [ + { + "name": "delta", + "type": { + "val": "glam::Vec2" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": true, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::mouse::AccumulatedMouseScroll": { + "identifier": "AccumulatedMouseScroll", + "crate": "bevy_input", + "path": "bevy_input::mouse::AccumulatedMouseScroll", + "documentation": " Tracks how much the mouse has scrolled every frame.\n\n This resource is reset to zero every frame.\n\n This resource sums the total [`MouseWheel`] events received this frame.", + "associated_functions": [ + "bevy_input::mouse::AccumulatedMouseScroll::clone", + "bevy_input::mouse::AccumulatedMouseScroll::eq" + ], + "layout": { + "kind": "Struct", + "name": "AccumulatedMouseScroll", + "fields": [ + { + "name": "unit", + "type": { + "val": "bevy_input::mouse::MouseScrollUnit" + } + }, + { + "name": "delta", + "type": { + "val": "glam::Vec2" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": true, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::mouse::MouseButton": { + "identifier": "MouseButton", + "crate": "bevy_input", + "path": "bevy_input::mouse::MouseButton", + "documentation": " A button on a mouse device.\n\n ## Usage\n\n It is used as the generic `T` value of an [`ButtonInput`] to create a `bevy`\n resource.\n\n ## Updating\n\n The resource is updated inside of the [`mouse_button_input_system`].", + "associated_functions": [ + "bevy_input::mouse::MouseButton::eq", + "bevy_input::mouse::MouseButton::clone", + "bevy_input::mouse::MouseButton::assert_receiver_is_total_eq" + ], + "layout": [ + { + "kind": "Unit", + "name": "Left" + }, + { + "kind": "Unit", + "name": "Right" + }, + { + "kind": "Unit", + "name": "Middle" + }, + { + "kind": "Unit", + "name": "Back" + }, + { + "kind": "Unit", + "name": "Forward" + }, + { + "kind": "TupleStruct", + "name": "Other", + "fields": [ + { + "type": { + "primitive": "u16" + } + } + ] + } + ], + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::mouse::MouseButtonInput": { + "identifier": "MouseButtonInput", + "crate": "bevy_input", + "path": "bevy_input::mouse::MouseButtonInput", + "documentation": " A mouse button input event.\n\n This event is the translated version of the `WindowEvent::MouseInput` from the `winit` crate.\n\n ## Usage\n\n The event is read inside of the [`mouse_button_input_system`]\n to update the [`ButtonInput`] resource.", + "associated_functions": [ + "bevy_input::mouse::MouseButtonInput::clone", + "bevy_input::mouse::MouseButtonInput::eq", + "bevy_input::mouse::MouseButtonInput::assert_receiver_is_total_eq" + ], + "layout": { + "kind": "Struct", + "name": "MouseButtonInput", + "fields": [ + { + "name": "button", + "type": { + "val": "bevy_input::mouse::MouseButton" + } + }, + { + "name": "state", + "type": { + "val": "bevy_input::ButtonState" + } + }, + { + "name": "window", + "type": { + "val": "bevy_ecs::entity::Entity" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::mouse::MouseMotion": { + "identifier": "MouseMotion", + "crate": "bevy_input", + "path": "bevy_input::mouse::MouseMotion", + "documentation": " An event reporting the change in physical position of a pointing device.\n\n This represents raw, unfiltered physical motion.\n It is the translated version of [`DeviceEvent::MouseMotion`] from the `winit` crate.\n\n All pointing devices connected to a single machine at the same time can emit the event independently.\n However, the event data does not make it possible to distinguish which device it is referring to.\n\n [`DeviceEvent::MouseMotion`]: https://docs.rs/winit/latest/winit/event/enum.DeviceEvent.html#variant.MouseMotion", + "associated_functions": [ + "bevy_input::mouse::MouseMotion::clone", + "bevy_input::mouse::MouseMotion::eq" + ], + "layout": { + "kind": "Struct", + "name": "MouseMotion", + "fields": [ + { + "name": "delta", + "type": { + "val": "glam::Vec2" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::mouse::MouseScrollUnit": { + "identifier": "MouseScrollUnit", + "crate": "bevy_input", + "path": "bevy_input::mouse::MouseScrollUnit", + "documentation": " The scroll unit.\n\n Describes how a value of a [`MouseWheel`] event has to be interpreted.\n\n The value of the event can either be interpreted as the amount of lines or the amount of pixels\n to scroll.", + "associated_functions": [ + "bevy_input::mouse::MouseScrollUnit::assert_receiver_is_total_eq", + "bevy_input::mouse::MouseScrollUnit::eq", + "bevy_input::mouse::MouseScrollUnit::clone" + ], + "layout": [ + { + "kind": "Unit", + "name": "Line" + }, + { + "kind": "Unit", + "name": "Pixel" + } + ], + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::mouse::MouseWheel": { + "identifier": "MouseWheel", + "crate": "bevy_input", + "path": "bevy_input::mouse::MouseWheel", + "documentation": " A mouse wheel event.\n\n This event is the translated version of the `WindowEvent::MouseWheel` from the `winit` crate.", + "associated_functions": [ + "bevy_input::mouse::MouseWheel::clone", + "bevy_input::mouse::MouseWheel::eq" + ], + "layout": { + "kind": "Struct", + "name": "MouseWheel", + "fields": [ + { + "name": "unit", + "type": { + "val": "bevy_input::mouse::MouseScrollUnit" + } + }, + { + "name": "x", + "type": { + "primitive": "f32" + } + }, + { + "name": "y", + "type": { + "primitive": "f32" + } + }, + { + "name": "window", + "type": { + "val": "bevy_ecs::entity::Entity" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::touch::ForceTouch": { + "identifier": "ForceTouch", + "crate": "bevy_input", + "path": "bevy_input::touch::ForceTouch", + "documentation": " A force description of a [`Touch`] input.", + "associated_functions": [ + "bevy_input::touch::ForceTouch::clone", + "bevy_input::touch::ForceTouch::eq" + ], + "layout": [ + { + "kind": "Struct", + "name": "Calibrated", + "fields": [ + { + "name": "force", + "type": { + "primitive": "f64" + } + }, + { + "name": "max_possible_force", + "type": { + "primitive": "f64" + } + }, + { + "name": "altitude_angle", + "type": { + "option": { + "primitive": "f64" + } + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Normalized", + "fields": [ + { + "type": { + "primitive": "f64" + } + } + ] + } + ], + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::touch::TouchInput": { + "identifier": "TouchInput", + "crate": "bevy_input", + "path": "bevy_input::touch::TouchInput", + "documentation": " A touch input event.\n\n ## Logic\n\n Every time the user touches the screen, a new [`TouchPhase::Started`] event with an unique\n identifier for the finger is generated. When the finger is lifted, the [`TouchPhase::Ended`]\n event is generated with the same finger id.\n\n After a [`TouchPhase::Started`] event has been emitted, there may be zero or more [`TouchPhase::Moved`]\n events when the finger is moved or the touch pressure changes.\n\n The finger id may be reused by the system after an [`TouchPhase::Ended`] event. The user\n should assume that a new [`TouchPhase::Started`] event received with the same id has nothing\n to do with the old finger and is a new finger.\n\n A [`TouchPhase::Canceled`] event is emitted when the system has canceled tracking this\n touch, such as when the window loses focus, or on iOS if the user moves the\n device against their face.\n\n ## Note\n\n This event is the translated version of the `WindowEvent::Touch` from the `winit` crate.\n It is available to the end user and can be used for game logic.", + "associated_functions": [ + "bevy_input::touch::TouchInput::clone", + "bevy_input::touch::TouchInput::eq" + ], + "layout": { + "kind": "Struct", + "name": "TouchInput", + "fields": [ + { + "name": "phase", + "type": { + "val": "bevy_input::touch::TouchPhase" + } + }, + { + "name": "position", + "type": { + "val": "glam::Vec2" + } + }, + { + "name": "window", + "type": { + "val": "bevy_ecs::entity::Entity" + } + }, + { + "name": "force", + "type": { + "option": { + "val": "bevy_input::touch::ForceTouch" + } + } + }, + { + "name": "id", + "type": { + "primitive": "u64" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::touch::TouchPhase": { + "identifier": "TouchPhase", + "crate": "bevy_input", + "path": "bevy_input::touch::TouchPhase", + "documentation": " A phase of a [`TouchInput`].\n\n ## Usage\n\n It is used to describe the phase of the touch input that is currently active.\n This includes a phase that indicates that a touch input has started or ended,\n or that a finger has moved. There is also a canceled phase that indicates that\n the system canceled the tracking of the finger.", + "associated_functions": [ + "bevy_input::touch::TouchPhase::clone", + "bevy_input::touch::TouchPhase::eq", + "bevy_input::touch::TouchPhase::assert_receiver_is_total_eq" + ], + "layout": [ + { + "kind": "Unit", + "name": "Started" + }, + { + "kind": "Unit", + "name": "Moved" + }, + { + "kind": "Unit", + "name": "Ended" + }, + { + "kind": "Unit", + "name": "Canceled" + } + ], + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::aspect_ratio::AspectRatio": { + "identifier": "AspectRatio", + "crate": "bevy_math", + "path": "bevy_math::aspect_ratio::AspectRatio", + "documentation": " An `AspectRatio` is the ratio of width to height.", + "associated_functions": [ + "bevy_math::aspect_ratio::AspectRatio::ratio", + "bevy_math::aspect_ratio::AspectRatio::clone", + "bevy_math::aspect_ratio::AspectRatio::inverse", + "bevy_math::aspect_ratio::AspectRatio::is_portrait", + "bevy_math::aspect_ratio::AspectRatio::is_square", + "bevy_math::aspect_ratio::AspectRatio::is_landscape", + "bevy_math::aspect_ratio::AspectRatio::eq" + ], + "layout": { + "kind": "TupleStruct", + "name": "AspectRatio", + "fields": [ + { + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::bounding::bounded2d::Aabb2d": { + "identifier": "Aabb2d", + "crate": "bevy_math", + "path": "bevy_math::bounding::bounded2d::Aabb2d", + "documentation": " A 2D axis-aligned bounding box, or bounding rectangle", + "associated_functions": [ + "bevy_math::bounding::bounded2d::Aabb2d::eq", + "bevy_math::bounding::bounded2d::Aabb2d::clone", + "bevy_math::bounding::bounded2d::Aabb2d::new", + "bevy_math::bounding::bounded2d::Aabb2d::closest_point", + "bevy_math::bounding::bounded2d::Aabb2d::bounding_circle" + ], + "layout": { + "kind": "Struct", + "name": "Aabb2d", + "fields": [ + { + "name": "min", + "type": { + "val": "glam::Vec2" + } + }, + { + "name": "max", + "type": { + "val": "glam::Vec2" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::bounding::bounded2d::BoundingCircle": { + "identifier": "BoundingCircle", + "crate": "bevy_math", + "path": "bevy_math::bounding::bounded2d::BoundingCircle", + "documentation": " A bounding circle", + "associated_functions": [ + "bevy_math::bounding::bounded2d::BoundingCircle::radius", + "bevy_math::bounding::bounded2d::BoundingCircle::aabb_2d", + "bevy_math::bounding::bounded2d::BoundingCircle::clone", + "bevy_math::bounding::bounded2d::BoundingCircle::new", + "bevy_math::bounding::bounded2d::BoundingCircle::eq", + "bevy_math::bounding::bounded2d::BoundingCircle::closest_point" + ], + "layout": { + "kind": "Struct", + "name": "BoundingCircle", + "fields": [ + { + "name": "center", + "type": { + "val": "glam::Vec2" + } + }, + { + "name": "circle", + "type": { + "val": "bevy_math::primitives::dim2::Circle" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::bounding::bounded3d::Aabb3d": { + "identifier": "Aabb3d", + "crate": "bevy_math", + "path": "bevy_math::bounding::bounded3d::Aabb3d", + "documentation": " A 3D axis-aligned bounding box", + "associated_functions": [ + "bevy_math::bounding::bounded3d::Aabb3d::clone", + "bevy_math::bounding::bounded3d::Aabb3d::bounding_sphere", + "bevy_math::bounding::bounded3d::Aabb3d::eq" + ], + "layout": { + "kind": "Struct", + "name": "Aabb3d", + "fields": [ + { + "name": "min", + "type": { + "val": "glam::Vec3A" + } + }, + { + "name": "max", + "type": { + "val": "glam::Vec3A" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::bounding::bounded3d::BoundingSphere": { + "identifier": "BoundingSphere", + "crate": "bevy_math", + "path": "bevy_math::bounding::bounded3d::BoundingSphere", + "documentation": " A bounding sphere", + "associated_functions": [ + "bevy_math::bounding::bounded3d::BoundingSphere::eq", + "bevy_math::bounding::bounded3d::BoundingSphere::aabb_3d", + "bevy_math::bounding::bounded3d::BoundingSphere::clone", + "bevy_math::bounding::bounded3d::BoundingSphere::radius" + ], + "layout": { + "kind": "Struct", + "name": "BoundingSphere", + "fields": [ + { + "name": "center", + "type": { + "val": "glam::Vec3A" + } + }, + { + "name": "sphere", + "type": { + "val": "bevy_math::primitives::dim3::Sphere" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::bounding::raycast2d::AabbCast2d": { + "identifier": "AabbCast2d", + "crate": "bevy_math", + "path": "bevy_math::bounding::raycast2d::AabbCast2d", + "documentation": " An intersection test that casts an [`Aabb2d`] along a ray.", + "associated_functions": [ + "bevy_math::bounding::raycast2d::AabbCast2d::new", + "bevy_math::bounding::raycast2d::AabbCast2d::aabb_collision_at", + "bevy_math::bounding::raycast2d::AabbCast2d::from_ray", + "bevy_math::bounding::raycast2d::AabbCast2d::clone" + ], + "layout": { + "kind": "Struct", + "name": "AabbCast2d", + "fields": [ + { + "name": "ray", + "type": { + "val": "bevy_math::bounding::raycast2d::RayCast2d" + } + }, + { + "name": "aabb", + "type": { + "val": "bevy_math::bounding::bounded2d::Aabb2d" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::bounding::raycast2d::BoundingCircleCast": { + "identifier": "BoundingCircleCast", + "crate": "bevy_math", + "path": "bevy_math::bounding::raycast2d::BoundingCircleCast", + "documentation": " An intersection test that casts a [`BoundingCircle`] along a ray.", + "associated_functions": [ + "bevy_math::bounding::raycast2d::BoundingCircleCast::circle_collision_at", + "bevy_math::bounding::raycast2d::BoundingCircleCast::clone", + "bevy_math::bounding::raycast2d::BoundingCircleCast::new", + "bevy_math::bounding::raycast2d::BoundingCircleCast::from_ray" + ], + "layout": { + "kind": "Struct", + "name": "BoundingCircleCast", + "fields": [ + { + "name": "ray", + "type": { + "val": "bevy_math::bounding::raycast2d::RayCast2d" + } + }, + { + "name": "circle", + "type": { + "val": "bevy_math::bounding::bounded2d::BoundingCircle" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::bounding::raycast2d::RayCast2d": { + "identifier": "RayCast2d", + "crate": "bevy_math", + "path": "bevy_math::bounding::raycast2d::RayCast2d", + "documentation": " A raycast intersection test for 2D bounding volumes", + "associated_functions": [ + "bevy_math::bounding::raycast2d::RayCast2d::from_ray", + "bevy_math::bounding::raycast2d::RayCast2d::clone", + "bevy_math::bounding::raycast2d::RayCast2d::circle_intersection_at", + "bevy_math::bounding::raycast2d::RayCast2d::direction_recip", + "bevy_math::bounding::raycast2d::RayCast2d::aabb_intersection_at", + "bevy_math::bounding::raycast2d::RayCast2d::new" + ], + "layout": { + "kind": "Struct", + "name": "RayCast2d", + "fields": [ + { + "name": "ray", + "type": { + "val": "bevy_math::ray::Ray2d" + } + }, + { + "name": "max", + "type": { + "primitive": "f32" + } + }, + { + "name": "direction_recip", + "type": { + "val": "glam::Vec2" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::bounding::raycast3d::AabbCast3d": { + "identifier": "AabbCast3d", + "crate": "bevy_math", + "path": "bevy_math::bounding::raycast3d::AabbCast3d", + "documentation": " An intersection test that casts an [`Aabb3d`] along a ray.", + "associated_functions": [ + "bevy_math::bounding::raycast3d::AabbCast3d::from_ray", + "bevy_math::bounding::raycast3d::AabbCast3d::aabb_collision_at", + "bevy_math::bounding::raycast3d::AabbCast3d::clone" + ], + "layout": { + "kind": "Struct", + "name": "AabbCast3d", + "fields": [ + { + "name": "ray", + "type": { + "val": "bevy_math::bounding::raycast3d::RayCast3d" + } + }, + { + "name": "aabb", + "type": { + "val": "bevy_math::bounding::bounded3d::Aabb3d" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::bounding::raycast3d::BoundingSphereCast": { + "identifier": "BoundingSphereCast", + "crate": "bevy_math", + "path": "bevy_math::bounding::raycast3d::BoundingSphereCast", + "documentation": " An intersection test that casts a [`BoundingSphere`] along a ray.", + "associated_functions": [ + "bevy_math::bounding::raycast3d::BoundingSphereCast::sphere_collision_at", + "bevy_math::bounding::raycast3d::BoundingSphereCast::from_ray", + "bevy_math::bounding::raycast3d::BoundingSphereCast::clone" + ], + "layout": { + "kind": "Struct", + "name": "BoundingSphereCast", + "fields": [ + { + "name": "ray", + "type": { + "val": "bevy_math::bounding::raycast3d::RayCast3d" + } + }, + { + "name": "sphere", + "type": { + "val": "bevy_math::bounding::bounded3d::BoundingSphere" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::bounding::raycast3d::RayCast3d": { + "identifier": "RayCast3d", + "crate": "bevy_math", + "path": "bevy_math::bounding::raycast3d::RayCast3d", + "documentation": " A raycast intersection test for 3D bounding volumes", + "associated_functions": [ + "bevy_math::bounding::raycast3d::RayCast3d::from_ray", + "bevy_math::bounding::raycast3d::RayCast3d::aabb_intersection_at", + "bevy_math::bounding::raycast3d::RayCast3d::sphere_intersection_at", + "bevy_math::bounding::raycast3d::RayCast3d::direction_recip", + "bevy_math::bounding::raycast3d::RayCast3d::clone" + ], + "layout": { + "kind": "Struct", + "name": "RayCast3d", + "fields": [ + { + "name": "origin", + "type": { + "val": "glam::Vec3A" + } + }, + { + "name": "direction", + "type": { + "val": "bevy_math::direction::Dir3A" + } + }, + { + "name": "max", + "type": { + "primitive": "f32" + } + }, + { + "name": "direction_recip", + "type": { + "val": "glam::Vec3A" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::compass::CompassOctant": { + "identifier": "CompassOctant", + "crate": "bevy_math", + "path": "bevy_math::compass::CompassOctant", + "documentation": " A compass enum with 8 directions.\n ```text\n N (North)\n ▲\n NW │ NE\n ╲ │ ╱\n W (West) ┼─────► E (East)\n ╱ │ ╲\n SW │ SE\n ▼\n S (South)\n ```", + "associated_functions": [ + "bevy_math::compass::CompassOctant::assert_receiver_is_total_eq", + "bevy_math::compass::CompassOctant::eq", + "bevy_math::compass::CompassOctant::clone", + "bevy_math::compass::CompassOctant::is_in_direction", + "bevy_math::compass::CompassOctant::neg", + "bevy_math::compass::CompassOctant::to_index", + "bevy_math::compass::CompassOctant::opposite" + ], + "layout": [ + { + "kind": "Unit", + "name": "North" + }, + { + "kind": "Unit", + "name": "NorthEast" + }, + { + "kind": "Unit", + "name": "East" + }, + { + "kind": "Unit", + "name": "SouthEast" + }, + { + "kind": "Unit", + "name": "South" + }, + { + "kind": "Unit", + "name": "SouthWest" + }, + { + "kind": "Unit", + "name": "West" + }, + { + "kind": "Unit", + "name": "NorthWest" + } + ], + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::compass::CompassQuadrant": { + "identifier": "CompassQuadrant", + "crate": "bevy_math", + "path": "bevy_math::compass::CompassQuadrant", + "documentation": " A compass enum with 4 directions.\n ```text\n N (North)\n ▲\n │\n │\n W (West) ┼─────► E (East)\n │\n │\n ▼\n S (South)\n ```", + "associated_functions": [ + "bevy_math::compass::CompassQuadrant::opposite", + "bevy_math::compass::CompassQuadrant::is_in_direction", + "bevy_math::compass::CompassQuadrant::neg", + "bevy_math::compass::CompassQuadrant::eq", + "bevy_math::compass::CompassQuadrant::assert_receiver_is_total_eq", + "bevy_math::compass::CompassQuadrant::to_index", + "bevy_math::compass::CompassQuadrant::clone" + ], + "layout": [ + { + "kind": "Unit", + "name": "North" + }, + { + "kind": "Unit", + "name": "East" + }, + { + "kind": "Unit", + "name": "South" + }, + { + "kind": "Unit", + "name": "West" + } + ], + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::curve::easing::EaseFunction": { + "identifier": "EaseFunction", + "crate": "bevy_math", + "path": "bevy_math::curve::easing::EaseFunction", + "documentation": " Curve functions over the [unit interval], commonly used for easing transitions.\n\n `EaseFunction` can be used on its own to interpolate between `0.0` and `1.0`.\n It can also be combined with [`EasingCurve`] to interpolate between other\n intervals and types, including vectors and rotations.\n\n # Example\n\n [`sample`] the smoothstep function at various points. This will return `None`\n if the parameter is outside the unit interval.\n\n ```\n # use bevy_math::prelude::*;\n let f = EaseFunction::SmoothStep;\n\n assert_eq!(f.sample(-1.0), None);\n assert_eq!(f.sample(0.0), Some(0.0));\n assert_eq!(f.sample(0.5), Some(0.5));\n assert_eq!(f.sample(1.0), Some(1.0));\n assert_eq!(f.sample(2.0), None);\n ```\n\n [`sample_clamped`] will clamp the parameter to the unit interval, so it\n always returns a value.\n\n ```\n # use bevy_math::prelude::*;\n # let f = EaseFunction::SmoothStep;\n assert_eq!(f.sample_clamped(-1.0), 0.0);\n assert_eq!(f.sample_clamped(0.0), 0.0);\n assert_eq!(f.sample_clamped(0.5), 0.5);\n assert_eq!(f.sample_clamped(1.0), 1.0);\n assert_eq!(f.sample_clamped(2.0), 1.0);\n ```\n\n [`sample`]: EaseFunction::sample\n [`sample_clamped`]: EaseFunction::sample_clamped\n [unit interval]: `Interval::UNIT`", + "associated_functions": [ + "bevy_math::curve::easing::EaseFunction::clone", + "bevy_math::curve::easing::EaseFunction::eq" + ], + "layout": [ + { + "kind": "Unit", + "name": "Linear" + }, + { + "kind": "Unit", + "name": "QuadraticIn" + }, + { + "kind": "Unit", + "name": "QuadraticOut" + }, + { + "kind": "Unit", + "name": "QuadraticInOut" + }, + { + "kind": "Unit", + "name": "CubicIn" + }, + { + "kind": "Unit", + "name": "CubicOut" + }, + { + "kind": "Unit", + "name": "CubicInOut" + }, + { + "kind": "Unit", + "name": "QuarticIn" + }, + { + "kind": "Unit", + "name": "QuarticOut" + }, + { + "kind": "Unit", + "name": "QuarticInOut" + }, + { + "kind": "Unit", + "name": "QuinticIn" + }, + { + "kind": "Unit", + "name": "QuinticOut" + }, + { + "kind": "Unit", + "name": "QuinticInOut" + }, + { + "kind": "Unit", + "name": "SmoothStepIn" + }, + { + "kind": "Unit", + "name": "SmoothStepOut" + }, + { + "kind": "Unit", + "name": "SmoothStep" + }, + { + "kind": "Unit", + "name": "SmootherStepIn" + }, + { + "kind": "Unit", + "name": "SmootherStepOut" + }, + { + "kind": "Unit", + "name": "SmootherStep" + }, + { + "kind": "Unit", + "name": "SineIn" + }, + { + "kind": "Unit", + "name": "SineOut" + }, + { + "kind": "Unit", + "name": "SineInOut" + }, + { + "kind": "Unit", + "name": "CircularIn" + }, + { + "kind": "Unit", + "name": "CircularOut" + }, + { + "kind": "Unit", + "name": "CircularInOut" + }, + { + "kind": "Unit", + "name": "ExponentialIn" + }, + { + "kind": "Unit", + "name": "ExponentialOut" + }, + { + "kind": "Unit", + "name": "ExponentialInOut" + }, + { + "kind": "Unit", + "name": "ElasticIn" + }, + { + "kind": "Unit", + "name": "ElasticOut" + }, + { + "kind": "Unit", + "name": "ElasticInOut" + }, + { + "kind": "Unit", + "name": "BackIn" + }, + { + "kind": "Unit", + "name": "BackOut" + }, + { + "kind": "Unit", + "name": "BackInOut" + }, + { + "kind": "Unit", + "name": "BounceIn" + }, + { + "kind": "Unit", + "name": "BounceOut" + }, + { + "kind": "Unit", + "name": "BounceInOut" + }, + { + "kind": "TupleStruct", + "name": "Steps", + "fields": [ + { + "type": { + "primitive": "usize" + } + }, + { + "type": { + "val": "bevy_math::curve::easing::JumpAt" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Elastic", + "fields": [ + { + "type": { + "primitive": "f32" + } + } + ] + } + ], + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::curve::easing::JumpAt": { + "identifier": "JumpAt", + "crate": "bevy_math", + "path": "bevy_math::curve::easing::JumpAt", + "documentation": " Configuration options for the [`EaseFunction::Steps`] curves. This closely replicates the\n [CSS step function specification].\n\n [CSS step function specification]: https://developer.mozilla.org/en-US/docs/Web/CSS/easing-function/steps#description", + "associated_functions": [ + "bevy_math::curve::easing::JumpAt::assert_receiver_is_total_eq", + "bevy_math::curve::easing::JumpAt::eq", + "bevy_math::curve::easing::JumpAt::clone" + ], + "layout": [ + { + "kind": "Unit", + "name": "Start" + }, + { + "kind": "Unit", + "name": "End" + }, + { + "kind": "Unit", + "name": "None" + }, + { + "kind": "Unit", + "name": "Both" + } + ], + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::curve::interval::Interval": { + "identifier": "Interval", + "crate": "bevy_math", + "path": "bevy_math::curve::interval::Interval", + "documentation": " A nonempty closed interval, possibly unbounded in either direction.\n\n In other words, the interval may stretch all the way to positive or negative infinity, but it\n will always have some nonempty interior.", + "associated_functions": [ + "bevy_math::curve::interval::Interval::has_finite_start", + "bevy_math::curve::interval::Interval::clone", + "bevy_math::curve::interval::Interval::end", + "bevy_math::curve::interval::Interval::start", + "bevy_math::curve::interval::Interval::contains_interval", + "bevy_math::curve::interval::Interval::eq", + "bevy_math::curve::interval::Interval::is_bounded", + "bevy_math::curve::interval::Interval::clamp", + "bevy_math::curve::interval::Interval::has_finite_end", + "bevy_math::curve::interval::Interval::length", + "bevy_math::curve::interval::Interval::contains" + ], + "layout": { + "kind": "Struct", + "name": "Interval", + "fields": [ + { + "name": "start", + "type": { + "primitive": "f32" + } + }, + { + "name": "end", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::direction::Dir2": { + "identifier": "Dir2", + "crate": "bevy_math", + "path": "bevy_math::direction::Dir2", + "documentation": " A normalized vector pointing in a direction in 2D space", + "associated_functions": [ + "bevy_math::direction::Dir2::rotation_from_x", + "bevy_math::direction::Dir2::new_unchecked", + "bevy_math::direction::Dir2::eq", + "bevy_math::direction::Dir2::slerp", + "bevy_math::direction::Dir2::rotation_to_x", + "bevy_math::direction::Dir2::rotation_from_y", + "bevy_math::direction::Dir2::rotation_to_y", + "bevy_math::direction::Dir2::neg", + "bevy_math::direction::Dir2::rotation_to", + "bevy_math::direction::Dir2::fast_renormalize", + "bevy_math::direction::Dir2::mul", + "bevy_math::direction::Dir2::as_vec2", + "bevy_math::direction::Dir2::clone", + "bevy_math::direction::Dir2::from_xy_unchecked", + "bevy_math::direction::Dir2::rotation_from" + ], + "layout": { + "kind": "TupleStruct", + "name": "Dir2", + "fields": [ + { + "type": { + "val": "glam::Vec2" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::direction::Dir3": { + "identifier": "Dir3", + "crate": "bevy_math", + "path": "bevy_math::direction::Dir3", + "documentation": " A normalized vector pointing in a direction in 3D space", + "associated_functions": [ + "bevy_math::direction::Dir3::new_unchecked", + "bevy_math::direction::Dir3::neg", + "bevy_math::direction::Dir3::eq", + "bevy_math::direction::Dir3::from_xyz_unchecked", + "bevy_math::direction::Dir3::fast_renormalize", + "bevy_math::direction::Dir3::clone", + "bevy_math::direction::Dir3::slerp", + "bevy_math::direction::Dir3::as_vec3", + "bevy_math::direction::Dir3::mul" + ], + "layout": { + "kind": "TupleStruct", + "name": "Dir3", + "fields": [ + { + "type": { + "val": "glam::Vec3" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::direction::Dir3A": { + "identifier": "Dir3A", + "crate": "bevy_math", + "path": "bevy_math::direction::Dir3A", + "documentation": " A normalized SIMD vector pointing in a direction in 3D space.\n\n This type stores a 16 byte aligned [`Vec3A`].\n This may or may not be faster than [`Dir3`]: make sure to benchmark!", + "associated_functions": [ + "bevy_math::direction::Dir3A::from_xyz_unchecked", + "bevy_math::direction::Dir3A::eq", + "bevy_math::direction::Dir3A::mul", + "bevy_math::direction::Dir3A::fast_renormalize", + "bevy_math::direction::Dir3A::new_unchecked", + "bevy_math::direction::Dir3A::as_vec3a", + "bevy_math::direction::Dir3A::clone", + "bevy_math::direction::Dir3A::neg", + "bevy_math::direction::Dir3A::slerp" + ], + "layout": { + "kind": "TupleStruct", + "name": "Dir3A", + "fields": [ + { + "type": { + "val": "glam::Vec3A" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::direction::Dir4": { + "identifier": "Dir4", + "crate": "bevy_math", + "path": "bevy_math::direction::Dir4", + "documentation": " A normalized vector pointing in a direction in 4D space", + "associated_functions": [ + "bevy_math::direction::Dir4::mul", + "bevy_math::direction::Dir4::new_unchecked", + "bevy_math::direction::Dir4::clone", + "bevy_math::direction::Dir4::fast_renormalize", + "bevy_math::direction::Dir4::eq", + "bevy_math::direction::Dir4::neg", + "bevy_math::direction::Dir4::as_vec4", + "bevy_math::direction::Dir4::from_xyzw_unchecked" + ], + "layout": { + "kind": "TupleStruct", + "name": "Dir4", + "fields": [ + { + "type": { + "val": "glam::Vec4" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::float_ord::FloatOrd": { + "identifier": "FloatOrd", + "crate": "bevy_math", + "path": "bevy_math::float_ord::FloatOrd", + "documentation": " A wrapper for floats that implements [`Ord`], [`Eq`], and [`Hash`] traits.\n\n This is a work around for the fact that the IEEE 754-2008 standard,\n implemented by Rust's [`f32`] type,\n doesn't define an ordering for [`NaN`](f32::NAN),\n and `NaN` is not considered equal to any other `NaN`.\n\n Wrapping a float with `FloatOrd` breaks conformance with the standard\n by sorting `NaN` as less than all other numbers and equal to any other `NaN`.", + "associated_functions": [ + "bevy_math::float_ord::FloatOrd::le", + "bevy_math::float_ord::FloatOrd::ge", + "bevy_math::float_ord::FloatOrd::eq", + "bevy_math::float_ord::FloatOrd::lt", + "bevy_math::float_ord::FloatOrd::gt", + "bevy_math::float_ord::FloatOrd::clone", + "bevy_math::float_ord::FloatOrd::neg" + ], + "layout": { + "kind": "TupleStruct", + "name": "FloatOrd", + "fields": [ + { + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::isometry::Isometry2d": { + "identifier": "Isometry2d", + "crate": "bevy_math", + "path": "bevy_math::isometry::Isometry2d", + "documentation": " An isometry in two dimensions, representing a rotation followed by a translation.\n This can often be useful for expressing relative positions and transformations from one position to another.\n\n In particular, this type represents a distance-preserving transformation known as a *rigid motion* or a *direct motion*,\n and belongs to the special [Euclidean group] SE(2). This includes translation and rotation, but excludes reflection.\n\n For the three-dimensional version, see [`Isometry3d`].\n\n [Euclidean group]: https://en.wikipedia.org/wiki/Euclidean_group\n\n # Example\n\n Isometries can be created from a given translation and rotation:\n\n ```\n # use bevy_math::{Isometry2d, Rot2, Vec2};\n #\n let iso = Isometry2d::new(Vec2::new(2.0, 1.0), Rot2::degrees(90.0));\n ```\n\n Or from separate parts:\n\n ```\n # use bevy_math::{Isometry2d, Rot2, Vec2};\n #\n let iso1 = Isometry2d::from_translation(Vec2::new(2.0, 1.0));\n let iso2 = Isometry2d::from_rotation(Rot2::degrees(90.0));\n ```\n\n The isometries can be used to transform points:\n\n ```\n # use approx::assert_abs_diff_eq;\n # use bevy_math::{Isometry2d, Rot2, Vec2};\n #\n let iso = Isometry2d::new(Vec2::new(2.0, 1.0), Rot2::degrees(90.0));\n let point = Vec2::new(4.0, 4.0);\n\n // These are equivalent\n let result = iso.transform_point(point);\n let result = iso * point;\n\n assert_eq!(result, Vec2::new(-2.0, 5.0));\n ```\n\n Isometries can also be composed together:\n\n ```\n # use bevy_math::{Isometry2d, Rot2, Vec2};\n #\n # let iso = Isometry2d::new(Vec2::new(2.0, 1.0), Rot2::degrees(90.0));\n # let iso1 = Isometry2d::from_translation(Vec2::new(2.0, 1.0));\n # let iso2 = Isometry2d::from_rotation(Rot2::degrees(90.0));\n #\n assert_eq!(iso1 * iso2, iso);\n ```\n\n One common operation is to compute an isometry representing the relative positions of two objects\n for things like intersection tests. This can be done with an inverse transformation:\n\n ```\n # use bevy_math::{Isometry2d, Rot2, Vec2};\n #\n let circle_iso = Isometry2d::from_translation(Vec2::new(2.0, 1.0));\n let rectangle_iso = Isometry2d::from_rotation(Rot2::degrees(90.0));\n\n // Compute the relative position and orientation between the two shapes\n let relative_iso = circle_iso.inverse() * rectangle_iso;\n\n // Or alternatively, to skip an extra rotation operation:\n let relative_iso = circle_iso.inverse_mul(rectangle_iso);\n ```", + "associated_functions": [ + "bevy_math::isometry::Isometry2d::new", + "bevy_math::isometry::Isometry2d::transform_point", + "bevy_math::isometry::Isometry2d::clone", + "bevy_math::isometry::Isometry2d::mul-2", + "bevy_math::isometry::Isometry2d::inverse", + "bevy_math::isometry::Isometry2d::from_xy", + "bevy_math::isometry::Isometry2d::mul-1", + "bevy_math::isometry::Isometry2d::from_translation", + "bevy_math::isometry::Isometry2d::mul", + "bevy_math::isometry::Isometry2d::from_rotation", + "bevy_math::isometry::Isometry2d::inverse_mul", + "bevy_math::isometry::Isometry2d::inverse_transform_point", + "bevy_math::isometry::Isometry2d::eq" + ], + "layout": { + "kind": "Struct", + "name": "Isometry2d", + "fields": [ + { + "name": "rotation", + "type": { + "val": "bevy_math::rotation2d::Rot2" + } + }, + { + "name": "translation", + "type": { + "val": "glam::Vec2" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::isometry::Isometry3d": { + "identifier": "Isometry3d", + "crate": "bevy_math", + "path": "bevy_math::isometry::Isometry3d", + "documentation": " An isometry in three dimensions, representing a rotation followed by a translation.\n This can often be useful for expressing relative positions and transformations from one position to another.\n\n In particular, this type represents a distance-preserving transformation known as a *rigid motion* or a *direct motion*,\n and belongs to the special [Euclidean group] SE(3). This includes translation and rotation, but excludes reflection.\n\n For the two-dimensional version, see [`Isometry2d`].\n\n [Euclidean group]: https://en.wikipedia.org/wiki/Euclidean_group\n\n # Example\n\n Isometries can be created from a given translation and rotation:\n\n ```\n # use bevy_math::{Isometry3d, Quat, Vec3};\n # use std::f32::consts::FRAC_PI_2;\n #\n let iso = Isometry3d::new(Vec3::new(2.0, 1.0, 3.0), Quat::from_rotation_z(FRAC_PI_2));\n ```\n\n Or from separate parts:\n\n ```\n # use bevy_math::{Isometry3d, Quat, Vec3};\n # use std::f32::consts::FRAC_PI_2;\n #\n let iso1 = Isometry3d::from_translation(Vec3::new(2.0, 1.0, 3.0));\n let iso2 = Isometry3d::from_rotation(Quat::from_rotation_z(FRAC_PI_2));\n ```\n\n The isometries can be used to transform points:\n\n ```\n # use approx::assert_relative_eq;\n # use bevy_math::{Isometry3d, Quat, Vec3};\n # use std::f32::consts::FRAC_PI_2;\n #\n let iso = Isometry3d::new(Vec3::new(2.0, 1.0, 3.0), Quat::from_rotation_z(FRAC_PI_2));\n let point = Vec3::new(4.0, 4.0, 4.0);\n\n // These are equivalent\n let result = iso.transform_point(point);\n let result = iso * point;\n\n assert_relative_eq!(result, Vec3::new(-2.0, 5.0, 7.0));\n ```\n\n Isometries can also be composed together:\n\n ```\n # use bevy_math::{Isometry3d, Quat, Vec3};\n # use std::f32::consts::FRAC_PI_2;\n #\n # let iso = Isometry3d::new(Vec3::new(2.0, 1.0, 3.0), Quat::from_rotation_z(FRAC_PI_2));\n # let iso1 = Isometry3d::from_translation(Vec3::new(2.0, 1.0, 3.0));\n # let iso2 = Isometry3d::from_rotation(Quat::from_rotation_z(FRAC_PI_2));\n #\n assert_eq!(iso1 * iso2, iso);\n ```\n\n One common operation is to compute an isometry representing the relative positions of two objects\n for things like intersection tests. This can be done with an inverse transformation:\n\n ```\n # use bevy_math::{Isometry3d, Quat, Vec3};\n # use std::f32::consts::FRAC_PI_2;\n #\n let sphere_iso = Isometry3d::from_translation(Vec3::new(2.0, 1.0, 3.0));\n let cuboid_iso = Isometry3d::from_rotation(Quat::from_rotation_z(FRAC_PI_2));\n\n // Compute the relative position and orientation between the two shapes\n let relative_iso = sphere_iso.inverse() * cuboid_iso;\n\n // Or alternatively, to skip an extra rotation operation:\n let relative_iso = sphere_iso.inverse_mul(cuboid_iso);\n ```", + "associated_functions": [ + "bevy_math::isometry::Isometry3d::eq", + "bevy_math::isometry::Isometry3d::mul-2", + "bevy_math::isometry::Isometry3d::from_xyz", + "bevy_math::isometry::Isometry3d::inverse_mul", + "bevy_math::isometry::Isometry3d::mul", + "bevy_math::isometry::Isometry3d::mul-1", + "bevy_math::isometry::Isometry3d::mul-3", + "bevy_math::isometry::Isometry3d::clone", + "bevy_math::isometry::Isometry3d::from_rotation", + "bevy_math::isometry::Isometry3d::inverse" + ], + "layout": { + "kind": "Struct", + "name": "Isometry3d", + "fields": [ + { + "name": "rotation", + "type": { + "val": "glam::Quat" + } + }, + { + "name": "translation", + "type": { + "val": "glam::Vec3A" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::primitives::dim2::Annulus": { + "identifier": "Annulus", + "crate": "bevy_math", + "path": "bevy_math::primitives::dim2::Annulus", + "documentation": " A primitive shape formed by the region between two circles, also known as a ring.", + "associated_functions": [ + "bevy_math::primitives::dim2::Annulus::thickness", + "bevy_math::primitives::dim2::Annulus::clone", + "bevy_math::primitives::dim2::Annulus::new", + "bevy_math::primitives::dim2::Annulus::diameter", + "bevy_math::primitives::dim2::Annulus::eq", + "bevy_math::primitives::dim2::Annulus::closest_point" + ], + "layout": { + "kind": "Struct", + "name": "Annulus", + "fields": [ + { + "name": "inner_circle", + "type": { + "val": "bevy_math::primitives::dim2::Circle" + } + }, + { + "name": "outer_circle", + "type": { + "val": "bevy_math::primitives::dim2::Circle" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::primitives::dim2::Arc2d": { + "identifier": "Arc2d", + "crate": "bevy_math", + "path": "bevy_math::primitives::dim2::Arc2d", + "documentation": " A primitive representing an arc between two points on a circle.\n\n An arc has no area.\n If you want to include the portion of a circle's area swept out by the arc,\n use the pie-shaped [`CircularSector`].\n If you want to include only the space inside the convex hull of the arc,\n use the bowl-shaped [`CircularSegment`].\n\n The arc is drawn starting from [`Vec2::Y`], extending by `half_angle` radians on\n either side. The center of the circle is the origin [`Vec2::ZERO`]. Note that this\n means that the origin may not be within the `Arc2d`'s convex hull.\n\n **Warning:** Arcs with negative angle or radius, or with angle greater than an entire circle, are not officially supported.\n It is recommended to normalize arcs to have an angle in [0, 2π].", + "associated_functions": [ + "bevy_math::primitives::dim2::Arc2d::clone", + "bevy_math::primitives::dim2::Arc2d::half_chord_length", + "bevy_math::primitives::dim2::Arc2d::right_endpoint", + "bevy_math::primitives::dim2::Arc2d::chord_midpoint", + "bevy_math::primitives::dim2::Arc2d::from_radians", + "bevy_math::primitives::dim2::Arc2d::left_endpoint", + "bevy_math::primitives::dim2::Arc2d::from_turns", + "bevy_math::primitives::dim2::Arc2d::apothem", + "bevy_math::primitives::dim2::Arc2d::is_minor", + "bevy_math::primitives::dim2::Arc2d::new", + "bevy_math::primitives::dim2::Arc2d::angle", + "bevy_math::primitives::dim2::Arc2d::chord_length", + "bevy_math::primitives::dim2::Arc2d::eq", + "bevy_math::primitives::dim2::Arc2d::is_major", + "bevy_math::primitives::dim2::Arc2d::midpoint", + "bevy_math::primitives::dim2::Arc2d::sagitta", + "bevy_math::primitives::dim2::Arc2d::from_degrees", + "bevy_math::primitives::dim2::Arc2d::length" + ], + "layout": { + "kind": "Struct", + "name": "Arc2d", + "fields": [ + { + "name": "radius", + "type": { + "primitive": "f32" + } + }, + { + "name": "half_angle", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::primitives::dim2::Capsule2d": { + "identifier": "Capsule2d", + "crate": "bevy_math", + "path": "bevy_math::primitives::dim2::Capsule2d", + "documentation": " A 2D capsule primitive, also known as a stadium or pill shape.\n\n A two-dimensional capsule is defined as a neighborhood of points at a distance (radius) from a line", + "associated_functions": [ + "bevy_math::primitives::dim2::Capsule2d::new", + "bevy_math::primitives::dim2::Capsule2d::clone", + "bevy_math::primitives::dim2::Capsule2d::eq", + "bevy_math::primitives::dim2::Capsule2d::to_inner_rectangle" + ], + "layout": { + "kind": "Struct", + "name": "Capsule2d", + "fields": [ + { + "name": "radius", + "type": { + "primitive": "f32" + } + }, + { + "name": "half_length", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::primitives::dim2::Circle": { + "identifier": "Circle", + "crate": "bevy_math", + "path": "bevy_math::primitives::dim2::Circle", + "documentation": " A circle primitive, representing the set of points some distance from the origin", + "associated_functions": [ + "bevy_math::primitives::dim2::Circle::clone", + "bevy_math::primitives::dim2::Circle::diameter", + "bevy_math::primitives::dim2::Circle::new", + "bevy_math::primitives::dim2::Circle::eq", + "bevy_math::primitives::dim2::Circle::closest_point" + ], + "layout": { + "kind": "Struct", + "name": "Circle", + "fields": [ + { + "name": "radius", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::primitives::dim2::CircularSector": { + "identifier": "CircularSector", + "crate": "bevy_math", + "path": "bevy_math::primitives::dim2::CircularSector", + "documentation": " A primitive representing a circular sector: a pie slice of a circle.\n\n The segment is positioned so that it always includes [`Vec2::Y`] and is vertically symmetrical.\n To orient the sector differently, apply a rotation.\n The sector is drawn with the center of its circle at the origin [`Vec2::ZERO`].\n\n **Warning:** Circular sectors with negative angle or radius, or with angle greater than an entire circle, are not officially supported.\n We recommend normalizing circular sectors to have an angle in [0, 2π].", + "associated_functions": [ + "bevy_math::primitives::dim2::CircularSector::arc_length", + "bevy_math::primitives::dim2::CircularSector::new", + "bevy_math::primitives::dim2::CircularSector::radius", + "bevy_math::primitives::dim2::CircularSector::eq", + "bevy_math::primitives::dim2::CircularSector::half_chord_length", + "bevy_math::primitives::dim2::CircularSector::from_radians", + "bevy_math::primitives::dim2::CircularSector::from_turns", + "bevy_math::primitives::dim2::CircularSector::sagitta", + "bevy_math::primitives::dim2::CircularSector::chord_length", + "bevy_math::primitives::dim2::CircularSector::chord_midpoint", + "bevy_math::primitives::dim2::CircularSector::clone", + "bevy_math::primitives::dim2::CircularSector::from_degrees", + "bevy_math::primitives::dim2::CircularSector::apothem", + "bevy_math::primitives::dim2::CircularSector::angle", + "bevy_math::primitives::dim2::CircularSector::half_angle" + ], + "layout": { + "kind": "Struct", + "name": "CircularSector", + "fields": [ + { + "name": "arc", + "type": { + "val": "bevy_math::primitives::dim2::Arc2d" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::primitives::dim2::CircularSegment": { + "identifier": "CircularSegment", + "crate": "bevy_math", + "path": "bevy_math::primitives::dim2::CircularSegment", + "documentation": " A primitive representing a circular segment:\n the area enclosed by the arc of a circle and its chord (the line between its endpoints).\n\n The segment is drawn starting from [`Vec2::Y`], extending equally on either side.\n To orient the segment differently, apply a rotation.\n The segment is drawn with the center of its circle at the origin [`Vec2::ZERO`].\n When positioning a segment, the [`apothem`](Self::apothem) function may be particularly useful.\n\n **Warning:** Circular segments with negative angle or radius, or with angle greater than an entire circle, are not officially supported.\n We recommend normalizing circular segments to have an angle in [0, 2π].", + "associated_functions": [ + "bevy_math::primitives::dim2::CircularSegment::from_turns", + "bevy_math::primitives::dim2::CircularSegment::angle", + "bevy_math::primitives::dim2::CircularSegment::half_chord_length", + "bevy_math::primitives::dim2::CircularSegment::from_degrees", + "bevy_math::primitives::dim2::CircularSegment::arc_length", + "bevy_math::primitives::dim2::CircularSegment::radius", + "bevy_math::primitives::dim2::CircularSegment::sagitta", + "bevy_math::primitives::dim2::CircularSegment::new", + "bevy_math::primitives::dim2::CircularSegment::half_angle", + "bevy_math::primitives::dim2::CircularSegment::apothem", + "bevy_math::primitives::dim2::CircularSegment::chord_midpoint", + "bevy_math::primitives::dim2::CircularSegment::clone", + "bevy_math::primitives::dim2::CircularSegment::chord_length", + "bevy_math::primitives::dim2::CircularSegment::eq", + "bevy_math::primitives::dim2::CircularSegment::from_radians" + ], + "layout": { + "kind": "Struct", + "name": "CircularSegment", + "fields": [ + { + "name": "arc", + "type": { + "val": "bevy_math::primitives::dim2::Arc2d" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::primitives::dim2::ConvexPolygon": { + "identifier": "ConvexPolygon", + "crate": "bevy_math", + "path": "bevy_math::primitives::dim2::ConvexPolygon", + "documentation": " A convex polygon with `N` vertices.", + "associated_functions": [ + "bevy_math::primitives::dim2::ConvexPolygon::eq", + "bevy_math::primitives::dim2::ConvexPolygon::clone" + ], + "layout": { + "kind": "Struct", + "name": "ConvexPolygon", + "fields": [ + { + "name": "vertices", + "type": { + "vec": { + "val": "glam::Vec2" + } + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::primitives::dim2::Ellipse": { + "identifier": "Ellipse", + "crate": "bevy_math", + "path": "bevy_math::primitives::dim2::Ellipse", + "documentation": " An ellipse primitive, which is like a circle, but the width and height can be different\n\n Ellipse does not implement [`Inset`] as concentric ellipses do not have parallel curves:\n if the ellipse is not a circle, the inset shape is not actually an ellipse (although it may look like one) but can also be a lens-like shape.", + "associated_functions": [ + "bevy_math::primitives::dim2::Ellipse::eccentricity", + "bevy_math::primitives::dim2::Ellipse::semi_minor", + "bevy_math::primitives::dim2::Ellipse::clone", + "bevy_math::primitives::dim2::Ellipse::semi_major", + "bevy_math::primitives::dim2::Ellipse::eq", + "bevy_math::primitives::dim2::Ellipse::from_size", + "bevy_math::primitives::dim2::Ellipse::new", + "bevy_math::primitives::dim2::Ellipse::focal_length" + ], + "layout": { + "kind": "Struct", + "name": "Ellipse", + "fields": [ + { + "name": "half_size", + "type": { + "val": "glam::Vec2" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::primitives::dim2::Line2d": { + "identifier": "Line2d", + "crate": "bevy_math", + "path": "bevy_math::primitives::dim2::Line2d", + "documentation": " An infinite line going through the origin along a direction in 2D space.\n\n For a finite line: [`Segment2d`]", + "associated_functions": [ + "bevy_math::primitives::dim2::Line2d::clone", + "bevy_math::primitives::dim2::Line2d::eq" + ], + "layout": { + "kind": "Struct", + "name": "Line2d", + "fields": [ + { + "name": "direction", + "type": { + "val": "bevy_math::direction::Dir2" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::primitives::dim2::Plane2d": { + "identifier": "Plane2d", + "crate": "bevy_math", + "path": "bevy_math::primitives::dim2::Plane2d", + "documentation": " An unbounded plane in 2D space. It forms a separating surface through the origin,\n stretching infinitely far", + "associated_functions": [ + "bevy_math::primitives::dim2::Plane2d::eq", + "bevy_math::primitives::dim2::Plane2d::clone", + "bevy_math::primitives::dim2::Plane2d::new" + ], + "layout": { + "kind": "Struct", + "name": "Plane2d", + "fields": [ + { + "name": "normal", + "type": { + "val": "bevy_math::direction::Dir2" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::primitives::dim2::Polygon": { + "identifier": "Polygon", + "crate": "bevy_math", + "path": "bevy_math::primitives::dim2::Polygon", + "documentation": " A polygon with N vertices.", + "associated_functions": [ + "bevy_math::primitives::dim2::Polygon::eq", + "bevy_math::primitives::dim2::Polygon::clone", + "bevy_math::primitives::dim2::Polygon::is_simple" + ], + "layout": { + "kind": "Struct", + "name": "Polygon", + "fields": [ + { + "name": "vertices", + "type": { + "vec": { + "val": "glam::Vec2" + } + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::primitives::dim2::Polyline2d": { + "identifier": "Polyline2d", + "crate": "bevy_math", + "path": "bevy_math::primitives::dim2::Polyline2d", + "documentation": " A series of connected line segments in 2D space.", + "associated_functions": [ + "bevy_math::primitives::dim2::Polyline2d::eq", + "bevy_math::primitives::dim2::Polyline2d::clone", + "bevy_math::primitives::dim2::Polyline2d::with_subdivisions" + ], + "layout": { + "kind": "Struct", + "name": "Polyline2d", + "fields": [ + { + "name": "vertices", + "type": { + "vec": { + "val": "glam::Vec2" + } + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::primitives::dim2::Rectangle": { + "identifier": "Rectangle", + "crate": "bevy_math", + "path": "bevy_math::primitives::dim2::Rectangle", + "documentation": " A rectangle primitive, which is like a square, except that the width and height can be different", + "associated_functions": [ + "bevy_math::primitives::dim2::Rectangle::closest_point", + "bevy_math::primitives::dim2::Rectangle::from_length", + "bevy_math::primitives::dim2::Rectangle::clone", + "bevy_math::primitives::dim2::Rectangle::size", + "bevy_math::primitives::dim2::Rectangle::eq", + "bevy_math::primitives::dim2::Rectangle::from_size", + "bevy_math::primitives::dim2::Rectangle::from_corners", + "bevy_math::primitives::dim2::Rectangle::new" + ], + "layout": { + "kind": "Struct", + "name": "Rectangle", + "fields": [ + { + "name": "half_size", + "type": { + "val": "glam::Vec2" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::primitives::dim2::RegularPolygon": { + "identifier": "RegularPolygon", + "crate": "bevy_math", + "path": "bevy_math::primitives::dim2::RegularPolygon", + "documentation": " A polygon centered on the origin where all vertices lie on a circle, equally far apart.", + "associated_functions": [ + "bevy_math::primitives::dim2::RegularPolygon::internal_angle_degrees", + "bevy_math::primitives::dim2::RegularPolygon::inradius", + "bevy_math::primitives::dim2::RegularPolygon::external_angle_degrees", + "bevy_math::primitives::dim2::RegularPolygon::circumradius", + "bevy_math::primitives::dim2::RegularPolygon::internal_angle_radians", + "bevy_math::primitives::dim2::RegularPolygon::side_length", + "bevy_math::primitives::dim2::RegularPolygon::external_angle_radians", + "bevy_math::primitives::dim2::RegularPolygon::new", + "bevy_math::primitives::dim2::RegularPolygon::clone", + "bevy_math::primitives::dim2::RegularPolygon::eq" + ], + "layout": { + "kind": "Struct", + "name": "RegularPolygon", + "fields": [ + { + "name": "circumcircle", + "type": { + "val": "bevy_math::primitives::dim2::Circle" + } + }, + { + "name": "sides", + "type": { + "primitive": "u32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::primitives::dim2::Rhombus": { + "identifier": "Rhombus", + "crate": "bevy_math", + "path": "bevy_math::primitives::dim2::Rhombus", + "documentation": " A rhombus primitive, also known as a diamond shape.\n A four sided polygon, centered on the origin, where opposite sides are parallel but without\n requiring right angles.", + "associated_functions": [ + "bevy_math::primitives::dim2::Rhombus::new", + "bevy_math::primitives::dim2::Rhombus::inradius", + "bevy_math::primitives::dim2::Rhombus::eq", + "bevy_math::primitives::dim2::Rhombus::clone", + "bevy_math::primitives::dim2::Rhombus::from_inradius", + "bevy_math::primitives::dim2::Rhombus::from_side", + "bevy_math::primitives::dim2::Rhombus::side", + "bevy_math::primitives::dim2::Rhombus::circumradius", + "bevy_math::primitives::dim2::Rhombus::closest_point" + ], + "layout": { + "kind": "Struct", + "name": "Rhombus", + "fields": [ + { + "name": "half_diagonals", + "type": { + "val": "glam::Vec2" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::primitives::dim2::Segment2d": { + "identifier": "Segment2d", + "crate": "bevy_math", + "path": "bevy_math::primitives::dim2::Segment2d", + "documentation": " A line segment defined by two endpoints in 2D space.", + "associated_functions": [ + "bevy_math::primitives::dim2::Segment2d::centered", + "bevy_math::primitives::dim2::Segment2d::new", + "bevy_math::primitives::dim2::Segment2d::center", + "bevy_math::primitives::dim2::Segment2d::reversed", + "bevy_math::primitives::dim2::Segment2d::right_normal", + "bevy_math::primitives::dim2::Segment2d::eq", + "bevy_math::primitives::dim2::Segment2d::scaled_direction", + "bevy_math::primitives::dim2::Segment2d::length_squared", + "bevy_math::primitives::dim2::Segment2d::point1", + "bevy_math::primitives::dim2::Segment2d::closest_point", + "bevy_math::primitives::dim2::Segment2d::point2", + "bevy_math::primitives::dim2::Segment2d::from_ray_and_length", + "bevy_math::primitives::dim2::Segment2d::resized", + "bevy_math::primitives::dim2::Segment2d::scaled_right_normal", + "bevy_math::primitives::dim2::Segment2d::from_direction_and_length", + "bevy_math::primitives::dim2::Segment2d::clone", + "bevy_math::primitives::dim2::Segment2d::direction", + "bevy_math::primitives::dim2::Segment2d::rotated_around_center", + "bevy_math::primitives::dim2::Segment2d::length", + "bevy_math::primitives::dim2::Segment2d::rotated", + "bevy_math::primitives::dim2::Segment2d::left_normal", + "bevy_math::primitives::dim2::Segment2d::translated", + "bevy_math::primitives::dim2::Segment2d::scaled_left_normal", + "bevy_math::primitives::dim2::Segment2d::from_scaled_direction", + "bevy_math::primitives::dim2::Segment2d::rotated_around", + "bevy_math::primitives::dim2::Segment2d::reverse" + ], + "layout": { + "kind": "Struct", + "name": "Segment2d", + "fields": [ + { + "name": "vertices", + "type": { + "array": [ + { + "val": "glam::Vec2" + }, + 2 + ] + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::primitives::dim2::Triangle2d": { + "identifier": "Triangle2d", + "crate": "bevy_math", + "path": "bevy_math::primitives::dim2::Triangle2d", + "documentation": " A triangle in 2D space", + "associated_functions": [ + "bevy_math::primitives::dim2::Triangle2d::new", + "bevy_math::primitives::dim2::Triangle2d::reversed", + "bevy_math::primitives::dim2::Triangle2d::is_obtuse", + "bevy_math::primitives::dim2::Triangle2d::is_acute", + "bevy_math::primitives::dim2::Triangle2d::is_degenerate", + "bevy_math::primitives::dim2::Triangle2d::eq", + "bevy_math::primitives::dim2::Triangle2d::clone", + "bevy_math::primitives::dim2::Triangle2d::reverse" + ], + "layout": { + "kind": "Struct", + "name": "Triangle2d", + "fields": [ + { + "name": "vertices", + "type": { + "array": [ + { + "val": "glam::Vec2" + }, + 3 + ] + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::primitives::dim3::Capsule3d": { + "identifier": "Capsule3d", + "crate": "bevy_math", + "path": "bevy_math::primitives::dim3::Capsule3d", + "documentation": " A 3D capsule primitive centered on the origin\n A three-dimensional capsule is defined as a surface at a distance (radius) from a line", + "associated_functions": [ + "bevy_math::primitives::dim3::Capsule3d::new", + "bevy_math::primitives::dim3::Capsule3d::eq", + "bevy_math::primitives::dim3::Capsule3d::clone", + "bevy_math::primitives::dim3::Capsule3d::to_cylinder" + ], + "layout": { + "kind": "Struct", + "name": "Capsule3d", + "fields": [ + { + "name": "radius", + "type": { + "primitive": "f32" + } + }, + { + "name": "half_length", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::primitives::dim3::Cone": { + "identifier": "Cone", + "crate": "bevy_math", + "path": "bevy_math::primitives::dim3::Cone", + "documentation": " A cone primitive centered on the midpoint between the tip of the cone and the center of its base.\n\n The cone is oriented with its tip pointing towards the Y axis.", + "associated_functions": [ + "bevy_math::primitives::dim3::Cone::slant_height", + "bevy_math::primitives::dim3::Cone::base_area", + "bevy_math::primitives::dim3::Cone::base", + "bevy_math::primitives::dim3::Cone::new", + "bevy_math::primitives::dim3::Cone::clone", + "bevy_math::primitives::dim3::Cone::eq", + "bevy_math::primitives::dim3::Cone::lateral_area" + ], + "layout": { + "kind": "Struct", + "name": "Cone", + "fields": [ + { + "name": "radius", + "type": { + "primitive": "f32" + } + }, + { + "name": "height", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::primitives::dim3::ConicalFrustum": { + "identifier": "ConicalFrustum", + "crate": "bevy_math", + "path": "bevy_math::primitives::dim3::ConicalFrustum", + "documentation": " A conical frustum primitive.\n A conical frustum can be created\n by slicing off a section of a cone.", + "associated_functions": [ + "bevy_math::primitives::dim3::ConicalFrustum::slant_height", + "bevy_math::primitives::dim3::ConicalFrustum::lateral_area", + "bevy_math::primitives::dim3::ConicalFrustum::bottom_base_area", + "bevy_math::primitives::dim3::ConicalFrustum::clone", + "bevy_math::primitives::dim3::ConicalFrustum::bottom_base", + "bevy_math::primitives::dim3::ConicalFrustum::eq", + "bevy_math::primitives::dim3::ConicalFrustum::top_base", + "bevy_math::primitives::dim3::ConicalFrustum::top_base_area" + ], + "layout": { + "kind": "Struct", + "name": "ConicalFrustum", + "fields": [ + { + "name": "radius_top", + "type": { + "primitive": "f32" + } + }, + { + "name": "radius_bottom", + "type": { + "primitive": "f32" + } + }, + { + "name": "height", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::primitives::dim3::Cuboid": { + "identifier": "Cuboid", + "crate": "bevy_math", + "path": "bevy_math::primitives::dim3::Cuboid", + "documentation": " A cuboid primitive, which is like a cube, except that the x, y, and z dimensions are not\n required to be the same.", + "associated_functions": [ + "bevy_math::primitives::dim3::Cuboid::from_length", + "bevy_math::primitives::dim3::Cuboid::from_size", + "bevy_math::primitives::dim3::Cuboid::size", + "bevy_math::primitives::dim3::Cuboid::closest_point", + "bevy_math::primitives::dim3::Cuboid::eq", + "bevy_math::primitives::dim3::Cuboid::new", + "bevy_math::primitives::dim3::Cuboid::from_corners", + "bevy_math::primitives::dim3::Cuboid::clone" + ], + "layout": { + "kind": "Struct", + "name": "Cuboid", + "fields": [ + { + "name": "half_size", + "type": { + "val": "glam::Vec3" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::primitives::dim3::Cylinder": { + "identifier": "Cylinder", + "crate": "bevy_math", + "path": "bevy_math::primitives::dim3::Cylinder", + "documentation": " A cylinder primitive centered on the origin", + "associated_functions": [ + "bevy_math::primitives::dim3::Cylinder::base", + "bevy_math::primitives::dim3::Cylinder::new", + "bevy_math::primitives::dim3::Cylinder::base_area", + "bevy_math::primitives::dim3::Cylinder::lateral_area", + "bevy_math::primitives::dim3::Cylinder::clone", + "bevy_math::primitives::dim3::Cylinder::eq" + ], + "layout": { + "kind": "Struct", + "name": "Cylinder", + "fields": [ + { + "name": "radius", + "type": { + "primitive": "f32" + } + }, + { + "name": "half_height", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::primitives::dim3::InfinitePlane3d": { + "identifier": "InfinitePlane3d", + "crate": "bevy_math", + "path": "bevy_math::primitives::dim3::InfinitePlane3d", + "documentation": " An unbounded plane in 3D space. It forms a separating surface through the origin,\n stretching infinitely far", + "associated_functions": [ + "bevy_math::primitives::dim3::InfinitePlane3d::clone", + "bevy_math::primitives::dim3::InfinitePlane3d::isometry_into_xy", + "bevy_math::primitives::dim3::InfinitePlane3d::eq", + "bevy_math::primitives::dim3::InfinitePlane3d::isometry_from_xy" + ], + "layout": { + "kind": "Struct", + "name": "InfinitePlane3d", + "fields": [ + { + "name": "normal", + "type": { + "val": "bevy_math::direction::Dir3" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::primitives::dim3::Line3d": { + "identifier": "Line3d", + "crate": "bevy_math", + "path": "bevy_math::primitives::dim3::Line3d", + "documentation": " An infinite line going through the origin along a direction in 3D space.\n\n For a finite line: [`Segment3d`]", + "associated_functions": [ + "bevy_math::primitives::dim3::Line3d::clone", + "bevy_math::primitives::dim3::Line3d::eq" + ], + "layout": { + "kind": "Struct", + "name": "Line3d", + "fields": [ + { + "name": "direction", + "type": { + "val": "bevy_math::direction::Dir3" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::primitives::dim3::Plane3d": { + "identifier": "Plane3d", + "crate": "bevy_math", + "path": "bevy_math::primitives::dim3::Plane3d", + "documentation": " A bounded plane in 3D space. It forms a surface starting from the origin with a defined height and width.", + "associated_functions": [ + "bevy_math::primitives::dim3::Plane3d::eq", + "bevy_math::primitives::dim3::Plane3d::clone", + "bevy_math::primitives::dim3::Plane3d::new" + ], + "layout": { + "kind": "Struct", + "name": "Plane3d", + "fields": [ + { + "name": "normal", + "type": { + "val": "bevy_math::direction::Dir3" + } + }, + { + "name": "half_size", + "type": { + "val": "glam::Vec2" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::primitives::dim3::Polyline3d": { + "identifier": "Polyline3d", + "crate": "bevy_math", + "path": "bevy_math::primitives::dim3::Polyline3d", + "documentation": " A series of connected line segments in 3D space.", + "associated_functions": [ + "bevy_math::primitives::dim3::Polyline3d::eq", + "bevy_math::primitives::dim3::Polyline3d::clone", + "bevy_math::primitives::dim3::Polyline3d::with_subdivisions" + ], + "layout": { + "kind": "Struct", + "name": "Polyline3d", + "fields": [ + { + "name": "vertices", + "type": { + "vec": { + "val": "glam::Vec3" + } + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::primitives::dim3::Segment3d": { + "identifier": "Segment3d", + "crate": "bevy_math", + "path": "bevy_math::primitives::dim3::Segment3d", + "documentation": " A line segment defined by two endpoints in 3D space.", + "associated_functions": [ + "bevy_math::primitives::dim3::Segment3d::direction", + "bevy_math::primitives::dim3::Segment3d::closest_point", + "bevy_math::primitives::dim3::Segment3d::from_ray_and_length", + "bevy_math::primitives::dim3::Segment3d::length_squared", + "bevy_math::primitives::dim3::Segment3d::eq", + "bevy_math::primitives::dim3::Segment3d::translated", + "bevy_math::primitives::dim3::Segment3d::rotated_around", + "bevy_math::primitives::dim3::Segment3d::reversed", + "bevy_math::primitives::dim3::Segment3d::reverse", + "bevy_math::primitives::dim3::Segment3d::rotated", + "bevy_math::primitives::dim3::Segment3d::length", + "bevy_math::primitives::dim3::Segment3d::from_scaled_direction", + "bevy_math::primitives::dim3::Segment3d::centered", + "bevy_math::primitives::dim3::Segment3d::point1", + "bevy_math::primitives::dim3::Segment3d::point2", + "bevy_math::primitives::dim3::Segment3d::center", + "bevy_math::primitives::dim3::Segment3d::rotated_around_center", + "bevy_math::primitives::dim3::Segment3d::resized", + "bevy_math::primitives::dim3::Segment3d::from_direction_and_length", + "bevy_math::primitives::dim3::Segment3d::clone", + "bevy_math::primitives::dim3::Segment3d::new", + "bevy_math::primitives::dim3::Segment3d::scaled_direction" + ], + "layout": { + "kind": "Struct", + "name": "Segment3d", + "fields": [ + { + "name": "vertices", + "type": { + "array": [ + { + "val": "glam::Vec3" + }, + 2 + ] + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::primitives::dim3::Sphere": { + "identifier": "Sphere", + "crate": "bevy_math", + "path": "bevy_math::primitives::dim3::Sphere", + "documentation": " A sphere primitive, representing the set of all points some distance from the origin", + "associated_functions": [ + "bevy_math::primitives::dim3::Sphere::clone", + "bevy_math::primitives::dim3::Sphere::eq", + "bevy_math::primitives::dim3::Sphere::new", + "bevy_math::primitives::dim3::Sphere::closest_point", + "bevy_math::primitives::dim3::Sphere::diameter" + ], + "layout": { + "kind": "Struct", + "name": "Sphere", + "fields": [ + { + "name": "radius", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::primitives::dim3::Tetrahedron": { + "identifier": "Tetrahedron", + "crate": "bevy_math", + "path": "bevy_math::primitives::dim3::Tetrahedron", + "documentation": " A tetrahedron primitive.", + "associated_functions": [ + "bevy_math::primitives::dim3::Tetrahedron::new", + "bevy_math::primitives::dim3::Tetrahedron::centroid", + "bevy_math::primitives::dim3::Tetrahedron::signed_volume", + "bevy_math::primitives::dim3::Tetrahedron::eq", + "bevy_math::primitives::dim3::Tetrahedron::clone" + ], + "layout": { + "kind": "Struct", + "name": "Tetrahedron", + "fields": [ + { + "name": "vertices", + "type": { + "array": [ + { + "val": "glam::Vec3" + }, + 4 + ] + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::primitives::dim3::Torus": { + "identifier": "Torus", + "crate": "bevy_math", + "path": "bevy_math::primitives::dim3::Torus", + "documentation": " A torus primitive, often representing a ring or donut shape\n The set of points some distance from a circle centered at the origin", + "associated_functions": [ + "bevy_math::primitives::dim3::Torus::new", + "bevy_math::primitives::dim3::Torus::eq", + "bevy_math::primitives::dim3::Torus::clone", + "bevy_math::primitives::dim3::Torus::inner_radius", + "bevy_math::primitives::dim3::Torus::outer_radius" + ], + "layout": { + "kind": "Struct", + "name": "Torus", + "fields": [ + { + "name": "minor_radius", + "type": { + "primitive": "f32" + } + }, + { + "name": "major_radius", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::primitives::dim3::Triangle3d": { + "identifier": "Triangle3d", + "crate": "bevy_math", + "path": "bevy_math::primitives::dim3::Triangle3d", + "documentation": " A 3D triangle primitive.", + "associated_functions": [ + "bevy_math::primitives::dim3::Triangle3d::centroid", + "bevy_math::primitives::dim3::Triangle3d::eq", + "bevy_math::primitives::dim3::Triangle3d::new", + "bevy_math::primitives::dim3::Triangle3d::is_obtuse", + "bevy_math::primitives::dim3::Triangle3d::reverse", + "bevy_math::primitives::dim3::Triangle3d::is_acute", + "bevy_math::primitives::dim3::Triangle3d::reversed", + "bevy_math::primitives::dim3::Triangle3d::clone", + "bevy_math::primitives::dim3::Triangle3d::circumcenter", + "bevy_math::primitives::dim3::Triangle3d::is_degenerate" + ], + "layout": { + "kind": "Struct", + "name": "Triangle3d", + "fields": [ + { + "name": "vertices", + "type": { + "array": [ + { + "val": "glam::Vec3" + }, + 3 + ] + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::ray::Ray2d": { + "identifier": "Ray2d", + "crate": "bevy_math", + "path": "bevy_math::ray::Ray2d", + "documentation": " An infinite half-line starting at `origin` and going in `direction` in 2D space.", + "associated_functions": [ + "bevy_math::ray::Ray2d::intersect_plane", + "bevy_math::ray::Ray2d::new", + "bevy_math::ray::Ray2d::get_point", + "bevy_math::ray::Ray2d::clone", + "bevy_math::ray::Ray2d::eq" + ], + "layout": { + "kind": "Struct", + "name": "Ray2d", + "fields": [ + { + "name": "origin", + "type": { + "val": "glam::Vec2" + } + }, + { + "name": "direction", + "type": { + "val": "bevy_math::direction::Dir2" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::ray::Ray3d": { + "identifier": "Ray3d", + "crate": "bevy_math", + "path": "bevy_math::ray::Ray3d", + "documentation": " An infinite half-line starting at `origin` and going in `direction` in 3D space.", + "associated_functions": [ + "bevy_math::ray::Ray3d::clone", + "bevy_math::ray::Ray3d::new", + "bevy_math::ray::Ray3d::intersect_plane", + "bevy_math::ray::Ray3d::eq", + "bevy_math::ray::Ray3d::get_point" + ], + "layout": { + "kind": "Struct", + "name": "Ray3d", + "fields": [ + { + "name": "origin", + "type": { + "val": "glam::Vec3" + } + }, + { + "name": "direction", + "type": { + "val": "bevy_math::direction::Dir3" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::rects::irect::IRect": { + "identifier": "IRect", + "crate": "bevy_math", + "path": "bevy_math::rects::irect::IRect", + "documentation": " A rectangle defined by two opposite corners.\n\n The rectangle is axis aligned, and defined by its minimum and maximum coordinates,\n stored in `IRect::min` and `IRect::max`, respectively. The minimum/maximum invariant\n must be upheld by the user when directly assigning the fields, otherwise some methods\n produce invalid results. It is generally recommended to use one of the constructor\n methods instead, which will ensure this invariant is met, unless you already have\n the minimum and maximum corners.", + "associated_functions": [ + "bevy_math::rects::irect::IRect::clone", + "bevy_math::rects::irect::IRect::half_size", + "bevy_math::rects::irect::IRect::new", + "bevy_math::rects::irect::IRect::union_point", + "bevy_math::rects::irect::IRect::as_rect", + "bevy_math::rects::irect::IRect::center", + "bevy_math::rects::irect::IRect::is_empty", + "bevy_math::rects::irect::IRect::eq", + "bevy_math::rects::irect::IRect::from_center_half_size", + "bevy_math::rects::irect::IRect::intersect", + "bevy_math::rects::irect::IRect::contains", + "bevy_math::rects::irect::IRect::size", + "bevy_math::rects::irect::IRect::union", + "bevy_math::rects::irect::IRect::height", + "bevy_math::rects::irect::IRect::inflate", + "bevy_math::rects::irect::IRect::from_corners", + "bevy_math::rects::irect::IRect::from_center_size", + "bevy_math::rects::irect::IRect::as_urect", + "bevy_math::rects::irect::IRect::width", + "bevy_math::rects::irect::IRect::assert_receiver_is_total_eq" + ], + "layout": { + "kind": "Struct", + "name": "IRect", + "fields": [ + { + "name": "min", + "type": { + "val": "glam::IVec2" + } + }, + { + "name": "max", + "type": { + "val": "glam::IVec2" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::rects::rect::Rect": { + "identifier": "Rect", + "crate": "bevy_math", + "path": "bevy_math::rects::rect::Rect", + "documentation": " A rectangle defined by two opposite corners.\n\n The rectangle is axis aligned, and defined by its minimum and maximum coordinates,\n stored in `Rect::min` and `Rect::max`, respectively. The minimum/maximum invariant\n must be upheld by the user when directly assigning the fields, otherwise some methods\n produce invalid results. It is generally recommended to use one of the constructor\n methods instead, which will ensure this invariant is met, unless you already have\n the minimum and maximum corners.", + "associated_functions": [ + "bevy_math::rects::rect::Rect::center", + "bevy_math::rects::rect::Rect::half_size", + "bevy_math::rects::rect::Rect::size", + "bevy_math::rects::rect::Rect::is_empty", + "bevy_math::rects::rect::Rect::union_point", + "bevy_math::rects::rect::Rect::new", + "bevy_math::rects::rect::Rect::union", + "bevy_math::rects::rect::Rect::intersect", + "bevy_math::rects::rect::Rect::contains", + "bevy_math::rects::rect::Rect::from_corners", + "bevy_math::rects::rect::Rect::height", + "bevy_math::rects::rect::Rect::inflate", + "bevy_math::rects::rect::Rect::as_urect", + "bevy_math::rects::rect::Rect::from_center_size", + "bevy_math::rects::rect::Rect::normalize", + "bevy_math::rects::rect::Rect::from_center_half_size", + "bevy_math::rects::rect::Rect::width", + "bevy_math::rects::rect::Rect::eq", + "bevy_math::rects::rect::Rect::as_irect", + "bevy_math::rects::rect::Rect::area", + "bevy_math::rects::rect::Rect::clone" + ], + "layout": { + "kind": "Struct", + "name": "Rect", + "fields": [ + { + "name": "min", + "type": { + "val": "glam::Vec2" + } + }, + { + "name": "max", + "type": { + "val": "glam::Vec2" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::rects::urect::URect": { + "identifier": "URect", + "crate": "bevy_math", + "path": "bevy_math::rects::urect::URect", + "documentation": " A rectangle defined by two opposite corners.\n\n The rectangle is axis aligned, and defined by its minimum and maximum coordinates,\n stored in `URect::min` and `URect::max`, respectively. The minimum/maximum invariant\n must be upheld by the user when directly assigning the fields, otherwise some methods\n produce invalid results. It is generally recommended to use one of the constructor\n methods instead, which will ensure this invariant is met, unless you already have\n the minimum and maximum corners.", + "associated_functions": [ + "bevy_math::rects::urect::URect::is_empty", + "bevy_math::rects::urect::URect::intersect", + "bevy_math::rects::urect::URect::union_point", + "bevy_math::rects::urect::URect::half_size", + "bevy_math::rects::urect::URect::center", + "bevy_math::rects::urect::URect::as_rect", + "bevy_math::rects::urect::URect::eq", + "bevy_math::rects::urect::URect::size", + "bevy_math::rects::urect::URect::as_irect", + "bevy_math::rects::urect::URect::clone", + "bevy_math::rects::urect::URect::from_center_size", + "bevy_math::rects::urect::URect::width", + "bevy_math::rects::urect::URect::inflate", + "bevy_math::rects::urect::URect::contains", + "bevy_math::rects::urect::URect::from_corners", + "bevy_math::rects::urect::URect::assert_receiver_is_total_eq", + "bevy_math::rects::urect::URect::union", + "bevy_math::rects::urect::URect::new", + "bevy_math::rects::urect::URect::from_center_half_size", + "bevy_math::rects::urect::URect::height" + ], + "layout": { + "kind": "Struct", + "name": "URect", + "fields": [ + { + "name": "min", + "type": { + "val": "glam::UVec2" + } + }, + { + "name": "max", + "type": { + "val": "glam::UVec2" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::rotation2d::Rot2": { + "identifier": "Rot2", + "crate": "bevy_math", + "path": "bevy_math::rotation2d::Rot2", + "documentation": " A 2D rotation.\n\n # Example\n\n ```\n # use approx::assert_relative_eq;\n # use bevy_math::{Rot2, Vec2};\n use std::f32::consts::PI;\n\n // Create rotations from counterclockwise angles in radians or degrees\n let rotation1 = Rot2::radians(PI / 2.0);\n let rotation2 = Rot2::degrees(45.0);\n\n // Get the angle back as radians or degrees\n assert_eq!(rotation1.as_degrees(), 90.0);\n assert_eq!(rotation2.as_radians(), PI / 4.0);\n\n // \"Add\" rotations together using `*`\n #[cfg(feature = \"approx\")]\n assert_relative_eq!(rotation1 * rotation2, Rot2::degrees(135.0));\n\n // Rotate vectors\n #[cfg(feature = \"approx\")]\n assert_relative_eq!(rotation1 * Vec2::X, Vec2::Y);\n ```", + "associated_functions": [ + "bevy_math::rotation2d::Rot2::slerp", + "bevy_math::rotation2d::Rot2::sin_cos", + "bevy_math::rotation2d::Rot2::is_finite", + "bevy_math::rotation2d::Rot2::normalize", + "bevy_math::rotation2d::Rot2::is_normalized", + "bevy_math::rotation2d::Rot2::is_near_identity", + "bevy_math::rotation2d::Rot2::clone", + "bevy_math::rotation2d::Rot2::length", + "bevy_math::rotation2d::Rot2::inverse", + "bevy_math::rotation2d::Rot2::as_radians", + "bevy_math::rotation2d::Rot2::mul-2", + "bevy_math::rotation2d::Rot2::eq", + "bevy_math::rotation2d::Rot2::from_sin_cos", + "bevy_math::rotation2d::Rot2::length_squared", + "bevy_math::rotation2d::Rot2::is_nan", + "bevy_math::rotation2d::Rot2::length_recip", + "bevy_math::rotation2d::Rot2::radians", + "bevy_math::rotation2d::Rot2::angle_to", + "bevy_math::rotation2d::Rot2::degrees", + "bevy_math::rotation2d::Rot2::nlerp", + "bevy_math::rotation2d::Rot2::fast_renormalize", + "bevy_math::rotation2d::Rot2::turn_fraction", + "bevy_math::rotation2d::Rot2::mul", + "bevy_math::rotation2d::Rot2::as_degrees", + "bevy_math::rotation2d::Rot2::as_turn_fraction", + "bevy_math::rotation2d::Rot2::mul-1" + ], + "layout": { + "kind": "Struct", + "name": "Rot2", + "fields": [ + { + "name": "cos", + "type": { + "primitive": "f32" + } + }, + { + "name": "sin", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_platform::time::Instant": { + "identifier": "Instant", + "crate": "bevy_platform", + "path": "bevy_platform::time::Instant", + "associated_functions": [ + "bevy_platform::time::Instant::eq", + "bevy_platform::time::Instant::saturating_duration_since", + "bevy_platform::time::Instant::assert_receiver_is_total_eq", + "bevy_platform::time::Instant::elapsed", + "bevy_platform::time::Instant::duration_since", + "bevy_platform::time::Instant::sub-1", + "bevy_platform::time::Instant::now", + "bevy_platform::time::Instant::add", + "bevy_platform::time::Instant::sub", + "bevy_platform::time::Instant::clone" + ], + "layout": null, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_time::fixed::Fixed": { + "identifier": "Fixed", + "crate": "bevy_time", + "path": "bevy_time::fixed::Fixed", + "documentation": " The fixed timestep game clock following virtual time.\n\n A specialization of the [`Time`] structure. **For method documentation, see\n [`Time#impl-Time`].**\n\n It is automatically inserted as a resource by\n [`TimePlugin`](crate::TimePlugin) and updated based on\n [`Time`](Virtual). The fixed clock is automatically set as the\n generic [`Time`] resource during [`FixedUpdate`](bevy_app::FixedUpdate)\n schedule processing.\n\n The fixed timestep clock advances in fixed-size increments, which is\n extremely useful for writing logic (like physics) that should have\n consistent behavior, regardless of framerate.\n\n The default [`timestep()`](Time::timestep) is 64 hertz, or 15625\n microseconds. This value was chosen because using 60 hertz has the potential\n for a pathological interaction with the monitor refresh rate where the game\n alternates between running two fixed timesteps and zero fixed timesteps per\n frame (for example when running two fixed timesteps takes longer than a\n frame). Additionally, the value is a power of two which losslessly converts\n into [`f32`] and [`f64`].\n\n To run a system on a fixed timestep, add it to one of the [`FixedMain`]\n schedules, most commonly [`FixedUpdate`](bevy_app::FixedUpdate).\n\n This schedule is run a number of times between\n [`PreUpdate`](bevy_app::PreUpdate) and [`Update`](bevy_app::Update)\n according to the accumulated [`overstep()`](Time::overstep) time divided by\n the [`timestep()`](Time::timestep). This means the schedule may run 0, 1 or\n more times during a single update (which typically corresponds to a rendered\n frame).\n\n `Time` and the generic [`Time`] resource will report a\n [`delta()`](Time::delta) equal to [`timestep()`](Time::timestep) and always\n grow [`elapsed()`](Time::elapsed) by one [`timestep()`](Time::timestep) per\n iteration.\n\n The fixed timestep clock follows the [`Time`](Virtual) clock, which\n means it is affected by [`pause()`](Time::pause),\n [`set_relative_speed()`](Time::set_relative_speed) and\n [`set_max_delta()`](Time::set_max_delta) from virtual time. If the virtual\n clock is paused, the [`FixedUpdate`](bevy_app::FixedUpdate) schedule will\n not run. It is guaranteed that the [`elapsed()`](Time::elapsed) time in\n `Time` is always between the previous `elapsed()` and the current\n `elapsed()` value in `Time`, so the values are compatible.\n\n Changing the timestep size while the game is running should not normally be\n done, as having a regular interval is the point of this schedule, but it may\n be necessary for effects like \"bullet-time\" if the normal granularity of the\n fixed timestep is too big for the slowed down time. In this case,\n [`set_timestep()`](Time::set_timestep) and be called to set a new value. The\n new value will be used immediately for the next run of the\n [`FixedUpdate`](bevy_app::FixedUpdate) schedule, meaning that it will affect\n the [`delta()`](Time::delta) value for the very next\n [`FixedUpdate`](bevy_app::FixedUpdate), even if it is still during the same\n frame. Any [`overstep()`](Time::overstep) present in the accumulator will be\n processed according to the new [`timestep()`](Time::timestep) value.", + "associated_functions": [ + "bevy_time::fixed::Fixed::clone" + ], + "layout": { + "kind": "Struct", + "name": "Fixed", + "fields": [ + { + "name": "timestep", + "type": { + "val": "core::time::Duration" + } + }, + { + "name": "overstep", + "type": { + "val": "core::time::Duration" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_time::real::Real": { + "identifier": "Real", + "crate": "bevy_time", + "path": "bevy_time::real::Real", + "documentation": " Real time clock representing elapsed wall clock time.\n\n A specialization of the [`Time`] structure. **For method documentation, see\n [`Time#impl-Time`].**\n\n It is automatically inserted as a resource by\n [`TimePlugin`](crate::TimePlugin) and updated with time instants according\n to [`TimeUpdateStrategy`](crate::TimeUpdateStrategy).[^disclaimer]\n\n Note:\n Using [`TimeUpdateStrategy::ManualDuration`](crate::TimeUpdateStrategy::ManualDuration)\n allows for mocking the wall clock for testing purposes.\n Besides this use case, it is not recommended to do this, as it will no longer\n represent \"wall clock\" time as intended.\n\n The [`delta()`](Time::delta) and [`elapsed()`](Time::elapsed) values of this\n clock should be used for anything which deals specifically with real time\n (wall clock time). It will not be affected by relative game speed\n adjustments, pausing or other adjustments.[^disclaimer]\n\n The clock does not count time from [`startup()`](Time::startup) to\n [`first_update()`](Time::first_update()) into elapsed, but instead will\n start counting time from the first update call. [`delta()`](Time::delta) and\n [`elapsed()`](Time::elapsed) will report zero on the first update as there\n is no previous update instant. This means that a [`delta()`](Time::delta) of\n zero must be handled without errors in application logic, as it may\n theoretically also happen at other times.\n\n [`Instant`]s for [`startup()`](Time::startup),\n [`first_update()`](Time::first_update) and\n [`last_update()`](Time::last_update) are recorded and accessible.\n\n [^disclaimer]: When using [`TimeUpdateStrategy::ManualDuration`](crate::TimeUpdateStrategy::ManualDuration),\n [`Time#impl-Time`] is only a *mock* of wall clock time.\n", + "associated_functions": [ + "bevy_time::real::Real::clone" + ], + "layout": { + "kind": "Struct", + "name": "Real", + "fields": [ + { + "name": "startup", + "type": { + "val": "bevy_platform::time::Instant" + } + }, + { + "name": "first_update", + "type": { + "option": { + "val": "bevy_platform::time::Instant" + } + } + }, + { + "name": "last_update", + "type": { + "option": { + "val": "bevy_platform::time::Instant" + } + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_time::stopwatch::Stopwatch": { + "identifier": "Stopwatch", + "crate": "bevy_time", + "path": "bevy_time::stopwatch::Stopwatch", + "documentation": " A Stopwatch is a struct that tracks elapsed time when started.\n\n Note that in order to advance the stopwatch [`tick`](Stopwatch::tick) **MUST** be called.\n # Examples\n\n ```\n # use bevy_time::*;\n use std::time::Duration;\n let mut stopwatch = Stopwatch::new();\n assert_eq!(stopwatch.elapsed_secs(), 0.0);\n\n stopwatch.tick(Duration::from_secs_f32(1.0)); // tick one second\n assert_eq!(stopwatch.elapsed_secs(), 1.0);\n\n stopwatch.pause();\n stopwatch.tick(Duration::from_secs_f32(1.0)); // paused stopwatches don't tick\n assert_eq!(stopwatch.elapsed_secs(), 1.0);\n\n stopwatch.reset(); // reset the stopwatch\n assert!(stopwatch.is_paused());\n assert_eq!(stopwatch.elapsed_secs(), 0.0);\n ```", + "associated_functions": [ + "bevy_time::stopwatch::Stopwatch::elapsed_secs", + "bevy_time::stopwatch::Stopwatch::pause", + "bevy_time::stopwatch::Stopwatch::clone", + "bevy_time::stopwatch::Stopwatch::reset", + "bevy_time::stopwatch::Stopwatch::assert_receiver_is_total_eq", + "bevy_time::stopwatch::Stopwatch::set_elapsed", + "bevy_time::stopwatch::Stopwatch::eq", + "bevy_time::stopwatch::Stopwatch::new", + "bevy_time::stopwatch::Stopwatch::elapsed_secs_f64", + "bevy_time::stopwatch::Stopwatch::is_paused", + "bevy_time::stopwatch::Stopwatch::unpause", + "bevy_time::stopwatch::Stopwatch::elapsed" + ], + "layout": { + "kind": "Struct", + "name": "Stopwatch", + "fields": [ + { + "name": "elapsed", + "type": { + "val": "core::time::Duration" + } + }, + { + "name": "is_paused", + "type": { + "primitive": "bool" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_time::timer::Timer": { + "identifier": "Timer", + "crate": "bevy_time", + "path": "bevy_time::timer::Timer", + "documentation": " Tracks elapsed time. Enters the finished state once `duration` is reached.\n\n Note that in order to advance the timer [`tick`](Timer::tick) **MUST** be called.\n\n # Timer modes\n\n There are two timer modes ([`TimerMode`]):\n\n - Non repeating timers will stop tracking and stay in the finished state until reset.\n - Repeating timers will only be in the finished state on each tick `duration` is reached or\n exceeded, and can still be reset at any given point.\n\n # Pausing timers\n\n You can pause a timer using [`Timer::pause`]. Paused timers will not have elapsed time increased.\n\n # Elapsing multiple times a frame\n\n Repeating timers might elapse multiple times per frame if the time is advanced by more than the timer duration.\n You can check how many times a timer elapsed each tick with [`Timer::times_finished_this_tick`].\n For non-repeating timers, this will always be 0 or 1.", + "associated_functions": [ + "bevy_time::timer::Timer::from_seconds", + "bevy_time::timer::Timer::elapsed_secs_f64", + "bevy_time::timer::Timer::unpause", + "bevy_time::timer::Timer::clone", + "bevy_time::timer::Timer::remaining", + "bevy_time::timer::Timer::new", + "bevy_time::timer::Timer::mode", + "bevy_time::timer::Timer::fraction_remaining", + "bevy_time::timer::Timer::assert_receiver_is_total_eq", + "bevy_time::timer::Timer::fraction", + "bevy_time::timer::Timer::set_duration", + "bevy_time::timer::Timer::reset", + "bevy_time::timer::Timer::is_paused", + "bevy_time::timer::Timer::eq", + "bevy_time::timer::Timer::duration", + "bevy_time::timer::Timer::elapsed_secs", + "bevy_time::timer::Timer::just_finished", + "bevy_time::timer::Timer::finish", + "bevy_time::timer::Timer::pause", + "bevy_time::timer::Timer::is_finished", + "bevy_time::timer::Timer::elapsed", + "bevy_time::timer::Timer::set_mode", + "bevy_time::timer::Timer::almost_finish", + "bevy_time::timer::Timer::set_elapsed", + "bevy_time::timer::Timer::remaining_secs", + "bevy_time::timer::Timer::times_finished_this_tick" + ], + "layout": { + "kind": "Struct", + "name": "Timer", + "fields": [ + { + "name": "stopwatch", + "type": { + "val": "bevy_time::stopwatch::Stopwatch" + } + }, + { + "name": "duration", + "type": { + "val": "core::time::Duration" + } + }, + { + "name": "mode", + "type": { + "val": "bevy_time::timer::TimerMode" + } + }, + { + "name": "finished", + "type": { + "primitive": "bool" + } + }, + { + "name": "times_finished_this_tick", + "type": { + "primitive": "u32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_time::timer::TimerMode": { + "identifier": "TimerMode", + "crate": "bevy_time", + "path": "bevy_time::timer::TimerMode", + "documentation": " Specifies [`Timer`] behavior.", + "associated_functions": [ + "bevy_time::timer::TimerMode::clone", + "bevy_time::timer::TimerMode::eq", + "bevy_time::timer::TimerMode::assert_receiver_is_total_eq" + ], + "layout": [ + { + "kind": "Unit", + "name": "Once" + }, + { + "kind": "Unit", + "name": "Repeating" + } + ], + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_time::virt::Virtual": { + "identifier": "Virtual", + "crate": "bevy_time", + "path": "bevy_time::virt::Virtual", + "documentation": " The virtual game clock representing game time.\n\n A specialization of the [`Time`] structure. **For method documentation, see\n [`Time#impl-Time`].**\n\n Normally used as `Time`. It is automatically inserted as a resource\n by [`TimePlugin`](crate::TimePlugin) and updated based on\n [`Time`](Real). The virtual clock is automatically set as the default\n generic [`Time`] resource for the update.\n\n The virtual clock differs from real time clock in that it can be paused, sped up\n and slowed down. It also limits how much it can advance in a single update\n in order to prevent unexpected behavior in cases where updates do not happen\n at regular intervals (e.g. coming back after the program was suspended a long time).\n\n The virtual clock can be paused by calling [`pause()`](Time::pause) and\n unpaused by calling [`unpause()`](Time::unpause). When the game clock is\n paused [`delta()`](Time::delta) will be zero on each update, and\n [`elapsed()`](Time::elapsed) will not grow.\n [`effective_speed()`](Time::effective_speed) will return `0.0`. Calling\n [`pause()`](Time::pause) will not affect value the [`delta()`](Time::delta)\n value for the update currently being processed.\n\n The speed of the virtual clock can be changed by calling\n [`set_relative_speed()`](Time::set_relative_speed). A value of `2.0` means\n that virtual clock should advance twice as fast as real time, meaning that\n [`delta()`](Time::delta) values will be double of what\n [`Time::delta()`](Time::delta) reports and\n [`elapsed()`](Time::elapsed) will go twice as fast as\n [`Time::elapsed()`](Time::elapsed). Calling\n [`set_relative_speed()`](Time::set_relative_speed) will not affect the\n [`delta()`](Time::delta) value for the update currently being processed.\n\n The maximum amount of delta time that can be added by a single update can be\n set by [`set_max_delta()`](Time::set_max_delta). This value serves a dual\n purpose in the virtual clock.\n\n If the game temporarily freezes due to any reason, such as disk access, a\n blocking system call, or operating system level suspend, reporting the full\n elapsed delta time is likely to cause bugs in game logic. Usually if a\n laptop is suspended for an hour, it doesn't make sense to try to simulate\n the game logic for the elapsed hour when resuming. Instead it is better to\n lose the extra time and pretend a shorter duration of time passed. Setting\n [`max_delta()`](Time::max_delta) to a relatively short time means that the\n impact on game logic will be minimal.\n\n If the game lags for some reason, meaning that it will take a longer time to\n compute a frame than the real time that passes during the computation, then\n we would fall behind in processing virtual time. If this situation persists,\n and computing a frame takes longer depending on how much virtual time has\n passed, the game would enter a \"death spiral\" where computing each frame\n takes longer and longer and the game will appear to freeze. By limiting the\n maximum time that can be added at once, we also limit the amount of virtual\n time the game needs to compute for each frame. This means that the game will\n run slow, and it will run slower than real time, but it will not freeze and\n it will recover as soon as computation becomes fast again.\n\n You should set [`max_delta()`](Time::max_delta) to a value that is\n approximately the minimum FPS your game should have even if heavily lagged\n for a moment. The actual FPS when lagged will be somewhat lower than this,\n depending on how much more time it takes to compute a frame compared to real\n time. You should also consider how stable your FPS is, as the limit will\n also dictate how big of an FPS drop you can accept without losing time and\n falling behind real time.", + "associated_functions": [ + "bevy_time::virt::Virtual::clone" + ], + "layout": { + "kind": "Struct", + "name": "Virtual", + "fields": [ + { + "name": "max_delta", + "type": { + "val": "core::time::Duration" + } + }, + { + "name": "paused", + "type": { + "primitive": "bool" + } + }, + { + "name": "relative_speed", + "type": { + "primitive": "f64" + } + }, + { + "name": "effective_speed", + "type": { + "primitive": "f64" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_transform::components::global_transform::GlobalTransform": { + "identifier": "GlobalTransform", + "crate": "bevy_transform", + "path": "bevy_transform::components::global_transform::GlobalTransform", + "documentation": " [`GlobalTransform`] is an affine transformation from entity-local coordinates to worldspace coordinates.\n\n You cannot directly mutate [`GlobalTransform`]; instead, you change an entity's transform by manipulating\n its [`Transform`], which indirectly causes Bevy to update its [`GlobalTransform`].\n\n * To get the global transform of an entity, you should get its [`GlobalTransform`].\n * For transform hierarchies to work correctly, you must have both a [`Transform`] and a [`GlobalTransform`].\n [`GlobalTransform`] is automatically inserted whenever [`Transform`] is inserted.\n\n ## [`Transform`] and [`GlobalTransform`]\n\n [`Transform`] transforms an entity relative to its parent's reference frame, or relative to world space coordinates,\n if it doesn't have a [`ChildOf`](bevy_ecs::hierarchy::ChildOf) component.\n\n [`GlobalTransform`] is managed by Bevy; it is computed by successively applying the [`Transform`] of each ancestor\n entity which has a Transform. This is done automatically by Bevy-internal systems in the [`TransformSystems::Propagate`]\n system set.\n\n This system runs during [`PostUpdate`](bevy_app::PostUpdate). If you\n update the [`Transform`] of an entity in this schedule or after, you will notice a 1 frame lag\n before the [`GlobalTransform`] is updated.\n\n [`TransformSystems::Propagate`]: crate::TransformSystems::Propagate\n\n # Examples\n\n - [`transform`][transform_example]\n\n [transform_example]: https://github.com/bevyengine/bevy/blob/latest/examples/transforms/transform.rs", + "associated_functions": [ + "bevy_transform::components::global_transform::GlobalTransform::mul-1", + "bevy_transform::components::global_transform::GlobalTransform::reparented_to", + "bevy_transform::components::global_transform::GlobalTransform::translation_vec3a", + "bevy_transform::components::global_transform::GlobalTransform::from_xyz", + "bevy_transform::components::global_transform::GlobalTransform::from_translation", + "bevy_transform::components::global_transform::GlobalTransform::from_isometry", + "bevy_transform::components::global_transform::GlobalTransform::to_matrix", + "bevy_transform::components::global_transform::GlobalTransform::affine", + "bevy_transform::components::global_transform::GlobalTransform::down", + "bevy_transform::components::global_transform::GlobalTransform::from_rotation", + "bevy_transform::components::global_transform::GlobalTransform::transform_point", + "bevy_transform::components::global_transform::GlobalTransform::translation", + "bevy_transform::components::global_transform::GlobalTransform::clone", + "bevy_transform::components::global_transform::GlobalTransform::up", + "bevy_transform::components::global_transform::GlobalTransform::compute_transform", + "bevy_transform::components::global_transform::GlobalTransform::to_isometry", + "bevy_transform::components::global_transform::GlobalTransform::scale", + "bevy_transform::components::global_transform::GlobalTransform::left", + "bevy_transform::components::global_transform::GlobalTransform::rotation", + "bevy_transform::components::global_transform::GlobalTransform::mul-2", + "bevy_transform::components::global_transform::GlobalTransform::from_scale", + "bevy_transform::components::global_transform::GlobalTransform::mul_transform", + "bevy_transform::components::global_transform::GlobalTransform::eq", + "bevy_transform::components::global_transform::GlobalTransform::mul", + "bevy_transform::components::global_transform::GlobalTransform::right", + "bevy_transform::components::global_transform::GlobalTransform::forward", + "bevy_transform::components::global_transform::GlobalTransform::radius_vec3a", + "bevy_transform::components::global_transform::GlobalTransform::back" + ], + "layout": { + "kind": "TupleStruct", + "name": "GlobalTransform", + "fields": [ + { + "type": { + "val": "glam::Affine3A" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_transform::components::transform::Transform": { + "identifier": "Transform", + "crate": "bevy_transform", + "path": "bevy_transform::components::transform::Transform", + "documentation": " Describe the position of an entity. If the entity has a parent, the position is relative\n to its parent position.\n\n * To place or move an entity, you should set its [`Transform`].\n * To get the global transform of an entity, you should get its [`GlobalTransform`].\n * To be displayed, an entity must have both a [`Transform`] and a [`GlobalTransform`].\n [`GlobalTransform`] is automatically inserted whenever [`Transform`] is inserted.\n\n ## [`Transform`] and [`GlobalTransform`]\n\n [`Transform`] is the position of an entity relative to its parent position, or the reference\n frame if it doesn't have a [`ChildOf`](bevy_ecs::hierarchy::ChildOf) component.\n\n [`GlobalTransform`] is the position of an entity relative to the reference frame.\n\n [`GlobalTransform`] is updated from [`Transform`] in the [`TransformSystems::Propagate`]\n system set.\n\n This system runs during [`PostUpdate`](bevy_app::PostUpdate). If you\n update the [`Transform`] of an entity during this set or after, you will notice a 1 frame lag\n before the [`GlobalTransform`] is updated.\n\n [`TransformSystems::Propagate`]: crate::TransformSystems::Propagate\n\n # Examples\n\n - [`transform`][transform_example]\n\n [transform_example]: https://github.com/bevyengine/bevy/blob/latest/examples/transforms/transform.rs", + "associated_functions": [ + "bevy_transform::components::transform::Transform::up", + "bevy_transform::components::transform::Transform::eq", + "bevy_transform::components::transform::Transform::with_rotation", + "bevy_transform::components::transform::Transform::transform_point", + "bevy_transform::components::transform::Transform::rotate_x", + "bevy_transform::components::transform::Transform::rotate_around", + "bevy_transform::components::transform::Transform::to_matrix", + "bevy_transform::components::transform::Transform::translate_around", + "bevy_transform::components::transform::Transform::rotate_local_z", + "bevy_transform::components::transform::Transform::local_y", + "bevy_transform::components::transform::Transform::right", + "bevy_transform::components::transform::Transform::local_z", + "bevy_transform::components::transform::Transform::from_scale", + "bevy_transform::components::transform::Transform::back", + "bevy_transform::components::transform::Transform::from_rotation", + "bevy_transform::components::transform::Transform::down", + "bevy_transform::components::transform::Transform::forward", + "bevy_transform::components::transform::Transform::to_isometry", + "bevy_transform::components::transform::Transform::compute_affine", + "bevy_transform::components::transform::Transform::mul_transform", + "bevy_transform::components::transform::Transform::left", + "bevy_transform::components::transform::Transform::clone", + "bevy_transform::components::transform::Transform::is_finite", + "bevy_transform::components::transform::Transform::mul", + "bevy_transform::components::transform::Transform::mul-1", + "bevy_transform::components::transform::Transform::rotate_axis", + "bevy_transform::components::transform::Transform::rotate_local_y", + "bevy_transform::components::transform::Transform::rotate_local_axis", + "bevy_transform::components::transform::Transform::from_xyz", + "bevy_transform::components::transform::Transform::mul-2", + "bevy_transform::components::transform::Transform::from_matrix", + "bevy_transform::components::transform::Transform::rotate", + "bevy_transform::components::transform::Transform::with_translation", + "bevy_transform::components::transform::Transform::with_scale", + "bevy_transform::components::transform::Transform::from_isometry", + "bevy_transform::components::transform::Transform::rotate_y", + "bevy_transform::components::transform::Transform::rotate_local_x", + "bevy_transform::components::transform::Transform::rotate_local", + "bevy_transform::components::transform::Transform::rotate_z", + "bevy_transform::components::transform::Transform::from_translation", + "bevy_transform::components::transform::Transform::local_x" + ], + "layout": { + "kind": "Struct", + "name": "Transform", + "fields": [ + { + "name": "translation", + "type": { + "val": "glam::Vec3" + } + }, + { + "name": "rotation", + "type": { + "val": "glam::Quat" + } + }, + { + "name": "scale", + "type": { + "val": "glam::Vec3" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_transform::components::transform::TransformTreeChanged": { + "identifier": "TransformTreeChanged", + "crate": "bevy_transform", + "path": "bevy_transform::components::transform::TransformTreeChanged", + "documentation": " An optimization for transform propagation. This ZST marker component uses change detection to\n mark all entities of the hierarchy as \"dirty\" if any of their descendants have a changed\n `Transform`. If this component is *not* marked `is_changed()`, propagation will halt.", + "associated_functions": [ + "bevy_transform::components::transform::TransformTreeChanged::clone", + "bevy_transform::components::transform::TransformTreeChanged::eq" + ], + "layout": { + "kind": "Struct", + "name": "TransformTreeChanged" + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_transform::systems::StaticTransformOptimizations": { + "identifier": "StaticTransformOptimizations", + "crate": "bevy_transform", + "path": "bevy_transform::systems::StaticTransformOptimizations", + "documentation": " Configure the behavior of static scene optimizations for [`Transform`] propagation.\n\n For scenes with many static entities, it is much faster to track trees of unchanged\n [`Transform`]s and skip these during the expensive transform propagation step. If your scene is\n very dynamic, the cost of tracking these trees can exceed the performance benefits. By default,\n static scene optimization is disabled for worlds with more than 30% of its entities moving.\n\n This resource allows you to configure that threshold at runtime.", + "associated_functions": [ + "bevy_transform::systems::StaticTransformOptimizations::disabled", + "bevy_transform::systems::StaticTransformOptimizations::from_threshold", + "bevy_transform::systems::StaticTransformOptimizations::enabled" + ], + "layout": { + "kind": "Struct", + "name": "StaticTransformOptimizations", + "fields": [ + { + "name": "threshold", + "type": { + "primitive": "f32" + } + }, + { + "name": "enabled", + "type": { + "primitive": "bool" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "core::any::TypeId": { + "identifier": "TypeId", + "crate": "core", + "path": "core::any::TypeId", + "associated_functions": [ + "core::any::TypeId::eq", + "core::any::TypeId::assert_receiver_is_total_eq", + "core::any::TypeId::clone" + ], + "layout": null, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "core::net::SocketAddr": { + "identifier": "SocketAddr", + "crate": "core", + "path": "core::net::SocketAddr", + "associated_functions": [ + "core::net::SocketAddr::is_ipv6", + "core::net::SocketAddr::eq", + "core::net::SocketAddr::assert_receiver_is_total_eq", + "core::net::SocketAddr::clone", + "core::net::SocketAddr::set_port", + "core::net::SocketAddr::port", + "core::net::SocketAddr::is_ipv4" + ], + "layout": null, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "core::ops::RangeFull": { + "identifier": "RangeFull", + "crate": "core", + "path": "core::ops::RangeFull", + "associated_functions": [ + "core::ops::RangeFull::clone", + "core::ops::RangeFull::eq", + "core::ops::RangeFull::assert_receiver_is_total_eq" + ], + "layout": null, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "core::sync::atomic::AtomicBool": { + "identifier": "AtomicBool", + "crate": "core", + "path": "core::sync::atomic::AtomicBool", + "associated_functions": [ + "core::sync::atomic::AtomicBool::into_inner", + "core::sync::atomic::AtomicBool::new" + ], + "layout": null, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "core::sync::atomic::AtomicI16": { + "identifier": "AtomicI16", + "crate": "core", + "path": "core::sync::atomic::AtomicI16", + "associated_functions": [ + "core::sync::atomic::AtomicI16::new", + "core::sync::atomic::AtomicI16::into_inner" + ], + "layout": null, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "core::sync::atomic::AtomicI32": { + "identifier": "AtomicI32", + "crate": "core", + "path": "core::sync::atomic::AtomicI32", + "associated_functions": [ + "core::sync::atomic::AtomicI32::into_inner", + "core::sync::atomic::AtomicI32::new" + ], + "layout": null, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "core::sync::atomic::AtomicI64": { + "identifier": "AtomicI64", + "crate": "core", + "path": "core::sync::atomic::AtomicI64", + "associated_functions": [ + "core::sync::atomic::AtomicI64::new", + "core::sync::atomic::AtomicI64::into_inner" + ], + "layout": null, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "core::sync::atomic::AtomicI8": { + "identifier": "AtomicI8", + "crate": "core", + "path": "core::sync::atomic::AtomicI8", + "associated_functions": [ + "core::sync::atomic::AtomicI8::new", + "core::sync::atomic::AtomicI8::into_inner" + ], + "layout": null, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "core::sync::atomic::AtomicIsize": { + "identifier": "AtomicIsize", + "crate": "core", + "path": "core::sync::atomic::AtomicIsize", + "associated_functions": [ + "core::sync::atomic::AtomicIsize::into_inner", + "core::sync::atomic::AtomicIsize::new" + ], + "layout": null, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "core::sync::atomic::AtomicU16": { + "identifier": "AtomicU16", + "crate": "core", + "path": "core::sync::atomic::AtomicU16", + "associated_functions": [ + "core::sync::atomic::AtomicU16::new", + "core::sync::atomic::AtomicU16::into_inner" + ], + "layout": null, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "core::sync::atomic::AtomicU32": { + "identifier": "AtomicU32", + "crate": "core", + "path": "core::sync::atomic::AtomicU32", + "associated_functions": [ + "core::sync::atomic::AtomicU32::into_inner", + "core::sync::atomic::AtomicU32::new" + ], + "layout": null, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "core::sync::atomic::AtomicU64": { + "identifier": "AtomicU64", + "crate": "core", + "path": "core::sync::atomic::AtomicU64", + "associated_functions": [ + "core::sync::atomic::AtomicU64::into_inner", + "core::sync::atomic::AtomicU64::new" + ], + "layout": null, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "core::sync::atomic::AtomicU8": { + "identifier": "AtomicU8", + "crate": "core", + "path": "core::sync::atomic::AtomicU8", + "associated_functions": [ + "core::sync::atomic::AtomicU8::new", + "core::sync::atomic::AtomicU8::into_inner" + ], + "layout": null, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "core::sync::atomic::AtomicUsize": { + "identifier": "AtomicUsize", + "crate": "core", + "path": "core::sync::atomic::AtomicUsize", + "associated_functions": [ + "core::sync::atomic::AtomicUsize::new", + "core::sync::atomic::AtomicUsize::into_inner" + ], + "layout": null, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "core::time::Duration": { + "identifier": "Duration", + "crate": "core", + "path": "core::time::Duration", + "associated_functions": [ + "core::time::Duration::saturating_mul", + "core::time::Duration::as_nanos", + "core::time::Duration::subsec_nanos", + "core::time::Duration::as_secs_f32", + "core::time::Duration::from_secs_f32", + "core::time::Duration::mul_f32", + "core::time::Duration::saturating_add", + "core::time::Duration::from_millis", + "core::time::Duration::div_duration_f32", + "core::time::Duration::new", + "core::time::Duration::from_secs_f64", + "core::time::Duration::add", + "core::time::Duration::eq", + "core::time::Duration::as_secs_f64", + "core::time::Duration::subsec_micros", + "core::time::Duration::assert_receiver_is_total_eq", + "core::time::Duration::clone", + "core::time::Duration::subsec_millis", + "core::time::Duration::abs_diff", + "core::time::Duration::div", + "core::time::Duration::sub", + "core::time::Duration::as_secs", + "core::time::Duration::from_micros", + "core::time::Duration::div_duration_f64", + "core::time::Duration::mul", + "core::time::Duration::as_micros", + "core::time::Duration::from_nanos", + "core::time::Duration::from_secs", + "core::time::Duration::div_f32", + "core::time::Duration::as_millis", + "core::time::Duration::div_f64", + "core::time::Duration::mul_f64", + "core::time::Duration::saturating_sub", + "core::time::Duration::is_zero" + ], + "layout": null, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::Affine2": { + "identifier": "Affine2", + "crate": "glam", + "path": "glam::Affine2", + "associated_functions": [ + "glam::Affine2::transform_point2", + "glam::Affine2::from_scale", + "glam::Affine2::transform_vector2", + "glam::Affine2::as_daffine2", + "glam::Affine2::is_finite", + "glam::Affine2::abs_diff_eq", + "glam::Affine2::mul-3", + "glam::Affine2::clone", + "glam::Affine2::from_mat3", + "glam::Affine2::to_cols_array_2d", + "glam::Affine2::eq", + "glam::Affine2::mul-5", + "glam::Affine2::from_mat2", + "glam::Affine2::to_cols_array", + "glam::Affine2::mul-4", + "glam::Affine2::inverse", + "glam::Affine2::from_angle_translation", + "glam::Affine2::from_mat3a", + "glam::Affine2::from_translation", + "glam::Affine2::from_mat2_translation", + "glam::Affine2::from_angle", + "glam::Affine2::mul-1", + "glam::Affine2::mul-2", + "glam::Affine2::mul", + "glam::Affine2::from_scale_angle_translation", + "glam::Affine2::is_nan", + "glam::Affine2::from_cols" + ], + "layout": { + "kind": "Struct", + "name": "Affine2", + "fields": [ + { + "name": "matrix2", + "type": { + "val": "glam::Mat2" + } + }, + { + "name": "translation", + "type": { + "val": "glam::Vec2" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::Affine3A": { + "identifier": "Affine3A", + "crate": "glam", + "path": "glam::Affine3A", + "associated_functions": [ + "glam::Affine3A::from_rotation_x", + "glam::Affine3A::is_nan", + "glam::Affine3A::from_axis_angle", + "glam::Affine3A::from_scale", + "glam::Affine3A::mul", + "glam::Affine3A::transform_point3", + "glam::Affine3A::look_to_rh", + "glam::Affine3A::mul-1", + "glam::Affine3A::from_mat3_translation", + "glam::Affine3A::from_rotation_z", + "glam::Affine3A::transform_point3a", + "glam::Affine3A::from_quat", + "glam::Affine3A::mul-2", + "glam::Affine3A::clone", + "glam::Affine3A::is_finite", + "glam::Affine3A::transform_vector3a", + "glam::Affine3A::from_scale_rotation_translation", + "glam::Affine3A::look_at_rh", + "glam::Affine3A::abs_diff_eq", + "glam::Affine3A::look_at_lh", + "glam::Affine3A::from_mat4", + "glam::Affine3A::look_to_lh", + "glam::Affine3A::from_rotation_translation", + "glam::Affine3A::from_mat3", + "glam::Affine3A::mul-3", + "glam::Affine3A::to_cols_array", + "glam::Affine3A::from_cols", + "glam::Affine3A::transform_vector3", + "glam::Affine3A::from_rotation_y", + "glam::Affine3A::from_translation", + "glam::Affine3A::to_cols_array_2d", + "glam::Affine3A::as_daffine3", + "glam::Affine3A::inverse", + "glam::Affine3A::eq" + ], + "layout": { + "kind": "Struct", + "name": "Affine3A", + "fields": [ + { + "name": "matrix3", + "type": { + "val": "glam::Mat3A" + } + }, + { + "name": "translation", + "type": { + "val": "glam::Vec3A" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::BVec2": { + "identifier": "BVec2", + "crate": "glam", + "path": "glam::BVec2", + "associated_functions": [ + "glam::BVec2::from_array", + "glam::BVec2::bitmask", + "glam::BVec2::clone", + "glam::BVec2::eq", + "glam::BVec2::set", + "glam::BVec2::assert_receiver_is_total_eq", + "glam::BVec2::test", + "glam::BVec2::all", + "glam::BVec2::splat", + "glam::BVec2::any", + "glam::BVec2::new" + ], + "layout": { + "kind": "Struct", + "name": "BVec2", + "fields": [ + { + "name": "x", + "type": { + "primitive": "bool" + } + }, + { + "name": "y", + "type": { + "primitive": "bool" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::BVec3": { + "identifier": "BVec3", + "crate": "glam", + "path": "glam::BVec3", + "associated_functions": [ + "glam::BVec3::assert_receiver_is_total_eq", + "glam::BVec3::new", + "glam::BVec3::splat", + "glam::BVec3::bitmask", + "glam::BVec3::from_array", + "glam::BVec3::eq", + "glam::BVec3::all", + "glam::BVec3::any", + "glam::BVec3::set", + "glam::BVec3::test", + "glam::BVec3::clone" + ], + "layout": { + "kind": "Struct", + "name": "BVec3", + "fields": [ + { + "name": "x", + "type": { + "primitive": "bool" + } + }, + { + "name": "y", + "type": { + "primitive": "bool" + } + }, + { + "name": "z", + "type": { + "primitive": "bool" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::BVec3A": { + "identifier": "BVec3A", + "crate": "glam", + "path": "glam::BVec3A", + "associated_functions": [ + "glam::BVec3A::from_array", + "glam::BVec3A::clone", + "glam::BVec3A::new", + "glam::BVec3A::test", + "glam::BVec3A::set", + "glam::BVec3A::eq", + "glam::BVec3A::all", + "glam::BVec3A::splat", + "glam::BVec3A::any", + "glam::BVec3A::bitmask" + ], + "layout": null, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::BVec4": { + "identifier": "BVec4", + "crate": "glam", + "path": "glam::BVec4", + "associated_functions": [ + "glam::BVec4::any", + "glam::BVec4::assert_receiver_is_total_eq", + "glam::BVec4::test", + "glam::BVec4::all", + "glam::BVec4::set", + "glam::BVec4::bitmask", + "glam::BVec4::clone", + "glam::BVec4::eq", + "glam::BVec4::splat", + "glam::BVec4::new", + "glam::BVec4::from_array" + ], + "layout": { + "kind": "Struct", + "name": "BVec4", + "fields": [ + { + "name": "x", + "type": { + "primitive": "bool" + } + }, + { + "name": "y", + "type": { + "primitive": "bool" + } + }, + { + "name": "z", + "type": { + "primitive": "bool" + } + }, + { + "name": "w", + "type": { + "primitive": "bool" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::BVec4A": { + "identifier": "BVec4A", + "crate": "glam", + "path": "glam::BVec4A", + "associated_functions": [ + "glam::BVec4A::splat", + "glam::BVec4A::bitmask", + "glam::BVec4A::from_array", + "glam::BVec4A::any", + "glam::BVec4A::set", + "glam::BVec4A::clone", + "glam::BVec4A::new", + "glam::BVec4A::test", + "glam::BVec4A::all", + "glam::BVec4A::eq" + ], + "layout": null, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::DAffine2": { + "identifier": "DAffine2", + "crate": "glam", + "path": "glam::DAffine2", + "associated_functions": [ + "glam::DAffine2::from_scale_angle_translation", + "glam::DAffine2::from_angle", + "glam::DAffine2::is_finite", + "glam::DAffine2::from_cols", + "glam::DAffine2::eq", + "glam::DAffine2::from_scale", + "glam::DAffine2::mul-1", + "glam::DAffine2::from_angle_translation", + "glam::DAffine2::abs_diff_eq", + "glam::DAffine2::transform_vector2", + "glam::DAffine2::from_mat2_translation", + "glam::DAffine2::mul-2", + "glam::DAffine2::to_cols_array", + "glam::DAffine2::mul-3", + "glam::DAffine2::transform_point2", + "glam::DAffine2::mul", + "glam::DAffine2::to_cols_array_2d", + "glam::DAffine2::is_nan", + "glam::DAffine2::from_translation", + "glam::DAffine2::as_affine2", + "glam::DAffine2::from_mat3", + "glam::DAffine2::clone", + "glam::DAffine2::from_mat2", + "glam::DAffine2::inverse" + ], + "layout": { + "kind": "Struct", + "name": "DAffine2", + "fields": [ + { + "name": "matrix2", + "type": { + "val": "glam::DMat2" + } + }, + { + "name": "translation", + "type": { + "val": "glam::DVec2" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::DAffine3": { + "identifier": "DAffine3", + "crate": "glam", + "path": "glam::DAffine3", + "associated_functions": [ + "glam::DAffine3::mul-1", + "glam::DAffine3::from_translation", + "glam::DAffine3::look_at_lh", + "glam::DAffine3::to_cols_array_2d", + "glam::DAffine3::from_rotation_translation", + "glam::DAffine3::from_quat", + "glam::DAffine3::as_affine3a", + "glam::DAffine3::from_mat4", + "glam::DAffine3::is_finite", + "glam::DAffine3::from_mat3_translation", + "glam::DAffine3::look_at_rh", + "glam::DAffine3::inverse", + "glam::DAffine3::from_mat3", + "glam::DAffine3::mul-2", + "glam::DAffine3::eq", + "glam::DAffine3::to_cols_array", + "glam::DAffine3::transform_point3", + "glam::DAffine3::mul-3", + "glam::DAffine3::from_scale_rotation_translation", + "glam::DAffine3::from_cols", + "glam::DAffine3::transform_vector3", + "glam::DAffine3::from_scale", + "glam::DAffine3::from_rotation_y", + "glam::DAffine3::look_to_rh", + "glam::DAffine3::clone", + "glam::DAffine3::look_to_lh", + "glam::DAffine3::from_rotation_x", + "glam::DAffine3::from_axis_angle", + "glam::DAffine3::mul", + "glam::DAffine3::is_nan", + "glam::DAffine3::from_rotation_z", + "glam::DAffine3::abs_diff_eq" + ], + "layout": { + "kind": "Struct", + "name": "DAffine3", + "fields": [ + { + "name": "matrix3", + "type": { + "val": "glam::DMat3" + } + }, + { + "name": "translation", + "type": { + "val": "glam::DVec3" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::DMat2": { + "identifier": "DMat2", + "crate": "glam", + "path": "glam::DMat2", + "associated_functions": [ + "glam::DMat2::add-1", + "glam::DMat2::eq", + "glam::DMat2::to_cols_array", + "glam::DMat2::abs_diff_eq", + "glam::DMat2::add_mat2", + "glam::DMat2::neg", + "glam::DMat2::from_cols", + "glam::DMat2::abs", + "glam::DMat2::mul-3", + "glam::DMat2::mul-4", + "glam::DMat2::row", + "glam::DMat2::from_mat3_minor", + "glam::DMat2::is_finite", + "glam::DMat2::from_diagonal", + "glam::DMat2::clone", + "glam::DMat2::mul_mat2", + "glam::DMat2::transpose", + "glam::DMat2::mul-2", + "glam::DMat2::sub_mat2", + "glam::DMat2::add", + "glam::DMat2::div", + "glam::DMat2::from_angle", + "glam::DMat2::from_mat3", + "glam::DMat2::sub", + "glam::DMat2::is_nan", + "glam::DMat2::determinant", + "glam::DMat2::mul_vec2", + "glam::DMat2::inverse", + "glam::DMat2::col", + "glam::DMat2::sub-1", + "glam::DMat2::as_mat2", + "glam::DMat2::mul_scalar", + "glam::DMat2::to_cols_array_2d", + "glam::DMat2::div_scalar", + "glam::DMat2::from_scale_angle", + "glam::DMat2::mul-1", + "glam::DMat2::mul" + ], + "layout": { + "kind": "Struct", + "name": "DMat2", + "fields": [ + { + "name": "x_axis", + "type": { + "val": "glam::DVec2" + } + }, + { + "name": "y_axis", + "type": { + "val": "glam::DVec2" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::DMat3": { + "identifier": "DMat3", + "crate": "glam", + "path": "glam::DMat3", + "associated_functions": [ + "glam::DMat3::add", + "glam::DMat3::neg", + "glam::DMat3::mul-6", + "glam::DMat3::from_translation", + "glam::DMat3::transform_point2", + "glam::DMat3::to_euler", + "glam::DMat3::from_diagonal", + "glam::DMat3::row", + "glam::DMat3::from_rotation_z", + "glam::DMat3::from_rotation_x", + "glam::DMat3::abs", + "glam::DMat3::eq", + "glam::DMat3::mul-1", + "glam::DMat3::from_mat2", + "glam::DMat3::transpose", + "glam::DMat3::from_scale_angle_translation", + "glam::DMat3::abs_diff_eq", + "glam::DMat3::mul_scalar", + "glam::DMat3::div", + "glam::DMat3::sub_mat3", + "glam::DMat3::transform_vector2", + "glam::DMat3::div_scalar", + "glam::DMat3::sub", + "glam::DMat3::add-1", + "glam::DMat3::mul-2", + "glam::DMat3::from_angle", + "glam::DMat3::look_at_lh", + "glam::DMat3::from_rotation_y", + "glam::DMat3::from_axis_angle", + "glam::DMat3::mul_mat3", + "glam::DMat3::add_mat3", + "glam::DMat3::from_quat", + "glam::DMat3::look_to_rh", + "glam::DMat3::is_nan", + "glam::DMat3::mul_vec3", + "glam::DMat3::to_cols_array_2d", + "glam::DMat3::to_cols_array", + "glam::DMat3::mul-4", + "glam::DMat3::inverse", + "glam::DMat3::from_mat4", + "glam::DMat3::is_finite", + "glam::DMat3::from_cols", + "glam::DMat3::look_at_rh", + "glam::DMat3::clone", + "glam::DMat3::from_mat4_minor", + "glam::DMat3::col", + "glam::DMat3::as_mat3", + "glam::DMat3::determinant", + "glam::DMat3::mul-5", + "glam::DMat3::from_scale", + "glam::DMat3::from_euler", + "glam::DMat3::sub-1", + "glam::DMat3::look_to_lh", + "glam::DMat3::mul", + "glam::DMat3::mul-3" + ], + "layout": { + "kind": "Struct", + "name": "DMat3", + "fields": [ + { + "name": "x_axis", + "type": { + "val": "glam::DVec3" + } + }, + { + "name": "y_axis", + "type": { + "val": "glam::DVec3" + } + }, + { + "name": "z_axis", + "type": { + "val": "glam::DVec3" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::DMat4": { + "identifier": "DMat4", + "crate": "glam", + "path": "glam::DMat4", + "associated_functions": [ + "glam::DMat4::add-1", + "glam::DMat4::neg", + "glam::DMat4::perspective_infinite_reverse_lh", + "glam::DMat4::transform_vector3", + "glam::DMat4::frustum_rh", + "glam::DMat4::transform_point3", + "glam::DMat4::from_scale_rotation_translation", + "glam::DMat4::from_mat3", + "glam::DMat4::frustum_lh", + "glam::DMat4::perspective_infinite_rh", + "glam::DMat4::add_mat4", + "glam::DMat4::inverse", + "glam::DMat4::perspective_infinite_lh", + "glam::DMat4::orthographic_rh", + "glam::DMat4::frustum_rh_gl", + "glam::DMat4::mul-3", + "glam::DMat4::abs_diff_eq", + "glam::DMat4::perspective_infinite_reverse_rh", + "glam::DMat4::mul_mat4", + "glam::DMat4::look_to_rh", + "glam::DMat4::mul", + "glam::DMat4::clone", + "glam::DMat4::sub", + "glam::DMat4::eq", + "glam::DMat4::from_mat3_translation", + "glam::DMat4::from_euler", + "glam::DMat4::col", + "glam::DMat4::from_rotation_z", + "glam::DMat4::mul_vec4", + "glam::DMat4::to_cols_array_2d", + "glam::DMat4::mul-1", + "glam::DMat4::from_translation", + "glam::DMat4::div_scalar", + "glam::DMat4::from_rotation_x", + "glam::DMat4::abs", + "glam::DMat4::div", + "glam::DMat4::orthographic_lh", + "glam::DMat4::mul-6", + "glam::DMat4::is_finite", + "glam::DMat4::from_axis_angle", + "glam::DMat4::sub_mat4", + "glam::DMat4::orthographic_rh_gl", + "glam::DMat4::determinant", + "glam::DMat4::perspective_rh_gl", + "glam::DMat4::row", + "glam::DMat4::look_at_rh", + "glam::DMat4::from_diagonal", + "glam::DMat4::mul_scalar", + "glam::DMat4::from_cols", + "glam::DMat4::transpose", + "glam::DMat4::look_to_lh", + "glam::DMat4::project_point3", + "glam::DMat4::from_rotation_y", + "glam::DMat4::sub-1", + "glam::DMat4::is_nan", + "glam::DMat4::perspective_lh", + "glam::DMat4::mul-2", + "glam::DMat4::mul-4", + "glam::DMat4::from_rotation_translation", + "glam::DMat4::look_at_lh", + "glam::DMat4::to_euler", + "glam::DMat4::to_cols_array", + "glam::DMat4::add", + "glam::DMat4::mul-5", + "glam::DMat4::perspective_rh", + "glam::DMat4::from_quat", + "glam::DMat4::as_mat4", + "glam::DMat4::from_scale" + ], + "layout": { + "kind": "Struct", + "name": "DMat4", + "fields": [ + { + "name": "x_axis", + "type": { + "val": "glam::DVec4" + } + }, + { + "name": "y_axis", + "type": { + "val": "glam::DVec4" + } + }, + { + "name": "z_axis", + "type": { + "val": "glam::DVec4" + } + }, + { + "name": "w_axis", + "type": { + "val": "glam::DVec4" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::DQuat": { + "identifier": "DQuat", + "crate": "glam", + "path": "glam::DQuat", + "associated_functions": [ + "glam::DQuat::add", + "glam::DQuat::mul-4", + "glam::DQuat::dot", + "glam::DQuat::add-1", + "glam::DQuat::from_rotation_arc", + "glam::DQuat::to_scaled_axis", + "glam::DQuat::from_rotation_z", + "glam::DQuat::abs_diff_eq", + "glam::DQuat::is_near_identity", + "glam::DQuat::from_euler", + "glam::DQuat::length_squared", + "glam::DQuat::from_array", + "glam::DQuat::mul", + "glam::DQuat::length", + "glam::DQuat::sub", + "glam::DQuat::from_scaled_axis", + "glam::DQuat::from_vec4", + "glam::DQuat::from_mat4", + "glam::DQuat::mul_vec3", + "glam::DQuat::clone", + "glam::DQuat::inverse", + "glam::DQuat::look_to_lh", + "glam::DQuat::neg", + "glam::DQuat::div", + "glam::DQuat::is_normalized", + "glam::DQuat::from_rotation_y", + "glam::DQuat::is_nan", + "glam::DQuat::conjugate", + "glam::DQuat::mul-3", + "glam::DQuat::from_rotation_arc_colinear", + "glam::DQuat::mul_quat", + "glam::DQuat::from_axis_angle", + "glam::DQuat::mul-1", + "glam::DQuat::mul-2", + "glam::DQuat::length_recip", + "glam::DQuat::from_rotation_x", + "glam::DQuat::eq", + "glam::DQuat::from_xyzw", + "glam::DQuat::look_to_rh", + "glam::DQuat::from_mat3", + "glam::DQuat::rotate_towards", + "glam::DQuat::angle_between", + "glam::DQuat::sub-1", + "glam::DQuat::to_euler", + "glam::DQuat::to_array", + "glam::DQuat::from_affine3", + "glam::DQuat::lerp", + "glam::DQuat::is_finite", + "glam::DQuat::from_rotation_arc_2d", + "glam::DQuat::xyz", + "glam::DQuat::look_at_lh", + "glam::DQuat::normalize", + "glam::DQuat::slerp", + "glam::DQuat::look_at_rh", + "glam::DQuat::as_quat" + ], + "layout": { + "kind": "Struct", + "name": "DQuat", + "fields": [ + { + "name": "x", + "type": { + "primitive": "f64" + } + }, + { + "name": "y", + "type": { + "primitive": "f64" + } + }, + { + "name": "z", + "type": { + "primitive": "f64" + } + }, + { + "name": "w", + "type": { + "primitive": "f64" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::DVec2": { + "identifier": "DVec2", + "crate": "glam", + "path": "glam::DVec2", + "associated_functions": [ + "glam::DVec2::project_onto", + "glam::DVec2::refract", + "glam::DVec2::project_onto_normalized", + "glam::DVec2::ceil", + "glam::DVec2::min_element", + "glam::DVec2::ln", + "glam::DVec2::fract_gl", + "glam::DVec2::is_negative_bitmask", + "glam::DVec2::trunc", + "glam::DVec2::as_i64vec2", + "glam::DVec2::length_recip", + "glam::DVec2::length", + "glam::DVec2::element_product", + "glam::DVec2::lerp", + "glam::DVec2::as_uvec2", + "glam::DVec2::div", + "glam::DVec2::mul-2", + "glam::DVec2::max", + "glam::DVec2::is_nan", + "glam::DVec2::angle_between", + "glam::DVec2::as_ivec2", + "glam::DVec2::move_towards", + "glam::DVec2::distance_squared", + "glam::DVec2::exp2", + "glam::DVec2::div_euclid", + "glam::DVec2::clone", + "glam::DVec2::from_angle", + "glam::DVec2::reflect", + "glam::DVec2::select", + "glam::DVec2::new", + "glam::DVec2::rem_euclid", + "glam::DVec2::element_sum", + "glam::DVec2::rotate_towards", + "glam::DVec2::cmpeq", + "glam::DVec2::is_nan_mask", + "glam::DVec2::min", + "glam::DVec2::as_u8vec2", + "glam::DVec2::sub-2", + "glam::DVec2::rem-2", + "glam::DVec2::copysign", + "glam::DVec2::is_normalized", + "glam::DVec2::clamp_length_max", + "glam::DVec2::rotate", + "glam::DVec2::mul-1", + "glam::DVec2::angle_to", + "glam::DVec2::add-1", + "glam::DVec2::floor", + "glam::DVec2::dot", + "glam::DVec2::normalize_or_zero", + "glam::DVec2::div-2", + "glam::DVec2::clamp_length", + "glam::DVec2::as_i16vec2", + "glam::DVec2::from_array", + "glam::DVec2::as_u16vec2", + "glam::DVec2::cmpge", + "glam::DVec2::is_finite", + "glam::DVec2::midpoint", + "glam::DVec2::cmplt", + "glam::DVec2::as_u64vec2", + "glam::DVec2::exp", + "glam::DVec2::is_finite_mask", + "glam::DVec2::cmpgt", + "glam::DVec2::powf", + "glam::DVec2::mul_add", + "glam::DVec2::neg", + "glam::DVec2::extend", + "glam::DVec2::signum", + "glam::DVec2::abs", + "glam::DVec2::fract", + "glam::DVec2::reject_from", + "glam::DVec2::sub-1", + "glam::DVec2::perp_dot", + "glam::DVec2::max_position", + "glam::DVec2::length_squared", + "glam::DVec2::eq", + "glam::DVec2::recip", + "glam::DVec2::to_array", + "glam::DVec2::abs_diff_eq", + "glam::DVec2::add", + "glam::DVec2::clamp_length_min", + "glam::DVec2::div-1", + "glam::DVec2::cmple", + "glam::DVec2::dot_into_vec", + "glam::DVec2::reject_from_normalized", + "glam::DVec2::splat", + "glam::DVec2::round", + "glam::DVec2::mul", + "glam::DVec2::distance", + "glam::DVec2::clamp", + "glam::DVec2::normalize", + "glam::DVec2::log2", + "glam::DVec2::normalize_or", + "glam::DVec2::rem", + "glam::DVec2::add-2", + "glam::DVec2::with_y", + "glam::DVec2::rem-1", + "glam::DVec2::as_vec2", + "glam::DVec2::sub", + "glam::DVec2::max_element", + "glam::DVec2::with_x", + "glam::DVec2::to_angle", + "glam::DVec2::cmpne", + "glam::DVec2::as_i8vec2", + "glam::DVec2::perp", + "glam::DVec2::min_position" + ], + "layout": { + "kind": "Struct", + "name": "DVec2", + "fields": [ + { + "name": "x", + "type": { + "primitive": "f64" + } + }, + { + "name": "y", + "type": { + "primitive": "f64" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::DVec3": { + "identifier": "DVec3", + "crate": "glam", + "path": "glam::DVec3", + "associated_functions": [ + "glam::DVec3::select", + "glam::DVec3::div", + "glam::DVec3::cmpge", + "glam::DVec3::is_finite_mask", + "glam::DVec3::as_vec3a", + "glam::DVec3::angle_between", + "glam::DVec3::cmpgt", + "glam::DVec3::is_nan", + "glam::DVec3::fract", + "glam::DVec3::with_z", + "glam::DVec3::rotate_x", + "glam::DVec3::as_i64vec3", + "glam::DVec3::clamp_length_max", + "glam::DVec3::rotate_z", + "glam::DVec3::clone", + "glam::DVec3::element_product", + "glam::DVec3::length_squared", + "glam::DVec3::trunc", + "glam::DVec3::sub-2", + "glam::DVec3::rem-2", + "glam::DVec3::neg", + "glam::DVec3::floor", + "glam::DVec3::dot", + "glam::DVec3::min_position", + "glam::DVec3::ceil", + "glam::DVec3::ln", + "glam::DVec3::rotate_axis", + "glam::DVec3::recip", + "glam::DVec3::is_finite", + "glam::DVec3::rem_euclid", + "glam::DVec3::is_nan_mask", + "glam::DVec3::clamp_length", + "glam::DVec3::new", + "glam::DVec3::exp2", + "glam::DVec3::normalize", + "glam::DVec3::sub", + "glam::DVec3::distance", + "glam::DVec3::dot_into_vec", + "glam::DVec3::min", + "glam::DVec3::move_towards", + "glam::DVec3::any_orthogonal_vector", + "glam::DVec3::as_i16vec3", + "glam::DVec3::max", + "glam::DVec3::reject_from_normalized", + "glam::DVec3::div-2", + "glam::DVec3::max_position", + "glam::DVec3::with_y", + "glam::DVec3::fract_gl", + "glam::DVec3::reject_from", + "glam::DVec3::abs_diff_eq", + "glam::DVec3::as_uvec3", + "glam::DVec3::cmple", + "glam::DVec3::to_homogeneous", + "glam::DVec3::rem", + "glam::DVec3::as_u16vec3", + "glam::DVec3::distance_squared", + "glam::DVec3::normalize_or", + "glam::DVec3::length", + "glam::DVec3::mul", + "glam::DVec3::normalize_or_zero", + "glam::DVec3::abs", + "glam::DVec3::from_array", + "glam::DVec3::min_element", + "glam::DVec3::any_orthonormal_vector", + "glam::DVec3::as_i8vec3", + "glam::DVec3::splat", + "glam::DVec3::truncate", + "glam::DVec3::powf", + "glam::DVec3::cmpne", + "glam::DVec3::clamp_length_min", + "glam::DVec3::as_vec3", + "glam::DVec3::exp", + "glam::DVec3::from_homogeneous", + "glam::DVec3::as_ivec3", + "glam::DVec3::is_negative_bitmask", + "glam::DVec3::slerp", + "glam::DVec3::reflect", + "glam::DVec3::cmpeq", + "glam::DVec3::div-1", + "glam::DVec3::mul-1", + "glam::DVec3::mul_add", + "glam::DVec3::sub-1", + "glam::DVec3::rotate_towards", + "glam::DVec3::with_x", + "glam::DVec3::element_sum", + "glam::DVec3::mul-2", + "glam::DVec3::clamp", + "glam::DVec3::as_u8vec3", + "glam::DVec3::log2", + "glam::DVec3::refract", + "glam::DVec3::max_element", + "glam::DVec3::project_onto_normalized", + "glam::DVec3::rem-1", + "glam::DVec3::cross", + "glam::DVec3::project_onto", + "glam::DVec3::midpoint", + "glam::DVec3::length_recip", + "glam::DVec3::to_array", + "glam::DVec3::round", + "glam::DVec3::div_euclid", + "glam::DVec3::cmplt", + "glam::DVec3::is_normalized", + "glam::DVec3::add-2", + "glam::DVec3::signum", + "glam::DVec3::eq", + "glam::DVec3::extend", + "glam::DVec3::lerp", + "glam::DVec3::copysign", + "glam::DVec3::rotate_y", + "glam::DVec3::add-1", + "glam::DVec3::as_u64vec3", + "glam::DVec3::add" + ], + "layout": { + "kind": "Struct", + "name": "DVec3", + "fields": [ + { + "name": "x", + "type": { + "primitive": "f64" + } + }, + { + "name": "y", + "type": { + "primitive": "f64" + } + }, + { + "name": "z", + "type": { + "primitive": "f64" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::DVec4": { + "identifier": "DVec4", + "crate": "glam", + "path": "glam::DVec4", + "associated_functions": [ + "glam::DVec4::exp2", + "glam::DVec4::div_euclid", + "glam::DVec4::min", + "glam::DVec4::div-1", + "glam::DVec4::copysign", + "glam::DVec4::rem-2", + "glam::DVec4::eq", + "glam::DVec4::is_nan", + "glam::DVec4::neg", + "glam::DVec4::cmpeq", + "glam::DVec4::cmpne", + "glam::DVec4::floor", + "glam::DVec4::element_product", + "glam::DVec4::mul-2", + "glam::DVec4::as_ivec4", + "glam::DVec4::normalize_or_zero", + "glam::DVec4::sub-2", + "glam::DVec4::clamp_length_min", + "glam::DVec4::add-2", + "glam::DVec4::rem_euclid", + "glam::DVec4::normalize", + "glam::DVec4::powf", + "glam::DVec4::midpoint", + "glam::DVec4::cmpgt", + "glam::DVec4::cmplt", + "glam::DVec4::as_u16vec4", + "glam::DVec4::select", + "glam::DVec4::abs_diff_eq", + "glam::DVec4::clamp_length", + "glam::DVec4::max_position", + "glam::DVec4::with_z", + "glam::DVec4::is_normalized", + "glam::DVec4::ln", + "glam::DVec4::div-2", + "glam::DVec4::cmple", + "glam::DVec4::is_finite_mask", + "glam::DVec4::refract", + "glam::DVec4::as_u64vec4", + "glam::DVec4::rem", + "glam::DVec4::mul_add", + "glam::DVec4::reflect", + "glam::DVec4::mul-1", + "glam::DVec4::new", + "glam::DVec4::sub", + "glam::DVec4::lerp", + "glam::DVec4::ceil", + "glam::DVec4::round", + "glam::DVec4::reject_from_normalized", + "glam::DVec4::add-1", + "glam::DVec4::max", + "glam::DVec4::project_onto_normalized", + "glam::DVec4::to_array", + "glam::DVec4::abs", + "glam::DVec4::as_i16vec4", + "glam::DVec4::recip", + "glam::DVec4::splat", + "glam::DVec4::truncate", + "glam::DVec4::mul", + "glam::DVec4::trunc", + "glam::DVec4::project", + "glam::DVec4::length_squared", + "glam::DVec4::reject_from", + "glam::DVec4::signum", + "glam::DVec4::is_finite", + "glam::DVec4::is_nan_mask", + "glam::DVec4::rem-1", + "glam::DVec4::dot", + "glam::DVec4::element_sum", + "glam::DVec4::min_element", + "glam::DVec4::from_array", + "glam::DVec4::as_i8vec4", + "glam::DVec4::distance", + "glam::DVec4::fract", + "glam::DVec4::with_w", + "glam::DVec4::fract_gl", + "glam::DVec4::clamp", + "glam::DVec4::is_negative_bitmask", + "glam::DVec4::with_y", + "glam::DVec4::exp", + "glam::DVec4::as_vec4", + "glam::DVec4::sub-1", + "glam::DVec4::as_i64vec4", + "glam::DVec4::normalize_or", + "glam::DVec4::move_towards", + "glam::DVec4::dot_into_vec", + "glam::DVec4::log2", + "glam::DVec4::max_element", + "glam::DVec4::as_u8vec4", + "glam::DVec4::clamp_length_max", + "glam::DVec4::length_recip", + "glam::DVec4::length", + "glam::DVec4::distance_squared", + "glam::DVec4::add", + "glam::DVec4::project_onto", + "glam::DVec4::min_position", + "glam::DVec4::as_uvec4", + "glam::DVec4::clone", + "glam::DVec4::div", + "glam::DVec4::cmpge", + "glam::DVec4::with_x" + ], + "layout": { + "kind": "Struct", + "name": "DVec4", + "fields": [ + { + "name": "x", + "type": { + "primitive": "f64" + } + }, + { + "name": "y", + "type": { + "primitive": "f64" + } + }, + { + "name": "z", + "type": { + "primitive": "f64" + } + }, + { + "name": "w", + "type": { + "primitive": "f64" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::EulerRot": { + "identifier": "EulerRot", + "crate": "glam", + "path": "glam::EulerRot", + "associated_functions": [ + "glam::EulerRot::clone", + "glam::EulerRot::eq", + "glam::EulerRot::assert_receiver_is_total_eq" + ], + "layout": [ + { + "kind": "Unit", + "name": "ZYX" + }, + { + "kind": "Unit", + "name": "ZXY" + }, + { + "kind": "Unit", + "name": "YXZ" + }, + { + "kind": "Unit", + "name": "YZX" + }, + { + "kind": "Unit", + "name": "XYZ" + }, + { + "kind": "Unit", + "name": "XZY" + }, + { + "kind": "Unit", + "name": "ZYZ" + }, + { + "kind": "Unit", + "name": "ZXZ" + }, + { + "kind": "Unit", + "name": "YXY" + }, + { + "kind": "Unit", + "name": "YZY" + }, + { + "kind": "Unit", + "name": "XYX" + }, + { + "kind": "Unit", + "name": "XZX" + }, + { + "kind": "Unit", + "name": "ZYXEx" + }, + { + "kind": "Unit", + "name": "ZXYEx" + }, + { + "kind": "Unit", + "name": "YXZEx" + }, + { + "kind": "Unit", + "name": "YZXEx" + }, + { + "kind": "Unit", + "name": "XYZEx" + }, + { + "kind": "Unit", + "name": "XZYEx" + }, + { + "kind": "Unit", + "name": "ZYZEx" + }, + { + "kind": "Unit", + "name": "ZXZEx" + }, + { + "kind": "Unit", + "name": "YXYEx" + }, + { + "kind": "Unit", + "name": "YZYEx" + }, + { + "kind": "Unit", + "name": "XYXEx" + }, + { + "kind": "Unit", + "name": "XZXEx" + } + ], + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::I16Vec2": { + "identifier": "I16Vec2", + "crate": "glam", + "path": "glam::I16Vec2", + "associated_functions": [ + "glam::I16Vec2::wrapping_sub", + "glam::I16Vec2::rem-1", + "glam::I16Vec2::as_uvec2", + "glam::I16Vec2::as_i64vec2", + "glam::I16Vec2::saturating_add", + "glam::I16Vec2::with_y", + "glam::I16Vec2::is_negative_bitmask", + "glam::I16Vec2::rem-2", + "glam::I16Vec2::saturating_sub", + "glam::I16Vec2::extend", + "glam::I16Vec2::max", + "glam::I16Vec2::saturating_sub_unsigned", + "glam::I16Vec2::mul", + "glam::I16Vec2::max_element", + "glam::I16Vec2::sub-2", + "glam::I16Vec2::select", + "glam::I16Vec2::div-1", + "glam::I16Vec2::sub-1", + "glam::I16Vec2::as_u64vec2", + "glam::I16Vec2::from_array", + "glam::I16Vec2::to_array", + "glam::I16Vec2::assert_receiver_is_total_eq", + "glam::I16Vec2::rotate", + "glam::I16Vec2::rem_euclid", + "glam::I16Vec2::as_i8vec2", + "glam::I16Vec2::min", + "glam::I16Vec2::wrapping_add", + "glam::I16Vec2::mul-2", + "glam::I16Vec2::wrapping_add_unsigned", + "glam::I16Vec2::saturating_mul", + "glam::I16Vec2::splat", + "glam::I16Vec2::as_u16vec2", + "glam::I16Vec2::sub", + "glam::I16Vec2::cmplt", + "glam::I16Vec2::distance_squared", + "glam::I16Vec2::mul-1", + "glam::I16Vec2::clamp", + "glam::I16Vec2::rem", + "glam::I16Vec2::div_euclid", + "glam::I16Vec2::add", + "glam::I16Vec2::new", + "glam::I16Vec2::clone", + "glam::I16Vec2::checked_manhattan_distance", + "glam::I16Vec2::wrapping_sub_unsigned", + "glam::I16Vec2::as_dvec2", + "glam::I16Vec2::saturating_add_unsigned", + "glam::I16Vec2::with_x", + "glam::I16Vec2::dot", + "glam::I16Vec2::add-2", + "glam::I16Vec2::element_product", + "glam::I16Vec2::cmpeq", + "glam::I16Vec2::dot_into_vec", + "glam::I16Vec2::length_squared", + "glam::I16Vec2::as_vec2", + "glam::I16Vec2::manhattan_distance", + "glam::I16Vec2::wrapping_mul", + "glam::I16Vec2::as_ivec2", + "glam::I16Vec2::cmpgt", + "glam::I16Vec2::cmpne", + "glam::I16Vec2::as_u8vec2", + "glam::I16Vec2::abs", + "glam::I16Vec2::element_sum", + "glam::I16Vec2::min_element", + "glam::I16Vec2::add-1", + "glam::I16Vec2::max_position", + "glam::I16Vec2::eq", + "glam::I16Vec2::cmple", + "glam::I16Vec2::chebyshev_distance", + "glam::I16Vec2::saturating_div", + "glam::I16Vec2::div-2", + "glam::I16Vec2::perp", + "glam::I16Vec2::perp_dot", + "glam::I16Vec2::neg", + "glam::I16Vec2::min_position", + "glam::I16Vec2::wrapping_div", + "glam::I16Vec2::cmpge", + "glam::I16Vec2::div", + "glam::I16Vec2::signum" + ], + "layout": { + "kind": "Struct", + "name": "I16Vec2", + "fields": [ + { + "name": "x", + "type": { + "primitive": "i16" + } + }, + { + "name": "y", + "type": { + "primitive": "i16" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::I16Vec3": { + "identifier": "I16Vec3", + "crate": "glam", + "path": "glam::I16Vec3", + "associated_functions": [ + "glam::I16Vec3::div-2", + "glam::I16Vec3::neg", + "glam::I16Vec3::div", + "glam::I16Vec3::saturating_add", + "glam::I16Vec3::element_product", + "glam::I16Vec3::with_z", + "glam::I16Vec3::as_vec3a", + "glam::I16Vec3::mul-1", + "glam::I16Vec3::saturating_div", + "glam::I16Vec3::wrapping_sub", + "glam::I16Vec3::checked_manhattan_distance", + "glam::I16Vec3::as_i64vec3", + "glam::I16Vec3::div_euclid", + "glam::I16Vec3::rem-1", + "glam::I16Vec3::max", + "glam::I16Vec3::wrapping_mul", + "glam::I16Vec3::saturating_sub", + "glam::I16Vec3::add", + "glam::I16Vec3::extend", + "glam::I16Vec3::with_x", + "glam::I16Vec3::is_negative_bitmask", + "glam::I16Vec3::chebyshev_distance", + "glam::I16Vec3::abs", + "glam::I16Vec3::assert_receiver_is_total_eq", + "glam::I16Vec3::max_element", + "glam::I16Vec3::splat", + "glam::I16Vec3::as_u8vec3", + "glam::I16Vec3::cmpge", + "glam::I16Vec3::cmpgt", + "glam::I16Vec3::as_u16vec3", + "glam::I16Vec3::as_dvec3", + "glam::I16Vec3::saturating_add_unsigned", + "glam::I16Vec3::truncate", + "glam::I16Vec3::min", + "glam::I16Vec3::dot", + "glam::I16Vec3::element_sum", + "glam::I16Vec3::saturating_sub_unsigned", + "glam::I16Vec3::to_array", + "glam::I16Vec3::clone", + "glam::I16Vec3::cmpeq", + "glam::I16Vec3::as_u64vec3", + "glam::I16Vec3::sub", + "glam::I16Vec3::clamp", + "glam::I16Vec3::wrapping_div", + "glam::I16Vec3::as_uvec3", + "glam::I16Vec3::new", + "glam::I16Vec3::rem-2", + "glam::I16Vec3::min_position", + "glam::I16Vec3::with_y", + "glam::I16Vec3::max_position", + "glam::I16Vec3::select", + "glam::I16Vec3::rem", + "glam::I16Vec3::min_element", + "glam::I16Vec3::cmple", + "glam::I16Vec3::dot_into_vec", + "glam::I16Vec3::wrapping_add", + "glam::I16Vec3::length_squared", + "glam::I16Vec3::wrapping_sub_unsigned", + "glam::I16Vec3::add-1", + "glam::I16Vec3::saturating_mul", + "glam::I16Vec3::cmpne", + "glam::I16Vec3::add-2", + "glam::I16Vec3::distance_squared", + "glam::I16Vec3::div-1", + "glam::I16Vec3::sub-1", + "glam::I16Vec3::as_ivec3", + "glam::I16Vec3::signum", + "glam::I16Vec3::manhattan_distance", + "glam::I16Vec3::cmplt", + "glam::I16Vec3::mul-2", + "glam::I16Vec3::sub-2", + "glam::I16Vec3::from_array", + "glam::I16Vec3::eq", + "glam::I16Vec3::mul", + "glam::I16Vec3::as_i8vec3", + "glam::I16Vec3::as_vec3", + "glam::I16Vec3::rem_euclid", + "glam::I16Vec3::cross", + "glam::I16Vec3::wrapping_add_unsigned" + ], + "layout": { + "kind": "Struct", + "name": "I16Vec3", + "fields": [ + { + "name": "x", + "type": { + "primitive": "i16" + } + }, + { + "name": "y", + "type": { + "primitive": "i16" + } + }, + { + "name": "z", + "type": { + "primitive": "i16" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::I16Vec4": { + "identifier": "I16Vec4", + "crate": "glam", + "path": "glam::I16Vec4", + "associated_functions": [ + "glam::I16Vec4::sub-1", + "glam::I16Vec4::abs", + "glam::I16Vec4::div-1", + "glam::I16Vec4::with_w", + "glam::I16Vec4::manhattan_distance", + "glam::I16Vec4::length_squared", + "glam::I16Vec4::mul", + "glam::I16Vec4::checked_manhattan_distance", + "glam::I16Vec4::min_position", + "glam::I16Vec4::as_i8vec4", + "glam::I16Vec4::as_vec4", + "glam::I16Vec4::new", + "glam::I16Vec4::clamp", + "glam::I16Vec4::rem-2", + "glam::I16Vec4::chebyshev_distance", + "glam::I16Vec4::from_array", + "glam::I16Vec4::to_array", + "glam::I16Vec4::saturating_mul", + "glam::I16Vec4::element_product", + "glam::I16Vec4::rem-1", + "glam::I16Vec4::wrapping_add_unsigned", + "glam::I16Vec4::assert_receiver_is_total_eq", + "glam::I16Vec4::wrapping_mul", + "glam::I16Vec4::as_uvec4", + "glam::I16Vec4::distance_squared", + "glam::I16Vec4::add", + "glam::I16Vec4::element_sum", + "glam::I16Vec4::min", + "glam::I16Vec4::min_element", + "glam::I16Vec4::as_u8vec4", + "glam::I16Vec4::div_euclid", + "glam::I16Vec4::sub", + "glam::I16Vec4::cmpge", + "glam::I16Vec4::as_dvec4", + "glam::I16Vec4::saturating_sub", + "glam::I16Vec4::rem_euclid", + "glam::I16Vec4::signum", + "glam::I16Vec4::cmple", + "glam::I16Vec4::with_x", + "glam::I16Vec4::truncate", + "glam::I16Vec4::dot", + "glam::I16Vec4::neg", + "glam::I16Vec4::max_position", + "glam::I16Vec4::wrapping_add", + "glam::I16Vec4::saturating_add_unsigned", + "glam::I16Vec4::add-2", + "glam::I16Vec4::div-2", + "glam::I16Vec4::as_i64vec4", + "glam::I16Vec4::dot_into_vec", + "glam::I16Vec4::is_negative_bitmask", + "glam::I16Vec4::as_u64vec4", + "glam::I16Vec4::cmpne", + "glam::I16Vec4::cmpgt", + "glam::I16Vec4::as_ivec4", + "glam::I16Vec4::as_u16vec4", + "glam::I16Vec4::saturating_add", + "glam::I16Vec4::wrapping_sub_unsigned", + "glam::I16Vec4::eq", + "glam::I16Vec4::mul-1", + "glam::I16Vec4::clone", + "glam::I16Vec4::cmpeq", + "glam::I16Vec4::max", + "glam::I16Vec4::sub-2", + "glam::I16Vec4::splat", + "glam::I16Vec4::rem", + "glam::I16Vec4::select", + "glam::I16Vec4::max_element", + "glam::I16Vec4::saturating_sub_unsigned", + "glam::I16Vec4::mul-2", + "glam::I16Vec4::cmplt", + "glam::I16Vec4::wrapping_div", + "glam::I16Vec4::with_y", + "glam::I16Vec4::saturating_div", + "glam::I16Vec4::wrapping_sub", + "glam::I16Vec4::add-1", + "glam::I16Vec4::div", + "glam::I16Vec4::with_z" + ], + "layout": { + "kind": "Struct", + "name": "I16Vec4", + "fields": [ + { + "name": "x", + "type": { + "primitive": "i16" + } + }, + { + "name": "y", + "type": { + "primitive": "i16" + } + }, + { + "name": "z", + "type": { + "primitive": "i16" + } + }, + { + "name": "w", + "type": { + "primitive": "i16" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::I64Vec2": { + "identifier": "I64Vec2", + "crate": "glam", + "path": "glam::I64Vec2", + "associated_functions": [ + "glam::I64Vec2::cmple", + "glam::I64Vec2::new", + "glam::I64Vec2::div_euclid", + "glam::I64Vec2::eq", + "glam::I64Vec2::add-1", + "glam::I64Vec2::sub-1", + "glam::I64Vec2::as_uvec2", + "glam::I64Vec2::chebyshev_distance", + "glam::I64Vec2::rem-2", + "glam::I64Vec2::assert_receiver_is_total_eq", + "glam::I64Vec2::add", + "glam::I64Vec2::wrapping_add", + "glam::I64Vec2::cmpne", + "glam::I64Vec2::splat", + "glam::I64Vec2::saturating_add", + "glam::I64Vec2::max_element", + "glam::I64Vec2::length_squared", + "glam::I64Vec2::add-2", + "glam::I64Vec2::checked_manhattan_distance", + "glam::I64Vec2::as_dvec2", + "glam::I64Vec2::manhattan_distance", + "glam::I64Vec2::cmpge", + "glam::I64Vec2::distance_squared", + "glam::I64Vec2::min", + "glam::I64Vec2::dot_into_vec", + "glam::I64Vec2::clamp", + "glam::I64Vec2::sub-2", + "glam::I64Vec2::neg", + "glam::I64Vec2::sub", + "glam::I64Vec2::wrapping_mul", + "glam::I64Vec2::div", + "glam::I64Vec2::mul-2", + "glam::I64Vec2::as_vec2", + "glam::I64Vec2::as_u8vec2", + "glam::I64Vec2::mul-1", + "glam::I64Vec2::select", + "glam::I64Vec2::rem", + "glam::I64Vec2::div-2", + "glam::I64Vec2::saturating_sub", + "glam::I64Vec2::saturating_add_unsigned", + "glam::I64Vec2::as_ivec2", + "glam::I64Vec2::extend", + "glam::I64Vec2::perp_dot", + "glam::I64Vec2::min_element", + "glam::I64Vec2::cmpgt", + "glam::I64Vec2::saturating_div", + "glam::I64Vec2::to_array", + "glam::I64Vec2::saturating_sub_unsigned", + "glam::I64Vec2::wrapping_div", + "glam::I64Vec2::wrapping_add_unsigned", + "glam::I64Vec2::saturating_mul", + "glam::I64Vec2::max_position", + "glam::I64Vec2::with_x", + "glam::I64Vec2::wrapping_sub_unsigned", + "glam::I64Vec2::element_product", + "glam::I64Vec2::as_u64vec2", + "glam::I64Vec2::rem_euclid", + "glam::I64Vec2::from_array", + "glam::I64Vec2::element_sum", + "glam::I64Vec2::cmplt", + "glam::I64Vec2::rotate", + "glam::I64Vec2::rem-1", + "glam::I64Vec2::cmpeq", + "glam::I64Vec2::abs", + "glam::I64Vec2::perp", + "glam::I64Vec2::is_negative_bitmask", + "glam::I64Vec2::dot", + "glam::I64Vec2::div-1", + "glam::I64Vec2::max", + "glam::I64Vec2::mul", + "glam::I64Vec2::as_i16vec2", + "glam::I64Vec2::as_u16vec2", + "glam::I64Vec2::min_position", + "glam::I64Vec2::clone", + "glam::I64Vec2::with_y", + "glam::I64Vec2::as_i8vec2", + "glam::I64Vec2::wrapping_sub", + "glam::I64Vec2::signum" + ], + "layout": { + "kind": "Struct", + "name": "I64Vec2", + "fields": [ + { + "name": "x", + "type": { + "primitive": "i64" + } + }, + { + "name": "y", + "type": { + "primitive": "i64" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::I64Vec3": { + "identifier": "I64Vec3", + "crate": "glam", + "path": "glam::I64Vec3", + "associated_functions": [ + "glam::I64Vec3::element_product", + "glam::I64Vec3::max", + "glam::I64Vec3::rem", + "glam::I64Vec3::wrapping_add", + "glam::I64Vec3::as_uvec3", + "glam::I64Vec3::as_i8vec3", + "glam::I64Vec3::as_dvec3", + "glam::I64Vec3::max_position", + "glam::I64Vec3::as_u8vec3", + "glam::I64Vec3::is_negative_bitmask", + "glam::I64Vec3::as_vec3a", + "glam::I64Vec3::neg", + "glam::I64Vec3::with_y", + "glam::I64Vec3::wrapping_mul", + "glam::I64Vec3::to_array", + "glam::I64Vec3::div_euclid", + "glam::I64Vec3::sub", + "glam::I64Vec3::as_u64vec3", + "glam::I64Vec3::saturating_add_unsigned", + "glam::I64Vec3::truncate", + "glam::I64Vec3::cmpne", + "glam::I64Vec3::new", + "glam::I64Vec3::wrapping_div", + "glam::I64Vec3::cmpeq", + "glam::I64Vec3::div-2", + "glam::I64Vec3::wrapping_sub_unsigned", + "glam::I64Vec3::checked_manhattan_distance", + "glam::I64Vec3::signum", + "glam::I64Vec3::add-2", + "glam::I64Vec3::manhattan_distance", + "glam::I64Vec3::min_element", + "glam::I64Vec3::length_squared", + "glam::I64Vec3::div", + "glam::I64Vec3::distance_squared", + "glam::I64Vec3::rem-1", + "glam::I64Vec3::rem-2", + "glam::I64Vec3::eq", + "glam::I64Vec3::cmpgt", + "glam::I64Vec3::add-1", + "glam::I64Vec3::rem_euclid", + "glam::I64Vec3::saturating_sub", + "glam::I64Vec3::as_i16vec3", + "glam::I64Vec3::element_sum", + "glam::I64Vec3::clamp", + "glam::I64Vec3::mul", + "glam::I64Vec3::wrapping_sub", + "glam::I64Vec3::div-1", + "glam::I64Vec3::mul-1", + "glam::I64Vec3::as_u16vec3", + "glam::I64Vec3::add", + "glam::I64Vec3::extend", + "glam::I64Vec3::chebyshev_distance", + "glam::I64Vec3::select", + "glam::I64Vec3::as_ivec3", + "glam::I64Vec3::as_vec3", + "glam::I64Vec3::dot", + "glam::I64Vec3::min_position", + "glam::I64Vec3::from_array", + "glam::I64Vec3::cross", + "glam::I64Vec3::saturating_div", + "glam::I64Vec3::min", + "glam::I64Vec3::saturating_mul", + "glam::I64Vec3::clone", + "glam::I64Vec3::cmpge", + "glam::I64Vec3::saturating_add", + "glam::I64Vec3::assert_receiver_is_total_eq", + "glam::I64Vec3::wrapping_add_unsigned", + "glam::I64Vec3::cmplt", + "glam::I64Vec3::cmple", + "glam::I64Vec3::max_element", + "glam::I64Vec3::mul-2", + "glam::I64Vec3::with_z", + "glam::I64Vec3::saturating_sub_unsigned", + "glam::I64Vec3::splat", + "glam::I64Vec3::with_x", + "glam::I64Vec3::sub-1", + "glam::I64Vec3::sub-2", + "glam::I64Vec3::abs", + "glam::I64Vec3::dot_into_vec" + ], + "layout": { + "kind": "Struct", + "name": "I64Vec3", + "fields": [ + { + "name": "x", + "type": { + "primitive": "i64" + } + }, + { + "name": "y", + "type": { + "primitive": "i64" + } + }, + { + "name": "z", + "type": { + "primitive": "i64" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::I64Vec4": { + "identifier": "I64Vec4", + "crate": "glam", + "path": "glam::I64Vec4", + "associated_functions": [ + "glam::I64Vec4::element_product", + "glam::I64Vec4::manhattan_distance", + "glam::I64Vec4::max", + "glam::I64Vec4::rem-2", + "glam::I64Vec4::neg", + "glam::I64Vec4::wrapping_sub_unsigned", + "glam::I64Vec4::cmpne", + "glam::I64Vec4::as_u8vec4", + "glam::I64Vec4::saturating_add_unsigned", + "glam::I64Vec4::wrapping_sub", + "glam::I64Vec4::sub", + "glam::I64Vec4::with_w", + "glam::I64Vec4::div", + "glam::I64Vec4::clone", + "glam::I64Vec4::as_u16vec4", + "glam::I64Vec4::with_y", + "glam::I64Vec4::div_euclid", + "glam::I64Vec4::as_uvec4", + "glam::I64Vec4::wrapping_add_unsigned", + "glam::I64Vec4::wrapping_div", + "glam::I64Vec4::wrapping_mul", + "glam::I64Vec4::chebyshev_distance", + "glam::I64Vec4::rem_euclid", + "glam::I64Vec4::with_z", + "glam::I64Vec4::min_element", + "glam::I64Vec4::cmpgt", + "glam::I64Vec4::max_element", + "glam::I64Vec4::saturating_sub_unsigned", + "glam::I64Vec4::truncate", + "glam::I64Vec4::saturating_mul", + "glam::I64Vec4::add-2", + "glam::I64Vec4::dot", + "glam::I64Vec4::splat", + "glam::I64Vec4::with_x", + "glam::I64Vec4::mul", + "glam::I64Vec4::as_i16vec4", + "glam::I64Vec4::element_sum", + "glam::I64Vec4::sub-2", + "glam::I64Vec4::distance_squared", + "glam::I64Vec4::saturating_div", + "glam::I64Vec4::mul-2", + "glam::I64Vec4::from_array", + "glam::I64Vec4::checked_manhattan_distance", + "glam::I64Vec4::abs", + "glam::I64Vec4::saturating_sub", + "glam::I64Vec4::add-1", + "glam::I64Vec4::select", + "glam::I64Vec4::new", + "glam::I64Vec4::max_position", + "glam::I64Vec4::eq", + "glam::I64Vec4::as_dvec4", + "glam::I64Vec4::rem-1", + "glam::I64Vec4::cmple", + "glam::I64Vec4::saturating_add", + "glam::I64Vec4::to_array", + "glam::I64Vec4::assert_receiver_is_total_eq", + "glam::I64Vec4::as_i8vec4", + "glam::I64Vec4::min_position", + "glam::I64Vec4::wrapping_add", + "glam::I64Vec4::min", + "glam::I64Vec4::as_vec4", + "glam::I64Vec4::is_negative_bitmask", + "glam::I64Vec4::signum", + "glam::I64Vec4::dot_into_vec", + "glam::I64Vec4::div-2", + "glam::I64Vec4::length_squared", + "glam::I64Vec4::sub-1", + "glam::I64Vec4::clamp", + "glam::I64Vec4::cmpge", + "glam::I64Vec4::as_ivec4", + "glam::I64Vec4::rem", + "glam::I64Vec4::div-1", + "glam::I64Vec4::cmplt", + "glam::I64Vec4::as_u64vec4", + "glam::I64Vec4::mul-1", + "glam::I64Vec4::cmpeq", + "glam::I64Vec4::add" + ], + "layout": { + "kind": "Struct", + "name": "I64Vec4", + "fields": [ + { + "name": "x", + "type": { + "primitive": "i64" + } + }, + { + "name": "y", + "type": { + "primitive": "i64" + } + }, + { + "name": "z", + "type": { + "primitive": "i64" + } + }, + { + "name": "w", + "type": { + "primitive": "i64" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::I8Vec2": { + "identifier": "I8Vec2", + "crate": "glam", + "path": "glam::I8Vec2", + "associated_functions": [ + "glam::I8Vec2::wrapping_mul", + "glam::I8Vec2::dot_into_vec", + "glam::I8Vec2::max_position", + "glam::I8Vec2::cmple", + "glam::I8Vec2::saturating_sub_unsigned", + "glam::I8Vec2::saturating_add_unsigned", + "glam::I8Vec2::neg", + "glam::I8Vec2::mul", + "glam::I8Vec2::clone", + "glam::I8Vec2::as_i64vec2", + "glam::I8Vec2::div-1", + "glam::I8Vec2::perp_dot", + "glam::I8Vec2::div_euclid", + "glam::I8Vec2::rem-2", + "glam::I8Vec2::distance_squared", + "glam::I8Vec2::min_position", + "glam::I8Vec2::wrapping_add_unsigned", + "glam::I8Vec2::as_u64vec2", + "glam::I8Vec2::manhattan_distance", + "glam::I8Vec2::as_i16vec2", + "glam::I8Vec2::add", + "glam::I8Vec2::chebyshev_distance", + "glam::I8Vec2::wrapping_add", + "glam::I8Vec2::cmplt", + "glam::I8Vec2::max_element", + "glam::I8Vec2::element_sum", + "glam::I8Vec2::saturating_mul", + "glam::I8Vec2::wrapping_div", + "glam::I8Vec2::checked_manhattan_distance", + "glam::I8Vec2::to_array", + "glam::I8Vec2::abs", + "glam::I8Vec2::new", + "glam::I8Vec2::cmpne", + "glam::I8Vec2::with_x", + "glam::I8Vec2::as_vec2", + "glam::I8Vec2::eq", + "glam::I8Vec2::clamp", + "glam::I8Vec2::saturating_add", + "glam::I8Vec2::as_u8vec2", + "glam::I8Vec2::add-2", + "glam::I8Vec2::is_negative_bitmask", + "glam::I8Vec2::add-1", + "glam::I8Vec2::saturating_div", + "glam::I8Vec2::element_product", + "glam::I8Vec2::as_dvec2", + "glam::I8Vec2::sub-2", + "glam::I8Vec2::assert_receiver_is_total_eq", + "glam::I8Vec2::rem-1", + "glam::I8Vec2::as_u16vec2", + "glam::I8Vec2::from_array", + "glam::I8Vec2::sub", + "glam::I8Vec2::signum", + "glam::I8Vec2::rem_euclid", + "glam::I8Vec2::mul-2", + "glam::I8Vec2::sub-1", + "glam::I8Vec2::wrapping_sub_unsigned", + "glam::I8Vec2::with_y", + "glam::I8Vec2::as_ivec2", + "glam::I8Vec2::dot", + "glam::I8Vec2::cmpgt", + "glam::I8Vec2::min", + "glam::I8Vec2::rotate", + "glam::I8Vec2::perp", + "glam::I8Vec2::div", + "glam::I8Vec2::saturating_sub", + "glam::I8Vec2::rem", + "glam::I8Vec2::cmpge", + "glam::I8Vec2::min_element", + "glam::I8Vec2::extend", + "glam::I8Vec2::as_uvec2", + "glam::I8Vec2::div-2", + "glam::I8Vec2::length_squared", + "glam::I8Vec2::select", + "glam::I8Vec2::mul-1", + "glam::I8Vec2::wrapping_sub", + "glam::I8Vec2::splat", + "glam::I8Vec2::max", + "glam::I8Vec2::cmpeq" + ], + "layout": { + "kind": "Struct", + "name": "I8Vec2", + "fields": [ + { + "name": "x", + "type": { + "primitive": "i8" + } + }, + { + "name": "y", + "type": { + "primitive": "i8" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::I8Vec3": { + "identifier": "I8Vec3", + "crate": "glam", + "path": "glam::I8Vec3", + "associated_functions": [ + "glam::I8Vec3::mul-1", + "glam::I8Vec3::wrapping_sub_unsigned", + "glam::I8Vec3::cmpge", + "glam::I8Vec3::min_element", + "glam::I8Vec3::as_vec3", + "glam::I8Vec3::as_vec3a", + "glam::I8Vec3::as_u16vec3", + "glam::I8Vec3::rem-2", + "glam::I8Vec3::add-1", + "glam::I8Vec3::element_product", + "glam::I8Vec3::cmplt", + "glam::I8Vec3::checked_manhattan_distance", + "glam::I8Vec3::saturating_div", + "glam::I8Vec3::div", + "glam::I8Vec3::sub-2", + "glam::I8Vec3::as_dvec3", + "glam::I8Vec3::min", + "glam::I8Vec3::from_array", + "glam::I8Vec3::clone", + "glam::I8Vec3::saturating_sub", + "glam::I8Vec3::select", + "glam::I8Vec3::cmple", + "glam::I8Vec3::as_uvec3", + "glam::I8Vec3::with_x", + "glam::I8Vec3::saturating_sub_unsigned", + "glam::I8Vec3::as_ivec3", + "glam::I8Vec3::extend", + "glam::I8Vec3::with_y", + "glam::I8Vec3::neg", + "glam::I8Vec3::wrapping_sub", + "glam::I8Vec3::mul-2", + "glam::I8Vec3::abs", + "glam::I8Vec3::splat", + "glam::I8Vec3::to_array", + "glam::I8Vec3::rem", + "glam::I8Vec3::as_u64vec3", + "glam::I8Vec3::is_negative_bitmask", + "glam::I8Vec3::rem_euclid", + "glam::I8Vec3::cmpeq", + "glam::I8Vec3::saturating_add", + "glam::I8Vec3::sub-1", + "glam::I8Vec3::signum", + "glam::I8Vec3::div-2", + "glam::I8Vec3::wrapping_add", + "glam::I8Vec3::chebyshev_distance", + "glam::I8Vec3::div_euclid", + "glam::I8Vec3::rem-1", + "glam::I8Vec3::saturating_mul", + "glam::I8Vec3::add", + "glam::I8Vec3::add-2", + "glam::I8Vec3::assert_receiver_is_total_eq", + "glam::I8Vec3::cmpne", + "glam::I8Vec3::element_sum", + "glam::I8Vec3::cmpgt", + "glam::I8Vec3::truncate", + "glam::I8Vec3::wrapping_mul", + "glam::I8Vec3::cross", + "glam::I8Vec3::dot", + "glam::I8Vec3::max_element", + "glam::I8Vec3::with_z", + "glam::I8Vec3::min_position", + "glam::I8Vec3::as_i64vec3", + "glam::I8Vec3::div-1", + "glam::I8Vec3::wrapping_add_unsigned", + "glam::I8Vec3::saturating_add_unsigned", + "glam::I8Vec3::as_i16vec3", + "glam::I8Vec3::as_u8vec3", + "glam::I8Vec3::eq", + "glam::I8Vec3::manhattan_distance", + "glam::I8Vec3::distance_squared", + "glam::I8Vec3::wrapping_div", + "glam::I8Vec3::sub", + "glam::I8Vec3::clamp", + "glam::I8Vec3::dot_into_vec", + "glam::I8Vec3::mul", + "glam::I8Vec3::length_squared", + "glam::I8Vec3::new", + "glam::I8Vec3::max", + "glam::I8Vec3::max_position" + ], + "layout": { + "kind": "Struct", + "name": "I8Vec3", + "fields": [ + { + "name": "x", + "type": { + "primitive": "i8" + } + }, + { + "name": "y", + "type": { + "primitive": "i8" + } + }, + { + "name": "z", + "type": { + "primitive": "i8" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::I8Vec4": { + "identifier": "I8Vec4", + "crate": "glam", + "path": "glam::I8Vec4", + "associated_functions": [ + "glam::I8Vec4::as_u8vec4", + "glam::I8Vec4::saturating_add", + "glam::I8Vec4::cmpge", + "glam::I8Vec4::add-1", + "glam::I8Vec4::with_z", + "glam::I8Vec4::element_sum", + "glam::I8Vec4::wrapping_mul", + "glam::I8Vec4::sub", + "glam::I8Vec4::div-2", + "glam::I8Vec4::distance_squared", + "glam::I8Vec4::wrapping_div", + "glam::I8Vec4::div-1", + "glam::I8Vec4::chebyshev_distance", + "glam::I8Vec4::neg", + "glam::I8Vec4::min_position", + "glam::I8Vec4::as_i16vec4", + "glam::I8Vec4::new", + "glam::I8Vec4::div", + "glam::I8Vec4::saturating_sub_unsigned", + "glam::I8Vec4::min", + "glam::I8Vec4::wrapping_sub_unsigned", + "glam::I8Vec4::as_dvec4", + "glam::I8Vec4::signum", + "glam::I8Vec4::saturating_sub", + "glam::I8Vec4::as_u16vec4", + "glam::I8Vec4::with_x", + "glam::I8Vec4::wrapping_add", + "glam::I8Vec4::cmplt", + "glam::I8Vec4::cmpeq", + "glam::I8Vec4::cmpne", + "glam::I8Vec4::checked_manhattan_distance", + "glam::I8Vec4::with_y", + "glam::I8Vec4::add-2", + "glam::I8Vec4::mul-1", + "glam::I8Vec4::element_product", + "glam::I8Vec4::as_ivec4", + "glam::I8Vec4::as_vec4", + "glam::I8Vec4::eq", + "glam::I8Vec4::rem-2", + "glam::I8Vec4::clamp", + "glam::I8Vec4::length_squared", + "glam::I8Vec4::max_position", + "glam::I8Vec4::from_array", + "glam::I8Vec4::with_w", + "glam::I8Vec4::as_i64vec4", + "glam::I8Vec4::add", + "glam::I8Vec4::to_array", + "glam::I8Vec4::rem", + "glam::I8Vec4::wrapping_sub", + "glam::I8Vec4::max", + "glam::I8Vec4::sub-2", + "glam::I8Vec4::as_uvec4", + "glam::I8Vec4::wrapping_add_unsigned", + "glam::I8Vec4::saturating_add_unsigned", + "glam::I8Vec4::cmpgt", + "glam::I8Vec4::div_euclid", + "glam::I8Vec4::clone", + "glam::I8Vec4::cmple", + "glam::I8Vec4::as_u64vec4", + "glam::I8Vec4::dot", + "glam::I8Vec4::mul", + "glam::I8Vec4::assert_receiver_is_total_eq", + "glam::I8Vec4::dot_into_vec", + "glam::I8Vec4::truncate", + "glam::I8Vec4::min_element", + "glam::I8Vec4::splat", + "glam::I8Vec4::select", + "glam::I8Vec4::mul-2", + "glam::I8Vec4::is_negative_bitmask", + "glam::I8Vec4::saturating_div", + "glam::I8Vec4::rem_euclid", + "glam::I8Vec4::saturating_mul", + "glam::I8Vec4::rem-1", + "glam::I8Vec4::max_element", + "glam::I8Vec4::sub-1", + "glam::I8Vec4::abs", + "glam::I8Vec4::manhattan_distance" + ], + "layout": { + "kind": "Struct", + "name": "I8Vec4", + "fields": [ + { + "name": "x", + "type": { + "primitive": "i8" + } + }, + { + "name": "y", + "type": { + "primitive": "i8" + } + }, + { + "name": "z", + "type": { + "primitive": "i8" + } + }, + { + "name": "w", + "type": { + "primitive": "i8" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::IVec2": { + "identifier": "IVec2", + "crate": "glam", + "path": "glam::IVec2", + "associated_functions": [ + "glam::IVec2::mul", + "glam::IVec2::wrapping_sub_unsigned", + "glam::IVec2::sub-1", + "glam::IVec2::cmpeq", + "glam::IVec2::cmplt", + "glam::IVec2::as_i8vec2", + "glam::IVec2::chebyshev_distance", + "glam::IVec2::as_u64vec2", + "glam::IVec2::wrapping_add_unsigned", + "glam::IVec2::add-2", + "glam::IVec2::min_element", + "glam::IVec2::div-1", + "glam::IVec2::perp", + "glam::IVec2::manhattan_distance", + "glam::IVec2::min", + "glam::IVec2::wrapping_div", + "glam::IVec2::signum", + "glam::IVec2::perp_dot", + "glam::IVec2::add-1", + "glam::IVec2::saturating_add_unsigned", + "glam::IVec2::add", + "glam::IVec2::is_negative_bitmask", + "glam::IVec2::as_u8vec2", + "glam::IVec2::from_array", + "glam::IVec2::as_dvec2", + "glam::IVec2::as_vec2", + "glam::IVec2::as_uvec2", + "glam::IVec2::rem-2", + "glam::IVec2::rem-1", + "glam::IVec2::sub-2", + "glam::IVec2::wrapping_sub", + "glam::IVec2::element_sum", + "glam::IVec2::with_x", + "glam::IVec2::length_squared", + "glam::IVec2::sub", + "glam::IVec2::cmple", + "glam::IVec2::checked_manhattan_distance", + "glam::IVec2::to_array", + "glam::IVec2::abs", + "glam::IVec2::with_y", + "glam::IVec2::wrapping_add", + "glam::IVec2::max_element", + "glam::IVec2::saturating_div", + "glam::IVec2::mul-2", + "glam::IVec2::dot", + "glam::IVec2::div-2", + "glam::IVec2::dot_into_vec", + "glam::IVec2::max_position", + "glam::IVec2::max", + "glam::IVec2::clamp", + "glam::IVec2::rem_euclid", + "glam::IVec2::clone", + "glam::IVec2::neg", + "glam::IVec2::cmpge", + "glam::IVec2::rotate", + "glam::IVec2::saturating_mul", + "glam::IVec2::mul-1", + "glam::IVec2::div_euclid", + "glam::IVec2::saturating_add", + "glam::IVec2::assert_receiver_is_total_eq", + "glam::IVec2::as_u16vec2", + "glam::IVec2::saturating_sub_unsigned", + "glam::IVec2::cmpgt", + "glam::IVec2::as_i64vec2", + "glam::IVec2::eq", + "glam::IVec2::rem", + "glam::IVec2::element_product", + "glam::IVec2::splat", + "glam::IVec2::cmpne", + "glam::IVec2::extend", + "glam::IVec2::as_i16vec2", + "glam::IVec2::min_position", + "glam::IVec2::distance_squared", + "glam::IVec2::saturating_sub", + "glam::IVec2::select", + "glam::IVec2::div", + "glam::IVec2::new", + "glam::IVec2::wrapping_mul" + ], + "layout": { + "kind": "Struct", + "name": "IVec2", + "fields": [ + { + "name": "x", + "type": { + "primitive": "i32" + } + }, + { + "name": "y", + "type": { + "primitive": "i32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::IVec3": { + "identifier": "IVec3", + "crate": "glam", + "path": "glam::IVec3", + "associated_functions": [ + "glam::IVec3::from_array", + "glam::IVec3::to_array", + "glam::IVec3::truncate", + "glam::IVec3::div-2", + "glam::IVec3::distance_squared", + "glam::IVec3::as_i64vec3", + "glam::IVec3::add", + "glam::IVec3::div-1", + "glam::IVec3::saturating_div", + "glam::IVec3::min_position", + "glam::IVec3::saturating_mul", + "glam::IVec3::neg", + "glam::IVec3::element_sum", + "glam::IVec3::add-1", + "glam::IVec3::eq", + "glam::IVec3::dot", + "glam::IVec3::length_squared", + "glam::IVec3::as_vec3a", + "glam::IVec3::sub", + "glam::IVec3::saturating_sub", + "glam::IVec3::mul", + "glam::IVec3::sub-1", + "glam::IVec3::select", + "glam::IVec3::rem-1", + "glam::IVec3::add-2", + "glam::IVec3::cmpge", + "glam::IVec3::saturating_add", + "glam::IVec3::as_vec3", + "glam::IVec3::element_product", + "glam::IVec3::max_position", + "glam::IVec3::wrapping_div", + "glam::IVec3::saturating_sub_unsigned", + "glam::IVec3::cmpeq", + "glam::IVec3::assert_receiver_is_total_eq", + "glam::IVec3::mul-2", + "glam::IVec3::splat", + "glam::IVec3::rem", + "glam::IVec3::as_dvec3", + "glam::IVec3::max_element", + "glam::IVec3::wrapping_sub_unsigned", + "glam::IVec3::abs", + "glam::IVec3::as_uvec3", + "glam::IVec3::manhattan_distance", + "glam::IVec3::as_u16vec3", + "glam::IVec3::with_x", + "glam::IVec3::with_z", + "glam::IVec3::saturating_add_unsigned", + "glam::IVec3::min", + "glam::IVec3::cmple", + "glam::IVec3::as_u8vec3", + "glam::IVec3::as_u64vec3", + "glam::IVec3::cmpgt", + "glam::IVec3::as_i16vec3", + "glam::IVec3::cmplt", + "glam::IVec3::checked_manhattan_distance", + "glam::IVec3::clamp", + "glam::IVec3::rem-2", + "glam::IVec3::dot_into_vec", + "glam::IVec3::max", + "glam::IVec3::wrapping_sub", + "glam::IVec3::clone", + "glam::IVec3::cmpne", + "glam::IVec3::chebyshev_distance", + "glam::IVec3::new", + "glam::IVec3::wrapping_add_unsigned", + "glam::IVec3::min_element", + "glam::IVec3::is_negative_bitmask", + "glam::IVec3::signum", + "glam::IVec3::div_euclid", + "glam::IVec3::sub-2", + "glam::IVec3::rem_euclid", + "glam::IVec3::mul-1", + "glam::IVec3::extend", + "glam::IVec3::as_i8vec3", + "glam::IVec3::wrapping_add", + "glam::IVec3::wrapping_mul", + "glam::IVec3::cross", + "glam::IVec3::div", + "glam::IVec3::with_y" + ], + "layout": { + "kind": "Struct", + "name": "IVec3", + "fields": [ + { + "name": "x", + "type": { + "primitive": "i32" + } + }, + { + "name": "y", + "type": { + "primitive": "i32" + } + }, + { + "name": "z", + "type": { + "primitive": "i32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::IVec4": { + "identifier": "IVec4", + "crate": "glam", + "path": "glam::IVec4", + "associated_functions": [ + "glam::IVec4::div_euclid", + "glam::IVec4::wrapping_div", + "glam::IVec4::rem-2", + "glam::IVec4::max_element", + "glam::IVec4::as_i64vec4", + "glam::IVec4::add-2", + "glam::IVec4::saturating_add", + "glam::IVec4::checked_manhattan_distance", + "glam::IVec4::div-2", + "glam::IVec4::saturating_sub", + "glam::IVec4::to_array", + "glam::IVec4::sub", + "glam::IVec4::manhattan_distance", + "glam::IVec4::cmpge", + "glam::IVec4::element_sum", + "glam::IVec4::with_w", + "glam::IVec4::wrapping_add_unsigned", + "glam::IVec4::saturating_div", + "glam::IVec4::select", + "glam::IVec4::as_u64vec4", + "glam::IVec4::div-1", + "glam::IVec4::as_vec4", + "glam::IVec4::abs", + "glam::IVec4::saturating_add_unsigned", + "glam::IVec4::cmple", + "glam::IVec4::min", + "glam::IVec4::sub-2", + "glam::IVec4::as_u16vec4", + "glam::IVec4::as_i8vec4", + "glam::IVec4::dot_into_vec", + "glam::IVec4::chebyshev_distance", + "glam::IVec4::min_element", + "glam::IVec4::mul", + "glam::IVec4::rem-1", + "glam::IVec4::as_uvec4", + "glam::IVec4::distance_squared", + "glam::IVec4::cmpgt", + "glam::IVec4::splat", + "glam::IVec4::div", + "glam::IVec4::assert_receiver_is_total_eq", + "glam::IVec4::is_negative_bitmask", + "glam::IVec4::element_product", + "glam::IVec4::saturating_sub_unsigned", + "glam::IVec4::cmplt", + "glam::IVec4::wrapping_mul", + "glam::IVec4::sub-1", + "glam::IVec4::with_x", + "glam::IVec4::as_i16vec4", + "glam::IVec4::clamp", + "glam::IVec4::max_position", + "glam::IVec4::wrapping_sub", + "glam::IVec4::wrapping_sub_unsigned", + "glam::IVec4::with_y", + "glam::IVec4::as_dvec4", + "glam::IVec4::max", + "glam::IVec4::add-1", + "glam::IVec4::clone", + "glam::IVec4::eq", + "glam::IVec4::new", + "glam::IVec4::mul-2", + "glam::IVec4::cmpeq", + "glam::IVec4::min_position", + "glam::IVec4::cmpne", + "glam::IVec4::signum", + "glam::IVec4::add", + "glam::IVec4::saturating_mul", + "glam::IVec4::from_array", + "glam::IVec4::rem", + "glam::IVec4::mul-1", + "glam::IVec4::length_squared", + "glam::IVec4::as_u8vec4", + "glam::IVec4::rem_euclid", + "glam::IVec4::with_z", + "glam::IVec4::dot", + "glam::IVec4::neg", + "glam::IVec4::truncate", + "glam::IVec4::wrapping_add" + ], + "layout": { + "kind": "Struct", + "name": "IVec4", + "fields": [ + { + "name": "x", + "type": { + "primitive": "i32" + } + }, + { + "name": "y", + "type": { + "primitive": "i32" + } + }, + { + "name": "z", + "type": { + "primitive": "i32" + } + }, + { + "name": "w", + "type": { + "primitive": "i32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::Mat2": { + "identifier": "Mat2", + "crate": "glam", + "path": "glam::Mat2", + "associated_functions": [ + "glam::Mat2::div_scalar", + "glam::Mat2::transpose", + "glam::Mat2::col", + "glam::Mat2::to_cols_array", + "glam::Mat2::mul_vec2", + "glam::Mat2::add", + "glam::Mat2::add-1", + "glam::Mat2::from_mat3a_minor", + "glam::Mat2::from_scale_angle", + "glam::Mat2::from_mat3", + "glam::Mat2::mul", + "glam::Mat2::from_mat3a", + "glam::Mat2::mul_mat2", + "glam::Mat2::to_cols_array_2d", + "glam::Mat2::eq", + "glam::Mat2::from_angle", + "glam::Mat2::row", + "glam::Mat2::mul-3", + "glam::Mat2::abs", + "glam::Mat2::mul-4", + "glam::Mat2::is_nan", + "glam::Mat2::from_diagonal", + "glam::Mat2::sub_mat2", + "glam::Mat2::inverse", + "glam::Mat2::mul_scalar", + "glam::Mat2::mul-1", + "glam::Mat2::sub", + "glam::Mat2::is_finite", + "glam::Mat2::mul-2", + "glam::Mat2::add_mat2", + "glam::Mat2::from_mat3_minor", + "glam::Mat2::clone", + "glam::Mat2::abs_diff_eq", + "glam::Mat2::from_cols", + "glam::Mat2::determinant", + "glam::Mat2::as_dmat2", + "glam::Mat2::sub-1", + "glam::Mat2::neg", + "glam::Mat2::div" + ], + "layout": { + "kind": "Struct", + "name": "Mat2", + "fields": [ + { + "name": "x_axis", + "type": { + "val": "glam::Vec2" + } + }, + { + "name": "y_axis", + "type": { + "val": "glam::Vec2" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::Mat3": { + "identifier": "Mat3", + "crate": "glam", + "path": "glam::Mat3", + "associated_functions": [ + "glam::Mat3::determinant", + "glam::Mat3::from_translation", + "glam::Mat3::look_to_lh", + "glam::Mat3::from_mat4", + "glam::Mat3::to_cols_array_2d", + "glam::Mat3::sub_mat3", + "glam::Mat3::abs_diff_eq", + "glam::Mat3::mul", + "glam::Mat3::to_cols_array", + "glam::Mat3::transform_vector2", + "glam::Mat3::mul-4", + "glam::Mat3::from_rotation_x", + "glam::Mat3::mul_vec3a", + "glam::Mat3::from_rotation_y", + "glam::Mat3::transform_point2", + "glam::Mat3::from_scale_angle_translation", + "glam::Mat3::from_euler", + "glam::Mat3::from_cols", + "glam::Mat3::sub", + "glam::Mat3::sub-1", + "glam::Mat3::row", + "glam::Mat3::mul-6", + "glam::Mat3::eq", + "glam::Mat3::as_dmat3", + "glam::Mat3::mul-2", + "glam::Mat3::look_at_rh", + "glam::Mat3::mul-3", + "glam::Mat3::abs", + "glam::Mat3::look_at_lh", + "glam::Mat3::transpose", + "glam::Mat3::from_rotation_z", + "glam::Mat3::neg", + "glam::Mat3::from_scale", + "glam::Mat3::look_to_rh", + "glam::Mat3::mul_mat3", + "glam::Mat3::from_mat2", + "glam::Mat3::mul_scalar", + "glam::Mat3::clone", + "glam::Mat3::mul_vec3", + "glam::Mat3::from_axis_angle", + "glam::Mat3::is_nan", + "glam::Mat3::add_mat3", + "glam::Mat3::inverse", + "glam::Mat3::from_diagonal", + "glam::Mat3::mul-5", + "glam::Mat3::from_angle", + "glam::Mat3::to_euler", + "glam::Mat3::add-1", + "glam::Mat3::is_finite", + "glam::Mat3::from_quat", + "glam::Mat3::from_mat4_minor", + "glam::Mat3::mul-1", + "glam::Mat3::mul-8", + "glam::Mat3::add", + "glam::Mat3::div", + "glam::Mat3::mul-7", + "glam::Mat3::div_scalar", + "glam::Mat3::col" + ], + "layout": { + "kind": "Struct", + "name": "Mat3", + "fields": [ + { + "name": "x_axis", + "type": { + "val": "glam::Vec3" + } + }, + { + "name": "y_axis", + "type": { + "val": "glam::Vec3" + } + }, + { + "name": "z_axis", + "type": { + "val": "glam::Vec3" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::Mat3A": { + "identifier": "Mat3A", + "crate": "glam", + "path": "glam::Mat3A", + "associated_functions": [ + "glam::Mat3A::from_axis_angle", + "glam::Mat3A::to_cols_array_2d", + "glam::Mat3A::to_euler", + "glam::Mat3A::col", + "glam::Mat3A::sub_mat3", + "glam::Mat3A::mul-4", + "glam::Mat3A::div", + "glam::Mat3A::abs", + "glam::Mat3A::from_rotation_z", + "glam::Mat3A::from_quat", + "glam::Mat3A::from_scale_angle_translation", + "glam::Mat3A::clone", + "glam::Mat3A::eq", + "glam::Mat3A::mul-6", + "glam::Mat3A::mul-2", + "glam::Mat3A::from_cols", + "glam::Mat3A::as_dmat3", + "glam::Mat3A::mul_mat3", + "glam::Mat3A::mul_vec3", + "glam::Mat3A::mul-8", + "glam::Mat3A::is_nan", + "glam::Mat3A::row", + "glam::Mat3A::sub", + "glam::Mat3A::div_scalar", + "glam::Mat3A::look_at_rh", + "glam::Mat3A::add-1", + "glam::Mat3A::from_mat2", + "glam::Mat3A::mul-7", + "glam::Mat3A::from_mat4", + "glam::Mat3A::inverse", + "glam::Mat3A::from_euler", + "glam::Mat3A::add_mat3", + "glam::Mat3A::look_to_lh", + "glam::Mat3A::from_scale", + "glam::Mat3A::mul", + "glam::Mat3A::look_to_rh", + "glam::Mat3A::is_finite", + "glam::Mat3A::mul-3", + "glam::Mat3A::transform_point2", + "glam::Mat3A::determinant", + "glam::Mat3A::transform_vector2", + "glam::Mat3A::to_cols_array", + "glam::Mat3A::mul_vec3a", + "glam::Mat3A::from_mat4_minor", + "glam::Mat3A::from_diagonal", + "glam::Mat3A::add", + "glam::Mat3A::mul-5", + "glam::Mat3A::from_rotation_y", + "glam::Mat3A::transpose", + "glam::Mat3A::abs_diff_eq", + "glam::Mat3A::look_at_lh", + "glam::Mat3A::sub-1", + "glam::Mat3A::mul-1", + "glam::Mat3A::from_rotation_x", + "glam::Mat3A::from_translation", + "glam::Mat3A::neg", + "glam::Mat3A::from_angle", + "glam::Mat3A::mul_scalar" + ], + "layout": { + "kind": "Struct", + "name": "Mat3A", + "fields": [ + { + "name": "x_axis", + "type": { + "val": "glam::Vec3A" + } + }, + { + "name": "y_axis", + "type": { + "val": "glam::Vec3A" + } + }, + { + "name": "z_axis", + "type": { + "val": "glam::Vec3A" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::Mat4": { + "identifier": "Mat4", + "crate": "glam", + "path": "glam::Mat4", + "associated_functions": [ + "glam::Mat4::look_to_rh", + "glam::Mat4::perspective_infinite_reverse_rh", + "glam::Mat4::perspective_rh", + "glam::Mat4::from_rotation_translation", + "glam::Mat4::determinant", + "glam::Mat4::project_point3a", + "glam::Mat4::mul-6", + "glam::Mat4::orthographic_lh", + "glam::Mat4::perspective_infinite_rh", + "glam::Mat4::from_axis_angle", + "glam::Mat4::clone", + "glam::Mat4::mul-3", + "glam::Mat4::transform_point3", + "glam::Mat4::transform_vector3a", + "glam::Mat4::div_scalar", + "glam::Mat4::from_scale", + "glam::Mat4::perspective_rh_gl", + "glam::Mat4::from_rotation_x", + "glam::Mat4::mul-4", + "glam::Mat4::transform_point3a", + "glam::Mat4::to_cols_array_2d", + "glam::Mat4::to_cols_array", + "glam::Mat4::mul-5", + "glam::Mat4::add-1", + "glam::Mat4::is_nan", + "glam::Mat4::transpose", + "glam::Mat4::eq", + "glam::Mat4::from_scale_rotation_translation", + "glam::Mat4::as_dmat4", + "glam::Mat4::from_mat3", + "glam::Mat4::look_to_lh", + "glam::Mat4::frustum_rh_gl", + "glam::Mat4::sub-1", + "glam::Mat4::orthographic_rh_gl", + "glam::Mat4::from_diagonal", + "glam::Mat4::from_euler", + "glam::Mat4::abs", + "glam::Mat4::perspective_lh", + "glam::Mat4::mul_scalar", + "glam::Mat4::look_at_lh", + "glam::Mat4::mul_mat4", + "glam::Mat4::col", + "glam::Mat4::neg", + "glam::Mat4::perspective_infinite_lh", + "glam::Mat4::from_mat3a", + "glam::Mat4::add", + "glam::Mat4::is_finite", + "glam::Mat4::orthographic_rh", + "glam::Mat4::transform_vector3", + "glam::Mat4::sub", + "glam::Mat4::from_quat", + "glam::Mat4::from_rotation_z", + "glam::Mat4::mul_vec4", + "glam::Mat4::mul", + "glam::Mat4::mul-2", + "glam::Mat4::from_mat3_translation", + "glam::Mat4::div", + "glam::Mat4::add_mat4", + "glam::Mat4::abs_diff_eq", + "glam::Mat4::row", + "glam::Mat4::from_rotation_y", + "glam::Mat4::frustum_lh", + "glam::Mat4::frustum_rh", + "glam::Mat4::from_translation", + "glam::Mat4::from_cols", + "glam::Mat4::look_at_rh", + "glam::Mat4::project_point3", + "glam::Mat4::to_euler", + "glam::Mat4::mul-1", + "glam::Mat4::sub_mat4", + "glam::Mat4::perspective_infinite_reverse_lh", + "glam::Mat4::inverse" + ], + "layout": { + "kind": "Struct", + "name": "Mat4", + "fields": [ + { + "name": "x_axis", + "type": { + "val": "glam::Vec4" + } + }, + { + "name": "y_axis", + "type": { + "val": "glam::Vec4" + } + }, + { + "name": "z_axis", + "type": { + "val": "glam::Vec4" + } + }, + { + "name": "w_axis", + "type": { + "val": "glam::Vec4" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::Quat": { + "identifier": "Quat", + "crate": "glam", + "path": "glam::Quat", + "associated_functions": [ + "glam::Quat::mul_quat", + "glam::Quat::length_recip", + "glam::Quat::angle_between", + "glam::Quat::from_mat3", + "glam::Quat::look_to_lh", + "glam::Quat::look_to_rh", + "glam::Quat::conjugate", + "glam::Quat::from_rotation_arc", + "glam::Quat::dot", + "glam::Quat::xyz", + "glam::Quat::from_xyzw", + "glam::Quat::from_rotation_arc_2d", + "glam::Quat::from_affine3", + "glam::Quat::length_squared", + "glam::Quat::slerp", + "glam::Quat::mul_vec3", + "glam::Quat::mul-1", + "glam::Quat::mul_vec3a", + "glam::Quat::from_scaled_axis", + "glam::Quat::length", + "glam::Quat::neg", + "glam::Quat::add", + "glam::Quat::mul-6", + "glam::Quat::from_array", + "glam::Quat::from_axis_angle", + "glam::Quat::rotate_towards", + "glam::Quat::normalize", + "glam::Quat::eq", + "glam::Quat::is_near_identity", + "glam::Quat::clone", + "glam::Quat::add-1", + "glam::Quat::from_mat4", + "glam::Quat::sub", + "glam::Quat::from_rotation_y", + "glam::Quat::look_at_lh", + "glam::Quat::is_finite", + "glam::Quat::from_rotation_x", + "glam::Quat::mul-4", + "glam::Quat::sub-1", + "glam::Quat::from_vec4", + "glam::Quat::as_dquat", + "glam::Quat::lerp", + "glam::Quat::div", + "glam::Quat::abs_diff_eq", + "glam::Quat::mul-3", + "glam::Quat::look_at_rh", + "glam::Quat::from_rotation_arc_colinear", + "glam::Quat::mul-5", + "glam::Quat::from_mat3a", + "glam::Quat::is_normalized", + "glam::Quat::inverse", + "glam::Quat::mul-2", + "glam::Quat::is_nan", + "glam::Quat::to_euler", + "glam::Quat::from_rotation_z", + "glam::Quat::to_array", + "glam::Quat::to_scaled_axis", + "glam::Quat::mul", + "glam::Quat::from_euler" + ], + "layout": { + "kind": "Struct", + "name": "Quat", + "fields": [ + { + "name": "x", + "type": { + "primitive": "f32" + } + }, + { + "name": "y", + "type": { + "primitive": "f32" + } + }, + { + "name": "z", + "type": { + "primitive": "f32" + } + }, + { + "name": "w", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::U16Vec2": { + "identifier": "U16Vec2", + "crate": "glam", + "path": "glam::U16Vec2", + "associated_functions": [ + "glam::U16Vec2::as_ivec2", + "glam::U16Vec2::div", + "glam::U16Vec2::assert_receiver_is_total_eq", + "glam::U16Vec2::wrapping_mul", + "glam::U16Vec2::saturating_add", + "glam::U16Vec2::checked_manhattan_distance", + "glam::U16Vec2::to_array", + "glam::U16Vec2::wrapping_add", + "glam::U16Vec2::new", + "glam::U16Vec2::div-1", + "glam::U16Vec2::add-1", + "glam::U16Vec2::saturating_sub", + "glam::U16Vec2::element_product", + "glam::U16Vec2::mul", + "glam::U16Vec2::as_u64vec2", + "glam::U16Vec2::add-2", + "glam::U16Vec2::as_dvec2", + "glam::U16Vec2::rem", + "glam::U16Vec2::with_y", + "glam::U16Vec2::chebyshev_distance", + "glam::U16Vec2::from_array", + "glam::U16Vec2::dot", + "glam::U16Vec2::extend", + "glam::U16Vec2::as_vec2", + "glam::U16Vec2::rem-2", + "glam::U16Vec2::manhattan_distance", + "glam::U16Vec2::min_position", + "glam::U16Vec2::saturating_add_signed", + "glam::U16Vec2::div-2", + "glam::U16Vec2::saturating_mul", + "glam::U16Vec2::max_position", + "glam::U16Vec2::cmpeq", + "glam::U16Vec2::clone", + "glam::U16Vec2::with_x", + "glam::U16Vec2::eq", + "glam::U16Vec2::rem-1", + "glam::U16Vec2::as_u8vec2", + "glam::U16Vec2::wrapping_add_signed", + "glam::U16Vec2::add", + "glam::U16Vec2::wrapping_sub", + "glam::U16Vec2::cmpne", + "glam::U16Vec2::sub-1", + "glam::U16Vec2::element_sum", + "glam::U16Vec2::min", + "glam::U16Vec2::as_i8vec2", + "glam::U16Vec2::sub", + "glam::U16Vec2::max_element", + "glam::U16Vec2::mul-1", + "glam::U16Vec2::dot_into_vec", + "glam::U16Vec2::sub-2", + "glam::U16Vec2::cmpge", + "glam::U16Vec2::as_i16vec2", + "glam::U16Vec2::clamp", + "glam::U16Vec2::mul-2", + "glam::U16Vec2::as_uvec2", + "glam::U16Vec2::saturating_div", + "glam::U16Vec2::splat", + "glam::U16Vec2::cmpgt", + "glam::U16Vec2::cmple", + "glam::U16Vec2::wrapping_div", + "glam::U16Vec2::max", + "glam::U16Vec2::min_element", + "glam::U16Vec2::select", + "glam::U16Vec2::cmplt", + "glam::U16Vec2::length_squared", + "glam::U16Vec2::as_i64vec2" + ], + "layout": { + "kind": "Struct", + "name": "U16Vec2", + "fields": [ + { + "name": "x", + "type": { + "primitive": "u16" + } + }, + { + "name": "y", + "type": { + "primitive": "u16" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::U16Vec3": { + "identifier": "U16Vec3", + "crate": "glam", + "path": "glam::U16Vec3", + "associated_functions": [ + "glam::U16Vec3::mul-2", + "glam::U16Vec3::as_u64vec3", + "glam::U16Vec3::sub-2", + "glam::U16Vec3::as_dvec3", + "glam::U16Vec3::wrapping_add", + "glam::U16Vec3::min_element", + "glam::U16Vec3::as_vec3", + "glam::U16Vec3::cmpeq", + "glam::U16Vec3::wrapping_mul", + "glam::U16Vec3::assert_receiver_is_total_eq", + "glam::U16Vec3::saturating_div", + "glam::U16Vec3::to_array", + "glam::U16Vec3::dot_into_vec", + "glam::U16Vec3::select", + "glam::U16Vec3::saturating_add_signed", + "glam::U16Vec3::max", + "glam::U16Vec3::truncate", + "glam::U16Vec3::dot", + "glam::U16Vec3::div-2", + "glam::U16Vec3::add", + "glam::U16Vec3::max_position", + "glam::U16Vec3::wrapping_sub", + "glam::U16Vec3::cmpne", + "glam::U16Vec3::splat", + "glam::U16Vec3::clamp", + "glam::U16Vec3::min", + "glam::U16Vec3::add-2", + "glam::U16Vec3::with_z", + "glam::U16Vec3::mul", + "glam::U16Vec3::min_position", + "glam::U16Vec3::as_u8vec3", + "glam::U16Vec3::element_sum", + "glam::U16Vec3::wrapping_add_signed", + "glam::U16Vec3::chebyshev_distance", + "glam::U16Vec3::rem-1", + "glam::U16Vec3::add-1", + "glam::U16Vec3::rem-2", + "glam::U16Vec3::element_product", + "glam::U16Vec3::cmplt", + "glam::U16Vec3::as_uvec3", + "glam::U16Vec3::from_array", + "glam::U16Vec3::wrapping_div", + "glam::U16Vec3::as_i64vec3", + "glam::U16Vec3::div-1", + "glam::U16Vec3::as_i8vec3", + "glam::U16Vec3::rem", + "glam::U16Vec3::extend", + "glam::U16Vec3::cmple", + "glam::U16Vec3::length_squared", + "glam::U16Vec3::eq", + "glam::U16Vec3::max_element", + "glam::U16Vec3::clone", + "glam::U16Vec3::cmpge", + "glam::U16Vec3::with_x", + "glam::U16Vec3::checked_manhattan_distance", + "glam::U16Vec3::manhattan_distance", + "glam::U16Vec3::with_y", + "glam::U16Vec3::cross", + "glam::U16Vec3::saturating_add", + "glam::U16Vec3::as_i16vec3", + "glam::U16Vec3::cmpgt", + "glam::U16Vec3::saturating_mul", + "glam::U16Vec3::as_vec3a", + "glam::U16Vec3::sub-1", + "glam::U16Vec3::new", + "glam::U16Vec3::as_ivec3", + "glam::U16Vec3::div", + "glam::U16Vec3::mul-1", + "glam::U16Vec3::sub", + "glam::U16Vec3::saturating_sub" + ], + "layout": { + "kind": "Struct", + "name": "U16Vec3", + "fields": [ + { + "name": "x", + "type": { + "primitive": "u16" + } + }, + { + "name": "y", + "type": { + "primitive": "u16" + } + }, + { + "name": "z", + "type": { + "primitive": "u16" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::U16Vec4": { + "identifier": "U16Vec4", + "crate": "glam", + "path": "glam::U16Vec4", + "associated_functions": [ + "glam::U16Vec4::saturating_add_signed", + "glam::U16Vec4::min", + "glam::U16Vec4::wrapping_add", + "glam::U16Vec4::as_i16vec4", + "glam::U16Vec4::sub-2", + "glam::U16Vec4::max_position", + "glam::U16Vec4::dot_into_vec", + "glam::U16Vec4::min_element", + "glam::U16Vec4::dot", + "glam::U16Vec4::assert_receiver_is_total_eq", + "glam::U16Vec4::element_product", + "glam::U16Vec4::saturating_mul", + "glam::U16Vec4::min_position", + "glam::U16Vec4::cmplt", + "glam::U16Vec4::clone", + "glam::U16Vec4::add-2", + "glam::U16Vec4::as_uvec4", + "glam::U16Vec4::wrapping_add_signed", + "glam::U16Vec4::cmpge", + "glam::U16Vec4::wrapping_div", + "glam::U16Vec4::to_array", + "glam::U16Vec4::saturating_div", + "glam::U16Vec4::with_y", + "glam::U16Vec4::add", + "glam::U16Vec4::cmpne", + "glam::U16Vec4::eq", + "glam::U16Vec4::saturating_add", + "glam::U16Vec4::checked_manhattan_distance", + "glam::U16Vec4::div-1", + "glam::U16Vec4::with_w", + "glam::U16Vec4::wrapping_mul", + "glam::U16Vec4::select", + "glam::U16Vec4::add-1", + "glam::U16Vec4::mul-1", + "glam::U16Vec4::div-2", + "glam::U16Vec4::saturating_sub", + "glam::U16Vec4::sub-1", + "glam::U16Vec4::as_i8vec4", + "glam::U16Vec4::length_squared", + "glam::U16Vec4::from_array", + "glam::U16Vec4::cmple", + "glam::U16Vec4::element_sum", + "glam::U16Vec4::mul", + "glam::U16Vec4::manhattan_distance", + "glam::U16Vec4::with_x", + "glam::U16Vec4::clamp", + "glam::U16Vec4::rem-2", + "glam::U16Vec4::as_vec4", + "glam::U16Vec4::max_element", + "glam::U16Vec4::wrapping_sub", + "glam::U16Vec4::with_z", + "glam::U16Vec4::rem", + "glam::U16Vec4::as_u8vec4", + "glam::U16Vec4::truncate", + "glam::U16Vec4::cmpgt", + "glam::U16Vec4::max", + "glam::U16Vec4::as_u64vec4", + "glam::U16Vec4::div", + "glam::U16Vec4::cmpeq", + "glam::U16Vec4::as_i64vec4", + "glam::U16Vec4::chebyshev_distance", + "glam::U16Vec4::sub", + "glam::U16Vec4::splat", + "glam::U16Vec4::as_dvec4", + "glam::U16Vec4::mul-2", + "glam::U16Vec4::rem-1", + "glam::U16Vec4::as_ivec4", + "glam::U16Vec4::new" + ], + "layout": { + "kind": "Struct", + "name": "U16Vec4", + "fields": [ + { + "name": "x", + "type": { + "primitive": "u16" + } + }, + { + "name": "y", + "type": { + "primitive": "u16" + } + }, + { + "name": "z", + "type": { + "primitive": "u16" + } + }, + { + "name": "w", + "type": { + "primitive": "u16" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::U64Vec2": { + "identifier": "U64Vec2", + "crate": "glam", + "path": "glam::U64Vec2", + "associated_functions": [ + "glam::U64Vec2::mul", + "glam::U64Vec2::as_i8vec2", + "glam::U64Vec2::chebyshev_distance", + "glam::U64Vec2::rem-2", + "glam::U64Vec2::saturating_add_signed", + "glam::U64Vec2::with_y", + "glam::U64Vec2::saturating_div", + "glam::U64Vec2::as_u8vec2", + "glam::U64Vec2::from_array", + "glam::U64Vec2::element_sum", + "glam::U64Vec2::extend", + "glam::U64Vec2::as_uvec2", + "glam::U64Vec2::wrapping_add_signed", + "glam::U64Vec2::clamp", + "glam::U64Vec2::as_u16vec2", + "glam::U64Vec2::wrapping_add", + "glam::U64Vec2::assert_receiver_is_total_eq", + "glam::U64Vec2::eq", + "glam::U64Vec2::wrapping_sub", + "glam::U64Vec2::checked_manhattan_distance", + "glam::U64Vec2::sub-2", + "glam::U64Vec2::as_i64vec2", + "glam::U64Vec2::cmpne", + "glam::U64Vec2::as_i16vec2", + "glam::U64Vec2::add-2", + "glam::U64Vec2::cmplt", + "glam::U64Vec2::sub", + "glam::U64Vec2::dot_into_vec", + "glam::U64Vec2::mul-2", + "glam::U64Vec2::dot", + "glam::U64Vec2::max_position", + "glam::U64Vec2::div-2", + "glam::U64Vec2::min_element", + "glam::U64Vec2::max_element", + "glam::U64Vec2::add-1", + "glam::U64Vec2::element_product", + "glam::U64Vec2::rem", + "glam::U64Vec2::add", + "glam::U64Vec2::div", + "glam::U64Vec2::as_vec2", + "glam::U64Vec2::manhattan_distance", + "glam::U64Vec2::cmple", + "glam::U64Vec2::rem-1", + "glam::U64Vec2::splat", + "glam::U64Vec2::select", + "glam::U64Vec2::new", + "glam::U64Vec2::min_position", + "glam::U64Vec2::wrapping_div", + "glam::U64Vec2::max", + "glam::U64Vec2::with_x", + "glam::U64Vec2::saturating_sub", + "glam::U64Vec2::saturating_add", + "glam::U64Vec2::wrapping_mul", + "glam::U64Vec2::cmpgt", + "glam::U64Vec2::sub-1", + "glam::U64Vec2::as_ivec2", + "glam::U64Vec2::div-1", + "glam::U64Vec2::min", + "glam::U64Vec2::saturating_mul", + "glam::U64Vec2::as_dvec2", + "glam::U64Vec2::length_squared", + "glam::U64Vec2::cmpge", + "glam::U64Vec2::cmpeq", + "glam::U64Vec2::mul-1", + "glam::U64Vec2::clone", + "glam::U64Vec2::to_array" + ], + "layout": { + "kind": "Struct", + "name": "U64Vec2", + "fields": [ + { + "name": "x", + "type": { + "primitive": "u64" + } + }, + { + "name": "y", + "type": { + "primitive": "u64" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::U64Vec3": { + "identifier": "U64Vec3", + "crate": "glam", + "path": "glam::U64Vec3", + "associated_functions": [ + "glam::U64Vec3::from_array", + "glam::U64Vec3::max_element", + "glam::U64Vec3::cross", + "glam::U64Vec3::saturating_div", + "glam::U64Vec3::mul-2", + "glam::U64Vec3::add", + "glam::U64Vec3::element_sum", + "glam::U64Vec3::div-2", + "glam::U64Vec3::mul", + "glam::U64Vec3::wrapping_add", + "glam::U64Vec3::element_product", + "glam::U64Vec3::mul-1", + "glam::U64Vec3::wrapping_mul", + "glam::U64Vec3::with_x", + "glam::U64Vec3::saturating_add", + "glam::U64Vec3::div", + "glam::U64Vec3::dot_into_vec", + "glam::U64Vec3::as_vec3", + "glam::U64Vec3::to_array", + "glam::U64Vec3::wrapping_sub", + "glam::U64Vec3::dot", + "glam::U64Vec3::rem-2", + "glam::U64Vec3::checked_manhattan_distance", + "glam::U64Vec3::eq", + "glam::U64Vec3::as_uvec3", + "glam::U64Vec3::splat", + "glam::U64Vec3::sub", + "glam::U64Vec3::as_dvec3", + "glam::U64Vec3::add-2", + "glam::U64Vec3::chebyshev_distance", + "glam::U64Vec3::as_u8vec3", + "glam::U64Vec3::wrapping_add_signed", + "glam::U64Vec3::cmpne", + "glam::U64Vec3::cmpge", + "glam::U64Vec3::rem", + "glam::U64Vec3::wrapping_div", + "glam::U64Vec3::as_i8vec3", + "glam::U64Vec3::as_u16vec3", + "glam::U64Vec3::min_element", + "glam::U64Vec3::min", + "glam::U64Vec3::saturating_add_signed", + "glam::U64Vec3::max", + "glam::U64Vec3::clone", + "glam::U64Vec3::saturating_sub", + "glam::U64Vec3::length_squared", + "glam::U64Vec3::cmpgt", + "glam::U64Vec3::add-1", + "glam::U64Vec3::as_i16vec3", + "glam::U64Vec3::saturating_mul", + "glam::U64Vec3::sub-2", + "glam::U64Vec3::as_ivec3", + "glam::U64Vec3::with_y", + "glam::U64Vec3::max_position", + "glam::U64Vec3::as_vec3a", + "glam::U64Vec3::select", + "glam::U64Vec3::as_i64vec3", + "glam::U64Vec3::clamp", + "glam::U64Vec3::truncate", + "glam::U64Vec3::min_position", + "glam::U64Vec3::cmple", + "glam::U64Vec3::cmpeq", + "glam::U64Vec3::sub-1", + "glam::U64Vec3::manhattan_distance", + "glam::U64Vec3::extend", + "glam::U64Vec3::rem-1", + "glam::U64Vec3::new", + "glam::U64Vec3::assert_receiver_is_total_eq", + "glam::U64Vec3::div-1", + "glam::U64Vec3::cmplt", + "glam::U64Vec3::with_z" + ], + "layout": { + "kind": "Struct", + "name": "U64Vec3", + "fields": [ + { + "name": "x", + "type": { + "primitive": "u64" + } + }, + { + "name": "y", + "type": { + "primitive": "u64" + } + }, + { + "name": "z", + "type": { + "primitive": "u64" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::U64Vec4": { + "identifier": "U64Vec4", + "crate": "glam", + "path": "glam::U64Vec4", + "associated_functions": [ + "glam::U64Vec4::with_w", + "glam::U64Vec4::max", + "glam::U64Vec4::saturating_add", + "glam::U64Vec4::element_sum", + "glam::U64Vec4::min", + "glam::U64Vec4::wrapping_div", + "glam::U64Vec4::assert_receiver_is_total_eq", + "glam::U64Vec4::length_squared", + "glam::U64Vec4::chebyshev_distance", + "glam::U64Vec4::with_x", + "glam::U64Vec4::splat", + "glam::U64Vec4::rem-2", + "glam::U64Vec4::sub-2", + "glam::U64Vec4::element_product", + "glam::U64Vec4::as_u16vec4", + "glam::U64Vec4::wrapping_add", + "glam::U64Vec4::rem", + "glam::U64Vec4::as_u8vec4", + "glam::U64Vec4::sub-1", + "glam::U64Vec4::select", + "glam::U64Vec4::as_dvec4", + "glam::U64Vec4::saturating_add_signed", + "glam::U64Vec4::clone", + "glam::U64Vec4::div", + "glam::U64Vec4::saturating_sub", + "glam::U64Vec4::add", + "glam::U64Vec4::clamp", + "glam::U64Vec4::add-1", + "glam::U64Vec4::checked_manhattan_distance", + "glam::U64Vec4::manhattan_distance", + "glam::U64Vec4::cmpne", + "glam::U64Vec4::as_uvec4", + "glam::U64Vec4::rem-1", + "glam::U64Vec4::cmpeq", + "glam::U64Vec4::max_position", + "glam::U64Vec4::eq", + "glam::U64Vec4::cmple", + "glam::U64Vec4::as_vec4", + "glam::U64Vec4::cmpgt", + "glam::U64Vec4::sub", + "glam::U64Vec4::mul", + "glam::U64Vec4::dot", + "glam::U64Vec4::new", + "glam::U64Vec4::saturating_div", + "glam::U64Vec4::div-1", + "glam::U64Vec4::to_array", + "glam::U64Vec4::wrapping_add_signed", + "glam::U64Vec4::mul-2", + "glam::U64Vec4::as_i16vec4", + "glam::U64Vec4::wrapping_mul", + "glam::U64Vec4::div-2", + "glam::U64Vec4::saturating_mul", + "glam::U64Vec4::cmpge", + "glam::U64Vec4::add-2", + "glam::U64Vec4::from_array", + "glam::U64Vec4::wrapping_sub", + "glam::U64Vec4::max_element", + "glam::U64Vec4::as_i64vec4", + "glam::U64Vec4::min_element", + "glam::U64Vec4::as_ivec4", + "glam::U64Vec4::as_i8vec4", + "glam::U64Vec4::min_position", + "glam::U64Vec4::with_y", + "glam::U64Vec4::truncate", + "glam::U64Vec4::mul-1", + "glam::U64Vec4::cmplt", + "glam::U64Vec4::with_z", + "glam::U64Vec4::dot_into_vec" + ], + "layout": { + "kind": "Struct", + "name": "U64Vec4", + "fields": [ + { + "name": "x", + "type": { + "primitive": "u64" + } + }, + { + "name": "y", + "type": { + "primitive": "u64" + } + }, + { + "name": "z", + "type": { + "primitive": "u64" + } + }, + { + "name": "w", + "type": { + "primitive": "u64" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::U8Vec2": { + "identifier": "U8Vec2", + "crate": "glam", + "path": "glam::U8Vec2", + "associated_functions": [ + "glam::U8Vec2::as_uvec2", + "glam::U8Vec2::extend", + "glam::U8Vec2::saturating_add_signed", + "glam::U8Vec2::cmple", + "glam::U8Vec2::select", + "glam::U8Vec2::element_sum", + "glam::U8Vec2::cmpgt", + "glam::U8Vec2::as_ivec2", + "glam::U8Vec2::saturating_sub", + "glam::U8Vec2::min_element", + "glam::U8Vec2::rem-2", + "glam::U8Vec2::wrapping_sub", + "glam::U8Vec2::chebyshev_distance", + "glam::U8Vec2::rem-1", + "glam::U8Vec2::min_position", + "glam::U8Vec2::max", + "glam::U8Vec2::as_i64vec2", + "glam::U8Vec2::div-2", + "glam::U8Vec2::cmplt", + "glam::U8Vec2::wrapping_add_signed", + "glam::U8Vec2::rem", + "glam::U8Vec2::as_dvec2", + "glam::U8Vec2::sub-1", + "glam::U8Vec2::add-2", + "glam::U8Vec2::wrapping_mul", + "glam::U8Vec2::as_i16vec2", + "glam::U8Vec2::wrapping_div", + "glam::U8Vec2::saturating_add", + "glam::U8Vec2::from_array", + "glam::U8Vec2::as_vec2", + "glam::U8Vec2::mul-1", + "glam::U8Vec2::checked_manhattan_distance", + "glam::U8Vec2::eq", + "glam::U8Vec2::with_y", + "glam::U8Vec2::manhattan_distance", + "glam::U8Vec2::as_u16vec2", + "glam::U8Vec2::cmpge", + "glam::U8Vec2::sub-2", + "glam::U8Vec2::div-1", + "glam::U8Vec2::clamp", + "glam::U8Vec2::clone", + "glam::U8Vec2::assert_receiver_is_total_eq", + "glam::U8Vec2::element_product", + "glam::U8Vec2::add-1", + "glam::U8Vec2::max_position", + "glam::U8Vec2::sub", + "glam::U8Vec2::wrapping_add", + "glam::U8Vec2::to_array", + "glam::U8Vec2::with_x", + "glam::U8Vec2::as_i8vec2", + "glam::U8Vec2::new", + "glam::U8Vec2::mul", + "glam::U8Vec2::splat", + "glam::U8Vec2::cmpeq", + "glam::U8Vec2::length_squared", + "glam::U8Vec2::dot", + "glam::U8Vec2::saturating_div", + "glam::U8Vec2::max_element", + "glam::U8Vec2::saturating_mul", + "glam::U8Vec2::min", + "glam::U8Vec2::dot_into_vec", + "glam::U8Vec2::mul-2", + "glam::U8Vec2::as_u64vec2", + "glam::U8Vec2::cmpne", + "glam::U8Vec2::add", + "glam::U8Vec2::div" + ], + "layout": { + "kind": "Struct", + "name": "U8Vec2", + "fields": [ + { + "name": "x", + "type": { + "primitive": "u8" + } + }, + { + "name": "y", + "type": { + "primitive": "u8" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::U8Vec3": { + "identifier": "U8Vec3", + "crate": "glam", + "path": "glam::U8Vec3", + "associated_functions": [ + "glam::U8Vec3::sub", + "glam::U8Vec3::element_sum", + "glam::U8Vec3::saturating_add", + "glam::U8Vec3::dot", + "glam::U8Vec3::cmpgt", + "glam::U8Vec3::min_element", + "glam::U8Vec3::add-1", + "glam::U8Vec3::truncate", + "glam::U8Vec3::min", + "glam::U8Vec3::add-2", + "glam::U8Vec3::cross", + "glam::U8Vec3::assert_receiver_is_total_eq", + "glam::U8Vec3::manhattan_distance", + "glam::U8Vec3::as_vec3", + "glam::U8Vec3::as_u64vec3", + "glam::U8Vec3::extend", + "glam::U8Vec3::as_vec3a", + "glam::U8Vec3::checked_manhattan_distance", + "glam::U8Vec3::wrapping_add_signed", + "glam::U8Vec3::to_array", + "glam::U8Vec3::wrapping_div", + "glam::U8Vec3::mul", + "glam::U8Vec3::as_i64vec3", + "glam::U8Vec3::as_uvec3", + "glam::U8Vec3::rem", + "glam::U8Vec3::sub-2", + "glam::U8Vec3::cmpge", + "glam::U8Vec3::add", + "glam::U8Vec3::wrapping_add", + "glam::U8Vec3::max_element", + "glam::U8Vec3::wrapping_sub", + "glam::U8Vec3::div", + "glam::U8Vec3::splat", + "glam::U8Vec3::saturating_add_signed", + "glam::U8Vec3::as_dvec3", + "glam::U8Vec3::max_position", + "glam::U8Vec3::element_product", + "glam::U8Vec3::max", + "glam::U8Vec3::saturating_div", + "glam::U8Vec3::select", + "glam::U8Vec3::cmpne", + "glam::U8Vec3::cmplt", + "glam::U8Vec3::rem-2", + "glam::U8Vec3::wrapping_mul", + "glam::U8Vec3::as_ivec3", + "glam::U8Vec3::cmple", + "glam::U8Vec3::div-2", + "glam::U8Vec3::cmpeq", + "glam::U8Vec3::from_array", + "glam::U8Vec3::as_u16vec3", + "glam::U8Vec3::length_squared", + "glam::U8Vec3::rem-1", + "glam::U8Vec3::mul-2", + "glam::U8Vec3::as_i8vec3", + "glam::U8Vec3::new", + "glam::U8Vec3::mul-1", + "glam::U8Vec3::dot_into_vec", + "glam::U8Vec3::clamp", + "glam::U8Vec3::eq", + "glam::U8Vec3::with_z", + "glam::U8Vec3::clone", + "glam::U8Vec3::div-1", + "glam::U8Vec3::with_x", + "glam::U8Vec3::chebyshev_distance", + "glam::U8Vec3::min_position", + "glam::U8Vec3::saturating_sub", + "glam::U8Vec3::saturating_mul", + "glam::U8Vec3::sub-1", + "glam::U8Vec3::with_y", + "glam::U8Vec3::as_i16vec3" + ], + "layout": { + "kind": "Struct", + "name": "U8Vec3", + "fields": [ + { + "name": "x", + "type": { + "primitive": "u8" + } + }, + { + "name": "y", + "type": { + "primitive": "u8" + } + }, + { + "name": "z", + "type": { + "primitive": "u8" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::U8Vec4": { + "identifier": "U8Vec4", + "crate": "glam", + "path": "glam::U8Vec4", + "associated_functions": [ + "glam::U8Vec4::max_element", + "glam::U8Vec4::cmpeq", + "glam::U8Vec4::min_position", + "glam::U8Vec4::cmpge", + "glam::U8Vec4::clone", + "glam::U8Vec4::eq", + "glam::U8Vec4::checked_manhattan_distance", + "glam::U8Vec4::wrapping_mul", + "glam::U8Vec4::as_i16vec4", + "glam::U8Vec4::max", + "glam::U8Vec4::cmplt", + "glam::U8Vec4::wrapping_add", + "glam::U8Vec4::add", + "glam::U8Vec4::cmple", + "glam::U8Vec4::assert_receiver_is_total_eq", + "glam::U8Vec4::manhattan_distance", + "glam::U8Vec4::wrapping_sub", + "glam::U8Vec4::cmpgt", + "glam::U8Vec4::from_array", + "glam::U8Vec4::as_u64vec4", + "glam::U8Vec4::saturating_mul", + "glam::U8Vec4::cmpne", + "glam::U8Vec4::rem", + "glam::U8Vec4::saturating_div", + "glam::U8Vec4::as_i8vec4", + "glam::U8Vec4::div", + "glam::U8Vec4::dot", + "glam::U8Vec4::clamp", + "glam::U8Vec4::wrapping_add_signed", + "glam::U8Vec4::div-2", + "glam::U8Vec4::rem-2", + "glam::U8Vec4::sub", + "glam::U8Vec4::as_uvec4", + "glam::U8Vec4::dot_into_vec", + "glam::U8Vec4::saturating_add_signed", + "glam::U8Vec4::as_dvec4", + "glam::U8Vec4::saturating_sub", + "glam::U8Vec4::as_vec4", + "glam::U8Vec4::element_product", + "glam::U8Vec4::with_z", + "glam::U8Vec4::as_u16vec4", + "glam::U8Vec4::saturating_add", + "glam::U8Vec4::with_w", + "glam::U8Vec4::new", + "glam::U8Vec4::select", + "glam::U8Vec4::truncate", + "glam::U8Vec4::splat", + "glam::U8Vec4::div-1", + "glam::U8Vec4::with_y", + "glam::U8Vec4::min", + "glam::U8Vec4::mul-1", + "glam::U8Vec4::add-1", + "glam::U8Vec4::as_ivec4", + "glam::U8Vec4::element_sum", + "glam::U8Vec4::sub-1", + "glam::U8Vec4::with_x", + "glam::U8Vec4::min_element", + "glam::U8Vec4::mul-2", + "glam::U8Vec4::sub-2", + "glam::U8Vec4::add-2", + "glam::U8Vec4::as_i64vec4", + "glam::U8Vec4::to_array", + "glam::U8Vec4::length_squared", + "glam::U8Vec4::mul", + "glam::U8Vec4::wrapping_div", + "glam::U8Vec4::max_position", + "glam::U8Vec4::chebyshev_distance", + "glam::U8Vec4::rem-1" + ], + "layout": { + "kind": "Struct", + "name": "U8Vec4", + "fields": [ + { + "name": "x", + "type": { + "primitive": "u8" + } + }, + { + "name": "y", + "type": { + "primitive": "u8" + } + }, + { + "name": "z", + "type": { + "primitive": "u8" + } + }, + { + "name": "w", + "type": { + "primitive": "u8" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::UVec2": { + "identifier": "UVec2", + "crate": "glam", + "path": "glam::UVec2", + "associated_functions": [ + "glam::UVec2::wrapping_add_signed", + "glam::UVec2::manhattan_distance", + "glam::UVec2::with_y", + "glam::UVec2::as_u64vec2", + "glam::UVec2::as_u16vec2", + "glam::UVec2::max", + "glam::UVec2::select", + "glam::UVec2::to_array", + "glam::UVec2::element_sum", + "glam::UVec2::extend", + "glam::UVec2::wrapping_add", + "glam::UVec2::as_i16vec2", + "glam::UVec2::saturating_add_signed", + "glam::UVec2::cmplt", + "glam::UVec2::rem", + "glam::UVec2::wrapping_div", + "glam::UVec2::sub-2", + "glam::UVec2::min_position", + "glam::UVec2::add-2", + "glam::UVec2::clone", + "glam::UVec2::as_i64vec2", + "glam::UVec2::with_x", + "glam::UVec2::cmpgt", + "glam::UVec2::rem-1", + "glam::UVec2::as_ivec2", + "glam::UVec2::clamp", + "glam::UVec2::element_product", + "glam::UVec2::sub-1", + "glam::UVec2::as_u8vec2", + "glam::UVec2::saturating_sub", + "glam::UVec2::add-1", + "glam::UVec2::length_squared", + "glam::UVec2::wrapping_mul", + "glam::UVec2::eq", + "glam::UVec2::cmpne", + "glam::UVec2::as_i8vec2", + "glam::UVec2::rem-2", + "glam::UVec2::wrapping_sub", + "glam::UVec2::splat", + "glam::UVec2::assert_receiver_is_total_eq", + "glam::UVec2::div-1", + "glam::UVec2::mul", + "glam::UVec2::as_vec2", + "glam::UVec2::min_element", + "glam::UVec2::div", + "glam::UVec2::max_element", + "glam::UVec2::saturating_add", + "glam::UVec2::as_dvec2", + "glam::UVec2::new", + "glam::UVec2::sub", + "glam::UVec2::mul-2", + "glam::UVec2::chebyshev_distance", + "glam::UVec2::saturating_mul", + "glam::UVec2::div-2", + "glam::UVec2::add", + "glam::UVec2::dot", + "glam::UVec2::from_array", + "glam::UVec2::cmple", + "glam::UVec2::saturating_div", + "glam::UVec2::cmpeq", + "glam::UVec2::max_position", + "glam::UVec2::cmpge", + "glam::UVec2::min", + "glam::UVec2::checked_manhattan_distance", + "glam::UVec2::mul-1", + "glam::UVec2::dot_into_vec" + ], + "layout": { + "kind": "Struct", + "name": "UVec2", + "fields": [ + { + "name": "x", + "type": { + "primitive": "u32" + } + }, + { + "name": "y", + "type": { + "primitive": "u32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::UVec3": { + "identifier": "UVec3", + "crate": "glam", + "path": "glam::UVec3", + "associated_functions": [ + "glam::UVec3::div", + "glam::UVec3::rem-1", + "glam::UVec3::dot", + "glam::UVec3::sub", + "glam::UVec3::checked_manhattan_distance", + "glam::UVec3::cross", + "glam::UVec3::clone", + "glam::UVec3::new", + "glam::UVec3::saturating_add", + "glam::UVec3::div-2", + "glam::UVec3::saturating_sub", + "glam::UVec3::min", + "glam::UVec3::cmpgt", + "glam::UVec3::as_u16vec3", + "glam::UVec3::assert_receiver_is_total_eq", + "glam::UVec3::extend", + "glam::UVec3::rem", + "glam::UVec3::to_array", + "glam::UVec3::saturating_div", + "glam::UVec3::mul-2", + "glam::UVec3::max", + "glam::UVec3::sub-2", + "glam::UVec3::truncate", + "glam::UVec3::as_ivec3", + "glam::UVec3::clamp", + "glam::UVec3::with_y", + "glam::UVec3::length_squared", + "glam::UVec3::rem-2", + "glam::UVec3::dot_into_vec", + "glam::UVec3::mul-1", + "glam::UVec3::chebyshev_distance", + "glam::UVec3::div-1", + "glam::UVec3::cmple", + "glam::UVec3::as_i16vec3", + "glam::UVec3::cmpge", + "glam::UVec3::wrapping_add", + "glam::UVec3::with_z", + "glam::UVec3::element_sum", + "glam::UVec3::wrapping_sub", + "glam::UVec3::max_position", + "glam::UVec3::splat", + "glam::UVec3::wrapping_div", + "glam::UVec3::as_u8vec3", + "glam::UVec3::from_array", + "glam::UVec3::as_i64vec3", + "glam::UVec3::saturating_mul", + "glam::UVec3::manhattan_distance", + "glam::UVec3::with_x", + "glam::UVec3::min_element", + "glam::UVec3::saturating_add_signed", + "glam::UVec3::add", + "glam::UVec3::as_dvec3", + "glam::UVec3::element_product", + "glam::UVec3::wrapping_mul", + "glam::UVec3::mul", + "glam::UVec3::as_vec3a", + "glam::UVec3::as_vec3", + "glam::UVec3::wrapping_add_signed", + "glam::UVec3::sub-1", + "glam::UVec3::max_element", + "glam::UVec3::select", + "glam::UVec3::eq", + "glam::UVec3::as_u64vec3", + "glam::UVec3::cmpne", + "glam::UVec3::cmplt", + "glam::UVec3::add-1", + "glam::UVec3::min_position", + "glam::UVec3::add-2", + "glam::UVec3::cmpeq", + "glam::UVec3::as_i8vec3" + ], + "layout": { + "kind": "Struct", + "name": "UVec3", + "fields": [ + { + "name": "x", + "type": { + "primitive": "u32" + } + }, + { + "name": "y", + "type": { + "primitive": "u32" + } + }, + { + "name": "z", + "type": { + "primitive": "u32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::UVec4": { + "identifier": "UVec4", + "crate": "glam", + "path": "glam::UVec4", + "associated_functions": [ + "glam::UVec4::min", + "glam::UVec4::saturating_add", + "glam::UVec4::mul", + "glam::UVec4::as_ivec4", + "glam::UVec4::min_element", + "glam::UVec4::element_sum", + "glam::UVec4::with_z", + "glam::UVec4::wrapping_sub", + "glam::UVec4::clone", + "glam::UVec4::add-1", + "glam::UVec4::add", + "glam::UVec4::dot", + "glam::UVec4::saturating_sub", + "glam::UVec4::as_vec4", + "glam::UVec4::eq", + "glam::UVec4::as_u8vec4", + "glam::UVec4::wrapping_add_signed", + "glam::UVec4::cmpne", + "glam::UVec4::with_y", + "glam::UVec4::as_i64vec4", + "glam::UVec4::select", + "glam::UVec4::div", + "glam::UVec4::splat", + "glam::UVec4::from_array", + "glam::UVec4::rem-1", + "glam::UVec4::as_i8vec4", + "glam::UVec4::as_u64vec4", + "glam::UVec4::rem", + "glam::UVec4::element_product", + "glam::UVec4::saturating_mul", + "glam::UVec4::sub-1", + "glam::UVec4::max", + "glam::UVec4::cmpeq", + "glam::UVec4::cmple", + "glam::UVec4::saturating_div", + "glam::UVec4::new", + "glam::UVec4::saturating_add_signed", + "glam::UVec4::sub-2", + "glam::UVec4::length_squared", + "glam::UVec4::truncate", + "glam::UVec4::cmpge", + "glam::UVec4::sub", + "glam::UVec4::with_w", + "glam::UVec4::as_dvec4", + "glam::UVec4::cmpgt", + "glam::UVec4::mul-2", + "glam::UVec4::chebyshev_distance", + "glam::UVec4::max_element", + "glam::UVec4::add-2", + "glam::UVec4::as_u16vec4", + "glam::UVec4::as_i16vec4", + "glam::UVec4::div-1", + "glam::UVec4::rem-2", + "glam::UVec4::max_position", + "glam::UVec4::min_position", + "glam::UVec4::dot_into_vec", + "glam::UVec4::div-2", + "glam::UVec4::manhattan_distance", + "glam::UVec4::clamp", + "glam::UVec4::wrapping_add", + "glam::UVec4::checked_manhattan_distance", + "glam::UVec4::assert_receiver_is_total_eq", + "glam::UVec4::cmplt", + "glam::UVec4::wrapping_div", + "glam::UVec4::to_array", + "glam::UVec4::wrapping_mul", + "glam::UVec4::mul-1", + "glam::UVec4::with_x" + ], + "layout": { + "kind": "Struct", + "name": "UVec4", + "fields": [ + { + "name": "x", + "type": { + "primitive": "u32" + } + }, + { + "name": "y", + "type": { + "primitive": "u32" + } + }, + { + "name": "z", + "type": { + "primitive": "u32" + } + }, + { + "name": "w", + "type": { + "primitive": "u32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::Vec2": { + "identifier": "Vec2", + "crate": "glam", + "path": "glam::Vec2", + "associated_functions": [ + "glam::Vec2::to_angle", + "glam::Vec2::length_recip", + "glam::Vec2::round", + "glam::Vec2::project_onto_normalized", + "glam::Vec2::length", + "glam::Vec2::rem-1", + "glam::Vec2::element_sum", + "glam::Vec2::add", + "glam::Vec2::sub", + "glam::Vec2::length_squared", + "glam::Vec2::fract_gl", + "glam::Vec2::cmpeq", + "glam::Vec2::as_u8vec2", + "glam::Vec2::max_element", + "glam::Vec2::mul-2", + "glam::Vec2::min_position", + "glam::Vec2::distance_squared", + "glam::Vec2::mul-1", + "glam::Vec2::perp_dot", + "glam::Vec2::cmplt", + "glam::Vec2::min_element", + "glam::Vec2::sub-2", + "glam::Vec2::rotate", + "glam::Vec2::dot", + "glam::Vec2::exp", + "glam::Vec2::distance", + "glam::Vec2::is_normalized", + "glam::Vec2::project_onto", + "glam::Vec2::rem_euclid", + "glam::Vec2::rem", + "glam::Vec2::cmple", + "glam::Vec2::dot_into_vec", + "glam::Vec2::refract", + "glam::Vec2::angle_to", + "glam::Vec2::from_array", + "glam::Vec2::to_array", + "glam::Vec2::select", + "glam::Vec2::ceil", + "glam::Vec2::mul_add", + "glam::Vec2::sub-1", + "glam::Vec2::as_u64vec2", + "glam::Vec2::copysign", + "glam::Vec2::cmpge", + "glam::Vec2::reject_from", + "glam::Vec2::normalize_or_zero", + "glam::Vec2::clamp", + "glam::Vec2::log2", + "glam::Vec2::move_towards", + "glam::Vec2::reflect", + "glam::Vec2::floor", + "glam::Vec2::as_u16vec2", + "glam::Vec2::normalize", + "glam::Vec2::with_x", + "glam::Vec2::new", + "glam::Vec2::reject_from_normalized", + "glam::Vec2::recip", + "glam::Vec2::as_i8vec2", + "glam::Vec2::cmpgt", + "glam::Vec2::trunc", + "glam::Vec2::normalize_or", + "glam::Vec2::rotate_towards", + "glam::Vec2::is_negative_bitmask", + "glam::Vec2::as_dvec2", + "glam::Vec2::as_ivec2", + "glam::Vec2::fract", + "glam::Vec2::as_i64vec2", + "glam::Vec2::min", + "glam::Vec2::as_uvec2", + "glam::Vec2::is_nan", + "glam::Vec2::add-2", + "glam::Vec2::ln", + "glam::Vec2::element_product", + "glam::Vec2::perp", + "glam::Vec2::max_position", + "glam::Vec2::is_finite", + "glam::Vec2::as_i16vec2", + "glam::Vec2::eq", + "glam::Vec2::clamp_length_min", + "glam::Vec2::cmpne", + "glam::Vec2::rem-2", + "glam::Vec2::div", + "glam::Vec2::angle_between", + "glam::Vec2::div-1", + "glam::Vec2::neg", + "glam::Vec2::lerp", + "glam::Vec2::clamp_length_max", + "glam::Vec2::div_euclid", + "glam::Vec2::from_angle", + "glam::Vec2::exp2", + "glam::Vec2::midpoint", + "glam::Vec2::mul", + "glam::Vec2::is_finite_mask", + "glam::Vec2::signum", + "glam::Vec2::abs", + "glam::Vec2::is_nan_mask", + "glam::Vec2::with_y", + "glam::Vec2::clone", + "glam::Vec2::abs_diff_eq", + "glam::Vec2::max", + "glam::Vec2::div-2", + "glam::Vec2::powf", + "glam::Vec2::extend", + "glam::Vec2::add-1", + "glam::Vec2::splat", + "glam::Vec2::clamp_length" + ], + "layout": { + "kind": "Struct", + "name": "Vec2", + "fields": [ + { + "name": "x", + "type": { + "primitive": "f32" + } + }, + { + "name": "y", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::Vec3": { + "identifier": "Vec3", + "crate": "glam", + "path": "glam::Vec3", + "associated_functions": [ + "glam::Vec3::mul-2", + "glam::Vec3::extend", + "glam::Vec3::cross", + "glam::Vec3::round", + "glam::Vec3::from_homogeneous", + "glam::Vec3::reject_from_normalized", + "glam::Vec3::is_finite", + "glam::Vec3::rem-1", + "glam::Vec3::rotate_x", + "glam::Vec3::sub", + "glam::Vec3::any_orthonormal_vector", + "glam::Vec3::max_element", + "glam::Vec3::ln", + "glam::Vec3::as_i16vec3", + "glam::Vec3::normalize", + "glam::Vec3::cmpeq", + "glam::Vec3::clamp_length", + "glam::Vec3::as_i64vec3", + "glam::Vec3::element_product", + "glam::Vec3::cmpge", + "glam::Vec3::floor", + "glam::Vec3::element_sum", + "glam::Vec3::abs_diff_eq", + "glam::Vec3::angle_between", + "glam::Vec3::from_array", + "glam::Vec3::to_vec3a", + "glam::Vec3::move_towards", + "glam::Vec3::cmple", + "glam::Vec3::any_orthogonal_vector", + "glam::Vec3::length", + "glam::Vec3::clamp", + "glam::Vec3::is_normalized", + "glam::Vec3::max_position", + "glam::Vec3::as_u16vec3", + "glam::Vec3::normalize_or", + "glam::Vec3::signum", + "glam::Vec3::length_squared", + "glam::Vec3::midpoint", + "glam::Vec3::is_nan_mask", + "glam::Vec3::to_array", + "glam::Vec3::copysign", + "glam::Vec3::project_onto_normalized", + "glam::Vec3::distance", + "glam::Vec3::add-2", + "glam::Vec3::is_negative_bitmask", + "glam::Vec3::rem_euclid", + "glam::Vec3::fract_gl", + "glam::Vec3::add-1", + "glam::Vec3::sub-2", + "glam::Vec3::rotate_towards", + "glam::Vec3::reject_from", + "glam::Vec3::truncate", + "glam::Vec3::with_z", + "glam::Vec3::splat", + "glam::Vec3::as_u64vec3", + "glam::Vec3::sub-1", + "glam::Vec3::cmplt", + "glam::Vec3::neg", + "glam::Vec3::trunc", + "glam::Vec3::rotate_z", + "glam::Vec3::clamp_length_max", + "glam::Vec3::select", + "glam::Vec3::lerp", + "glam::Vec3::rem-2", + "glam::Vec3::normalize_or_zero", + "glam::Vec3::exp2", + "glam::Vec3::powf", + "glam::Vec3::div-2", + "glam::Vec3::min", + "glam::Vec3::div", + "glam::Vec3::length_recip", + "glam::Vec3::eq", + "glam::Vec3::mul", + "glam::Vec3::as_ivec3", + "glam::Vec3::min_element", + "glam::Vec3::cmpne", + "glam::Vec3::clamp_length_min", + "glam::Vec3::mul-1", + "glam::Vec3::rem", + "glam::Vec3::distance_squared", + "glam::Vec3::min_position", + "glam::Vec3::ceil", + "glam::Vec3::reflect", + "glam::Vec3::cmpgt", + "glam::Vec3::dot", + "glam::Vec3::abs", + "glam::Vec3::as_dvec3", + "glam::Vec3::refract", + "glam::Vec3::to_homogeneous", + "glam::Vec3::log2", + "glam::Vec3::is_nan", + "glam::Vec3::is_finite_mask", + "glam::Vec3::add", + "glam::Vec3::recip", + "glam::Vec3::as_u8vec3", + "glam::Vec3::new", + "glam::Vec3::dot_into_vec", + "glam::Vec3::as_uvec3", + "glam::Vec3::div-1", + "glam::Vec3::rotate_y", + "glam::Vec3::clone", + "glam::Vec3::with_x", + "glam::Vec3::fract", + "glam::Vec3::exp", + "glam::Vec3::rotate_axis", + "glam::Vec3::as_i8vec3", + "glam::Vec3::slerp", + "glam::Vec3::project_onto", + "glam::Vec3::div_euclid", + "glam::Vec3::max", + "glam::Vec3::mul_add", + "glam::Vec3::with_y" + ], + "layout": { + "kind": "Struct", + "name": "Vec3", + "fields": [ + { + "name": "x", + "type": { + "primitive": "f32" + } + }, + { + "name": "y", + "type": { + "primitive": "f32" + } + }, + { + "name": "z", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::Vec3A": { + "identifier": "Vec3A", + "crate": "glam", + "path": "glam::Vec3A", + "associated_functions": [ + "glam::Vec3A::to_vec3", + "glam::Vec3A::add", + "glam::Vec3A::sub-1", + "glam::Vec3A::round", + "glam::Vec3A::from_homogeneous", + "glam::Vec3A::element_product", + "glam::Vec3A::length", + "glam::Vec3A::is_nan_mask", + "glam::Vec3A::dot_into_vec", + "glam::Vec3A::normalize_or", + "glam::Vec3A::clamp", + "glam::Vec3A::midpoint", + "glam::Vec3A::cmpgt", + "glam::Vec3A::add-1", + "glam::Vec3A::floor", + "glam::Vec3A::fract", + "glam::Vec3A::reject_from", + "glam::Vec3A::as_uvec3", + "glam::Vec3A::as_i64vec3", + "glam::Vec3A::cmple", + "glam::Vec3A::div-2", + "glam::Vec3A::refract", + "glam::Vec3A::rotate_axis", + "glam::Vec3A::with_z", + "glam::Vec3A::new", + "glam::Vec3A::distance", + "glam::Vec3A::angle_between", + "glam::Vec3A::is_nan", + "glam::Vec3A::eq", + "glam::Vec3A::as_i16vec3", + "glam::Vec3A::lerp", + "glam::Vec3A::cmpge", + "glam::Vec3A::as_dvec3", + "glam::Vec3A::exp2", + "glam::Vec3A::from_array", + "glam::Vec3A::exp", + "glam::Vec3A::project_onto_normalized", + "glam::Vec3A::move_towards", + "glam::Vec3A::cmpeq", + "glam::Vec3A::with_x", + "glam::Vec3A::log2", + "glam::Vec3A::element_sum", + "glam::Vec3A::is_finite_mask", + "glam::Vec3A::signum", + "glam::Vec3A::ln", + "glam::Vec3A::add-2", + "glam::Vec3A::div_euclid", + "glam::Vec3A::any_orthogonal_vector", + "glam::Vec3A::clamp_length_max", + "glam::Vec3A::reject_from_normalized", + "glam::Vec3A::min_position", + "glam::Vec3A::as_ivec3", + "glam::Vec3A::max_element", + "glam::Vec3A::with_y", + "glam::Vec3A::as_u8vec3", + "glam::Vec3A::powf", + "glam::Vec3A::mul", + "glam::Vec3A::sub-2", + "glam::Vec3A::distance_squared", + "glam::Vec3A::trunc", + "glam::Vec3A::as_u16vec3", + "glam::Vec3A::slerp", + "glam::Vec3A::rotate_towards", + "glam::Vec3A::dot", + "glam::Vec3A::neg", + "glam::Vec3A::is_negative_bitmask", + "glam::Vec3A::ceil", + "glam::Vec3A::from_vec4", + "glam::Vec3A::rotate_z", + "glam::Vec3A::length_recip", + "glam::Vec3A::copysign", + "glam::Vec3A::as_u64vec3", + "glam::Vec3A::normalize", + "glam::Vec3A::max_position", + "glam::Vec3A::to_array", + "glam::Vec3A::cmpne", + "glam::Vec3A::mul-2", + "glam::Vec3A::min", + "glam::Vec3A::min_element", + "glam::Vec3A::any_orthonormal_vector", + "glam::Vec3A::length_squared", + "glam::Vec3A::sub", + "glam::Vec3A::rem-2", + "glam::Vec3A::div-1", + "glam::Vec3A::abs", + "glam::Vec3A::to_homogeneous", + "glam::Vec3A::as_i8vec3", + "glam::Vec3A::clone", + "glam::Vec3A::abs_diff_eq", + "glam::Vec3A::cross", + "glam::Vec3A::max", + "glam::Vec3A::select", + "glam::Vec3A::rem", + "glam::Vec3A::recip", + "glam::Vec3A::rem_euclid", + "glam::Vec3A::rem-1", + "glam::Vec3A::extend", + "glam::Vec3A::is_normalized", + "glam::Vec3A::clamp_length_min", + "glam::Vec3A::project_onto", + "glam::Vec3A::cmplt", + "glam::Vec3A::rotate_x", + "glam::Vec3A::rotate_y", + "glam::Vec3A::div", + "glam::Vec3A::is_finite", + "glam::Vec3A::mul-1", + "glam::Vec3A::clamp_length", + "glam::Vec3A::splat", + "glam::Vec3A::normalize_or_zero", + "glam::Vec3A::fract_gl", + "glam::Vec3A::mul_add", + "glam::Vec3A::truncate", + "glam::Vec3A::reflect" + ], + "layout": { + "kind": "Struct", + "name": "Vec3A", + "fields": [ + { + "name": "x", + "type": { + "primitive": "f32" + } + }, + { + "name": "y", + "type": { + "primitive": "f32" + } + }, + { + "name": "z", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "glam::Vec4": { + "identifier": "Vec4", + "crate": "glam", + "path": "glam::Vec4", + "associated_functions": [ + "glam::Vec4::abs_diff_eq", + "glam::Vec4::is_nan_mask", + "glam::Vec4::fract", + "glam::Vec4::max", + "glam::Vec4::ceil", + "glam::Vec4::cmpgt", + "glam::Vec4::as_dvec4", + "glam::Vec4::min_element", + "glam::Vec4::with_w", + "glam::Vec4::length_recip", + "glam::Vec4::project_onto", + "glam::Vec4::add-1", + "glam::Vec4::as_i16vec4", + "glam::Vec4::lerp", + "glam::Vec4::refract", + "glam::Vec4::rem-1", + "glam::Vec4::to_array", + "glam::Vec4::mul", + "glam::Vec4::exp", + "glam::Vec4::powf", + "glam::Vec4::rem_euclid", + "glam::Vec4::element_product", + "glam::Vec4::as_uvec4", + "glam::Vec4::is_nan", + "glam::Vec4::neg", + "glam::Vec4::project", + "glam::Vec4::select", + "glam::Vec4::copysign", + "glam::Vec4::as_i8vec4", + "glam::Vec4::project_onto_normalized", + "glam::Vec4::reject_from", + "glam::Vec4::distance", + "glam::Vec4::from_array", + "glam::Vec4::mul_add", + "glam::Vec4::cmpeq", + "glam::Vec4::cmpne", + "glam::Vec4::reject_from_normalized", + "glam::Vec4::exp2", + "glam::Vec4::rem", + "glam::Vec4::as_i64vec4", + "glam::Vec4::sub-2", + "glam::Vec4::eq", + "glam::Vec4::reflect", + "glam::Vec4::as_u16vec4", + "glam::Vec4::normalize_or", + "glam::Vec4::is_finite_mask", + "glam::Vec4::is_finite", + "glam::Vec4::add", + "glam::Vec4::max_position", + "glam::Vec4::clamp_length_max", + "glam::Vec4::splat", + "glam::Vec4::signum", + "glam::Vec4::as_u64vec4", + "glam::Vec4::div_euclid", + "glam::Vec4::mul-1", + "glam::Vec4::div", + "glam::Vec4::distance_squared", + "glam::Vec4::log2", + "glam::Vec4::as_u8vec4", + "glam::Vec4::clamp_length_min", + "glam::Vec4::as_ivec4", + "glam::Vec4::max_element", + "glam::Vec4::clamp", + "glam::Vec4::length_squared", + "glam::Vec4::midpoint", + "glam::Vec4::trunc", + "glam::Vec4::truncate", + "glam::Vec4::cmple", + "glam::Vec4::dot", + "glam::Vec4::clamp_length", + "glam::Vec4::new", + "glam::Vec4::min", + "glam::Vec4::div-2", + "glam::Vec4::move_towards", + "glam::Vec4::div-1", + "glam::Vec4::sub", + "glam::Vec4::round", + "glam::Vec4::element_sum", + "glam::Vec4::is_normalized", + "glam::Vec4::recip", + "glam::Vec4::length", + "glam::Vec4::floor", + "glam::Vec4::add-2", + "glam::Vec4::is_negative_bitmask", + "glam::Vec4::min_position", + "glam::Vec4::normalize_or_zero", + "glam::Vec4::fract_gl", + "glam::Vec4::abs", + "glam::Vec4::with_y", + "glam::Vec4::dot_into_vec", + "glam::Vec4::cmpge", + "glam::Vec4::mul-2", + "glam::Vec4::normalize", + "glam::Vec4::with_z", + "glam::Vec4::cmplt", + "glam::Vec4::sub-1", + "glam::Vec4::ln", + "glam::Vec4::rem-2", + "glam::Vec4::with_x", + "glam::Vec4::clone" + ], + "layout": { + "kind": "Struct", + "name": "Vec4", + "fields": [ + { + "name": "x", + "type": { + "primitive": "f32" + } + }, + { + "name": "y", + "type": { + "primitive": "f32" + } + }, + { + "name": "z", + "type": { + "primitive": "f32" + } + }, + { + "name": "w", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "smol_str::SmolStr": { + "identifier": "SmolStr", + "crate": "smol_str", + "path": "smol_str::SmolStr", + "associated_functions": [ + "smol_str::SmolStr::to_string", + "smol_str::SmolStr::is_heap_allocated", + "smol_str::SmolStr::clone", + "smol_str::SmolStr::is_empty", + "smol_str::SmolStr::eq", + "smol_str::SmolStr::len" + ], + "layout": null, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "uuid::NonNilUuid": { + "identifier": "NonNilUuid", + "crate": "uuid", + "path": "uuid::NonNilUuid", + "associated_functions": [ + "uuid::NonNilUuid::get", + "uuid::NonNilUuid::eq", + "uuid::NonNilUuid::clone", + "uuid::NonNilUuid::assert_receiver_is_total_eq", + "uuid::NonNilUuid::eq-1" + ], + "layout": null, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "uuid::Uuid": { + "identifier": "Uuid", + "crate": "uuid", + "path": "uuid::Uuid", + "associated_functions": [ + "uuid::Uuid::get_node_id", + "uuid::Uuid::new_v4", + "uuid::Uuid::into_bytes", + "uuid::Uuid::get_version_num", + "uuid::Uuid::is_max", + "uuid::Uuid::to_bytes_le", + "uuid::Uuid::from_bytes_le", + "uuid::Uuid::nil", + "uuid::Uuid::from_bytes", + "uuid::Uuid::from_u128_le", + "uuid::Uuid::max", + "uuid::Uuid::eq-1", + "uuid::Uuid::as_u64_pair", + "uuid::Uuid::clone", + "uuid::Uuid::encode_buffer", + "uuid::Uuid::is_nil", + "uuid::Uuid::to_u128_le", + "uuid::Uuid::assert_receiver_is_total_eq", + "uuid::Uuid::eq", + "uuid::Uuid::from_u128", + "uuid::Uuid::from_u64_pair", + "uuid::Uuid::as_u128" + ], + "layout": null, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "wgpu_types::BlendState": { + "identifier": "BlendState", + "crate": "wgpu_types", + "path": "wgpu_types::BlendState", + "associated_functions": [ + "wgpu_types::BlendState::eq", + "wgpu_types::BlendState::clone", + "wgpu_types::BlendState::assert_receiver_is_total_eq" + ], + "layout": null, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "wgpu_types::TextureFormat": { + "identifier": "TextureFormat", + "crate": "wgpu_types", + "path": "wgpu_types::TextureFormat", + "associated_functions": [ + "wgpu_types::TextureFormat::components", + "wgpu_types::TextureFormat::planes", + "wgpu_types::TextureFormat::clone", + "wgpu_types::TextureFormat::is_srgb", + "wgpu_types::TextureFormat::block_dimensions", + "wgpu_types::TextureFormat::is_depth_stencil_format", + "wgpu_types::TextureFormat::eq", + "wgpu_types::TextureFormat::size_multiple_requirement", + "wgpu_types::TextureFormat::has_depth_aspect", + "wgpu_types::TextureFormat::assert_receiver_is_total_eq", + "wgpu_types::TextureFormat::is_compressed", + "wgpu_types::TextureFormat::is_depth_stencil_component", + "wgpu_types::TextureFormat::remove_srgb_suffix", + "wgpu_types::TextureFormat::is_combined_depth_stencil_format", + "wgpu_types::TextureFormat::target_pixel_byte_cost", + "wgpu_types::TextureFormat::add_srgb_suffix", + "wgpu_types::TextureFormat::is_astc", + "wgpu_types::TextureFormat::has_color_aspect", + "wgpu_types::TextureFormat::has_stencil_aspect", + "wgpu_types::TextureFormat::is_bcn", + "wgpu_types::TextureFormat::is_multi_planar_format", + "wgpu_types::TextureFormat::target_component_alignment" + ], + "layout": null, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "Bool": { + "identifier": "Bool", + "path": "Bool", + "documentation": "A boolean value", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": false, + "mapped_to_primitive_kind": "bool" + } + }, + "Char": { + "identifier": "Char", + "path": "Char", + "documentation": "An 8-bit character", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": false, + "mapped_to_primitive_kind": "char" + } + }, + "DynamicFunction": { + "identifier": "DynamicFunction", + "path": "DynamicFunction", + "documentation": "A callable dynamic function", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": false, + "mapped_to_primitive_kind": "dynamicFunction" + } + }, + "DynamicFunctionMut": { + "identifier": "DynamicFunctionMut", + "path": "DynamicFunctionMut", + "documentation": "A stateful and callable dynamic function", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": false, + "mapped_to_primitive_kind": "dynamicFunctionMut" + } + }, + "F32": { + "identifier": "F32", + "path": "F32", + "documentation": "A 32-bit floating point number", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": false, + "mapped_to_primitive_kind": "f32" + } + }, + "F64": { + "identifier": "F64", + "path": "F64", + "documentation": "A 64-bit floating point number", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": false, + "mapped_to_primitive_kind": "f64" + } + }, + "FunctionCallContext": { + "identifier": "FunctionCallContext", + "path": "FunctionCallContext", + "documentation": "Function call context, if accepted by a function, means the function can access the world in arbitrary ways.", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": false, + "mapped_to_primitive_kind": "functionCallContext" + } + }, + "I128": { + "identifier": "I128", + "path": "I128", + "documentation": "A signed 128-bit integer", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": false, + "mapped_to_primitive_kind": "i128" + } + }, + "I16": { + "identifier": "I16", + "path": "I16", + "documentation": "A signed 16-bit integer", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": false, + "mapped_to_primitive_kind": "i16" + } + }, + "I32": { + "identifier": "I32", + "path": "I32", + "documentation": "A signed 32-bit integer", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": false, + "mapped_to_primitive_kind": "i32" + } + }, + "I64": { + "identifier": "I64", + "path": "I64", + "documentation": "A signed 64-bit integer", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": false, + "mapped_to_primitive_kind": "i64" + } + }, + "I8": { + "identifier": "I8", + "path": "I8", + "documentation": "A signed 8-bit integer", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": false, + "mapped_to_primitive_kind": "i8" + } + }, + "Isize": { + "identifier": "Isize", + "path": "Isize", + "documentation": "A signed pointer-sized integer", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": false, + "mapped_to_primitive_kind": "isize" + } + }, + "OsString": { + "identifier": "OsString", + "path": "OsString", + "documentation": "A heap allocated OS string", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": false, + "mapped_to_primitive_kind": "osString" + } + }, + "PathBuf": { + "identifier": "PathBuf", + "path": "PathBuf", + "documentation": "A heap allocated file path", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": false, + "mapped_to_primitive_kind": "pathBuf" + } + }, + "ScriptValue": { + "identifier": "ScriptValue", + "crate": "bevy_mod_scripting_bindings", + "path": "bevy_mod_scripting_bindings::script_value::ScriptValue", + "documentation": " An abstraction of values that can be passed to and from scripts.\n This allows us to re-use logic between scripting languages.", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "Str": { + "identifier": "Str", + "path": "Str", + "documentation": "A string slice", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": false, + "mapped_to_primitive_kind": "str" + } + }, + "String": { + "identifier": "String", + "path": "String", + "documentation": "A heap allocated string", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": false, + "mapped_to_primitive_kind": "string" + } + }, + "U128": { + "identifier": "U128", + "path": "U128", + "documentation": "An unsigned 128-bit integer", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": false, + "mapped_to_primitive_kind": "u128" + } + }, + "U16": { + "identifier": "U16", + "path": "U16", + "documentation": "An unsigned 16-bit integer", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": false, + "mapped_to_primitive_kind": "u16" + } + }, + "U32": { + "identifier": "U32", + "path": "U32", + "documentation": "An unsigned 32-bit integer", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": false, + "mapped_to_primitive_kind": "u32" + } + }, + "U64": { + "identifier": "U64", + "path": "U64", + "documentation": "An unsigned 64-bit integer", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": false, + "mapped_to_primitive_kind": "u64" + } + }, + "U8": { + "identifier": "U8", + "path": "U8", + "documentation": "An unsigned 8-bit integer", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": false, + "mapped_to_primitive_kind": "u8" + } + }, + "Usize": { + "identifier": "Usize", + "path": "Usize", + "documentation": "An unsigned pointer-sized integer", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": false, + "mapped_to_primitive_kind": "usize" + } + }, + "bevy_a11y::AccessibilityRequested": { + "identifier": "AccessibilityRequested", + "crate": "bevy_a11y", + "path": "bevy_a11y::AccessibilityRequested", + "documentation": " Tracks whether an assistive technology has requested accessibility\n information.\n\n This type is a [`Resource`] initialized by the\n [`AccessibilityPlugin`]. It may be useful if a third-party plugin needs to\n conditionally integrate with `AccessKit`.\n\n In other words, this resource represents whether accessibility providers\n are \"turned on\" or \"turned off\" across an entire Bevy `App`.\n\n By default, it is set to `false`, indicating that nothing has requested\n accessibility information yet.\n\n [`Resource`]: bevy_ecs::resource::Resource", + "layout": { + "kind": "TupleStruct", + "name": "AccessibilityRequested", + "fields": [ + { + "type": { + "val": "bevy_platform::sync::Arc" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": true, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_a11y::AccessibilitySystems": { + "identifier": "AccessibilitySystems", + "crate": "bevy_a11y", + "path": "bevy_a11y::AccessibilitySystems", + "documentation": " A system set relating to accessibility.\n\n Helps run accessibility updates all at once.", + "layout": [ + { + "kind": "Unit", + "name": "Update" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_a11y::ManageAccessibilityUpdates": { + "identifier": "ManageAccessibilityUpdates", + "crate": "bevy_a11y", + "path": "bevy_a11y::ManageAccessibilityUpdates", + "documentation": " Determines whether Bevy's ECS updates the accessibility tree.\n\n This [`Resource`] tells Bevy internals whether it should be handling\n `AccessKit` updates (`true`), or if something else is doing that (`false`).\n\n It defaults to `true`. So, by default, Bevy is configured to maintain the\n `AccessKit` tree.\n\n Set to `false` in cases where an external GUI library is sending\n accessibility updates instead. When this option is set inconsistently with\n that requirement, the external library and ECS will generate conflicting\n updates.\n\n [`Resource`]: bevy_ecs::resource::Resource", + "layout": { + "kind": "TupleStruct", + "name": "ManageAccessibilityUpdates", + "fields": [ + { + "type": { + "primitive": "bool" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": true, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_asset::assets::AssetIndex": { + "identifier": "AssetIndex", + "crate": "bevy_asset", + "path": "bevy_asset::assets::AssetIndex", + "documentation": " A generational runtime-only identifier for a specific [`Asset`] stored in [`Assets`]. This is optimized for efficient runtime\n usage and is not suitable for identifying assets across app runs.", + "layout": { + "kind": "Struct", + "name": "AssetIndex", + "fields": [ + { + "name": "generation", + "type": { + "primitive": "u32" + } + }, + { + "name": "index", + "type": { + "primitive": "u32" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_asset::handle::UntypedHandle": { + "identifier": "UntypedHandle", + "crate": "bevy_asset", + "path": "bevy_asset::handle::UntypedHandle", + "documentation": " An untyped variant of [`Handle`], which internally stores the [`Asset`] type information at runtime\n as a [`TypeId`] instead of encoding it in the compile-time type. This allows handles across [`Asset`] types\n to be stored together and compared.\n\n See [`Handle`] for more information.", + "layout": [ + { + "kind": "TupleStruct", + "name": "Strong", + "fields": [ + { + "type": { + "val": "bevy_platform::sync::Arc" + } + } + ] + }, + { + "kind": "Struct", + "name": "Uuid", + "fields": [ + { + "name": "type_id", + "type": { + "val": "core::any::TypeId" + } + }, + { + "name": "uuid", + "type": { + "val": "uuid::Uuid" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_asset::id::UntypedAssetId": { + "identifier": "UntypedAssetId", + "crate": "bevy_asset", + "path": "bevy_asset::id::UntypedAssetId", + "documentation": " An \"untyped\" / \"generic-less\" [`Asset`] identifier that behaves much like [`AssetId`], but stores the [`Asset`] type\n information at runtime instead of compile-time. This increases the size of the type, but it enables storing asset ids\n across asset types together and enables comparisons between them.", + "layout": [ + { + "kind": "Struct", + "name": "Index", + "fields": [ + { + "name": "type_id", + "type": { + "val": "core::any::TypeId" + } + }, + { + "name": "index", + "type": { + "val": "bevy_asset::assets::AssetIndex" + } + } + ] + }, + { + "kind": "Struct", + "name": "Uuid", + "fields": [ + { + "name": "type_id", + "type": { + "val": "core::any::TypeId" + } + }, + { + "name": "uuid", + "type": { + "val": "uuid::Uuid" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_asset::path::AssetPath": { + "identifier": "AssetPath", + "crate": "bevy_asset", + "path": "bevy_asset::path::AssetPath", + "documentation": " Represents a path to an asset in a \"virtual filesystem\".\n\n Asset paths consist of three main parts:\n * [`AssetPath::source`]: The name of the [`AssetSource`](crate::io::AssetSource) to load the asset from.\n This is optional. If one is not set the default source will be used (which is the `assets` folder by default).\n * [`AssetPath::path`]: The \"virtual filesystem path\" pointing to an asset source file.\n * [`AssetPath::label`]: An optional \"named sub asset\". When assets are loaded, they are\n allowed to load \"sub assets\" of any type, which are identified by a named \"label\".\n\n Asset paths are generally constructed (and visualized) as strings:\n\n ```no_run\n # use bevy_asset::{Asset, AssetServer, Handle};\n # use bevy_reflect::TypePath;\n #\n # #[derive(Asset, TypePath, Default)]\n # struct Mesh;\n #\n # #[derive(Asset, TypePath, Default)]\n # struct Scene;\n #\n # let asset_server: AssetServer = panic!();\n // This loads the `my_scene.scn` base asset from the default asset source.\n let scene: Handle = asset_server.load(\"my_scene.scn\");\n\n // This loads the `PlayerMesh` labeled asset from the `my_scene.scn` base asset in the default asset source.\n let mesh: Handle = asset_server.load(\"my_scene.scn#PlayerMesh\");\n\n // This loads the `my_scene.scn` base asset from a custom 'remote' asset source.\n let scene: Handle = asset_server.load(\"remote://my_scene.scn\");\n ```\n\n [`AssetPath`] implements [`From`] for `&'static str`, `&'static Path`, and `&'a String`,\n which allows us to optimize the static cases.\n This means that the common case of `asset_server.load(\"my_scene.scn\")` when it creates and\n clones internal owned [`AssetPaths`](AssetPath).\n This also means that you should use [`AssetPath::parse`] in cases where `&str` is the explicit type.", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_asset::render_asset::RenderAssetUsages": { + "identifier": "RenderAssetUsages", + "crate": "bevy_asset", + "path": "bevy_asset::render_asset::RenderAssetUsages", + "documentation": " Defines where the asset will be used.\n\n If an asset is set to the `RENDER_WORLD` but not the `MAIN_WORLD`, the asset data (pixel data,\n mesh vertex data, etc) will be removed from the cpu-side asset once it's been extracted and prepared\n in the render world. The asset will remain in the assets collection, but with only metadata.\n\n Unloading the asset data saves on memory, as for most cases it is no longer necessary to keep\n it in RAM once it's been uploaded to the GPU's VRAM. However, this means you cannot access the\n asset data from the CPU (via the `Assets` resource) once unloaded (without re-loading it).\n\n If you never need access to the asset from the CPU past the first frame it's loaded on,\n or only need very infrequent access, then set this to `RENDER_WORLD`. Otherwise, set this to\n `RENDER_WORLD | MAIN_WORLD`.\n\n If you have an asset that doesn't actually need to end up in the render world, like an Image\n that will be decoded into another Image asset, use `MAIN_WORLD` only.\n\n ## Platform-specific\n\n On Wasm, it is not possible for now to free reserved memory. To control memory usage, load assets\n in sequence and unload one before loading the next. See this\n [discussion about memory management](https://github.com/WebAssembly/design/issues/1397) for more\n details.", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::camera::Camera": { + "identifier": "Camera", + "crate": "bevy_camera", + "path": "bevy_camera::camera::Camera", + "documentation": " The defining [`Component`] for camera entities,\n storing information about how and what to render through this camera.\n\n The [`Camera`] component is added to an entity to define the properties of the viewpoint from\n which rendering occurs. It defines the position of the view to render, the projection method\n to transform the 3D objects into a 2D image, as well as the render target into which that image\n is produced.\n\n Note that a [`Camera`] needs a `CameraRenderGraph` to render anything.\n This is typically provided by adding a [`Camera2d`] or [`Camera3d`] component,\n but custom render graphs can also be defined. Inserting a [`Camera`] with no render\n graph will emit an error at runtime.\n\n [`Camera2d`]: crate::Camera2d\n [`Camera3d`]: crate::Camera3d", + "layout": { + "kind": "Struct", + "name": "Camera", + "fields": [ + { + "name": "viewport", + "type": { + "option": { + "val": "bevy_camera::camera::Viewport" + } + } + }, + { + "name": "order", + "type": { + "primitive": "isize" + } + }, + { + "name": "is_active", + "type": { + "primitive": "bool" + } + }, + { + "name": "output_mode", + "type": { + "val": "bevy_camera::camera::CameraOutputMode" + } + }, + { + "name": "msaa_writeback", + "type": { + "val": "bevy_camera::clear_color::MsaaWriteback" + } + }, + { + "name": "clear_color", + "type": { + "val": "bevy_camera::clear_color::ClearColorConfig" + } + }, + { + "name": "invert_culling", + "type": { + "primitive": "bool" + } + }, + { + "name": "sub_camera_view", + "type": { + "option": { + "val": "bevy_camera::camera::SubCameraView" + } + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::camera::CameraMainTextureUsages": { + "identifier": "CameraMainTextureUsages", + "crate": "bevy_camera", + "path": "bevy_camera::camera::CameraMainTextureUsages", + "documentation": " This component lets you control the [`TextureUsages`] field of the main texture generated for the camera", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::camera::CameraOutputMode": { + "identifier": "CameraOutputMode", + "crate": "bevy_camera", + "path": "bevy_camera::camera::CameraOutputMode", + "documentation": " Control how this [`Camera`] outputs once rendering is completed.", + "layout": [ + { + "kind": "Struct", + "name": "Write", + "fields": [ + { + "name": "blend_state", + "type": { + "option": { + "val": "wgpu_types::BlendState" + } + } + }, + { + "name": "clear_color", + "type": { + "val": "bevy_camera::clear_color::ClearColorConfig" + } + } + ] + }, + { + "kind": "Unit", + "name": "Skip" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::camera::Exposure": { + "identifier": "Exposure", + "crate": "bevy_camera", + "path": "bevy_camera::camera::Exposure", + "documentation": " How much energy a [`Camera3d`](crate::Camera3d) absorbs from incoming light.\n\n ", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::camera::ImageRenderTarget": { + "identifier": "ImageRenderTarget", + "crate": "bevy_camera", + "path": "bevy_camera::camera::ImageRenderTarget", + "documentation": " A render target that renders to an [`Image`].", + "layout": { + "kind": "Struct", + "name": "ImageRenderTarget", + "fields": [ + { + "name": "handle", + "type": { + "val": "bevy_asset::handle::Handle" + } + }, + { + "name": "scale_factor", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::camera::MainPassResolutionOverride": { + "identifier": "MainPassResolutionOverride", + "crate": "bevy_camera", + "path": "bevy_camera::camera::MainPassResolutionOverride", + "documentation": " Override the resolution a 3d camera's main pass is rendered at.\n\n Does not affect post processing.\n\n ## Usage\n\n * Insert this component on a 3d camera entity in the render world.\n * The resolution override must be smaller than the camera's viewport size.\n * The resolution override is specified in physical pixels.\n * In shaders, use `View::main_pass_viewport` instead of `View::viewport`.", + "layout": { + "kind": "TupleStruct", + "name": "MainPassResolutionOverride", + "fields": [ + { + "type": { + "val": "glam::UVec2" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::camera::ManualTextureViewHandle": { + "identifier": "ManualTextureViewHandle", + "crate": "bevy_camera", + "path": "bevy_camera::camera::ManualTextureViewHandle", + "documentation": " A unique id that corresponds to a specific `ManualTextureView` in the `ManualTextureViews` collection.\n\n See `ManualTextureViews` in `bevy_camera` for more details.", + "layout": { + "kind": "TupleStruct", + "name": "ManualTextureViewHandle", + "fields": [ + { + "type": { + "primitive": "u32" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::camera::NormalizedRenderTarget": { + "identifier": "NormalizedRenderTarget", + "crate": "bevy_camera", + "path": "bevy_camera::camera::NormalizedRenderTarget", + "documentation": " Normalized version of the render target.\n\n Once we have this we shouldn't need to resolve it down anymore.", + "layout": [ + { + "kind": "TupleStruct", + "name": "Window", + "fields": [ + { + "type": { + "val": "bevy_window::window::NormalizedWindowRef" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Image", + "fields": [ + { + "type": { + "val": "bevy_camera::camera::ImageRenderTarget" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "TextureView", + "fields": [ + { + "type": { + "val": "bevy_camera::camera::ManualTextureViewHandle" + } + } + ] + }, + { + "kind": "Struct", + "name": "None", + "fields": [ + { + "name": "width", + "type": { + "primitive": "u32" + } + }, + { + "name": "height", + "type": { + "primitive": "u32" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::camera::RenderTarget": { + "identifier": "RenderTarget", + "crate": "bevy_camera", + "path": "bevy_camera::camera::RenderTarget", + "documentation": " The \"target\" that a [`Camera`] will render to. For example, this could be a `Window`\n swapchain or an [`Image`].", + "layout": [ + { + "kind": "TupleStruct", + "name": "Window", + "fields": [ + { + "type": { + "val": "bevy_window::window::WindowRef" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Image", + "fields": [ + { + "type": { + "val": "bevy_camera::camera::ImageRenderTarget" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "TextureView", + "fields": [ + { + "type": { + "val": "bevy_camera::camera::ManualTextureViewHandle" + } + } + ] + }, + { + "kind": "Struct", + "name": "None", + "fields": [ + { + "name": "size", + "type": { + "val": "glam::UVec2" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::camera::SubCameraView": { + "identifier": "SubCameraView", + "crate": "bevy_camera", + "path": "bevy_camera::camera::SubCameraView", + "documentation": " Settings to define a camera sub view.\n\n When [`Camera::sub_camera_view`] is `Some`, only the sub-section of the\n image defined by `size` and `offset` (relative to the `full_size` of the\n whole image) is projected to the cameras viewport.\n\n Take the example of the following multi-monitor setup:\n ```css\n ┌───┬───┐\n │ A │ B │\n ├───┼───┤\n │ C │ D │\n └───┴───┘\n ```\n If each monitor is 1920x1080, the whole image will have a resolution of\n 3840x2160. For each monitor we can use a single camera with a viewport of\n the same size as the monitor it corresponds to. To ensure that the image is\n cohesive, we can use a different sub view on each camera:\n - Camera A: `full_size` = 3840x2160, `size` = 1920x1080, `offset` = 0,0\n - Camera B: `full_size` = 3840x2160, `size` = 1920x1080, `offset` = 1920,0\n - Camera C: `full_size` = 3840x2160, `size` = 1920x1080, `offset` = 0,1080\n - Camera D: `full_size` = 3840x2160, `size` = 1920x1080, `offset` =\n 1920,1080\n\n However since only the ratio between the values is important, they could all\n be divided by 120 and still produce the same image. Camera D would for\n example have the following values:\n `full_size` = 32x18, `size` = 16x9, `offset` = 16,9", + "layout": { + "kind": "Struct", + "name": "SubCameraView", + "fields": [ + { + "name": "full_size", + "type": { + "val": "glam::UVec2" + } + }, + { + "name": "offset", + "type": { + "val": "glam::Vec2" + } + }, + { + "name": "size", + "type": { + "val": "glam::UVec2" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::camera::Viewport": { + "identifier": "Viewport", + "crate": "bevy_camera", + "path": "bevy_camera::camera::Viewport", + "documentation": " Render viewport configuration for the [`Camera`] component.\n\n The viewport defines the area on the render target to which the camera renders its image.\n You can overlay multiple cameras in a single window using viewports to create effects like\n split screen, minimaps, and character viewers.", + "layout": { + "kind": "Struct", + "name": "Viewport", + "fields": [ + { + "name": "physical_position", + "type": { + "val": "glam::UVec2" + } + }, + { + "name": "physical_size", + "type": { + "val": "glam::UVec2" + } + }, + { + "name": "depth", + "type": { + "val": "core::ops::Range" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::clear_color::ClearColor": { + "identifier": "ClearColor", + "crate": "bevy_camera", + "path": "bevy_camera::clear_color::ClearColor", + "documentation": " A [`Resource`] that stores the default color that cameras use to clear the screen between frames.\n\n This color appears as the \"background\" color for simple apps,\n when there are portions of the screen with nothing rendered.\n\n Individual cameras may use [`Camera.clear_color`] to specify a different\n clear color or opt out of clearing their viewport.\n\n [`Camera.clear_color`]: crate::camera::Camera::clear_color", + "layout": { + "kind": "TupleStruct", + "name": "ClearColor", + "fields": [ + { + "type": { + "val": "bevy_color::color::Color" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": true, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::clear_color::ClearColorConfig": { + "identifier": "ClearColorConfig", + "crate": "bevy_camera", + "path": "bevy_camera::clear_color::ClearColorConfig", + "documentation": " For a camera, specifies the color used to clear the viewport\n [before rendering](crate::camera::Camera::clear_color)\n or when [writing to the final render target texture](crate::camera::Camera::output_mode).", + "layout": [ + { + "kind": "Unit", + "name": "Default" + }, + { + "kind": "TupleStruct", + "name": "Custom", + "fields": [ + { + "type": { + "val": "bevy_color::color::Color" + } + } + ] + }, + { + "kind": "Unit", + "name": "None" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::clear_color::MsaaWriteback": { + "identifier": "MsaaWriteback", + "crate": "bevy_camera", + "path": "bevy_camera::clear_color::MsaaWriteback", + "documentation": " Controls when MSAA writeback occurs for a camera.\n\n MSAA writeback copies the previous camera's output into the MSAA sampled texture before\n rendering, allowing multiple cameras to layer their results when MSAA is enabled.", + "layout": [ + { + "kind": "Unit", + "name": "Off" + }, + { + "kind": "Unit", + "name": "Auto" + }, + { + "kind": "Unit", + "name": "Always" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::components::Camera2d": { + "identifier": "Camera2d", + "crate": "bevy_camera", + "path": "bevy_camera::components::Camera2d", + "documentation": " A 2D camera component. Enables the 2D render graph for a [`Camera`].", + "layout": { + "kind": "Struct", + "name": "Camera2d" + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::components::Camera3d": { + "identifier": "Camera3d", + "crate": "bevy_camera", + "path": "bevy_camera::components::Camera3d", + "documentation": " A 3D camera component. Enables the main 3D render graph for a [`Camera`].\n\n The camera coordinate space is right-handed X-right, Y-up, Z-back.\n This means \"forward\" is -Z.", + "layout": { + "kind": "Struct", + "name": "Camera3d", + "fields": [ + { + "name": "depth_load_op", + "type": { + "val": "bevy_camera::components::Camera3dDepthLoadOp" + } + }, + { + "name": "depth_texture_usages", + "type": { + "val": "bevy_camera::components::Camera3dDepthTextureUsage" + } + }, + { + "name": "screen_space_specular_transmission_steps", + "type": { + "primitive": "usize" + } + }, + { + "name": "screen_space_specular_transmission_quality", + "type": { + "val": "bevy_camera::components::ScreenSpaceTransmissionQuality" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::components::Camera3dDepthLoadOp": { + "identifier": "Camera3dDepthLoadOp", + "crate": "bevy_camera", + "path": "bevy_camera::components::Camera3dDepthLoadOp", + "documentation": " The depth clear operation to perform for the main 3d pass.", + "layout": [ + { + "kind": "TupleStruct", + "name": "Clear", + "fields": [ + { + "type": { + "primitive": "f32" + } + } + ] + }, + { + "kind": "Unit", + "name": "Load" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::components::Camera3dDepthTextureUsage": { + "identifier": "Camera3dDepthTextureUsage", + "crate": "bevy_camera", + "path": "bevy_camera::components::Camera3dDepthTextureUsage", + "layout": { + "kind": "TupleStruct", + "name": "Camera3dDepthTextureUsage", + "fields": [ + { + "type": { + "primitive": "u32" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::components::ScreenSpaceTransmissionQuality": { + "identifier": "ScreenSpaceTransmissionQuality", + "crate": "bevy_camera", + "path": "bevy_camera::components::ScreenSpaceTransmissionQuality", + "documentation": " The quality of the screen space transmission blur effect, applied to whatever's “behind” transmissive\n objects when their `roughness` is greater than `0.0`.\n\n Higher qualities are more GPU-intensive.\n\n **Note:** You can get better-looking results at any quality level by enabling TAA. See: `TemporalAntiAliasPlugin`", + "layout": [ + { + "kind": "Unit", + "name": "Low" + }, + { + "kind": "Unit", + "name": "Medium" + }, + { + "kind": "Unit", + "name": "High" + }, + { + "kind": "Unit", + "name": "Ultra" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": true, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::primitives::Aabb": { + "identifier": "Aabb", + "crate": "bevy_camera", + "path": "bevy_camera::primitives::Aabb", + "documentation": " An axis-aligned bounding box, defined by:\n - a center,\n - the distances from the center to each faces along the axis,\n the faces are orthogonal to the axis.\n\n It is typically used as a component on an entity to represent the local space\n occupied by this entity, with faces orthogonal to its local axis.\n\n This component is notably used during \"frustum culling\", a process to determine\n if an entity should be rendered by a [`Camera`] if its bounding box intersects\n with the camera's [`Frustum`].\n\n It will be added automatically by the systems in [`CalculateBounds`] to entities that:\n - could be subject to frustum culling, for example with a [`Mesh3d`]\n or `Sprite` component,\n - don't have the [`NoFrustumCulling`] component.\n\n It won't be updated automatically if the space occupied by the entity changes,\n for example if the vertex positions of a [`Mesh3d`] are updated.\n\n [`Camera`]: crate::Camera\n [`NoFrustumCulling`]: crate::visibility::NoFrustumCulling\n [`CalculateBounds`]: crate::visibility::VisibilitySystems::CalculateBounds\n [`Mesh3d`]: bevy_mesh::Mesh", + "layout": { + "kind": "Struct", + "name": "Aabb", + "fields": [ + { + "name": "center", + "type": { + "val": "glam::Vec3A" + } + }, + { + "name": "half_extents", + "type": { + "val": "glam::Vec3A" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::primitives::CascadesFrusta": { + "identifier": "CascadesFrusta", + "crate": "bevy_camera", + "path": "bevy_camera::primitives::CascadesFrusta", + "layout": { + "kind": "Struct", + "name": "CascadesFrusta" + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::primitives::CubemapFrusta": { + "identifier": "CubemapFrusta", + "crate": "bevy_camera", + "path": "bevy_camera::primitives::CubemapFrusta", + "layout": { + "kind": "Struct", + "name": "CubemapFrusta" + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::primitives::CubemapLayout": { + "identifier": "CubemapLayout", + "crate": "bevy_camera", + "path": "bevy_camera::primitives::CubemapLayout", + "documentation": " Cubemap layout defines the order of images in a packed cubemap image.", + "layout": [ + { + "kind": "Unit", + "name": "CrossVertical" + }, + { + "kind": "Unit", + "name": "CrossHorizontal" + }, + { + "kind": "Unit", + "name": "SequenceVertical" + }, + { + "kind": "Unit", + "name": "SequenceHorizontal" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::primitives::Frustum": { + "identifier": "Frustum", + "crate": "bevy_camera", + "path": "bevy_camera::primitives::Frustum", + "documentation": " A region of 3D space defined by the intersection of 6 [`HalfSpace`]s.\n\n Frustums are typically an apex-truncated square pyramid (a pyramid without the top) or a cuboid.\n\n Half spaces are ordered left, right, top, bottom, near, far. The normal vectors\n of the half-spaces point towards the interior of the frustum.\n\n A frustum component is used on an entity with a [`Camera`] component to\n determine which entities will be considered for rendering by this camera.\n All entities with an [`Aabb`] component that are not contained by (or crossing\n the boundary of) the frustum will not be rendered, and not be used in rendering computations.\n\n This process is called frustum culling, and entities can opt out of it using\n the [`NoFrustumCulling`] component.\n\n The frustum component is typically added automatically for cameras, either [`Camera2d`] or [`Camera3d`].\n It is usually updated automatically by [`update_frusta`] from the\n [`CameraProjection`] component and [`GlobalTransform`] of the camera entity.\n\n [`Camera`]: crate::Camera\n [`NoFrustumCulling`]: crate::visibility::NoFrustumCulling\n [`update_frusta`]: crate::visibility::update_frusta\n [`CameraProjection`]: crate::CameraProjection\n [`GlobalTransform`]: bevy_transform::components::GlobalTransform\n [`Camera2d`]: crate::Camera2d\n [`Camera3d`]: crate::Camera3d", + "layout": { + "kind": "Struct", + "name": "Frustum" + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::projection::CustomProjection": { + "identifier": "CustomProjection", + "crate": "bevy_camera", + "path": "bevy_camera::projection::CustomProjection", + "documentation": " Holds a dynamic [`CameraProjection`] trait object. Use [`Projection::custom()`] to construct a\n custom projection.\n\n The contained dynamic object can be downcast into a static type using [`CustomProjection::get`].", + "layout": { + "kind": "Struct", + "name": "CustomProjection" + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::projection::OrthographicProjection": { + "identifier": "OrthographicProjection", + "crate": "bevy_camera", + "path": "bevy_camera::projection::OrthographicProjection", + "documentation": " Project a 3D space onto a 2D surface using parallel lines, i.e., unlike [`PerspectiveProjection`],\n the size of objects remains the same regardless of their distance to the camera.\n\n The volume contained in the projection is called the *view frustum*. Since the viewport is rectangular\n and projection lines are parallel, the view frustum takes the shape of a cuboid.\n\n Note that the scale of the projection and the apparent size of objects are inversely proportional.\n As the size of the projection increases, the size of objects decreases.\n\n # Examples\n\n Configure the orthographic projection to one world unit per 100 window pixels:\n\n ```\n # use bevy_camera::{OrthographicProjection, Projection, ScalingMode};\n let projection = Projection::Orthographic(OrthographicProjection {\n scaling_mode: ScalingMode::WindowSize,\n scale: 0.01,\n ..OrthographicProjection::default_2d()\n });\n ```", + "layout": { + "kind": "Struct", + "name": "OrthographicProjection", + "fields": [ + { + "name": "near", + "type": { + "primitive": "f32" + } + }, + { + "name": "far", + "type": { + "primitive": "f32" + } + }, + { + "name": "viewport_origin", + "type": { + "val": "glam::Vec2" + } + }, + { + "name": "scaling_mode", + "type": { + "val": "bevy_camera::projection::ScalingMode" + } + }, + { + "name": "scale", + "type": { + "primitive": "f32" + } + }, + { + "name": "area", + "type": { + "val": "bevy_math::rects::rect::Rect" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::projection::PerspectiveProjection": { + "identifier": "PerspectiveProjection", + "crate": "bevy_camera", + "path": "bevy_camera::projection::PerspectiveProjection", + "documentation": " A 3D camera projection in which distant objects appear smaller than close objects.", + "layout": { + "kind": "Struct", + "name": "PerspectiveProjection", + "fields": [ + { + "name": "fov", + "type": { + "primitive": "f32" + } + }, + { + "name": "aspect_ratio", + "type": { + "primitive": "f32" + } + }, + { + "name": "near", + "type": { + "primitive": "f32" + } + }, + { + "name": "far", + "type": { + "primitive": "f32" + } + }, + { + "name": "near_clip_plane", + "type": { + "val": "glam::Vec4" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::projection::Projection": { + "identifier": "Projection", + "crate": "bevy_camera", + "path": "bevy_camera::projection::Projection", + "documentation": " Component that defines how to compute a [`Camera`]'s projection matrix.\n\n Common projections, like perspective and orthographic, are provided out of the box to handle the\n majority of use cases. Custom projections can be added using the [`CameraProjection`] trait and\n the [`Projection::custom`] constructor.\n\n ## What's a projection?\n\n A camera projection essentially describes how 3d points from the point of view of a camera are\n projected onto a 2d screen. This is where properties like a camera's field of view are defined.\n More specifically, a projection is a 4x4 matrix that transforms points from view space (the\n point of view of the camera) into clip space. Clip space is almost, but not quite, equivalent to\n the rectangle that is rendered to your screen, with a depth axis. Any points that land outside\n the bounds of this cuboid are \"clipped\" and not rendered.\n\n You can also think of the projection as the thing that describes the shape of a camera's\n frustum: the volume in 3d space that is visible to a camera.\n\n [`Camera`]: crate::camera::Camera", + "layout": [ + { + "kind": "TupleStruct", + "name": "Perspective", + "fields": [ + { + "type": { + "val": "bevy_camera::projection::PerspectiveProjection" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Orthographic", + "fields": [ + { + "type": { + "val": "bevy_camera::projection::OrthographicProjection" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Custom", + "fields": [ + { + "type": { + "val": "bevy_camera::projection::CustomProjection" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::projection::ScalingMode": { + "identifier": "ScalingMode", + "crate": "bevy_camera", + "path": "bevy_camera::projection::ScalingMode", + "documentation": " Scaling mode for [`OrthographicProjection`].\n\n The effect of these scaling modes are combined with the [`OrthographicProjection::scale`] property.\n\n For example, if the scaling mode is `ScalingMode::Fixed { width: 100.0, height: 300 }` and the scale is `2.0`,\n the projection will be 200 world units wide and 600 world units tall.\n\n # Examples\n\n Configure the orthographic projection to two world units per window height:\n\n ```\n # use bevy_camera::{OrthographicProjection, Projection, ScalingMode};\n let projection = Projection::Orthographic(OrthographicProjection {\n scaling_mode: ScalingMode::FixedVertical { viewport_height: 2.0 },\n ..OrthographicProjection::default_2d()\n });\n ```", + "layout": [ + { + "kind": "Unit", + "name": "WindowSize" + }, + { + "kind": "Struct", + "name": "Fixed", + "fields": [ + { + "name": "width", + "type": { + "primitive": "f32" + } + }, + { + "name": "height", + "type": { + "primitive": "f32" + } + } + ] + }, + { + "kind": "Struct", + "name": "AutoMin", + "fields": [ + { + "name": "min_width", + "type": { + "primitive": "f32" + } + }, + { + "name": "min_height", + "type": { + "primitive": "f32" + } + } + ] + }, + { + "kind": "Struct", + "name": "AutoMax", + "fields": [ + { + "name": "max_width", + "type": { + "primitive": "f32" + } + }, + { + "name": "max_height", + "type": { + "primitive": "f32" + } + } + ] + }, + { + "kind": "Struct", + "name": "FixedVertical", + "fields": [ + { + "name": "viewport_height", + "type": { + "primitive": "f32" + } + } + ] + }, + { + "kind": "Struct", + "name": "FixedHorizontal", + "fields": [ + { + "name": "viewport_width", + "type": { + "primitive": "f32" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::visibility::CascadesVisibleEntities": { + "identifier": "CascadesVisibleEntities", + "crate": "bevy_camera", + "path": "bevy_camera::visibility::CascadesVisibleEntities", + "layout": { + "kind": "Struct", + "name": "CascadesVisibleEntities" + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::visibility::CubemapVisibleEntities": { + "identifier": "CubemapVisibleEntities", + "crate": "bevy_camera", + "path": "bevy_camera::visibility::CubemapVisibleEntities", + "layout": { + "kind": "Struct", + "name": "CubemapVisibleEntities" + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::visibility::InheritedVisibility": { + "identifier": "InheritedVisibility", + "crate": "bevy_camera", + "path": "bevy_camera::visibility::InheritedVisibility", + "documentation": " Whether or not an entity is visible in the hierarchy.\n This will not be accurate until [`VisibilityPropagate`] runs in the [`PostUpdate`] schedule.\n\n If this is false, then [`ViewVisibility`] should also be false.\n\n [`VisibilityPropagate`]: VisibilitySystems::VisibilityPropagate", + "layout": { + "kind": "TupleStruct", + "name": "InheritedVisibility", + "fields": [ + { + "type": { + "primitive": "bool" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::visibility::NoAutoAabb": { + "identifier": "NoAutoAabb", + "crate": "bevy_camera", + "path": "bevy_camera::visibility::NoAutoAabb", + "documentation": " Add this component to an entity to prevent its `AABB` from being automatically recomputed.\n\n This is useful if entities are already spawned with a correct `Aabb` component, or you have\n many entities and want to avoid the cost of table scans searching for entities that need to have\n their AABB recomputed.", + "layout": { + "kind": "Struct", + "name": "NoAutoAabb" + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::visibility::NoFrustumCulling": { + "identifier": "NoFrustumCulling", + "crate": "bevy_camera", + "path": "bevy_camera::visibility::NoFrustumCulling", + "documentation": " Use this component to opt-out of built-in frustum culling for entities, see\n [`Frustum`].\n\n It can be used for example:\n - when a [`Mesh`] is updated but its [`Aabb`] is not, which might happen with animations,\n - when using some light effects, like wanting a [`Mesh`] out of the [`Frustum`]\n to appear in the reflection of a [`Mesh`] within.", + "layout": { + "kind": "Struct", + "name": "NoFrustumCulling" + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::visibility::ViewVisibility": { + "identifier": "ViewVisibility", + "crate": "bevy_camera", + "path": "bevy_camera::visibility::ViewVisibility", + "documentation": " Algorithmically computed indication of whether an entity is visible and should be extracted for\n rendering.\n\n Each frame, this will be reset to `false` during [`VisibilityPropagate`] systems in\n [`PostUpdate`]. Later in the frame, systems in [`CheckVisibility`] will mark any visible\n entities using [`ViewVisibility::set`]. Because of this, values of this type will be marked as\n changed every frame, even when they do not change.\n\n If you wish to add a custom visibility system that sets this value, be sure to add it to the\n [`CheckVisibility`] set.\n\n [`VisibilityPropagate`]: VisibilitySystems::VisibilityPropagate\n [`CheckVisibility`]: VisibilitySystems::CheckVisibility", + "layout": { + "kind": "TupleStruct", + "name": "ViewVisibility", + "fields": [ + { + "type": { + "primitive": "u8" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::visibility::Visibility": { + "identifier": "Visibility", + "crate": "bevy_camera", + "path": "bevy_camera::visibility::Visibility", + "documentation": " User indication of whether an entity is visible. Propagates down the entity hierarchy.\n\n If an entity is hidden in this way, all [`Children`] (and all of their children and so on) who\n are set to [`Inherited`](Self::Inherited) will also be hidden.\n\n This is done by the `visibility_propagate_system` which uses the entity hierarchy and\n `Visibility` to set the values of each entity's [`InheritedVisibility`] component.", + "layout": [ + { + "kind": "Unit", + "name": "Inherited" + }, + { + "kind": "Unit", + "name": "Hidden" + }, + { + "kind": "Unit", + "name": "Visible" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::visibility::VisibilityClass": { + "identifier": "VisibilityClass", + "crate": "bevy_camera", + "path": "bevy_camera::visibility::VisibilityClass", + "documentation": " A bucket into which we group entities for the purposes of visibility.\n\n Bevy's various rendering subsystems (3D, 2D, etc.) want to be able to\n quickly winnow the set of entities to only those that the subsystem is\n tasked with rendering, to avoid spending time examining irrelevant entities.\n At the same time, Bevy wants the [`check_visibility`] system to determine\n all entities' visibilities at the same time, regardless of what rendering\n subsystem is responsible for drawing them. Additionally, your application\n may want to add more types of renderable objects that Bevy determines\n visibility for just as it does for Bevy's built-in objects.\n\n The solution to this problem is *visibility classes*. A visibility class is\n a type, typically the type of a component, that represents the subsystem\n that renders it: for example, `Mesh3d`, `Mesh2d`, and `Sprite`. The\n [`VisibilityClass`] component stores the visibility class or classes that\n the entity belongs to. (Generally, an object will belong to only one\n visibility class, but in rare cases it may belong to multiple.)\n\n When adding a new renderable component, you'll typically want to write an\n add-component hook that adds the type ID of that component to the\n [`VisibilityClass`] array. See `custom_phase_item` for an example.\n\n `VisibilityClass` is automatically added by a hook on the `Mesh3d` and\n `Mesh2d` components. To avoid duplicating the `VisibilityClass` and\n causing issues when cloning, we use `#[component(clone_behavior=Ignore)]`", + "layout": { + "kind": "TupleStruct", + "name": "VisibilityClass", + "fields": [ + { + "type": { + "vec": { + "val": "core::any::TypeId" + } + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::visibility::VisibleEntities": { + "identifier": "VisibleEntities", + "crate": "bevy_camera", + "path": "bevy_camera::visibility::VisibleEntities", + "documentation": " Collection of entities visible from the current view.\n\n This component contains all entities which are visible from the currently\n rendered view. The collection is updated automatically by the [`VisibilitySystems::CheckVisibility`]\n system set. Renderers can use the equivalent `RenderVisibleEntities` to optimize rendering of\n a particular view, to prevent drawing items not visible from that view.\n\n This component is intended to be attached to the same entity as the [`Camera`] and\n the [`Frustum`] defining the view.", + "layout": { + "kind": "Struct", + "name": "VisibleEntities" + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::visibility::VisibleMeshEntities": { + "identifier": "VisibleMeshEntities", + "crate": "bevy_camera", + "path": "bevy_camera::visibility::VisibleMeshEntities", + "documentation": " Collection of mesh entities visible for 3D lighting.\n\n This component contains all mesh entities visible from the current light view.\n The collection is updated automatically by `bevy_pbr::SimulationLightSystems`.", + "layout": { + "kind": "Struct", + "name": "VisibleMeshEntities" + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::visibility::range::VisibilityRange": { + "identifier": "VisibilityRange", + "crate": "bevy_camera", + "path": "bevy_camera::visibility::range::VisibilityRange", + "documentation": " Specifies the range of distances that this entity must be from the camera in\n order to be rendered.\n\n This is also known as *hierarchical level of detail* or *HLOD*.\n\n Use this component when you want to render a high-polygon mesh when the\n camera is close and a lower-polygon mesh when the camera is far away. This\n is a common technique for improving performance, because fine details are\n hard to see in a mesh at a distance. To avoid an artifact known as *popping*\n between levels, each level has a *margin*, within which the object\n transitions gradually from invisible to visible using a dithering effect.\n\n You can also use this feature to replace multiple meshes with a single mesh\n when the camera is distant. This is the reason for the term \"*hierarchical*\n level of detail\". Reducing the number of meshes can be useful for reducing\n drawcall count. Note that you must place the [`VisibilityRange`] component\n on each entity you want to be part of a LOD group, as [`VisibilityRange`]\n isn't automatically propagated down to children.\n\n A typical use of this feature might look like this:\n\n | Entity | `start_margin` | `end_margin` |\n |-------------------------|----------------|--------------|\n | Root | N/A | N/A |\n | ├─ High-poly mesh | [0, 0) | [20, 25) |\n | ├─ Low-poly mesh | [20, 25) | [70, 75) |\n | └─ Billboard *imposter* | [70, 75) | [150, 160) |\n\n With this setup, the user will see a high-poly mesh when the camera is\n closer than 20 units. As the camera zooms out, between 20 units to 25 units,\n the high-poly mesh will gradually fade to a low-poly mesh. When the camera\n is 70 to 75 units away, the low-poly mesh will fade to a single textured\n quad. And between 150 and 160 units, the object fades away entirely. Note\n that the `end_margin` of a higher LOD is always identical to the\n `start_margin` of the next lower LOD; this is important for the crossfade\n effect to function properly.", + "layout": { + "kind": "Struct", + "name": "VisibilityRange", + "fields": [ + { + "name": "start_margin", + "type": { + "val": "core::ops::Range" + } + }, + { + "name": "end_margin", + "type": { + "val": "core::ops::Range" + } + }, + { + "name": "use_aabb", + "type": { + "primitive": "bool" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_camera::visibility::render_layers::RenderLayers": { + "identifier": "RenderLayers", + "crate": "bevy_camera", + "path": "bevy_camera::visibility::render_layers::RenderLayers", + "documentation": " Defines which rendering layers an entity belongs to.\n\n A camera renders an entity only when their render layers intersect.\n\n The [`Default`] instance of `RenderLayers` contains layer `0`, the first layer. Entities\n without this component also belong to layer `0`.\n\n An empty `RenderLayers` makes the entity invisible.", + "layout": { + "kind": "TupleStruct", + "name": "RenderLayers", + "fields": [ + { + "type": { + "vec": { + "primitive": "u64" + } + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_core_pipeline::prepass::DeferredPrepass": { + "identifier": "DeferredPrepass", + "crate": "bevy_core_pipeline", + "path": "bevy_core_pipeline::prepass::DeferredPrepass", + "documentation": " If added to a [`bevy_camera::Camera3d`] then deferred materials will be rendered to the deferred gbuffer texture and will be available to subsequent passes.\n Note the default deferred lighting plugin also requires `DepthPrepass` to work correctly.", + "layout": { + "kind": "Struct", + "name": "DeferredPrepass" + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ecs::observer::distributed_storage::ObservedBy": { + "identifier": "ObservedBy", + "crate": "bevy_ecs", + "path": "bevy_ecs::observer::distributed_storage::ObservedBy", + "documentation": " Tracks a list of entity observers for the [`Entity`] [`ObservedBy`] is added to.", + "layout": { + "kind": "TupleStruct", + "name": "ObservedBy", + "fields": [ + { + "type": { + "vec": { + "val": "bevy_ecs::entity::Entity" + } + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_image::image::Image": { + "identifier": "Image", + "crate": "bevy_image", + "path": "bevy_image::image::Image", + "documentation": " An image, optimized for usage in rendering.\n\n ## Remote Inspection\n\n To transmit an [`Image`] between two running Bevy apps, e.g. through BRP, use [`SerializedImage`](crate::SerializedImage).\n This type is only meant for short-term transmission between same versions and should not be stored anywhere.", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_image::texture_atlas::TextureAtlas": { + "identifier": "TextureAtlas", + "crate": "bevy_image", + "path": "bevy_image::texture_atlas::TextureAtlas", + "documentation": " An index into a [`TextureAtlasLayout`], which corresponds to a specific section of a texture.\n\n It stores a handle to [`TextureAtlasLayout`] and the index of the current section of the atlas.\n The texture atlas contains various *sections* of a given texture, allowing users to have a single\n image file for either sprite animation or global mapping.\n You can change the texture [`index`](Self::index) of the atlas to animate the sprite or display only a *section* of the texture\n for efficient rendering of related game objects.\n\n Check the following examples for usage:\n - [`animated sprite sheet example`](https://github.com/bevyengine/bevy/blob/latest/examples/2d/sprite_sheet.rs)\n - [`sprite animation event example`](https://github.com/bevyengine/bevy/blob/latest/examples/2d/sprite_animation.rs)\n - [`texture atlas example`](https://github.com/bevyengine/bevy/blob/latest/examples/2d/texture_atlas.rs)", + "layout": { + "kind": "Struct", + "name": "TextureAtlas", + "fields": [ + { + "name": "layout", + "type": { + "val": "bevy_asset::handle::Handle" + } + }, + { + "name": "index", + "type": { + "primitive": "usize" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_image::texture_atlas::TextureAtlasLayout": { + "identifier": "TextureAtlasLayout", + "crate": "bevy_image", + "path": "bevy_image::texture_atlas::TextureAtlasLayout", + "documentation": " Stores a map used to lookup the position of a texture in a [`TextureAtlas`].\n This can be used to either use and look up a specific section of a texture, or animate frame-by-frame as a sprite sheet.\n\n Optionally it can store a mapping from sub texture handles to the related area index (see\n [`TextureAtlasBuilder`]).\n\n [Example usage animating sprite.](https://github.com/bevyengine/bevy/blob/latest/examples/2d/sprite_sheet.rs)\n [Example usage animating sprite in response to an event.](https://github.com/bevyengine/bevy/blob/latest/examples/2d/sprite_animation.rs)\n [Example usage loading sprite sheet.](https://github.com/bevyengine/bevy/blob/latest/examples/2d/texture_atlas.rs)\n\n [`TextureAtlasBuilder`]: crate::TextureAtlasBuilder", + "layout": { + "kind": "Struct", + "name": "TextureAtlasLayout", + "fields": [ + { + "name": "size", + "type": { + "val": "glam::UVec2" + } + }, + { + "name": "textures", + "type": { + "vec": { + "val": "bevy_math::rects::urect::URect" + } + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input_focus::InputFocus": { + "identifier": "InputFocus", + "crate": "bevy_input_focus", + "path": "bevy_input_focus::InputFocus", + "documentation": " Resource representing which entity has input focus, if any. Input events (other than pointer-like inputs) will be\n dispatched to the current focus entity, or to the primary window if no entity has focus.\n\n Changing the input focus is as easy as modifying this resource.\n\n # Examples\n\n From within a system:\n\n ```rust\n use bevy_ecs::prelude::*;\n use bevy_input_focus::InputFocus;\n\n fn clear_focus(mut input_focus: ResMut) {\n input_focus.clear();\n }\n ```\n\n With exclusive (or deferred) world access:\n\n ```rust\n use bevy_ecs::prelude::*;\n use bevy_input_focus::InputFocus;\n\n fn set_focus_from_world(world: &mut World) {\n let entity = world.spawn_empty().id();\n\n // Fetch the resource from the world\n let mut input_focus = world.resource_mut::();\n // Then mutate it!\n input_focus.set(entity);\n\n // Or you can just insert a fresh copy of the resource\n // which will overwrite the existing one.\n world.insert_resource(InputFocus::from_entity(entity));\n }\n ```", + "layout": { + "kind": "TupleStruct", + "name": "InputFocus", + "fields": [ + { + "type": { + "option": { + "val": "bevy_ecs::entity::Entity" + } + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": true, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input_focus::InputFocusVisible": { + "identifier": "InputFocusVisible", + "crate": "bevy_input_focus", + "path": "bevy_input_focus::InputFocusVisible", + "documentation": " Resource representing whether the input focus indicator should be visible on UI elements.\n\n Note that this resource is not used by [`bevy_input_focus`](crate) itself, but is provided for\n convenience to UI widgets or frameworks that want to display a focus indicator.\n [`InputFocus`] may still be `Some` even if the focus indicator is not visible.\n\n The value of this resource should be set by your focus navigation solution.\n For a desktop/web style of user interface this would be set to true when the user presses the tab key,\n and set to false when the user clicks on a different element.\n By contrast, a console-style UI intended to be navigated with a gamepad may always have the focus indicator visible.\n\n To easily access information about whether focus indicators should be shown for a given entity, use the [`IsFocused`] trait.\n\n By default, this resource is set to `false`.", + "layout": { + "kind": "TupleStruct", + "name": "InputFocusVisible", + "fields": [ + { + "type": { + "primitive": "bool" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": true, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input_focus::autofocus::AutoFocus": { + "identifier": "AutoFocus", + "crate": "bevy_input_focus", + "path": "bevy_input_focus::autofocus::AutoFocus", + "documentation": " Indicates that this widget should automatically receive [`InputFocus`].\n\n This can be useful for things like dialog boxes, the first text input in a form,\n or the first button in a game menu.\n\n The focus is swapped when this component is added\n or an entity with this component is spawned.", + "layout": { + "kind": "Struct", + "name": "AutoFocus" + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input_focus::directional_navigation::AutoNavigationConfig": { + "identifier": "AutoNavigationConfig", + "crate": "bevy_input_focus", + "path": "bevy_input_focus::directional_navigation::AutoNavigationConfig", + "documentation": " Configuration resource for automatic directional navigation and for generating manual\n navigation edges via [`auto_generate_navigation_edges`]\n\n This resource controls how nodes should be automatically connected in each direction.", + "layout": { + "kind": "Struct", + "name": "AutoNavigationConfig", + "fields": [ + { + "name": "min_alignment_factor", + "type": { + "primitive": "f32" + } + }, + { + "name": "max_search_distance", + "type": { + "option": { + "primitive": "f32" + } + } + }, + { + "name": "prefer_aligned", + "type": { + "primitive": "bool" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": true, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input_focus::directional_navigation::DirectionalNavigationMap": { + "identifier": "DirectionalNavigationMap", + "crate": "bevy_input_focus", + "path": "bevy_input_focus::directional_navigation::DirectionalNavigationMap", + "documentation": " A resource that stores the manually specified traversable graph of focusable entities.\n\n Each entity can have up to 8 neighbors, one for each [`CompassOctant`].\n\n To ensure that your graph is intuitive to navigate and generally works correctly, it should be:\n\n - **Connected**: Every focusable entity should be reachable from every other focusable entity.\n - **Symmetric**: If entity A is a neighbor of entity B, then entity B should be a neighbor of entity A, ideally in the reverse direction.\n - **Physical**: The direction of navigation should match the layout of the entities when possible,\n although looping around the edges of the screen is also acceptable.\n - **Not self-connected**: An entity should not be a neighbor of itself; use [`None`] instead.\n\n This graph must be built and maintained manually, and the developer is responsible for ensuring that it meets the above criteria.\n Notably, if the developer adds or removes the navigability of an entity, the developer should update the map as necessary.", + "layout": { + "kind": "Struct", + "name": "DirectionalNavigationMap", + "fields": [ + { + "name": "neighbors", + "type": { + "val": "bevy_ecs::entity::hash_map::EntityHashMap" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": true, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input_focus::directional_navigation::FocusableArea": { + "identifier": "FocusableArea", + "crate": "bevy_input_focus", + "path": "bevy_input_focus::directional_navigation::FocusableArea", + "documentation": " A focusable area with position and size information.\n\n This struct represents a UI element used during directional navigation,\n containing its entity ID, center position, and size for spatial navigation calculations.\n\n The term \"focusable area\" avoids confusion with UI `Node` components in `bevy_ui`.", + "layout": { + "kind": "Struct", + "name": "FocusableArea", + "fields": [ + { + "name": "entity", + "type": { + "val": "bevy_ecs::entity::Entity" + } + }, + { + "name": "position", + "type": { + "val": "glam::Vec2" + } + }, + { + "name": "size", + "type": { + "val": "glam::Vec2" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input_focus::directional_navigation::NavNeighbors": { + "identifier": "NavNeighbors", + "crate": "bevy_input_focus", + "path": "bevy_input_focus::directional_navigation::NavNeighbors", + "documentation": " The up-to-eight neighbors of a focusable entity, one for each [`CompassOctant`].", + "layout": { + "kind": "Struct", + "name": "NavNeighbors", + "fields": [ + { + "name": "neighbors", + "type": { + "array": [ + { + "option": { + "val": "bevy_ecs::entity::Entity" + } + }, + 8 + ] + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input_focus::tab_navigation::TabGroup": { + "identifier": "TabGroup", + "crate": "bevy_input_focus", + "path": "bevy_input_focus::tab_navigation::TabGroup", + "documentation": " A component used to mark a tree of entities as containing tabbable elements.", + "layout": { + "kind": "Struct", + "name": "TabGroup", + "fields": [ + { + "name": "order", + "type": { + "primitive": "i32" + } + }, + { + "name": "modal", + "type": { + "primitive": "bool" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input_focus::tab_navigation::TabIndex": { + "identifier": "TabIndex", + "crate": "bevy_input_focus", + "path": "bevy_input_focus::tab_navigation::TabIndex", + "documentation": " A component which indicates that an entity wants to participate in tab navigation.\n\n Note that you must also add the [`TabGroup`] component to the entity's ancestor in order\n for this component to have any effect.", + "layout": { + "kind": "TupleStruct", + "name": "TabIndex", + "fields": [ + { + "type": { + "primitive": "i32" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_math::affine3::Affine3": { + "identifier": "Affine3", + "crate": "bevy_math", + "path": "bevy_math::affine3::Affine3", + "documentation": " Reduced-size version of `glam::Affine3A` for use when storage has\n significant performance impact. Convert to `glam::Affine3A` to do\n non-trivial calculations.", + "layout": { + "kind": "Struct", + "name": "Affine3", + "fields": [ + { + "name": "matrix3", + "type": { + "val": "glam::Mat3" + } + }, + { + "name": "translation", + "type": { + "val": "glam::Vec3" + } + } + ] + }, + "generated": true, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::components::Mesh2d": { + "identifier": "Mesh2d", + "crate": "bevy_mesh", + "path": "bevy_mesh::components::Mesh2d", + "documentation": " A component for 2D meshes. Requires a [`MeshMaterial2d`] to be rendered, commonly using a [`ColorMaterial`].\n\n [`MeshMaterial2d`]: \n [`ColorMaterial`]: \n\n # Example\n\n ```ignore\n # use bevy_sprite::{ColorMaterial, MeshMaterial2d};\n # use bevy_ecs::prelude::*;\n # use bevy_mesh::{Mesh, Mesh2d};\n # use bevy_color::palettes::basic::RED;\n # use bevy_asset::Assets;\n # use bevy_math::primitives::Circle;\n #\n // Spawn an entity with a mesh using `ColorMaterial`.\n fn setup(\n mut commands: Commands,\n mut meshes: ResMut>,\n mut materials: ResMut>,\n ) {\n commands.spawn((\n Mesh2d(meshes.add(Circle::new(50.0))),\n MeshMaterial2d(materials.add(ColorMaterial::from_color(RED))),\n ));\n }\n ```", + "layout": { + "kind": "TupleStruct", + "name": "Mesh2d", + "fields": [ + { + "type": { + "val": "bevy_asset::handle::Handle" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::components::Mesh3d": { + "identifier": "Mesh3d", + "crate": "bevy_mesh", + "path": "bevy_mesh::components::Mesh3d", + "documentation": " A component for 3D meshes. Requires a [`MeshMaterial3d`] to be rendered, commonly using a [`StandardMaterial`].\n\n [`MeshMaterial3d`]: \n [`StandardMaterial`]: \n\n # Example\n\n ```ignore\n # use bevy_pbr::{Material, MeshMaterial3d, StandardMaterial};\n # use bevy_ecs::prelude::*;\n # use bevy_mesh::{Mesh, Mesh3d};\n # use bevy_color::palettes::basic::RED;\n # use bevy_asset::Assets;\n # use bevy_math::primitives::Capsule3d;\n #\n // Spawn an entity with a mesh using `StandardMaterial`.\n fn setup(\n mut commands: Commands,\n mut meshes: ResMut>,\n mut materials: ResMut>,\n ) {\n commands.spawn((\n Mesh3d(meshes.add(Capsule3d::default())),\n MeshMaterial3d(materials.add(StandardMaterial {\n base_color: RED.into(),\n ..Default::default()\n })),\n ));\n }\n ```", + "layout": { + "kind": "TupleStruct", + "name": "Mesh3d", + "fields": [ + { + "type": { + "val": "bevy_asset::handle::Handle" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::components::MeshTag": { + "identifier": "MeshTag", + "crate": "bevy_mesh", + "path": "bevy_mesh::components::MeshTag", + "documentation": " A component that stores an arbitrary index used to identify the mesh instance when rendering.", + "layout": { + "kind": "TupleStruct", + "name": "MeshTag", + "fields": [ + { + "type": { + "primitive": "u32" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::index::Indices": { + "identifier": "Indices", + "crate": "bevy_mesh", + "path": "bevy_mesh::index::Indices", + "documentation": " An array of indices into the [`VertexAttributeValues`](super::VertexAttributeValues) for a mesh.\n\n It describes the order in which the vertex attributes should be joined into faces.", + "layout": [ + { + "kind": "TupleStruct", + "name": "U16", + "fields": [ + { + "type": { + "vec": { + "primitive": "u16" + } + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "U32", + "fields": [ + { + "type": { + "vec": { + "primitive": "u32" + } + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::mesh::Mesh": { + "identifier": "Mesh", + "crate": "bevy_mesh", + "path": "bevy_mesh::mesh::Mesh", + "documentation": " A 3D object made out of vertices representing triangles, lines, or points,\n with \"attribute\" values for each vertex.\n\n Meshes can be automatically generated by a bevy `AssetLoader` (generally by loading a `Gltf` file),\n or by converting a [primitive](bevy_math::primitives) using [`into`](Into).\n It is also possible to create one manually. They can be edited after creation.\n\n Meshes can be rendered with a [`Mesh2d`](crate::Mesh2d) and `MeshMaterial2d`\n or [`Mesh3d`](crate::Mesh3d) and `MeshMaterial3d` for 2D and 3D respectively.\n\n A [`Mesh`] in Bevy is equivalent to a \"primitive\" in the glTF format, for a\n glTF Mesh representation, see `GltfMesh`.\n\n ## Manual creation\n\n The following function will construct a flat mesh, to be rendered with a\n `StandardMaterial` or `ColorMaterial`:\n\n ```\n # use bevy_mesh::{Mesh, Indices, PrimitiveTopology};\n # use bevy_asset::RenderAssetUsages;\n fn create_simple_parallelogram() -> Mesh {\n // Create a new mesh using a triangle list topology, where each set of 3 vertices composes a triangle.\n Mesh::new(PrimitiveTopology::TriangleList, RenderAssetUsages::default())\n // Add 4 vertices, each with its own position attribute (coordinate in\n // 3D space), for each of the corners of the parallelogram.\n .with_inserted_attribute(\n Mesh::ATTRIBUTE_POSITION,\n vec![[0.0, 0.0, 0.0], [1.0, 2.0, 0.0], [2.0, 2.0, 0.0], [1.0, 0.0, 0.0]]\n )\n // Assign a UV coordinate to each vertex.\n .with_inserted_attribute(\n Mesh::ATTRIBUTE_UV_0,\n vec![[0.0, 1.0], [0.5, 0.0], [1.0, 0.0], [0.5, 1.0]]\n )\n // Assign normals (everything points outwards)\n .with_inserted_attribute(\n Mesh::ATTRIBUTE_NORMAL,\n vec![[0.0, 0.0, 1.0], [0.0, 0.0, 1.0], [0.0, 0.0, 1.0], [0.0, 0.0, 1.0]]\n )\n // After defining all the vertices and their attributes, build each triangle using the\n // indices of the vertices that make it up in a counter-clockwise order.\n .with_inserted_indices(Indices::U32(vec![\n // First triangle\n 0, 3, 1,\n // Second triangle\n 1, 3, 2\n ]))\n }\n ```\n\n You can see how it looks like [here](https://github.com/bevyengine/bevy/blob/main/assets/docs/Mesh.png),\n used in a [`Mesh3d`](crate::Mesh3d) with a square bevy logo texture, with added axis, points,\n lines and text for clarity.\n\n ## Other examples\n\n For further visualization, explanation, and examples, see the built-in Bevy examples,\n and the [implementation of the built-in shapes](https://github.com/bevyengine/bevy/tree/main/crates/bevy_mesh/src/primitives).\n In particular, [generate_custom_mesh](https://github.com/bevyengine/bevy/blob/main/examples/3d/generate_custom_mesh.rs)\n teaches you to access and modify the attributes of a [`Mesh`] after creating it.\n\n ## Common points of confusion\n\n - UV maps in Bevy start at the top-left, see [`ATTRIBUTE_UV_0`](Mesh::ATTRIBUTE_UV_0),\n other APIs can have other conventions, `OpenGL` starts at bottom-left.\n - It is possible and sometimes useful for multiple vertices to have the same\n [position attribute](Mesh::ATTRIBUTE_POSITION) value,\n it's a common technique in 3D modeling for complex UV mapping or other calculations.\n - Bevy performs frustum culling based on the `Aabb` of meshes, which is calculated\n and added automatically for new meshes only. If a mesh is modified, the entity's `Aabb`\n needs to be updated manually or deleted so that it is re-calculated.\n\n ## Use with `StandardMaterial`\n\n To render correctly with `StandardMaterial`, a mesh needs to have properly defined:\n - [`UVs`](Mesh::ATTRIBUTE_UV_0): Bevy needs to know how to map a texture onto the mesh\n (also true for `ColorMaterial`).\n - [`Normals`](Mesh::ATTRIBUTE_NORMAL): Bevy needs to know how light interacts with your mesh.\n [0.0, 0.0, 1.0] is very common for simple flat meshes on the XY plane,\n because simple meshes are smooth and they don't require complex light calculations.\n - Vertex winding order: by default, `StandardMaterial.cull_mode` is `Some(Face::Back)`,\n which means that Bevy would *only* render the \"front\" of each triangle, which\n is the side of the triangle from where the vertices appear in a *counter-clockwise* order.\n\n ## Remote Inspection\n\n To transmit a [`Mesh`] between two running Bevy apps, e.g. through BRP, use [`SerializedMesh`].\n This type is only meant for short-term transmission between same versions and should not be stored anywhere.", + "layout": { + "kind": "Struct", + "name": "Mesh", + "fields": [ + { + "name": "indices", + "type": { + "val": "bevy_mesh::mesh::MeshExtractableData" + } + }, + { + "name": "morph_targets", + "type": { + "val": "bevy_mesh::mesh::MeshExtractableData>" + } + }, + { + "name": "morph_target_names", + "type": { + "val": "bevy_mesh::mesh::MeshExtractableData>" + } + }, + { + "name": "asset_usage", + "type": { + "val": "bevy_asset::render_asset::RenderAssetUsages" + } + }, + { + "name": "enable_raytracing", + "type": { + "primitive": "bool" + } + }, + { + "name": "final_aabb", + "type": { + "option": { + "val": "bevy_math::bounding::bounded3d::Aabb3d" + } + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::morph::MeshMorphWeights": { + "identifier": "MeshMorphWeights", + "crate": "bevy_mesh", + "path": "bevy_mesh::morph::MeshMorphWeights", + "documentation": " Control a specific [`Mesh`] instance's [morph targets]. These control the weights of\n specific \"mesh primitives\" in scene formats like GLTF. They can be set manually, but\n in most cases they should \"automatically\" synced by setting the [`MorphWeights`] component\n on a parent entity.\n\n See [`MorphWeights`] for more details on Bevy's morph target implementation.\n\n Add this to an [`Entity`] with a [`Mesh3d`](crate::Mesh3d) with a [`MorphAttributes`] set\n to control individual weights of each morph target.\n\n [morph targets]: https://en.wikipedia.org/wiki/Morph_target_animation", + "layout": { + "kind": "Struct", + "name": "MeshMorphWeights", + "fields": [ + { + "name": "weights", + "type": { + "vec": { + "primitive": "f32" + } + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::morph::MorphWeights": { + "identifier": "MorphWeights", + "crate": "bevy_mesh", + "path": "bevy_mesh::morph::MorphWeights", + "documentation": " Controls the [morph targets] for all child [`Mesh3d`](crate::Mesh3d) entities. In most cases, [`MorphWeights`] should be considered\n the \"source of truth\" when writing morph targets for meshes. However you can choose to write child [`MeshMorphWeights`]\n if your situation requires more granularity. Just note that if you set [`MorphWeights`], it will overwrite child\n [`MeshMorphWeights`] values.\n\n This exists because Bevy's [`Mesh`] corresponds to a _single_ surface / material, whereas morph targets\n as defined in the GLTF spec exist on \"multi-primitive meshes\" (where each primitive is its own surface with its own material).\n Therefore in Bevy [`MorphWeights`] an a parent entity are the \"canonical weights\" from a GLTF perspective, which then\n synchronized to child [`Mesh3d`](crate::Mesh3d) / [`MeshMorphWeights`] (which correspond to \"primitives\" / \"surfaces\" from a GLTF perspective).\n\n Add this to the parent of one or more [`Entities`](`Entity`) with a [`Mesh3d`](crate::Mesh3d) with a [`MeshMorphWeights`].\n\n [morph targets]: https://en.wikipedia.org/wiki/Morph_target_animation", + "layout": { + "kind": "Struct", + "name": "MorphWeights", + "fields": [ + { + "name": "weights", + "type": { + "vec": { + "primitive": "f32" + } + } + }, + { + "name": "first_mesh", + "type": { + "option": { + "val": "bevy_asset::handle::Handle" + } + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::primitives::dim2::AnnulusMeshBuilder": { + "identifier": "AnnulusMeshBuilder", + "crate": "bevy_mesh", + "path": "bevy_mesh::primitives::dim2::AnnulusMeshBuilder", + "documentation": " A builder for creating a [`Mesh`] with an [`Annulus`] shape.", + "layout": { + "kind": "Struct", + "name": "AnnulusMeshBuilder", + "fields": [ + { + "name": "annulus", + "type": { + "val": "bevy_math::primitives::dim2::Annulus" + } + }, + { + "name": "resolution", + "type": { + "primitive": "u32" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::primitives::dim2::Capsule2dMeshBuilder": { + "identifier": "Capsule2dMeshBuilder", + "crate": "bevy_mesh", + "path": "bevy_mesh::primitives::dim2::Capsule2dMeshBuilder", + "documentation": " A builder used for creating a [`Mesh`] with a [`Capsule2d`] shape.", + "layout": { + "kind": "Struct", + "name": "Capsule2dMeshBuilder", + "fields": [ + { + "name": "capsule", + "type": { + "val": "bevy_math::primitives::dim2::Capsule2d" + } + }, + { + "name": "resolution", + "type": { + "primitive": "u32" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::primitives::dim2::CircleMeshBuilder": { + "identifier": "CircleMeshBuilder", + "crate": "bevy_mesh", + "path": "bevy_mesh::primitives::dim2::CircleMeshBuilder", + "documentation": " A builder used for creating a [`Mesh`] with a [`Circle`] shape.", + "layout": { + "kind": "Struct", + "name": "CircleMeshBuilder", + "fields": [ + { + "name": "circle", + "type": { + "val": "bevy_math::primitives::dim2::Circle" + } + }, + { + "name": "resolution", + "type": { + "primitive": "u32" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::primitives::dim2::CircularMeshUvMode": { + "identifier": "CircularMeshUvMode", + "crate": "bevy_mesh", + "path": "bevy_mesh::primitives::dim2::CircularMeshUvMode", + "documentation": " Specifies how to generate UV-mappings for the [`CircularSector`] and [`CircularSegment`] shapes.\n\n Currently the only variant is `Mask`, which is good for showing a portion of a texture that includes\n the entire circle, particularly the same texture will be displayed with different fractions of a\n complete circle.\n\n It's expected that more will be added in the future, such as a variant that causes the texture to be\n scaled to fit the bounding box of the shape, which would be good for packed textures only including the\n portion of the circle that is needed to display.", + "layout": [ + { + "kind": "Struct", + "name": "Mask", + "fields": [ + { + "name": "angle", + "type": { + "primitive": "f32" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::primitives::dim2::CircularSectorMeshBuilder": { + "identifier": "CircularSectorMeshBuilder", + "crate": "bevy_mesh", + "path": "bevy_mesh::primitives::dim2::CircularSectorMeshBuilder", + "documentation": " A builder used for creating a [`Mesh`] with a [`CircularSector`] shape.\n\n The resulting mesh will have a UV-map such that the center of the circle is\n at the center of the texture.", + "layout": { + "kind": "Struct", + "name": "CircularSectorMeshBuilder", + "fields": [ + { + "name": "sector", + "type": { + "val": "bevy_math::primitives::dim2::CircularSector" + } + }, + { + "name": "resolution", + "type": { + "primitive": "u32" + } + }, + { + "name": "uv_mode", + "type": { + "val": "bevy_mesh::primitives::dim2::CircularMeshUvMode" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::primitives::dim2::CircularSegmentMeshBuilder": { + "identifier": "CircularSegmentMeshBuilder", + "crate": "bevy_mesh", + "path": "bevy_mesh::primitives::dim2::CircularSegmentMeshBuilder", + "documentation": " A builder used for creating a [`Mesh`] with a [`CircularSegment`] shape.\n\n The resulting mesh will have a UV-map such that the center of the circle is\n at the center of the texture.", + "layout": { + "kind": "Struct", + "name": "CircularSegmentMeshBuilder", + "fields": [ + { + "name": "segment", + "type": { + "val": "bevy_math::primitives::dim2::CircularSegment" + } + }, + { + "name": "resolution", + "type": { + "primitive": "u32" + } + }, + { + "name": "uv_mode", + "type": { + "val": "bevy_mesh::primitives::dim2::CircularMeshUvMode" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::primitives::dim2::ConvexPolygonMeshBuilder": { + "identifier": "ConvexPolygonMeshBuilder", + "crate": "bevy_mesh", + "path": "bevy_mesh::primitives::dim2::ConvexPolygonMeshBuilder", + "documentation": " A builder used for creating a [`Mesh`] with a [`ConvexPolygon`] shape.\n\n You must verify that the `vertices` are not concave when constructing this type. You can\n guarantee this by creating a [`ConvexPolygon`] first, then calling [`ConvexPolygon::mesh()`].", + "layout": { + "kind": "Struct", + "name": "ConvexPolygonMeshBuilder", + "fields": [ + { + "name": "vertices", + "type": { + "vec": { + "val": "glam::Vec2" + } + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::primitives::dim2::EllipseMeshBuilder": { + "identifier": "EllipseMeshBuilder", + "crate": "bevy_mesh", + "path": "bevy_mesh::primitives::dim2::EllipseMeshBuilder", + "documentation": " A builder used for creating a [`Mesh`] with an [`Ellipse`] shape.", + "layout": { + "kind": "Struct", + "name": "EllipseMeshBuilder", + "fields": [ + { + "name": "ellipse", + "type": { + "val": "bevy_math::primitives::dim2::Ellipse" + } + }, + { + "name": "resolution", + "type": { + "primitive": "u32" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::primitives::dim2::Polyline2dMeshBuilder": { + "identifier": "Polyline2dMeshBuilder", + "crate": "bevy_mesh", + "path": "bevy_mesh::primitives::dim2::Polyline2dMeshBuilder", + "documentation": " A builder used for creating a [`Mesh`] with a [`Polyline2d`] shape.", + "layout": { + "kind": "Struct", + "name": "Polyline2dMeshBuilder", + "fields": [ + { + "name": "polyline", + "type": { + "val": "bevy_math::primitives::dim2::Polyline2d" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::primitives::dim2::RectangleMeshBuilder": { + "identifier": "RectangleMeshBuilder", + "crate": "bevy_mesh", + "path": "bevy_mesh::primitives::dim2::RectangleMeshBuilder", + "documentation": " A builder used for creating a [`Mesh`] with a [`Rectangle`] shape.", + "layout": { + "kind": "Struct", + "name": "RectangleMeshBuilder", + "fields": [ + { + "name": "half_size", + "type": { + "val": "glam::Vec2" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::primitives::dim2::RegularPolygonMeshBuilder": { + "identifier": "RegularPolygonMeshBuilder", + "crate": "bevy_mesh", + "path": "bevy_mesh::primitives::dim2::RegularPolygonMeshBuilder", + "documentation": " A builder used for creating a [`Mesh`] with a [`RegularPolygon`] shape.", + "layout": { + "kind": "Struct", + "name": "RegularPolygonMeshBuilder", + "fields": [ + { + "name": "circumradius", + "type": { + "primitive": "f32" + } + }, + { + "name": "sides", + "type": { + "primitive": "u32" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::primitives::dim2::RhombusMeshBuilder": { + "identifier": "RhombusMeshBuilder", + "crate": "bevy_mesh", + "path": "bevy_mesh::primitives::dim2::RhombusMeshBuilder", + "documentation": " A builder for creating a [`Mesh`] with an [`Rhombus`] shape.", + "layout": { + "kind": "Struct", + "name": "RhombusMeshBuilder", + "fields": [ + { + "name": "half_diagonals", + "type": { + "val": "glam::Vec2" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::primitives::dim2::Triangle2dMeshBuilder": { + "identifier": "Triangle2dMeshBuilder", + "crate": "bevy_mesh", + "path": "bevy_mesh::primitives::dim2::Triangle2dMeshBuilder", + "documentation": " A builder used for creating a [`Mesh`] with a [`Triangle2d`] shape.", + "layout": { + "kind": "Struct", + "name": "Triangle2dMeshBuilder", + "fields": [ + { + "name": "triangle", + "type": { + "val": "bevy_math::primitives::dim2::Triangle2d" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::primitives::dim3::capsule::Capsule3dMeshBuilder": { + "identifier": "Capsule3dMeshBuilder", + "crate": "bevy_mesh", + "path": "bevy_mesh::primitives::dim3::capsule::Capsule3dMeshBuilder", + "documentation": " A builder used for creating a [`Mesh`] with a [`Capsule3d`] shape.", + "layout": { + "kind": "Struct", + "name": "Capsule3dMeshBuilder", + "fields": [ + { + "name": "capsule", + "type": { + "val": "bevy_math::primitives::dim3::Capsule3d" + } + }, + { + "name": "rings", + "type": { + "primitive": "u32" + } + }, + { + "name": "longitudes", + "type": { + "primitive": "u32" + } + }, + { + "name": "latitudes", + "type": { + "primitive": "u32" + } + }, + { + "name": "uv_profile", + "type": { + "val": "bevy_mesh::primitives::dim3::capsule::CapsuleUvProfile" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::primitives::dim3::capsule::CapsuleUvProfile": { + "identifier": "CapsuleUvProfile", + "crate": "bevy_mesh", + "path": "bevy_mesh::primitives::dim3::capsule::CapsuleUvProfile", + "documentation": " Manner in which UV coordinates are distributed vertically.", + "layout": [ + { + "kind": "Unit", + "name": "Aspect" + }, + { + "kind": "Unit", + "name": "Uniform" + }, + { + "kind": "Unit", + "name": "Fixed" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::primitives::dim3::cone::ConeAnchor": { + "identifier": "ConeAnchor", + "crate": "bevy_mesh", + "path": "bevy_mesh::primitives::dim3::cone::ConeAnchor", + "documentation": " Anchoring options for [`ConeMeshBuilder`]", + "layout": [ + { + "kind": "Unit", + "name": "MidPoint" + }, + { + "kind": "Unit", + "name": "Tip" + }, + { + "kind": "Unit", + "name": "Base" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::primitives::dim3::cone::ConeMeshBuilder": { + "identifier": "ConeMeshBuilder", + "crate": "bevy_mesh", + "path": "bevy_mesh::primitives::dim3::cone::ConeMeshBuilder", + "documentation": " A builder used for creating a [`Mesh`] with a [`Cone`] shape.", + "layout": { + "kind": "Struct", + "name": "ConeMeshBuilder", + "fields": [ + { + "name": "cone", + "type": { + "val": "bevy_math::primitives::dim3::Cone" + } + }, + { + "name": "resolution", + "type": { + "primitive": "u32" + } + }, + { + "name": "anchor", + "type": { + "val": "bevy_mesh::primitives::dim3::cone::ConeAnchor" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::primitives::dim3::conical_frustum::ConicalFrustumMeshBuilder": { + "identifier": "ConicalFrustumMeshBuilder", + "crate": "bevy_mesh", + "path": "bevy_mesh::primitives::dim3::conical_frustum::ConicalFrustumMeshBuilder", + "documentation": " A builder used for creating a [`Mesh`] with a [`ConicalFrustum`] shape.", + "layout": { + "kind": "Struct", + "name": "ConicalFrustumMeshBuilder", + "fields": [ + { + "name": "frustum", + "type": { + "val": "bevy_math::primitives::dim3::ConicalFrustum" + } + }, + { + "name": "resolution", + "type": { + "primitive": "u32" + } + }, + { + "name": "segments", + "type": { + "primitive": "u32" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::primitives::dim3::cuboid::CuboidMeshBuilder": { + "identifier": "CuboidMeshBuilder", + "crate": "bevy_mesh", + "path": "bevy_mesh::primitives::dim3::cuboid::CuboidMeshBuilder", + "documentation": " A builder used for creating a [`Mesh`] with a [`Cuboid`] shape.", + "layout": { + "kind": "Struct", + "name": "CuboidMeshBuilder", + "fields": [ + { + "name": "half_size", + "type": { + "val": "glam::Vec3" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::primitives::dim3::cylinder::CylinderAnchor": { + "identifier": "CylinderAnchor", + "crate": "bevy_mesh", + "path": "bevy_mesh::primitives::dim3::cylinder::CylinderAnchor", + "documentation": " Anchoring options for [`CylinderMeshBuilder`]", + "layout": [ + { + "kind": "Unit", + "name": "MidPoint" + }, + { + "kind": "Unit", + "name": "Top" + }, + { + "kind": "Unit", + "name": "Bottom" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::primitives::dim3::cylinder::CylinderMeshBuilder": { + "identifier": "CylinderMeshBuilder", + "crate": "bevy_mesh", + "path": "bevy_mesh::primitives::dim3::cylinder::CylinderMeshBuilder", + "documentation": " A builder used for creating a [`Mesh`] with a [`Cylinder`] shape.", + "layout": { + "kind": "Struct", + "name": "CylinderMeshBuilder", + "fields": [ + { + "name": "cylinder", + "type": { + "val": "bevy_math::primitives::dim3::Cylinder" + } + }, + { + "name": "resolution", + "type": { + "primitive": "u32" + } + }, + { + "name": "segments", + "type": { + "primitive": "u32" + } + }, + { + "name": "caps", + "type": { + "primitive": "bool" + } + }, + { + "name": "anchor", + "type": { + "val": "bevy_mesh::primitives::dim3::cylinder::CylinderAnchor" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::primitives::dim3::plane::PlaneMeshBuilder": { + "identifier": "PlaneMeshBuilder", + "crate": "bevy_mesh", + "path": "bevy_mesh::primitives::dim3::plane::PlaneMeshBuilder", + "documentation": " A builder used for creating a [`Mesh`] with a [`Plane3d`] shape.", + "layout": { + "kind": "Struct", + "name": "PlaneMeshBuilder", + "fields": [ + { + "name": "plane", + "type": { + "val": "bevy_math::primitives::dim3::Plane3d" + } + }, + { + "name": "subdivisions", + "type": { + "primitive": "u32" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::primitives::dim3::polyline3d::Polyline3dMeshBuilder": { + "identifier": "Polyline3dMeshBuilder", + "crate": "bevy_mesh", + "path": "bevy_mesh::primitives::dim3::polyline3d::Polyline3dMeshBuilder", + "documentation": " A builder used for creating a [`Mesh`] with a [`Polyline3d`] shape.", + "layout": { + "kind": "Struct", + "name": "Polyline3dMeshBuilder", + "fields": [ + { + "name": "polyline", + "type": { + "val": "bevy_math::primitives::dim3::Polyline3d" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::primitives::dim3::segment3d::Segment3dMeshBuilder": { + "identifier": "Segment3dMeshBuilder", + "crate": "bevy_mesh", + "path": "bevy_mesh::primitives::dim3::segment3d::Segment3dMeshBuilder", + "documentation": " A builder used for creating a [`Mesh`] with a [`Segment3d`] shape.", + "layout": { + "kind": "Struct", + "name": "Segment3dMeshBuilder", + "fields": [ + { + "name": "segment", + "type": { + "val": "bevy_math::primitives::dim3::Segment3d" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::primitives::dim3::sphere::SphereKind": { + "identifier": "SphereKind", + "crate": "bevy_mesh", + "path": "bevy_mesh::primitives::dim3::sphere::SphereKind", + "documentation": " A type of sphere mesh.", + "layout": [ + { + "kind": "Struct", + "name": "Ico", + "fields": [ + { + "name": "subdivisions", + "type": { + "primitive": "u32" + } + } + ] + }, + { + "kind": "Struct", + "name": "Uv", + "fields": [ + { + "name": "sectors", + "type": { + "primitive": "u32" + } + }, + { + "name": "stacks", + "type": { + "primitive": "u32" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::primitives::dim3::sphere::SphereMeshBuilder": { + "identifier": "SphereMeshBuilder", + "crate": "bevy_mesh", + "path": "bevy_mesh::primitives::dim3::sphere::SphereMeshBuilder", + "documentation": " A builder used for creating a [`Mesh`] with an [`Sphere`] shape.", + "layout": { + "kind": "Struct", + "name": "SphereMeshBuilder", + "fields": [ + { + "name": "sphere", + "type": { + "val": "bevy_math::primitives::dim3::Sphere" + } + }, + { + "name": "kind", + "type": { + "val": "bevy_mesh::primitives::dim3::sphere::SphereKind" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::primitives::dim3::tetrahedron::TetrahedronMeshBuilder": { + "identifier": "TetrahedronMeshBuilder", + "crate": "bevy_mesh", + "path": "bevy_mesh::primitives::dim3::tetrahedron::TetrahedronMeshBuilder", + "documentation": " A builder used for creating a [`Mesh`] with a [`Tetrahedron`] shape.", + "layout": { + "kind": "Struct", + "name": "TetrahedronMeshBuilder", + "fields": [ + { + "name": "tetrahedron", + "type": { + "val": "bevy_math::primitives::dim3::Tetrahedron" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::primitives::dim3::torus::TorusMeshBuilder": { + "identifier": "TorusMeshBuilder", + "crate": "bevy_mesh", + "path": "bevy_mesh::primitives::dim3::torus::TorusMeshBuilder", + "documentation": " A builder used for creating a [`Mesh`] with a [`Torus`] shape.", + "layout": { + "kind": "Struct", + "name": "TorusMeshBuilder", + "fields": [ + { + "name": "torus", + "type": { + "val": "bevy_math::primitives::dim3::Torus" + } + }, + { + "name": "minor_resolution", + "type": { + "primitive": "usize" + } + }, + { + "name": "major_resolution", + "type": { + "primitive": "usize" + } + }, + { + "name": "angle_range", + "type": { + "val": "core::ops::RangeInclusive" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::primitives::dim3::triangle3d::Triangle3dMeshBuilder": { + "identifier": "Triangle3dMeshBuilder", + "crate": "bevy_mesh", + "path": "bevy_mesh::primitives::dim3::triangle3d::Triangle3dMeshBuilder", + "documentation": " A builder used for creating a [`Mesh`] with a [`Triangle3d`] shape.", + "layout": { + "kind": "Struct", + "name": "Triangle3dMeshBuilder", + "fields": [ + { + "name": "triangle", + "type": { + "val": "bevy_math::primitives::dim3::Triangle3d" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::skinning::SkinnedMesh": { + "identifier": "SkinnedMesh", + "crate": "bevy_mesh", + "path": "bevy_mesh::skinning::SkinnedMesh", + "layout": { + "kind": "Struct", + "name": "SkinnedMesh", + "fields": [ + { + "name": "inverse_bindposes", + "type": { + "val": "bevy_asset::handle::Handle" + } + }, + { + "name": "joints", + "type": { + "vec": { + "val": "bevy_ecs::entity::Entity" + } + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mod_scripting_asset::script_asset::ScriptAsset": { + "identifier": "ScriptAsset", + "crate": "bevy_mod_scripting_asset", + "path": "bevy_mod_scripting_asset::script_asset::ScriptAsset", + "documentation": " Represents a script loaded into memory as an asset", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mod_scripting_bindings::docgen::info::FunctionArgInfo": { + "identifier": "FunctionArgInfo", + "crate": "bevy_mod_scripting_bindings", + "path": "bevy_mod_scripting_bindings::docgen::info::FunctionArgInfo", + "documentation": " Information about a function argument.", + "layout": { + "kind": "Struct", + "name": "FunctionArgInfo", + "fields": [ + { + "name": "name", + "type": { + "option": { + "val": "alloc::borrow::Cow" + } + } + }, + { + "name": "arg_index", + "type": { + "primitive": "usize" + } + }, + { + "name": "type_id", + "type": { + "val": "core::any::TypeId" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mod_scripting_bindings::docgen::info::FunctionInfo": { + "identifier": "FunctionInfo", + "crate": "bevy_mod_scripting_bindings", + "path": "bevy_mod_scripting_bindings::docgen::info::FunctionInfo", + "documentation": " Information about a function.", + "layout": { + "kind": "Struct", + "name": "FunctionInfo", + "fields": [ + { + "name": "name", + "type": { + "val": "alloc::borrow::Cow" + } + }, + { + "name": "namespace", + "type": { + "val": "bevy_mod_scripting_bindings::function::namespace::Namespace" + } + }, + { + "name": "arg_info", + "type": { + "vec": { + "val": "bevy_mod_scripting_bindings::docgen::info::FunctionArgInfo" + } + } + }, + { + "name": "return_info", + "type": { + "val": "bevy_mod_scripting_bindings::docgen::info::FunctionReturnInfo" + } + }, + { + "name": "docs", + "type": { + "option": { + "val": "alloc::borrow::Cow" + } + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mod_scripting_bindings::docgen::info::FunctionReturnInfo": { + "identifier": "FunctionReturnInfo", + "crate": "bevy_mod_scripting_bindings", + "path": "bevy_mod_scripting_bindings::docgen::info::FunctionReturnInfo", + "documentation": " Information about a function return value.", + "layout": { + "kind": "Struct", + "name": "FunctionReturnInfo", + "fields": [ + { + "name": "type_id", + "type": { + "val": "core::any::TypeId" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mod_scripting_bindings::error::InteropError": { + "identifier": "InteropError", + "crate": "bevy_mod_scripting_bindings", + "path": "bevy_mod_scripting_bindings::error::InteropError", + "documentation": " An error occurring when converting between rust and a script context.", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mod_scripting_bindings::function::namespace::Namespace": { + "identifier": "Namespace", + "crate": "bevy_mod_scripting_bindings", + "path": "bevy_mod_scripting_bindings::function::namespace::Namespace", + "documentation": " A namespace for functions", + "layout": [ + { + "kind": "Unit", + "name": "Global" + }, + { + "kind": "TupleStruct", + "name": "OnType", + "fields": [ + { + "type": { + "val": "core::any::TypeId" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mod_scripting_bindings::function::script_function::LocationContext": { + "identifier": "LocationContext", + "crate": "bevy_mod_scripting_bindings", + "path": "bevy_mod_scripting_bindings::function::script_function::LocationContext", + "documentation": " Describes a location within a script", + "layout": { + "kind": "Struct", + "name": "LocationContext", + "fields": [ + { + "name": "script_name", + "type": { + "option": { + "primitive": "string" + } + } + }, + { + "name": "line", + "type": { + "primitive": "u32" + } + }, + { + "name": "col", + "type": { + "option": { + "primitive": "u32" + } + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mod_scripting_bindings::script_component::DynamicComponent": { + "identifier": "DynamicComponent", + "crate": "bevy_mod_scripting_bindings", + "path": "bevy_mod_scripting_bindings::script_component::DynamicComponent", + "documentation": " A dynamic script component", + "layout": { + "kind": "Struct", + "name": "DynamicComponent", + "fields": [ + { + "name": "data", + "type": { + "val": "ScriptValue" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mod_scripting_bindings::script_value::VariadicTuple": { + "identifier": "VariadicTuple", + "crate": "bevy_mod_scripting_bindings", + "path": "bevy_mod_scripting_bindings::script_value::VariadicTuple", + "documentation": " A tuple variant of script value", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mod_scripting_core::error::ScriptError": { + "identifier": "ScriptError", + "crate": "bevy_mod_scripting_core", + "path": "bevy_mod_scripting_core::error::ScriptError", + "documentation": " An error with an optional script Context", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mod_scripting_core::event::CallbackLabel": { + "identifier": "CallbackLabel", + "crate": "bevy_mod_scripting_core", + "path": "bevy_mod_scripting_core::event::CallbackLabel", + "documentation": " A string which disallows common invalid characters in callback labels,\n particularly at the start of the string\n\n a valid callback label starts with a letter or underscore, and contains only ascii characters, as well as disallows some common keywords", + "layout": { + "kind": "TupleStruct", + "name": "CallbackLabel", + "fields": [ + { + "type": { + "primitive": "string" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mod_scripting_core::script::ScriptComponent": { + "identifier": "ScriptComponent", + "crate": "bevy_mod_scripting_core", + "path": "bevy_mod_scripting_core::script::ScriptComponent", + "documentation": " A component which identifies the scripts existing on an entity.\n\n Event handlers search for components with this component to figure out which scripts to run and on which entities.", + "layout": { + "kind": "TupleStruct", + "name": "ScriptComponent", + "fields": [ + { + "type": { + "vec": { + "val": "bevy_asset::handle::Handle" + } + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mod_scripting_core::script::context_key::ContextKey": { + "identifier": "ContextKey", + "crate": "bevy_mod_scripting_core", + "path": "bevy_mod_scripting_core::script::context_key::ContextKey", + "documentation": " The key for a context. The context key is used for:\n - Identifying the script itself, uniquely.\n - later on it's mapped to a context, which will determine how the scripts are grouped in execution environments.", + "layout": { + "kind": "Struct", + "name": "ContextKey", + "fields": [ + { + "name": "entity", + "type": { + "option": { + "val": "bevy_ecs::entity::Entity" + } + } + }, + { + "name": "script", + "type": { + "option": { + "val": "bevy_asset::id::AssetId" + } + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_render::alpha::AlphaMode": { + "identifier": "AlphaMode", + "crate": "bevy_render", + "path": "bevy_render::alpha::AlphaMode", + "documentation": " Sets how a material's base color alpha channel is used for transparency.", + "layout": [ + { + "kind": "Unit", + "name": "Opaque" + }, + { + "kind": "TupleStruct", + "name": "Mask", + "fields": [ + { + "type": { + "primitive": "f32" + } + } + ] + }, + { + "kind": "Unit", + "name": "Blend" + }, + { + "kind": "Unit", + "name": "Premultiplied" + }, + { + "kind": "Unit", + "name": "AlphaToCoverage" + }, + { + "kind": "Unit", + "name": "Add" + }, + { + "kind": "Unit", + "name": "Multiply" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_render::camera::CameraRenderGraph": { + "identifier": "CameraRenderGraph", + "crate": "bevy_render", + "path": "bevy_render::camera::CameraRenderGraph", + "documentation": " Configures the [`RenderGraph`] name assigned to be run for a given [`Camera`] entity.", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_render::camera::MipBias": { + "identifier": "MipBias", + "crate": "bevy_render", + "path": "bevy_render::camera::MipBias", + "documentation": " Camera component specifying a mip bias to apply when sampling from material textures.\n\n Often used in conjunction with antialiasing post-process effects to reduce textures blurriness.", + "layout": { + "kind": "TupleStruct", + "name": "MipBias", + "fields": [ + { + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_render::camera::TemporalJitter": { + "identifier": "TemporalJitter", + "crate": "bevy_render", + "path": "bevy_render::camera::TemporalJitter", + "documentation": " A subpixel offset to jitter a perspective camera's frustum by.\n\n Useful for temporal rendering techniques.", + "layout": { + "kind": "Struct", + "name": "TemporalJitter", + "fields": [ + { + "name": "offset", + "type": { + "val": "glam::Vec2" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_render::experimental::occlusion_culling::OcclusionCulling": { + "identifier": "OcclusionCulling", + "crate": "bevy_render", + "path": "bevy_render::experimental::occlusion_culling::OcclusionCulling", + "documentation": " Add this component to a view in order to enable experimental GPU occlusion\n culling.\n\n *Bevy's occlusion culling is currently marked as experimental.* There are\n known issues whereby, in rare circumstances, occlusion culling can result in\n meshes being culled that shouldn't be (i.e. meshes that turn invisible).\n Please try it out and report issues.\n\n *Occlusion culling* allows Bevy to avoid rendering objects that are fully\n behind other opaque or alpha tested objects. This is different from, and\n complements, depth fragment rejection as the `DepthPrepass` enables. While\n depth rejection allows Bevy to avoid rendering *pixels* that are behind\n other objects, the GPU still has to examine those pixels to reject them,\n which requires transforming the vertices of the objects and performing\n skinning if the objects were skinned. Occlusion culling allows the GPU to go\n a step further, avoiding even transforming the vertices of objects that it\n can quickly prove to be behind other objects.\n\n Occlusion culling inherently has some overhead, because Bevy must examine\n the objects' bounding boxes, and create an acceleration structure\n (hierarchical Z-buffer) to perform the occlusion tests. Therefore, occlusion\n culling is disabled by default. Only enable it if you measure it to be a\n speedup on your scene. Note that, because Bevy's occlusion culling runs on\n the GPU and is quite efficient, it's rare for occlusion culling to result in\n a significant slowdown.\n\n Occlusion culling currently requires a `DepthPrepass`. If no depth prepass\n is present on the view, the [`OcclusionCulling`] component will be ignored.\n Additionally, occlusion culling is currently incompatible with deferred\n shading; including both `DeferredPrepass` and [`OcclusionCulling`] results\n in unspecified behavior.\n\n The algorithm that Bevy uses is known as [*two-phase occlusion culling*].\n When you enable occlusion culling, Bevy splits the depth prepass into two:\n an *early* depth prepass and a *late* depth prepass. The early depth prepass\n renders all the meshes that were visible last frame to produce a\n conservative approximation of the depth buffer. Then, after producing an\n acceleration structure known as a hierarchical Z-buffer or depth pyramid,\n Bevy tests the bounding boxes of all meshes against that depth buffer. Those\n that can be quickly proven to be behind the geometry rendered during the\n early depth prepass are skipped entirely. The other potentially-visible\n meshes are rendered during the late prepass, and finally all the visible\n meshes are rendered as usual during the opaque, transparent, etc. passes.\n\n Unlike other occlusion culling systems you may be familiar with, Bevy's\n occlusion culling is fully dynamic and requires no baking step. The CPU\n overhead is minimal. Large skinned meshes and other dynamic objects can\n occlude other objects.\n\n [*two-phase occlusion culling*]:\n https://medium.com/@mil_kru/two-pass-occlusion-culling-4100edcad501", + "layout": { + "kind": "Struct", + "name": "OcclusionCulling" + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_render::globals::GlobalsUniform": { + "identifier": "GlobalsUniform", + "crate": "bevy_render", + "path": "bevy_render::globals::GlobalsUniform", + "documentation": " Contains global values useful when writing shaders.\n Currently only contains values related to time.", + "layout": { + "kind": "Struct", + "name": "GlobalsUniform", + "fields": [ + { + "name": "time", + "type": { + "primitive": "f32" + } + }, + { + "name": "delta_time", + "type": { + "primitive": "f32" + } + }, + { + "name": "frame_count", + "type": { + "primitive": "u32" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": true, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_render::gpu_readback::ReadbackComplete": { + "identifier": "ReadbackComplete", + "crate": "bevy_render", + "path": "bevy_render::gpu_readback::ReadbackComplete", + "documentation": " An event that is triggered when a gpu readback is complete.\n\n The event contains the data as a `Vec`, which can be interpreted as the raw bytes of the\n requested buffer or texture.", + "layout": { + "kind": "Struct", + "name": "ReadbackComplete", + "fields": [ + { + "name": "entity", + "type": { + "val": "bevy_ecs::entity::Entity" + } + }, + { + "name": "data", + "type": { + "vec": { + "primitive": "u8" + } + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_render::storage::ShaderStorageBuffer": { + "identifier": "ShaderStorageBuffer", + "crate": "bevy_render", + "path": "bevy_render::storage::ShaderStorageBuffer", + "documentation": " A storage buffer that is prepared as a [`RenderAsset`] and uploaded to the GPU.", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_render::sync_world::MainEntity": { + "identifier": "MainEntity", + "crate": "bevy_render", + "path": "bevy_render::sync_world::MainEntity", + "documentation": " Component added on the render world entities to keep track of the corresponding main world entity.\n\n Can also be used as a newtype wrapper for main world entities.", + "layout": { + "kind": "TupleStruct", + "name": "MainEntity", + "fields": [ + { + "type": { + "val": "bevy_ecs::entity::Entity" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_render::sync_world::RenderEntity": { + "identifier": "RenderEntity", + "crate": "bevy_render", + "path": "bevy_render::sync_world::RenderEntity", + "documentation": " Component added on the main world entities that are synced to the Render World in order to keep track of the corresponding render world entity.\n\n Can also be used as a newtype wrapper for render world entities.", + "layout": { + "kind": "TupleStruct", + "name": "RenderEntity", + "fields": [ + { + "type": { + "val": "bevy_ecs::entity::Entity" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_render::sync_world::SyncToRenderWorld": { + "identifier": "SyncToRenderWorld", + "crate": "bevy_render", + "path": "bevy_render::sync_world::SyncToRenderWorld", + "documentation": " Marker component that indicates that its entity needs to be synchronized to the render world.\n\n This component is automatically added as a required component by [`ExtractComponentPlugin`] and [`SyncComponentPlugin`].\n For more information see [`SyncWorldPlugin`].\n\n NOTE: This component should persist throughout the entity's entire lifecycle.\n If this component is removed from its entity, the entity will be despawned.\n\n [`ExtractComponentPlugin`]: crate::extract_component::ExtractComponentPlugin\n [`SyncComponentPlugin`]: crate::sync_component::SyncComponentPlugin", + "layout": { + "kind": "Struct", + "name": "SyncToRenderWorld" + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_render::sync_world::TemporaryRenderEntity": { + "identifier": "TemporaryRenderEntity", + "crate": "bevy_render", + "path": "bevy_render::sync_world::TemporaryRenderEntity", + "documentation": " Marker component that indicates that its entity needs to be despawned at the end of the frame.", + "layout": { + "kind": "Struct", + "name": "TemporaryRenderEntity" + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_render::view::ColorGrading": { + "identifier": "ColorGrading", + "crate": "bevy_render", + "path": "bevy_render::view::ColorGrading", + "documentation": " Configures filmic color grading parameters to adjust the image appearance.\n\n Color grading is applied just before tonemapping for a given\n [`Camera`](bevy_camera::Camera) entity, with the sole exception of the\n `post_saturation` value in [`ColorGradingGlobal`], which is applied after\n tonemapping.", + "layout": { + "kind": "Struct", + "name": "ColorGrading", + "fields": [ + { + "name": "global", + "type": { + "val": "bevy_render::view::ColorGradingGlobal" + } + }, + { + "name": "shadows", + "type": { + "val": "bevy_render::view::ColorGradingSection" + } + }, + { + "name": "midtones", + "type": { + "val": "bevy_render::view::ColorGradingSection" + } + }, + { + "name": "highlights", + "type": { + "val": "bevy_render::view::ColorGradingSection" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_render::view::ColorGradingGlobal": { + "identifier": "ColorGradingGlobal", + "crate": "bevy_render", + "path": "bevy_render::view::ColorGradingGlobal", + "documentation": " Filmic color grading values applied to the image as a whole (as opposed to\n individual sections, like shadows and highlights).", + "layout": { + "kind": "Struct", + "name": "ColorGradingGlobal", + "fields": [ + { + "name": "exposure", + "type": { + "primitive": "f32" + } + }, + { + "name": "temperature", + "type": { + "primitive": "f32" + } + }, + { + "name": "tint", + "type": { + "primitive": "f32" + } + }, + { + "name": "hue", + "type": { + "primitive": "f32" + } + }, + { + "name": "post_saturation", + "type": { + "primitive": "f32" + } + }, + { + "name": "midtones_range", + "type": { + "val": "core::ops::Range" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_render::view::ColorGradingSection": { + "identifier": "ColorGradingSection", + "crate": "bevy_render", + "path": "bevy_render::view::ColorGradingSection", + "documentation": " A section of color grading values that can be selectively applied to\n shadows, midtones, and highlights.", + "layout": { + "kind": "Struct", + "name": "ColorGradingSection", + "fields": [ + { + "name": "saturation", + "type": { + "primitive": "f32" + } + }, + { + "name": "contrast", + "type": { + "primitive": "f32" + } + }, + { + "name": "gamma", + "type": { + "primitive": "f32" + } + }, + { + "name": "gain", + "type": { + "primitive": "f32" + } + }, + { + "name": "lift", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_render::view::Hdr": { + "identifier": "Hdr", + "crate": "bevy_render", + "path": "bevy_render::view::Hdr", + "documentation": " If this component is added to a camera, the camera will use an intermediate \"high dynamic range\" render texture.\n This allows rendering with a wider range of lighting values. However, this does *not* affect\n whether the camera will render with hdr display output (which bevy does not support currently)\n and only affects the intermediate render texture.", + "layout": { + "kind": "Struct", + "name": "Hdr" + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_render::view::Msaa": { + "identifier": "Msaa", + "crate": "bevy_render", + "path": "bevy_render::view::Msaa", + "documentation": " Component for configuring the number of samples for [Multi-Sample Anti-Aliasing](https://en.wikipedia.org/wiki/Multisample_anti-aliasing)\n for a [`Camera`](bevy_camera::Camera).\n\n Defaults to 4 samples. A higher number of samples results in smoother edges.\n\n Some advanced rendering features may require that MSAA is disabled.\n\n Note that the web currently only supports 1 or 4 samples.", + "layout": [ + { + "kind": "Unit", + "name": "Off" + }, + { + "kind": "Unit", + "name": "Sample2" + }, + { + "kind": "Unit", + "name": "Sample4" + }, + { + "kind": "Unit", + "name": "Sample8" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_render::view::visibility::RenderVisibleEntities": { + "identifier": "RenderVisibleEntities", + "crate": "bevy_render", + "path": "bevy_render::view::visibility::RenderVisibleEntities", + "documentation": " Collection of entities visible from the current view.\n\n This component is extracted from [`VisibleEntities`].", + "layout": { + "kind": "Struct", + "name": "RenderVisibleEntities" + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_render::view::window::screenshot::Screenshot": { + "identifier": "Screenshot", + "crate": "bevy_render", + "path": "bevy_render::view::window::screenshot::Screenshot", + "documentation": " A component that signals to the renderer to capture a screenshot this frame.\n\n This component should be spawned on a new entity with an observer that will trigger\n with [`ScreenshotCaptured`] when the screenshot is ready.\n\n Screenshots are captured asynchronously and may not be available immediately after the frame\n that the component is spawned on. The observer should be used to handle the screenshot when it\n is ready.\n\n Note that the screenshot entity will be despawned after the screenshot is captured and the\n observer is triggered.\n\n # Usage\n\n ```\n # use bevy_ecs::prelude::*;\n # use bevy_render::view::screenshot::{save_to_disk, Screenshot};\n\n fn take_screenshot(mut commands: Commands) {\n commands.spawn(Screenshot::primary_window())\n .observe(save_to_disk(\"screenshot.png\"));\n }\n ```", + "layout": { + "kind": "TupleStruct", + "name": "Screenshot", + "fields": [ + { + "type": { + "val": "bevy_camera::camera::RenderTarget" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_render::view::window::screenshot::ScreenshotCaptured": { + "identifier": "ScreenshotCaptured", + "crate": "bevy_render", + "path": "bevy_render::view::window::screenshot::ScreenshotCaptured", + "layout": { + "kind": "Struct", + "name": "ScreenshotCaptured", + "fields": [ + { + "name": "entity", + "type": { + "val": "bevy_ecs::entity::Entity" + } + }, + { + "name": "image", + "type": { + "val": "bevy_image::image::Image" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_sprite::sprite::Anchor": { + "identifier": "Anchor", + "crate": "bevy_sprite", + "path": "bevy_sprite::sprite::Anchor", + "documentation": " Normalized (relative to its size) offset of a 2d renderable entity from its [`Transform`].", + "layout": { + "kind": "TupleStruct", + "name": "Anchor", + "fields": [ + { + "type": { + "val": "glam::Vec2" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_sprite::sprite::Sprite": { + "identifier": "Sprite", + "crate": "bevy_sprite", + "path": "bevy_sprite::sprite::Sprite", + "documentation": " Describes a sprite to be rendered to a 2D camera", + "layout": { + "kind": "Struct", + "name": "Sprite", + "fields": [ + { + "name": "image", + "type": { + "val": "bevy_asset::handle::Handle" + } + }, + { + "name": "texture_atlas", + "type": { + "option": { + "val": "bevy_image::texture_atlas::TextureAtlas" + } + } + }, + { + "name": "color", + "type": { + "val": "bevy_color::color::Color" + } + }, + { + "name": "flip_x", + "type": { + "primitive": "bool" + } + }, + { + "name": "flip_y", + "type": { + "primitive": "bool" + } + }, + { + "name": "custom_size", + "type": { + "option": { + "val": "glam::Vec2" + } + } + }, + { + "name": "rect", + "type": { + "option": { + "val": "bevy_math::rects::rect::Rect" + } + } + }, + { + "name": "image_mode", + "type": { + "val": "bevy_sprite::sprite::SpriteImageMode" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_sprite::sprite::SpriteImageMode": { + "identifier": "SpriteImageMode", + "crate": "bevy_sprite", + "path": "bevy_sprite::sprite::SpriteImageMode", + "documentation": " Controls how the image is altered when scaled.", + "layout": [ + { + "kind": "Unit", + "name": "Auto" + }, + { + "kind": "TupleStruct", + "name": "Scale", + "fields": [ + { + "type": { + "val": "bevy_sprite::sprite::SpriteScalingMode" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Sliced", + "fields": [ + { + "type": { + "val": "bevy_sprite::texture_slice::slicer::TextureSlicer" + } + } + ] + }, + { + "kind": "Struct", + "name": "Tiled", + "fields": [ + { + "name": "tile_x", + "type": { + "primitive": "bool" + } + }, + { + "name": "tile_y", + "type": { + "primitive": "bool" + } + }, + { + "name": "stretch_value", + "type": { + "primitive": "f32" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_sprite::sprite::SpriteScalingMode": { + "identifier": "SpriteScalingMode", + "crate": "bevy_sprite", + "path": "bevy_sprite::sprite::SpriteScalingMode", + "documentation": " Represents various modes for proportional scaling of a texture.\n\n Can be used in [`SpriteImageMode::Scale`].", + "layout": [ + { + "kind": "Unit", + "name": "FillCenter" + }, + { + "kind": "Unit", + "name": "FillStart" + }, + { + "kind": "Unit", + "name": "FillEnd" + }, + { + "kind": "Unit", + "name": "FitCenter" + }, + { + "kind": "Unit", + "name": "FitStart" + }, + { + "kind": "Unit", + "name": "FitEnd" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_sprite::text2d::Text2d": { + "identifier": "Text2d", + "crate": "bevy_sprite", + "path": "bevy_sprite::text2d::Text2d", + "documentation": " The top-level 2D text component.\n\n Adding `Text2d` to an entity will pull in required components for setting up 2d text.\n [Example usage.](https://github.com/bevyengine/bevy/blob/latest/examples/2d/text2d.rs)\n\n The string in this component is the first 'text span' in a hierarchy of text spans that are collected into\n a [`ComputedTextBlock`]. See `TextSpan` for the component used by children of entities with [`Text2d`].\n\n With `Text2d` the `justify` field of [`TextLayout`] only affects the internal alignment of a block of text and not its\n relative position, which is controlled by the [`Anchor`] component.\n This means that for a block of text consisting of only one line that doesn't wrap, the `justify` field will have no effect.\n\n\n ```\n # use bevy_asset::Handle;\n # use bevy_color::Color;\n # use bevy_color::palettes::basic::BLUE;\n # use bevy_ecs::world::World;\n # use bevy_text::{Font, Justify, TextLayout, TextFont, TextColor, TextSpan};\n # use bevy_sprite::Text2d;\n #\n # let font_handle: Handle = Default::default();\n # let mut world = World::default();\n #\n // Basic usage.\n world.spawn(Text2d::new(\"hello world!\"));\n\n // With non-default style.\n world.spawn((\n Text2d::new(\"hello world!\"),\n TextFont {\n font: font_handle.clone().into(),\n font_size: 60.0,\n ..Default::default()\n },\n TextColor(BLUE.into()),\n ));\n\n // With text justification.\n world.spawn((\n Text2d::new(\"hello world\\nand bevy!\"),\n TextLayout::new_with_justify(Justify::Center)\n ));\n\n // With spans\n world.spawn(Text2d::new(\"hello \")).with_children(|parent| {\n parent.spawn(TextSpan::new(\"world\"));\n parent.spawn((TextSpan::new(\"!\"), TextColor(BLUE.into())));\n });\n ```", + "layout": { + "kind": "TupleStruct", + "name": "Text2d", + "fields": [ + { + "type": { + "primitive": "string" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_sprite::text2d::Text2dShadow": { + "identifier": "Text2dShadow", + "crate": "bevy_sprite", + "path": "bevy_sprite::text2d::Text2dShadow", + "documentation": " Adds a shadow behind `Text2d` text\n\n Use `TextShadow` for text drawn with `bevy_ui`", + "layout": { + "kind": "Struct", + "name": "Text2dShadow", + "fields": [ + { + "name": "offset", + "type": { + "val": "glam::Vec2" + } + }, + { + "name": "color", + "type": { + "val": "bevy_color::color::Color" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_sprite::texture_slice::border_rect::BorderRect": { + "identifier": "BorderRect", + "crate": "bevy_sprite", + "path": "bevy_sprite::texture_slice::border_rect::BorderRect", + "documentation": " Defines border insets that shrink a rectangle from its minimum and maximum corners.\n\n This struct is used to represent thickness or offsets from the four edges\n of a rectangle, with values increasing inwards.", + "layout": { + "kind": "Struct", + "name": "BorderRect", + "fields": [ + { + "name": "min_inset", + "type": { + "val": "glam::Vec2" + } + }, + { + "name": "max_inset", + "type": { + "val": "glam::Vec2" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_sprite::texture_slice::slicer::SliceScaleMode": { + "identifier": "SliceScaleMode", + "crate": "bevy_sprite", + "path": "bevy_sprite::texture_slice::slicer::SliceScaleMode", + "documentation": " Defines how a texture slice scales when resized", + "layout": [ + { + "kind": "Unit", + "name": "Stretch" + }, + { + "kind": "Struct", + "name": "Tile", + "fields": [ + { + "name": "stretch_value", + "type": { + "primitive": "f32" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_sprite::texture_slice::slicer::TextureSlicer": { + "identifier": "TextureSlicer", + "crate": "bevy_sprite", + "path": "bevy_sprite::texture_slice::slicer::TextureSlicer", + "documentation": " Slices a texture using the **9-slicing** technique. This allows to reuse an image at various sizes\n without needing to prepare multiple assets. The associated texture will be split into nine portions,\n so that on resize the different portions scale or tile in different ways to keep the texture in proportion.\n\n For example, when resizing a 9-sliced texture the corners will remain unscaled while the other\n sections will be scaled or tiled.\n\n See [9-sliced](https://en.wikipedia.org/wiki/9-slice_scaling) textures.", + "layout": { + "kind": "Struct", + "name": "TextureSlicer", + "fields": [ + { + "name": "border", + "type": { + "val": "bevy_sprite::texture_slice::border_rect::BorderRect" + } + }, + { + "name": "center_scale_mode", + "type": { + "val": "bevy_sprite::texture_slice::slicer::SliceScaleMode" + } + }, + { + "name": "sides_scale_mode", + "type": { + "val": "bevy_sprite::texture_slice::slicer::SliceScaleMode" + } + }, + { + "name": "max_corner_scale", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_sprite_render::mesh2d::color_material::ColorMaterial": { + "identifier": "ColorMaterial", + "crate": "bevy_sprite_render", + "path": "bevy_sprite_render::mesh2d::color_material::ColorMaterial", + "documentation": " A [2d material](Material2d) that renders [2d meshes](crate::Mesh2d) with a texture tinted by a uniform color", + "layout": { + "kind": "Struct", + "name": "ColorMaterial", + "fields": [ + { + "name": "color", + "type": { + "val": "bevy_color::color::Color" + } + }, + { + "name": "alpha_mode", + "type": { + "val": "bevy_sprite_render::mesh2d::material::AlphaMode2d" + } + }, + { + "name": "uv_transform", + "type": { + "val": "glam::Affine2" + } + }, + { + "name": "texture", + "type": { + "option": { + "val": "bevy_asset::handle::Handle" + } + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_sprite_render::mesh2d::material::AlphaMode2d": { + "identifier": "AlphaMode2d", + "crate": "bevy_sprite_render", + "path": "bevy_sprite_render::mesh2d::material::AlphaMode2d", + "documentation": " Sets how a 2d material's base color alpha channel is used for transparency.\n Currently, this only works with [`Mesh2d`]. Sprites are always transparent.\n\n This is very similar to [`AlphaMode`](bevy_render::alpha::AlphaMode) but this only applies to 2d meshes.\n We use a separate type because 2d doesn't support all the transparency modes that 3d does.", + "layout": [ + { + "kind": "Unit", + "name": "Opaque" + }, + { + "kind": "TupleStruct", + "name": "Mask", + "fields": [ + { + "type": { + "primitive": "f32" + } + } + ] + }, + { + "kind": "Unit", + "name": "Blend" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_sprite_render::mesh2d::wireframe2d::Mesh2dWireframe": { + "identifier": "Mesh2dWireframe", + "crate": "bevy_sprite_render", + "path": "bevy_sprite_render::mesh2d::wireframe2d::Mesh2dWireframe", + "layout": { + "kind": "TupleStruct", + "name": "Mesh2dWireframe", + "fields": [ + { + "type": { + "val": "bevy_asset::handle::Handle" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_sprite_render::mesh2d::wireframe2d::NoWireframe2d": { + "identifier": "NoWireframe2d", + "crate": "bevy_sprite_render", + "path": "bevy_sprite_render::mesh2d::wireframe2d::NoWireframe2d", + "documentation": " Disables wireframe rendering for any entity it is attached to.\n It will ignore the [`Wireframe2dConfig`] global setting.\n\n This requires the [`Wireframe2dPlugin`] to be enabled.", + "layout": { + "kind": "Struct", + "name": "NoWireframe2d" + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_sprite_render::mesh2d::wireframe2d::Wireframe2d": { + "identifier": "Wireframe2d", + "crate": "bevy_sprite_render", + "path": "bevy_sprite_render::mesh2d::wireframe2d::Wireframe2d", + "documentation": " Enables wireframe rendering for any entity it is attached to.\n It will ignore the [`Wireframe2dConfig`] global setting.\n\n This requires the [`Wireframe2dPlugin`] to be enabled.", + "layout": { + "kind": "Struct", + "name": "Wireframe2d" + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_sprite_render::mesh2d::wireframe2d::Wireframe2dColor": { + "identifier": "Wireframe2dColor", + "crate": "bevy_sprite_render", + "path": "bevy_sprite_render::mesh2d::wireframe2d::Wireframe2dColor", + "documentation": " Sets the color of the [`Wireframe2d`] of the entity it is attached to.\n\n If this component is present but there's no [`Wireframe2d`] component,\n it will still affect the color of the wireframe when [`Wireframe2dConfig::global`] is set to true.\n\n This overrides the [`Wireframe2dConfig::default_color`].", + "layout": { + "kind": "Struct", + "name": "Wireframe2dColor", + "fields": [ + { + "name": "color", + "type": { + "val": "bevy_color::color::Color" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_sprite_render::mesh2d::wireframe2d::Wireframe2dConfig": { + "identifier": "Wireframe2dConfig", + "crate": "bevy_sprite_render", + "path": "bevy_sprite_render::mesh2d::wireframe2d::Wireframe2dConfig", + "layout": { + "kind": "Struct", + "name": "Wireframe2dConfig", + "fields": [ + { + "name": "global", + "type": { + "primitive": "bool" + } + }, + { + "name": "default_color", + "type": { + "val": "bevy_color::color::Color" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": true, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_sprite_render::mesh2d::wireframe2d::Wireframe2dMaterial": { + "identifier": "Wireframe2dMaterial", + "crate": "bevy_sprite_render", + "path": "bevy_sprite_render::mesh2d::wireframe2d::Wireframe2dMaterial", + "layout": { + "kind": "Struct", + "name": "Wireframe2dMaterial", + "fields": [ + { + "name": "color", + "type": { + "val": "bevy_color::color::Color" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_sprite_render::tilemap_chunk::TileData": { + "identifier": "TileData", + "crate": "bevy_sprite_render", + "path": "bevy_sprite_render::tilemap_chunk::TileData", + "documentation": " Data for a single tile in the tilemap chunk.", + "layout": { + "kind": "Struct", + "name": "TileData", + "fields": [ + { + "name": "tileset_index", + "type": { + "primitive": "u16" + } + }, + { + "name": "color", + "type": { + "val": "bevy_color::color::Color" + } + }, + { + "name": "visible", + "type": { + "primitive": "bool" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_sprite_render::tilemap_chunk::TilemapChunk": { + "identifier": "TilemapChunk", + "crate": "bevy_sprite_render", + "path": "bevy_sprite_render::tilemap_chunk::TilemapChunk", + "documentation": " A component representing a chunk of a tilemap.\n Each chunk is a rectangular section of tiles that is rendered as a single mesh.", + "layout": { + "kind": "Struct", + "name": "TilemapChunk", + "fields": [ + { + "name": "chunk_size", + "type": { + "val": "glam::UVec2" + } + }, + { + "name": "tile_display_size", + "type": { + "val": "glam::UVec2" + } + }, + { + "name": "tileset", + "type": { + "val": "bevy_asset::handle::Handle" + } + }, + { + "name": "alpha_mode", + "type": { + "val": "bevy_sprite_render::mesh2d::material::AlphaMode2d" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_sprite_render::tilemap_chunk::TilemapChunkMeshCache": { + "identifier": "TilemapChunkMeshCache", + "crate": "bevy_sprite_render", + "path": "bevy_sprite_render::tilemap_chunk::TilemapChunkMeshCache", + "documentation": " A resource storing the meshes for each tilemap chunk size.", + "layout": { + "kind": "TupleStruct", + "name": "TilemapChunkMeshCache", + "fields": [ + { + "type": { + "hashMap": [ + { + "val": "glam::UVec2" + }, + { + "val": "bevy_asset::handle::Handle" + } + ] + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": true, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_sprite_render::tilemap_chunk::TilemapChunkTileData": { + "identifier": "TilemapChunkTileData", + "crate": "bevy_sprite_render", + "path": "bevy_sprite_render::tilemap_chunk::TilemapChunkTileData", + "documentation": " Component storing the data of tiles within a chunk.\n Each index corresponds to a specific tile in the tileset. `None` indicates an empty tile.", + "layout": { + "kind": "TupleStruct", + "name": "TilemapChunkTileData", + "fields": [ + { + "type": { + "vec": { + "option": { + "val": "bevy_sprite_render::tilemap_chunk::TileData" + } + } + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_system_reflection::Edge": { + "identifier": "Edge", + "crate": "bevy_system_reflection", + "path": "bevy_system_reflection::Edge", + "documentation": " An edge in the graph", + "layout": { + "kind": "Struct", + "name": "Edge", + "fields": [ + { + "name": "from", + "type": { + "val": "bevy_system_reflection::ReflectNodeId" + } + }, + { + "name": "to", + "type": { + "val": "bevy_system_reflection::ReflectNodeId" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_system_reflection::ReflectNodeId": { + "identifier": "ReflectNodeId", + "crate": "bevy_system_reflection", + "path": "bevy_system_reflection::ReflectNodeId", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_system_reflection::ReflectSystemGraph": { + "identifier": "ReflectSystemGraph", + "crate": "bevy_system_reflection", + "path": "bevy_system_reflection::ReflectSystemGraph", + "documentation": " A graph of systems and system sets for a single schedule", + "layout": { + "kind": "Struct", + "name": "ReflectSystemGraph", + "fields": [ + { + "name": "schedule", + "type": { + "val": "bevy_system_reflection::ReflectSchedule" + } + }, + { + "name": "nodes", + "type": { + "vec": { + "val": "bevy_system_reflection::ReflectSystemGraphNode" + } + } + }, + { + "name": "dependencies", + "type": { + "vec": { + "val": "bevy_system_reflection::Edge" + } + } + }, + { + "name": "hierarchy", + "type": { + "vec": { + "val": "bevy_system_reflection::Edge" + } + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_system_reflection::ReflectSystemGraphNode": { + "identifier": "ReflectSystemGraphNode", + "crate": "bevy_system_reflection", + "path": "bevy_system_reflection::ReflectSystemGraphNode", + "documentation": " A node in the reflectable system graph", + "layout": [ + { + "kind": "TupleStruct", + "name": "System", + "fields": [ + { + "type": { + "val": "bevy_system_reflection::ReflectSystem" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "SystemSet", + "fields": [ + { + "type": { + "val": "bevy_system_reflection::ReflectSystemSet" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_system_reflection::ReflectSystemSet": { + "identifier": "ReflectSystemSet", + "crate": "bevy_system_reflection", + "path": "bevy_system_reflection::ReflectSystemSet", + "documentation": " A reflectable system set.", + "layout": { + "kind": "Struct", + "name": "ReflectSystemSet", + "fields": [ + { + "name": "node_id", + "type": { + "val": "bevy_system_reflection::ReflectNodeId" + } + }, + { + "name": "debug", + "type": { + "primitive": "string" + } + }, + { + "name": "type_id", + "type": { + "option": { + "val": "core::any::TypeId" + } + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_system_reflection::ReflectableScheduleLabel": { + "identifier": "ReflectableScheduleLabel", + "crate": "bevy_system_reflection", + "path": "bevy_system_reflection::ReflectableScheduleLabel", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_text::bounds::TextBounds": { + "identifier": "TextBounds", + "crate": "bevy_text", + "path": "bevy_text::bounds::TextBounds", + "documentation": " The maximum width and height of text. The text will wrap according to the specified size.\n\n Characters out of the bounds after wrapping will be truncated. Text is aligned according to the\n specified [`Justify`](crate::text::Justify).\n\n Note: only characters that are completely out of the bounds will be truncated, so this is not a\n reliable limit if it is necessary to contain the text strictly in the bounds. Currently this\n component is mainly useful for text wrapping only.", + "layout": { + "kind": "Struct", + "name": "TextBounds", + "fields": [ + { + "name": "width", + "type": { + "option": { + "primitive": "f32" + } + } + }, + { + "name": "height", + "type": { + "option": { + "primitive": "f32" + } + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_text::glyph::GlyphAtlasInfo": { + "identifier": "GlyphAtlasInfo", + "crate": "bevy_text", + "path": "bevy_text::glyph::GlyphAtlasInfo", + "documentation": " Information about a glyph in an atlas.\n\n Rasterized glyphs are stored as rectangles\n in one or more [`FontAtlas`](crate::FontAtlas)es.\n\n Used in [`PositionedGlyph`] and [`FontAtlasSet`](crate::FontAtlasSet).", + "layout": { + "kind": "Struct", + "name": "GlyphAtlasInfo", + "fields": [ + { + "name": "texture", + "type": { + "val": "bevy_asset::id::AssetId" + } + }, + { + "name": "texture_atlas", + "type": { + "val": "bevy_asset::id::AssetId" + } + }, + { + "name": "location", + "type": { + "val": "bevy_text::glyph::GlyphAtlasLocation" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_text::glyph::GlyphAtlasLocation": { + "identifier": "GlyphAtlasLocation", + "crate": "bevy_text", + "path": "bevy_text::glyph::GlyphAtlasLocation", + "documentation": " The location of a glyph in an atlas,\n and how it should be positioned when placed.\n\n Used in [`GlyphAtlasInfo`] and [`FontAtlas`](crate::FontAtlas).", + "layout": { + "kind": "Struct", + "name": "GlyphAtlasLocation", + "fields": [ + { + "name": "glyph_index", + "type": { + "primitive": "usize" + } + }, + { + "name": "offset", + "type": { + "val": "glam::IVec2" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_text::glyph::PositionedGlyph": { + "identifier": "PositionedGlyph", + "crate": "bevy_text", + "path": "bevy_text::glyph::PositionedGlyph", + "documentation": " A glyph of a font, typically representing a single character, positioned in screen space.\n\n Contains information about how and where to render a glyph.\n\n Used in [`TextPipeline::update_text_layout_info`](crate::TextPipeline::update_text_layout_info) and [`TextLayoutInfo`](`crate::TextLayoutInfo`) for rendering glyphs.", + "layout": { + "kind": "Struct", + "name": "PositionedGlyph", + "fields": [ + { + "name": "position", + "type": { + "val": "glam::Vec2" + } + }, + { + "name": "size", + "type": { + "val": "glam::Vec2" + } + }, + { + "name": "atlas_info", + "type": { + "val": "bevy_text::glyph::GlyphAtlasInfo" + } + }, + { + "name": "span_index", + "type": { + "primitive": "usize" + } + }, + { + "name": "line_index", + "type": { + "primitive": "usize" + } + }, + { + "name": "byte_index", + "type": { + "primitive": "usize" + } + }, + { + "name": "byte_length", + "type": { + "primitive": "usize" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_text::pipeline::RunGeometry": { + "identifier": "RunGeometry", + "crate": "bevy_text", + "path": "bevy_text::pipeline::RunGeometry", + "documentation": " Geometry of a text run used to render text decorations like background colors, strikethrough, and underline.\n A run in `bevy_text` is a contiguous sequence of glyphs on a line that share the same text attributes like font,\n font size, and line height.", + "layout": { + "kind": "Struct", + "name": "RunGeometry", + "fields": [ + { + "name": "span_index", + "type": { + "primitive": "usize" + } + }, + { + "name": "bounds", + "type": { + "val": "bevy_math::rects::rect::Rect" + } + }, + { + "name": "strikethrough_y", + "type": { + "primitive": "f32" + } + }, + { + "name": "strikethrough_thickness", + "type": { + "primitive": "f32" + } + }, + { + "name": "underline_y", + "type": { + "primitive": "f32" + } + }, + { + "name": "underline_thickness", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_text::pipeline::TextLayoutInfo": { + "identifier": "TextLayoutInfo", + "crate": "bevy_text", + "path": "bevy_text::pipeline::TextLayoutInfo", + "documentation": " Render information for a corresponding text block.\n\n Contains scaled glyphs and their size. Generated via [`TextPipeline::update_text_layout_info`] when an entity has\n [`TextLayout`] and [`ComputedTextBlock`] components.", + "layout": { + "kind": "Struct", + "name": "TextLayoutInfo", + "fields": [ + { + "name": "scale_factor", + "type": { + "primitive": "f32" + } + }, + { + "name": "glyphs", + "type": { + "vec": { + "val": "bevy_text::glyph::PositionedGlyph" + } + } + }, + { + "name": "run_geometry", + "type": { + "vec": { + "val": "bevy_text::pipeline::RunGeometry" + } + } + }, + { + "name": "size", + "type": { + "val": "glam::Vec2" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_text::text::ComputedTextBlock": { + "identifier": "ComputedTextBlock", + "crate": "bevy_text", + "path": "bevy_text::text::ComputedTextBlock", + "documentation": " Computed information for a text block.\n\n See [`TextLayout`].\n\n Automatically updated by 2d and UI text systems.", + "layout": { + "kind": "Struct", + "name": "ComputedTextBlock", + "fields": [ + { + "name": "entities", + "type": { + "vec": { + "val": "bevy_text::text::TextEntity" + } + } + }, + { + "name": "needs_rerender", + "type": { + "primitive": "bool" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_text::text::FontFeatureTag": { + "identifier": "FontFeatureTag", + "crate": "bevy_text", + "path": "bevy_text::text::FontFeatureTag", + "documentation": " An OpenType font feature tag.", + "layout": { + "kind": "TupleStruct", + "name": "FontFeatureTag", + "fields": [ + { + "type": { + "array": [ + { + "primitive": "u8" + }, + 4 + ] + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_text::text::FontFeatures": { + "identifier": "FontFeatures", + "crate": "bevy_text", + "path": "bevy_text::text::FontFeatures", + "documentation": " OpenType features for .otf fonts that support them.\n\n Examples features include ligatures, small-caps, and fractional number display. For the complete\n list of OpenType features, see the spec at\n ``.\n\n # Usage:\n ```\n use bevy_text::{FontFeatureTag, FontFeatures};\n\n // Create using the builder\n let font_features = FontFeatures::builder()\n .enable(FontFeatureTag::STANDARD_LIGATURES)\n .set(FontFeatureTag::WEIGHT, 300)\n .build();\n\n // Create from a list\n let more_font_features: FontFeatures = [\n FontFeatureTag::STANDARD_LIGATURES,\n FontFeatureTag::OLDSTYLE_FIGURES,\n FontFeatureTag::TABULAR_FIGURES\n ].into();\n ```", + "layout": { + "kind": "Struct", + "name": "FontFeatures", + "fields": [ + { + "name": "features", + "type": { + "vec": { + "tuple": [ + { + "val": "bevy_text::text::FontFeatureTag" + }, + { + "primitive": "u32" + } + ] + } + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_text::text::FontHinting": { + "identifier": "FontHinting", + "crate": "bevy_text", + "path": "bevy_text::text::FontHinting", + "documentation": " Font hinting strategy.\n\n The text bounds can underflow or overflow slightly with `FontHinting::Enabled`.\n\n ", + "layout": [ + { + "kind": "Unit", + "name": "Disabled" + }, + { + "kind": "Unit", + "name": "Enabled" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_text::text::FontSmoothing": { + "identifier": "FontSmoothing", + "crate": "bevy_text", + "path": "bevy_text::text::FontSmoothing", + "documentation": " Determines which antialiasing method to use when rendering text. By default, text is\n rendered with grayscale antialiasing, but this can be changed to achieve a pixelated look.\n\n **Note:** Subpixel antialiasing is not currently supported.", + "layout": [ + { + "kind": "Unit", + "name": "None" + }, + { + "kind": "Unit", + "name": "AntiAliased" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_text::text::FontWeight": { + "identifier": "FontWeight", + "crate": "bevy_text", + "path": "bevy_text::text::FontWeight", + "documentation": " How thick or bold the strokes of a font appear.\n\n Valid font weights range from 1 to 1000, inclusive.\n Weights above 1000 are clamped to 1000.\n A weight of 0 is treated as [`FontWeight::DEFAULT`].\n\n ``", + "layout": { + "kind": "TupleStruct", + "name": "FontWeight", + "fields": [ + { + "type": { + "primitive": "u16" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_text::text::Justify": { + "identifier": "Justify", + "crate": "bevy_text", + "path": "bevy_text::text::Justify", + "documentation": " Describes the horizontal alignment of multiple lines of text relative to each other.\n\n This only affects the internal positioning of the lines of text within a text entity and\n does not affect the text entity's position.\n\n _Has no affect on a single line text entity_, unless used together with a\n [`TextBounds`](super::bounds::TextBounds) component with an explicit `width` value.", + "layout": [ + { + "kind": "Unit", + "name": "Left" + }, + { + "kind": "Unit", + "name": "Center" + }, + { + "kind": "Unit", + "name": "Right" + }, + { + "kind": "Unit", + "name": "Justified" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_text::text::LineBreak": { + "identifier": "LineBreak", + "crate": "bevy_text", + "path": "bevy_text::text::LineBreak", + "documentation": " Determines how lines will be broken when preventing text from running out of bounds.", + "layout": [ + { + "kind": "Unit", + "name": "WordBoundary" + }, + { + "kind": "Unit", + "name": "AnyCharacter" + }, + { + "kind": "Unit", + "name": "WordOrCharacter" + }, + { + "kind": "Unit", + "name": "NoWrap" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_text::text::LineHeight": { + "identifier": "LineHeight", + "crate": "bevy_text", + "path": "bevy_text::text::LineHeight", + "documentation": " Specifies the height of each line of text for `Text` and `Text2d`\n\n Default is 1.2x the font size", + "layout": [ + { + "kind": "TupleStruct", + "name": "Px", + "fields": [ + { + "type": { + "primitive": "f32" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "RelativeToFont", + "fields": [ + { + "type": { + "primitive": "f32" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_text::text::Strikethrough": { + "identifier": "Strikethrough", + "crate": "bevy_text", + "path": "bevy_text::text::Strikethrough", + "documentation": " A text entity with this component is drawn with strikethrough.", + "layout": { + "kind": "Struct", + "name": "Strikethrough" + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_text::text::StrikethroughColor": { + "identifier": "StrikethroughColor", + "crate": "bevy_text", + "path": "bevy_text::text::StrikethroughColor", + "documentation": " Color for the text's strikethrough. If this component is not present, its `TextColor` will be used.", + "layout": { + "kind": "TupleStruct", + "name": "StrikethroughColor", + "fields": [ + { + "type": { + "val": "bevy_color::color::Color" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_text::text::TextBackgroundColor": { + "identifier": "TextBackgroundColor", + "crate": "bevy_text", + "path": "bevy_text::text::TextBackgroundColor", + "documentation": " The background color of the text for this section.", + "layout": { + "kind": "TupleStruct", + "name": "TextBackgroundColor", + "fields": [ + { + "type": { + "val": "bevy_color::color::Color" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_text::text::TextColor": { + "identifier": "TextColor", + "crate": "bevy_text", + "path": "bevy_text::text::TextColor", + "documentation": " The color of the text for this section.", + "layout": { + "kind": "TupleStruct", + "name": "TextColor", + "fields": [ + { + "type": { + "val": "bevy_color::color::Color" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_text::text::TextEntity": { + "identifier": "TextEntity", + "crate": "bevy_text", + "path": "bevy_text::text::TextEntity", + "documentation": " A sub-entity of a [`ComputedTextBlock`].\n\n Returned by [`ComputedTextBlock::entities`].", + "layout": { + "kind": "Struct", + "name": "TextEntity", + "fields": [ + { + "name": "entity", + "type": { + "val": "bevy_ecs::entity::Entity" + } + }, + { + "name": "depth", + "type": { + "primitive": "usize" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_text::text::TextFont": { + "identifier": "TextFont", + "crate": "bevy_text", + "path": "bevy_text::text::TextFont", + "documentation": " `TextFont` determines the style of a text span within a [`ComputedTextBlock`], specifically\n the font face, the font size, the line height, and the antialiasing method.", + "layout": { + "kind": "Struct", + "name": "TextFont", + "fields": [ + { + "name": "font", + "type": { + "val": "bevy_asset::handle::Handle" + } + }, + { + "name": "font_size", + "type": { + "primitive": "f32" + } + }, + { + "name": "weight", + "type": { + "val": "bevy_text::text::FontWeight" + } + }, + { + "name": "font_smoothing", + "type": { + "val": "bevy_text::text::FontSmoothing" + } + }, + { + "name": "font_features", + "type": { + "val": "bevy_text::text::FontFeatures" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_text::text::TextLayout": { + "identifier": "TextLayout", + "crate": "bevy_text", + "path": "bevy_text::text::TextLayout", + "documentation": " Component with text format settings for a block of text.\n\n A block of text is composed of text spans, which each have a separate string value and [`TextFont`]. Text\n spans associated with a text block are collected into [`ComputedTextBlock`] for layout, and then inserted\n to [`TextLayoutInfo`] for rendering.\n\n See `Text2d` in `bevy_sprite` for the core component of 2d text, and `Text` in `bevy_ui` for UI text.", + "layout": { + "kind": "Struct", + "name": "TextLayout", + "fields": [ + { + "name": "justify", + "type": { + "val": "bevy_text::text::Justify" + } + }, + { + "name": "linebreak", + "type": { + "val": "bevy_text::text::LineBreak" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_text::text::TextSpan": { + "identifier": "TextSpan", + "crate": "bevy_text", + "path": "bevy_text::text::TextSpan", + "documentation": " A span of text in a tree of spans.\n\n A `TextSpan` is only valid when it exists as a child of a parent that has either `Text` or\n `Text2d`. The parent's `Text` / `Text2d` component contains the base text content. Any children\n with `TextSpan` extend this text by appending their content to the parent's text in sequence to\n form a [`ComputedTextBlock`]. The parent's [`TextLayout`] determines the layout of the block\n but each node has its own [`TextFont`] and [`TextColor`].", + "layout": { + "kind": "TupleStruct", + "name": "TextSpan", + "fields": [ + { + "type": { + "primitive": "string" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_text::text::Underline": { + "identifier": "Underline", + "crate": "bevy_text", + "path": "bevy_text::text::Underline", + "documentation": " Add to a text entity to draw its text with underline.", + "layout": { + "kind": "Struct", + "name": "Underline" + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_text::text::UnderlineColor": { + "identifier": "UnderlineColor", + "crate": "bevy_text", + "path": "bevy_text::text::UnderlineColor", + "documentation": " Color for the text's underline. If this component is not present, its `TextColor` will be used.", + "layout": { + "kind": "TupleStruct", + "name": "UnderlineColor", + "fields": [ + { + "type": { + "val": "bevy_color::color::Color" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::UiScale": { + "identifier": "UiScale", + "crate": "bevy_ui", + "path": "bevy_ui::UiScale", + "documentation": " The current scale of the UI.\n\n A multiplier to fixed-sized ui values.\n **Note:** This will only affect fixed ui values like [`Val::Px`]", + "layout": { + "kind": "TupleStruct", + "name": "UiScale", + "fields": [ + { + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": true, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::auto_directional_navigation::AutoDirectionalNavigation": { + "identifier": "AutoDirectionalNavigation", + "crate": "bevy_ui", + "path": "bevy_ui::auto_directional_navigation::AutoDirectionalNavigation", + "documentation": " Marker component to enable automatic directional navigation to and from the entity.\n\n Simply add this component to your UI entities so that the navigation algorithm will\n consider this entity in its calculations:\n\n ```rust\n # use bevy_ecs::prelude::*;\n # use bevy_ui::auto_directional_navigation::AutoDirectionalNavigation;\n fn spawn_auto_nav_button(mut commands: Commands) {\n commands.spawn((\n // ... Button, Node, etc. ...\n AutoDirectionalNavigation::default(), // That's it!\n ));\n }\n ```\n\n # Multi-Layer UIs and Z-Index\n\n **Important**: Automatic navigation is currently **z-index agnostic** and treats\n all entities with `AutoDirectionalNavigation` as a flat set, regardless of which UI layer\n or z-index they belong to. This means navigation may jump between different layers (e.g.,\n from a background menu to an overlay popup).\n\n **Workarounds** for multi-layer UIs:\n\n 1. **Per-layer manual edge generation**: Query entities by layer and call\n [`auto_generate_navigation_edges()`](bevy_input_focus::directional_navigation::auto_generate_navigation_edges)\n separately for each layer:\n ```rust,ignore\n for layer in &layers {\n let nodes: Vec = query_layer(layer).collect();\n auto_generate_navigation_edges(&mut nav_map, &nodes, &config);\n }\n ```\n\n 2. **Manual cross-layer navigation**: Use\n [`DirectionalNavigationMap::add_edge()`](bevy_input_focus::directional_navigation::DirectionalNavigationMap::add_edge)\n to define explicit connections between layers (e.g., \"Back\" button to main menu).\n\n 3. **Remove component when layer is hidden**: Dynamically add/remove\n [`AutoDirectionalNavigation`] based on which layers are currently active.\n\n See issue [#21679](https://github.com/bevyengine/bevy/issues/21679) for planned\n improvements to layer-aware automatic navigation.\n\n # Opting Out\n\n To disable automatic navigation for specific entities:\n\n - **Remove the component**: Simply don't add [`AutoDirectionalNavigation`] to entities\n that should only use manual navigation edges.\n - **Dynamically toggle**: Remove/insert the component at runtime to enable/disable\n automatic navigation as needed.\n\n Manual edges defined via [`DirectionalNavigationMap`](bevy_input_focus::directional_navigation::DirectionalNavigationMap)\n are completely independent and will continue to work regardless of this component.\n\n # Additional Requirements\n\n Entities must also have:\n - [`ComputedNode`] - for size information\n - [`UiGlobalTransform`] - for position information\n\n These are automatically added by `bevy_ui` when you spawn UI entities.\n\n # Custom UI Systems\n\n For custom UI frameworks, you can call\n [`auto_generate_navigation_edges`](bevy_input_focus::directional_navigation::auto_generate_navigation_edges)\n directly in your own system instead of using this component.", + "layout": { + "kind": "Struct", + "name": "AutoDirectionalNavigation", + "fields": [ + { + "name": "respect_tab_order", + "type": { + "primitive": "bool" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::focus::FocusPolicy": { + "identifier": "FocusPolicy", + "crate": "bevy_ui", + "path": "bevy_ui::focus::FocusPolicy", + "documentation": " Describes whether the node should block interactions with lower nodes", + "layout": [ + { + "kind": "Unit", + "name": "Block" + }, + { + "kind": "Unit", + "name": "Pass" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::focus::Interaction": { + "identifier": "Interaction", + "crate": "bevy_ui", + "path": "bevy_ui::focus::Interaction", + "documentation": " Describes what type of input interaction has occurred for a UI node.\n\n This is commonly queried with a `Changed` filter.\n\n Updated in [`ui_focus_system`].\n\n If a UI node has both [`Interaction`] and [`InheritedVisibility`] components,\n [`Interaction`] will always be [`Interaction::None`]\n when [`InheritedVisibility::get()`] is false.\n This ensures that hidden UI nodes are not interactable,\n and do not end up stuck in an active state if hidden at the wrong time.\n\n Note that you can also control the visibility of a node using the [`Display`](crate::ui_node::Display) property,\n which fully collapses it during layout calculations.\n\n # See also\n\n - [`Button`](crate::widget::Button) which requires this component\n - [`RelativeCursorPosition`] to obtain the position of the cursor relative to current node", + "layout": [ + { + "kind": "Unit", + "name": "Pressed" + }, + { + "kind": "Unit", + "name": "Hovered" + }, + { + "kind": "Unit", + "name": "None" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::focus::RelativeCursorPosition": { + "identifier": "RelativeCursorPosition", + "crate": "bevy_ui", + "path": "bevy_ui::focus::RelativeCursorPosition", + "documentation": " A component storing the position of the mouse relative to the node, (0., 0.) being the center and (0.5, 0.5) being the bottom-right\n If the mouse is not over the node, the value will go beyond the range of (-0.5, -0.5) to (0.5, 0.5)\n\n It can be used alongside [`Interaction`] to get the position of the press.\n\n The component is updated when it is in the same entity with [`Node`].", + "layout": { + "kind": "Struct", + "name": "RelativeCursorPosition", + "fields": [ + { + "name": "cursor_over", + "type": { + "primitive": "bool" + } + }, + { + "name": "normalized", + "type": { + "option": { + "val": "glam::Vec2" + } + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::geometry::UiPosition": { + "identifier": "UiPosition", + "crate": "bevy_ui", + "path": "bevy_ui::geometry::UiPosition", + "documentation": " Responsive position relative to a UI node.", + "layout": { + "kind": "Struct", + "name": "UiPosition", + "fields": [ + { + "name": "anchor", + "type": { + "val": "glam::Vec2" + } + }, + { + "name": "x", + "type": { + "val": "bevy_ui::geometry::Val" + } + }, + { + "name": "y", + "type": { + "val": "bevy_ui::geometry::Val" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::geometry::UiRect": { + "identifier": "UiRect", + "crate": "bevy_ui", + "path": "bevy_ui::geometry::UiRect", + "documentation": " A type which is commonly used to define margins, paddings and borders.\n\n # Examples\n\n ## Margin\n\n A margin is used to create space around UI elements, outside of any defined borders.\n\n ```\n # use bevy_ui::{UiRect, Val};\n #\n let margin = UiRect::all(Val::Auto); // Centers the UI element\n ```\n\n ## Padding\n\n A padding is used to create space around UI elements, inside of any defined borders.\n\n ```\n # use bevy_ui::{UiRect, Val};\n #\n let padding = UiRect {\n left: Val::Px(10.0),\n right: Val::Px(20.0),\n top: Val::Px(30.0),\n bottom: Val::Px(40.0),\n };\n ```\n\n ## Borders\n\n A border is used to define the width of the border of a UI element.\n\n ```\n # use bevy_ui::{UiRect, Val};\n #\n let border = UiRect {\n left: Val::Px(10.0),\n right: Val::Px(20.0),\n top: Val::Px(30.0),\n bottom: Val::Px(40.0),\n };\n ```", + "layout": { + "kind": "Struct", + "name": "UiRect", + "fields": [ + { + "name": "left", + "type": { + "val": "bevy_ui::geometry::Val" + } + }, + { + "name": "right", + "type": { + "val": "bevy_ui::geometry::Val" + } + }, + { + "name": "top", + "type": { + "val": "bevy_ui::geometry::Val" + } + }, + { + "name": "bottom", + "type": { + "val": "bevy_ui::geometry::Val" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::geometry::Val": { + "identifier": "Val", + "crate": "bevy_ui", + "path": "bevy_ui::geometry::Val", + "documentation": " Represents the possible value types for layout properties.\n\n This enum allows specifying values for various [`Node`](crate::Node) properties in different units,\n such as logical pixels, percentages, or automatically determined values.\n\n `Val` also implements [`core::str::FromStr`] to allow parsing values from strings in the format `#.#px`. Whitespaces between the value and unit is allowed. The following units are supported:\n * `px`: logical pixels\n * `%`: percentage\n * `vw`: percentage of the viewport width\n * `vh`: percentage of the viewport height\n * `vmin`: percentage of the viewport's smaller dimension\n * `vmax`: percentage of the viewport's larger dimension\n\n Additionally, `auto` will be parsed as [`Val::Auto`].", + "layout": [ + { + "kind": "Unit", + "name": "Auto" + }, + { + "kind": "TupleStruct", + "name": "Px", + "fields": [ + { + "type": { + "primitive": "f32" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Percent", + "fields": [ + { + "type": { + "primitive": "f32" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Vw", + "fields": [ + { + "type": { + "primitive": "f32" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Vh", + "fields": [ + { + "type": { + "primitive": "f32" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "VMin", + "fields": [ + { + "type": { + "primitive": "f32" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "VMax", + "fields": [ + { + "type": { + "primitive": "f32" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::gradients::AngularColorStop": { + "identifier": "AngularColorStop", + "crate": "bevy_ui", + "path": "bevy_ui::gradients::AngularColorStop", + "documentation": " An angular color stop for a conic gradient", + "layout": { + "kind": "Struct", + "name": "AngularColorStop", + "fields": [ + { + "name": "color", + "type": { + "val": "bevy_color::color::Color" + } + }, + { + "name": "angle", + "type": { + "option": { + "primitive": "f32" + } + } + }, + { + "name": "hint", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::gradients::BackgroundGradient": { + "identifier": "BackgroundGradient", + "crate": "bevy_ui", + "path": "bevy_ui::gradients::BackgroundGradient", + "documentation": " A UI node that displays a gradient", + "layout": { + "kind": "TupleStruct", + "name": "BackgroundGradient", + "fields": [ + { + "type": { + "vec": { + "val": "bevy_ui::gradients::Gradient" + } + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::gradients::BorderGradient": { + "identifier": "BorderGradient", + "crate": "bevy_ui", + "path": "bevy_ui::gradients::BorderGradient", + "documentation": " A UI node border that displays a gradient", + "layout": { + "kind": "TupleStruct", + "name": "BorderGradient", + "fields": [ + { + "type": { + "vec": { + "val": "bevy_ui::gradients::Gradient" + } + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::gradients::ColorStop": { + "identifier": "ColorStop", + "crate": "bevy_ui", + "path": "bevy_ui::gradients::ColorStop", + "documentation": " A color stop for a gradient", + "layout": { + "kind": "Struct", + "name": "ColorStop", + "fields": [ + { + "name": "color", + "type": { + "val": "bevy_color::color::Color" + } + }, + { + "name": "point", + "type": { + "val": "bevy_ui::geometry::Val" + } + }, + { + "name": "hint", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::gradients::ConicGradient": { + "identifier": "ConicGradient", + "crate": "bevy_ui", + "path": "bevy_ui::gradients::ConicGradient", + "documentation": " A conic gradient\n\n ", + "layout": { + "kind": "Struct", + "name": "ConicGradient", + "fields": [ + { + "name": "color_space", + "type": { + "val": "bevy_ui::gradients::InterpolationColorSpace" + } + }, + { + "name": "start", + "type": { + "primitive": "f32" + } + }, + { + "name": "position", + "type": { + "val": "bevy_ui::geometry::UiPosition" + } + }, + { + "name": "stops", + "type": { + "vec": { + "val": "bevy_ui::gradients::AngularColorStop" + } + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::gradients::Gradient": { + "identifier": "Gradient", + "crate": "bevy_ui", + "path": "bevy_ui::gradients::Gradient", + "layout": [ + { + "kind": "TupleStruct", + "name": "Linear", + "fields": [ + { + "type": { + "val": "bevy_ui::gradients::LinearGradient" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Radial", + "fields": [ + { + "type": { + "val": "bevy_ui::gradients::RadialGradient" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Conic", + "fields": [ + { + "type": { + "val": "bevy_ui::gradients::ConicGradient" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::gradients::InterpolationColorSpace": { + "identifier": "InterpolationColorSpace", + "crate": "bevy_ui", + "path": "bevy_ui::gradients::InterpolationColorSpace", + "documentation": " The color space used for interpolation.", + "layout": [ + { + "kind": "Unit", + "name": "Oklaba" + }, + { + "kind": "Unit", + "name": "Oklcha" + }, + { + "kind": "Unit", + "name": "OklchaLong" + }, + { + "kind": "Unit", + "name": "Srgba" + }, + { + "kind": "Unit", + "name": "LinearRgba" + }, + { + "kind": "Unit", + "name": "Hsla" + }, + { + "kind": "Unit", + "name": "HslaLong" + }, + { + "kind": "Unit", + "name": "Hsva" + }, + { + "kind": "Unit", + "name": "HsvaLong" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::gradients::LinearGradient": { + "identifier": "LinearGradient", + "crate": "bevy_ui", + "path": "bevy_ui::gradients::LinearGradient", + "documentation": " A linear gradient\n\n ", + "layout": { + "kind": "Struct", + "name": "LinearGradient", + "fields": [ + { + "name": "color_space", + "type": { + "val": "bevy_ui::gradients::InterpolationColorSpace" + } + }, + { + "name": "angle", + "type": { + "primitive": "f32" + } + }, + { + "name": "stops", + "type": { + "vec": { + "val": "bevy_ui::gradients::ColorStop" + } + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::gradients::RadialGradient": { + "identifier": "RadialGradient", + "crate": "bevy_ui", + "path": "bevy_ui::gradients::RadialGradient", + "documentation": " A radial gradient\n\n ", + "layout": { + "kind": "Struct", + "name": "RadialGradient", + "fields": [ + { + "name": "color_space", + "type": { + "val": "bevy_ui::gradients::InterpolationColorSpace" + } + }, + { + "name": "position", + "type": { + "val": "bevy_ui::geometry::UiPosition" + } + }, + { + "name": "shape", + "type": { + "val": "bevy_ui::gradients::RadialGradientShape" + } + }, + { + "name": "stops", + "type": { + "vec": { + "val": "bevy_ui::gradients::ColorStop" + } + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::gradients::RadialGradientShape": { + "identifier": "RadialGradientShape", + "crate": "bevy_ui", + "path": "bevy_ui::gradients::RadialGradientShape", + "layout": [ + { + "kind": "Unit", + "name": "ClosestSide" + }, + { + "kind": "Unit", + "name": "FarthestSide" + }, + { + "kind": "Unit", + "name": "ClosestCorner" + }, + { + "kind": "Unit", + "name": "FarthestCorner" + }, + { + "kind": "TupleStruct", + "name": "Circle", + "fields": [ + { + "type": { + "val": "bevy_ui::geometry::Val" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Ellipse", + "fields": [ + { + "type": { + "val": "bevy_ui::geometry::Val" + } + }, + { + "type": { + "val": "bevy_ui::geometry::Val" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::measurement::ContentSize": { + "identifier": "ContentSize", + "crate": "bevy_ui", + "path": "bevy_ui::measurement::ContentSize", + "documentation": " A node with a `ContentSize` component is a node where its size\n is based on its content.", + "layout": { + "kind": "Struct", + "name": "ContentSize" + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::AlignContent": { + "identifier": "AlignContent", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::AlignContent", + "documentation": " Used to control how items are distributed.\n - For Flexbox containers, controls alignment of lines if `flex_wrap` is set to [`FlexWrap::Wrap`] and there are multiple lines of items.\n - For CSS Grid containers, controls alignment of grid rows.\n\n ", + "layout": [ + { + "kind": "Unit", + "name": "Default" + }, + { + "kind": "Unit", + "name": "Start" + }, + { + "kind": "Unit", + "name": "End" + }, + { + "kind": "Unit", + "name": "FlexStart" + }, + { + "kind": "Unit", + "name": "FlexEnd" + }, + { + "kind": "Unit", + "name": "Center" + }, + { + "kind": "Unit", + "name": "Stretch" + }, + { + "kind": "Unit", + "name": "SpaceBetween" + }, + { + "kind": "Unit", + "name": "SpaceEvenly" + }, + { + "kind": "Unit", + "name": "SpaceAround" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::AlignItems": { + "identifier": "AlignItems", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::AlignItems", + "documentation": " Used to control how each individual item is aligned by default within the space they're given.\n - For Flexbox containers, sets default cross axis alignment of the child items.\n - For CSS Grid containers, controls block (vertical) axis alignment of children of this grid container within their grid areas.\n\n ", + "layout": [ + { + "kind": "Unit", + "name": "Default" + }, + { + "kind": "Unit", + "name": "Start" + }, + { + "kind": "Unit", + "name": "End" + }, + { + "kind": "Unit", + "name": "FlexStart" + }, + { + "kind": "Unit", + "name": "FlexEnd" + }, + { + "kind": "Unit", + "name": "Center" + }, + { + "kind": "Unit", + "name": "Baseline" + }, + { + "kind": "Unit", + "name": "Stretch" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::AlignSelf": { + "identifier": "AlignSelf", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::AlignSelf", + "documentation": " Used to control how the specified item is aligned within the space it's given.\n - For Flexbox items, controls cross axis alignment of the item.\n - For CSS Grid items, controls block (vertical) axis alignment of a grid item within its grid area.\n\n ", + "layout": [ + { + "kind": "Unit", + "name": "Auto" + }, + { + "kind": "Unit", + "name": "Start" + }, + { + "kind": "Unit", + "name": "End" + }, + { + "kind": "Unit", + "name": "FlexStart" + }, + { + "kind": "Unit", + "name": "FlexEnd" + }, + { + "kind": "Unit", + "name": "Center" + }, + { + "kind": "Unit", + "name": "Baseline" + }, + { + "kind": "Unit", + "name": "Stretch" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::BackgroundColor": { + "identifier": "BackgroundColor", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::BackgroundColor", + "documentation": " The background color of the node\n\n This serves as the \"fill\" color.", + "layout": { + "kind": "TupleStruct", + "name": "BackgroundColor", + "fields": [ + { + "type": { + "val": "bevy_color::color::Color" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::BorderColor": { + "identifier": "BorderColor", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::BorderColor", + "documentation": " The border color of the UI node.", + "layout": { + "kind": "Struct", + "name": "BorderColor", + "fields": [ + { + "name": "top", + "type": { + "val": "bevy_color::color::Color" + } + }, + { + "name": "right", + "type": { + "val": "bevy_color::color::Color" + } + }, + { + "name": "bottom", + "type": { + "val": "bevy_color::color::Color" + } + }, + { + "name": "left", + "type": { + "val": "bevy_color::color::Color" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::BorderRadius": { + "identifier": "BorderRadius", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::BorderRadius", + "documentation": " Used to add rounded corners to a UI node. You can set a UI node to have uniformly\n rounded corners or specify different radii for each corner. If a given radius exceeds half\n the length of the smallest dimension between the node's height or width, the radius will\n calculated as half the smallest dimension.\n\n Elliptical nodes are not supported yet. Percentage values are based on the node's smallest\n dimension, either width or height.\n\n # Example\n ```rust\n # use bevy_ecs::prelude::*;\n # use bevy_ui::prelude::*;\n # use bevy_color::palettes::basic::{BLUE};\n fn setup_ui(mut commands: Commands) {\n commands.spawn((\n Node {\n width: Val::Px(100.),\n height: Val::Px(100.),\n border: UiRect::all(Val::Px(2.)),\n border_radius: BorderRadius::new(\n // top left\n Val::Px(10.),\n // top right\n Val::Px(20.),\n // bottom right\n Val::Px(30.),\n // bottom left\n Val::Px(40.),\n ),\n ..Default::default()\n },\n BackgroundColor(BLUE.into()),\n ));\n }\n ```\n\n ", + "layout": { + "kind": "Struct", + "name": "BorderRadius", + "fields": [ + { + "name": "top_left", + "type": { + "val": "bevy_ui::geometry::Val" + } + }, + { + "name": "top_right", + "type": { + "val": "bevy_ui::geometry::Val" + } + }, + { + "name": "bottom_right", + "type": { + "val": "bevy_ui::geometry::Val" + } + }, + { + "name": "bottom_left", + "type": { + "val": "bevy_ui::geometry::Val" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::BoxShadow": { + "identifier": "BoxShadow", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::BoxShadow", + "documentation": " List of shadows to draw for a [`Node`].\n\n Draw order is determined implicitly from the vector of [`ShadowStyle`]s, back-to-front.", + "layout": { + "kind": "TupleStruct", + "name": "BoxShadow", + "fields": [ + { + "type": { + "vec": { + "val": "bevy_ui::ui_node::ShadowStyle" + } + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::BoxSizing": { + "identifier": "BoxSizing", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::BoxSizing", + "documentation": " Which part of a Node's box length styles like width and height control\n\n See: ", + "layout": [ + { + "kind": "Unit", + "name": "BorderBox" + }, + { + "kind": "Unit", + "name": "ContentBox" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::CalculatedClip": { + "identifier": "CalculatedClip", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::CalculatedClip", + "documentation": " The calculated clip of the node", + "layout": { + "kind": "Struct", + "name": "CalculatedClip", + "fields": [ + { + "name": "clip", + "type": { + "val": "bevy_math::rects::rect::Rect" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::ComputedNode": { + "identifier": "ComputedNode", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::ComputedNode", + "documentation": " Provides the computed size and layout properties of the node.\n\n Fields in this struct are public but should not be modified under most circumstances.\n For example, in a scrollbar you may want to derive the handle's size from the proportion of\n scrollable content in-view. You can directly modify `ComputedNode` after layout to set the\n handle size without any delays.", + "layout": { + "kind": "Struct", + "name": "ComputedNode", + "fields": [ + { + "name": "stack_index", + "type": { + "primitive": "u32" + } + }, + { + "name": "size", + "type": { + "val": "glam::Vec2" + } + }, + { + "name": "content_size", + "type": { + "val": "glam::Vec2" + } + }, + { + "name": "scrollbar_size", + "type": { + "val": "glam::Vec2" + } + }, + { + "name": "scroll_position", + "type": { + "val": "glam::Vec2" + } + }, + { + "name": "outline_width", + "type": { + "primitive": "f32" + } + }, + { + "name": "outline_offset", + "type": { + "primitive": "f32" + } + }, + { + "name": "unrounded_size", + "type": { + "val": "glam::Vec2" + } + }, + { + "name": "border", + "type": { + "val": "bevy_sprite::texture_slice::border_rect::BorderRect" + } + }, + { + "name": "border_radius", + "type": { + "val": "bevy_ui::ui_node::ResolvedBorderRadius" + } + }, + { + "name": "padding", + "type": { + "val": "bevy_sprite::texture_slice::border_rect::BorderRect" + } + }, + { + "name": "inverse_scale_factor", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::ComputedUiRenderTargetInfo": { + "identifier": "ComputedUiRenderTargetInfo", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::ComputedUiRenderTargetInfo", + "documentation": " Derived information about the render target for this UI node.", + "layout": { + "kind": "Struct", + "name": "ComputedUiRenderTargetInfo", + "fields": [ + { + "name": "scale_factor", + "type": { + "primitive": "f32" + } + }, + { + "name": "physical_size", + "type": { + "val": "glam::UVec2" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::ComputedUiTargetCamera": { + "identifier": "ComputedUiTargetCamera", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::ComputedUiTargetCamera", + "documentation": " Derived information about the camera target for this UI node.\n\n Updated in [`UiSystems::Prepare`](crate::UiSystems::Prepare) by [`propagate_ui_target_cameras`](crate::update::propagate_ui_target_cameras)", + "layout": { + "kind": "Struct", + "name": "ComputedUiTargetCamera", + "fields": [ + { + "name": "camera", + "type": { + "val": "bevy_ecs::entity::Entity" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::Display": { + "identifier": "Display", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::Display", + "documentation": " Defines the layout model used by this node.\n\n Part of the [`Node`] component.", + "layout": [ + { + "kind": "Unit", + "name": "Flex" + }, + { + "kind": "Unit", + "name": "Grid" + }, + { + "kind": "Unit", + "name": "Block" + }, + { + "kind": "Unit", + "name": "None" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::FlexDirection": { + "identifier": "FlexDirection", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::FlexDirection", + "documentation": " Defines how flexbox items are ordered within a flexbox", + "layout": [ + { + "kind": "Unit", + "name": "Row" + }, + { + "kind": "Unit", + "name": "Column" + }, + { + "kind": "Unit", + "name": "RowReverse" + }, + { + "kind": "Unit", + "name": "ColumnReverse" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::FlexWrap": { + "identifier": "FlexWrap", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::FlexWrap", + "documentation": " Defines if flexbox items appear on a single line or on multiple lines", + "layout": [ + { + "kind": "Unit", + "name": "NoWrap" + }, + { + "kind": "Unit", + "name": "Wrap" + }, + { + "kind": "Unit", + "name": "WrapReverse" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::GlobalZIndex": { + "identifier": "GlobalZIndex", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::GlobalZIndex", + "documentation": " `GlobalZIndex` allows a [`Node`] entity anywhere in the UI hierarchy to escape the implicit draw ordering of the UI's layout tree and\n be rendered above or below other UI nodes.\n Nodes with a `GlobalZIndex` of greater than 0 will be drawn on top of nodes without a `GlobalZIndex` or nodes with a lower `GlobalZIndex`.\n Nodes with a `GlobalZIndex` of less than 0 will be drawn below nodes without a `GlobalZIndex` or nodes with a greater `GlobalZIndex`.\n\n If two Nodes have the same `GlobalZIndex`, the node with the greater [`ZIndex`] will be drawn on top.", + "layout": { + "kind": "TupleStruct", + "name": "GlobalZIndex", + "fields": [ + { + "type": { + "primitive": "i32" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::GridAutoFlow": { + "identifier": "GridAutoFlow", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::GridAutoFlow", + "documentation": " Controls whether grid items are placed row-wise or column-wise as well as whether the sparse or dense packing algorithm is used.\n\n The \"dense\" packing algorithm attempts to fill in holes earlier in the grid, if smaller items come up later.\n This may cause items to appear out-of-order when doing so would fill in holes left by larger items.\n\n Defaults to [`GridAutoFlow::Row`].\n\n ", + "layout": [ + { + "kind": "Unit", + "name": "Row" + }, + { + "kind": "Unit", + "name": "Column" + }, + { + "kind": "Unit", + "name": "RowDense" + }, + { + "kind": "Unit", + "name": "ColumnDense" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::GridPlacement": { + "identifier": "GridPlacement", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::GridPlacement", + "documentation": " Represents the position of a grid item in a single axis.\n\n There are 3 fields which may be set:\n - `start`: which grid line the item should start at\n - `end`: which grid line the item should end at\n - `span`: how many tracks the item should span\n\n The default `span` is 1. If neither `start` or `end` is set then the item will be placed automatically.\n\n Generally, at most two fields should be set. If all three fields are specified then `span` will be ignored. If `end` specifies an earlier\n grid line than `start` then `end` will be ignored and the item will have a span of 1.\n\n ", + "layout": { + "kind": "Struct", + "name": "GridPlacement", + "fields": [ + { + "name": "start", + "type": { + "option": { + "val": "core::num::NonZeroI16" + } + } + }, + { + "name": "span", + "type": { + "option": { + "val": "core::num::NonZeroU16" + } + } + }, + { + "name": "end", + "type": { + "option": { + "val": "core::num::NonZeroI16" + } + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::GridTrack": { + "identifier": "GridTrack", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::GridTrack", + "documentation": " A [`GridTrack`] is a Row or Column of a CSS Grid. This struct specifies what size the track should be.\n See below for the different \"track sizing functions\" you can specify.", + "layout": { + "kind": "Struct", + "name": "GridTrack", + "fields": [ + { + "name": "min_sizing_function", + "type": { + "val": "bevy_ui::ui_node::MinTrackSizingFunction" + } + }, + { + "name": "max_sizing_function", + "type": { + "val": "bevy_ui::ui_node::MaxTrackSizingFunction" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::GridTrackRepetition": { + "identifier": "GridTrackRepetition", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::GridTrackRepetition", + "documentation": " How many times to repeat a repeated grid track\n\n ", + "layout": [ + { + "kind": "TupleStruct", + "name": "Count", + "fields": [ + { + "type": { + "primitive": "u16" + } + } + ] + }, + { + "kind": "Unit", + "name": "AutoFill" + }, + { + "kind": "Unit", + "name": "AutoFit" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::IgnoreScroll": { + "identifier": "IgnoreScroll", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::IgnoreScroll", + "documentation": " Controls whether a UI element ignores its parent's [`ScrollPosition`] along specific axes.\n\n When an axis is set to `true`, the node will not have the parent’s scroll position applied\n on that axis. This can be used to keep an element visually fixed along one or both axes\n even when its parent UI element is scrolled.", + "layout": { + "kind": "TupleStruct", + "name": "IgnoreScroll", + "fields": [ + { + "type": { + "val": "glam::BVec2" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::JustifyContent": { + "identifier": "JustifyContent", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::JustifyContent", + "documentation": " Used to control how items are distributed.\n - For Flexbox containers, controls alignment of items in the main axis.\n - For CSS Grid containers, controls alignment of grid columns.\n\n ", + "layout": [ + { + "kind": "Unit", + "name": "Default" + }, + { + "kind": "Unit", + "name": "Start" + }, + { + "kind": "Unit", + "name": "End" + }, + { + "kind": "Unit", + "name": "FlexStart" + }, + { + "kind": "Unit", + "name": "FlexEnd" + }, + { + "kind": "Unit", + "name": "Center" + }, + { + "kind": "Unit", + "name": "Stretch" + }, + { + "kind": "Unit", + "name": "SpaceBetween" + }, + { + "kind": "Unit", + "name": "SpaceEvenly" + }, + { + "kind": "Unit", + "name": "SpaceAround" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::JustifyItems": { + "identifier": "JustifyItems", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::JustifyItems", + "documentation": " Used to control how each individual item is aligned by default within the space they're given.\n - For Flexbox containers, this property has no effect. See `justify_content` for main axis alignment of flex items.\n - For CSS Grid containers, sets default inline (horizontal) axis alignment of child items within their grid areas.\n\n ", + "layout": [ + { + "kind": "Unit", + "name": "Default" + }, + { + "kind": "Unit", + "name": "Start" + }, + { + "kind": "Unit", + "name": "End" + }, + { + "kind": "Unit", + "name": "Center" + }, + { + "kind": "Unit", + "name": "Baseline" + }, + { + "kind": "Unit", + "name": "Stretch" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::JustifySelf": { + "identifier": "JustifySelf", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::JustifySelf", + "documentation": " Used to control how the specified item is aligned within the space it's given.\n - For children of flex nodes, this property has no effect. See `justify_content` for main axis alignment of flex items.\n - For CSS Grid items, controls inline (horizontal) axis alignment of a grid item within its grid area.\n\n ", + "layout": [ + { + "kind": "Unit", + "name": "Auto" + }, + { + "kind": "Unit", + "name": "Start" + }, + { + "kind": "Unit", + "name": "End" + }, + { + "kind": "Unit", + "name": "Center" + }, + { + "kind": "Unit", + "name": "Baseline" + }, + { + "kind": "Unit", + "name": "Stretch" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::LayoutConfig": { + "identifier": "LayoutConfig", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::LayoutConfig", + "documentation": " This component can be added to any UI node to modify its layout behavior.", + "layout": { + "kind": "Struct", + "name": "LayoutConfig", + "fields": [ + { + "name": "use_rounding", + "type": { + "primitive": "bool" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::MaxTrackSizingFunction": { + "identifier": "MaxTrackSizingFunction", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::MaxTrackSizingFunction", + "layout": [ + { + "kind": "TupleStruct", + "name": "Px", + "fields": [ + { + "type": { + "primitive": "f32" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Percent", + "fields": [ + { + "type": { + "primitive": "f32" + } + } + ] + }, + { + "kind": "Unit", + "name": "MinContent" + }, + { + "kind": "Unit", + "name": "MaxContent" + }, + { + "kind": "TupleStruct", + "name": "FitContentPx", + "fields": [ + { + "type": { + "primitive": "f32" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "FitContentPercent", + "fields": [ + { + "type": { + "primitive": "f32" + } + } + ] + }, + { + "kind": "Unit", + "name": "Auto" + }, + { + "kind": "TupleStruct", + "name": "Fraction", + "fields": [ + { + "type": { + "primitive": "f32" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "VMin", + "fields": [ + { + "type": { + "primitive": "f32" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "VMax", + "fields": [ + { + "type": { + "primitive": "f32" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Vh", + "fields": [ + { + "type": { + "primitive": "f32" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Vw", + "fields": [ + { + "type": { + "primitive": "f32" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::MinTrackSizingFunction": { + "identifier": "MinTrackSizingFunction", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::MinTrackSizingFunction", + "layout": [ + { + "kind": "TupleStruct", + "name": "Px", + "fields": [ + { + "type": { + "primitive": "f32" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Percent", + "fields": [ + { + "type": { + "primitive": "f32" + } + } + ] + }, + { + "kind": "Unit", + "name": "MinContent" + }, + { + "kind": "Unit", + "name": "MaxContent" + }, + { + "kind": "Unit", + "name": "Auto" + }, + { + "kind": "TupleStruct", + "name": "VMin", + "fields": [ + { + "type": { + "primitive": "f32" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "VMax", + "fields": [ + { + "type": { + "primitive": "f32" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Vh", + "fields": [ + { + "type": { + "primitive": "f32" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Vw", + "fields": [ + { + "type": { + "primitive": "f32" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::Node": { + "identifier": "Node", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::Node", + "documentation": " The base component for UI entities. It describes UI layout and style properties.\n\n When defining new types of UI entities, require [`Node`] to make them behave like UI nodes.\n\n Nodes can be laid out using either Flexbox or CSS Grid Layout.\n\n See below for general learning resources and for documentation on the individual style properties.\n\n ### Flexbox\n\n - [MDN: Basic Concepts of Flexbox](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Basic_Concepts_of_Flexbox)\n - [A Complete Guide To Flexbox](https://css-tricks.com/snippets/css/a-guide-to-flexbox/) by CSS Tricks. This is detailed guide with illustrations and comprehensive written explanation of the different Flexbox properties and how they work.\n - [Flexbox Froggy](https://flexboxfroggy.com/). An interactive tutorial/game that teaches the essential parts of Flexbox in a fun engaging way.\n\n ### CSS Grid\n\n - [MDN: Basic Concepts of Grid Layout](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout/Basic_Concepts_of_Grid_Layout)\n - [A Complete Guide To CSS Grid](https://css-tricks.com/snippets/css/complete-guide-grid/) by CSS Tricks. This is detailed guide with illustrations and comprehensive written explanation of the different CSS Grid properties and how they work.\n - [CSS Grid Garden](https://cssgridgarden.com/). An interactive tutorial/game that teaches the essential parts of CSS Grid in a fun engaging way.\n\n # See also\n\n - [`RelativeCursorPosition`](crate::RelativeCursorPosition) to obtain the cursor position relative to this node\n - [`Interaction`](crate::Interaction) to obtain the interaction state of this node", + "layout": { + "kind": "Struct", + "name": "Node", + "fields": [ + { + "name": "display", + "type": { + "val": "bevy_ui::ui_node::Display" + } + }, + { + "name": "box_sizing", + "type": { + "val": "bevy_ui::ui_node::BoxSizing" + } + }, + { + "name": "position_type", + "type": { + "val": "bevy_ui::ui_node::PositionType" + } + }, + { + "name": "overflow", + "type": { + "val": "bevy_ui::ui_node::Overflow" + } + }, + { + "name": "scrollbar_width", + "type": { + "primitive": "f32" + } + }, + { + "name": "overflow_clip_margin", + "type": { + "val": "bevy_ui::ui_node::OverflowClipMargin" + } + }, + { + "name": "left", + "type": { + "val": "bevy_ui::geometry::Val" + } + }, + { + "name": "right", + "type": { + "val": "bevy_ui::geometry::Val" + } + }, + { + "name": "top", + "type": { + "val": "bevy_ui::geometry::Val" + } + }, + { + "name": "bottom", + "type": { + "val": "bevy_ui::geometry::Val" + } + }, + { + "name": "width", + "type": { + "val": "bevy_ui::geometry::Val" + } + }, + { + "name": "height", + "type": { + "val": "bevy_ui::geometry::Val" + } + }, + { + "name": "min_width", + "type": { + "val": "bevy_ui::geometry::Val" + } + }, + { + "name": "min_height", + "type": { + "val": "bevy_ui::geometry::Val" + } + }, + { + "name": "max_width", + "type": { + "val": "bevy_ui::geometry::Val" + } + }, + { + "name": "max_height", + "type": { + "val": "bevy_ui::geometry::Val" + } + }, + { + "name": "aspect_ratio", + "type": { + "option": { + "primitive": "f32" + } + } + }, + { + "name": "align_items", + "type": { + "val": "bevy_ui::ui_node::AlignItems" + } + }, + { + "name": "justify_items", + "type": { + "val": "bevy_ui::ui_node::JustifyItems" + } + }, + { + "name": "align_self", + "type": { + "val": "bevy_ui::ui_node::AlignSelf" + } + }, + { + "name": "justify_self", + "type": { + "val": "bevy_ui::ui_node::JustifySelf" + } + }, + { + "name": "align_content", + "type": { + "val": "bevy_ui::ui_node::AlignContent" + } + }, + { + "name": "justify_content", + "type": { + "val": "bevy_ui::ui_node::JustifyContent" + } + }, + { + "name": "margin", + "type": { + "val": "bevy_ui::geometry::UiRect" + } + }, + { + "name": "padding", + "type": { + "val": "bevy_ui::geometry::UiRect" + } + }, + { + "name": "border", + "type": { + "val": "bevy_ui::geometry::UiRect" + } + }, + { + "name": "border_radius", + "type": { + "val": "bevy_ui::ui_node::BorderRadius" + } + }, + { + "name": "flex_direction", + "type": { + "val": "bevy_ui::ui_node::FlexDirection" + } + }, + { + "name": "flex_wrap", + "type": { + "val": "bevy_ui::ui_node::FlexWrap" + } + }, + { + "name": "flex_grow", + "type": { + "primitive": "f32" + } + }, + { + "name": "flex_shrink", + "type": { + "primitive": "f32" + } + }, + { + "name": "flex_basis", + "type": { + "val": "bevy_ui::geometry::Val" + } + }, + { + "name": "row_gap", + "type": { + "val": "bevy_ui::geometry::Val" + } + }, + { + "name": "column_gap", + "type": { + "val": "bevy_ui::geometry::Val" + } + }, + { + "name": "grid_auto_flow", + "type": { + "val": "bevy_ui::ui_node::GridAutoFlow" + } + }, + { + "name": "grid_template_rows", + "type": { + "vec": { + "val": "bevy_ui::ui_node::RepeatedGridTrack" + } + } + }, + { + "name": "grid_template_columns", + "type": { + "vec": { + "val": "bevy_ui::ui_node::RepeatedGridTrack" + } + } + }, + { + "name": "grid_auto_rows", + "type": { + "vec": { + "val": "bevy_ui::ui_node::GridTrack" + } + } + }, + { + "name": "grid_auto_columns", + "type": { + "vec": { + "val": "bevy_ui::ui_node::GridTrack" + } + } + }, + { + "name": "grid_row", + "type": { + "val": "bevy_ui::ui_node::GridPlacement" + } + }, + { + "name": "grid_column", + "type": { + "val": "bevy_ui::ui_node::GridPlacement" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::Outline": { + "identifier": "Outline", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::Outline", + "documentation": " The [`Outline`] component adds an outline outside the edge of a UI node.\n Outlines do not take up space in the layout.\n\n To add an [`Outline`] to a ui node you can spawn a `(Node, Outline)` tuple bundle:\n ```\n # use bevy_ecs::prelude::*;\n # use bevy_ui::prelude::*;\n # use bevy_color::palettes::basic::{RED, BLUE};\n fn setup_ui(mut commands: Commands) {\n commands.spawn((\n Node {\n width: Val::Px(100.),\n height: Val::Px(100.),\n ..Default::default()\n },\n BackgroundColor(BLUE.into()),\n Outline::new(Val::Px(10.), Val::ZERO, RED.into())\n ));\n }\n ```\n\n [`Outline`] components can also be added later to existing UI nodes:\n ```\n # use bevy_ecs::prelude::*;\n # use bevy_ui::prelude::*;\n # use bevy_color::Color;\n fn outline_hovered_button_system(\n mut commands: Commands,\n mut node_query: Query<(Entity, &Interaction, Option<&mut Outline>), Changed>,\n ) {\n for (entity, interaction, mut maybe_outline) in node_query.iter_mut() {\n let outline_color =\n if matches!(*interaction, Interaction::Hovered) {\n Color::WHITE\n } else {\n Color::NONE\n };\n if let Some(mut outline) = maybe_outline {\n outline.color = outline_color;\n } else {\n commands.entity(entity).insert(Outline::new(Val::Px(10.), Val::ZERO, outline_color));\n }\n }\n }\n ```\n Inserting and removing an [`Outline`] component repeatedly will result in table moves, so it is generally preferable to\n set `Outline::color` to [`Color::NONE`] to hide an outline.", + "layout": { + "kind": "Struct", + "name": "Outline", + "fields": [ + { + "name": "width", + "type": { + "val": "bevy_ui::geometry::Val" + } + }, + { + "name": "offset", + "type": { + "val": "bevy_ui::geometry::Val" + } + }, + { + "name": "color", + "type": { + "val": "bevy_color::color::Color" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::Overflow": { + "identifier": "Overflow", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::Overflow", + "documentation": " Whether to show or hide overflowing items", + "layout": { + "kind": "Struct", + "name": "Overflow", + "fields": [ + { + "name": "x", + "type": { + "val": "bevy_ui::ui_node::OverflowAxis" + } + }, + { + "name": "y", + "type": { + "val": "bevy_ui::ui_node::OverflowAxis" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::OverflowAxis": { + "identifier": "OverflowAxis", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::OverflowAxis", + "documentation": " Whether to show or hide overflowing items", + "layout": [ + { + "kind": "Unit", + "name": "Visible" + }, + { + "kind": "Unit", + "name": "Clip" + }, + { + "kind": "Unit", + "name": "Hidden" + }, + { + "kind": "Unit", + "name": "Scroll" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::OverflowClipBox": { + "identifier": "OverflowClipBox", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::OverflowClipBox", + "documentation": " Used to determine the bounds of the visible area when a UI node is clipped.", + "layout": [ + { + "kind": "Unit", + "name": "ContentBox" + }, + { + "kind": "Unit", + "name": "PaddingBox" + }, + { + "kind": "Unit", + "name": "BorderBox" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::OverflowClipMargin": { + "identifier": "OverflowClipMargin", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::OverflowClipMargin", + "documentation": " The bounds of the visible area when a UI node is clipped.", + "layout": { + "kind": "Struct", + "name": "OverflowClipMargin", + "fields": [ + { + "name": "visual_box", + "type": { + "val": "bevy_ui::ui_node::OverflowClipBox" + } + }, + { + "name": "margin", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::PositionType": { + "identifier": "PositionType", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::PositionType", + "documentation": " The strategy used to position this node", + "layout": [ + { + "kind": "Unit", + "name": "Relative" + }, + { + "kind": "Unit", + "name": "Absolute" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::RepeatedGridTrack": { + "identifier": "RepeatedGridTrack", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::RepeatedGridTrack", + "documentation": " Represents a *possibly* repeated [`GridTrack`].\n\n The repetition parameter can either be:\n - The integer `1`, in which case the track is non-repeated.\n - a `u16` count to repeat the track N times.\n - A `GridTrackRepetition::AutoFit` or `GridTrackRepetition::AutoFill`.\n\n Note: that in the common case you want a non-repeating track (repetition count 1), you may use the constructor methods on [`GridTrack`]\n to create a `RepeatedGridTrack`. i.e. `GridTrack::px(10.0)` is equivalent to `RepeatedGridTrack::px(1, 10.0)`.\n\n You may only use one auto-repetition per track list. And if your track list contains an auto repetition\n then all tracks (in and outside of the repetition) must be fixed size (px or percent). Integer repetitions are just shorthand for writing out\n N tracks longhand and are not subject to the same limitations.", + "layout": { + "kind": "Struct", + "name": "RepeatedGridTrack", + "fields": [ + { + "name": "repetition", + "type": { + "val": "bevy_ui::ui_node::GridTrackRepetition" + } + }, + { + "name": "tracks", + "type": { + "vec": { + "val": "bevy_ui::ui_node::GridTrack" + } + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::ResolvedBorderRadius": { + "identifier": "ResolvedBorderRadius", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::ResolvedBorderRadius", + "documentation": " Represents the resolved border radius values for a UI node.\n\n The values are in physical pixels.", + "layout": { + "kind": "Struct", + "name": "ResolvedBorderRadius", + "fields": [ + { + "name": "top_left", + "type": { + "primitive": "f32" + } + }, + { + "name": "top_right", + "type": { + "primitive": "f32" + } + }, + { + "name": "bottom_right", + "type": { + "primitive": "f32" + } + }, + { + "name": "bottom_left", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::ScrollPosition": { + "identifier": "ScrollPosition", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::ScrollPosition", + "documentation": " The scroll position of the node. Values are in logical pixels, increasing from top-left to bottom-right.\n\n Increasing the x-coordinate causes the scrolled content to visibly move left on the screen, while increasing the y-coordinate causes the scrolled content to move up.\n This might seem backwards, however what's really happening is that\n the scroll position is moving the visible \"window\" in the local coordinate system of the scrolled content -\n moving the window down causes the content to move up.\n\n Updating the values of `ScrollPosition` will reposition the children of the node by the offset amount in logical pixels.\n `ScrollPosition` may be updated by the layout system when a layout change makes a previously valid `ScrollPosition` invalid.\n Changing this does nothing on a `Node` without setting at least one `OverflowAxis` to `OverflowAxis::Scroll`.", + "layout": { + "kind": "TupleStruct", + "name": "ScrollPosition", + "fields": [ + { + "type": { + "val": "glam::Vec2" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::ShadowStyle": { + "identifier": "ShadowStyle", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::ShadowStyle", + "layout": { + "kind": "Struct", + "name": "ShadowStyle", + "fields": [ + { + "name": "color", + "type": { + "val": "bevy_color::color::Color" + } + }, + { + "name": "x_offset", + "type": { + "val": "bevy_ui::geometry::Val" + } + }, + { + "name": "y_offset", + "type": { + "val": "bevy_ui::geometry::Val" + } + }, + { + "name": "spread_radius", + "type": { + "val": "bevy_ui::geometry::Val" + } + }, + { + "name": "blur_radius", + "type": { + "val": "bevy_ui::geometry::Val" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::UiTargetCamera": { + "identifier": "UiTargetCamera", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::UiTargetCamera", + "documentation": " Indicates that this root [`Node`] entity should be rendered to a specific camera.\n\n UI then will be laid out respecting the camera's viewport and scale factor, and\n rendered to this camera's [`bevy_camera::RenderTarget`].\n\n Setting this component on a non-root node will have no effect. It will be overridden\n by the root node's component.\n\n Root node's without an explicit [`UiTargetCamera`] will be rendered to the default UI camera,\n which is either a single camera with the [`IsDefaultUiCamera`] marker component or the highest\n order camera targeting the primary window.", + "layout": { + "kind": "TupleStruct", + "name": "UiTargetCamera", + "fields": [ + { + "type": { + "val": "bevy_ecs::entity::Entity" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_node::ZIndex": { + "identifier": "ZIndex", + "crate": "bevy_ui", + "path": "bevy_ui::ui_node::ZIndex", + "documentation": " Indicates that this [`Node`] entity's front-to-back ordering is not controlled solely\n by its location in the UI hierarchy. A node with a higher z-index will appear on top\n of sibling nodes with a lower z-index.\n\n UI nodes that have the same z-index will appear according to the order in which they\n appear in the UI hierarchy. In such a case, the last node to be added to its parent\n will appear in front of its siblings.\n\n Nodes without this component will be treated as if they had a value of\n [ZIndex][ZIndex]\\(0\\).\n\n Use [`GlobalZIndex`] if you need to order separate UI hierarchies or nodes that are\n not siblings in a given UI hierarchy.", + "layout": { + "kind": "TupleStruct", + "name": "ZIndex", + "fields": [ + { + "type": { + "primitive": "i32" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_transform::UiGlobalTransform": { + "identifier": "UiGlobalTransform", + "crate": "bevy_ui", + "path": "bevy_ui::ui_transform::UiGlobalTransform", + "documentation": " Absolute 2D transform for UI nodes\n\n [`UiGlobalTransform`]s are updated from [`UiTransform`] and [`Node`](crate::ui_node::Node)\n in [`ui_layout_system`](crate::layout::ui_layout_system)", + "layout": { + "kind": "TupleStruct", + "name": "UiGlobalTransform", + "fields": [ + { + "type": { + "val": "glam::Affine2" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_transform::UiTransform": { + "identifier": "UiTransform", + "crate": "bevy_ui", + "path": "bevy_ui::ui_transform::UiTransform", + "documentation": " Relative 2D transform for UI nodes\n\n [`UiGlobalTransform`] is automatically inserted whenever [`UiTransform`] is inserted.", + "layout": { + "kind": "Struct", + "name": "UiTransform", + "fields": [ + { + "name": "translation", + "type": { + "val": "bevy_ui::ui_transform::Val2" + } + }, + { + "name": "scale", + "type": { + "val": "glam::Vec2" + } + }, + { + "name": "rotation", + "type": { + "val": "bevy_math::rotation2d::Rot2" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::ui_transform::Val2": { + "identifier": "Val2", + "crate": "bevy_ui", + "path": "bevy_ui::ui_transform::Val2", + "documentation": " A pair of [`Val`]s used to represent a 2-dimensional size or offset.", + "layout": { + "kind": "Struct", + "name": "Val2", + "fields": [ + { + "name": "x", + "type": { + "val": "bevy_ui::geometry::Val" + } + }, + { + "name": "y", + "type": { + "val": "bevy_ui::geometry::Val" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::widget::button::Button": { + "identifier": "Button", + "crate": "bevy_ui", + "path": "bevy_ui::widget::button::Button", + "documentation": " Marker struct for buttons", + "layout": { + "kind": "Struct", + "name": "Button" + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::widget::image::ImageNode": { + "identifier": "ImageNode", + "crate": "bevy_ui", + "path": "bevy_ui::widget::image::ImageNode", + "documentation": " A UI Node that renders an image.", + "layout": { + "kind": "Struct", + "name": "ImageNode", + "fields": [ + { + "name": "color", + "type": { + "val": "bevy_color::color::Color" + } + }, + { + "name": "image", + "type": { + "val": "bevy_asset::handle::Handle" + } + }, + { + "name": "texture_atlas", + "type": { + "option": { + "val": "bevy_image::texture_atlas::TextureAtlas" + } + } + }, + { + "name": "flip_x", + "type": { + "primitive": "bool" + } + }, + { + "name": "flip_y", + "type": { + "primitive": "bool" + } + }, + { + "name": "rect", + "type": { + "option": { + "val": "bevy_math::rects::rect::Rect" + } + } + }, + { + "name": "image_mode", + "type": { + "val": "bevy_ui::widget::image::NodeImageMode" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::widget::image::ImageNodeSize": { + "identifier": "ImageNodeSize", + "crate": "bevy_ui", + "path": "bevy_ui::widget::image::ImageNodeSize", + "documentation": " The size of the image's texture\n\n This component is updated automatically by [`update_image_content_size_system`]", + "layout": { + "kind": "Struct", + "name": "ImageNodeSize", + "fields": [ + { + "name": "size", + "type": { + "val": "glam::UVec2" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::widget::image::NodeImageMode": { + "identifier": "NodeImageMode", + "crate": "bevy_ui", + "path": "bevy_ui::widget::image::NodeImageMode", + "documentation": " Controls how the image is altered to fit within the layout and how the layout algorithm determines the space in the layout for the image", + "layout": [ + { + "kind": "Unit", + "name": "Auto" + }, + { + "kind": "Unit", + "name": "Stretch" + }, + { + "kind": "TupleStruct", + "name": "Sliced", + "fields": [ + { + "type": { + "val": "bevy_sprite::texture_slice::slicer::TextureSlicer" + } + } + ] + }, + { + "kind": "Struct", + "name": "Tiled", + "fields": [ + { + "name": "tile_x", + "type": { + "primitive": "bool" + } + }, + { + "name": "tile_y", + "type": { + "primitive": "bool" + } + }, + { + "name": "stretch_value", + "type": { + "primitive": "f32" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::widget::label::Label": { + "identifier": "Label", + "crate": "bevy_ui", + "path": "bevy_ui::widget::label::Label", + "documentation": " Marker struct for labels", + "layout": { + "kind": "Struct", + "name": "Label" + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::widget::text::Text": { + "identifier": "Text", + "crate": "bevy_ui", + "path": "bevy_ui::widget::text::Text", + "documentation": " The top-level UI text component.\n\n Adding [`Text`] to an entity will pull in required components for setting up a UI text node.\n\n The string in this component is the first 'text span' in a hierarchy of text spans that are collected into\n a [`ComputedTextBlock`]. See [`TextSpan`](bevy_text::TextSpan) for the component used by children of entities with [`Text`].\n\n Note that [`Transform`](bevy_transform::components::Transform) on this entity is managed automatically by the UI layout system.\n\n\n ```\n # use bevy_asset::Handle;\n # use bevy_color::Color;\n # use bevy_color::palettes::basic::BLUE;\n # use bevy_ecs::world::World;\n # use bevy_text::{Font, Justify, TextLayout, TextFont, TextColor, TextSpan};\n # use bevy_ui::prelude::Text;\n #\n # let font_handle: Handle = Default::default();\n # let mut world = World::default();\n #\n // Basic usage.\n world.spawn(Text::new(\"hello world!\"));\n\n // With non-default style.\n world.spawn((\n Text::new(\"hello world!\"),\n TextFont {\n font: font_handle.clone().into(),\n font_size: 60.0,\n ..Default::default()\n },\n TextColor(BLUE.into()),\n ));\n\n // With text justification.\n world.spawn((\n Text::new(\"hello world\\nand bevy!\"),\n TextLayout::new_with_justify(Justify::Center)\n ));\n\n // With spans\n world.spawn(Text::new(\"hello \")).with_children(|parent| {\n parent.spawn(TextSpan::new(\"world\"));\n parent.spawn((TextSpan::new(\"!\"), TextColor(BLUE.into())));\n });\n ```", + "layout": { + "kind": "TupleStruct", + "name": "Text", + "fields": [ + { + "type": { + "primitive": "string" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::widget::text::TextNodeFlags": { + "identifier": "TextNodeFlags", + "crate": "bevy_ui", + "path": "bevy_ui::widget::text::TextNodeFlags", + "documentation": " UI text system flags.\n\n Used internally by [`measure_text_system`] and [`text_system`] to schedule text for processing.", + "layout": { + "kind": "Struct", + "name": "TextNodeFlags", + "fields": [ + { + "name": "needs_measure_fn", + "type": { + "primitive": "bool" + } + }, + { + "name": "needs_recompute", + "type": { + "primitive": "bool" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::widget::text::TextShadow": { + "identifier": "TextShadow", + "crate": "bevy_ui", + "path": "bevy_ui::widget::text::TextShadow", + "documentation": " Adds a shadow behind text\n\n Use the `Text2dShadow` component for `Text2d` shadows", + "layout": { + "kind": "Struct", + "name": "TextShadow", + "fields": [ + { + "name": "offset", + "type": { + "val": "glam::Vec2" + } + }, + { + "name": "color", + "type": { + "val": "bevy_color::color::Color" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ui::widget::viewport::ViewportNode": { + "identifier": "ViewportNode", + "crate": "bevy_ui", + "path": "bevy_ui::widget::viewport::ViewportNode", + "documentation": " Component used to render a [`RenderTarget`] to a node.\n\n # See Also\n\n [`update_viewport_render_target_size`]", + "layout": { + "kind": "Struct", + "name": "ViewportNode", + "fields": [ + { + "name": "camera", + "type": { + "val": "bevy_ecs::entity::Entity" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::cursor::CursorIcon": { + "identifier": "CursorIcon", + "crate": "bevy_window", + "path": "bevy_window::cursor::CursorIcon", + "documentation": " Insert into a window entity to set the cursor for that window.", + "layout": [ + { + "kind": "TupleStruct", + "name": "Custom", + "fields": [ + { + "type": { + "val": "bevy_window::cursor::custom_cursor::CustomCursor" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "System", + "fields": [ + { + "type": { + "val": "bevy_window::cursor::system_cursor::SystemCursorIcon" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::cursor::custom_cursor::CustomCursor": { + "identifier": "CustomCursor", + "crate": "bevy_window", + "path": "bevy_window::cursor::custom_cursor::CustomCursor", + "documentation": " Custom cursor image data.", + "layout": [ + { + "kind": "TupleStruct", + "name": "Image", + "fields": [ + { + "type": { + "val": "bevy_window::cursor::custom_cursor::CustomCursorImage" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Url", + "fields": [ + { + "type": { + "val": "bevy_window::cursor::custom_cursor::CustomCursorUrl" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::cursor::custom_cursor::CustomCursorImage": { + "identifier": "CustomCursorImage", + "crate": "bevy_window", + "path": "bevy_window::cursor::custom_cursor::CustomCursorImage", + "documentation": " A custom cursor created from an image.", + "layout": { + "kind": "Struct", + "name": "CustomCursorImage", + "fields": [ + { + "name": "handle", + "type": { + "val": "bevy_asset::handle::Handle" + } + }, + { + "name": "texture_atlas", + "type": { + "option": { + "val": "bevy_image::texture_atlas::TextureAtlas" + } + } + }, + { + "name": "flip_x", + "type": { + "primitive": "bool" + } + }, + { + "name": "flip_y", + "type": { + "primitive": "bool" + } + }, + { + "name": "rect", + "type": { + "option": { + "val": "bevy_math::rects::urect::URect" + } + } + }, + { + "name": "hotspot", + "type": { + "tuple": [ + { + "primitive": "u16" + }, + { + "primitive": "u16" + } + ] + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::cursor::custom_cursor::CustomCursorUrl": { + "identifier": "CustomCursorUrl", + "crate": "bevy_window", + "path": "bevy_window::cursor::custom_cursor::CustomCursorUrl", + "documentation": " A custom cursor created from a URL. Note that this currently only works on the web.", + "layout": { + "kind": "Struct", + "name": "CustomCursorUrl", + "fields": [ + { + "name": "url", + "type": { + "primitive": "string" + } + }, + { + "name": "hotspot", + "type": { + "tuple": [ + { + "primitive": "u16" + }, + { + "primitive": "u16" + } + ] + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::cursor::system_cursor::SystemCursorIcon": { + "identifier": "SystemCursorIcon", + "crate": "bevy_window", + "path": "bevy_window::cursor::system_cursor::SystemCursorIcon", + "documentation": " The icon to display for a window.\n\n Examples of all of these cursors can be found [here](https://www.w3schools.com/cssref/playit.php?filename=playcss_cursor&preval=crosshair).\n This `enum` is simply a copy of a similar `enum` found in [`winit`](https://docs.rs/winit/latest/winit/window/enum.CursorIcon.html).\n `winit`, in turn, is based upon the [CSS3 UI spec](https://www.w3.org/TR/css-ui-3/#cursor).\n\n See the [`window_settings`] example for usage.\n\n [`window_settings`]: https://github.com/bevyengine/bevy/blob/latest/examples/window/window_settings.rs", + "layout": [ + { + "kind": "Unit", + "name": "Default" + }, + { + "kind": "Unit", + "name": "ContextMenu" + }, + { + "kind": "Unit", + "name": "Help" + }, + { + "kind": "Unit", + "name": "Pointer" + }, + { + "kind": "Unit", + "name": "Progress" + }, + { + "kind": "Unit", + "name": "Wait" + }, + { + "kind": "Unit", + "name": "Cell" + }, + { + "kind": "Unit", + "name": "Crosshair" + }, + { + "kind": "Unit", + "name": "Text" + }, + { + "kind": "Unit", + "name": "VerticalText" + }, + { + "kind": "Unit", + "name": "Alias" + }, + { + "kind": "Unit", + "name": "Copy" + }, + { + "kind": "Unit", + "name": "Move" + }, + { + "kind": "Unit", + "name": "NoDrop" + }, + { + "kind": "Unit", + "name": "NotAllowed" + }, + { + "kind": "Unit", + "name": "Grab" + }, + { + "kind": "Unit", + "name": "Grabbing" + }, + { + "kind": "Unit", + "name": "EResize" + }, + { + "kind": "Unit", + "name": "NResize" + }, + { + "kind": "Unit", + "name": "NeResize" + }, + { + "kind": "Unit", + "name": "NwResize" + }, + { + "kind": "Unit", + "name": "SResize" + }, + { + "kind": "Unit", + "name": "SeResize" + }, + { + "kind": "Unit", + "name": "SwResize" + }, + { + "kind": "Unit", + "name": "WResize" + }, + { + "kind": "Unit", + "name": "EwResize" + }, + { + "kind": "Unit", + "name": "NsResize" + }, + { + "kind": "Unit", + "name": "NeswResize" + }, + { + "kind": "Unit", + "name": "NwseResize" + }, + { + "kind": "Unit", + "name": "ColResize" + }, + { + "kind": "Unit", + "name": "RowResize" + }, + { + "kind": "Unit", + "name": "AllScroll" + }, + { + "kind": "Unit", + "name": "ZoomIn" + }, + { + "kind": "Unit", + "name": "ZoomOut" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::event::AppLifecycle": { + "identifier": "AppLifecycle", + "crate": "bevy_window", + "path": "bevy_window::event::AppLifecycle", + "documentation": " Application lifetime events", + "layout": [ + { + "kind": "Unit", + "name": "Idle" + }, + { + "kind": "Unit", + "name": "Running" + }, + { + "kind": "Unit", + "name": "WillSuspend" + }, + { + "kind": "Unit", + "name": "Suspended" + }, + { + "kind": "Unit", + "name": "WillResume" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::event::CursorEntered": { + "identifier": "CursorEntered", + "crate": "bevy_window", + "path": "bevy_window::event::CursorEntered", + "documentation": " An event that is sent whenever the user's cursor enters a window.", + "layout": { + "kind": "Struct", + "name": "CursorEntered", + "fields": [ + { + "name": "window", + "type": { + "val": "bevy_ecs::entity::Entity" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::event::CursorLeft": { + "identifier": "CursorLeft", + "crate": "bevy_window", + "path": "bevy_window::event::CursorLeft", + "documentation": " An event that is sent whenever the user's cursor leaves a window.", + "layout": { + "kind": "Struct", + "name": "CursorLeft", + "fields": [ + { + "name": "window", + "type": { + "val": "bevy_ecs::entity::Entity" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::event::CursorMoved": { + "identifier": "CursorMoved", + "crate": "bevy_window", + "path": "bevy_window::event::CursorMoved", + "documentation": " An event reporting that the mouse cursor has moved inside a window.\n\n The event is sent only if the cursor is over one of the application's windows.\n It is the translated version of [`WindowEvent::CursorMoved`] from the `winit` crate with the addition of `delta`.\n\n Not to be confused with the `MouseMotion` event from `bevy_input`.\n\n Because the range of data is limited by the window area and it may have been transformed by the OS to implement certain effects like acceleration,\n you should not use it for non-cursor-like behavior such as 3D camera control. Please see `MouseMotion` instead.\n\n [`WindowEvent::CursorMoved`]: https://docs.rs/winit/latest/winit/event/enum.WindowEvent.html#variant.CursorMoved", + "layout": { + "kind": "Struct", + "name": "CursorMoved", + "fields": [ + { + "name": "window", + "type": { + "val": "bevy_ecs::entity::Entity" + } + }, + { + "name": "position", + "type": { + "val": "glam::Vec2" + } + }, + { + "name": "delta", + "type": { + "option": { + "val": "glam::Vec2" + } + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::event::FileDragAndDrop": { + "identifier": "FileDragAndDrop", + "crate": "bevy_window", + "path": "bevy_window::event::FileDragAndDrop", + "documentation": " Events related to files being dragged and dropped on a window.", + "layout": [ + { + "kind": "Struct", + "name": "DroppedFile", + "fields": [ + { + "name": "window", + "type": { + "val": "bevy_ecs::entity::Entity" + } + }, + { + "name": "path_buf", + "type": { + "primitive": "pathBuf" + } + } + ] + }, + { + "kind": "Struct", + "name": "HoveredFile", + "fields": [ + { + "name": "window", + "type": { + "val": "bevy_ecs::entity::Entity" + } + }, + { + "name": "path_buf", + "type": { + "primitive": "pathBuf" + } + } + ] + }, + { + "kind": "Struct", + "name": "HoveredFileCanceled", + "fields": [ + { + "name": "window", + "type": { + "val": "bevy_ecs::entity::Entity" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::event::Ime": { + "identifier": "Ime", + "crate": "bevy_window", + "path": "bevy_window::event::Ime", + "documentation": " An Input Method Editor event.\n\n This event is the translated version of the `WindowEvent::Ime` from the `winit` crate.\n\n It is only sent if IME was enabled on the window with [`Window::ime_enabled`](crate::window::Window::ime_enabled).", + "layout": [ + { + "kind": "Struct", + "name": "Preedit", + "fields": [ + { + "name": "window", + "type": { + "val": "bevy_ecs::entity::Entity" + } + }, + { + "name": "value", + "type": { + "primitive": "string" + } + }, + { + "name": "cursor", + "type": { + "option": { + "tuple": [ + { + "primitive": "usize" + }, + { + "primitive": "usize" + } + ] + } + } + } + ] + }, + { + "kind": "Struct", + "name": "Commit", + "fields": [ + { + "name": "window", + "type": { + "val": "bevy_ecs::entity::Entity" + } + }, + { + "name": "value", + "type": { + "primitive": "string" + } + } + ] + }, + { + "kind": "Struct", + "name": "Enabled", + "fields": [ + { + "name": "window", + "type": { + "val": "bevy_ecs::entity::Entity" + } + } + ] + }, + { + "kind": "Struct", + "name": "Disabled", + "fields": [ + { + "name": "window", + "type": { + "val": "bevy_ecs::entity::Entity" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::event::RequestRedraw": { + "identifier": "RequestRedraw", + "crate": "bevy_window", + "path": "bevy_window::event::RequestRedraw", + "documentation": " An event that indicates all of the application's windows should be redrawn,\n even if their control flow is set to `Wait` and there have been no window events.", + "layout": { + "kind": "Struct", + "name": "RequestRedraw" + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::event::WindowBackendScaleFactorChanged": { + "identifier": "WindowBackendScaleFactorChanged", + "crate": "bevy_window", + "path": "bevy_window::event::WindowBackendScaleFactorChanged", + "documentation": " An event that indicates a window's OS-reported scale factor has changed.", + "layout": { + "kind": "Struct", + "name": "WindowBackendScaleFactorChanged", + "fields": [ + { + "name": "window", + "type": { + "val": "bevy_ecs::entity::Entity" + } + }, + { + "name": "scale_factor", + "type": { + "primitive": "f64" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::event::WindowCloseRequested": { + "identifier": "WindowCloseRequested", + "crate": "bevy_window", + "path": "bevy_window::event::WindowCloseRequested", + "documentation": " An event that is sent whenever the operating systems requests that a window\n be closed. This will be sent when the close button of the window is pressed.\n\n If the default [`WindowPlugin`] is used, these events are handled\n by closing the corresponding [`Window`].\n To disable this behavior, set `close_when_requested` on the [`WindowPlugin`]\n to `false`.\n\n [`WindowPlugin`]: crate::WindowPlugin\n [`Window`]: crate::Window", + "layout": { + "kind": "Struct", + "name": "WindowCloseRequested", + "fields": [ + { + "name": "window", + "type": { + "val": "bevy_ecs::entity::Entity" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::event::WindowClosed": { + "identifier": "WindowClosed", + "crate": "bevy_window", + "path": "bevy_window::event::WindowClosed", + "documentation": " An event that is sent whenever a window is closed. This will be sent when\n the window entity loses its [`Window`](crate::window::Window) component or is despawned.", + "layout": { + "kind": "Struct", + "name": "WindowClosed", + "fields": [ + { + "name": "window", + "type": { + "val": "bevy_ecs::entity::Entity" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::event::WindowClosing": { + "identifier": "WindowClosing", + "crate": "bevy_window", + "path": "bevy_window::event::WindowClosing", + "documentation": " An event that is sent whenever a window is closing. This will be sent when\n after a [`WindowCloseRequested`] event is received and the window is in the process of closing.", + "layout": { + "kind": "Struct", + "name": "WindowClosing", + "fields": [ + { + "name": "window", + "type": { + "val": "bevy_ecs::entity::Entity" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::event::WindowCreated": { + "identifier": "WindowCreated", + "crate": "bevy_window", + "path": "bevy_window::event::WindowCreated", + "documentation": " An event that is sent whenever a new window is created.\n\n To create a new window, spawn an entity with a [`Window`](`crate::Window`) on it.", + "layout": { + "kind": "Struct", + "name": "WindowCreated", + "fields": [ + { + "name": "window", + "type": { + "val": "bevy_ecs::entity::Entity" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::event::WindowDestroyed": { + "identifier": "WindowDestroyed", + "crate": "bevy_window", + "path": "bevy_window::event::WindowDestroyed", + "documentation": " An event that is sent whenever a window is destroyed by the underlying window system.\n\n Note that if your application only has a single window, this event may be your last chance to\n persist state before the application terminates.", + "layout": { + "kind": "Struct", + "name": "WindowDestroyed", + "fields": [ + { + "name": "window", + "type": { + "val": "bevy_ecs::entity::Entity" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::event::WindowEvent": { + "identifier": "WindowEvent", + "crate": "bevy_window", + "path": "bevy_window::event::WindowEvent", + "documentation": " Wraps all `bevy_window` and `bevy_input` events in a common enum.\n\n Read these events with `MessageReader` if you need to\n access window events in the order they were received from the\n operating system. Otherwise, the event types are individually\n readable with `MessageReader` (e.g. `MessageReader`).", + "layout": [ + { + "kind": "TupleStruct", + "name": "AppLifecycle", + "fields": [ + { + "type": { + "val": "bevy_window::event::AppLifecycle" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "CursorEntered", + "fields": [ + { + "type": { + "val": "bevy_window::event::CursorEntered" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "CursorLeft", + "fields": [ + { + "type": { + "val": "bevy_window::event::CursorLeft" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "CursorMoved", + "fields": [ + { + "type": { + "val": "bevy_window::event::CursorMoved" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "FileDragAndDrop", + "fields": [ + { + "type": { + "val": "bevy_window::event::FileDragAndDrop" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Ime", + "fields": [ + { + "type": { + "val": "bevy_window::event::Ime" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "RequestRedraw", + "fields": [ + { + "type": { + "val": "bevy_window::event::RequestRedraw" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "WindowBackendScaleFactorChanged", + "fields": [ + { + "type": { + "val": "bevy_window::event::WindowBackendScaleFactorChanged" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "WindowCloseRequested", + "fields": [ + { + "type": { + "val": "bevy_window::event::WindowCloseRequested" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "WindowCreated", + "fields": [ + { + "type": { + "val": "bevy_window::event::WindowCreated" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "WindowDestroyed", + "fields": [ + { + "type": { + "val": "bevy_window::event::WindowDestroyed" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "WindowFocused", + "fields": [ + { + "type": { + "val": "bevy_window::event::WindowFocused" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "WindowMoved", + "fields": [ + { + "type": { + "val": "bevy_window::event::WindowMoved" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "WindowOccluded", + "fields": [ + { + "type": { + "val": "bevy_window::event::WindowOccluded" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "WindowResized", + "fields": [ + { + "type": { + "val": "bevy_window::event::WindowResized" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "WindowScaleFactorChanged", + "fields": [ + { + "type": { + "val": "bevy_window::event::WindowScaleFactorChanged" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "WindowThemeChanged", + "fields": [ + { + "type": { + "val": "bevy_window::event::WindowThemeChanged" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "MouseButtonInput", + "fields": [ + { + "type": { + "val": "bevy_input::mouse::MouseButtonInput" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "MouseMotion", + "fields": [ + { + "type": { + "val": "bevy_input::mouse::MouseMotion" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "MouseWheel", + "fields": [ + { + "type": { + "val": "bevy_input::mouse::MouseWheel" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "PinchGesture", + "fields": [ + { + "type": { + "val": "bevy_input::gestures::PinchGesture" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "RotationGesture", + "fields": [ + { + "type": { + "val": "bevy_input::gestures::RotationGesture" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "DoubleTapGesture", + "fields": [ + { + "type": { + "val": "bevy_input::gestures::DoubleTapGesture" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "PanGesture", + "fields": [ + { + "type": { + "val": "bevy_input::gestures::PanGesture" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "TouchInput", + "fields": [ + { + "type": { + "val": "bevy_input::touch::TouchInput" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "KeyboardInput", + "fields": [ + { + "type": { + "val": "bevy_input::keyboard::KeyboardInput" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "KeyboardFocusLost", + "fields": [ + { + "type": { + "val": "bevy_input::keyboard::KeyboardFocusLost" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::event::WindowFocused": { + "identifier": "WindowFocused", + "crate": "bevy_window", + "path": "bevy_window::event::WindowFocused", + "documentation": " An event that indicates a window has received or lost focus.", + "layout": { + "kind": "Struct", + "name": "WindowFocused", + "fields": [ + { + "name": "window", + "type": { + "val": "bevy_ecs::entity::Entity" + } + }, + { + "name": "focused", + "type": { + "primitive": "bool" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::event::WindowMoved": { + "identifier": "WindowMoved", + "crate": "bevy_window", + "path": "bevy_window::event::WindowMoved", + "documentation": " An event that is sent when a window is repositioned in physical pixels.", + "layout": { + "kind": "Struct", + "name": "WindowMoved", + "fields": [ + { + "name": "window", + "type": { + "val": "bevy_ecs::entity::Entity" + } + }, + { + "name": "position", + "type": { + "val": "glam::IVec2" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::event::WindowOccluded": { + "identifier": "WindowOccluded", + "crate": "bevy_window", + "path": "bevy_window::event::WindowOccluded", + "documentation": " The window has been occluded (completely hidden from view).\n\n This is different to window visibility as it depends on\n whether the window is closed, minimized, set invisible,\n or fully occluded by another window.\n\n It is the translated version of [`WindowEvent::Occluded`] from the `winit` crate.\n\n [`WindowEvent::Occluded`]: https://docs.rs/winit/latest/winit/event/enum.WindowEvent.html#variant.Occluded", + "layout": { + "kind": "Struct", + "name": "WindowOccluded", + "fields": [ + { + "name": "window", + "type": { + "val": "bevy_ecs::entity::Entity" + } + }, + { + "name": "occluded", + "type": { + "primitive": "bool" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::event::WindowResized": { + "identifier": "WindowResized", + "crate": "bevy_window", + "path": "bevy_window::event::WindowResized", + "documentation": " A window event that is sent whenever a window's logical size has changed.", + "layout": { + "kind": "Struct", + "name": "WindowResized", + "fields": [ + { + "name": "window", + "type": { + "val": "bevy_ecs::entity::Entity" + } + }, + { + "name": "width", + "type": { + "primitive": "f32" + } + }, + { + "name": "height", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::event::WindowScaleFactorChanged": { + "identifier": "WindowScaleFactorChanged", + "crate": "bevy_window", + "path": "bevy_window::event::WindowScaleFactorChanged", + "documentation": " An event that indicates a window's scale factor has changed.", + "layout": { + "kind": "Struct", + "name": "WindowScaleFactorChanged", + "fields": [ + { + "name": "window", + "type": { + "val": "bevy_ecs::entity::Entity" + } + }, + { + "name": "scale_factor", + "type": { + "primitive": "f64" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::event::WindowThemeChanged": { + "identifier": "WindowThemeChanged", + "crate": "bevy_window", + "path": "bevy_window::event::WindowThemeChanged", + "documentation": " An event sent when the system theme changes for a window.\n\n This event is only sent when the window is relying on the system theme to control its appearance.\n i.e. It is only sent when [`Window::window_theme`](crate::window::Window::window_theme) is `None` and the system theme changes.", + "layout": { + "kind": "Struct", + "name": "WindowThemeChanged", + "fields": [ + { + "name": "window", + "type": { + "val": "bevy_ecs::entity::Entity" + } + }, + { + "name": "theme", + "type": { + "val": "bevy_window::window::WindowTheme" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::monitor::Monitor": { + "identifier": "Monitor", + "crate": "bevy_window", + "path": "bevy_window::monitor::Monitor", + "documentation": " Represents an available monitor as reported by the user's operating system, which can be used\n to query information about the display, such as its size, position, and video modes.\n\n Each monitor corresponds to an entity and can be used to position a monitor using\n [`MonitorSelection::Entity`](`crate::window::MonitorSelection::Entity`).\n\n # Warning\n\n This component is synchronized with `winit` through `bevy_winit`, but is effectively\n read-only as `winit` does not support changing monitor properties.", + "layout": { + "kind": "Struct", + "name": "Monitor", + "fields": [ + { + "name": "name", + "type": { + "option": { + "primitive": "string" + } + } + }, + { + "name": "physical_height", + "type": { + "primitive": "u32" + } + }, + { + "name": "physical_width", + "type": { + "primitive": "u32" + } + }, + { + "name": "physical_position", + "type": { + "val": "glam::IVec2" + } + }, + { + "name": "refresh_rate_millihertz", + "type": { + "option": { + "primitive": "u32" + } + } + }, + { + "name": "scale_factor", + "type": { + "primitive": "f64" + } + }, + { + "name": "video_modes", + "type": { + "vec": { + "val": "bevy_window::monitor::VideoMode" + } + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::monitor::PrimaryMonitor": { + "identifier": "PrimaryMonitor", + "crate": "bevy_window", + "path": "bevy_window::monitor::PrimaryMonitor", + "documentation": " A marker component for the primary monitor", + "layout": { + "kind": "Struct", + "name": "PrimaryMonitor" + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::monitor::VideoMode": { + "identifier": "VideoMode", + "crate": "bevy_window", + "path": "bevy_window::monitor::VideoMode", + "documentation": " Represents a video mode that a monitor supports", + "layout": { + "kind": "Struct", + "name": "VideoMode", + "fields": [ + { + "name": "physical_size", + "type": { + "val": "glam::UVec2" + } + }, + { + "name": "bit_depth", + "type": { + "primitive": "u16" + } + }, + { + "name": "refresh_rate_millihertz", + "type": { + "primitive": "u32" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::window::CompositeAlphaMode": { + "identifier": "CompositeAlphaMode", + "crate": "bevy_window", + "path": "bevy_window::window::CompositeAlphaMode", + "documentation": " Specifies how the alpha channel of the textures should be handled during compositing, for a [`Window`].", + "layout": [ + { + "kind": "Unit", + "name": "Auto" + }, + { + "kind": "Unit", + "name": "Opaque" + }, + { + "kind": "Unit", + "name": "PreMultiplied" + }, + { + "kind": "Unit", + "name": "PostMultiplied" + }, + { + "kind": "Unit", + "name": "Inherit" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::window::CursorGrabMode": { + "identifier": "CursorGrabMode", + "crate": "bevy_window", + "path": "bevy_window::window::CursorGrabMode", + "documentation": " Defines if and how the cursor is grabbed by a [`Window`].\n\n ## Platform-specific\n\n - **`macOS`** doesn't support [`CursorGrabMode::Confined`]\n - **`X11`** doesn't support [`CursorGrabMode::Locked`]\n - **`iOS/Android`** don't have cursors.\n\n Since `macOS` and `X11` don't have full [`CursorGrabMode`] support, we first try to set the grab mode that was asked for. If it doesn't work then use the alternate grab mode.", + "layout": [ + { + "kind": "Unit", + "name": "None" + }, + { + "kind": "Unit", + "name": "Confined" + }, + { + "kind": "Unit", + "name": "Locked" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::window::CursorOptions": { + "identifier": "CursorOptions", + "crate": "bevy_window", + "path": "bevy_window::window::CursorOptions", + "documentation": " Cursor data for a [`Window`].", + "layout": { + "kind": "Struct", + "name": "CursorOptions", + "fields": [ + { + "name": "visible", + "type": { + "primitive": "bool" + } + }, + { + "name": "grab_mode", + "type": { + "val": "bevy_window::window::CursorGrabMode" + } + }, + { + "name": "hit_test", + "type": { + "primitive": "bool" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::window::EnabledButtons": { + "identifier": "EnabledButtons", + "crate": "bevy_window", + "path": "bevy_window::window::EnabledButtons", + "documentation": " Specifies which [`Window`] control buttons should be enabled.\n\n ## Platform-specific\n\n **`iOS`**, **`Android`**, and the **`Web`** do not have window control buttons.\n\n On some **`Linux`** environments these values have no effect.", + "layout": { + "kind": "Struct", + "name": "EnabledButtons", + "fields": [ + { + "name": "minimize", + "type": { + "primitive": "bool" + } + }, + { + "name": "maximize", + "type": { + "primitive": "bool" + } + }, + { + "name": "close", + "type": { + "primitive": "bool" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::window::InternalWindowState": { + "identifier": "InternalWindowState", + "crate": "bevy_window", + "path": "bevy_window::window::InternalWindowState", + "documentation": " Stores internal [`Window`] state that isn't directly accessible.", + "layout": { + "kind": "Struct", + "name": "InternalWindowState", + "fields": [ + { + "name": "minimize_request", + "type": { + "option": { + "primitive": "bool" + } + } + }, + { + "name": "maximize_request", + "type": { + "option": { + "primitive": "bool" + } + } + }, + { + "name": "drag_move_request", + "type": { + "primitive": "bool" + } + }, + { + "name": "drag_resize_request", + "type": { + "option": { + "val": "bevy_math::compass::CompassOctant" + } + } + }, + { + "name": "physical_cursor_position", + "type": { + "option": { + "val": "glam::DVec2" + } + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::window::MonitorSelection": { + "identifier": "MonitorSelection", + "crate": "bevy_window", + "path": "bevy_window::window::MonitorSelection", + "documentation": " References a screen monitor.\n\n Used when centering a [`Window`] on a monitor.", + "layout": [ + { + "kind": "Unit", + "name": "Current" + }, + { + "kind": "Unit", + "name": "Primary" + }, + { + "kind": "TupleStruct", + "name": "Index", + "fields": [ + { + "type": { + "primitive": "usize" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Entity", + "fields": [ + { + "type": { + "val": "bevy_ecs::entity::Entity" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::window::NormalizedWindowRef": { + "identifier": "NormalizedWindowRef", + "crate": "bevy_window", + "path": "bevy_window::window::NormalizedWindowRef", + "documentation": " A flattened representation of a window reference for equality/hashing purposes.\n\n For most purposes you probably want to use the unnormalized version [`WindowRef`].", + "layout": { + "kind": "TupleStruct", + "name": "NormalizedWindowRef", + "fields": [ + { + "type": { + "val": "bevy_ecs::entity::Entity" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::window::PresentMode": { + "identifier": "PresentMode", + "crate": "bevy_window", + "path": "bevy_window::window::PresentMode", + "documentation": " Presentation mode for a [`Window`].\n\n The presentation mode specifies when a frame is presented to the window. The [`Fifo`]\n option corresponds to a traditional `VSync`, where the framerate is capped by the\n display refresh rate. Both [`Immediate`] and [`Mailbox`] are low-latency and are not\n capped by the refresh rate, but may not be available on all platforms. Tearing\n may be observed with [`Immediate`] mode, but will not be observed with [`Mailbox`] or\n [`Fifo`].\n\n [`AutoVsync`] or [`AutoNoVsync`] will gracefully fallback to [`Fifo`] when unavailable.\n\n [`Immediate`] or [`Mailbox`] will panic if not supported by the platform.\n\n [`Fifo`]: PresentMode::Fifo\n [`FifoRelaxed`]: PresentMode::FifoRelaxed\n [`Immediate`]: PresentMode::Immediate\n [`Mailbox`]: PresentMode::Mailbox\n [`AutoVsync`]: PresentMode::AutoVsync\n [`AutoNoVsync`]: PresentMode::AutoNoVsync", + "layout": [ + { + "kind": "Unit", + "name": "AutoVsync" + }, + { + "kind": "Unit", + "name": "AutoNoVsync" + }, + { + "kind": "Unit", + "name": "Fifo" + }, + { + "kind": "Unit", + "name": "FifoRelaxed" + }, + { + "kind": "Unit", + "name": "Immediate" + }, + { + "kind": "Unit", + "name": "Mailbox" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::window::PrimaryWindow": { + "identifier": "PrimaryWindow", + "crate": "bevy_window", + "path": "bevy_window::window::PrimaryWindow", + "documentation": " Marker [`Component`] for the window considered the primary window.\n\n Currently this is assumed to only exist on 1 entity at a time.\n\n [`WindowPlugin`](crate::WindowPlugin) will spawn a [`Window`] entity\n with this component if [`primary_window`](crate::WindowPlugin::primary_window)\n is `Some`.", + "layout": { + "kind": "Struct", + "name": "PrimaryWindow" + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::window::ScreenEdge": { + "identifier": "ScreenEdge", + "crate": "bevy_window", + "path": "bevy_window::window::ScreenEdge", + "documentation": " The edges of a screen. Corresponds to [`winit::platform::ios::ScreenEdge`].\n\n # Platform-specific\n\n - Only used on iOS.\n\n [`winit::platform::ios::ScreenEdge`]: https://docs.rs/winit/latest/x86_64-apple-darwin/winit/platform/ios/struct.ScreenEdge.html", + "layout": [ + { + "kind": "Unit", + "name": "None" + }, + { + "kind": "Unit", + "name": "Top" + }, + { + "kind": "Unit", + "name": "Left" + }, + { + "kind": "Unit", + "name": "Bottom" + }, + { + "kind": "Unit", + "name": "Right" + }, + { + "kind": "Unit", + "name": "All" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::window::VideoModeSelection": { + "identifier": "VideoModeSelection", + "crate": "bevy_window", + "path": "bevy_window::window::VideoModeSelection", + "documentation": " References an exclusive fullscreen video mode.\n\n Used when setting [`WindowMode::Fullscreen`] on a window.", + "layout": [ + { + "kind": "Unit", + "name": "Current" + }, + { + "kind": "TupleStruct", + "name": "Specific", + "fields": [ + { + "type": { + "val": "bevy_window::monitor::VideoMode" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::window::Window": { + "identifier": "Window", + "crate": "bevy_window", + "path": "bevy_window::window::Window", + "documentation": " The defining [`Component`] for window entities,\n storing information about how it should appear and behave.\n\n Each window corresponds to an entity, and is uniquely identified by the value of their [`Entity`].\n When the [`Window`] component is added to an entity, a new window will be opened.\n When it is removed or the entity is despawned, the window will close.\n\n The primary window entity (and the corresponding window) is spawned by default\n by [`WindowPlugin`](crate::WindowPlugin) and is marked with the [`PrimaryWindow`] component.\n\n This component is synchronized with `winit` through `bevy_winit`:\n it will reflect the current state of the window and can be modified to change this state.\n\n # Example\n\n Because this component is synchronized with `winit`, it can be used to perform\n OS-integrated windowing operations. For example, here's a simple system\n to change the window mode:\n\n ```\n # use bevy_ecs::query::With;\n # use bevy_ecs::system::Query;\n # use bevy_window::{WindowMode, PrimaryWindow, Window, MonitorSelection, VideoModeSelection};\n fn change_window_mode(mut windows: Query<&mut Window, With>) {\n // Query returns one window typically.\n for mut window in windows.iter_mut() {\n window.mode =\n WindowMode::Fullscreen(MonitorSelection::Current, VideoModeSelection::Current);\n }\n }\n ```", + "layout": { + "kind": "Struct", + "name": "Window", + "fields": [ + { + "name": "present_mode", + "type": { + "val": "bevy_window::window::PresentMode" + } + }, + { + "name": "mode", + "type": { + "val": "bevy_window::window::WindowMode" + } + }, + { + "name": "position", + "type": { + "val": "bevy_window::window::WindowPosition" + } + }, + { + "name": "resolution", + "type": { + "val": "bevy_window::window::WindowResolution" + } + }, + { + "name": "title", + "type": { + "primitive": "string" + } + }, + { + "name": "name", + "type": { + "option": { + "primitive": "string" + } + } + }, + { + "name": "composite_alpha_mode", + "type": { + "val": "bevy_window::window::CompositeAlphaMode" + } + }, + { + "name": "resize_constraints", + "type": { + "val": "bevy_window::window::WindowResizeConstraints" + } + }, + { + "name": "resizable", + "type": { + "primitive": "bool" + } + }, + { + "name": "enabled_buttons", + "type": { + "val": "bevy_window::window::EnabledButtons" + } + }, + { + "name": "decorations", + "type": { + "primitive": "bool" + } + }, + { + "name": "transparent", + "type": { + "primitive": "bool" + } + }, + { + "name": "focused", + "type": { + "primitive": "bool" + } + }, + { + "name": "window_level", + "type": { + "val": "bevy_window::window::WindowLevel" + } + }, + { + "name": "canvas", + "type": { + "option": { + "primitive": "string" + } + } + }, + { + "name": "fit_canvas_to_parent", + "type": { + "primitive": "bool" + } + }, + { + "name": "prevent_default_event_handling", + "type": { + "primitive": "bool" + } + }, + { + "name": "internal", + "type": { + "val": "bevy_window::window::InternalWindowState" + } + }, + { + "name": "ime_enabled", + "type": { + "primitive": "bool" + } + }, + { + "name": "ime_position", + "type": { + "val": "glam::Vec2" + } + }, + { + "name": "window_theme", + "type": { + "option": { + "val": "bevy_window::window::WindowTheme" + } + } + }, + { + "name": "visible", + "type": { + "primitive": "bool" + } + }, + { + "name": "skip_taskbar", + "type": { + "primitive": "bool" + } + }, + { + "name": "clip_children", + "type": { + "primitive": "bool" + } + }, + { + "name": "desired_maximum_frame_latency", + "type": { + "option": { + "val": "core::num::NonZeroU32" + } + } + }, + { + "name": "recognize_pinch_gesture", + "type": { + "primitive": "bool" + } + }, + { + "name": "recognize_rotation_gesture", + "type": { + "primitive": "bool" + } + }, + { + "name": "recognize_doubletap_gesture", + "type": { + "primitive": "bool" + } + }, + { + "name": "recognize_pan_gesture", + "type": { + "option": { + "tuple": [ + { + "primitive": "u8" + }, + { + "primitive": "u8" + } + ] + } + } + }, + { + "name": "movable_by_window_background", + "type": { + "primitive": "bool" + } + }, + { + "name": "fullsize_content_view", + "type": { + "primitive": "bool" + } + }, + { + "name": "has_shadow", + "type": { + "primitive": "bool" + } + }, + { + "name": "titlebar_shown", + "type": { + "primitive": "bool" + } + }, + { + "name": "titlebar_transparent", + "type": { + "primitive": "bool" + } + }, + { + "name": "titlebar_show_title", + "type": { + "primitive": "bool" + } + }, + { + "name": "titlebar_show_buttons", + "type": { + "primitive": "bool" + } + }, + { + "name": "prefers_home_indicator_hidden", + "type": { + "primitive": "bool" + } + }, + { + "name": "prefers_status_bar_hidden", + "type": { + "primitive": "bool" + } + }, + { + "name": "preferred_screen_edges_deferring_system_gestures", + "type": { + "val": "bevy_window::window::ScreenEdge" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::window::WindowLevel": { + "identifier": "WindowLevel", + "crate": "bevy_window", + "path": "bevy_window::window::WindowLevel", + "documentation": " Specifies where a [`Window`] should appear relative to other overlapping windows (on top or under) .\n\n Levels are groups of windows with respect to their z-position.\n\n The relative ordering between windows in different window levels is fixed.\n The z-order of windows within the same window level may change dynamically on user interaction.\n\n ## Platform-specific\n\n - **iOS / Android / Web / Wayland:** Unsupported.", + "layout": [ + { + "kind": "Unit", + "name": "AlwaysOnBottom" + }, + { + "kind": "Unit", + "name": "Normal" + }, + { + "kind": "Unit", + "name": "AlwaysOnTop" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::window::WindowMode": { + "identifier": "WindowMode", + "crate": "bevy_window", + "path": "bevy_window::window::WindowMode", + "documentation": " Defines the way a [`Window`] is displayed.", + "layout": [ + { + "kind": "Unit", + "name": "Windowed" + }, + { + "kind": "TupleStruct", + "name": "BorderlessFullscreen", + "fields": [ + { + "type": { + "val": "bevy_window::window::MonitorSelection" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Fullscreen", + "fields": [ + { + "type": { + "val": "bevy_window::window::MonitorSelection" + } + }, + { + "type": { + "val": "bevy_window::window::VideoModeSelection" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::window::WindowPosition": { + "identifier": "WindowPosition", + "crate": "bevy_window", + "path": "bevy_window::window::WindowPosition", + "documentation": " Defines where a [`Window`] should be placed on the screen.", + "layout": [ + { + "kind": "Unit", + "name": "Automatic" + }, + { + "kind": "TupleStruct", + "name": "Centered", + "fields": [ + { + "type": { + "val": "bevy_window::window::MonitorSelection" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "At", + "fields": [ + { + "type": { + "val": "glam::IVec2" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::window::WindowRef": { + "identifier": "WindowRef", + "crate": "bevy_window", + "path": "bevy_window::window::WindowRef", + "documentation": " Reference to a [`Window`], whether it be a direct link to a specific entity or\n a more vague defaulting choice.", + "layout": [ + { + "kind": "Unit", + "name": "Primary" + }, + { + "kind": "TupleStruct", + "name": "Entity", + "fields": [ + { + "type": { + "val": "bevy_ecs::entity::Entity" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::window::WindowResizeConstraints": { + "identifier": "WindowResizeConstraints", + "crate": "bevy_window", + "path": "bevy_window::window::WindowResizeConstraints", + "documentation": " The size limits on a [`Window`].\n\n These values are measured in logical pixels (see [`WindowResolution`]), so the user's\n scale factor does affect the size limits on the window.\n\n Please note that if the window is resizable, then when the window is\n maximized it may have a size outside of these limits. The functionality\n required to disable maximizing is not yet exposed by winit.", + "layout": { + "kind": "Struct", + "name": "WindowResizeConstraints", + "fields": [ + { + "name": "min_width", + "type": { + "primitive": "f32" + } + }, + { + "name": "min_height", + "type": { + "primitive": "f32" + } + }, + { + "name": "max_width", + "type": { + "primitive": "f32" + } + }, + { + "name": "max_height", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::window::WindowResolution": { + "identifier": "WindowResolution", + "crate": "bevy_window", + "path": "bevy_window::window::WindowResolution", + "documentation": " Controls the size of a [`Window`]\n\n ## Physical, logical and requested sizes\n\n There are three sizes associated with a window:\n - the physical size,\n which represents the actual height and width in physical pixels\n the window occupies on the monitor,\n - the logical size,\n which represents the size that should be used to scale elements\n inside the window, measured in logical pixels,\n - the requested size,\n measured in logical pixels, which is the value submitted\n to the API when creating the window, or requesting that it be resized.\n\n ## Scale factor\n\n The reason logical size and physical size are separated and can be different\n is to account for the cases where:\n - several monitors have different pixel densities,\n - the user has set up a pixel density preference in its operating system,\n - the Bevy `App` has specified a specific scale factor between both.\n\n The factor between physical size and logical size can be retrieved with\n [`WindowResolution::scale_factor`].\n\n For the first two cases, a scale factor is set automatically by the operating\n system through the window backend. You can get it with\n [`WindowResolution::base_scale_factor`].\n\n For the third case, you can override this automatic scale factor with\n [`WindowResolution::set_scale_factor_override`].\n\n ## Requested and obtained sizes\n\n The logical size should be equal to the requested size after creating/resizing,\n when possible.\n The reason the requested size and logical size might be different\n is because the corresponding physical size might exceed limits (either the\n size limits of the monitor, or limits defined in [`WindowResizeConstraints`]).\n\n Note: The requested size is not kept in memory, for example requesting a size\n too big for the screen, making the logical size different from the requested size,\n and then setting a scale factor that makes the previous requested size within\n the limits of the screen will not get back that previous requested size.", + "layout": { + "kind": "Struct", + "name": "WindowResolution", + "fields": [ + { + "name": "physical_width", + "type": { + "primitive": "u32" + } + }, + { + "name": "physical_height", + "type": { + "primitive": "u32" + } + }, + { + "name": "scale_factor_override", + "type": { + "option": { + "primitive": "f32" + } + } + }, + { + "name": "scale_factor", + "type": { + "primitive": "f32" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_window::window::WindowTheme": { + "identifier": "WindowTheme", + "crate": "bevy_window", + "path": "bevy_window::window::WindowTheme", + "documentation": " The [`Window`] theme variant to use.", + "layout": [ + { + "kind": "Unit", + "name": "Light" + }, + { + "kind": "Unit", + "name": "Dark" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_winit::WinitUserEvent": { + "identifier": "WinitUserEvent", + "crate": "bevy_winit", + "path": "bevy_winit::WinitUserEvent", + "documentation": " Events that can be sent to perform actions inside the winit event loop.\n\n Sent via the [`EventLoopProxyWrapper`] resource.\n\n # Example\n\n ```\n # use bevy_ecs::prelude::*;\n # use bevy_winit::{EventLoopProxyWrapper, WinitUserEvent};\n fn wakeup_system(event_loop_proxy: Res) -> Result {\n event_loop_proxy.send_event(WinitUserEvent::WakeUp)?;\n\n Ok(())\n }\n ```", + "layout": [ + { + "kind": "Unit", + "name": "WakeUp" + }, + { + "kind": "Unit", + "name": "WindowAdded" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "core::num::NonZeroI128": { + "identifier": "NonZeroI128", + "crate": "core", + "path": "core::num::NonZeroI128", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "core::num::NonZeroI16": { + "identifier": "NonZeroI16", + "crate": "core", + "path": "core::num::NonZeroI16", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "core::num::NonZeroI32": { + "identifier": "NonZeroI32", + "crate": "core", + "path": "core::num::NonZeroI32", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "core::num::NonZeroI64": { + "identifier": "NonZeroI64", + "crate": "core", + "path": "core::num::NonZeroI64", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "core::num::NonZeroI8": { + "identifier": "NonZeroI8", + "crate": "core", + "path": "core::num::NonZeroI8", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "core::num::NonZeroIsize": { + "identifier": "NonZeroIsize", + "crate": "core", + "path": "core::num::NonZeroIsize", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "core::num::NonZeroU128": { + "identifier": "NonZeroU128", + "crate": "core", + "path": "core::num::NonZeroU128", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "core::num::NonZeroU16": { + "identifier": "NonZeroU16", + "crate": "core", + "path": "core::num::NonZeroU16", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "core::num::NonZeroU32": { + "identifier": "NonZeroU32", + "crate": "core", + "path": "core::num::NonZeroU32", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "core::num::NonZeroU64": { + "identifier": "NonZeroU64", + "crate": "core", + "path": "core::num::NonZeroU64", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "core::num::NonZeroU8": { + "identifier": "NonZeroU8", + "crate": "core", + "path": "core::num::NonZeroU8", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "core::num::NonZeroUsize": { + "identifier": "NonZeroUsize", + "crate": "core", + "path": "core::num::NonZeroUsize", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "alloc::borrow::Cow": { + "identifier": "Cow", + "crate": "alloc", + "path": "alloc::borrow::Cow", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_asset::handle::Handle<()>": { + "identifier": "Handle", + "crate": "bevy_asset", + "path": "bevy_asset::handle::Handle<()>", + "generics": [ + { + "type_id": "()", + "name": "A" + } + ], + "documentation": " A handle to a specific [`Asset`] of type `A`. Handles act as abstract \"references\" to\n assets, whose data are stored in the [`Assets
`](crate::prelude::Assets) resource,\n avoiding the need to store multiple copies of the same data.\n\n If a [`Handle`] is [`Handle::Strong`], the [`Asset`] will be kept\n alive until the [`Handle`] is dropped. If a [`Handle`] is [`Handle::Uuid`], it does not necessarily reference a live [`Asset`],\n nor will it keep assets alive.\n\n Modifying a *handle* will change which existing asset is referenced, but modifying the *asset*\n (by mutating the [`Assets`](crate::prelude::Assets) resource) will change the asset for all handles referencing it.\n\n [`Handle`] can be cloned. If a [`Handle::Strong`] is cloned, the referenced [`Asset`] will not be freed until _all_ instances\n of the [`Handle`] are dropped.\n\n [`Handle::Strong`], via [`StrongHandle`] also provides access to useful [`Asset`] metadata, such as the [`AssetPath`] (if it exists).", + "layout": [ + { + "kind": "TupleStruct", + "name": "Strong", + "fields": [ + { + "type": { + "val": "bevy_platform::sync::Arc" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Uuid", + "fields": [ + { + "type": { + "val": "uuid::Uuid" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_asset::handle::Handle": { + "identifier": "Handle", + "crate": "bevy_asset", + "path": "bevy_asset::handle::Handle", + "generics": [ + { + "type_id": "bevy_image::image::Image", + "name": "A" + } + ], + "documentation": " A handle to a specific [`Asset`] of type `A`. Handles act as abstract \"references\" to\n assets, whose data are stored in the [`Assets`](crate::prelude::Assets) resource,\n avoiding the need to store multiple copies of the same data.\n\n If a [`Handle`] is [`Handle::Strong`], the [`Asset`] will be kept\n alive until the [`Handle`] is dropped. If a [`Handle`] is [`Handle::Uuid`], it does not necessarily reference a live [`Asset`],\n nor will it keep assets alive.\n\n Modifying a *handle* will change which existing asset is referenced, but modifying the *asset*\n (by mutating the [`Assets`](crate::prelude::Assets) resource) will change the asset for all handles referencing it.\n\n [`Handle`] can be cloned. If a [`Handle::Strong`] is cloned, the referenced [`Asset`] will not be freed until _all_ instances\n of the [`Handle`] are dropped.\n\n [`Handle::Strong`], via [`StrongHandle`] also provides access to useful [`Asset`] metadata, such as the [`AssetPath`] (if it exists).", + "layout": [ + { + "kind": "TupleStruct", + "name": "Strong", + "fields": [ + { + "type": { + "val": "bevy_platform::sync::Arc" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Uuid", + "fields": [ + { + "type": { + "val": "uuid::Uuid" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_asset::handle::Handle": { + "identifier": "Handle", + "crate": "bevy_asset", + "path": "bevy_asset::handle::Handle", + "generics": [ + { + "type_id": "bevy_image::texture_atlas::TextureAtlasLayout", + "name": "A" + } + ], + "documentation": " A handle to a specific [`Asset`] of type `A`. Handles act as abstract \"references\" to\n assets, whose data are stored in the [`Assets`](crate::prelude::Assets) resource,\n avoiding the need to store multiple copies of the same data.\n\n If a [`Handle`] is [`Handle::Strong`], the [`Asset`] will be kept\n alive until the [`Handle`] is dropped. If a [`Handle`] is [`Handle::Uuid`], it does not necessarily reference a live [`Asset`],\n nor will it keep assets alive.\n\n Modifying a *handle* will change which existing asset is referenced, but modifying the *asset*\n (by mutating the [`Assets`](crate::prelude::Assets) resource) will change the asset for all handles referencing it.\n\n [`Handle`] can be cloned. If a [`Handle::Strong`] is cloned, the referenced [`Asset`] will not be freed until _all_ instances\n of the [`Handle`] are dropped.\n\n [`Handle::Strong`], via [`StrongHandle`] also provides access to useful [`Asset`] metadata, such as the [`AssetPath`] (if it exists).", + "layout": [ + { + "kind": "TupleStruct", + "name": "Strong", + "fields": [ + { + "type": { + "val": "bevy_platform::sync::Arc" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Uuid", + "fields": [ + { + "type": { + "val": "uuid::Uuid" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_asset::handle::Handle": { + "identifier": "Handle", + "crate": "bevy_asset", + "path": "bevy_asset::handle::Handle", + "generics": [ + { + "type_id": "bevy_mesh::mesh::Mesh", + "name": "A" + } + ], + "documentation": " A handle to a specific [`Asset`] of type `A`. Handles act as abstract \"references\" to\n assets, whose data are stored in the [`Assets`](crate::prelude::Assets) resource,\n avoiding the need to store multiple copies of the same data.\n\n If a [`Handle`] is [`Handle::Strong`], the [`Asset`] will be kept\n alive until the [`Handle`] is dropped. If a [`Handle`] is [`Handle::Uuid`], it does not necessarily reference a live [`Asset`],\n nor will it keep assets alive.\n\n Modifying a *handle* will change which existing asset is referenced, but modifying the *asset*\n (by mutating the [`Assets`](crate::prelude::Assets) resource) will change the asset for all handles referencing it.\n\n [`Handle`] can be cloned. If a [`Handle::Strong`] is cloned, the referenced [`Asset`] will not be freed until _all_ instances\n of the [`Handle`] are dropped.\n\n [`Handle::Strong`], via [`StrongHandle`] also provides access to useful [`Asset`] metadata, such as the [`AssetPath`] (if it exists).", + "layout": [ + { + "kind": "TupleStruct", + "name": "Strong", + "fields": [ + { + "type": { + "val": "bevy_platform::sync::Arc" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Uuid", + "fields": [ + { + "type": { + "val": "uuid::Uuid" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_asset::handle::Handle": { + "identifier": "Handle", + "crate": "bevy_asset", + "path": "bevy_asset::handle::Handle", + "generics": [ + { + "type_id": "bevy_render::storage::ShaderStorageBuffer", + "name": "A" + } + ], + "documentation": " A handle to a specific [`Asset`] of type `A`. Handles act as abstract \"references\" to\n assets, whose data are stored in the [`Assets`](crate::prelude::Assets) resource,\n avoiding the need to store multiple copies of the same data.\n\n If a [`Handle`] is [`Handle::Strong`], the [`Asset`] will be kept\n alive until the [`Handle`] is dropped. If a [`Handle`] is [`Handle::Uuid`], it does not necessarily reference a live [`Asset`],\n nor will it keep assets alive.\n\n Modifying a *handle* will change which existing asset is referenced, but modifying the *asset*\n (by mutating the [`Assets`](crate::prelude::Assets) resource) will change the asset for all handles referencing it.\n\n [`Handle`] can be cloned. If a [`Handle::Strong`] is cloned, the referenced [`Asset`] will not be freed until _all_ instances\n of the [`Handle`] are dropped.\n\n [`Handle::Strong`], via [`StrongHandle`] also provides access to useful [`Asset`] metadata, such as the [`AssetPath`] (if it exists).", + "layout": [ + { + "kind": "TupleStruct", + "name": "Strong", + "fields": [ + { + "type": { + "val": "bevy_platform::sync::Arc" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Uuid", + "fields": [ + { + "type": { + "val": "uuid::Uuid" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_asset::handle::Handle": { + "identifier": "Handle", + "crate": "bevy_asset", + "path": "bevy_asset::handle::Handle", + "generics": [ + { + "type_id": "bevy_sprite_render::mesh2d::color_material::ColorMaterial", + "name": "A" + } + ], + "documentation": " A handle to a specific [`Asset`] of type `A`. Handles act as abstract \"references\" to\n assets, whose data are stored in the [`Assets`](crate::prelude::Assets) resource,\n avoiding the need to store multiple copies of the same data.\n\n If a [`Handle`] is [`Handle::Strong`], the [`Asset`] will be kept\n alive until the [`Handle`] is dropped. If a [`Handle`] is [`Handle::Uuid`], it does not necessarily reference a live [`Asset`],\n nor will it keep assets alive.\n\n Modifying a *handle* will change which existing asset is referenced, but modifying the *asset*\n (by mutating the [`Assets`](crate::prelude::Assets) resource) will change the asset for all handles referencing it.\n\n [`Handle`] can be cloned. If a [`Handle::Strong`] is cloned, the referenced [`Asset`] will not be freed until _all_ instances\n of the [`Handle`] are dropped.\n\n [`Handle::Strong`], via [`StrongHandle`] also provides access to useful [`Asset`] metadata, such as the [`AssetPath`] (if it exists).", + "layout": [ + { + "kind": "TupleStruct", + "name": "Strong", + "fields": [ + { + "type": { + "val": "bevy_platform::sync::Arc" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Uuid", + "fields": [ + { + "type": { + "val": "uuid::Uuid" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_asset::handle::Handle": { + "identifier": "Handle", + "crate": "bevy_asset", + "path": "bevy_asset::handle::Handle", + "generics": [ + { + "type_id": "bevy_sprite_render::mesh2d::wireframe2d::Wireframe2dMaterial", + "name": "A" + } + ], + "documentation": " A handle to a specific [`Asset`] of type `A`. Handles act as abstract \"references\" to\n assets, whose data are stored in the [`Assets`](crate::prelude::Assets) resource,\n avoiding the need to store multiple copies of the same data.\n\n If a [`Handle`] is [`Handle::Strong`], the [`Asset`] will be kept\n alive until the [`Handle`] is dropped. If a [`Handle`] is [`Handle::Uuid`], it does not necessarily reference a live [`Asset`],\n nor will it keep assets alive.\n\n Modifying a *handle* will change which existing asset is referenced, but modifying the *asset*\n (by mutating the [`Assets`](crate::prelude::Assets) resource) will change the asset for all handles referencing it.\n\n [`Handle`] can be cloned. If a [`Handle::Strong`] is cloned, the referenced [`Asset`] will not be freed until _all_ instances\n of the [`Handle`] are dropped.\n\n [`Handle::Strong`], via [`StrongHandle`] also provides access to useful [`Asset`] metadata, such as the [`AssetPath`] (if it exists).", + "layout": [ + { + "kind": "TupleStruct", + "name": "Strong", + "fields": [ + { + "type": { + "val": "bevy_platform::sync::Arc" + } + } + ] + }, + { + "kind": "TupleStruct", + "name": "Uuid", + "fields": [ + { + "type": { + "val": "uuid::Uuid" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_asset::id::AssetId": { + "identifier": "AssetId", + "crate": "bevy_asset", + "path": "bevy_asset::id::AssetId", + "generics": [ + { + "type_id": "bevy_image::image::Image", + "name": "A" + } + ], + "documentation": " A unique runtime-only identifier for an [`Asset`]. This is cheap to [`Copy`]/[`Clone`] and is not directly tied to the\n lifetime of the Asset. This means it _can_ point to an [`Asset`] that no longer exists.\n\n For an identifier tied to the lifetime of an asset, see [`Handle`](`crate::Handle`).\n\n For an \"untyped\" / \"generic-less\" id, see [`UntypedAssetId`].", + "layout": [ + { + "kind": "Struct", + "name": "Index", + "fields": [ + { + "name": "index", + "type": { + "val": "bevy_asset::assets::AssetIndex" + } + } + ] + }, + { + "kind": "Struct", + "name": "Uuid", + "fields": [ + { + "name": "uuid", + "type": { + "val": "uuid::Uuid" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_asset::id::AssetId": { + "identifier": "AssetId", + "crate": "bevy_asset", + "path": "bevy_asset::id::AssetId", + "generics": [ + { + "type_id": "bevy_image::texture_atlas::TextureAtlasLayout", + "name": "A" + } + ], + "documentation": " A unique runtime-only identifier for an [`Asset`]. This is cheap to [`Copy`]/[`Clone`] and is not directly tied to the\n lifetime of the Asset. This means it _can_ point to an [`Asset`] that no longer exists.\n\n For an identifier tied to the lifetime of an asset, see [`Handle`](`crate::Handle`).\n\n For an \"untyped\" / \"generic-less\" id, see [`UntypedAssetId`].", + "layout": [ + { + "kind": "Struct", + "name": "Index", + "fields": [ + { + "name": "index", + "type": { + "val": "bevy_asset::assets::AssetIndex" + } + } + ] + }, + { + "kind": "Struct", + "name": "Uuid", + "fields": [ + { + "name": "uuid", + "type": { + "val": "uuid::Uuid" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_asset::id::AssetId": { + "identifier": "AssetId", + "crate": "bevy_asset", + "path": "bevy_asset::id::AssetId", + "generics": [ + { + "type_id": "bevy_mod_scripting_asset::script_asset::ScriptAsset", + "name": "A" + } + ], + "documentation": " A unique runtime-only identifier for an [`Asset`]. This is cheap to [`Copy`]/[`Clone`] and is not directly tied to the\n lifetime of the Asset. This means it _can_ point to an [`Asset`] that no longer exists.\n\n For an identifier tied to the lifetime of an asset, see [`Handle`](`crate::Handle`).\n\n For an \"untyped\" / \"generic-less\" id, see [`UntypedAssetId`].", + "layout": [ + { + "kind": "Struct", + "name": "Index", + "fields": [ + { + "name": "index", + "type": { + "val": "bevy_asset::assets::AssetIndex" + } + } + ] + }, + { + "kind": "Struct", + "name": "Uuid", + "fields": [ + { + "name": "uuid", + "type": { + "val": "uuid::Uuid" + } + } + ] + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_ecs::entity::hash_map::EntityHashMap": { + "identifier": "EntityHashMap", + "crate": "bevy_ecs", + "path": "bevy_ecs::entity::hash_map::EntityHashMap", + "generics": [ + { + "type_id": "bevy_input_focus::directional_navigation::NavNeighbors", + "name": "V" + } + ], + "documentation": " A [`HashMap`] pre-configured to use [`EntityHash`] hashing.", + "layout": { + "kind": "TupleStruct", + "name": "EntityHashMap", + "fields": [ + { + "type": { + "hashMap": [ + { + "val": "bevy_ecs::entity::Entity" + }, + { + "val": "bevy_input_focus::directional_navigation::NavNeighbors" + } + ] + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::axis::Axis": { + "identifier": "Axis", + "crate": "bevy_input", + "path": "bevy_input::axis::Axis", + "generics": [ + { + "type_id": "bevy_input::gamepad::GamepadInput", + "name": "T" + } + ], + "documentation": " Stores the position data of the input devices of type `T`.\n\n The values are stored as `f32`s, using [`Axis::set`].\n Use [`Axis::get`] to retrieve the value clamped between [`Axis::MIN`] and [`Axis::MAX`]\n inclusive, or unclamped using [`Axis::get_unclamped`].", + "layout": { + "kind": "Struct", + "name": "Axis", + "fields": [ + { + "name": "axis_data", + "type": { + "hashMap": [ + { + "val": "bevy_input::gamepad::GamepadInput" + }, + { + "primitive": "f32" + } + ] + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_input::button_input::ButtonInput": { + "identifier": "ButtonInput", + "crate": "bevy_input", + "path": "bevy_input::button_input::ButtonInput", + "generics": [ + { + "type_id": "bevy_input::gamepad::GamepadButton", + "name": "T" + } + ], + "documentation": " A \"press-able\" input of type `T`.\n\n ## Usage\n\n This type can be used as a resource to keep the current state of an input, by reacting to\n events from the input. For a given input value:\n\n * [`ButtonInput::pressed`] will return `true` between a press and a release event.\n * [`ButtonInput::just_pressed`] will return `true` for one frame after a press event.\n * [`ButtonInput::just_released`] will return `true` for one frame after a release event.\n\n ## Multiple systems\n\n In case multiple systems are checking for [`ButtonInput::just_pressed`] or [`ButtonInput::just_released`]\n but only one should react, for example when modifying a\n [`Resource`], you should consider clearing the input state, either by:\n\n * Using [`ButtonInput::clear_just_pressed`] or [`ButtonInput::clear_just_released`] instead.\n * Calling [`ButtonInput::clear`] or [`ButtonInput::reset`] immediately after the state change.\n\n ## Performance\n\n For all operations, the following conventions are used:\n - **n** is the number of stored inputs.\n - **m** is the number of input arguments passed to the method.\n - **\\***-suffix denotes an amortized cost.\n - **~**-suffix denotes an expected cost.\n\n See Rust's [std::collections doc on performance](https://doc.rust-lang.org/std/collections/index.html#performance) for more details on the conventions used here.\n\n | **[`ButtonInput`] operations** | **Computational complexity** |\n |-----------------------------------|------------------------------------|\n | [`ButtonInput::any_just_pressed`] | *O*(m)~ |\n | [`ButtonInput::any_just_released`] | *O*(m)~ |\n | [`ButtonInput::any_pressed`] | *O*(m)~ |\n | [`ButtonInput::get_just_pressed`] | *O*(n) |\n | [`ButtonInput::get_just_released`] | *O*(n) |\n | [`ButtonInput::get_pressed`] | *O*(n) |\n | [`ButtonInput::just_pressed`] | *O*(1)~ |\n | [`ButtonInput::just_released`] | *O*(1)~ |\n | [`ButtonInput::pressed`] | *O*(1)~ |\n | [`ButtonInput::press`] | *O*(1)~* |\n | [`ButtonInput::release`] | *O*(1)~* |\n | [`ButtonInput::release_all`] | *O*(n)~* |\n | [`ButtonInput::clear_just_pressed`] | *O*(1)~ |\n | [`ButtonInput::clear_just_released`] | *O*(1)~ |\n | [`ButtonInput::reset_all`] | *O*(n) |\n | [`ButtonInput::clear`] | *O*(n) |\n\n ## Window focus\n\n `ButtonInput` is tied to window focus. For example, if the user holds a button\n while the window loses focus, [`ButtonInput::just_released`] will be triggered. Similarly if the window\n regains focus, [`ButtonInput::just_pressed`] will be triggered.\n\n `ButtonInput` is independent of window focus.\n\n ## Examples\n\n Reading and checking against the current set of pressed buttons:\n ```no_run\n # use bevy_app::{App, NoopPluginGroup as DefaultPlugins, Update};\n # use bevy_ecs::{prelude::{IntoScheduleConfigs, Res, Resource, resource_changed}, schedule::SystemCondition};\n # use bevy_input::{ButtonInput, prelude::{KeyCode, MouseButton}};\n\n fn main() {\n App::new()\n .add_plugins(DefaultPlugins)\n .add_systems(\n Update,\n print_mouse.run_if(resource_changed::>),\n )\n .add_systems(\n Update,\n print_keyboard.run_if(resource_changed::>),\n )\n .run();\n }\n\n fn print_mouse(mouse: Res>) {\n println!(\"Mouse: {:?}\", mouse.get_pressed().collect::>());\n }\n\n fn print_keyboard(keyboard: Res>) {\n if keyboard.any_pressed([KeyCode::ControlLeft, KeyCode::ControlRight])\n && keyboard.any_pressed([KeyCode::AltLeft, KeyCode::AltRight])\n && keyboard.any_pressed([KeyCode::ShiftLeft, KeyCode::ShiftRight])\n && keyboard.any_pressed([KeyCode::SuperLeft, KeyCode::SuperRight])\n && keyboard.pressed(KeyCode::KeyL)\n {\n println!(\"On Windows this opens LinkedIn.\");\n } else {\n println!(\"keyboard: {:?}\", keyboard.get_pressed().collect::>());\n }\n }\n ```\n\n ## Note\n\n When adding this resource for a new input type, you should:\n\n * Call the [`ButtonInput::press`] method for each press event.\n * Call the [`ButtonInput::release`] method for each release event.\n * Call the [`ButtonInput::clear`] method at each frame start, before processing events.\n\n Note: Calling `clear` from a [`ResMut`] will trigger change detection.\n It may be preferable to use [`DetectChangesMut::bypass_change_detection`]\n to avoid causing the resource to always be marked as changed.\n\n [`ResMut`]: bevy_ecs::system::ResMut\n [`DetectChangesMut::bypass_change_detection`]: bevy_ecs::change_detection::DetectChangesMut::bypass_change_detection", + "layout": { + "kind": "Struct", + "name": "ButtonInput", + "fields": [ + { + "name": "pressed", + "type": { + "val": "bevy_platform::collections::HashSet" + } + }, + { + "name": "just_pressed", + "type": { + "val": "bevy_platform::collections::HashSet" + } + }, + { + "name": "just_released", + "type": { + "val": "bevy_platform::collections::HashSet" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": true, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_mesh::mesh::MeshExtractableData": { + "identifier": "MeshExtractableData", + "crate": "bevy_mesh", + "path": "bevy_mesh::mesh::MeshExtractableData", + "generics": [ + { + "type_id": "bevy_mesh::index::Indices", + "name": "T" + } + ], + "layout": [ + { + "kind": "TupleStruct", + "name": "Data", + "fields": [ + { + "type": { + "val": "bevy_mesh::index::Indices" + } + } + ] + }, + { + "kind": "Unit", + "name": "NoData" + }, + { + "kind": "Unit", + "name": "ExtractedToRenderWorld" + } + ], + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_platform::sync::Arc": { + "identifier": "Arc", + "crate": "bevy_platform", + "path": "bevy_platform::sync::Arc", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_platform::sync::Arc": { + "identifier": "Arc", + "crate": "bevy_platform", + "path": "bevy_platform::sync::Arc", + "layout": null, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": false, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_sprite_render::mesh2d::material::MeshMaterial2d": { + "identifier": "MeshMaterial2d", + "crate": "bevy_sprite_render", + "path": "bevy_sprite_render::mesh2d::material::MeshMaterial2d", + "generics": [ + { + "type_id": "bevy_sprite_render::mesh2d::color_material::ColorMaterial", + "name": "M" + } + ], + "documentation": " A [material](Material2d) used for rendering a [`Mesh2d`].\n\n See [`Material2d`] for general information about 2D materials and how to implement your own materials.\n\n # Example\n\n ```\n # use bevy_sprite_render::{ColorMaterial, MeshMaterial2d};\n # use bevy_ecs::prelude::*;\n # use bevy_mesh::{Mesh, Mesh2d};\n # use bevy_color::palettes::basic::RED;\n # use bevy_asset::Assets;\n # use bevy_math::primitives::Circle;\n #\n // Spawn an entity with a mesh using `ColorMaterial`.\n fn setup(\n mut commands: Commands,\n mut meshes: ResMut>,\n mut materials: ResMut>,\n ) {\n commands.spawn((\n Mesh2d(meshes.add(Circle::new(50.0))),\n MeshMaterial2d(materials.add(ColorMaterial::from_color(RED))),\n ));\n }\n ```\n\n [`MeshMaterial2d`]: crate::MeshMaterial2d", + "layout": { + "kind": "TupleStruct", + "name": "MeshMaterial2d", + "fields": [ + { + "type": { + "val": "bevy_asset::handle::Handle" + } + } + ] + }, + "generated": false, + "insignificance": 1000, + "metadata": { + "is_component": true, + "is_resource": false, + "is_reflect": true, + "mapped_to_primitive_kind": null + } + }, + "bevy_time::time::Time<()>": { + "identifier": "Time", + "crate": "bevy_time", + "path": "bevy_time::time::Time<()>", + "generics": [ + { + "type_id": "()", + "name": "T" + } + ], + "documentation": " A generic clock resource that tracks how much it has advanced since its\n previous update and since its creation.\n\n Multiple instances of this resource are inserted automatically by\n [`TimePlugin`](crate::TimePlugin):\n\n - [`Time`](crate::real::Real) tracks real wall-clock time elapsed.\n - [`Time`](crate::virt::Virtual) tracks virtual game time that may\n be paused or scaled.\n - [`Time`](crate::fixed::Fixed) tracks fixed timesteps based on\n virtual time.\n - [`Time`] is a generic clock that corresponds to \"current\" or \"default\"\n time for systems. It contains [`Time`](crate::virt::Virtual)\n except inside the [`FixedMain`](bevy_app::FixedMain) schedule when it\n contains [`Time`](crate::fixed::Fixed).\n\n The time elapsed since the previous time this clock was advanced is saved as\n [`delta()`](Time::delta) and the total amount of time the clock has advanced\n is saved as [`elapsed()`](Time::elapsed). Both are represented as exact\n [`Duration`] values with fixed nanosecond precision. The clock does not\n support time moving backwards, but it can be updated with [`Duration::ZERO`]\n which will set [`delta()`](Time::delta) to zero.\n\n These values are also available in seconds as `f32` via\n [`delta_secs()`](Time::delta_secs) and\n [`elapsed_secs()`](Time::elapsed_secs), and also in seconds as `f64`\n via [`delta_secs_f64()`](Time::delta_secs_f64) and\n [`elapsed_secs_f64()`](Time::elapsed_secs_f64).\n\n Since [`elapsed_secs()`](Time::elapsed_secs) will grow constantly and\n is `f32`, it will exhibit gradual precision loss. For applications that\n require an `f32` value but suffer from gradual precision loss there is\n [`elapsed_secs_wrapped()`](Time::elapsed_secs_wrapped) available. The\n same wrapped value is also available as [`Duration`] and `f64` for\n consistency. The wrap period is by default 1 hour, and can be set by\n [`set_wrap_period()`](Time::set_wrap_period).\n\n # Accessing clocks\n\n By default, any systems requiring current [`delta()`](Time::delta) or\n [`elapsed()`](Time::elapsed) should use `Res

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�rR+R4B_o|g`GiULqRIwzvms9fiT}=@S1{Y72`byzCS6L25_HKI3VE(a30j)60`y& z*go4$two}Izene>$7tg>oi|3HU#`&8uYonu{W*V;=tGEp;aLCMk4m@)VB`E@c~c%w z!#paa4=Grej=@zk-TbC;-x!nI|AT9Jw*X|aakx0XX{?;R3^MCG^Bt{^2O*aLMx3SD5PY8?S zVIN>9m=Qc4=JH4w9z8r_V@!c+Vfs@bc=Bj}Uw;G>7$d+Po~`kxAe@9B0o?SPk^cMO zfNR2|$N9toHo~_febP{$IKXDX>HwPwn+MoTSWw7QOJ;<5fX#%rbO^}%X8I6N3}N#S z5X0snAcoV2fMyGX1uV z>pkgNjiokS(c7Bk1dLsOLB!*Vh|bewCK31I$$vHxdOut|!`zH+v$_u$_Ffr}deOlTnp$3Gv<`eVm(fT*l0QNS1|2nBf{8 zT!VgQcMnH|-{;}nrRfi8^eutIsZbK)n~bn)S(xKC27~VkL(!(9RRY@N=BU%o2 z_YeL}^#Jt}B8CTFR}r)p5V242ew)Cy%)v1mb1>5cX<6Xj&l=5)u#aZK_R%b0+h`_i zAI*d_Ml&PqqnR*9vpA0WIP|A^gl_}F=ICYE9K8&uN3R!7s^*YHL7FioEIHW$pk=YU z%2;}cj5rz*o_U^O#)5;>5tR!)hVL{LL36%*Iwu<4|?5`rw68C>z$Aos>N!kLVd|MC7iEDH%A1IO!zJsD~lHq;@CuRH#G{V zV+O7B;9bn8w96{TA*SV0_lP{$>Ox5JiDIBy;|Nqsv0;p;I;^VZ*b*;k_(gWrS9Gqr z(q46dRqvsgNRy{!Uw2XPSZEDagwizm1vQ=0CuFi2VkRW~1;`{#zm~(?`IkfA#lR5i zyUyNQ`74n;LnU{1`p$nG$+J~*Uf?ze_7XrXard;qh1fwRAl@MV-u)8b7U&cAs4$Ms zk;+f8cX_$YHNx`*M8-HU))<(F4wC#RFxelGvWU`%yXDN^uza3q#9ajfjmZ zIbcoX)T*4wt%zPK0)Jwi^-ly$t#qWCx?BG13cjGm9!06;3OCLu=+-xCz;`Rp+Uw+W z-|`oChWk*r{`8GJb@eH4^jjA+41it{ebcBm7F#dYEw#vz*Lta*R*Q_- zf?BjMFIq2y;kRqfi&)-jpMVrW_$kVXsM_S{8;^W$Tg9AA04 z?7r43(-V>4_zK%Zw7nd^#<`0)4zc+H$By)Gc$Npr_i_hOP2mT_HYvu6#iZT26d-=ja8Np@xn8OG7CMcMu)0iWN`foZ~rq>ca zqQ5_kJqZ>m;HqA}d2dK1$|}Z;8j1<{_G4@qNA>qlwZq8q8iuw>l*oacu0Nq+U*ZxC z@3|Wqo{w9);p>+u2^nHG{9#+ey?wJ9{+Z%Ly5UEthHpe|qT$oC8h&I}!#`3D=gh~3 zAAG26mVnWWW3rp!-=rEUFwpQbvvSPN&cTMy8642A#w8klI|8ozaZ5LREG!r?G~jwJ z$MmpYrhD9hb715p_i{v!f2cT-Zg_)g_{V0$Q&|mf&1!h1YQ{0D;TK`i!#V_vhX15f zk54$(hJl7Znw4W(b`CatU|~Qz7?)^x9RjXK+|mud_|K~0xw>ljX|{%cp&BmQNm1Wm zj}W4MqH6ehFi!ONsaXv_FRS6Epw_YBNA>R{sF|{VME_2*@Bhnwk`W)Ugk$>q5382& zdcqfu_g_&Z;b#foGsgF{Vhp=)%-@GwFfE%gFQ#EJxZX*_B7M_P%^z2zkrvCC`v&-j z{ZWoB0k;(z$K9KTd1TG_^saP7j}m=Mu=ze2!8uTUumBml6I z9W)cp+d?v}A^E1QgRa1V`3%WCTScTLGc;3j!y1z1|CY3vx@d0&qXUI5${2#+fA$c} z9C7HuE=HW|c#wT5F43&(5OCd!Te?}pW7z|4(iQ0e*NX4DXEdu;MWmZ`s*-+dz+L}d zX0z^4u-UAP0fuH}53tPfgl2Uyo?PFYg?DHzQ_Y%;fNKVBqFK-Dm^paZO7s>iSZj7# zcBN`rqL(ohuEcDa7wPkpy@muU?GZ2Pd0Jq%`S6N^PXdyCfxNf`2A$^jWf)Y0&gmio zh2p2b`7S2P^}PKDH|ICFO~QWYQYeu034=;7Mp!TVu9W00#c@)_Gfw$SM{bYN<@>jy zpOU?F_YoO;yh}&#I*Y*73(pI3c(cx47J&rQBGB%ZjXGn2*sb(pyPk$Hm_xf$>}=Z6 z+cMD$)9BU_Ks);74`h^{+tVx^6lmC2(OlYp_rcv!_)ri}V2;B5{`1}11Ndj>9|0`= z;5DElI8fbiVJy+RS}jMiB$u|FOaDj&Kj{I!S|zS#tcy;u)->s3`UE zy{sZctv^W@LD*gdVOd0GmdXOF*6b{TP*E%Lir*KwD>i#2o8Jd}+b)!B&SvjiaMIU` z+ihfN89oPiKLX^h{&xpDOn>wb2tLKz-+6nDw+*=YKE~}HT&_#;9P;6yb`dTYmc8Pq zyNT!LEr4520dB|P!ulCw?F2@(;l}*VfB76aO@9n(zr*GH+~df37y%zjbN28%a;`++ zEdtl}AUPi+sDH-W7r5oP9tmm(<8lumvG_Hkr(N1_Cgbin0tth(<+$Io+^v0rfBu#a z#@FzQ|AZ1o@irDWX9aF26I$YMo%tx9*x}L>I90dzV?pgKT>2O{=-wUCt|)Gcn2x5n zMn7&te)0)B@+HXTyb?FF;8%cK1Qh*iufsJC0jrex03Kk!qX!Np zBko*McO`FE zhV&>`F!|=(Ymjb5P->lfMezEexI!W095;>haZX_o1%x&4LvM{y6c5~22% z4DxG1(s?=Y=Q;-GlBm@LPI3(CMcl^$xR(qHbRq^1Hcv!4TOh=BDXe{e5A^jqX8*^? zJklY;14=Z1ZzOo3Cp@q0E)q%@9+K}hn?srP6y|GIglOMCcgth*rV#m`<2)wE*vX#f z2U=|roxWs{SFUhtReE)kv(owVfR5rGGQGPN@W7WOmLs9ieMM% z<3@V!w!zM;Rgs&Rb7YAql3}aJenXH@A`=+yT;!5PIa$Oyqa_|vYQikR`hA3u z>I|Rki~zX((_hNY$m#_Dc}V*^F2@8%&b#<$7tl7*UqQhC25v*1MQRZl-|w$T8-kmE z6mDnZavz9zIDarx1#f%tHifrCaq}OC+jF>_*hkkdLP7p3a628B^E`+DeU$JTF6UJ& z1wVavr0C;#i{jSvC%6&Wg_%1OxI|@j9p)E#kHFofeIO)o?%ybZ*W-TY6>hxl(q{es z8i2lx>8^1PBjn#QK}%SZ}g;#SFE%lbXs7NO6~@tg}d#J^YQss=qc+I^XVg?I-Cy8mW_Vc~jTS1`1TvT%L5 zt7WM&OE0%c1ywybFrr)h4MxK>Vb|D_HB7tgQy`ny!?r)w5W7FVb=z!tHBZ z4w!X4ec&f~sx02S7`&giM|t}TZ!hDP^CoUL;)2DSlXxMht;LnLcn=}o5xgCPn~}tg z$TV+_n!g9N>v7S%HFA;da9lKRjdu|UzX*Wlt$rtPj0cFwblS?Az9&-kNxbccn{hC1 zzs6-*ypIdPx*uxPDR`*I$7?6j+7U)uWcJ$B^BxcR@r?RfO4V~WGyfd6M0o(@_1J37<9 z7Prb*5W`&!+4KJdf`2`3Ly@LK>T*USAml-=_$~v!{wv-l@!T%g0DmVnt@@{`aYZinO2^CY3tW?3|qgXVq257I`g z4Qi2V+}b(#=eVF*q7Qx@Swg&(@wNcBOq+!<95L@gkeI70n?=;(mbKiA(l@GFvP$<< zp)66JvRSnA9@^7inoQMo%&KW?Z%s7Dn`Ra6zyIL}6qdAhw6!M+=ciiR8k(C5!=+V` z(okVZGL|V!)8!H>zlHpmEP4gF5 z&TpGDrztu&UXh5+(I!xf*wEE`Ox$$=no2Z~W!k>77PROfgS~jD)zvmOjVat>DWeLvfe2+DHd zw%I2@6i$fF-3eK*o7+~iAl^2&MhpP$fJIZ9+uF66HEeviEHgC{sYxwtX>M(=f!uer zBr#TM67jkQu%IkbABrXuWwBTy77oXg5a=#Z$7hyUT`en|&}DToTNw#xhUU37srl$7 zv(ox-v@RU4N};|`Su_;MsI*gt9jdy@R<%?THI2=2C?d1&ippp#R8>}PmQH zTPp}6oT{v6pC%K@R6J6V#3(+oVQx#~u+YhxCGOh3hfF+RGKe_rz?qW|5iDDbUG?FzaJVv71tG7Cl_xp0 zI9k4arQveaY9A)3ERI@|iAby}8Vkp&>O+&+b~{ctRb7E%Ge!v;S`~?=>cZh@BvoHu zQCT7C&Oqv>%46xu%`t-N>r!=33fUURD>dJ6cGFDz6FAtYP zzX*QfGjn;4M#=9TVZr?KD60J zyTC5`;TT2#=M5lXwUqEas+&xg#QfNzvWlif3l_~T3%9k;Di1H5UEkV~3U$Lg0c*Vr zy&tV=9SM| zv}kep+&M`sbxw#@#FEjSXsoMwr86o!x6`SG2#pHP~Jx6W!lwly`Y z0po4avD}qtXiBCQmWs`Uw$g^?vEiz+sziM(QBhZ3S6*IOf9!&W_OW%qnw4rA8!9cY zEDei%)@}yUYgBq^DiR4tL-A;+s;aK6EEO7?nAK6*Nndso8ESs7Z;+Pt{CH~v7R+I& z1Qm>EiJJM%4N0;85pQgm)x>qPw1g)T3?DkXF{IU4VdS;K5nDKF3zyl#<+gBzEnH~} z!|1oltg?l}85P@W4%@2^+v^V7D-YXihcZl86SmhMwi6JxQxLIJ5V2Dbu~QJSQxLIJ z5V2Dbu~QJSQxLIJ5V2DbwNnrcYl2biqsdJjbG3M5V{-zX+}M~($i1Yx_SRGiJ6Xw; zTJMxso{ZO5Hn-HwNi9OJH>Q_CY9EDLRoF@q8#Q9%D`QiI8%5k$IiRCm+q)UNTMLAi zn6B;46g6GcH&jWr*ikM2@Mtm&rUVWnhn7gGpe~)h2tKr6nD81$NjyOn1;0!hH{%WH#HZVO^fPM zH62Y2O%2E`|KyxDH{R3%{x7N_ceMi)v=4ysk}X@<78892ex*CDx?1!a_t28qA|&|- zBE+qxF@@d8nh6uok8ICjq8&eEGP|0K%?{l)yvg40-DWrKVsgw~)bE*&2^mJ;w-fAL z%P|PI9L_Zj$%SGcJ!4G57|xV_5dlM6gJNvU9KRTNS-6bAu+PHl&as&>GP||lU8hgX zXCvE`(OpQwc8`-?M+3II)m&P#O-@KeY?ODjk15=4Y|@^d(K4TVd`ERo!1S0*9g?aa zzui=eHg@+Uw$oe_4<*V4@!_y-_AM8aZyD#_vXE*c_kYvYPVuDT>9`KZMO%Ukm?#tn zRxim&v_6rj!p?nFMXaK#d@@(=KVAln*k;%M=w+ZS)mRUMxd{)Y+clcd@~J>o#mUxM zwo)ZWkz7&H)q++bl$P$>+B}!Cg1LlJA=bS0&8^~Jn3{|&s|OZ@rLrns7Qs~(s*fh? zWAVuv6Ig9`NhKcDwbe92S8yK*HO9)z%VTAAi4?>W`|yd$nl1guE2d&8u}x9kb^2aw zpWV==nbwT9s}!(V!FQwXt=fKsir%DMlCDiZ950evnBg3-O=&Ub<>`k{(5A$jl8vct zkB=XnGPL-#1CuBj(wM5pQ~KErjY+MQ%V-teI}Tr;1e{YQHDj&4u)X^itlL(Ok*aJe zsE_4z4c%Lnh&R>DO|{PALxQqUI8_m_KccM{w|T$N@W69KN~is*9jxZMiC zoToYT!(l8aW~JI|+OhP6rmd@pN2_9?SU6H1PvWsRhI%@E+ct}7=j@WT`PRAgBh|an zu%%037uLk<>+!4wo`W!b;O+$<1awLy1$So5DOhWj*C!JxoBr)O&v&MWDaX5Pg~GzW zo7IV^=|{LSA>CUa6+5``l)c1H*1?r9ULP+jk4G!Y%CQ6Wqg~?TY5)J8kst*?JY4-> zZQM3z#>z6=%(&f?V5aeGZoH=De{M%RG;b(XAFhwpC!&>D+l3R+wEQD|*J;@;TRP?h zyCWS>T(YR!>D><1)194DiQVrS*)MS5PsZw_(aKmn5-yKo>rth3dmFdI`s|`l=o{BI z7s9Ab)eh=tZ-INmcPqyc`eVTTAg&mes4S0{rRu9eDL`1S!n9UK)gCL-$t+7FPh^CT>igrEp`40yOyvTMRCUb~lMj_#J9IQ9W~UN! zV71E88B3K{;;>5+2N6>7R296`J7MhzM}%xlFndjOT4lK)OFjg#otfa`xU^JIURo+0 z>q-x07fq#;9ry0cK2;46o!Mn0lA(Ac6itM2vLPC;J@4QC=2~;V4!r6bZr5o2-cxssuI25TbX&cdfxt zWrhZW`(|A-94)Vl)M1EWWok$GacQvbbimjVP1v3FS`zoIb!V)ivJ%e^Pn1P@G$|4-3#H1#b=a)mNyXWnty30; zuvou?$)m0!REDKbY;$b*kzR!6(RWaR7P-SJsPUVijAjQ=FI<|H{o}n z7vvtrw%H%HKib%CejTv$Pd|mxU(wRhHoFFAXJ*&nH4pH}0ME-)p=7)+5lX~jk-GXM zERk%aZnrZhXm!mCacE9Dis3Yc#jkRa5U$v}Su9*;LYO9!@<_A+Z>6YdjW3YY3y#I{ zsDS%bi84GMPe$UgcwIaiMFX~gyKO1jb-PBE2nouotIenCQn{+gEpLH+*MyD2yZsbV zqDQK$(IY=Z{%u=wVnQ0s^C_Lhr!pD}C(0{hl~t)oI1+~0vb799L>_GYoiX2|Y)$A| z>PK12s3@E&V`kTcE0p88wO$WLss62<7L0Yg(F5-ws1GIUE0f{6Bwi|#f$@Fz4$n$7 zH6%0~AB)Sg!wuNUisN{%dfgGv9GkB72*U@g0f(b7=Czu76IC2c&NwY5F!wjh9HEYj zu%_y2vnm{LG7%11&;-T0{r-~z-|D6D;t8dy=X-XO-;M_bIIU~5 zti(Xwn!l83HHr4^tQVB91EO@3uHn#W#B&mit4LLSA{MVm!3qeMRfce8I0K{GEdWd6 zly)+wLra}+={!MqK3fS#T2po60H)f*EyspTESAEqHeRlRx4ht$2R4LV$AoPUyQ%8r zrP}z~rcPI4wQYT9j%!$!;^1hvo{qG7c}E&J83#po&e51T|G%p-mVkVa#232ZwRnOh z+Z$9abhObl++Gk+<5iO=aBSrXiHi!9Io1#iDM_1kEZfr-$X;OK=3j}<*<&k-fhZf z7H<=5nnTa65F84k<>AU`MO8RfSx=wvt!CK;dR1CU;C6MjU^iZbXyfn%yt!$19IwlR zr6l5~HYFOt{P|WFYdI0T72zLF2V^sPJ8Y!wKR}rFV^K%7 zDl1ZW99vPIj8sI+D$3G+EJ*(`YLEXxUoKO%Y=XQ%e>#A^q1*a^^>+#~8 zNF_#$>GFs4U7(+~X}_8C_xHpfo7WNExrg_M!Y2|tvv@iHzlI-x*U|UHmTguDFc(Z3!MLY}-m>-IVk;$Q*@iN-x?ANVBF=BUVfca3CDo@tOv6Y*OlvPy5u?Vvx z{167?j`6fRAD?Z9n%q@qCd#1^8`LUPorT7;!f-_-mWYHy6&3K97FyGe^F2?p>e=r$ zm905eXi|5(d~HXUeSg+`IHOnPTv%RL83~1X${jX*EChvb@A+LZA8zla#{c1digGz@ z_Y5nmiY3ab!gv`k&W2W$^TfA*=itt`QP^tz(K=M5+c1IO6@a+%wzu%e@B zL2JAPb@KBnsaUEmUR77l4<}8=>yeqHj)QEyqFv|nW3IcuE59GBz8|Hin$&O4#!n=? zGmmk1+W*HSP51ys_#nMO?dU=H@NK91XgHdLf~~8H)hpLJ6QSGntmPY`<~^GSko=?^ zp5B&=hqsaP%!jlbICy+6o<_^DiZyHs&u!qySzcaWR*olq+uXwb{`TCWY@T?6j+V>U zzIF8!Jyu>7EvqaqPhcM|QdJ2XXWQAjy_0M*yfdEJ<@k_GMF`V&IX>S6jrJ`(vrW<6 zHG8yM62|TH&i+1#8?`h3+204D+ap8U^3ldnzzbI^t3qW7e9W)X6eP^y;_ISWPTkvn z?C|~Y;amD??^>d}-&eabfzRW`Vr6BO5xmDaiTwo5IF>i}_uWf2x!jVQRV6&q#S6MQ z<%oG|XWVnG_pF36oK33|W%w{=9X4F(Cl!UyK{~nH6}hG0cEl4??38bFS*lpH?d~*v z8r1sbdvwn>N78nP!1lWzsrQ$cl|>Rse04RIh*ja$WpG%8zr^-4=YSuKAMUnIsPEHy zt+f2p8`35$+_pn-9Kh#5Q!%{00;jM$VePt+m1W1`3tgJ}44wI*xvhOz4j+~4jt|PI zg=wb`d)dD_m;RF6w!XtHKB~QaAKc#YZ^Ql1dC(TnA|q9bW!{i#f-vFy5VLZ6FaYN#j|C3#?kHN%CaYBrX7q#A|dgK zBCEM*=?VY$_nlk-kVO&zi!8FF3Wrry1PJ7E^6ck3sibr;y3o$wdP|9OGeQbNH#|;P z9@^HqO0MI}#0#5k2mAS=Dh80R2sm|JLLL=indB;n5hN&44@~k`Uu&mPr=XmBGivqZ zrCO{e%l46fwjc=AQuI(@0ff-u?uRAYEEDRW4PRKDkm;PDk3AsTW0{n`k_`W3hz_}n z?WgDR&V9S?eUb1TsY-nzkUuX&Y(@b;EGZuM3BIG^H&xVzO4Ob515A=UPD&_OnGcve z%&(jB^T2BwyawzUX&C7Dv{<%xYkOF^^_Ac-9V>(6ujd;6xJzNgZab2PPD*OxZ% z4%Wu~cYl2M3EioBivL#J=kyA{ZyrkS=JFJ;>+<)QLVR ze0|Ag-7R=m#Jcg;dr7kEbLh_P9|-&=qDzMZ(Ocr2|GaNdi1tV6T(H=*zGIp3hnmdE z=Z{~IYQ<-7DRZ(cd|xKW4n`Tj2w<7d-nJ_>52W?Ql9mmWw(6P>Byy8PuDp-6dkn1? z63Vz9%?L*>%#o~EL|L3DL?Ck*`Sx1-VWiVfOzZeY50DncrIB>cWS!y{LARujw^! z$;qxVk96uuO*?hs8;FdBah~|8Lf4!!&N3wW@4S20N#j|}3-p;u3ZMA_J)-kTbEej* zPMh1uwRPDzW?7Wd%+dcs<-W`zurq^>*gAQhAr8e$0;2I^V5 zkO1z(QBD;=LxUoYBk<9bgO6^#^XO8oG6Ad#)2N@=znCXYYNgIsS%M~Yq9~GxT})Ez zhG}8SFB$Q4Y0tZx~#}1Onci(>W zGge!mT}zZ>VC5iS489P@u~I1C$r7*ylvZgN9bB@teE99sih!%A?8TN*dlvp2vTa|l z#ETt&e|kb|#l>RvPT_Ejmm`~lDbYAAiIXhK0KCNtgzq+Qx@01A+F>)XA`2OCN>z}R zp@5nXqe~}NT<}Kf`~^DdwSJC2vg+d?*ytho?Jtk@#mCgSQFkMBStZCOAyJv;Ws2aq z1YT|jrhSk?ba3J5x>V5-%|uR=n7e=`VgG{Z6==lbCwWrDeu);6#H}~)It`QFukswI zKOS?r((BoEE#W5Wy_#UXf+UP#zXe4e0;#t|vg*y-j=o@fG)Lnd>C^<(hopOlX0V`o zl6EkGa#Y>|IR}?^(Q)Sc^T(1kK!mvc$88K0WO?lj5eXmaO@WOd`v`4uUOPe z)2)5)2IaXjj- zr!RG&!8V#5l@d2l{$o$vnE zaKr$`ANpk>;p>IVTAyy51yXJ*yA!{6wD8urP1n(EwWYvn6!XgjJ$r)?6}vRBb%VCTXi>eQ<|b1wJ{JWkL;^iXbEGjA{rFuU)#G*S?4x`1XMH z3wQ=`0Pk#5XoLb;niSN>xDw>?q00B99f)o=Ko@Qq^e&4Qi{X zGY>LYV@z)%&RU87%54o?Bn8_UQvyRF;=@2!EBM647RE8>`P{uH- zDiSyB^bR%B1_@y|7?$Pw(+Ef))f7zMvg@DE zQuL$^0F<+wp|1+W4_XtUv3MWaAaUAl7ZBVO*a%?u6(NU7cZ*%P`O-aYN^35J6MzC2 zz~^&SprvB%^luF{k%#Ss@%a7zv7`3$FrAv=_A6~y#UetQ2`>``R05VVAeoJ+m$SR$ zbpEY&tQ%VOI?($W_YT~cXypQIUm|KN51G85fLOvzqFg7SBpX)kbgwB77z}<~>wHd6 zaIi`U@axmn1)9n9n`c}TAhnf&qX)tmAQ?pCNQI~a_oh59%c{5ly+fTrSi`r6}F zlp{v5ii*ej%XmPhZ?x+bW=K9Fmv2<~De{)eC5Dg?Le6xXv0+=>DedAx?8!iE&BRk@B=Lp5i$W- zR=ZNp=6YK;7JY5Off=a^ndG97=!Gfa7dc?TzkX!YtQ&0+s|jAY8JfK?Qxx;L_>`Jm z8Na)pG-ycET(8Lmxgo`$D&kt3XPE)dAFx>>kSr{yM)V}}L|X_}&9$+e1PshK0(TXy zAvx)dl5bTpTC8#~4YdAB{2=thlrciYfwoa!_iTQ#{`QqOf3w&yYz)otl$sXI%5s4p zwyzp&fK{#^g_poaP#JJpxh&%_4G|#P_k})(&%BgIbv`}&M)WF6^pu7ThJ162KSo z!KZL;Lj2O78Q<+H8D>|ll$QG)xlay|uOv`D5_RJ+%E01o&wY+L`3{g?nz7P9~AN8MUQ zkq-Mu?U?A~6Jg1XCPfhPajJNc!~i!gN*`v(!HsulNNv;8Bfe9Szhlx0881x5g}}s9 zj&s&(WgeGkn_We*39>BXG)x6z?P^z|Jtp@(4)LdG;1#PV%aJw) z7=IXDH;za*wf2}(Yg_J1IYen0AW9x0gGC^PB!nu`dWi0st0r1pPmuXKA$MXSmV($N z+=y`mix{CypuJJ$)A~KA(0(uRahJO(p0V615+yk2$jG2_!Whfl zyy2WI!IjUo36=B7@crBN8Ayz*C{z^sDAPk18uBw;ki>B0(X|WqXUpQNg}7)o&k(!T z+K34qA!SUVmbri%6S+2t$vbh^&&hR2U^YXWCu-(#33@?un$FMFIVmt|W@ec^MIi&Q z!?S|LNa}!-Z#{bp_t3u9mj7*DC1LNYQkE(Viy+LvnKp*=?1)OF9`fhJ>*KfYZA4P= zlqy64s8FyJ-aELQ^rcHWflu@i)H<~O?T9=3U>>YM!9~RARo}SJB;h&nmG@S$fFmND}EQ*k4J>qr`_}#EETOZ^svLpp+MfiROLPnn~6h zwBYh4+3LhP48vj*55#2u zo{O96@ugRA;_N)Vgbk#f+vevLb5u){KMg({97jZmvM@trHWjF8P>2;ZZ@8q>2+oy6 zIuFd`4Ne-P3E$XapoyWJ3;;?JkPvyX84~Lj4!hhfwg`q@tkKjzjB#ykq0l)?*lDObMYBhC zF=0>BcalOmbg+;E4--H@90^?^sz(SNOkeA+gPz30(qZw_X3K=*EhvM-r3S(<+Io?r zDx{3S*jU0-sl6a;_jF&a6A5#$rO#3Ec9h)#7lUnlO!$~D#)Fqy_=4+HSaA2 zs-FN{6idQ9nS^KgnA<(pb$bLofc4E1xHypteEBvr=#}v z8ZSD-?d#VyK25<9lN)x&+4S2`Wb1=Z^fwAEi@X5k88^ov>znmnE;~s%y?kbMb$y{G2u`PPIuV~e~ zH0yQ#c+=gdm5pCmn_8-Kw4L_=^cREx!ih2QB%oSocd@&Pa}k@?9=u@})S`B+5oMsl zoEo_Txu-y<2kZeUfO>~MyG{5E%?30BdIu~ONRw2=p-Mx5EvOP*-w~xTmyWJVA))v9 z8ND6Y|As5?yV?Amm@dIR`m|83zSMJf z4sJ_%@Cy&=NZEMV+5K!MleG25-@Eb|vnG@z(=K>f7@6CN)wZ(OhQMgO*8u?43)%2e z(}P?V4?eC(Odjc2d=PIH^>j;lmZ+%oSr%~AjS)JzzI1Lb+T&PLJ=2Bo{~kf3ByNoP zASvu#MjMKTd>cX*dkaM5l5^lzgeV5gsb62KZg8r|=7!cHq@VBvU^c*KPk{pZ!h0vK zJ#^`tf3i3`>7Pz_GoPZtM>!fT)CB()hCPnxJNaxrpMCJ=v)R%C%jk169Pak*+B0@` z+1G={Hx!F2??*9RVWOYDLpqR~h@H5L-Pk|#*+*3jhu_XVK0BeMw(;&?-aw?!-hGF% zR5!YFjN{7t_SIaeAI0_Q_}RwHE!405bQ=+ZY_T18J+7Z-)1Ow8iQA2f8CZL5*Ll{f zNx^N2q-PmnQ*(Z)_V)Wc)A-t!&G7Ewu-0ELa~@6EqtA7f@v?UIz5kJu*5evZuUepwvQ~+PLxXsk{y7}lk-E>%Lx){5rThh@kX+BkQ}Wm4 z3VI+lUrmcFVLobb>dW5W5PA4{{&M{K4T=h>11@1l(9gZ=Lr$jQ@aA`)dK6|FjSJnM zd%siWn5hnlRaR-Xc~pdPQVKLr;wAM&u-8sUSKFk#S)nFJ=(2Ia-R4;BwO$)*D$!6Y zKmmIk#WKt|%-0K9(+))Hwt(!{_7qBE!0%Jv%*N8nwTRJm3b=@vY0u?qwPTNYgc+YJ zqpH}7S^#pQCtaQa4hy}F6^fvnH{65Md{~XxX3sz8U1I*)>XZrGNa)m+luQJEgw?4p zpMP!IbkYM4(TTj{J&px=2s$wG&oT^X)j7ymjz)`N;G^G0$q9)Pdtei}S))wr23uR~%@J=x=*HF#j z{8d1c^?jbCnV{Z8JyFdsx0XvY<2z3CU0Yk31J4N!JpELn)Sq}E)TTSd=12Z|DA4#N z$Vk>J{VUPp#g{Mfr_-sy8`&N0KGZg|oY{_%1N;5Z1yWmo{CSc*cFC?TYxg#&9n zE_b1JG960_R?OdFzoG55JV>4AW#%V-7~^LF@1m3T)Vd`>m&Jdo`HaPg1O69&p)>tT zXAT6EW?z9Mz=lHBFnVnxZy0^zL_wRnc87Duw)$W=<3{1`#6Ql&Yx<-;Zq#N%Z$(K zVw{j5OGGAeEO_&V69}bNgWS24kH6qYF53e0xMS03JJ(d9@5c!m+@bz4j0ymzJFa<) z;@u#SfdaAx`ZoFK0|(58FGng?C;6Ufm_C9?kq}8NB}=j#gm5Mevs%EetnhMGC!=HT zXV9F5pO=#G!Xn*ll%|AfhQ17_(E5~JP3SMVD0Z&tgB+1+f%@IC;SkbA{+bogheCy zl&jyS zh;pBaTt|ArE{>i1us-o>K0Fm!3fRyxfmI&GP4DPI>qCtYqXd1d2rh#s(2%P2iFBb0 zi&1c6oUG3ue?wX!55_2o8O_Cq(TDN!%}5_qv78YmyOQW!&QPu;lDt3}HwEps-rEh} z^qf4PO2e>&aMeiv3xsC7thcC*=N!G)^mASCIJd9zQ_rqlqt@!;dGYqCG~7q#K*hd2 zP&A>z0DFUfNbf-Gf>_L8(9lAv=my;T`tVT`gvII|62J{NLcMD$8TV!816h@?_pv#r zsNc03U>hDL`j3_Jnw3dsJuA@oFrIU+);hP3%>uE=46Gsob|b`<0T7{#Wr~dP$d?JM z@mBT?;Enn0oo3%-Dx40>AVDU7m_|u~rr5}BXsfpRQq~} z;t?ToA0bW=_^A)87<}-wipPl;V;A`xQTaIW434URoOrC;SNn8I$XTXyVnswqG-L$~ zKJuFY(ZC^z8j4E07&+~dY~SFkej3PWhj`_6)k01^4)9@}?HRzJ?5>FbBP+?ch*TWQ zsEC>v9lQAXrY2G-G;U>->+AElq@IkuG?CM;%PtbCq}EPtBx(+9&81*95}Baoc@E56 zqy-9O8aI@QMzdZk!N9A<) z%>jS<)S{8^j|(01)Fcx%wMo52nEP1~huFK2#W`4?y>>ZAr6K&!!ctH}8HgZ=seLPw zI^kx#XDp>>zI2U`e|Hqgc#~g%j{`k4E`yBe+%O@q=*=50hd6ig@t%vmn?qbaJGqer zi!L@9&qMh5^9&UODC4-)6JxO~I{9bmT--S?YEnIpMIn7OCjh=~icp1=2#z*yxTIsz zXJwB`{2g}aesxP`{#;#8gjA!q??C}6XBo=)Kn606(;Pvx`tmvV-x&&5-dpcIo%bq< zm+}A-J4j4G*C7IrQ=!jQ8pKHQwAX0#SJd-rx$CQCguH+d9hhKf)Bu+twIjvJes>4Wu#qz9d9N>z>s_X$(^=2II|`3HP_fOzab5 zhQ?C}jg%4c*5c5VkKUzNZh~rH^Qc!K66lKDM-UePl9z?LQJYsCxIlJXT=4qc6lacr z1PTrfG<3w2vs}Tuz(f*+(69BCcBhgv8-H9ak6+Gy<$X`%vt7hm<5!d*@ma#z+`EZY zT($#&^XywO5mO0dwdb?x5(ep-1BXTVYVvlpSSm3YQHK#wYm%WGRqRKZ3?e@xFV@CA zN0%_|$de|Tv^kX%45acM5{vG`_K~KGnlH-Jfddh(4-DHsok;2~J|K*sDHMLnqcD?M z7w=pf)x-^om=i7>$VNaHp{_M}T@KY0#@gmhC)h3nycdUmdhZmPF^raTA>V@5NAk^h zQfz)`62a>T^Da+9%k;Uw?PXX39}SW75?$Be2@?QZ0GRTYQ5}65c6oL`+lqyCcit)L z7J}@sT9|J&2)4%KdR}$&AOYhby82YPx&oGzs(z^m3M7_t8H=c35|zPF!El(}#WQOY z6%qDzg5O?<@o3vIb1Rnn0lb^cFVWGmRMe<^=iPU9GJmVh3&f~Wl!T9_fP~gH;e-uc z*%YA^3oVmj?&RnXkd<(!6d@)-7uvVn<&hkHW;k@K^vbho#;eqGsMhr9_qS%TX)zn= zZ34+7#U;&T5;CTwM28(hmNXZSKC2EyTuGeaa2p)~3-&yiuN{Vd?-bo#eBRnBE}^wO zg1KJ_UL!V9pyg+d{!P*^QXjVMWfGfFWge)lEv(kzSU4lQGOMcZ+@v$@zKKl%0*g$= zQpK!e)Tqo=36>Qn5sQ45r&$O`Z4N1IF4?4U@O(;;GfaOtbgZ-01a~8(gM4(}cLl%p zR~KDN;VQ%~dz95G-m5Yd5U5ns!fPVzzfok`d0%NSzP&O*0t3}(d0(}+*Dyx==~R## zF#oLw$Q|{Q_|q!3agYYQm$SeTaSgVT^AcdbKsw127?~l26Fz@-*~g*7s(iL~s^iza zEz}N+X7o@NqvwD*x;J%!`+6L@WA{E#4sz@rQzLf)WO&(be1*O>1xR(->auX|3aB(B z7I->(yh`%N`X6iG;P-+)C?1o-Q$_&cVj*$>69Qv@QSoMKzj9v*5y%kK<;=>#O7vAe zV#vV|(1-;VAVPmPa>>Mu=VcHg>PHt0PDAs4AQ4O#y2?2SZkB-Ri**sGd$7qM3+MYFdfT{2lF093)0Rgy`d z5W?%Jue9&_!|B~Ty&d@eeK+E-ysiPq2lDtL$wSTOCy-!Z(Lof%K@tSK;E69Ou4#l@ zJEL+E_R`FTO;=-QIs4rw#K?}HQP6>Xxux82?NtJ8mv6;dK!T$-F3S>GCUFih^#={yzQ&cepl4pV=efK~;{^Az1mA_Ql zY>)!g9Lbe3WhoNo2zFHDQ zQ4|(D%+TVZ{NI-TO8tSE} z!tdQ1vn&5@>!dY1o_B??tOlPZH0)3Pa z>O~4%`aFt&p^*Wj6|ux!H}@fwAKtxNExjk5O)h=^!5-bGYtTe@_SP%pA@?j(v-8Ah z`ufok%XJQ3IZZJ8t2?_hZ;JbZzD&**NDCp~gy%U6I0LY93DRm@?;Z%byfyo(m9D=8 z!Z@s*yxvU|ru-HE|BnA%@&|g@0{WP!2b2@Xz{EnIHHHlQ0KGXaJ|SH_dMfHI&Q3cW zklIYNaP(1kIJn2%pAZH13v3OtF5)PSIg05~eHQ^Ooh}@Gez)0`{|0;go(Ym1*#MkuCQ^EfkL{b>d&xf2L)C(#!2C7bkswcFXtJV|dC7wUPOZd(|WH-LqkIlv^J{k%g$dTQ*9kmsc}Tn!4oC$BWt0q^-V8PWOg(*Xf=&lu^c=!fAnH%YqdtkAW`}svyjP`O>`MoXbn3 z(|b3*@J6t-X8mQxd#4JVJd^1sWi%qm{T`Ed#zn5bt&N&p=&;5E%ar!fBn4+Yc}k! zofy6h3q{+2CS!B17OTmUWhPt3Kz2NT{DN34pHa{?0p^Ry7)}+Mz?9TSa`v`;9Us

j@D?ujnq+38^2xaGYR(v1aaoYYqFTOfvumRW!!5J4FDFlfGb@!MF* z%8==FG&|gV|4GYWuYKV>`(P5e^4`ELLx!+ck3;&4v(*%!CGw5PC)CSXrz0u?Hwn=2 zC_`=uP{C!y0~8``y|a4Ut|IQOf;r59O--PtN#GY{fs_9rm@7;l(vNPj$*p0}``rbl zME?`u;&N0-`YNiMh`?8Jw+^r=yyi6!)5fOlbvHRjXS{(1)aoX@Oh@Mr*4KLrXD2dV zv?sH28*9f`kpTKGQw#;_0&qiMK{s!^+dcpMoStDL9^OiSR)g4yAlCYTrfyxEj_rF$g}2HYES!efBs7)c0Ql@ z+6^AknFBQSeP6W_f&S~OkcH4vRgg)RCGZ_pv90R12jP=9OEC4~SAjV1|L#|U z7D~+Jn~e1g_O{6&Cq+o8FlJtYN~?kzY53@%mkR+TsgxC&LJ3&odb?Ta*!m?z(`w4s zkX~1ICJ;9(AUf-RX(haWn|(L?Fm3$m{i@f!YX$M8&e_shyKiJuG5-p2=)Ht#g29)p z7cms)h+KpKv@4^6G8FHbUSu-7dv&6F(2T5Rq}Q&44*JPr;$`)Nzd_U@I`%|fgaQRGOXzi*tO zh}s7bhD&=r`(Afu1M7r+g{EjrQHZ6eocICI%~SVj^$Uny@e*a_JYX?mcF;Yjp_=*b zGhOC+<(VA7;Lo*Z)yU`JhOhJSx4%5Dk95q{RQ)Y1t>{n#z$h1gf zTW+H%8=RamUo!{-!59o?*NeemE~c;X`%C)q{e1S0996oJi9W+C?mrd_jkIpQvzUw} zZXZtz^>HxxmHzsHey6W(j7VD(Hy|bAvWP3k3YO>XwUSx z>S(C}ir^cj`Nk-2f{OSO;GLO(TnK^O8Dn48K`rpoop2SjLUtH>9B0NykqY1(A$pZ6 z*lHyuYq&^NXAlh*^HicpOJ)cS@CXF66GTIAjcdYWN!Yzlp90sa>1Kbvw8X->rcXIz z88#m!2S_tvD8qIa-MN^1W28dYt@4O3qq_oN^a%rG4KagElPm8B+)j>#P1*?QIV_;d zCY6m23UmY#MS-8N($7H)3cgZ|!cCXtl%CS_{bm>_M zKBR918=eK?IJi`IS_nizfzGfD(j;K0EJ2oSLQQ<}xtTPW<26=bfel-s@t;^K?}hu# z!mwx_G91!E!ENW3tKK`kwyAqiRy~NN)stv9f6#2t>?S(Nmw;RXS4l83T04B+@;VeY zjh73(Ut&3%Ya-IW{EBWC)$-`U#OB_VhD^7lG-~>#F*vj@k3`CRbhY=BEDTujqF#fR zp6#}?9QBGN)UehlU0CT2k3D&ZH%YBvL_9SVcWgI%R z)jL7#j)B`PEsFiUw-l;}AS-OnYe ztn0m$lupI_@oVtI%d^r#O_vj@nz5t{eWHlULc~Fyi8P`52_o$3mNV0D2ZCftd_=cI zFFROk&OIua$kU>gJx-i40h1xYt@!5JiHx{JFQg+KXepompaS@NI zQ@J`ji&Os`T-izJqjF{xlopChAY=lG0oY>Ng50SkRpOuXq^Fbi94kg==+M=o?fd zW0NOpU~$z0XUz_wms|BvoVA1AbpX!ViI%m8Jfc&0)h`{+5^VRgbs@9tuqyX(YEJNU zX$QeBI)5UHcn(NYR3Gp#pr(MA!J|5mjnk8%+?@^~@BW;kFJw8Ylh>0%zMsvdI=cyV zFUhIHN}tShI{$(lNN^prP`=6LKToI~C+XI&2v9 zd;QrL2mq8)`j_=!Gww50mOP4mj@)Gv5!4s&A6>Qvs4kd8#05icLBhGpV-+z(5^4r= zpLU{R@Avso1S0aIJOCORGDlntqe zy=i6M2d@)Sn=|xs5IEF1x;|1(gQlzdrhIi{t<`zvL3B?X=GN*N}^!>9TE_6q4dkday)%KLU9#DDSQaIQo>I;O2LX4B~hCA?cdxdsT+bCxlq!{v2HGkqf!NWjQRL;F&~}aN zg7P|Qv5;Y!qry#~idm7IrVH&d z`hhEK;R?FZfkkbws@!gvv4<7hzJhy|tOp|o{c{F`H6tcjvrowHhjSeTekcUWD13x( zfIhQf#n4@MX2v}E($7L~4@(D)_N-%7OVZGOy$<(3P~8ry(@xPF z+EoywWyyj_lmzi05SDq+uHdul%@40kBiIKy@~CwQ)=sqN&^9c{8V~r;q+}_2|i~uOGd9x>qL)-l=!VTwPCKKtS`z{4hhK5LpUe_%hYK z7xc9+-l*tJ_74oX;e73|7>@Q^0Sqh#jq5**V=)}w(4y<6MrUhDeC46P5+Dh^*DEnE zAUyOz@_rH1vHUmv5qZ_$i^)piqVCYtq4fSC{zEY%{13pTX8dQJ8S-@Wc$MV9bHqP# zGFzH6C1PH(Y6Z=>2S5 z03UO@5T$wqKdG8eAN|Yoe|c0+ci$ZFr-q&FRKHB2DA%a3fEQh;Ik{;Wj3qw|f;`M( zpuwYZxOv05N5@r`ODQshhl&g-RvV*pP{Tdv92c0YR6>O)#0%2Rr<%P$h>Bva)6sM_ znGA;xZ@Ja{rIa9|x}%@It4`o0c7IL7C+u$|Vi`oCVtEh&0~H*@?60|j2DzU}uTf3) zRGKuE{v4*@!e}$xiQ<42Qu^naF?tM3-Y(F z&$ion z-YpNShDFHuY0N|9xF#70q6i7X-mU%Ig0wzLh3 z_GXhpH_@=)rjHialksvipUsx$R}Y@oVxqivw+{NlWaH9bg3=xOxs`iXX0`n&db zbTx2m1!GE&$6leg7URVd5>MGlkJP*CW`fP*JN#>-E%bOnjmG6u(Od;n$D;_P5`EeDq|#S}f(G z_h_ksEqKHR86WtMo)A8}1Y&jh2-QTDv+H))*~o z%wZe-^v#biM&JGX;@8nnKffCN_|2+JJ>8oK-sD}j^D2d9y%_&ft^d%W zM$?le-8OI@>=+SeTZe>6p+*?pE>)T&1#+MmDy5%Mmz+mp@yI9@<+~-=naWqMuMppP zzZCgIAv#LjZaf{CK+BV-o=xY&Z!~OAOvbOL-e`m-R&QoS;Ng*;ZVcMt>AJG*PtQ3r zL5t8Hhr?g>&$fY?4KUyF-Ye<7@=TeC_l=jYN^dR@2*StX=@ds}!cFapYkC=Wvd#wHTtyzv+iPqhF=C_R!GALm=vnDcM_KRebL^ zTBV<6|2}^G=G*ZSU8_F)uH+9iCO2&>dt8l+xdYFvyqg<05PQNi_S|6>@St_ITLRAy zM*m*S$6~r<^{?DB?jW=6@1R_Jqi=`;*spIUe&ct1r}`XCg{t3!#_wU{_o(rE-1t3d z{Em}QJtu4Y&emSsd^2mlnl<0enlER~x3lK!S@Zp@IRMri0dJ0gH%GvmBjC*u@a713 za|FCO0^S?}Z;pUBM-Vhe5HL?K6zvc7MuMCJS(0hyz4(Xslk$EPOZmq8Wp^e>`6-Jwaa?EmqgpGq7bfpQBM18r6~gXwxr{eF3iHU5}Mi3y=EeQM)M! z%jxUo8}BO|ZttuArXPQJCWc3clMe4r6Q11Qdvox<#>GFpUuW->%beSL=amOxy6~2tJQH?y z?BfaipQz$}CziB~bG2Aamfp{Ay%)3&-V6GP^`lRpJ$dRn%V{30@3^uvUJ%YRJp_AT z68W%DpQcTo{T~!3@(jbqQT^uS%WwX3^y?4*^kgcz(@g?AA7~Bxh0RYw=>OcTT0UR5Y^wa2Vh--s^ z`}Trd=ou+|y5%C|svzGj>Lv>yaiCU3BMsQA&lvKwH2wbXN9+%yZ9^WRlh%4~!S%mJ zSbc2%0uqce9e#i!tF=bzb?2#%Zv-?yI(u~WhpC)kZ{NecOLC?WK*R$g{Qw@V-$^sX zGie^_c%c>BPnbp)#xhTQxG=&Jo%pC@oxSKD{gv4=Ja{UsoQhIF~2ZY*l< z4t>4SiNVb>D{9#6U|?7c(aI}Y!yS<&7!Tz28{>eynt!4j;~bV_-t zTkpB|EyUGZ{Tw{>dpy&6Ys`FxLo*-y;kKuMUukEkz0v&f-pMJ3l^QYciC%SctIh!g zIQv@XRFX;uEFSd_1q&P(ki4|!yY|9Ty;-Eepk4&MN3>7)p9QvYrgu z6_p|d8Lr*&Y;9UsZpAk~b&VJ6?uB-7ur`LCKu$2P-i)pTLw*Y+V0}B8$+ubvGlLBiaj@SN&hSKceV?jOJ!i1ontv?NpO zpK3lM74E6R>gNwr9FZC_1Uh;X ztHje<&l?5v5_+_taEI2TwTEzF{T8r!r?5Tkk9T4UHZ%D&BGVqGfccA#}^csl85<&^$-4Zl90ReQdsWOAZoB8N^5at*(V-`vvJNmj!mAn-55FdAg`R8nOxFq z#|`G{6+Wp6TYmt@^kU;a%8FRKk3N98xpChSdC>a%j{4x!Wu$aI9w!_^=c94DG4yHB zrNv97kL+eBu99F~`m9^y?a9*aDYty<0ZqH?8=>NV{pg6)eDKOutgDqfktBJkN~aXI zZ_&j~m3T=*$*?oFKb+h9$+5TQ=@uRR_%EplU}HK>FO|L2Q0MP#959YwK`r=ETpvCE zZ`aH}h{f1ifC!4@W5i~3jIvV35j>-~BRnp;sZezkakmpS2FK-FQ_!(AD(d zq3(Y^#gY~irLITt?7??ShA@Ij6eN6(UyUjBjrO&}OlrDx;0ssqZT|;6JM&-lca5E@ zKY*WbK7*^i`6S~Ow9nEJyAR|k`DSi|P;J&#h%k|&2KfMa8HoW6>H`%vuq1PiUX!dy9 zSM(!C`6nE$Qb%kl&Zuwy{T12Yp7q^sd!W6;eZi1cljP|At81@GZRYoF0rd@M4Kw7U z?`K>T1$>gmB><<5FIfh_)0Bl}TBZWI-pw0~o3q>cA2yy4`NIMRB{CL2%;s+~qBJNX zLGYPbl7&GAC-M3%-dCp_Ph|3$n@dzCX(<8epC}PXLGb1q_joTp!m|I*u|g&gxjx`l zn@n=#VQP2UOK@QGr$?kQ8maei5Fk`o|AAm-{Rgiq_JIBP9#wm51<=~>{427EG>N|4 zmY2Zx?SG8LTk{TL#W@^zNHIwQ01y{>f)(Gqsr3jpXZ-b}wheNwN)$HOrMXees-q}3 zQbqdCEM!4gX6S#0M3SUb*t#1tqqtwU@iLotwq>l=OLj!1wvHmjGh{u@rYtfqslowu z??WI0m$k@d|K3*mTmm6O}$?g1hko>v{e_TX^^E-8h5$A}OM!~-qUq&Tq?DEJ*M zX~y8S(3HJVb!$^0qlogA_c!-A%N+GfhC}z3;jp@a^22&EJI)I=L0oQLon~|P$X6|e zU!aU6MyM@7dN%p0x82(NmGNt}98rv2hwkea!}*HWCJ`$+M@wn+un0=5*~l>Hx7+8eLeFd4bSlu8_c1m?&!BXQl2)6JtSh@gU@(fNaUo?CphfC%3Zj zom1;`E_j6YW^qx7K%iw&jucyaE^hPsPsHX&+Wp;SX?T+}#%gL~C6sU-QMg(~sQ?_y z3q*A2Qm02Y7l$#DIHX^|ThFr%$u!b2Ch%Aykp*_7M2>Kp_(>sS5ujDg4OzDS4YyxL zKSvgePBfqhg06m|5Q5f|d+iFEKp?pDR#Th_!-X&)C&zPpMpKGXhj#|5nbd@80s7N^AI%mJ)g76nX}miuOIZ|* zF$Bd6G-$FxSesOR+m{6eC2k@MbFmPwDI%JpiZY2Zyp^E4Bb>IiJK8z?+SG=_=G1Px zH1;?EdpSTp21-2{4@!=*nOm+xTrGBlb}tIK7fGH1ai{2Z(!%vHain9IcC3CGBuR?h zgG^!Qc;0EOTOZg=y5V^orzq(2Wf{e2hFK@wwC~UQV249JT3SI1x&_t{BEU;J8{*13 zHv`0u+#)&$NLNyVixklJDpNSs=8|(VHe6M=4{KYjsvZy0L2zwt^!So}jp5{{4R3d$ z)2(}-5%U~Twm&vOMm{Quk&jeHNYE(3wyUd1i4esnCjlw<;1?u+Q5NPec)<457Tjf* zpv|P%PB~j#1jgY&3h@NmBsr}}C7zg%x7^>jN(>aT70GTR@@h5mEX4E^oJP}6#=fsN zxcdCX$0a5A+4R)k^h18dGwigRJ`8&+5-q1skPE2o(#;&f^-IteOb~*b(Emn4p*C7* zy`2zfq_H($>@JV4=i~P}*}AW_-WEoA4(o`QNG0a95#wo-^2c~%A zVKK7cpx)C__fhaFB9Ug$yGjMc+Fa`JSRU`rC1bv(0_}JSi8k=6SS3=WBJ_Q~kc!GC zT9w`1FCe3$@^Q8=!M?FZdX$_?B!3`Nv^I>iHv|I*z6#1WgDlSy87CRmeEY54TvGey z)YVb7Z#pqs&r)q1_rYL}RJ^tPn8Bdof+H!wIm|;_$Yk@hv`-o95b@AwA=&bYLvNrl5qe2fBeC67>u{HL4NC>dCWUkI&gF<$GajRA5 zhEod}tOYz;Xw$$1=RSD>|Hm+)a!O8Q<8w^{_ZxS=Fv_cS8Y@hE9;~yrDugUa8ik9v{-OUY%Bp%zhT zT$8msOq{S&bnIhIvI&u&j(j zykz5^Do>m0J~avVebKuWIX?v8GxE61<0wc}>ceH)d=c(x&>a0`2#SHoXqzf}tk(}S zO{OLdmc{T`lM}0Qss~14D zy`16wA%~+akR?zovaE>k{t62OsYy<3w_Jp!I>j$nk6c$CsFH7XOH z;s!2>q)IkaH7jzb##|_fzyyd#EQ&aYv%cK% zfe~JRt=Y}294$Z4uE9GN0A0v0{D`G-20zEfJ@upel1PZtOAs3+u(PrYf9MCp( z*mth!0q-JstHa-s*e5h7BgoMq*^gu#<#5Ui$fjzw`_8~U9g`4HF^MSv&nf|uxmhO~ zyPk)8LxXf|!8VO=HYGMP5!X;2U(=eW0MAI{!jA!*RMJVQh-Up>uK=y+UB2^$|vEB@ROkf%D1h_1S zhBt|t zdme6;GseI|N&xr-x#R))UGYTy9BWrt2i5jmWlZLZvUt2V&|M&1V9)^Ym?|i$Q9B7* zt1TgAxx}V4H>>Zd>3w+D&@#c8l_u^17vkZ zQMH&>TtxwNQA9g~7(`qUtr%64U;xZi=?TMO{e*Q{)*L*_4)p*=iw}Yz3UeVMQdcqr z(*jmN*KS-lkC{<EB_kUkBwrp2$X!>h7bn^1%y}d5Hd(2bi)KZGYZpPOT%ong$Tx;fo(OaML26d zqMDc`ee^DdOBv8YP*tILV1r`)$I;NCQM zy?Ou(pPS%~y(P-&R;)z|GLlL%fm2xk)C9$dbY)}DXbg#c0`qnFhCU*p6$?@;AU~kd zz>kJgRA1inl*oObI;)mSrfCV<5iusSw#9TC8QoRnNoyVkgDEx^V{Gh1MDQuBM45a> z->NwSh6$G;ig;luNca!|zG8>D?e1#S+ujn=H)z^H%uAqz0&%b`ed-WyhmE){)xVjc zAyvZIuQew=YU+6Kf14)(G#SdT0i=6URwdh9RV|fOq`n zZLPU(J9q1ALgT&N)M^Q~(ZD21Q2VQ(LPt5E0ZQn)t}1;i#qDDF_49X;6C{BSB=9(4 z0RW_mFy!#^K#F_fF=Dd|a4?g_u6igP&0?09#4@3+U zO;KW23HnUqyxVJ*j!(YxTjzcmyRHp8_%X0dDvq-th7UI^RZ?VdcVU@e!nxyq>Sb~S z8tiqwFzu#-Ys)wW;eSlva8f>0T|ZR zfJ+v~iXLnyyoZZcLnI zX5z-4d2Z%y9}c4r?T%%H>~!Etkieja?*?bvG21=gsD=|@4_J()SsMq*E;COV@JMo% zz?&LGa1U$Q)onC*@^FYJA3lr}!_Y{$Sa4YU&|d&BS@tO+e9wUdT4zXrh!WN@Hef88;06P8=V0)w ze#H(18+{hg9D$AmkvpO$MjQc$-;dze;0%fUDs1?JBfSm*=oy78WQ!4HYf}VkgCxlW z;knG`u`1C^+8SWhEm$Eq#?%rT6;fOX+UU_MD6#c1$A+fv`j+QsK0<5?0H0{MQJ`Ao z#`9^J4V~NMc)jihTFqh}Vx>$x1n=U$!8g7!5wK*DWYCc^1oW^B4%B!3Mm-%9_TaI` z9-56x?E|d0nz2UBYNTNb;8nQh%#|h*y;or3)|Y_fT#307WKG7(a5Yiy4?Tcr8!Am|?jD41)>>UH{Rgjqu9*jzY83<&Uf7%l+lt zXQ8-;)ZKDmW1~87zBUOXsK7Ptq2&U}?MakGg%2kiHE$sY;N|Va6Kxe;+PJFv(QT*7 ztUvI1FPn&-dUY^!pUG#eap|WqREbDt5)NaMG0+2WX&=cDC=wNb+<#DnHX{67X6o#r zFJ-<~L~b>|_wbz0WxKT?IT5C$D4~%S5HrYkfY}YZ+hIz!i2ToIaVbW0IK<@_vrLs$ zy+xVPJ;V}Z2WS~WN{l|1``QGWngJkt5*pv*=hj?#{@C^MW4;m4*3B$b=A-C42$1rE zx?4E4>dO?jz7z~1&5}1tAna!V?Ln4mcStAPy;p%TC(r>v9S270R_{CjL`uK!g0>Gt zem?+cRVkw^gQE@=1_&rqAWl0@EaWW!Xpej*kd9%~ZBFrMtb1mPFi6M`21t~^Kg~pm z!C-5mL|-Qq8lxpV%i!-xk?>8$K-xX!^kb_{I0!B0B3t{|#XvB|;c#t?!(nrbJDv%+ zkohNoD-_E6>+c>R7&d_vTGbhM-qC>G`*+0cU=KfT^M*T{-T!TOqejj***+;BUEk7_N9bvU0zC!)%o!%7Ap_d? zjqje9*;3jhlrf-NAF5!GniUB|MD+IE+3x%Nuh4-6HcHpR;G_=UMcx(X zp{arxqL?!0;Sh@iQgCBk-E@5di~sI?YWl$1qz50sjAk=#Kr`OyZU6%1Hl{*s=Fr+H zU4#V#cp)I7UxT9%H7>JufN(u{XdR({+4e&zzVf* zJhpG^;Fassh~tpeI@Bj{(7W#Kew@&*zYK!wZK48l=AWPFkaxA*otx)G^R0q4d#ohK z2dUQZvIdV7f8ecGYpQ#qcK4i}Y)SWtz|^f~61mmX!|oLe*CVfD;m87{8dtr8DDnhY z3lIyTnaErep$dFp-y-lwz?qvj-I-FLE&E<1_T}y+kW`v`NsyIw{U)|GP^ei!etS_! zR0mQu{GR*oY=^t@v)=yg6P?n-HH#kKq#$D}>Fcb@&wTm%%Sr12e^@=}3cXiP$N2Vo zi0U>HLS{wG0~G!W0I^Ueutn8-So*`3{)g#u_5*rs-5KlMr*0UhryJ7EIJIApZR>E6 z3zRYPCN0i!w}*q z;2Mg99Jv$>{x)}UpXPrSUs(H2+>_c8^7vMDi*;G@4V16CVivt*62@Z@2LOsx+&~IY z#q1s<;7og@;ZXP0LGL=ieP!QsW_RNLR4JXyj-Ddc zqUmM8Zzi+r&Fhi{Pn&130SK=ae}E&#u^+|Ygqc8!Ss-xM2uY7FUIcH~>y)y_GJUJT z5Oe~6ozLHU3DD(5BkhltpRNhc0$K}HS+tf(QPfsMP+l6>_wk+e<8dO=>!6ZXLHsC| zK%ywnqlG7F7!rPo3F5b&al6Q8pKT8tnJD__IkXWqpNa`E7@e%y72MvAd<6tN0CKZj zrhW!+YG=jNo)d$7^`)%f&MXMSwRqGxj-5{)QVlDo%}6O?N_*qmX8nT1IBYsG{l-#n<$QGARWo6IJ8#Ed zf2Xz7Na%0hW9bMbkfCTHEzvRw?fi@!c>BIPH@Jjc(grX1yz3VFcy-8;xX*qvRGEZF zq{_}@NXMH9u|MfD+r|K(Q)shc#W~C)ARnFs8cU_+Q>$| z>3QKsrXyB^nhjE4Bnwpvw7)DYB1tWLnl~Js-Bl9WN<>%5)Fypv$6)~+BCwhuL8e>` zcwQ%RzbrvpnZ;;ntwEoYEC-Oi@&(|nVf*U5CQ-E0td$b&H#$4+M2c!f7~4{c=nPUV z+Z@om2nTPfZiE#{*~GwP6H^ofm`uF@S(DeR#T(N#2udEL{(FU<4K{zxHoU$w65o8U zJpsGtd;hnl!=_eyH5_i)taGJU!XD5_U8Y^elUEvN^~tNRAHCGgMRuyW8#tap`2*i}fQSCvt^&7G`>nA{rta2?519a57+CDo)h*6_0FF8tb9WUVSKe$= zjOLW|zR&-#CM#Me#v*DPh>p0xI7Q?Frfzd$t%v17n4D9XwAVg-4*P?S);*ZKHN{&g z_gHNH;P)NC=+EzF=)vmK$Pyp<+qOE}^&WMJw7R!y?PMd=D5Rh81iCPfVz4s!c%0je zu*;(l^YM}*k^&8U(9$r?g#vzg2nMdNdvQv@34e2i4nOeACGP+6a_XpSI$3=$7uL$!}6=pjOa2DU-hMZ)Oeo|MaKfz z5!KZ@Ba`ZlYuv*5je{f#GQr9u%>6>7=*>wE<$b#|)y~-7()Qxg8@oWke=c*~dzQ7e zk{vfwX5Gw=5KEIJn#wFH(Jd?~$_%Kk)b>PQX(uJJowViT*E$;xW z>qN`D*9~mWnA>2tT36opL^ChdVl_DhJox!%N@1)n!T5W~X{$}#?tsl=ecbn%A@(31Iu`r+ zr*Si1>=_P3gx2jrNO{Gfj9^;a$1_~XvJ;+TWKL#Lie}?zqZ<|+#YOk?9Cur*O6&*O z4J?8!&NC9n=%P4Yjx-bwBykY=0T+xHDUwbD-AcW>+|E9nrg;a6RLcx>yUydRz-7Zq&x%PB8Wo`seC;V z(zP$0T`$M8DS#dI&wIL?nut%-(j`q&Y895nIiMNSpl<21&%(W6I=NMUmU}v9oQ?a@ zha&ZW$KCboMJ_lVox+cU#1@gD z&25~Oh~3?|YfoQeDXxVaFF(-`Od38Ki8F@u$2X>$WWmDU7UO@apJx9)e*Na#@sd%u z%(ZeeDUzJSpA;vMfI!M^1l!zv68a9_h4G>Zw4bI(ghU7OQbo4X7T0t$-f9?FU6e_T z|FKdm`c3~N_n2PPn~lSRyOj&{{7Nfoj*Z!W3j zwf0A&^24N4Z|{b^{dGX1k|_^mi0;@d@u5T9cwMzU;o{R&#$q{pH%1`t8~s!7kL_Wq zQlSvV1@wrBLPp3A`Rt=AY6^?=-;94d`&ccg>wj9JlYN1Jd=AqMDO1|SbvhrtcR2iJ zE`OL#fy?p%7EC^#!m5XMIA0Ejf^HZsR@c`v`ty6;MfpEq0?d(JYgb9X8r_IzACK_V zir3%Vf~uZm56nWU*BFNtB&qyF#XxOAZ+Ml9fSjS!-w79wFwS)Vi(4$CH>X|9Qteze zottn-1_Rf`elW0Im#clf*{?~?rtgtRFc^G~3DSL!Uw*&Nu{77B=@V;VX_;nRm1z*e zl!xDvE*xb|h~xQsCa?C45+?YJM){j_WruJF&oHtgR#6c}Do!#kBr!d@uvRs7izPa<57m<)@rp;=wICCERoVNw)Yrh&6>=U zkdqr9pWl#Ly`G%rpOy+-lOB)E>_VYg8j~_hvxr!?y?FRE_b|YlQWUu|iIQO!11q{f zG{v|$S5v40@~x`UC~k4Ekfi{o>dI(t@t{qjiL2w|I$|-+!m+4M8QLqWbjWa z%gSi~alOy_?h!ji@*67NH6WZiGoT{!%ft_pLZ(R(Q(l`Mu(^Ju0ckn7Q)2+8&{Dn` zfvSo4c#$gxEj3S)IF6~sp}Xo@@R{v0ss}WITJ@mKh>cj%vUo6{TL**9J=wzOC$lLU z5I(0L#Ns1VGfs8ZUkF&Ls6?q*!bKT@zw0Z8CkH?*! zlL>35#5Y84k4EByZK#mNiNe_kU=7rlpRH)u(NTncSnj5OCqgi4C`n!<+)Y>5o=>9! z%g9-CQ8%SNP9ege0X$L};sQBHAGXtJR=ye|*x(*XL5O5?MJP!e*oLu0^J=uWm+&Gy1AL3{U^Er{?)+%_SG1*60tEh~N0tw4undV$XSSx+y2uG%(tx&4T zgk`@?7w9_m9KYAJgtk){11dzAf;xdz>wuLh3>$oIXtp|c^o-%KeuldY;@B(DIA$u5 zjtT6A(E>fafq*GzEBv9o5_w)CsT+DF3eHf&5502d-A7uHy@So@+>I8K8R@+6)rXOY zM9y=hz{JpVs;kEsOB3_;n9RznjPEDtap=yjnRYx8pJuCN{5So>+7FQHAt7PJXkk?H zcn2pjrwos*pGhvROxpppyV*Bn5zueW#}Ec#QHliQofavB8`_448dg*FZD-7t^ z4VtCbP(=)oswz}5LNX;bOJzxxqRS21!;~^(C=cViT5cBv^DFoq*%5qz&D5LXH%85u)lfs<9)XB1c7 ze>CR36pObRX~2|JPn!?$4<4pIqT-yxH3QLGUG4Xljal8$&Uu7c>||!XDDi%dCe{dS z2So5Y@9s0Kj;6%g7C=wmI#4W@D58uBpjL5#17DD(y!F;TL#&T1c@RS4lXw%VD`Gzc zE=y7tc|j@)UAUnH^m);awZQv7)_YzZN+caD-iAaa=}YlJdl{Y2B*=0YG_eYzAdVS^ zwz2gatGQh&(HsMmIzU2XiI3^ho^QXk&m{F~HqZFlV2no+1g`foX9ySsJV(F3!gn4? zTSDuhKuRJpF_h^Z9J<*{tV=aJcDG(_eCKH~mPG8yJLsM1u;OnksK%=RRIVIl=?0 zsCZ0+=Kf+bmWr}$-Vsw8U5oj0ff*!0EEEDqGGqeHAHY&TAeF>&!mc> zIH0IVMyP+;b+dK~X;%kLZ0!wu^lX;GZT1FYd~`jZy;oB))nx{WjI%UK{21A~nNm=t zZr-L}h#mMZHJ|BlfR^gCC-g}}rPDLrCVqjMHGMsS_{AEbw z?XIWghBanFYW1TX!LcUA?1&|WF^hyBATm|@sh{HDuf@Bb8TzicidjqZFP09fWgG|; zNvQyyCQ?^6?qpn(_voM47e$_zJoV9CCdg$OWoU2?&r9=$wFU1Sc1+OcZ3mDA_h0pANf|}1=lTy@NV&hn3m?w>DFqrG|jlsaY$kCkoJj zFZ8Rx-RLI^%rUXg#J=!6$igsTF%r#-fK_2jd&mB@-OqvdEIU?3Pimdd+X)PZ^#t}j z!=aq#Dz+f1~@Sf@TZO0#+cf5P-FrOZyjRKiND- zPs90a@;$6e`xrCk;Sd{61wXW>!(p!_af`LXlYs#>lnKkvjZkO4;UAQgKt#b9^aogK zWs-@klGr1<+%H=5>yr97LZs**Shom|{>~2Z-Gv$F;52z2q7MzJ=V`>tNGOOZA*g7=V9=R^WQCIn`Nvhr ze?3M*+L89zK-G;!5N4qtrx_gZ4GG&hMxqyBhca&j+i=)O1L(0EyB^x~r8*O2Hw+;n z%DSA0$}WzdBt-7=Pr1VOBZd3?gQ-Xgwp*gz4>R)OB3UL1{UC}Wf%F#XTobd>GAiqd z$3&3kLo*o;FKJpeJF$Gv_`aC0XIS}PILg4GS|DUBa#cXVs4w4_c|K`I7c^GmPW9cI zzc9}VDDEN)WRW9QZGs0z{@j~w)j&vkACap-G8+kVDO6YKE5=YDMjEn7WVkOI*^ft2 zD(gk?r&A7O7jGi0uDpySV5>PiZuZz7jW?ZeO5OO9j|`7A0nUnu5N%ID%tz--cR$DV zxC797DANK4ErNt0*}xRRJPs4Oleuj&AjUWnBcdqaSrp|INI5bCI`ynhXi!NwWmv|d zqJ)bfOQC>vF{t)in^)c$Oe#I3ZKYvE z!+qTwXWna5z3J-SdEv_WSL|0l=S8R`DfuY(c+9Kv3g*k$PvNvy5t?)(^rg!y=t#Q- zy{-0pQWkBqW-p$aEAP+6kF+xh)sc!oP~;yy;Lx>ICKP9}k&1gTS?$`o_;IcUGxi+o zoB0`KF48;;kZHh6n1MI^fEPdYt2JlhJs7TaVcvt0R+c1WMR&(3M+J#c$e@wFOc-^u zz;pWfOH1T!!^lD6bfE%YAW~QbF5xe|_?6qGHl9ksII-(>*L3cm7K~m{s7K4t{x?T~ zYgG>D!g!z8{y6>Yf;8dt5bDl_=&Z^(ZCEBkiV8!UpPe;{^Pd?!zYR4xY>){%5f_$8?NP(qZ_=xTy zjc7emelJeaDYWDh@7R@hR89HhqdiPpM&coI?-h?3@?s?w{`A(C6F)#MA$pa>l<8LD z5y#h-PrQ12R7_(zXw(P(yQ)jMSy;`|WuT@=t3)wbfOM8TiK))FTFV%PG)TdWf7L&> zeK$n>0W}I4+GJ)bG})`>-41GF2hatQb+w9R@_3OM9*Z;sY!&b(06a&z;_k9@vs#VJ zL0dG-S}0}Yy#gM@OYs4-H68%>GoxrNsa)6cE#w6 zHG{WLfcZw()>uS9D@=1A?yj|O)miPDC$3dPH&KQxW`F^# z$OLloLu6+H+B(P?QW*?p0IpW&aqUU2uG)MZO`cgub1aJmSU#X%5z)@i88}~dbK20qW zOsV0FhC}z$z#BdLd9}P=E&q=$p0qKX9^a`(xJ`B-y?ZvN(XLQvsB3}}iG@OCMgXYJ z5J+E`XY-DJqjf8)7iSwV44`Lnqz$9w-ADNVqgFRI>B=o(zZbf^;U4SLRd?F1OeF88(b?Bv)JKNKG#=lpmq)=_Zl4v0y{$8;RWAC>FK5KsYI5bmJkuLse{R6noICcT#Ky z?nc5KS*>XPltIP2L9vIuaKB37_9iKkSOSs??H{5DO&Klm^?2pY!lgEPhyWSK;+(S_ z9bWYU|A!K9JLaA1vdOO>IoO4pdb`*=8{;6*>OGxv>+Du~pY#~Ob- z=7@H(J!&Wd<}Lzq&@d_$zQOj6F%D}O!PI)ACfCYf5jK&Ipn(qt=GtHYP5j^WZ4Kk( zX0`F=SH4rQP<~u3?N`BMP_TrLYy~L5EP$s%Og<|(NR;eAd-YgmO*QUgJy0_cYkHH3 zViri7DrT0)dXYOnO%*x&#(;DM+?EH#$YjmqxQLQ8L8%~AWm_%Ow4l2>R*V)eLU>dX zUvRjxL>NO)tX(f;2w1gv74Rxdg5Nuv=7M`h{WY-FYGY!vCzvhyC(6-QL2szzAEe;^qGEz~^ z&IQKu2ZF9HMb#X1dkZhjcrf_()m*6`#Wk_JzoJt2cl@ulq?=3+ZEXSCYMfuy69)sh zu4g~sl0#j{#ssHAH{qtn-_CT581 zWUjR90Rx4DGs7T}P?HsiJY%5tnoWo4(N98Sj`!}4bpB4ulqgy^jJ#?n6}yV!T?>^Q z{<=U3tX>v??ZAR)ZK3kHEK;p}0$X4(h=Kp9H+R8 z5Eth_5E=|LIp8e1Gx`6s_vTM>Tt}W~{wdgL8jZ4%QgI(OSlIBw46G%QMpBaXwq#{- z0<|numg)e>ANqgakGsE!e321(RIvb&JDMI5Kt{wn{rU6r>)X;}dc4}74DdqAOTz)` z23W-ym<@Nn^zr*UVBSPYij|oPXkE*H2dMoWS~|E&Bj!G3)y8wmk>pmXGqCz9fKRAW zirTP!JV@@xNAf=F3z@LJu<_d|xf^~2+CNGFk0BPFqem=9I~k~Kx=kWM$p3csp}=LA zQEw*|^|I2ao z8^eb?zOE*nM*~b%lcz~uHYjLCmL?^l zsSi`NMDr@W3^(!nJNQaiXJ^i{I{3um7bQYc7o_Oo=SZdi@3e6}lakF9+r+4ST?@tDr1< zLyidpU+2@WRUiNrMdSiu&Z8H0-kahjt=H5I=zd(UzZHb0SMqoHYzM$ePf!e8rB`aA zxW4I_S9>9s!@0sz!{B0Ab`KC;9N^6>#0@cj&DQTj4n3a?T{YO{;RB5XiW-^|rc270 zU|P|=&OHc}*)qSnYA#vkce>t+V>DlDlQaFz8NV9j%vVyOmK`r|ue;{_3IdV)BFO>f z>06FEG0h?ok54@usW32|>liU|&2~5EqW>tU-~IJ@dvRLSxNx8^WmLQ4Z` z)PtYMbu15@c&z8+>`Yn!Ifwu1h*en*Lko8JISZ~-M37pieW9a9G>`To)LLo}RTEH`k8_39e{-E}(%tF-E zd5x1MtP`m?!T5&ucz#lQUJL~Dg}8y9&A4?-0Er}F=Nyz^0T2oZm=k=Yw**&&BsJdM z-(2z6X!UhP)gkH(tYY4+egHMA>sH_1!+oyWU^PZnoOf66PF*u^OhV=k46b1Zdla_hul$LYZFk$S7EUzza;axNxR(U~X zD$L|fV<0RitZ6y6bPu77ZE=9|GE1slY=MP~p$fx;`!k+T8B3H5gZvpK+q+W&6Mj#N^DyL zkrk=;roSjmdM9YTKEUGE>;I5Ir#S~da+?!DQde9qIG6IeA7&?qmF0c!gX=Y{W4#{! zG}f-y^)*%qrJ6uswBrJVMoMZSZLs=@t)0|PTBu&szg5|#zJDzZ#r%_Yx>8D>5xhwe zn<5pgRQVx7wV6e!!={7~Hhqdk;;Veka0ra5rw6NFPd9Q z;ZPUjy1EnOJq-6*9G3(NVM}jC{~e!>AIHtx>r|BdTel*k!f$dKkFn|87@08!T`R;p zU1%QCO#m`wR!IGv6pM$5ud=@K`L^-Y#FnMTw|)Rwu$?Zcpu` zy2tSBxr!J-#sZlHR1rcQAxZU=ylc?>lqh*LcYJ?-*-?JudS62gB-3}45sM0NUj-4^ z`j|H~5d_c9L}dM3Kzc8~x)SBt>)=!$nuMb+tA(UHQ?UpHvx>S6nZUx1`*3RG68XH` zxI_^3Qkfwne56V3F0?~J<2g1Rfu~h~M!^pjUc88wyWDyVj%`}R5$ND)NZ8Srt8cr@ zp7I5+Z?}^`vM+j=j9jJJ%d4+gMlMeL3+~z@>^mp}F#p@6>$xT5;&e}+WBvNgv){dV zc8s`&+xr|D_Uvr9!N2Y9u(f$56a-`fyM|CO5$M}6O5-`^vViSq3G7p@CBNJC+Ur(N zxkwCf!@i}a9%l#GoFo)|YSR6(yX4XH^_&noSqzc8lXaJj9$oxdRvnT+HswmT62mPy z{ONAX`>6iN0wML?kM3hpd*GfQ{o!l48~+pLX46I_B0P&~_X&b5JZ*Q{I*JKGq zjx!M1=>2n-02=no1v+_)y(k&k>{X@4W-R>LEus6vL9B1*j#LklJV2%ZbxH;2J#&BB zFe8sA$>if=w(+*N8j3;mgV6T}AO%Mbb=*^qP4uM>r0o_aHyNHg1&qyNyWb0S?5q&c z5xYlYA0POqt(;rE23JB?N8H4e;)nwjx5?0#d58@9?Cd=+>CT##bEdk9(?WuEN2o(5m&V^BIkn{hDofzC9!Wn)^J5h#BU$Yz7 zn0ka`BAchwe{3g)dHu6?qS;*kbdID&rH7l#>Y5YzdXKc0r|5N9K0qJD`&L79E*KAx zXPxu+-A@vfZ@Ef#z!8Qgw2rHvuF0A_P^c!Tfw-~S@qe7*KJ(tL3&sf_+4UZuPCKKUNP z8nDsm(?Ns-L+mt@9Xaj+9!d7>%%AGn*%$ADdZzbJ5>3YHk%Xn&iups*Zr!z7#FS#E z@JW|s1&9YTp~Nv3`}XY2zTN3jeW(k{ggC-*fnXaH#efhM*JqB2FrrW(4(l+?rPT9e z$nGkaug}ipYtd$;wE9+`g1h5G+;d7uDO;~y<{EinTbUFEFt0ND#_V5FHe$D5H`n7S zX*(kk=C+TUffbqq=G+B!no;(|Q*4<-I?rZvN6F!^`3*D+?G9+PoH8OsNcbK15UN^W;XJQoSQ*)J+w2i0m(sXOH1 z5S#*Z`GSyuhpw*Q{={0aGjf;g8Cx{QXk+tbQ#F=&MR-yIPy*_*wS7QdU+5dvp!s6H z7LMjkBXxC@kFAfdkZw9fbhNnCvbn601d_PKNt)J0 z^Hzz?2TKdQ4H02&k zNE5qomwU*h!0*dpma3aQRbRY&6Hz4E;YR!RsTC3)b`fs%j9lsv=Wd--bdl=mz2N=~KdUz)*a#@E6$Yt zH%$MZxY5e{+M)|@2fw=1)0?R3Iez-Pi?_0*CH0Akp2>14^jj3>sc{~-1@|yJOD)DxOy|f{s=Y4sWg%da=qC|@ z{2|Ll#v^~DlU`6^dh(xpbcwzeWlf$OT^ld1VG*%Kc}8k(`9T;{C2>?1g;Px`{(0_I z;k^7)#s_{8ZoG=Hxv(x`3%*FrHT+ViJZ-}TB*=!J_wFA;C?<8O&=YzO=>a^CDq`vo zH}w<+%E^2FMC&j~f^y5@{2Q}nAgt{Q?e=r|L$^wQV4!(L60www1aJd^2dx4|us24X zfR^hN;G>(LqT(-ALm{>=-@iK=XhtL#=_XQPwG$_xT>!QYdmv`=DTbI-Yg=ZJNi1S; znkEg7*FHDDt~Kq__@%%qRh4=KuCY`(g**e|{|bPRyS|G>1l)aVyH#3xd58kvxjaYK z_L4h7c4{~|>R5AX%wGp~XSR43#9?>+qIpE`2Iwcm&7Tqg(UcjdzT^s&WjRXWp1xv- zS_h@m@M?_*D*1_NMdH@d4l^rBfkc;bfGf6W`}m1E4E0!ymCj*cb=0<8@lDqd-RErtftGpRl-MBzV`(_IC(cxrTaQRxhx5XXlFsdF^9eKH zt|c5kmQtTZ(Ir)nGi36{AUk*_@X;+LCU7a!D(nQIea7d+GX=;pfxWz~#7lPRK`NNGx`KcR>o3s04p9Je3e|jk1w!|A-prw^b z2UfqtF^%}C!qu|WOW&GHH8Y|4K%Pq%wgd@MeXi}21mQp>*344bJOh=P%w4GCe9aGZ zPyqE7kpYbn71PAffr>e~6Gr1CNn^j~gyg=~)FD8D|0;RpJb)53wPC(BVcLCp<-n z-bn>=`omWDP|UK@!en)g7KYfu$E_}jIt>t5gv8>9$Ef8f(qjUPR_X~c3^-}J>0=7A zH{QYMDsj1f(5o4EW{m4ddPhxSQP`ktXLvk`*pXwe$(kQ7w9irb&*5Z?*ECj5(HSu9 z#APB0b8`M|&#f=pa;RCbV<1lp@lr@ncDp``)9mBX4SD@B z-6Z6wh)H1J(GMapM_4=bbrdexBT}87-Jg3>SKdn+IiSC$LlMxKLthaIxfOE_GY}Kz8lz`4TmA{l_@K`j))Kg!pW?^(u7!{0MAa$;s$l z6owzn@i?BC5x+uSBwj7JOckIcv1^50!yer(1{8QS=O0S9z$Uf*6+4AlT|MIn${7Xe z2#1O(I!XRSAi)Ojr{B?n5>_$#U`F6PMG8w}0)Y zyRJNK#~%c}vgj|ux1WItNWL_v+gQ161y1XI8g{i_%U0aZ*Z&CRWz^n?i<)#va>S4b z9y9`jI>bk2e{nImvz<9W0tMLC#3QC%m9%Y>xb9EO2Y$rz&kP$W8fr+Dt1u$?6VrxG zf8qf1tf*rk@hoX!;-s2y!hsbiBNC0lVt@$-#I|$#O!0hTh^PaaR(aZVv9>8>;mjxZ zpy>wG6e6#^Pjj4CVS_0Jp6^C*jM?}hd(%w2hmc%?P8DOvg2e+iS0eZNm>}ogAkKqx zoYvuKML{Oicy{LFFs^RnyjG(q9!;`JN*8)zBrs(O33`b6M) zezU?Sg-ddEOQNWhI}iw`cdPClPTj!%2j~8{~)#aPpl?TYSgIwtm#iG(Z^fyaArL-ZI z+-FWdQYrrI?6b{}PhlkSTedI}F*rQTTC}(rZqRZCzwg|!18e>vx}R>3$LU9ZnWk|K ztnbNPW&60Yex z$MIVy$Ik0ic5)%>r+vEjs86P6=kaL*tS1e7EaccEJr!vmo#_%kK;u7ciB7vdyqgX2 zXwjLox_fhRtM|!D?~*qH%86Eyd_YHfP`!Ji?VrKRky3}->tsAzPz|2)){cS_s2K( zvxI%1vfW#d4Z4;<0>lYI0M2DvdWSRSu6@mNx!Y=g+u~6FhOoP%FAjrvPk6E;S??d} zFoG#)>x-2IMXf5xMI;9PL~7vrTnXz1l}s3pJP@HqiKx5m-kw{TJW4Kr0A@ccX*~^n zc?V+7JD0m~4nULY+-`Ur;sGanTuRr9Lo40a^0C8o0`KvrJLab^&vIgDIXgRcP(keX zWUkY1j-ys<-?AnEcfth%L9e@c9qM277Z5L-8^nF#JnotOguHy3_`PdXv9FBjE$ayY z=V{de)4)&b#T6;G@HfMrZA3M?U0-Z|M@TrC37@!`5j$q@w;tRc2NZrk5AukY8v`{*Bi=cZes&8<|QT-_I|FJag}tzKP`@_o^M zaq;@%ZuRx%_AAz?zuf$=`cwCM{JWs{@aCN=pZ_j87kU==kINvBivN;03J2FEkYp=D zT$}FJB0z=Rp})Ppd$V%)Cc@q7Er9ms_EWvD5x&;@qc<(`VH5*_wetl z?^fS#s7GLsJkJll`vOi5?hp&6we(iX!d=GJ>XY9vWWD!>IwkzVWc~zz`g4H@0txDE zb;rH9`s(|YF5>D-`BPGs*C#Eb_`< zZ&2e`?-Vd4A4P=;Hs6XW8HF94|KD`jVv+Ugxde z_KCw02R_LjvlfClZ|Q4iXWqmq3%0KnMP9P+jg~amY5!t?Nk~~pQYBV)^R7N-jr|IH z{QHG~L#fmzDfHt%=2S4e_V@7}4^oOP0P;09Tj5SYC6`_yZYWp-1|V3d6k8#x3YVw%d>}Jf(Q37=!|KB_7WY?|7vFc6x)5~`r%_x|02S|P zPfW@1@RX5F76I{rMM$I)VbUj2PYh5I)1bcyymLys z4Cr}bNpfXa)Fd|vCj9Kk2$@=ol$i1x+$AEzdsw1ZkZ?gGmxw%Yh1JdXiBu>y+B~7j zahHrPt4QhrME%^<`a=!q+w+grC;XxK7rHl%D3M3lh>i!%i+1 zMN~U#FUD~vtJQgf!}rMn9_IuyUpBZtT)1ZF4)~nQL;ZBC1(ZX466r z_EX62$gB}97!s0769aagx9rJ-*UUDz>BBgu7DYJBqAkUDC?kFy|auGSG!pirc?XSu#J9wvE8-_C2NIK}Bx! zTJT^#VSFdig==)2uQf;{A`|X|pbjJQ{o$GS%-6ADn%Z_UNDQ`aOU+7z zp8^&%a*ufDK3${`>d;c-8T@BJn}ViA)SgiYD(^rc;IthgUf$eCA$^r6T?iNtahX+I zL%^T#_9+xHG&;`OD5Ni>RBT7~6tzdVtw+wG!#!n`V}ouPV?Crm)YV}M2>HN-V@wNv zbBoJJdL>CDF=b{5cB-2t28?-OSjL?ecUc>6?pwyX42l$%)>Mhq;9{>o;q8-_ahJ{6 zGNxIbk-nRxM2=IEfZKGCb&fIMVU#<|h~_}dNsSf?bh&2z*j<)*T8?~XM4 zgyOaEf0^`f0qD5>LwVY8je8Ra$d+UClrY=g1!irpfTJU{RtWCPd&z7|sj;Gye)xE7 ztBU~DttAr_PMr2BTYXYXVP8Ew?y)@V(#4SNPCOt4k!U~(kV*~qzXvo z$aOPXk@X*FCEPj7yQ?qn?&Dxc+i_F_T#yr_7)g#k7r|-7GB!I--40)rWIdtNMB1el z){3nVX=6ULn)4>zWk9$Z>8h0I0)MR)<=;u2=?treTI0g89GfIhca~Koo1&!rZC_>RI1t5f z{G{m}32bkp6Ft+84k|SX>Xd0}V3}dc)jipwy-khd8>FxVp_W9F22i?2l%CU?nT*IC zo|KVvk)V%c5t;X=HZ_jOnt@?~sf@{^A@QWknV4hRr<_4bYQ@O90r`tTK(5>Zy{P$o zpqFr0(cf7&eR&_jRDBdT#glv#*P;uC%U6oT0{JWk)vVVD!<$$bSheuy6H$r8s2 zW}#7A(~824fQ(Sz3Fe4NcxP*NB>zDuiGH{-B;s>NE6_)d6%TAMfr{XO_%C4Hs%}bmAJ;M5bQC=YCIU3IXc49ygn9k{`p5=3Yp{tdz>>POrHS;8oJBWxat0W0#7dp0-prij!zc)vcpTHQYoeE)d3hj5IZxEHV+<659nj zrMt&2PZXWDJUWJx7RSW?qpRa?MNfY_ah>qUaMXx#K!OBt%4bX}Lmuh*u?rQKr!ADz zdQLfWCi5N{?^eb-b$wVHB#5#WcVH*>q~V~Q)Ze4mr#NkWY!IhWlBnZHm&Xy3CkdUp zPzAVU=$It{+aV=*w+p3q%Of2>dY!`4*2!$ACy^0a_L0Fpn25?kpdzT{lq4dkd)Jyc z)sFP`*rmx%TN!ohow6|En?5qs2QLgBtUSOu1~NnoW-JQPaJo+D?Xe4U>J=vDmQxl+ z?Oad3G7S|WiPXsZr~`ckU3XZSQ@T4ma{uX6V8j-7()F%mIBjuGklRN6%d?oB$aO%> zjam@-1gSZ~<>f8Y2_5?j@gRXQIdPdz78sqXc$A8aJtv+Y;?#xe@XAU(#+ zXHhR3!q^UZQ!a|zv24hfQk z2LWXYq?S4-Qf^QnUy1^`Cs|U^&-C1qM-I#-n&(A(UtP+lLO=i-Xau6)r2RgEaK5_g z2@$)XBs2I&s;g>ubV&^Y0db}UZBs&*D4IdeFW6eZCxSRNKo`0<7ULX;n?jdWcVv4t z_~AxTOl%dwm$R@n`VDI&(!2>UF2|GuL^9p;?sJJsS#Ez)Wwwc^WF0p^F{e#jWbg_y z0jvh?sLqQYWj9L3MRgetHG4=BB9Ul9Rt1qfnDT0%jl}5VR%U$VlvXoc?&`L=xER|_ z(R~4`OiSu}VpC`4yDuGV*~QGv$6M!ZP&R2TkpUTQg&o7sPB5EmW@&&xS@!`@vKaRw z@j&i0v|~XUB2VT6lB*4;FDJ6<2m<7i8?-##hdu2qjR;J6Y>fn|W%#;4-9FNi^W4ox zgwhy5@M#T|Bm{h(*3Qz1YCxSOSDo^EkZ*Ksjhqu~J|gmt3G*VLJuQ2@_b0ZqG$IU$ zB?aiY1gHs<1cpnp_0sID_TVI*j|fLkiU~VufgB1$NjVEVfEhIkcNTkJLrY^K zFcf!mTsBb|h!Oa3Q=>;{J|-%R)IjA>=baGKsD;x_2w-PSV?#@0Lbz#TkRVGqTi8g= zze!U&rhN6~s40Iws3^o^p0!0?5Mt2>NDHU6v^1)YLd9HO9o2{0fRLWUZEa2V^HEWV zB+8qHQZVR|Tw|xUv@|MeM)xJ7i77agq@j2260zIo&ThZ!gp_BpW(5HB8i&mtnBe&( z6bkT7@!E>oKRlFG%M96Rkkr;|6V*VB97VOcjDyesoc|1c10As^@Qe5{kZ%dW(gnzU z*qgc7BfwE6-YkPYc#_n20LU}9tOg3Fk)res^@CdKoyP%MYAX!f9xVzylGt&JJVC# zF6NzlPu(3wZ2}}(5V(o1OJeE@!zTu>$iJBn{)q-=;?rauvJfE=D{Bp}%FEUm%X{kX z=sHAIRb)W`s8N;T^R?r&I~a!t{9qceJAX3y0?$3TITdL3L|qC*Km6f+^>=jkC>7-N zQM9ry$Q*F7s82N-lP@N-2eq2&n3zV3Fr`!DxbLgKqqFC-O~X1XsY!#5kvJ^1;ecm$ z{vW&dCd*7_A7v@UbwCi#!x&&_y9J+W_PhNZoqZamL6_i)EkaPVU6G9^8jX{hr?aP= zhv>3hivVATPdfWqe@AB@6MMt|CT~(&?mD8H#5LUM|fC;h~ApE@Kme4 zd(w{1o&Z<=j}V+b2gOc;bDwbbyOhY)SC_R^-WU;1bBC* z0zJ|E2jyfkf8^ALY_*jAcckxkw|A>% z^)UbgKazs1xwo6^RkylZeLRqdv+@tYTWa)O^{aCU$a<$q|5(H&mg><64%n-2s+*sF zul4-SD=Nm_{hrbO-Vhjm|3Cc)Yw!_^xCW;&$G#9mi9=!dy<$fEe#D3%G?8+Zl!xod z2&6!trW9g9NI?6G;)HOptBc0^TAhFMr+1&CL+l(~exckyAQ3;4RQq?7J%5A25}OkyzLwls3jNbN& zP(x_=r(1*FA!C`GadR7)b{F$z%yTQ-l*n@j2|X$~<||R$k@foZ<)*GK*K32g`Bboc zChD#%+uFVR?N7IN-CN;-);hz+zn!zH+_^OcDszS{AQRYE2ynZrg#FsG@M|&r8jgjd zprf0+TS3~UsiKcsaydF`>+ z0MZ4i3)Q!91&OyC9?n}*56i;xg^3pXlpJ(j2Zl=UbWKUG7TZY&WC+^M^pzFB(yOm- zygX`ti1~raeqt~nsjom`AOf9uT0C~*)%|g-A9L#rP*=Mw9HsrV|>pm;-71hcSY2BdvP`HnMda#PPuDJ zT1{%EYS#goJ`@`aD#)jTXcpd^LNGj*nWRb3Pztf`v3!(OibiI9=6U$rXTb|&B#!l8 zT=g45m$?P7&TYoYr^=4Qz__x!RE{rUKE1uIUTaC+igO?^3S=DRZHA)lp3S%8eX$~v zzZ8JXpvqWhFo~qz28sB%O4^()_Fouh7{ijn(11PapFl+7Q_ZO)|FtNhhH^bhjsaV}`>9aHCiW>!EIXnC6_FJuP^B`8Vq-9Mfm8l3BD zvMUFw%9HgZWsOs!gDDhQ2B2i;l4z^u~=(d=N60JJeHl=!&D!}JoJ0RB}W<-HMMXu2&3Khwqjr1 z-r3fLfmH?2tC@%EwKYu18n@~54O7f*!~dfAa*IuS45rXWK0f|S?oYYo^`h5rSd9Qg zie57IsAU}hPcHEvG~)(l5i70?)q}^SWs8?898(0ON3f_Xs{jQ#>8pTiZ2;=JMf$nD zzrIFJ22IO^ppZmaIT5n%zyWC(ijD`72nFB1Td%zjDc8Gs3v^|RFt>mhF9&_SHjANQ z@5^OO#WsGIzsVvgkp5A{gu*h2>m3qFR$(NCXnn){Msc%TzSMXeGW$79EsttEky0U; zO{ppFO~JefTW_AXDJ0785{I*o8-Q)K=izUk=>wJtMaP!u?95xHA?1Pv1~-cpUdXm^ z=z^5P`+>9e>goy}IUcy&J&gkIu}nzIlWosDf?z{pQ;#jZrXC9r5AZmL(=}jhDnlPC zIQ{mS16i?yeYhXx`grwf32VMZHz0m=K3IExGcDS zNnA@x%7|DW5{~MIKbeI}pNCkJz--BtMX6V`7Z3na&;+OgD)k5L(E+x^F1*+4sTAYL z`5WNm7+;s+1nLqbTgF*PTKxF*AdkjRh&IU_NAj1IM4ECx$2&gmk3RdFcrYF+yVLR? zQQ+!3tLgyxDtZ=U0%SjE!DT86@*P{L?6CCW!Qr8$%m$acALAVpmkf6Qx^UJcz5xL4Ac)}Yq&`r_&U()Q z9lQ`s#oN^vU48%h4;R>ZScp+oFNWvk_&jG4Hy0`nf)deVNGE=y0HZ__3Ei{3EY@*R zS!3MY%xet&bvINm+n+EH^hSz8~qZ&PRen{y+B~-8F z`1JW>=7lk0aV$_1Ao&e z&irzu*+WyxshJ@aHs}LnJp528Maf!nP^Cbad$xC4;G@feXmuGO7i{=?Fy$WCYk9p! zV_2{CEhJNUd2+|kkF1K(QmsZ_-&~7aDBlnNRutifH<3sSOtHh2i&G0$gsj&|h>1Kn zFu#$@iOi6c@;14?=ae#TIvK_Xm?;q=pAW0)7S)v`XUfkV7TOMP5BS`-1;EjOKl^l?qoblr!Ay`}mcz~)5G}O5 zR+pIP5p|Xx;hkjr zh!SMlt`L#(sUdXDr#loh`EW~a8j&e9$4M;EyU7Pl<52LTM3x?d{A{f59y6v%D^c)K zWy-TH`#3=G5H`}!pLH+{C_zWq&<$9jgi9nG7=S|wBo=$Z-DWuNHWAR+bt0q2q-=nZ zAEIwc5uia}?-Yu3wZbPObgQ6-6MY#Afc1k7towo0yY8Albw9jv3Je56`cvi+3U-l{gK{lDJgx zVv;~Y3j7zub1IPP-`F1m-#e7Em32R|SfVEeagX1KD#`fkLE=F)ut&p0_4w%WoSnJ# z87aYk24cBO!MS^bHNT}$iu}P8-gZI^a>S~upH_me{mS#n@LOiTMH|34-^8(m!NQzC z!6GFAzO)&udRQ|9L3&(tw~?^u0O$h{3E7PV3D%iLkb^BV$`p^?Z?F#lfI=(<(W7Mg zu@HPC$l#rzg|NogH|O_P*A(=E34g=CgoH#hiY_*(z7xiimlAm?5f7Y9ivZ}nt^oVX z@+=Wh9(B!`1ADijRDVtc(1cHkpevf3!lYzIk?X<06zOExW;Jw>AhCPDF)~>0X1&(2 z!9HagUoaYvRcT?4vE=&h7oX!--l(T>;2Vra5>_J6Q{lA~36|J~NzbOaTx>>=m9g7_ zpuA!r%AdV=t;3PLlt&B(rWY@~{pQw8vq`@)son8Uc0=;iuGLV;B*5K{v%Uv*Dyyhv z3z1D4n@wWUk_13s`;;Vicrj za#L9g0oNgDE~L<_sK-8jA$P{MU;YuMY7*S^njDE` zn6`ta0KC8L6C#NstWeHuxP9mO&tH@mD_6AW57kc_Vs!>i=7cVLnAt;2DVrM^-+d=# z85v=c5Zz5(gBFRO{3)*G$s12HJ|%W15t=}ln>?%ANX^yFj~(3gvyFOizC*)O`}tf1 zThK=bg(d6|?%D+W(K_v-2FtYU;u8#i56#Ik+X~x%z32k+t1v==+t^X`m@23$mSkq= zbu)Hd_K&2b@EsGOO-jV|)4)?(zl(-{8mV zf=<)ybcG*u>qwLjMLOQT#jqvCJn=y_P~t7#FGS_lXTwh~sVURFqi)s<$4yD3B+--<*h)}-rDwa*%p5NBm{=p^2TF~!)isv>Tjcb2 zNaycHI#b66mE7$y68gI^;<=1RomGRf7hoI3@q!TvN#rcJi|5;crd{;^a}*(B^YX}6$TI*r5E)S3@&1S>Vdf)W z>}Kdejp0~M#uQ7`Ui+7q33=qD?RYsOL;>C4{6hbIp<$9kNBgECzsrq7xFsUy_?IC} zf!%pW4xuyMTO$K?;~ePTiF&e+j3x(Xr09n&aQ6?Keg_7&bY}MTYhv`im3ZaO7rNv> z=9}n$`+x;_)MqH4Y@U63WbaRU=^%mV9aj30VX{EP|2iHf$SdzeomD3GYGkMr+n;@M zIAW%-vtp+bv|y6QO9IqM94+t`4-Xel%k9Hx=3j^MUx)G#SNfG4N|k$6pxAr2hmlX~ zTz5fQ6r^Ty&7$dbA-BB$!eiOEzhLv*P!9jUt`Lz1eo|3o=NMaV@teAF{?-8@yMfW{Y4H4IE-2!Ma- zHWrP_U*$(`&LcmYv#bBp_f!SG+=3TBo$GJ1olC*b;vto#Gv(S8Yl&Eh)DOBPf~b{9 zBdWXrS=99r&IbR5e^CNUXsY8cK+8CMvPTO-s!AA~8<;g>4)Z7@dKIM_vxPqS#ct|9 zTa7z$ea#ew4G#ajLXCLcKQQC`V49%jPC!msOH4&U-KMx9HBbEJ+r*~18BAG> zGf)tkq85w83p|xPa`(;Aqzx(kQO7teqM|`LWmtnXW-dA8KICXh> zc+*F&HPwx%g?D**bn8iBE5J4YPmuU>q9CSQziex=iM@9_%^=RpF<7!m`p4sdz3frj zu+N~jH7xBL)hqA1`#({DhJN*mJdtMYrahTcg_I^GjDl>`5D+FQ9_DkZWpZ8q)hCO? zBJ;23PCa_s1L8w~L=7Wcktvy_)8+G*XYoj51dw{ii3aR)YFUzUS^?VC_N3TNdT~OW1^11pi*mx1V!XI13lGvEi|^Ue zbi^+vpyg!CaI=%jK#j7dB7QxQJ6`gUea2P!G!(o7NUb-myjR{V1DxoOgmzmCGgWwJzVzF zc5RoopCqjILejbjVNS~kv>7Bka_`uFd$iqtBeTT{V=m9N>_J#+sRm4l0$CoA>zJve z39CKHDL+)VfP%cloBrwD-OV0KbwA7de{{3??Xw}%XHQd_$)v02f3`iPhk{+*_gi{W85(g}FdFo_xj zGjKa|DKOx^@=&k&u%Z5U!*APeh_eVND+cUs*q3DhpLgAO$J@qq z^mvElGf9Yikd-MBVT6Owlrru^BvIa9Ng=`WjT{cZOsJ_y6=h;V8$bjpT01;d)c-vc zu_ZnU!6o(k)GI;=>4fV6oxTm4P5_xDdrLxw{T`OD2aibiUl3!&a;i56LW@*m095J@ z7%C4}gykTyg1kg9Y)J-pSU}VFR$pA)d}jHbC#}3Yj9|?76@ll32Vs?xH6IV-0teW$ z1MX)zy+X>~KkaVOH2L$*b$7LJGQZ+yOX&BRZy0*N53wN)Xe0!sROJ5zt$>+HZv)B7 zX_9{@(ht;B5THnT_!bCWFyIzli z1q)5?J34xg_ba86Gg3dm=mPJNA{*oVI^GT*EzHiq5WQtloxiRcDPYGD(3nIdW>Yyp z2*I$qh8ij8(;G7Mrdbk)kIsC3`gZkK?uM5mff;?adShhvD2#dtUibjlnt}~5H1Zqb zIBx3(_%KH1y)aOaPw9GON_p$NLQ;VI2z4YRsH}()?ZcpBU&p6I1H)1CC8V^bt^)zI z0>@tvGp6Ksl>d80Q{z60sFg~72FPzsgis47l7gzw<&Hc%n_SAqXk_NUeYW@*hI+Nx zyXFWv`@h_e{CSleZcsCHUS4R&`RdL{@v`JXZKiLzjXCJNC-`)K5 zlIA5k&Xt`|;bVx^8^I?nbc8pB;Z|-G7Y~(=!R?@~LD$ydv1C7viJm_$Dml{U>m|m`F-S| z7aOXVTqBTp=aMtr5p0eykJMjEN+pD{`;uw+!kGqO#9hiCEL}r{;^aQI>@7X_7aJIE z*H@%0QUT0o5DbJ|IsT6^60naJBSP=ut2UfL@&id=@hxxK`}#b}ZCFOCjuZgdlmA^7 zaGPPG;(VA+Qu>?bF_0{~UXv_q@y18;M9A;%mk_u>iX|(*Dv8sLnm9rbR|Ky83Ai#2 zy#swTh$!K*K6i*a&;;O!_jN-q-1n?|m<0{%9il)27b9Sr`(DpklkL%-{rH9?$eqm?fbM<7&JAT#WF6S zMr7Qb#uF2#-jWCf#0~NKIkLy(4IQp6Ck83h4qEu>9&8I&2DAXCEyMiH6c17kp!wxy5F{kL`8=({=ebBn{ z4iLJy%q2iypJ;mR&>eTtm;n0cJN$@}zqi$w5A`EP0)#I*%D~RV;?#Fw@xqocX4s<> zdwQSOT#wXIvxAJTiR7?26Q3^}%!Rn&P#&7TZ*HxUqL-9R0LCJ+BB1Qi+-vAz;6jgqhbzp8P?HnpbrCkO-JZqJhk#JZJ1-?Gb_W#V(CUL+MRB`64yj+D z2u}mWDon{dbN5ikwiQ6nb(BHEK1b44BEraI3ytnJ2!cIei8^%BC2Z(hcA>q`&1>2_ z#v+@y=vC|WUsZK={uK&Pv`y63lnigN{bFTY=-jML^lploHL%n79=fx>>EHT(i8AYY z#!w?B5ez{Ywj+U#*xNI6x1QzmX}=(_Ez)~WmtJQLB>*w$rxZm;7Ojy$C!Z~dD0=7U zs?L+>RWNnHOHOXt!jp)g&`{E(EGn`%vE7QfXWE++Y>|7;&iH=6j53|;LIS-TiRm>y zoC>3$doG3!0M8znyZ}?k;wbFf31EavewBnv#<+}w8BQ}-iywA`=NL=Skw=B8x<&>oPC`$Q0$@dRnvad~o z9S=xZDyRX&F+Ztpf^HrnMaVpkZ12|NFts1$V%kyrkzj<$ZN;8~fR~cgEvVo)MHA7a zcHbH}^URWjJp!4~5{*;fIHiBB5lxZZ2=pVEt)YNPAvmN!pddI%J})=NZZppQpPS0ckpS%v z;Y+6nxK1C9dlYk19mEX`&~tI-_4uOkvx?w9!42HMJ^Kx9L{}g9Opo;* zl1^@cdth4VAh>Nv9tL?PjS^N(9{8&=c;D0ln)dEHe0F$fDc%G$2%!&5MxQKw7$sQL zWSHl77dUI~s<-0DLYotG1pGv#nNaJr4KvALhWPiqywtQ=W#vq2)3k@VEWst%_LNiu z-j8vOPgnBJ>Wh1#X9f0gU_*)gTns-8y7pCdrDTbcmc(&dRInMMx!CgI;p$s0YVn;k zxJ*FWY8Y(a3-j5;7%nANfFZ3ZY7WdccE`J%`Edy46G_WnZh_? zY55jXSBz?EBDMNlzJZkLr$9tgqM1P59FR~XLTUZqT&lL=EKJa`=6$}}h49i21g%Rp zy`*@r;2a1~W*~oJk)*O#kyH4aN>00XlD_6sEU_lOqofd!CwIbe#!&;37l3c? zLn*O5Je)RQzIi=~lh4VOPRP>9sD#Y_H<$UZYd@O|!yabgOp3I|Dd%9ipH9R;EIT4P z?%CfxKkK%iB=)6pY;+Vz5}Y57R*C|H)ejJHDr*n{V@Jz-XTJb=N|#X}UH))!_vXB* zz!tl>lXFYI9dMJ8kUmHZ;2OGqcV9fU^F@U8y?sZdfMMc638&;tAmxOX2DxAK6MDAE zFV}b2+c97`6dV@~@4HI@9_^)eOoTB{>Z5m}Cl3#YyV7$oieoX_!GKqLld8Uz1S30WkG3>Blr9J(8xZyCZYo(OF-7J%L47?M28KTzD~exb zFKinyg0=th8S#>s))AmeLw5agWlG}i2buj09JE%_5eY%Y%hGiaPS%0d5f>sejgO^; zpN-N~47`laf&%H22sv@X69)0VZW~14I_a_pAq$`q9#jb(uywS+1V+#n|t+;r}WTWH!wD_5oHbRP4Tx- zvForbFe*_I0@Z+h&_|DmOiC4in7zfkRVNg-mZ*=c6D%fuBGlprF%2~uzU%9>%ra_% z2N+3PfjV|y_=^4X(@lR_y{1d>`=Sbg5J>hUpxUXxbn@hA1HOeIZkjmj(C9Ix^sxk9 z?-{WFQA_Qev|-G!@Tkj70NZMVp4c`nPnV+da9vPl4kb!_!!9n(;+a!}@eu$dwPlWW zJfM6ES(5Qi98aOgpT4QN-W4A{XdF zMdL8BemG9R{-`4m(6O?rh@{7Smnzc2^c87K@0&w+wP*cdr*o?M5E9C6Q*Lf+{c--4 z{icFFr&FVx_kXqDE@8^shxTAv5dk@KMEK#2Z>X9?S!)T+(((d>AZ3@hI&$rkd=W2O zJrDXJ1vds4?-sshh%wsndX9sLvBo9jfpr-4fn#SohCvKoM>?36M|ip93s6xDieN?wl6WJ@koIV}utcvrJNxv;YAo$g`->G1gyKvNF!NBxZxhR} ziJh{-WkWf_J|g^>^DH4v8b>s3bPSki0ltO4 zBfOJBhGdW6@3i;>xD1{f7F}+deWRP4;K{Kc0$izFO&LkRhs0mP6?Nd$1D!^|hsw_z;5S@}O?$*fF z3wYFk{N~#nS1qOILEFw?+uR!zO}^RuK&@8k;xqS;&+l(;!OKh+&EFc()B zd+UL7`q0;3xHzwt_$vv@ zBtU`ug}`hS-VJyxh-a};!ZSNG$=$ccQxTJ`gb74SE)y<9_1?IqrUD1D!aBoId=LZrw(GuE{+#05?W(t~ zeEddiW|Va#(tsi`ls>DtPw`bu-;v&gVaTKl_e=ueT<{=Gpb=CZGPMYNJ;s``3GX$h zFb(&fnHL|z)yFvm+cD60fZ&=D>(o*LhGJsy(e2}5%0E!ct z5fWV{52hdbmz4V~NJG4QDHRinG$P!1%NjHg{5<$9W7GIVvLsjTmE;H5Eq$75P@`2- zaSuaa+)z4(u07S@KpzL>@%%mL2q8W#(r>76lTfp{7x$K^6Q;pDVwfz|mzc1BTB4$2 zc&O>35G@s0HSvH1APP5&Y-W3%Qr-zFbYQAx6gjO_^XTvW^!A&sA43hbUeTn`vs^~< zzpdU_OA*MTqWU&@F@@wwo8CCgWSisavNXhcfytHPa^zN1hQq_2)(Sh;pI=SfW|x=; zdyWPzsrH}U_YYO`GOGQO`&UtnfZ9jV)+)Chaq|Ce)ICL(mZS%R6&rQPt}M7b7;eU% zw5iFUl`U;Wb>ju&F8b+Qlnx{UsSBuiQ?+%CJxN2thqaUYZ&JZK)yElLelAP7L_usK zbvet(?jfgv(_)WST9tcjhIJj9(FfZGq+mLhHT-@7WmqM>aDk1Ln_Ieztji*#qDUW5 zkE0;TriJpyr%T_4;gG^l<{KkUxiv{4N!kVoawv!U(8;}F6sTpxx zVyN_XXC|DT;sg+q0^e(_7BVU0ZO|ZV0u6|W3vo*z`pw>wQ5$nR;w{K_ z9h$VC;dIQf{;`}bRtKyByDtp}m>o07tkXrWXSmcS*`y^?VJAa~TB`NV`h0ZB=*12T zDr*x?m}Zm$%dloEnPS$!`74W8SnS{=CPZhuUaOgHy%vr%hN$eA%m54Ahy{ek1Q}lQ z0sqozDIB45p0Laz!B<6B#%&bi&=RfK9-ZRWH9hx;rc;iCpf~Ef(p!W_8Nol7NV@Uq z;SRG&6eUAHC7Y(XqzW=qmp_Czr}_iKKr$&ZYIqhD`vUTwN$ZotL)e~<9lmAht5V=h zW>`rL%`!#~#!`_Z%t%0qmOmR0v4|TFtE3%C2}nthr1<*gU3YUytU5^Y^hY--X&96s zuZS(`Wh#rWicP@XhM8Fi!@%-PPP-2EEx4{Lf@0MURfricMV=COPCe*5a4MxBH2;+A z$K8x!pkW>=wJ`9Q!;KvZnFe*GlKheFW2JpBi(r1;GI{@6)6q%jyU17sf-ha}U;cO} zLn*WyBYuk9P#HZ+BJ4Op(Xn{L!_}*e-Y9>hE)mu%v7%A)guhXIbH$|O4-Tl%1X?5| zHszPDEys5=`zf<`C93FB%wR%%qyvOapXO-!_zAh1hKJ8T#yGS^^`UJM_rK+jE5dB` z@+{JA&1!K6SuawAh`-q=b~3UhzR~qxawRb|dCeAOJ3i`;CLKvsU6N7LLDS3K zLlfd;OtYcs501W!yfUx4wo-<^VmovlN*p)Sn(d*?X&jWy$1NJSIhJSKT-1k_&}Y*T zJSUfY=z7qWS+J8Ek0^N)g&oi#F*VD>t-!<9T4|Hi*w4sm>B;g(cusNWpm$WENz3fg(bw8m4$)X}4sCtpkb(qc`OLNPUhPFPE^K2>)M-F&LEJ76Y%8 zir>CK?LtpU)E3D5(ZEB2Tp9*2%LP($^9)+%fH{~v2(T@^Mg znSiIVHpl3MqhlhByB16(ELeqvn?t%`XdG)#zU8Z{hN8t(Hx*Vj#t-=?*FJROj&mC- zYaV@vJ7SOUv(Z~fbxKLTsgfN0eH{0LMi{y~FtmfcXLR3f-uL*35ecaBC8`$ES8SG0 zk49`F@5PZ?5R#SR6M~dFP()xGM;)o&dibPrij42OP;edhm?nWmYrwq|sdsRpoGQ}q zi8?}&?%G?ClV0O^Qr3v0haAAPCeaorgs9Zs8$YkR9IP~fETA8L^|Za8ukvc}DDP-FFf-Jaq7Ag~V$ervphC7;TWn;!2z}oLt-0<?*6Th^5bMw|a7o}}l|s_4 z`@$~u+R5Uc)>6xx2-5(y&|ZMeDBex*l(Yh zRxuJ2x0MrS>jEfrBB!8w5~V<90>WfQ89K7BIlm6_(|G+npL`c=gJU)mBR#{flRZU6 zyAGXRV;1leNOg=ThJ=JtN$ml|vQJB5#A}K77$S;!j>&lnE8^IS6KTS7;rY>g?jD^j z1Cu1mx|jd}c;qaf8#QNCji$2{Qh&%KZ>Y*kr~$PzNgnS5ioT;V$jLFd3nG)e626Bb zv58o6p9q4xgk#@bT%$W^jr9PCx(qKTpjRQNcI^1Rmu378qH++GB-xAn@@x5X%Q-zg z(_Y*MQ5m(^C~-En_))4rv`j$tRRA1~#NwV^+NvDH8yq0*#ar`Bon3mkj)Cf&07&XV`1Yv!Y(KU5JHqi#F z|8zI+Xwn$YHAXb2WsM5f{@~2G2Al`$$Dh!_44h}&xd@9I$xCus0un5az|%+k+h=j4 zY~a`B#!ob-q$BMdXgMNzoH-Fm{i40EE{AKBdysq`tZ05xqGzM=f7VqvD2WFa1b2>2 zS?)!w+I(|J|~Y4i;D+4DQ*QOe4Cqwg-bd^AWHEcfNo8SrV!=)wNpAh z;vGsvnLDq@Be?@1K$v|X?k%W_y6=Eb#F$X0ubirN?NK8`$ralwcL6^4swIWKBpyf2 zTHfk+MAMU80hh0{2!sL%Ljw8n_l}vv2;9SIg6cQ1pM3aX?`l4^S>LmPa`p$l; zH_3zMa(IL^8(T=+c+Y(F+1I0i+$wLIL{FWJ3e^L!CJF9sV4nOA_ZY=N@%b-6NrVY- zU?eocHSa0?E$o4Sr7R$2yXzZL=3<6FeMN3UrwbU2hQq&@x5Pmq91Ev>-)5gmT!xQkJq1W19EE)o8~X*8KLlaE+-5;%LZP5C5KuI`CQ(+2~s3yC9kQM)CJC2)S{ofDf*ZmT;5n;2Wp z%PgfvJy9BjZ8nnZJAGwr_!Kp`uCcG@nI`cu`=?TaKh|4+3>F=!dY_VWTpvZN0ONx= z*OYWaA#z_I-RaJw_|sJ?U@l1m#aN3;GtMQTf2L9`bfd&}%0d?bR}ZF{4y7Xk2;eF0 z4Nthvs8=1~#6-EoUD`|1)0TUjzLo$Kqvy5}0cvqm2S_ZlwVV=&(yTcrcz{bAxm?m~ zeAkFR@I9u3@`-X1YW6<4%^}`g9dq)~)_l*U_`byY2|PBD$rY!9RVaA{ej*c7V2Ig<3r+;b0G_=w_$Ok^vK zRmmPml+=TTNMgN-C<0(N2LGdz%NrqbPPW2ml*39#wv<}WJ&Y%gAQzb1_i+&rr4*1B zT>wPn1?KJ^29LUq$cEM*0bG4nHGN!VKrP^7K<*XpxG?5H@{IepchSvVY{!0-tBq`V zCV8H(alPP`lQk~|^G#eH8nhWz0YN?7<{~jk75ee%^Kg_&4)VGo4+vIQ^f{1iEREn| zH)5Z5OmtwH2sZY z9W&C~IG|DhalKST0{O*q6b63+6-mwCV2S4Jf!r`PfCiZE1+oKZ1on0I)}Te*M$ zq+4T>6)GY|e9Q^@r*ZbrKl)O(dcAEvtc99PnFcN>H1pp+GY;)6w>~n9P(A zgOQN3NccAtAo_tK1|I3*;DW^hk&0$i)j*sOow>AN<4FcPge=mtGs`Bmz&SM-j6^Jg z_439v0HjgT2yZtDOA_}m-x%#@k2{BT(@xA_X8#S-?#G6xtJmGRcpWwpSqmt3DbRnE zW{yJuoWy}Uc}IxUHBxVWM01Tk+bG_-sl}X3TA|i0A=cmxrD09gTf_-|9|%W3lbWI$ z+dG7Hg(Y!aVon$UPrn>txBc!0usZ-4HKuTflek7L&{N1v=OsaQ;0e9o9~*OtDesZ96iYQsW@1+Bk=@v{lpG!*g6xQbFTH zfXrJwFvUMs*Us{#@;P1-U5HnU0+DCFtqPHcfsvrGEE&goJ#5H&%}eVw zqcx4-^N(ICXPPk_`^?q{w;GL9pww8jk^IegnNdnfK?q4&tI=pE*CX-pLMd(sZPETI zt1=Rkzj6P6+VhnXu46!nRfJ3JPPB;BBm1hKb8p?hRR#yq%fXKctUz7_I24R4Nsr=p zN8CaPv*Z0wr+uM%6#-Q<$!v#<>DHS?_tMGy!A7g?o4D&RHrSFT0q3(fBH78B38cr7>gch^|AaBSi=l34AC@Ey|lQ`lA(1tH4u@~bOu=(iUN z-eqi2K(sRZ5s(9Ycz(Ij=reNiqd-a@f}IDLJ#Bi=)rtA3zW*5|f5(kdFtDM)VEaPi z8coukB8Ai_B$J#x1{6qnu>5)C`a`nUNmAw{Be|3U4n2_zQhnBcVQ{O?=j9E9Y$I!n zzNzsfunvS?Qd^m;OrDGbi9sVGnEd*(YGi%GjPl@MyHjmNs&lY|?wPy&tneXe>>4^a z?B|H0X0oyU^Lle}yP;?==E?3ySfl(gd~kx%WYo~6#KKu=1QO+Qhl^sXAU}n%{AM;4 z$kUq?SZq;GFm_mH^w^=3`=N0lX}NhKY)}z3Yy&(N z{65?PAMnzkB+Nn{?a2#5jnLWZcp}^M21R7fK)#o(MG)Bqfp@q;YvhORXGGcgAla1eN-k%^}R6IzL@HZ2qs!26xVP^E)S8H z0rz}@l~f+A?6w|SGwH^Da}6fi%6MUo%^@xjDi1m%&O1<`thr&2Pq^oYE;0FAiuBJs z^+$OEz5{YedyLOTNID2t_MfkANl=&jbcfHD+b841CBqofZYs+2P{y5TsD?5$=9PWm zv`e#6>180NVZF8$$3!K<5=JWd!>S^V>1{K6hKA7lQ3re_whXc_z;1G$cB!sPz)=;Z zK^$mV!13t=2fbI|iV@gZ7m3K9Ty-r&R2 zLk30QPhnArmwzu>@wh-rzknq&y79Dl1ovL(l=IpP8f+cpeOT2caQnM7sw+G!0mtOn z0e-;Q-Df8l1?&pc?Dy=XlrtPNwUK0L=K@?iFRrr zZ-?$i=@4TsFRt)$52oDn?&=*9?)K$J&+~w{>XDj@7&4;a$o!`4xl{9gx7gFaL9^;tw&`Q~@6ktK>_K~r|{eq2QSQ|m5P|0xve!rwz z4)!1Eg{ojLR`Ou=mHY=Xo+zh@Jn~IJiM$p@#CtXyqKP_7xx>?hzo(@h0$6keJ!nAa z_`=Yt3R2qQax1hTh4lb3pa>yy3@KuChLa6dSGtwun6y=n&%=CpVKlS2%)pDgi|W!P z4pZw3RM|p6mK%VM=s+_A$5)0G+bd>25h2ME>tY<7fZJODwW*a%#U+$(WMl42Z*PAY zBMnncD7ZNnv$muPBJxmxp=7**iPeMKh%CJG&Ied*=Th2IztR#{pSZHsChNvzHB^SX zej?BA=PlbaJ8-)P%k^`gmmGgwo;yP!5&Hic@5|$q6NcWr*oz_qM;mu~UqJjIeT;h{ z^Zs!AAa|5wZ+oUGr`r>Tr~X)X9`H_KgbFcjQ>Ow@DLW4qQnTX%q!+x1>Nh<*`%eFS z)r$YuN>8pXMm@uMb8`12x@cW*DYeEBx$7?M2xF0QpDgXbgyvuEu6&;-#L81Ijrh;9 zDC~2o(=IE&ry26xTxrY;i6I3^hKjft-N?zpneT*7Gq6g?Fcg7{Z8U8tAl_AN2 z{;N?md3WTRgEEQTmGobd{u=7g*Bt>&!iJrx$lS*u;;RQ)SJ~U!Z`E08dh4*C``kQX za(^WtW3nXO<*lf8nN$*KDPNKoK%Mju>+}_)*WF!pCu#WEEfKdq6yP0(`N`UnoSgK* z=Cl*w0qP1lN>cZXTphflqtQu1GM;N)b!SS-lEntg@i7amF(V-m^;A}-mShXiZpoEB z5a9f@FfEF>+~JUm2Q#C_l{?IYB9T%xXWJVqo@i!X+xOKsT1Lcy5YN#tkJ zDx&QmbG3vWV1LLdcG;80;Wc7rluB)KQDJ|o5FyYaV{XI`T_yELVzAOGift5>#cHT> zHZHgb6|)a)2L@X6JKC;$6fS;BUm*noNY|m_B~?8@&*y+Gbu#YjZoo?e@NSjk5}{r; zbh35VJ%}fbqhIjPdtSW~PZ7$qROgkta!}%-4+nPy;CqA|;M|w0K*ELgdQ|qY%)K-= zIBlq3L&1fd!o@{M@nG#@_1%`k>aOf^p_ms6@-ptKiz~^?4JmXUVc4OD5N4f5c%6H= zou+?GcjKO#qyV@-2LvFENdype*#fmRWa$(#8N;5$agafSQIF~k{MvZT_D;mD1VviP zq$t@O0TGajGj8n`KitQMBdT;$nOE}ol(lnG?yp3y3W33*CMh>kN<@NKftFr;G^5t= z!QG=CM@vVY+}0ojOFv60>i0;x$v}$xxP8|B2qLG<0!9PiEoiA2T)IRy+8&WXrp8W; z8N;%T*3M#ZxAVQ!1;NRdQu7h0Ln&iCJlslUkg~I)5(M}V>B)dVMy-JEqLQ$$hmeS_jj%O^`S1s+fnLx79B`xB=L*f<2`p> zA1~Ls4PiYtNU_i&lVAVDgi}yPvI0n!L<>*h1d|6RcdE`dyI4HBoD?&$D<~{JyYKBq z(G&lw!ay2uZQ=oeeZ*V$f_7J2*%zK0+WivL@hP}hdQOs5T{MQQAor=HQ3p1 z59?!(S6UpTYSjKYOD6lNjo?##i|9>8w;bhG!hh=|FUpP*WC*U~Q|askK!u~+XarP9 z1n7-$;|%6OrB=iJ*oDbaAxAv}Gz^&>=5%A*jm zh33N?-Z~2VqtrU9*Fss>0L4w zO9q)&Jw*>4qWM;GViFPeuoVTs0Aw8hNq1WoF!ZH%TI-92RAaCtLywD~K^eLTKZ`Ss z$IQc{2ka*3BoY9K*bJCUh{LthXiMa~K+^=sK-)|GvV6MxjM1qw&e2XHoWaZP#S zs0>nxo&=XVL5vZz!>0^_0P!#akV;XgVRk&V+3W!ZVOmcxr^!&H+z`Rwok~i?_IN|_ z_S7V+8J_`tS)iu`!H?nx0`@cEGfVO8+oNC`%9NKG&ClDn?HrHp9R-1@8eay2>mFwT z$K|sP0S-TO?aR@2A8l??WYf(LSAeJl+vlOCL}_V1Ax(QOan~&d9niF~S|okV848JkBECia?Y8LW(ZPe8R!7KYM1l!+kjE7F8A!rl^Sy5hrvft&5(I4$%-V@* zar@X6_2gKYYkM00p+9esF0AUX03wd%NSC)%55&zKP$0v-Q3~9ARYLMOts-O-2h9p@cig91uf}y_@&4brdUWWM!!lzF){liFb&O@*VWZU z^Sy{FL;`G|=k10ZAU(MN6UIr{24&ZWg=P}CXLfFH&`cM`H(QS1KD&^R(UJA<>lt3r zk)i>VD?mSeiIYa8e{X2dwHmQr;dFfZ??uJW*K}y-Ci*uty(z z=s9F0a2<2!NO_5~vzJ$jEcKP<^8Vi!pu;bs=Zrt<%AK7V0i8=~hM3{{KPy3f%RkBG zkyeh4TW$j)4H0ZQLQpaa5HjA$a?{FhpMB7gkAvPrAHc|wINZh|;cGFjn4JNC(6Me; z+1yBMYccGqRaVR`fki|xl{Y;>b9fO5sw)ZZ5GCtVkva9nA<0~dIw|~0DNNv80z%le z6xd>lQ{z6ZsmhhXy~d|XNgtBb#tl>Z|2F((GT;*3tDtxmn+7&ghAm_};PFT|mtA#r z4;IjFbihEz-~#6EB^Ci$xG2Drr~E=6A_CE-H6X7W6quIxivH3yqyIOI#k3(=l~r?b zr&flHyNlXm7<#BLS<=kpjUky_?vEXeZZ75wi*oaWxUqp<3veXYC<*wWaG&reW&D{GP7IP3 zV^ds_KQnn_UpvuF^@HCGJ;&JoDJhQlj_+3NOWPMP*WFxpTDRGVohr0xBh_%R@yV0? z1_#cC*2I!1DL@wh3kaz*E(v7rnG9w5Yo^gfBtRnRQ~(J#L5P0-`L}ml982KDU5APM zZiQ|o83k`@NeUnUX+#f%lvO8IQV`Sxo?SZhNFf_Z!ND|y@$DOOZod}+s#n1vmok{- zG(k~}UZA@sZ>V*Hlei&M!TsSd%(h(}L8Q-IgTBhqD}r)>2nc9crM1^=T;oea!2jbq zb$zl{rpQv82pN&fm%Xv!{Ji$(>nP5_J_x8LQvg*OK$O#UJaG+|3roy)tpf%E;VQ#b zCNKsLDo^{c?Z?He|6&Eu>ySA?{BEdCfbyW%dlsu@LEixiOE!4Dww;|D3f$vQ$KQt$p3Q_xO9H<;J{`w_x|>MF3qfwb zG*R=w=QiLd_HE-jwqQF6&<_owMvE}X!^^?80_3~D-&%X9;Z)T*q)1854H8Qft7?yH zuf4|q3PS-#lut^Q6weh45^7uDIOF@oPd^c+}fMLi$y{v;kVQMT1>HjVU;XZ=rXJ3@0M8? zLoG$#m8V*k*#!I4(1d{DjTU5&9CWiDGC5#!$h;0q-M>z5v;&h{p%R_AK7-l-p{;K0 zbo;B{uYdAypZw3yKH2}u3p#R@ZV$-ms?SMpf|{x*A_(4q59b6x|H09y-M;0fC2$-hP$C?OvaHPQ z^wlnQrO5Pz!fLp$9hyptiuGqCb6Mbk?5T^C4G!@ zjul~8RH?kbsO}(92FdMGN9+PP#H5%@qJ@2Cj3@gy499QiToXr#+?t#D%?J!=^~uQq zTD>+hju_5}{`};`uvtbew;6q@=J(3vh>u`rbrJNL@dcowa}#ATSnW9wF=7E9kI62( z8ITwS1Wo(N_TsY_)y1Qx0I}uU$Njt77$*G_e)AF)aHV6kJp;e z=J=NSOcE>5h8ch|amBfJio;=QBnyQSaj*-Dav@f;(E<%_-A?)!))8Yiyg0AVe(bIU zx3ojbV6Crqy65?{s{1m1EvG$;u~oq(PfmWgc`G}YnQ~xEtBIvB5^4KrdTA(SMr@_9 z>F{(2PHZ*O*RmL#O*B<3mh=&nL_xG2m54EIQay8~&hpZy{{!%hPaa=xZK+o*z%@xH zT|)FF7!F+6o+llngBNKYlnH1n0l|fYzRd>hMm(Iy!(_k;gdwpe4N74Th`S+!54QD~ z_hS;L2|NyZa%9;SxAg=B`n7VJk1stJ3VtnS^u z(!4|g2_DJ@!~%ql7BvjUeX4Z|mc^m@D$WdK70P<6&=Wj2=WB4utX?}@7btO>vJ>W*0a?3 z%Bkv>}{{dy8uHx}yUu38`DxZ)`I!|*}*j}0$5QdBp@TMUK(<-_Kxf<08;zGvor zV4S*ep$*s_4eXKktbt}@vO~z#I0VZCYBBvEUanr%3r)DFEy^Xqyfd(}sOQ5CsF#3W zWju&`%l!UkG~2dUZinqgThsHfn<0*PBA!y>En3h5P>CjkcRY)Iu(mi6VVu!6OtH|( z`=_UW;!j=HV>Y@lDDrkpPq)Wzg9F;Vm*1=f~+-Zer*Mv#CXhlnW0NIp%Fs8-&gfcJ(nYda#J{#vQRZJm_UR`0=(Fk zz0XHV%lZ{ri>WDn`Y2~!imhdofU(=!4H@mWI6WQO(H1&eU=4FYA5p-&?@B2RZR~TUDYUdO zrytgt(Nu4+K9)i2aLyvCC|Zp~_%z0DqHA$WNrGX;p82PbxR~xpO@Q4$+(ZuQmA8G*RDCkCI7G$iWJ~?=REEF$sb2-lHf)NMg zv>Ttp1aWWd2Vq@Y@R|OoT`fC4Hb#BW)?36x1{PHem=sY84KmEyE}3OG*dW>%Wuz$H znt`59Oz{X-C^WUHM7~+$HFl|pzUeyfiizi-)zP#Cq`p_ z>_WVoAOsuAC8RE*er-!pKQm<&z0M15`n^d-WKMx98G*@7lmvj;W2xw|i?c?+UyQ<1 ztn`x^i7Dohm1jyqKaeb1hD2V7gzAs4;_K?dy1|GFEbh9?>$CP;Jn;m4$6(okP%J=) zQX|_v9L|k#+r~!V^g6@K`?P+EMt^ThZxipoJF9M+^K%dre(7$S%7{HA+`tP5wee6F48JQab58=r*HGI52m)fo>w_s|+?6C7vAz@G{K z8N&~VB?r7JPCAfddT~1*-p&baj2k02I6{}|BM^HDA~~wD5p9f*G&#N{5I9njg`Y%7 z^|aw%8)#!$ybLqdBDI?CnO4?h!l+_ZlXIbE5#xsmiPSJoJl7Ab_YSx)|DKC92uJUS zDPTWm$bhvVcp1+Vv3gjdo3U`vv>SPZ#j}jv6!UpAatUPWyJ4v5^(PV(iS5L zzHEtLy4wmfu-cAbDvZNj{_qKrX^Ty2aKaFoHvdpB=iHPoUJFVQyM5!XduiHxF; z9=xT*n@$D7= z8uOzt9K9FDlNYUwB0%R^Lw#?sRCDxuWoR~-MMIBvcrAKDkkrjf@R3Oa9Mi+(HGBi6 zLOQ;IFI%-=h8jUDP6L8lP?Q9K z)pDX=Y|Mj-Mr#I?0U@er2}1+MgG`5{1KGnPM9JwTu3KtLkM{fYbh6)rn7_rqthpu* zl8~TuvJdeeG*Zw=%r!=cW`*ddBXw|CA!FFO4#AXcu8B_Ts!Ippp>N*mx}Bj7;b1U} z_&Gn13rJ0Qn(0cv<>)`M+2L~&bX?-nFeiW6>;~??hV*Z7!QWkULy46pl<8|JM*qjpECg(^3`f6bI65^+T7xCxFzVSYH zi$l1da{HNF(S{b}R3Bj7rGL4&eRB`a&o2_17Um&VN6Zkw=!IkrOJan1sEopF*MtQ; zgiU>Z>zP!EMZt5Z9Qd!4vV_D-7Vt%GF8@@!os^h*Fn?O>m8fN4YuW;JS|ZS9hFj4V zj}GO|7`;SSLmpKYqjyeXr9b_>VHg&K=L!0|-p|-cYS(D> zFx*{tGSVAB2W5mwUf}~S8D-Fr4n&0D@O(_Lwqi1^yL*8fSSXN6`$&Nd7qKG8Ii*w_Gf?>koruf%diJ3>zTcsh4W6J4aS_7 zjofcWuL^fwnM!D)_pYkD^PfB2H`byS-Mhrc!*y2F9pOJ3em8nakqgHse}f`cqWP&Z z33wzP2%;kpBe5w@DA`8yKPx>yql8=mpDgwP>fVW8Z4}}8Ob2vD4jn`TF#;$1m5!9d zs$}G1&^4Jyk#St;2zpx&E^;WvnyB74cg`xiP+qd1Ei~(YKW1M0-;eRLG4K#$n*wsy zHF;LIV0;Kr)6`L~y)Qbhr+otsGLIk7zU7RaoLD|*XH4>_gdPKOOFD5VC50#78tyq9 zP8j6uT(u@6#&FaSsqAvc@q#O$;qGoE(Kx87R2#Mppeq88Bph+}(h}2=GI=DZ@_mCp zKQ2IF%gEg*B=p}rlCO+md4=Z?t^)=Ypwpbcl!{2I6$~6!+2*)Dhl;G!p3mNCXH07TkUSP|_0mnes zKZk3AVZi_sGFV!C94rjZ(tuSRzi@DEK;dRb@cD{Qlnn64@MERN32m$$%}4WRLOLXY z2z8;yCRU>K?(ygSQOqdRE+Emtjx^8gokXx~PHoaUA~%6rzGK3aS01*_n8>MELm&eO zxUD7fcD&7ke>=KG+|^o$eFo#`B|92{93U3+riml){As{F^go>6-eNVH#5u^#rj{US z#Xdji4R4SNGbGU}0pf)C)7i-|E0$h}F-H#|`9s*+YrtG^Kf)FD$w3tEe5zD`}E7k}an*xiO34Nt~DL^FZ2mi_TVs~MCe*jS7 zc5ETBD&_^SXD27GP=2HZzDLQ_&4rdh!7$q8sM32t6+o;f=cz_Aq}*HrWVa2;Hpa6%Z}_6wl&7 zB^**8>JDk1Dhk7`+%6#AgQ5liG_i7!0lpb|p#B)^d-v@Zm)#wv$GeKWBLO-QTL)_G zouplY6kCH>-}Q)FkP_!(`pT#0g%o>Na`6o&SNE!&CPYM~g!&<-lA|aPxAK5bK6?Qm z(PgD2T~b7X9fjI1?=thtgM0$9g>=M_-N{-a$BoZ*me zB%gis+(O0au%rTyq|@%<9xz;RBylgd4|y+cfXnyfW2Awh}0LWqNXI$08TBj z1`?9$_FHSnQF`|)yppyQfti*UxW4PE_D|M3OMNgP zbcxX5P)msu~2z0)YY)LqJ2T9h9Ns)>S^m6fav*w4?BDLVZG7ZFW-35)%L2K1g(W-85b9J2sK zMr!m{0U7}noh+-Br-#->eD(&Z#Tx0&A@SAcuH0Vm^uvhNnXr-T@Zft-FXAXZSHO z0Lbz?{AT@NTHxM5HXPiQQG>(gd_^zcXeW;4d9ZS`#_|;-7q&^!9CoeZDw4cAU1NE= zjGM4@PC5TyP?GHJns`59h;z>I*=%iOQA(o$yxW>g7h`)F1UNA+aKI4fM;NprmC{I# z$Be?LAhK#FCoV(UXFAAXk^Rt22fcu-%WJX|)V1btR~7iNz=KKoD<=>n(r#v&E#zlu zsBkR;G<|VlD(qlGC%rBSGqB&d(?ldQ&$hU$4*=x&0S81{$)bV%ar>@oH;)1z$qk#l z&|2kPg0W%4i4?Q~(GCkN)sdw#$dnC(kd6^>V#XWPcq_pOwkEfgSR0#GlxzuPS)-$3mB6=7uH~Lo~peI}F z5mBtID$oMmReRPV$^D4KNzt;;HoMU#Qw}zRK;bvdx672D^FdV(fvY;(R;HrQ?M9NzuMu^e#r(BUGu3%-c z<>eY}^XAzf=cfqZFzzGf6aeEb>VabkPdSxERy8}MdvW~ZVS*F@x~IhVaffuZ(R!v* z=c3354C8Hg^Rs#uC}f9$Axdk2mJ2CBXP}uLlF^(H61!H6*)Q2&x6~@&C?)TkumILl3z=zvzGz!dH>DL~6d~jNLv+P;LVW`q%fN|JRa(t(zdBq* zV>R_)iA!SMVWodnqVf!6kO=kwyDSU=ml+PI<=7>qz15d`5`CxqDsTnRp}V-B)BchfH`Rns7i zGopy@Z*B?LJ7h~YHsZn&Y$?u8%`AX&K%9oO$exgeL$SvG<(^unbYz{<2KGhog*g_f zV1tjXr{+#>F1d|g6@vWe!{zev6~aAQRt);m!GvZ|-i-YLlT$8N{~D8*KBGODB;Qjy*g- z+*)qmKEHa?VTUpqZbXAqnGR@s5H~@jAKDz=@&|0y$(nd@AUq_ROk7Z>C9SG1E+x%P zEO*maq{RF(!y1w@_J+I6vwmB&m84}0a!S@q{UIXU7HR947{KGGYT^@UQ```>OA~)GwzF>8 zW6fnQLt1d{jP0>jizS^+%+zc(PWZYd-35F#_FHV`=F$7vVr$T#JeFp@y!gJm`xZtW~j!B_qaUqh8XMYl*t{AOt3Py08QF^M! zz6;zDoc*6`S*M#jI}UqR{y7^z7>X0NpemB50i+hd!BTq3m2dm+!9U&$dDF`W0WVbjU2Nsj3W z)1w$!#fwNylAR_GWMPagaV0m6Xk#h1i+L!_$c{6P}P2<~bIX4O8oeDaFWkzbQZlf`HK4VgQ|5!iHN!?!(5U@7Vc2ov-C%9n$<0F&`wa z`6CR0tCD|7jtGPsp@T>%H1cADmSju?@N&t9k@ghLn>97z>~7k9 z4^(kOI(7z}Mk>iX3+HrfRp}Cr7u7?HfGh(dAM}GwzLgRBg434EhUEL2fA~a5^J^^|dAq|pkw=mkFJz0~G)JTG7K#fFeX{XEkpgMu7R#rjQKp$Pu)AuAL z|0$CG0alCfo&vN6Aco|AOnPuh|0JZaVn8X6C+~5dGxO}=QUY&AHyAM~77VWDltDkN zwS#?yNz@B&J5f*_-V_r?o0*6P%BGKRCv~LYxIZ}oG-1FW5}={4ZvT9Kb$<)klR6tB zfZi_U7nmo+P)8&fafoDJ_Z2e|XW#gR$yx~>gUP=JfiiA>R)`DCG9|_0sDaworNl$< z`%f9&;1)p|k{WSaNh5;sB$+o+Ph(&fnxqk0S>b4sU!*BDyu!Yc{=2@jg?oB%z2mmQ zElNT$$x(Hh8=|)cPrv|7E$UoKLt`O#$q`MEQv{=y$_a5NdnD->zx)60i~p-DV6!i+ zc}y`0w5BGhm8PBXE*hJ}M)V2b0iblZz}Zs-r55p!gKW5nATg{4kSz5pW*{WM46wBV zr=2ErNrA?x=gE4V6$?QJetK#LuG6#C=k4?~FNOp_mlyMx02}HVgD?h!Z%XO|z*}ZO zpUQ%IO-9!FtVr>EPzjr`8dNoq_BnYIN2Vnjz9>WjVAhD%b9Q-5S_%1k}5} z9~QGf72n)n00CzTKC?aebV~9F1T_L~AiVA1_P7?Ny@ymln#aW$ax58rpU239JSnAKkDnh@C~SpY*;QOJKKkf!6%akDs}2QB#{YGm&?M6#=ip zX2SD>=buPZ%BO}687@?5Xbitq%GzRKz-Rn&Q(d!JKys2Zmqj^|69BJakT;JGJMML_ z45u-$rdguMVjij2ZppkPnV5dDB`Ob5ivGc4`HoAKg)QOBDFPEA^XT42x>MvUabTcE zjjP!6uhe+wAJRKt$<~j1rRXqKC@GNER^(b)0me*nT2LDd7|Ah}irQzsG70M$0Cb9S z+NX8N&62rnn(2FcH`KAHSJcHK$g=~JrGcpi?Dj-#@OPM#Ubm#4Wq_(s0$dYHZ}dS< zd=R`x96@c8G{EW&R+l0p$5J2h%Gaw{s ztIVz6vWMmm;?6{QB(rrt8mt5N~{13&QJE$%U?ty6=}S9K8u5h@a-8_WmZH!e+*7%RkM0Mx8xWPb6zjPA7# zPHzwGTL^cULh(jG>2^CcQy@;(6s`guvH&R$e&8OCPm}ppc81dO08H1nyNi2u?ouG3 zBiTBx!3%0r3G*2}cTEgk&p)R)Mg&G*K~{Z}}CHa2T1JxaSPP)ci$$TjrTcUqUBEi^5G3*JLO)CQHKn#YzA1I(r2Fjge+biB3 z%2j3py*dK&NC-tG0@0&u;nx(~6EF9891`i33TwE{3`pyoP3({3yD#m$$86#y zzx`ZR!}MKK+)Y$4sx^f8pgHdJZA4Nd>A&V&vilR-&+RX*rceqjUyUyij2^)KFc}zM zLTt*D+DLU(oI zBia}SZv#qH?%ZCQv5y(;fD&IF`L0yOqNe%C$GkND+h?7Cr7u=QHn|wVt{$K-@wsir zg}ingYKRM|iPtAc7kEuT>!|K6J}3zpF~NA!Au6l8UnbM`zr9sPRv4LEN!pClzp$^Q z`!fhUYu5|&9DVniPW?dT+6C|raTf5uSb%qcStUH4Thk2mx!35R-cu7pD;5lLiP{#3 z?WwPLiF{U<(FHafdAL0VD|qR_fd(BYD3T!}Xll6ts*eK!4i5CG l}TKJ=dL;;al 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∈UfG@Zhxd?e*Y{wCLSbzw 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 z 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%0ApQdr&v~Qi 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Ì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�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 c+$^8)6r<{~W%E5*HIoJ9eFZCDu@~ literal 0 HcmV?d00001 diff --git a/crates/lad_backends/assets/definitions/bindings.wit b/crates/lad_backends/assets/definitions/bindings.wit index cf3264bbd4..b5028e568e 100644 --- a/crates/lad_backends/assets/definitions/bindings.wit +++ b/crates/lad_backends/assets/definitions/bindings.wit @@ -1,14415 +1,9 @@ package bms:scripting@0.1.0; -/// Methods for World -interface worlda { - use types.{reflect-reference}; - - /// Checks if the given entity exists. - has-entity: func(e: entity) -> result; - /// Retrieves the resource with the given registration. - get-resource: func(registration: script-resource-registration) -> result>, string>; - /// Registers a new component type with the world. - /// - /// The component will behave like any other native component for all intents and purposes. - /// The type that will be instantiated to back this component will be `DynamicComponent` which contains just one field: - /// - `data` - /// - /// This field can be set to any value and modified freely. - register-new-component: func(name: string) -> result; - /// Removes the given resource from the world. - remove-resource: func(registration: script-resource-registration) -> result<_, string>; - /// Checks if the given entity has the given component. - has-component: func(entity: entity, registration: script-component-registration) -> result; - /// Creates a new `ScriptQueryBuilder` which can be used to query the ECS. - /// - /// Returns: - /// * `query`: The new query builder. - query: func() -> result; - /// Inserts the given component value into the provided entity - insert-component: func(entity: entity, registration: script-component-registration, value: borrow) -> result<_, string>; - /// Pushes the given children entities into the provided parent entity. - push-children: func(entity: entity, children: list) -> result<_, string>; - /// Removes the given component from the entity. - remove-component: func(entity: entity, registration: script-component-registration) -> result<_, string>; - /// Adds the given system to the world. - add-system: func(schedule: reflect-schedule, builder: script-system-builder) -> result; - /// Despawn the descendants of the given entity. - despawn-descendants: func(entity: entity) -> result<_, string>; - /// Checks if the world has the given resource. - has-resource: func(registration: script-resource-registration) -> result; - /// Retrieves the children of the given entity. - get-children: func(entity: entity) -> result, string>; - /// Tries to retrieve the given component type on an entity. - get-component: func(entity: entity, registration: script-component-registration) -> result>, string>; - /// Retrieves an asset by its handle and asset type registration. - get-asset: func(handle-reference: borrow, registration: script-type-registration) -> result>, string>; - /// Checks if can get asset handle - has-asset: func(handle-reference: borrow) -> result; - /// Despawns the given entity. - despawn: func(entity: entity) -> result<_, string>; - /// Despawns the entity and all its descendants. - despawn-recursive: func(entity: entity) -> result<_, string>; - /// Retrieves the schedule with the given name, Also ensures the schedule is initialized before returning it. - /// - /// Schedules in bevy are "containers" for systems, each schedule runs separately and contains different systems. - /// - /// By default among others bevy contains the following schedules: - /// - `Update`: Runs every frame. - /// - `PostUpdate`: Runs after the `Update` schedule. - /// - `FixedUpdate`: Runs at a fixed rate. - get-schedule-by-name: func(name: string) -> result, string>; - /// Adds the given resource to the world. - add-default-component: func(entity: entity, registration: script-component-registration) -> result<_, string>; - /// Inserts the given children entities into the provided parent entity. - insert-children: func(entity: entity, index: u64, children: list) -> result<_, string>; - /// Returns either a `ScriptComponentRegistration` or `ScriptResourceRegistration` depending on the type of the type requested. - /// If the type is neither returns a `ScriptTypeRegistration`. - get-type-by-name: func(type-name: string) -> result, string>; - /// Retrieves the parent of the given entity. - get-parent: func(entity: entity) -> result, string>; - /// Spawns a new entity and returns it - spawn: func() -> result; - /// Quits the program. - exit: func() -> result<_, string>; -} - -/// Methods for ScriptComponentRegistration -interface script-component-registration { - use types.{reflect-reference}; - - /// Retrieves the name of the type. - type-name: func(registration: script-component-registration) -> string; - /// Retrieves the short name of the type. - /// The short name is a more human-readable version of the type name. - short-name: func(registration: script-component-registration) -> string; -} - -/// Methods for ScriptQueryBuilder -interface script-query-builder { - use types.{reflect-reference}; - - /// Adds a component to filter the query by. This component will NOT be retrieved. - witha: func(query: script-query-builder, witha: script-component-registration) -> script-query-builder; - /// Adds a component to filter the query by. This component will NOT be retrieved. - without: func(query: script-query-builder, without: script-component-registration) -> script-query-builder; - /// Adds a component to be retrieved by the query - component: func(query: script-query-builder, components: script-component-registration) -> script-query-builder; - /// Builds the query and retrieves the entities and component references. - build: func(query: script-query-builder) -> result, string>; -} - -/// Methods for ScriptQueryResult -interface script-query-result { - use types.{reflect-reference}; - - /// Retrieves the entity from the query result. - entity: func(query: script-query-result) -> entity; - /// Retrieves the components from the query result. - /// - /// These are ordered by the order they were added to the query. - components: func(query: script-query-result) -> list>; -} - -/// Methods for ScriptResourceRegistration -interface script-resource-registration { - use types.{reflect-reference}; - - /// Retrieves the name of the type. - type-name: func(registration: script-resource-registration) -> string; - /// Retrieves the short name of the type. - /// The short name is a more human-readable version of the type name. - short-name: func(registration: script-resource-registration) -> string; -} - -/// Methods for ScriptTypeRegistration -interface script-type-registration { - use types.{reflect-reference}; - - /// Retrieves the name of the type. - type-name: func(registration: script-type-registration) -> string; - /// Retrieves the short name of the type. - /// The short name is a more human-readable version of the type name. - short-name: func(registration: script-type-registration) -> string; -} - -/// Methods for ScriptSystemBuilder -interface script-system-builder { - use types.{reflect-reference}; - - /// Specifies the system is to run *before* the given system. - /// - /// Note: this is an experimental feature, and the ordering might not work correctly for script initialized systems - before: func(builder: script-system-builder, system: reflect-system) -> script-system-builder; - /// Adds a query to the system builder. - query: func(builder: script-system-builder, query: script-query-builder) -> result; - /// Specifies the system is to run exclusively, meaning it can access anything, but will not run in parallel with other systems. - exclusive: func(builder: script-system-builder) -> script-system-builder; - /// Specifies the system is to run *after* the given system - /// - /// Note: this is an experimental feature, and the ordering might not work correctly for script initialized systems - after: func(builder: script-system-builder, system: reflect-system) -> script-system-builder; - /// Requests the system have access to the given resource. The resource will be added to the - /// list of arguments of the callback in the order they're provided. - resourcea: func(builder: script-system-builder, resourcea: script-resource-registration) -> script-system-builder; -} - -/// Methods for ScriptAttachment -interface script-attachment { - use types.{reflect-reference}; - - /// Creates a new script attachment descriptor for an entity attached script. - new-entity-script: func(entity: entity, script: handle) -> result; - /// Creates a new script attachment descriptor from a script asset. - /// - new-static-script: func(script: handle) -> result; -} - -/// Methods for ReflectSchedule -interface reflect-schedule { - use types.{reflect-reference}; - - /// Retrieves all the systems in the schedule. - systems: func(schedule: reflect-schedule) -> result, string>; - /// Retrieves the system with the given name in the schedule - get-system-by-name: func(schedule: reflect-schedule, name: string) -> result, string>; - /// Renders the schedule as a dot graph string. - /// - /// Useful for debugging scheduling. - render-dot: func(schedule: reflect-schedule) -> result; -} - -/// Methods for ReflectSystem -interface reflect-system { - use types.{reflect-reference}; - - /// Retrieves the identifier of the system - identifier: func(system: reflect-system) -> string; - /// Retrieves the full path of the system - path: func(system: reflect-system) -> string; -} - -/// Methods for Handle -interface handle { - use types.{reflect-reference}; - - /// Retrieves the path of the script asset if present. - /// Assets can be unloaded, and as such if the given handle is no longer active, this will return `None`. - asset-path: func(handle: handle) -> option; -} - -/// Methods for Color -interface color { - use types.{reflect-reference}; - - /// Creates a new [`Color`] object storing a [`Oklaba`] color. - oklaba: func(lightness: f32, a: f32, b: f32, alpha: f32) -> color; - /// Creates a new [`Color`] object storing a [`Lcha`] color. - lcha: func(lightness: f32, chroma: f32, hue: f32, alpha: f32) -> color; - /// Creates a new [`Color`] object storing a [`LinearRgba`] color with an alpha of 1.0. - linear-rgb: func(red: f32, green: f32, blue: f32) -> color; - /// Creates a new [`Color`] object storing a [`Hwba`] color. - hwba: func(hue: f32, whiteness: f32, blackness: f32, alpha: f32) -> color; - /// Creates a new [`Color`] object storing a [`Hsla`] color. - hsla: func(hue: f32, saturation: f32, lightness: f32, alpha: f32) -> color; - /// Creates a new [`Color`] object storing a [`Srgba`] color. - srgba: func(red: f32, green: f32, blue: f32, alpha: f32) -> color; - /// Creates a new [`Color`] object storing a [`LinearRgba`] color. - linear-rgba: func(red: f32, green: f32, blue: f32, alpha: f32) -> color; - eq: func(self: color, other: color) -> bool; - /// Creates a new [`Color`] object storing a [`Oklcha`] color. - oklcha: func(lightness: f32, chroma: f32, hue: f32, alpha: f32) -> color; - /// Creates a new [`Color`] object storing a [`Hsla`] color with an alpha of 1.0. - hsl: func(hue: f32, saturation: f32, lightness: f32) -> color; - /// Return the color as an SRGBA color. - to-srgba: func(self: color) -> srgba; - /// Creates a new [`Color`] object storing a [`Srgba`] color with an alpha of 1.0. - srgb: func(red: f32, green: f32, blue: f32) -> color; - /// Creates a new [`Color`] object storing a [`Hsva`] color with an alpha of 1.0. - hsv: func(hue: f32, saturation: f32, value: f32) -> color; - clone: func(self: color) -> color; - /// Creates a new [`Color`] object storing a [`Laba`] color with an alpha of 1.0. - lab: func(lightness: f32, a: f32, b: f32) -> color; - /// Creates a new [`Color`] object storing a [`Laba`] color. - laba: func(lightness: f32, a: f32, b: f32, alpha: f32) -> color; - /// Creates a new [`Color`] object storing a [`Lcha`] color with an alpha of 1.0. - lch: func(lightness: f32, chroma: f32, hue: f32) -> color; - /// Creates a new [`Color`] object storing a [`Hsva`] color. - hsva: func(hue: f32, saturation: f32, value: f32, alpha: f32) -> color; - /// Creates a new [`Color`] object storing a [`Oklcha`] color with an alpha of 1.0. - oklch: func(lightness: f32, chroma: f32, hue: f32) -> color; - /// Return the color as a linear RGBA color. - to-linear: func(self: color) -> linear-rgba; - /// Creates a new [`Color`] object storing a [`Xyza`] color. - xyza: func(x: f32, y: f32, z: f32, alpha: f32) -> color; - /// Reads an array of floats to creates a new [`Color`] object storing a [`Srgba`] color with an alpha of 1.0. - srgb-from-array: func(array: list) -> color; - /// Creates a new [`Color`] object storing a [`Xyza`] color with an alpha of 1.0. - xyz: func(x: f32, y: f32, z: f32) -> color; - /// Creates a new [`Color`] object storing a [`Srgba`] color from [`u8`] values with an alpha of 1.0. - srgb-u8: func(red: u8, green: u8, blue: u8) -> color; - /// Creates a new [`Color`] object storing a [`Hwba`] color with an alpha of 1.0. - hwb: func(hue: f32, whiteness: f32, blackness: f32) -> color; - /// Creates a new [`Color`] object storing a [`Srgba`] color from [`u8`] values. - srgba-u8: func(red: u8, green: u8, blue: u8, alpha: u8) -> color; - /// Creates a new [`Color`] object storing a [`Oklaba`] color with an alpha of 1.0. - oklab: func(lightness: f32, a: f32, b: f32) -> color; -} - -/// Methods for Hsla -interface hsla { - use types.{reflect-reference}; - - clone: func(self: hsla) -> hsla; - /// Generate a deterministic but [quasi-randomly distributed](https://en.wikipedia.org/wiki/Low-discrepancy_sequence) - /// color from a provided `index`. - /// This can be helpful for generating debug colors. - /// # Examples - /// ```rust - /// # use bevy_color::Hsla; - /// // Unique color for an entity - /// # let entity_index = 123; - /// // let entity_index = entity.index(); - /// let color = Hsla::sequential_dispersed(entity_index); - /// // Palette with 5 distinct hues - /// let palette = (0..5).map(Hsla::sequential_dispersed).collect::>(); - /// ``` - sequential-dispersed: func(index: u32) -> hsla; - /// Construct a new [`Hsla`] color from (h, s, l) components, with the default alpha (1.0). - hsl: func(hue: f32, saturation: f32, lightness: f32) -> hsla; - /// Return a copy of this color with the lightness channel set to the given value. - with-lightness: func(self: hsla, lightness: f32) -> hsla; - eq: func(self: hsla, other: hsla) -> bool; - /// Construct a new [`Hsla`] color from components. - new: func(hue: f32, saturation: f32, lightness: f32, alpha: f32) -> hsla; - /// Return a copy of this color with the saturation channel set to the given value. - with-saturation: func(self: hsla, saturation: f32) -> hsla; -} - -/// Methods for Hsva -interface hsva { - use types.{reflect-reference}; - - /// Return a copy of this color with the value channel set to the given value. - with-value: func(self: hsva, value: f32) -> hsva; - /// Construct a new [`Hsva`] color from (h, s, v) components, with the default alpha (1.0). - hsv: func(hue: f32, saturation: f32, value: f32) -> hsva; - /// Construct a new [`Hsva`] color from components. - new: func(hue: f32, saturation: f32, value: f32, alpha: f32) -> hsva; - eq: func(self: hsva, other: hsva) -> bool; - clone: func(self: hsva) -> hsva; - /// Return a copy of this color with the saturation channel set to the given value. - with-saturation: func(self: hsva, saturation: f32) -> hsva; -} - -/// Methods for Hwba -interface hwba { - use types.{reflect-reference}; - - /// Return a copy of this color with the blackness channel set to the given value. - with-blackness: func(self: hwba, blackness: f32) -> hwba; - eq: func(self: hwba, other: hwba) -> bool; - /// Construct a new [`Hwba`] color from components. - new: func(hue: f32, whiteness: f32, blackness: f32, alpha: f32) -> hwba; - /// Construct a new [`Hwba`] color from (h, s, l) components, with the default alpha (1.0). - hwb: func(hue: f32, whiteness: f32, blackness: f32) -> hwba; - clone: func(self: hwba) -> hwba; - /// Return a copy of this color with the whiteness channel set to the given value. - with-whiteness: func(self: hwba, whiteness: f32) -> hwba; -} - -/// Methods for Laba -interface laba { - use types.{reflect-reference}; - - eq: func(self: laba, other: laba) -> bool; - sub: func(self: laba, rhs: laba) -> laba; - add: func(self: laba, rhs: laba) -> laba; - neg: func(self: laba) -> laba; - /// Construct a new [`Laba`] color from (l, a, b) components, with the default alpha (1.0). - lab: func(lightness: f32, a: f32, b: f32) -> laba; - /// Return a copy of this color with the lightness channel set to the given value. - with-lightness: func(self: laba, lightness: f32) -> laba; - mul: func(self: laba, rhs: f32) -> laba; - /// Construct a new [`Laba`] color from components. - new: func(lightness: f32, a: f32, b: f32, alpha: f32) -> laba; - clone: func(self: laba) -> laba; - div: func(self: laba, rhs: f32) -> laba; -} - -/// Methods for Lcha -interface lcha { - use types.{reflect-reference}; - - /// Return a copy of this color with the chroma channel set to the given value. - with-chroma: func(self: lcha, chroma: f32) -> lcha; - /// Generate a deterministic but [quasi-randomly distributed](https://en.wikipedia.org/wiki/Low-discrepancy_sequence) - /// color from a provided `index`. - /// This can be helpful for generating debug colors. - /// # Examples - /// ```rust - /// # use bevy_color::Lcha; - /// // Unique color for an entity - /// # let entity_index = 123; - /// // let entity_index = entity.index(); - /// let color = Lcha::sequential_dispersed(entity_index); - /// // Palette with 5 distinct hues - /// let palette = (0..5).map(Lcha::sequential_dispersed).collect::>(); - /// ``` - sequential-dispersed: func(index: u32) -> lcha; - eq: func(self: lcha, other: lcha) -> bool; - /// Return a copy of this color with the lightness channel set to the given value. - with-lightness: func(self: lcha, lightness: f32) -> lcha; - clone: func(self: lcha) -> lcha; - /// Construct a new [`Lcha`] color from components. - new: func(lightness: f32, chroma: f32, hue: f32, alpha: f32) -> lcha; - /// Construct a new [`Lcha`] color from (h, s, l) components, with the default alpha (1.0). - lch: func(lightness: f32, chroma: f32, hue: f32) -> lcha; -} - -/// Methods for LinearRgba -interface linear-rgba { - use types.{reflect-reference}; - - /// Construct a new [`LinearRgba`] color from components. - new: func(red: f32, green: f32, blue: f32, alpha: f32) -> linear-rgba; - /// Return a copy of this color with the blue channel set to the given value. - with-blue: func(self: linear-rgba, blue: f32) -> linear-rgba; - sub: func(self: linear-rgba, rhs: linear-rgba) -> linear-rgba; - mul: func(self: linear-rgba, rhs: f32) -> linear-rgba; - eq: func(self: linear-rgba, other: linear-rgba) -> bool; - /// Converts this color to a u32. - /// Maps the RGBA channels in RGBA order to a little-endian byte array (GPUs are little-endian). - /// `A` will be the most significant byte and `R` the least significant. - as-u32: func(self: linear-rgba) -> u32; - add: func(self: linear-rgba, rhs: linear-rgba) -> linear-rgba; - /// Return a copy of this color with the red channel set to the given value. - with-red: func(self: linear-rgba, red: f32) -> linear-rgba; - clone: func(self: linear-rgba) -> linear-rgba; - neg: func(self: linear-rgba) -> linear-rgba; - /// Construct a new [`LinearRgba`] color from (r, g, b) components, with the default alpha (1.0). - rgb: func(red: f32, green: f32, blue: f32) -> linear-rgba; - div: func(self: linear-rgba, rhs: f32) -> linear-rgba; - /// Return a copy of this color with the green channel set to the given value. - with-green: func(self: linear-rgba, green: f32) -> linear-rgba; -} - -/// Methods for Oklaba -interface oklaba { - use types.{reflect-reference}; - - /// Construct a new [`Oklaba`] color from components. - new: func(lightness: f32, a: f32, b: f32, alpha: f32) -> oklaba; - /// Return a copy of this color with the 'lightness' channel set to the given value. - with-lightness: func(self: oklaba, lightness: f32) -> oklaba; - neg: func(self: oklaba) -> oklaba; - /// Construct a new [`Oklaba`] color from (l, a, b) components, with the default alpha (1.0). - lab: func(lightness: f32, a: f32, b: f32) -> oklaba; - /// Return a copy of this color with the 'b' channel set to the given value. - with-b: func(self: oklaba, b: f32) -> oklaba; - /// Return a copy of this color with the 'a' channel set to the given value. - with-a: func(self: oklaba, a: f32) -> oklaba; - div: func(self: oklaba, rhs: f32) -> oklaba; - sub: func(self: oklaba, rhs: oklaba) -> oklaba; - add: func(self: oklaba, rhs: oklaba) -> oklaba; - mul: func(self: oklaba, rhs: f32) -> oklaba; - clone: func(self: oklaba) -> oklaba; - eq: func(self: oklaba, other: oklaba) -> bool; -} - -/// Methods for Oklcha -interface oklcha { - use types.{reflect-reference}; - - /// Generate a deterministic but [quasi-randomly distributed](https://en.wikipedia.org/wiki/Low-discrepancy_sequence) - /// color from a provided `index`. - /// This can be helpful for generating debug colors. - /// # Examples - /// ```rust - /// # use bevy_color::Oklcha; - /// // Unique color for an entity - /// # let entity_index = 123; - /// // let entity_index = entity.index(); - /// let color = Oklcha::sequential_dispersed(entity_index); - /// // Palette with 5 distinct hues - /// let palette = (0..5).map(Oklcha::sequential_dispersed).collect::>(); - /// ``` - sequential-dispersed: func(index: u32) -> oklcha; - /// Construct a new [`Oklcha`] color from components. - new: func(lightness: f32, chroma: f32, hue: f32, alpha: f32) -> oklcha; - /// Return a copy of this color with the 'chroma' channel set to the given value. - with-chroma: func(self: oklcha, chroma: f32) -> oklcha; - /// Construct a new [`Oklcha`] color from (l, c, h) components, with the default alpha (1.0). - lch: func(lightness: f32, chroma: f32, hue: f32) -> oklcha; - clone: func(self: oklcha) -> oklcha; - eq: func(self: oklcha, other: oklcha) -> bool; - /// Return a copy of this color with the 'lightness' channel set to the given value. - with-lightness: func(self: oklcha, lightness: f32) -> oklcha; -} - -/// Methods for Srgba -interface srgba { - use types.{reflect-reference}; - - div: func(self: srgba, rhs: f32) -> srgba; - /// Converts a non-linear sRGB value to a linear one via [gamma correction](https://en.wikipedia.org/wiki/Gamma_correction). - gamma-function: func(value: f32) -> f32; - /// New `Srgba` from sRGB colorspace. - /// See also [`Srgba::new`], [`Srgba::rgba_u8`], [`Srgba::hex`]. - rgb-u8: func(r: u8, g: u8, b: u8) -> srgba; - mul: func(self: srgba, rhs: f32) -> srgba; - /// Construct a new [`Srgba`] color from components. - new: func(red: f32, green: f32, blue: f32, alpha: f32) -> srgba; - /// Construct a new [`Srgba`] color from (r, g, b) components, with the default alpha (1.0). - rgb: func(red: f32, green: f32, blue: f32) -> srgba; - sub: func(self: srgba, rhs: srgba) -> srgba; - /// Converts a linear sRGB value to a non-linear one via [gamma correction](https://en.wikipedia.org/wiki/Gamma_correction). - gamma-function-inverse: func(value: f32) -> f32; - neg: func(self: srgba) -> srgba; - /// New `Srgba` from sRGB colorspace. - /// See also [`Srgba::new`], [`Srgba::rgb_u8`], [`Srgba::hex`]. - rgba-u8: func(r: u8, g: u8, b: u8, a: u8) -> srgba; - /// Convert this color to CSS-style hexadecimal notation. - to-hex: func(self: srgba) -> string; - eq: func(self: srgba, other: srgba) -> bool; - /// Return a copy of this color with the green channel set to the given value. - with-green: func(self: srgba, green: f32) -> srgba; - add: func(self: srgba, rhs: srgba) -> srgba; - /// Return a copy of this color with the blue channel set to the given value. - with-blue: func(self: srgba, blue: f32) -> srgba; - /// Return a copy of this color with the red channel set to the given value. - with-red: func(self: srgba, red: f32) -> srgba; - clone: func(self: srgba) -> srgba; -} - -/// Methods for Xyza -interface xyza { - use types.{reflect-reference}; - - /// Construct a new [`Xyza`] color from components. - new: func(x: f32, y: f32, z: f32, alpha: f32) -> xyza; - /// Return a copy of this color with the 'y' channel set to the given value. - with-y: func(self: xyza, y: f32) -> xyza; - sub: func(self: xyza, rhs: xyza) -> xyza; - clone: func(self: xyza) -> xyza; - /// Return a copy of this color with the 'x' channel set to the given value. - with-x: func(self: xyza, x: f32) -> xyza; - eq: func(self: xyza, other: xyza) -> bool; - div: func(self: xyza, rhs: f32) -> xyza; - neg: func(self: xyza) -> xyza; - /// Return a copy of this color with the 'z' channel set to the given value. - with-z: func(self: xyza, z: f32) -> xyza; - /// Construct a new [`Xyza`] color from (x, y, z) components, with the default alpha (1.0). - xyz: func(x: f32, y: f32, z: f32) -> xyza; - mul: func(self: xyza, rhs: f32) -> xyza; - add: func(self: xyza, rhs: xyza) -> xyza; -} - -/// Methods for OrderIndependentTransparencySettings -interface order-independent-transparency-settings { - use types.{reflect-reference}; - - clone: func(self: order-independent-transparency-settings) -> order-independent-transparency-settings; -} - -/// Methods for DeferredPrepassDoubleBuffer -interface deferred-prepass-double-buffer { - use types.{reflect-reference}; - - clone: func(self: deferred-prepass-double-buffer) -> deferred-prepass-double-buffer; -} - -/// Methods for DepthPrepass -interface depth-prepass { - use types.{reflect-reference}; - - clone: func(self: depth-prepass) -> depth-prepass; -} - -/// Methods for DepthPrepassDoubleBuffer -interface depth-prepass-double-buffer { - use types.{reflect-reference}; - - clone: func(self: depth-prepass-double-buffer) -> depth-prepass-double-buffer; -} - -/// Methods for MotionVectorPrepass -interface motion-vector-prepass { - use types.{reflect-reference}; - - clone: func(self: motion-vector-prepass) -> motion-vector-prepass; -} - -/// Methods for NormalPrepass -interface normal-prepass { - use types.{reflect-reference}; - - clone: func(self: normal-prepass) -> normal-prepass; -} - -/// Methods for Skybox -interface skybox { - use types.{reflect-reference}; - - clone: func(self: skybox) -> skybox; -} - -/// Methods for DebandDither -interface deband-dither { - use types.{reflect-reference}; - - clone: func(self: deband-dither) -> deband-dither; - assert-receiver-is-total-eq: func(self: deband-dither); - eq: func(self: deband-dither, other: deband-dither) -> bool; -} - -/// Methods for Tonemapping -interface tonemapping { - use types.{reflect-reference}; - - eq: func(self: tonemapping, other: tonemapping) -> bool; - is-enabled: func(self: tonemapping) -> bool; - clone: func(self: tonemapping) -> tonemapping; - assert-receiver-is-total-eq: func(self: tonemapping); -} - -/// Methods for ComponentTicks -interface component-ticks { - use types.{reflect-reference}; - - /// Creates a new instance with the same change tick for `added` and `changed`. - new: func(change-tick: tick) -> component-ticks; - /// Returns `true` if the component or resource was added or mutably dereferenced after the system last ran - /// (or the system is running for the first time). - is-changed: func(self: component-ticks, last-run: tick, this-run: tick) -> bool; - /// Manually sets the change tick. - /// This is normally done automatically via the [`DerefMut`](core::ops::DerefMut) implementation - /// on [`Mut`](crate::change_detection::Mut), [`ResMut`](crate::change_detection::ResMut), etc. - /// However, components and resources that make use of interior mutability might require manual updates. - /// # Example - /// ```no_run - /// # use bevy_ecs::{world::World, change_detection::ComponentTicks}; - /// let world: World = unimplemented!(); - /// let component_ticks: ComponentTicks = unimplemented!(); - /// component_ticks.set_changed(world.read_change_tick()); - /// ``` - set-changed: func(self: component-ticks, change-tick: tick); - /// Returns `true` if the component or resource was added after the system last ran - /// (or the system is running for the first time). - is-added: func(self: component-ticks, last-run: tick, this-run: tick) -> bool; - clone: func(self: component-ticks) -> component-ticks; -} - -/// Methods for Tick -interface tick { - use types.{reflect-reference}; - - /// Gets the value of this change tick. - get: func(self: tick) -> u32; - /// Creates a new [`Tick`] wrapping the given value. - new: func(tick: u32) -> tick; - clone: func(self: tick) -> tick; - /// Sets the value of this change tick. - set: func(self: tick, tick: u32); - eq: func(self: tick, other: tick) -> bool; - /// Returns `true` if this `Tick` occurred since the system's `last_run`. - /// `this_run` is the current tick of the system, used as a reference to help deal with wraparound. - is-newer-than: func(self: tick, last-run: tick, this-run: tick) -> bool; - assert-receiver-is-total-eq: func(self: tick); -} - -/// Methods for ComponentId -interface component-id { - use types.{reflect-reference}; - - assert-receiver-is-total-eq: func(self: component-id); - /// Returns the index of the current component. - index: func(self: component-id) -> u64; - clone: func(self: component-id) -> component-id; - /// Creates a new [`ComponentId`]. - /// The `index` is a unique value associated with each type of component in a given world. - /// Usually, this value is taken from a counter incremented for each type of component registered with the world. - new: func(index: u64) -> component-id; - eq: func(self: component-id, other: component-id) -> bool; -} - -/// Methods for Entity -interface entity { - use types.{reflect-reference}; - - clone: func(self: entity) -> entity; - /// Returns the generation of this Entity's index. The generation is incremented each time an - /// entity with a given index is despawned. This serves as a "count" of the number of times a - /// given index has been reused (index, generation) pairs uniquely identify a given Entity. - generation: func(self: entity) -> entity-generation; - /// Convert to a form convenient for passing outside of rust. - /// Only useful for identifying entities within the same instance of an application. Do not use - /// for serialization between runs. - /// No particular structure is guaranteed for the returned bits. - to-bits: func(self: entity) -> u64; - /// Creates a new instance with the given index and generation. - from-index-and-generation: func(index: entity-index, generation: entity-generation) -> entity; - /// Reconstruct an `Entity` previously destructured with [`Entity::to_bits`]. - /// Only useful when applied to results from `to_bits` in the same instance of an application. - /// # Panics - /// This method will likely panic if given `u64` values that did not come from [`Entity::to_bits`]. - from-bits: func(bits: u64) -> entity; - /// Equivalent to `self.index().index()`. See [`Self::index`] for details. - index-u32: func(self: entity) -> u32; - /// Creates a new entity ID with the specified `index` and an unspecified generation. - /// # Note - /// Spawning a specific `entity` value is __rarely the right choice__. Most apps should favor - /// [`Commands::spawn`](crate::system::Commands::spawn). This method should generally - /// only be used for sharing entities across apps, and only when they have a scheme - /// worked out to share an index space (which doesn't happen by default). - /// In general, one should not try to synchronize the ECS by attempting to ensure that - /// `Entity` lines up between instances, but instead insert a secondary identifier as - /// a component. - from-index: func(index: entity-index) -> entity; - /// Return a transiently unique identifier. - /// See also [`EntityIndex`]. - /// No two simultaneously-live entities share the same index, but dead entities' indices may collide - /// with both live and dead entities. Useful for compactly representing entities within a - /// specific snapshot of the world, such as when serializing. - index: func(self: entity) -> entity-index; - eq: func(self: entity, other: entity) -> bool; -} - -/// Methods for EntityGeneration -interface entity-generation { - use types.{reflect-reference}; - - eq: func(self: entity-generation, other: entity-generation) -> bool; - /// Reconstruct an [`EntityGeneration`] previously destructured with [`EntityGeneration::to_bits`]. - /// Only useful when applied to results from `to_bits` in the same instance of an application. - from-bits: func(bits: u32) -> entity-generation; - clone: func(self: entity-generation) -> entity-generation; - assert-receiver-is-total-eq: func(self: entity-generation); - /// Gets some bits that represent this value. - /// The bits are opaque and should not be regarded as meaningful. - to-bits: func(self: entity-generation) -> u32; - /// Returns the [`EntityGeneration`] that would result from this many more `versions` of the corresponding [`EntityIndex`] from passing. - after-versions: func(self: entity-generation, versions: u32) -> entity-generation; -} - -/// Methods for EntityIndex -interface entity-index { - use types.{reflect-reference}; - - /// Gets the index of the entity. - index: func(self: entity-index) -> u32; - clone: func(self: entity-index) -> entity-index; - assert-receiver-is-total-eq: func(self: entity-index); - eq: func(self: entity-index, other: entity-index) -> bool; -} - -/// Methods for EntityHash -interface entity-hash { - use types.{reflect-reference}; - - clone: func(self: entity-hash) -> entity-hash; -} - -/// Methods for EntityHashSet -interface entity-hash-set { - use types.{reflect-reference}; - - assert-receiver-is-total-eq: func(self: entity-hash-set); - clone: func(self: entity-hash-set) -> entity-hash-set; - /// Returns the number of elements in the set. - len: func(self: entity-hash-set) -> u64; - /// Creates an empty `EntityHashSet`. - /// Equivalent to [`HashSet::with_hasher(EntityHash)`]. - /// [`HashSet::with_hasher(EntityHash)`]: HashSet::with_hasher - new: func() -> entity-hash-set; - eq: func(self: entity-hash-set, other: entity-hash-set) -> bool; - /// Returns `true` if the set contains no elements. - is-empty: func(self: entity-hash-set) -> bool; - /// Creates an empty `EntityHashSet` with the specified capacity. - /// Equivalent to [`HashSet::with_capacity_and_hasher(n, EntityHash)`]. - /// [`HashSet::with_capacity_and_hasher(n, EntityHash)`]: HashSet::with_capacity_and_hasher - with-capacity: func(n: u64) -> entity-hash-set; -} - -/// Methods for EntityIndexSet -interface entity-index-set { - use types.{reflect-reference}; - - /// Creates an empty `EntityIndexSet`. - /// Equivalent to [`IndexSet::with_hasher(EntityHash)`]. - /// [`IndexSet::with_hasher(EntityHash)`]: IndexSet::with_hasher - new: func() -> entity-index-set; - eq: func(self: entity-index-set, other: entity-index-set) -> bool; - /// Creates an empty `EntityIndexSet` with the specified capacity. - /// Equivalent to [`IndexSet::with_capacity_and_hasher(n, EntityHash)`]. - /// [`IndexSet::with_capacity_and_hasher(n, EntityHash)`]: IndexSet::with_capacity_and_hasher - with-capacity: func(n: u64) -> entity-index-set; - clone: func(self: entity-index-set) -> entity-index-set; -} - -/// Methods for DefaultQueryFilters -interface default-query-filters { - use types.{reflect-reference}; - - /// Creates a new, completely empty [`DefaultQueryFilters`]. - /// This is provided as an escape hatch; in most cases you should initialize this using [`FromWorld`], - /// which is automatically called when creating a new [`World`]. - empty: func() -> default-query-filters; - /// Adds this [`ComponentId`] to the set of [`DefaultQueryFilters`], - /// causing entities with this component to be excluded from queries. - /// This method is idempotent, and will not add the same component multiple times. - /// # Warning - /// This method should only be called before the app starts, as it will not affect queries - /// initialized before it is called. - /// As discussed in the [module docs](crate::entity_disabling), this can have performance implications, - /// as well as create interoperability issues, and should be used with caution. - register-disabling-component: func(self: default-query-filters, component-id: component-id); -} - -/// Methods for Disabled -interface disabled { - use types.{reflect-reference}; - - clone: func(self: disabled) -> disabled; -} - -/// Methods for ChildOf -interface child-of { - use types.{reflect-reference}; - - /// The parent entity of this child entity. - parent: func(self: child-of) -> entity; - clone: func(self: child-of) -> child-of; - eq: func(self: child-of, other: child-of) -> bool; - assert-receiver-is-total-eq: func(self: child-of); -} - -/// Methods for Children -interface children { - use types.{reflect-reference}; - - assert-receiver-is-total-eq: func(self: children); - eq: func(self: children, other: children) -> bool; - /// Swaps the child at `a_index` with the child at `b_index`. - swap: func(self: children, a-index: u64, b-index: u64); -} - -/// Methods for Add -interface add { - use types.{reflect-reference}; - - clone: func(self: add) -> add; -} - -/// Methods for Despawn -interface despawn { - use types.{reflect-reference}; - - clone: func(self: despawn) -> despawn; -} - -/// Methods for Insert -interface insert { - use types.{reflect-reference}; - - clone: func(self: insert) -> insert; -} - -/// Methods for Remove -interface remove { - use types.{reflect-reference}; - - clone: func(self: remove) -> remove; -} - -/// Methods for RemovedComponentEntity -interface removed-component-entity { - use types.{reflect-reference}; - - clone: func(self: removed-component-entity) -> removed-component-entity; -} - -/// Methods for Replace -interface replace { - use types.{reflect-reference}; - - clone: func(self: replace) -> replace; -} - -/// Methods for Name -interface name { - use types.{reflect-reference}; - - eq: func(self: name, other: name) -> bool; - clone: func(self: name) -> name; -} - -/// Methods for ButtonState -interface button-state { - use types.{reflect-reference}; - - clone: func(self: button-state) -> button-state; - eq: func(self: button-state, other: button-state) -> bool; - /// Is this button pressed? - is-pressed: func(self: button-state) -> bool; - assert-receiver-is-total-eq: func(self: button-state); -} - -/// Methods for AxisSettings -interface axis-settings { - use types.{reflect-reference}; - - /// Get the minimum value by which input must change before the change is registered. - threshold: func(self: axis-settings) -> f32; - /// Try to set the value above which inputs will be rounded up to 0.0. - /// If the value passed is less than -1.0 or less than `livezone_lowerbound`, - /// the value will not be changed. - /// Returns the new value of `deadzone_lowerbound`. - set-deadzone-lowerbound: func(self: axis-settings, value: f32) -> f32; - /// Get the value above which inputs will be rounded up to 1.0. - livezone-upperbound: func(self: axis-settings) -> f32; - /// Try to set the value above which inputs will be rounded up to 1.0. - /// If the value passed is negative or less than `deadzone_upperbound`, - /// the value will not be changed. - /// Returns the new value of `livezone_upperbound`. - set-livezone-upperbound: func(self: axis-settings, value: f32) -> f32; - eq: func(self: axis-settings, other: axis-settings) -> bool; - /// Try to set the minimum value by which input must change before the changes will be applied. - /// If the value passed is not within [0.0..=2.0], the value will not be changed. - /// Returns the new value of threshold. - set-threshold: func(self: axis-settings, value: f32) -> f32; - /// Try to set the value below which positive inputs will be rounded down to 0.0. - /// If the value passed is negative or greater than `livezone_upperbound`, - /// the value will not be changed. - /// Returns the new value of `deadzone_upperbound`. - set-deadzone-upperbound: func(self: axis-settings, value: f32) -> f32; - clone: func(self: axis-settings) -> axis-settings; - /// Get the value below which negative inputs will be rounded down to -1.0. - livezone-lowerbound: func(self: axis-settings) -> f32; - /// Clamps the `raw_value` according to the `AxisSettings`. - clamp: func(self: axis-settings, raw-value: f32) -> f32; - /// Get the value above which inputs will be rounded up to 0.0. - deadzone-lowerbound: func(self: axis-settings) -> f32; - /// Get the value below which positive inputs will be rounded down to 0.0. - deadzone-upperbound: func(self: axis-settings) -> f32; - /// Try to set the value below which negative inputs will be rounded down to -1.0. - /// If the value passed is positive or greater than `deadzone_lowerbound`, - /// the value will not be changed. - /// Returns the new value of `livezone_lowerbound`. - set-livezone-lowerbound: func(self: axis-settings, value: f32) -> f32; -} - -/// Methods for ButtonAxisSettings -interface button-axis-settings { - use types.{reflect-reference}; - - clone: func(self: button-axis-settings) -> button-axis-settings; -} - -/// Methods for ButtonSettings -interface button-settings { - use types.{reflect-reference}; - - /// Try to set the button input threshold above which the button is considered pressed. - /// If the value passed is outside the range [release threshold..=1.0], the value will not be changed. - /// Returns the new value of the press threshold. - set-press-threshold: func(self: button-settings, value: f32) -> f32; - eq: func(self: button-settings, other: button-settings) -> bool; - /// Try to set the button input threshold below which the button is considered released. If the - /// value passed is outside the range [0.0..=press threshold], the value will not be changed. - /// Returns the new value of the release threshold. - set-release-threshold: func(self: button-settings, value: f32) -> f32; - /// Returns `true` if the button is released. - /// A button is considered released if the `value` passed is lower than or equal to the release threshold. - is-released: func(self: button-settings, value: f32) -> bool; - /// Get the button input threshold below which the button is considered released. - release-threshold: func(self: button-settings) -> f32; - clone: func(self: button-settings) -> button-settings; - /// Returns `true` if the button is pressed. - /// A button is considered pressed if the `value` passed is greater than or equal to the press threshold. - is-pressed: func(self: button-settings, value: f32) -> bool; - /// Get the button input threshold above which the button is considered pressed. - press-threshold: func(self: button-settings) -> f32; -} - -/// Methods for Gamepad -interface gamepad { - use types.{reflect-reference}; - - /// Returns the USB product ID as assigned by the [vendor], if available. - /// [vendor]: Self::vendor_id - product-id: func(self: gamepad) -> option; - /// Returns the right stick as a [`Vec2`]. - right-stick: func(self: gamepad) -> vec2; - /// Returns the USB vendor ID as assigned by the USB-IF, if available. - vendor-id: func(self: gamepad) -> option; - /// Returns `true` if the [`GamepadButton`] has been pressed during the current frame. - /// Note: This function does not imply information regarding the current state of [`ButtonInput::pressed`] or [`ButtonInput::just_released`]. - just-pressed: func(self: gamepad, button-type: gamepad-button) -> bool; - /// Returns the directional pad as a [`Vec2`]. - dpad: func(self: gamepad) -> vec2; - /// Returns `true` if the [`GamepadButton`] has been released during the current frame. - /// Note: This function does not imply information regarding the current state of [`ButtonInput::pressed`] or [`ButtonInput::just_pressed`]. - just-released: func(self: gamepad, button-type: gamepad-button) -> bool; - /// Returns `true` if the [`GamepadButton`] has been pressed. - pressed: func(self: gamepad, button-type: gamepad-button) -> bool; - /// Returns the left stick as a [`Vec2`]. - left-stick: func(self: gamepad) -> vec2; -} - -/// Methods for GamepadAxis -interface gamepad-axis { - use types.{reflect-reference}; - - assert-receiver-is-total-eq: func(self: gamepad-axis); - eq: func(self: gamepad-axis, other: gamepad-axis) -> bool; - clone: func(self: gamepad-axis) -> gamepad-axis; -} - -/// Methods for GamepadAxisChangedEvent -interface gamepad-axis-changed-event { - use types.{reflect-reference}; - - clone: func(self: gamepad-axis-changed-event) -> gamepad-axis-changed-event; - /// Creates a new [`GamepadAxisChangedEvent`]. - new: func(entity: entity, axis: gamepad-axis, value: f32) -> gamepad-axis-changed-event; - eq: func(self: gamepad-axis-changed-event, other: gamepad-axis-changed-event) -> bool; -} - -/// Methods for GamepadButton -interface gamepad-button { - use types.{reflect-reference}; - - eq: func(self: gamepad-button, other: gamepad-button) -> bool; - assert-receiver-is-total-eq: func(self: gamepad-button); - clone: func(self: gamepad-button) -> gamepad-button; -} - -/// Methods for GamepadButtonChangedEvent -interface gamepad-button-changed-event { - use types.{reflect-reference}; - - eq: func(self: gamepad-button-changed-event, other: gamepad-button-changed-event) -> bool; - /// Creates a new [`GamepadButtonChangedEvent`]. - new: func(entity: entity, button: gamepad-button, state: button-state, value: f32) -> gamepad-button-changed-event; - clone: func(self: gamepad-button-changed-event) -> gamepad-button-changed-event; -} - -/// Methods for GamepadButtonStateChangedEvent -interface gamepad-button-state-changed-event { - use types.{reflect-reference}; - - /// Creates a new [`GamepadButtonStateChangedEvent`]. - new: func(entity: entity, button: gamepad-button, state: button-state) -> gamepad-button-state-changed-event; - clone: func(self: gamepad-button-state-changed-event) -> gamepad-button-state-changed-event; - eq: func(self: gamepad-button-state-changed-event, other: gamepad-button-state-changed-event) -> bool; - assert-receiver-is-total-eq: func(self: gamepad-button-state-changed-event); -} - -/// Methods for GamepadConnection -interface gamepad-connection { - use types.{reflect-reference}; - - eq: func(self: gamepad-connection, other: gamepad-connection) -> bool; - clone: func(self: gamepad-connection) -> gamepad-connection; -} - -/// Methods for GamepadConnectionEvent -interface gamepad-connection-event { - use types.{reflect-reference}; - - /// Whether the gamepad is disconnected. - disconnected: func(self: gamepad-connection-event) -> bool; - /// Whether the gamepad is connected. - connected: func(self: gamepad-connection-event) -> bool; - /// Creates a [`GamepadConnectionEvent`]. - new: func(gamepad: entity, connection: gamepad-connection) -> gamepad-connection-event; - eq: func(self: gamepad-connection-event, other: gamepad-connection-event) -> bool; - clone: func(self: gamepad-connection-event) -> gamepad-connection-event; -} - -/// Methods for GamepadEvent -interface gamepad-event { - use types.{reflect-reference}; - - clone: func(self: gamepad-event) -> gamepad-event; - eq: func(self: gamepad-event, other: gamepad-event) -> bool; -} - -/// Methods for GamepadInput -interface gamepad-input { - use types.{reflect-reference}; - - assert-receiver-is-total-eq: func(self: gamepad-input); - clone: func(self: gamepad-input) -> gamepad-input; - eq: func(self: gamepad-input, other: gamepad-input) -> bool; -} - -/// Methods for GamepadRumbleIntensity -interface gamepad-rumble-intensity { - use types.{reflect-reference}; - - /// Creates a new rumble intensity with strong motor intensity set to the given value. - /// Clamped within the `0.0` to `1.0` range. - strong-motor: func(intensity: f32) -> gamepad-rumble-intensity; - clone: func(self: gamepad-rumble-intensity) -> gamepad-rumble-intensity; - eq: func(self: gamepad-rumble-intensity, other: gamepad-rumble-intensity) -> bool; - /// Creates a new rumble intensity with weak motor intensity set to the given value. - /// Clamped within the `0.0` to `1.0` range. - weak-motor: func(intensity: f32) -> gamepad-rumble-intensity; -} - -/// Methods for GamepadRumbleRequest -interface gamepad-rumble-request { - use types.{reflect-reference}; - - /// Get the [`Entity`] associated with this request. - gamepad: func(self: gamepad-rumble-request) -> entity; - clone: func(self: gamepad-rumble-request) -> gamepad-rumble-request; -} - -/// Methods for GamepadSettings -interface gamepad-settings { - use types.{reflect-reference}; - - clone: func(self: gamepad-settings) -> gamepad-settings; -} - -/// Methods for RawGamepadAxisChangedEvent -interface raw-gamepad-axis-changed-event { - use types.{reflect-reference}; - - eq: func(self: raw-gamepad-axis-changed-event, other: raw-gamepad-axis-changed-event) -> bool; - clone: func(self: raw-gamepad-axis-changed-event) -> raw-gamepad-axis-changed-event; - /// Creates a [`RawGamepadAxisChangedEvent`]. - new: func(gamepad: entity, axis-type: gamepad-axis, value: f32) -> raw-gamepad-axis-changed-event; -} - -/// Methods for RawGamepadButtonChangedEvent -interface raw-gamepad-button-changed-event { - use types.{reflect-reference}; - - /// Creates a [`RawGamepadButtonChangedEvent`]. - new: func(gamepad: entity, button-type: gamepad-button, value: f32) -> raw-gamepad-button-changed-event; - eq: func(self: raw-gamepad-button-changed-event, other: raw-gamepad-button-changed-event) -> bool; - clone: func(self: raw-gamepad-button-changed-event) -> raw-gamepad-button-changed-event; -} - -/// Methods for RawGamepadEvent -interface raw-gamepad-event { - use types.{reflect-reference}; - - eq: func(self: raw-gamepad-event, other: raw-gamepad-event) -> bool; - clone: func(self: raw-gamepad-event) -> raw-gamepad-event; -} - -/// Methods for DoubleTapGesture -interface double-tap-gesture { - use types.{reflect-reference}; - - clone: func(self: double-tap-gesture) -> double-tap-gesture; - eq: func(self: double-tap-gesture, other: double-tap-gesture) -> bool; -} - -/// Methods for PanGesture -interface pan-gesture { - use types.{reflect-reference}; - - eq: func(self: pan-gesture, other: pan-gesture) -> bool; - clone: func(self: pan-gesture) -> pan-gesture; -} - -/// Methods for PinchGesture -interface pinch-gesture { - use types.{reflect-reference}; - - eq: func(self: pinch-gesture, other: pinch-gesture) -> bool; - clone: func(self: pinch-gesture) -> pinch-gesture; -} - -/// Methods for RotationGesture -interface rotation-gesture { - use types.{reflect-reference}; - - clone: func(self: rotation-gesture) -> rotation-gesture; - eq: func(self: rotation-gesture, other: rotation-gesture) -> bool; -} - -/// Methods for Key -interface key { - use types.{reflect-reference}; - - clone: func(self: key) -> key; - assert-receiver-is-total-eq: func(self: key); - eq: func(self: key, other: key) -> bool; -} - -/// Methods for KeyCode -interface key-code { - use types.{reflect-reference}; - - assert-receiver-is-total-eq: func(self: key-code); - eq: func(self: key-code, other: key-code) -> bool; - clone: func(self: key-code) -> key-code; -} - -/// Methods for KeyboardFocusLost -interface keyboard-focus-lost { - use types.{reflect-reference}; - - eq: func(self: keyboard-focus-lost, other: keyboard-focus-lost) -> bool; - clone: func(self: keyboard-focus-lost) -> keyboard-focus-lost; - assert-receiver-is-total-eq: func(self: keyboard-focus-lost); -} - -/// Methods for KeyboardInput -interface keyboard-input { - use types.{reflect-reference}; - - eq: func(self: keyboard-input, other: keyboard-input) -> bool; - clone: func(self: keyboard-input) -> keyboard-input; - assert-receiver-is-total-eq: func(self: keyboard-input); -} - -/// Methods for NativeKey -interface native-key { - use types.{reflect-reference}; - - assert-receiver-is-total-eq: func(self: native-key); - clone: func(self: native-key) -> native-key; - eq: func(self: native-key, other: native-key) -> bool; -} - -/// Methods for NativeKeyCode -interface native-key-code { - use types.{reflect-reference}; - - eq: func(self: native-key-code, other: native-key-code) -> bool; - assert-receiver-is-total-eq: func(self: native-key-code); - clone: func(self: native-key-code) -> native-key-code; -} - -/// Methods for AccumulatedMouseMotion -interface accumulated-mouse-motion { - use types.{reflect-reference}; - - clone: func(self: accumulated-mouse-motion) -> accumulated-mouse-motion; - eq: func(self: accumulated-mouse-motion, other: accumulated-mouse-motion) -> bool; -} - -/// Methods for AccumulatedMouseScroll -interface accumulated-mouse-scroll { - use types.{reflect-reference}; - - eq: func(self: accumulated-mouse-scroll, other: accumulated-mouse-scroll) -> bool; - clone: func(self: accumulated-mouse-scroll) -> accumulated-mouse-scroll; -} - -/// Methods for MouseButton -interface mouse-button { - use types.{reflect-reference}; - - eq: func(self: mouse-button, other: mouse-button) -> bool; - clone: func(self: mouse-button) -> mouse-button; - assert-receiver-is-total-eq: func(self: mouse-button); -} - -/// Methods for MouseButtonInput -interface mouse-button-input { - use types.{reflect-reference}; - - assert-receiver-is-total-eq: func(self: mouse-button-input); - eq: func(self: mouse-button-input, other: mouse-button-input) -> bool; - clone: func(self: mouse-button-input) -> mouse-button-input; -} - -/// Methods for MouseMotion -interface mouse-motion { - use types.{reflect-reference}; - - clone: func(self: mouse-motion) -> mouse-motion; - eq: func(self: mouse-motion, other: mouse-motion) -> bool; -} - -/// Methods for MouseScrollUnit -interface mouse-scroll-unit { - use types.{reflect-reference}; - - eq: func(self: mouse-scroll-unit, other: mouse-scroll-unit) -> bool; - clone: func(self: mouse-scroll-unit) -> mouse-scroll-unit; - assert-receiver-is-total-eq: func(self: mouse-scroll-unit); -} - -/// Methods for MouseWheel -interface mouse-wheel { - use types.{reflect-reference}; - - clone: func(self: mouse-wheel) -> mouse-wheel; - eq: func(self: mouse-wheel, other: mouse-wheel) -> bool; -} - -/// Methods for ForceTouch -interface force-touch { - use types.{reflect-reference}; - - clone: func(self: force-touch) -> force-touch; - eq: func(self: force-touch, other: force-touch) -> bool; -} - -/// Methods for TouchInput -interface touch-input { - use types.{reflect-reference}; - - eq: func(self: touch-input, other: touch-input) -> bool; - clone: func(self: touch-input) -> touch-input; -} - -/// Methods for TouchPhase -interface touch-phase { - use types.{reflect-reference}; - - eq: func(self: touch-phase, other: touch-phase) -> bool; - assert-receiver-is-total-eq: func(self: touch-phase); - clone: func(self: touch-phase) -> touch-phase; -} - -/// Methods for AspectRatio -interface aspect-ratio { - use types.{reflect-reference}; - - eq: func(self: aspect-ratio, other: aspect-ratio) -> bool; - /// Returns true if the aspect ratio represents a portrait orientation. - is-portrait: func(self: aspect-ratio) -> bool; - /// Returns true if the aspect ratio is exactly square. - is-square: func(self: aspect-ratio) -> bool; - /// Returns the inverse of this aspect ratio (height/width). - inverse: func(self: aspect-ratio) -> aspect-ratio; - clone: func(self: aspect-ratio) -> aspect-ratio; - /// Returns the aspect ratio as a f32 value. - ratio: func(self: aspect-ratio) -> f32; - /// Returns true if the aspect ratio represents a landscape orientation. - is-landscape: func(self: aspect-ratio) -> bool; -} - -/// Methods for Aabb2d -interface aabb2d { - use types.{reflect-reference}; - - /// Computes the smallest [`BoundingCircle`] containing this [`Aabb2d`]. - bounding-circle: func(self: aabb2d) -> bounding-circle; - eq: func(self: aabb2d, other: aabb2d) -> bool; - clone: func(self: aabb2d) -> aabb2d; - /// Finds the point on the AABB that is closest to the given `point`. - /// If the point is outside the AABB, the returned point will be on the perimeter of the AABB. - /// Otherwise, it will be inside the AABB and returned as is. - closest-point: func(self: aabb2d, point: vec2) -> vec2; - /// Constructs an AABB from its center and half-size. - new: func(center: vec2, half-size: vec2) -> aabb2d; -} - -/// Methods for BoundingCircle -interface bounding-circle { - use types.{reflect-reference}; - - /// Get the radius of the bounding circle - radius: func(self: bounding-circle) -> f32; - clone: func(self: bounding-circle) -> bounding-circle; - eq: func(self: bounding-circle, other: bounding-circle) -> bool; - /// Finds the point on the bounding circle that is closest to the given `point`. - /// If the point is outside the circle, the returned point will be on the perimeter of the circle. - /// Otherwise, it will be inside the circle and returned as is. - closest-point: func(self: bounding-circle, point: vec2) -> vec2; - /// Constructs a bounding circle from its center and radius. - new: func(center: vec2, radius: f32) -> bounding-circle; - /// Computes the smallest [`Aabb2d`] containing this [`BoundingCircle`]. - aabb-2d: func(self: bounding-circle) -> aabb2d; -} - -/// Methods for Aabb3d -interface aabb3d { - use types.{reflect-reference}; - - clone: func(self: aabb3d) -> aabb3d; - /// Computes the smallest [`BoundingSphere`] containing this [`Aabb3d`]. - bounding-sphere: func(self: aabb3d) -> bounding-sphere; - eq: func(self: aabb3d, other: aabb3d) -> bool; -} - -/// Methods for BoundingSphere -interface bounding-sphere { - use types.{reflect-reference}; - - eq: func(self: bounding-sphere, other: bounding-sphere) -> bool; - /// Computes the smallest [`Aabb3d`] containing this [`BoundingSphere`]. - aabb-3d: func(self: bounding-sphere) -> aabb3d; - /// Get the radius of the bounding sphere - radius: func(self: bounding-sphere) -> f32; - clone: func(self: bounding-sphere) -> bounding-sphere; -} - -/// Methods for AabbCast2d -interface aabb-cast2d { - use types.{reflect-reference}; - - /// Get the distance at which the [`Aabb2d`]s collide, if at all. - aabb-collision-at: func(self: aabb-cast2d, aabb: aabb2d) -> option; - /// Construct an [`AabbCast2d`] from an [`Aabb2d`], origin, [`Dir2`], and max distance. - new: func(aabb: aabb2d, origin: vec2, direction: dir2, max: f32) -> aabb-cast2d; - clone: func(self: aabb-cast2d) -> aabb-cast2d; - /// Construct an [`AabbCast2d`] from an [`Aabb2d`], [`Ray2d`], and max distance. - from-ray: func(aabb: aabb2d, ray: ray2d, max: f32) -> aabb-cast2d; -} - -/// Methods for BoundingCircleCast -interface bounding-circle-cast { - use types.{reflect-reference}; - - /// Construct a [`BoundingCircleCast`] from a [`BoundingCircle`], origin, [`Dir2`], and max distance. - new: func(circle: bounding-circle, origin: vec2, direction: dir2, max: f32) -> bounding-circle-cast; - /// Construct a [`BoundingCircleCast`] from a [`BoundingCircle`], [`Ray2d`], and max distance. - from-ray: func(circle: bounding-circle, ray: ray2d, max: f32) -> bounding-circle-cast; - clone: func(self: bounding-circle-cast) -> bounding-circle-cast; - /// Get the distance at which the [`BoundingCircle`]s collide, if at all. - circle-collision-at: func(self: bounding-circle-cast, circle: bounding-circle) -> option; -} - -/// Methods for RayCast2d -interface ray-cast2d { - use types.{reflect-reference}; - - /// Get the distance of an intersection with a [`BoundingCircle`], if any. - circle-intersection-at: func(self: ray-cast2d, circle: bounding-circle) -> option; - /// Get the distance of an intersection with an [`Aabb2d`], if any. - aabb-intersection-at: func(self: ray-cast2d, aabb: aabb2d) -> option; - /// Get the cached multiplicative inverse of the direction of the ray. - direction-recip: func(self: ray-cast2d) -> vec2; - /// Construct a [`RayCast2d`] from a [`Ray2d`] and max distance. - from-ray: func(ray: ray2d, max: f32) -> ray-cast2d; - clone: func(self: ray-cast2d) -> ray-cast2d; - /// Construct a [`RayCast2d`] from an origin, [`Dir2`], and max distance. - new: func(origin: vec2, direction: dir2, max: f32) -> ray-cast2d; -} - -/// Methods for AabbCast3d -interface aabb-cast3d { - use types.{reflect-reference}; - - clone: func(self: aabb-cast3d) -> aabb-cast3d; - /// Construct an [`AabbCast3d`] from an [`Aabb3d`], [`Ray3d`], and max distance. - from-ray: func(aabb: aabb3d, ray: ray3d, max: f32) -> aabb-cast3d; - /// Get the distance at which the [`Aabb3d`]s collide, if at all. - aabb-collision-at: func(self: aabb-cast3d, aabb: aabb3d) -> option; -} - -/// Methods for BoundingSphereCast -interface bounding-sphere-cast { - use types.{reflect-reference}; - - /// Construct a [`BoundingSphereCast`] from a [`BoundingSphere`], [`Ray3d`], and max distance. - from-ray: func(sphere: bounding-sphere, ray: ray3d, max: f32) -> bounding-sphere-cast; - clone: func(self: bounding-sphere-cast) -> bounding-sphere-cast; - /// Get the distance at which the [`BoundingSphere`]s collide, if at all. - sphere-collision-at: func(self: bounding-sphere-cast, sphere: bounding-sphere) -> option; -} - -/// Methods for RayCast3d -interface ray-cast3d { - use types.{reflect-reference}; - - /// Get the distance of an intersection with an [`Aabb3d`], if any. - aabb-intersection-at: func(self: ray-cast3d, aabb: aabb3d) -> option; - /// Construct a [`RayCast3d`] from a [`Ray3d`] and max distance. - from-ray: func(ray: ray3d, max: f32) -> ray-cast3d; - /// Get the cached multiplicative inverse of the direction of the ray. - direction-recip: func(self: ray-cast3d) -> vec3-a; - /// Get the distance of an intersection with a [`BoundingSphere`], if any. - sphere-intersection-at: func(self: ray-cast3d, sphere: bounding-sphere) -> option; - clone: func(self: ray-cast3d) -> ray-cast3d; -} - -/// Methods for CompassOctant -interface compass-octant { - use types.{reflect-reference}; - - clone: func(self: compass-octant) -> compass-octant; - assert-receiver-is-total-eq: func(self: compass-octant); - eq: func(self: compass-octant, other: compass-octant) -> bool; - neg: func(self: compass-octant) -> compass-octant; - /// Converts a [`CompassOctant`] to a standard index. - /// Starts at 0 for [`CompassOctant::North`] and increments clockwise. - to-index: func(self: compass-octant) -> u64; - /// Checks if a point is in the direction represented by this [`CompassOctant`] from an origin. - /// This uses a cone-based check: the vector from origin to the candidate point - /// must have a positive dot product with the direction vector. - /// Uses standard mathematical coordinates where Y increases upward. - /// `true` if the candidate is generally in the direction of this octant from the origin. - /// # Example - /// ``` - /// use bevy_math::{CompassOctant, Vec2}; - /// let origin = Vec2::new(0.0, 0.0); - /// let north_point = Vec2::new(0.0, 10.0); // Above origin (Y+ = up) - /// let east_point = Vec2::new(10.0, 0.0); // Right of origin - /// assert!(CompassOctant::North.is_in_direction(origin, north_point)); - /// assert!(!CompassOctant::North.is_in_direction(origin, east_point)); - /// ``` - is-in-direction: func(self: compass-octant, origin: vec2, candidate: vec2) -> bool; - /// Returns the opposite [`CompassOctant`], located 180 degrees from `self`. - /// This can also be accessed via the `-` operator, using the [`Neg`] trait. - opposite: func(self: compass-octant) -> compass-octant; -} - -/// Methods for CompassQuadrant -interface compass-quadrant { - use types.{reflect-reference}; - - neg: func(self: compass-quadrant) -> compass-quadrant; - /// Checks if a point is in the direction represented by this [`CompassQuadrant`] from an origin. - /// This uses a cone-based check: the vector from origin to the candidate point - /// must have a positive dot product with the direction vector. - /// Uses standard mathematical coordinates where Y increases upward. - /// `true` if the candidate is generally in the direction of this quadrant from the origin. - /// # Example - /// ``` - /// use bevy_math::{CompassQuadrant, Vec2}; - /// let origin = Vec2::new(0.0, 0.0); - /// let north_point = Vec2::new(0.0, 10.0); // Above origin (Y+ = up) - /// let east_point = Vec2::new(10.0, 0.0); // Right of origin - /// assert!(CompassQuadrant::North.is_in_direction(origin, north_point)); - /// assert!(!CompassQuadrant::North.is_in_direction(origin, east_point)); - /// ``` - is-in-direction: func(self: compass-quadrant, origin: vec2, candidate: vec2) -> bool; - eq: func(self: compass-quadrant, other: compass-quadrant) -> bool; - clone: func(self: compass-quadrant) -> compass-quadrant; - assert-receiver-is-total-eq: func(self: compass-quadrant); - /// Returns the opposite [`CompassQuadrant`], located 180 degrees from `self`. - /// This can also be accessed via the `-` operator, using the [`Neg`] trait. - opposite: func(self: compass-quadrant) -> compass-quadrant; - /// Converts a [`CompassQuadrant`] to a standard index. - /// Starts at 0 for [`CompassQuadrant::North`] and increments clockwise. - to-index: func(self: compass-quadrant) -> u64; -} - -/// Methods for EaseFunction -interface ease-function { - use types.{reflect-reference}; - - clone: func(self: ease-function) -> ease-function; - eq: func(self: ease-function, other: ease-function) -> bool; -} - -/// Methods for JumpAt -interface jump-at { - use types.{reflect-reference}; - - assert-receiver-is-total-eq: func(self: jump-at); - clone: func(self: jump-at) -> jump-at; - eq: func(self: jump-at, other: jump-at) -> bool; -} - -/// Methods for Interval -interface interval { - use types.{reflect-reference}; - - /// Clamp the given `value` to lie within this interval. - clamp: func(self: interval, value: f32) -> f32; - /// Get the start of this interval. - start: func(self: interval) -> f32; - /// Returns `true` if the other interval is contained in this interval. - /// This is non-strict: each interval will contain itself. - contains-interval: func(self: interval, other: interval) -> bool; - eq: func(self: interval, other: interval) -> bool; - /// Returns `true` if this interval has a finite end. - has-finite-end: func(self: interval) -> bool; - /// Returns `true` if `item` is contained in this interval. - contains: func(self: interval, item: f32) -> bool; - clone: func(self: interval) -> interval; - /// Get the end of this interval. - end: func(self: interval) -> f32; - /// Get the length of this interval. Note that the result may be infinite (`f32::INFINITY`). - length: func(self: interval) -> f32; - /// Returns `true` if this interval is bounded — that is, if both its start and end are finite. - /// Equivalently, an interval is bounded if its length is finite. - is-bounded: func(self: interval) -> bool; - /// Returns `true` if this interval has a finite start. - has-finite-start: func(self: interval) -> bool; -} - -/// Methods for Dir2 -interface dir2 { - use types.{reflect-reference}; - - clone: func(self: dir2) -> dir2; - /// Returns `self` after an approximate normalization, assuming the value is already nearly normalized. - /// Useful for preventing numerical error accumulation. - /// See [`Dir3::fast_renormalize`] for an example of when such error accumulation might occur. - fast-renormalize: func(self: dir2) -> dir2; - /// Performs a spherical linear interpolation between `self` and `rhs` - /// based on the value `s`. - /// This corresponds to interpolating between the two directions at a constant angular velocity. - /// When `s == 0.0`, the result will be equal to `self`. - /// When `s == 1.0`, the result will be equal to `rhs`. - /// # Example - /// ``` - /// # use bevy_math::Dir2; - /// # use approx::{assert_relative_eq, RelativeEq}; - /// # - /// let dir1 = Dir2::X; - /// let dir2 = Dir2::Y; - /// let result1 = dir1.slerp(dir2, 1.0 / 3.0); - /// #[cfg(feature = "approx")] - /// assert_relative_eq!(result1, Dir2::from_xy(0.75_f32.sqrt(), 0.5).unwrap()); - /// let result2 = dir1.slerp(dir2, 0.5); - /// #[cfg(feature = "approx")] - /// assert_relative_eq!(result2, Dir2::from_xy(0.5_f32.sqrt(), 0.5_f32.sqrt()).unwrap()); - /// ``` - slerp: func(self: dir2, rhs: dir2, s: f32) -> dir2; - /// Create a direction from its `x` and `y` components, assuming the resulting vector is normalized. - /// # Warning - /// The vector produced from `x` and `y` must be normalized, i.e its length must be `1.0`. - from-xy-unchecked: func(x: f32, y: f32) -> dir2; - /// Get the rotation that rotates this direction to the Y-axis. - rotation-to-y: func(self: dir2) -> rot2; - /// Create a [`Dir2`] from a [`Vec2`] that is already normalized. - /// # Warning - /// `value` must be normalized, i.e its length must be `1.0`. - new-unchecked: func(value: vec2) -> dir2; - neg: func(self: dir2) -> dir2; - /// Get the rotation that rotates this direction to `other`. - rotation-to: func(self: dir2, other: dir2) -> rot2; - mul: func(self: dir2, rhs: f32) -> vec2; - /// Get the rotation that rotates `other` to this direction. - rotation-from: func(self: dir2, other: dir2) -> rot2; - /// Get the rotation that rotates the Y-axis to this direction. - rotation-from-y: func(self: dir2) -> rot2; - eq: func(self: dir2, other: dir2) -> bool; - /// Returns the inner [`Vec2`] - as-vec2: func(self: dir2) -> vec2; - /// Get the rotation that rotates the X-axis to this direction. - rotation-from-x: func(self: dir2) -> rot2; - /// Get the rotation that rotates this direction to the X-axis. - rotation-to-x: func(self: dir2) -> rot2; -} - -/// Methods for Dir3 -interface dir3 { - use types.{reflect-reference}; - - neg: func(self: dir3) -> dir3; - eq: func(self: dir3, other: dir3) -> bool; - /// Performs a spherical linear interpolation between `self` and `rhs` - /// based on the value `s`. - /// This corresponds to interpolating between the two directions at a constant angular velocity. - /// When `s == 0.0`, the result will be equal to `self`. - /// When `s == 1.0`, the result will be equal to `rhs`. - /// # Example - /// ``` - /// # use bevy_math::Dir3; - /// # use approx::{assert_relative_eq, RelativeEq}; - /// # - /// let dir1 = Dir3::X; - /// let dir2 = Dir3::Y; - /// let result1 = dir1.slerp(dir2, 1.0 / 3.0); - /// #[cfg(feature = "approx")] - /// assert_relative_eq!( - /// result1, - /// Dir3::from_xyz(0.75_f32.sqrt(), 0.5, 0.0).unwrap(), - /// epsilon = 0.000001 - /// ); - /// let result2 = dir1.slerp(dir2, 0.5); - /// #[cfg(feature = "approx")] - /// assert_relative_eq!(result2, Dir3::from_xyz(0.5_f32.sqrt(), 0.5_f32.sqrt(), 0.0).unwrap()); - /// ``` - slerp: func(self: dir3, rhs: dir3, s: f32) -> dir3; - clone: func(self: dir3) -> dir3; - /// Create a direction from its `x`, `y`, and `z` components, assuming the resulting vector is normalized. - /// # Warning - /// The vector produced from `x`, `y`, and `z` must be normalized, i.e its length must be `1.0`. - from-xyz-unchecked: func(x: f32, y: f32, z: f32) -> dir3; - /// Create a [`Dir3`] from a [`Vec3`] that is already normalized. - /// # Warning - /// `value` must be normalized, i.e its length must be `1.0`. - new-unchecked: func(value: vec3) -> dir3; - mul: func(self: dir3, rhs: f32) -> vec3; - /// Returns the inner [`Vec3`] - as-vec3: func(self: dir3) -> vec3; - /// Returns `self` after an approximate normalization, assuming the value is already nearly normalized. - /// Useful for preventing numerical error accumulation. - /// # Example - /// The following seemingly benign code would start accumulating errors over time, - /// leading to `dir` eventually not being normalized anymore. - /// ``` - /// # use bevy_math::prelude::*; - /// # let N: usize = 200; - /// let mut dir = Dir3::X; - /// let quaternion = Quat::from_euler(EulerRot::XYZ, 1.0, 2.0, 3.0); - /// for i in 0..N { - /// dir = quaternion * dir; - /// } - /// ``` - /// Instead, do the following. - /// ``` - /// # use bevy_math::prelude::*; - /// # let N: usize = 200; - /// let mut dir = Dir3::X; - /// let quaternion = Quat::from_euler(EulerRot::XYZ, 1.0, 2.0, 3.0); - /// for i in 0..N { - /// dir = quaternion * dir; - /// dir = dir.fast_renormalize(); - /// } - /// ``` - fast-renormalize: func(self: dir3) -> dir3; -} - -/// Methods for Dir3A -interface dir3-a { - use types.{reflect-reference}; - - /// Create a direction from its `x`, `y`, and `z` components, assuming the resulting vector is normalized. - /// # Warning - /// The vector produced from `x`, `y`, and `z` must be normalized, i.e its length must be `1.0`. - from-xyz-unchecked: func(x: f32, y: f32, z: f32) -> dir3-a; - eq: func(self: dir3-a, other: dir3-a) -> bool; - mul: func(self: dir3-a, rhs: f32) -> vec3-a; - /// Create a [`Dir3A`] from a [`Vec3A`] that is already normalized. - /// # Warning - /// `value` must be normalized, i.e its length must be `1.0`. - new-unchecked: func(value: vec3-a) -> dir3-a; - /// Returns the inner [`Vec3A`] - as-vec3a: func(self: dir3-a) -> vec3-a; - neg: func(self: dir3-a) -> dir3-a; - /// Returns `self` after an approximate normalization, assuming the value is already nearly normalized. - /// Useful for preventing numerical error accumulation. - /// See [`Dir3::fast_renormalize`] for an example of when such error accumulation might occur. - fast-renormalize: func(self: dir3-a) -> dir3-a; - /// Performs a spherical linear interpolation between `self` and `rhs` - /// based on the value `s`. - /// This corresponds to interpolating between the two directions at a constant angular velocity. - /// When `s == 0.0`, the result will be equal to `self`. - /// When `s == 1.0`, the result will be equal to `rhs`. - /// # Example - /// ``` - /// # use bevy_math::Dir3A; - /// # use approx::{assert_relative_eq, RelativeEq}; - /// # - /// let dir1 = Dir3A::X; - /// let dir2 = Dir3A::Y; - /// let result1 = dir1.slerp(dir2, 1.0 / 3.0); - /// #[cfg(feature = "approx")] - /// assert_relative_eq!( - /// result1, - /// Dir3A::from_xyz(0.75_f32.sqrt(), 0.5, 0.0).unwrap(), - /// epsilon = 0.000001 - /// ); - /// let result2 = dir1.slerp(dir2, 0.5); - /// #[cfg(feature = "approx")] - /// assert_relative_eq!(result2, Dir3A::from_xyz(0.5_f32.sqrt(), 0.5_f32.sqrt(), 0.0).unwrap()); - /// ``` - slerp: func(self: dir3-a, rhs: dir3-a, s: f32) -> dir3-a; - clone: func(self: dir3-a) -> dir3-a; -} - -/// Methods for Dir4 -interface dir4 { - use types.{reflect-reference}; - - mul: func(self: dir4, rhs: f32) -> vec4; - /// Create a direction from its `x`, `y`, `z`, and `w` components, assuming the resulting vector is normalized. - /// # Warning - /// The vector produced from `x`, `y`, `z`, and `w` must be normalized, i.e its length must be `1.0`. - from-xyzw-unchecked: func(x: f32, y: f32, z: f32, w: f32) -> dir4; - /// Create a [`Dir4`] from a [`Vec4`] that is already normalized. - /// # Warning - /// `value` must be normalized, i.e its length must be `1.0`. - new-unchecked: func(value: vec4) -> dir4; - neg: func(self: dir4) -> dir4; - eq: func(self: dir4, other: dir4) -> bool; - /// Returns `self` after an approximate normalization, assuming the value is already nearly normalized. - /// Useful for preventing numerical error accumulation. - fast-renormalize: func(self: dir4) -> dir4; - /// Returns the inner [`Vec4`] - as-vec4: func(self: dir4) -> vec4; - clone: func(self: dir4) -> dir4; -} - -/// Methods for FloatOrd -interface float-ord { - use types.{reflect-reference}; - - le: func(self: float-ord, other: float-ord) -> bool; - ge: func(self: float-ord, other: float-ord) -> bool; - eq: func(self: float-ord, other: float-ord) -> bool; - lt: func(self: float-ord, other: float-ord) -> bool; - gt: func(self: float-ord, other: float-ord) -> bool; - clone: func(self: float-ord) -> float-ord; - neg: func(self: float-ord) -> float-ord; -} - -/// Methods for Isometry2d -interface isometry2d { - use types.{reflect-reference}; - - eq: func(self: isometry2d, other: isometry2d) -> bool; - /// Create a two-dimensional isometry from a rotation and a translation. - new: func(translation: vec2, rotation: rot2) -> isometry2d; - /// Transform a point by rotating and translating it using this isometry. - transform-point: func(self: isometry2d, point: vec2) -> vec2; - mul: func(p0: isometry2d, p1: vec2) -> vec2; - /// The inverse isometry that undoes this one. - inverse: func(self: isometry2d) -> isometry2d; - /// Create a two-dimensional isometry from a translation with the given `x` and `y` components. - from-xy: func(x: f32, y: f32) -> isometry2d; - mul: func(p0: isometry2d, p1: isometry2d) -> isometry2d; - /// Create a two-dimensional isometry from a translation. - from-translation: func(translation: vec2) -> isometry2d; - clone: func(self: isometry2d) -> isometry2d; - mul: func(self: isometry2d, rhs: dir2) -> dir2; - /// Compute `iso1.inverse() * iso2` in a more efficient way for one-shot cases. - /// If the same isometry is used multiple times, it is more efficient to instead compute - /// the inverse once and use that for each transformation. - inverse-mul: func(self: isometry2d, rhs: isometry2d) -> isometry2d; - /// Create a two-dimensional isometry from a rotation. - from-rotation: func(rotation: rot2) -> isometry2d; - /// Transform a point by rotating and translating it using the inverse of this isometry. - /// This is more efficient than `iso.inverse().transform_point(point)` for one-shot cases. - /// If the same isometry is used multiple times, it is more efficient to instead compute - /// the inverse once and use that for each transformation. - inverse-transform-point: func(self: isometry2d, point: vec2) -> vec2; -} - -/// Methods for Isometry3d -interface isometry3d { - use types.{reflect-reference}; - - mul: func(p0: isometry3d, p1: isometry3d) -> isometry3d; - /// Create a three-dimensional isometry from a translation with the given `x`, `y`, and `z` components. - from-xyz: func(x: f32, y: f32, z: f32) -> isometry3d; - /// The inverse isometry that undoes this one. - inverse: func(self: isometry3d) -> isometry3d; - mul: func(p0: isometry3d, p1: vec3) -> vec3; - mul: func(self: isometry3d, rhs: dir3) -> dir3; - clone: func(self: isometry3d) -> isometry3d; - /// Create a three-dimensional isometry from a rotation. - from-rotation: func(rotation: quat) -> isometry3d; - eq: func(self: isometry3d, other: isometry3d) -> bool; - /// Compute `iso1.inverse() * iso2` in a more efficient way for one-shot cases. - /// If the same isometry is used multiple times, it is more efficient to instead compute - /// the inverse once and use that for each transformation. - inverse-mul: func(self: isometry3d, rhs: isometry3d) -> isometry3d; - mul: func(p0: isometry3d, p1: vec3-a) -> vec3-a; -} - -/// Methods for Annulus -interface annulus { - use types.{reflect-reference}; - - /// Get the diameter of the annulus - diameter: func(self: annulus) -> f32; - /// Finds the point on the annulus that is closest to the given `point`: - /// - If the point is outside of the annulus completely, the returned point will be on the outer perimeter. - /// - If the point is inside of the inner circle (hole) of the annulus, the returned point will be on the inner perimeter. - /// - Otherwise, the returned point is overlapping the annulus and returned as is. - closest-point: func(self: annulus, point: vec2) -> vec2; - eq: func(self: annulus, other: annulus) -> bool; - /// Get the thickness of the annulus - thickness: func(self: annulus) -> f32; - clone: func(self: annulus) -> annulus; - /// Create a new [`Annulus`] from the radii of the inner and outer circle - new: func(inner-radius: f32, outer-radius: f32) -> annulus; -} - -/// Methods for Arc2d -interface arc2d { - use types.{reflect-reference}; - - /// Create a new [`Arc2d`] from a `radius` and an `angle` in degrees. - from-degrees: func(radius: f32, angle: f32) -> arc2d; - /// Get the length of the apothem of this arc, that is, - /// the distance from the center of the circle to the midpoint of the chord, in the direction of the midpoint of the arc. - /// Equivalently, the [`radius`](Self::radius) minus the [`sagitta`](Self::sagitta). - /// Note that for a [`major`](Self::is_major) arc, the apothem will be negative. - apothem: func(self: arc2d) -> f32; - /// Create a new [`Arc2d`] from a `radius` and an `angle` in radians - from-radians: func(radius: f32, angle: f32) -> arc2d; - /// Get the length of the arc - length: func(self: arc2d) -> f32; - /// Produces true if the arc is at most half a circle. - /// **Note:** This is not the negation of [`is_major`](Self::is_major): an exact semicircle is both major and minor. - is-minor: func(self: arc2d) -> bool; - /// Create a new [`Arc2d`] from a `radius` and a `half_angle` - new: func(radius: f32, half-angle: f32) -> arc2d; - /// Get the angle of the arc - angle: func(self: arc2d) -> f32; - /// Get half the distance between the endpoints (half the length of the chord) - half-chord-length: func(self: arc2d) -> f32; - /// Produces true if the arc is at least half a circle. - /// **Note:** This is not the negation of [`is_minor`](Self::is_minor): an exact semicircle is both major and minor. - is-major: func(self: arc2d) -> bool; - eq: func(self: arc2d, other: arc2d) -> bool; - /// Get the midpoint of the arc - midpoint: func(self: arc2d) -> vec2; - /// Get the midpoint of the two endpoints (the midpoint of the chord) - chord-midpoint: func(self: arc2d) -> vec2; - /// Get the length of the sagitta of this arc, that is, - /// the length of the line between the midpoints of the arc and its chord. - /// Equivalently, the height of the triangle whose base is the chord and whose apex is the midpoint of the arc. - /// The sagitta is also the sum of the [`radius`](Self::radius) and the [`apothem`](Self::apothem). - sagitta: func(self: arc2d) -> f32; - /// Get the distance between the endpoints (the length of the chord) - chord-length: func(self: arc2d) -> f32; - clone: func(self: arc2d) -> arc2d; - /// Get the right-hand end point of the arc - right-endpoint: func(self: arc2d) -> vec2; - /// Create a new [`Arc2d`] from a `radius` and a `fraction` of a single turn. - /// For instance, `0.5` turns is a semicircle. - from-turns: func(radius: f32, fraction: f32) -> arc2d; - /// Get the left-hand end point of the arc - left-endpoint: func(self: arc2d) -> vec2; -} - -/// Methods for Capsule2d -interface capsule2d { - use types.{reflect-reference}; - - eq: func(self: capsule2d, other: capsule2d) -> bool; - /// Get the part connecting the semicircular ends of the capsule as a [`Rectangle`] - to-inner-rectangle: func(self: capsule2d) -> rectangle; - clone: func(self: capsule2d) -> capsule2d; - /// Create a new `Capsule2d` from a radius and length - new: func(radius: f32, length: f32) -> capsule2d; -} - -/// Methods for Circle -interface circle { - use types.{reflect-reference}; - - clone: func(self: circle) -> circle; - /// Get the diameter of the circle - diameter: func(self: circle) -> f32; - /// Create a new [`Circle`] from a `radius` - new: func(radius: f32) -> circle; - eq: func(self: circle, other: circle) -> bool; - /// Finds the point on the circle that is closest to the given `point`. - /// If the point is outside the circle, the returned point will be on the perimeter of the circle. - /// Otherwise, it will be inside the circle and returned as is. - closest-point: func(self: circle, point: vec2) -> vec2; -} - -/// Methods for CircularSector -interface circular-sector { - use types.{reflect-reference}; - - /// Get the length of the chord defined by the sector - /// See [`Arc2d::chord_length`] - chord-length: func(self: circular-sector) -> f32; - /// Get half the angle of the sector - half-angle: func(self: circular-sector) -> f32; - /// Get half the length of the chord defined by the sector - /// See [`Arc2d::half_chord_length`] - half-chord-length: func(self: circular-sector) -> f32; - /// Create a new [`CircularSector`] from a `radius` and an `angle` - new: func(radius: f32, angle: f32) -> circular-sector; - /// Create a new [`CircularSector`] from a `radius` and an `angle` in radians. - from-radians: func(radius: f32, angle: f32) -> circular-sector; - clone: func(self: circular-sector) -> circular-sector; - /// Get the midpoint of the chord defined by the sector - /// See [`Arc2d::chord_midpoint`] - chord-midpoint: func(self: circular-sector) -> vec2; - /// Get the length of the apothem of this sector - /// See [`Arc2d::apothem`] - apothem: func(self: circular-sector) -> f32; - /// Create a new [`CircularSector`] from a `radius` and a number of `turns` of a circle. - /// For instance, `0.5` turns is a semicircle. - from-turns: func(radius: f32, fraction: f32) -> circular-sector; - /// Get the angle of the sector - angle: func(self: circular-sector) -> f32; - /// Get the length of the arc defining the sector - arc-length: func(self: circular-sector) -> f32; - eq: func(self: circular-sector, other: circular-sector) -> bool; - /// Get the length of the sagitta of this sector - /// See [`Arc2d::sagitta`] - sagitta: func(self: circular-sector) -> f32; - /// Create a new [`CircularSector`] from a `radius` and an `angle` in degrees. - from-degrees: func(radius: f32, angle: f32) -> circular-sector; - /// Get the radius of the sector - radius: func(self: circular-sector) -> f32; -} - -/// Methods for CircularSegment -interface circular-segment { - use types.{reflect-reference}; - - /// Get the midpoint of the segment's base, also known as its chord - chord-midpoint: func(self: circular-segment) -> vec2; - /// Create a new [`CircularSegment`] from a `radius` and an `angle` in radians. - from-radians: func(radius: f32, angle: f32) -> circular-segment; - clone: func(self: circular-segment) -> circular-segment; - /// Get the length of the segment's base, also known as its chord - chord-length: func(self: circular-segment) -> f32; - /// Get the radius of the segment - radius: func(self: circular-segment) -> f32; - /// Create a new [`CircularSegment`] from a `radius`, and a `half_angle` in radians. - new: func(radius: f32, half-angle: f32) -> circular-segment; - /// Get the half-angle of the segment - half-angle: func(self: circular-segment) -> f32; - /// Get the angle of the segment - angle: func(self: circular-segment) -> f32; - eq: func(self: circular-segment, other: circular-segment) -> bool; - /// Create a new [`CircularSegment`] from a `radius` and a number of `turns` of a circle. - /// For instance, `0.5` turns is a semicircle. - from-turns: func(radius: f32, fraction: f32) -> circular-segment; - /// Get the length of the arc defining the segment - arc-length: func(self: circular-segment) -> f32; - /// Create a new [`CircularSegment`] from a `radius` and an `angle` in degrees. - from-degrees: func(radius: f32, angle: f32) -> circular-segment; - /// Get the length of the sagitta of this segment, also known as its height - /// See [`Arc2d::sagitta`] - sagitta: func(self: circular-segment) -> f32; - /// Get half the length of the segment's base, also known as its chord - half-chord-length: func(self: circular-segment) -> f32; - /// Get the length of the apothem of this segment, - /// which is the signed distance between the segment and the center of its circle - /// See [`Arc2d::apothem`] - apothem: func(self: circular-segment) -> f32; -} - -/// Methods for ConvexPolygon -interface convex-polygon { - use types.{reflect-reference}; - - eq: func(self: convex-polygon, other: convex-polygon) -> bool; - clone: func(self: convex-polygon) -> convex-polygon; -} - -/// Methods for Ellipse -interface ellipse { - use types.{reflect-reference}; - - eq: func(self: ellipse, other: ellipse) -> bool; - /// Returns the length of the semi-minor axis. This corresponds to the shortest radius of the ellipse. - semi-minor: func(self: ellipse) -> f32; - /// Returns the length of the semi-major axis. This corresponds to the longest radius of the ellipse. - semi-major: func(self: ellipse) -> f32; - clone: func(self: ellipse) -> ellipse; - /// Create a new `Ellipse` from half of its width and height. - /// This corresponds to the two perpendicular radii defining the ellipse. - new: func(half-width: f32, half-height: f32) -> ellipse; - /// Get the focal length of the ellipse. This corresponds to the distance between one of the foci and the center of the ellipse. - /// The focal length of an ellipse is related to its eccentricity by `eccentricity = focal_length / semi_major` - focal-length: func(self: ellipse) -> f32; - /// Returns the [eccentricity](https://en.wikipedia.org/wiki/Eccentricity_(mathematics)) of the ellipse. - /// It can be thought of as a measure of how "stretched" or elongated the ellipse is. - /// The value should be in the range [0, 1), where 0 represents a circle, and 1 represents a parabola. - eccentricity: func(self: ellipse) -> f32; - /// Create a new `Ellipse` from a given full size. - /// `size.x` is the diameter along the X axis, and `size.y` is the diameter along the Y axis. - from-size: func(size: vec2) -> ellipse; -} - -/// Methods for Line2d -interface line2d { - use types.{reflect-reference}; - - clone: func(self: line2d) -> line2d; - eq: func(self: line2d, other: line2d) -> bool; -} - -/// Methods for Plane2d -interface plane2d { - use types.{reflect-reference}; - - clone: func(self: plane2d) -> plane2d; - eq: func(self: plane2d, other: plane2d) -> bool; - /// Create a new `Plane2d` from a normal - /// # Panics - /// Panics if the given `normal` is zero (or very close to zero), or non-finite. - new: func(normal: vec2) -> plane2d; -} - -/// Methods for Polygon -interface polygon { - use types.{reflect-reference}; - - eq: func(self: polygon, other: polygon) -> bool; - /// Tests if the polygon is simple. - /// A polygon is simple if it is not self intersecting and not self tangent. - /// As such, no two edges of the polygon may cross each other and each vertex must not lie on another edge. - is-simple: func(self: polygon) -> bool; - clone: func(self: polygon) -> polygon; -} - -/// Methods for Polyline2d -interface polyline2d { - use types.{reflect-reference}; - - /// Create a new `Polyline2d` from two endpoints with subdivision points. - /// `subdivisions = 0` creates a simple line with just start and end points. - /// `subdivisions = 1` adds one point in the middle, creating 2 segments, etc. - with-subdivisions: func(start: vec2, end: vec2, subdivisions: u64) -> polyline2d; - eq: func(self: polyline2d, other: polyline2d) -> bool; - clone: func(self: polyline2d) -> polyline2d; -} - -/// Methods for Rectangle -interface rectangle { - use types.{reflect-reference}; - - /// Create a new `Rectangle` from a given full size - from-size: func(size: vec2) -> rectangle; - /// Finds the point on the rectangle that is closest to the given `point`. - /// If the point is outside the rectangle, the returned point will be on the perimeter of the rectangle. - /// Otherwise, it will be inside the rectangle and returned as is. - closest-point: func(self: rectangle, point: vec2) -> vec2; - /// Create a new `Rectangle` from a full width and height - new: func(width: f32, height: f32) -> rectangle; - clone: func(self: rectangle) -> rectangle; - /// Create a new `Rectangle` from two corner points - from-corners: func(point1: vec2, point2: vec2) -> rectangle; - eq: func(self: rectangle, other: rectangle) -> bool; - /// Create a `Rectangle` from a single length. - /// The resulting `Rectangle` will be the same size in every direction. - from-length: func(length: f32) -> rectangle; - /// Get the size of the rectangle - size: func(self: rectangle) -> vec2; -} - -/// Methods for RegularPolygon -interface regular-polygon { - use types.{reflect-reference}; - - /// Get the external angle of the regular polygon in radians. - /// This is the angle formed by two adjacent sides with points - /// within the angle being in the exterior of the polygon - external-angle-radians: func(self: regular-polygon) -> f32; - /// Get the length of one side of the regular polygon - side-length: func(self: regular-polygon) -> f32; - eq: func(self: regular-polygon, other: regular-polygon) -> bool; - /// Get the internal angle of the regular polygon in radians. - /// This is the angle formed by two adjacent sides with points - /// within the angle being in the interior of the polygon - internal-angle-radians: func(self: regular-polygon) -> f32; - clone: func(self: regular-polygon) -> regular-polygon; - /// Get the external angle of the regular polygon in degrees. - /// This is the angle formed by two adjacent sides with points - /// within the angle being in the exterior of the polygon - external-angle-degrees: func(self: regular-polygon) -> f32; - /// Get the inradius or apothem of the regular polygon. - /// This is the radius of the largest circle that can - /// be drawn within the polygon - inradius: func(self: regular-polygon) -> f32; - /// Create a new `RegularPolygon` - /// from the radius of the circumcircle and a number of sides - /// # Panics - /// Panics if `circumradius` is negative - new: func(circumradius: f32, sides: u32) -> regular-polygon; - /// Get the internal angle of the regular polygon in degrees. - /// This is the angle formed by two adjacent sides with points - /// within the angle being in the interior of the polygon - internal-angle-degrees: func(self: regular-polygon) -> f32; - /// Get the radius of the circumcircle on which all vertices - /// of the regular polygon lie - circumradius: func(self: regular-polygon) -> f32; -} - -/// Methods for Rhombus -interface rhombus { - use types.{reflect-reference}; - - /// Get the length of each side of the rhombus - side: func(self: rhombus) -> f32; - /// Create a new `Rhombus` from a vertical and horizontal diagonal sizes. - new: func(horizontal-diagonal: f32, vertical-diagonal: f32) -> rhombus; - /// Create a new `Rhombus` from a given inradius with all inner angles equal. - from-inradius: func(inradius: f32) -> rhombus; - clone: func(self: rhombus) -> rhombus; - /// Create a new `Rhombus` from a side length with all inner angles equal. - from-side: func(side: f32) -> rhombus; - /// Get the radius of the largest circle that can - /// be drawn within the rhombus - inradius: func(self: rhombus) -> f32; - eq: func(self: rhombus, other: rhombus) -> bool; - /// Get the radius of the circumcircle on which all vertices - /// of the rhombus lie - circumradius: func(self: rhombus) -> f32; - /// Finds the point on the rhombus that is closest to the given `point`. - /// If the point is outside the rhombus, the returned point will be on the perimeter of the rhombus. - /// Otherwise, it will be inside the rhombus and returned as is. - closest-point: func(self: rhombus, point: vec2) -> vec2; -} - -/// Methods for Segment2d -interface segment2d { - use types.{reflect-reference}; - - /// Returns the line segment with its direction reversed by swapping the endpoints. - reversed: func(self: segment2d) -> segment2d; - /// Compute the non-normalized clockwise normal on the right-hand side of the line segment. - /// The length of the normal is the distance between the endpoints. - scaled-right-normal: func(self: segment2d) -> vec2; - /// Compute the segment translated by the given vector. - translated: func(self: segment2d, translation: vec2) -> segment2d; - /// Reverses the direction of the line segment by swapping the endpoints. - reverse: func(self: segment2d); - /// Create a new `Segment2d` starting from the origin of the given `ray`, - /// going in the direction of the ray for the given `length`. - /// The endpoints will be at `ray.origin` and `ray.origin + length * ray.direction`. - from-ray-and-length: func(ray: ray2d, length: f32) -> segment2d; - /// Get the position of the second endpoint of the line segment. - point2: func(self: segment2d) -> vec2; - /// Compute the non-normalized counterclockwise normal on the left-hand side of the line segment. - /// The length of the normal is the distance between the endpoints. - scaled-left-normal: func(self: segment2d) -> vec2; - /// Compute the normalized clockwise normal on the right-hand side of the line segment. - /// For the non-panicking version, see [`Segment2d::try_right_normal`]. - /// # Panics - /// Panics if a valid normal could not be computed, for example when the endpoints are coincident, NaN, or infinite. - right-normal: func(self: segment2d) -> dir2; - /// Create a new `Segment2d` centered at the origin from a vector representing - /// the direction and length of the line segment. - /// The endpoints will be at `-scaled_direction / 2.0` and `scaled_direction / 2.0`. - from-scaled-direction: func(scaled-direction: vec2) -> segment2d; - eq: func(self: segment2d, other: segment2d) -> bool; - /// Compute the segment rotated around the given point by the given rotation. - rotated-around: func(self: segment2d, rotation: rot2, point: vec2) -> segment2d; - /// Returns the point on the [`Segment2d`] that is closest to the specified `point`. - closest-point: func(self: segment2d, point: vec2) -> vec2; - /// Compute the normalized direction pointing from the first endpoint to the second endpoint. - /// For the non-panicking version, see [`Segment2d::try_direction`]. - /// # Panics - /// Panics if a valid direction could not be computed, for example when the endpoints are coincident, NaN, or infinite. - direction: func(self: segment2d) -> dir2; - /// Compute the segment with a new length, keeping the same direction and center. - resized: func(self: segment2d, length: f32) -> segment2d; - /// Compute the segment rotated around the origin by the given rotation. - rotated: func(self: segment2d, rotation: rot2) -> segment2d; - /// Compute the midpoint between the two endpoints of the line segment. - center: func(self: segment2d) -> vec2; - clone: func(self: segment2d) -> segment2d; - /// Get the position of the first endpoint of the line segment. - point1: func(self: segment2d) -> vec2; - /// Create a new `Segment2d` centered at the origin with the given direction and length. - /// The endpoints will be at `-direction * length / 2.0` and `direction * length / 2.0`. - from-direction-and-length: func(direction: dir2, length: f32) -> segment2d; - /// Create a new `Segment2d` from its endpoints. - new: func(point1: vec2, point2: vec2) -> segment2d; - /// Compute the length of the line segment. - length: func(self: segment2d) -> f32; - /// Compute the normalized counterclockwise normal on the left-hand side of the line segment. - /// For the non-panicking version, see [`Segment2d::try_left_normal`]. - /// # Panics - /// Panics if a valid normal could not be computed, for example when the endpoints are coincident, NaN, or infinite. - left-normal: func(self: segment2d) -> dir2; - /// Compute the segment rotated around its own center. - rotated-around-center: func(self: segment2d, rotation: rot2) -> segment2d; - /// Compute the squared length of the line segment. - length-squared: func(self: segment2d) -> f32; - /// Compute the vector from the first endpoint to the second endpoint. - scaled-direction: func(self: segment2d) -> vec2; - /// Compute the segment with its center at the origin, keeping the same direction and length. - centered: func(self: segment2d) -> segment2d; -} - -/// Methods for Triangle2d -interface triangle2d { - use types.{reflect-reference}; - - /// This triangle but reversed. - reversed: func(self: triangle2d) -> triangle2d; - /// Checks if the triangle is degenerate, meaning it has zero area. - /// A triangle is degenerate if the cross product of the vectors `ab` and `ac` has a length less than `10e-7`. - /// This indicates that the three vertices are collinear or nearly collinear. - is-degenerate: func(self: triangle2d) -> bool; - /// Create a new `Triangle2d` from points `a`, `b`, and `c` - new: func(a: vec2, b: vec2, c: vec2) -> triangle2d; - clone: func(self: triangle2d) -> triangle2d; - eq: func(self: triangle2d, other: triangle2d) -> bool; - /// Reverse the [`WindingOrder`] of the triangle - /// by swapping the first and last vertices. - reverse: func(self: triangle2d); - /// Checks if the triangle is obtuse, meaning one angle is greater than 90 degrees - is-obtuse: func(self: triangle2d) -> bool; - /// Checks if the triangle is acute, meaning all angles are less than 90 degrees - is-acute: func(self: triangle2d) -> bool; -} - -/// Methods for Capsule3d -interface capsule3d { - use types.{reflect-reference}; - - clone: func(self: capsule3d) -> capsule3d; - /// Get the part connecting the hemispherical ends - /// of the capsule as a [`Cylinder`] - to-cylinder: func(self: capsule3d) -> cylinder; - eq: func(self: capsule3d, other: capsule3d) -> bool; - /// Create a new `Capsule3d` from a radius and length - new: func(radius: f32, length: f32) -> capsule3d; -} - -/// Methods for Cone -interface cone { - use types.{reflect-reference}; - - /// Create a new [`Cone`] from a radius and height. - new: func(radius: f32, height: f32) -> cone; - /// Get the slant height of the cone, the length of the line segment - /// connecting a point on the base to the apex - slant-height: func(self: cone) -> f32; - /// Get the surface area of the base of the cone - base-area: func(self: cone) -> f32; - /// Get the base of the cone as a [`Circle`] - base: func(self: cone) -> circle; - clone: func(self: cone) -> cone; - eq: func(self: cone, other: cone) -> bool; - /// Get the surface area of the side of the cone, - /// also known as the lateral area - lateral-area: func(self: cone) -> f32; -} - -/// Methods for ConicalFrustum -interface conical-frustum { - use types.{reflect-reference}; - - /// Get the surface area of the side of the conical frustum, - /// also known as the lateral area - lateral-area: func(self: conical-frustum) -> f32; - /// Get the bottom base of the conical frustum as a [`Circle`] - bottom-base: func(self: conical-frustum) -> circle; - clone: func(self: conical-frustum) -> conical-frustum; - /// Get the surface area of the bottom base of the conical frustum - bottom-base-area: func(self: conical-frustum) -> f32; - eq: func(self: conical-frustum, other: conical-frustum) -> bool; - /// Get the top base of the conical frustum as a [`Circle`] - top-base: func(self: conical-frustum) -> circle; - /// Get the slant height of the conical frustum, the length of the line segment - /// connecting a point on the base to the closest point on the top - slant-height: func(self: conical-frustum) -> f32; - /// Get the surface area of the top base of the conical frustum - top-base-area: func(self: conical-frustum) -> f32; -} - -/// Methods for Cuboid -interface cuboid { - use types.{reflect-reference}; - - /// Create a new `Cuboid` from a full x, y, and z length - new: func(x-length: f32, y-length: f32, z-length: f32) -> cuboid; - clone: func(self: cuboid) -> cuboid; - /// Finds the point on the cuboid that is closest to the given `point`. - /// If the point is outside the cuboid, the returned point will be on the surface of the cuboid. - /// Otherwise, it will be inside the cuboid and returned as is. - closest-point: func(self: cuboid, point: vec3) -> vec3; - /// Create a `Cuboid` from a single length. - /// The resulting `Cuboid` will be the same size in every direction. - from-length: func(length: f32) -> cuboid; - /// Create a new `Cuboid` from a given full size - from-size: func(size: vec3) -> cuboid; - /// Get the size of the cuboid - size: func(self: cuboid) -> vec3; - eq: func(self: cuboid, other: cuboid) -> bool; - /// Create a new `Cuboid` from two corner points - from-corners: func(point1: vec3, point2: vec3) -> cuboid; -} - -/// Methods for Cylinder -interface cylinder { - use types.{reflect-reference}; - - /// Get the surface area of the side of the cylinder, - /// also known as the lateral area - lateral-area: func(self: cylinder) -> f32; - /// Get the surface area of one base of the cylinder - base-area: func(self: cylinder) -> f32; - clone: func(self: cylinder) -> cylinder; - eq: func(self: cylinder, other: cylinder) -> bool; - /// Get the base of the cylinder as a [`Circle`] - base: func(self: cylinder) -> circle; - /// Create a new `Cylinder` from a radius and full height - new: func(radius: f32, height: f32) -> cylinder; -} - -/// Methods for InfinitePlane3d -interface infinite-plane3d { - use types.{reflect-reference}; - - clone: func(self: infinite-plane3d) -> infinite-plane3d; - /// Computes an [`Isometry3d`] which transforms points from the plane in 3D space with the given - /// `origin` to the XY-plane. - /// ## Guarantees - /// * the transformation is a [congruence] meaning it will preserve all distances and angles of - /// the transformed geometry - /// * uses the least rotation possible to transform the geometry - /// * if two geometries are transformed with the same isometry, then the relations between - /// them, like distances, are also preserved - /// * compared to projections, the transformation is lossless (up to floating point errors) - /// reversible - /// ## Non-Guarantees - /// * the rotation used is generally not unique - /// * the orientation of the transformed geometry in the XY plane might be arbitrary, to - /// enforce some kind of alignment the user has to use an extra transformation ontop of this - /// one - /// See [`isometries_xy`] for example usescases. - /// [congruence]: https://en.wikipedia.org/wiki/Congruence_(geometry) - /// [`isometries_xy`]: `InfinitePlane3d::isometries_xy` - isometry-into-xy: func(self: infinite-plane3d, origin: vec3) -> isometry3d; - /// Computes an [`Isometry3d`] which transforms points from the XY-plane to this plane with the - /// given `origin`. - /// ## Guarantees - /// * the transformation is a [congruence] meaning it will preserve all distances and angles of - /// the transformed geometry - /// * uses the least rotation possible to transform the geometry - /// * if two geometries are transformed with the same isometry, then the relations between - /// them, like distances, are also preserved - /// * compared to projections, the transformation is lossless (up to floating point errors) - /// reversible - /// ## Non-Guarantees - /// * the rotation used is generally not unique - /// * the orientation of the transformed geometry in the XY plane might be arbitrary, to - /// enforce some kind of alignment the user has to use an extra transformation ontop of this - /// one - /// See [`isometries_xy`] for example usescases. - /// [congruence]: https://en.wikipedia.org/wiki/Congruence_(geometry) - /// [`isometries_xy`]: `InfinitePlane3d::isometries_xy` - isometry-from-xy: func(self: infinite-plane3d, origin: vec3) -> isometry3d; - eq: func(self: infinite-plane3d, other: infinite-plane3d) -> bool; -} - -/// Methods for Line3d -interface line3d { - use types.{reflect-reference}; - - eq: func(self: line3d, other: line3d) -> bool; - clone: func(self: line3d) -> line3d; -} - -/// Methods for Plane3d -interface plane3d { - use types.{reflect-reference}; - - eq: func(self: plane3d, other: plane3d) -> bool; - /// Create a new `Plane3d` from a normal and a half size - /// # Panics - /// Panics if the given `normal` is zero (or very close to zero), or non-finite. - new: func(normal: vec3, half-size: vec2) -> plane3d; - clone: func(self: plane3d) -> plane3d; -} - -/// Methods for Polyline3d -interface polyline3d { - use types.{reflect-reference}; - - clone: func(self: polyline3d) -> polyline3d; - eq: func(self: polyline3d, other: polyline3d) -> bool; - /// Create a new `Polyline3d` from two endpoints with subdivision points. - /// `subdivisions = 0` creates a simple line with just start and end points. - /// `subdivisions = 1` adds one point in the middle, creating 2 segments, etc. - with-subdivisions: func(start: vec3, end: vec3, subdivisions: u64) -> polyline3d; -} - -/// Methods for Segment3d -interface segment3d { - use types.{reflect-reference}; - - /// Reverses the direction of the line segment by swapping the endpoints. - reverse: func(self: segment3d); - eq: func(self: segment3d, other: segment3d) -> bool; - /// Compute the length of the line segment. - length: func(self: segment3d) -> f32; - /// Compute the segment with a new length, keeping the same direction and center. - resized: func(self: segment3d, length: f32) -> segment3d; - /// Create a new `Segment3d` starting from the origin of the given `ray`, - /// going in the direction of the ray for the given `length`. - /// The endpoints will be at `ray.origin` and `ray.origin + length * ray.direction`. - from-ray-and-length: func(ray: ray3d, length: f32) -> segment3d; - /// Compute the midpoint between the two endpoints of the line segment. - center: func(self: segment3d) -> vec3; - /// Create a new `Segment3d` centered at the origin from a vector representing - /// the direction and length of the line segment. - /// The endpoints will be at `-scaled_direction / 2.0` and `scaled_direction / 2.0`. - from-scaled-direction: func(scaled-direction: vec3) -> segment3d; - /// Compute the segment rotated around the given point by the given rotation. - rotated-around: func(self: segment3d, rotation: quat, point: vec3) -> segment3d; - /// Compute the squared length of the line segment. - length-squared: func(self: segment3d) -> f32; - /// Create a new `Segment3d` centered at the origin with the given direction and length. - /// The endpoints will be at `-direction * length / 2.0` and `direction * length / 2.0`. - from-direction-and-length: func(direction: dir3, length: f32) -> segment3d; - /// Compute the segment translated by the given vector. - translated: func(self: segment3d, translation: vec3) -> segment3d; - /// Get the position of the first endpoint of the line segment. - point1: func(self: segment3d) -> vec3; - /// Returns the line segment with its direction reversed by swapping the endpoints. - reversed: func(self: segment3d) -> segment3d; - /// Compute the segment rotated around the origin by the given rotation. - rotated: func(self: segment3d, rotation: quat) -> segment3d; - /// Compute the vector from the first endpoint to the second endpoint. - scaled-direction: func(self: segment3d) -> vec3; - /// Compute the segment with its center at the origin, keeping the same direction and length. - centered: func(self: segment3d) -> segment3d; - /// Compute the normalized direction pointing from the first endpoint to the second endpoint. - /// For the non-panicking version, see [`Segment3d::try_direction`]. - /// # Panics - /// Panics if a valid direction could not be computed, for example when the endpoints are coincident, NaN, or infinite. - direction: func(self: segment3d) -> dir3; - /// Create a new `Segment3d` from its endpoints. - new: func(point1: vec3, point2: vec3) -> segment3d; - /// Get the position of the second endpoint of the line segment. - point2: func(self: segment3d) -> vec3; - clone: func(self: segment3d) -> segment3d; - /// Returns the point on the [`Segment3d`] that is closest to the specified `point`. - closest-point: func(self: segment3d, point: vec3) -> vec3; - /// Compute the segment rotated around its own center. - rotated-around-center: func(self: segment3d, rotation: quat) -> segment3d; -} - -/// Methods for Sphere -interface sphere { - use types.{reflect-reference}; - - clone: func(self: sphere) -> sphere; - eq: func(self: sphere, other: sphere) -> bool; - /// Finds the point on the sphere that is closest to the given `point`. - /// If the point is outside the sphere, the returned point will be on the surface of the sphere. - /// Otherwise, it will be inside the sphere and returned as is. - closest-point: func(self: sphere, point: vec3) -> vec3; - /// Create a new [`Sphere`] from a `radius` - new: func(radius: f32) -> sphere; - /// Get the diameter of the sphere - diameter: func(self: sphere) -> f32; -} - -/// Methods for Tetrahedron -interface tetrahedron { - use types.{reflect-reference}; - - /// Get the signed volume of the tetrahedron. - /// If it's negative, the normal vector of the face defined by - /// the first three points using the right-hand rule points - /// away from the fourth vertex. - signed-volume: func(self: tetrahedron) -> f32; - eq: func(self: tetrahedron, other: tetrahedron) -> bool; - /// Get the centroid of the tetrahedron. - /// This function finds the geometric center of the tetrahedron - /// by averaging the vertices: `centroid = (a + b + c + d) / 4`. - centroid: func(self: tetrahedron) -> vec3; - clone: func(self: tetrahedron) -> tetrahedron; - /// Create a new [`Tetrahedron`] from points `a`, `b`, `c` and `d`. - new: func(a: vec3, b: vec3, c: vec3, d: vec3) -> tetrahedron; -} - -/// Methods for Torus -interface torus { - use types.{reflect-reference}; - - /// Create a new `Torus` from an inner and outer radius. - /// The inner radius is the radius of the hole, and the outer radius - /// is the radius of the entire object - new: func(inner-radius: f32, outer-radius: f32) -> torus; - clone: func(self: torus) -> torus; - /// Get the inner radius of the torus. - /// For a ring torus, this corresponds to the radius of the hole, - /// or `major_radius - minor_radius` - inner-radius: func(self: torus) -> f32; - eq: func(self: torus, other: torus) -> bool; - /// Get the outer radius of the torus. - /// This corresponds to the overall radius of the entire object, - /// or `major_radius + minor_radius` - outer-radius: func(self: torus) -> f32; -} - -/// Methods for Triangle3d -interface triangle3d { - use types.{reflect-reference}; - - /// Checks if the triangle is acute, meaning all angles are less than 90 degrees - is-acute: func(self: triangle3d) -> bool; - /// Get the centroid of the triangle. - /// This function finds the geometric center of the triangle by averaging the vertices: - /// `centroid = (a + b + c) / 3`. - centroid: func(self: triangle3d) -> vec3; - /// Create a new [`Triangle3d`] from points `a`, `b`, and `c`. - new: func(a: vec3, b: vec3, c: vec3) -> triangle3d; - clone: func(self: triangle3d) -> triangle3d; - /// Get the circumcenter of the triangle. - circumcenter: func(self: triangle3d) -> vec3; - /// Checks if the triangle is obtuse, meaning one angle is greater than 90 degrees - is-obtuse: func(self: triangle3d) -> bool; - /// Reverse the triangle by swapping the first and last vertices. - reverse: func(self: triangle3d); - /// Checks if the triangle is degenerate, meaning it has zero area. - /// A triangle is degenerate if the cross product of the vectors `ab` and `ac` has a length less than `10e-7`. - /// This indicates that the three vertices are collinear or nearly collinear. - is-degenerate: func(self: triangle3d) -> bool; - eq: func(self: triangle3d, other: triangle3d) -> bool; - /// This triangle but reversed. - reversed: func(self: triangle3d) -> triangle3d; -} - -/// Methods for Ray2d -interface ray2d { - use types.{reflect-reference}; - - /// Returns the point at a given distance along the ray. - get-point: func(self: ray2d, distance: f32) -> vec2; - /// Creates a new `Ray2d` from a given origin and direction - new: func(origin: vec2, direction: dir2) -> ray2d; - clone: func(self: ray2d) -> ray2d; - eq: func(self: ray2d, other: ray2d) -> bool; - /// Returns the distance to a plane if the ray intersects it. - /// Use [`Ray2d::plane_intersection_point`] to get the intersection point directly. - intersect-plane: func(self: ray2d, plane-origin: vec2, plane: plane2d) -> option; -} - -/// Methods for Ray3d -interface ray3d { - use types.{reflect-reference}; - - /// Returns the point at a given distance along the ray - get-point: func(self: ray3d, distance: f32) -> vec3; - clone: func(self: ray3d) -> ray3d; - /// Creates a new `Ray3d` from a given origin and direction - new: func(origin: vec3, direction: dir3) -> ray3d; - /// Returns the distance to a plane if the ray intersects it - /// Use [`Ray3d::plane_intersection_point`] to get the intersection point directly. - intersect-plane: func(self: ray3d, plane-origin: vec3, plane: infinite-plane3d) -> option; - eq: func(self: ray3d, other: ray3d) -> bool; -} - -/// Methods for IRect -interface irect { - use types.{reflect-reference}; - - /// Returns self as [`URect`] (u32) - as-urect: func(self: irect) -> urect; - clone: func(self: irect) -> irect; - /// Check if the rectangle is empty. - /// # Examples - /// ``` - /// # use bevy_math::{IRect, IVec2}; - /// let r = IRect::from_corners(IVec2::ZERO, IVec2::new(0, 1)); // w=0 h=1 - /// assert!(r.is_empty()); - /// ``` - is-empty: func(self: irect) -> bool; - /// Check if a point lies within this rectangle, inclusive of its edges. - /// # Examples - /// ``` - /// # use bevy_math::IRect; - /// let r = IRect::new(0, 0, 5, 1); // w=5 h=1 - /// assert!(r.contains(r.center())); - /// assert!(r.contains(r.min)); - /// assert!(r.contains(r.max)); - /// ``` - contains: func(self: irect, point: ivec2) -> bool; - /// Build a new rectangle formed of the intersection of this rectangle and another rectangle. - /// The intersection is the largest rectangle enclosed in both rectangles. If the intersection - /// is empty, this method returns an empty rectangle ([`IRect::is_empty()`] returns `true`), but - /// the actual values of [`IRect::min`] and [`IRect::max`] are implementation-dependent. - /// # Examples - /// ``` - /// # use bevy_math::{IRect, IVec2}; - /// let r1 = IRect::new(0, 0, 5, 1); // w=5 h=1 - /// let r2 = IRect::new(1, -1, 3, 3); // w=2 h=4 - /// let r = r1.intersect(r2); - /// assert_eq!(r.min, IVec2::new(1, 0)); - /// assert_eq!(r.max, IVec2::new(3, 1)); - /// ``` - intersect: func(self: irect, other: irect) -> irect; - /// Create a new rectangle from two corner points. - /// The two points do not need to be the minimum and/or maximum corners. - /// They only need to be two opposite corners. - /// # Examples - /// ``` - /// # use bevy_math::{IRect, IVec2}; - /// // Unit rect from [0,0] to [1,1] - /// let r = IRect::from_corners(IVec2::ZERO, IVec2::ONE); // w=1 h=1 - /// // Same; the points do not need to be ordered - /// let r = IRect::from_corners(IVec2::ONE, IVec2::ZERO); // w=1 h=1 - /// ``` - from-corners: func(p0: ivec2, p1: ivec2) -> irect; - /// Create a new rectangle from two corner points. - /// The two points do not need to be the minimum and/or maximum corners. - /// They only need to be two opposite corners. - /// # Examples - /// ``` - /// # use bevy_math::IRect; - /// let r = IRect::new(0, 4, 10, 6); // w=10 h=2 - /// let r = IRect::new(2, 3, 5, -1); // w=3 h=4 - /// ``` - new: func(x0: s32, y0: s32, x1: s32, y1: s32) -> irect; - /// Rectangle half-size. - /// # Rounding Behavior - /// If the full size contains odd numbers they will be rounded down to the nearest whole number when calculating the half size. - /// # Examples - /// ``` - /// # use bevy_math::{IRect, IVec2}; - /// let r = IRect::new(0, 0, 4, 3); // w=4 h=3 - /// assert_eq!(r.half_size(), IVec2::new(2, 1)); - /// ``` - half-size: func(self: irect) -> ivec2; - /// The center point of the rectangle. - /// # Rounding Behavior - /// If the (min + max) contains odd numbers they will be rounded down to the nearest whole number when calculating the center. - /// # Examples - /// ``` - /// # use bevy_math::{IRect, IVec2}; - /// let r = IRect::new(0, 0, 5, 2); // w=5 h=2 - /// assert_eq!(r.center(), IVec2::new(2, 1)); - /// ``` - center: func(self: irect) -> ivec2; - /// Create a new rectangle from its center and half-size. - /// # Panics - /// This method panics if any of the components of the half-size is negative. - /// # Examples - /// ``` - /// # use bevy_math::{IRect, IVec2}; - /// let r = IRect::from_center_half_size(IVec2::ZERO, IVec2::ONE); // w=2 h=2 - /// assert_eq!(r.min, IVec2::splat(-1)); - /// assert_eq!(r.max, IVec2::splat(1)); - /// ``` - from-center-half-size: func(origin: ivec2, half-size: ivec2) -> irect; - /// Build a new rectangle formed of the union of this rectangle and another rectangle. - /// The union is the smallest rectangle enclosing both rectangles. - /// # Examples - /// ``` - /// # use bevy_math::{IRect, IVec2}; - /// let r1 = IRect::new(0, 0, 5, 1); // w=5 h=1 - /// let r2 = IRect::new(1, -1, 3, 3); // w=2 h=4 - /// let r = r1.union(r2); - /// assert_eq!(r.min, IVec2::new(0, -1)); - /// assert_eq!(r.max, IVec2::new(5, 3)); - /// ``` - union: func(self: irect, other: irect) -> irect; - /// Rectangle size. - /// # Examples - /// ``` - /// # use bevy_math::{IRect, IVec2}; - /// let r = IRect::new(0, 0, 5, 1); // w=5 h=1 - /// assert_eq!(r.size(), IVec2::new(5, 1)); - /// ``` - size: func(self: irect) -> ivec2; - /// Create a new rectangle by expanding it evenly on all sides. - /// A positive expansion value produces a larger rectangle, - /// while a negative expansion value produces a smaller rectangle. - /// If this would result in zero or negative width or height, [`IRect::EMPTY`] is returned instead. - /// # Examples - /// ``` - /// # use bevy_math::{IRect, IVec2}; - /// let r = IRect::new(0, 0, 5, 1); // w=5 h=1 - /// let r2 = r.inflate(3); // w=11 h=7 - /// assert_eq!(r2.min, IVec2::splat(-3)); - /// assert_eq!(r2.max, IVec2::new(8, 4)); - /// let r = IRect::new(0, -1, 4, 3); // w=4 h=4 - /// let r2 = r.inflate(-1); // w=2 h=2 - /// assert_eq!(r2.min, IVec2::new(1, 0)); - /// assert_eq!(r2.max, IVec2::new(3, 2)); - /// ``` - inflate: func(self: irect, expansion: s32) -> irect; - /// Build a new rectangle formed of the union of this rectangle and a point. - /// The union is the smallest rectangle enclosing both the rectangle and the point. If the - /// point is already inside the rectangle, this method returns a copy of the rectangle. - /// # Examples - /// ``` - /// # use bevy_math::{IRect, IVec2}; - /// let r = IRect::new(0, 0, 5, 1); // w=5 h=1 - /// let u = r.union_point(IVec2::new(3, 6)); - /// assert_eq!(u.min, IVec2::ZERO); - /// assert_eq!(u.max, IVec2::new(5, 6)); - /// ``` - union-point: func(self: irect, other: ivec2) -> irect; - /// Rectangle height (max.y - min.y). - /// # Examples - /// ``` - /// # use bevy_math::IRect; - /// let r = IRect::new(0, 0, 5, 1); // w=5 h=1 - /// assert_eq!(r.height(), 1); - /// ``` - height: func(self: irect) -> s32; - eq: func(self: irect, other: irect) -> bool; - /// Create a new rectangle from its center and size. - /// # Rounding Behavior - /// If the size contains odd numbers they will be rounded down to the nearest whole number. - /// # Panics - /// This method panics if any of the components of the size is negative. - /// # Examples - /// ``` - /// # use bevy_math::{IRect, IVec2}; - /// let r = IRect::from_center_size(IVec2::ZERO, IVec2::new(3, 2)); // w=2 h=2 - /// assert_eq!(r.min, IVec2::splat(-1)); - /// assert_eq!(r.max, IVec2::splat(1)); - /// ``` - from-center-size: func(origin: ivec2, size: ivec2) -> irect; - /// Rectangle width (max.x - min.x). - /// # Examples - /// ``` - /// # use bevy_math::IRect; - /// let r = IRect::new(0, 0, 5, 1); // w=5 h=1 - /// assert_eq!(r.width(), 5); - /// ``` - width: func(self: irect) -> s32; - assert-receiver-is-total-eq: func(self: irect); - /// Returns self as [`Rect`] (f32) - as-rect: func(self: irect) -> rect; -} - -/// Methods for Rect -interface rect { - use types.{reflect-reference}; - - clone: func(self: rect) -> rect; - /// Returns self as [`URect`] (u32) - as-urect: func(self: rect) -> urect; - /// Return the area of this rectangle. - /// # Examples - /// ``` - /// # use bevy_math::Rect; - /// let r = Rect::new(0., 0., 10., 10.); // w=10 h=10 - /// assert_eq!(r.area(), 100.0); - /// ``` - area: func(self: rect) -> f32; - /// Rectangle half-size. - /// # Examples - /// ``` - /// # use bevy_math::{Rect, Vec2}; - /// let r = Rect::new(0., 0., 5., 1.); // w=5 h=1 - /// assert!(r.half_size().abs_diff_eq(Vec2::new(2.5, 0.5), 1e-5)); - /// ``` - half-size: func(self: rect) -> vec2; - /// Build a new rectangle formed of the union of this rectangle and another rectangle. - /// The union is the smallest rectangle enclosing both rectangles. - /// # Examples - /// ``` - /// # use bevy_math::{Rect, Vec2}; - /// let r1 = Rect::new(0., 0., 5., 1.); // w=5 h=1 - /// let r2 = Rect::new(1., -1., 3., 3.); // w=2 h=4 - /// let r = r1.union(r2); - /// assert!(r.min.abs_diff_eq(Vec2::new(0., -1.), 1e-5)); - /// assert!(r.max.abs_diff_eq(Vec2::new(5., 3.), 1e-5)); - /// ``` - union: func(self: rect, other: rect) -> rect; - /// Build a new rectangle from this one with its coordinates expressed - /// relative to `other` in a normalized ([0..1] x [0..1]) coordinate system. - /// # Examples - /// ``` - /// # use bevy_math::{Rect, Vec2}; - /// let r = Rect::new(2., 3., 4., 6.); - /// let s = Rect::new(0., 0., 10., 10.); - /// let n = r.normalize(s); - /// assert_eq!(n.min.x, 0.2); - /// assert_eq!(n.min.y, 0.3); - /// assert_eq!(n.max.x, 0.4); - /// assert_eq!(n.max.y, 0.6); - /// ``` - normalize: func(self: rect, other: rect) -> rect; - /// Rectangle size. - /// # Examples - /// ``` - /// # use bevy_math::{Rect, Vec2}; - /// let r = Rect::new(0., 0., 5., 1.); // w=5 h=1 - /// assert!(r.size().abs_diff_eq(Vec2::new(5., 1.), 1e-5)); - /// ``` - size: func(self: rect) -> vec2; - eq: func(self: rect, other: rect) -> bool; - /// Build a new rectangle formed of the union of this rectangle and a point. - /// The union is the smallest rectangle enclosing both the rectangle and the point. If the - /// point is already inside the rectangle, this method returns a copy of the rectangle. - /// # Examples - /// ``` - /// # use bevy_math::{Rect, Vec2}; - /// let r = Rect::new(0., 0., 5., 1.); // w=5 h=1 - /// let u = r.union_point(Vec2::new(3., 6.)); - /// assert!(u.min.abs_diff_eq(Vec2::ZERO, 1e-5)); - /// assert!(u.max.abs_diff_eq(Vec2::new(5., 6.), 1e-5)); - /// ``` - union-point: func(self: rect, other: vec2) -> rect; - /// Create a new rectangle from two corner points. - /// The two points do not need to be the minimum and/or maximum corners. - /// They only need to be two opposite corners. - /// # Examples - /// ``` - /// # use bevy_math::Rect; - /// let r = Rect::new(0., 4., 10., 6.); // w=10 h=2 - /// let r = Rect::new(2., 3., 5., -1.); // w=3 h=4 - /// ``` - new: func(x0: f32, y0: f32, x1: f32, y1: f32) -> rect; - /// Check if the rectangle is empty. - /// # Examples - /// ``` - /// # use bevy_math::{Rect, Vec2}; - /// let r = Rect::from_corners(Vec2::ZERO, Vec2::new(0., 1.)); // w=0 h=1 - /// assert!(r.is_empty()); - /// ``` - is-empty: func(self: rect) -> bool; - /// Create a new rectangle from its center and size. - /// # Panics - /// This method panics if any of the components of the size is negative. - /// # Examples - /// ``` - /// # use bevy_math::{Rect, Vec2}; - /// let r = Rect::from_center_size(Vec2::ZERO, Vec2::ONE); // w=1 h=1 - /// assert!(r.min.abs_diff_eq(Vec2::splat(-0.5), 1e-5)); - /// assert!(r.max.abs_diff_eq(Vec2::splat(0.5), 1e-5)); - /// ``` - from-center-size: func(origin: vec2, size: vec2) -> rect; - /// Returns self as [`IRect`] (i32) - as-irect: func(self: rect) -> irect; - /// Create a new rectangle from its center and half-size. - /// # Panics - /// This method panics if any of the components of the half-size is negative. - /// # Examples - /// ``` - /// # use bevy_math::{Rect, Vec2}; - /// let r = Rect::from_center_half_size(Vec2::ZERO, Vec2::ONE); // w=2 h=2 - /// assert!(r.min.abs_diff_eq(Vec2::splat(-1.), 1e-5)); - /// assert!(r.max.abs_diff_eq(Vec2::splat(1.), 1e-5)); - /// ``` - from-center-half-size: func(origin: vec2, half-size: vec2) -> rect; - /// Build a new rectangle formed of the intersection of this rectangle and another rectangle. - /// The intersection is the largest rectangle enclosed in both rectangles. If the intersection - /// is empty, this method returns an empty rectangle ([`Rect::is_empty()`] returns `true`), but - /// the actual values of [`Rect::min`] and [`Rect::max`] are implementation-dependent. - /// # Examples - /// ``` - /// # use bevy_math::{Rect, Vec2}; - /// let r1 = Rect::new(0., 0., 5., 1.); // w=5 h=1 - /// let r2 = Rect::new(1., -1., 3., 3.); // w=2 h=4 - /// let r = r1.intersect(r2); - /// assert!(r.min.abs_diff_eq(Vec2::new(1., 0.), 1e-5)); - /// assert!(r.max.abs_diff_eq(Vec2::new(3., 1.), 1e-5)); - /// ``` - intersect: func(self: rect, other: rect) -> rect; - /// Create a new rectangle from two corner points. - /// The two points do not need to be the minimum and/or maximum corners. - /// They only need to be two opposite corners. - /// # Examples - /// ``` - /// # use bevy_math::{Rect, Vec2}; - /// // Unit rect from [0,0] to [1,1] - /// let r = Rect::from_corners(Vec2::ZERO, Vec2::ONE); // w=1 h=1 - /// // Same; the points do not need to be ordered - /// let r = Rect::from_corners(Vec2::ONE, Vec2::ZERO); // w=1 h=1 - /// ``` - from-corners: func(p0: vec2, p1: vec2) -> rect; - /// Check if a point lies within this rectangle, inclusive of its edges. - /// # Examples - /// ``` - /// # use bevy_math::Rect; - /// let r = Rect::new(0., 0., 5., 1.); // w=5 h=1 - /// assert!(r.contains(r.center())); - /// assert!(r.contains(r.min)); - /// assert!(r.contains(r.max)); - /// ``` - contains: func(self: rect, point: vec2) -> bool; - /// Rectangle height (max.y - min.y). - /// # Examples - /// ``` - /// # use bevy_math::Rect; - /// let r = Rect::new(0., 0., 5., 1.); // w=5 h=1 - /// assert!((r.height() - 1.).abs() <= 1e-5); - /// ``` - height: func(self: rect) -> f32; - /// Create a new rectangle by expanding it evenly on all sides. - /// A positive expansion value produces a larger rectangle, - /// while a negative expansion value produces a smaller rectangle. - /// If this would result in zero or negative width or height, [`Rect::EMPTY`] is returned instead. - /// # Examples - /// ``` - /// # use bevy_math::{Rect, Vec2}; - /// let r = Rect::new(0., 0., 5., 1.); // w=5 h=1 - /// let r2 = r.inflate(3.); // w=11 h=7 - /// assert!(r2.min.abs_diff_eq(Vec2::splat(-3.), 1e-5)); - /// assert!(r2.max.abs_diff_eq(Vec2::new(8., 4.), 1e-5)); - /// let r = Rect::new(0., -1., 6., 7.); // w=6 h=8 - /// let r2 = r.inflate(-2.); // w=11 h=7 - /// assert!(r2.min.abs_diff_eq(Vec2::new(2., 1.), 1e-5)); - /// assert!(r2.max.abs_diff_eq(Vec2::new(4., 5.), 1e-5)); - /// ``` - inflate: func(self: rect, expansion: f32) -> rect; - /// Rectangle width (max.x - min.x). - /// # Examples - /// ``` - /// # use bevy_math::Rect; - /// let r = Rect::new(0., 0., 5., 1.); // w=5 h=1 - /// assert!((r.width() - 5.).abs() <= 1e-5); - /// ``` - width: func(self: rect) -> f32; - /// The center point of the rectangle. - /// # Examples - /// ``` - /// # use bevy_math::{Rect, Vec2}; - /// let r = Rect::new(0., 0., 5., 1.); // w=5 h=1 - /// assert!(r.center().abs_diff_eq(Vec2::new(2.5, 0.5), 1e-5)); - /// ``` - center: func(self: rect) -> vec2; -} - -/// Methods for URect -interface urect { - use types.{reflect-reference}; - - /// Check if a point lies within this rectangle, inclusive of its edges. - /// # Examples - /// ``` - /// # use bevy_math::URect; - /// let r = URect::new(0, 0, 5, 1); // w=5 h=1 - /// assert!(r.contains(r.center())); - /// assert!(r.contains(r.min)); - /// assert!(r.contains(r.max)); - /// ``` - contains: func(self: urect, point: uvec2) -> bool; - /// Build a new rectangle formed of the union of this rectangle and another rectangle. - /// The union is the smallest rectangle enclosing both rectangles. - /// # Examples - /// ``` - /// # use bevy_math::{URect, UVec2}; - /// let r1 = URect::new(0, 0, 5, 1); // w=5 h=1 - /// let r2 = URect::new(1, 0, 3, 8); // w=2 h=4 - /// let r = r1.union(r2); - /// assert_eq!(r.min, UVec2::new(0, 0)); - /// assert_eq!(r.max, UVec2::new(5, 8)); - /// ``` - union: func(self: urect, other: urect) -> urect; - /// The center point of the rectangle. - /// # Rounding Behavior - /// If the (min + max) contains odd numbers they will be rounded down to the nearest whole number when calculating the center. - /// # Examples - /// ``` - /// # use bevy_math::{URect, UVec2}; - /// let r = URect::new(0, 0, 4, 2); // w=4 h=2 - /// assert_eq!(r.center(), UVec2::new(2, 1)); - /// ``` - center: func(self: urect) -> uvec2; - /// Rectangle size. - /// # Examples - /// ``` - /// # use bevy_math::{URect, UVec2}; - /// let r = URect::new(0, 0, 5, 1); // w=5 h=1 - /// assert_eq!(r.size(), UVec2::new(5, 1)); - /// ``` - size: func(self: urect) -> uvec2; - /// Build a new rectangle formed of the union of this rectangle and a point. - /// The union is the smallest rectangle enclosing both the rectangle and the point. If the - /// point is already inside the rectangle, this method returns a copy of the rectangle. - /// # Examples - /// ``` - /// # use bevy_math::{URect, UVec2}; - /// let r = URect::new(0, 0, 5, 1); // w=5 h=1 - /// let u = r.union_point(UVec2::new(3, 6)); - /// assert_eq!(u.min, UVec2::ZERO); - /// assert_eq!(u.max, UVec2::new(5, 6)); - /// ``` - union-point: func(self: urect, other: uvec2) -> urect; - /// Rectangle half-size. - /// # Rounding Behavior - /// If the full size contains odd numbers they will be rounded down to the nearest whole number when calculating the half size. - /// # Examples - /// ``` - /// # use bevy_math::{URect, UVec2}; - /// let r = URect::new(0, 0, 4, 2); // w=4 h=2 - /// assert_eq!(r.half_size(), UVec2::new(2, 1)); - /// ``` - half-size: func(self: urect) -> uvec2; - /// Check if the rectangle is empty. - /// # Examples - /// ``` - /// # use bevy_math::{URect, UVec2}; - /// let r = URect::from_corners(UVec2::ZERO, UVec2::new(0, 1)); // w=0 h=1 - /// assert!(r.is_empty()); - /// ``` - is-empty: func(self: urect) -> bool; - eq: func(self: urect, other: urect) -> bool; - /// Create a new rectangle from its center and half-size. - /// # Panics - /// This method panics if any of the components of the half-size is negative or if `origin - half_size` results in any negatives. - /// # Examples - /// ``` - /// # use bevy_math::{URect, UVec2}; - /// let r = URect::from_center_half_size(UVec2::ONE, UVec2::ONE); // w=2 h=2 - /// assert_eq!(r.min, UVec2::splat(0)); - /// assert_eq!(r.max, UVec2::splat(2)); - /// ``` - from-center-half-size: func(origin: uvec2, half-size: uvec2) -> urect; - /// Create a new rectangle by expanding it evenly on all sides. - /// A positive expansion value produces a larger rectangle, - /// while a negative expansion value produces a smaller rectangle. - /// If this would result in zero width or height, [`URect::EMPTY`] is returned instead. - /// # Examples - /// ``` - /// # use bevy_math::{URect, UVec2}; - /// let r = URect::new(4, 4, 6, 6); // w=2 h=2 - /// let r2 = r.inflate(1); // w=4 h=4 - /// assert_eq!(r2.min, UVec2::splat(3)); - /// assert_eq!(r2.max, UVec2::splat(7)); - /// let r = URect::new(4, 4, 8, 8); // w=4 h=4 - /// let r2 = r.inflate(-1); // w=2 h=2 - /// assert_eq!(r2.min, UVec2::splat(5)); - /// assert_eq!(r2.max, UVec2::splat(7)); - /// ``` - inflate: func(self: urect, expansion: s32) -> urect; - /// Rectangle width (max.x - min.x). - /// # Examples - /// ``` - /// # use bevy_math::URect; - /// let r = URect::new(0, 0, 5, 1); // w=5 h=1 - /// assert_eq!(r.width(), 5); - /// ``` - width: func(self: urect) -> u32; - /// Create a new rectangle from two corner points. - /// The two points do not need to be the minimum and/or maximum corners. - /// They only need to be two opposite corners. - /// # Examples - /// ``` - /// # use bevy_math::{URect, UVec2}; - /// // Unit rect from [0,0] to [1,1] - /// let r = URect::from_corners(UVec2::ZERO, UVec2::ONE); // w=1 h=1 - /// // Same; the points do not need to be ordered - /// let r = URect::from_corners(UVec2::ONE, UVec2::ZERO); // w=1 h=1 - /// ``` - from-corners: func(p0: uvec2, p1: uvec2) -> urect; - /// Create a new rectangle from two corner points. - /// The two points do not need to be the minimum and/or maximum corners. - /// They only need to be two opposite corners. - /// # Examples - /// ``` - /// # use bevy_math::URect; - /// let r = URect::new(0, 4, 10, 6); // w=10 h=2 - /// let r = URect::new(2, 4, 5, 0); // w=3 h=4 - /// ``` - new: func(x0: u32, y0: u32, x1: u32, y1: u32) -> urect; - clone: func(self: urect) -> urect; - /// Returns self as [`Rect`] (f32) - as-rect: func(self: urect) -> rect; - /// Create a new rectangle from its center and size. - /// # Rounding Behavior - /// If the size contains odd numbers they will be rounded down to the nearest whole number. - /// # Panics - /// This method panics if any of the components of the size is negative or if `origin - (size / 2)` results in any negatives. - /// # Examples - /// ``` - /// # use bevy_math::{URect, UVec2}; - /// let r = URect::from_center_size(UVec2::ONE, UVec2::splat(2)); // w=2 h=2 - /// assert_eq!(r.min, UVec2::splat(0)); - /// assert_eq!(r.max, UVec2::splat(2)); - /// ``` - from-center-size: func(origin: uvec2, size: uvec2) -> urect; - /// Rectangle height (max.y - min.y). - /// # Examples - /// ``` - /// # use bevy_math::URect; - /// let r = URect::new(0, 0, 5, 1); // w=5 h=1 - /// assert_eq!(r.height(), 1); - /// ``` - height: func(self: urect) -> u32; - /// Returns self as [`IRect`] (i32) - as-irect: func(self: urect) -> irect; - /// Build a new rectangle formed of the intersection of this rectangle and another rectangle. - /// The intersection is the largest rectangle enclosed in both rectangles. If the intersection - /// is empty, this method returns an empty rectangle ([`URect::is_empty()`] returns `true`), but - /// the actual values of [`URect::min`] and [`URect::max`] are implementation-dependent. - /// # Examples - /// ``` - /// # use bevy_math::{URect, UVec2}; - /// let r1 = URect::new(0, 0, 2, 2); // w=2 h=2 - /// let r2 = URect::new(1, 1, 3, 3); // w=2 h=2 - /// let r = r1.intersect(r2); - /// assert_eq!(r.min, UVec2::new(1, 1)); - /// assert_eq!(r.max, UVec2::new(2, 2)); - /// ``` - intersect: func(self: urect, other: urect) -> urect; - assert-receiver-is-total-eq: func(self: urect); -} - -/// Methods for Rot2 -interface rot2 { - use types.{reflect-reference}; - - /// Returns whether `self` has a length of `1.0` or not. - /// Uses a precision threshold of approximately `1e-4`. - is-normalized: func(self: rot2) -> bool; - /// Returns `true` if the rotation is NaN. - is-nan: func(self: rot2) -> bool; - /// Returns a corresponding rotation angle as a fraction of a full 360 degree turn in the `(-0.5, 0.5]` range. - as-turn-fraction: func(self: rot2) -> f32; - /// Computes `1.0 / self.length()`. - /// For valid results, `self` must _not_ have a length of zero. - length-recip: func(self: rot2) -> f32; - /// Returns `self` with a length of `1.0`. - /// Note that [`Rot2`] should typically already be normalized by design. - /// Manual normalization is only needed when successive operations result in - /// accumulated floating point error, or if the rotation was constructed - /// with invalid values. - /// # Panics - /// Panics if `self` has a length of zero, NaN, or infinity when debug assertions are enabled. - normalize: func(self: rot2) -> rot2; - /// Performs a spherical linear interpolation between `self` and `end` - /// based on the value `s`. - /// This corresponds to interpolating between the two angles at a constant angular velocity. - /// When `s == 0.0`, the result will be equal to `self`. - /// When `s == 1.0`, the result will be equal to `rhs`. - /// If you would like the rotation to have a kind of ease-in-out effect, consider - /// using the slightly more efficient [`nlerp`](Self::nlerp) instead. - /// # Example - /// ``` - /// # use bevy_math::Rot2; - /// # - /// let rot1 = Rot2::IDENTITY; - /// let rot2 = Rot2::degrees(135.0); - /// let result1 = rot1.slerp(rot2, 1.0 / 3.0); - /// assert_eq!(result1.as_degrees(), 45.0); - /// let result2 = rot1.slerp(rot2, 0.5); - /// assert_eq!(result2.as_degrees(), 67.5); - /// ``` - slerp: func(self: rot2, end: rot2, s: f32) -> rot2; - /// Computes the length or norm of the complex number used to represent the rotation. - /// The length is typically expected to be `1.0`. Unexpectedly denormalized rotations - /// can be a result of incorrect construction or floating point error caused by - /// successive operations. - length: func(self: rot2) -> f32; - /// Returns a corresponding rotation angle in radians in the `(-pi, pi]` range. - as-radians: func(self: rot2) -> f32; - mul: func(p0: rot2, p1: rot2) -> rot2; - /// Creates a [`Rot2`] from a counterclockwise angle in radians. - /// A negative argument corresponds to a clockwise rotation. - /// # Note - /// Angles larger than or equal to 2π (in either direction) loop around to smaller rotations, since a full rotation returns an object to its starting orientation. - /// # Example - /// ``` - /// # use bevy_math::Rot2; - /// # use approx::assert_relative_eq; - /// # use std::f32::consts::{FRAC_PI_2, PI}; - /// let rot1 = Rot2::radians(3.0 * FRAC_PI_2); - /// let rot2 = Rot2::radians(-FRAC_PI_2); - /// #[cfg(feature = "approx")] - /// assert_relative_eq!(rot1, rot2); - /// let rot3 = Rot2::radians(PI); - /// #[cfg(feature = "approx")] - /// assert_relative_eq!(rot1 * rot1, rot3); - /// // A rotation by 3π and 1π are the same - /// #[cfg(feature = "approx")] - /// assert_relative_eq!(Rot2::radians(3.0 * PI), Rot2::radians(PI)); - /// ``` - radians: func(radians: f32) -> rot2; - /// Creates a [`Rot2`] from the sine and cosine of an angle. - /// The rotation is only valid if `sin * sin + cos * cos == 1.0`. - /// # Panics - /// Panics if `sin * sin + cos * cos != 1.0` when the `glam_assert` feature is enabled. - from-sin-cos: func(sin: f32, cos: f32) -> rot2; - eq: func(self: rot2, other: rot2) -> bool; - /// Returns `true` if the rotation is neither infinite nor NaN. - is-finite: func(self: rot2) -> bool; - /// Returns `self` after an approximate normalization, assuming the value is already nearly normalized. - /// Useful for preventing numerical error accumulation. - /// See [`Dir3::fast_renormalize`](crate::Dir3::fast_renormalize) for an example of when such error accumulation might occur. - fast-renormalize: func(self: rot2) -> rot2; - /// Creates a [`Rot2`] from a counterclockwise fraction of a full turn of 360 degrees. - /// A negative argument corresponds to a clockwise rotation. - /// # Note - /// Angles larger than or equal to 1 turn (in either direction) loop around to smaller rotations, since a full rotation returns an object to its starting orientation. - /// # Example - /// ``` - /// # use bevy_math::Rot2; - /// # use approx::assert_relative_eq; - /// let rot1 = Rot2::turn_fraction(0.75); - /// let rot2 = Rot2::turn_fraction(-0.25); - /// #[cfg(feature = "approx")] - /// assert_relative_eq!(rot1, rot2); - /// let rot3 = Rot2::turn_fraction(0.5); - /// #[cfg(feature = "approx")] - /// assert_relative_eq!(rot1 * rot1, rot3); - /// // A rotation by 1.5 turns and 0.5 turns are the same - /// #[cfg(feature = "approx")] - /// assert_relative_eq!(Rot2::turn_fraction(1.5), Rot2::turn_fraction(0.5)); - /// ``` - turn-fraction: func(fraction: f32) -> rot2; - /// Returns the angle in radians needed to make `self` and `other` coincide. - angle-to: func(self: rot2, other: rot2) -> f32; - /// Creates a [`Rot2`] from a counterclockwise angle in degrees. - /// A negative argument corresponds to a clockwise rotation. - /// # Note - /// Angles larger than or equal to 360° (in either direction) loop around to smaller rotations, since a full rotation returns an object to its starting orientation. - /// # Example - /// ``` - /// # use bevy_math::Rot2; - /// # use approx::{assert_relative_eq, assert_abs_diff_eq}; - /// let rot1 = Rot2::degrees(270.0); - /// let rot2 = Rot2::degrees(-90.0); - /// #[cfg(feature = "approx")] - /// assert_relative_eq!(rot1, rot2); - /// let rot3 = Rot2::degrees(180.0); - /// #[cfg(feature = "approx")] - /// assert_relative_eq!(rot1 * rot1, rot3); - /// // A rotation by 365° and 5° are the same - /// #[cfg(feature = "approx")] - /// assert_abs_diff_eq!(Rot2::degrees(365.0), Rot2::degrees(5.0), epsilon = 2e-7); - /// ``` - degrees: func(degrees: f32) -> rot2; - /// Returns a corresponding rotation angle in degrees in the `(-180, 180]` range. - as-degrees: func(self: rot2) -> f32; - /// Performs a linear interpolation between `self` and `rhs` based on - /// the value `s`, and normalizes the rotation afterwards. - /// When `s == 0.0`, the result will be equal to `self`. - /// When `s == 1.0`, the result will be equal to `rhs`. - /// This is slightly more efficient than [`slerp`](Self::slerp), and produces a similar result - /// when the difference between the two rotations is small. At larger differences, - /// the result resembles a kind of ease-in-out effect. - /// If you would like the angular velocity to remain constant, consider using [`slerp`](Self::slerp) instead. - /// # Details - /// `nlerp` corresponds to computing an angle for a point at position `s` on a line drawn - /// between the endpoints of the arc formed by `self` and `rhs` on a unit circle, - /// and normalizing the result afterwards. - /// Note that if the angles are opposite like 0 and π, the line will pass through the origin, - /// and the resulting angle will always be either `self` or `rhs` depending on `s`. - /// If `s` happens to be `0.5` in this case, a valid rotation cannot be computed, and `self` - /// will be returned as a fallback. - /// # Example - /// ``` - /// # use bevy_math::Rot2; - /// # - /// let rot1 = Rot2::IDENTITY; - /// let rot2 = Rot2::degrees(135.0); - /// let result1 = rot1.nlerp(rot2, 1.0 / 3.0); - /// assert_eq!(result1.as_degrees(), 28.675055); - /// let result2 = rot1.nlerp(rot2, 0.5); - /// assert_eq!(result2.as_degrees(), 67.5); - /// ``` - nlerp: func(self: rot2, end: rot2, s: f32) -> rot2; - /// Computes the squared length or norm of the complex number used to represent the rotation. - /// This is generally faster than [`Rot2::length()`], as it avoids a square - /// root operation. - /// The length is typically expected to be `1.0`. Unexpectedly denormalized rotations - /// can be a result of incorrect construction or floating point error caused by - /// successive operations. - length-squared: func(self: rot2) -> f32; - /// Rotates the [`Dir2`] using a [`Rot2`]. - mul: func(self: rot2, direction: dir2) -> dir2; - /// Returns the sine and cosine of the rotation angle. - sin-cos: func(self: rot2) -> tuple; - clone: func(self: rot2) -> rot2; - /// Returns `true` if the rotation is near [`Rot2::IDENTITY`]. - is-near-identity: func(self: rot2) -> bool; - mul: func(p0: rot2, p1: vec2) -> vec2; - /// Returns the inverse of the rotation. This is also the conjugate - /// of the unit complex number representing the rotation. - inverse: func(self: rot2) -> rot2; -} - -/// Methods for Instant -interface instant { - use types.{reflect-reference}; - - assert-receiver-is-total-eq: func(self: instant); - /// Returns the amount of time elapsed since this instant. - /// # Panics - /// Previous Rust versions panicked when the current time was earlier than self. Currently this - /// method returns a Duration of zero in that case. Future versions may reintroduce the panic. - /// See [Monotonicity]. - /// [Monotonicity]: Instant#monotonicity - /// # Examples - /// ```no_run - /// use std::thread::sleep; - /// use std::time::{Duration, Instant}; - /// let instant = Instant::now(); - /// let three_secs = Duration::from_secs(3); - /// sleep(three_secs); - /// assert!(instant.elapsed() >= three_secs); - /// ``` - elapsed: func(self: instant) -> duration; - /// Returns the amount of time elapsed from another instant to this one, - /// or zero duration if that instant is later than this one. - /// # Examples - /// ```no_run - /// use std::time::{Duration, Instant}; - /// use std::thread::sleep; - /// let now = Instant::now(); - /// sleep(Duration::new(1, 0)); - /// let new_now = Instant::now(); - /// println!("{:?}", new_now.saturating_duration_since(now)); - /// println!("{:?}", now.saturating_duration_since(new_now)); // 0ns - /// ``` - saturating-duration-since: func(self: instant, earlier: instant) -> duration; - /// Returns an instant corresponding to "now". - /// # Examples - /// ``` - /// use std::time::Instant; - /// let now = Instant::now(); - /// ``` - now: func() -> instant; - eq: func(self: instant, other: instant) -> bool; - sub: func(self: instant, other: duration) -> instant; - clone: func(self: instant) -> instant; - /// # Panics - /// This function may panic if the resulting point in time cannot be represented by the - /// underlying data structure. See [`Instant::checked_add`] for a version without panic. - add: func(self: instant, other: duration) -> instant; - /// Returns the amount of time elapsed from another instant to this one, - /// or zero duration if that instant is later than this one. - /// # Panics - /// Previous Rust versions panicked when `earlier` was later than `self`. Currently this - /// method saturates. Future versions may reintroduce the panic in some circumstances. - /// See [Monotonicity]. - /// [Monotonicity]: Instant#monotonicity - /// # Examples - /// ```no_run - /// use std::time::{Duration, Instant}; - /// use std::thread::sleep; - /// let now = Instant::now(); - /// sleep(Duration::new(1, 0)); - /// let new_now = Instant::now(); - /// println!("{:?}", new_now.duration_since(now)); - /// println!("{:?}", now.duration_since(new_now)); // 0ns - /// ``` - duration-since: func(self: instant, earlier: instant) -> duration; - sub: func(p0: instant, p1: instant) -> duration; -} - -/// Methods for Fixed -interface fixed { - use types.{reflect-reference}; - - clone: func(self: fixed) -> fixed; -} - -/// Methods for Real -interface real { - use types.{reflect-reference}; - - clone: func(self: real) -> real; -} - -/// Methods for Stopwatch -interface stopwatch { - use types.{reflect-reference}; - - /// Resets the stopwatch. The reset doesn't affect the paused state of the stopwatch. - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut stopwatch = Stopwatch::new(); - /// stopwatch.tick(Duration::from_secs_f32(1.5)); - /// stopwatch.reset(); - /// assert_eq!(stopwatch.elapsed_secs(), 0.0); - /// ``` - reset: func(self: stopwatch); - /// Sets the elapsed time of the stopwatch. - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut stopwatch = Stopwatch::new(); - /// stopwatch.set_elapsed(Duration::from_secs_f32(1.0)); - /// assert_eq!(stopwatch.elapsed_secs(), 1.0); - /// ``` - set-elapsed: func(self: stopwatch, time: duration); - /// Pauses the stopwatch. Any call to [`tick`](Stopwatch::tick) while - /// paused will not have any effect on the elapsed time. - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut stopwatch = Stopwatch::new(); - /// stopwatch.pause(); - /// stopwatch.tick(Duration::from_secs_f32(1.5)); - /// assert!(stopwatch.is_paused()); - /// assert_eq!(stopwatch.elapsed_secs(), 0.0); - /// ``` - pause: func(self: stopwatch); - assert-receiver-is-total-eq: func(self: stopwatch); - /// Returns the elapsed time since the last [`reset`](Stopwatch::reset) - /// of the stopwatch, in seconds, as f64. - /// # See Also - /// [`elapsed`](Stopwatch::elapsed) - if a `Duration` is desirable instead. - /// [`elapsed_secs`](Stopwatch::elapsed_secs) - if an `f32` is desirable instead. - elapsed-secs-f64: func(self: stopwatch) -> f64; - /// Unpauses the stopwatch. Resume the effect of ticking on elapsed time. - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut stopwatch = Stopwatch::new(); - /// stopwatch.pause(); - /// stopwatch.tick(Duration::from_secs_f32(1.0)); - /// stopwatch.unpause(); - /// stopwatch.tick(Duration::from_secs_f32(1.0)); - /// assert!(!stopwatch.is_paused()); - /// assert_eq!(stopwatch.elapsed_secs(), 1.0); - /// ``` - unpause: func(self: stopwatch); - /// Returns the elapsed time since the last [`reset`](Stopwatch::reset) - /// of the stopwatch, in seconds. - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut stopwatch = Stopwatch::new(); - /// stopwatch.tick(Duration::from_secs(1)); - /// assert_eq!(stopwatch.elapsed_secs(), 1.0); - /// ``` - /// # See Also - /// [`elapsed`](Stopwatch::elapsed) - if a `Duration` is desirable instead. - /// [`elapsed_secs_f64`](Stopwatch::elapsed_secs_f64) - if an `f64` is desirable instead. - elapsed-secs: func(self: stopwatch) -> f32; - /// Returns `true` if the stopwatch is paused. - /// # Examples - /// ``` - /// # use bevy_time::*; - /// let mut stopwatch = Stopwatch::new(); - /// assert!(!stopwatch.is_paused()); - /// stopwatch.pause(); - /// assert!(stopwatch.is_paused()); - /// stopwatch.unpause(); - /// assert!(!stopwatch.is_paused()); - /// ``` - is-paused: func(self: stopwatch) -> bool; - eq: func(self: stopwatch, other: stopwatch) -> bool; - /// Returns the elapsed time since the last [`reset`](Stopwatch::reset) - /// of the stopwatch. - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut stopwatch = Stopwatch::new(); - /// stopwatch.tick(Duration::from_secs(1)); - /// assert_eq!(stopwatch.elapsed(), Duration::from_secs(1)); - /// ``` - /// # See Also - /// [`elapsed_secs`](Stopwatch::elapsed_secs) - if an `f32` value is desirable instead. - /// [`elapsed_secs_f64`](Stopwatch::elapsed_secs_f64) - if an `f64` is desirable instead. - elapsed: func(self: stopwatch) -> duration; - /// Create a new unpaused `Stopwatch` with no elapsed time. - /// # Examples - /// ``` - /// # use bevy_time::*; - /// let stopwatch = Stopwatch::new(); - /// assert_eq!(stopwatch.elapsed_secs(), 0.0); - /// assert_eq!(stopwatch.is_paused(), false); - /// ``` - new: func() -> stopwatch; - clone: func(self: stopwatch) -> stopwatch; -} - -/// Methods for Timer -interface timer { - use types.{reflect-reference}; - - /// Sets the mode of the timer. - /// # Examples - /// ``` - /// # use bevy_time::*; - /// let mut timer = Timer::from_seconds(1.0, TimerMode::Repeating); - /// timer.set_mode(TimerMode::Once); - /// assert_eq!(timer.mode(), TimerMode::Once); - /// ``` - set-mode: func(self: timer, mode: timer-mode); - /// Pauses the Timer. Disables the ticking of the timer. - /// See also [`Stopwatch::pause`](Stopwatch::pause). - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut timer = Timer::from_seconds(1.0, TimerMode::Once); - /// timer.pause(); - /// timer.tick(Duration::from_secs_f32(0.5)); - /// assert_eq!(timer.elapsed_secs(), 0.0); - /// ``` - pause: func(self: timer); - /// Resets the timer. The reset doesn't affect the `paused` state of the timer. - /// See also [`Stopwatch::reset`](Stopwatch::reset). - /// Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut timer = Timer::from_seconds(1.0, TimerMode::Once); - /// timer.tick(Duration::from_secs_f32(1.5)); - /// timer.reset(); - /// assert!(!timer.is_finished()); - /// assert!(!timer.just_finished()); - /// assert_eq!(timer.elapsed_secs(), 0.0); - /// ``` - reset: func(self: timer); - /// Returns `true` only on the tick the timer reached its duration. - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut timer = Timer::from_seconds(1.0, TimerMode::Once); - /// timer.tick(Duration::from_secs_f32(1.5)); - /// assert!(timer.just_finished()); - /// timer.tick(Duration::from_secs_f32(0.5)); - /// assert!(!timer.just_finished()); - /// ``` - just-finished: func(self: timer) -> bool; - /// Unpauses the Timer. Resumes the ticking of the timer. - /// See also [`Stopwatch::unpause()`](Stopwatch::unpause). - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut timer = Timer::from_seconds(1.0, TimerMode::Once); - /// timer.pause(); - /// timer.tick(Duration::from_secs_f32(0.5)); - /// timer.unpause(); - /// timer.tick(Duration::from_secs_f32(0.5)); - /// assert_eq!(timer.elapsed_secs(), 0.5); - /// ``` - unpause: func(self: timer); - /// Returns the fraction of the timer remaining time (goes from 1.0 to 0.0). - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut timer = Timer::from_seconds(2.0, TimerMode::Once); - /// timer.tick(Duration::from_secs_f32(0.5)); - /// assert_eq!(timer.fraction_remaining(), 0.75); - /// ``` - fraction-remaining: func(self: timer) -> f32; - /// Almost finishes the timer leaving 1 ns of remaining time. - /// This can be useful when needing an immediate action without having - /// to wait for the set duration of the timer in the first tick. - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut timer = Timer::from_seconds(1.5, TimerMode::Once); - /// timer.almost_finish(); - /// assert!(!timer.is_finished()); - /// assert_eq!(timer.remaining(), Duration::from_nanos(1)); - /// ``` - almost-finish: func(self: timer); - /// Sets the elapsed time of the timer without any other considerations. - /// See also [`Stopwatch::set`](Stopwatch::set). - /// # - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut timer = Timer::from_seconds(1.0, TimerMode::Once); - /// timer.set_elapsed(Duration::from_secs(2)); - /// assert_eq!(timer.elapsed(), Duration::from_secs(2)); - /// // the timer is not finished even if the elapsed time is greater than the duration. - /// assert!(!timer.is_finished()); - /// ``` - set-elapsed: func(self: timer, time: duration); - /// Returns the remaining time in seconds - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::cmp::Ordering; - /// use std::time::Duration; - /// let mut timer = Timer::from_seconds(2.0, TimerMode::Once); - /// timer.tick(Duration::from_secs_f32(0.5)); - /// let result = timer.remaining_secs().total_cmp(&1.5); - /// assert_eq!(Ordering::Equal, result); - /// ``` - remaining-secs: func(self: timer) -> f32; - /// Finishes the timer. - /// # Examples - /// ``` - /// # use bevy_time::*; - /// let mut timer = Timer::from_seconds(1.5, TimerMode::Once); - /// timer.finish(); - /// assert!(timer.is_finished()); - /// ``` - finish: func(self: timer); - /// Creates a new timer with a given duration in seconds. - /// # Example - /// ``` - /// # use bevy_time::*; - /// let mut timer = Timer::from_seconds(1.0, TimerMode::Once); - /// ``` - from-seconds: func(duration: f32, mode: timer-mode) -> timer; - assert-receiver-is-total-eq: func(self: timer); - /// Returns `true` if the timer is paused. - /// See also [`Stopwatch::is_paused`](Stopwatch::is_paused). - /// # Examples - /// ``` - /// # use bevy_time::*; - /// let mut timer = Timer::from_seconds(1.0, TimerMode::Once); - /// assert!(!timer.is_paused()); - /// timer.pause(); - /// assert!(timer.is_paused()); - /// timer.unpause(); - /// assert!(!timer.is_paused()); - /// ``` - is-paused: func(self: timer) -> bool; - clone: func(self: timer) -> timer; - /// Returns the time elapsed on the timer. Guaranteed to be between 0.0 and `duration`. - /// Will only equal `duration` when the timer is finished and non repeating. - /// See also [`Stopwatch::elapsed`](Stopwatch::elapsed). - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut timer = Timer::from_seconds(1.0, TimerMode::Once); - /// timer.tick(Duration::from_secs_f32(0.5)); - /// assert_eq!(timer.elapsed(), Duration::from_secs_f32(0.5)); - /// ``` - elapsed: func(self: timer) -> duration; - /// Returns the fraction of the timer elapsed time (goes from 0.0 to 1.0). - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut timer = Timer::from_seconds(2.0, TimerMode::Once); - /// timer.tick(Duration::from_secs_f32(0.5)); - /// assert_eq!(timer.fraction(), 0.25); - /// ``` - fraction: func(self: timer) -> f32; - /// Returns the mode of the timer. - /// # Examples - /// ``` - /// # use bevy_time::*; - /// let mut timer = Timer::from_seconds(1.0, TimerMode::Repeating); - /// assert_eq!(timer.mode(), TimerMode::Repeating); - /// ``` - mode: func(self: timer) -> timer-mode; - /// Returns the time elapsed on the timer as an `f32`. - /// See also [`Timer::elapsed`](Timer::elapsed). - elapsed-secs: func(self: timer) -> f32; - /// Returns the time elapsed on the timer as an `f64`. - /// See also [`Timer::elapsed`](Timer::elapsed). - elapsed-secs-f64: func(self: timer) -> f64; - /// Returns the number of times a repeating timer - /// finished during the last [`tick`](Timer::tick) call. - /// For non repeating-timers, this method will only ever - /// return 0 or 1. - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut timer = Timer::from_seconds(1.0, TimerMode::Repeating); - /// timer.tick(Duration::from_secs_f32(6.0)); - /// assert_eq!(timer.times_finished_this_tick(), 6); - /// timer.tick(Duration::from_secs_f32(2.0)); - /// assert_eq!(timer.times_finished_this_tick(), 2); - /// timer.tick(Duration::from_secs_f32(0.5)); - /// assert_eq!(timer.times_finished_this_tick(), 0); - /// ``` - times-finished-this-tick: func(self: timer) -> u32; - /// Returns the remaining time using Duration - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut timer = Timer::from_seconds(2.0, TimerMode::Once); - /// timer.tick(Duration::from_secs_f32(0.5)); - /// assert_eq!(timer.remaining(), Duration::from_secs_f32(1.5)); - /// ``` - remaining: func(self: timer) -> duration; - /// Returns the duration of the timer. - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let timer = Timer::new(Duration::from_secs(1), TimerMode::Once); - /// assert_eq!(timer.duration(), Duration::from_secs(1)); - /// ``` - duration: func(self: timer) -> duration; - /// Returns `true` if the timer has reached its duration. - /// For repeating timers, this method behaves identically to [`Timer::just_finished`]. - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut timer_once = Timer::from_seconds(1.0, TimerMode::Once); - /// timer_once.tick(Duration::from_secs_f32(1.5)); - /// assert!(timer_once.is_finished()); - /// timer_once.tick(Duration::from_secs_f32(0.5)); - /// assert!(timer_once.is_finished()); - /// let mut timer_repeating = Timer::from_seconds(1.0, TimerMode::Repeating); - /// timer_repeating.tick(Duration::from_secs_f32(1.1)); - /// assert!(timer_repeating.is_finished()); - /// timer_repeating.tick(Duration::from_secs_f32(0.8)); - /// assert!(!timer_repeating.is_finished()); - /// timer_repeating.tick(Duration::from_secs_f32(0.6)); - /// assert!(timer_repeating.is_finished()); - /// ``` - is-finished: func(self: timer) -> bool; - /// Creates a new timer with a given duration. - /// See also [`Timer::from_seconds`](Timer::from_seconds). - new: func(duration: duration, mode: timer-mode) -> timer; - /// Sets the duration of the timer. - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut timer = Timer::from_seconds(1.5, TimerMode::Once); - /// timer.set_duration(Duration::from_secs(1)); - /// assert_eq!(timer.duration(), Duration::from_secs(1)); - /// ``` - set-duration: func(self: timer, duration: duration); - eq: func(self: timer, other: timer) -> bool; -} - -/// Methods for TimerMode -interface timer-mode { - use types.{reflect-reference}; - - clone: func(self: timer-mode) -> timer-mode; - eq: func(self: timer-mode, other: timer-mode) -> bool; - assert-receiver-is-total-eq: func(self: timer-mode); -} - -/// Methods for Virtual -interface virtual { - use types.{reflect-reference}; - - clone: func(self: virtual) -> virtual; -} - -/// Methods for GlobalTransform -interface global-transform { - use types.{reflect-reference}; - - mul: func(p0: global-transform, p1: global-transform) -> global-transform; - from-translation: func(translation: vec3) -> global-transform; - /// Get the rotation as a [`Quat`]. - /// The transform is expected to be non-degenerate and without shearing, or the output will be invalid. - /// # Warning - /// This is calculated using `to_scale_rotation_translation`, meaning that you - /// should probably use it directly if you also need translation or scale. - rotation: func(self: global-transform) -> quat; - mul: func(self: global-transform, value: vec3) -> vec3; - /// Return the local left vector (-X). - left: func(self: global-transform) -> dir3; - /// Multiplies `self` with `transform` component by component, returning the - /// resulting [`GlobalTransform`] - mul-transform: func(self: global-transform, transform: transform) -> global-transform; - /// Get the translation as a [`Vec3A`]. - translation-vec3a: func(self: global-transform) -> vec3-a; - /// Returns the transformation as a [`Transform`]. - /// The transform is expected to be non-degenerate and without shearing, or the output - /// will be invalid. - compute-transform: func(self: global-transform) -> transform; - /// Return the local up vector (Y). - up: func(self: global-transform) -> dir3; - from-scale: func(scale: vec3) -> global-transform; - /// Get an upper bound of the radius from the given `extents`. - radius-vec3a: func(self: global-transform, extents: vec3-a) -> f32; - /// Computes a Scale-Rotation-Translation decomposition of the transformation and returns - /// the isometric part as an [isometry]. Any scaling done by the transformation will be ignored. - /// Note: this is a somewhat costly and lossy conversion. - /// The transform is expected to be non-degenerate and without shearing, or the output - /// will be invalid. - /// [isometry]: Isometry3d - to-isometry: func(self: global-transform) -> isometry3d; - /// Returns the [`Transform`] `self` would have if it was a child of an entity - /// with the `parent` [`GlobalTransform`]. - /// This is useful if you want to "reparent" an [`Entity`](bevy_ecs::entity::Entity). - /// Say you have an entity `e1` that you want to turn into a child of `e2`, - /// but you want `e1` to keep the same global transform, even after re-parenting. You would use: - /// ``` - /// # use bevy_transform::prelude::{GlobalTransform, Transform}; - /// # use bevy_ecs::prelude::{Entity, Query, Component, Commands, ChildOf}; - /// #[derive(Component)] - /// struct ToReparent { - /// new_parent: Entity, - /// } - /// fn reparent_system( - /// mut commands: Commands, - /// mut targets: Query<(&mut Transform, Entity, &GlobalTransform, &ToReparent)>, - /// transforms: Query<&GlobalTransform>, - /// ) { - /// for (mut transform, entity, initial, to_reparent) in targets.iter_mut() { - /// if let Ok(parent_transform) = transforms.get(to_reparent.new_parent) { - /// *transform = initial.reparented_to(parent_transform); - /// commands.entity(entity) - /// .remove::() - /// .insert(ChildOf(to_reparent.new_parent)); - /// } - /// } - /// } - /// ``` - /// The transform is expected to be non-degenerate and without shearing, or the output - /// will be invalid. - reparented-to: func(self: global-transform, parent: global-transform) -> transform; - mul: func(p0: global-transform, p1: transform) -> global-transform; - /// Returns the 3d affine transformation matrix as an [`Affine3A`]. - affine: func(self: global-transform) -> affine3-a; - from-rotation: func(rotation: quat) -> global-transform; - /// Returns the 3d affine transformation matrix as a [`Mat4`]. - to-matrix: func(self: global-transform) -> mat4; - from-xyz: func(x: f32, y: f32, z: f32) -> global-transform; - clone: func(self: global-transform) -> global-transform; - from-isometry: func(iso: isometry3d) -> global-transform; - /// Return the local down vector (-Y). - down: func(self: global-transform) -> dir3; - /// Get the scale as a [`Vec3`]. - /// The transform is expected to be non-degenerate and without shearing, or the output will be invalid. - /// Some of the computations overlap with `to_scale_rotation_translation`, which means you should use - /// it instead if you also need rotation. - scale: func(self: global-transform) -> vec3; - eq: func(self: global-transform, other: global-transform) -> bool; - /// Get the translation as a [`Vec3`]. - translation: func(self: global-transform) -> vec3; - /// Transforms the given point from local space to global space, applying shear, scale, rotation and translation. - /// It can be used like this: - /// ``` - /// # use bevy_transform::prelude::{GlobalTransform}; - /// # use bevy_math::prelude::Vec3; - /// let global_transform = GlobalTransform::from_xyz(1., 2., 3.); - /// let local_point = Vec3::new(1., 2., 3.); - /// let global_point = global_transform.transform_point(local_point); - /// assert_eq!(global_point, Vec3::new(2., 4., 6.)); - /// ``` - /// ``` - /// # use bevy_transform::prelude::{GlobalTransform}; - /// # use bevy_math::Vec3; - /// let global_point = Vec3::new(2., 4., 6.); - /// let global_transform = GlobalTransform::from_xyz(1., 2., 3.); - /// let local_point = global_transform.affine().inverse().transform_point3(global_point); - /// assert_eq!(local_point, Vec3::new(1., 2., 3.)) - /// ``` - /// To apply shear, scale, and rotation *without* applying translation, different functions are available: - /// ``` - /// # use bevy_transform::prelude::{GlobalTransform}; - /// # use bevy_math::prelude::Vec3; - /// let global_transform = GlobalTransform::from_xyz(1., 2., 3.); - /// let local_direction = Vec3::new(1., 2., 3.); - /// let global_direction = global_transform.affine().transform_vector3(local_direction); - /// assert_eq!(global_direction, Vec3::new(1., 2., 3.)); - /// let roundtripped_local_direction = global_transform.affine().inverse().transform_vector3(global_direction); - /// assert_eq!(roundtripped_local_direction, local_direction); - /// ``` - transform-point: func(self: global-transform, point: vec3) -> vec3; - /// Return the local forward vector (-Z). - forward: func(self: global-transform) -> dir3; - /// Return the local right vector (X). - right: func(self: global-transform) -> dir3; - /// Return the local back vector (Z). - back: func(self: global-transform) -> dir3; -} - -/// Methods for Transform -interface transform { - use types.{reflect-reference}; - - /// Rotates this [`Transform`] around the `Y` axis by `angle` (in radians). - /// If this [`Transform`] has a parent, the axis is relative to the rotation of the parent. - rotate-y: func(self: transform, angle: f32); - /// Rotates this [`Transform`] around its local `X` axis by `angle` (in radians). - rotate-local-x: func(self: transform, angle: f32); - /// Translates this [`Transform`] around a `point` in space. - /// If this [`Transform`] has a parent, the `point` is relative to the [`Transform`] of the parent. - translate-around: func(self: transform, point: vec3, rotation: quat); - /// Equivalent to [`-local_y()`][Transform::local_y] - down: func(self: transform) -> dir3; - eq: func(self: transform, other: transform) -> bool; - /// Rotates this [`Transform`] by the given rotation. - /// If this [`Transform`] has a parent, the `rotation` is relative to the rotation of the parent. - /// # Examples - /// - [`3d_rotation`] - /// [`3d_rotation`]: https://github.com/bevyengine/bevy/blob/latest/examples/transforms/3d_rotation.rs - rotate: func(self: transform, rotation: quat); - /// Returns this [`Transform`] with a new rotation. - with-rotation: func(self: transform, rotation: quat) -> transform; - /// Equivalent to [`local_z()`][Transform::local_z] - back: func(self: transform) -> dir3; - /// Equivalent to [`-local_z()`][Transform::local_z] - forward: func(self: transform) -> dir3; - /// Get the [isometry] defined by this transform's rotation and translation, ignoring scale. - /// [isometry]: Isometry3d - to-isometry: func(self: transform) -> isometry3d; - /// Equivalent to [`local_y()`][Transform::local_y] - up: func(self: transform) -> dir3; - /// Rotates this [`Transform`] around its local `Z` axis by `angle` (in radians). - rotate-local-z: func(self: transform, angle: f32); - /// Rotates this [`Transform`] around the `X` axis by `angle` (in radians). - /// If this [`Transform`] has a parent, the axis is relative to the rotation of the parent. - rotate-x: func(self: transform, angle: f32); - /// Creates a new [`Transform`], with `rotation`. Translation will be 0 and scale 1 on - /// all axes. - from-rotation: func(rotation: quat) -> transform; - /// Get the unit vector in the local `Y` direction. - local-y: func(self: transform) -> dir3; - mul: func(p0: transform, p1: global-transform) -> global-transform; - /// Extracts the translation, rotation, and scale from `matrix`. It must be a 3d affine - /// transformation matrix. - from-matrix: func(world-from-local: mat4) -> transform; - /// Rotates this [`Transform`] around the `Z` axis by `angle` (in radians). - /// If this [`Transform`] has a parent, the axis is relative to the rotation of the parent. - rotate-z: func(self: transform, angle: f32); - /// Rotates this [`Transform`] around its local `axis` by `angle` (in radians). - /// # Warning - /// If you pass in an `axis` based on the current rotation (e.g. obtained via [`Transform::local_x`]), - /// floating point errors can accumulate exponentially when applying rotations repeatedly this way. This will - /// result in a denormalized rotation. In this case, it is recommended to normalize the [`Transform::rotation`] after - /// each call to this method. - rotate-local-axis: func(self: transform, axis: dir3, angle: f32); - /// Rotates this [`Transform`] around the given `axis` by `angle` (in radians). - /// If this [`Transform`] has a parent, the `axis` is relative to the rotation of the parent. - /// # Warning - /// If you pass in an `axis` based on the current rotation (e.g. obtained via [`Transform::local_x`]), - /// floating point errors can accumulate exponentially when applying rotations repeatedly this way. This will - /// result in a denormalized rotation. In this case, it is recommended to normalize the [`Transform::rotation`] after - /// each call to this method. - rotate-axis: func(self: transform, axis: dir3, angle: f32); - /// Equivalent to [`local_x()`][Transform::local_x()] - right: func(self: transform) -> dir3; - /// Get the unit vector in the local `Z` direction. - local-z: func(self: transform) -> dir3; - /// Returns the 3d affine transformation matrix from this transforms translation, - /// rotation, and scale. - compute-affine: func(self: transform) -> affine3-a; - clone: func(self: transform) -> transform; - /// Rotates this [`Transform`] around its local `Y` axis by `angle` (in radians). - rotate-local-y: func(self: transform, angle: f32); - /// Transforms the given `point`, applying scale, rotation and translation. - /// If this [`Transform`] has an ancestor entity with a [`Transform`] component, - /// [`Transform::transform_point`] will transform a point in local space into its - /// parent transform's space. - /// If this [`Transform`] does not have a parent, [`Transform::transform_point`] will - /// transform a point in local space into worldspace coordinates. - /// If you always want to transform a point in local space to worldspace, or if you need - /// the inverse transformations, see [`GlobalTransform::transform_point()`]. - transform-point: func(self: transform, point: vec3) -> vec3; - mul: func(p0: transform, p1: transform) -> transform; - /// Returns this [`Transform`] with a new scale. - with-scale: func(self: transform, scale: vec3) -> transform; - /// Rotates this [`Transform`] by the given `rotation`. - /// The `rotation` is relative to this [`Transform`]'s current rotation. - rotate-local: func(self: transform, rotation: quat); - /// Get the unit vector in the local `X` direction. - local-x: func(self: transform) -> dir3; - /// Multiplies `self` with `transform` component by component, returning the - /// resulting [`Transform`] - mul-transform: func(self: transform, transform: transform) -> transform; - /// Creates a new [`Transform`], with `translation`. Rotation will be 0 and scale 1 on - /// all axes. - from-translation: func(translation: vec3) -> transform; - /// Rotates this [`Transform`] around a `point` in space. - /// If this [`Transform`] has a parent, the `point` is relative to the [`Transform`] of the parent. - rotate-around: func(self: transform, point: vec3, rotation: quat); - /// Returns `true` if, and only if, translation, rotation and scale all are - /// finite. If any of them contains a `NaN`, positive or negative infinity, - /// this will return `false`. - is-finite: func(self: transform) -> bool; - /// Computes the 3d affine transformation matrix from this transform's translation, - /// rotation, and scale. - to-matrix: func(self: transform) -> mat4; - /// Equivalent to [`-local_x()`][Transform::local_x()] - left: func(self: transform) -> dir3; - /// Returns this [`Transform`] with a new translation. - with-translation: func(self: transform, translation: vec3) -> transform; - /// Creates a new [`Transform`] that is equivalent to the given [isometry]. - /// [isometry]: Isometry3d - from-isometry: func(iso: isometry3d) -> transform; - /// Creates a new [`Transform`], with `scale`. Translation will be 0 and rotation 0 on - /// all axes. - from-scale: func(scale: vec3) -> transform; - mul: func(self: transform, value: vec3) -> vec3; - /// Creates a new [`Transform`] at the position `(x, y, z)`. In 2d, the `z` component - /// is used for z-ordering elements: higher `z`-value will be in front of lower - /// `z`-value. - from-xyz: func(x: f32, y: f32, z: f32) -> transform; -} - -/// Methods for TransformTreeChanged -interface transform-tree-changed { - use types.{reflect-reference}; - - eq: func(self: transform-tree-changed, other: transform-tree-changed) -> bool; - clone: func(self: transform-tree-changed) -> transform-tree-changed; -} - -/// Methods for StaticTransformOptimizations -interface static-transform-optimizations { - use types.{reflect-reference}; - - /// Unconditionally disable static scene optimizations. - disabled: func() -> static-transform-optimizations; - /// If the percentage of moving objects exceeds this threshold, disable static [`Transform`] - /// optimizations. This is done because the scene is so dynamic that the cost of tracking static - /// trees exceeds the performance benefit of skipping propagation for these trees. - /// - Setting this to `0.0` will result in never running static scene tracking. - /// - Setting this to `1.0` will result in always tracking static transform trees. - from-threshold: func(threshold: f32) -> static-transform-optimizations; - /// Unconditionally enable static scene optimizations. - enabled: func() -> static-transform-optimizations; -} - -/// Methods for TypeId -interface type-id { - use types.{reflect-reference}; - - assert-receiver-is-total-eq: func(self: type-id); - clone: func(self: type-id) -> type-id; - eq: func(self: type-id, other: type-id) -> bool; -} - -/// Methods for SocketAddr -interface socket-addr { - use types.{reflect-reference}; - - clone: func(self: socket-addr) -> socket-addr; - eq: func(self: socket-addr, other: socket-addr) -> bool; - /// Returns the port number associated with this socket address. - /// # Examples - /// ``` - /// use std::net::{IpAddr, Ipv4Addr, SocketAddr}; - /// let socket = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080); - /// assert_eq!(socket.port(), 8080); - /// ``` - port: func(self: socket-addr) -> u16; - assert-receiver-is-total-eq: func(self: socket-addr); - /// Changes the port number associated with this socket address. - /// # Examples - /// ``` - /// use std::net::{IpAddr, Ipv4Addr, SocketAddr}; - /// let mut socket = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080); - /// socket.set_port(1025); - /// assert_eq!(socket.port(), 1025); - /// ``` - set-port: func(self: socket-addr, new-port: u16); - /// Returns [`true`] if the [IP address] in this `SocketAddr` is an - /// [`IPv4` address], and [`false`] otherwise. - /// [IP address]: IpAddr - /// [`IPv4` address]: IpAddr::V4 - /// # Examples - /// ``` - /// use std::net::{IpAddr, Ipv4Addr, SocketAddr}; - /// let socket = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080); - /// assert_eq!(socket.is_ipv4(), true); - /// assert_eq!(socket.is_ipv6(), false); - /// ``` - is-ipv4: func(self: socket-addr) -> bool; - /// Returns [`true`] if the [IP address] in this `SocketAddr` is an - /// [`IPv6` address], and [`false`] otherwise. - /// [IP address]: IpAddr - /// [`IPv6` address]: IpAddr::V6 - /// # Examples - /// ``` - /// use std::net::{IpAddr, Ipv6Addr, SocketAddr}; - /// let socket = SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 65535, 0, 1)), 8080); - /// assert_eq!(socket.is_ipv4(), false); - /// assert_eq!(socket.is_ipv6(), true); - /// ``` - is-ipv6: func(self: socket-addr) -> bool; -} - -/// Methods for RangeFull -interface range-full { - use types.{reflect-reference}; - - eq: func(self: range-full, other: range-full) -> bool; - clone: func(self: range-full) -> range-full; - assert-receiver-is-total-eq: func(self: range-full); -} - -/// Methods for AtomicBool -interface atomic-bool { - use types.{reflect-reference}; - - /// Creates a new `AtomicBool`. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicBool; - /// let atomic_true = AtomicBool::new(true); - /// let atomic_false = AtomicBool::new(false); - /// ``` - new: func(v: bool) -> atomic-bool; - /// Consumes the atomic and returns the contained value. - /// This is safe because passing `self` by value guarantees that no other threads are - /// concurrently accessing the atomic data. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicBool; - /// let some_bool = AtomicBool::new(true); - /// assert_eq!(some_bool.into_inner(), true); - /// ``` - into-inner: func(self: atomic-bool) -> bool; -} - -/// Methods for AtomicI16 -interface atomic-i16 { - use types.{reflect-reference}; - - /// Consumes the atomic and returns the contained value. - /// This is safe because passing `self` by value guarantees that no other threads are - /// concurrently accessing the atomic data. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicI16; - /// let some_var = AtomicI16::new(5); - /// assert_eq!(some_var.into_inner(), 5); - /// ``` - into-inner: func(self: atomic-i16) -> s16; - /// Creates a new atomic integer. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicI16; - /// let atomic_forty_two = AtomicI16::new(42); - /// ``` - new: func(v: s16) -> atomic-i16; -} - -/// Methods for AtomicI32 -interface atomic-i32 { - use types.{reflect-reference}; - - /// Creates a new atomic integer. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicI32; - /// let atomic_forty_two = AtomicI32::new(42); - /// ``` - new: func(v: s32) -> atomic-i32; - /// Consumes the atomic and returns the contained value. - /// This is safe because passing `self` by value guarantees that no other threads are - /// concurrently accessing the atomic data. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicI32; - /// let some_var = AtomicI32::new(5); - /// assert_eq!(some_var.into_inner(), 5); - /// ``` - into-inner: func(self: atomic-i32) -> s32; -} - -/// Methods for AtomicI64 -interface atomic-i64 { - use types.{reflect-reference}; - - /// Creates a new atomic integer. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicI64; - /// let atomic_forty_two = AtomicI64::new(42); - /// ``` - new: func(v: s64) -> atomic-i64; - /// Consumes the atomic and returns the contained value. - /// This is safe because passing `self` by value guarantees that no other threads are - /// concurrently accessing the atomic data. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicI64; - /// let some_var = AtomicI64::new(5); - /// assert_eq!(some_var.into_inner(), 5); - /// ``` - into-inner: func(self: atomic-i64) -> s64; -} - -/// Methods for AtomicI8 -interface atomic-i8 { - use types.{reflect-reference}; - - /// Consumes the atomic and returns the contained value. - /// This is safe because passing `self` by value guarantees that no other threads are - /// concurrently accessing the atomic data. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicI8; - /// let some_var = AtomicI8::new(5); - /// assert_eq!(some_var.into_inner(), 5); - /// ``` - into-inner: func(self: atomic-i8) -> s8; - /// Creates a new atomic integer. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicI8; - /// let atomic_forty_two = AtomicI8::new(42); - /// ``` - new: func(v: s8) -> atomic-i8; -} - -/// Methods for AtomicIsize -interface atomic-isize { - use types.{reflect-reference}; - - /// Consumes the atomic and returns the contained value. - /// This is safe because passing `self` by value guarantees that no other threads are - /// concurrently accessing the atomic data. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicIsize; - /// let some_var = AtomicIsize::new(5); - /// assert_eq!(some_var.into_inner(), 5); - /// ``` - into-inner: func(self: atomic-isize) -> s64; - /// Creates a new atomic integer. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicIsize; - /// let atomic_forty_two = AtomicIsize::new(42); - /// ``` - new: func(v: s64) -> atomic-isize; -} - -/// Methods for AtomicU16 -interface atomic-u16 { - use types.{reflect-reference}; - - /// Creates a new atomic integer. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicU16; - /// let atomic_forty_two = AtomicU16::new(42); - /// ``` - new: func(v: u16) -> atomic-u16; - /// Consumes the atomic and returns the contained value. - /// This is safe because passing `self` by value guarantees that no other threads are - /// concurrently accessing the atomic data. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicU16; - /// let some_var = AtomicU16::new(5); - /// assert_eq!(some_var.into_inner(), 5); - /// ``` - into-inner: func(self: atomic-u16) -> u16; -} - -/// Methods for AtomicU32 -interface atomic-u32 { - use types.{reflect-reference}; - - /// Creates a new atomic integer. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicU32; - /// let atomic_forty_two = AtomicU32::new(42); - /// ``` - new: func(v: u32) -> atomic-u32; - /// Consumes the atomic and returns the contained value. - /// This is safe because passing `self` by value guarantees that no other threads are - /// concurrently accessing the atomic data. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicU32; - /// let some_var = AtomicU32::new(5); - /// assert_eq!(some_var.into_inner(), 5); - /// ``` - into-inner: func(self: atomic-u32) -> u32; -} - -/// Methods for AtomicU64 -interface atomic-u64 { - use types.{reflect-reference}; - - /// Creates a new atomic integer. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicU64; - /// let atomic_forty_two = AtomicU64::new(42); - /// ``` - new: func(v: u64) -> atomic-u64; - /// Consumes the atomic and returns the contained value. - /// This is safe because passing `self` by value guarantees that no other threads are - /// concurrently accessing the atomic data. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicU64; - /// let some_var = AtomicU64::new(5); - /// assert_eq!(some_var.into_inner(), 5); - /// ``` - into-inner: func(self: atomic-u64) -> u64; -} - -/// Methods for AtomicU8 -interface atomic-u8 { - use types.{reflect-reference}; - - /// Creates a new atomic integer. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicU8; - /// let atomic_forty_two = AtomicU8::new(42); - /// ``` - new: func(v: u8) -> atomic-u8; - /// Consumes the atomic and returns the contained value. - /// This is safe because passing `self` by value guarantees that no other threads are - /// concurrently accessing the atomic data. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicU8; - /// let some_var = AtomicU8::new(5); - /// assert_eq!(some_var.into_inner(), 5); - /// ``` - into-inner: func(self: atomic-u8) -> u8; -} - -/// Methods for AtomicUsize -interface atomic-usize { - use types.{reflect-reference}; - - /// Creates a new atomic integer. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicUsize; - /// let atomic_forty_two = AtomicUsize::new(42); - /// ``` - new: func(v: u64) -> atomic-usize; - /// Consumes the atomic and returns the contained value. - /// This is safe because passing `self` by value guarantees that no other threads are - /// concurrently accessing the atomic data. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicUsize; - /// let some_var = AtomicUsize::new(5); - /// assert_eq!(some_var.into_inner(), 5); - /// ``` - into-inner: func(self: atomic-usize) -> u64; -} - -/// Methods for Duration -interface duration { - use types.{reflect-reference}; - - /// Multiplies `Duration` by `f32`. - /// # Panics - /// This method will panic if result is negative, overflows `Duration` or not finite. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let dur = Duration::new(2, 700_000_000); - /// assert_eq!(dur.mul_f32(3.14), Duration::new(8, 478_000_641)); - /// assert_eq!(dur.mul_f32(3.14e5), Duration::new(847_800, 0)); - /// ``` - mul-f32: func(self: duration, rhs: f32) -> duration; - /// Creates a new `Duration` from the specified number of whole seconds. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let duration = Duration::from_secs(5); - /// assert_eq!(5, duration.as_secs()); - /// assert_eq!(0, duration.subsec_nanos()); - /// ``` - from-secs: func(secs: u64) -> duration; - /// Returns the fractional part of this `Duration`, in whole milliseconds. - /// This method does **not** return the length of the duration when - /// represented by milliseconds. The returned number always represents a - /// fractional portion of a second (i.e., it is less than one thousand). - /// # Examples - /// ``` - /// use std::time::Duration; - /// let duration = Duration::from_millis(5_432); - /// assert_eq!(duration.as_secs(), 5); - /// assert_eq!(duration.subsec_millis(), 432); - /// ``` - subsec-millis: func(self: duration) -> u32; - /// Returns the number of _whole_ seconds contained by this `Duration`. - /// The returned value does not include the fractional (nanosecond) part of the - /// duration, which can be obtained using [`subsec_nanos`]. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let duration = Duration::new(5, 730_023_852); - /// assert_eq!(duration.as_secs(), 5); - /// ``` - /// To determine the total number of seconds represented by the `Duration` - /// including the fractional part, use [`as_secs_f64`] or [`as_secs_f32`] - /// [`as_secs_f64`]: Duration::as_secs_f64 - /// [`as_secs_f32`]: Duration::as_secs_f32 - /// [`subsec_nanos`]: Duration::subsec_nanos - as-secs: func(self: duration) -> u64; - /// Returns the fractional part of this `Duration`, in nanoseconds. - /// This method does **not** return the length of the duration when - /// represented by nanoseconds. The returned number always represents a - /// fractional portion of a second (i.e., it is less than one billion). - /// # Examples - /// ``` - /// use std::time::Duration; - /// let duration = Duration::from_millis(5_010); - /// assert_eq!(duration.as_secs(), 5); - /// assert_eq!(duration.subsec_nanos(), 10_000_000); - /// ``` - subsec-nanos: func(self: duration) -> u32; - /// Divides `Duration` by `f64`. - /// # Panics - /// This method will panic if result is negative, overflows `Duration` or not finite. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let dur = Duration::new(2, 700_000_000); - /// assert_eq!(dur.div_f64(3.14), Duration::new(0, 859_872_611)); - /// assert_eq!(dur.div_f64(3.14e5), Duration::new(0, 8_599)); - /// ``` - div-f64: func(self: duration, rhs: f64) -> duration; - /// Creates a new `Duration` from the specified number of nanoseconds. - /// Note: Using this on the return value of `as_nanos()` might cause unexpected behavior: - /// `as_nanos()` returns a u128, and can return values that do not fit in u64, e.g. 585 years. - /// Instead, consider using the pattern `Duration::new(d.as_secs(), d.subsec_nanos())` - /// if you cannot copy/clone the Duration directly. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let duration = Duration::from_nanos(1_000_000_123); - /// assert_eq!(1, duration.as_secs()); - /// assert_eq!(123, duration.subsec_nanos()); - /// ``` - from-nanos: func(nanos: u64) -> duration; - /// Returns the fractional part of this `Duration`, in whole microseconds. - /// This method does **not** return the length of the duration when - /// represented by microseconds. The returned number always represents a - /// fractional portion of a second (i.e., it is less than one million). - /// # Examples - /// ``` - /// use std::time::Duration; - /// let duration = Duration::from_micros(1_234_567); - /// assert_eq!(duration.as_secs(), 1); - /// assert_eq!(duration.subsec_micros(), 234_567); - /// ``` - subsec-micros: func(self: duration) -> u32; - /// Creates a new `Duration` from the specified number of milliseconds. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let duration = Duration::from_millis(2_569); - /// assert_eq!(2, duration.as_secs()); - /// assert_eq!(569_000_000, duration.subsec_nanos()); - /// ``` - from-millis: func(millis: u64) -> duration; - /// Creates a new `Duration` from the specified number of seconds represented - /// as `f32`. - /// # Panics - /// This constructor will panic if `secs` is negative, overflows `Duration` or not finite. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let res = Duration::from_secs_f32(0.0); - /// assert_eq!(res, Duration::new(0, 0)); - /// let res = Duration::from_secs_f32(1e-20); - /// assert_eq!(res, Duration::new(0, 0)); - /// let res = Duration::from_secs_f32(4.2e-7); - /// assert_eq!(res, Duration::new(0, 420)); - /// let res = Duration::from_secs_f32(2.7); - /// assert_eq!(res, Duration::new(2, 700_000_048)); - /// let res = Duration::from_secs_f32(3e10); - /// assert_eq!(res, Duration::new(30_000_001_024, 0)); - /// // subnormal float - /// let res = Duration::from_secs_f32(f32::from_bits(1)); - /// assert_eq!(res, Duration::new(0, 0)); - /// // conversion uses rounding - /// let res = Duration::from_secs_f32(0.999e-9); - /// assert_eq!(res, Duration::new(0, 1)); - /// ``` - from-secs-f32: func(secs: f32) -> duration; - mul: func(self: duration, rhs: u32) -> duration; - eq: func(self: duration, other: duration) -> bool; - sub: func(self: duration, rhs: duration) -> duration; - /// Creates a new `Duration` from the specified number of whole seconds and - /// additional nanoseconds. - /// If the number of nanoseconds is greater than 1 billion (the number of - /// nanoseconds in a second), then it will carry over into the seconds provided. - /// # Panics - /// This constructor will panic if the carry from the nanoseconds overflows - /// the seconds counter. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let five_seconds = Duration::new(5, 0); - /// ``` - new: func(secs: u64, nanos: u32) -> duration; - /// Computes the absolute difference between `self` and `other`. - /// # Examples - /// ``` - /// use std::time::Duration; - /// assert_eq!(Duration::new(100, 0).abs_diff(Duration::new(80, 0)), Duration::new(20, 0)); - /// assert_eq!(Duration::new(100, 400_000_000).abs_diff(Duration::new(110, 0)), Duration::new(9, 600_000_000)); - /// ``` - abs-diff: func(self: duration, other: duration) -> duration; - /// Returns the total number of whole microseconds contained by this `Duration`. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let duration = Duration::new(5, 730_023_852); - /// assert_eq!(duration.as_micros(), 5_730_023); - /// ``` - as-micros: func(self: duration) -> u64; - /// Returns true if this `Duration` spans no time. - /// # Examples - /// ``` - /// use std::time::Duration; - /// assert!(Duration::ZERO.is_zero()); - /// assert!(Duration::new(0, 0).is_zero()); - /// assert!(Duration::from_nanos(0).is_zero()); - /// assert!(Duration::from_secs(0).is_zero()); - /// assert!(!Duration::new(1, 1).is_zero()); - /// assert!(!Duration::from_nanos(1).is_zero()); - /// assert!(!Duration::from_secs(1).is_zero()); - /// ``` - is-zero: func(self: duration) -> bool; - /// Saturating `Duration` multiplication. Computes `self * other`, returning - /// [`Duration::MAX`] if overflow occurred. - /// # Examples - /// ``` - /// #![feature(duration_constants)] - /// use std::time::Duration; - /// assert_eq!(Duration::new(0, 500_000_001).saturating_mul(2), Duration::new(1, 2)); - /// assert_eq!(Duration::new(u64::MAX - 1, 0).saturating_mul(2), Duration::MAX); - /// ``` - saturating-mul: func(self: duration, rhs: u32) -> duration; - /// Returns the total number of nanoseconds contained by this `Duration`. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let duration = Duration::new(5, 730_023_852); - /// assert_eq!(duration.as_nanos(), 5_730_023_852); - /// ``` - as-nanos: func(self: duration) -> u64; - /// Divides `Duration` by `Duration` and returns `f32`. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let dur1 = Duration::new(2, 700_000_000); - /// let dur2 = Duration::new(5, 400_000_000); - /// assert_eq!(dur1.div_duration_f32(dur2), 0.5); - /// ``` - div-duration-f32: func(self: duration, rhs: duration) -> f32; - /// Saturating `Duration` addition. Computes `self + other`, returning [`Duration::MAX`] - /// if overflow occurred. - /// # Examples - /// ``` - /// #![feature(duration_constants)] - /// use std::time::Duration; - /// assert_eq!(Duration::new(0, 0).saturating_add(Duration::new(0, 1)), Duration::new(0, 1)); - /// assert_eq!(Duration::new(1, 0).saturating_add(Duration::new(u64::MAX, 0)), Duration::MAX); - /// ``` - saturating-add: func(self: duration, rhs: duration) -> duration; - /// Creates a new `Duration` from the specified number of seconds represented - /// as `f64`. - /// # Panics - /// This constructor will panic if `secs` is negative, overflows `Duration` or not finite. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let res = Duration::from_secs_f64(0.0); - /// assert_eq!(res, Duration::new(0, 0)); - /// let res = Duration::from_secs_f64(1e-20); - /// assert_eq!(res, Duration::new(0, 0)); - /// let res = Duration::from_secs_f64(4.2e-7); - /// assert_eq!(res, Duration::new(0, 420)); - /// let res = Duration::from_secs_f64(2.7); - /// assert_eq!(res, Duration::new(2, 700_000_000)); - /// let res = Duration::from_secs_f64(3e10); - /// assert_eq!(res, Duration::new(30_000_000_000, 0)); - /// // subnormal float - /// let res = Duration::from_secs_f64(f64::from_bits(1)); - /// assert_eq!(res, Duration::new(0, 0)); - /// // conversion uses rounding - /// let res = Duration::from_secs_f64(0.999e-9); - /// assert_eq!(res, Duration::new(0, 1)); - /// ``` - from-secs-f64: func(secs: f64) -> duration; - /// Saturating `Duration` subtraction. Computes `self - other`, returning [`Duration::ZERO`] - /// if the result would be negative or if overflow occurred. - /// # Examples - /// ``` - /// use std::time::Duration; - /// assert_eq!(Duration::new(0, 1).saturating_sub(Duration::new(0, 0)), Duration::new(0, 1)); - /// assert_eq!(Duration::new(0, 0).saturating_sub(Duration::new(0, 1)), Duration::ZERO); - /// ``` - saturating-sub: func(self: duration, rhs: duration) -> duration; - div: func(self: duration, rhs: u32) -> duration; - /// Returns the number of seconds contained by this `Duration` as `f64`. - /// The returned value includes the fractional (nanosecond) part of the duration. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let dur = Duration::new(2, 700_000_000); - /// assert_eq!(dur.as_secs_f64(), 2.7); - /// ``` - as-secs-f64: func(self: duration) -> f64; - /// Divides `Duration` by `f32`. - /// # Panics - /// This method will panic if result is negative, overflows `Duration` or not finite. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let dur = Duration::new(2, 700_000_000); - /// // note that due to rounding errors result is slightly - /// // different from 0.859_872_611 - /// assert_eq!(dur.div_f32(3.14), Duration::new(0, 859_872_580)); - /// assert_eq!(dur.div_f32(3.14e5), Duration::new(0, 8_599)); - /// ``` - div-f32: func(self: duration, rhs: f32) -> duration; - /// Returns the number of seconds contained by this `Duration` as `f32`. - /// The returned value includes the fractional (nanosecond) part of the duration. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let dur = Duration::new(2, 700_000_000); - /// assert_eq!(dur.as_secs_f32(), 2.7); - /// ``` - as-secs-f32: func(self: duration) -> f32; - assert-receiver-is-total-eq: func(self: duration); - add: func(self: duration, rhs: duration) -> duration; - clone: func(self: duration) -> duration; - /// Multiplies `Duration` by `f64`. - /// # Panics - /// This method will panic if result is negative, overflows `Duration` or not finite. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let dur = Duration::new(2, 700_000_000); - /// assert_eq!(dur.mul_f64(3.14), Duration::new(8, 478_000_000)); - /// assert_eq!(dur.mul_f64(3.14e5), Duration::new(847_800, 0)); - /// ``` - mul-f64: func(self: duration, rhs: f64) -> duration; - /// Returns the total number of whole milliseconds contained by this `Duration`. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let duration = Duration::new(5, 730_023_852); - /// assert_eq!(duration.as_millis(), 5_730); - /// ``` - as-millis: func(self: duration) -> u64; - /// Creates a new `Duration` from the specified number of microseconds. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let duration = Duration::from_micros(1_000_002); - /// assert_eq!(1, duration.as_secs()); - /// assert_eq!(2_000, duration.subsec_nanos()); - /// ``` - from-micros: func(micros: u64) -> duration; - /// Divides `Duration` by `Duration` and returns `f64`. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let dur1 = Duration::new(2, 700_000_000); - /// let dur2 = Duration::new(5, 400_000_000); - /// assert_eq!(dur1.div_duration_f64(dur2), 0.5); - /// ``` - div-duration-f64: func(self: duration, rhs: duration) -> f64; -} - -/// Methods for Affine2 -interface affine2 { - use types.{reflect-reference}; - - /// Returns true if the absolute difference of all elements between `self` and `rhs` - /// is less than or equal to `max_abs_diff`. - /// This can be used to compare if two 3x4 matrices contain similar elements. It works - /// best when comparing with a known value. The `max_abs_diff` that should be used used - /// depends on the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: affine2, rhs: affine2, max-abs-diff: f32) -> bool; - /// The given [`Mat3A`] must be an affine transform, - from-mat3a: func(m: mat3-a) -> affine2; - /// Creates an affine transform from a 2x2 matrix (expressing scale, shear and rotation) and a - /// translation vector. - /// Equivalent to - /// `Affine2::from_translation(translation) * Affine2::from_mat2(mat2)` - from-mat2-translation: func(matrix2: mat2, translation: vec2) -> affine2; - mul: func(p0: affine2, p1: mat3) -> mat3; - /// Transforms the given 2D vector, applying shear, scale and rotation (but NOT - /// translation). - /// To also apply translation, use [`Self::transform_point2()`] instead. - transform-vector2: func(self: affine2, rhs: vec2) -> vec2; - /// Transforms the given 2D point, applying shear, scale, rotation and translation. - transform-point2: func(self: affine2, rhs: vec2) -> vec2; - /// Creates a `[[f32; 2]; 3]` 2D array storing data in - /// column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array-2d: func(self: affine2) -> list>; - /// Casts all elements of `self` to `f64`. - as-daffine2: func(self: affine2) -> daffine2; - /// Creates an affine transform that changes scale. - /// Note that if any scale is zero the transform will be non-invertible. - from-scale: func(scale: vec2) -> affine2; - /// Creates an affine transformation from the given 2D `translation`. - from-translation: func(translation: vec2) -> affine2; - mul: func(p0: affine2, p1: mat3-a) -> mat3-a; - eq: func(self: affine2, rhs: affine2) -> bool; - /// Creates an affine transform from the given 2D `scale`, rotation `angle` (in radians) and - /// `translation`. - /// Equivalent to `Affine2::from_translation(translation) * - /// Affine2::from_angle(angle) * Affine2::from_scale(scale)` - from-scale-angle-translation: func(scale: vec2, angle: f32, translation: vec2) -> affine2; - /// Creates an affine transform from three column vectors. - from-cols: func(x-axis: vec2, y-axis: vec2, z-axis: vec2) -> affine2; - /// Creates an affine transform from the given rotation `angle`. - from-angle: func(angle: f32) -> affine2; - clone: func(self: affine2) -> affine2; - /// The given `Mat3` must be an affine transform, - from-mat3: func(m: mat3) -> affine2; - /// Returns `true` if, and only if, all elements are finite. - /// If any element is either `NaN`, positive or negative infinity, this will return - /// `false`. - is-finite: func(self: affine2) -> bool; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: affine2) -> bool; - mul: func(p0: affine2, p1: affine2) -> affine2; - /// Return the inverse of this transform. - /// Note that if the transform is not invertible the result will be invalid. - inverse: func(self: affine2) -> affine2; - /// Creates an affine transform from the given 2D rotation `angle` (in radians) and - /// `translation`. - /// Equivalent to `Affine2::from_translation(translation) * Affine2::from_angle(angle)` - from-angle-translation: func(angle: f32, translation: vec2) -> affine2; - /// Creates an affine transform from a 2x2 matrix (expressing scale, shear and rotation) - from-mat2: func(matrix2: mat2) -> affine2; - mul: func(self: affine2, rhs: affine2) -> affine2; - mul: func(p0: affine2, p1: mat3) -> mat3; - mul: func(p0: affine2, p1: mat3-a) -> mat3-a; - /// Creates a `[f32; 6]` array storing data in column major order. - to-cols-array: func(self: affine2) -> list; -} - -/// Methods for Affine3A -interface affine3-a { - use types.{reflect-reference}; - - /// Creates an affine transform containing a 3D rotation around the z axis of - /// `angle` (in radians). - from-rotation-z: func(angle: f32) -> affine3-a; - mul: func(self: affine3-a, rhs: affine3-a) -> affine3-a; - /// Creates a `[f32; 12]` array storing data in column major order. - to-cols-array: func(self: affine3-a) -> list; - /// Creates an affine transform containing a 3D rotation around the y axis of - /// `angle` (in radians). - from-rotation-y: func(angle: f32) -> affine3-a; - /// Creates an affine transform containing a 3D rotation around a normalized - /// rotation `axis` of `angle` (in radians). - from-axis-angle: func(axis: vec3, angle: f32) -> affine3-a; - /// Transforms the given [`Vec3A`], applying shear, scale and rotation (but NOT - /// translation). - /// To also apply translation, use [`Self::transform_point3a()`] instead. - transform-vector3a: func(self: affine3-a, rhs: vec3-a) -> vec3-a; - /// Creates a `[[f32; 3]; 4]` 3D array storing data in - /// column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array-2d: func(self: affine3-a) -> list>; - /// Creates an affine transform that changes scale. - /// Note that if any scale is zero the transform will be non-invertible. - from-scale: func(scale: vec3) -> affine3-a; - eq: func(self: affine3-a, rhs: affine3-a) -> bool; - mul: func(p0: affine3-a, p1: mat4) -> mat4; - mul: func(p0: affine3-a, p1: affine3-a) -> affine3-a; - /// The given `Mat4` must be an affine transform, - /// i.e. contain no perspective transform. - from-mat4: func(m: mat4) -> affine3-a; - /// Creates an affine transform from a 3x3 matrix (expressing scale, shear and - /// rotation) - from-mat3: func(mat3: mat3) -> affine3-a; - /// Returns true if the absolute difference of all elements between `self` and `rhs` - /// is less than or equal to `max_abs_diff`. - /// This can be used to compare if two 3x4 matrices contain similar elements. It works - /// best when comparing with a known value. The `max_abs_diff` that should be used used - /// depends on the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: affine3-a, rhs: affine3-a, max-abs-diff: f32) -> bool; - /// Returns `true` if, and only if, all elements are finite. - /// If any element is either `NaN`, positive or negative infinity, this will return - /// `false`. - is-finite: func(self: affine3-a) -> bool; - /// Transforms the given 3D points, applying shear, scale, rotation and translation. - transform-point3: func(self: affine3-a, rhs: vec3) -> vec3; - mul: func(p0: affine3-a, p1: mat4) -> mat4; - /// Casts all elements of `self` to `f64`. - as-daffine3: func(self: affine3-a) -> daffine3; - /// Creates an affine transform from a 3x3 matrix (expressing scale, shear and rotation) - /// and a translation vector. - /// Equivalent to `Affine3A::from_translation(translation) * Affine3A::from_mat3(mat3)` - from-mat3-translation: func(mat3: mat3, translation: vec3) -> affine3-a; - /// Transforms the given [`Vec3A`], applying shear, scale, rotation and translation. - transform-point3a: func(self: affine3-a, rhs: vec3-a) -> vec3-a; - /// Creates an affine transform from three column vectors. - from-cols: func(x-axis: vec3-a, y-axis: vec3-a, z-axis: vec3-a, w-axis: vec3-a) -> affine3-a; - /// Creates a right-handed view transform using a camera position, an up direction, and a focal - /// point. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-rh: func(eye: vec3, center: vec3, up: vec3) -> affine3-a; - /// Creates a left-handed view transform using a camera position, an up direction, and a facing - /// direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - look-to-lh: func(eye: vec3, dir: vec3, up: vec3) -> affine3-a; - /// Creates an affine transform from the given `rotation` quaternion. - from-quat: func(rotation: quat) -> affine3-a; - clone: func(self: affine3-a) -> affine3-a; - /// Creates a left-handed view transform using a camera position, an up direction, and a focal - /// point. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-lh: func(eye: vec3, center: vec3, up: vec3) -> affine3-a; - /// Creates an affine transform from the given 3D `rotation` and `translation`. - /// Equivalent to `Affine3A::from_translation(translation) * Affine3A::from_quat(rotation)` - from-rotation-translation: func(rotation: quat, translation: vec3) -> affine3-a; - /// Creates a right-handed view transform using a camera position, an up direction, and a facing - /// direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - look-to-rh: func(eye: vec3, dir: vec3, up: vec3) -> affine3-a; - /// Creates an affine transform from the given 3D `scale`, `rotation` and - /// `translation`. - /// Equivalent to `Affine3A::from_translation(translation) * - /// Affine3A::from_quat(rotation) * Affine3A::from_scale(scale)` - from-scale-rotation-translation: func(scale: vec3, rotation: quat, translation: vec3) -> affine3-a; - /// Transforms the given 3D vector, applying shear, scale and rotation (but NOT - /// translation). - /// To also apply translation, use [`Self::transform_point3()`] instead. - transform-vector3: func(self: affine3-a, rhs: vec3) -> vec3; - /// Return the inverse of this transform. - /// Note that if the transform is not invertible the result will be invalid. - inverse: func(self: affine3-a) -> affine3-a; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: affine3-a) -> bool; - /// Creates an affine transform containing a 3D rotation around the x axis of - /// `angle` (in radians). - from-rotation-x: func(angle: f32) -> affine3-a; - /// Creates an affine transformation from the given 3D `translation`. - from-translation: func(translation: vec3) -> affine3-a; -} - -/// Methods for BVec2 -interface bvec2 { - use types.{reflect-reference}; - - assert-receiver-is-total-eq: func(self: bvec2); - /// Creates a new vector mask. - new: func(x: bool, y: bool) -> bvec2; - eq: func(self: bvec2, other: bvec2) -> bool; - /// Tests the value at `index`. - /// Panics if `index` is greater than 1. - test: func(self: bvec2, index: u64) -> bool; - /// Creates a vector mask with all elements set to `v`. - splat: func(v: bool) -> bvec2; - /// Creates a new vector mask from a bool array. - from-array: func(a: list) -> bvec2; - /// Returns true if any of the elements are true, false otherwise. - any: func(self: bvec2) -> bool; - /// Returns a bitmask with the lowest 2 bits set from the elements of `self`. - /// A true element results in a `1` bit and a false element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - bitmask: func(self: bvec2) -> u32; - clone: func(self: bvec2) -> bvec2; - /// Sets the element at `index`. - /// Panics if `index` is greater than 1. - set: func(self: bvec2, index: u64, value: bool); - /// Returns true if all the elements are true, false otherwise. - all: func(self: bvec2) -> bool; -} - -/// Methods for BVec3 -interface bvec3 { - use types.{reflect-reference}; - - /// Sets the element at `index`. - /// Panics if `index` is greater than 2. - set: func(self: bvec3, index: u64, value: bool); - clone: func(self: bvec3) -> bvec3; - /// Returns true if all the elements are true, false otherwise. - all: func(self: bvec3) -> bool; - /// Creates a vector mask with all elements set to `v`. - splat: func(v: bool) -> bvec3; - eq: func(self: bvec3, other: bvec3) -> bool; - /// Tests the value at `index`. - /// Panics if `index` is greater than 2. - test: func(self: bvec3, index: u64) -> bool; - assert-receiver-is-total-eq: func(self: bvec3); - /// Returns a bitmask with the lowest 3 bits set from the elements of `self`. - /// A true element results in a `1` bit and a false element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - bitmask: func(self: bvec3) -> u32; - /// Creates a new vector mask. - new: func(x: bool, y: bool, z: bool) -> bvec3; - /// Creates a new vector mask from a bool array. - from-array: func(a: list) -> bvec3; - /// Returns true if any of the elements are true, false otherwise. - any: func(self: bvec3) -> bool; -} - -/// Methods for BVec3A -interface bvec3-a { - use types.{reflect-reference}; - - /// Creates a vector mask with all elements set to `v`. - splat: func(v: bool) -> bvec3-a; - /// Creates a new vector mask. - new: func(x: bool, y: bool, z: bool) -> bvec3-a; - /// Returns true if all the elements are true, false otherwise. - all: func(self: bvec3-a) -> bool; - /// Returns a bitmask with the lowest 3 bits set from the elements of `self`. - /// A true element results in a `1` bit and a false element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - bitmask: func(self: bvec3-a) -> u32; - /// Tests the value at `index`. - /// Panics if `index` is greater than 2. - test: func(self: bvec3-a, index: u64) -> bool; - eq: func(self: bvec3-a, rhs: bvec3-a) -> bool; - /// Creates a new vector mask from a bool array. - from-array: func(a: list) -> bvec3-a; - clone: func(self: bvec3-a) -> bvec3-a; - /// Returns true if any of the elements are true, false otherwise. - any: func(self: bvec3-a) -> bool; - /// Sets the element at `index`. - /// Panics if `index` is greater than 2. - set: func(self: bvec3-a, index: u64, value: bool); -} - -/// Methods for BVec4 -interface bvec4 { - use types.{reflect-reference}; - - /// Creates a new vector mask from a bool array. - from-array: func(a: list) -> bvec4; - /// Tests the value at `index`. - /// Panics if `index` is greater than 3. - test: func(self: bvec4, index: u64) -> bool; - /// Returns true if any of the elements are true, false otherwise. - any: func(self: bvec4) -> bool; - /// Sets the element at `index`. - /// Panics if `index` is greater than 3. - set: func(self: bvec4, index: u64, value: bool); - /// Creates a new vector mask. - new: func(x: bool, y: bool, z: bool, w: bool) -> bvec4; - assert-receiver-is-total-eq: func(self: bvec4); - eq: func(self: bvec4, other: bvec4) -> bool; - /// Returns a bitmask with the lowest 4 bits set from the elements of `self`. - /// A true element results in a `1` bit and a false element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - bitmask: func(self: bvec4) -> u32; - /// Creates a vector mask with all elements set to `v`. - splat: func(v: bool) -> bvec4; - /// Returns true if all the elements are true, false otherwise. - all: func(self: bvec4) -> bool; - clone: func(self: bvec4) -> bvec4; -} - -/// Methods for BVec4A -interface bvec4-a { - use types.{reflect-reference}; - - eq: func(self: bvec4-a, rhs: bvec4-a) -> bool; - clone: func(self: bvec4-a) -> bvec4-a; - /// Creates a new vector mask. - new: func(x: bool, y: bool, z: bool, w: bool) -> bvec4-a; - /// Creates a vector mask with all elements set to `v`. - splat: func(v: bool) -> bvec4-a; - /// Tests the value at `index`. - /// Panics if `index` is greater than 3. - test: func(self: bvec4-a, index: u64) -> bool; - /// Creates a new vector mask from a bool array. - from-array: func(a: list) -> bvec4-a; - /// Returns true if all the elements are true, false otherwise. - all: func(self: bvec4-a) -> bool; - /// Returns true if any of the elements are true, false otherwise. - any: func(self: bvec4-a) -> bool; - /// Returns a bitmask with the lowest 4 bits set from the elements of `self`. - /// A true element results in a `1` bit and a false element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - bitmask: func(self: bvec4-a) -> u32; - /// Sets the element at `index`. - /// Panics if `index` is greater than 3. - set: func(self: bvec4-a, index: u64, value: bool); -} - -/// Methods for DAffine2 -interface daffine2 { - use types.{reflect-reference}; - - mul: func(p0: daffine2, p1: daffine2) -> daffine2; - /// Creates an affine transform from the given 2D rotation `angle` (in radians) and - /// `translation`. - /// Equivalent to `DAffine2::from_translation(translation) * DAffine2::from_angle(angle)` - from-angle-translation: func(angle: f64, translation: dvec2) -> daffine2; - /// Creates an affine transform from the given 2D `scale`, rotation `angle` (in radians) and - /// `translation`. - /// Equivalent to `DAffine2::from_translation(translation) * - /// DAffine2::from_angle(angle) * DAffine2::from_scale(scale)` - from-scale-angle-translation: func(scale: dvec2, angle: f64, translation: dvec2) -> daffine2; - /// Returns true if the absolute difference of all elements between `self` and `rhs` - /// is less than or equal to `max_abs_diff`. - /// This can be used to compare if two 3x4 matrices contain similar elements. It works - /// best when comparing with a known value. The `max_abs_diff` that should be used used - /// depends on the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: daffine2, rhs: daffine2, max-abs-diff: f64) -> bool; - eq: func(self: daffine2, rhs: daffine2) -> bool; - /// Returns `true` if, and only if, all elements are finite. - /// If any element is either `NaN`, positive or negative infinity, this will return - /// `false`. - is-finite: func(self: daffine2) -> bool; - mul: func(self: daffine2, rhs: daffine2) -> daffine2; - /// The given `DMat3` must be an affine transform, - from-mat3: func(m: dmat3) -> daffine2; - /// Return the inverse of this transform. - /// Note that if the transform is not invertible the result will be invalid. - inverse: func(self: daffine2) -> daffine2; - mul: func(p0: daffine2, p1: dmat3) -> dmat3; - /// Creates a `[f64; 6]` array storing data in column major order. - to-cols-array: func(self: daffine2) -> list; - /// Transforms the given 2D vector, applying shear, scale and rotation (but NOT - /// translation). - /// To also apply translation, use [`Self::transform_point2()`] instead. - transform-vector2: func(self: daffine2, rhs: dvec2) -> dvec2; - clone: func(self: daffine2) -> daffine2; - /// Creates a `[[f64; 2]; 3]` 2D array storing data in - /// column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array-2d: func(self: daffine2) -> list>; - /// Creates an affine transform from three column vectors. - from-cols: func(x-axis: dvec2, y-axis: dvec2, z-axis: dvec2) -> daffine2; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: daffine2) -> bool; - /// Casts all elements of `self` to `f32`. - as-affine2: func(self: daffine2) -> affine2; - mul: func(p0: daffine2, p1: dmat3) -> dmat3; - /// Creates an affine transform that changes scale. - /// Note that if any scale is zero the transform will be non-invertible. - from-scale: func(scale: dvec2) -> daffine2; - /// Creates an affine transform from a 2x2 matrix (expressing scale, shear and rotation) and a - /// translation vector. - /// Equivalent to - /// `DAffine2::from_translation(translation) * DAffine2::from_mat2(mat2)` - from-mat2-translation: func(matrix2: dmat2, translation: dvec2) -> daffine2; - /// Creates an affine transform from a 2x2 matrix (expressing scale, shear and rotation) - from-mat2: func(matrix2: dmat2) -> daffine2; - /// Creates an affine transformation from the given 2D `translation`. - from-translation: func(translation: dvec2) -> daffine2; - /// Transforms the given 2D point, applying shear, scale, rotation and translation. - transform-point2: func(self: daffine2, rhs: dvec2) -> dvec2; - /// Creates an affine transform from the given rotation `angle`. - from-angle: func(angle: f64) -> daffine2; -} - -/// Methods for DAffine3 -interface daffine3 { - use types.{reflect-reference}; - - /// Creates an affine transform containing a 3D rotation around the z axis of - /// `angle` (in radians). - from-rotation-z: func(angle: f64) -> daffine3; - /// Creates a `[f64; 12]` array storing data in column major order. - to-cols-array: func(self: daffine3) -> list; - /// Returns true if the absolute difference of all elements between `self` and `rhs` - /// is less than or equal to `max_abs_diff`. - /// This can be used to compare if two 3x4 matrices contain similar elements. It works - /// best when comparing with a known value. The `max_abs_diff` that should be used used - /// depends on the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: daffine3, rhs: daffine3, max-abs-diff: f64) -> bool; - /// Creates an affine transformation from the given 3D `translation`. - from-translation: func(translation: dvec3) -> daffine3; - /// Creates an affine transform from the given 3D `scale`, `rotation` and - /// `translation`. - /// Equivalent to `DAffine3::from_translation(translation) * - /// DAffine3::from_quat(rotation) * DAffine3::from_scale(scale)` - from-scale-rotation-translation: func(scale: dvec3, rotation: dquat, translation: dvec3) -> daffine3; - /// Creates an affine transform that changes scale. - /// Note that if any scale is zero the transform will be non-invertible. - from-scale: func(scale: dvec3) -> daffine3; - /// Creates a left-handed view transform using a camera position, an up direction, and a facing - /// direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - look-to-lh: func(eye: dvec3, dir: dvec3, up: dvec3) -> daffine3; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: daffine3) -> bool; - mul: func(p0: daffine3, p1: dmat4) -> dmat4; - /// Creates a right-handed view transform using a camera position, an up direction, and a focal - /// point. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-rh: func(eye: dvec3, center: dvec3, up: dvec3) -> daffine3; - /// Creates an affine transform containing a 3D rotation around the x axis of - /// `angle` (in radians). - from-rotation-x: func(angle: f64) -> daffine3; - /// Creates a `[[f64; 3]; 4]` 3D array storing data in - /// column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array-2d: func(self: daffine3) -> list>; - mul: func(p0: daffine3, p1: daffine3) -> daffine3; - /// Transforms the given 3D points, applying shear, scale, rotation and translation. - transform-point3: func(self: daffine3, rhs: dvec3) -> dvec3; - /// Casts all elements of `self` to `f32`. - as-affine3a: func(self: daffine3) -> affine3-a; - /// Returns `true` if, and only if, all elements are finite. - /// If any element is either `NaN`, positive or negative infinity, this will return - /// `false`. - is-finite: func(self: daffine3) -> bool; - /// Creates an affine transform from a 3x3 matrix (expressing scale, shear and rotation) - /// and a translation vector. - /// Equivalent to `DAffine3::from_translation(translation) * DAffine3::from_mat3(mat3)` - from-mat3-translation: func(mat3: dmat3, translation: dvec3) -> daffine3; - /// Transforms the given 3D vector, applying shear, scale and rotation (but NOT - /// translation). - /// To also apply translation, use [`Self::transform_point3()`] instead. - transform-vector3: func(self: daffine3, rhs: dvec3) -> dvec3; - mul: func(self: daffine3, rhs: daffine3) -> daffine3; - clone: func(self: daffine3) -> daffine3; - /// The given `DMat4` must be an affine transform, - /// i.e. contain no perspective transform. - from-mat4: func(m: dmat4) -> daffine3; - /// Creates an affine transform from the given 3D `rotation` and `translation`. - /// Equivalent to `DAffine3::from_translation(translation) * DAffine3::from_quat(rotation)` - from-rotation-translation: func(rotation: dquat, translation: dvec3) -> daffine3; - /// Creates a right-handed view transform using a camera position, an up direction, and a facing - /// direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - look-to-rh: func(eye: dvec3, dir: dvec3, up: dvec3) -> daffine3; - /// Return the inverse of this transform. - /// Note that if the transform is not invertible the result will be invalid. - inverse: func(self: daffine3) -> daffine3; - /// Creates an affine transform from the given `rotation` quaternion. - from-quat: func(rotation: dquat) -> daffine3; - /// Creates an affine transform containing a 3D rotation around a normalized - /// rotation `axis` of `angle` (in radians). - from-axis-angle: func(axis: dvec3, angle: f64) -> daffine3; - /// Creates an affine transform from a 3x3 matrix (expressing scale, shear and - /// rotation) - from-mat3: func(mat3: dmat3) -> daffine3; - /// Creates an affine transform from three column vectors. - from-cols: func(x-axis: dvec3, y-axis: dvec3, z-axis: dvec3, w-axis: dvec3) -> daffine3; - /// Creates a left-handed view transform using a camera position, an up direction, and a focal - /// point. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-lh: func(eye: dvec3, center: dvec3, up: dvec3) -> daffine3; - eq: func(self: daffine3, rhs: daffine3) -> bool; - mul: func(p0: daffine3, p1: dmat4) -> dmat4; - /// Creates an affine transform containing a 3D rotation around the y axis of - /// `angle` (in radians). - from-rotation-y: func(angle: f64) -> daffine3; -} - -/// Methods for DMat2 -interface dmat2 { - use types.{reflect-reference}; - - /// Adds two 2x2 matrices. - add-mat2: func(self: dmat2, rhs: dmat2) -> dmat2; - sub: func(p0: dmat2, p1: dmat2) -> dmat2; - mul: func(self: dmat2, rhs: dmat2) -> dmat2; - /// Multiplies a 2x2 matrix by a scalar. - mul-scalar: func(self: dmat2, rhs: f64) -> dmat2; - /// Takes the absolute value of each element in `self` - abs: func(self: dmat2) -> dmat2; - /// Returns true if the absolute difference of all elements between `self` and `rhs` - /// is less than or equal to `max_abs_diff`. - /// This can be used to compare if two matrices contain similar elements. It works best - /// when comparing with a known value. The `max_abs_diff` that should be used used - /// depends on the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: dmat2, rhs: dmat2, max-abs-diff: f64) -> bool; - /// Subtracts two 2x2 matrices. - sub-mat2: func(self: dmat2, rhs: dmat2) -> dmat2; - add: func(p0: dmat2, p1: dmat2) -> dmat2; - mul: func(p0: dmat2, p1: dvec2) -> dvec2; - clone: func(self: dmat2) -> dmat2; - /// Multiplies two 2x2 matrices. - mul-mat2: func(self: dmat2, rhs: dmat2) -> dmat2; - /// Creates a 2x2 matrix containing the combining non-uniform `scale` and rotation of - /// `angle` (in radians). - from-scale-angle: func(scale: dvec2, angle: f64) -> dmat2; - /// Returns the transpose of `self`. - transpose: func(self: dmat2) -> dmat2; - /// Creates a 2x2 matrix containing a rotation of `angle` (in radians). - from-angle: func(angle: f64) -> dmat2; - /// Returns the matrix row for the given `index`. - /// # Panics - /// Panics if `index` is greater than 1. - row: func(self: dmat2, index: u64) -> dvec2; - /// Creates a `[[f64; 2]; 2]` 2D array storing data in column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array-2d: func(self: dmat2) -> list>; - mul: func(p0: dmat2, p1: dvec2) -> dvec2; - sub: func(self: dmat2, rhs: dmat2) -> dmat2; - /// Transforms a 2D vector. - mul-vec2: func(self: dmat2, rhs: dvec2) -> dvec2; - /// Creates a 2x2 matrix from a 3x3 matrix, discarding the 2nd row and column. - from-mat3: func(m: dmat3) -> dmat2; - div: func(self: dmat2, rhs: f64) -> dmat2; - /// Returns the inverse of `self`. - /// If the matrix is not invertible the returned matrix will be invalid. - /// # Panics - /// Will panic if the determinant of `self` is zero when `glam_assert` is enabled. - inverse: func(self: dmat2) -> dmat2; - /// Creates a `[f64; 4]` array storing data in column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array: func(self: dmat2) -> list; - /// Creates a 2x2 matrix from two column vectors. - from-cols: func(x-axis: dvec2, y-axis: dvec2) -> dmat2; - neg: func(self: dmat2) -> dmat2; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: dmat2) -> bool; - as-mat2: func(self: dmat2) -> mat2; - /// Returns the determinant of `self`. - determinant: func(self: dmat2) -> f64; - mul: func(p0: dmat2, p1: f64) -> dmat2; - /// Returns `true` if, and only if, all elements are finite. - /// If any element is either `NaN`, positive or negative infinity, this will return `false`. - is-finite: func(self: dmat2) -> bool; - /// Creates a 2x2 matrix with its diagonal set to `diagonal` and all other entries set to 0. - from-diagonal: func(diagonal: dvec2) -> dmat2; - /// Creates a 2x2 matrix from the minor of the given 3x3 matrix, discarding the `i`th column - /// and `j`th row. - /// # Panics - /// Panics if `i` or `j` is greater than 2. - from-mat3-minor: func(m: dmat3, i: u64, j: u64) -> dmat2; - mul: func(p0: dmat2, p1: dmat2) -> dmat2; - eq: func(self: dmat2, rhs: dmat2) -> bool; - add: func(self: dmat2, rhs: dmat2) -> dmat2; - /// Returns the matrix column for the given `index`. - /// # Panics - /// Panics if `index` is greater than 1. - col: func(self: dmat2, index: u64) -> dvec2; - /// Divides a 2x2 matrix by a scalar. - div-scalar: func(self: dmat2, rhs: f64) -> dmat2; -} - -/// Methods for DMat3 -interface dmat3 { - use types.{reflect-reference}; - - /// Returns the inverse of `self`. - /// If the matrix is not invertible the returned matrix will be invalid. - /// # Panics - /// Will panic if the determinant of `self` is zero when `glam_assert` is enabled. - inverse: func(self: dmat3) -> dmat3; - /// Creates a 3D rotation matrix from `angle` (in radians) around the x axis. - from-rotation-x: func(angle: f64) -> dmat3; - mul: func(p0: dmat3, p1: daffine2) -> dmat3; - /// Creates a `[[f64; 3]; 3]` 3D array storing data in column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array-2d: func(self: dmat3) -> list>; - mul: func(p0: dmat3, p1: dmat3) -> dmat3; - /// Returns true if the absolute difference of all elements between `self` and `rhs` - /// is less than or equal to `max_abs_diff`. - /// This can be used to compare if two matrices contain similar elements. It works best - /// when comparing with a known value. The `max_abs_diff` that should be used used - /// depends on the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: dmat3, rhs: dmat3, max-abs-diff: f64) -> bool; - /// Multiplies a 3x3 matrix by a scalar. - mul-scalar: func(self: dmat3, rhs: f64) -> dmat3; - eq: func(self: dmat3, rhs: dmat3) -> bool; - /// Creates a 3D rotation matrix from `angle` (in radians) around the z axis. - from-rotation-z: func(angle: f64) -> dmat3; - sub: func(self: dmat3, rhs: dmat3) -> dmat3; - /// Creates a right-handed view matrix using a facing direction and an up direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - /// # Panics - /// Will panic if `dir` or `up` are not normalized when `glam_assert` is enabled. - look-to-rh: func(dir: dvec3, up: dvec3) -> dmat3; - /// Creates a 3D rotation matrix from the given quaternion. - /// # Panics - /// Will panic if `rotation` is not normalized when `glam_assert` is enabled. - from-quat: func(rotation: dquat) -> dmat3; - /// Creates a 3x3 matrix from a 4x4 matrix, discarding the 4th row and column. - from-mat4: func(m: dmat4) -> dmat3; - /// Returns the matrix column for the given `index`. - /// # Panics - /// Panics if `index` is greater than 2. - col: func(self: dmat3, index: u64) -> dvec3; - /// Creates an affine transformation matrix from the given 2D rotation `angle` (in - /// radians). - /// The resulting matrix can be used to transform 2D points and vectors. See - /// [`Self::transform_point2()`] and [`Self::transform_vector2()`]. - from-angle: func(angle: f64) -> dmat3; - /// Creates a 3D rotation matrix from the given euler rotation sequence and the angles (in - /// radians). - from-euler: func(order: euler-rot, a: f64, b: f64, c: f64) -> dmat3; - /// Creates a `[f64; 9]` array storing data in column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array: func(self: dmat3) -> list; - /// Creates an affine transformation matrix from the given 2D `scale`, rotation `angle` (in - /// radians) and `translation`. - /// The resulting matrix can be used to transform 2D points and vectors. See - /// [`Self::transform_point2()`] and [`Self::transform_vector2()`]. - from-scale-angle-translation: func(scale: dvec2, angle: f64, translation: dvec2) -> dmat3; - /// Rotates the given 2D vector. - /// This is the equivalent of multiplying `rhs` as a 3D vector where `z` is `0`. - /// This method assumes that `self` contains a valid affine transform. - /// # Panics - /// Will panic if the 2nd row of `self` is not `(0, 0, 1)` when `glam_assert` is enabled. - transform-vector2: func(self: dmat3, rhs: dvec2) -> dvec2; - /// Creates a left-handed view matrix using a facing direction and an up direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - /// # Panics - /// Will panic if `dir` or `up` are not normalized when `glam_assert` is enabled. - look-to-lh: func(dir: dvec3, up: dvec3) -> dmat3; - mul: func(self: dmat3, rhs: daffine2) -> dmat3; - /// Creates a 3x3 matrix from the minor of the given 4x4 matrix, discarding the `i`th column - /// and `j`th row. - /// # Panics - /// Panics if `i` or `j` is greater than 3. - from-mat4-minor: func(m: dmat4, i: u64, j: u64) -> dmat3; - add: func(self: dmat3, rhs: dmat3) -> dmat3; - /// Creates a 3x3 matrix with its diagonal set to `diagonal` and all other entries set to 0. - from-diagonal: func(diagonal: dvec3) -> dmat3; - div: func(self: dmat3, rhs: f64) -> dmat3; - /// Creates a 3D rotation matrix from a normalized rotation `axis` and `angle` (in - /// radians). - /// # Panics - /// Will panic if `axis` is not normalized when `glam_assert` is enabled. - from-axis-angle: func(axis: dvec3, angle: f64) -> dmat3; - /// Adds two 3x3 matrices. - add-mat3: func(self: dmat3, rhs: dmat3) -> dmat3; - clone: func(self: dmat3) -> dmat3; - /// Creates an affine transformation matrix from the given non-uniform 2D `scale`. - /// The resulting matrix can be used to transform 2D points and vectors. See - /// [`Self::transform_point2()`] and [`Self::transform_vector2()`]. - /// # Panics - /// Will panic if all elements of `scale` are zero when `glam_assert` is enabled. - from-scale: func(scale: dvec2) -> dmat3; - /// Creates a 3x3 matrix from three column vectors. - from-cols: func(x-axis: dvec3, y-axis: dvec3, z-axis: dvec3) -> dmat3; - /// Returns the determinant of `self`. - determinant: func(self: dmat3) -> f64; - add: func(p0: dmat3, p1: dmat3) -> dmat3; - mul: func(p0: dmat3, p1: dvec3) -> dvec3; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: dmat3) -> bool; - as-mat3: func(self: dmat3) -> mat3; - /// Creates a right-handed view matrix using a camera position, a focal point and an up - /// direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-rh: func(eye: dvec3, center: dvec3, up: dvec3) -> dmat3; - /// Transforms the given 2D vector as a point. - /// This is the equivalent of multiplying `rhs` as a 3D vector where `z` is `1`. - /// This method assumes that `self` contains a valid affine transform. - /// # Panics - /// Will panic if the 2nd row of `self` is not `(0, 0, 1)` when `glam_assert` is enabled. - transform-point2: func(self: dmat3, rhs: dvec2) -> dvec2; - /// Returns the matrix row for the given `index`. - /// # Panics - /// Panics if `index` is greater than 2. - row: func(self: dmat3, index: u64) -> dvec3; - /// Extract Euler angles with the given Euler rotation order. - /// Note if the input matrix contains scales, shears, or other non-rotation transformations then - /// the resulting Euler angles will be ill-defined. - /// # Panics - /// Will panic if any input matrix column is not normalized when `glam_assert` is enabled. - to-euler: func(self: dmat3, order: euler-rot) -> tuple; - /// Creates a left-handed view matrix using a camera position, a focal point and an up - /// direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-lh: func(eye: dvec3, center: dvec3, up: dvec3) -> dmat3; - /// Takes the absolute value of each element in `self` - abs: func(self: dmat3) -> dmat3; - mul: func(p0: dmat3, p1: f64) -> dmat3; - neg: func(self: dmat3) -> dmat3; - /// Returns the transpose of `self`. - transpose: func(self: dmat3) -> dmat3; - /// Creates an affine transformation matrix from the given 2x2 matrix. - /// The resulting matrix can be used to transform 2D points and vectors. See - /// [`Self::transform_point2()`] and [`Self::transform_vector2()`]. - from-mat2: func(m: dmat2) -> dmat3; - /// Creates an affine transformation matrix from the given 2D `translation`. - /// The resulting matrix can be used to transform 2D points and vectors. See - /// [`Self::transform_point2()`] and [`Self::transform_vector2()`]. - from-translation: func(translation: dvec2) -> dmat3; - /// Multiplies two 3x3 matrices. - mul-mat3: func(self: dmat3, rhs: dmat3) -> dmat3; - mul: func(p0: dmat3, p1: dmat3) -> dmat3; - /// Divides a 3x3 matrix by a scalar. - div-scalar: func(self: dmat3, rhs: f64) -> dmat3; - /// Transforms a 3D vector. - mul-vec3: func(self: dmat3, rhs: dvec3) -> dvec3; - /// Returns `true` if, and only if, all elements are finite. - /// If any element is either `NaN`, positive or negative infinity, this will return `false`. - is-finite: func(self: dmat3) -> bool; - mul: func(p0: dmat3, p1: dvec3) -> dvec3; - sub: func(p0: dmat3, p1: dmat3) -> dmat3; - /// Creates a 3D rotation matrix from `angle` (in radians) around the y axis. - from-rotation-y: func(angle: f64) -> dmat3; - /// Subtracts two 3x3 matrices. - sub-mat3: func(self: dmat3, rhs: dmat3) -> dmat3; -} - -/// Methods for DMat4 -interface dmat4 { - use types.{reflect-reference}; - - /// Creates a left-handed perspective projection matrix with `[0,1]` depth range. - /// # Panics - /// Will panic if `z_near` or `z_far` are less than or equal to zero when `glam_assert` is - /// enabled. - frustum-lh: func(left: f64, right: f64, bottom: f64, top: f64, z-near: f64, z-far: f64) -> dmat4; - /// Subtracts two 4x4 matrices. - sub-mat4: func(self: dmat4, rhs: dmat4) -> dmat4; - /// Returns the transpose of `self`. - transpose: func(self: dmat4) -> dmat4; - mul: func(self: dmat4, rhs: daffine3) -> dmat4; - neg: func(self: dmat4) -> dmat4; - /// Creates a right-handed perspective projection matrix with `[0,1]` depth range. - /// Useful to map the standard right-handed coordinate system into what WebGPU/Metal/Direct3D expect. - /// # Panics - /// Will panic if `z_near` or `z_far` are less than or equal to zero when `glam_assert` is - /// enabled. - perspective-rh: func(fov-y-radians: f64, aspect-ratio: f64, z-near: f64, z-far: f64) -> dmat4; - /// Transforms a 4D vector. - mul-vec4: func(self: dmat4, rhs: dvec4) -> dvec4; - /// Returns the determinant of `self`. - determinant: func(self: dmat4) -> f64; - /// Returns `true` if, and only if, all elements are finite. - /// If any element is either `NaN`, positive or negative infinity, this will return `false`. - is-finite: func(self: dmat4) -> bool; - mul: func(p0: dmat4, p1: dmat4) -> dmat4; - mul: func(p0: dmat4, p1: dvec4) -> dvec4; - /// Returns the matrix row for the given `index`. - /// # Panics - /// Panics if `index` is greater than 3. - row: func(self: dmat4, index: u64) -> dvec4; - /// Transforms the give 3D vector as a direction. - /// This is the equivalent of multiplying the 3D vector as a 4D vector where `w` is - /// `0.0`. - /// This method assumes that `self` contains a valid affine transform. - /// # Panics - /// Will panic if the 3rd row of `self` is not `(0, 0, 0, 1)` when `glam_assert` is enabled. - transform-vector3: func(self: dmat4, rhs: dvec3) -> dvec3; - /// Creates a right-handed perspective projection matrix with [-1,1] depth range. - /// This is the same as the OpenGL `glFrustum` function. - /// See - frustum-rh-gl: func(left: f64, right: f64, bottom: f64, top: f64, z-near: f64, z-far: f64) -> dmat4; - /// Creates a left-handed perspective projection matrix with `[0,1]` depth range. - /// Useful to map the standard left-handed coordinate system into what WebGPU/Metal/Direct3D expect. - /// # Panics - /// Will panic if `z_near` or `z_far` are less than or equal to zero when `glam_assert` is - /// enabled. - perspective-lh: func(fov-y-radians: f64, aspect-ratio: f64, z-near: f64, z-far: f64) -> dmat4; - /// Creates a `[f64; 16]` array storing data in column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array: func(self: dmat4) -> list; - /// Creates a left-handed view matrix using a camera position, a facing direction and an up - /// direction - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - /// # Panics - /// Will panic if `dir` or `up` are not normalized when `glam_assert` is enabled. - look-to-lh: func(eye: dvec3, dir: dvec3, up: dvec3) -> dmat4; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: dmat4) -> bool; - /// Creates an affine transformation matrix from the given 3D `translation`. - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - /// # Panics - /// Will panic if `rotation` is not normalized when `glam_assert` is enabled. - from-rotation-translation: func(rotation: dquat, translation: dvec3) -> dmat4; - /// Creates an affine transformation matrix containing a 3D rotation around the z axis of - /// `angle` (in radians). - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - from-rotation-z: func(angle: f64) -> dmat4; - /// Returns true if the absolute difference of all elements between `self` and `rhs` - /// is less than or equal to `max_abs_diff`. - /// This can be used to compare if two matrices contain similar elements. It works best - /// when comparing with a known value. The `max_abs_diff` that should be used used - /// depends on the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: dmat4, rhs: dmat4, max-abs-diff: f64) -> bool; - eq: func(self: dmat4, rhs: dmat4) -> bool; - /// Creates a affine transformation matrix containing a rotation from the given euler - /// rotation sequence and angles (in radians). - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - from-euler: func(order: euler-rot, a: f64, b: f64, c: f64) -> dmat4; - /// Creates a 4x4 matrix with its diagonal set to `diagonal` and all other entries set to 0. - from-diagonal: func(diagonal: dvec4) -> dmat4; - /// Creates an affine transformation matrix containing a 3D rotation around the y axis of - /// `angle` (in radians). - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - from-rotation-y: func(angle: f64) -> dmat4; - /// Creates a right-handed perspective projection matrix with `[0,1]` depth range. - /// # Panics - /// Will panic if `z_near` or `z_far` are less than or equal to zero when `glam_assert` is - /// enabled. - frustum-rh: func(left: f64, right: f64, bottom: f64, top: f64, z-near: f64, z-far: f64) -> dmat4; - /// Creates a right-handed view matrix using a camera position, a focal point, and an up - /// direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-rh: func(eye: dvec3, center: dvec3, up: dvec3) -> dmat4; - sub: func(self: dmat4, rhs: dmat4) -> dmat4; - /// Divides a 4x4 matrix by a scalar. - div-scalar: func(self: dmat4, rhs: f64) -> dmat4; - /// Creates a `[[f64; 4]; 4]` 4D array storing data in column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array-2d: func(self: dmat4) -> list>; - /// Creates an infinite reverse left-handed perspective projection matrix with `[0,1]` depth range. - /// Similar to `perspective_infinite_lh`, but maps `Z = z_near` to a depth of `1` and `Z = infinity` to a depth of `0`. - /// # Panics - /// Will panic if `z_near` is less than or equal to zero when `glam_assert` is enabled. - perspective-infinite-reverse-lh: func(fov-y-radians: f64, aspect-ratio: f64, z-near: f64) -> dmat4; - div: func(self: dmat4, rhs: f64) -> dmat4; - mul: func(p0: dmat4, p1: daffine3) -> dmat4; - /// Creates a left-handed view matrix using a camera position, a focal points and an up - /// direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-lh: func(eye: dvec3, center: dvec3, up: dvec3) -> dmat4; - as-mat4: func(self: dmat4) -> mat4; - clone: func(self: dmat4) -> dmat4; - /// Creates an affine transformation matrix from the given 3D `scale`, `rotation` and - /// `translation`. - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - /// # Panics - /// Will panic if `rotation` is not normalized when `glam_assert` is enabled. - from-scale-rotation-translation: func(scale: dvec3, rotation: dquat, translation: dvec3) -> dmat4; - /// Creates an affine transformation matrics from a 3x3 matrix (expressing scale, shear and - /// rotation) and a translation vector. - /// Equivalent to `DMat4::from_translation(translation) * DMat4::from_mat3(mat3)` - from-mat3-translation: func(mat3: dmat3, translation: dvec3) -> dmat4; - mul: func(p0: dmat4, p1: dmat4) -> dmat4; - /// Creates an affine transformation matrix containing a 3D rotation around the x axis of - /// `angle` (in radians). - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - from-rotation-x: func(angle: f64) -> dmat4; - /// Creates a right-handed perspective projection matrix with `[-1,1]` depth range. - /// Useful to map the standard right-handed coordinate system into what OpenGL expects. - /// This is the same as the OpenGL `gluPerspective` function. - /// See - perspective-rh-gl: func(fov-y-radians: f64, aspect-ratio: f64, z-near: f64, z-far: f64) -> dmat4; - /// Creates an affine transformation matrix containing a 3D rotation around a normalized - /// rotation `axis` of `angle` (in radians). - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - /// # Panics - /// Will panic if `axis` is not normalized when `glam_assert` is enabled. - from-axis-angle: func(axis: dvec3, angle: f64) -> dmat4; - /// Extract Euler angles with the given Euler rotation order. - /// Note if the upper 3x3 matrix contain scales, shears, or other non-rotation transformations - /// then the resulting Euler angles will be ill-defined. - /// # Panics - /// Will panic if any column of the upper 3x3 rotation matrix is not normalized when - /// `glam_assert` is enabled. - to-euler: func(self: dmat4, order: euler-rot) -> tuple; - /// Transforms the given 3D vector as a point. - /// This is the equivalent of multiplying the 3D vector as a 4D vector where `w` is - /// `1.0`. - /// This method assumes that `self` contains a valid affine transform. It does not perform - /// a perspective divide, if `self` contains a perspective transform, or if you are unsure, - /// the [`Self::project_point3()`] method should be used instead. - /// # Panics - /// Will panic if the 3rd row of `self` is not `(0, 0, 0, 1)` when `glam_assert` is enabled. - transform-point3: func(self: dmat4, rhs: dvec3) -> dvec3; - /// Takes the absolute value of each element in `self` - abs: func(self: dmat4) -> dmat4; - /// Returns the matrix column for the given `index`. - /// # Panics - /// Panics if `index` is greater than 3. - col: func(self: dmat4, index: u64) -> dvec4; - /// Creates an affine transformation matrix from the given `rotation` quaternion. - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - /// # Panics - /// Will panic if `rotation` is not normalized when `glam_assert` is enabled. - from-quat: func(rotation: dquat) -> dmat4; - /// Creates a right-handed view matrix using a camera position, a facing direction, and an up - /// direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - /// # Panics - /// Will panic if `dir` or `up` are not normalized when `glam_assert` is enabled. - look-to-rh: func(eye: dvec3, dir: dvec3, up: dvec3) -> dmat4; - /// Returns the inverse of `self`. - /// If the matrix is not invertible the returned matrix will be invalid. - /// # Panics - /// Will panic if the determinant of `self` is zero when `glam_assert` is enabled. - inverse: func(self: dmat4) -> dmat4; - /// Creates an infinite left-handed perspective projection matrix with `[0,1]` depth range. - /// Like `perspective_lh`, but with an infinite value for `z_far`. - /// The result is that points near `z_near` are mapped to depth `0`, and as they move towards infinity the depth approaches `1`. - /// # Panics - /// Will panic if `z_near` or `z_far` are less than or equal to zero when `glam_assert` is - /// enabled. - perspective-infinite-lh: func(fov-y-radians: f64, aspect-ratio: f64, z-near: f64) -> dmat4; - /// Adds two 4x4 matrices. - add-mat4: func(self: dmat4, rhs: dmat4) -> dmat4; - mul: func(p0: dmat4, p1: dvec4) -> dvec4; - /// Multiplies a 4x4 matrix by a scalar. - mul-scalar: func(self: dmat4, rhs: f64) -> dmat4; - /// Creates an affine transformation matrix from the given 3D `translation`. - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - from-translation: func(translation: dvec3) -> dmat4; - /// Creates a left-handed orthographic projection matrix with `[0,1]` depth range. - /// Useful to map a left-handed coordinate system to the normalized device coordinates that WebGPU/Direct3D/Metal expect. - orthographic-lh: func(left: f64, right: f64, bottom: f64, top: f64, near: f64, far: f64) -> dmat4; - add: func(p0: dmat4, p1: dmat4) -> dmat4; - /// Creates an infinite reverse right-handed perspective projection matrix with `[0,1]` depth range. - /// Similar to `perspective_infinite_rh`, but maps `Z = z_near` to a depth of `1` and `Z = infinity` to a depth of `0`. - /// # Panics - /// Will panic if `z_near` is less than or equal to zero when `glam_assert` is enabled. - perspective-infinite-reverse-rh: func(fov-y-radians: f64, aspect-ratio: f64, z-near: f64) -> dmat4; - /// Creates an affine transformation matrix containing the given 3D non-uniform `scale`. - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - /// # Panics - /// Will panic if all elements of `scale` are zero when `glam_assert` is enabled. - from-scale: func(scale: dvec3) -> dmat4; - /// Creates a right-handed orthographic projection matrix with `[0,1]` depth range. - /// Useful to map a right-handed coordinate system to the normalized device coordinates that WebGPU/Direct3D/Metal expect. - orthographic-rh: func(left: f64, right: f64, bottom: f64, top: f64, near: f64, far: f64) -> dmat4; - /// Creates a right-handed orthographic projection matrix with `[-1,1]` depth - /// range. This is the same as the OpenGL `glOrtho` function in OpenGL. - /// See - /// - /// Useful to map a right-handed coordinate system to the normalized device coordinates that OpenGL expects. - orthographic-rh-gl: func(left: f64, right: f64, bottom: f64, top: f64, near: f64, far: f64) -> dmat4; - sub: func(p0: dmat4, p1: dmat4) -> dmat4; - /// Creates a 4x4 matrix from four column vectors. - from-cols: func(x-axis: dvec4, y-axis: dvec4, z-axis: dvec4, w-axis: dvec4) -> dmat4; - mul: func(p0: dmat4, p1: f64) -> dmat4; - /// Multiplies two 4x4 matrices. - mul-mat4: func(self: dmat4, rhs: dmat4) -> dmat4; - /// Transforms the given 3D vector as a point, applying perspective correction. - /// This is the equivalent of multiplying the 3D vector as a 4D vector where `w` is `1.0`. - /// The perspective divide is performed meaning the resulting 3D vector is divided by `w`. - /// This method assumes that `self` contains a projective transform. - project-point3: func(self: dmat4, rhs: dvec3) -> dvec3; - add: func(self: dmat4, rhs: dmat4) -> dmat4; - /// Creates an infinite right-handed perspective projection matrix with `[0,1]` depth range. - /// Like `perspective_rh`, but with an infinite value for `z_far`. - /// The result is that points near `z_near` are mapped to depth `0`, and as they move towards infinity the depth approaches `1`. - /// # Panics - /// Will panic if `z_near` or `z_far` are less than or equal to zero when `glam_assert` is - /// enabled. - perspective-infinite-rh: func(fov-y-radians: f64, aspect-ratio: f64, z-near: f64) -> dmat4; - /// Creates an affine transformation matrix from the given 3x3 linear transformation - /// matrix. - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - from-mat3: func(m: dmat3) -> dmat4; -} - -/// Methods for DQuat -interface dquat { - use types.{reflect-reference}; - - /// Gets the minimal rotation for transforming `from` to either `to` or `-to`. This means - /// that the resulting quaternion will rotate `from` so that it is colinear with `to`. - /// The rotation is in the plane spanned by the two vectors. Will rotate at most 90 - /// degrees. - /// The inputs must be unit vectors. - /// `to.dot(from_rotation_arc_colinear(from, to) * from).abs() ≈ 1`. - /// # Panics - /// Will panic if `from` or `to` are not normalized when `glam_assert` is enabled. - from-rotation-arc-colinear: func(froma: dvec3, toa: dvec3) -> dquat; - /// Divides a quaternion by a scalar value. - /// The quotient is not guaranteed to be normalized. - div: func(self: dquat, rhs: f64) -> dquat; - add: func(self: dquat, rhs: dquat) -> dquat; - /// Creates a rotation quaternion from an array. - /// # Preconditions - /// This function does not check if the input is normalized, it is up to the user to - /// provide normalized input or to normalized the resulting quaternion. - from-array: func(a: list) -> dquat; - mul: func(self: dquat, rhs: dquat) -> dquat; - /// Multiplies two quaternions. If they each represent a rotation, the result will - /// represent the combined rotation. - /// Note that due to floating point rounding the result may not be perfectly normalized. - /// # Panics - /// Will panic if `self` or `rhs` are not normalized when `glam_assert` is enabled. - mul-quat: func(self: dquat, rhs: dquat) -> dquat; - /// Creates a quaternion from a 3x3 rotation matrix. - /// Note if the input matrix contain scales, shears, or other non-rotation transformations then - /// the resulting quaternion will be ill-defined. - /// # Panics - /// Will panic if any input matrix column is not normalized when `glam_assert` is enabled. - from-mat3: func(mat: dmat3) -> dquat; - /// Creates a quaternion from the `angle` (in radians) around the z axis. - from-rotation-z: func(angle: f64) -> dquat; - /// Returns `self` normalized to length 1.0. - /// For valid results, `self` must _not_ be of length zero. - /// Panics - /// Will panic if `self` is zero length when `glam_assert` is enabled. - normalize: func(self: dquat) -> dquat; - neg: func(self: dquat) -> dquat; - /// Gets the minimal rotation for transforming `from` to `to`. The rotation is in the - /// plane spanned by the two vectors. Will rotate at most 180 degrees. - /// The inputs must be unit vectors. - /// `from_rotation_arc(from, to) * from ≈ to`. - /// For near-singular cases (from≈to and from≈-to) the current implementation - /// is only accurate to about 0.001 (for `f32`). - /// # Panics - /// Will panic if `from` or `to` are not normalized when `glam_assert` is enabled. - from-rotation-arc: func(froma: dvec3, toa: dvec3) -> dquat; - /// Creates a quaternion from the upper 3x3 rotation matrix inside a homogeneous 4x4 matrix. - /// Note if the upper 3x3 matrix contain scales, shears, or other non-rotation transformations - /// then the resulting quaternion will be ill-defined. - /// # Panics - /// Will panic if any column of the upper 3x3 rotation matrix is not normalized when - /// `glam_assert` is enabled. - from-mat4: func(mat: dmat4) -> dquat; - /// Computes the squared length of `self`. - /// This is generally faster than `length()` as it avoids a square - /// root operation. - length-squared: func(self: dquat) -> f64; - /// Returns the angle (in radians) for the minimal rotation - /// for transforming this quaternion into another. - /// Both quaternions must be normalized. - /// # Panics - /// Will panic if `self` or `rhs` are not normalized when `glam_assert` is enabled. - angle-between: func(self: dquat, rhs: dquat) -> f64; - /// Returns the vector part of the quaternion. - xyz: func(self: dquat) -> dvec3; - /// Returns true if the absolute difference of all elements between `self` and `rhs` - /// is less than or equal to `max_abs_diff`. - /// This can be used to compare if two quaternions contain similar elements. It works - /// best when comparing with a known value. The `max_abs_diff` that should be used used - /// depends on the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: dquat, rhs: dquat, max-abs-diff: f64) -> bool; - /// Creates a quaternion from the `angle` (in radians) around the x axis. - from-rotation-x: func(angle: f64) -> dquat; - /// Returns the quaternion conjugate of `self`. For a unit quaternion the - /// conjugate is also the inverse. - conjugate: func(self: dquat) -> dquat; - /// Create a quaternion that rotates `v.length()` radians around `v.normalize()`. - /// `from_scaled_axis(Vec3::ZERO)` results in the identity quaternion. - from-scaled-axis: func(v: dvec3) -> dquat; - /// Creates a quaternion from a 3x3 rotation matrix inside a 3D affine transform. - /// Note if the input affine matrix contain scales, shears, or other non-rotation - /// transformations then the resulting quaternion will be ill-defined. - /// # Panics - /// Will panic if any input affine matrix column is not normalized when `glam_assert` is - /// enabled. - from-affine3: func(a: daffine3) -> dquat; - is-near-identity: func(self: dquat) -> bool; - /// Returns whether `self` of length `1.0` or not. - /// Uses a precision threshold of `1e-6`. - is-normalized: func(self: dquat) -> bool; - mul: func(p0: dquat, p1: dvec3) -> dvec3; - /// Returns the rotation axis scaled by the rotation in radians. - to-scaled-axis: func(self: dquat) -> dvec3; - /// Returns the rotation angles for the given euler rotation sequence. - to-euler: func(self: dquat, order: euler-rot) -> tuple; - /// Computes the dot product of `self` and `rhs`. The dot product is - /// equal to the cosine of the angle between two quaternion rotations. - dot: func(self: dquat, rhs: dquat) -> f64; - mul: func(p0: dquat, p1: dquat) -> dquat; - /// Computes the length of `self`. - length: func(self: dquat) -> f64; - /// Rotates towards `rhs` up to `max_angle` (in radians). - /// When `max_angle` is `0.0`, the result will be equal to `self`. When `max_angle` is equal to - /// `self.angle_between(rhs)`, the result will be equal to `rhs`. If `max_angle` is negative, - /// rotates towards the exact opposite of `rhs`. Will not go past the target. - /// Both quaternions must be normalized. - /// # Panics - /// Will panic if `self` or `rhs` are not normalized when `glam_assert` is enabled. - rotate-towards: func(self: dquat, rhs: dquat, max-angle: f64) -> dquat; - sub: func(p0: dquat, p1: dquat) -> dquat; - /// Returns `true` if any elements are `NAN`. - is-nan: func(self: dquat) -> bool; - mul: func(p0: dquat, p1: dvec3) -> dvec3; - /// Returns `true` if, and only if, all elements are finite. - /// If any element is either `NaN`, positive or negative infinity, this will return `false`. - is-finite: func(self: dquat) -> bool; - /// Creates a new rotation quaternion from a 4D vector. - /// # Preconditions - /// This function does not check if the input is normalized, it is up to the user to - /// provide normalized input or to normalized the resulting quaternion. - from-vec4: func(v: dvec4) -> dquat; - /// Computes `1.0 / length()`. - /// For valid results, `self` must _not_ be of length zero. - length-recip: func(self: dquat) -> f64; - /// Create a quaternion for a normalized rotation `axis` and `angle` (in radians). - /// The axis must be a unit vector. - /// # Panics - /// Will panic if `axis` is not normalized when `glam_assert` is enabled. - from-axis-angle: func(axis: dvec3, angle: f64) -> dquat; - sub: func(self: dquat, rhs: dquat) -> dquat; - /// Returns the inverse of a normalized quaternion. - /// Typically quaternion inverse returns the conjugate of a normalized quaternion. - /// Because `self` is assumed to already be unit length this method *does not* normalize - /// before returning the conjugate. - /// # Panics - /// Will panic if `self` is not normalized when `glam_assert` is enabled. - inverse: func(self: dquat) -> dquat; - eq: func(self: dquat, rhs: dquat) -> bool; - /// Performs a linear interpolation between `self` and `rhs` based on - /// the value `s`. - /// When `s` is `0.0`, the result will be equal to `self`. When `s` - /// is `1.0`, the result will be equal to `rhs`. - /// # Panics - /// Will panic if `self` or `end` are not normalized when `glam_assert` is enabled. - lerp: func(self: dquat, end: dquat, s: f64) -> dquat; - /// Gets the minimal rotation for transforming `from` to `to`. The resulting rotation is - /// around the z axis. Will rotate at most 180 degrees. - /// The inputs must be unit vectors. - /// `from_rotation_arc_2d(from, to) * from ≈ to`. - /// For near-singular cases (from≈to and from≈-to) the current implementation - /// is only accurate to about 0.001 (for `f32`). - /// # Panics - /// Will panic if `from` or `to` are not normalized when `glam_assert` is enabled. - from-rotation-arc-2d: func(froma: dvec2, toa: dvec2) -> dquat; - clone: func(self: dquat) -> dquat; - mul: func(p0: dquat, p1: f64) -> dquat; - /// Multiplies a quaternion and a 3D vector, returning the rotated vector. - /// # Panics - /// Will panic if `self` is not normalized when `glam_assert` is enabled. - mul-vec3: func(self: dquat, rhs: dvec3) -> dvec3; - /// Creates a quaterion rotation from facing direction and an up direction. - /// For a right-handed view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - /// # Panics - /// Will panic if `dir` and `up` are not normalized when `glam_assert` is enabled. - look-to-rh: func(dir: dvec3, up: dvec3) -> dquat; - add: func(p0: dquat, p1: dquat) -> dquat; - /// Creates a quaternion from the `angle` (in radians) around the y axis. - from-rotation-y: func(angle: f64) -> dquat; - /// `[x, y, z, w]` - to-array: func(self: dquat) -> list; - /// Creates a new rotation quaternion. - /// This should generally not be called manually unless you know what you are doing. - /// Use one of the other constructors instead such as `identity` or `from_axis_angle`. - /// `from_xyzw` is mostly used by unit tests and `serde` deserialization. - /// # Preconditions - /// This function does not check if the input is normalized, it is up to the user to - /// provide normalized input or to normalized the resulting quaternion. - from-xyzw: func(x: f64, y: f64, z: f64, w: f64) -> dquat; - /// Creates a left-handed view matrix using a camera position, a focal point, and an up - /// direction. - /// For a left-handed view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-lh: func(eye: dvec3, center: dvec3, up: dvec3) -> dquat; - /// Performs a spherical linear interpolation between `self` and `end` - /// based on the value `s`. - /// When `s` is `0.0`, the result will be equal to `self`. When `s` - /// is `1.0`, the result will be equal to `end`. - /// # Panics - /// Will panic if `self` or `end` are not normalized when `glam_assert` is enabled. - slerp: func(self: dquat, end: dquat, s: f64) -> dquat; - /// Creates a quaterion rotation from a facing direction and an up direction. - /// For a left-handed view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-to-lh: func(dir: dvec3, up: dvec3) -> dquat; - /// Creates a right-handed view matrix using a camera position, an up direction, and a focal - /// point. - /// For a right-handed view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-rh: func(eye: dvec3, center: dvec3, up: dvec3) -> dquat; - as-quat: func(self: dquat) -> quat; - /// Creates a quaternion from the given Euler rotation sequence and the angles (in radians). - from-euler: func(euler: euler-rot, a: f64, b: f64, c: f64) -> dquat; -} - -/// Methods for DVec2 -interface dvec2 { - use types.{reflect-reference}; - - /// Returns a vector containing the fractional part of the vector as `self - self.floor()`. - /// Note that this differs from the Rust implementation of `fract` which returns - /// `self - self.trunc()`. - /// Note that this is fast but not precise for large numbers. - fract-gl: func(self: dvec2) -> dvec2; - /// Returns a bitmask with the lowest 2 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: dvec2) -> u32; - /// Returns a vector containing the fractional part of the vector as `self - self.trunc()`. - /// Note that this differs from the GLSL implementation of `fract` which returns - /// `self - self.floor()`. - /// Note that this is fast but not precise for large numbers. - fract: func(self: dvec2) -> dvec2; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - min-element: func(self: dvec2) -> f64; - /// Returns true if the absolute difference of all elements between `self` and `rhs` is - /// less than or equal to `max_abs_diff`. - /// This can be used to compare if two vectors contain similar elements. It works best when - /// comparing with a known value. The `max_abs_diff` that should be used used depends on - /// the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: dvec2, rhs: dvec2, max-abs-diff: f64) -> bool; - /// Computes the squared length of `self`. - /// This is faster than `length()` as it avoids a square root operation. - length-squared: func(self: dvec2) -> f64; - div: func(p0: dvec2, p1: dvec2) -> dvec2; - sub: func(self: dvec2, rhs: dvec2) -> dvec2; - /// Returns a vector containing the nearest integer to a number for each element of `self`. - /// Round half-way cases away from 0.0. - round: func(self: dvec2) -> dvec2; - add: func(p0: dvec2, p1: dvec2) -> dvec2; - /// Casts all elements of `self` to `f32`. - as-vec2: func(self: dvec2) -> vec2; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: dvec2, rhs: dvec2) -> bvec2; - /// Casts all elements of `self` to `i8`. - as-i8vec2: func(self: dvec2) -> i8-vec2; - sub: func(p0: dvec2, p1: f64) -> dvec2; - /// Performs a linear interpolation between `self` and `rhs` based on the value `s`. - /// When `s` is `0.0`, the result will be equal to `self`. When `s` is `1.0`, the result - /// will be equal to `rhs`. When `s` is outside of range `[0, 1]`, the result is linearly - /// extrapolated. - lerp: func(self: dvec2, rhs: dvec2, s: f64) -> dvec2; - /// Returns `self` normalized to length 1.0 if possible, else returns a - /// fallback value. - /// In particular, if the input is zero (or very close to zero), or non-finite, - /// the result of this operation will be the fallback value. - /// See also [`Self::try_normalize()`]. - normalize-or: func(self: dvec2, fallback: dvec2) -> dvec2; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: dvec2) -> f64; - /// Computes the Euclidean distance between two points in space. - distance: func(self: dvec2, rhs: dvec2) -> f64; - div: func(self: dvec2, rhs: dvec2) -> dvec2; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: dvec2) -> u64; - /// Creates a 3D vector from `self` and the given `z` value. - extend: func(self: dvec2, z: f64) -> dvec3; - /// Returns the vector rejection of `self` from `rhs`. - /// The vector rejection is the vector perpendicular to the projection of `self` onto - /// `rhs`, in rhs words the result of `self - self.project_onto(rhs)`. - /// `rhs` must be normalized. - /// # Panics - /// Will panic if `rhs` is not normalized when `glam_assert` is enabled. - reject-from-normalized: func(self: dvec2, rhs: dvec2) -> dvec2; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// [Euclidean division]: f64::rem_euclid - rem-euclid: func(self: dvec2, rhs: dvec2) -> dvec2; - /// Casts all elements of `self` to `i16`. - as-i16vec2: func(self: dvec2) -> i16-vec2; - /// Fused multiply-add. Computes `(self * a) + b` element-wise with only one rounding - /// error, yielding a more accurate result than an unfused multiply-add. - /// Using `mul_add` *may* be more performant than an unfused multiply-add if the target - /// architecture has a dedicated fma CPU instruction. However, this is not always true, - /// and will be heavily dependant on designing algorithms with specific target hardware in - /// mind. - mul-add: func(self: dvec2, a: dvec2, b: dvec2) -> dvec2; - neg: func(self: dvec2) -> dvec2; - /// Moves towards `rhs` based on the value `d`. - /// When `d` is `0.0`, the result will be equal to `self`. When `d` is equal to - /// `self.distance(rhs)`, the result will be equal to `rhs`. Will not go past `rhs`. - move-towards: func(self: dvec2, rhs: dvec2, d: f64) -> dvec2; - sub: func(p0: dvec2, p1: dvec2) -> dvec2; - /// Performs `is_finite` on each element of self, returning a vector mask of the results. - /// In other words, this computes `[x.is_finite(), y.is_finite(), ...]`. - is-finite-mask: func(self: dvec2) -> bvec2; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: dvec2, rhs: dvec2) -> f64; - /// Returns a vector containing each element of `self` raised to the power of `n`. - powf: func(self: dvec2, n: f64) -> dvec2; - /// Returns a vector containing the reciprocal `1.0/n` of each element of `self`. - recip: func(self: dvec2) -> dvec2; - /// Returns the angle of rotation (in radians) from `self` to `rhs` in the range `[-π, +π]`. - /// The inputs do not need to be unit vectors however they must be non-zero. - angle-to: func(self: dvec2, rhs: dvec2) -> f64; - /// Returns the vector projection of `self` onto `rhs`. - /// `rhs` must be of non-zero length. - /// # Panics - /// Will panic if `rhs` is zero length when `glam_assert` is enabled. - project-onto: func(self: dvec2, rhs: dvec2) -> dvec2; - /// Component-wise clamping of values, similar to [`f64::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: dvec2, min: dvec2, max: dvec2) -> dvec2; - /// Returns a vector containing the base 2 logarithm for each element of `self`. - /// This returns NaN when the element is negative and negative infinity when the element is zero. - log2: func(self: dvec2) -> dvec2; - add: func(p0: dvec2, p1: f64) -> dvec2; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - max-element: func(self: dvec2) -> f64; - rem: func(p0: dvec2, p1: f64) -> dvec2; - /// Casts all elements of `self` to `u16`. - as-u16vec2: func(self: dvec2) -> u16-vec2; - /// Returns the refraction direction for a given incident vector `self`, surface normal - /// `normal` and ratio of indices of refraction, `eta`. When total internal reflection occurs, - /// a zero vector will be returned. - /// `self` and `normal` must be normalized. - /// # Panics - /// Will panic if `self` or `normal` is not normalized when `glam_assert` is enabled. - refract: func(self: dvec2, normal: dvec2, eta: f64) -> dvec2; - /// Returns a vector with elements representing the sign of `self`. - /// - `1.0` if the number is positive, `+0.0` or `INFINITY` - /// - `-1.0` if the number is negative, `-0.0` or `NEG_INFINITY` - /// - `NAN` if the number is `NAN` - signum: func(self: dvec2) -> dvec2; - /// Returns a vector with a length no less than `min`. - /// # Panics - /// Will panic if `min` is negative when `glam_assert` is enabled. - clamp-length-min: func(self: dvec2, min: f64) -> dvec2; - /// Casts all elements of `self` to `u32`. - as-uvec2: func(self: dvec2) -> uvec2; - /// Creates a new vector. - new: func(x: f64, y: f64) -> dvec2; - /// Calculates the midpoint between `self` and `rhs`. - /// The midpoint is the average of, or halfway point between, two vectors. - /// `a.midpoint(b)` should yield the same result as `a.lerp(b, 0.5)` - /// while being slightly cheaper to compute. - midpoint: func(self: dvec2, rhs: dvec2) -> dvec2; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: dvec2, rhs: dvec2) -> bvec2; - /// Returns `true` if, and only if, all elements are finite. If any element is either - /// `NaN`, positive or negative infinity, this will return `false`. - is-finite: func(self: dvec2) -> bool; - mul: func(p0: dvec2, p1: dvec2) -> dvec2; - /// Returns the reflection vector for a given incident vector `self` and surface normal - /// `normal`. - /// `normal` must be normalized. - /// # Panics - /// Will panic if `normal` is not normalized when `glam_assert` is enabled. - reflect: func(self: dvec2, normal: dvec2) -> dvec2; - /// Computes `1.0 / length()`. - /// For valid results, `self` must _not_ be of length zero. - length-recip: func(self: dvec2) -> f64; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - /// NaN propogation does not follow IEEE 754-2008 semantics for maxNum and may differ on - /// different SIMD architectures. - max: func(self: dvec2, rhs: dvec2) -> dvec2; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - /// NaN propogation does not follow IEEE 754-2008 semantics for minNum and may differ on - /// different SIMD architectures. - min: func(self: dvec2, rhs: dvec2) -> dvec2; - /// Returns a vector with a length no less than `min` and no more than `max`. - /// # Panics - /// Will panic if `min` is greater than `max`, or if either `min` or `max` is negative, when `glam_assert` is enabled. - clamp-length: func(self: dvec2, min: f64, max: f64) -> dvec2; - /// Casts all elements of `self` to `u64`. - as-u64vec2: func(self: dvec2) -> u64-vec2; - /// The perpendicular dot product of `self` and `rhs`. - /// Also known as the wedge product, 2D cross product, and determinant. - perp-dot: func(self: dvec2, rhs: dvec2) -> f64; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: dvec2) -> u64; - /// Returns a vector containing the smallest integer greater than or equal to a number for - /// each element of `self`. - ceil: func(self: dvec2) -> dvec2; - /// Casts all elements of `self` to `i32`. - as-ivec2: func(self: dvec2) -> ivec2; - eq: func(self: dvec2, other: dvec2) -> bool; - add: func(self: dvec2, rhs: dvec2) -> dvec2; - /// Returns a vector with a length no more than `max`. - /// # Panics - /// Will panic if `max` is negative when `glam_assert` is enabled. - clamp-length-max: func(self: dvec2, max: f64) -> dvec2; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: dvec2, rhs: dvec2) -> bvec2; - /// Rotates towards `rhs` up to `max_angle` (in radians). - /// When `max_angle` is `0.0`, the result will be equal to `self`. When `max_angle` is equal to - /// `self.angle_between(rhs)`, the result will be parallel to `rhs`. If `max_angle` is negative, - /// rotates towards the exact opposite of `rhs`. Will not go past the target. - rotate-towards: func(self: dvec2, rhs: dvec2, max-angle: f64) -> dvec2; - /// Creates a vector with all elements set to `v`. - splat: func(v: f64) -> dvec2; - mul: func(self: dvec2, rhs: dvec2) -> dvec2; - rem: func(p0: dvec2, p1: dvec2) -> dvec2; - /// Returns a vector containing the largest integer less than or equal to a number for each - /// element of `self`. - floor: func(self: dvec2) -> dvec2; - /// Returns the vector rejection of `self` from `rhs`. - /// The vector rejection is the vector perpendicular to the projection of `self` onto - /// `rhs`, in rhs words the result of `self - self.project_onto(rhs)`. - /// `rhs` must be of non-zero length. - /// # Panics - /// Will panic if `rhs` has a length of zero when `glam_assert` is enabled. - reject-from: func(self: dvec2, rhs: dvec2) -> dvec2; - /// Returns `rhs` rotated by the angle of `self`. If `self` is normalized, - /// then this just rotation. This is what you usually want. Otherwise, - /// it will be like a rotation with a multiplication by `self`'s length. - /// This can be used in conjunction with the [`from_angle()`][Self::from_angle()] method, e.g. - /// `DVec2::from_angle(PI).rotate(DVec2::Y)` will create the vector `[-1, 0]` - /// and rotate [`DVec2::Y`] around it returning `-DVec2::Y`. - rotate: func(self: dvec2, rhs: dvec2) -> dvec2; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: dvec2, rhs: dvec2) -> f64; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: dvec2, rhs: dvec2) -> bvec2; - /// Returns a vector that is equal to `self` rotated by 90 degrees. - perp: func(self: dvec2) -> dvec2; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: dvec2, rhs: dvec2) -> bvec2; - /// Casts all elements of `self` to `i64`. - as-i64vec2: func(self: dvec2) -> i64-vec2; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: dvec2, rhs: dvec2) -> dvec2; - /// Creates a new vector from an array. - from-array: func(a: list) -> dvec2; - /// Returns a vector containing the integer part each element of `self`. This means numbers are - /// always truncated towards zero. - trunc: func(self: dvec2) -> dvec2; - /// Creates a 2D vector from `self` with the given value of `y`. - with-y: func(self: dvec2, y: f64) -> dvec2; - /// Creates a 2D vector from `self` with the given value of `x`. - with-x: func(self: dvec2, x: f64) -> dvec2; - /// Returns the angle (in radians) of this vector in the range `[-π, +π]`. - /// The input does not need to be a unit vector however it must be non-zero. - to-angle: func(self: dvec2) -> f64; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: dvec2, rhs: dvec2) -> bvec2; - angle-between: func(self: dvec2, rhs: dvec2) -> f64; - clone: func(self: dvec2) -> dvec2; - mul: func(p0: dvec2, p1: f64) -> dvec2; - /// Returns whether `self` is length `1.0` or not. - /// Uses a precision threshold of approximately `1e-4`. - is-normalized: func(self: dvec2) -> bool; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: dvec2) -> dvec2; - /// Creates a 2D vector containing `[angle.cos(), angle.sin()]`. This can be used in - /// conjunction with the [`rotate()`][Self::rotate()] method, e.g. - /// `DVec2::from_angle(PI).rotate(DVec2::Y)` will create the vector `[-1, 0]` - /// and rotate [`DVec2::Y`] around it returning `-DVec2::Y`. - from-angle: func(angle: f64) -> dvec2; - /// Returns a vector containing `2^self` for each element of `self`. - exp2: func(self: dvec2) -> dvec2; - /// Converts `self` to `[x, y]` - to-array: func(self: dvec2) -> list; - /// Casts all elements of `self` to `u8`. - as-u8vec2: func(self: dvec2) -> u8-vec2; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec2, if-true: dvec2, if-false: dvec2) -> dvec2; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - div-euclid: func(self: dvec2, rhs: dvec2) -> dvec2; - /// Returns `self` normalized to length 1.0 if possible, else returns zero. - /// In particular, if the input is zero (or very close to zero), or non-finite, - /// the result of this operation will be zero. - /// See also [`Self::try_normalize()`]. - normalize-or-zero: func(self: dvec2) -> dvec2; - /// Returns `self` normalized to length 1.0. - /// For valid results, `self` must be finite and _not_ of length zero, nor very close to zero. - /// See also [`Self::try_normalize()`] and [`Self::normalize_or_zero()`]. - /// # Panics - /// Will panic if the resulting normalized vector is not finite when `glam_assert` is enabled. - normalize: func(self: dvec2) -> dvec2; - div: func(p0: dvec2, p1: f64) -> dvec2; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: dvec2) -> bool; - /// Performs `is_nan` on each element of self, returning a vector mask of the results. - /// In other words, this computes `[x.is_nan(), y.is_nan(), ...]`. - is-nan-mask: func(self: dvec2) -> bvec2; - rem: func(self: dvec2, rhs: dvec2) -> dvec2; - /// Returns a vector with signs of `rhs` and the magnitudes of `self`. - copysign: func(self: dvec2, rhs: dvec2) -> dvec2; - /// Returns the vector projection of `self` onto `rhs`. - /// `rhs` must be normalized. - /// # Panics - /// Will panic if `rhs` is not normalized when `glam_assert` is enabled. - project-onto-normalized: func(self: dvec2, rhs: dvec2) -> dvec2; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: dvec2) -> f64; - /// Returns a vector containing `e^self` (the exponential function) for each element of - /// `self`. - exp: func(self: dvec2) -> dvec2; - /// Returns a vector containing the natural logarithm for each element of `self`. - /// This returns NaN when the element is negative and negative infinity when the element is zero. - ln: func(self: dvec2) -> dvec2; - /// Computes the length of `self`. - length: func(self: dvec2) -> f64; -} - -/// Methods for DVec3 -interface dvec3 { - use types.{reflect-reference}; - - /// Returns a vector with elements representing the sign of `self`. - /// - `1.0` if the number is positive, `+0.0` or `INFINITY` - /// - `-1.0` if the number is negative, `-0.0` or `NEG_INFINITY` - /// - `NAN` if the number is `NAN` - signum: func(self: dvec3) -> dvec3; - /// Computes the Euclidean distance between two points in space. - distance: func(self: dvec3, rhs: dvec3) -> f64; - /// Casts all elements of `self` to `i64`. - as-i64vec3: func(self: dvec3) -> i64-vec3; - /// Component-wise clamping of values, similar to [`f64::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: dvec3, min: dvec3, max: dvec3) -> dvec3; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - div-euclid: func(self: dvec3, rhs: dvec3) -> dvec3; - /// Returns `true` if, and only if, all elements are finite. If any element is either - /// `NaN`, positive or negative infinity, this will return `false`. - is-finite: func(self: dvec3) -> bool; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: dvec3) -> u64; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: dvec3) -> f64; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: dvec3, rhs: dvec3) -> bvec3; - eq: func(self: dvec3, other: dvec3) -> bool; - /// Returns a vector containing the reciprocal `1.0/n` of each element of `self`. - recip: func(self: dvec3) -> dvec3; - div: func(p0: dvec3, p1: f64) -> dvec3; - /// Returns a vector containing the fractional part of the vector as `self - self.floor()`. - /// Note that this differs from the Rust implementation of `fract` which returns - /// `self - self.trunc()`. - /// Note that this is fast but not precise for large numbers. - fract-gl: func(self: dvec3) -> dvec3; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: dvec3, rhs: dvec3) -> bvec3; - /// Casts all elements of `self` to `u32`. - as-uvec3: func(self: dvec3) -> uvec3; - sub: func(p0: dvec3, p1: f64) -> dvec3; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: dvec3, rhs: dvec3) -> bvec3; - /// Returns the refraction direction for a given incident vector `self`, surface normal - /// `normal` and ratio of indices of refraction, `eta`. When total internal reflection occurs, - /// a zero vector will be returned. - /// `self` and `normal` must be normalized. - /// # Panics - /// Will panic if `self` or `normal` is not normalized when `glam_assert` is enabled. - refract: func(self: dvec3, normal: dvec3, eta: f64) -> dvec3; - /// Casts all elements of `self` to `u64`. - as-u64vec3: func(self: dvec3) -> u64-vec3; - /// Rotates around the x axis by `angle` (in radians). - rotate-x: func(self: dvec3, angle: f64) -> dvec3; - /// Returns true if the absolute difference of all elements between `self` and `rhs` is - /// less than or equal to `max_abs_diff`. - /// This can be used to compare if two vectors contain similar elements. It works best when - /// comparing with a known value. The `max_abs_diff` that should be used used depends on - /// the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: dvec3, rhs: dvec3, max-abs-diff: f64) -> bool; - /// Returns a vector with a length no less than `min` and no more than `max`. - /// # Panics - /// Will panic if `min` is greater than `max`, or if either `min` or `max` is negative, when `glam_assert` is enabled. - clamp-length: func(self: dvec3, min: f64, max: f64) -> dvec3; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: dvec3, rhs: dvec3) -> dvec3; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - /// NaN propogation does not follow IEEE 754-2008 semantics for maxNum and may differ on - /// different SIMD architectures. - max: func(self: dvec3, rhs: dvec3) -> dvec3; - /// Rotates around the z axis by `angle` (in radians). - rotate-z: func(self: dvec3, angle: f64) -> dvec3; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - /// NaN propogation does not follow IEEE 754-2008 semantics for minNum and may differ on - /// different SIMD architectures. - min: func(self: dvec3, rhs: dvec3) -> dvec3; - /// Returns the reflection vector for a given incident vector `self` and surface normal - /// `normal`. - /// `normal` must be normalized. - /// # Panics - /// Will panic if `normal` is not normalized when `glam_assert` is enabled. - reflect: func(self: dvec3, normal: dvec3) -> dvec3; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: dvec3, rhs: dvec3) -> f64; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec3, if-true: dvec3, if-false: dvec3) -> dvec3; - /// Projects a homogeneous coordinate to 3D space by performing perspective divide. - /// # Panics - /// Will panic if `v.w` is `0` when `glam_assert` is enabled. - from-homogeneous: func(v: dvec4) -> dvec3; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: dvec3) -> u64; - /// Returns a vector containing `2^self` for each element of `self`. - exp2: func(self: dvec3) -> dvec3; - /// Returns a vector containing the fractional part of the vector as `self - self.trunc()`. - /// Note that this differs from the GLSL implementation of `fract` which returns - /// `self - self.floor()`. - /// Note that this is fast but not precise for large numbers. - fract: func(self: dvec3) -> dvec3; - /// Returns the vector rejection of `self` from `rhs`. - /// The vector rejection is the vector perpendicular to the projection of `self` onto - /// `rhs`, in rhs words the result of `self - self.project_onto(rhs)`. - /// `rhs` must be normalized. - /// # Panics - /// Will panic if `rhs` is not normalized when `glam_assert` is enabled. - reject-from-normalized: func(self: dvec3, rhs: dvec3) -> dvec3; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: dvec3, rhs: dvec3) -> f64; - /// Returns the vector rejection of `self` from `rhs`. - /// The vector rejection is the vector perpendicular to the projection of `self` onto - /// `rhs`, in rhs words the result of `self - self.project_onto(rhs)`. - /// `rhs` must be of non-zero length. - /// # Panics - /// Will panic if `rhs` has a length of zero when `glam_assert` is enabled. - reject-from: func(self: dvec3, rhs: dvec3) -> dvec3; - rem: func(p0: dvec3, p1: f64) -> dvec3; - /// Returns the angle (in radians) between two vectors in the range `[0, +π]`. - /// The inputs do not need to be unit vectors however they must be non-zero. - angle-between: func(self: dvec3, rhs: dvec3) -> f64; - div: func(p0: dvec3, p1: dvec3) -> dvec3; - /// Creates a 2D vector from the `x` and `y` elements of `self`, discarding `z`. - /// Truncation may also be performed by using [`self.xy()`][crate::swizzles::Vec3Swizzles::xy()]. - truncate: func(self: dvec3) -> dvec2; - /// Fused multiply-add. Computes `(self * a) + b` element-wise with only one rounding - /// error, yielding a more accurate result than an unfused multiply-add. - /// Using `mul_add` *may* be more performant than an unfused multiply-add if the target - /// architecture has a dedicated fma CPU instruction. However, this is not always true, - /// and will be heavily dependant on designing algorithms with specific target hardware in - /// mind. - mul-add: func(self: dvec3, a: dvec3, b: dvec3) -> dvec3; - sub: func(p0: dvec3, p1: dvec3) -> dvec3; - /// Returns a vector containing the integer part each element of `self`. This means numbers are - /// always truncated towards zero. - trunc: func(self: dvec3) -> dvec3; - mul: func(self: dvec3, rhs: dvec3) -> dvec3; - /// Creates a 3D vector from `self` with the given value of `z`. - with-z: func(self: dvec3, z: f64) -> dvec3; - /// Rotates towards `rhs` up to `max_angle` (in radians). - /// When `max_angle` is `0.0`, the result will be equal to `self`. When `max_angle` is equal to - /// `self.angle_between(rhs)`, the result will be parallel to `rhs`. If `max_angle` is negative, - /// rotates towards the exact opposite of `rhs`. Will not go past the target. - rotate-towards: func(self: dvec3, rhs: dvec3, max-angle: f64) -> dvec3; - /// Creates a 3D vector from `self` with the given value of `x`. - with-x: func(self: dvec3, x: f64) -> dvec3; - mul: func(p0: dvec3, p1: f64) -> dvec3; - clone: func(self: dvec3) -> dvec3; - /// Casts all elements of `self` to `u8`. - as-u8vec3: func(self: dvec3) -> u8-vec3; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: dvec3) -> dvec3; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: dvec3) -> f64; - /// Casts all elements of `self` to `i8`. - as-i8vec3: func(self: dvec3) -> i8-vec3; - neg: func(self: dvec3) -> dvec3; - /// Creates a new vector from an array. - from-array: func(a: list) -> dvec3; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: dvec3, rhs: dvec3) -> bvec3; - /// Returns a bitmask with the lowest 3 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: dvec3) -> u32; - /// Returns some vector that is orthogonal to the given one. - /// The input vector must be finite and non-zero. - /// The output vector is not necessarily unit length. For that use - /// [`Self::any_orthonormal_vector()`] instead. - any-orthogonal-vector: func(self: dvec3) -> dvec3; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: dvec3, rhs: dvec3) -> bvec3; - /// Moves towards `rhs` based on the value `d`. - /// When `d` is `0.0`, the result will be equal to `self`. When `d` is equal to - /// `self.distance(rhs)`, the result will be equal to `rhs`. Will not go past `rhs`. - move-towards: func(self: dvec3, rhs: dvec3, d: f64) -> dvec3; - /// Returns `self` normalized to length 1.0. - /// For valid results, `self` must be finite and _not_ of length zero, nor very close to zero. - /// See also [`Self::try_normalize()`] and [`Self::normalize_or_zero()`]. - /// # Panics - /// Will panic if the resulting normalized vector is not finite when `glam_assert` is enabled. - normalize: func(self: dvec3) -> dvec3; - /// Returns a vector containing each element of `self` raised to the power of `n`. - powf: func(self: dvec3, n: f64) -> dvec3; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// [Euclidean division]: f64::rem_euclid - rem-euclid: func(self: dvec3, rhs: dvec3) -> dvec3; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - max-element: func(self: dvec3) -> f64; - /// Returns the vector projection of `self` onto `rhs`. - /// `rhs` must be normalized. - /// # Panics - /// Will panic if `rhs` is not normalized when `glam_assert` is enabled. - project-onto-normalized: func(self: dvec3, rhs: dvec3) -> dvec3; - /// Computes `1.0 / length()`. - /// For valid results, `self` must _not_ be of length zero. - length-recip: func(self: dvec3) -> f64; - /// Returns a vector containing the nearest integer to a number for each element of `self`. - /// Round half-way cases away from 0.0. - round: func(self: dvec3) -> dvec3; - /// Creates a new vector. - new: func(x: f64, y: f64, z: f64) -> dvec3; - /// Creates a 4D vector from `self` and the given `w` value. - extend: func(self: dvec3, w: f64) -> dvec4; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - min-element: func(self: dvec3) -> f64; - /// Returns a vector containing `e^self` (the exponential function) for each element of - /// `self`. - exp: func(self: dvec3) -> dvec3; - /// Creates a vector with all elements set to `v`. - splat: func(v: f64) -> dvec3; - /// Casts all elements of `self` to `f32`. - as-vec3a: func(self: dvec3) -> vec3-a; - /// Returns the vector projection of `self` onto `rhs`. - /// `rhs` must be of non-zero length. - /// # Panics - /// Will panic if `rhs` is zero length when `glam_assert` is enabled. - project-onto: func(self: dvec3, rhs: dvec3) -> dvec3; - /// Returns a vector with signs of `rhs` and the magnitudes of `self`. - copysign: func(self: dvec3, rhs: dvec3) -> dvec3; - /// Computes the cross product of `self` and `rhs`. - cross: func(self: dvec3, rhs: dvec3) -> dvec3; - sub: func(self: dvec3, rhs: dvec3) -> dvec3; - /// Computes the squared length of `self`. - /// This is faster than `length()` as it avoids a square root operation. - length-squared: func(self: dvec3) -> f64; - /// Returns a vector containing the smallest integer greater than or equal to a number for - /// each element of `self`. - ceil: func(self: dvec3) -> dvec3; - /// Returns a vector containing the base 2 logarithm for each element of `self`. - /// This returns NaN when the element is negative and negative infinity when the element is zero. - log2: func(self: dvec3) -> dvec3; - add: func(p0: dvec3, p1: f64) -> dvec3; - add: func(p0: dvec3, p1: dvec3) -> dvec3; - /// Casts all elements of `self` to `i32`. - as-ivec3: func(self: dvec3) -> ivec3; - /// Performs a spherical linear interpolation between `self` and `rhs` based on the value `s`. - /// When `s` is `0.0`, the result will be equal to `self`. When `s` is `1.0`, the result - /// will be equal to `rhs`. When `s` is outside of range `[0, 1]`, the result is linearly - /// extrapolated. - slerp: func(self: dvec3, rhs: dvec3, s: f64) -> dvec3; - /// Creates a homogeneous coordinate from `self`, equivalent to `self.extend(1.0)`. - to-homogeneous: func(self: dvec3) -> dvec4; - /// Rotates around the y axis by `angle` (in radians). - rotate-y: func(self: dvec3, angle: f64) -> dvec3; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: dvec3, rhs: dvec3) -> bvec3; - /// Casts all elements of `self` to `i16`. - as-i16vec3: func(self: dvec3) -> i16-vec3; - /// Converts `self` to `[x, y, z]` - to-array: func(self: dvec3) -> list; - /// Returns a vector containing the largest integer less than or equal to a number for each - /// element of `self`. - floor: func(self: dvec3) -> dvec3; - rem: func(self: dvec3, rhs: dvec3) -> dvec3; - add: func(self: dvec3, rhs: dvec3) -> dvec3; - /// Performs `is_finite` on each element of self, returning a vector mask of the results. - /// In other words, this computes `[x.is_finite(), y.is_finite(), ...]`. - is-finite-mask: func(self: dvec3) -> bvec3; - /// Returns a vector containing the natural logarithm for each element of `self`. - /// This returns NaN when the element is negative and negative infinity when the element is zero. - ln: func(self: dvec3) -> dvec3; - /// Returns `self` normalized to length 1.0 if possible, else returns zero. - /// In particular, if the input is zero (or very close to zero), or non-finite, - /// the result of this operation will be zero. - /// See also [`Self::try_normalize()`]. - normalize-or-zero: func(self: dvec3) -> dvec3; - /// Returns any unit vector that is orthogonal to the given one. - /// The input vector must be unit length. - /// # Panics - /// Will panic if `self` is not normalized when `glam_assert` is enabled. - any-orthonormal-vector: func(self: dvec3) -> dvec3; - rem: func(p0: dvec3, p1: dvec3) -> dvec3; - mul: func(p0: dvec3, p1: dvec3) -> dvec3; - /// Performs `is_nan` on each element of self, returning a vector mask of the results. - /// In other words, this computes `[x.is_nan(), y.is_nan(), ...]`. - is-nan-mask: func(self: dvec3) -> bvec3; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: dvec3) -> bool; - /// Returns `self` normalized to length 1.0 if possible, else returns a - /// fallback value. - /// In particular, if the input is zero (or very close to zero), or non-finite, - /// the result of this operation will be the fallback value. - /// See also [`Self::try_normalize()`]. - normalize-or: func(self: dvec3, fallback: dvec3) -> dvec3; - /// Returns whether `self` is length `1.0` or not. - /// Uses a precision threshold of approximately `1e-4`. - is-normalized: func(self: dvec3) -> bool; - /// Computes the length of `self`. - length: func(self: dvec3) -> f64; - /// Creates a 3D vector from `self` with the given value of `y`. - with-y: func(self: dvec3, y: f64) -> dvec3; - /// Casts all elements of `self` to `f32`. - as-vec3: func(self: dvec3) -> vec3; - /// Returns a vector with a length no less than `min`. - /// # Panics - /// Will panic if `min` is negative when `glam_assert` is enabled. - clamp-length-min: func(self: dvec3, min: f64) -> dvec3; - /// Rotates around `axis` by `angle` (in radians). - /// The axis must be a unit vector. - /// # Panics - /// Will panic if `axis` is not normalized when `glam_assert` is enabled. - rotate-axis: func(self: dvec3, axis: dvec3, angle: f64) -> dvec3; - /// Returns a vector with a length no more than `max`. - /// # Panics - /// Will panic if `max` is negative when `glam_assert` is enabled. - clamp-length-max: func(self: dvec3, max: f64) -> dvec3; - /// Calculates the midpoint between `self` and `rhs`. - /// The midpoint is the average of, or halfway point between, two vectors. - /// `a.midpoint(b)` should yield the same result as `a.lerp(b, 0.5)` - /// while being slightly cheaper to compute. - midpoint: func(self: dvec3, rhs: dvec3) -> dvec3; - /// Casts all elements of `self` to `u16`. - as-u16vec3: func(self: dvec3) -> u16-vec3; - div: func(self: dvec3, rhs: dvec3) -> dvec3; - /// Performs a linear interpolation between `self` and `rhs` based on the value `s`. - /// When `s` is `0.0`, the result will be equal to `self`. When `s` is `1.0`, the result - /// will be equal to `rhs`. When `s` is outside of range `[0, 1]`, the result is linearly - /// extrapolated. - lerp: func(self: dvec3, rhs: dvec3, s: f64) -> dvec3; -} - -/// Methods for DVec4 -interface dvec4 { - use types.{reflect-reference}; - - /// Creates a 4D vector from `self` with the given value of `y`. - with-y: func(self: dvec4, y: f64) -> dvec4; - /// Moves towards `rhs` based on the value `d`. - /// When `d` is `0.0`, the result will be equal to `self`. When `d` is equal to - /// `self.distance(rhs)`, the result will be equal to `rhs`. Will not go past `rhs`. - move-towards: func(self: dvec4, rhs: dvec4, d: f64) -> dvec4; - mul: func(self: dvec4, rhs: dvec4) -> dvec4; - /// Casts all elements of `self` to `i64`. - as-i64vec4: func(self: dvec4) -> i64-vec4; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: dvec4, rhs: dvec4) -> dvec4; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - div-euclid: func(self: dvec4, rhs: dvec4) -> dvec4; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - min-element: func(self: dvec4) -> f64; - /// Returns a vector containing `e^self` (the exponential function) for each element of - /// `self`. - exp: func(self: dvec4) -> dvec4; - /// Casts all elements of `self` to `i32`. - as-ivec4: func(self: dvec4) -> ivec4; - /// Casts all elements of `self` to `u64`. - as-u64vec4: func(self: dvec4) -> u64-vec4; - /// Casts all elements of `self` to `i16`. - as-i16vec4: func(self: dvec4) -> i16-vec4; - /// Returns a bitmask with the lowest 4 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: dvec4) -> u32; - clone: func(self: dvec4) -> dvec4; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: dvec4, rhs: dvec4) -> bvec4; - /// Returns a vector containing the base 2 logarithm for each element of `self`. - /// This returns NaN when the element is negative and negative infinity when the element is zero. - log2: func(self: dvec4) -> dvec4; - rem: func(p0: dvec4, p1: f64) -> dvec4; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: dvec4, rhs: dvec4) -> bvec4; - sub: func(self: dvec4, rhs: dvec4) -> dvec4; - /// Projects a homogeneous coordinate to 3D space by performing perspective divide. - /// # Panics - /// Will panic if `self.w` is `0` when `glam_assert` is enabled. - project: func(self: dvec4) -> dvec3; - /// Component-wise clamping of values, similar to [`f64::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: dvec4, min: dvec4, max: dvec4) -> dvec4; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - /// NaN propogation does not follow IEEE 754-2008 semantics for maxNum and may differ on - /// different SIMD architectures. - max: func(self: dvec4, rhs: dvec4) -> dvec4; - /// Returns `true` if, and only if, all elements are finite. If any element is either - /// `NaN`, positive or negative infinity, this will return `false`. - is-finite: func(self: dvec4) -> bool; - /// Performs `is_finite` on each element of self, returning a vector mask of the results. - /// In other words, this computes `[x.is_finite(), y.is_finite(), ...]`. - is-finite-mask: func(self: dvec4) -> bvec4; - add: func(p0: dvec4, p1: f64) -> dvec4; - sub: func(p0: dvec4, p1: dvec4) -> dvec4; - /// Returns `self` normalized to length 1.0 if possible, else returns a - /// fallback value. - /// In particular, if the input is zero (or very close to zero), or non-finite, - /// the result of this operation will be the fallback value. - /// See also [`Self::try_normalize()`]. - normalize-or: func(self: dvec4, fallback: dvec4) -> dvec4; - mul: func(p0: dvec4, p1: f64) -> dvec4; - add: func(p0: dvec4, p1: dvec4) -> dvec4; - /// Casts all elements of `self` to `f32`. - as-vec4: func(self: dvec4) -> vec4; - /// Returns a vector containing the nearest integer to a number for each element of `self`. - /// Round half-way cases away from 0.0. - round: func(self: dvec4) -> dvec4; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: dvec4, rhs: dvec4) -> bvec4; - /// Computes the squared length of `self`. - /// This is faster than `length()` as it avoids a square root operation. - length-squared: func(self: dvec4) -> f64; - neg: func(self: dvec4) -> dvec4; - eq: func(self: dvec4, other: dvec4) -> bool; - rem: func(p0: dvec4, p1: dvec4) -> dvec4; - /// Returns a vector with a length no more than `max`. - /// # Panics - /// Will panic if `max` is negative when `glam_assert` is enabled. - clamp-length-max: func(self: dvec4, max: f64) -> dvec4; - add: func(self: dvec4, rhs: dvec4) -> dvec4; - /// Returns true if the absolute difference of all elements between `self` and `rhs` is - /// less than or equal to `max_abs_diff`. - /// This can be used to compare if two vectors contain similar elements. It works best when - /// comparing with a known value. The `max_abs_diff` that should be used used depends on - /// the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: dvec4, rhs: dvec4, max-abs-diff: f64) -> bool; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: dvec4, rhs: dvec4) -> f64; - /// Returns the reflection vector for a given incident vector `self` and surface normal - /// `normal`. - /// `normal` must be normalized. - /// # Panics - /// Will panic if `normal` is not normalized when `glam_assert` is enabled. - reflect: func(self: dvec4, normal: dvec4) -> dvec4; - /// Computes `1.0 / length()`. - /// For valid results, `self` must _not_ be of length zero. - length-recip: func(self: dvec4) -> f64; - /// Creates a new vector. - new: func(x: f64, y: f64, z: f64, w: f64) -> dvec4; - /// Returns a vector containing the smallest integer greater than or equal to a number for - /// each element of `self`. - ceil: func(self: dvec4) -> dvec4; - /// Creates a new vector from an array. - from-array: func(a: list) -> dvec4; - /// Returns the vector projection of `self` onto `rhs`. - /// `rhs` must be of non-zero length. - /// # Panics - /// Will panic if `rhs` is zero length when `glam_assert` is enabled. - project-onto: func(self: dvec4, rhs: dvec4) -> dvec4; - /// Returns a vector containing the reciprocal `1.0/n` of each element of `self`. - recip: func(self: dvec4) -> dvec4; - rem: func(self: dvec4, rhs: dvec4) -> dvec4; - div: func(self: dvec4, rhs: dvec4) -> dvec4; - /// Casts all elements of `self` to `i8`. - as-i8vec4: func(self: dvec4) -> i8-vec4; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - max-element: func(self: dvec4) -> f64; - /// Returns the vector rejection of `self` from `rhs`. - /// The vector rejection is the vector perpendicular to the projection of `self` onto - /// `rhs`, in rhs words the result of `self - self.project_onto(rhs)`. - /// `rhs` must be normalized. - /// # Panics - /// Will panic if `rhs` is not normalized when `glam_assert` is enabled. - reject-from-normalized: func(self: dvec4, rhs: dvec4) -> dvec4; - mul: func(p0: dvec4, p1: dvec4) -> dvec4; - /// Returns `self` normalized to length 1.0 if possible, else returns zero. - /// In particular, if the input is zero (or very close to zero), or non-finite, - /// the result of this operation will be zero. - /// See also [`Self::try_normalize()`]. - normalize-or-zero: func(self: dvec4) -> dvec4; - /// Returns a vector containing each element of `self` raised to the power of `n`. - powf: func(self: dvec4, n: f64) -> dvec4; - /// Casts all elements of `self` to `u32`. - as-uvec4: func(self: dvec4) -> uvec4; - /// Returns a vector containing `2^self` for each element of `self`. - exp2: func(self: dvec4) -> dvec4; - /// Returns a vector containing the natural logarithm for each element of `self`. - /// This returns NaN when the element is negative and negative infinity when the element is zero. - ln: func(self: dvec4) -> dvec4; - /// Returns a vector with a length no less than `min`. - /// # Panics - /// Will panic if `min` is negative when `glam_assert` is enabled. - clamp-length-min: func(self: dvec4, min: f64) -> dvec4; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: dvec4) -> f64; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: dvec4, rhs: dvec4) -> bvec4; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec4, if-true: dvec4, if-false: dvec4) -> dvec4; - /// Converts `self` to `[x, y, z, w]` - to-array: func(self: dvec4) -> list; - /// Creates a 4D vector from `self` with the given value of `w`. - with-w: func(self: dvec4, w: f64) -> dvec4; - /// Fused multiply-add. Computes `(self * a) + b` element-wise with only one rounding - /// error, yielding a more accurate result than an unfused multiply-add. - /// Using `mul_add` *may* be more performant than an unfused multiply-add if the target - /// architecture has a dedicated fma CPU instruction. However, this is not always true, - /// and will be heavily dependant on designing algorithms with specific target hardware in - /// mind. - mul-add: func(self: dvec4, a: dvec4, b: dvec4) -> dvec4; - /// Returns a vector with elements representing the sign of `self`. - /// - `1.0` if the number is positive, `+0.0` or `INFINITY` - /// - `-1.0` if the number is negative, `-0.0` or `NEG_INFINITY` - /// - `NAN` if the number is `NAN` - signum: func(self: dvec4) -> dvec4; - /// Returns a vector containing the fractional part of the vector as `self - self.floor()`. - /// Note that this differs from the Rust implementation of `fract` which returns - /// `self - self.trunc()`. - /// Note that this is fast but not precise for large numbers. - fract-gl: func(self: dvec4) -> dvec4; - /// Casts all elements of `self` to `u8`. - as-u8vec4: func(self: dvec4) -> u8-vec4; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: dvec4, rhs: dvec4) -> bvec4; - /// Casts all elements of `self` to `u16`. - as-u16vec4: func(self: dvec4) -> u16-vec4; - div: func(p0: dvec4, p1: f64) -> dvec4; - /// Returns the vector projection of `self` onto `rhs`. - /// `rhs` must be normalized. - /// # Panics - /// Will panic if `rhs` is not normalized when `glam_assert` is enabled. - project-onto-normalized: func(self: dvec4, rhs: dvec4) -> dvec4; - /// Returns a vector containing the integer part each element of `self`. This means numbers are - /// always truncated towards zero. - trunc: func(self: dvec4) -> dvec4; - /// Performs `is_nan` on each element of self, returning a vector mask of the results. - /// In other words, this computes `[x.is_nan(), y.is_nan(), ...]`. - is-nan-mask: func(self: dvec4) -> bvec4; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: dvec4, rhs: dvec4) -> f64; - div: func(p0: dvec4, p1: dvec4) -> dvec4; - /// Calculates the midpoint between `self` and `rhs`. - /// The midpoint is the average of, or halfway point between, two vectors. - /// `a.midpoint(b)` should yield the same result as `a.lerp(b, 0.5)` - /// while being slightly cheaper to compute. - midpoint: func(self: dvec4, rhs: dvec4) -> dvec4; - /// Creates a 4D vector from `self` with the given value of `z`. - with-z: func(self: dvec4, z: f64) -> dvec4; - /// Computes the Euclidean distance between two points in space. - distance: func(self: dvec4, rhs: dvec4) -> f64; - /// Returns `self` normalized to length 1.0. - /// For valid results, `self` must be finite and _not_ of length zero, nor very close to zero. - /// See also [`Self::try_normalize()`] and [`Self::normalize_or_zero()`]. - /// # Panics - /// Will panic if the resulting normalized vector is not finite when `glam_assert` is enabled. - normalize: func(self: dvec4) -> dvec4; - /// Returns the vector rejection of `self` from `rhs`. - /// The vector rejection is the vector perpendicular to the projection of `self` onto - /// `rhs`, in rhs words the result of `self - self.project_onto(rhs)`. - /// `rhs` must be of non-zero length. - /// # Panics - /// Will panic if `rhs` has a length of zero when `glam_assert` is enabled. - reject-from: func(self: dvec4, rhs: dvec4) -> dvec4; - /// Computes the length of `self`. - length: func(self: dvec4) -> f64; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - /// NaN propogation does not follow IEEE 754-2008 semantics for minNum and may differ on - /// different SIMD architectures. - min: func(self: dvec4, rhs: dvec4) -> dvec4; - /// Creates a 4D vector from `self` with the given value of `x`. - with-x: func(self: dvec4, x: f64) -> dvec4; - sub: func(p0: dvec4, p1: f64) -> dvec4; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: dvec4) -> bool; - /// Returns a vector containing the largest integer less than or equal to a number for each - /// element of `self`. - floor: func(self: dvec4) -> dvec4; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: dvec4) -> f64; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: dvec4) -> dvec4; - /// Returns a vector with a length no less than `min` and no more than `max`. - /// # Panics - /// Will panic if `min` is greater than `max`, or if either `min` or `max` is negative, when `glam_assert` is enabled. - clamp-length: func(self: dvec4, min: f64, max: f64) -> dvec4; - /// Creates a vector with all elements set to `v`. - splat: func(v: f64) -> dvec4; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: dvec4) -> u64; - /// Returns a vector containing the fractional part of the vector as `self - self.trunc()`. - /// Note that this differs from the GLSL implementation of `fract` which returns - /// `self - self.floor()`. - /// Note that this is fast but not precise for large numbers. - fract: func(self: dvec4) -> dvec4; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// [Euclidean division]: f64::rem_euclid - rem-euclid: func(self: dvec4, rhs: dvec4) -> dvec4; - /// Returns a vector with signs of `rhs` and the magnitudes of `self`. - copysign: func(self: dvec4, rhs: dvec4) -> dvec4; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: dvec4) -> u64; - /// Creates a 3D vector from the `x`, `y` and `z` elements of `self`, discarding `w`. - /// Truncation to [`DVec3`] may also be performed by using [`self.xyz()`][crate::swizzles::Vec4Swizzles::xyz()]. - truncate: func(self: dvec4) -> dvec3; - /// Returns whether `self` is length `1.0` or not. - /// Uses a precision threshold of approximately `1e-4`. - is-normalized: func(self: dvec4) -> bool; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: dvec4, rhs: dvec4) -> bvec4; - /// Performs a linear interpolation between `self` and `rhs` based on the value `s`. - /// When `s` is `0.0`, the result will be equal to `self`. When `s` is `1.0`, the result - /// will be equal to `rhs`. When `s` is outside of range `[0, 1]`, the result is linearly - /// extrapolated. - lerp: func(self: dvec4, rhs: dvec4, s: f64) -> dvec4; - /// Returns the refraction direction for a given incident vector `self`, surface normal - /// `normal` and ratio of indices of refraction, `eta`. When total internal reflection occurs, - /// a zero vector will be returned. - /// `self` and `normal` must be normalized. - /// # Panics - /// Will panic if `self` or `normal` is not normalized when `glam_assert` is enabled. - refract: func(self: dvec4, normal: dvec4, eta: f64) -> dvec4; -} - -/// Methods for EulerRot -interface euler-rot { - use types.{reflect-reference}; - - clone: func(self: euler-rot) -> euler-rot; - eq: func(self: euler-rot, other: euler-rot) -> bool; - assert-receiver-is-total-eq: func(self: euler-rot); -} - -/// Methods for I16Vec2 -interface i16-vec2 { - use types.{reflect-reference}; - - /// Returns a bitmask with the lowest 2 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: i16-vec2) -> u32; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: i16-vec2) -> s16; - /// Casts all elements of `self` to `i64`. - as-i64vec2: func(self: i16-vec2) -> i64-vec2; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: i16-vec2, rhs: i16-vec2) -> bvec2; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: i16-vec2) -> s16; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - /// Returns `rhs` rotated by the angle of `self`. If `self` is normalized, - /// then this just rotation. This is what you usually want. Otherwise, - /// it will be like a rotation with a multiplication by `self`'s length. - /// This can be used to rotate by 90 degree increments, e.g. `[sin(90), cos(90)` = `[1, 0]` or - /// `[sin(180), cos(180)]` = `[0, -1]`. - rotate: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - rem: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - /// Creates a new vector. - new: func(x: s16, y: s16) -> i16-vec2; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: i16-vec2, rhs: i16-vec2) -> bvec2; - div: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - div: func(p0: i16-vec2, p1: s16) -> i16-vec2; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: i16-vec2, rhs: i16-vec2) -> s16; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: i16-vec2, rhs: i16-vec2) -> u16; - add: func(p0: i16-vec2, p1: s16) -> i16-vec2; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - /// Creates a 2D vector from `self` with the given value of `x`. - with-x: func(self: i16-vec2, x: s16) -> i16-vec2; - /// Creates a vector with all elements set to `v`. - splat: func(v: s16) -> i16-vec2; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - /// [Euclidean division]: i16::rem_euclid - rem-euclid: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - sub: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - add: func(p0: i16-vec2, p1: i16-vec2) -> i16-vec2; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - div-euclid: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: i16-vec2) -> i16-vec2; - /// Creates a 3D vector from `self` and the given `z` value. - extend: func(self: i16-vec2, z: s16) -> i16-vec3; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: i16-vec2, rhs: i16-vec2) -> s16; - /// Component-wise clamping of values, similar to [`i16::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: i16-vec2, min: i16-vec2, max: i16-vec2) -> i16-vec2; - /// Casts all elements of `self` to `u16`. - as-u16vec2: func(self: i16-vec2) -> u16-vec2; - /// Casts all elements of `self` to `u32`. - as-uvec2: func(self: i16-vec2) -> uvec2; - div: func(p0: i16-vec2, p1: i16-vec2) -> i16-vec2; - /// The perpendicular dot product of `self` and `rhs`. - /// Also known as the wedge product, 2D cross product, and determinant. - perp-dot: func(self: i16-vec2, rhs: i16-vec2) -> s16; - sub: func(p0: i16-vec2, p1: i16-vec2) -> i16-vec2; - /// Creates a new vector from an array. - from-array: func(a: list) -> i16-vec2; - mul: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - assert-receiver-is-total-eq: func(self: i16-vec2); - /// Returns a vector containing the wrapping addition of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_unsigned(rhs.x), self.y.wrapping_add_unsigned(rhs.y), ..]`. - wrapping-add-unsigned: func(self: i16-vec2, rhs: u16-vec2) -> i16-vec2; - rem: func(p0: i16-vec2, p1: i16-vec2) -> i16-vec2; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: i16-vec2, rhs: i16-vec2) -> bvec2; - /// Returns a vector that is equal to `self` rotated by 90 degrees. - perp: func(self: i16-vec2) -> i16-vec2; - /// Casts all elements of `self` to `u64`. - as-u64vec2: func(self: i16-vec2) -> u64-vec2; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - /// Casts all elements of `self` to `i32`. - as-ivec2: func(self: i16-vec2) -> ivec2; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: i16-vec2) -> u64; - /// Computes the squared length of `self`. - length-squared: func(self: i16-vec2) -> s16; - /// Casts all elements of `self` to `f32`. - as-vec2: func(self: i16-vec2) -> vec2; - sub: func(p0: i16-vec2, p1: s16) -> i16-vec2; - mul: func(p0: i16-vec2, p1: s16) -> i16-vec2; - rem: func(p0: i16-vec2, p1: s16) -> i16-vec2; - /// Casts all elements of `self` to `i8`. - as-i8vec2: func(self: i16-vec2) -> i8-vec2; - clone: func(self: i16-vec2) -> i16-vec2; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u16::MAX`]. - /// See also [`checked_manhattan_distance`][I16Vec2::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: i16-vec2, rhs: i16-vec2) -> u16; - eq: func(self: i16-vec2, other: i16-vec2) -> bool; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: i16-vec2, rhs: i16-vec2) -> bvec2; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec2, if-true: i16-vec2, if-false: i16-vec2) -> i16-vec2; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: i16-vec2) -> s16; - /// Converts `self` to `[x, y]` - to-array: func(self: i16-vec2) -> list; - mul: func(p0: i16-vec2, p1: i16-vec2) -> i16-vec2; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u16::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: i16-vec2, rhs: i16-vec2) -> option; - /// Returns a vector containing the wrapping subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_sub_unsigned(rhs.x), self.y.wrapping_sub_unsigned(rhs.y), ..]`. - wrapping-sub-unsigned: func(self: i16-vec2, rhs: u16-vec2) -> i16-vec2; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - /// Returns a vector containing the saturating subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.saturating_sub_unsigned(rhs.x), self.y.saturating_sub_unsigned(rhs.y), ..]`. - saturating-sub-unsigned: func(self: i16-vec2, rhs: u16-vec2) -> i16-vec2; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - add: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - /// Casts all elements of `self` to `f64`. - as-dvec2: func(self: i16-vec2) -> dvec2; - /// Casts all elements of `self` to `u8`. - as-u8vec2: func(self: i16-vec2) -> u8-vec2; - neg: func(self: i16-vec2) -> i16-vec2; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: i16-vec2) -> s16; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: i16-vec2, rhs: i16-vec2) -> bvec2; - /// Creates a 2D vector from `self` with the given value of `y`. - with-y: func(self: i16-vec2, y: s16) -> i16-vec2; - /// In other words this computes `[self.x.saturating_add_unsigned(rhs.x), self.y.saturating_add_unsigned(rhs.y), ..]`. - saturating-add-unsigned: func(self: i16-vec2, rhs: u16-vec2) -> i16-vec2; - /// Returns a vector with elements representing the sign of `self`. - /// - `0` if the number is zero - /// - `1` if the number is positive - /// - `-1` if the number is negative - signum: func(self: i16-vec2) -> i16-vec2; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: i16-vec2) -> u64; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: i16-vec2, rhs: i16-vec2) -> bvec2; -} - -/// Methods for I16Vec3 -interface i16-vec3 { - use types.{reflect-reference}; - - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec3, if-true: i16-vec3, if-false: i16-vec3) -> i16-vec3; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: i16-vec3, rhs: i16-vec3) -> bvec3; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u16::MAX`]. - /// See also [`checked_manhattan_distance`][I16Vec3::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: i16-vec3, rhs: i16-vec3) -> u16; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: i16-vec3, rhs: i16-vec3) -> bvec3; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - div: func(p0: i16-vec3, p1: i16-vec3) -> i16-vec3; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - /// In other words this computes `[self.x.saturating_add_unsigned(rhs.x), self.y.saturating_add_unsigned(rhs.y), ..]`. - saturating-add-unsigned: func(self: i16-vec3, rhs: u16-vec3) -> i16-vec3; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - /// Converts `self` to `[x, y, z]` - to-array: func(self: i16-vec3) -> list; - /// Creates a new vector. - new: func(x: s16, y: s16, z: s16) -> i16-vec3; - sub: func(p0: i16-vec3, p1: i16-vec3) -> i16-vec3; - sub: func(p0: i16-vec3, p1: s16) -> i16-vec3; - /// Casts all elements of `self` to `f32`. - as-vec3a: func(self: i16-vec3) -> vec3-a; - /// Returns a vector containing the wrapping addition of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_unsigned(rhs.x), self.y.wrapping_add_unsigned(rhs.y), ..]`. - wrapping-add-unsigned: func(self: i16-vec3, rhs: u16-vec3) -> i16-vec3; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: i16-vec3) -> s16; - div: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - rem: func(p0: i16-vec3, p1: s16) -> i16-vec3; - /// Creates a 3D vector from `self` with the given value of `y`. - with-y: func(self: i16-vec3, y: s16) -> i16-vec3; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: i16-vec3, rhs: i16-vec3) -> s16; - /// Computes the cross product of `self` and `rhs`. - cross: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - rem: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - /// Returns a vector with elements representing the sign of `self`. - /// - `0` if the number is zero - /// - `1` if the number is positive - /// - `-1` if the number is negative - signum: func(self: i16-vec3) -> i16-vec3; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: i16-vec3, rhs: i16-vec3) -> bvec3; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - /// Casts all elements of `self` to `i8`. - as-i8vec3: func(self: i16-vec3) -> i8-vec3; - assert-receiver-is-total-eq: func(self: i16-vec3); - add: func(p0: i16-vec3, p1: i16-vec3) -> i16-vec3; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: i16-vec3, rhs: i16-vec3) -> bvec3; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: i16-vec3, rhs: i16-vec3) -> bvec3; - /// Casts all elements of `self` to `i32`. - as-ivec3: func(self: i16-vec3) -> ivec3; - /// Creates a new vector from an array. - from-array: func(a: list) -> i16-vec3; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - mul: func(p0: i16-vec3, p1: s16) -> i16-vec3; - /// Creates a 3D vector from `self` with the given value of `z`. - with-z: func(self: i16-vec3, z: s16) -> i16-vec3; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - /// Casts all elements of `self` to `u8`. - as-u8vec3: func(self: i16-vec3) -> u8-vec3; - /// Casts all elements of `self` to `f64`. - as-dvec3: func(self: i16-vec3) -> dvec3; - /// Computes the squared length of `self`. - length-squared: func(self: i16-vec3) -> s16; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u16::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: i16-vec3, rhs: i16-vec3) -> option; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - div-euclid: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - /// [Euclidean division]: i16::rem_euclid - rem-euclid: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - neg: func(self: i16-vec3) -> i16-vec3; - /// Returns a bitmask with the lowest 3 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: i16-vec3) -> u32; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - add: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - /// Creates a 4D vector from `self` and the given `w` value. - extend: func(self: i16-vec3, w: s16) -> i16-vec4; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: i16-vec3) -> s16; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: i16-vec3) -> s16; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: i16-vec3, rhs: i16-vec3) -> s16; - add: func(p0: i16-vec3, p1: s16) -> i16-vec3; - /// Creates a 3D vector from `self` with the given value of `x`. - with-x: func(self: i16-vec3, x: s16) -> i16-vec3; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: i16-vec3, rhs: i16-vec3) -> bvec3; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: i16-vec3, rhs: i16-vec3) -> u16; - /// Component-wise clamping of values, similar to [`i16::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: i16-vec3, min: i16-vec3, max: i16-vec3) -> i16-vec3; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: i16-vec3) -> u64; - eq: func(self: i16-vec3, other: i16-vec3) -> bool; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: i16-vec3) -> u64; - /// Casts all elements of `self` to `u16`. - as-u16vec3: func(self: i16-vec3) -> u16-vec3; - mul: func(p0: i16-vec3, p1: i16-vec3) -> i16-vec3; - /// Casts all elements of `self` to `u64`. - as-u64vec3: func(self: i16-vec3) -> u64-vec3; - /// Creates a vector with all elements set to `v`. - splat: func(v: s16) -> i16-vec3; - sub: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - /// Casts all elements of `self` to `f32`. - as-vec3: func(self: i16-vec3) -> vec3; - /// Returns a vector containing the saturating subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.saturating_sub_unsigned(rhs.x), self.y.saturating_sub_unsigned(rhs.y), ..]`. - saturating-sub-unsigned: func(self: i16-vec3, rhs: u16-vec3) -> i16-vec3; - /// Casts all elements of `self` to `u32`. - as-uvec3: func(self: i16-vec3) -> uvec3; - /// Casts all elements of `self` to `i64`. - as-i64vec3: func(self: i16-vec3) -> i64-vec3; - div: func(p0: i16-vec3, p1: s16) -> i16-vec3; - rem: func(p0: i16-vec3, p1: i16-vec3) -> i16-vec3; - /// Returns a vector containing the wrapping subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_sub_unsigned(rhs.x), self.y.wrapping_sub_unsigned(rhs.y), ..]`. - wrapping-sub-unsigned: func(self: i16-vec3, rhs: u16-vec3) -> i16-vec3; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: i16-vec3) -> i16-vec3; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: i16-vec3) -> s16; - clone: func(self: i16-vec3) -> i16-vec3; - /// Creates a 2D vector from the `x` and `y` elements of `self`, discarding `z`. - /// Truncation may also be performed by using [`self.xy()`][crate::swizzles::Vec3Swizzles::xy()]. - truncate: func(self: i16-vec3) -> i16-vec2; - mul: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; -} - -/// Methods for I16Vec4 -interface i16-vec4 { - use types.{reflect-reference}; - - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: i16-vec4) -> s16; - /// Creates a new vector from an array. - from-array: func(a: list) -> i16-vec4; - /// Casts all elements of `self` to `u32`. - as-uvec4: func(self: i16-vec4) -> uvec4; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: i16-vec4, rhs: i16-vec4) -> bvec4; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: i16-vec4, rhs: i16-vec4) -> bvec4; - rem: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - /// Creates a vector with all elements set to `v`. - splat: func(v: s16) -> i16-vec4; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: i16-vec4, rhs: i16-vec4) -> bvec4; - /// Creates a 4D vector from `self` with the given value of `y`. - with-y: func(self: i16-vec4, y: s16) -> i16-vec4; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: i16-vec4) -> i16-vec4; - add: func(p0: i16-vec4, p1: s16) -> i16-vec4; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - /// [Euclidean division]: i16::rem_euclid - rem-euclid: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - /// Returns a vector containing the wrapping subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_sub_unsigned(rhs.x), self.y.wrapping_sub_unsigned(rhs.y), ..]`. - wrapping-sub-unsigned: func(self: i16-vec4, rhs: u16-vec4) -> i16-vec4; - assert-receiver-is-total-eq: func(self: i16-vec4); - sub: func(p0: i16-vec4, p1: s16) -> i16-vec4; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: i16-vec4) -> u64; - /// Casts all elements of `self` to `u16`. - as-u16vec4: func(self: i16-vec4) -> u16-vec4; - /// Creates a 4D vector from `self` with the given value of `z`. - with-z: func(self: i16-vec4, z: s16) -> i16-vec4; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - /// Returns a vector containing the wrapping addition of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_unsigned(rhs.x), self.y.wrapping_add_unsigned(rhs.y), ..]`. - wrapping-add-unsigned: func(self: i16-vec4, rhs: u16-vec4) -> i16-vec4; - sub: func(p0: i16-vec4, p1: i16-vec4) -> i16-vec4; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: i16-vec4) -> s16; - sub: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: i16-vec4, rhs: i16-vec4) -> s16; - /// Returns a vector with elements representing the sign of `self`. - /// - `0` if the number is zero - /// - `1` if the number is positive - /// - `-1` if the number is negative - signum: func(self: i16-vec4) -> i16-vec4; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: i16-vec4, rhs: i16-vec4) -> bvec4; - /// Creates a 3D vector from the `x`, `y` and `z` elements of `self`, discarding `w`. - /// Truncation to [`I16Vec3`] may also be performed by using [`self.xyz()`][crate::swizzles::Vec4Swizzles::xyz()]. - truncate: func(self: i16-vec4) -> i16-vec3; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - add: func(p0: i16-vec4, p1: i16-vec4) -> i16-vec4; - mul: func(p0: i16-vec4, p1: i16-vec4) -> i16-vec4; - div: func(p0: i16-vec4, p1: s16) -> i16-vec4; - /// In other words this computes `[self.x.saturating_add_unsigned(rhs.x), self.y.saturating_add_unsigned(rhs.y), ..]`. - saturating-add-unsigned: func(self: i16-vec4, rhs: u16-vec4) -> i16-vec4; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: i16-vec4) -> s16; - rem: func(p0: i16-vec4, p1: i16-vec4) -> i16-vec4; - mul: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - /// Casts all elements of `self` to `i8`. - as-i8vec4: func(self: i16-vec4) -> i8-vec4; - /// Casts all elements of `self` to `f64`. - as-dvec4: func(self: i16-vec4) -> dvec4; - /// Creates a 4D vector from `self` with the given value of `x`. - with-x: func(self: i16-vec4, x: s16) -> i16-vec4; - /// Component-wise clamping of values, similar to [`i16::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: i16-vec4, min: i16-vec4, max: i16-vec4) -> i16-vec4; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: i16-vec4, rhs: i16-vec4) -> u16; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u16::MAX`]. - /// See also [`checked_manhattan_distance`][I16Vec4::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: i16-vec4, rhs: i16-vec4) -> u16; - /// Creates a 4D vector from `self` with the given value of `w`. - with-w: func(self: i16-vec4, w: s16) -> i16-vec4; - /// Casts all elements of `self` to `f32`. - as-vec4: func(self: i16-vec4) -> vec4; - div: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - div-euclid: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: i16-vec4) -> u64; - /// Casts all elements of `self` to `i64`. - as-i64vec4: func(self: i16-vec4) -> i64-vec4; - /// Returns a bitmask with the lowest 4 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: i16-vec4) -> u32; - rem: func(p0: i16-vec4, p1: s16) -> i16-vec4; - clone: func(self: i16-vec4) -> i16-vec4; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - /// Creates a new vector. - new: func(x: s16, y: s16, z: s16, w: s16) -> i16-vec4; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - /// Casts all elements of `self` to `u8`. - as-u8vec4: func(self: i16-vec4) -> u8-vec4; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: i16-vec4, rhs: i16-vec4) -> bvec4; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: i16-vec4, rhs: i16-vec4) -> bvec4; - mul: func(p0: i16-vec4, p1: s16) -> i16-vec4; - neg: func(self: i16-vec4) -> i16-vec4; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - eq: func(self: i16-vec4, other: i16-vec4) -> bool; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - add: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - /// Casts all elements of `self` to `u64`. - as-u64vec4: func(self: i16-vec4) -> u64-vec4; - /// Returns a vector containing the saturating subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.saturating_sub_unsigned(rhs.x), self.y.saturating_sub_unsigned(rhs.y), ..]`. - saturating-sub-unsigned: func(self: i16-vec4, rhs: u16-vec4) -> i16-vec4; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - /// Computes the squared length of `self`. - length-squared: func(self: i16-vec4) -> s16; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: i16-vec4, rhs: i16-vec4) -> s16; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec4, if-true: i16-vec4, if-false: i16-vec4) -> i16-vec4; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: i16-vec4) -> s16; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - /// Casts all elements of `self` to `i32`. - as-ivec4: func(self: i16-vec4) -> ivec4; - div: func(p0: i16-vec4, p1: i16-vec4) -> i16-vec4; - /// Converts `self` to `[x, y, z, w]` - to-array: func(self: i16-vec4) -> list; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u16::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: i16-vec4, rhs: i16-vec4) -> option; -} - -/// Methods for I64Vec2 -interface i64-vec2 { - use types.{reflect-reference}; - - add: func(p0: i64-vec2, p1: s64) -> i64-vec2; - /// Creates a 3D vector from `self` and the given `z` value. - extend: func(self: i64-vec2, z: s64) -> i64-vec3; - /// Computes the squared length of `self`. - length-squared: func(self: i64-vec2) -> s64; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: i64-vec2, rhs: i64-vec2) -> bvec2; - /// Casts all elements of `self` to `f32`. - as-vec2: func(self: i64-vec2) -> vec2; - sub: func(p0: i64-vec2, p1: i64-vec2) -> i64-vec2; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: i64-vec2, rhs: i64-vec2) -> bvec2; - /// Casts all elements of `self` to `i32`. - as-ivec2: func(self: i64-vec2) -> ivec2; - /// Casts all elements of `self` to `u32`. - as-uvec2: func(self: i64-vec2) -> uvec2; - /// Returns a vector containing the wrapping subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_sub_unsigned(rhs.x), self.y.wrapping_sub_unsigned(rhs.y), ..]`. - wrapping-sub-unsigned: func(self: i64-vec2, rhs: u64-vec2) -> i64-vec2; - /// Returns `rhs` rotated by the angle of `self`. If `self` is normalized, - /// then this just rotation. This is what you usually want. Otherwise, - /// it will be like a rotation with a multiplication by `self`'s length. - /// This can be used to rotate by 90 degree increments, e.g. `[sin(90), cos(90)` = `[1, 0]` or - /// `[sin(180), cos(180)]` = `[0, -1]`. - rotate: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: i64-vec2) -> u64; - eq: func(self: i64-vec2, other: i64-vec2) -> bool; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: i64-vec2, rhs: i64-vec2) -> s64; - /// In other words this computes `[self.x.saturating_add_unsigned(rhs.x), self.y.saturating_add_unsigned(rhs.y), ..]`. - saturating-add-unsigned: func(self: i64-vec2, rhs: u64-vec2) -> i64-vec2; - mul: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - div-euclid: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - /// Creates a vector with all elements set to `v`. - splat: func(v: s64) -> i64-vec2; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - /// Component-wise clamping of values, similar to [`i64::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: i64-vec2, min: i64-vec2, max: i64-vec2) -> i64-vec2; - /// Casts all elements of `self` to `u8`. - as-u8vec2: func(self: i64-vec2) -> u8-vec2; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u64::MAX`]. - /// See also [`checked_manhattan_distance`][I64Vec2::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: i64-vec2, rhs: i64-vec2) -> u64; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - rem: func(p0: i64-vec2, p1: s64) -> i64-vec2; - /// Returns a bitmask with the lowest 2 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: i64-vec2) -> u32; - clone: func(self: i64-vec2) -> i64-vec2; - assert-receiver-is-total-eq: func(self: i64-vec2); - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: i64-vec2) -> s64; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: i64-vec2) -> i64-vec2; - sub: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - /// Casts all elements of `self` to `u16`. - as-u16vec2: func(self: i64-vec2) -> u16-vec2; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: i64-vec2, rhs: i64-vec2) -> bvec2; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u64::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: i64-vec2, rhs: i64-vec2) -> option; - /// The perpendicular dot product of `self` and `rhs`. - /// Also known as the wedge product, 2D cross product, and determinant. - perp-dot: func(self: i64-vec2, rhs: i64-vec2) -> s64; - div: func(p0: i64-vec2, p1: s64) -> i64-vec2; - /// Returns a vector containing the saturating subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.saturating_sub_unsigned(rhs.x), self.y.saturating_sub_unsigned(rhs.y), ..]`. - saturating-sub-unsigned: func(self: i64-vec2, rhs: u64-vec2) -> i64-vec2; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: i64-vec2) -> s64; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: i64-vec2, rhs: i64-vec2) -> bvec2; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec2, if-true: i64-vec2, if-false: i64-vec2) -> i64-vec2; - neg: func(self: i64-vec2) -> i64-vec2; - /// Converts `self` to `[x, y]` - to-array: func(self: i64-vec2) -> list; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - /// [Euclidean division]: i64::rem_euclid - rem-euclid: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - add: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - div: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: i64-vec2) -> u64; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: i64-vec2) -> s64; - sub: func(p0: i64-vec2, p1: s64) -> i64-vec2; - mul: func(p0: i64-vec2, p1: s64) -> i64-vec2; - div: func(p0: i64-vec2, p1: i64-vec2) -> i64-vec2; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: i64-vec2, rhs: i64-vec2) -> bvec2; - /// Creates a 2D vector from `self` with the given value of `y`. - with-y: func(self: i64-vec2, y: s64) -> i64-vec2; - rem: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - /// Creates a 2D vector from `self` with the given value of `x`. - with-x: func(self: i64-vec2, x: s64) -> i64-vec2; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: i64-vec2, rhs: i64-vec2) -> u64; - add: func(p0: i64-vec2, p1: i64-vec2) -> i64-vec2; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: i64-vec2, rhs: i64-vec2) -> s64; - /// Casts all elements of `self` to `i8`. - as-i8vec2: func(self: i64-vec2) -> i8-vec2; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - /// Casts all elements of `self` to `i16`. - as-i16vec2: func(self: i64-vec2) -> i16-vec2; - mul: func(p0: i64-vec2, p1: i64-vec2) -> i64-vec2; - /// Creates a new vector. - new: func(x: s64, y: s64) -> i64-vec2; - /// Returns a vector that is equal to `self` rotated by 90 degrees. - perp: func(self: i64-vec2) -> i64-vec2; - rem: func(p0: i64-vec2, p1: i64-vec2) -> i64-vec2; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: i64-vec2) -> s64; - /// Casts all elements of `self` to `f64`. - as-dvec2: func(self: i64-vec2) -> dvec2; - /// Casts all elements of `self` to `u64`. - as-u64vec2: func(self: i64-vec2) -> u64-vec2; - /// Returns a vector with elements representing the sign of `self`. - /// - `0` if the number is zero - /// - `1` if the number is positive - /// - `-1` if the number is negative - signum: func(self: i64-vec2) -> i64-vec2; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - /// Returns a vector containing the wrapping addition of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_unsigned(rhs.x), self.y.wrapping_add_unsigned(rhs.y), ..]`. - wrapping-add-unsigned: func(self: i64-vec2, rhs: u64-vec2) -> i64-vec2; - /// Creates a new vector from an array. - from-array: func(a: list) -> i64-vec2; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: i64-vec2, rhs: i64-vec2) -> bvec2; -} - -/// Methods for I64Vec3 -interface i64-vec3 { - use types.{reflect-reference}; - - /// Creates a 3D vector from `self` with the given value of `x`. - with-x: func(self: i64-vec3, x: s64) -> i64-vec3; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: i64-vec3, rhs: i64-vec3) -> bvec3; - /// Casts all elements of `self` to `i8`. - as-i8vec3: func(self: i64-vec3) -> i8-vec3; - mul: func(p0: i64-vec3, p1: i64-vec3) -> i64-vec3; - /// Casts all elements of `self` to `i16`. - as-i16vec3: func(self: i64-vec3) -> i16-vec3; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: i64-vec3, rhs: i64-vec3) -> bvec3; - sub: func(p0: i64-vec3, p1: s64) -> i64-vec3; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u64::MAX`]. - /// See also [`checked_manhattan_distance`][I64Vec3::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: i64-vec3, rhs: i64-vec3) -> u64; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - /// [Euclidean division]: i64::rem_euclid - rem-euclid: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: i64-vec3) -> s64; - /// Casts all elements of `self` to `f64`. - as-dvec3: func(self: i64-vec3) -> dvec3; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: i64-vec3, rhs: i64-vec3) -> bvec3; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - rem: func(p0: i64-vec3, p1: i64-vec3) -> i64-vec3; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - div-euclid: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: i64-vec3) -> s64; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: i64-vec3, rhs: i64-vec3) -> u64; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - /// Creates a new vector. - new: func(x: s64, y: s64, z: s64) -> i64-vec3; - /// Returns a vector containing the saturating subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.saturating_sub_unsigned(rhs.x), self.y.saturating_sub_unsigned(rhs.y), ..]`. - saturating-sub-unsigned: func(self: i64-vec3, rhs: u64-vec3) -> i64-vec3; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: i64-vec3) -> i64-vec3; - /// Returns a vector with elements representing the sign of `self`. - /// - `0` if the number is zero - /// - `1` if the number is positive - /// - `-1` if the number is negative - signum: func(self: i64-vec3) -> i64-vec3; - /// Casts all elements of `self` to `i32`. - as-ivec3: func(self: i64-vec3) -> ivec3; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: i64-vec3) -> s64; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: i64-vec3, rhs: i64-vec3) -> bvec3; - /// Casts all elements of `self` to `f32`. - as-vec3a: func(self: i64-vec3) -> vec3-a; - sub: func(p0: i64-vec3, p1: i64-vec3) -> i64-vec3; - /// Computes the cross product of `self` and `rhs`. - cross: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - add: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: i64-vec3) -> s64; - /// Creates a new vector from an array. - from-array: func(a: list) -> i64-vec3; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - /// Creates a 3D vector from `self` with the given value of `y`. - with-y: func(self: i64-vec3, y: s64) -> i64-vec3; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - /// Returns a vector containing the wrapping subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_sub_unsigned(rhs.x), self.y.wrapping_sub_unsigned(rhs.y), ..]`. - wrapping-sub-unsigned: func(self: i64-vec3, rhs: u64-vec3) -> i64-vec3; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec3, if-true: i64-vec3, if-false: i64-vec3) -> i64-vec3; - /// Creates a 3D vector from `self` with the given value of `z`. - with-z: func(self: i64-vec3, z: s64) -> i64-vec3; - /// Casts all elements of `self` to `f32`. - as-vec3: func(self: i64-vec3) -> vec3; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: i64-vec3) -> u64; - eq: func(self: i64-vec3, other: i64-vec3) -> bool; - add: func(p0: i64-vec3, p1: i64-vec3) -> i64-vec3; - /// Creates a 2D vector from the `x` and `y` elements of `self`, discarding `z`. - /// Truncation may also be performed by using [`self.xy()`][crate::swizzles::Vec3Swizzles::xy()]. - truncate: func(self: i64-vec3) -> i64-vec2; - /// Converts `self` to `[x, y, z]` - to-array: func(self: i64-vec3) -> list; - /// Creates a 4D vector from `self` and the given `w` value. - extend: func(self: i64-vec3, w: s64) -> i64-vec4; - rem: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - add: func(p0: i64-vec3, p1: s64) -> i64-vec3; - neg: func(self: i64-vec3) -> i64-vec3; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: i64-vec3, rhs: i64-vec3) -> s64; - sub: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - /// Computes the squared length of `self`. - length-squared: func(self: i64-vec3) -> s64; - /// Casts all elements of `self` to `u16`. - as-u16vec3: func(self: i64-vec3) -> u16-vec3; - div: func(p0: i64-vec3, p1: s64) -> i64-vec3; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: i64-vec3, rhs: i64-vec3) -> bvec3; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - assert-receiver-is-total-eq: func(self: i64-vec3); - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: i64-vec3, rhs: i64-vec3) -> s64; - /// Creates a vector with all elements set to `v`. - splat: func(v: s64) -> i64-vec3; - /// Casts all elements of `self` to `u8`. - as-u8vec3: func(self: i64-vec3) -> u8-vec3; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: i64-vec3, rhs: i64-vec3) -> bvec3; - div: func(p0: i64-vec3, p1: i64-vec3) -> i64-vec3; - /// Casts all elements of `self` to `u64`. - as-u64vec3: func(self: i64-vec3) -> u64-vec3; - /// In other words this computes `[self.x.saturating_add_unsigned(rhs.x), self.y.saturating_add_unsigned(rhs.y), ..]`. - saturating-add-unsigned: func(self: i64-vec3, rhs: u64-vec3) -> i64-vec3; - /// Casts all elements of `self` to `u32`. - as-uvec3: func(self: i64-vec3) -> uvec3; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u64::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: i64-vec3, rhs: i64-vec3) -> option; - /// Returns a vector containing the wrapping addition of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_unsigned(rhs.x), self.y.wrapping_add_unsigned(rhs.y), ..]`. - wrapping-add-unsigned: func(self: i64-vec3, rhs: u64-vec3) -> i64-vec3; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - rem: func(p0: i64-vec3, p1: s64) -> i64-vec3; - /// Returns a bitmask with the lowest 3 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: i64-vec3) -> u32; - div: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - mul: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: i64-vec3) -> u64; - clone: func(self: i64-vec3) -> i64-vec3; - mul: func(p0: i64-vec3, p1: s64) -> i64-vec3; - /// Component-wise clamping of values, similar to [`i64::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: i64-vec3, min: i64-vec3, max: i64-vec3) -> i64-vec3; -} - -/// Methods for I64Vec4 -interface i64-vec4 { - use types.{reflect-reference}; - - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; - mul: func(p0: i64-vec4, p1: i64-vec4) -> i64-vec4; - /// In other words this computes `[self.x.saturating_add_unsigned(rhs.x), self.y.saturating_add_unsigned(rhs.y), ..]`. - saturating-add-unsigned: func(self: i64-vec4, rhs: u64-vec4) -> i64-vec4; - /// Creates a 4D vector from `self` with the given value of `w`. - with-w: func(self: i64-vec4, w: s64) -> i64-vec4; - rem: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; - /// Casts all elements of `self` to `u16`. - as-u16vec4: func(self: i64-vec4) -> u16-vec4; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: i64-vec4) -> s64; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; - add: func(p0: i64-vec4, p1: i64-vec4) -> i64-vec4; - /// Returns a vector with elements representing the sign of `self`. - /// - `0` if the number is zero - /// - `1` if the number is positive - /// - `-1` if the number is negative - signum: func(self: i64-vec4) -> i64-vec4; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: i64-vec4, rhs: i64-vec4) -> bvec4; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: i64-vec4) -> s64; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: i64-vec4, rhs: i64-vec4) -> u64; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - /// [Euclidean division]: i64::rem_euclid - rem-euclid: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: i64-vec4) -> s64; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u64::MAX`]. - /// See also [`checked_manhattan_distance`][I64Vec4::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: i64-vec4, rhs: i64-vec4) -> u64; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: i64-vec4, rhs: i64-vec4) -> s64; - /// Creates a 4D vector from `self` with the given value of `x`. - with-x: func(self: i64-vec4, x: s64) -> i64-vec4; - /// Casts all elements of `self` to `i8`. - as-i8vec4: func(self: i64-vec4) -> i8-vec4; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; - /// Casts all elements of `self` to `f64`. - as-dvec4: func(self: i64-vec4) -> dvec4; - sub: func(p0: i64-vec4, p1: s64) -> i64-vec4; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; - rem: func(p0: i64-vec4, p1: i64-vec4) -> i64-vec4; - add: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; - assert-receiver-is-total-eq: func(self: i64-vec4); - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: i64-vec4) -> s64; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: i64-vec4) -> i64-vec4; - clone: func(self: i64-vec4) -> i64-vec4; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; - /// Creates a 3D vector from the `x`, `y` and `z` elements of `self`, discarding `w`. - /// Truncation to [`I64Vec3`] may also be performed by using [`self.xyz()`][crate::swizzles::Vec4Swizzles::xyz()]. - truncate: func(self: i64-vec4) -> i64-vec3; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: i64-vec4, rhs: i64-vec4) -> bvec4; - add: func(p0: i64-vec4, p1: s64) -> i64-vec4; - /// Component-wise clamping of values, similar to [`i64::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: i64-vec4, min: i64-vec4, max: i64-vec4) -> i64-vec4; - sub: func(p0: i64-vec4, p1: i64-vec4) -> i64-vec4; - /// Converts `self` to `[x, y, z, w]` - to-array: func(self: i64-vec4) -> list; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: i64-vec4, rhs: i64-vec4) -> bvec4; - /// Casts all elements of `self` to `u8`. - as-u8vec4: func(self: i64-vec4) -> u8-vec4; - /// Casts all elements of `self` to `u64`. - as-u64vec4: func(self: i64-vec4) -> u64-vec4; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; - /// Creates a 4D vector from `self` with the given value of `z`. - with-z: func(self: i64-vec4, z: s64) -> i64-vec4; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: i64-vec4) -> u64; - rem: func(p0: i64-vec4, p1: s64) -> i64-vec4; - mul: func(p0: i64-vec4, p1: s64) -> i64-vec4; - /// Creates a new vector. - new: func(x: s64, y: s64, z: s64, w: s64) -> i64-vec4; - /// Returns a vector containing the wrapping subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_sub_unsigned(rhs.x), self.y.wrapping_sub_unsigned(rhs.y), ..]`. - wrapping-sub-unsigned: func(self: i64-vec4, rhs: u64-vec4) -> i64-vec4; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - div-euclid: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; - mul: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; - /// Creates a new vector from an array. - from-array: func(a: list) -> i64-vec4; - div: func(p0: i64-vec4, p1: i64-vec4) -> i64-vec4; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; - /// Returns a vector containing the wrapping addition of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_unsigned(rhs.x), self.y.wrapping_add_unsigned(rhs.y), ..]`. - wrapping-add-unsigned: func(self: i64-vec4, rhs: u64-vec4) -> i64-vec4; - /// Creates a vector with all elements set to `v`. - splat: func(v: s64) -> i64-vec4; - /// Casts all elements of `self` to `f32`. - as-vec4: func(self: i64-vec4) -> vec4; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec4, if-true: i64-vec4, if-false: i64-vec4) -> i64-vec4; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: i64-vec4, rhs: i64-vec4) -> bvec4; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: i64-vec4, rhs: i64-vec4) -> bvec4; - /// Creates a 4D vector from `self` with the given value of `y`. - with-y: func(self: i64-vec4, y: s64) -> i64-vec4; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; - neg: func(self: i64-vec4) -> i64-vec4; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: i64-vec4, rhs: i64-vec4) -> s64; - eq: func(self: i64-vec4, other: i64-vec4) -> bool; - /// Returns a bitmask with the lowest 4 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: i64-vec4) -> u32; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: i64-vec4) -> u64; - div: func(p0: i64-vec4, p1: s64) -> i64-vec4; - /// Casts all elements of `self` to `i32`. - as-ivec4: func(self: i64-vec4) -> ivec4; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: i64-vec4, rhs: i64-vec4) -> bvec4; - /// Casts all elements of `self` to `u32`. - as-uvec4: func(self: i64-vec4) -> uvec4; - /// Casts all elements of `self` to `i16`. - as-i16vec4: func(self: i64-vec4) -> i16-vec4; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u64::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: i64-vec4, rhs: i64-vec4) -> option; - /// Computes the squared length of `self`. - length-squared: func(self: i64-vec4) -> s64; - div: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; - /// Returns a vector containing the saturating subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.saturating_sub_unsigned(rhs.x), self.y.saturating_sub_unsigned(rhs.y), ..]`. - saturating-sub-unsigned: func(self: i64-vec4, rhs: u64-vec4) -> i64-vec4; - sub: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; -} - -/// Methods for I8Vec2 -interface i8-vec2 { - use types.{reflect-reference}; - - /// Creates a 2D vector from `self` with the given value of `x`. - with-x: func(self: i8-vec2, x: s8) -> i8-vec2; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: i8-vec2, rhs: i8-vec2) -> s8; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: i8-vec2, rhs: i8-vec2) -> bvec2; - div: func(p0: i8-vec2, p1: i8-vec2) -> i8-vec2; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: i8-vec2) -> s8; - clone: func(self: i8-vec2) -> i8-vec2; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - mul: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - /// Creates a 3D vector from `self` and the given `z` value. - extend: func(self: i8-vec2, z: s8) -> i8-vec3; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: i8-vec2) -> u64; - /// Casts all elements of `self` to `f32`. - as-vec2: func(self: i8-vec2) -> vec2; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: i8-vec2) -> s8; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - add: func(p0: i8-vec2, p1: s8) -> i8-vec2; - /// Creates a new vector from an array. - from-array: func(a: list) -> i8-vec2; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - /// Casts all elements of `self` to `i64`. - as-i64vec2: func(self: i8-vec2) -> i64-vec2; - mul: func(p0: i8-vec2, p1: s8) -> i8-vec2; - /// Returns a vector containing the saturating subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.saturating_sub_unsigned(rhs.x), self.y.saturating_sub_unsigned(rhs.y), ..]`. - saturating-sub-unsigned: func(self: i8-vec2, rhs: u8-vec2) -> i8-vec2; - /// Computes the squared length of `self`. - length-squared: func(self: i8-vec2) -> s8; - add: func(p0: i8-vec2, p1: i8-vec2) -> i8-vec2; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: i8-vec2, rhs: i8-vec2) -> bvec2; - /// Returns a vector containing the wrapping addition of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_unsigned(rhs.x), self.y.wrapping_add_unsigned(rhs.y), ..]`. - wrapping-add-unsigned: func(self: i8-vec2, rhs: u8-vec2) -> i8-vec2; - eq: func(self: i8-vec2, other: i8-vec2) -> bool; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - /// Returns a vector containing the wrapping subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_sub_unsigned(rhs.x), self.y.wrapping_sub_unsigned(rhs.y), ..]`. - wrapping-sub-unsigned: func(self: i8-vec2, rhs: u8-vec2) -> i8-vec2; - div: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec2, if-true: i8-vec2, if-false: i8-vec2) -> i8-vec2; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - /// Casts all elements of `self` to `f64`. - as-dvec2: func(self: i8-vec2) -> dvec2; - /// In other words this computes `[self.x.saturating_add_unsigned(rhs.x), self.y.saturating_add_unsigned(rhs.y), ..]`. - saturating-add-unsigned: func(self: i8-vec2, rhs: u8-vec2) -> i8-vec2; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - div: func(p0: i8-vec2, p1: s8) -> i8-vec2; - rem: func(p0: i8-vec2, p1: i8-vec2) -> i8-vec2; - rem: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - /// Creates a new vector. - new: func(x: s8, y: s8) -> i8-vec2; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u8::MAX`]. - /// See also [`checked_manhattan_distance`][I8Vec2::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: i8-vec2, rhs: i8-vec2) -> u8; - mul: func(p0: i8-vec2, p1: i8-vec2) -> i8-vec2; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: i8-vec2, rhs: i8-vec2) -> bvec2; - sub: func(p0: i8-vec2, p1: i8-vec2) -> i8-vec2; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: i8-vec2, rhs: i8-vec2) -> bvec2; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - rem: func(p0: i8-vec2, p1: s8) -> i8-vec2; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - /// [Euclidean division]: i8::rem_euclid - rem-euclid: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - /// Returns a vector that is equal to `self` rotated by 90 degrees. - perp: func(self: i8-vec2) -> i8-vec2; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - /// Casts all elements of `self` to `u32`. - as-uvec2: func(self: i8-vec2) -> uvec2; - /// Creates a vector with all elements set to `v`. - splat: func(v: s8) -> i8-vec2; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - div-euclid: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - /// Returns a vector with elements representing the sign of `self`. - /// - `0` if the number is zero - /// - `1` if the number is positive - /// - `-1` if the number is negative - signum: func(self: i8-vec2) -> i8-vec2; - sub: func(p0: i8-vec2, p1: s8) -> i8-vec2; - /// Casts all elements of `self` to `i32`. - as-ivec2: func(self: i8-vec2) -> ivec2; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - /// Converts `self` to `[x, y]` - to-array: func(self: i8-vec2) -> list; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - /// Casts all elements of `self` to `u16`. - as-u16vec2: func(self: i8-vec2) -> u16-vec2; - /// The perpendicular dot product of `self` and `rhs`. - /// Also known as the wedge product, 2D cross product, and determinant. - perp-dot: func(self: i8-vec2, rhs: i8-vec2) -> s8; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: i8-vec2, rhs: i8-vec2) -> u8; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: i8-vec2) -> s8; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u8::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: i8-vec2, rhs: i8-vec2) -> option; - /// Casts all elements of `self` to `u64`. - as-u64vec2: func(self: i8-vec2) -> u64-vec2; - /// Returns a bitmask with the lowest 2 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: i8-vec2) -> u32; - add: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - /// Component-wise clamping of values, similar to [`i8::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: i8-vec2, min: i8-vec2, max: i8-vec2) -> i8-vec2; - assert-receiver-is-total-eq: func(self: i8-vec2); - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: i8-vec2, rhs: i8-vec2) -> bvec2; - neg: func(self: i8-vec2) -> i8-vec2; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: i8-vec2) -> u64; - /// Casts all elements of `self` to `u8`. - as-u8vec2: func(self: i8-vec2) -> u8-vec2; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: i8-vec2, rhs: i8-vec2) -> s8; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: i8-vec2) -> i8-vec2; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - sub: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: i8-vec2, rhs: i8-vec2) -> bvec2; - /// Casts all elements of `self` to `i16`. - as-i16vec2: func(self: i8-vec2) -> i16-vec2; - /// Creates a 2D vector from `self` with the given value of `y`. - with-y: func(self: i8-vec2, y: s8) -> i8-vec2; - /// Returns `rhs` rotated by the angle of `self`. If `self` is normalized, - /// then this just rotation. This is what you usually want. Otherwise, - /// it will be like a rotation with a multiplication by `self`'s length. - /// This can be used to rotate by 90 degree increments, e.g. `[sin(90), cos(90)` = `[1, 0]` or - /// `[sin(180), cos(180)]` = `[0, -1]`. - rotate: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: i8-vec2) -> s8; -} - -/// Methods for I8Vec3 -interface i8-vec3 { - use types.{reflect-reference}; - - mul: func(p0: i8-vec3, p1: s8) -> i8-vec3; - rem: func(p0: i8-vec3, p1: i8-vec3) -> i8-vec3; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: i8-vec3) -> u64; - clone: func(self: i8-vec3) -> i8-vec3; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: i8-vec3) -> i8-vec3; - /// Creates a 4D vector from `self` and the given `w` value. - extend: func(self: i8-vec3, w: s8) -> i8-vec4; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u8::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: i8-vec3, rhs: i8-vec3) -> option; - /// Creates a vector with all elements set to `v`. - splat: func(v: s8) -> i8-vec3; - /// Returns a bitmask with the lowest 3 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: i8-vec3) -> u32; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: i8-vec3, rhs: i8-vec3) -> u8; - /// Computes the cross product of `self` and `rhs`. - cross: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - div: func(p0: i8-vec3, p1: i8-vec3) -> i8-vec3; - add: func(p0: i8-vec3, p1: i8-vec3) -> i8-vec3; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - /// Casts all elements of `self` to `u16`. - as-u16vec3: func(self: i8-vec3) -> u16-vec3; - /// Casts all elements of `self` to `f32`. - as-vec3a: func(self: i8-vec3) -> vec3-a; - /// Returns a vector containing the saturating subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.saturating_sub_unsigned(rhs.x), self.y.saturating_sub_unsigned(rhs.y), ..]`. - saturating-sub-unsigned: func(self: i8-vec3, rhs: u8-vec3) -> i8-vec3; - neg: func(self: i8-vec3) -> i8-vec3; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - /// Component-wise clamping of values, similar to [`i8::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: i8-vec3, min: i8-vec3, max: i8-vec3) -> i8-vec3; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: i8-vec3) -> s8; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - /// Computes the squared length of `self`. - length-squared: func(self: i8-vec3) -> s8; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - /// Casts all elements of `self` to `f64`. - as-dvec3: func(self: i8-vec3) -> dvec3; - /// Returns a vector with elements representing the sign of `self`. - /// - `0` if the number is zero - /// - `1` if the number is positive - /// - `-1` if the number is negative - signum: func(self: i8-vec3) -> i8-vec3; - mul: func(p0: i8-vec3, p1: i8-vec3) -> i8-vec3; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - div-euclid: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - /// Returns a vector containing the wrapping addition of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_unsigned(rhs.x), self.y.wrapping_add_unsigned(rhs.y), ..]`. - wrapping-add-unsigned: func(self: i8-vec3, rhs: u8-vec3) -> i8-vec3; - add: func(p0: i8-vec3, p1: s8) -> i8-vec3; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: i8-vec3, rhs: i8-vec3) -> bvec3; - /// Creates a new vector. - new: func(x: s8, y: s8, z: s8) -> i8-vec3; - /// Converts `self` to `[x, y, z]` - to-array: func(self: i8-vec3) -> list; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u8::MAX`]. - /// See also [`checked_manhattan_distance`][I8Vec3::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: i8-vec3, rhs: i8-vec3) -> u8; - mul: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - /// Casts all elements of `self` to `f32`. - as-vec3: func(self: i8-vec3) -> vec3; - sub: func(p0: i8-vec3, p1: s8) -> i8-vec3; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - /// Casts all elements of `self` to `i16`. - as-i16vec3: func(self: i8-vec3) -> i16-vec3; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: i8-vec3, rhs: i8-vec3) -> bvec3; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - /// [Euclidean division]: i8::rem_euclid - rem-euclid: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - /// Casts all elements of `self` to `i32`. - as-ivec3: func(self: i8-vec3) -> ivec3; - sub: func(p0: i8-vec3, p1: i8-vec3) -> i8-vec3; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - /// Returns a vector containing the wrapping subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_sub_unsigned(rhs.x), self.y.wrapping_sub_unsigned(rhs.y), ..]`. - wrapping-sub-unsigned: func(self: i8-vec3, rhs: u8-vec3) -> i8-vec3; - /// Casts all elements of `self` to `u32`. - as-uvec3: func(self: i8-vec3) -> uvec3; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - /// Casts all elements of `self` to `u64`. - as-u64vec3: func(self: i8-vec3) -> u64-vec3; - assert-receiver-is-total-eq: func(self: i8-vec3); - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: i8-vec3, rhs: i8-vec3) -> bvec3; - /// Creates a 2D vector from the `x` and `y` elements of `self`, discarding `z`. - /// Truncation may also be performed by using [`self.xy()`][crate::swizzles::Vec3Swizzles::xy()]. - truncate: func(self: i8-vec3) -> i8-vec2; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: i8-vec3, rhs: i8-vec3) -> bvec3; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec3, if-true: i8-vec3, if-false: i8-vec3) -> i8-vec3; - /// Creates a 3D vector from `self` with the given value of `z`. - with-z: func(self: i8-vec3, z: s8) -> i8-vec3; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: i8-vec3, rhs: i8-vec3) -> bvec3; - sub: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: i8-vec3) -> s8; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: i8-vec3) -> s8; - /// Creates a new vector from an array. - from-array: func(a: list) -> i8-vec3; - /// Creates a 3D vector from `self` with the given value of `y`. - with-y: func(self: i8-vec3, y: s8) -> i8-vec3; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: i8-vec3) -> s8; - add: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - eq: func(self: i8-vec3, other: i8-vec3) -> bool; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: i8-vec3, rhs: i8-vec3) -> bvec3; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: i8-vec3) -> u64; - div: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - rem: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - /// Creates a 3D vector from `self` with the given value of `x`. - with-x: func(self: i8-vec3, x: s8) -> i8-vec3; - rem: func(p0: i8-vec3, p1: s8) -> i8-vec3; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: i8-vec3, rhs: i8-vec3) -> s8; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: i8-vec3, rhs: i8-vec3) -> s8; - div: func(p0: i8-vec3, p1: s8) -> i8-vec3; - /// Casts all elements of `self` to `i64`. - as-i64vec3: func(self: i8-vec3) -> i64-vec3; - /// Casts all elements of `self` to `u8`. - as-u8vec3: func(self: i8-vec3) -> u8-vec3; - /// In other words this computes `[self.x.saturating_add_unsigned(rhs.x), self.y.saturating_add_unsigned(rhs.y), ..]`. - saturating-add-unsigned: func(self: i8-vec3, rhs: u8-vec3) -> i8-vec3; -} - -/// Methods for I8Vec4 -interface i8-vec4 { - use types.{reflect-reference}; - - /// Creates a new vector from an array. - from-array: func(a: list) -> i8-vec4; - /// Casts all elements of `self` to `u32`. - as-uvec4: func(self: i8-vec4) -> uvec4; - eq: func(self: i8-vec4, other: i8-vec4) -> bool; - /// Creates a 4D vector from `self` with the given value of `w`. - with-w: func(self: i8-vec4, w: s8) -> i8-vec4; - /// In other words this computes `[self.x.saturating_add_unsigned(rhs.x), self.y.saturating_add_unsigned(rhs.y), ..]`. - saturating-add-unsigned: func(self: i8-vec4, rhs: u8-vec4) -> i8-vec4; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: i8-vec4) -> u64; - /// Creates a vector with all elements set to `v`. - splat: func(v: s8) -> i8-vec4; - mul: func(p0: i8-vec4, p1: s8) -> i8-vec4; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; - mul: func(p0: i8-vec4, p1: i8-vec4) -> i8-vec4; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: i8-vec4, rhs: i8-vec4) -> s8; - /// Creates a 3D vector from the `x`, `y` and `z` elements of `self`, discarding `w`. - /// Truncation to [`I8Vec3`] may also be performed by using [`self.xyz()`][crate::swizzles::Vec4Swizzles::xyz()]. - truncate: func(self: i8-vec4) -> i8-vec3; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; - /// Returns a vector containing the wrapping subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_sub_unsigned(rhs.x), self.y.wrapping_sub_unsigned(rhs.y), ..]`. - wrapping-sub-unsigned: func(self: i8-vec4, rhs: u8-vec4) -> i8-vec4; - /// Casts all elements of `self` to `u16`. - as-u16vec4: func(self: i8-vec4) -> u16-vec4; - /// Converts `self` to `[x, y, z, w]` - to-array: func(self: i8-vec4) -> list; - /// Returns a vector containing the saturating subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.saturating_sub_unsigned(rhs.x), self.y.saturating_sub_unsigned(rhs.y), ..]`. - saturating-sub-unsigned: func(self: i8-vec4, rhs: u8-vec4) -> i8-vec4; - sub: func(p0: i8-vec4, p1: s8) -> i8-vec4; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: i8-vec4, rhs: i8-vec4) -> bvec4; - /// Casts all elements of `self` to `i16`. - as-i16vec4: func(self: i8-vec4) -> i16-vec4; - /// Component-wise clamping of values, similar to [`i8::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: i8-vec4, min: i8-vec4, max: i8-vec4) -> i8-vec4; - add: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; - /// Casts all elements of `self` to `f32`. - as-vec4: func(self: i8-vec4) -> vec4; - div: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; - /// Casts all elements of `self` to `f64`. - as-dvec4: func(self: i8-vec4) -> dvec4; - /// Computes the squared length of `self`. - length-squared: func(self: i8-vec4) -> s8; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: i8-vec4, rhs: i8-vec4) -> bvec4; - /// Returns a vector containing the wrapping addition of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_unsigned(rhs.x), self.y.wrapping_add_unsigned(rhs.y), ..]`. - wrapping-add-unsigned: func(self: i8-vec4, rhs: u8-vec4) -> i8-vec4; - /// Casts all elements of `self` to `i64`. - as-i64vec4: func(self: i8-vec4) -> i64-vec4; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: i8-vec4) -> s8; - add: func(p0: i8-vec4, p1: s8) -> i8-vec4; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - div-euclid: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u8::MAX`]. - /// See also [`checked_manhattan_distance`][I8Vec4::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: i8-vec4, rhs: i8-vec4) -> u8; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; - assert-receiver-is-total-eq: func(self: i8-vec4); - /// Returns the index of the first minimum element of `self`. - min-position: func(self: i8-vec4) -> u64; - add: func(p0: i8-vec4, p1: i8-vec4) -> i8-vec4; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: i8-vec4) -> s8; - sub: func(p0: i8-vec4, p1: i8-vec4) -> i8-vec4; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec4, if-true: i8-vec4, if-false: i8-vec4) -> i8-vec4; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: i8-vec4, rhs: i8-vec4) -> bvec4; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u8::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: i8-vec4, rhs: i8-vec4) -> option; - /// Creates a 4D vector from `self` with the given value of `y`. - with-y: func(self: i8-vec4, y: s8) -> i8-vec4; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; - /// Creates a 4D vector from `self` with the given value of `z`. - with-z: func(self: i8-vec4, z: s8) -> i8-vec4; - neg: func(self: i8-vec4) -> i8-vec4; - rem: func(p0: i8-vec4, p1: s8) -> i8-vec4; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; - /// Casts all elements of `self` to `u64`. - as-u64vec4: func(self: i8-vec4) -> u64-vec4; - /// Returns a bitmask with the lowest 4 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: i8-vec4) -> u32; - clone: func(self: i8-vec4) -> i8-vec4; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; - /// Creates a 4D vector from `self` with the given value of `x`. - with-x: func(self: i8-vec4, x: s8) -> i8-vec4; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: i8-vec4) -> i8-vec4; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: i8-vec4) -> s8; - /// Returns a vector with elements representing the sign of `self`. - /// - `0` if the number is zero - /// - `1` if the number is positive - /// - `-1` if the number is negative - signum: func(self: i8-vec4) -> i8-vec4; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: i8-vec4, rhs: i8-vec4) -> u8; - /// Casts all elements of `self` to `i32`. - as-ivec4: func(self: i8-vec4) -> ivec4; - rem: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: i8-vec4) -> s8; - div: func(p0: i8-vec4, p1: i8-vec4) -> i8-vec4; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: i8-vec4, rhs: i8-vec4) -> bvec4; - mul: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: i8-vec4, rhs: i8-vec4) -> bvec4; - /// Creates a new vector. - new: func(x: s8, y: s8, z: s8, w: s8) -> i8-vec4; - div: func(p0: i8-vec4, p1: s8) -> i8-vec4; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: i8-vec4, rhs: i8-vec4) -> bvec4; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: i8-vec4, rhs: i8-vec4) -> s8; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; - rem: func(p0: i8-vec4, p1: i8-vec4) -> i8-vec4; - sub: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - /// [Euclidean division]: i8::rem_euclid - rem-euclid: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; - /// Casts all elements of `self` to `u8`. - as-u8vec4: func(self: i8-vec4) -> u8-vec4; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; -} - -/// Methods for IVec2 -interface ivec2 { - use types.{reflect-reference}; - - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: ivec2, rhs: ivec2) -> ivec2; - rem: func(self: ivec2, rhs: ivec2) -> ivec2; - div: func(self: ivec2, rhs: ivec2) -> ivec2; - /// Creates a 2D vector from `self` with the given value of `y`. - with-y: func(self: ivec2, y: s32) -> ivec2; - /// Creates a 3D vector from `self` and the given `z` value. - extend: func(self: ivec2, z: s32) -> ivec3; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: ivec2, rhs: ivec2) -> ivec2; - eq: func(self: ivec2, other: ivec2) -> bool; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: ivec2, rhs: ivec2) -> ivec2; - assert-receiver-is-total-eq: func(self: ivec2); - /// Returns a vector containing the saturating subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.saturating_sub_unsigned(rhs.x), self.y.saturating_sub_unsigned(rhs.y), ..]`. - saturating-sub-unsigned: func(self: ivec2, rhs: uvec2) -> ivec2; - mul: func(p0: ivec2, p1: s32) -> ivec2; - /// Casts all elements of `self` to `u64`. - as-u64vec2: func(self: ivec2) -> u64-vec2; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: ivec2) -> s32; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: ivec2, rhs: ivec2) -> s32; - /// Creates a new vector. - new: func(x: s32, y: s32) -> ivec2; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: ivec2, rhs: ivec2) -> ivec2; - /// Converts `self` to `[x, y]` - to-array: func(self: ivec2) -> list; - /// Returns a vector that is equal to `self` rotated by 90 degrees. - perp: func(self: ivec2) -> ivec2; - /// Casts all elements of `self` to `i64`. - as-i64vec2: func(self: ivec2) -> i64-vec2; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: ivec2, rhs: ivec2) -> ivec2; - /// Returns `rhs` rotated by the angle of `self`. If `self` is normalized, - /// then this just rotation. This is what you usually want. Otherwise, - /// it will be like a rotation with a multiplication by `self`'s length. - /// This can be used to rotate by 90 degree increments, e.g. `[sin(90), cos(90)` = `[1, 0]` or - /// `[sin(180), cos(180)]` = `[0, -1]`. - rotate: func(self: ivec2, rhs: ivec2) -> ivec2; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: ivec2) -> s32; - /// Returns a vector containing the wrapping subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_sub_unsigned(rhs.x), self.y.wrapping_sub_unsigned(rhs.y), ..]`. - wrapping-sub-unsigned: func(self: ivec2, rhs: uvec2) -> ivec2; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: ivec2, rhs: ivec2) -> bvec2; - /// Casts all elements of `self` to `u8`. - as-u8vec2: func(self: ivec2) -> u8-vec2; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: ivec2) -> s32; - sub: func(p0: ivec2, p1: ivec2) -> ivec2; - /// Casts all elements of `self` to `u32`. - as-uvec2: func(self: ivec2) -> uvec2; - /// Creates a 2D vector from `self` with the given value of `x`. - with-x: func(self: ivec2, x: s32) -> ivec2; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u32::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: ivec2, rhs: ivec2) -> option; - /// Casts all elements of `self` to `i16`. - as-i16vec2: func(self: ivec2) -> i16-vec2; - sub: func(self: ivec2, rhs: ivec2) -> ivec2; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: ivec2, rhs: ivec2) -> ivec2; - rem: func(p0: ivec2, p1: ivec2) -> ivec2; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: ivec2, rhs: ivec2) -> bvec2; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: ivec2, rhs: ivec2) -> ivec2; - neg: func(self: ivec2) -> ivec2; - /// Creates a new vector from an array. - from-array: func(a: list) -> ivec2; - /// Casts all elements of `self` to `f64`. - as-dvec2: func(self: ivec2) -> dvec2; - div: func(p0: ivec2, p1: s32) -> ivec2; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec2, if-true: ivec2, if-false: ivec2) -> ivec2; - mul: func(p0: ivec2, p1: ivec2) -> ivec2; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: ivec2, rhs: ivec2) -> ivec2; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: ivec2) -> u64; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: ivec2, rhs: ivec2) -> bvec2; - /// Returns a vector with elements representing the sign of `self`. - /// - `0` if the number is zero - /// - `1` if the number is positive - /// - `-1` if the number is negative - signum: func(self: ivec2) -> ivec2; - add: func(p0: ivec2, p1: ivec2) -> ivec2; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u32::MAX`]. - /// See also [`checked_manhattan_distance`][IVec2::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: ivec2, rhs: ivec2) -> u32; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: ivec2) -> u64; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: ivec2, rhs: ivec2) -> u32; - /// Creates a vector with all elements set to `v`. - splat: func(v: s32) -> ivec2; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: ivec2, rhs: ivec2) -> bvec2; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: ivec2, rhs: ivec2) -> s32; - mul: func(self: ivec2, rhs: ivec2) -> ivec2; - div: func(p0: ivec2, p1: ivec2) -> ivec2; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: ivec2, rhs: ivec2) -> bvec2; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: ivec2, rhs: ivec2) -> ivec2; - /// Computes the squared length of `self`. - length-squared: func(self: ivec2) -> s32; - /// Returns a vector containing the wrapping addition of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_unsigned(rhs.x), self.y.wrapping_add_unsigned(rhs.y), ..]`. - wrapping-add-unsigned: func(self: ivec2, rhs: uvec2) -> ivec2; - /// Casts all elements of `self` to `f32`. - as-vec2: func(self: ivec2) -> vec2; - clone: func(self: ivec2) -> ivec2; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - /// [Euclidean division]: i32::rem_euclid - rem-euclid: func(self: ivec2, rhs: ivec2) -> ivec2; - add: func(p0: ivec2, p1: s32) -> ivec2; - /// The perpendicular dot product of `self` and `rhs`. - /// Also known as the wedge product, 2D cross product, and determinant. - perp-dot: func(self: ivec2, rhs: ivec2) -> s32; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: ivec2, rhs: ivec2) -> ivec2; - /// Returns a bitmask with the lowest 2 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: ivec2) -> u32; - /// Casts all elements of `self` to `i8`. - as-i8vec2: func(self: ivec2) -> i8-vec2; - add: func(self: ivec2, rhs: ivec2) -> ivec2; - rem: func(p0: ivec2, p1: s32) -> ivec2; - sub: func(p0: ivec2, p1: s32) -> ivec2; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: ivec2) -> ivec2; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - div-euclid: func(self: ivec2, rhs: ivec2) -> ivec2; - /// Casts all elements of `self` to `u16`. - as-u16vec2: func(self: ivec2) -> u16-vec2; - /// Component-wise clamping of values, similar to [`i32::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: ivec2, min: ivec2, max: ivec2) -> ivec2; - /// In other words this computes `[self.x.saturating_add_unsigned(rhs.x), self.y.saturating_add_unsigned(rhs.y), ..]`. - saturating-add-unsigned: func(self: ivec2, rhs: uvec2) -> ivec2; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: ivec2, rhs: ivec2) -> bvec2; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: ivec2) -> s32; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: ivec2, rhs: ivec2) -> ivec2; -} - -/// Methods for IVec3 -interface ivec3 { - use types.{reflect-reference}; - - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: ivec3) -> s32; - div: func(p0: ivec3, p1: s32) -> ivec3; - mul: func(self: ivec3, rhs: ivec3) -> ivec3; - sub: func(p0: ivec3, p1: ivec3) -> ivec3; - /// Casts all elements of `self` to `i64`. - as-i64vec3: func(self: ivec3) -> i64-vec3; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec3, if-true: ivec3, if-false: ivec3) -> ivec3; - /// Casts all elements of `self` to `u64`. - as-u64vec3: func(self: ivec3) -> u64-vec3; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: ivec3, rhs: ivec3) -> bvec3; - add: func(self: ivec3, rhs: ivec3) -> ivec3; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - div-euclid: func(self: ivec3, rhs: ivec3) -> ivec3; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: ivec3, rhs: ivec3) -> ivec3; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - /// [Euclidean division]: i32::rem_euclid - rem-euclid: func(self: ivec3, rhs: ivec3) -> ivec3; - /// Converts `self` to `[x, y, z]` - to-array: func(self: ivec3) -> list; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: ivec3, rhs: ivec3) -> ivec3; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: ivec3, rhs: ivec3) -> bvec3; - /// Casts all elements of `self` to `u16`. - as-u16vec3: func(self: ivec3) -> u16-vec3; - rem: func(p0: ivec3, p1: s32) -> ivec3; - /// Casts all elements of `self` to `i8`. - as-i8vec3: func(self: ivec3) -> i8-vec3; - /// Creates a 4D vector from `self` and the given `w` value. - extend: func(self: ivec3, w: s32) -> ivec4; - rem: func(self: ivec3, rhs: ivec3) -> ivec3; - /// Creates a new vector from an array. - from-array: func(a: list) -> ivec3; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: ivec3, rhs: ivec3) -> bvec3; - /// Casts all elements of `self` to `f32`. - as-vec3: func(self: ivec3) -> vec3; - assert-receiver-is-total-eq: func(self: ivec3); - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: ivec3, rhs: ivec3) -> ivec3; - add: func(p0: ivec3, p1: ivec3) -> ivec3; - /// Creates a 3D vector from `self` with the given value of `x`. - with-x: func(self: ivec3, x: s32) -> ivec3; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: ivec3) -> s32; - rem: func(p0: ivec3, p1: ivec3) -> ivec3; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: ivec3, rhs: ivec3) -> ivec3; - /// Returns a vector containing the saturating subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.saturating_sub_unsigned(rhs.x), self.y.saturating_sub_unsigned(rhs.y), ..]`. - saturating-sub-unsigned: func(self: ivec3, rhs: uvec3) -> ivec3; - /// Computes the squared length of `self`. - length-squared: func(self: ivec3) -> s32; - mul: func(p0: ivec3, p1: s32) -> ivec3; - /// Creates a 3D vector from `self` with the given value of `z`. - with-z: func(self: ivec3, z: s32) -> ivec3; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: ivec3, rhs: ivec3) -> u32; - /// Casts all elements of `self` to `u32`. - as-uvec3: func(self: ivec3) -> uvec3; - /// Creates a vector with all elements set to `v`. - splat: func(v: s32) -> ivec3; - /// In other words this computes `[self.x.saturating_add_unsigned(rhs.x), self.y.saturating_add_unsigned(rhs.y), ..]`. - saturating-add-unsigned: func(self: ivec3, rhs: uvec3) -> ivec3; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: ivec3, rhs: ivec3) -> bvec3; - /// Returns a bitmask with the lowest 3 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: ivec3) -> u32; - clone: func(self: ivec3) -> ivec3; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: ivec3, rhs: ivec3) -> bvec3; - div: func(p0: ivec3, p1: ivec3) -> ivec3; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: ivec3) -> u64; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: ivec3, rhs: ivec3) -> ivec3; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: ivec3, rhs: ivec3) -> bvec3; - sub: func(p0: ivec3, p1: s32) -> ivec3; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: ivec3, rhs: ivec3) -> ivec3; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: ivec3, rhs: ivec3) -> s32; - /// Returns a vector containing the wrapping subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_sub_unsigned(rhs.x), self.y.wrapping_sub_unsigned(rhs.y), ..]`. - wrapping-sub-unsigned: func(self: ivec3, rhs: uvec3) -> ivec3; - /// Casts all elements of `self` to `u8`. - as-u8vec3: func(self: ivec3) -> u8-vec3; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: ivec3) -> ivec3; - /// Creates a 2D vector from the `x` and `y` elements of `self`, discarding `z`. - /// Truncation may also be performed by using [`self.xy()`][crate::swizzles::Vec3Swizzles::xy()]. - truncate: func(self: ivec3) -> ivec2; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u32::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: ivec3, rhs: ivec3) -> option; - neg: func(self: ivec3) -> ivec3; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: ivec3) -> s32; - add: func(p0: ivec3, p1: s32) -> ivec3; - /// Casts all elements of `self` to `f32`. - as-vec3a: func(self: ivec3) -> vec3-a; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u32::MAX`]. - /// See also [`checked_manhattan_distance`][IVec3::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: ivec3, rhs: ivec3) -> u32; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: ivec3, rhs: ivec3) -> s32; - sub: func(self: ivec3, rhs: ivec3) -> ivec3; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: ivec3) -> u64; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: ivec3, rhs: ivec3) -> ivec3; - /// Casts all elements of `self` to `i16`. - as-i16vec3: func(self: ivec3) -> i16-vec3; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: ivec3, rhs: ivec3) -> ivec3; - /// Creates a new vector. - new: func(x: s32, y: s32, z: s32) -> ivec3; - mul: func(p0: ivec3, p1: ivec3) -> ivec3; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: ivec3, rhs: ivec3) -> ivec3; - /// Computes the cross product of `self` and `rhs`. - cross: func(self: ivec3, rhs: ivec3) -> ivec3; - div: func(self: ivec3, rhs: ivec3) -> ivec3; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: ivec3) -> s32; - /// Creates a 3D vector from `self` with the given value of `y`. - with-y: func(self: ivec3, y: s32) -> ivec3; - /// Returns a vector with elements representing the sign of `self`. - /// - `0` if the number is zero - /// - `1` if the number is positive - /// - `-1` if the number is negative - signum: func(self: ivec3) -> ivec3; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: ivec3, rhs: ivec3) -> ivec3; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: ivec3, rhs: ivec3) -> ivec3; - /// Component-wise clamping of values, similar to [`i32::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: ivec3, min: ivec3, max: ivec3) -> ivec3; - /// Casts all elements of `self` to `f64`. - as-dvec3: func(self: ivec3) -> dvec3; - /// Returns a vector containing the wrapping addition of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_unsigned(rhs.x), self.y.wrapping_add_unsigned(rhs.y), ..]`. - wrapping-add-unsigned: func(self: ivec3, rhs: uvec3) -> ivec3; - eq: func(self: ivec3, other: ivec3) -> bool; -} - -/// Methods for IVec4 -interface ivec4 { - use types.{reflect-reference}; - - add: func(p0: ivec4, p1: ivec4) -> ivec4; - /// Creates a 3D vector from the `x`, `y` and `z` elements of `self`, discarding `w`. - /// Truncation to [`IVec3`] may also be performed by using [`self.xyz()`][crate::swizzles::Vec4Swizzles::xyz()]. - truncate: func(self: ivec4) -> ivec3; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: ivec4, rhs: ivec4) -> ivec4; - div: func(self: ivec4, rhs: ivec4) -> ivec4; - mul: func(self: ivec4, rhs: ivec4) -> ivec4; - /// Returns a vector containing the wrapping addition of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_unsigned(rhs.x), self.y.wrapping_add_unsigned(rhs.y), ..]`. - wrapping-add-unsigned: func(self: ivec4, rhs: uvec4) -> ivec4; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: ivec4, rhs: ivec4) -> s32; - rem: func(self: ivec4, rhs: ivec4) -> ivec4; - clone: func(self: ivec4) -> ivec4; - /// Casts all elements of `self` to `u16`. - as-u16vec4: func(self: ivec4) -> u16-vec4; - /// Creates a 4D vector from `self` with the given value of `w`. - with-w: func(self: ivec4, w: s32) -> ivec4; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: ivec4, rhs: ivec4) -> ivec4; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: ivec4, rhs: ivec4) -> bvec4; - eq: func(self: ivec4, other: ivec4) -> bool; - div: func(p0: ivec4, p1: ivec4) -> ivec4; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: ivec4) -> s32; - /// Creates a new vector from an array. - from-array: func(a: list) -> ivec4; - /// Casts all elements of `self` to `i16`. - as-i16vec4: func(self: ivec4) -> i16-vec4; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec4, if-true: ivec4, if-false: ivec4) -> ivec4; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: ivec4, rhs: ivec4) -> ivec4; - mul: func(p0: ivec4, p1: s32) -> ivec4; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: ivec4, rhs: ivec4) -> ivec4; - /// Creates a 4D vector from `self` with the given value of `z`. - with-z: func(self: ivec4, z: s32) -> ivec4; - /// In other words this computes `[self.x.saturating_add_unsigned(rhs.x), self.y.saturating_add_unsigned(rhs.y), ..]`. - saturating-add-unsigned: func(self: ivec4, rhs: uvec4) -> ivec4; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: ivec4) -> s32; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: ivec4) -> u64; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - div-euclid: func(self: ivec4, rhs: ivec4) -> ivec4; - div: func(p0: ivec4, p1: s32) -> ivec4; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: ivec4, rhs: ivec4) -> ivec4; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: ivec4, rhs: ivec4) -> ivec4; - /// Casts all elements of `self` to `i8`. - as-i8vec4: func(self: ivec4) -> i8-vec4; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: ivec4) -> u64; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: ivec4, rhs: ivec4) -> s32; - assert-receiver-is-total-eq: func(self: ivec4); - /// Returns a bitmask with the lowest 4 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: ivec4) -> u32; - /// Creates a vector with all elements set to `v`. - splat: func(v: s32) -> ivec4; - /// Casts all elements of `self` to `f32`. - as-vec4: func(self: ivec4) -> vec4; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: ivec4, rhs: ivec4) -> bvec4; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: ivec4, rhs: ivec4) -> bvec4; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: ivec4) -> s32; - add: func(p0: ivec4, p1: s32) -> ivec4; - sub: func(p0: ivec4, p1: s32) -> ivec4; - /// Component-wise clamping of values, similar to [`i32::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: ivec4, min: ivec4, max: ivec4) -> ivec4; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: ivec4, rhs: ivec4) -> ivec4; - /// Returns a vector containing the saturating subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.saturating_sub_unsigned(rhs.x), self.y.saturating_sub_unsigned(rhs.y), ..]`. - saturating-sub-unsigned: func(self: ivec4, rhs: uvec4) -> ivec4; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: ivec4) -> s32; - sub: func(p0: ivec4, p1: ivec4) -> ivec4; - /// Casts all elements of `self` to `f64`. - as-dvec4: func(self: ivec4) -> dvec4; - /// Creates a new vector. - new: func(x: s32, y: s32, z: s32, w: s32) -> ivec4; - /// Casts all elements of `self` to `u8`. - as-u8vec4: func(self: ivec4) -> u8-vec4; - neg: func(self: ivec4) -> ivec4; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u32::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: ivec4, rhs: ivec4) -> option; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: ivec4, rhs: ivec4) -> bvec4; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: ivec4, rhs: ivec4) -> bvec4; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: ivec4, rhs: ivec4) -> bvec4; - rem: func(p0: ivec4, p1: ivec4) -> ivec4; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u32::MAX`]. - /// See also [`checked_manhattan_distance`][IVec4::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: ivec4, rhs: ivec4) -> u32; - /// Converts `self` to `[x, y, z, w]` - to-array: func(self: ivec4) -> list; - add: func(self: ivec4, rhs: ivec4) -> ivec4; - rem: func(p0: ivec4, p1: s32) -> ivec4; - /// Casts all elements of `self` to `u32`. - as-uvec4: func(self: ivec4) -> uvec4; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: ivec4, rhs: ivec4) -> u32; - /// Creates a 4D vector from `self` with the given value of `x`. - with-x: func(self: ivec4, x: s32) -> ivec4; - /// Computes the squared length of `self`. - length-squared: func(self: ivec4) -> s32; - /// Casts all elements of `self` to `i64`. - as-i64vec4: func(self: ivec4) -> i64-vec4; - /// Casts all elements of `self` to `u64`. - as-u64vec4: func(self: ivec4) -> u64-vec4; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: ivec4) -> ivec4; - /// Creates a 4D vector from `self` with the given value of `y`. - with-y: func(self: ivec4, y: s32) -> ivec4; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: ivec4, rhs: ivec4) -> ivec4; - /// Returns a vector containing the wrapping subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_sub_unsigned(rhs.x), self.y.wrapping_sub_unsigned(rhs.y), ..]`. - wrapping-sub-unsigned: func(self: ivec4, rhs: uvec4) -> ivec4; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: ivec4, rhs: ivec4) -> ivec4; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - /// [Euclidean division]: i32::rem_euclid - rem-euclid: func(self: ivec4, rhs: ivec4) -> ivec4; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: ivec4, rhs: ivec4) -> ivec4; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: ivec4, rhs: ivec4) -> ivec4; - /// Returns a vector with elements representing the sign of `self`. - /// - `0` if the number is zero - /// - `1` if the number is positive - /// - `-1` if the number is negative - signum: func(self: ivec4) -> ivec4; - sub: func(self: ivec4, rhs: ivec4) -> ivec4; - mul: func(p0: ivec4, p1: ivec4) -> ivec4; -} - -/// Methods for Mat2 -interface mat2 { - use types.{reflect-reference}; - - /// Creates a 2x2 matrix from the minor of the given 3x3 matrix, discarding the `i`th column - /// and `j`th row. - /// # Panics - /// Panics if `i` or `j` is greater than 2. - from-mat3-minor: func(m: mat3, i: u64, j: u64) -> mat2; - mul: func(p0: mat2, p1: f32) -> mat2; - /// Subtracts two 2x2 matrices. - sub-mat2: func(self: mat2, rhs: mat2) -> mat2; - as-dmat2: func(self: mat2) -> dmat2; - /// Creates a 2x2 matrix from a 3x3 matrix, discarding the 2nd row and column. - from-mat3: func(m: mat3) -> mat2; - /// Transforms a 2D vector. - mul-vec2: func(self: mat2, rhs: vec2) -> vec2; - /// Returns the matrix row for the given `index`. - /// # Panics - /// Panics if `index` is greater than 1. - row: func(self: mat2, index: u64) -> vec2; - sub: func(p0: mat2, p1: mat2) -> mat2; - /// Creates a 2x2 matrix from the minor of the given 3x3 matrix, discarding the `i`th column - /// and `j`th row. - /// # Panics - /// Panics if `i` or `j` is greater than 2. - from-mat3a-minor: func(m: mat3-a, i: u64, j: u64) -> mat2; - /// Returns the transpose of `self`. - transpose: func(self: mat2) -> mat2; - clone: func(self: mat2) -> mat2; - /// Divides a 2x2 matrix by a scalar. - div-scalar: func(self: mat2, rhs: f32) -> mat2; - /// Creates a 2x2 matrix from a 3x3 matrix, discarding the 2nd row and column. - from-mat3a: func(m: mat3-a) -> mat2; - /// Creates a 2x2 matrix containing a rotation of `angle` (in radians). - from-angle: func(angle: f32) -> mat2; - /// Returns the inverse of `self`. - /// If the matrix is not invertible the returned matrix will be invalid. - /// # Panics - /// Will panic if the determinant of `self` is zero when `glam_assert` is enabled. - inverse: func(self: mat2) -> mat2; - /// Creates a `[f32; 4]` array storing data in column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array: func(self: mat2) -> list; - /// Takes the absolute value of each element in `self` - abs: func(self: mat2) -> mat2; - mul: func(p0: mat2, p1: vec2) -> vec2; - mul: func(p0: mat2, p1: vec2) -> vec2; - add: func(self: mat2, rhs: mat2) -> mat2; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: mat2) -> bool; - /// Multiplies a 2x2 matrix by a scalar. - mul-scalar: func(self: mat2, rhs: f32) -> mat2; - /// Creates a 2x2 matrix containing the combining non-uniform `scale` and rotation of - /// `angle` (in radians). - from-scale-angle: func(scale: vec2, angle: f32) -> mat2; - mul: func(self: mat2, rhs: mat2) -> mat2; - /// Multiplies two 2x2 matrices. - mul-mat2: func(self: mat2, rhs: mat2) -> mat2; - sub: func(self: mat2, rhs: mat2) -> mat2; - /// Returns `true` if, and only if, all elements are finite. - /// If any element is either `NaN`, positive or negative infinity, this will return `false`. - is-finite: func(self: mat2) -> bool; - add: func(p0: mat2, p1: mat2) -> mat2; - /// Returns the matrix column for the given `index`. - /// # Panics - /// Panics if `index` is greater than 1. - col: func(self: mat2, index: u64) -> vec2; - /// Returns true if the absolute difference of all elements between `self` and `rhs` - /// is less than or equal to `max_abs_diff`. - /// This can be used to compare if two matrices contain similar elements. It works best - /// when comparing with a known value. The `max_abs_diff` that should be used used - /// depends on the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: mat2, rhs: mat2, max-abs-diff: f32) -> bool; - neg: func(self: mat2) -> mat2; - /// Creates a 2x2 matrix with its diagonal set to `diagonal` and all other entries set to 0. - from-diagonal: func(diagonal: vec2) -> mat2; - /// Creates a 2x2 matrix from two column vectors. - from-cols: func(x-axis: vec2, y-axis: vec2) -> mat2; - /// Adds two 2x2 matrices. - add-mat2: func(self: mat2, rhs: mat2) -> mat2; - eq: func(self: mat2, rhs: mat2) -> bool; - /// Returns the determinant of `self`. - determinant: func(self: mat2) -> f32; - mul: func(p0: mat2, p1: mat2) -> mat2; - /// Creates a `[[f32; 2]; 2]` 2D array storing data in column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array-2d: func(self: mat2) -> list>; - div: func(self: mat2, rhs: f32) -> mat2; -} - -/// Methods for Mat3 -interface mat3 { - use types.{reflect-reference}; - - neg: func(self: mat3) -> mat3; - /// Creates a 3D rotation matrix from `angle` (in radians) around the z axis. - from-rotation-z: func(angle: f32) -> mat3; - /// Creates a 3D rotation matrix from a normalized rotation `axis` and `angle` (in - /// radians). - /// # Panics - /// Will panic if `axis` is not normalized when `glam_assert` is enabled. - from-axis-angle: func(axis: vec3, angle: f32) -> mat3; - /// Returns the determinant of `self`. - determinant: func(self: mat3) -> f32; - mul: func(p0: mat3, p1: mat3) -> mat3; - /// Multiplies a 3x3 matrix by a scalar. - mul-scalar: func(self: mat3, rhs: f32) -> mat3; - /// Transforms the given 2D vector as a point. - /// This is the equivalent of multiplying `rhs` as a 3D vector where `z` is `1`. - /// This method assumes that `self` contains a valid affine transform. - /// # Panics - /// Will panic if the 2nd row of `self` is not `(0, 0, 1)` when `glam_assert` is enabled. - transform-point2: func(self: mat3, rhs: vec2) -> vec2; - add: func(p0: mat3, p1: mat3) -> mat3; - /// Rotates the given 2D vector. - /// This is the equivalent of multiplying `rhs` as a 3D vector where `z` is `0`. - /// This method assumes that `self` contains a valid affine transform. - /// # Panics - /// Will panic if the 2nd row of `self` is not `(0, 0, 1)` when `glam_assert` is enabled. - transform-vector2: func(self: mat3, rhs: vec2) -> vec2; - /// Transforms a [`Vec3A`]. - mul-vec3a: func(self: mat3, rhs: vec3-a) -> vec3-a; - /// Creates a 3x3 matrix from the minor of the given 4x4 matrix, discarding the `i`th column - /// and `j`th row. - /// # Panics - /// Panics if `i` or `j` is greater than 3. - from-mat4-minor: func(m: mat4, i: u64, j: u64) -> mat3; - /// Creates a 3D rotation matrix from `angle` (in radians) around the y axis. - from-rotation-y: func(angle: f32) -> mat3; - /// Creates an affine transformation matrix from the given 2D `scale`, rotation `angle` (in - /// radians) and `translation`. - /// The resulting matrix can be used to transform 2D points and vectors. See - /// [`Self::transform_point2()`] and [`Self::transform_vector2()`]. - from-scale-angle-translation: func(scale: vec2, angle: f32, translation: vec2) -> mat3; - /// Returns the matrix row for the given `index`. - /// # Panics - /// Panics if `index` is greater than 2. - row: func(self: mat3, index: u64) -> vec3; - sub: func(p0: mat3, p1: mat3) -> mat3; - as-dmat3: func(self: mat3) -> dmat3; - /// Adds two 3x3 matrices. - add-mat3: func(self: mat3, rhs: mat3) -> mat3; - /// Creates an affine transformation matrix from the given non-uniform 2D `scale`. - /// The resulting matrix can be used to transform 2D points and vectors. See - /// [`Self::transform_point2()`] and [`Self::transform_vector2()`]. - /// # Panics - /// Will panic if all elements of `scale` are zero when `glam_assert` is enabled. - from-scale: func(scale: vec2) -> mat3; - /// Creates an affine transformation matrix from the given 2D rotation `angle` (in - /// radians). - /// The resulting matrix can be used to transform 2D points and vectors. See - /// [`Self::transform_point2()`] and [`Self::transform_vector2()`]. - from-angle: func(angle: f32) -> mat3; - /// Creates a 3D rotation matrix from the given quaternion. - /// # Panics - /// Will panic if `rotation` is not normalized when `glam_assert` is enabled. - from-quat: func(rotation: quat) -> mat3; - /// Creates an affine transformation matrix from the given 2D `translation`. - /// The resulting matrix can be used to transform 2D points and vectors. See - /// [`Self::transform_point2()`] and [`Self::transform_vector2()`]. - from-translation: func(translation: vec2) -> mat3; - mul: func(p0: mat3, p1: vec3) -> vec3; - /// Returns the inverse of `self`. - /// If the matrix is not invertible the returned matrix will be invalid. - /// # Panics - /// Will panic if the determinant of `self` is zero when `glam_assert` is enabled. - inverse: func(self: mat3) -> mat3; - add: func(self: mat3, rhs: mat3) -> mat3; - /// Creates a 3x3 matrix from a 4x4 matrix, discarding the 4th row and column. - from-mat4: func(m: mat4) -> mat3; - /// Creates a 3x3 matrix from three column vectors. - from-cols: func(x-axis: vec3, y-axis: vec3, z-axis: vec3) -> mat3; - mul: func(p0: mat3, p1: vec3-a) -> vec3-a; - /// Divides a 3x3 matrix by a scalar. - div-scalar: func(self: mat3, rhs: f32) -> mat3; - /// Creates a 3D rotation matrix from the given euler rotation sequence and the angles (in - /// radians). - from-euler: func(order: euler-rot, a: f32, b: f32, c: f32) -> mat3; - /// Returns the matrix column for the given `index`. - /// # Panics - /// Panics if `index` is greater than 2. - col: func(self: mat3, index: u64) -> vec3; - /// Returns true if the absolute difference of all elements between `self` and `rhs` - /// is less than or equal to `max_abs_diff`. - /// This can be used to compare if two matrices contain similar elements. It works best - /// when comparing with a known value. The `max_abs_diff` that should be used used - /// depends on the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: mat3, rhs: mat3, max-abs-diff: f32) -> bool; - /// Creates a left-handed view matrix using a camera position, a focal point and an up - /// direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-lh: func(eye: vec3, center: vec3, up: vec3) -> mat3; - clone: func(self: mat3) -> mat3; - /// Creates a left-handed view matrix using a facing direction and an up direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - /// # Panics - /// Will panic if `dir` or `up` are not normalized when `glam_assert` is enabled. - look-to-lh: func(dir: vec3, up: vec3) -> mat3; - /// Creates an affine transformation matrix from the given 2x2 matrix. - /// The resulting matrix can be used to transform 2D points and vectors. See - /// [`Self::transform_point2()`] and [`Self::transform_vector2()`]. - from-mat2: func(m: mat2) -> mat3; - eq: func(self: mat3, rhs: mat3) -> bool; - /// Transforms a 3D vector. - mul-vec3: func(self: mat3, rhs: vec3) -> vec3; - mul: func(p0: mat3, p1: vec3) -> vec3; - /// Creates a 3x3 matrix with its diagonal set to `diagonal` and all other entries set to 0. - from-diagonal: func(diagonal: vec3) -> mat3; - /// Multiplies two 3x3 matrices. - mul-mat3: func(self: mat3, rhs: mat3) -> mat3; - /// Extract Euler angles with the given Euler rotation order. - /// Note if the input matrix contains scales, shears, or other non-rotation transformations then - /// the resulting Euler angles will be ill-defined. - /// # Panics - /// Will panic if any input matrix column is not normalized when `glam_assert` is enabled. - to-euler: func(self: mat3, order: euler-rot) -> tuple; - /// Creates a 3D rotation matrix from `angle` (in radians) around the x axis. - from-rotation-x: func(angle: f32) -> mat3; - div: func(self: mat3, rhs: f32) -> mat3; - /// Creates a right-handed view matrix using a camera position, a focal point and an up - /// direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-rh: func(eye: vec3, center: vec3, up: vec3) -> mat3; - /// Returns the transpose of `self`. - transpose: func(self: mat3) -> mat3; - /// Creates a `[[f32; 3]; 3]` 3D array storing data in column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array-2d: func(self: mat3) -> list>; - /// Takes the absolute value of each element in `self` - abs: func(self: mat3) -> mat3; - mul: func(p0: mat3, p1: f32) -> mat3; - mul: func(p0: mat3, p1: vec3-a) -> vec3-a; - mul: func(self: mat3, rhs: affine2) -> mat3; - mul: func(p0: mat3, p1: affine2) -> mat3; - /// Creates a right-handed view matrix using a facing direction and an up direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - /// # Panics - /// Will panic if `dir` or `up` are not normalized when `glam_assert` is enabled. - look-to-rh: func(dir: vec3, up: vec3) -> mat3; - mul: func(p0: mat3, p1: mat3) -> mat3; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: mat3) -> bool; - /// Creates a `[f32; 9]` array storing data in column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array: func(self: mat3) -> list; - /// Subtracts two 3x3 matrices. - sub-mat3: func(self: mat3, rhs: mat3) -> mat3; - sub: func(self: mat3, rhs: mat3) -> mat3; - /// Returns `true` if, and only if, all elements are finite. - /// If any element is either `NaN`, positive or negative infinity, this will return `false`. - is-finite: func(self: mat3) -> bool; -} - -/// Methods for Mat3A -interface mat3-a { - use types.{reflect-reference}; - - /// Extract Euler angles with the given Euler rotation order. - /// Note if the input matrix contains scales, shears, or other non-rotation transformations then - /// the resulting Euler angles will be ill-defined. - /// # Panics - /// Will panic if any input matrix column is not normalized when `glam_assert` is enabled. - to-euler: func(self: mat3-a, order: euler-rot) -> tuple; - /// Transforms a 3D vector. - mul-vec3: func(self: mat3-a, rhs: vec3) -> vec3; - /// Adds two 3x3 matrices. - add-mat3: func(self: mat3-a, rhs: mat3-a) -> mat3-a; - /// Transforms the given 2D vector as a point. - /// This is the equivalent of multiplying `rhs` as a 3D vector where `z` is `1`. - /// This method assumes that `self` contains a valid affine transform. - /// # Panics - /// Will panic if the 2nd row of `self` is not `(0, 0, 1)` when `glam_assert` is enabled. - transform-point2: func(self: mat3-a, rhs: vec2) -> vec2; - /// Creates an affine transformation matrix from the given non-uniform 2D `scale`. - /// The resulting matrix can be used to transform 2D points and vectors. See - /// [`Self::transform_point2()`] and [`Self::transform_vector2()`]. - /// # Panics - /// Will panic if all elements of `scale` are zero when `glam_assert` is enabled. - from-scale: func(scale: vec2) -> mat3-a; - mul: func(self: mat3-a, rhs: affine2) -> mat3-a; - /// Subtracts two 3x3 matrices. - sub-mat3: func(self: mat3-a, rhs: mat3-a) -> mat3-a; - /// Creates a 3x3 matrix from three column vectors. - from-cols: func(x-axis: vec3-a, y-axis: vec3-a, z-axis: vec3-a) -> mat3-a; - /// Returns `true` if, and only if, all elements are finite. - /// If any element is either `NaN`, positive or negative infinity, this will return `false`. - is-finite: func(self: mat3-a) -> bool; - /// Divides a 3x3 matrix by a scalar. - div-scalar: func(self: mat3-a, rhs: f32) -> mat3-a; - /// Creates a 3D rotation matrix from `angle` (in radians) around the x axis. - from-rotation-x: func(angle: f32) -> mat3-a; - neg: func(self: mat3-a) -> mat3-a; - /// Multiplies a 3x3 matrix by a scalar. - mul-scalar: func(self: mat3-a, rhs: f32) -> mat3-a; - /// Creates a 3D rotation matrix from `angle` (in radians) around the y axis. - from-rotation-y: func(angle: f32) -> mat3-a; - /// Multiplies two 3x3 matrices. - mul-mat3: func(self: mat3-a, rhs: mat3-a) -> mat3-a; - mul: func(p0: mat3-a, p1: mat3-a) -> mat3-a; - /// Creates a right-handed view matrix using a camera position, a focal point and an up - /// direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-rh: func(eye: vec3, center: vec3, up: vec3) -> mat3-a; - mul: func(p0: mat3-a, p1: vec3-a) -> vec3-a; - /// Creates an affine transformation matrix from the given 2D `translation`. - /// The resulting matrix can be used to transform 2D points and vectors. See - /// [`Self::transform_point2()`] and [`Self::transform_vector2()`]. - from-translation: func(translation: vec2) -> mat3-a; - mul: func(p0: mat3-a, p1: vec3) -> vec3; - /// Rotates the given 2D vector. - /// This is the equivalent of multiplying `rhs` as a 3D vector where `z` is `0`. - /// This method assumes that `self` contains a valid affine transform. - /// # Panics - /// Will panic if the 2nd row of `self` is not `(0, 0, 1)` when `glam_assert` is enabled. - transform-vector2: func(self: mat3-a, rhs: vec2) -> vec2; - /// Creates a 3D rotation matrix from the given quaternion. - /// # Panics - /// Will panic if `rotation` is not normalized when `glam_assert` is enabled. - from-quat: func(rotation: quat) -> mat3-a; - /// Creates a 3D rotation matrix from the given euler rotation sequence and the angles (in - /// radians). - from-euler: func(order: euler-rot, a: f32, b: f32, c: f32) -> mat3-a; - sub: func(self: mat3-a, rhs: mat3-a) -> mat3-a; - /// Creates an affine transformation matrix from the given 2x2 matrix. - /// The resulting matrix can be used to transform 2D points and vectors. See - /// [`Self::transform_point2()`] and [`Self::transform_vector2()`]. - from-mat2: func(m: mat2) -> mat3-a; - /// Takes the absolute value of each element in `self` - abs: func(self: mat3-a) -> mat3-a; - /// Creates a left-handed view matrix using a facing direction and an up direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - /// # Panics - /// Will panic if `dir` or `up` are not normalized when `glam_assert` is enabled. - look-to-lh: func(dir: vec3, up: vec3) -> mat3-a; - /// Creates an affine transformation matrix from the given 2D rotation `angle` (in - /// radians). - /// The resulting matrix can be used to transform 2D points and vectors. See - /// [`Self::transform_point2()`] and [`Self::transform_vector2()`]. - from-angle: func(angle: f32) -> mat3-a; - /// Creates a 3x3 matrix with its diagonal set to `diagonal` and all other entries set to 0. - from-diagonal: func(diagonal: vec3) -> mat3-a; - add: func(self: mat3-a, rhs: mat3-a) -> mat3-a; - /// Creates a `[f32; 9]` array storing data in column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array: func(self: mat3-a) -> list; - /// Creates a 3D rotation matrix from `angle` (in radians) around the z axis. - from-rotation-z: func(angle: f32) -> mat3-a; - /// Creates a `[[f32; 3]; 3]` 3D array storing data in column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array-2d: func(self: mat3-a) -> list>; - mul: func(p0: mat3-a, p1: vec3) -> vec3; - as-dmat3: func(self: mat3-a) -> dmat3; - /// Creates a right-handed view matrix using a facing direction and an up direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - /// # Panics - /// Will panic if `dir` or `up` are not normalized when `glam_assert` is enabled. - look-to-rh: func(dir: vec3, up: vec3) -> mat3-a; - /// Returns the matrix column for the given `index`. - /// # Panics - /// Panics if `index` is greater than 2. - col: func(self: mat3-a, index: u64) -> vec3-a; - sub: func(p0: mat3-a, p1: mat3-a) -> mat3-a; - mul: func(p0: mat3-a, p1: f32) -> mat3-a; - /// Returns the determinant of `self`. - determinant: func(self: mat3-a) -> f32; - /// Returns the transpose of `self`. - transpose: func(self: mat3-a) -> mat3-a; - /// Returns true if the absolute difference of all elements between `self` and `rhs` - /// is less than or equal to `max_abs_diff`. - /// This can be used to compare if two matrices contain similar elements. It works best - /// when comparing with a known value. The `max_abs_diff` that should be used used - /// depends on the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: mat3-a, rhs: mat3-a, max-abs-diff: f32) -> bool; - clone: func(self: mat3-a) -> mat3-a; - /// Creates a 3x3 matrix from the minor of the given 4x4 matrix, discarding the `i`th column - /// and `j`th row. - /// # Panics - /// Panics if `i` or `j` is greater than 3. - from-mat4-minor: func(m: mat4, i: u64, j: u64) -> mat3-a; - mul: func(p0: mat3-a, p1: vec3-a) -> vec3-a; - add: func(p0: mat3-a, p1: mat3-a) -> mat3-a; - mul: func(p0: mat3-a, p1: affine2) -> mat3-a; - div: func(self: mat3-a, rhs: f32) -> mat3-a; - eq: func(self: mat3-a, rhs: mat3-a) -> bool; - /// Creates a 3x3 matrix from a 4x4 matrix, discarding the 4th row and column. - from-mat4: func(m: mat4) -> mat3-a; - /// Returns the inverse of `self`. - /// If the matrix is not invertible the returned matrix will be invalid. - /// # Panics - /// Will panic if the determinant of `self` is zero when `glam_assert` is enabled. - inverse: func(self: mat3-a) -> mat3-a; - mul: func(p0: mat3-a, p1: mat3-a) -> mat3-a; - /// Creates a left-handed view matrix using a camera position, a focal point and an up - /// direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-lh: func(eye: vec3, center: vec3, up: vec3) -> mat3-a; - /// Creates a 3D rotation matrix from a normalized rotation `axis` and `angle` (in - /// radians). - /// # Panics - /// Will panic if `axis` is not normalized when `glam_assert` is enabled. - from-axis-angle: func(axis: vec3, angle: f32) -> mat3-a; - /// Creates an affine transformation matrix from the given 2D `scale`, rotation `angle` (in - /// radians) and `translation`. - /// The resulting matrix can be used to transform 2D points and vectors. See - /// [`Self::transform_point2()`] and [`Self::transform_vector2()`]. - from-scale-angle-translation: func(scale: vec2, angle: f32, translation: vec2) -> mat3-a; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: mat3-a) -> bool; - /// Returns the matrix row for the given `index`. - /// # Panics - /// Panics if `index` is greater than 2. - row: func(self: mat3-a, index: u64) -> vec3-a; - /// Transforms a [`Vec3A`]. - mul-vec3a: func(self: mat3-a, rhs: vec3-a) -> vec3-a; -} - -/// Methods for Mat4 -interface mat4 { - use types.{reflect-reference}; - - sub: func(p0: mat4, p1: mat4) -> mat4; - /// Creates a `[[f32; 4]; 4]` 4D array storing data in column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array-2d: func(self: mat4) -> list>; - /// Creates an affine transformation matrix containing a 3D rotation around the z axis of - /// `angle` (in radians). - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - from-rotation-z: func(angle: f32) -> mat4; - /// Multiplies a 4x4 matrix by a scalar. - mul-scalar: func(self: mat4, rhs: f32) -> mat4; - /// Creates an affine transformation matrix from the given 3D `translation`. - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - from-translation: func(translation: vec3) -> mat4; - /// Creates a right-handed perspective projection matrix with `[0,1]` depth range. - /// # Panics - /// Will panic if `z_near` or `z_far` are less than or equal to zero when `glam_assert` is - /// enabled. - frustum-rh: func(left: f32, right: f32, bottom: f32, top: f32, z-near: f32, z-far: f32) -> mat4; - /// Returns the transpose of `self`. - transpose: func(self: mat4) -> mat4; - /// Creates a right-handed perspective projection matrix with [-1,1] depth range. - /// This is the same as the OpenGL `glFrustum` function. - /// See - frustum-rh-gl: func(left: f32, right: f32, bottom: f32, top: f32, z-near: f32, z-far: f32) -> mat4; - /// Creates an affine transformation matrix from the given 3x3 linear transformation - /// matrix. - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - from-mat3a: func(m: mat3-a) -> mat4; - /// Creates a right-handed orthographic projection matrix with `[0,1]` depth range. - /// Useful to map a right-handed coordinate system to the normalized device coordinates that WebGPU/Direct3D/Metal expect. - orthographic-rh: func(left: f32, right: f32, bottom: f32, top: f32, near: f32, far: f32) -> mat4; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: mat4) -> bool; - /// Creates a right-handed perspective projection matrix with `[0,1]` depth range. - /// Useful to map the standard right-handed coordinate system into what WebGPU/Metal/Direct3D expect. - /// # Panics - /// Will panic if `z_near` or `z_far` are less than or equal to zero when `glam_assert` is - /// enabled. - perspective-rh: func(fov-y-radians: f32, aspect-ratio: f32, z-near: f32, z-far: f32) -> mat4; - /// Transforms the give 3D vector as a direction. - /// This is the equivalent of multiplying the 3D vector as a 4D vector where `w` is - /// `0.0`. - /// This method assumes that `self` contains a valid affine transform. - /// # Panics - /// Will panic if the 3rd row of `self` is not `(0, 0, 0, 1)` when `glam_assert` is enabled. - transform-vector3: func(self: mat4, rhs: vec3) -> vec3; - /// Creates an affine transformation matrix containing the given 3D non-uniform `scale`. - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - /// # Panics - /// Will panic if all elements of `scale` are zero when `glam_assert` is enabled. - from-scale: func(scale: vec3) -> mat4; - /// Creates an affine transformation matrix from the given 3x3 linear transformation - /// matrix. - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - from-mat3: func(m: mat3) -> mat4; - add: func(p0: mat4, p1: mat4) -> mat4; - /// Creates an affine transformation matrics from a 3x3 matrix (expressing scale, shear and - /// rotation) and a translation vector. - /// Equivalent to `Mat4::from_translation(translation) * Mat4::from_mat3(mat3)` - from-mat3-translation: func(mat3: mat3, translation: vec3) -> mat4; - eq: func(self: mat4, rhs: mat4) -> bool; - /// Creates an affine transformation matrix containing a 3D rotation around the x axis of - /// `angle` (in radians). - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - from-rotation-x: func(angle: f32) -> mat4; - /// Creates an affine transformation matrix containing a 3D rotation around a normalized - /// rotation `axis` of `angle` (in radians). - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - /// # Panics - /// Will panic if `axis` is not normalized when `glam_assert` is enabled. - from-axis-angle: func(axis: vec3, angle: f32) -> mat4; - /// Returns the matrix column for the given `index`. - /// # Panics - /// Panics if `index` is greater than 3. - col: func(self: mat4, index: u64) -> vec4; - /// Returns the matrix row for the given `index`. - /// # Panics - /// Panics if `index` is greater than 3. - row: func(self: mat4, index: u64) -> vec4; - /// Divides a 4x4 matrix by a scalar. - div-scalar: func(self: mat4, rhs: f32) -> mat4; - /// Creates an affine transformation matrix containing a 3D rotation around the y axis of - /// `angle` (in radians). - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - from-rotation-y: func(angle: f32) -> mat4; - /// Creates an infinite right-handed perspective projection matrix with `[0,1]` depth range. - /// Like `perspective_rh`, but with an infinite value for `z_far`. - /// The result is that points near `z_near` are mapped to depth `0`, and as they move towards infinity the depth approaches `1`. - /// # Panics - /// Will panic if `z_near` or `z_far` are less than or equal to zero when `glam_assert` is - /// enabled. - perspective-infinite-rh: func(fov-y-radians: f32, aspect-ratio: f32, z-near: f32) -> mat4; - mul: func(self: mat4, rhs: affine3-a) -> mat4; - /// Creates a left-handed perspective projection matrix with `[0,1]` depth range. - /// # Panics - /// Will panic if `z_near` or `z_far` are less than or equal to zero when `glam_assert` is - /// enabled. - frustum-lh: func(left: f32, right: f32, bottom: f32, top: f32, z-near: f32, z-far: f32) -> mat4; - /// Creates an infinite reverse left-handed perspective projection matrix with `[0,1]` depth range. - /// Similar to `perspective_infinite_lh`, but maps `Z = z_near` to a depth of `1` and `Z = infinity` to a depth of `0`. - /// # Panics - /// Will panic if `z_near` is less than or equal to zero when `glam_assert` is enabled. - perspective-infinite-reverse-lh: func(fov-y-radians: f32, aspect-ratio: f32, z-near: f32) -> mat4; - /// Returns the inverse of `self`. - /// If the matrix is not invertible the returned matrix will be invalid. - /// # Panics - /// Will panic if the determinant of `self` is zero when `glam_assert` is enabled. - inverse: func(self: mat4) -> mat4; - /// Transforms the given [`Vec3A`] as a 3D point, applying perspective correction. - /// This is the equivalent of multiplying the [`Vec3A`] as a 4D vector where `w` is `1.0`. - /// The perspective divide is performed meaning the resulting 3D vector is divided by `w`. - /// This method assumes that `self` contains a projective transform. - project-point3a: func(self: mat4, rhs: vec3-a) -> vec3-a; - mul: func(p0: mat4, p1: affine3-a) -> mat4; - /// Creates a left-handed orthographic projection matrix with `[0,1]` depth range. - /// Useful to map a left-handed coordinate system to the normalized device coordinates that WebGPU/Direct3D/Metal expect. - orthographic-lh: func(left: f32, right: f32, bottom: f32, top: f32, near: f32, far: f32) -> mat4; - add: func(self: mat4, rhs: mat4) -> mat4; - clone: func(self: mat4) -> mat4; - /// Creates a left-handed perspective projection matrix with `[0,1]` depth range. - /// Useful to map the standard left-handed coordinate system into what WebGPU/Metal/Direct3D expect. - /// # Panics - /// Will panic if `z_near` or `z_far` are less than or equal to zero when `glam_assert` is - /// enabled. - perspective-lh: func(fov-y-radians: f32, aspect-ratio: f32, z-near: f32, z-far: f32) -> mat4; - mul: func(p0: mat4, p1: vec4) -> vec4; - /// Creates a right-handed view matrix using a camera position, a facing direction, and an up - /// direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - /// # Panics - /// Will panic if `dir` or `up` are not normalized when `glam_assert` is enabled. - look-to-rh: func(eye: vec3, dir: vec3, up: vec3) -> mat4; - /// Transforms the give [`Vec3A`] as 3D vector. - /// This is the equivalent of multiplying the [`Vec3A`] as a 4D vector where `w` is `0.0`. - transform-vector3a: func(self: mat4, rhs: vec3-a) -> vec3-a; - as-dmat4: func(self: mat4) -> dmat4; - /// Transforms the given 3D vector as a point, applying perspective correction. - /// This is the equivalent of multiplying the 3D vector as a 4D vector where `w` is `1.0`. - /// The perspective divide is performed meaning the resulting 3D vector is divided by `w`. - /// This method assumes that `self` contains a projective transform. - project-point3: func(self: mat4, rhs: vec3) -> vec3; - /// Creates an infinite left-handed perspective projection matrix with `[0,1]` depth range. - /// Like `perspective_lh`, but with an infinite value for `z_far`. - /// The result is that points near `z_near` are mapped to depth `0`, and as they move towards infinity the depth approaches `1`. - /// # Panics - /// Will panic if `z_near` or `z_far` are less than or equal to zero when `glam_assert` is - /// enabled. - perspective-infinite-lh: func(fov-y-radians: f32, aspect-ratio: f32, z-near: f32) -> mat4; - /// Creates a right-handed view matrix using a camera position, a focal point, and an up - /// direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-rh: func(eye: vec3, center: vec3, up: vec3) -> mat4; - neg: func(self: mat4) -> mat4; - /// Creates a left-handed view matrix using a camera position, a focal points and an up - /// direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-lh: func(eye: vec3, center: vec3, up: vec3) -> mat4; - mul: func(p0: mat4, p1: vec4) -> vec4; - /// Creates an infinite reverse right-handed perspective projection matrix with `[0,1]` depth range. - /// Similar to `perspective_infinite_rh`, but maps `Z = z_near` to a depth of `1` and `Z = infinity` to a depth of `0`. - /// # Panics - /// Will panic if `z_near` is less than or equal to zero when `glam_assert` is enabled. - perspective-infinite-reverse-rh: func(fov-y-radians: f32, aspect-ratio: f32, z-near: f32) -> mat4; - /// Returns the determinant of `self`. - determinant: func(self: mat4) -> f32; - /// Creates a right-handed perspective projection matrix with `[-1,1]` depth range. - /// Useful to map the standard right-handed coordinate system into what OpenGL expects. - /// This is the same as the OpenGL `gluPerspective` function. - /// See - perspective-rh-gl: func(fov-y-radians: f32, aspect-ratio: f32, z-near: f32, z-far: f32) -> mat4; - /// Creates a 4x4 matrix with its diagonal set to `diagonal` and all other entries set to 0. - from-diagonal: func(diagonal: vec4) -> mat4; - div: func(self: mat4, rhs: f32) -> mat4; - /// Returns true if the absolute difference of all elements between `self` and `rhs` - /// is less than or equal to `max_abs_diff`. - /// This can be used to compare if two matrices contain similar elements. It works best - /// when comparing with a known value. The `max_abs_diff` that should be used used - /// depends on the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: mat4, rhs: mat4, max-abs-diff: f32) -> bool; - /// Creates an affine transformation matrix from the given 3D `translation`. - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - /// # Panics - /// Will panic if `rotation` is not normalized when `glam_assert` is enabled. - from-rotation-translation: func(rotation: quat, translation: vec3) -> mat4; - /// Transforms a 4D vector. - mul-vec4: func(self: mat4, rhs: vec4) -> vec4; - /// Adds two 4x4 matrices. - add-mat4: func(self: mat4, rhs: mat4) -> mat4; - /// Transforms the given 3D vector as a point. - /// This is the equivalent of multiplying the 3D vector as a 4D vector where `w` is - /// `1.0`. - /// This method assumes that `self` contains a valid affine transform. It does not perform - /// a perspective divide, if `self` contains a perspective transform, or if you are unsure, - /// the [`Self::project_point3()`] method should be used instead. - /// # Panics - /// Will panic if the 3rd row of `self` is not `(0, 0, 0, 1)` when `glam_assert` is enabled. - transform-point3: func(self: mat4, rhs: vec3) -> vec3; - /// Creates a `[f32; 16]` array storing data in column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array: func(self: mat4) -> list; - /// Creates a right-handed orthographic projection matrix with `[-1,1]` depth - /// range. This is the same as the OpenGL `glOrtho` function in OpenGL. - /// See - /// - /// Useful to map a right-handed coordinate system to the normalized device coordinates that OpenGL expects. - orthographic-rh-gl: func(left: f32, right: f32, bottom: f32, top: f32, near: f32, far: f32) -> mat4; - /// Creates a left-handed view matrix using a camera position, a facing direction and an up - /// direction - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - /// # Panics - /// Will panic if `dir` or `up` are not normalized when `glam_assert` is enabled. - look-to-lh: func(eye: vec3, dir: vec3, up: vec3) -> mat4; - /// Multiplies two 4x4 matrices. - mul-mat4: func(self: mat4, rhs: mat4) -> mat4; - /// Creates an affine transformation matrix from the given 3D `scale`, `rotation` and - /// `translation`. - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - /// # Panics - /// Will panic if `rotation` is not normalized when `glam_assert` is enabled. - from-scale-rotation-translation: func(scale: vec3, rotation: quat, translation: vec3) -> mat4; - /// Subtracts two 4x4 matrices. - sub-mat4: func(self: mat4, rhs: mat4) -> mat4; - mul: func(p0: mat4, p1: f32) -> mat4; - /// Creates a affine transformation matrix containing a rotation from the given euler - /// rotation sequence and angles (in radians). - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - from-euler: func(order: euler-rot, a: f32, b: f32, c: f32) -> mat4; - /// Creates a 4x4 matrix from four column vectors. - from-cols: func(x-axis: vec4, y-axis: vec4, z-axis: vec4, w-axis: vec4) -> mat4; - /// Returns `true` if, and only if, all elements are finite. - /// If any element is either `NaN`, positive or negative infinity, this will return `false`. - is-finite: func(self: mat4) -> bool; - /// Creates an affine transformation matrix from the given `rotation` quaternion. - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - /// # Panics - /// Will panic if `rotation` is not normalized when `glam_assert` is enabled. - from-quat: func(rotation: quat) -> mat4; - /// Transforms the given [`Vec3A`] as 3D point. - /// This is the equivalent of multiplying the [`Vec3A`] as a 4D vector where `w` is `1.0`. - transform-point3a: func(self: mat4, rhs: vec3-a) -> vec3-a; - /// Takes the absolute value of each element in `self` - abs: func(self: mat4) -> mat4; - sub: func(self: mat4, rhs: mat4) -> mat4; - mul: func(p0: mat4, p1: mat4) -> mat4; - mul: func(p0: mat4, p1: mat4) -> mat4; - /// Extract Euler angles with the given Euler rotation order. - /// Note if the upper 3x3 matrix contain scales, shears, or other non-rotation transformations - /// then the resulting Euler angles will be ill-defined. - /// # Panics - /// Will panic if any column of the upper 3x3 rotation matrix is not normalized when - /// `glam_assert` is enabled. - to-euler: func(self: mat4, order: euler-rot) -> tuple; -} - -/// Methods for Quat -interface quat { - use types.{reflect-reference}; - - /// Multiplies a quaternion and a 3D vector, returning the rotated vector. - /// # Panics - /// Will panic if `self` is not normalized when `glam_assert` is enabled. - mul-vec3: func(self: quat, rhs: vec3) -> vec3; - clone: func(self: quat) -> quat; - /// Create a quaternion for a normalized rotation `axis` and `angle` (in radians). - /// The axis must be a unit vector. - /// # Panics - /// Will panic if `axis` is not normalized when `glam_assert` is enabled. - from-axis-angle: func(axis: vec3, angle: f32) -> quat; - /// Create a quaternion that rotates `v.length()` radians around `v.normalize()`. - /// `from_scaled_axis(Vec3::ZERO)` results in the identity quaternion. - from-scaled-axis: func(v: vec3) -> quat; - eq: func(self: quat, rhs: quat) -> bool; - sub: func(p0: quat, p1: quat) -> quat; - /// `[x, y, z, w]` - to-array: func(self: quat) -> list; - /// Computes the dot product of `self` and `rhs`. The dot product is - /// equal to the cosine of the angle between two quaternion rotations. - dot: func(self: quat, rhs: quat) -> f32; - add: func(self: quat, rhs: quat) -> quat; - /// Divides a quaternion by a scalar value. - /// The quotient is not guaranteed to be normalized. - div: func(self: quat, rhs: f32) -> quat; - /// Computes the squared length of `self`. - /// This is generally faster than `length()` as it avoids a square - /// root operation. - length-squared: func(self: quat) -> f32; - /// Rotates towards `rhs` up to `max_angle` (in radians). - /// When `max_angle` is `0.0`, the result will be equal to `self`. When `max_angle` is equal to - /// `self.angle_between(rhs)`, the result will be equal to `rhs`. If `max_angle` is negative, - /// rotates towards the exact opposite of `rhs`. Will not go past the target. - /// Both quaternions must be normalized. - /// # Panics - /// Will panic if `self` or `rhs` are not normalized when `glam_assert` is enabled. - rotate-towards: func(self: quat, rhs: quat, max-angle: f32) -> quat; - /// Creates a quaternion from the `angle` (in radians) around the x axis. - from-rotation-x: func(angle: f32) -> quat; - mul: func(p0: quat, p1: vec3) -> vec3; - /// Creates a quaterion rotation from a facing direction and an up direction. - /// For a left-handed view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-to-lh: func(dir: vec3, up: vec3) -> quat; - /// Returns `true` if, and only if, all elements are finite. - /// If any element is either `NaN`, positive or negative infinity, this will return `false`. - is-finite: func(self: quat) -> bool; - mul: func(p0: quat, p1: vec3-a) -> vec3-a; - mul: func(self: quat, rhs: quat) -> quat; - add: func(p0: quat, p1: quat) -> quat; - mul: func(p0: quat, p1: quat) -> quat; - /// Creates a left-handed view matrix using a camera position, a focal point, and an up - /// direction. - /// For a left-handed view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-lh: func(eye: vec3, center: vec3, up: vec3) -> quat; - /// Gets the minimal rotation for transforming `from` to `to`. The resulting rotation is - /// around the z axis. Will rotate at most 180 degrees. - /// The inputs must be unit vectors. - /// `from_rotation_arc_2d(from, to) * from ≈ to`. - /// For near-singular cases (from≈to and from≈-to) the current implementation - /// is only accurate to about 0.001 (for `f32`). - /// # Panics - /// Will panic if `from` or `to` are not normalized when `glam_assert` is enabled. - from-rotation-arc-2d: func(froma: vec2, toa: vec2) -> quat; - /// Creates a quaternion from a 3x3 SIMD aligned rotation matrix. - /// Note if the input matrix contain scales, shears, or other non-rotation transformations then - /// the resulting quaternion will be ill-defined. - /// # Panics - /// Will panic if any input matrix column is not normalized when `glam_assert` is enabled. - from-mat3a: func(mat: mat3-a) -> quat; - /// Creates a new rotation quaternion. - /// This should generally not be called manually unless you know what you are doing. - /// Use one of the other constructors instead such as `identity` or `from_axis_angle`. - /// `from_xyzw` is mostly used by unit tests and `serde` deserialization. - /// # Preconditions - /// This function does not check if the input is normalized, it is up to the user to - /// provide normalized input or to normalized the resulting quaternion. - from-xyzw: func(x: f32, y: f32, z: f32, w: f32) -> quat; - /// Creates a quaternion from the `angle` (in radians) around the z axis. - from-rotation-z: func(angle: f32) -> quat; - is-near-identity: func(self: quat) -> bool; - as-dquat: func(self: quat) -> dquat; - /// Returns the vector part of the quaternion. - xyz: func(self: quat) -> vec3; - /// Gets the minimal rotation for transforming `from` to `to`. The rotation is in the - /// plane spanned by the two vectors. Will rotate at most 180 degrees. - /// The inputs must be unit vectors. - /// `from_rotation_arc(from, to) * from ≈ to`. - /// For near-singular cases (from≈to and from≈-to) the current implementation - /// is only accurate to about 0.001 (for `f32`). - /// # Panics - /// Will panic if `from` or `to` are not normalized when `glam_assert` is enabled. - from-rotation-arc: func(froma: vec3, toa: vec3) -> quat; - /// Returns whether `self` of length `1.0` or not. - /// Uses a precision threshold of `1e-6`. - is-normalized: func(self: quat) -> bool; - /// Creates a rotation quaternion from an array. - /// # Preconditions - /// This function does not check if the input is normalized, it is up to the user to - /// provide normalized input or to normalized the resulting quaternion. - from-array: func(a: list) -> quat; - mul: func(p0: quat, p1: vec3) -> vec3; - /// Performs a linear interpolation between `self` and `rhs` based on - /// the value `s`. - /// When `s` is `0.0`, the result will be equal to `self`. When `s` - /// is `1.0`, the result will be equal to `rhs`. - /// # Panics - /// Will panic if `self` or `end` are not normalized when `glam_assert` is enabled. - lerp: func(self: quat, end: quat, s: f32) -> quat; - /// Returns the angle (in radians) for the minimal rotation - /// for transforming this quaternion into another. - /// Both quaternions must be normalized. - /// # Panics - /// Will panic if `self` or `rhs` are not normalized when `glam_assert` is enabled. - angle-between: func(self: quat, rhs: quat) -> f32; - /// Creates a new rotation quaternion from a 4D vector. - /// # Preconditions - /// This function does not check if the input is normalized, it is up to the user to - /// provide normalized input or to normalized the resulting quaternion. - from-vec4: func(v: vec4) -> quat; - /// Creates a quaternion from a 3x3 rotation matrix inside a 3D affine transform. - /// Note if the input affine matrix contain scales, shears, or other non-rotation - /// transformations then the resulting quaternion will be ill-defined. - /// # Panics - /// Will panic if any input affine matrix column is not normalized when `glam_assert` is - /// enabled. - from-affine3: func(a: affine3-a) -> quat; - /// Gets the minimal rotation for transforming `from` to either `to` or `-to`. This means - /// that the resulting quaternion will rotate `from` so that it is colinear with `to`. - /// The rotation is in the plane spanned by the two vectors. Will rotate at most 90 - /// degrees. - /// The inputs must be unit vectors. - /// `to.dot(from_rotation_arc_colinear(from, to) * from).abs() ≈ 1`. - /// # Panics - /// Will panic if `from` or `to` are not normalized when `glam_assert` is enabled. - from-rotation-arc-colinear: func(froma: vec3, toa: vec3) -> quat; - /// Creates a quaternion from the `angle` (in radians) around the y axis. - from-rotation-y: func(angle: f32) -> quat; - /// Returns the quaternion conjugate of `self`. For a unit quaternion the - /// conjugate is also the inverse. - conjugate: func(self: quat) -> quat; - sub: func(self: quat, rhs: quat) -> quat; - /// Returns true if the absolute difference of all elements between `self` and `rhs` - /// is less than or equal to `max_abs_diff`. - /// This can be used to compare if two quaternions contain similar elements. It works - /// best when comparing with a known value. The `max_abs_diff` that should be used used - /// depends on the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: quat, rhs: quat, max-abs-diff: f32) -> bool; - /// Creates a quaternion from the upper 3x3 rotation matrix inside a homogeneous 4x4 matrix. - /// Note if the upper 3x3 matrix contain scales, shears, or other non-rotation transformations - /// then the resulting quaternion will be ill-defined. - /// # Panics - /// Will panic if any column of the upper 3x3 rotation matrix is not normalized when - /// `glam_assert` is enabled. - from-mat4: func(mat: mat4) -> quat; - mul: func(p0: quat, p1: vec3-a) -> vec3-a; - /// Creates a quaternion from a 3x3 rotation matrix. - /// Note if the input matrix contain scales, shears, or other non-rotation transformations then - /// the resulting quaternion will be ill-defined. - /// # Panics - /// Will panic if any input matrix column is not normalized when `glam_assert` is enabled. - from-mat3: func(mat: mat3) -> quat; - /// Returns the rotation axis scaled by the rotation in radians. - to-scaled-axis: func(self: quat) -> vec3; - /// Returns `true` if any elements are `NAN`. - is-nan: func(self: quat) -> bool; - neg: func(self: quat) -> quat; - /// Computes `1.0 / length()`. - /// For valid results, `self` must _not_ be of length zero. - length-recip: func(self: quat) -> f32; - /// Returns the inverse of a normalized quaternion. - /// Typically quaternion inverse returns the conjugate of a normalized quaternion. - /// Because `self` is assumed to already be unit length this method *does not* normalize - /// before returning the conjugate. - /// # Panics - /// Will panic if `self` is not normalized when `glam_assert` is enabled. - inverse: func(self: quat) -> quat; - /// Computes the length of `self`. - length: func(self: quat) -> f32; - /// Multiplies a quaternion and a 3D vector, returning the rotated vector. - mul-vec3a: func(self: quat, rhs: vec3-a) -> vec3-a; - /// Multiplies two quaternions. If they each represent a rotation, the result will - /// represent the combined rotation. - /// Note that due to floating point rounding the result may not be perfectly normalized. - /// # Panics - /// Will panic if `self` or `rhs` are not normalized when `glam_assert` is enabled. - mul-quat: func(self: quat, rhs: quat) -> quat; - /// Returns `self` normalized to length 1.0. - /// For valid results, `self` must _not_ be of length zero. - /// Panics - /// Will panic if `self` is zero length when `glam_assert` is enabled. - normalize: func(self: quat) -> quat; - /// Creates a quaterion rotation from facing direction and an up direction. - /// For a right-handed view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - /// # Panics - /// Will panic if `dir` and `up` are not normalized when `glam_assert` is enabled. - look-to-rh: func(dir: vec3, up: vec3) -> quat; - mul: func(p0: quat, p1: f32) -> quat; - /// Returns the rotation angles for the given euler rotation sequence. - to-euler: func(self: quat, order: euler-rot) -> tuple; - /// Creates a right-handed view matrix using a camera position, an up direction, and a focal - /// point. - /// For a right-handed view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-rh: func(eye: vec3, center: vec3, up: vec3) -> quat; - /// Creates a quaternion from the given Euler rotation sequence and the angles (in radians). - from-euler: func(euler: euler-rot, a: f32, b: f32, c: f32) -> quat; - /// Performs a spherical linear interpolation between `self` and `end` - /// based on the value `s`. - /// When `s` is `0.0`, the result will be equal to `self`. When `s` - /// is `1.0`, the result will be equal to `end`. - /// # Panics - /// Will panic if `self` or `end` are not normalized when `glam_assert` is enabled. - slerp: func(self: quat, end: quat, s: f32) -> quat; -} - -/// Methods for U16Vec2 -interface u16-vec2 { - use types.{reflect-reference}; - - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: u16-vec2) -> u16; - /// Casts all elements of `self` to `u64`. - as-u64vec2: func(self: u16-vec2) -> u64-vec2; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: u16-vec2, rhs: u16-vec2) -> u16-vec2; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec2, if-true: u16-vec2, if-false: u16-vec2) -> u16-vec2; - /// Converts `self` to `[x, y]` - to-array: func(self: u16-vec2) -> list; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: u16-vec2, rhs: u16-vec2) -> u16-vec2; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: u16-vec2, rhs: u16-vec2) -> bvec2; - mul: func(p0: u16-vec2, p1: u16-vec2) -> u16-vec2; - /// Computes the squared length of `self`. - length-squared: func(self: u16-vec2) -> u16; - /// Casts all elements of `self` to `i32`. - as-ivec2: func(self: u16-vec2) -> ivec2; - /// Creates a 2D vector from `self` with the given value of `y`. - with-y: func(self: u16-vec2, y: u16) -> u16-vec2; - clone: func(self: u16-vec2) -> u16-vec2; - /// Returns a vector containing the wrapping addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_signed(rhs.x), self.y.wrapping_add_signed(rhs.y), ..]`. - wrapping-add-signed: func(self: u16-vec2, rhs: i16-vec2) -> u16-vec2; - add: func(p0: u16-vec2, p1: u16-vec2) -> u16-vec2; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: u16-vec2, rhs: u16-vec2) -> u16-vec2; - /// Casts all elements of `self` to `u8`. - as-u8vec2: func(self: u16-vec2) -> u8-vec2; - rem: func(p0: u16-vec2, p1: u16) -> u16-vec2; - /// Creates a new vector. - new: func(x: u16, y: u16) -> u16-vec2; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: u16-vec2) -> u16; - assert-receiver-is-total-eq: func(self: u16-vec2); - /// Returns the index of the first minimum element of `self`. - min-position: func(self: u16-vec2) -> u64; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: u16-vec2, rhs: u16-vec2) -> u16-vec2; - mul: func(self: u16-vec2, rhs: u16-vec2) -> u16-vec2; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: u16-vec2, rhs: u16-vec2) -> u16-vec2; - /// Creates a 2D vector from `self` with the given value of `x`. - with-x: func(self: u16-vec2, x: u16) -> u16-vec2; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: u16-vec2, rhs: u16-vec2) -> u16-vec2; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u16::MAX`]. - /// See also [`checked_manhattan_distance`][U16Vec2::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: u16-vec2, rhs: u16-vec2) -> u16; - /// Casts all elements of `self` to `i64`. - as-i64vec2: func(self: u16-vec2) -> i64-vec2; - /// Casts all elements of `self` to `u32`. - as-uvec2: func(self: u16-vec2) -> uvec2; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u16::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: u16-vec2, rhs: u16-vec2) -> option; - add: func(self: u16-vec2, rhs: u16-vec2) -> u16-vec2; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: u16-vec2, rhs: u16-vec2) -> u16-vec2; - rem: func(self: u16-vec2, rhs: u16-vec2) -> u16-vec2; - /// Creates a 3D vector from `self` and the given `z` value. - extend: func(self: u16-vec2, z: u16) -> u16-vec3; - mul: func(p0: u16-vec2, p1: u16) -> u16-vec2; - eq: func(self: u16-vec2, other: u16-vec2) -> bool; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: u16-vec2) -> u64; - div: func(self: u16-vec2, rhs: u16-vec2) -> u16-vec2; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: u16-vec2, rhs: u16-vec2) -> u16-vec2; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: u16-vec2, rhs: u16-vec2) -> u16; - sub: func(p0: u16-vec2, p1: u16) -> u16-vec2; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: u16-vec2, rhs: u16-vec2) -> bvec2; - /// Creates a new vector from an array. - from-array: func(a: list) -> u16-vec2; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: u16-vec2, rhs: u16-vec2) -> bvec2; - /// Returns a vector containing the saturating addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.saturating_add_signed(rhs.x), self.y.saturating_add_signed(rhs.y), ..]`. - saturating-add-signed: func(self: u16-vec2, rhs: i16-vec2) -> u16-vec2; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: u16-vec2) -> u16; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: u16-vec2, rhs: u16-vec2) -> bvec2; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: u16-vec2, rhs: u16-vec2) -> u16-vec2; - /// Casts all elements of `self` to `i16`. - as-i16vec2: func(self: u16-vec2) -> i16-vec2; - add: func(p0: u16-vec2, p1: u16) -> u16-vec2; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: u16-vec2, rhs: u16-vec2) -> bvec2; - sub: func(self: u16-vec2, rhs: u16-vec2) -> u16-vec2; - div: func(p0: u16-vec2, p1: u16) -> u16-vec2; - /// Casts all elements of `self` to `f32`. - as-vec2: func(self: u16-vec2) -> vec2; - /// Creates a vector with all elements set to `v`. - splat: func(v: u16) -> u16-vec2; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: u16-vec2) -> u16; - sub: func(p0: u16-vec2, p1: u16-vec2) -> u16-vec2; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: u16-vec2, rhs: u16-vec2) -> u16; - div: func(p0: u16-vec2, p1: u16-vec2) -> u16-vec2; - rem: func(p0: u16-vec2, p1: u16-vec2) -> u16-vec2; - /// Casts all elements of `self` to `i8`. - as-i8vec2: func(self: u16-vec2) -> i8-vec2; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: u16-vec2, rhs: u16-vec2) -> u16-vec2; - /// Casts all elements of `self` to `f64`. - as-dvec2: func(self: u16-vec2) -> dvec2; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: u16-vec2, rhs: u16-vec2) -> bvec2; - /// Component-wise clamping of values, similar to [`u16::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: u16-vec2, min: u16-vec2, max: u16-vec2) -> u16-vec2; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: u16-vec2, rhs: u16-vec2) -> u16-vec2; -} - -/// Methods for U16Vec3 -interface u16-vec3 { - use types.{reflect-reference}; - - /// Computes the dot product of `self` and `rhs`. - dot: func(self: u16-vec3, rhs: u16-vec3) -> u16; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: u16-vec3, rhs: u16-vec3) -> u16-vec3; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: u16-vec3, rhs: u16-vec3) -> bvec3; - /// Computes the squared length of `self`. - length-squared: func(self: u16-vec3) -> u16; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: u16-vec3) -> u64; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: u16-vec3) -> u16; - /// Casts all elements of `self` to `u8`. - as-u8vec3: func(self: u16-vec3) -> u8-vec3; - assert-receiver-is-total-eq: func(self: u16-vec3); - /// Creates a 3D vector from `self` with the given value of `z`. - with-z: func(self: u16-vec3, z: u16) -> u16-vec3; - sub: func(p0: u16-vec3, p1: u16) -> u16-vec3; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: u16-vec3, rhs: u16-vec3) -> u16-vec3; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: u16-vec3, rhs: u16-vec3) -> u16-vec3; - add: func(self: u16-vec3, rhs: u16-vec3) -> u16-vec3; - /// Casts all elements of `self` to `i64`. - as-i64vec3: func(self: u16-vec3) -> i64-vec3; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: u16-vec3) -> u16; - sub: func(p0: u16-vec3, p1: u16-vec3) -> u16-vec3; - /// Returns a vector containing the wrapping addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_signed(rhs.x), self.y.wrapping_add_signed(rhs.y), ..]`. - wrapping-add-signed: func(self: u16-vec3, rhs: i16-vec3) -> u16-vec3; - /// Casts all elements of `self` to `u32`. - as-uvec3: func(self: u16-vec3) -> uvec3; - /// Creates a new vector from an array. - from-array: func(a: list) -> u16-vec3; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: u16-vec3, rhs: u16-vec3) -> u16; - /// Creates a 4D vector from `self` and the given `w` value. - extend: func(self: u16-vec3, w: u16) -> u16-vec4; - /// Casts all elements of `self` to `f32`. - as-vec3a: func(self: u16-vec3) -> vec3-a; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u16::MAX`]. - /// See also [`checked_manhattan_distance`][U16Vec3::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: u16-vec3, rhs: u16-vec3) -> u16; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: u16-vec3, rhs: u16-vec3) -> bvec3; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: u16-vec3) -> u64; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: u16-vec3) -> u16; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: u16-vec3, rhs: u16-vec3) -> u16-vec3; - div: func(self: u16-vec3, rhs: u16-vec3) -> u16-vec3; - /// Casts all elements of `self` to `i8`. - as-i8vec3: func(self: u16-vec3) -> i8-vec3; - /// Returns a vector containing the saturating addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.saturating_add_signed(rhs.x), self.y.saturating_add_signed(rhs.y), ..]`. - saturating-add-signed: func(self: u16-vec3, rhs: i16-vec3) -> u16-vec3; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: u16-vec3, rhs: u16-vec3) -> u16-vec3; - eq: func(self: u16-vec3, other: u16-vec3) -> bool; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: u16-vec3, rhs: u16-vec3) -> bvec3; - /// Creates a 3D vector from `self` with the given value of `x`. - with-x: func(self: u16-vec3, x: u16) -> u16-vec3; - /// Casts all elements of `self` to `i16`. - as-i16vec3: func(self: u16-vec3) -> i16-vec3; - /// Creates a vector with all elements set to `v`. - splat: func(v: u16) -> u16-vec3; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: u16-vec3, rhs: u16-vec3) -> bvec3; - /// Component-wise clamping of values, similar to [`u16::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: u16-vec3, min: u16-vec3, max: u16-vec3) -> u16-vec3; - add: func(p0: u16-vec3, p1: u16) -> u16-vec3; - /// Creates a 2D vector from the `x` and `y` elements of `self`, discarding `z`. - /// Truncation may also be performed by using [`self.xy()`][crate::swizzles::Vec3Swizzles::xy()]. - truncate: func(self: u16-vec3) -> u16-vec2; - rem: func(self: u16-vec3, rhs: u16-vec3) -> u16-vec3; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec3, if-true: u16-vec3, if-false: u16-vec3) -> u16-vec3; - rem: func(p0: u16-vec3, p1: u16) -> u16-vec3; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: u16-vec3, rhs: u16-vec3) -> bvec3; - /// Casts all elements of `self` to `i32`. - as-ivec3: func(self: u16-vec3) -> ivec3; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: u16-vec3, rhs: u16-vec3) -> u16-vec3; - mul: func(p0: u16-vec3, p1: u16-vec3) -> u16-vec3; - /// Casts all elements of `self` to `u64`. - as-u64vec3: func(self: u16-vec3) -> u64-vec3; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u16::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: u16-vec3, rhs: u16-vec3) -> option; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: u16-vec3, rhs: u16-vec3) -> u16-vec3; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: u16-vec3, rhs: u16-vec3) -> u16-vec3; - /// Casts all elements of `self` to `f32`. - as-vec3: func(self: u16-vec3) -> vec3; - /// Creates a new vector. - new: func(x: u16, y: u16, z: u16) -> u16-vec3; - mul: func(self: u16-vec3, rhs: u16-vec3) -> u16-vec3; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: u16-vec3, rhs: u16-vec3) -> u16-vec3; - div: func(p0: u16-vec3, p1: u16) -> u16-vec3; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: u16-vec3) -> u16; - /// Creates a 3D vector from `self` with the given value of `y`. - with-y: func(self: u16-vec3, y: u16) -> u16-vec3; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: u16-vec3, rhs: u16-vec3) -> bvec3; - sub: func(self: u16-vec3, rhs: u16-vec3) -> u16-vec3; - mul: func(p0: u16-vec3, p1: u16) -> u16-vec3; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: u16-vec3, rhs: u16-vec3) -> u16-vec3; - /// Converts `self` to `[x, y, z]` - to-array: func(self: u16-vec3) -> list; - add: func(p0: u16-vec3, p1: u16-vec3) -> u16-vec3; - clone: func(self: u16-vec3) -> u16-vec3; - div: func(p0: u16-vec3, p1: u16-vec3) -> u16-vec3; - /// Casts all elements of `self` to `f64`. - as-dvec3: func(self: u16-vec3) -> dvec3; - /// Computes the cross product of `self` and `rhs`. - cross: func(self: u16-vec3, rhs: u16-vec3) -> u16-vec3; - rem: func(p0: u16-vec3, p1: u16-vec3) -> u16-vec3; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: u16-vec3, rhs: u16-vec3) -> u16-vec3; -} - -/// Methods for U16Vec4 -interface u16-vec4 { - use types.{reflect-reference}; - - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: u16-vec4, rhs: u16-vec4) -> u16-vec4; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: u16-vec4, rhs: u16-vec4) -> u16; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: u16-vec4) -> u16; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: u16-vec4) -> u16; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: u16-vec4, rhs: u16-vec4) -> u16; - rem: func(p0: u16-vec4, p1: u16-vec4) -> u16-vec4; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: u16-vec4) -> u16; - div: func(self: u16-vec4, rhs: u16-vec4) -> u16-vec4; - /// Creates a 4D vector from `self` with the given value of `y`. - with-y: func(self: u16-vec4, y: u16) -> u16-vec4; - mul: func(p0: u16-vec4, p1: u16-vec4) -> u16-vec4; - /// Returns a vector containing the saturating addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.saturating_add_signed(rhs.x), self.y.saturating_add_signed(rhs.y), ..]`. - saturating-add-signed: func(self: u16-vec4, rhs: i16-vec4) -> u16-vec4; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: u16-vec4, rhs: u16-vec4) -> u16-vec4; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: u16-vec4, rhs: u16-vec4) -> bvec4; - /// Casts all elements of `self` to `i8`. - as-i8vec4: func(self: u16-vec4) -> i8-vec4; - mul: func(self: u16-vec4, rhs: u16-vec4) -> u16-vec4; - /// Component-wise clamping of values, similar to [`u16::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: u16-vec4, min: u16-vec4, max: u16-vec4) -> u16-vec4; - add: func(self: u16-vec4, rhs: u16-vec4) -> u16-vec4; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: u16-vec4, rhs: u16-vec4) -> u16-vec4; - sub: func(p0: u16-vec4, p1: u16) -> u16-vec4; - /// Casts all elements of `self` to `u8`. - as-u8vec4: func(self: u16-vec4) -> u8-vec4; - /// Creates a 3D vector from the `x`, `y` and `z` elements of `self`, discarding `w`. - /// Truncation to [`U16Vec3`] may also be performed by using [`self.xyz()`][crate::swizzles::Vec4Swizzles::xyz()]. - truncate: func(self: u16-vec4) -> u16-vec3; - add: func(p0: u16-vec4, p1: u16-vec4) -> u16-vec4; - /// Casts all elements of `self` to `i32`. - as-ivec4: func(self: u16-vec4) -> ivec4; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: u16-vec4, rhs: u16-vec4) -> bvec4; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: u16-vec4, rhs: u16-vec4) -> bvec4; - div: func(p0: u16-vec4, p1: u16) -> u16-vec4; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: u16-vec4, rhs: u16-vec4) -> u16-vec4; - sub: func(self: u16-vec4, rhs: u16-vec4) -> u16-vec4; - eq: func(self: u16-vec4, other: u16-vec4) -> bool; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: u16-vec4, rhs: u16-vec4) -> u16-vec4; - rem: func(self: u16-vec4, rhs: u16-vec4) -> u16-vec4; - add: func(p0: u16-vec4, p1: u16) -> u16-vec4; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: u16-vec4, rhs: u16-vec4) -> u16-vec4; - /// Casts all elements of `self` to `f64`. - as-dvec4: func(self: u16-vec4) -> dvec4; - assert-receiver-is-total-eq: func(self: u16-vec4); - /// Casts all elements of `self` to `i16`. - as-i16vec4: func(self: u16-vec4) -> i16-vec4; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: u16-vec4, rhs: u16-vec4) -> u16-vec4; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: u16-vec4) -> u64; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: u16-vec4, rhs: u16-vec4) -> u16-vec4; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: u16-vec4, rhs: u16-vec4) -> bvec4; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u16::MAX`]. - /// See also [`checked_manhattan_distance`][U16Vec4::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: u16-vec4, rhs: u16-vec4) -> u16; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u16::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: u16-vec4, rhs: u16-vec4) -> option; - /// Creates a vector with all elements set to `v`. - splat: func(v: u16) -> u16-vec4; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: u16-vec4, rhs: u16-vec4) -> u16-vec4; - sub: func(p0: u16-vec4, p1: u16-vec4) -> u16-vec4; - /// Casts all elements of `self` to `u32`. - as-uvec4: func(self: u16-vec4) -> uvec4; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: u16-vec4, rhs: u16-vec4) -> bvec4; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec4, if-true: u16-vec4, if-false: u16-vec4) -> u16-vec4; - /// Casts all elements of `self` to `u64`. - as-u64vec4: func(self: u16-vec4) -> u64-vec4; - /// Creates a new vector from an array. - from-array: func(a: list) -> u16-vec4; - rem: func(p0: u16-vec4, p1: u16) -> u16-vec4; - /// Computes the squared length of `self`. - length-squared: func(self: u16-vec4) -> u16; - /// Converts `self` to `[x, y, z, w]` - to-array: func(self: u16-vec4) -> list; - div: func(p0: u16-vec4, p1: u16-vec4) -> u16-vec4; - /// Casts all elements of `self` to `f32`. - as-vec4: func(self: u16-vec4) -> vec4; - mul: func(p0: u16-vec4, p1: u16) -> u16-vec4; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: u16-vec4) -> u64; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: u16-vec4, rhs: u16-vec4) -> bvec4; - /// Returns a vector containing the wrapping addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_signed(rhs.x), self.y.wrapping_add_signed(rhs.y), ..]`. - wrapping-add-signed: func(self: u16-vec4, rhs: i16-vec4) -> u16-vec4; - /// Creates a new vector. - new: func(x: u16, y: u16, z: u16, w: u16) -> u16-vec4; - /// Creates a 4D vector from `self` with the given value of `x`. - with-x: func(self: u16-vec4, x: u16) -> u16-vec4; - clone: func(self: u16-vec4) -> u16-vec4; - /// Creates a 4D vector from `self` with the given value of `w`. - with-w: func(self: u16-vec4, w: u16) -> u16-vec4; - /// Casts all elements of `self` to `i64`. - as-i64vec4: func(self: u16-vec4) -> i64-vec4; - /// Creates a 4D vector from `self` with the given value of `z`. - with-z: func(self: u16-vec4, z: u16) -> u16-vec4; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: u16-vec4, rhs: u16-vec4) -> u16-vec4; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: u16-vec4, rhs: u16-vec4) -> u16-vec4; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: u16-vec4) -> u16; -} - -/// Methods for U64Vec2 -interface u64-vec2 { - use types.{reflect-reference}; - - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: u64-vec2) -> u64; - sub: func(self: u64-vec2, rhs: u64-vec2) -> u64-vec2; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: u64-vec2, rhs: u64-vec2) -> u64-vec2; - /// Casts all elements of `self` to `i64`. - as-i64vec2: func(self: u64-vec2) -> i64-vec2; - /// Casts all elements of `self` to `u16`. - as-u16vec2: func(self: u64-vec2) -> u16-vec2; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: u64-vec2, rhs: u64-vec2) -> u64; - /// Creates a new vector from an array. - from-array: func(a: list) -> u64-vec2; - /// Casts all elements of `self` to `f64`. - as-dvec2: func(self: u64-vec2) -> dvec2; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: u64-vec2, rhs: u64-vec2) -> u64-vec2; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: u64-vec2, rhs: u64-vec2) -> bvec2; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: u64-vec2, rhs: u64-vec2) -> u64-vec2; - add: func(p0: u64-vec2, p1: u64) -> u64-vec2; - mul: func(p0: u64-vec2, p1: u64) -> u64-vec2; - div: func(self: u64-vec2, rhs: u64-vec2) -> u64-vec2; - /// Casts all elements of `self` to `i16`. - as-i16vec2: func(self: u64-vec2) -> i16-vec2; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: u64-vec2) -> u64; - /// Returns a vector containing the saturating addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.saturating_add_signed(rhs.x), self.y.saturating_add_signed(rhs.y), ..]`. - saturating-add-signed: func(self: u64-vec2, rhs: i64-vec2) -> u64-vec2; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u64::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: u64-vec2, rhs: u64-vec2) -> option; - /// Converts `self` to `[x, y]` - to-array: func(self: u64-vec2) -> list; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: u64-vec2, rhs: u64-vec2) -> u64-vec2; - /// Casts all elements of `self` to `u8`. - as-u8vec2: func(self: u64-vec2) -> u8-vec2; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: u64-vec2) -> u64; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: u64-vec2, rhs: u64-vec2) -> u64-vec2; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: u64-vec2, rhs: u64-vec2) -> u64-vec2; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: u64-vec2, rhs: u64-vec2) -> bvec2; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u64::MAX`]. - /// See also [`checked_manhattan_distance`][U64Vec2::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: u64-vec2, rhs: u64-vec2) -> u64; - add: func(p0: u64-vec2, p1: u64-vec2) -> u64-vec2; - /// Creates a vector with all elements set to `v`. - splat: func(v: u64) -> u64-vec2; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: u64-vec2, rhs: u64-vec2) -> u64; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: u64-vec2, rhs: u64-vec2) -> bvec2; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: u64-vec2, rhs: u64-vec2) -> u64-vec2; - rem: func(p0: u64-vec2, p1: u64) -> u64-vec2; - /// Computes the squared length of `self`. - length-squared: func(self: u64-vec2) -> u64; - assert-receiver-is-total-eq: func(self: u64-vec2); - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: u64-vec2, rhs: u64-vec2) -> u64-vec2; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: u64-vec2) -> u64; - mul: func(self: u64-vec2, rhs: u64-vec2) -> u64-vec2; - /// Creates a 2D vector from `self` with the given value of `y`. - with-y: func(self: u64-vec2, y: u64) -> u64-vec2; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: u64-vec2, rhs: u64-vec2) -> u64-vec2; - rem: func(self: u64-vec2, rhs: u64-vec2) -> u64-vec2; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: u64-vec2, rhs: u64-vec2) -> bvec2; - div: func(p0: u64-vec2, p1: u64) -> u64-vec2; - sub: func(p0: u64-vec2, p1: u64) -> u64-vec2; - /// Creates a 3D vector from `self` and the given `z` value. - extend: func(self: u64-vec2, z: u64) -> u64-vec3; - /// Casts all elements of `self` to `u32`. - as-uvec2: func(self: u64-vec2) -> uvec2; - /// Casts all elements of `self` to `f32`. - as-vec2: func(self: u64-vec2) -> vec2; - div: func(p0: u64-vec2, p1: u64-vec2) -> u64-vec2; - clone: func(self: u64-vec2) -> u64-vec2; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: u64-vec2, rhs: u64-vec2) -> u64-vec2; - rem: func(p0: u64-vec2, p1: u64-vec2) -> u64-vec2; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: u64-vec2, rhs: u64-vec2) -> u64-vec2; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec2, if-true: u64-vec2, if-false: u64-vec2) -> u64-vec2; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: u64-vec2) -> u64; - mul: func(p0: u64-vec2, p1: u64-vec2) -> u64-vec2; - /// Casts all elements of `self` to `i8`. - as-i8vec2: func(self: u64-vec2) -> i8-vec2; - /// Casts all elements of `self` to `i32`. - as-ivec2: func(self: u64-vec2) -> ivec2; - sub: func(p0: u64-vec2, p1: u64-vec2) -> u64-vec2; - /// Creates a 2D vector from `self` with the given value of `x`. - with-x: func(self: u64-vec2, x: u64) -> u64-vec2; - /// Component-wise clamping of values, similar to [`u64::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: u64-vec2, min: u64-vec2, max: u64-vec2) -> u64-vec2; - /// Returns a vector containing the wrapping addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_signed(rhs.x), self.y.wrapping_add_signed(rhs.y), ..]`. - wrapping-add-signed: func(self: u64-vec2, rhs: i64-vec2) -> u64-vec2; - add: func(self: u64-vec2, rhs: u64-vec2) -> u64-vec2; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: u64-vec2, rhs: u64-vec2) -> bvec2; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: u64-vec2, rhs: u64-vec2) -> bvec2; - eq: func(self: u64-vec2, other: u64-vec2) -> bool; - /// Creates a new vector. - new: func(x: u64, y: u64) -> u64-vec2; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: u64-vec2) -> u64; -} - -/// Methods for U64Vec3 -interface u64-vec3 { - use types.{reflect-reference}; - - /// Component-wise clamping of values, similar to [`u64::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: u64-vec3, min: u64-vec3, max: u64-vec3) -> u64-vec3; - mul: func(self: u64-vec3, rhs: u64-vec3) -> u64-vec3; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: u64-vec3, rhs: u64-vec3) -> bvec3; - /// Casts all elements of `self` to `i8`. - as-i8vec3: func(self: u64-vec3) -> i8-vec3; - mul: func(p0: u64-vec3, p1: u64) -> u64-vec3; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: u64-vec3, rhs: u64-vec3) -> bvec3; - /// Computes the cross product of `self` and `rhs`. - cross: func(self: u64-vec3, rhs: u64-vec3) -> u64-vec3; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: u64-vec3, rhs: u64-vec3) -> u64-vec3; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: u64-vec3) -> u64; - /// Casts all elements of `self` to `u32`. - as-uvec3: func(self: u64-vec3) -> uvec3; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: u64-vec3, rhs: u64-vec3) -> u64-vec3; - /// Creates a 2D vector from the `x` and `y` elements of `self`, discarding `z`. - /// Truncation may also be performed by using [`self.xy()`][crate::swizzles::Vec3Swizzles::xy()]. - truncate: func(self: u64-vec3) -> u64-vec2; - rem: func(p0: u64-vec3, p1: u64-vec3) -> u64-vec3; - /// Creates a 3D vector from `self` with the given value of `x`. - with-x: func(self: u64-vec3, x: u64) -> u64-vec3; - /// Casts all elements of `self` to `i16`. - as-i16vec3: func(self: u64-vec3) -> i16-vec3; - /// Casts all elements of `self` to `f64`. - as-dvec3: func(self: u64-vec3) -> dvec3; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: u64-vec3, rhs: u64-vec3) -> bvec3; - sub: func(p0: u64-vec3, p1: u64-vec3) -> u64-vec3; - /// Returns a vector containing the wrapping addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_signed(rhs.x), self.y.wrapping_add_signed(rhs.y), ..]`. - wrapping-add-signed: func(self: u64-vec3, rhs: i64-vec3) -> u64-vec3; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: u64-vec3, rhs: u64-vec3) -> u64-vec3; - /// Creates a new vector from an array. - from-array: func(a: list) -> u64-vec3; - clone: func(self: u64-vec3) -> u64-vec3; - div: func(p0: u64-vec3, p1: u64) -> u64-vec3; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: u64-vec3, rhs: u64-vec3) -> bvec3; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: u64-vec3) -> u64; - /// Casts all elements of `self` to `f32`. - as-vec3a: func(self: u64-vec3) -> vec3-a; - assert-receiver-is-total-eq: func(self: u64-vec3); - /// Computes the squared length of `self`. - length-squared: func(self: u64-vec3) -> u64; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: u64-vec3, rhs: u64-vec3) -> bvec3; - sub: func(self: u64-vec3, rhs: u64-vec3) -> u64-vec3; - /// Casts all elements of `self` to `i64`. - as-i64vec3: func(self: u64-vec3) -> i64-vec3; - /// Casts all elements of `self` to `u16`. - as-u16vec3: func(self: u64-vec3) -> u16-vec3; - add: func(p0: u64-vec3, p1: u64) -> u64-vec3; - add: func(p0: u64-vec3, p1: u64-vec3) -> u64-vec3; - /// Creates a 3D vector from `self` with the given value of `y`. - with-y: func(self: u64-vec3, y: u64) -> u64-vec3; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u64::MAX`]. - /// See also [`checked_manhattan_distance`][U64Vec3::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: u64-vec3, rhs: u64-vec3) -> u64; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u64::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: u64-vec3, rhs: u64-vec3) -> option; - sub: func(p0: u64-vec3, p1: u64) -> u64-vec3; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: u64-vec3, rhs: u64-vec3) -> u64; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: u64-vec3, rhs: u64-vec3) -> u64-vec3; - eq: func(self: u64-vec3, other: u64-vec3) -> bool; - /// Casts all elements of `self` to `u8`. - as-u8vec3: func(self: u64-vec3) -> u8-vec3; - /// Creates a new vector. - new: func(x: u64, y: u64, z: u64) -> u64-vec3; - /// Creates a 4D vector from `self` and the given `w` value. - extend: func(self: u64-vec3, w: u64) -> u64-vec4; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: u64-vec3) -> u64; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec3, if-true: u64-vec3, if-false: u64-vec3) -> u64-vec3; - rem: func(self: u64-vec3, rhs: u64-vec3) -> u64-vec3; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: u64-vec3, rhs: u64-vec3) -> u64-vec3; - /// Converts `self` to `[x, y, z]` - to-array: func(self: u64-vec3) -> list; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: u64-vec3, rhs: u64-vec3) -> u64-vec3; - /// Returns a vector containing the saturating addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.saturating_add_signed(rhs.x), self.y.saturating_add_signed(rhs.y), ..]`. - saturating-add-signed: func(self: u64-vec3, rhs: i64-vec3) -> u64-vec3; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: u64-vec3) -> u64; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: u64-vec3) -> u64; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: u64-vec3, rhs: u64-vec3) -> u64-vec3; - /// Casts all elements of `self` to `i32`. - as-ivec3: func(self: u64-vec3) -> ivec3; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: u64-vec3, rhs: u64-vec3) -> bvec3; - div: func(self: u64-vec3, rhs: u64-vec3) -> u64-vec3; - add: func(self: u64-vec3, rhs: u64-vec3) -> u64-vec3; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: u64-vec3, rhs: u64-vec3) -> u64-vec3; - /// Creates a vector with all elements set to `v`. - splat: func(v: u64) -> u64-vec3; - div: func(p0: u64-vec3, p1: u64-vec3) -> u64-vec3; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: u64-vec3, rhs: u64-vec3) -> u64-vec3; - mul: func(p0: u64-vec3, p1: u64-vec3) -> u64-vec3; - /// Casts all elements of `self` to `f32`. - as-vec3: func(self: u64-vec3) -> vec3; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: u64-vec3, rhs: u64-vec3) -> u64-vec3; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: u64-vec3) -> u64; - /// Creates a 3D vector from `self` with the given value of `z`. - with-z: func(self: u64-vec3, z: u64) -> u64-vec3; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: u64-vec3, rhs: u64-vec3) -> u64-vec3; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: u64-vec3, rhs: u64-vec3) -> u64; - rem: func(p0: u64-vec3, p1: u64) -> u64-vec3; -} - -/// Methods for U64Vec4 -interface u64-vec4 { - use types.{reflect-reference}; - - /// Creates a 3D vector from the `x`, `y` and `z` elements of `self`, discarding `w`. - /// Truncation to [`U64Vec3`] may also be performed by using [`self.xyz()`][crate::swizzles::Vec4Swizzles::xyz()]. - truncate: func(self: u64-vec4) -> u64-vec3; - /// Casts all elements of `self` to `f64`. - as-dvec4: func(self: u64-vec4) -> dvec4; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: u64-vec4, rhs: u64-vec4) -> u64-vec4; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: u64-vec4, rhs: u64-vec4) -> bvec4; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: u64-vec4, rhs: u64-vec4) -> u64-vec4; - /// Computes the squared length of `self`. - length-squared: func(self: u64-vec4) -> u64; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: u64-vec4, rhs: u64-vec4) -> u64-vec4; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u64::MAX`]. - /// See also [`checked_manhattan_distance`][U64Vec4::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: u64-vec4, rhs: u64-vec4) -> u64; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: u64-vec4, rhs: u64-vec4) -> u64-vec4; - /// Casts all elements of `self` to `i16`. - as-i16vec4: func(self: u64-vec4) -> i16-vec4; - /// Casts all elements of `self` to `i64`. - as-i64vec4: func(self: u64-vec4) -> i64-vec4; - /// Casts all elements of `self` to `u16`. - as-u16vec4: func(self: u64-vec4) -> u16-vec4; - mul: func(self: u64-vec4, rhs: u64-vec4) -> u64-vec4; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: u64-vec4, rhs: u64-vec4) -> u64-vec4; - div: func(self: u64-vec4, rhs: u64-vec4) -> u64-vec4; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: u64-vec4) -> u64; - /// Casts all elements of `self` to `u8`. - as-u8vec4: func(self: u64-vec4) -> u8-vec4; - assert-receiver-is-total-eq: func(self: u64-vec4); - /// Creates a new vector from an array. - from-array: func(a: list) -> u64-vec4; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: u64-vec4, rhs: u64-vec4) -> bvec4; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec4, if-true: u64-vec4, if-false: u64-vec4) -> u64-vec4; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: u64-vec4, rhs: u64-vec4) -> u64-vec4; - div: func(p0: u64-vec4, p1: u64-vec4) -> u64-vec4; - /// Casts all elements of `self` to `i32`. - as-ivec4: func(self: u64-vec4) -> ivec4; - /// Casts all elements of `self` to `u32`. - as-uvec4: func(self: u64-vec4) -> uvec4; - add: func(p0: u64-vec4, p1: u64) -> u64-vec4; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: u64-vec4, rhs: u64-vec4) -> u64-vec4; - eq: func(self: u64-vec4, other: u64-vec4) -> bool; - /// Creates a 4D vector from `self` with the given value of `x`. - with-x: func(self: u64-vec4, x: u64) -> u64-vec4; - /// Creates a 4D vector from `self` with the given value of `w`. - with-w: func(self: u64-vec4, w: u64) -> u64-vec4; - /// Casts all elements of `self` to `i8`. - as-i8vec4: func(self: u64-vec4) -> i8-vec4; - /// Creates a 4D vector from `self` with the given value of `y`. - with-y: func(self: u64-vec4, y: u64) -> u64-vec4; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: u64-vec4) -> u64; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: u64-vec4) -> u64; - /// Creates a vector with all elements set to `v`. - splat: func(v: u64) -> u64-vec4; - /// Returns a vector containing the wrapping addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_signed(rhs.x), self.y.wrapping_add_signed(rhs.y), ..]`. - wrapping-add-signed: func(self: u64-vec4, rhs: i64-vec4) -> u64-vec4; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: u64-vec4, rhs: u64-vec4) -> bvec4; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: u64-vec4, rhs: u64-vec4) -> bvec4; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: u64-vec4) -> u64; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: u64-vec4, rhs: u64-vec4) -> u64; - sub: func(p0: u64-vec4, p1: u64-vec4) -> u64-vec4; - rem: func(p0: u64-vec4, p1: u64-vec4) -> u64-vec4; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: u64-vec4) -> u64; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: u64-vec4, rhs: u64-vec4) -> u64-vec4; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u64::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: u64-vec4, rhs: u64-vec4) -> option; - div: func(p0: u64-vec4, p1: u64) -> u64-vec4; - add: func(self: u64-vec4, rhs: u64-vec4) -> u64-vec4; - rem: func(p0: u64-vec4, p1: u64) -> u64-vec4; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: u64-vec4, rhs: u64-vec4) -> bvec4; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: u64-vec4, rhs: u64-vec4) -> u64; - mul: func(p0: u64-vec4, p1: u64) -> u64-vec4; - /// Creates a 4D vector from `self` with the given value of `z`. - with-z: func(self: u64-vec4, z: u64) -> u64-vec4; - /// Casts all elements of `self` to `f32`. - as-vec4: func(self: u64-vec4) -> vec4; - /// Returns a vector containing the saturating addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.saturating_add_signed(rhs.x), self.y.saturating_add_signed(rhs.y), ..]`. - saturating-add-signed: func(self: u64-vec4, rhs: i64-vec4) -> u64-vec4; - /// Component-wise clamping of values, similar to [`u64::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: u64-vec4, min: u64-vec4, max: u64-vec4) -> u64-vec4; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: u64-vec4, rhs: u64-vec4) -> bvec4; - mul: func(p0: u64-vec4, p1: u64-vec4) -> u64-vec4; - sub: func(p0: u64-vec4, p1: u64) -> u64-vec4; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: u64-vec4, rhs: u64-vec4) -> u64-vec4; - clone: func(self: u64-vec4) -> u64-vec4; - sub: func(self: u64-vec4, rhs: u64-vec4) -> u64-vec4; - add: func(p0: u64-vec4, p1: u64-vec4) -> u64-vec4; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: u64-vec4) -> u64; - rem: func(self: u64-vec4, rhs: u64-vec4) -> u64-vec4; - /// Creates a new vector. - new: func(x: u64, y: u64, z: u64, w: u64) -> u64-vec4; - /// Converts `self` to `[x, y, z, w]` - to-array: func(self: u64-vec4) -> list; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: u64-vec4, rhs: u64-vec4) -> u64-vec4; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: u64-vec4, rhs: u64-vec4) -> u64-vec4; -} - -/// Methods for U8Vec2 -interface u8-vec2 { - use types.{reflect-reference}; - - assert-receiver-is-total-eq: func(self: u8-vec2); - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: u8-vec2, rhs: u8-vec2) -> u8-vec2; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: u8-vec2, rhs: u8-vec2) -> bvec2; - /// Creates a 2D vector from `self` with the given value of `x`. - with-x: func(self: u8-vec2, x: u8) -> u8-vec2; - /// Casts all elements of `self` to `u64`. - as-u64vec2: func(self: u8-vec2) -> u64-vec2; - /// Casts all elements of `self` to `i16`. - as-i16vec2: func(self: u8-vec2) -> i16-vec2; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: u8-vec2, rhs: u8-vec2) -> bvec2; - sub: func(p0: u8-vec2, p1: u8-vec2) -> u8-vec2; - /// Component-wise clamping of values, similar to [`u8::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: u8-vec2, min: u8-vec2, max: u8-vec2) -> u8-vec2; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: u8-vec2, rhs: u8-vec2) -> bvec2; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: u8-vec2, rhs: u8-vec2) -> u8-vec2; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: u8-vec2, rhs: u8-vec2) -> u8-vec2; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: u8-vec2) -> u8; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: u8-vec2, rhs: u8-vec2) -> bvec2; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec2, if-true: u8-vec2, if-false: u8-vec2) -> u8-vec2; - /// Creates a 2D vector from `self` with the given value of `y`. - with-y: func(self: u8-vec2, y: u8) -> u8-vec2; - /// Casts all elements of `self` to `u16`. - as-u16vec2: func(self: u8-vec2) -> u16-vec2; - rem: func(p0: u8-vec2, p1: u8-vec2) -> u8-vec2; - mul: func(p0: u8-vec2, p1: u8-vec2) -> u8-vec2; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u8::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: u8-vec2, rhs: u8-vec2) -> option; - clone: func(self: u8-vec2) -> u8-vec2; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: u8-vec2, rhs: u8-vec2) -> u8-vec2; - /// Casts all elements of `self` to `f32`. - as-vec2: func(self: u8-vec2) -> vec2; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: u8-vec2, rhs: u8-vec2) -> bvec2; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: u8-vec2) -> u8; - div: func(self: u8-vec2, rhs: u8-vec2) -> u8-vec2; - /// Returns a vector containing the saturating addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.saturating_add_signed(rhs.x), self.y.saturating_add_signed(rhs.y), ..]`. - saturating-add-signed: func(self: u8-vec2, rhs: i8-vec2) -> u8-vec2; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: u8-vec2, rhs: u8-vec2) -> u8; - /// Casts all elements of `self` to `u32`. - as-uvec2: func(self: u8-vec2) -> uvec2; - /// Converts `self` to `[x, y]` - to-array: func(self: u8-vec2) -> list; - add: func(p0: u8-vec2, p1: u8) -> u8-vec2; - /// Casts all elements of `self` to `i8`. - as-i8vec2: func(self: u8-vec2) -> i8-vec2; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: u8-vec2, rhs: u8-vec2) -> bvec2; - /// Returns a vector containing the wrapping addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_signed(rhs.x), self.y.wrapping_add_signed(rhs.y), ..]`. - wrapping-add-signed: func(self: u8-vec2, rhs: i8-vec2) -> u8-vec2; - add: func(self: u8-vec2, rhs: u8-vec2) -> u8-vec2; - add: func(p0: u8-vec2, p1: u8-vec2) -> u8-vec2; - div: func(p0: u8-vec2, p1: u8-vec2) -> u8-vec2; - /// Computes the squared length of `self`. - length-squared: func(self: u8-vec2) -> u8; - /// Casts all elements of `self` to `i64`. - as-i64vec2: func(self: u8-vec2) -> i64-vec2; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u8::MAX`]. - /// See also [`checked_manhattan_distance`][U8Vec2::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: u8-vec2, rhs: u8-vec2) -> u8; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: u8-vec2) -> u64; - /// Creates a 3D vector from `self` and the given `z` value. - extend: func(self: u8-vec2, z: u8) -> u8-vec3; - /// Creates a new vector from an array. - from-array: func(a: list) -> u8-vec2; - rem: func(p0: u8-vec2, p1: u8) -> u8-vec2; - rem: func(self: u8-vec2, rhs: u8-vec2) -> u8-vec2; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: u8-vec2, rhs: u8-vec2) -> u8-vec2; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: u8-vec2) -> u64; - mul: func(self: u8-vec2, rhs: u8-vec2) -> u8-vec2; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: u8-vec2, rhs: u8-vec2) -> u8-vec2; - /// Casts all elements of `self` to `i32`. - as-ivec2: func(self: u8-vec2) -> ivec2; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: u8-vec2, rhs: u8-vec2) -> u8-vec2; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: u8-vec2) -> u8; - mul: func(p0: u8-vec2, p1: u8) -> u8-vec2; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: u8-vec2, rhs: u8-vec2) -> u8; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: u8-vec2, rhs: u8-vec2) -> u8-vec2; - /// Creates a new vector. - new: func(x: u8, y: u8) -> u8-vec2; - eq: func(self: u8-vec2, other: u8-vec2) -> bool; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: u8-vec2) -> u8; - sub: func(self: u8-vec2, rhs: u8-vec2) -> u8-vec2; - /// Casts all elements of `self` to `f64`. - as-dvec2: func(self: u8-vec2) -> dvec2; - sub: func(p0: u8-vec2, p1: u8) -> u8-vec2; - /// Creates a vector with all elements set to `v`. - splat: func(v: u8) -> u8-vec2; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: u8-vec2, rhs: u8-vec2) -> u8-vec2; - div: func(p0: u8-vec2, p1: u8) -> u8-vec2; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: u8-vec2, rhs: u8-vec2) -> u8-vec2; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: u8-vec2, rhs: u8-vec2) -> u8-vec2; -} - -/// Methods for U8Vec3 -interface u8-vec3 { - use types.{reflect-reference}; - - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: u8-vec3, rhs: u8-vec3) -> u8-vec3; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: u8-vec3, rhs: u8-vec3) -> bvec3; - /// Creates a new vector from an array. - from-array: func(a: list) -> u8-vec3; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: u8-vec3, rhs: u8-vec3) -> u8; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u8::MAX`]. - /// See also [`checked_manhattan_distance`][U8Vec3::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: u8-vec3, rhs: u8-vec3) -> u8; - div: func(p0: u8-vec3, p1: u8-vec3) -> u8-vec3; - mul: func(self: u8-vec3, rhs: u8-vec3) -> u8-vec3; - add: func(p0: u8-vec3, p1: u8-vec3) -> u8-vec3; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: u8-vec3) -> u8; - /// Casts all elements of `self` to `u16`. - as-u16vec3: func(self: u8-vec3) -> u16-vec3; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: u8-vec3, rhs: u8-vec3) -> u8-vec3; - /// Creates a 2D vector from the `x` and `y` elements of `self`, discarding `z`. - /// Truncation may also be performed by using [`self.xy()`][crate::swizzles::Vec3Swizzles::xy()]. - truncate: func(self: u8-vec3) -> u8-vec2; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: u8-vec3, rhs: u8-vec3) -> bvec3; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: u8-vec3, rhs: u8-vec3) -> u8-vec3; - /// Casts all elements of `self` to `u64`. - as-u64vec3: func(self: u8-vec3) -> u64-vec3; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: u8-vec3, rhs: u8-vec3) -> u8-vec3; - /// Computes the squared length of `self`. - length-squared: func(self: u8-vec3) -> u8; - /// Casts all elements of `self` to `f32`. - as-vec3: func(self: u8-vec3) -> vec3; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec3, if-true: u8-vec3, if-false: u8-vec3) -> u8-vec3; - mul: func(p0: u8-vec3, p1: u8-vec3) -> u8-vec3; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: u8-vec3, rhs: u8-vec3) -> bvec3; - /// Casts all elements of `self` to `u32`. - as-uvec3: func(self: u8-vec3) -> uvec3; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: u8-vec3, rhs: u8-vec3) -> bvec3; - /// Component-wise clamping of values, similar to [`u8::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: u8-vec3, min: u8-vec3, max: u8-vec3) -> u8-vec3; - /// Creates a 3D vector from `self` with the given value of `x`. - with-x: func(self: u8-vec3, x: u8) -> u8-vec3; - rem: func(self: u8-vec3, rhs: u8-vec3) -> u8-vec3; - /// Creates a 4D vector from `self` and the given `w` value. - extend: func(self: u8-vec3, w: u8) -> u8-vec4; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: u8-vec3, rhs: u8-vec3) -> u8; - /// Casts all elements of `self` to `f32`. - as-vec3a: func(self: u8-vec3) -> vec3-a; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: u8-vec3, rhs: u8-vec3) -> u8-vec3; - rem: func(p0: u8-vec3, p1: u8-vec3) -> u8-vec3; - /// Returns a vector containing the saturating addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.saturating_add_signed(rhs.x), self.y.saturating_add_signed(rhs.y), ..]`. - saturating-add-signed: func(self: u8-vec3, rhs: i8-vec3) -> u8-vec3; - eq: func(self: u8-vec3, other: u8-vec3) -> bool; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: u8-vec3, rhs: u8-vec3) -> u8-vec3; - /// Casts all elements of `self` to `i16`. - as-i16vec3: func(self: u8-vec3) -> i16-vec3; - div: func(self: u8-vec3, rhs: u8-vec3) -> u8-vec3; - /// Computes the cross product of `self` and `rhs`. - cross: func(self: u8-vec3, rhs: u8-vec3) -> u8-vec3; - add: func(p0: u8-vec3, p1: u8) -> u8-vec3; - mul: func(p0: u8-vec3, p1: u8) -> u8-vec3; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: u8-vec3, rhs: u8-vec3) -> bvec3; - add: func(self: u8-vec3, rhs: u8-vec3) -> u8-vec3; - /// Creates a new vector. - new: func(x: u8, y: u8, z: u8) -> u8-vec3; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: u8-vec3) -> u8; - /// Returns a vector containing the wrapping addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_signed(rhs.x), self.y.wrapping_add_signed(rhs.y), ..]`. - wrapping-add-signed: func(self: u8-vec3, rhs: i8-vec3) -> u8-vec3; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: u8-vec3, rhs: u8-vec3) -> u8-vec3; - /// Creates a 3D vector from `self` with the given value of `z`. - with-z: func(self: u8-vec3, z: u8) -> u8-vec3; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: u8-vec3, rhs: u8-vec3) -> u8-vec3; - sub: func(p0: u8-vec3, p1: u8-vec3) -> u8-vec3; - assert-receiver-is-total-eq: func(self: u8-vec3); - sub: func(self: u8-vec3, rhs: u8-vec3) -> u8-vec3; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u8::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: u8-vec3, rhs: u8-vec3) -> option; - sub: func(p0: u8-vec3, p1: u8) -> u8-vec3; - /// Casts all elements of `self` to `i64`. - as-i64vec3: func(self: u8-vec3) -> i64-vec3; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: u8-vec3, rhs: u8-vec3) -> u8-vec3; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: u8-vec3) -> u64; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: u8-vec3, rhs: u8-vec3) -> bvec3; - rem: func(p0: u8-vec3, p1: u8) -> u8-vec3; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: u8-vec3) -> u64; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: u8-vec3, rhs: u8-vec3) -> u8-vec3; - /// Casts all elements of `self` to `i8`. - as-i8vec3: func(self: u8-vec3) -> i8-vec3; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: u8-vec3, rhs: u8-vec3) -> u8-vec3; - /// Converts `self` to `[x, y, z]` - to-array: func(self: u8-vec3) -> list; - /// Creates a 3D vector from `self` with the given value of `y`. - with-y: func(self: u8-vec3, y: u8) -> u8-vec3; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: u8-vec3) -> u8; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: u8-vec3) -> u8; - /// Creates a vector with all elements set to `v`. - splat: func(v: u8) -> u8-vec3; - div: func(p0: u8-vec3, p1: u8) -> u8-vec3; - clone: func(self: u8-vec3) -> u8-vec3; - /// Casts all elements of `self` to `i32`. - as-ivec3: func(self: u8-vec3) -> ivec3; - /// Casts all elements of `self` to `f64`. - as-dvec3: func(self: u8-vec3) -> dvec3; -} - -/// Methods for U8Vec4 -interface u8-vec4 { - use types.{reflect-reference}; - - /// Casts all elements of `self` to `u64`. - as-u64vec4: func(self: u8-vec4) -> u64-vec4; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: u8-vec4, rhs: u8-vec4) -> u8-vec4; - rem: func(p0: u8-vec4, p1: u8) -> u8-vec4; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: u8-vec4, rhs: u8-vec4) -> u8-vec4; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: u8-vec4, rhs: u8-vec4) -> bvec4; - sub: func(self: u8-vec4, rhs: u8-vec4) -> u8-vec4; - sub: func(p0: u8-vec4, p1: u8) -> u8-vec4; - rem: func(self: u8-vec4, rhs: u8-vec4) -> u8-vec4; - /// Creates a new vector. - new: func(x: u8, y: u8, z: u8, w: u8) -> u8-vec4; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: u8-vec4, rhs: u8-vec4) -> bvec4; - sub: func(p0: u8-vec4, p1: u8-vec4) -> u8-vec4; - /// Creates a 4D vector from `self` with the given value of `z`. - with-z: func(self: u8-vec4, z: u8) -> u8-vec4; - /// Creates a 4D vector from `self` with the given value of `y`. - with-y: func(self: u8-vec4, y: u8) -> u8-vec4; - mul: func(p0: u8-vec4, p1: u8-vec4) -> u8-vec4; - /// Component-wise clamping of values, similar to [`u8::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: u8-vec4, min: u8-vec4, max: u8-vec4) -> u8-vec4; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u8::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: u8-vec4, rhs: u8-vec4) -> option; - /// Casts all elements of `self` to `i16`. - as-i16vec4: func(self: u8-vec4) -> i16-vec4; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: u8-vec4) -> u8; - add: func(p0: u8-vec4, p1: u8-vec4) -> u8-vec4; - /// Converts `self` to `[x, y, z, w]` - to-array: func(self: u8-vec4) -> list; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: u8-vec4) -> u64; - /// Creates a vector with all elements set to `v`. - splat: func(v: u8) -> u8-vec4; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: u8-vec4, rhs: u8-vec4) -> bvec4; - /// Casts all elements of `self` to `u32`. - as-uvec4: func(self: u8-vec4) -> uvec4; - add: func(self: u8-vec4, rhs: u8-vec4) -> u8-vec4; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: u8-vec4, rhs: u8-vec4) -> u8-vec4; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: u8-vec4, rhs: u8-vec4) -> u8; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: u8-vec4) -> u64; - eq: func(self: u8-vec4, other: u8-vec4) -> bool; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: u8-vec4, rhs: u8-vec4) -> bvec4; - /// Casts all elements of `self` to `i8`. - as-i8vec4: func(self: u8-vec4) -> i8-vec4; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: u8-vec4) -> u8; - clone: func(self: u8-vec4) -> u8-vec4; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: u8-vec4, rhs: u8-vec4) -> bvec4; - /// Casts all elements of `self` to `f64`. - as-dvec4: func(self: u8-vec4) -> dvec4; - div: func(p0: u8-vec4, p1: u8) -> u8-vec4; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec4, if-true: u8-vec4, if-false: u8-vec4) -> u8-vec4; - add: func(p0: u8-vec4, p1: u8) -> u8-vec4; - div: func(self: u8-vec4, rhs: u8-vec4) -> u8-vec4; - mul: func(p0: u8-vec4, p1: u8) -> u8-vec4; - /// Casts all elements of `self` to `i64`. - as-i64vec4: func(self: u8-vec4) -> i64-vec4; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: u8-vec4, rhs: u8-vec4) -> u8-vec4; - /// Casts all elements of `self` to `f32`. - as-vec4: func(self: u8-vec4) -> vec4; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: u8-vec4, rhs: u8-vec4) -> u8-vec4; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: u8-vec4, rhs: u8-vec4) -> u8-vec4; - div: func(p0: u8-vec4, p1: u8-vec4) -> u8-vec4; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: u8-vec4, rhs: u8-vec4) -> u8-vec4; - assert-receiver-is-total-eq: func(self: u8-vec4); - /// Creates a 4D vector from `self` with the given value of `w`. - with-w: func(self: u8-vec4, w: u8) -> u8-vec4; - /// Creates a new vector from an array. - from-array: func(a: list) -> u8-vec4; - /// Casts all elements of `self` to `i32`. - as-ivec4: func(self: u8-vec4) -> ivec4; - /// Computes the squared length of `self`. - length-squared: func(self: u8-vec4) -> u8; - mul: func(self: u8-vec4, rhs: u8-vec4) -> u8-vec4; - /// Creates a 3D vector from the `x`, `y` and `z` elements of `self`, discarding `w`. - /// Truncation to [`U8Vec3`] may also be performed by using [`self.xyz()`][crate::swizzles::Vec4Swizzles::xyz()]. - truncate: func(self: u8-vec4) -> u8-vec3; - /// Creates a 4D vector from `self` with the given value of `x`. - with-x: func(self: u8-vec4, x: u8) -> u8-vec4; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: u8-vec4) -> u8; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: u8-vec4, rhs: u8-vec4) -> bvec4; - /// Casts all elements of `self` to `u16`. - as-u16vec4: func(self: u8-vec4) -> u16-vec4; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: u8-vec4, rhs: u8-vec4) -> u8; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: u8-vec4, rhs: u8-vec4) -> u8-vec4; - rem: func(p0: u8-vec4, p1: u8-vec4) -> u8-vec4; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: u8-vec4, rhs: u8-vec4) -> u8-vec4; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u8::MAX`]. - /// See also [`checked_manhattan_distance`][U8Vec4::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: u8-vec4, rhs: u8-vec4) -> u8; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: u8-vec4, rhs: u8-vec4) -> u8-vec4; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: u8-vec4) -> u8; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: u8-vec4, rhs: u8-vec4) -> u8-vec4; - /// Returns a vector containing the saturating addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.saturating_add_signed(rhs.x), self.y.saturating_add_signed(rhs.y), ..]`. - saturating-add-signed: func(self: u8-vec4, rhs: i8-vec4) -> u8-vec4; - /// Returns a vector containing the wrapping addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_signed(rhs.x), self.y.wrapping_add_signed(rhs.y), ..]`. - wrapping-add-signed: func(self: u8-vec4, rhs: i8-vec4) -> u8-vec4; -} - -/// Methods for UVec2 -interface uvec2 { - use types.{reflect-reference}; - - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: uvec2, rhs: uvec2) -> u32; - /// Returns a vector containing the wrapping addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_signed(rhs.x), self.y.wrapping_add_signed(rhs.y), ..]`. - wrapping-add-signed: func(self: uvec2, rhs: ivec2) -> uvec2; - sub: func(self: uvec2, rhs: uvec2) -> uvec2; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: uvec2, rhs: uvec2) -> bvec2; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: uvec2, rhs: uvec2) -> uvec2; - mul: func(p0: uvec2, p1: uvec2) -> uvec2; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: uvec2, rhs: uvec2) -> bvec2; - rem: func(self: uvec2, rhs: uvec2) -> uvec2; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: uvec2, rhs: uvec2) -> bvec2; - mul: func(p0: uvec2, p1: u32) -> uvec2; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: uvec2, rhs: uvec2) -> bvec2; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: uvec2, rhs: uvec2) -> uvec2; - /// Creates a new vector. - new: func(x: u32, y: u32) -> uvec2; - /// Returns a vector containing the saturating addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.saturating_add_signed(rhs.x), self.y.saturating_add_signed(rhs.y), ..]`. - saturating-add-signed: func(self: uvec2, rhs: ivec2) -> uvec2; - div: func(p0: uvec2, p1: u32) -> uvec2; - /// Creates a 2D vector from `self` with the given value of `y`. - with-y: func(self: uvec2, y: u32) -> uvec2; - div: func(self: uvec2, rhs: uvec2) -> uvec2; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: uvec2, rhs: uvec2) -> bvec2; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: uvec2, rhs: uvec2) -> uvec2; - /// Casts all elements of `self` to `u64`. - as-u64vec2: func(self: uvec2) -> u64-vec2; - /// Creates a 3D vector from `self` and the given `z` value. - extend: func(self: uvec2, z: u32) -> uvec3; - /// Casts all elements of `self` to `u16`. - as-u16vec2: func(self: uvec2) -> u16-vec2; - /// Creates a new vector from an array. - from-array: func(a: list) -> uvec2; - /// Creates a 2D vector from `self` with the given value of `x`. - with-x: func(self: uvec2, x: u32) -> uvec2; - /// Casts all elements of `self` to `f32`. - as-vec2: func(self: uvec2) -> vec2; - /// Casts all elements of `self` to `i64`. - as-i64vec2: func(self: uvec2) -> i64-vec2; - rem: func(p0: uvec2, p1: uvec2) -> uvec2; - add: func(p0: uvec2, p1: u32) -> uvec2; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: uvec2, rhs: uvec2) -> uvec2; - clone: func(self: uvec2) -> uvec2; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: uvec2) -> u64; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: uvec2) -> u32; - eq: func(self: uvec2, other: uvec2) -> bool; - /// Casts all elements of `self` to `f64`. - as-dvec2: func(self: uvec2) -> dvec2; - /// Casts all elements of `self` to `i8`. - as-i8vec2: func(self: uvec2) -> i8-vec2; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec2, if-true: uvec2, if-false: uvec2) -> uvec2; - sub: func(p0: uvec2, p1: u32) -> uvec2; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: uvec2, rhs: uvec2) -> uvec2; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: uvec2) -> u32; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: uvec2, rhs: uvec2) -> uvec2; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u32::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: uvec2, rhs: uvec2) -> option; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u32::MAX`]. - /// See also [`checked_manhattan_distance`][UVec2::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: uvec2, rhs: uvec2) -> u32; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: uvec2) -> u32; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: uvec2, rhs: uvec2) -> bvec2; - div: func(p0: uvec2, p1: uvec2) -> uvec2; - sub: func(p0: uvec2, p1: uvec2) -> uvec2; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: uvec2) -> u32; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: uvec2, rhs: uvec2) -> uvec2; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: uvec2, rhs: uvec2) -> uvec2; - /// Creates a vector with all elements set to `v`. - splat: func(v: u32) -> uvec2; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: uvec2) -> u64; - /// Computes the squared length of `self`. - length-squared: func(self: uvec2) -> u32; - /// Converts `self` to `[x, y]` - to-array: func(self: uvec2) -> list; - add: func(self: uvec2, rhs: uvec2) -> uvec2; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: uvec2, rhs: uvec2) -> u32; - add: func(p0: uvec2, p1: uvec2) -> uvec2; - /// Casts all elements of `self` to `i32`. - as-ivec2: func(self: uvec2) -> ivec2; - rem: func(p0: uvec2, p1: u32) -> uvec2; - /// Casts all elements of `self` to `i16`. - as-i16vec2: func(self: uvec2) -> i16-vec2; - mul: func(self: uvec2, rhs: uvec2) -> uvec2; - assert-receiver-is-total-eq: func(self: uvec2); - /// Casts all elements of `self` to `u8`. - as-u8vec2: func(self: uvec2) -> u8-vec2; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: uvec2, rhs: uvec2) -> uvec2; - /// Component-wise clamping of values, similar to [`u32::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: uvec2, min: uvec2, max: uvec2) -> uvec2; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: uvec2, rhs: uvec2) -> uvec2; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: uvec2, rhs: uvec2) -> uvec2; -} - -/// Methods for UVec3 -interface uvec3 { - use types.{reflect-reference}; - - rem: func(self: uvec3, rhs: uvec3) -> uvec3; - /// Casts all elements of `self` to `i16`. - as-i16vec3: func(self: uvec3) -> i16-vec3; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: uvec3) -> u32; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: uvec3, rhs: uvec3) -> bvec3; - /// Casts all elements of `self` to `i8`. - as-i8vec3: func(self: uvec3) -> i8-vec3; - /// Creates a 3D vector from `self` with the given value of `x`. - with-x: func(self: uvec3, x: u32) -> uvec3; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u32::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: uvec3, rhs: uvec3) -> option; - mul: func(p0: uvec3, p1: uvec3) -> uvec3; - sub: func(self: uvec3, rhs: uvec3) -> uvec3; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: uvec3) -> u64; - add: func(self: uvec3, rhs: uvec3) -> uvec3; - /// Creates a 3D vector from `self` with the given value of `y`. - with-y: func(self: uvec3, y: u32) -> uvec3; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: uvec3, rhs: uvec3) -> uvec3; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: uvec3, rhs: uvec3) -> uvec3; - /// Casts all elements of `self` to `u16`. - as-u16vec3: func(self: uvec3) -> u16-vec3; - clone: func(self: uvec3) -> uvec3; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: uvec3, rhs: uvec3) -> uvec3; - /// Creates a 3D vector from `self` with the given value of `z`. - with-z: func(self: uvec3, z: u32) -> uvec3; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: uvec3, rhs: uvec3) -> uvec3; - /// Casts all elements of `self` to `f64`. - as-dvec3: func(self: uvec3) -> dvec3; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec3, if-true: uvec3, if-false: uvec3) -> uvec3; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: uvec3, rhs: uvec3) -> uvec3; - /// Casts all elements of `self` to `f32`. - as-vec3a: func(self: uvec3) -> vec3-a; - rem: func(p0: uvec3, p1: uvec3) -> uvec3; - /// Returns a vector containing the wrapping addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_signed(rhs.x), self.y.wrapping_add_signed(rhs.y), ..]`. - wrapping-add-signed: func(self: uvec3, rhs: ivec3) -> uvec3; - /// Creates a new vector from an array. - from-array: func(a: list) -> uvec3; - /// Converts `self` to `[x, y, z]` - to-array: func(self: uvec3) -> list; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: uvec3, rhs: uvec3) -> uvec3; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: uvec3) -> u32; - assert-receiver-is-total-eq: func(self: uvec3); - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: uvec3, rhs: uvec3) -> u32; - /// Casts all elements of `self` to `u8`. - as-u8vec3: func(self: uvec3) -> u8-vec3; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: uvec3, rhs: uvec3) -> bvec3; - div: func(p0: uvec3, p1: uvec3) -> uvec3; - sub: func(p0: uvec3, p1: uvec3) -> uvec3; - /// Creates a 4D vector from `self` and the given `w` value. - extend: func(self: uvec3, w: u32) -> uvec4; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: uvec3, rhs: uvec3) -> uvec3; - /// Computes the squared length of `self`. - length-squared: func(self: uvec3) -> u32; - /// Casts all elements of `self` to `i64`. - as-i64vec3: func(self: uvec3) -> i64-vec3; - eq: func(self: uvec3, other: uvec3) -> bool; - add: func(p0: uvec3, p1: uvec3) -> uvec3; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: uvec3, rhs: uvec3) -> uvec3; - mul: func(p0: uvec3, p1: u32) -> uvec3; - sub: func(p0: uvec3, p1: u32) -> uvec3; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: uvec3) -> u32; - /// Creates a 2D vector from the `x` and `y` elements of `self`, discarding `z`. - /// Truncation may also be performed by using [`self.xy()`][crate::swizzles::Vec3Swizzles::xy()]. - truncate: func(self: uvec3) -> uvec2; - /// Casts all elements of `self` to `f32`. - as-vec3: func(self: uvec3) -> vec3; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: uvec3, rhs: uvec3) -> uvec3; - add: func(p0: uvec3, p1: u32) -> uvec3; - /// Creates a new vector. - new: func(x: u32, y: u32, z: u32) -> uvec3; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: uvec3) -> u64; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: uvec3, rhs: uvec3) -> uvec3; - rem: func(p0: uvec3, p1: u32) -> uvec3; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: uvec3, rhs: uvec3) -> bvec3; - /// Creates a vector with all elements set to `v`. - splat: func(v: u32) -> uvec3; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: uvec3) -> u32; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: uvec3, rhs: uvec3) -> bvec3; - /// Casts all elements of `self` to `u64`. - as-u64vec3: func(self: uvec3) -> u64-vec3; - div: func(p0: uvec3, p1: u32) -> uvec3; - /// Computes the cross product of `self` and `rhs`. - cross: func(self: uvec3, rhs: uvec3) -> uvec3; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: uvec3, rhs: uvec3) -> u32; - div: func(self: uvec3, rhs: uvec3) -> uvec3; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u32::MAX`]. - /// See also [`checked_manhattan_distance`][UVec3::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: uvec3, rhs: uvec3) -> u32; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: uvec3, rhs: uvec3) -> bvec3; - mul: func(self: uvec3, rhs: uvec3) -> uvec3; - /// Returns a vector containing the saturating addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.saturating_add_signed(rhs.x), self.y.saturating_add_signed(rhs.y), ..]`. - saturating-add-signed: func(self: uvec3, rhs: ivec3) -> uvec3; - /// Casts all elements of `self` to `i32`. - as-ivec3: func(self: uvec3) -> ivec3; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: uvec3, rhs: uvec3) -> bvec3; - /// Component-wise clamping of values, similar to [`u32::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: uvec3, min: uvec3, max: uvec3) -> uvec3; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: uvec3, rhs: uvec3) -> uvec3; -} - -/// Methods for UVec4 -interface uvec4 { - use types.{reflect-reference}; - - sub: func(p0: uvec4, p1: uvec4) -> uvec4; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: uvec4, rhs: uvec4) -> bvec4; - add: func(p0: uvec4, p1: uvec4) -> uvec4; - /// Creates a 4D vector from `self` with the given value of `w`. - with-w: func(self: uvec4, w: u32) -> uvec4; - clone: func(self: uvec4) -> uvec4; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: uvec4, rhs: uvec4) -> uvec4; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: uvec4, rhs: uvec4) -> uvec4; - /// Creates a 4D vector from `self` with the given value of `y`. - with-y: func(self: uvec4, y: u32) -> uvec4; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: uvec4, rhs: uvec4) -> bvec4; - eq: func(self: uvec4, other: uvec4) -> bool; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: uvec4, rhs: uvec4) -> bvec4; - /// Casts all elements of `self` to `f64`. - as-dvec4: func(self: uvec4) -> dvec4; - mul: func(p0: uvec4, p1: u32) -> uvec4; - /// Creates a 3D vector from the `x`, `y` and `z` elements of `self`, discarding `w`. - /// Truncation to [`UVec3`] may also be performed by using [`self.xyz()`][crate::swizzles::Vec4Swizzles::xyz()]. - truncate: func(self: uvec4) -> uvec3; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u32::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: uvec4, rhs: uvec4) -> option; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u32::MAX`]. - /// See also [`checked_manhattan_distance`][UVec4::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: uvec4, rhs: uvec4) -> u32; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: uvec4) -> u32; - rem: func(p0: uvec4, p1: uvec4) -> uvec4; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: uvec4) -> u64; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: uvec4, rhs: uvec4) -> bvec4; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec4, if-true: uvec4, if-false: uvec4) -> uvec4; - /// Creates a new vector from an array. - from-array: func(a: list) -> uvec4; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: uvec4) -> u32; - div: func(p0: uvec4, p1: u32) -> uvec4; - add: func(p0: uvec4, p1: u32) -> uvec4; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: uvec4) -> u32; - /// Converts `self` to `[x, y, z, w]` - to-array: func(self: uvec4) -> list; - /// Casts all elements of `self` to `u16`. - as-u16vec4: func(self: uvec4) -> u16-vec4; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: uvec4, rhs: uvec4) -> uvec4; - /// Casts all elements of `self` to `i32`. - as-ivec4: func(self: uvec4) -> ivec4; - /// Computes the squared length of `self`. - length-squared: func(self: uvec4) -> u32; - /// Creates a new vector. - new: func(x: u32, y: u32, z: u32, w: u32) -> uvec4; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: uvec4) -> u32; - /// Casts all elements of `self` to `i16`. - as-i16vec4: func(self: uvec4) -> i16-vec4; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: uvec4, rhs: uvec4) -> uvec4; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: uvec4, rhs: uvec4) -> u32; - div: func(p0: uvec4, p1: uvec4) -> uvec4; - div: func(self: uvec4, rhs: uvec4) -> uvec4; - mul: func(p0: uvec4, p1: uvec4) -> uvec4; - /// Creates a 4D vector from `self` with the given value of `x`. - with-x: func(self: uvec4, x: u32) -> uvec4; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: uvec4, rhs: uvec4) -> uvec4; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: uvec4, rhs: uvec4) -> uvec4; - /// Casts all elements of `self` to `u64`. - as-u64vec4: func(self: uvec4) -> u64-vec4; - assert-receiver-is-total-eq: func(self: uvec4); - /// Casts all elements of `self` to `i8`. - as-i8vec4: func(self: uvec4) -> i8-vec4; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: uvec4, rhs: uvec4) -> uvec4; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: uvec4, rhs: uvec4) -> uvec4; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: uvec4) -> u64; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: uvec4, rhs: uvec4) -> uvec4; - /// Creates a 4D vector from `self` with the given value of `z`. - with-z: func(self: uvec4, z: u32) -> uvec4; - sub: func(self: uvec4, rhs: uvec4) -> uvec4; - /// Casts all elements of `self` to `u8`. - as-u8vec4: func(self: uvec4) -> u8-vec4; - rem: func(self: uvec4, rhs: uvec4) -> uvec4; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: uvec4, rhs: uvec4) -> bvec4; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: uvec4, rhs: uvec4) -> u32; - sub: func(p0: uvec4, p1: u32) -> uvec4; - rem: func(p0: uvec4, p1: u32) -> uvec4; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: uvec4, rhs: uvec4) -> uvec4; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: uvec4, rhs: uvec4) -> bvec4; - /// Component-wise clamping of values, similar to [`u32::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: uvec4, min: uvec4, max: uvec4) -> uvec4; - /// Creates a vector with all elements set to `v`. - splat: func(v: u32) -> uvec4; - /// Casts all elements of `self` to `f32`. - as-vec4: func(self: uvec4) -> vec4; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: uvec4, rhs: uvec4) -> uvec4; - /// Returns a vector containing the saturating addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.saturating_add_signed(rhs.x), self.y.saturating_add_signed(rhs.y), ..]`. - saturating-add-signed: func(self: uvec4, rhs: ivec4) -> uvec4; - add: func(self: uvec4, rhs: uvec4) -> uvec4; - /// Returns a vector containing the wrapping addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_signed(rhs.x), self.y.wrapping_add_signed(rhs.y), ..]`. - wrapping-add-signed: func(self: uvec4, rhs: ivec4) -> uvec4; - mul: func(self: uvec4, rhs: uvec4) -> uvec4; - /// Casts all elements of `self` to `i64`. - as-i64vec4: func(self: uvec4) -> i64-vec4; -} - -/// Methods for Vec2 -interface vec2 { - use types.{reflect-reference}; - - /// Creates a 2D vector from `self` with the given value of `x`. - with-x: func(self: vec2, x: f32) -> vec2; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: vec2, rhs: vec2) -> bvec2; - /// Casts all elements of `self` to `u32`. - as-uvec2: func(self: vec2) -> uvec2; - /// Returns a vector containing each element of `self` raised to the power of `n`. - powf: func(self: vec2, n: f32) -> vec2; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: vec2, rhs: vec2) -> f32; - /// Creates a new vector from an array. - from-array: func(a: list) -> vec2; - /// Component-wise clamping of values, similar to [`f32::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: vec2, min: vec2, max: vec2) -> vec2; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: vec2, rhs: vec2) -> bvec2; - /// Returns the vector rejection of `self` from `rhs`. - /// The vector rejection is the vector perpendicular to the projection of `self` onto - /// `rhs`, in rhs words the result of `self - self.project_onto(rhs)`. - /// `rhs` must be of non-zero length. - /// # Panics - /// Will panic if `rhs` has a length of zero when `glam_assert` is enabled. - reject-from: func(self: vec2, rhs: vec2) -> vec2; - /// Returns `true` if, and only if, all elements are finite. If any element is either - /// `NaN`, positive or negative infinity, this will return `false`. - is-finite: func(self: vec2) -> bool; - /// Casts all elements of `self` to `u8`. - as-u8vec2: func(self: vec2) -> u8-vec2; - /// Returns the vector projection of `self` onto `rhs`. - /// `rhs` must be of non-zero length. - /// # Panics - /// Will panic if `rhs` is zero length when `glam_assert` is enabled. - project-onto: func(self: vec2, rhs: vec2) -> vec2; - /// Returns the angle (in radians) of this vector in the range `[-π, +π]`. - /// The input does not need to be a unit vector however it must be non-zero. - to-angle: func(self: vec2) -> f32; - /// Fused multiply-add. Computes `(self * a) + b` element-wise with only one rounding - /// error, yielding a more accurate result than an unfused multiply-add. - /// Using `mul_add` *may* be more performant than an unfused multiply-add if the target - /// architecture has a dedicated fma CPU instruction. However, this is not always true, - /// and will be heavily dependant on designing algorithms with specific target hardware in - /// mind. - mul-add: func(self: vec2, a: vec2, b: vec2) -> vec2; - /// Casts all elements of `self` to `u16`. - as-u16vec2: func(self: vec2) -> u16-vec2; - mul: func(p0: vec2, p1: f32) -> vec2; - /// Returns a vector with a length no less than `min`. - /// # Panics - /// Will panic if `min` is negative when `glam_assert` is enabled. - clamp-length-min: func(self: vec2, min: f32) -> vec2; - /// Returns a vector containing the natural logarithm for each element of `self`. - /// This returns NaN when the element is negative and negative infinity when the element is zero. - ln: func(self: vec2) -> vec2; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: vec2) -> vec2; - sub: func(p0: vec2, p1: vec2) -> vec2; - /// Returns a vector containing the reciprocal `1.0/n` of each element of `self`. - recip: func(self: vec2) -> vec2; - /// Returns whether `self` is length `1.0` or not. - /// Uses a precision threshold of approximately `1e-4`. - is-normalized: func(self: vec2) -> bool; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec2, if-true: vec2, if-false: vec2) -> vec2; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: vec2) -> f32; - /// Returns a vector with elements representing the sign of `self`. - /// - `1.0` if the number is positive, `+0.0` or `INFINITY` - /// - `-1.0` if the number is negative, `-0.0` or `NEG_INFINITY` - /// - `NAN` if the number is `NAN` - signum: func(self: vec2) -> vec2; - clone: func(self: vec2) -> vec2; - /// Returns a vector containing the integer part each element of `self`. This means numbers are - /// always truncated towards zero. - trunc: func(self: vec2) -> vec2; - /// Moves towards `rhs` based on the value `d`. - /// When `d` is `0.0`, the result will be equal to `self`. When `d` is equal to - /// `self.distance(rhs)`, the result will be equal to `rhs`. Will not go past `rhs`. - move-towards: func(self: vec2, rhs: vec2, d: f32) -> vec2; - /// Returns a vector containing the smallest integer greater than or equal to a number for - /// each element of `self`. - ceil: func(self: vec2) -> vec2; - /// Creates a 2D vector containing `[angle.cos(), angle.sin()]`. This can be used in - /// conjunction with the [`rotate()`][Self::rotate()] method, e.g. - /// `Vec2::from_angle(PI).rotate(Vec2::Y)` will create the vector `[-1, 0]` - /// and rotate [`Vec2::Y`] around it returning `-Vec2::Y`. - from-angle: func(angle: f32) -> vec2; - /// Creates a vector with all elements set to `v`. - splat: func(v: f32) -> vec2; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: vec2, rhs: vec2) -> bvec2; - /// Returns `self` normalized to length 1.0 if possible, else returns a - /// fallback value. - /// In particular, if the input is zero (or very close to zero), or non-finite, - /// the result of this operation will be the fallback value. - /// See also [`Self::try_normalize()`]. - normalize-or: func(self: vec2, fallback: vec2) -> vec2; - /// Computes the squared length of `self`. - /// This is faster than `length()` as it avoids a square root operation. - length-squared: func(self: vec2) -> f32; - mul: func(p0: vec2, p1: vec2) -> vec2; - /// Converts `self` to `[x, y]` - to-array: func(self: vec2) -> list; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// [Euclidean division]: f32::rem_euclid - rem-euclid: func(self: vec2, rhs: vec2) -> vec2; - /// Returns a bitmask with the lowest 2 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: vec2) -> u32; - /// Returns a vector containing the base 2 logarithm for each element of `self`. - /// This returns NaN when the element is negative and negative infinity when the element is zero. - log2: func(self: vec2) -> vec2; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: vec2, rhs: vec2) -> f32; - /// Returns a vector containing the largest integer less than or equal to a number for each - /// element of `self`. - floor: func(self: vec2) -> vec2; - /// Creates a new vector. - new: func(x: f32, y: f32) -> vec2; - angle-between: func(self: vec2, rhs: vec2) -> f32; - add: func(self: vec2, rhs: vec2) -> vec2; - /// Casts all elements of `self` to `i32`. - as-ivec2: func(self: vec2) -> ivec2; - /// Returns a vector with a length no more than `max`. - /// # Panics - /// Will panic if `max` is negative when `glam_assert` is enabled. - clamp-length-max: func(self: vec2, max: f32) -> vec2; - add: func(p0: vec2, p1: f32) -> vec2; - div: func(p0: vec2, p1: f32) -> vec2; - /// Creates a 3D vector from `self` and the given `z` value. - extend: func(self: vec2, z: f32) -> vec3; - /// Rotates towards `rhs` up to `max_angle` (in radians). - /// When `max_angle` is `0.0`, the result will be equal to `self`. When `max_angle` is equal to - /// `self.angle_between(rhs)`, the result will be parallel to `rhs`. If `max_angle` is negative, - /// rotates towards the exact opposite of `rhs`. Will not go past the target. - rotate-towards: func(self: vec2, rhs: vec2, max-angle: f32) -> vec2; - /// Returns `rhs` rotated by the angle of `self`. If `self` is normalized, - /// then this just rotation. This is what you usually want. Otherwise, - /// it will be like a rotation with a multiplication by `self`'s length. - /// This can be used in conjunction with the [`from_angle()`][Self::from_angle()] method, e.g. - /// `Vec2::from_angle(PI).rotate(Vec2::Y)` will create the vector `[-1, 0]` - /// and rotate [`Vec2::Y`] around it returning `-Vec2::Y`. - rotate: func(self: vec2, rhs: vec2) -> vec2; - /// Returns a vector containing the nearest integer to a number for each element of `self`. - /// Round half-way cases away from 0.0. - round: func(self: vec2) -> vec2; - /// Returns the angle of rotation (in radians) from `self` to `rhs` in the range `[-π, +π]`. - /// The inputs do not need to be unit vectors however they must be non-zero. - angle-to: func(self: vec2, rhs: vec2) -> f32; - /// Casts all elements of `self` to `i64`. - as-i64vec2: func(self: vec2) -> i64-vec2; - /// Returns the refraction direction for a given incident vector `self`, surface normal - /// `normal` and ratio of indices of refraction, `eta`. When total internal reflection occurs, - /// a zero vector will be returned. - /// `self` and `normal` must be normalized. - /// # Panics - /// Will panic if `self` or `normal` is not normalized when `glam_assert` is enabled. - refract: func(self: vec2, normal: vec2, eta: f32) -> vec2; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: vec2) -> u64; - /// Casts all elements of `self` to `i16`. - as-i16vec2: func(self: vec2) -> i16-vec2; - eq: func(self: vec2, other: vec2) -> bool; - div: func(self: vec2, rhs: vec2) -> vec2; - /// Returns a vector containing `2^self` for each element of `self`. - exp2: func(self: vec2) -> vec2; - /// Calculates the midpoint between `self` and `rhs`. - /// The midpoint is the average of, or halfway point between, two vectors. - /// `a.midpoint(b)` should yield the same result as `a.lerp(b, 0.5)` - /// while being slightly cheaper to compute. - midpoint: func(self: vec2, rhs: vec2) -> vec2; - /// Computes the Euclidean distance between two points in space. - distance: func(self: vec2, rhs: vec2) -> f32; - rem: func(self: vec2, rhs: vec2) -> vec2; - /// Returns `self` normalized to length 1.0 if possible, else returns zero. - /// In particular, if the input is zero (or very close to zero), or non-finite, - /// the result of this operation will be zero. - /// See also [`Self::try_normalize()`]. - normalize-or-zero: func(self: vec2) -> vec2; - /// Returns the reflection vector for a given incident vector `self` and surface normal - /// `normal`. - /// `normal` must be normalized. - /// # Panics - /// Will panic if `normal` is not normalized when `glam_assert` is enabled. - reflect: func(self: vec2, normal: vec2) -> vec2; - sub: func(self: vec2, rhs: vec2) -> vec2; - /// Returns a vector containing `e^self` (the exponential function) for each element of - /// `self`. - exp: func(self: vec2) -> vec2; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - min-element: func(self: vec2) -> f32; - /// Returns the vector rejection of `self` from `rhs`. - /// The vector rejection is the vector perpendicular to the projection of `self` onto - /// `rhs`, in rhs words the result of `self - self.project_onto(rhs)`. - /// `rhs` must be normalized. - /// # Panics - /// Will panic if `rhs` is not normalized when `glam_assert` is enabled. - reject-from-normalized: func(self: vec2, rhs: vec2) -> vec2; - /// Returns the vector projection of `self` onto `rhs`. - /// `rhs` must be normalized. - /// # Panics - /// Will panic if `rhs` is not normalized when `glam_assert` is enabled. - project-onto-normalized: func(self: vec2, rhs: vec2) -> vec2; - /// Returns a vector containing the fractional part of the vector as `self - self.floor()`. - /// Note that this differs from the Rust implementation of `fract` which returns - /// `self - self.trunc()`. - /// Note that this is fast but not precise for large numbers. - fract-gl: func(self: vec2) -> vec2; - /// The perpendicular dot product of `self` and `rhs`. - /// Also known as the wedge product, 2D cross product, and determinant. - perp-dot: func(self: vec2, rhs: vec2) -> f32; - /// Returns a vector containing the fractional part of the vector as `self - self.trunc()`. - /// Note that this differs from the GLSL implementation of `fract` which returns - /// `self - self.floor()`. - /// Note that this is fast but not precise for large numbers. - fract: func(self: vec2) -> vec2; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - /// NaN propogation does not follow IEEE 754-2008 semantics for maxNum and may differ on - /// different SIMD architectures. - max: func(self: vec2, rhs: vec2) -> vec2; - /// Returns `self` normalized to length 1.0. - /// For valid results, `self` must be finite and _not_ of length zero, nor very close to zero. - /// See also [`Self::try_normalize()`] and [`Self::normalize_or_zero()`]. - /// # Panics - /// Will panic if the resulting normalized vector is not finite when `glam_assert` is enabled. - normalize: func(self: vec2) -> vec2; - /// Casts all elements of `self` to `i8`. - as-i8vec2: func(self: vec2) -> i8-vec2; - /// Casts all elements of `self` to `f64`. - as-dvec2: func(self: vec2) -> dvec2; - /// Performs a linear interpolation between `self` and `rhs` based on the value `s`. - /// When `s` is `0.0`, the result will be equal to `self`. When `s` is `1.0`, the result - /// will be equal to `rhs`. When `s` is outside of range `[0, 1]`, the result is linearly - /// extrapolated. - lerp: func(self: vec2, rhs: vec2, s: f32) -> vec2; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: vec2) -> f32; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - max-element: func(self: vec2) -> f32; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: vec2) -> u64; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: vec2, rhs: vec2) -> vec2; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: vec2) -> bool; - /// Returns a vector that is equal to `self` rotated by 90 degrees. - perp: func(self: vec2) -> vec2; - neg: func(self: vec2) -> vec2; - div: func(p0: vec2, p1: vec2) -> vec2; - add: func(p0: vec2, p1: vec2) -> vec2; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - div-euclid: func(self: vec2, rhs: vec2) -> vec2; - /// Creates a 2D vector from `self` with the given value of `y`. - with-y: func(self: vec2, y: f32) -> vec2; - /// Returns a vector with a length no less than `min` and no more than `max`. - /// # Panics - /// Will panic if `min` is greater than `max`, or if either `min` or `max` is negative, when `glam_assert` is enabled. - clamp-length: func(self: vec2, min: f32, max: f32) -> vec2; - /// Computes the length of `self`. - length: func(self: vec2) -> f32; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: vec2, rhs: vec2) -> bvec2; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: vec2, rhs: vec2) -> bvec2; - /// Returns a vector with signs of `rhs` and the magnitudes of `self`. - copysign: func(self: vec2, rhs: vec2) -> vec2; - mul: func(self: vec2, rhs: vec2) -> vec2; - /// Performs `is_finite` on each element of self, returning a vector mask of the results. - /// In other words, this computes `[x.is_finite(), y.is_finite(), ...]`. - is-finite-mask: func(self: vec2) -> bvec2; - rem: func(p0: vec2, p1: vec2) -> vec2; - /// Casts all elements of `self` to `u64`. - as-u64vec2: func(self: vec2) -> u64-vec2; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: vec2, rhs: vec2) -> bvec2; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - /// NaN propogation does not follow IEEE 754-2008 semantics for minNum and may differ on - /// different SIMD architectures. - min: func(self: vec2, rhs: vec2) -> vec2; - sub: func(p0: vec2, p1: f32) -> vec2; - rem: func(p0: vec2, p1: f32) -> vec2; - /// Returns true if the absolute difference of all elements between `self` and `rhs` is - /// less than or equal to `max_abs_diff`. - /// This can be used to compare if two vectors contain similar elements. It works best when - /// comparing with a known value. The `max_abs_diff` that should be used used depends on - /// the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: vec2, rhs: vec2, max-abs-diff: f32) -> bool; - /// Performs `is_nan` on each element of self, returning a vector mask of the results. - /// In other words, this computes `[x.is_nan(), y.is_nan(), ...]`. - is-nan-mask: func(self: vec2) -> bvec2; - /// Computes `1.0 / length()`. - /// For valid results, `self` must _not_ be of length zero. - length-recip: func(self: vec2) -> f32; -} - -/// Methods for Vec3 -interface vec3 { - use types.{reflect-reference}; - - /// Returns a vector containing the largest integer less than or equal to a number for each - /// element of `self`. - floor: func(self: vec3) -> vec3; - /// Returns a vector containing the base 2 logarithm for each element of `self`. - /// This returns NaN when the element is negative and negative infinity when the element is zero. - log2: func(self: vec3) -> vec3; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: vec3) -> f32; - eq: func(self: vec3, other: vec3) -> bool; - /// Computes `1.0 / length()`. - /// For valid results, `self` must _not_ be of length zero. - length-recip: func(self: vec3) -> f32; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - div-euclid: func(self: vec3, rhs: vec3) -> vec3; - /// Casts all elements of `self` to `u16`. - as-u16vec3: func(self: vec3) -> u16-vec3; - /// Creates a 3D vector from `self` with the given value of `y`. - with-y: func(self: vec3, y: f32) -> vec3; - /// Casts all elements of `self` to `i16`. - as-i16vec3: func(self: vec3) -> i16-vec3; - /// Rotates towards `rhs` up to `max_angle` (in radians). - /// When `max_angle` is `0.0`, the result will be equal to `self`. When `max_angle` is equal to - /// `self.angle_between(rhs)`, the result will be parallel to `rhs`. If `max_angle` is negative, - /// rotates towards the exact opposite of `rhs`. Will not go past the target. - rotate-towards: func(self: vec3, rhs: vec3, max-angle: f32) -> vec3; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: vec3, rhs: vec3) -> f32; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: vec3, rhs: vec3) -> bvec3; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: vec3) -> u64; - /// Returns the angle (in radians) between two vectors in the range `[0, +π]`. - /// The inputs do not need to be unit vectors however they must be non-zero. - angle-between: func(self: vec3, rhs: vec3) -> f32; - rem: func(p0: vec3, p1: f32) -> vec3; - /// Casts all elements of `self` to `i8`. - as-i8vec3: func(self: vec3) -> i8-vec3; - add: func(self: vec3, rhs: vec3) -> vec3; - to-vec3a: func(self: vec3) -> vec3-a; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec3, if-true: vec3, if-false: vec3) -> vec3; - /// Performs `is_finite` on each element of self, returning a vector mask of the results. - /// In other words, this computes `[x.is_finite(), y.is_finite(), ...]`. - is-finite-mask: func(self: vec3) -> bvec3; - /// Creates a 4D vector from `self` and the given `w` value. - extend: func(self: vec3, w: f32) -> vec4; - /// Performs `is_nan` on each element of self, returning a vector mask of the results. - /// In other words, this computes `[x.is_nan(), y.is_nan(), ...]`. - is-nan-mask: func(self: vec3) -> bvec3; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: vec3) -> u64; - /// Returns `self` normalized to length 1.0 if possible, else returns zero. - /// In particular, if the input is zero (or very close to zero), or non-finite, - /// the result of this operation will be zero. - /// See also [`Self::try_normalize()`]. - normalize-or-zero: func(self: vec3) -> vec3; - /// Returns a vector with a length no more than `max`. - /// # Panics - /// Will panic if `max` is negative when `glam_assert` is enabled. - clamp-length-max: func(self: vec3, max: f32) -> vec3; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: vec3, rhs: vec3) -> f32; - /// Returns the refraction direction for a given incident vector `self`, surface normal - /// `normal` and ratio of indices of refraction, `eta`. When total internal reflection occurs, - /// a zero vector will be returned. - /// `self` and `normal` must be normalized. - /// # Panics - /// Will panic if `self` or `normal` is not normalized when `glam_assert` is enabled. - refract: func(self: vec3, normal: vec3, eta: f32) -> vec3; - /// Returns the vector projection of `self` onto `rhs`. - /// `rhs` must be of non-zero length. - /// # Panics - /// Will panic if `rhs` is zero length when `glam_assert` is enabled. - project-onto: func(self: vec3, rhs: vec3) -> vec3; - div: func(self: vec3, rhs: vec3) -> vec3; - /// Computes the length of `self`. - length: func(self: vec3) -> f32; - neg: func(self: vec3) -> vec3; - rem: func(p0: vec3, p1: vec3) -> vec3; - /// Returns a vector containing the integer part each element of `self`. This means numbers are - /// always truncated towards zero. - trunc: func(self: vec3) -> vec3; - /// Returns true if the absolute difference of all elements between `self` and `rhs` is - /// less than or equal to `max_abs_diff`. - /// This can be used to compare if two vectors contain similar elements. It works best when - /// comparing with a known value. The `max_abs_diff` that should be used used depends on - /// the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: vec3, rhs: vec3, max-abs-diff: f32) -> bool; - /// Projects a homogeneous coordinate to 3D space by performing perspective divide. - /// # Panics - /// Will panic if `v.w` is `0` when `glam_assert` is enabled. - from-homogeneous: func(v: vec4) -> vec3; - mul: func(self: vec3, rhs: vec3) -> vec3; - /// Computes the Euclidean distance between two points in space. - distance: func(self: vec3, rhs: vec3) -> f32; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - /// NaN propogation does not follow IEEE 754-2008 semantics for minNum and may differ on - /// different SIMD architectures. - min: func(self: vec3, rhs: vec3) -> vec3; - /// Returns the reflection vector for a given incident vector `self` and surface normal - /// `normal`. - /// `normal` must be normalized. - /// # Panics - /// Will panic if `normal` is not normalized when `glam_assert` is enabled. - reflect: func(self: vec3, normal: vec3) -> vec3; - /// Rotates around the y axis by `angle` (in radians). - rotate-y: func(self: vec3, angle: f32) -> vec3; - /// Creates a 3D vector from `self` with the given value of `x`. - with-x: func(self: vec3, x: f32) -> vec3; - /// Returns a vector containing the fractional part of the vector as `self - self.trunc()`. - /// Note that this differs from the GLSL implementation of `fract` which returns - /// `self - self.floor()`. - /// Note that this is fast but not precise for large numbers. - fract: func(self: vec3) -> vec3; - mul: func(p0: vec3, p1: f32) -> vec3; - /// Casts all elements of `self` to `u64`. - as-u64vec3: func(self: vec3) -> u64-vec3; - sub: func(p0: vec3, p1: vec3) -> vec3; - /// Returns a vector with a length no less than `min` and no more than `max`. - /// # Panics - /// Will panic if `min` is greater than `max`, or if either `min` or `max` is negative, when `glam_assert` is enabled. - clamp-length: func(self: vec3, min: f32, max: f32) -> vec3; - /// Returns a vector containing the nearest integer to a number for each element of `self`. - /// Round half-way cases away from 0.0. - round: func(self: vec3) -> vec3; - /// Returns a vector containing the natural logarithm for each element of `self`. - /// This returns NaN when the element is negative and negative infinity when the element is zero. - ln: func(self: vec3) -> vec3; - /// Returns the vector rejection of `self` from `rhs`. - /// The vector rejection is the vector perpendicular to the projection of `self` onto - /// `rhs`, in rhs words the result of `self - self.project_onto(rhs)`. - /// `rhs` must be normalized. - /// # Panics - /// Will panic if `rhs` is not normalized when `glam_assert` is enabled. - reject-from-normalized: func(self: vec3, rhs: vec3) -> vec3; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// [Euclidean division]: f32::rem_euclid - rem-euclid: func(self: vec3, rhs: vec3) -> vec3; - /// Returns a vector containing the fractional part of the vector as `self - self.floor()`. - /// Note that this differs from the Rust implementation of `fract` which returns - /// `self - self.trunc()`. - /// Note that this is fast but not precise for large numbers. - fract-gl: func(self: vec3) -> vec3; - /// Creates a 3D vector from `self` with the given value of `z`. - with-z: func(self: vec3, z: f32) -> vec3; - /// Rotates around the z axis by `angle` (in radians). - rotate-z: func(self: vec3, angle: f32) -> vec3; - rem: func(self: vec3, rhs: vec3) -> vec3; - /// Returns a vector containing the smallest integer greater than or equal to a number for - /// each element of `self`. - ceil: func(self: vec3) -> vec3; - /// Casts all elements of `self` to `f64`. - as-dvec3: func(self: vec3) -> dvec3; - /// Creates a homogeneous coordinate from `self`, equivalent to `self.extend(1.0)`. - to-homogeneous: func(self: vec3) -> vec4; - add: func(p0: vec3, p1: f32) -> vec3; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: vec3, rhs: vec3) -> bvec3; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: vec3, rhs: vec3) -> bvec3; - clone: func(self: vec3) -> vec3; - /// Rotates around `axis` by `angle` (in radians). - /// The axis must be a unit vector. - /// # Panics - /// Will panic if `axis` is not normalized when `glam_assert` is enabled. - rotate-axis: func(self: vec3, axis: vec3, angle: f32) -> vec3; - /// Performs a spherical linear interpolation between `self` and `rhs` based on the value `s`. - /// When `s` is `0.0`, the result will be equal to `self`. When `s` is `1.0`, the result - /// will be equal to `rhs`. When `s` is outside of range `[0, 1]`, the result is linearly - /// extrapolated. - slerp: func(self: vec3, rhs: vec3, s: f32) -> vec3; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - max-element: func(self: vec3) -> f32; - /// Returns whether `self` is length `1.0` or not. - /// Uses a precision threshold of approximately `1e-4`. - is-normalized: func(self: vec3) -> bool; - /// Performs a linear interpolation between `self` and `rhs` based on the value `s`. - /// When `s` is `0.0`, the result will be equal to `self`. When `s` is `1.0`, the result - /// will be equal to `rhs`. When `s` is outside of range `[0, 1]`, the result is linearly - /// extrapolated. - lerp: func(self: vec3, rhs: vec3, s: f32) -> vec3; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: vec3) -> vec3; - sub: func(self: vec3, rhs: vec3) -> vec3; - /// Returns `true` if, and only if, all elements are finite. If any element is either - /// `NaN`, positive or negative infinity, this will return `false`. - is-finite: func(self: vec3) -> bool; - sub: func(p0: vec3, p1: f32) -> vec3; - /// Casts all elements of `self` to `u8`. - as-u8vec3: func(self: vec3) -> u8-vec3; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: vec3, rhs: vec3) -> vec3; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - /// NaN propogation does not follow IEEE 754-2008 semantics for maxNum and may differ on - /// different SIMD architectures. - max: func(self: vec3, rhs: vec3) -> vec3; - /// Returns some vector that is orthogonal to the given one. - /// The input vector must be finite and non-zero. - /// The output vector is not necessarily unit length. For that use - /// [`Self::any_orthonormal_vector()`] instead. - any-orthogonal-vector: func(self: vec3) -> vec3; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: vec3, rhs: vec3) -> bvec3; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: vec3, rhs: vec3) -> bvec3; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: vec3) -> f32; - /// Moves towards `rhs` based on the value `d`. - /// When `d` is `0.0`, the result will be equal to `self`. When `d` is equal to - /// `self.distance(rhs)`, the result will be equal to `rhs`. Will not go past `rhs`. - move-towards: func(self: vec3, rhs: vec3, d: f32) -> vec3; - /// Returns a vector containing `2^self` for each element of `self`. - exp2: func(self: vec3) -> vec3; - mul: func(p0: vec3, p1: vec3) -> vec3; - /// Casts all elements of `self` to `i32`. - as-ivec3: func(self: vec3) -> ivec3; - /// Creates a new vector. - new: func(x: f32, y: f32, z: f32) -> vec3; - /// Converts `self` to `[x, y, z]` - to-array: func(self: vec3) -> list; - /// Returns a vector with elements representing the sign of `self`. - /// - `1.0` if the number is positive, `+0.0` or `INFINITY` - /// - `-1.0` if the number is negative, `-0.0` or `NEG_INFINITY` - /// - `NAN` if the number is `NAN` - signum: func(self: vec3) -> vec3; - /// Returns a bitmask with the lowest 3 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: vec3) -> u32; - div: func(p0: vec3, p1: vec3) -> vec3; - add: func(p0: vec3, p1: vec3) -> vec3; - /// Creates a 2D vector from the `x` and `y` elements of `self`, discarding `z`. - /// Truncation may also be performed by using [`self.xy()`][crate::swizzles::Vec3Swizzles::xy()]. - truncate: func(self: vec3) -> vec2; - /// Returns `self` normalized to length 1.0. - /// For valid results, `self` must be finite and _not_ of length zero, nor very close to zero. - /// See also [`Self::try_normalize()`] and [`Self::normalize_or_zero()`]. - /// # Panics - /// Will panic if the resulting normalized vector is not finite when `glam_assert` is enabled. - normalize: func(self: vec3) -> vec3; - /// Returns a vector containing the reciprocal `1.0/n` of each element of `self`. - recip: func(self: vec3) -> vec3; - /// Returns a vector with signs of `rhs` and the magnitudes of `self`. - copysign: func(self: vec3, rhs: vec3) -> vec3; - /// Creates a new vector from an array. - from-array: func(a: list) -> vec3; - /// Returns a vector containing each element of `self` raised to the power of `n`. - powf: func(self: vec3, n: f32) -> vec3; - /// Component-wise clamping of values, similar to [`f32::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: vec3, min: vec3, max: vec3) -> vec3; - /// Calculates the midpoint between `self` and `rhs`. - /// The midpoint is the average of, or halfway point between, two vectors. - /// `a.midpoint(b)` should yield the same result as `a.lerp(b, 0.5)` - /// while being slightly cheaper to compute. - midpoint: func(self: vec3, rhs: vec3) -> vec3; - /// Returns the vector projection of `self` onto `rhs`. - /// `rhs` must be normalized. - /// # Panics - /// Will panic if `rhs` is not normalized when `glam_assert` is enabled. - project-onto-normalized: func(self: vec3, rhs: vec3) -> vec3; - /// Computes the cross product of `self` and `rhs`. - cross: func(self: vec3, rhs: vec3) -> vec3; - /// Casts all elements of `self` to `i64`. - as-i64vec3: func(self: vec3) -> i64-vec3; - /// Creates a vector with all elements set to `v`. - splat: func(v: f32) -> vec3; - /// Rotates around the x axis by `angle` (in radians). - rotate-x: func(self: vec3, angle: f32) -> vec3; - div: func(p0: vec3, p1: f32) -> vec3; - /// Returns the vector rejection of `self` from `rhs`. - /// The vector rejection is the vector perpendicular to the projection of `self` onto - /// `rhs`, in rhs words the result of `self - self.project_onto(rhs)`. - /// `rhs` must be of non-zero length. - /// # Panics - /// Will panic if `rhs` has a length of zero when `glam_assert` is enabled. - reject-from: func(self: vec3, rhs: vec3) -> vec3; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - min-element: func(self: vec3) -> f32; - /// Returns a vector with a length no less than `min`. - /// # Panics - /// Will panic if `min` is negative when `glam_assert` is enabled. - clamp-length-min: func(self: vec3, min: f32) -> vec3; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: vec3) -> bool; - /// Returns a vector containing `e^self` (the exponential function) for each element of - /// `self`. - exp: func(self: vec3) -> vec3; - /// Fused multiply-add. Computes `(self * a) + b` element-wise with only one rounding - /// error, yielding a more accurate result than an unfused multiply-add. - /// Using `mul_add` *may* be more performant than an unfused multiply-add if the target - /// architecture has a dedicated fma CPU instruction. However, this is not always true, - /// and will be heavily dependant on designing algorithms with specific target hardware in - /// mind. - mul-add: func(self: vec3, a: vec3, b: vec3) -> vec3; - /// Casts all elements of `self` to `u32`. - as-uvec3: func(self: vec3) -> uvec3; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: vec3, rhs: vec3) -> bvec3; - /// Computes the squared length of `self`. - /// This is faster than `length()` as it avoids a square root operation. - length-squared: func(self: vec3) -> f32; - /// Returns `self` normalized to length 1.0 if possible, else returns a - /// fallback value. - /// In particular, if the input is zero (or very close to zero), or non-finite, - /// the result of this operation will be the fallback value. - /// See also [`Self::try_normalize()`]. - normalize-or: func(self: vec3, fallback: vec3) -> vec3; - /// Returns any unit vector that is orthogonal to the given one. - /// The input vector must be unit length. - /// # Panics - /// Will panic if `self` is not normalized when `glam_assert` is enabled. - any-orthonormal-vector: func(self: vec3) -> vec3; -} - -/// Methods for Vec3A -interface vec3-a { - use types.{reflect-reference}; - - /// Rotates around the z axis by `angle` (in radians). - rotate-z: func(self: vec3-a, angle: f32) -> vec3-a; - mul: func(p0: vec3-a, p1: f32) -> vec3-a; - /// Returns a vector containing the fractional part of the vector as `self - self.trunc()`. - /// Note that this differs from the GLSL implementation of `fract` which returns - /// `self - self.floor()`. - /// Note that this is fast but not precise for large numbers. - fract: func(self: vec3-a) -> vec3-a; - /// Returns the refraction direction for a given incident vector `self`, surface normal - /// `normal` and ratio of indices of refraction, `eta`. When total internal reflection occurs, - /// a zero vector will be returned. - /// `self` and `normal` must be normalized. - /// # Panics - /// Will panic if `self` or `normal` is not normalized when `glam_assert` is enabled. - refract: func(self: vec3-a, normal: vec3-a, eta: f32) -> vec3-a; - add: func(p0: vec3-a, p1: vec3-a) -> vec3-a; - /// Fused multiply-add. Computes `(self * a) + b` element-wise with only one rounding - /// error, yielding a more accurate result than an unfused multiply-add. - /// Using `mul_add` *may* be more performant than an unfused multiply-add if the target - /// architecture has a dedicated fma CPU instruction. However, this is not always true, - /// and will be heavily dependant on designing algorithms with specific target hardware in - /// mind. - mul-add: func(self: vec3-a, a: vec3-a, b: vec3-a) -> vec3-a; - sub: func(self: vec3-a, rhs: vec3-a) -> vec3-a; - /// Returns a vector with signs of `rhs` and the magnitudes of `self`. - copysign: func(self: vec3-a, rhs: vec3-a) -> vec3-a; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - /// NaN propogation does not follow IEEE 754-2008 semantics for minNum and may differ on - /// different SIMD architectures. - min: func(self: vec3-a, rhs: vec3-a) -> vec3-a; - /// Returns the vector projection of `self` onto `rhs`. - /// `rhs` must be of non-zero length. - /// # Panics - /// Will panic if `rhs` is zero length when `glam_assert` is enabled. - project-onto: func(self: vec3-a, rhs: vec3-a) -> vec3-a; - sub: func(p0: vec3-a, p1: f32) -> vec3-a; - /// Creates a 3D vector from `self` with the given value of `y`. - with-y: func(self: vec3-a, y: f32) -> vec3-a; - /// Casts all elements of `self` to `i16`. - as-i16vec3: func(self: vec3-a) -> i16-vec3; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: vec3-a, rhs: vec3-a) -> bvec3-a; - rem: func(self: vec3-a, rhs: vec3-a) -> vec3-a; - rem: func(p0: vec3-a, p1: vec3-a) -> vec3-a; - div: func(p0: vec3-a, p1: f32) -> vec3-a; - /// Creates a new vector. - new: func(x: f32, y: f32, z: f32) -> vec3-a; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: vec3-a) -> f32; - /// Returns a vector containing the integer part each element of `self`. This means numbers are - /// always truncated towards zero. - trunc: func(self: vec3-a) -> vec3-a; - /// Creates a vector with all elements set to `v`. - splat: func(v: f32) -> vec3-a; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: vec3-a) -> u64; - /// Returns `self` normalized to length 1.0. - /// For valid results, `self` must be finite and _not_ of length zero, nor very close to zero. - /// See also [`Self::try_normalize()`] and [`Self::normalize_or_zero()`]. - /// # Panics - /// Will panic if the resulting normalized vector is not finite when `glam_assert` is enabled. - normalize: func(self: vec3-a) -> vec3-a; - /// Rotates around `axis` by `angle` (in radians). - /// The axis must be a unit vector. - /// # Panics - /// Will panic if `axis` is not normalized when `glam_assert` is enabled. - rotate-axis: func(self: vec3-a, axis: vec3-a, angle: f32) -> vec3-a; - /// Creates a 4D vector from `self` and the given `w` value. - extend: func(self: vec3-a, w: f32) -> vec4; - /// Returns a vector containing the largest integer less than or equal to a number for each - /// element of `self`. - floor: func(self: vec3-a) -> vec3-a; - /// Creates a 3D vector from `self` with the given value of `x`. - with-x: func(self: vec3-a, x: f32) -> vec3-a; - /// Returns a vector containing `2^self` for each element of `self`. - exp2: func(self: vec3-a) -> vec3-a; - /// Creates a homogeneous coordinate from `self`, equivalent to `self.extend(1.0)`. - to-homogeneous: func(self: vec3-a) -> vec4; - div: func(self: vec3-a, rhs: vec3-a) -> vec3-a; - /// Casts all elements of `self` to `f64`. - as-dvec3: func(self: vec3-a) -> dvec3; - /// Returns a vector containing `e^self` (the exponential function) for each element of - /// `self`. - exp: func(self: vec3-a) -> vec3-a; - /// Rotates around the x axis by `angle` (in radians). - rotate-x: func(self: vec3-a, angle: f32) -> vec3-a; - /// Performs a spherical linear interpolation between `self` and `rhs` based on the value `s`. - /// When `s` is `0.0`, the result will be equal to `self`. When `s` is `1.0`, the result - /// will be equal to `rhs`. When `s` is outside of range `[0, 1]`, the result is linearly - /// extrapolated. - slerp: func(self: vec3-a, rhs: vec3-a, s: f32) -> vec3-a; - /// Returns `self` normalized to length 1.0 if possible, else returns zero. - /// In particular, if the input is zero (or very close to zero), or non-finite, - /// the result of this operation will be zero. - /// See also [`Self::try_normalize()`]. - normalize-or-zero: func(self: vec3-a) -> vec3-a; - /// Computes `1.0 / length()`. - /// For valid results, `self` must _not_ be of length zero. - length-recip: func(self: vec3-a) -> f32; - /// Returns `self` normalized to length 1.0 if possible, else returns a - /// fallback value. - /// In particular, if the input is zero (or very close to zero), or non-finite, - /// the result of this operation will be the fallback value. - /// See also [`Self::try_normalize()`]. - normalize-or: func(self: vec3-a, fallback: vec3-a) -> vec3-a; - /// Returns a vector with a length no less than `min`. - /// # Panics - /// Will panic if `min` is negative when `glam_assert` is enabled. - clamp-length-min: func(self: vec3-a, min: f32) -> vec3-a; - /// Returns the vector rejection of `self` from `rhs`. - /// The vector rejection is the vector perpendicular to the projection of `self` onto - /// `rhs`, in rhs words the result of `self - self.project_onto(rhs)`. - /// `rhs` must be normalized. - /// # Panics - /// Will panic if `rhs` is not normalized when `glam_assert` is enabled. - reject-from-normalized: func(self: vec3-a, rhs: vec3-a) -> vec3-a; - add: func(self: vec3-a, rhs: vec3-a) -> vec3-a; - /// Performs `is_nan` on each element of self, returning a vector mask of the results. - /// In other words, this computes `[x.is_nan(), y.is_nan(), ...]`. - is-nan-mask: func(self: vec3-a) -> bvec3-a; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: vec3-a) -> vec3-a; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// [Euclidean division]: f32::rem_euclid - rem-euclid: func(self: vec3-a, rhs: vec3-a) -> vec3-a; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: vec3-a) -> f32; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: vec3-a, rhs: vec3-a) -> bvec3-a; - /// Casts all elements of `self` to `i8`. - as-i8vec3: func(self: vec3-a) -> i8-vec3; - /// Projects a homogeneous coordinate to 3D space by performing perspective divide. - /// # Panics - /// Will panic if `v.w` is `0` when `glam_assert` is enabled. - from-homogeneous: func(v: vec4) -> vec3-a; - /// Returns any unit vector that is orthogonal to the given one. - /// The input vector must be unit length. - /// # Panics - /// Will panic if `self` is not normalized when `glam_assert` is enabled. - any-orthonormal-vector: func(self: vec3-a) -> vec3-a; - /// Returns a bitmask with the lowest 3 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: vec3-a) -> u32; - /// Component-wise clamping of values, similar to [`f32::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: vec3-a, min: vec3-a, max: vec3-a) -> vec3-a; - /// Returns a vector containing the nearest integer to a number for each element of `self`. - /// Round half-way cases away from 0.0. - round: func(self: vec3-a) -> vec3-a; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: vec3-a) -> bool; - /// Computes the Euclidean distance between two points in space. - distance: func(self: vec3-a, rhs: vec3-a) -> f32; - sub: func(p0: vec3-a, p1: vec3-a) -> vec3-a; - /// Returns the vector rejection of `self` from `rhs`. - /// The vector rejection is the vector perpendicular to the projection of `self` onto - /// `rhs`, in rhs words the result of `self - self.project_onto(rhs)`. - /// `rhs` must be of non-zero length. - /// # Panics - /// Will panic if `rhs` has a length of zero when `glam_assert` is enabled. - reject-from: func(self: vec3-a, rhs: vec3-a) -> vec3-a; - neg: func(self: vec3-a) -> vec3-a; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - /// NaN propogation does not follow IEEE 754-2008 semantics for maxNum and may differ on - /// different SIMD architectures. - max: func(self: vec3-a, rhs: vec3-a) -> vec3-a; - mul: func(p0: vec3-a, p1: vec3-a) -> vec3-a; - /// Performs a linear interpolation between `self` and `rhs` based on the value `s`. - /// When `s` is `0.0`, the result will be equal to `self`. When `s` is `1.0`, the result - /// will be equal to `rhs`. When `s` is outside of range `[0, 1]`, the result is linearly - /// extrapolated. - lerp: func(self: vec3-a, rhs: vec3-a, s: f32) -> vec3-a; - /// Converts `self` to `[x, y, z]` - to-array: func(self: vec3-a) -> list; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - max-element: func(self: vec3-a) -> f32; - /// Creates a 3D vector from `self` with the given value of `z`. - with-z: func(self: vec3-a, z: f32) -> vec3-a; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec3-a, if-true: vec3-a, if-false: vec3-a) -> vec3-a; - /// Returns the vector projection of `self` onto `rhs`. - /// `rhs` must be normalized. - /// # Panics - /// Will panic if `rhs` is not normalized when `glam_assert` is enabled. - project-onto-normalized: func(self: vec3-a, rhs: vec3-a) -> vec3-a; - add: func(p0: vec3-a, p1: f32) -> vec3-a; - /// Casts all elements of `self` to `i32`. - as-ivec3: func(self: vec3-a) -> ivec3; - /// Computes the length of `self`. - length: func(self: vec3-a) -> f32; - /// Creates a [`Vec3A`] from the `x`, `y` and `z` elements of `self` discarding `w`. - /// On architectures where SIMD is supported such as SSE2 on `x86_64` this conversion is a noop. - from-vec4: func(v: vec4) -> vec3-a; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - min-element: func(self: vec3-a) -> f32; - /// Casts all elements of `self` to `u64`. - as-u64vec3: func(self: vec3-a) -> u64-vec3; - /// Returns a vector with a length no less than `min` and no more than `max`. - /// # Panics - /// Will panic if `min` is greater than `max`, or if either `min` or `max` is negative, when `glam_assert` is enabled. - clamp-length: func(self: vec3-a, min: f32, max: f32) -> vec3-a; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - div-euclid: func(self: vec3-a, rhs: vec3-a) -> vec3-a; - /// Returns a vector containing the fractional part of the vector as `self - self.floor()`. - /// Note that this differs from the Rust implementation of `fract` which returns - /// `self - self.trunc()`. - /// Note that this is fast but not precise for large numbers. - fract-gl: func(self: vec3-a) -> vec3-a; - /// Returns a vector containing the reciprocal `1.0/n` of each element of `self`. - recip: func(self: vec3-a) -> vec3-a; - /// Returns a vector containing the base 2 logarithm for each element of `self`. - /// This returns NaN when the element is negative and negative infinity when the element is zero. - log2: func(self: vec3-a) -> vec3-a; - /// Returns true if the absolute difference of all elements between `self` and `rhs` is - /// less than or equal to `max_abs_diff`. - /// This can be used to compare if two vectors contain similar elements. It works best when - /// comparing with a known value. The `max_abs_diff` that should be used used depends on - /// the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: vec3-a, rhs: vec3-a, max-abs-diff: f32) -> bool; - /// Creates a 2D vector from the `x` and `y` elements of `self`, discarding `z`. - /// Truncation may also be performed by using [`self.xy()`][crate::swizzles::Vec3Swizzles::xy()]. - truncate: func(self: vec3-a) -> vec2; - /// Returns a vector containing the natural logarithm for each element of `self`. - /// This returns NaN when the element is negative and negative infinity when the element is zero. - ln: func(self: vec3-a) -> vec3-a; - /// Performs `is_finite` on each element of self, returning a vector mask of the results. - /// In other words, this computes `[x.is_finite(), y.is_finite(), ...]`. - is-finite-mask: func(self: vec3-a) -> bvec3-a; - /// Rotates towards `rhs` up to `max_angle` (in radians). - /// When `max_angle` is `0.0`, the result will be equal to `self`. When `max_angle` is equal to - /// `self.angle_between(rhs)`, the result will be parallel to `rhs`. If `max_angle` is negative, - /// rotates towards the exact opposite of `rhs`. Will not go past the target. - rotate-towards: func(self: vec3-a, rhs: vec3-a, max-angle: f32) -> vec3-a; - to-vec3: func(self: vec3-a) -> vec3; - /// Casts all elements of `self` to `u8`. - as-u8vec3: func(self: vec3-a) -> u8-vec3; - /// Returns a vector with a length no more than `max`. - /// # Panics - /// Will panic if `max` is negative when `glam_assert` is enabled. - clamp-length-max: func(self: vec3-a, max: f32) -> vec3-a; - /// Returns some vector that is orthogonal to the given one. - /// The input vector must be finite and non-zero. - /// The output vector is not necessarily unit length. For that use - /// [`Self::any_orthonormal_vector()`] instead. - any-orthogonal-vector: func(self: vec3-a) -> vec3-a; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: vec3-a, rhs: vec3-a) -> bvec3-a; - /// Calculates the midpoint between `self` and `rhs`. - /// The midpoint is the average of, or halfway point between, two vectors. - /// `a.midpoint(b)` should yield the same result as `a.lerp(b, 0.5)` - /// while being slightly cheaper to compute. - midpoint: func(self: vec3-a, rhs: vec3-a) -> vec3-a; - /// Returns `true` if, and only if, all elements are finite. If any element is either - /// `NaN`, positive or negative infinity, this will return `false`. - is-finite: func(self: vec3-a) -> bool; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: vec3-a, rhs: vec3-a) -> f32; - /// Returns a vector containing each element of `self` raised to the power of `n`. - powf: func(self: vec3-a, n: f32) -> vec3-a; - /// Casts all elements of `self` to `u16`. - as-u16vec3: func(self: vec3-a) -> u16-vec3; - eq: func(self: vec3-a, rhs: vec3-a) -> bool; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: vec3-a, rhs: vec3-a) -> bvec3-a; - /// Returns a vector containing the smallest integer greater than or equal to a number for - /// each element of `self`. - ceil: func(self: vec3-a) -> vec3-a; - /// Computes the squared length of `self`. - /// This is faster than `length()` as it avoids a square root operation. - length-squared: func(self: vec3-a) -> f32; - /// Returns the angle (in radians) between two vectors in the range `[0, +π]`. - /// The inputs do not need to be unit vectors however they must be non-zero. - angle-between: func(self: vec3-a, rhs: vec3-a) -> f32; - /// Creates a new vector from an array. - from-array: func(a: list) -> vec3-a; - clone: func(self: vec3-a) -> vec3-a; - /// Rotates around the y axis by `angle` (in radians). - rotate-y: func(self: vec3-a, angle: f32) -> vec3-a; - /// Computes the cross product of `self` and `rhs`. - cross: func(self: vec3-a, rhs: vec3-a) -> vec3-a; - div: func(p0: vec3-a, p1: vec3-a) -> vec3-a; - /// Returns whether `self` is length `1.0` or not. - /// Uses a precision threshold of approximately `1e-4`. - is-normalized: func(self: vec3-a) -> bool; - rem: func(p0: vec3-a, p1: f32) -> vec3-a; - /// Casts all elements of `self` to `u32`. - as-uvec3: func(self: vec3-a) -> uvec3; - /// Casts all elements of `self` to `i64`. - as-i64vec3: func(self: vec3-a) -> i64-vec3; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: vec3-a) -> u64; - /// Moves towards `rhs` based on the value `d`. - /// When `d` is `0.0`, the result will be equal to `self`. When `d` is equal to - /// `self.distance(rhs)`, the result will be equal to `rhs`. Will not go past `rhs`. - move-towards: func(self: vec3-a, rhs: vec3-a, d: f32) -> vec3-a; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: vec3-a, rhs: vec3-a) -> bvec3-a; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: vec3-a, rhs: vec3-a) -> f32; - /// Returns a vector with elements representing the sign of `self`. - /// - `1.0` if the number is positive, `+0.0` or `INFINITY` - /// - `-1.0` if the number is negative, `-0.0` or `NEG_INFINITY` - /// - `NAN` if the number is `NAN` - signum: func(self: vec3-a) -> vec3-a; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: vec3-a, rhs: vec3-a) -> vec3-a; - mul: func(self: vec3-a, rhs: vec3-a) -> vec3-a; - /// Returns the reflection vector for a given incident vector `self` and surface normal - /// `normal`. - /// `normal` must be normalized. - /// # Panics - /// Will panic if `normal` is not normalized when `glam_assert` is enabled. - reflect: func(self: vec3-a, normal: vec3-a) -> vec3-a; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: vec3-a, rhs: vec3-a) -> bvec3-a; -} - -/// Methods for Vec4 -interface vec4 { - use types.{reflect-reference}; - - /// Returns a vector containing the nearest integer to a number for each element of `self`. - /// Round half-way cases away from 0.0. - round: func(self: vec4) -> vec4; - sub: func(p0: vec4, p1: vec4) -> vec4; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - div-euclid: func(self: vec4, rhs: vec4) -> vec4; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - /// NaN propogation does not follow IEEE 754-2008 semantics for minNum and may differ on - /// different SIMD architectures. - min: func(self: vec4, rhs: vec4) -> vec4; - /// Returns a vector containing the natural logarithm for each element of `self`. - /// This returns NaN when the element is negative and negative infinity when the element is zero. - ln: func(self: vec4) -> vec4; - /// Computes the length of `self`. - length: func(self: vec4) -> f32; - eq: func(self: vec4, rhs: vec4) -> bool; - /// Casts all elements of `self` to `i32`. - as-ivec4: func(self: vec4) -> ivec4; - /// Casts all elements of `self` to `i16`. - as-i16vec4: func(self: vec4) -> i16-vec4; - /// Returns a vector with a length no less than `min`. - /// # Panics - /// Will panic if `min` is negative when `glam_assert` is enabled. - clamp-length-min: func(self: vec4, min: f32) -> vec4; - /// Returns a vector with a length no more than `max`. - /// # Panics - /// Will panic if `max` is negative when `glam_assert` is enabled. - clamp-length-max: func(self: vec4, max: f32) -> vec4; - /// Computes the squared length of `self`. - /// This is faster than `length()` as it avoids a square root operation. - length-squared: func(self: vec4) -> f32; - /// Returns a vector with a length no less than `min` and no more than `max`. - /// # Panics - /// Will panic if `min` is greater than `max`, or if either `min` or `max` is negative, when `glam_assert` is enabled. - clamp-length: func(self: vec4, min: f32, max: f32) -> vec4; - /// Creates a vector with all elements set to `v`. - splat: func(v: f32) -> vec4; - div: func(p0: vec4, p1: f32) -> vec4; - /// Returns the refraction direction for a given incident vector `self`, surface normal - /// `normal` and ratio of indices of refraction, `eta`. When total internal reflection occurs, - /// a zero vector will be returned. - /// `self` and `normal` must be normalized. - /// # Panics - /// Will panic if `self` or `normal` is not normalized when `glam_assert` is enabled. - refract: func(self: vec4, normal: vec4, eta: f32) -> vec4; - /// Calculates the midpoint between `self` and `rhs`. - /// The midpoint is the average of, or halfway point between, two vectors. - /// `a.midpoint(b)` should yield the same result as `a.lerp(b, 0.5)` - /// while being slightly cheaper to compute. - midpoint: func(self: vec4, rhs: vec4) -> vec4; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - max-element: func(self: vec4) -> f32; - add: func(p0: vec4, p1: vec4) -> vec4; - /// Creates a 3D vector from the `x`, `y` and `z` elements of `self`, discarding `w`. - /// Truncation to [`Vec3`] may also be performed by using [`self.xyz()`][crate::swizzles::Vec4Swizzles::xyz()]. - /// To truncate to [`Vec3A`] use [`Vec3A::from_vec4()`]. - truncate: func(self: vec4) -> vec3; - mul: func(self: vec4, rhs: vec4) -> vec4; - /// Returns a vector containing the smallest integer greater than or equal to a number for - /// each element of `self`. - ceil: func(self: vec4) -> vec4; - rem: func(p0: vec4, p1: vec4) -> vec4; - /// Projects a homogeneous coordinate to 3D space by performing perspective divide. - /// To project to [`Vec3A`] use [`Vec3A::from_homogeneous()`]. - /// # Panics - /// Will panic if `self.w` is `0` when `glam_assert` is enabled. - project: func(self: vec4) -> vec3; - /// Computes `1.0 / length()`. - /// For valid results, `self` must _not_ be of length zero. - length-recip: func(self: vec4) -> f32; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// [Euclidean division]: f32::rem_euclid - rem-euclid: func(self: vec4, rhs: vec4) -> vec4; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: vec4, rhs: vec4) -> f32; - rem: func(self: vec4, rhs: vec4) -> vec4; - /// Casts all elements of `self` to `u32`. - as-uvec4: func(self: vec4) -> uvec4; - /// Casts all elements of `self` to `u8`. - as-u8vec4: func(self: vec4) -> u8-vec4; - /// Returns a vector containing the fractional part of the vector as `self - self.floor()`. - /// Note that this differs from the Rust implementation of `fract` which returns - /// `self - self.trunc()`. - /// Note that this is fast but not precise for large numbers. - fract-gl: func(self: vec4) -> vec4; - sub: func(p0: vec4, p1: f32) -> vec4; - /// Casts all elements of `self` to `f64`. - as-dvec4: func(self: vec4) -> dvec4; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: vec4, rhs: vec4) -> bvec4-a; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: vec4) -> vec4; - /// Creates a 4D vector from `self` with the given value of `w`. - with-w: func(self: vec4, w: f32) -> vec4; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - min-element: func(self: vec4) -> f32; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: vec4) -> f32; - /// Returns the vector rejection of `self` from `rhs`. - /// The vector rejection is the vector perpendicular to the projection of `self` onto - /// `rhs`, in rhs words the result of `self - self.project_onto(rhs)`. - /// `rhs` must be normalized. - /// # Panics - /// Will panic if `rhs` is not normalized when `glam_assert` is enabled. - reject-from-normalized: func(self: vec4, rhs: vec4) -> vec4; - /// Returns `self` normalized to length 1.0 if possible, else returns a - /// fallback value. - /// In particular, if the input is zero (or very close to zero), or non-finite, - /// the result of this operation will be the fallback value. - /// See also [`Self::try_normalize()`]. - normalize-or: func(self: vec4, fallback: vec4) -> vec4; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: vec4) -> u64; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: vec4, rhs: vec4) -> bvec4-a; - /// Returns a vector with signs of `rhs` and the magnitudes of `self`. - copysign: func(self: vec4, rhs: vec4) -> vec4; - /// Returns a vector containing the integer part each element of `self`. This means numbers are - /// always truncated towards zero. - trunc: func(self: vec4) -> vec4; - mul: func(p0: vec4, p1: vec4) -> vec4; - /// Moves towards `rhs` based on the value `d`. - /// When `d` is `0.0`, the result will be equal to `self`. When `d` is equal to - /// `self.distance(rhs)`, the result will be equal to `rhs`. Will not go past `rhs`. - move-towards: func(self: vec4, rhs: vec4, d: f32) -> vec4; - sub: func(self: vec4, rhs: vec4) -> vec4; - /// Returns a vector containing `2^self` for each element of `self`. - exp2: func(self: vec4) -> vec4; - /// Returns the vector projection of `self` onto `rhs`. - /// `rhs` must be normalized. - /// # Panics - /// Will panic if `rhs` is not normalized when `glam_assert` is enabled. - project-onto-normalized: func(self: vec4, rhs: vec4) -> vec4; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: vec4) -> u64; - add: func(p0: vec4, p1: f32) -> vec4; - /// Component-wise clamping of values, similar to [`f32::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: vec4, min: vec4, max: vec4) -> vec4; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: vec4, rhs: vec4) -> bvec4-a; - /// Creates a new vector. - new: func(x: f32, y: f32, z: f32, w: f32) -> vec4; - /// Casts all elements of `self` to `u16`. - as-u16vec4: func(self: vec4) -> u16-vec4; - /// Returns a bitmask with the lowest 4 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: vec4) -> u32; - clone: func(self: vec4) -> vec4; - div: func(self: vec4, rhs: vec4) -> vec4; - div: func(p0: vec4, p1: vec4) -> vec4; - mul: func(p0: vec4, p1: f32) -> vec4; - /// Returns `self` normalized to length 1.0. - /// For valid results, `self` must be finite and _not_ of length zero, nor very close to zero. - /// See also [`Self::try_normalize()`] and [`Self::normalize_or_zero()`]. - /// # Panics - /// Will panic if the resulting normalized vector is not finite when `glam_assert` is enabled. - normalize: func(self: vec4) -> vec4; - /// Returns true if the absolute difference of all elements between `self` and `rhs` is - /// less than or equal to `max_abs_diff`. - /// This can be used to compare if two vectors contain similar elements. It works best when - /// comparing with a known value. The `max_abs_diff` that should be used used depends on - /// the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: vec4, rhs: vec4, max-abs-diff: f32) -> bool; - /// Returns a vector with elements representing the sign of `self`. - /// - `1.0` if the number is positive, `+0.0` or `INFINITY` - /// - `-1.0` if the number is negative, `-0.0` or `NEG_INFINITY` - /// - `NAN` if the number is `NAN` - signum: func(self: vec4) -> vec4; - /// Returns the reflection vector for a given incident vector `self` and surface normal - /// `normal`. - /// `normal` must be normalized. - /// # Panics - /// Will panic if `normal` is not normalized when `glam_assert` is enabled. - reflect: func(self: vec4, normal: vec4) -> vec4; - neg: func(self: vec4) -> vec4; - /// Casts all elements of `self` to `u64`. - as-u64vec4: func(self: vec4) -> u64-vec4; - /// Returns a vector containing the largest integer less than or equal to a number for each - /// element of `self`. - floor: func(self: vec4) -> vec4; - /// Returns a vector containing each element of `self` raised to the power of `n`. - powf: func(self: vec4, n: f32) -> vec4; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: vec4) -> f32; - /// Returns whether `self` is length `1.0` or not. - /// Uses a precision threshold of approximately `1e-4`. - is-normalized: func(self: vec4) -> bool; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: vec4, rhs: vec4) -> bvec4-a; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: vec4, rhs: vec4) -> vec4; - /// Casts all elements of `self` to `i64`. - as-i64vec4: func(self: vec4) -> i64-vec4; - /// Returns a vector containing `e^self` (the exponential function) for each element of - /// `self`. - exp: func(self: vec4) -> vec4; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: vec4, rhs: vec4) -> bvec4-a; - /// Returns the vector projection of `self` onto `rhs`. - /// `rhs` must be of non-zero length. - /// # Panics - /// Will panic if `rhs` is zero length when `glam_assert` is enabled. - project-onto: func(self: vec4, rhs: vec4) -> vec4; - /// Performs a linear interpolation between `self` and `rhs` based on the value `s`. - /// When `s` is `0.0`, the result will be equal to `self`. When `s` is `1.0`, the result - /// will be equal to `rhs`. When `s` is outside of range `[0, 1]`, the result is linearly - /// extrapolated. - lerp: func(self: vec4, rhs: vec4, s: f32) -> vec4; - /// Casts all elements of `self` to `i8`. - as-i8vec4: func(self: vec4) -> i8-vec4; - /// Returns `true` if, and only if, all elements are finite. If any element is either - /// `NaN`, positive or negative infinity, this will return `false`. - is-finite: func(self: vec4) -> bool; - /// Returns a vector containing the base 2 logarithm for each element of `self`. - /// This returns NaN when the element is negative and negative infinity when the element is zero. - log2: func(self: vec4) -> vec4; - /// Returns a vector containing the reciprocal `1.0/n` of each element of `self`. - recip: func(self: vec4) -> vec4; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec4-a, if-true: vec4, if-false: vec4) -> vec4; - rem: func(p0: vec4, p1: f32) -> vec4; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: vec4) -> bool; - add: func(self: vec4, rhs: vec4) -> vec4; - /// Creates a 4D vector from `self` with the given value of `z`. - with-z: func(self: vec4, z: f32) -> vec4; - /// Performs `is_finite` on each element of self, returning a vector mask of the results. - /// In other words, this computes `[x.is_finite(), y.is_finite(), ...]`. - is-finite-mask: func(self: vec4) -> bvec4-a; - /// Returns `self` normalized to length 1.0 if possible, else returns zero. - /// In particular, if the input is zero (or very close to zero), or non-finite, - /// the result of this operation will be zero. - /// See also [`Self::try_normalize()`]. - normalize-or-zero: func(self: vec4) -> vec4; - /// Converts `self` to `[x, y, z, w]` - to-array: func(self: vec4) -> list; - /// Creates a 4D vector from `self` with the given value of `x`. - with-x: func(self: vec4, x: f32) -> vec4; - /// Creates a 4D vector from `self` with the given value of `y`. - with-y: func(self: vec4, y: f32) -> vec4; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - /// NaN propogation does not follow IEEE 754-2008 semantics for maxNum and may differ on - /// different SIMD architectures. - max: func(self: vec4, rhs: vec4) -> vec4; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: vec4, rhs: vec4) -> f32; - /// Creates a new vector from an array. - from-array: func(a: list) -> vec4; - /// Performs `is_nan` on each element of self, returning a vector mask of the results. - /// In other words, this computes `[x.is_nan(), y.is_nan(), ...]`. - is-nan-mask: func(self: vec4) -> bvec4-a; - /// Returns a vector containing the fractional part of the vector as `self - self.trunc()`. - /// Note that this differs from the GLSL implementation of `fract` which returns - /// `self - self.floor()`. - /// Note that this is fast but not precise for large numbers. - fract: func(self: vec4) -> vec4; - /// Returns the vector rejection of `self` from `rhs`. - /// The vector rejection is the vector perpendicular to the projection of `self` onto - /// `rhs`, in rhs words the result of `self - self.project_onto(rhs)`. - /// `rhs` must be of non-zero length. - /// # Panics - /// Will panic if `rhs` has a length of zero when `glam_assert` is enabled. - reject-from: func(self: vec4, rhs: vec4) -> vec4; - /// Computes the Euclidean distance between two points in space. - distance: func(self: vec4, rhs: vec4) -> f32; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: vec4, rhs: vec4) -> bvec4-a; - /// Fused multiply-add. Computes `(self * a) + b` element-wise with only one rounding - /// error, yielding a more accurate result than an unfused multiply-add. - /// Using `mul_add` *may* be more performant than an unfused multiply-add if the target - /// architecture has a dedicated fma CPU instruction. However, this is not always true, - /// and will be heavily dependant on designing algorithms with specific target hardware in - /// mind. - mul-add: func(self: vec4, a: vec4, b: vec4) -> vec4; -} - -/// Methods for SmolStr -interface smol-str { - use types.{reflect-reference}; - - is-empty: func(self: smol-str) -> bool; - eq: func(self: smol-str, other: smol-str) -> bool; - to-string: func(self: smol-str) -> string; - is-heap-allocated: func(self: smol-str) -> bool; - clone: func(self: smol-str) -> smol-str; - len: func(self: smol-str) -> u64; -} - -/// Methods for NonNilUuid -interface non-nil-uuid { - use types.{reflect-reference}; - - clone: func(self: non-nil-uuid) -> non-nil-uuid; - /// Get the underlying [`Uuid`] value. - get: func(self: non-nil-uuid) -> uuid; - eq: func(self: non-nil-uuid, other: non-nil-uuid) -> bool; - eq: func(p0: non-nil-uuid, p1: uuid) -> bool; - assert-receiver-is-total-eq: func(self: non-nil-uuid); -} - -/// Methods for Uuid -interface uuid { - use types.{reflect-reference}; - - /// Creates a UUID from two 64bit values. - /// # Examples - /// Basic usage: - /// ``` - /// # use uuid::Uuid; - /// let hi = 0xa1a2a3a4b1b2c1c2u64; - /// let lo = 0xd1d2d3d4d5d6d7d8u64; - /// let uuid = Uuid::from_u64_pair(hi, lo); - /// assert_eq!( - /// "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8", - /// uuid.hyphenated().to_string(), - /// ); - /// ``` - from-u64-pair: func(high-bits: u64, low-bits: u64) -> uuid; - /// The 'nil UUID' (all zeros). - /// The nil UUID is a special form of UUID that is specified to have all - /// 128 bits set to zero. - /// # References - /// * [Nil UUID in RFC 9562](https://www.ietf.org/rfc/rfc9562.html#section-5.9) - /// # Examples - /// Basic usage: - /// ``` - /// # use uuid::Uuid; - /// let uuid = Uuid::nil(); - /// assert_eq!( - /// "00000000-0000-0000-0000-000000000000", - /// uuid.hyphenated().to_string(), - /// ); - /// ``` - nil: func() -> uuid; - /// Creates a random UUID. - /// This uses the [`getrandom`] crate to utilise the operating system's RNG - /// as the source of random numbers. If you'd like to use a custom - /// generator, don't use this method: generate random bytes using your - /// custom generator and pass them to the - /// [`uuid::Builder::from_random_bytes`][from_random_bytes] function - /// instead. - /// Note that usage of this method requires the `v4` feature of this crate - /// to be enabled. - /// # Examples - /// Basic usage: - /// ``` - /// # use uuid::{Uuid, Version}; - /// let uuid = Uuid::new_v4(); - /// assert_eq!(Some(Version::Random), uuid.get_version()); - /// ``` - /// # References - /// * [UUID Version 4 in RFC 9562](https://www.ietf.org/rfc/rfc9562.html#section-5.4) - /// [`getrandom`]: https://crates.io/crates/getrandom - /// [from_random_bytes]: struct.Builder.html#method.from_random_bytes - new-v4: func() -> uuid; - /// Creates a UUID from a 128bit value in little-endian order. - /// The entire value will be flipped to convert into big-endian order. - /// This is based on the endianness of the UUID, rather than the target - /// environment so bytes will be flipped on both big and little endian - /// machines. - /// # Examples - /// Basic usage: - /// ``` - /// # use uuid::Uuid; - /// let v = 0xa1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8u128; - /// let uuid = Uuid::from_u128_le(v); - /// assert_eq!( - /// "d8d7d6d5-d4d3-d2d1-c2c1-b2b1a4a3a2a1", - /// uuid.hyphenated().to_string(), - /// ); - /// ``` - from-u128-le: func(v: u64) -> uuid; - /// Creates a UUID from a 128bit value. - /// # Examples - /// Basic usage: - /// ``` - /// # use uuid::Uuid; - /// let v = 0xa1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8u128; - /// let uuid = Uuid::from_u128(v); - /// assert_eq!( - /// "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8", - /// uuid.hyphenated().to_string(), - /// ); - /// ``` - from-u128: func(v: u64) -> uuid; - /// Returns the bytes of the UUID in little-endian order. - /// The bytes for each field will be flipped to convert into little-endian order. - /// This is based on the endianness of the UUID, rather than the target environment - /// so bytes will be flipped on both big and little endian machines. - /// Note that ordering is applied to each _field_, rather than to the bytes as a whole. - /// This ordering is compatible with Microsoft's mixed endian GUID format. - /// # Examples - /// ``` - /// use uuid::Uuid; - /// # fn main() -> Result<(), uuid::Error> { - /// let uuid = Uuid::parse_str("a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8")?; - /// assert_eq!( - /// uuid.to_bytes_le(), - /// ([ - /// 0xa4, 0xa3, 0xa2, 0xa1, 0xb2, 0xb1, 0xc2, 0xc1, 0xd1, 0xd2, - /// 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8 - /// ]) - /// ); - /// # Ok(()) - /// # } - /// ``` - to-bytes-le: func(self: uuid) -> list; - assert-receiver-is-total-eq: func(self: uuid); - /// A buffer that can be used for `encode_...` calls, that is - /// guaranteed to be long enough for any of the format adapters. - /// # Examples - /// ``` - /// # use uuid::Uuid; - /// let uuid = Uuid::nil(); - /// assert_eq!( - /// uuid.simple().encode_lower(&mut Uuid::encode_buffer()), - /// "00000000000000000000000000000000" - /// ); - /// assert_eq!( - /// uuid.hyphenated() - /// .encode_lower(&mut Uuid::encode_buffer()), - /// "00000000-0000-0000-0000-000000000000" - /// ); - /// assert_eq!( - /// uuid.urn().encode_lower(&mut Uuid::encode_buffer()), - /// "urn:uuid:00000000-0000-0000-0000-000000000000" - /// ); - /// ``` - encode-buffer: func() -> list; - /// Tests if the UUID is max (all ones). - is-max: func(self: uuid) -> bool; - clone: func(self: uuid) -> uuid; - /// Creates a UUID using the supplied bytes. - /// # Examples - /// Basic usage: - /// ``` - /// # fn main() -> Result<(), uuid::Error> { - /// # use uuid::Uuid; - /// let bytes = [ - /// 0xa1, 0xa2, 0xa3, 0xa4, - /// 0xb1, 0xb2, - /// 0xc1, 0xc2, - /// 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, - /// ]; - /// let uuid = Uuid::from_bytes(bytes); - /// assert_eq!( - /// uuid.hyphenated().to_string(), - /// "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8" - /// ); - /// # Ok(()) - /// # } - /// ``` - from-bytes: func(bytes: list) -> uuid; - /// Returns a 128bit little-endian value containing the value. - /// The bytes in the `u128` will be flipped to convert into big-endian - /// order. This is based on the endianness of the UUID, rather than the - /// target environment so bytes will be flipped on both big and little - /// endian machines. - /// Note that this will produce a different result than - /// [`Uuid::to_fields_le`], because the entire UUID is reversed, rather - /// than reversing the individual fields in-place. - /// # Examples - /// ``` - /// # use uuid::Uuid; - /// # fn main() -> Result<(), uuid::Error> { - /// let uuid = Uuid::parse_str("a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8")?; - /// assert_eq!( - /// uuid.to_u128_le(), - /// 0xd8d7d6d5d4d3d2d1c2c1b2b1a4a3a2a1, - /// ); - /// # Ok(()) - /// # } - /// ``` - to-u128-le: func(self: uuid) -> u64; - /// The 'max UUID' (all ones). - /// The max UUID is a special form of UUID that is specified to have all - /// 128 bits set to one. - /// # References - /// * [Max UUID in RFC 9562](https://www.ietf.org/rfc/rfc9562.html#section-5.10) - /// # Examples - /// Basic usage: - /// ``` - /// # use uuid::Uuid; - /// let uuid = Uuid::max(); - /// assert_eq!( - /// "ffffffff-ffff-ffff-ffff-ffffffffffff", - /// uuid.hyphenated().to_string(), - /// ); - /// ``` - max: func() -> uuid; - /// Consumes self and returns the underlying byte value of the UUID. - /// # Examples - /// ``` - /// # use uuid::Uuid; - /// let bytes = [ - /// 0xa1, 0xa2, 0xa3, 0xa4, - /// 0xb1, 0xb2, - /// 0xc1, 0xc2, - /// 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, - /// ]; - /// let uuid = Uuid::from_bytes(bytes); - /// assert_eq!(bytes, uuid.into_bytes()); - /// ``` - into-bytes: func(self: uuid) -> list; - /// If the UUID is the correct version (v1, or v6) this will return the - /// node value as a 6-byte array. For other versions this will return `None`. - get-node-id: func(self: uuid) -> option>; - eq: func(p0: uuid, p1: uuid) -> bool; - /// Creates a UUID using the supplied bytes in little endian order. - /// Note that ordering is applied to each _field_, rather than to the bytes as a whole. - /// This ordering is compatible with Microsoft's mixed endian GUID format. - /// # Examples - /// Basic usage: - /// ``` - /// # fn main() -> Result<(), uuid::Error> { - /// # use uuid::Uuid; - /// let bytes = [ - /// 0xa1, 0xa2, 0xa3, 0xa4, - /// 0xb1, 0xb2, - /// 0xc1, 0xc2, - /// 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, - /// ]; - /// let uuid = Uuid::from_bytes_le(bytes); - /// assert_eq!( - /// "a4a3a2a1-b2b1-c2c1-d1d2-d3d4d5d6d7d8", - /// uuid.hyphenated().to_string(), - /// ); - /// # Ok(()) - /// # } - /// ``` - from-bytes-le: func(b: list) -> uuid; - /// Returns the version number of the UUID. - /// This represents the algorithm used to generate the value. - /// This method is the future-proof alternative to [`Uuid::get_version`]. - /// # Examples - /// Basic usage: - /// ``` - /// # use uuid::Uuid; - /// # fn main() -> Result<(), uuid::Error> { - /// let my_uuid = Uuid::parse_str("02f09a3f-1624-3b1d-8409-44eff7708208")?; - /// assert_eq!(3, my_uuid.get_version_num()); - /// # Ok(()) - /// # } - /// ``` - /// # References - /// * [Version Field in RFC 9562](https://www.ietf.org/rfc/rfc9562.html#section-4.2) - get-version-num: func(self: uuid) -> u64; - /// Returns two 64bit values containing the value. - /// The bytes in the UUID will be split into two `u64`. - /// The first u64 represents the 64 most significant bits, - /// the second one represents the 64 least significant. - /// # Examples - /// ``` - /// # use uuid::Uuid; - /// # fn main() -> Result<(), uuid::Error> { - /// let uuid = Uuid::parse_str("a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8")?; - /// assert_eq!( - /// uuid.as_u64_pair(), - /// (0xa1a2a3a4b1b2c1c2, 0xd1d2d3d4d5d6d7d8), - /// ); - /// # Ok(()) - /// # } - /// ``` - as-u64-pair: func(self: uuid) -> tuple; - /// Tests if the UUID is nil (all zeros). - is-nil: func(self: uuid) -> bool; - eq: func(self: uuid, other: non-nil-uuid) -> bool; - /// Returns a 128bit value containing the value. - /// The bytes in the UUID will be packed directly into a `u128`. - /// # Examples - /// ``` - /// # use uuid::Uuid; - /// # fn main() -> Result<(), uuid::Error> { - /// let uuid = Uuid::parse_str("a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8")?; - /// assert_eq!( - /// uuid.as_u128(), - /// 0xa1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8, - /// ); - /// # Ok(()) - /// # } - /// ``` - as-u128: func(self: uuid) -> u64; -} - -/// Methods for BlendState -interface blend-state { - use types.{reflect-reference}; - - assert-receiver-is-total-eq: func(self: blend-state); - clone: func(self: blend-state) -> blend-state; - eq: func(self: blend-state, other: blend-state) -> bool; -} - -/// Methods for TextureFormat -interface texture-format { - use types.{reflect-reference}; - - /// Returns the dimension of a [block](https://gpuweb.github.io/gpuweb/#texel-block) of texels. - /// Uncompressed formats have a block dimension of `(1, 1)`. - block-dimensions: func(self: texture-format) -> tuple; - /// Returns `true` for srgb formats. - is-srgb: func(self: texture-format) -> bool; - /// Returns `true` if the format is a combined depth-stencil format - /// see - is-combined-depth-stencil-format: func(self: texture-format) -> bool; - /// Adds an `Srgb` suffix to the given texture format, if the format supports it. - add-srgb-suffix: func(self: texture-format) -> texture-format; - /// Returns `true` if the format is a depth and/or stencil format - /// see - is-depth-stencil-format: func(self: texture-format) -> bool; - /// Returns `true` for BCn compressed formats. - is-bcn: func(self: texture-format) -> bool; - /// Returns the number of components this format has. - components: func(self: texture-format) -> u8; - clone: func(self: texture-format) -> texture-format; - /// Returns `true` if the format is a multi-planar format - is-multi-planar-format: func(self: texture-format) -> bool; - /// Returns `true` if the format has a depth aspect - has-depth-aspect: func(self: texture-format) -> bool; - /// Returns `true` for compressed formats. - is-compressed: func(self: texture-format) -> bool; - /// Returns `true` if the format has a color aspect - has-color-aspect: func(self: texture-format) -> bool; - /// Returns `true` if the format has a stencil aspect - has-stencil-aspect: func(self: texture-format) -> bool; - eq: func(self: texture-format, other: texture-format) -> bool; - /// Returns the size multiple requirement for a texture using this format. - size-multiple-requirement: func(self: texture-format) -> tuple; - assert-receiver-is-total-eq: func(self: texture-format); - /// Returns `true` if `self` is a depth or stencil component of the given - /// combined depth-stencil format - is-depth-stencil-component: func(self: texture-format, combined-format: texture-format) -> bool; - /// The number of bytes occupied per pixel in a color attachment - /// - target-pixel-byte-cost: func(self: texture-format) -> option; - /// Returns `true` for ASTC compressed formats. - is-astc: func(self: texture-format) -> bool; - /// Returns the number of planes a multi-planar format has. - planes: func(self: texture-format) -> option; - /// See - target-component-alignment: func(self: texture-format) -> option; - /// Strips the `Srgb` suffix from the given texture format. - remove-srgb-suffix: func(self: texture-format) -> texture-format; -} - -/// Global BMS functions -interface globals { - use types.{reflect-reference, component-registration, entity}; - - /// Attempts to construct the given type, given an arbitrary map of values. - construct: func(registration: script-type-registration, payload: list>) -> result, string>; - /// Logs a `Debug` level message to the console - /// * `message`: the message to log - log-debug: func(message: string); - /// Logs a `Error` level message to the console - /// * `message`: the message to log - log-error: func(message: string); - /// Logs a `Information` level message to the console - log-info: func(message: string); - /// Logs a `Trace` level message to the console - /// * `message`: the message to log - log-trace: func(message: string); - /// Logs a `Warning` level message to the console - /// * `message`: the message to log - log-warn: func(message: string); - /// Packs, a variable amount of values, into a single list. - pack-args: func(tuplea: string) -> list; - /// Registers a "frozen" callback handler, - /// - /// For example, this code: - /// - /// ```lua - /// register_callback("on_script_unloaded", my_unload_handler) - /// - /// function my_unload_handler() - /// print("handling unload!") - /// end - /// ``` - /// - /// would call the `my_unload_handler` function, whenever the `on_script_unloaded` callback is triggered, which is when your script is about to be unloaded. - /// - /// Registered callbacks take precedence over free-standing function callbacks, i.e. the below top level function: - /// ```lua - /// function on_script_unloaded() - /// print("freestanding unload handler!") - /// end - /// ``` - /// - /// would be a valid handler, but if a registered callback existed, it would be called instead. - register-callback: func(callback: string, function: string); - /// Creates a new script system builder, which can be used to add new systems to the world. - system-builder: func(callback: string, attachment: script-attachment) -> result; - /// Unpacks, a list of values, into many separate values. - unpack-args: func(values: list) -> string; -} - /// The BMS guest world - what a guest component must implement world bms-guest { - import globals; - import worlda; - import script-component-registration; - import script-query-builder; - import script-query-result; - import script-resource-registration; - import script-type-registration; - import script-system-builder; - import script-attachment; - import reflect-schedule; - import reflect-system; - import handle; - import reflect-reference; - import color; - import hsla; - import hsva; - import hwba; - import laba; - import lcha; - import linear-rgba; - import oklaba; - import oklcha; - import srgba; - import xyza; - import order-independent-transparency-settings; - import deferred-prepass-double-buffer; - import depth-prepass; - import depth-prepass-double-buffer; - import motion-vector-prepass; - import normal-prepass; - import skybox; - import deband-dither; - import tonemapping; - import component-ticks; - import tick; - import component-id; - import entity; - import entity-generation; - import entity-index; - import entity-hash; - import entity-hash-set; - import entity-index-set; - import default-query-filters; - import disabled; - import child-of; - import children; - import add; - import despawn; - import insert; - import remove; - import removed-component-entity; - import replace; - import name; - import button-state; - import axis-settings; - import button-axis-settings; - import button-settings; - import gamepad; - import gamepad-axis; - import gamepad-axis-changed-event; - import gamepad-button; - import gamepad-button-changed-event; - import gamepad-button-state-changed-event; - import gamepad-connection; - import gamepad-connection-event; - import gamepad-event; - import gamepad-input; - import gamepad-rumble-intensity; - import gamepad-rumble-request; - import gamepad-settings; - import raw-gamepad-axis-changed-event; - import raw-gamepad-button-changed-event; - import raw-gamepad-event; - import double-tap-gesture; - import pan-gesture; - import pinch-gesture; - import rotation-gesture; - import key; - import key-code; - import keyboard-focus-lost; - import keyboard-input; - import native-key; - import native-key-code; - import accumulated-mouse-motion; - import accumulated-mouse-scroll; - import mouse-button; - import mouse-button-input; - import mouse-motion; - import mouse-scroll-unit; - import mouse-wheel; - import force-touch; - import touch-input; - import touch-phase; - import aspect-ratio; - import aabb2d; - import bounding-circle; - import aabb3d; - import bounding-sphere; - import aabb-cast2d; - import bounding-circle-cast; - import ray-cast2d; - import aabb-cast3d; - import bounding-sphere-cast; - import ray-cast3d; - import compass-octant; - import compass-quadrant; - import ease-function; - import jump-at; - import interval; - import dir2; - import dir3; - import dir3-a; - import dir4; - import float-ord; - import isometry2d; - import isometry3d; - import annulus; - import arc2d; - import capsule2d; - import circle; - import circular-sector; - import circular-segment; - import convex-polygon; - import ellipse; - import line2d; - import plane2d; - import polygon; - import polyline2d; - import rectangle; - import regular-polygon; - import rhombus; - import segment2d; - import triangle2d; - import capsule3d; - import cone; - import conical-frustum; - import cuboid; - import cylinder; - import infinite-plane3d; - import line3d; - import plane3d; - import polyline3d; - import segment3d; - import sphere; - import tetrahedron; - import torus; - import triangle3d; - import ray2d; - import ray3d; - import irect; - import rect; - import urect; - import rot2; - import instant; - import fixed; - import real; - import stopwatch; - import timer; - import timer-mode; - import virtual; - import global-transform; - import transform; - import transform-tree-changed; - import static-transform-optimizations; - import type-id; - import socket-addr; - import range-full; - import atomic-bool; - import atomic-i16; - import atomic-i32; - import atomic-i64; - import atomic-i8; - import atomic-isize; - import atomic-u16; - import atomic-u32; - import atomic-u64; - import atomic-u8; - import atomic-usize; - import duration; - import affine2; - import affine3-a; - import bvec2; - import bvec3; - import bvec3-a; - import bvec4; - import bvec4-a; - import daffine2; - import daffine3; - import dmat2; - import dmat3; - import dmat4; - import dquat; - import dvec2; - import dvec3; - import dvec4; - import euler-rot; - import i16-vec2; - import i16-vec3; - import i16-vec4; - import i64-vec2; - import i64-vec3; - import i64-vec4; - import i8-vec2; - import i8-vec3; - import i8-vec4; - import ivec2; - import ivec3; - import ivec4; - import mat2; - import mat3; - import mat3-a; - import mat4; - import quat; - import u16-vec2; - import u16-vec3; - import u16-vec4; - import u64-vec2; - import u64-vec3; - import u64-vec4; - import u8-vec2; - import u8-vec3; - import u8-vec4; - import uvec2; - import uvec3; - import uvec4; - import vec2; - import vec3; - import vec3-a; - import vec4; - import smol-str; - import non-nil-uuid; - import uuid; - import blend-state; - import texture-format; - export on-script-loaded: func(); export on-script-unloaded: func(); export on-update: func(); + export on-custom-event: func(); } diff --git a/crates/languages/bevy_mod_scripting_wasmtime/Cargo.toml b/crates/languages/bevy_mod_scripting_wasmtime/Cargo.toml index 7c72187be5..71082403cc 100644 --- a/crates/languages/bevy_mod_scripting_wasmtime/Cargo.toml +++ b/crates/languages/bevy_mod_scripting_wasmtime/Cargo.toml @@ -19,7 +19,8 @@ bevy_app = { workspace = true } bevy_ecs = { workspace = true } bevy_log = { workspace = true } parking_lot = { workspace = true } -wasmtime = { version = "27", features = ["cranelift"] } +wasmtime = { version = "44", features = ["cranelift"] } +wasmtime-wasi = { version = "44" } # Right version ? slotmap = "1" serde = { version = "1.0", features = ["derive"] } anyhow = { workspace = true } diff --git a/crates/languages/bevy_mod_scripting_wasmtime/src/lib.rs b/crates/languages/bevy_mod_scripting_wasmtime/src/lib.rs index 52379d758e..948c049ae5 100644 --- a/crates/languages/bevy_mod_scripting_wasmtime/src/lib.rs +++ b/crates/languages/bevy_mod_scripting_wasmtime/src/lib.rs @@ -16,7 +16,7 @@ use std::{any::TypeId, collections::HashMap, sync::Arc}; use bevy_app::{App, Plugin}; use bevy_ecs::{reflect::AppTypeRegistry, world::WorldId}; -use bevy_log::{error, trace}; +use bevy_log::{error, info, trace}; use bevy_mod_scripting_asset::{Language, ScriptAsset}; use bevy_mod_scripting_bindings::{ AppScriptGlobalsRegistry, InteropError, Namespace, ReflectReference, ScriptValue, @@ -39,6 +39,7 @@ use wasmtime::{ Store, component::{Component, Instance, Linker, Val}, }; +use wasmtime_wasi::{ResourceTable, WasiCtx, WasiCtxBuilder, WasiCtxView, WasiView}; make_plugin_config_static!(WasmtimeScriptingPlugin); @@ -55,6 +56,17 @@ pub struct WasmtimeStoreData { resources: HashMap, next_id: u32, world_id: WorldId, + wasi_ctx: WasiCtx, + resource_table: ResourceTable, +} + +impl WasiView for WasmtimeStoreData { + fn ctx(&mut self) -> wasmtime_wasi::WasiCtxView<'_> { + WasiCtxView { + ctx: &mut self.wasi_ctx, + table: &mut self.resource_table, + } + } } impl WasmtimeStoreData { @@ -63,6 +75,8 @@ impl WasmtimeStoreData { resources: HashMap::new(), next_id: 1, world_id, + wasi_ctx: WasiCtxBuilder::new().inherit_stdio().build(), + resource_table: ResourceTable::new(), } } @@ -237,9 +251,10 @@ fn build_linker( .func_new( &func_name, move |mut store: wasmtime::StoreContextMut, + _, args: &[Val], results: &mut [Val]| - -> anyhow::Result<()> { + -> wasmtime::error::Result<()> { let script_args: Vec = args .iter() .map(|v| val_to_script_value(v, store.data_mut())) @@ -249,7 +264,7 @@ fn build_linker( let result = func_clone .call(script_args, ctx) - .map_err(|e| anyhow::anyhow!("{e:?}"))?; + .map_err(|e| wasmtime::error::format_err!("{e:?}"))?; if !results.is_empty() { results[0] = script_value_to_val(result, store.data_mut()); @@ -262,10 +277,12 @@ fn build_linker( } } + wasmtime_wasi::p2::add_to_linker_sync(&mut linker).map_err(to_interop_error)?; + Ok(linker) } -fn to_interop_error(error: anyhow::Error) -> InteropError { +fn to_interop_error(error: wasmtime::Error) -> InteropError { InteropError::external_boxed(error.into_boxed_dyn_error()) } @@ -359,13 +376,17 @@ pub fn wasmtime_handler( .try_for_each(|init| init(context_key, context))?; // Get the exported function by callback name - let func = context - .instance - .get_func(&mut context.store, callback_label.as_ref()); + let func = context.instance.get_func( + &mut context.store, + &callback_label.as_ref().replace("_", "-"), + ); + println!("{func:?}"); + // .and_then(|(item, f)| context.instance.get_func(&mut context.store, f)); + let func = match func { Some(f) => f, None => { - trace!( + info!( "Context {} is not subscribed to callback {}", context_key, callback_label.as_ref() @@ -381,7 +402,7 @@ pub fn wasmtime_handler( .collect(); // Call the function - let mut output_vals = vec![Val::Tuple(vec![])]; // Placeholder for result + let mut output_vals = vec![]; // Placeholder for result func.call(&mut context.store, &input_vals, &mut output_vals) .map_err(|e| to_interop_error(e))?; diff --git a/examples/run_wasm.rs b/examples/run_wasm.rs index 12e3c5de71..a8f5e4638d 100644 --- a/examples/run_wasm.rs +++ b/examples/run_wasm.rs @@ -12,13 +12,22 @@ use bevy_mod_scripting_core::event::ScriptCallbackResponseEvent; fn main() { App::new() + .add_plugins(DefaultPlugins) + .add_plugins(BMSPlugin) .add_plugins(( - DefaultPlugins, // Add the wasmtime scripting plugin WasmtimeScriptingPlugin::default(), )) .add_systems(Startup, setup) - .add_systems(Update, (trigger_events, handle_script_events)) + .add_systems( + Update, + ( + trigger_events, + event_handler::, + handle_script_responses, + ) + .chain(), + ) .run(); } @@ -28,7 +37,7 @@ fn setup(mut commands: Commands, asset_server: Res) { // Load the WASM component script // This should be a .component.wasm file compiled from a guest crate - let wasm_handle: Handle = asset_server.load("scripts/example.component.wasm"); + let wasm_handle: Handle = asset_server.load("scripts/bms_wasm_guest.wasm"); // Spawn an entity and attach the WASM script to it commands.spawn(( @@ -40,6 +49,9 @@ fn setup(mut commands: Commands, asset_server: Res) { println!("WASM script loaded and attached to entity"); } +// Define a callback label +callback_labels!(OnCustomEvent => "on_custom_event"); + /// System that triggers events for scripts to handle fn trigger_events(mut writer: MessageWriter) { // Send a custom event every 60 frames (approximately 1 second at 60 FPS) @@ -49,20 +61,17 @@ fn trigger_events(mut writer: MessageWriter) { if FRAME_COUNTER % 60 == 0 { println!("Triggering script event..."); - // Define a callback label - callback_labels!(OnCustomEvent => "on_custom_event"); - // Send the event to all scripts - writer.send(ScriptCallbackEvent::new_for_all_scripts( + writer.write(ScriptCallbackEvent::new_for_all_scripts( OnCustomEvent, - vec![ScriptValue::String("Hello from Rust!".into())], + vec![], )); } } } /// System that handles responses from scripts -fn handle_script_events(mut reader: MessageReader) { +fn handle_script_responses(mut reader: MessageReader) { for event in reader.read() { match &event.response { Ok(value) => { diff --git a/guest_crate/bindings.wit b/guest_crate/bindings.wit index cf3264bbd4..0867919563 100644 --- a/guest_crate/bindings.wit +++ b/guest_crate/bindings.wit @@ -1,14415 +1,10 @@ package bms:scripting@0.1.0; -/// Methods for World -interface worlda { - use types.{reflect-reference}; - - /// Checks if the given entity exists. - has-entity: func(e: entity) -> result; - /// Retrieves the resource with the given registration. - get-resource: func(registration: script-resource-registration) -> result>, string>; - /// Registers a new component type with the world. - /// - /// The component will behave like any other native component for all intents and purposes. - /// The type that will be instantiated to back this component will be `DynamicComponent` which contains just one field: - /// - `data` - /// - /// This field can be set to any value and modified freely. - register-new-component: func(name: string) -> result; - /// Removes the given resource from the world. - remove-resource: func(registration: script-resource-registration) -> result<_, string>; - /// Checks if the given entity has the given component. - has-component: func(entity: entity, registration: script-component-registration) -> result; - /// Creates a new `ScriptQueryBuilder` which can be used to query the ECS. - /// - /// Returns: - /// * `query`: The new query builder. - query: func() -> result; - /// Inserts the given component value into the provided entity - insert-component: func(entity: entity, registration: script-component-registration, value: borrow) -> result<_, string>; - /// Pushes the given children entities into the provided parent entity. - push-children: func(entity: entity, children: list) -> result<_, string>; - /// Removes the given component from the entity. - remove-component: func(entity: entity, registration: script-component-registration) -> result<_, string>; - /// Adds the given system to the world. - add-system: func(schedule: reflect-schedule, builder: script-system-builder) -> result; - /// Despawn the descendants of the given entity. - despawn-descendants: func(entity: entity) -> result<_, string>; - /// Checks if the world has the given resource. - has-resource: func(registration: script-resource-registration) -> result; - /// Retrieves the children of the given entity. - get-children: func(entity: entity) -> result, string>; - /// Tries to retrieve the given component type on an entity. - get-component: func(entity: entity, registration: script-component-registration) -> result>, string>; - /// Retrieves an asset by its handle and asset type registration. - get-asset: func(handle-reference: borrow, registration: script-type-registration) -> result>, string>; - /// Checks if can get asset handle - has-asset: func(handle-reference: borrow) -> result; - /// Despawns the given entity. - despawn: func(entity: entity) -> result<_, string>; - /// Despawns the entity and all its descendants. - despawn-recursive: func(entity: entity) -> result<_, string>; - /// Retrieves the schedule with the given name, Also ensures the schedule is initialized before returning it. - /// - /// Schedules in bevy are "containers" for systems, each schedule runs separately and contains different systems. - /// - /// By default among others bevy contains the following schedules: - /// - `Update`: Runs every frame. - /// - `PostUpdate`: Runs after the `Update` schedule. - /// - `FixedUpdate`: Runs at a fixed rate. - get-schedule-by-name: func(name: string) -> result, string>; - /// Adds the given resource to the world. - add-default-component: func(entity: entity, registration: script-component-registration) -> result<_, string>; - /// Inserts the given children entities into the provided parent entity. - insert-children: func(entity: entity, index: u64, children: list) -> result<_, string>; - /// Returns either a `ScriptComponentRegistration` or `ScriptResourceRegistration` depending on the type of the type requested. - /// If the type is neither returns a `ScriptTypeRegistration`. - get-type-by-name: func(type-name: string) -> result, string>; - /// Retrieves the parent of the given entity. - get-parent: func(entity: entity) -> result, string>; - /// Spawns a new entity and returns it - spawn: func() -> result; - /// Quits the program. - exit: func() -> result<_, string>; -} - -/// Methods for ScriptComponentRegistration -interface script-component-registration { - use types.{reflect-reference}; - - /// Retrieves the name of the type. - type-name: func(registration: script-component-registration) -> string; - /// Retrieves the short name of the type. - /// The short name is a more human-readable version of the type name. - short-name: func(registration: script-component-registration) -> string; -} - -/// Methods for ScriptQueryBuilder -interface script-query-builder { - use types.{reflect-reference}; - - /// Adds a component to filter the query by. This component will NOT be retrieved. - witha: func(query: script-query-builder, witha: script-component-registration) -> script-query-builder; - /// Adds a component to filter the query by. This component will NOT be retrieved. - without: func(query: script-query-builder, without: script-component-registration) -> script-query-builder; - /// Adds a component to be retrieved by the query - component: func(query: script-query-builder, components: script-component-registration) -> script-query-builder; - /// Builds the query and retrieves the entities and component references. - build: func(query: script-query-builder) -> result, string>; -} - -/// Methods for ScriptQueryResult -interface script-query-result { - use types.{reflect-reference}; - - /// Retrieves the entity from the query result. - entity: func(query: script-query-result) -> entity; - /// Retrieves the components from the query result. - /// - /// These are ordered by the order they were added to the query. - components: func(query: script-query-result) -> list>; -} - -/// Methods for ScriptResourceRegistration -interface script-resource-registration { - use types.{reflect-reference}; - - /// Retrieves the name of the type. - type-name: func(registration: script-resource-registration) -> string; - /// Retrieves the short name of the type. - /// The short name is a more human-readable version of the type name. - short-name: func(registration: script-resource-registration) -> string; -} - -/// Methods for ScriptTypeRegistration -interface script-type-registration { - use types.{reflect-reference}; - - /// Retrieves the name of the type. - type-name: func(registration: script-type-registration) -> string; - /// Retrieves the short name of the type. - /// The short name is a more human-readable version of the type name. - short-name: func(registration: script-type-registration) -> string; -} - -/// Methods for ScriptSystemBuilder -interface script-system-builder { - use types.{reflect-reference}; - - /// Specifies the system is to run *before* the given system. - /// - /// Note: this is an experimental feature, and the ordering might not work correctly for script initialized systems - before: func(builder: script-system-builder, system: reflect-system) -> script-system-builder; - /// Adds a query to the system builder. - query: func(builder: script-system-builder, query: script-query-builder) -> result; - /// Specifies the system is to run exclusively, meaning it can access anything, but will not run in parallel with other systems. - exclusive: func(builder: script-system-builder) -> script-system-builder; - /// Specifies the system is to run *after* the given system - /// - /// Note: this is an experimental feature, and the ordering might not work correctly for script initialized systems - after: func(builder: script-system-builder, system: reflect-system) -> script-system-builder; - /// Requests the system have access to the given resource. The resource will be added to the - /// list of arguments of the callback in the order they're provided. - resourcea: func(builder: script-system-builder, resourcea: script-resource-registration) -> script-system-builder; -} - -/// Methods for ScriptAttachment -interface script-attachment { - use types.{reflect-reference}; - - /// Creates a new script attachment descriptor for an entity attached script. - new-entity-script: func(entity: entity, script: handle) -> result; - /// Creates a new script attachment descriptor from a script asset. - /// - new-static-script: func(script: handle) -> result; -} - -/// Methods for ReflectSchedule -interface reflect-schedule { - use types.{reflect-reference}; - - /// Retrieves all the systems in the schedule. - systems: func(schedule: reflect-schedule) -> result, string>; - /// Retrieves the system with the given name in the schedule - get-system-by-name: func(schedule: reflect-schedule, name: string) -> result, string>; - /// Renders the schedule as a dot graph string. - /// - /// Useful for debugging scheduling. - render-dot: func(schedule: reflect-schedule) -> result; -} - -/// Methods for ReflectSystem -interface reflect-system { - use types.{reflect-reference}; - - /// Retrieves the identifier of the system - identifier: func(system: reflect-system) -> string; - /// Retrieves the full path of the system - path: func(system: reflect-system) -> string; -} - -/// Methods for Handle -interface handle { - use types.{reflect-reference}; - - /// Retrieves the path of the script asset if present. - /// Assets can be unloaded, and as such if the given handle is no longer active, this will return `None`. - asset-path: func(handle: handle) -> option; -} - -/// Methods for Color -interface color { - use types.{reflect-reference}; - - /// Creates a new [`Color`] object storing a [`Oklaba`] color. - oklaba: func(lightness: f32, a: f32, b: f32, alpha: f32) -> color; - /// Creates a new [`Color`] object storing a [`Lcha`] color. - lcha: func(lightness: f32, chroma: f32, hue: f32, alpha: f32) -> color; - /// Creates a new [`Color`] object storing a [`LinearRgba`] color with an alpha of 1.0. - linear-rgb: func(red: f32, green: f32, blue: f32) -> color; - /// Creates a new [`Color`] object storing a [`Hwba`] color. - hwba: func(hue: f32, whiteness: f32, blackness: f32, alpha: f32) -> color; - /// Creates a new [`Color`] object storing a [`Hsla`] color. - hsla: func(hue: f32, saturation: f32, lightness: f32, alpha: f32) -> color; - /// Creates a new [`Color`] object storing a [`Srgba`] color. - srgba: func(red: f32, green: f32, blue: f32, alpha: f32) -> color; - /// Creates a new [`Color`] object storing a [`LinearRgba`] color. - linear-rgba: func(red: f32, green: f32, blue: f32, alpha: f32) -> color; - eq: func(self: color, other: color) -> bool; - /// Creates a new [`Color`] object storing a [`Oklcha`] color. - oklcha: func(lightness: f32, chroma: f32, hue: f32, alpha: f32) -> color; - /// Creates a new [`Color`] object storing a [`Hsla`] color with an alpha of 1.0. - hsl: func(hue: f32, saturation: f32, lightness: f32) -> color; - /// Return the color as an SRGBA color. - to-srgba: func(self: color) -> srgba; - /// Creates a new [`Color`] object storing a [`Srgba`] color with an alpha of 1.0. - srgb: func(red: f32, green: f32, blue: f32) -> color; - /// Creates a new [`Color`] object storing a [`Hsva`] color with an alpha of 1.0. - hsv: func(hue: f32, saturation: f32, value: f32) -> color; - clone: func(self: color) -> color; - /// Creates a new [`Color`] object storing a [`Laba`] color with an alpha of 1.0. - lab: func(lightness: f32, a: f32, b: f32) -> color; - /// Creates a new [`Color`] object storing a [`Laba`] color. - laba: func(lightness: f32, a: f32, b: f32, alpha: f32) -> color; - /// Creates a new [`Color`] object storing a [`Lcha`] color with an alpha of 1.0. - lch: func(lightness: f32, chroma: f32, hue: f32) -> color; - /// Creates a new [`Color`] object storing a [`Hsva`] color. - hsva: func(hue: f32, saturation: f32, value: f32, alpha: f32) -> color; - /// Creates a new [`Color`] object storing a [`Oklcha`] color with an alpha of 1.0. - oklch: func(lightness: f32, chroma: f32, hue: f32) -> color; - /// Return the color as a linear RGBA color. - to-linear: func(self: color) -> linear-rgba; - /// Creates a new [`Color`] object storing a [`Xyza`] color. - xyza: func(x: f32, y: f32, z: f32, alpha: f32) -> color; - /// Reads an array of floats to creates a new [`Color`] object storing a [`Srgba`] color with an alpha of 1.0. - srgb-from-array: func(array: list) -> color; - /// Creates a new [`Color`] object storing a [`Xyza`] color with an alpha of 1.0. - xyz: func(x: f32, y: f32, z: f32) -> color; - /// Creates a new [`Color`] object storing a [`Srgba`] color from [`u8`] values with an alpha of 1.0. - srgb-u8: func(red: u8, green: u8, blue: u8) -> color; - /// Creates a new [`Color`] object storing a [`Hwba`] color with an alpha of 1.0. - hwb: func(hue: f32, whiteness: f32, blackness: f32) -> color; - /// Creates a new [`Color`] object storing a [`Srgba`] color from [`u8`] values. - srgba-u8: func(red: u8, green: u8, blue: u8, alpha: u8) -> color; - /// Creates a new [`Color`] object storing a [`Oklaba`] color with an alpha of 1.0. - oklab: func(lightness: f32, a: f32, b: f32) -> color; -} - -/// Methods for Hsla -interface hsla { - use types.{reflect-reference}; - - clone: func(self: hsla) -> hsla; - /// Generate a deterministic but [quasi-randomly distributed](https://en.wikipedia.org/wiki/Low-discrepancy_sequence) - /// color from a provided `index`. - /// This can be helpful for generating debug colors. - /// # Examples - /// ```rust - /// # use bevy_color::Hsla; - /// // Unique color for an entity - /// # let entity_index = 123; - /// // let entity_index = entity.index(); - /// let color = Hsla::sequential_dispersed(entity_index); - /// // Palette with 5 distinct hues - /// let palette = (0..5).map(Hsla::sequential_dispersed).collect::>(); - /// ``` - sequential-dispersed: func(index: u32) -> hsla; - /// Construct a new [`Hsla`] color from (h, s, l) components, with the default alpha (1.0). - hsl: func(hue: f32, saturation: f32, lightness: f32) -> hsla; - /// Return a copy of this color with the lightness channel set to the given value. - with-lightness: func(self: hsla, lightness: f32) -> hsla; - eq: func(self: hsla, other: hsla) -> bool; - /// Construct a new [`Hsla`] color from components. - new: func(hue: f32, saturation: f32, lightness: f32, alpha: f32) -> hsla; - /// Return a copy of this color with the saturation channel set to the given value. - with-saturation: func(self: hsla, saturation: f32) -> hsla; -} - -/// Methods for Hsva -interface hsva { - use types.{reflect-reference}; - - /// Return a copy of this color with the value channel set to the given value. - with-value: func(self: hsva, value: f32) -> hsva; - /// Construct a new [`Hsva`] color from (h, s, v) components, with the default alpha (1.0). - hsv: func(hue: f32, saturation: f32, value: f32) -> hsva; - /// Construct a new [`Hsva`] color from components. - new: func(hue: f32, saturation: f32, value: f32, alpha: f32) -> hsva; - eq: func(self: hsva, other: hsva) -> bool; - clone: func(self: hsva) -> hsva; - /// Return a copy of this color with the saturation channel set to the given value. - with-saturation: func(self: hsva, saturation: f32) -> hsva; -} - -/// Methods for Hwba -interface hwba { - use types.{reflect-reference}; - - /// Return a copy of this color with the blackness channel set to the given value. - with-blackness: func(self: hwba, blackness: f32) -> hwba; - eq: func(self: hwba, other: hwba) -> bool; - /// Construct a new [`Hwba`] color from components. - new: func(hue: f32, whiteness: f32, blackness: f32, alpha: f32) -> hwba; - /// Construct a new [`Hwba`] color from (h, s, l) components, with the default alpha (1.0). - hwb: func(hue: f32, whiteness: f32, blackness: f32) -> hwba; - clone: func(self: hwba) -> hwba; - /// Return a copy of this color with the whiteness channel set to the given value. - with-whiteness: func(self: hwba, whiteness: f32) -> hwba; -} - -/// Methods for Laba -interface laba { - use types.{reflect-reference}; - - eq: func(self: laba, other: laba) -> bool; - sub: func(self: laba, rhs: laba) -> laba; - add: func(self: laba, rhs: laba) -> laba; - neg: func(self: laba) -> laba; - /// Construct a new [`Laba`] color from (l, a, b) components, with the default alpha (1.0). - lab: func(lightness: f32, a: f32, b: f32) -> laba; - /// Return a copy of this color with the lightness channel set to the given value. - with-lightness: func(self: laba, lightness: f32) -> laba; - mul: func(self: laba, rhs: f32) -> laba; - /// Construct a new [`Laba`] color from components. - new: func(lightness: f32, a: f32, b: f32, alpha: f32) -> laba; - clone: func(self: laba) -> laba; - div: func(self: laba, rhs: f32) -> laba; -} - -/// Methods for Lcha -interface lcha { - use types.{reflect-reference}; - - /// Return a copy of this color with the chroma channel set to the given value. - with-chroma: func(self: lcha, chroma: f32) -> lcha; - /// Generate a deterministic but [quasi-randomly distributed](https://en.wikipedia.org/wiki/Low-discrepancy_sequence) - /// color from a provided `index`. - /// This can be helpful for generating debug colors. - /// # Examples - /// ```rust - /// # use bevy_color::Lcha; - /// // Unique color for an entity - /// # let entity_index = 123; - /// // let entity_index = entity.index(); - /// let color = Lcha::sequential_dispersed(entity_index); - /// // Palette with 5 distinct hues - /// let palette = (0..5).map(Lcha::sequential_dispersed).collect::>(); - /// ``` - sequential-dispersed: func(index: u32) -> lcha; - eq: func(self: lcha, other: lcha) -> bool; - /// Return a copy of this color with the lightness channel set to the given value. - with-lightness: func(self: lcha, lightness: f32) -> lcha; - clone: func(self: lcha) -> lcha; - /// Construct a new [`Lcha`] color from components. - new: func(lightness: f32, chroma: f32, hue: f32, alpha: f32) -> lcha; - /// Construct a new [`Lcha`] color from (h, s, l) components, with the default alpha (1.0). - lch: func(lightness: f32, chroma: f32, hue: f32) -> lcha; -} - -/// Methods for LinearRgba -interface linear-rgba { - use types.{reflect-reference}; - - /// Construct a new [`LinearRgba`] color from components. - new: func(red: f32, green: f32, blue: f32, alpha: f32) -> linear-rgba; - /// Return a copy of this color with the blue channel set to the given value. - with-blue: func(self: linear-rgba, blue: f32) -> linear-rgba; - sub: func(self: linear-rgba, rhs: linear-rgba) -> linear-rgba; - mul: func(self: linear-rgba, rhs: f32) -> linear-rgba; - eq: func(self: linear-rgba, other: linear-rgba) -> bool; - /// Converts this color to a u32. - /// Maps the RGBA channels in RGBA order to a little-endian byte array (GPUs are little-endian). - /// `A` will be the most significant byte and `R` the least significant. - as-u32: func(self: linear-rgba) -> u32; - add: func(self: linear-rgba, rhs: linear-rgba) -> linear-rgba; - /// Return a copy of this color with the red channel set to the given value. - with-red: func(self: linear-rgba, red: f32) -> linear-rgba; - clone: func(self: linear-rgba) -> linear-rgba; - neg: func(self: linear-rgba) -> linear-rgba; - /// Construct a new [`LinearRgba`] color from (r, g, b) components, with the default alpha (1.0). - rgb: func(red: f32, green: f32, blue: f32) -> linear-rgba; - div: func(self: linear-rgba, rhs: f32) -> linear-rgba; - /// Return a copy of this color with the green channel set to the given value. - with-green: func(self: linear-rgba, green: f32) -> linear-rgba; -} - -/// Methods for Oklaba -interface oklaba { - use types.{reflect-reference}; - - /// Construct a new [`Oklaba`] color from components. - new: func(lightness: f32, a: f32, b: f32, alpha: f32) -> oklaba; - /// Return a copy of this color with the 'lightness' channel set to the given value. - with-lightness: func(self: oklaba, lightness: f32) -> oklaba; - neg: func(self: oklaba) -> oklaba; - /// Construct a new [`Oklaba`] color from (l, a, b) components, with the default alpha (1.0). - lab: func(lightness: f32, a: f32, b: f32) -> oklaba; - /// Return a copy of this color with the 'b' channel set to the given value. - with-b: func(self: oklaba, b: f32) -> oklaba; - /// Return a copy of this color with the 'a' channel set to the given value. - with-a: func(self: oklaba, a: f32) -> oklaba; - div: func(self: oklaba, rhs: f32) -> oklaba; - sub: func(self: oklaba, rhs: oklaba) -> oklaba; - add: func(self: oklaba, rhs: oklaba) -> oklaba; - mul: func(self: oklaba, rhs: f32) -> oklaba; - clone: func(self: oklaba) -> oklaba; - eq: func(self: oklaba, other: oklaba) -> bool; -} - -/// Methods for Oklcha -interface oklcha { - use types.{reflect-reference}; - - /// Generate a deterministic but [quasi-randomly distributed](https://en.wikipedia.org/wiki/Low-discrepancy_sequence) - /// color from a provided `index`. - /// This can be helpful for generating debug colors. - /// # Examples - /// ```rust - /// # use bevy_color::Oklcha; - /// // Unique color for an entity - /// # let entity_index = 123; - /// // let entity_index = entity.index(); - /// let color = Oklcha::sequential_dispersed(entity_index); - /// // Palette with 5 distinct hues - /// let palette = (0..5).map(Oklcha::sequential_dispersed).collect::>(); - /// ``` - sequential-dispersed: func(index: u32) -> oklcha; - /// Construct a new [`Oklcha`] color from components. - new: func(lightness: f32, chroma: f32, hue: f32, alpha: f32) -> oklcha; - /// Return a copy of this color with the 'chroma' channel set to the given value. - with-chroma: func(self: oklcha, chroma: f32) -> oklcha; - /// Construct a new [`Oklcha`] color from (l, c, h) components, with the default alpha (1.0). - lch: func(lightness: f32, chroma: f32, hue: f32) -> oklcha; - clone: func(self: oklcha) -> oklcha; - eq: func(self: oklcha, other: oklcha) -> bool; - /// Return a copy of this color with the 'lightness' channel set to the given value. - with-lightness: func(self: oklcha, lightness: f32) -> oklcha; -} - -/// Methods for Srgba -interface srgba { - use types.{reflect-reference}; - - div: func(self: srgba, rhs: f32) -> srgba; - /// Converts a non-linear sRGB value to a linear one via [gamma correction](https://en.wikipedia.org/wiki/Gamma_correction). - gamma-function: func(value: f32) -> f32; - /// New `Srgba` from sRGB colorspace. - /// See also [`Srgba::new`], [`Srgba::rgba_u8`], [`Srgba::hex`]. - rgb-u8: func(r: u8, g: u8, b: u8) -> srgba; - mul: func(self: srgba, rhs: f32) -> srgba; - /// Construct a new [`Srgba`] color from components. - new: func(red: f32, green: f32, blue: f32, alpha: f32) -> srgba; - /// Construct a new [`Srgba`] color from (r, g, b) components, with the default alpha (1.0). - rgb: func(red: f32, green: f32, blue: f32) -> srgba; - sub: func(self: srgba, rhs: srgba) -> srgba; - /// Converts a linear sRGB value to a non-linear one via [gamma correction](https://en.wikipedia.org/wiki/Gamma_correction). - gamma-function-inverse: func(value: f32) -> f32; - neg: func(self: srgba) -> srgba; - /// New `Srgba` from sRGB colorspace. - /// See also [`Srgba::new`], [`Srgba::rgb_u8`], [`Srgba::hex`]. - rgba-u8: func(r: u8, g: u8, b: u8, a: u8) -> srgba; - /// Convert this color to CSS-style hexadecimal notation. - to-hex: func(self: srgba) -> string; - eq: func(self: srgba, other: srgba) -> bool; - /// Return a copy of this color with the green channel set to the given value. - with-green: func(self: srgba, green: f32) -> srgba; - add: func(self: srgba, rhs: srgba) -> srgba; - /// Return a copy of this color with the blue channel set to the given value. - with-blue: func(self: srgba, blue: f32) -> srgba; - /// Return a copy of this color with the red channel set to the given value. - with-red: func(self: srgba, red: f32) -> srgba; - clone: func(self: srgba) -> srgba; -} - -/// Methods for Xyza -interface xyza { - use types.{reflect-reference}; - - /// Construct a new [`Xyza`] color from components. - new: func(x: f32, y: f32, z: f32, alpha: f32) -> xyza; - /// Return a copy of this color with the 'y' channel set to the given value. - with-y: func(self: xyza, y: f32) -> xyza; - sub: func(self: xyza, rhs: xyza) -> xyza; - clone: func(self: xyza) -> xyza; - /// Return a copy of this color with the 'x' channel set to the given value. - with-x: func(self: xyza, x: f32) -> xyza; - eq: func(self: xyza, other: xyza) -> bool; - div: func(self: xyza, rhs: f32) -> xyza; - neg: func(self: xyza) -> xyza; - /// Return a copy of this color with the 'z' channel set to the given value. - with-z: func(self: xyza, z: f32) -> xyza; - /// Construct a new [`Xyza`] color from (x, y, z) components, with the default alpha (1.0). - xyz: func(x: f32, y: f32, z: f32) -> xyza; - mul: func(self: xyza, rhs: f32) -> xyza; - add: func(self: xyza, rhs: xyza) -> xyza; -} - -/// Methods for OrderIndependentTransparencySettings -interface order-independent-transparency-settings { - use types.{reflect-reference}; - - clone: func(self: order-independent-transparency-settings) -> order-independent-transparency-settings; -} - -/// Methods for DeferredPrepassDoubleBuffer -interface deferred-prepass-double-buffer { - use types.{reflect-reference}; - - clone: func(self: deferred-prepass-double-buffer) -> deferred-prepass-double-buffer; -} - -/// Methods for DepthPrepass -interface depth-prepass { - use types.{reflect-reference}; - - clone: func(self: depth-prepass) -> depth-prepass; -} - -/// Methods for DepthPrepassDoubleBuffer -interface depth-prepass-double-buffer { - use types.{reflect-reference}; - - clone: func(self: depth-prepass-double-buffer) -> depth-prepass-double-buffer; -} - -/// Methods for MotionVectorPrepass -interface motion-vector-prepass { - use types.{reflect-reference}; - - clone: func(self: motion-vector-prepass) -> motion-vector-prepass; -} - -/// Methods for NormalPrepass -interface normal-prepass { - use types.{reflect-reference}; - - clone: func(self: normal-prepass) -> normal-prepass; -} - -/// Methods for Skybox -interface skybox { - use types.{reflect-reference}; - - clone: func(self: skybox) -> skybox; -} - -/// Methods for DebandDither -interface deband-dither { - use types.{reflect-reference}; - - clone: func(self: deband-dither) -> deband-dither; - assert-receiver-is-total-eq: func(self: deband-dither); - eq: func(self: deband-dither, other: deband-dither) -> bool; -} - -/// Methods for Tonemapping -interface tonemapping { - use types.{reflect-reference}; - - eq: func(self: tonemapping, other: tonemapping) -> bool; - is-enabled: func(self: tonemapping) -> bool; - clone: func(self: tonemapping) -> tonemapping; - assert-receiver-is-total-eq: func(self: tonemapping); -} - -/// Methods for ComponentTicks -interface component-ticks { - use types.{reflect-reference}; - - /// Creates a new instance with the same change tick for `added` and `changed`. - new: func(change-tick: tick) -> component-ticks; - /// Returns `true` if the component or resource was added or mutably dereferenced after the system last ran - /// (or the system is running for the first time). - is-changed: func(self: component-ticks, last-run: tick, this-run: tick) -> bool; - /// Manually sets the change tick. - /// This is normally done automatically via the [`DerefMut`](core::ops::DerefMut) implementation - /// on [`Mut`](crate::change_detection::Mut), [`ResMut`](crate::change_detection::ResMut), etc. - /// However, components and resources that make use of interior mutability might require manual updates. - /// # Example - /// ```no_run - /// # use bevy_ecs::{world::World, change_detection::ComponentTicks}; - /// let world: World = unimplemented!(); - /// let component_ticks: ComponentTicks = unimplemented!(); - /// component_ticks.set_changed(world.read_change_tick()); - /// ``` - set-changed: func(self: component-ticks, change-tick: tick); - /// Returns `true` if the component or resource was added after the system last ran - /// (or the system is running for the first time). - is-added: func(self: component-ticks, last-run: tick, this-run: tick) -> bool; - clone: func(self: component-ticks) -> component-ticks; -} - -/// Methods for Tick -interface tick { - use types.{reflect-reference}; - - /// Gets the value of this change tick. - get: func(self: tick) -> u32; - /// Creates a new [`Tick`] wrapping the given value. - new: func(tick: u32) -> tick; - clone: func(self: tick) -> tick; - /// Sets the value of this change tick. - set: func(self: tick, tick: u32); - eq: func(self: tick, other: tick) -> bool; - /// Returns `true` if this `Tick` occurred since the system's `last_run`. - /// `this_run` is the current tick of the system, used as a reference to help deal with wraparound. - is-newer-than: func(self: tick, last-run: tick, this-run: tick) -> bool; - assert-receiver-is-total-eq: func(self: tick); -} - -/// Methods for ComponentId -interface component-id { - use types.{reflect-reference}; - - assert-receiver-is-total-eq: func(self: component-id); - /// Returns the index of the current component. - index: func(self: component-id) -> u64; - clone: func(self: component-id) -> component-id; - /// Creates a new [`ComponentId`]. - /// The `index` is a unique value associated with each type of component in a given world. - /// Usually, this value is taken from a counter incremented for each type of component registered with the world. - new: func(index: u64) -> component-id; - eq: func(self: component-id, other: component-id) -> bool; -} - -/// Methods for Entity -interface entity { - use types.{reflect-reference}; - - clone: func(self: entity) -> entity; - /// Returns the generation of this Entity's index. The generation is incremented each time an - /// entity with a given index is despawned. This serves as a "count" of the number of times a - /// given index has been reused (index, generation) pairs uniquely identify a given Entity. - generation: func(self: entity) -> entity-generation; - /// Convert to a form convenient for passing outside of rust. - /// Only useful for identifying entities within the same instance of an application. Do not use - /// for serialization between runs. - /// No particular structure is guaranteed for the returned bits. - to-bits: func(self: entity) -> u64; - /// Creates a new instance with the given index and generation. - from-index-and-generation: func(index: entity-index, generation: entity-generation) -> entity; - /// Reconstruct an `Entity` previously destructured with [`Entity::to_bits`]. - /// Only useful when applied to results from `to_bits` in the same instance of an application. - /// # Panics - /// This method will likely panic if given `u64` values that did not come from [`Entity::to_bits`]. - from-bits: func(bits: u64) -> entity; - /// Equivalent to `self.index().index()`. See [`Self::index`] for details. - index-u32: func(self: entity) -> u32; - /// Creates a new entity ID with the specified `index` and an unspecified generation. - /// # Note - /// Spawning a specific `entity` value is __rarely the right choice__. Most apps should favor - /// [`Commands::spawn`](crate::system::Commands::spawn). This method should generally - /// only be used for sharing entities across apps, and only when they have a scheme - /// worked out to share an index space (which doesn't happen by default). - /// In general, one should not try to synchronize the ECS by attempting to ensure that - /// `Entity` lines up between instances, but instead insert a secondary identifier as - /// a component. - from-index: func(index: entity-index) -> entity; - /// Return a transiently unique identifier. - /// See also [`EntityIndex`]. - /// No two simultaneously-live entities share the same index, but dead entities' indices may collide - /// with both live and dead entities. Useful for compactly representing entities within a - /// specific snapshot of the world, such as when serializing. - index: func(self: entity) -> entity-index; - eq: func(self: entity, other: entity) -> bool; -} - -/// Methods for EntityGeneration -interface entity-generation { - use types.{reflect-reference}; - - eq: func(self: entity-generation, other: entity-generation) -> bool; - /// Reconstruct an [`EntityGeneration`] previously destructured with [`EntityGeneration::to_bits`]. - /// Only useful when applied to results from `to_bits` in the same instance of an application. - from-bits: func(bits: u32) -> entity-generation; - clone: func(self: entity-generation) -> entity-generation; - assert-receiver-is-total-eq: func(self: entity-generation); - /// Gets some bits that represent this value. - /// The bits are opaque and should not be regarded as meaningful. - to-bits: func(self: entity-generation) -> u32; - /// Returns the [`EntityGeneration`] that would result from this many more `versions` of the corresponding [`EntityIndex`] from passing. - after-versions: func(self: entity-generation, versions: u32) -> entity-generation; -} - -/// Methods for EntityIndex -interface entity-index { - use types.{reflect-reference}; - - /// Gets the index of the entity. - index: func(self: entity-index) -> u32; - clone: func(self: entity-index) -> entity-index; - assert-receiver-is-total-eq: func(self: entity-index); - eq: func(self: entity-index, other: entity-index) -> bool; -} - -/// Methods for EntityHash -interface entity-hash { - use types.{reflect-reference}; - - clone: func(self: entity-hash) -> entity-hash; -} - -/// Methods for EntityHashSet -interface entity-hash-set { - use types.{reflect-reference}; - - assert-receiver-is-total-eq: func(self: entity-hash-set); - clone: func(self: entity-hash-set) -> entity-hash-set; - /// Returns the number of elements in the set. - len: func(self: entity-hash-set) -> u64; - /// Creates an empty `EntityHashSet`. - /// Equivalent to [`HashSet::with_hasher(EntityHash)`]. - /// [`HashSet::with_hasher(EntityHash)`]: HashSet::with_hasher - new: func() -> entity-hash-set; - eq: func(self: entity-hash-set, other: entity-hash-set) -> bool; - /// Returns `true` if the set contains no elements. - is-empty: func(self: entity-hash-set) -> bool; - /// Creates an empty `EntityHashSet` with the specified capacity. - /// Equivalent to [`HashSet::with_capacity_and_hasher(n, EntityHash)`]. - /// [`HashSet::with_capacity_and_hasher(n, EntityHash)`]: HashSet::with_capacity_and_hasher - with-capacity: func(n: u64) -> entity-hash-set; -} - -/// Methods for EntityIndexSet -interface entity-index-set { - use types.{reflect-reference}; - - /// Creates an empty `EntityIndexSet`. - /// Equivalent to [`IndexSet::with_hasher(EntityHash)`]. - /// [`IndexSet::with_hasher(EntityHash)`]: IndexSet::with_hasher - new: func() -> entity-index-set; - eq: func(self: entity-index-set, other: entity-index-set) -> bool; - /// Creates an empty `EntityIndexSet` with the specified capacity. - /// Equivalent to [`IndexSet::with_capacity_and_hasher(n, EntityHash)`]. - /// [`IndexSet::with_capacity_and_hasher(n, EntityHash)`]: IndexSet::with_capacity_and_hasher - with-capacity: func(n: u64) -> entity-index-set; - clone: func(self: entity-index-set) -> entity-index-set; -} - -/// Methods for DefaultQueryFilters -interface default-query-filters { - use types.{reflect-reference}; - - /// Creates a new, completely empty [`DefaultQueryFilters`]. - /// This is provided as an escape hatch; in most cases you should initialize this using [`FromWorld`], - /// which is automatically called when creating a new [`World`]. - empty: func() -> default-query-filters; - /// Adds this [`ComponentId`] to the set of [`DefaultQueryFilters`], - /// causing entities with this component to be excluded from queries. - /// This method is idempotent, and will not add the same component multiple times. - /// # Warning - /// This method should only be called before the app starts, as it will not affect queries - /// initialized before it is called. - /// As discussed in the [module docs](crate::entity_disabling), this can have performance implications, - /// as well as create interoperability issues, and should be used with caution. - register-disabling-component: func(self: default-query-filters, component-id: component-id); -} - -/// Methods for Disabled -interface disabled { - use types.{reflect-reference}; - - clone: func(self: disabled) -> disabled; -} - -/// Methods for ChildOf -interface child-of { - use types.{reflect-reference}; - - /// The parent entity of this child entity. - parent: func(self: child-of) -> entity; - clone: func(self: child-of) -> child-of; - eq: func(self: child-of, other: child-of) -> bool; - assert-receiver-is-total-eq: func(self: child-of); -} - -/// Methods for Children -interface children { - use types.{reflect-reference}; - - assert-receiver-is-total-eq: func(self: children); - eq: func(self: children, other: children) -> bool; - /// Swaps the child at `a_index` with the child at `b_index`. - swap: func(self: children, a-index: u64, b-index: u64); -} - -/// Methods for Add -interface add { - use types.{reflect-reference}; - - clone: func(self: add) -> add; -} - -/// Methods for Despawn -interface despawn { - use types.{reflect-reference}; - - clone: func(self: despawn) -> despawn; -} - -/// Methods for Insert -interface insert { - use types.{reflect-reference}; - - clone: func(self: insert) -> insert; -} - -/// Methods for Remove -interface remove { - use types.{reflect-reference}; - - clone: func(self: remove) -> remove; -} - -/// Methods for RemovedComponentEntity -interface removed-component-entity { - use types.{reflect-reference}; - - clone: func(self: removed-component-entity) -> removed-component-entity; -} - -/// Methods for Replace -interface replace { - use types.{reflect-reference}; - - clone: func(self: replace) -> replace; -} - -/// Methods for Name -interface name { - use types.{reflect-reference}; - - eq: func(self: name, other: name) -> bool; - clone: func(self: name) -> name; -} - -/// Methods for ButtonState -interface button-state { - use types.{reflect-reference}; - - clone: func(self: button-state) -> button-state; - eq: func(self: button-state, other: button-state) -> bool; - /// Is this button pressed? - is-pressed: func(self: button-state) -> bool; - assert-receiver-is-total-eq: func(self: button-state); -} - -/// Methods for AxisSettings -interface axis-settings { - use types.{reflect-reference}; - - /// Get the minimum value by which input must change before the change is registered. - threshold: func(self: axis-settings) -> f32; - /// Try to set the value above which inputs will be rounded up to 0.0. - /// If the value passed is less than -1.0 or less than `livezone_lowerbound`, - /// the value will not be changed. - /// Returns the new value of `deadzone_lowerbound`. - set-deadzone-lowerbound: func(self: axis-settings, value: f32) -> f32; - /// Get the value above which inputs will be rounded up to 1.0. - livezone-upperbound: func(self: axis-settings) -> f32; - /// Try to set the value above which inputs will be rounded up to 1.0. - /// If the value passed is negative or less than `deadzone_upperbound`, - /// the value will not be changed. - /// Returns the new value of `livezone_upperbound`. - set-livezone-upperbound: func(self: axis-settings, value: f32) -> f32; - eq: func(self: axis-settings, other: axis-settings) -> bool; - /// Try to set the minimum value by which input must change before the changes will be applied. - /// If the value passed is not within [0.0..=2.0], the value will not be changed. - /// Returns the new value of threshold. - set-threshold: func(self: axis-settings, value: f32) -> f32; - /// Try to set the value below which positive inputs will be rounded down to 0.0. - /// If the value passed is negative or greater than `livezone_upperbound`, - /// the value will not be changed. - /// Returns the new value of `deadzone_upperbound`. - set-deadzone-upperbound: func(self: axis-settings, value: f32) -> f32; - clone: func(self: axis-settings) -> axis-settings; - /// Get the value below which negative inputs will be rounded down to -1.0. - livezone-lowerbound: func(self: axis-settings) -> f32; - /// Clamps the `raw_value` according to the `AxisSettings`. - clamp: func(self: axis-settings, raw-value: f32) -> f32; - /// Get the value above which inputs will be rounded up to 0.0. - deadzone-lowerbound: func(self: axis-settings) -> f32; - /// Get the value below which positive inputs will be rounded down to 0.0. - deadzone-upperbound: func(self: axis-settings) -> f32; - /// Try to set the value below which negative inputs will be rounded down to -1.0. - /// If the value passed is positive or greater than `deadzone_lowerbound`, - /// the value will not be changed. - /// Returns the new value of `livezone_lowerbound`. - set-livezone-lowerbound: func(self: axis-settings, value: f32) -> f32; -} - -/// Methods for ButtonAxisSettings -interface button-axis-settings { - use types.{reflect-reference}; - - clone: func(self: button-axis-settings) -> button-axis-settings; -} - -/// Methods for ButtonSettings -interface button-settings { - use types.{reflect-reference}; - - /// Try to set the button input threshold above which the button is considered pressed. - /// If the value passed is outside the range [release threshold..=1.0], the value will not be changed. - /// Returns the new value of the press threshold. - set-press-threshold: func(self: button-settings, value: f32) -> f32; - eq: func(self: button-settings, other: button-settings) -> bool; - /// Try to set the button input threshold below which the button is considered released. If the - /// value passed is outside the range [0.0..=press threshold], the value will not be changed. - /// Returns the new value of the release threshold. - set-release-threshold: func(self: button-settings, value: f32) -> f32; - /// Returns `true` if the button is released. - /// A button is considered released if the `value` passed is lower than or equal to the release threshold. - is-released: func(self: button-settings, value: f32) -> bool; - /// Get the button input threshold below which the button is considered released. - release-threshold: func(self: button-settings) -> f32; - clone: func(self: button-settings) -> button-settings; - /// Returns `true` if the button is pressed. - /// A button is considered pressed if the `value` passed is greater than or equal to the press threshold. - is-pressed: func(self: button-settings, value: f32) -> bool; - /// Get the button input threshold above which the button is considered pressed. - press-threshold: func(self: button-settings) -> f32; -} - -/// Methods for Gamepad -interface gamepad { - use types.{reflect-reference}; - - /// Returns the USB product ID as assigned by the [vendor], if available. - /// [vendor]: Self::vendor_id - product-id: func(self: gamepad) -> option; - /// Returns the right stick as a [`Vec2`]. - right-stick: func(self: gamepad) -> vec2; - /// Returns the USB vendor ID as assigned by the USB-IF, if available. - vendor-id: func(self: gamepad) -> option; - /// Returns `true` if the [`GamepadButton`] has been pressed during the current frame. - /// Note: This function does not imply information regarding the current state of [`ButtonInput::pressed`] or [`ButtonInput::just_released`]. - just-pressed: func(self: gamepad, button-type: gamepad-button) -> bool; - /// Returns the directional pad as a [`Vec2`]. - dpad: func(self: gamepad) -> vec2; - /// Returns `true` if the [`GamepadButton`] has been released during the current frame. - /// Note: This function does not imply information regarding the current state of [`ButtonInput::pressed`] or [`ButtonInput::just_pressed`]. - just-released: func(self: gamepad, button-type: gamepad-button) -> bool; - /// Returns `true` if the [`GamepadButton`] has been pressed. - pressed: func(self: gamepad, button-type: gamepad-button) -> bool; - /// Returns the left stick as a [`Vec2`]. - left-stick: func(self: gamepad) -> vec2; -} - -/// Methods for GamepadAxis -interface gamepad-axis { - use types.{reflect-reference}; - - assert-receiver-is-total-eq: func(self: gamepad-axis); - eq: func(self: gamepad-axis, other: gamepad-axis) -> bool; - clone: func(self: gamepad-axis) -> gamepad-axis; -} - -/// Methods for GamepadAxisChangedEvent -interface gamepad-axis-changed-event { - use types.{reflect-reference}; - - clone: func(self: gamepad-axis-changed-event) -> gamepad-axis-changed-event; - /// Creates a new [`GamepadAxisChangedEvent`]. - new: func(entity: entity, axis: gamepad-axis, value: f32) -> gamepad-axis-changed-event; - eq: func(self: gamepad-axis-changed-event, other: gamepad-axis-changed-event) -> bool; -} - -/// Methods for GamepadButton -interface gamepad-button { - use types.{reflect-reference}; - - eq: func(self: gamepad-button, other: gamepad-button) -> bool; - assert-receiver-is-total-eq: func(self: gamepad-button); - clone: func(self: gamepad-button) -> gamepad-button; -} - -/// Methods for GamepadButtonChangedEvent -interface gamepad-button-changed-event { - use types.{reflect-reference}; - - eq: func(self: gamepad-button-changed-event, other: gamepad-button-changed-event) -> bool; - /// Creates a new [`GamepadButtonChangedEvent`]. - new: func(entity: entity, button: gamepad-button, state: button-state, value: f32) -> gamepad-button-changed-event; - clone: func(self: gamepad-button-changed-event) -> gamepad-button-changed-event; -} - -/// Methods for GamepadButtonStateChangedEvent -interface gamepad-button-state-changed-event { - use types.{reflect-reference}; - - /// Creates a new [`GamepadButtonStateChangedEvent`]. - new: func(entity: entity, button: gamepad-button, state: button-state) -> gamepad-button-state-changed-event; - clone: func(self: gamepad-button-state-changed-event) -> gamepad-button-state-changed-event; - eq: func(self: gamepad-button-state-changed-event, other: gamepad-button-state-changed-event) -> bool; - assert-receiver-is-total-eq: func(self: gamepad-button-state-changed-event); -} - -/// Methods for GamepadConnection -interface gamepad-connection { - use types.{reflect-reference}; - - eq: func(self: gamepad-connection, other: gamepad-connection) -> bool; - clone: func(self: gamepad-connection) -> gamepad-connection; -} - -/// Methods for GamepadConnectionEvent -interface gamepad-connection-event { - use types.{reflect-reference}; - - /// Whether the gamepad is disconnected. - disconnected: func(self: gamepad-connection-event) -> bool; - /// Whether the gamepad is connected. - connected: func(self: gamepad-connection-event) -> bool; - /// Creates a [`GamepadConnectionEvent`]. - new: func(gamepad: entity, connection: gamepad-connection) -> gamepad-connection-event; - eq: func(self: gamepad-connection-event, other: gamepad-connection-event) -> bool; - clone: func(self: gamepad-connection-event) -> gamepad-connection-event; -} - -/// Methods for GamepadEvent -interface gamepad-event { - use types.{reflect-reference}; - - clone: func(self: gamepad-event) -> gamepad-event; - eq: func(self: gamepad-event, other: gamepad-event) -> bool; -} - -/// Methods for GamepadInput -interface gamepad-input { - use types.{reflect-reference}; - - assert-receiver-is-total-eq: func(self: gamepad-input); - clone: func(self: gamepad-input) -> gamepad-input; - eq: func(self: gamepad-input, other: gamepad-input) -> bool; -} - -/// Methods for GamepadRumbleIntensity -interface gamepad-rumble-intensity { - use types.{reflect-reference}; - - /// Creates a new rumble intensity with strong motor intensity set to the given value. - /// Clamped within the `0.0` to `1.0` range. - strong-motor: func(intensity: f32) -> gamepad-rumble-intensity; - clone: func(self: gamepad-rumble-intensity) -> gamepad-rumble-intensity; - eq: func(self: gamepad-rumble-intensity, other: gamepad-rumble-intensity) -> bool; - /// Creates a new rumble intensity with weak motor intensity set to the given value. - /// Clamped within the `0.0` to `1.0` range. - weak-motor: func(intensity: f32) -> gamepad-rumble-intensity; -} - -/// Methods for GamepadRumbleRequest -interface gamepad-rumble-request { - use types.{reflect-reference}; - - /// Get the [`Entity`] associated with this request. - gamepad: func(self: gamepad-rumble-request) -> entity; - clone: func(self: gamepad-rumble-request) -> gamepad-rumble-request; -} - -/// Methods for GamepadSettings -interface gamepad-settings { - use types.{reflect-reference}; - - clone: func(self: gamepad-settings) -> gamepad-settings; -} - -/// Methods for RawGamepadAxisChangedEvent -interface raw-gamepad-axis-changed-event { - use types.{reflect-reference}; - - eq: func(self: raw-gamepad-axis-changed-event, other: raw-gamepad-axis-changed-event) -> bool; - clone: func(self: raw-gamepad-axis-changed-event) -> raw-gamepad-axis-changed-event; - /// Creates a [`RawGamepadAxisChangedEvent`]. - new: func(gamepad: entity, axis-type: gamepad-axis, value: f32) -> raw-gamepad-axis-changed-event; -} - -/// Methods for RawGamepadButtonChangedEvent -interface raw-gamepad-button-changed-event { - use types.{reflect-reference}; - - /// Creates a [`RawGamepadButtonChangedEvent`]. - new: func(gamepad: entity, button-type: gamepad-button, value: f32) -> raw-gamepad-button-changed-event; - eq: func(self: raw-gamepad-button-changed-event, other: raw-gamepad-button-changed-event) -> bool; - clone: func(self: raw-gamepad-button-changed-event) -> raw-gamepad-button-changed-event; -} - -/// Methods for RawGamepadEvent -interface raw-gamepad-event { - use types.{reflect-reference}; - - eq: func(self: raw-gamepad-event, other: raw-gamepad-event) -> bool; - clone: func(self: raw-gamepad-event) -> raw-gamepad-event; -} - -/// Methods for DoubleTapGesture -interface double-tap-gesture { - use types.{reflect-reference}; - - clone: func(self: double-tap-gesture) -> double-tap-gesture; - eq: func(self: double-tap-gesture, other: double-tap-gesture) -> bool; -} - -/// Methods for PanGesture -interface pan-gesture { - use types.{reflect-reference}; - - eq: func(self: pan-gesture, other: pan-gesture) -> bool; - clone: func(self: pan-gesture) -> pan-gesture; -} - -/// Methods for PinchGesture -interface pinch-gesture { - use types.{reflect-reference}; - - eq: func(self: pinch-gesture, other: pinch-gesture) -> bool; - clone: func(self: pinch-gesture) -> pinch-gesture; -} - -/// Methods for RotationGesture -interface rotation-gesture { - use types.{reflect-reference}; - - clone: func(self: rotation-gesture) -> rotation-gesture; - eq: func(self: rotation-gesture, other: rotation-gesture) -> bool; -} - -/// Methods for Key -interface key { - use types.{reflect-reference}; - - clone: func(self: key) -> key; - assert-receiver-is-total-eq: func(self: key); - eq: func(self: key, other: key) -> bool; -} - -/// Methods for KeyCode -interface key-code { - use types.{reflect-reference}; - - assert-receiver-is-total-eq: func(self: key-code); - eq: func(self: key-code, other: key-code) -> bool; - clone: func(self: key-code) -> key-code; -} - -/// Methods for KeyboardFocusLost -interface keyboard-focus-lost { - use types.{reflect-reference}; - - eq: func(self: keyboard-focus-lost, other: keyboard-focus-lost) -> bool; - clone: func(self: keyboard-focus-lost) -> keyboard-focus-lost; - assert-receiver-is-total-eq: func(self: keyboard-focus-lost); -} - -/// Methods for KeyboardInput -interface keyboard-input { - use types.{reflect-reference}; - - eq: func(self: keyboard-input, other: keyboard-input) -> bool; - clone: func(self: keyboard-input) -> keyboard-input; - assert-receiver-is-total-eq: func(self: keyboard-input); -} - -/// Methods for NativeKey -interface native-key { - use types.{reflect-reference}; - - assert-receiver-is-total-eq: func(self: native-key); - clone: func(self: native-key) -> native-key; - eq: func(self: native-key, other: native-key) -> bool; -} - -/// Methods for NativeKeyCode -interface native-key-code { - use types.{reflect-reference}; - - eq: func(self: native-key-code, other: native-key-code) -> bool; - assert-receiver-is-total-eq: func(self: native-key-code); - clone: func(self: native-key-code) -> native-key-code; -} - -/// Methods for AccumulatedMouseMotion -interface accumulated-mouse-motion { - use types.{reflect-reference}; - - clone: func(self: accumulated-mouse-motion) -> accumulated-mouse-motion; - eq: func(self: accumulated-mouse-motion, other: accumulated-mouse-motion) -> bool; -} - -/// Methods for AccumulatedMouseScroll -interface accumulated-mouse-scroll { - use types.{reflect-reference}; - - eq: func(self: accumulated-mouse-scroll, other: accumulated-mouse-scroll) -> bool; - clone: func(self: accumulated-mouse-scroll) -> accumulated-mouse-scroll; -} - -/// Methods for MouseButton -interface mouse-button { - use types.{reflect-reference}; - - eq: func(self: mouse-button, other: mouse-button) -> bool; - clone: func(self: mouse-button) -> mouse-button; - assert-receiver-is-total-eq: func(self: mouse-button); -} - -/// Methods for MouseButtonInput -interface mouse-button-input { - use types.{reflect-reference}; - - assert-receiver-is-total-eq: func(self: mouse-button-input); - eq: func(self: mouse-button-input, other: mouse-button-input) -> bool; - clone: func(self: mouse-button-input) -> mouse-button-input; -} - -/// Methods for MouseMotion -interface mouse-motion { - use types.{reflect-reference}; - - clone: func(self: mouse-motion) -> mouse-motion; - eq: func(self: mouse-motion, other: mouse-motion) -> bool; -} - -/// Methods for MouseScrollUnit -interface mouse-scroll-unit { - use types.{reflect-reference}; - - eq: func(self: mouse-scroll-unit, other: mouse-scroll-unit) -> bool; - clone: func(self: mouse-scroll-unit) -> mouse-scroll-unit; - assert-receiver-is-total-eq: func(self: mouse-scroll-unit); -} - -/// Methods for MouseWheel -interface mouse-wheel { - use types.{reflect-reference}; - - clone: func(self: mouse-wheel) -> mouse-wheel; - eq: func(self: mouse-wheel, other: mouse-wheel) -> bool; -} - -/// Methods for ForceTouch -interface force-touch { - use types.{reflect-reference}; - - clone: func(self: force-touch) -> force-touch; - eq: func(self: force-touch, other: force-touch) -> bool; -} - -/// Methods for TouchInput -interface touch-input { - use types.{reflect-reference}; - - eq: func(self: touch-input, other: touch-input) -> bool; - clone: func(self: touch-input) -> touch-input; -} - -/// Methods for TouchPhase -interface touch-phase { - use types.{reflect-reference}; - - eq: func(self: touch-phase, other: touch-phase) -> bool; - assert-receiver-is-total-eq: func(self: touch-phase); - clone: func(self: touch-phase) -> touch-phase; -} - -/// Methods for AspectRatio -interface aspect-ratio { - use types.{reflect-reference}; - - eq: func(self: aspect-ratio, other: aspect-ratio) -> bool; - /// Returns true if the aspect ratio represents a portrait orientation. - is-portrait: func(self: aspect-ratio) -> bool; - /// Returns true if the aspect ratio is exactly square. - is-square: func(self: aspect-ratio) -> bool; - /// Returns the inverse of this aspect ratio (height/width). - inverse: func(self: aspect-ratio) -> aspect-ratio; - clone: func(self: aspect-ratio) -> aspect-ratio; - /// Returns the aspect ratio as a f32 value. - ratio: func(self: aspect-ratio) -> f32; - /// Returns true if the aspect ratio represents a landscape orientation. - is-landscape: func(self: aspect-ratio) -> bool; -} - -/// Methods for Aabb2d -interface aabb2d { - use types.{reflect-reference}; - - /// Computes the smallest [`BoundingCircle`] containing this [`Aabb2d`]. - bounding-circle: func(self: aabb2d) -> bounding-circle; - eq: func(self: aabb2d, other: aabb2d) -> bool; - clone: func(self: aabb2d) -> aabb2d; - /// Finds the point on the AABB that is closest to the given `point`. - /// If the point is outside the AABB, the returned point will be on the perimeter of the AABB. - /// Otherwise, it will be inside the AABB and returned as is. - closest-point: func(self: aabb2d, point: vec2) -> vec2; - /// Constructs an AABB from its center and half-size. - new: func(center: vec2, half-size: vec2) -> aabb2d; -} - -/// Methods for BoundingCircle -interface bounding-circle { - use types.{reflect-reference}; - - /// Get the radius of the bounding circle - radius: func(self: bounding-circle) -> f32; - clone: func(self: bounding-circle) -> bounding-circle; - eq: func(self: bounding-circle, other: bounding-circle) -> bool; - /// Finds the point on the bounding circle that is closest to the given `point`. - /// If the point is outside the circle, the returned point will be on the perimeter of the circle. - /// Otherwise, it will be inside the circle and returned as is. - closest-point: func(self: bounding-circle, point: vec2) -> vec2; - /// Constructs a bounding circle from its center and radius. - new: func(center: vec2, radius: f32) -> bounding-circle; - /// Computes the smallest [`Aabb2d`] containing this [`BoundingCircle`]. - aabb-2d: func(self: bounding-circle) -> aabb2d; -} - -/// Methods for Aabb3d -interface aabb3d { - use types.{reflect-reference}; - - clone: func(self: aabb3d) -> aabb3d; - /// Computes the smallest [`BoundingSphere`] containing this [`Aabb3d`]. - bounding-sphere: func(self: aabb3d) -> bounding-sphere; - eq: func(self: aabb3d, other: aabb3d) -> bool; -} - -/// Methods for BoundingSphere -interface bounding-sphere { - use types.{reflect-reference}; - - eq: func(self: bounding-sphere, other: bounding-sphere) -> bool; - /// Computes the smallest [`Aabb3d`] containing this [`BoundingSphere`]. - aabb-3d: func(self: bounding-sphere) -> aabb3d; - /// Get the radius of the bounding sphere - radius: func(self: bounding-sphere) -> f32; - clone: func(self: bounding-sphere) -> bounding-sphere; -} - -/// Methods for AabbCast2d -interface aabb-cast2d { - use types.{reflect-reference}; - - /// Get the distance at which the [`Aabb2d`]s collide, if at all. - aabb-collision-at: func(self: aabb-cast2d, aabb: aabb2d) -> option; - /// Construct an [`AabbCast2d`] from an [`Aabb2d`], origin, [`Dir2`], and max distance. - new: func(aabb: aabb2d, origin: vec2, direction: dir2, max: f32) -> aabb-cast2d; - clone: func(self: aabb-cast2d) -> aabb-cast2d; - /// Construct an [`AabbCast2d`] from an [`Aabb2d`], [`Ray2d`], and max distance. - from-ray: func(aabb: aabb2d, ray: ray2d, max: f32) -> aabb-cast2d; -} - -/// Methods for BoundingCircleCast -interface bounding-circle-cast { - use types.{reflect-reference}; - - /// Construct a [`BoundingCircleCast`] from a [`BoundingCircle`], origin, [`Dir2`], and max distance. - new: func(circle: bounding-circle, origin: vec2, direction: dir2, max: f32) -> bounding-circle-cast; - /// Construct a [`BoundingCircleCast`] from a [`BoundingCircle`], [`Ray2d`], and max distance. - from-ray: func(circle: bounding-circle, ray: ray2d, max: f32) -> bounding-circle-cast; - clone: func(self: bounding-circle-cast) -> bounding-circle-cast; - /// Get the distance at which the [`BoundingCircle`]s collide, if at all. - circle-collision-at: func(self: bounding-circle-cast, circle: bounding-circle) -> option; -} - -/// Methods for RayCast2d -interface ray-cast2d { - use types.{reflect-reference}; - - /// Get the distance of an intersection with a [`BoundingCircle`], if any. - circle-intersection-at: func(self: ray-cast2d, circle: bounding-circle) -> option; - /// Get the distance of an intersection with an [`Aabb2d`], if any. - aabb-intersection-at: func(self: ray-cast2d, aabb: aabb2d) -> option; - /// Get the cached multiplicative inverse of the direction of the ray. - direction-recip: func(self: ray-cast2d) -> vec2; - /// Construct a [`RayCast2d`] from a [`Ray2d`] and max distance. - from-ray: func(ray: ray2d, max: f32) -> ray-cast2d; - clone: func(self: ray-cast2d) -> ray-cast2d; - /// Construct a [`RayCast2d`] from an origin, [`Dir2`], and max distance. - new: func(origin: vec2, direction: dir2, max: f32) -> ray-cast2d; -} - -/// Methods for AabbCast3d -interface aabb-cast3d { - use types.{reflect-reference}; - - clone: func(self: aabb-cast3d) -> aabb-cast3d; - /// Construct an [`AabbCast3d`] from an [`Aabb3d`], [`Ray3d`], and max distance. - from-ray: func(aabb: aabb3d, ray: ray3d, max: f32) -> aabb-cast3d; - /// Get the distance at which the [`Aabb3d`]s collide, if at all. - aabb-collision-at: func(self: aabb-cast3d, aabb: aabb3d) -> option; -} - -/// Methods for BoundingSphereCast -interface bounding-sphere-cast { - use types.{reflect-reference}; - - /// Construct a [`BoundingSphereCast`] from a [`BoundingSphere`], [`Ray3d`], and max distance. - from-ray: func(sphere: bounding-sphere, ray: ray3d, max: f32) -> bounding-sphere-cast; - clone: func(self: bounding-sphere-cast) -> bounding-sphere-cast; - /// Get the distance at which the [`BoundingSphere`]s collide, if at all. - sphere-collision-at: func(self: bounding-sphere-cast, sphere: bounding-sphere) -> option; -} - -/// Methods for RayCast3d -interface ray-cast3d { - use types.{reflect-reference}; - - /// Get the distance of an intersection with an [`Aabb3d`], if any. - aabb-intersection-at: func(self: ray-cast3d, aabb: aabb3d) -> option; - /// Construct a [`RayCast3d`] from a [`Ray3d`] and max distance. - from-ray: func(ray: ray3d, max: f32) -> ray-cast3d; - /// Get the cached multiplicative inverse of the direction of the ray. - direction-recip: func(self: ray-cast3d) -> vec3-a; - /// Get the distance of an intersection with a [`BoundingSphere`], if any. - sphere-intersection-at: func(self: ray-cast3d, sphere: bounding-sphere) -> option; - clone: func(self: ray-cast3d) -> ray-cast3d; -} - -/// Methods for CompassOctant -interface compass-octant { - use types.{reflect-reference}; - - clone: func(self: compass-octant) -> compass-octant; - assert-receiver-is-total-eq: func(self: compass-octant); - eq: func(self: compass-octant, other: compass-octant) -> bool; - neg: func(self: compass-octant) -> compass-octant; - /// Converts a [`CompassOctant`] to a standard index. - /// Starts at 0 for [`CompassOctant::North`] and increments clockwise. - to-index: func(self: compass-octant) -> u64; - /// Checks if a point is in the direction represented by this [`CompassOctant`] from an origin. - /// This uses a cone-based check: the vector from origin to the candidate point - /// must have a positive dot product with the direction vector. - /// Uses standard mathematical coordinates where Y increases upward. - /// `true` if the candidate is generally in the direction of this octant from the origin. - /// # Example - /// ``` - /// use bevy_math::{CompassOctant, Vec2}; - /// let origin = Vec2::new(0.0, 0.0); - /// let north_point = Vec2::new(0.0, 10.0); // Above origin (Y+ = up) - /// let east_point = Vec2::new(10.0, 0.0); // Right of origin - /// assert!(CompassOctant::North.is_in_direction(origin, north_point)); - /// assert!(!CompassOctant::North.is_in_direction(origin, east_point)); - /// ``` - is-in-direction: func(self: compass-octant, origin: vec2, candidate: vec2) -> bool; - /// Returns the opposite [`CompassOctant`], located 180 degrees from `self`. - /// This can also be accessed via the `-` operator, using the [`Neg`] trait. - opposite: func(self: compass-octant) -> compass-octant; -} - -/// Methods for CompassQuadrant -interface compass-quadrant { - use types.{reflect-reference}; - - neg: func(self: compass-quadrant) -> compass-quadrant; - /// Checks if a point is in the direction represented by this [`CompassQuadrant`] from an origin. - /// This uses a cone-based check: the vector from origin to the candidate point - /// must have a positive dot product with the direction vector. - /// Uses standard mathematical coordinates where Y increases upward. - /// `true` if the candidate is generally in the direction of this quadrant from the origin. - /// # Example - /// ``` - /// use bevy_math::{CompassQuadrant, Vec2}; - /// let origin = Vec2::new(0.0, 0.0); - /// let north_point = Vec2::new(0.0, 10.0); // Above origin (Y+ = up) - /// let east_point = Vec2::new(10.0, 0.0); // Right of origin - /// assert!(CompassQuadrant::North.is_in_direction(origin, north_point)); - /// assert!(!CompassQuadrant::North.is_in_direction(origin, east_point)); - /// ``` - is-in-direction: func(self: compass-quadrant, origin: vec2, candidate: vec2) -> bool; - eq: func(self: compass-quadrant, other: compass-quadrant) -> bool; - clone: func(self: compass-quadrant) -> compass-quadrant; - assert-receiver-is-total-eq: func(self: compass-quadrant); - /// Returns the opposite [`CompassQuadrant`], located 180 degrees from `self`. - /// This can also be accessed via the `-` operator, using the [`Neg`] trait. - opposite: func(self: compass-quadrant) -> compass-quadrant; - /// Converts a [`CompassQuadrant`] to a standard index. - /// Starts at 0 for [`CompassQuadrant::North`] and increments clockwise. - to-index: func(self: compass-quadrant) -> u64; -} - -/// Methods for EaseFunction -interface ease-function { - use types.{reflect-reference}; - - clone: func(self: ease-function) -> ease-function; - eq: func(self: ease-function, other: ease-function) -> bool; -} - -/// Methods for JumpAt -interface jump-at { - use types.{reflect-reference}; - - assert-receiver-is-total-eq: func(self: jump-at); - clone: func(self: jump-at) -> jump-at; - eq: func(self: jump-at, other: jump-at) -> bool; -} - -/// Methods for Interval -interface interval { - use types.{reflect-reference}; - - /// Clamp the given `value` to lie within this interval. - clamp: func(self: interval, value: f32) -> f32; - /// Get the start of this interval. - start: func(self: interval) -> f32; - /// Returns `true` if the other interval is contained in this interval. - /// This is non-strict: each interval will contain itself. - contains-interval: func(self: interval, other: interval) -> bool; - eq: func(self: interval, other: interval) -> bool; - /// Returns `true` if this interval has a finite end. - has-finite-end: func(self: interval) -> bool; - /// Returns `true` if `item` is contained in this interval. - contains: func(self: interval, item: f32) -> bool; - clone: func(self: interval) -> interval; - /// Get the end of this interval. - end: func(self: interval) -> f32; - /// Get the length of this interval. Note that the result may be infinite (`f32::INFINITY`). - length: func(self: interval) -> f32; - /// Returns `true` if this interval is bounded — that is, if both its start and end are finite. - /// Equivalently, an interval is bounded if its length is finite. - is-bounded: func(self: interval) -> bool; - /// Returns `true` if this interval has a finite start. - has-finite-start: func(self: interval) -> bool; -} - -/// Methods for Dir2 -interface dir2 { - use types.{reflect-reference}; - - clone: func(self: dir2) -> dir2; - /// Returns `self` after an approximate normalization, assuming the value is already nearly normalized. - /// Useful for preventing numerical error accumulation. - /// See [`Dir3::fast_renormalize`] for an example of when such error accumulation might occur. - fast-renormalize: func(self: dir2) -> dir2; - /// Performs a spherical linear interpolation between `self` and `rhs` - /// based on the value `s`. - /// This corresponds to interpolating between the two directions at a constant angular velocity. - /// When `s == 0.0`, the result will be equal to `self`. - /// When `s == 1.0`, the result will be equal to `rhs`. - /// # Example - /// ``` - /// # use bevy_math::Dir2; - /// # use approx::{assert_relative_eq, RelativeEq}; - /// # - /// let dir1 = Dir2::X; - /// let dir2 = Dir2::Y; - /// let result1 = dir1.slerp(dir2, 1.0 / 3.0); - /// #[cfg(feature = "approx")] - /// assert_relative_eq!(result1, Dir2::from_xy(0.75_f32.sqrt(), 0.5).unwrap()); - /// let result2 = dir1.slerp(dir2, 0.5); - /// #[cfg(feature = "approx")] - /// assert_relative_eq!(result2, Dir2::from_xy(0.5_f32.sqrt(), 0.5_f32.sqrt()).unwrap()); - /// ``` - slerp: func(self: dir2, rhs: dir2, s: f32) -> dir2; - /// Create a direction from its `x` and `y` components, assuming the resulting vector is normalized. - /// # Warning - /// The vector produced from `x` and `y` must be normalized, i.e its length must be `1.0`. - from-xy-unchecked: func(x: f32, y: f32) -> dir2; - /// Get the rotation that rotates this direction to the Y-axis. - rotation-to-y: func(self: dir2) -> rot2; - /// Create a [`Dir2`] from a [`Vec2`] that is already normalized. - /// # Warning - /// `value` must be normalized, i.e its length must be `1.0`. - new-unchecked: func(value: vec2) -> dir2; - neg: func(self: dir2) -> dir2; - /// Get the rotation that rotates this direction to `other`. - rotation-to: func(self: dir2, other: dir2) -> rot2; - mul: func(self: dir2, rhs: f32) -> vec2; - /// Get the rotation that rotates `other` to this direction. - rotation-from: func(self: dir2, other: dir2) -> rot2; - /// Get the rotation that rotates the Y-axis to this direction. - rotation-from-y: func(self: dir2) -> rot2; - eq: func(self: dir2, other: dir2) -> bool; - /// Returns the inner [`Vec2`] - as-vec2: func(self: dir2) -> vec2; - /// Get the rotation that rotates the X-axis to this direction. - rotation-from-x: func(self: dir2) -> rot2; - /// Get the rotation that rotates this direction to the X-axis. - rotation-to-x: func(self: dir2) -> rot2; -} - -/// Methods for Dir3 -interface dir3 { - use types.{reflect-reference}; - - neg: func(self: dir3) -> dir3; - eq: func(self: dir3, other: dir3) -> bool; - /// Performs a spherical linear interpolation between `self` and `rhs` - /// based on the value `s`. - /// This corresponds to interpolating between the two directions at a constant angular velocity. - /// When `s == 0.0`, the result will be equal to `self`. - /// When `s == 1.0`, the result will be equal to `rhs`. - /// # Example - /// ``` - /// # use bevy_math::Dir3; - /// # use approx::{assert_relative_eq, RelativeEq}; - /// # - /// let dir1 = Dir3::X; - /// let dir2 = Dir3::Y; - /// let result1 = dir1.slerp(dir2, 1.0 / 3.0); - /// #[cfg(feature = "approx")] - /// assert_relative_eq!( - /// result1, - /// Dir3::from_xyz(0.75_f32.sqrt(), 0.5, 0.0).unwrap(), - /// epsilon = 0.000001 - /// ); - /// let result2 = dir1.slerp(dir2, 0.5); - /// #[cfg(feature = "approx")] - /// assert_relative_eq!(result2, Dir3::from_xyz(0.5_f32.sqrt(), 0.5_f32.sqrt(), 0.0).unwrap()); - /// ``` - slerp: func(self: dir3, rhs: dir3, s: f32) -> dir3; - clone: func(self: dir3) -> dir3; - /// Create a direction from its `x`, `y`, and `z` components, assuming the resulting vector is normalized. - /// # Warning - /// The vector produced from `x`, `y`, and `z` must be normalized, i.e its length must be `1.0`. - from-xyz-unchecked: func(x: f32, y: f32, z: f32) -> dir3; - /// Create a [`Dir3`] from a [`Vec3`] that is already normalized. - /// # Warning - /// `value` must be normalized, i.e its length must be `1.0`. - new-unchecked: func(value: vec3) -> dir3; - mul: func(self: dir3, rhs: f32) -> vec3; - /// Returns the inner [`Vec3`] - as-vec3: func(self: dir3) -> vec3; - /// Returns `self` after an approximate normalization, assuming the value is already nearly normalized. - /// Useful for preventing numerical error accumulation. - /// # Example - /// The following seemingly benign code would start accumulating errors over time, - /// leading to `dir` eventually not being normalized anymore. - /// ``` - /// # use bevy_math::prelude::*; - /// # let N: usize = 200; - /// let mut dir = Dir3::X; - /// let quaternion = Quat::from_euler(EulerRot::XYZ, 1.0, 2.0, 3.0); - /// for i in 0..N { - /// dir = quaternion * dir; - /// } - /// ``` - /// Instead, do the following. - /// ``` - /// # use bevy_math::prelude::*; - /// # let N: usize = 200; - /// let mut dir = Dir3::X; - /// let quaternion = Quat::from_euler(EulerRot::XYZ, 1.0, 2.0, 3.0); - /// for i in 0..N { - /// dir = quaternion * dir; - /// dir = dir.fast_renormalize(); - /// } - /// ``` - fast-renormalize: func(self: dir3) -> dir3; -} - -/// Methods for Dir3A -interface dir3-a { - use types.{reflect-reference}; - - /// Create a direction from its `x`, `y`, and `z` components, assuming the resulting vector is normalized. - /// # Warning - /// The vector produced from `x`, `y`, and `z` must be normalized, i.e its length must be `1.0`. - from-xyz-unchecked: func(x: f32, y: f32, z: f32) -> dir3-a; - eq: func(self: dir3-a, other: dir3-a) -> bool; - mul: func(self: dir3-a, rhs: f32) -> vec3-a; - /// Create a [`Dir3A`] from a [`Vec3A`] that is already normalized. - /// # Warning - /// `value` must be normalized, i.e its length must be `1.0`. - new-unchecked: func(value: vec3-a) -> dir3-a; - /// Returns the inner [`Vec3A`] - as-vec3a: func(self: dir3-a) -> vec3-a; - neg: func(self: dir3-a) -> dir3-a; - /// Returns `self` after an approximate normalization, assuming the value is already nearly normalized. - /// Useful for preventing numerical error accumulation. - /// See [`Dir3::fast_renormalize`] for an example of when such error accumulation might occur. - fast-renormalize: func(self: dir3-a) -> dir3-a; - /// Performs a spherical linear interpolation between `self` and `rhs` - /// based on the value `s`. - /// This corresponds to interpolating between the two directions at a constant angular velocity. - /// When `s == 0.0`, the result will be equal to `self`. - /// When `s == 1.0`, the result will be equal to `rhs`. - /// # Example - /// ``` - /// # use bevy_math::Dir3A; - /// # use approx::{assert_relative_eq, RelativeEq}; - /// # - /// let dir1 = Dir3A::X; - /// let dir2 = Dir3A::Y; - /// let result1 = dir1.slerp(dir2, 1.0 / 3.0); - /// #[cfg(feature = "approx")] - /// assert_relative_eq!( - /// result1, - /// Dir3A::from_xyz(0.75_f32.sqrt(), 0.5, 0.0).unwrap(), - /// epsilon = 0.000001 - /// ); - /// let result2 = dir1.slerp(dir2, 0.5); - /// #[cfg(feature = "approx")] - /// assert_relative_eq!(result2, Dir3A::from_xyz(0.5_f32.sqrt(), 0.5_f32.sqrt(), 0.0).unwrap()); - /// ``` - slerp: func(self: dir3-a, rhs: dir3-a, s: f32) -> dir3-a; - clone: func(self: dir3-a) -> dir3-a; -} - -/// Methods for Dir4 -interface dir4 { - use types.{reflect-reference}; - - mul: func(self: dir4, rhs: f32) -> vec4; - /// Create a direction from its `x`, `y`, `z`, and `w` components, assuming the resulting vector is normalized. - /// # Warning - /// The vector produced from `x`, `y`, `z`, and `w` must be normalized, i.e its length must be `1.0`. - from-xyzw-unchecked: func(x: f32, y: f32, z: f32, w: f32) -> dir4; - /// Create a [`Dir4`] from a [`Vec4`] that is already normalized. - /// # Warning - /// `value` must be normalized, i.e its length must be `1.0`. - new-unchecked: func(value: vec4) -> dir4; - neg: func(self: dir4) -> dir4; - eq: func(self: dir4, other: dir4) -> bool; - /// Returns `self` after an approximate normalization, assuming the value is already nearly normalized. - /// Useful for preventing numerical error accumulation. - fast-renormalize: func(self: dir4) -> dir4; - /// Returns the inner [`Vec4`] - as-vec4: func(self: dir4) -> vec4; - clone: func(self: dir4) -> dir4; -} - -/// Methods for FloatOrd -interface float-ord { - use types.{reflect-reference}; - - le: func(self: float-ord, other: float-ord) -> bool; - ge: func(self: float-ord, other: float-ord) -> bool; - eq: func(self: float-ord, other: float-ord) -> bool; - lt: func(self: float-ord, other: float-ord) -> bool; - gt: func(self: float-ord, other: float-ord) -> bool; - clone: func(self: float-ord) -> float-ord; - neg: func(self: float-ord) -> float-ord; -} - -/// Methods for Isometry2d -interface isometry2d { - use types.{reflect-reference}; - - eq: func(self: isometry2d, other: isometry2d) -> bool; - /// Create a two-dimensional isometry from a rotation and a translation. - new: func(translation: vec2, rotation: rot2) -> isometry2d; - /// Transform a point by rotating and translating it using this isometry. - transform-point: func(self: isometry2d, point: vec2) -> vec2; - mul: func(p0: isometry2d, p1: vec2) -> vec2; - /// The inverse isometry that undoes this one. - inverse: func(self: isometry2d) -> isometry2d; - /// Create a two-dimensional isometry from a translation with the given `x` and `y` components. - from-xy: func(x: f32, y: f32) -> isometry2d; - mul: func(p0: isometry2d, p1: isometry2d) -> isometry2d; - /// Create a two-dimensional isometry from a translation. - from-translation: func(translation: vec2) -> isometry2d; - clone: func(self: isometry2d) -> isometry2d; - mul: func(self: isometry2d, rhs: dir2) -> dir2; - /// Compute `iso1.inverse() * iso2` in a more efficient way for one-shot cases. - /// If the same isometry is used multiple times, it is more efficient to instead compute - /// the inverse once and use that for each transformation. - inverse-mul: func(self: isometry2d, rhs: isometry2d) -> isometry2d; - /// Create a two-dimensional isometry from a rotation. - from-rotation: func(rotation: rot2) -> isometry2d; - /// Transform a point by rotating and translating it using the inverse of this isometry. - /// This is more efficient than `iso.inverse().transform_point(point)` for one-shot cases. - /// If the same isometry is used multiple times, it is more efficient to instead compute - /// the inverse once and use that for each transformation. - inverse-transform-point: func(self: isometry2d, point: vec2) -> vec2; -} - -/// Methods for Isometry3d -interface isometry3d { - use types.{reflect-reference}; - - mul: func(p0: isometry3d, p1: isometry3d) -> isometry3d; - /// Create a three-dimensional isometry from a translation with the given `x`, `y`, and `z` components. - from-xyz: func(x: f32, y: f32, z: f32) -> isometry3d; - /// The inverse isometry that undoes this one. - inverse: func(self: isometry3d) -> isometry3d; - mul: func(p0: isometry3d, p1: vec3) -> vec3; - mul: func(self: isometry3d, rhs: dir3) -> dir3; - clone: func(self: isometry3d) -> isometry3d; - /// Create a three-dimensional isometry from a rotation. - from-rotation: func(rotation: quat) -> isometry3d; - eq: func(self: isometry3d, other: isometry3d) -> bool; - /// Compute `iso1.inverse() * iso2` in a more efficient way for one-shot cases. - /// If the same isometry is used multiple times, it is more efficient to instead compute - /// the inverse once and use that for each transformation. - inverse-mul: func(self: isometry3d, rhs: isometry3d) -> isometry3d; - mul: func(p0: isometry3d, p1: vec3-a) -> vec3-a; -} - -/// Methods for Annulus -interface annulus { - use types.{reflect-reference}; - - /// Get the diameter of the annulus - diameter: func(self: annulus) -> f32; - /// Finds the point on the annulus that is closest to the given `point`: - /// - If the point is outside of the annulus completely, the returned point will be on the outer perimeter. - /// - If the point is inside of the inner circle (hole) of the annulus, the returned point will be on the inner perimeter. - /// - Otherwise, the returned point is overlapping the annulus and returned as is. - closest-point: func(self: annulus, point: vec2) -> vec2; - eq: func(self: annulus, other: annulus) -> bool; - /// Get the thickness of the annulus - thickness: func(self: annulus) -> f32; - clone: func(self: annulus) -> annulus; - /// Create a new [`Annulus`] from the radii of the inner and outer circle - new: func(inner-radius: f32, outer-radius: f32) -> annulus; -} - -/// Methods for Arc2d -interface arc2d { - use types.{reflect-reference}; - - /// Create a new [`Arc2d`] from a `radius` and an `angle` in degrees. - from-degrees: func(radius: f32, angle: f32) -> arc2d; - /// Get the length of the apothem of this arc, that is, - /// the distance from the center of the circle to the midpoint of the chord, in the direction of the midpoint of the arc. - /// Equivalently, the [`radius`](Self::radius) minus the [`sagitta`](Self::sagitta). - /// Note that for a [`major`](Self::is_major) arc, the apothem will be negative. - apothem: func(self: arc2d) -> f32; - /// Create a new [`Arc2d`] from a `radius` and an `angle` in radians - from-radians: func(radius: f32, angle: f32) -> arc2d; - /// Get the length of the arc - length: func(self: arc2d) -> f32; - /// Produces true if the arc is at most half a circle. - /// **Note:** This is not the negation of [`is_major`](Self::is_major): an exact semicircle is both major and minor. - is-minor: func(self: arc2d) -> bool; - /// Create a new [`Arc2d`] from a `radius` and a `half_angle` - new: func(radius: f32, half-angle: f32) -> arc2d; - /// Get the angle of the arc - angle: func(self: arc2d) -> f32; - /// Get half the distance between the endpoints (half the length of the chord) - half-chord-length: func(self: arc2d) -> f32; - /// Produces true if the arc is at least half a circle. - /// **Note:** This is not the negation of [`is_minor`](Self::is_minor): an exact semicircle is both major and minor. - is-major: func(self: arc2d) -> bool; - eq: func(self: arc2d, other: arc2d) -> bool; - /// Get the midpoint of the arc - midpoint: func(self: arc2d) -> vec2; - /// Get the midpoint of the two endpoints (the midpoint of the chord) - chord-midpoint: func(self: arc2d) -> vec2; - /// Get the length of the sagitta of this arc, that is, - /// the length of the line between the midpoints of the arc and its chord. - /// Equivalently, the height of the triangle whose base is the chord and whose apex is the midpoint of the arc. - /// The sagitta is also the sum of the [`radius`](Self::radius) and the [`apothem`](Self::apothem). - sagitta: func(self: arc2d) -> f32; - /// Get the distance between the endpoints (the length of the chord) - chord-length: func(self: arc2d) -> f32; - clone: func(self: arc2d) -> arc2d; - /// Get the right-hand end point of the arc - right-endpoint: func(self: arc2d) -> vec2; - /// Create a new [`Arc2d`] from a `radius` and a `fraction` of a single turn. - /// For instance, `0.5` turns is a semicircle. - from-turns: func(radius: f32, fraction: f32) -> arc2d; - /// Get the left-hand end point of the arc - left-endpoint: func(self: arc2d) -> vec2; -} - -/// Methods for Capsule2d -interface capsule2d { - use types.{reflect-reference}; - - eq: func(self: capsule2d, other: capsule2d) -> bool; - /// Get the part connecting the semicircular ends of the capsule as a [`Rectangle`] - to-inner-rectangle: func(self: capsule2d) -> rectangle; - clone: func(self: capsule2d) -> capsule2d; - /// Create a new `Capsule2d` from a radius and length - new: func(radius: f32, length: f32) -> capsule2d; -} - -/// Methods for Circle -interface circle { - use types.{reflect-reference}; - - clone: func(self: circle) -> circle; - /// Get the diameter of the circle - diameter: func(self: circle) -> f32; - /// Create a new [`Circle`] from a `radius` - new: func(radius: f32) -> circle; - eq: func(self: circle, other: circle) -> bool; - /// Finds the point on the circle that is closest to the given `point`. - /// If the point is outside the circle, the returned point will be on the perimeter of the circle. - /// Otherwise, it will be inside the circle and returned as is. - closest-point: func(self: circle, point: vec2) -> vec2; -} - -/// Methods for CircularSector -interface circular-sector { - use types.{reflect-reference}; - - /// Get the length of the chord defined by the sector - /// See [`Arc2d::chord_length`] - chord-length: func(self: circular-sector) -> f32; - /// Get half the angle of the sector - half-angle: func(self: circular-sector) -> f32; - /// Get half the length of the chord defined by the sector - /// See [`Arc2d::half_chord_length`] - half-chord-length: func(self: circular-sector) -> f32; - /// Create a new [`CircularSector`] from a `radius` and an `angle` - new: func(radius: f32, angle: f32) -> circular-sector; - /// Create a new [`CircularSector`] from a `radius` and an `angle` in radians. - from-radians: func(radius: f32, angle: f32) -> circular-sector; - clone: func(self: circular-sector) -> circular-sector; - /// Get the midpoint of the chord defined by the sector - /// See [`Arc2d::chord_midpoint`] - chord-midpoint: func(self: circular-sector) -> vec2; - /// Get the length of the apothem of this sector - /// See [`Arc2d::apothem`] - apothem: func(self: circular-sector) -> f32; - /// Create a new [`CircularSector`] from a `radius` and a number of `turns` of a circle. - /// For instance, `0.5` turns is a semicircle. - from-turns: func(radius: f32, fraction: f32) -> circular-sector; - /// Get the angle of the sector - angle: func(self: circular-sector) -> f32; - /// Get the length of the arc defining the sector - arc-length: func(self: circular-sector) -> f32; - eq: func(self: circular-sector, other: circular-sector) -> bool; - /// Get the length of the sagitta of this sector - /// See [`Arc2d::sagitta`] - sagitta: func(self: circular-sector) -> f32; - /// Create a new [`CircularSector`] from a `radius` and an `angle` in degrees. - from-degrees: func(radius: f32, angle: f32) -> circular-sector; - /// Get the radius of the sector - radius: func(self: circular-sector) -> f32; -} - -/// Methods for CircularSegment -interface circular-segment { - use types.{reflect-reference}; - - /// Get the midpoint of the segment's base, also known as its chord - chord-midpoint: func(self: circular-segment) -> vec2; - /// Create a new [`CircularSegment`] from a `radius` and an `angle` in radians. - from-radians: func(radius: f32, angle: f32) -> circular-segment; - clone: func(self: circular-segment) -> circular-segment; - /// Get the length of the segment's base, also known as its chord - chord-length: func(self: circular-segment) -> f32; - /// Get the radius of the segment - radius: func(self: circular-segment) -> f32; - /// Create a new [`CircularSegment`] from a `radius`, and a `half_angle` in radians. - new: func(radius: f32, half-angle: f32) -> circular-segment; - /// Get the half-angle of the segment - half-angle: func(self: circular-segment) -> f32; - /// Get the angle of the segment - angle: func(self: circular-segment) -> f32; - eq: func(self: circular-segment, other: circular-segment) -> bool; - /// Create a new [`CircularSegment`] from a `radius` and a number of `turns` of a circle. - /// For instance, `0.5` turns is a semicircle. - from-turns: func(radius: f32, fraction: f32) -> circular-segment; - /// Get the length of the arc defining the segment - arc-length: func(self: circular-segment) -> f32; - /// Create a new [`CircularSegment`] from a `radius` and an `angle` in degrees. - from-degrees: func(radius: f32, angle: f32) -> circular-segment; - /// Get the length of the sagitta of this segment, also known as its height - /// See [`Arc2d::sagitta`] - sagitta: func(self: circular-segment) -> f32; - /// Get half the length of the segment's base, also known as its chord - half-chord-length: func(self: circular-segment) -> f32; - /// Get the length of the apothem of this segment, - /// which is the signed distance between the segment and the center of its circle - /// See [`Arc2d::apothem`] - apothem: func(self: circular-segment) -> f32; -} - -/// Methods for ConvexPolygon -interface convex-polygon { - use types.{reflect-reference}; - - eq: func(self: convex-polygon, other: convex-polygon) -> bool; - clone: func(self: convex-polygon) -> convex-polygon; -} - -/// Methods for Ellipse -interface ellipse { - use types.{reflect-reference}; - - eq: func(self: ellipse, other: ellipse) -> bool; - /// Returns the length of the semi-minor axis. This corresponds to the shortest radius of the ellipse. - semi-minor: func(self: ellipse) -> f32; - /// Returns the length of the semi-major axis. This corresponds to the longest radius of the ellipse. - semi-major: func(self: ellipse) -> f32; - clone: func(self: ellipse) -> ellipse; - /// Create a new `Ellipse` from half of its width and height. - /// This corresponds to the two perpendicular radii defining the ellipse. - new: func(half-width: f32, half-height: f32) -> ellipse; - /// Get the focal length of the ellipse. This corresponds to the distance between one of the foci and the center of the ellipse. - /// The focal length of an ellipse is related to its eccentricity by `eccentricity = focal_length / semi_major` - focal-length: func(self: ellipse) -> f32; - /// Returns the [eccentricity](https://en.wikipedia.org/wiki/Eccentricity_(mathematics)) of the ellipse. - /// It can be thought of as a measure of how "stretched" or elongated the ellipse is. - /// The value should be in the range [0, 1), where 0 represents a circle, and 1 represents a parabola. - eccentricity: func(self: ellipse) -> f32; - /// Create a new `Ellipse` from a given full size. - /// `size.x` is the diameter along the X axis, and `size.y` is the diameter along the Y axis. - from-size: func(size: vec2) -> ellipse; -} - -/// Methods for Line2d -interface line2d { - use types.{reflect-reference}; - - clone: func(self: line2d) -> line2d; - eq: func(self: line2d, other: line2d) -> bool; -} - -/// Methods for Plane2d -interface plane2d { - use types.{reflect-reference}; - - clone: func(self: plane2d) -> plane2d; - eq: func(self: plane2d, other: plane2d) -> bool; - /// Create a new `Plane2d` from a normal - /// # Panics - /// Panics if the given `normal` is zero (or very close to zero), or non-finite. - new: func(normal: vec2) -> plane2d; -} - -/// Methods for Polygon -interface polygon { - use types.{reflect-reference}; - - eq: func(self: polygon, other: polygon) -> bool; - /// Tests if the polygon is simple. - /// A polygon is simple if it is not self intersecting and not self tangent. - /// As such, no two edges of the polygon may cross each other and each vertex must not lie on another edge. - is-simple: func(self: polygon) -> bool; - clone: func(self: polygon) -> polygon; -} - -/// Methods for Polyline2d -interface polyline2d { - use types.{reflect-reference}; - - /// Create a new `Polyline2d` from two endpoints with subdivision points. - /// `subdivisions = 0` creates a simple line with just start and end points. - /// `subdivisions = 1` adds one point in the middle, creating 2 segments, etc. - with-subdivisions: func(start: vec2, end: vec2, subdivisions: u64) -> polyline2d; - eq: func(self: polyline2d, other: polyline2d) -> bool; - clone: func(self: polyline2d) -> polyline2d; -} - -/// Methods for Rectangle -interface rectangle { - use types.{reflect-reference}; - - /// Create a new `Rectangle` from a given full size - from-size: func(size: vec2) -> rectangle; - /// Finds the point on the rectangle that is closest to the given `point`. - /// If the point is outside the rectangle, the returned point will be on the perimeter of the rectangle. - /// Otherwise, it will be inside the rectangle and returned as is. - closest-point: func(self: rectangle, point: vec2) -> vec2; - /// Create a new `Rectangle` from a full width and height - new: func(width: f32, height: f32) -> rectangle; - clone: func(self: rectangle) -> rectangle; - /// Create a new `Rectangle` from two corner points - from-corners: func(point1: vec2, point2: vec2) -> rectangle; - eq: func(self: rectangle, other: rectangle) -> bool; - /// Create a `Rectangle` from a single length. - /// The resulting `Rectangle` will be the same size in every direction. - from-length: func(length: f32) -> rectangle; - /// Get the size of the rectangle - size: func(self: rectangle) -> vec2; -} - -/// Methods for RegularPolygon -interface regular-polygon { - use types.{reflect-reference}; - - /// Get the external angle of the regular polygon in radians. - /// This is the angle formed by two adjacent sides with points - /// within the angle being in the exterior of the polygon - external-angle-radians: func(self: regular-polygon) -> f32; - /// Get the length of one side of the regular polygon - side-length: func(self: regular-polygon) -> f32; - eq: func(self: regular-polygon, other: regular-polygon) -> bool; - /// Get the internal angle of the regular polygon in radians. - /// This is the angle formed by two adjacent sides with points - /// within the angle being in the interior of the polygon - internal-angle-radians: func(self: regular-polygon) -> f32; - clone: func(self: regular-polygon) -> regular-polygon; - /// Get the external angle of the regular polygon in degrees. - /// This is the angle formed by two adjacent sides with points - /// within the angle being in the exterior of the polygon - external-angle-degrees: func(self: regular-polygon) -> f32; - /// Get the inradius or apothem of the regular polygon. - /// This is the radius of the largest circle that can - /// be drawn within the polygon - inradius: func(self: regular-polygon) -> f32; - /// Create a new `RegularPolygon` - /// from the radius of the circumcircle and a number of sides - /// # Panics - /// Panics if `circumradius` is negative - new: func(circumradius: f32, sides: u32) -> regular-polygon; - /// Get the internal angle of the regular polygon in degrees. - /// This is the angle formed by two adjacent sides with points - /// within the angle being in the interior of the polygon - internal-angle-degrees: func(self: regular-polygon) -> f32; - /// Get the radius of the circumcircle on which all vertices - /// of the regular polygon lie - circumradius: func(self: regular-polygon) -> f32; -} - -/// Methods for Rhombus -interface rhombus { - use types.{reflect-reference}; - - /// Get the length of each side of the rhombus - side: func(self: rhombus) -> f32; - /// Create a new `Rhombus` from a vertical and horizontal diagonal sizes. - new: func(horizontal-diagonal: f32, vertical-diagonal: f32) -> rhombus; - /// Create a new `Rhombus` from a given inradius with all inner angles equal. - from-inradius: func(inradius: f32) -> rhombus; - clone: func(self: rhombus) -> rhombus; - /// Create a new `Rhombus` from a side length with all inner angles equal. - from-side: func(side: f32) -> rhombus; - /// Get the radius of the largest circle that can - /// be drawn within the rhombus - inradius: func(self: rhombus) -> f32; - eq: func(self: rhombus, other: rhombus) -> bool; - /// Get the radius of the circumcircle on which all vertices - /// of the rhombus lie - circumradius: func(self: rhombus) -> f32; - /// Finds the point on the rhombus that is closest to the given `point`. - /// If the point is outside the rhombus, the returned point will be on the perimeter of the rhombus. - /// Otherwise, it will be inside the rhombus and returned as is. - closest-point: func(self: rhombus, point: vec2) -> vec2; -} - -/// Methods for Segment2d -interface segment2d { - use types.{reflect-reference}; - - /// Returns the line segment with its direction reversed by swapping the endpoints. - reversed: func(self: segment2d) -> segment2d; - /// Compute the non-normalized clockwise normal on the right-hand side of the line segment. - /// The length of the normal is the distance between the endpoints. - scaled-right-normal: func(self: segment2d) -> vec2; - /// Compute the segment translated by the given vector. - translated: func(self: segment2d, translation: vec2) -> segment2d; - /// Reverses the direction of the line segment by swapping the endpoints. - reverse: func(self: segment2d); - /// Create a new `Segment2d` starting from the origin of the given `ray`, - /// going in the direction of the ray for the given `length`. - /// The endpoints will be at `ray.origin` and `ray.origin + length * ray.direction`. - from-ray-and-length: func(ray: ray2d, length: f32) -> segment2d; - /// Get the position of the second endpoint of the line segment. - point2: func(self: segment2d) -> vec2; - /// Compute the non-normalized counterclockwise normal on the left-hand side of the line segment. - /// The length of the normal is the distance between the endpoints. - scaled-left-normal: func(self: segment2d) -> vec2; - /// Compute the normalized clockwise normal on the right-hand side of the line segment. - /// For the non-panicking version, see [`Segment2d::try_right_normal`]. - /// # Panics - /// Panics if a valid normal could not be computed, for example when the endpoints are coincident, NaN, or infinite. - right-normal: func(self: segment2d) -> dir2; - /// Create a new `Segment2d` centered at the origin from a vector representing - /// the direction and length of the line segment. - /// The endpoints will be at `-scaled_direction / 2.0` and `scaled_direction / 2.0`. - from-scaled-direction: func(scaled-direction: vec2) -> segment2d; - eq: func(self: segment2d, other: segment2d) -> bool; - /// Compute the segment rotated around the given point by the given rotation. - rotated-around: func(self: segment2d, rotation: rot2, point: vec2) -> segment2d; - /// Returns the point on the [`Segment2d`] that is closest to the specified `point`. - closest-point: func(self: segment2d, point: vec2) -> vec2; - /// Compute the normalized direction pointing from the first endpoint to the second endpoint. - /// For the non-panicking version, see [`Segment2d::try_direction`]. - /// # Panics - /// Panics if a valid direction could not be computed, for example when the endpoints are coincident, NaN, or infinite. - direction: func(self: segment2d) -> dir2; - /// Compute the segment with a new length, keeping the same direction and center. - resized: func(self: segment2d, length: f32) -> segment2d; - /// Compute the segment rotated around the origin by the given rotation. - rotated: func(self: segment2d, rotation: rot2) -> segment2d; - /// Compute the midpoint between the two endpoints of the line segment. - center: func(self: segment2d) -> vec2; - clone: func(self: segment2d) -> segment2d; - /// Get the position of the first endpoint of the line segment. - point1: func(self: segment2d) -> vec2; - /// Create a new `Segment2d` centered at the origin with the given direction and length. - /// The endpoints will be at `-direction * length / 2.0` and `direction * length / 2.0`. - from-direction-and-length: func(direction: dir2, length: f32) -> segment2d; - /// Create a new `Segment2d` from its endpoints. - new: func(point1: vec2, point2: vec2) -> segment2d; - /// Compute the length of the line segment. - length: func(self: segment2d) -> f32; - /// Compute the normalized counterclockwise normal on the left-hand side of the line segment. - /// For the non-panicking version, see [`Segment2d::try_left_normal`]. - /// # Panics - /// Panics if a valid normal could not be computed, for example when the endpoints are coincident, NaN, or infinite. - left-normal: func(self: segment2d) -> dir2; - /// Compute the segment rotated around its own center. - rotated-around-center: func(self: segment2d, rotation: rot2) -> segment2d; - /// Compute the squared length of the line segment. - length-squared: func(self: segment2d) -> f32; - /// Compute the vector from the first endpoint to the second endpoint. - scaled-direction: func(self: segment2d) -> vec2; - /// Compute the segment with its center at the origin, keeping the same direction and length. - centered: func(self: segment2d) -> segment2d; -} - -/// Methods for Triangle2d -interface triangle2d { - use types.{reflect-reference}; - - /// This triangle but reversed. - reversed: func(self: triangle2d) -> triangle2d; - /// Checks if the triangle is degenerate, meaning it has zero area. - /// A triangle is degenerate if the cross product of the vectors `ab` and `ac` has a length less than `10e-7`. - /// This indicates that the three vertices are collinear or nearly collinear. - is-degenerate: func(self: triangle2d) -> bool; - /// Create a new `Triangle2d` from points `a`, `b`, and `c` - new: func(a: vec2, b: vec2, c: vec2) -> triangle2d; - clone: func(self: triangle2d) -> triangle2d; - eq: func(self: triangle2d, other: triangle2d) -> bool; - /// Reverse the [`WindingOrder`] of the triangle - /// by swapping the first and last vertices. - reverse: func(self: triangle2d); - /// Checks if the triangle is obtuse, meaning one angle is greater than 90 degrees - is-obtuse: func(self: triangle2d) -> bool; - /// Checks if the triangle is acute, meaning all angles are less than 90 degrees - is-acute: func(self: triangle2d) -> bool; -} - -/// Methods for Capsule3d -interface capsule3d { - use types.{reflect-reference}; - - clone: func(self: capsule3d) -> capsule3d; - /// Get the part connecting the hemispherical ends - /// of the capsule as a [`Cylinder`] - to-cylinder: func(self: capsule3d) -> cylinder; - eq: func(self: capsule3d, other: capsule3d) -> bool; - /// Create a new `Capsule3d` from a radius and length - new: func(radius: f32, length: f32) -> capsule3d; -} - -/// Methods for Cone -interface cone { - use types.{reflect-reference}; - - /// Create a new [`Cone`] from a radius and height. - new: func(radius: f32, height: f32) -> cone; - /// Get the slant height of the cone, the length of the line segment - /// connecting a point on the base to the apex - slant-height: func(self: cone) -> f32; - /// Get the surface area of the base of the cone - base-area: func(self: cone) -> f32; - /// Get the base of the cone as a [`Circle`] - base: func(self: cone) -> circle; - clone: func(self: cone) -> cone; - eq: func(self: cone, other: cone) -> bool; - /// Get the surface area of the side of the cone, - /// also known as the lateral area - lateral-area: func(self: cone) -> f32; -} - -/// Methods for ConicalFrustum -interface conical-frustum { - use types.{reflect-reference}; - - /// Get the surface area of the side of the conical frustum, - /// also known as the lateral area - lateral-area: func(self: conical-frustum) -> f32; - /// Get the bottom base of the conical frustum as a [`Circle`] - bottom-base: func(self: conical-frustum) -> circle; - clone: func(self: conical-frustum) -> conical-frustum; - /// Get the surface area of the bottom base of the conical frustum - bottom-base-area: func(self: conical-frustum) -> f32; - eq: func(self: conical-frustum, other: conical-frustum) -> bool; - /// Get the top base of the conical frustum as a [`Circle`] - top-base: func(self: conical-frustum) -> circle; - /// Get the slant height of the conical frustum, the length of the line segment - /// connecting a point on the base to the closest point on the top - slant-height: func(self: conical-frustum) -> f32; - /// Get the surface area of the top base of the conical frustum - top-base-area: func(self: conical-frustum) -> f32; -} - -/// Methods for Cuboid -interface cuboid { - use types.{reflect-reference}; - - /// Create a new `Cuboid` from a full x, y, and z length - new: func(x-length: f32, y-length: f32, z-length: f32) -> cuboid; - clone: func(self: cuboid) -> cuboid; - /// Finds the point on the cuboid that is closest to the given `point`. - /// If the point is outside the cuboid, the returned point will be on the surface of the cuboid. - /// Otherwise, it will be inside the cuboid and returned as is. - closest-point: func(self: cuboid, point: vec3) -> vec3; - /// Create a `Cuboid` from a single length. - /// The resulting `Cuboid` will be the same size in every direction. - from-length: func(length: f32) -> cuboid; - /// Create a new `Cuboid` from a given full size - from-size: func(size: vec3) -> cuboid; - /// Get the size of the cuboid - size: func(self: cuboid) -> vec3; - eq: func(self: cuboid, other: cuboid) -> bool; - /// Create a new `Cuboid` from two corner points - from-corners: func(point1: vec3, point2: vec3) -> cuboid; -} - -/// Methods for Cylinder -interface cylinder { - use types.{reflect-reference}; - - /// Get the surface area of the side of the cylinder, - /// also known as the lateral area - lateral-area: func(self: cylinder) -> f32; - /// Get the surface area of one base of the cylinder - base-area: func(self: cylinder) -> f32; - clone: func(self: cylinder) -> cylinder; - eq: func(self: cylinder, other: cylinder) -> bool; - /// Get the base of the cylinder as a [`Circle`] - base: func(self: cylinder) -> circle; - /// Create a new `Cylinder` from a radius and full height - new: func(radius: f32, height: f32) -> cylinder; -} - -/// Methods for InfinitePlane3d -interface infinite-plane3d { - use types.{reflect-reference}; - - clone: func(self: infinite-plane3d) -> infinite-plane3d; - /// Computes an [`Isometry3d`] which transforms points from the plane in 3D space with the given - /// `origin` to the XY-plane. - /// ## Guarantees - /// * the transformation is a [congruence] meaning it will preserve all distances and angles of - /// the transformed geometry - /// * uses the least rotation possible to transform the geometry - /// * if two geometries are transformed with the same isometry, then the relations between - /// them, like distances, are also preserved - /// * compared to projections, the transformation is lossless (up to floating point errors) - /// reversible - /// ## Non-Guarantees - /// * the rotation used is generally not unique - /// * the orientation of the transformed geometry in the XY plane might be arbitrary, to - /// enforce some kind of alignment the user has to use an extra transformation ontop of this - /// one - /// See [`isometries_xy`] for example usescases. - /// [congruence]: https://en.wikipedia.org/wiki/Congruence_(geometry) - /// [`isometries_xy`]: `InfinitePlane3d::isometries_xy` - isometry-into-xy: func(self: infinite-plane3d, origin: vec3) -> isometry3d; - /// Computes an [`Isometry3d`] which transforms points from the XY-plane to this plane with the - /// given `origin`. - /// ## Guarantees - /// * the transformation is a [congruence] meaning it will preserve all distances and angles of - /// the transformed geometry - /// * uses the least rotation possible to transform the geometry - /// * if two geometries are transformed with the same isometry, then the relations between - /// them, like distances, are also preserved - /// * compared to projections, the transformation is lossless (up to floating point errors) - /// reversible - /// ## Non-Guarantees - /// * the rotation used is generally not unique - /// * the orientation of the transformed geometry in the XY plane might be arbitrary, to - /// enforce some kind of alignment the user has to use an extra transformation ontop of this - /// one - /// See [`isometries_xy`] for example usescases. - /// [congruence]: https://en.wikipedia.org/wiki/Congruence_(geometry) - /// [`isometries_xy`]: `InfinitePlane3d::isometries_xy` - isometry-from-xy: func(self: infinite-plane3d, origin: vec3) -> isometry3d; - eq: func(self: infinite-plane3d, other: infinite-plane3d) -> bool; -} - -/// Methods for Line3d -interface line3d { - use types.{reflect-reference}; - - eq: func(self: line3d, other: line3d) -> bool; - clone: func(self: line3d) -> line3d; -} - -/// Methods for Plane3d -interface plane3d { - use types.{reflect-reference}; - - eq: func(self: plane3d, other: plane3d) -> bool; - /// Create a new `Plane3d` from a normal and a half size - /// # Panics - /// Panics if the given `normal` is zero (or very close to zero), or non-finite. - new: func(normal: vec3, half-size: vec2) -> plane3d; - clone: func(self: plane3d) -> plane3d; -} - -/// Methods for Polyline3d -interface polyline3d { - use types.{reflect-reference}; - - clone: func(self: polyline3d) -> polyline3d; - eq: func(self: polyline3d, other: polyline3d) -> bool; - /// Create a new `Polyline3d` from two endpoints with subdivision points. - /// `subdivisions = 0` creates a simple line with just start and end points. - /// `subdivisions = 1` adds one point in the middle, creating 2 segments, etc. - with-subdivisions: func(start: vec3, end: vec3, subdivisions: u64) -> polyline3d; -} - -/// Methods for Segment3d -interface segment3d { - use types.{reflect-reference}; - - /// Reverses the direction of the line segment by swapping the endpoints. - reverse: func(self: segment3d); - eq: func(self: segment3d, other: segment3d) -> bool; - /// Compute the length of the line segment. - length: func(self: segment3d) -> f32; - /// Compute the segment with a new length, keeping the same direction and center. - resized: func(self: segment3d, length: f32) -> segment3d; - /// Create a new `Segment3d` starting from the origin of the given `ray`, - /// going in the direction of the ray for the given `length`. - /// The endpoints will be at `ray.origin` and `ray.origin + length * ray.direction`. - from-ray-and-length: func(ray: ray3d, length: f32) -> segment3d; - /// Compute the midpoint between the two endpoints of the line segment. - center: func(self: segment3d) -> vec3; - /// Create a new `Segment3d` centered at the origin from a vector representing - /// the direction and length of the line segment. - /// The endpoints will be at `-scaled_direction / 2.0` and `scaled_direction / 2.0`. - from-scaled-direction: func(scaled-direction: vec3) -> segment3d; - /// Compute the segment rotated around the given point by the given rotation. - rotated-around: func(self: segment3d, rotation: quat, point: vec3) -> segment3d; - /// Compute the squared length of the line segment. - length-squared: func(self: segment3d) -> f32; - /// Create a new `Segment3d` centered at the origin with the given direction and length. - /// The endpoints will be at `-direction * length / 2.0` and `direction * length / 2.0`. - from-direction-and-length: func(direction: dir3, length: f32) -> segment3d; - /// Compute the segment translated by the given vector. - translated: func(self: segment3d, translation: vec3) -> segment3d; - /// Get the position of the first endpoint of the line segment. - point1: func(self: segment3d) -> vec3; - /// Returns the line segment with its direction reversed by swapping the endpoints. - reversed: func(self: segment3d) -> segment3d; - /// Compute the segment rotated around the origin by the given rotation. - rotated: func(self: segment3d, rotation: quat) -> segment3d; - /// Compute the vector from the first endpoint to the second endpoint. - scaled-direction: func(self: segment3d) -> vec3; - /// Compute the segment with its center at the origin, keeping the same direction and length. - centered: func(self: segment3d) -> segment3d; - /// Compute the normalized direction pointing from the first endpoint to the second endpoint. - /// For the non-panicking version, see [`Segment3d::try_direction`]. - /// # Panics - /// Panics if a valid direction could not be computed, for example when the endpoints are coincident, NaN, or infinite. - direction: func(self: segment3d) -> dir3; - /// Create a new `Segment3d` from its endpoints. - new: func(point1: vec3, point2: vec3) -> segment3d; - /// Get the position of the second endpoint of the line segment. - point2: func(self: segment3d) -> vec3; - clone: func(self: segment3d) -> segment3d; - /// Returns the point on the [`Segment3d`] that is closest to the specified `point`. - closest-point: func(self: segment3d, point: vec3) -> vec3; - /// Compute the segment rotated around its own center. - rotated-around-center: func(self: segment3d, rotation: quat) -> segment3d; -} - -/// Methods for Sphere -interface sphere { - use types.{reflect-reference}; - - clone: func(self: sphere) -> sphere; - eq: func(self: sphere, other: sphere) -> bool; - /// Finds the point on the sphere that is closest to the given `point`. - /// If the point is outside the sphere, the returned point will be on the surface of the sphere. - /// Otherwise, it will be inside the sphere and returned as is. - closest-point: func(self: sphere, point: vec3) -> vec3; - /// Create a new [`Sphere`] from a `radius` - new: func(radius: f32) -> sphere; - /// Get the diameter of the sphere - diameter: func(self: sphere) -> f32; -} - -/// Methods for Tetrahedron -interface tetrahedron { - use types.{reflect-reference}; - - /// Get the signed volume of the tetrahedron. - /// If it's negative, the normal vector of the face defined by - /// the first three points using the right-hand rule points - /// away from the fourth vertex. - signed-volume: func(self: tetrahedron) -> f32; - eq: func(self: tetrahedron, other: tetrahedron) -> bool; - /// Get the centroid of the tetrahedron. - /// This function finds the geometric center of the tetrahedron - /// by averaging the vertices: `centroid = (a + b + c + d) / 4`. - centroid: func(self: tetrahedron) -> vec3; - clone: func(self: tetrahedron) -> tetrahedron; - /// Create a new [`Tetrahedron`] from points `a`, `b`, `c` and `d`. - new: func(a: vec3, b: vec3, c: vec3, d: vec3) -> tetrahedron; -} - -/// Methods for Torus -interface torus { - use types.{reflect-reference}; - - /// Create a new `Torus` from an inner and outer radius. - /// The inner radius is the radius of the hole, and the outer radius - /// is the radius of the entire object - new: func(inner-radius: f32, outer-radius: f32) -> torus; - clone: func(self: torus) -> torus; - /// Get the inner radius of the torus. - /// For a ring torus, this corresponds to the radius of the hole, - /// or `major_radius - minor_radius` - inner-radius: func(self: torus) -> f32; - eq: func(self: torus, other: torus) -> bool; - /// Get the outer radius of the torus. - /// This corresponds to the overall radius of the entire object, - /// or `major_radius + minor_radius` - outer-radius: func(self: torus) -> f32; -} - -/// Methods for Triangle3d -interface triangle3d { - use types.{reflect-reference}; - - /// Checks if the triangle is acute, meaning all angles are less than 90 degrees - is-acute: func(self: triangle3d) -> bool; - /// Get the centroid of the triangle. - /// This function finds the geometric center of the triangle by averaging the vertices: - /// `centroid = (a + b + c) / 3`. - centroid: func(self: triangle3d) -> vec3; - /// Create a new [`Triangle3d`] from points `a`, `b`, and `c`. - new: func(a: vec3, b: vec3, c: vec3) -> triangle3d; - clone: func(self: triangle3d) -> triangle3d; - /// Get the circumcenter of the triangle. - circumcenter: func(self: triangle3d) -> vec3; - /// Checks if the triangle is obtuse, meaning one angle is greater than 90 degrees - is-obtuse: func(self: triangle3d) -> bool; - /// Reverse the triangle by swapping the first and last vertices. - reverse: func(self: triangle3d); - /// Checks if the triangle is degenerate, meaning it has zero area. - /// A triangle is degenerate if the cross product of the vectors `ab` and `ac` has a length less than `10e-7`. - /// This indicates that the three vertices are collinear or nearly collinear. - is-degenerate: func(self: triangle3d) -> bool; - eq: func(self: triangle3d, other: triangle3d) -> bool; - /// This triangle but reversed. - reversed: func(self: triangle3d) -> triangle3d; -} - -/// Methods for Ray2d -interface ray2d { - use types.{reflect-reference}; - - /// Returns the point at a given distance along the ray. - get-point: func(self: ray2d, distance: f32) -> vec2; - /// Creates a new `Ray2d` from a given origin and direction - new: func(origin: vec2, direction: dir2) -> ray2d; - clone: func(self: ray2d) -> ray2d; - eq: func(self: ray2d, other: ray2d) -> bool; - /// Returns the distance to a plane if the ray intersects it. - /// Use [`Ray2d::plane_intersection_point`] to get the intersection point directly. - intersect-plane: func(self: ray2d, plane-origin: vec2, plane: plane2d) -> option; -} - -/// Methods for Ray3d -interface ray3d { - use types.{reflect-reference}; - - /// Returns the point at a given distance along the ray - get-point: func(self: ray3d, distance: f32) -> vec3; - clone: func(self: ray3d) -> ray3d; - /// Creates a new `Ray3d` from a given origin and direction - new: func(origin: vec3, direction: dir3) -> ray3d; - /// Returns the distance to a plane if the ray intersects it - /// Use [`Ray3d::plane_intersection_point`] to get the intersection point directly. - intersect-plane: func(self: ray3d, plane-origin: vec3, plane: infinite-plane3d) -> option; - eq: func(self: ray3d, other: ray3d) -> bool; -} - -/// Methods for IRect -interface irect { - use types.{reflect-reference}; - - /// Returns self as [`URect`] (u32) - as-urect: func(self: irect) -> urect; - clone: func(self: irect) -> irect; - /// Check if the rectangle is empty. - /// # Examples - /// ``` - /// # use bevy_math::{IRect, IVec2}; - /// let r = IRect::from_corners(IVec2::ZERO, IVec2::new(0, 1)); // w=0 h=1 - /// assert!(r.is_empty()); - /// ``` - is-empty: func(self: irect) -> bool; - /// Check if a point lies within this rectangle, inclusive of its edges. - /// # Examples - /// ``` - /// # use bevy_math::IRect; - /// let r = IRect::new(0, 0, 5, 1); // w=5 h=1 - /// assert!(r.contains(r.center())); - /// assert!(r.contains(r.min)); - /// assert!(r.contains(r.max)); - /// ``` - contains: func(self: irect, point: ivec2) -> bool; - /// Build a new rectangle formed of the intersection of this rectangle and another rectangle. - /// The intersection is the largest rectangle enclosed in both rectangles. If the intersection - /// is empty, this method returns an empty rectangle ([`IRect::is_empty()`] returns `true`), but - /// the actual values of [`IRect::min`] and [`IRect::max`] are implementation-dependent. - /// # Examples - /// ``` - /// # use bevy_math::{IRect, IVec2}; - /// let r1 = IRect::new(0, 0, 5, 1); // w=5 h=1 - /// let r2 = IRect::new(1, -1, 3, 3); // w=2 h=4 - /// let r = r1.intersect(r2); - /// assert_eq!(r.min, IVec2::new(1, 0)); - /// assert_eq!(r.max, IVec2::new(3, 1)); - /// ``` - intersect: func(self: irect, other: irect) -> irect; - /// Create a new rectangle from two corner points. - /// The two points do not need to be the minimum and/or maximum corners. - /// They only need to be two opposite corners. - /// # Examples - /// ``` - /// # use bevy_math::{IRect, IVec2}; - /// // Unit rect from [0,0] to [1,1] - /// let r = IRect::from_corners(IVec2::ZERO, IVec2::ONE); // w=1 h=1 - /// // Same; the points do not need to be ordered - /// let r = IRect::from_corners(IVec2::ONE, IVec2::ZERO); // w=1 h=1 - /// ``` - from-corners: func(p0: ivec2, p1: ivec2) -> irect; - /// Create a new rectangle from two corner points. - /// The two points do not need to be the minimum and/or maximum corners. - /// They only need to be two opposite corners. - /// # Examples - /// ``` - /// # use bevy_math::IRect; - /// let r = IRect::new(0, 4, 10, 6); // w=10 h=2 - /// let r = IRect::new(2, 3, 5, -1); // w=3 h=4 - /// ``` - new: func(x0: s32, y0: s32, x1: s32, y1: s32) -> irect; - /// Rectangle half-size. - /// # Rounding Behavior - /// If the full size contains odd numbers they will be rounded down to the nearest whole number when calculating the half size. - /// # Examples - /// ``` - /// # use bevy_math::{IRect, IVec2}; - /// let r = IRect::new(0, 0, 4, 3); // w=4 h=3 - /// assert_eq!(r.half_size(), IVec2::new(2, 1)); - /// ``` - half-size: func(self: irect) -> ivec2; - /// The center point of the rectangle. - /// # Rounding Behavior - /// If the (min + max) contains odd numbers they will be rounded down to the nearest whole number when calculating the center. - /// # Examples - /// ``` - /// # use bevy_math::{IRect, IVec2}; - /// let r = IRect::new(0, 0, 5, 2); // w=5 h=2 - /// assert_eq!(r.center(), IVec2::new(2, 1)); - /// ``` - center: func(self: irect) -> ivec2; - /// Create a new rectangle from its center and half-size. - /// # Panics - /// This method panics if any of the components of the half-size is negative. - /// # Examples - /// ``` - /// # use bevy_math::{IRect, IVec2}; - /// let r = IRect::from_center_half_size(IVec2::ZERO, IVec2::ONE); // w=2 h=2 - /// assert_eq!(r.min, IVec2::splat(-1)); - /// assert_eq!(r.max, IVec2::splat(1)); - /// ``` - from-center-half-size: func(origin: ivec2, half-size: ivec2) -> irect; - /// Build a new rectangle formed of the union of this rectangle and another rectangle. - /// The union is the smallest rectangle enclosing both rectangles. - /// # Examples - /// ``` - /// # use bevy_math::{IRect, IVec2}; - /// let r1 = IRect::new(0, 0, 5, 1); // w=5 h=1 - /// let r2 = IRect::new(1, -1, 3, 3); // w=2 h=4 - /// let r = r1.union(r2); - /// assert_eq!(r.min, IVec2::new(0, -1)); - /// assert_eq!(r.max, IVec2::new(5, 3)); - /// ``` - union: func(self: irect, other: irect) -> irect; - /// Rectangle size. - /// # Examples - /// ``` - /// # use bevy_math::{IRect, IVec2}; - /// let r = IRect::new(0, 0, 5, 1); // w=5 h=1 - /// assert_eq!(r.size(), IVec2::new(5, 1)); - /// ``` - size: func(self: irect) -> ivec2; - /// Create a new rectangle by expanding it evenly on all sides. - /// A positive expansion value produces a larger rectangle, - /// while a negative expansion value produces a smaller rectangle. - /// If this would result in zero or negative width or height, [`IRect::EMPTY`] is returned instead. - /// # Examples - /// ``` - /// # use bevy_math::{IRect, IVec2}; - /// let r = IRect::new(0, 0, 5, 1); // w=5 h=1 - /// let r2 = r.inflate(3); // w=11 h=7 - /// assert_eq!(r2.min, IVec2::splat(-3)); - /// assert_eq!(r2.max, IVec2::new(8, 4)); - /// let r = IRect::new(0, -1, 4, 3); // w=4 h=4 - /// let r2 = r.inflate(-1); // w=2 h=2 - /// assert_eq!(r2.min, IVec2::new(1, 0)); - /// assert_eq!(r2.max, IVec2::new(3, 2)); - /// ``` - inflate: func(self: irect, expansion: s32) -> irect; - /// Build a new rectangle formed of the union of this rectangle and a point. - /// The union is the smallest rectangle enclosing both the rectangle and the point. If the - /// point is already inside the rectangle, this method returns a copy of the rectangle. - /// # Examples - /// ``` - /// # use bevy_math::{IRect, IVec2}; - /// let r = IRect::new(0, 0, 5, 1); // w=5 h=1 - /// let u = r.union_point(IVec2::new(3, 6)); - /// assert_eq!(u.min, IVec2::ZERO); - /// assert_eq!(u.max, IVec2::new(5, 6)); - /// ``` - union-point: func(self: irect, other: ivec2) -> irect; - /// Rectangle height (max.y - min.y). - /// # Examples - /// ``` - /// # use bevy_math::IRect; - /// let r = IRect::new(0, 0, 5, 1); // w=5 h=1 - /// assert_eq!(r.height(), 1); - /// ``` - height: func(self: irect) -> s32; - eq: func(self: irect, other: irect) -> bool; - /// Create a new rectangle from its center and size. - /// # Rounding Behavior - /// If the size contains odd numbers they will be rounded down to the nearest whole number. - /// # Panics - /// This method panics if any of the components of the size is negative. - /// # Examples - /// ``` - /// # use bevy_math::{IRect, IVec2}; - /// let r = IRect::from_center_size(IVec2::ZERO, IVec2::new(3, 2)); // w=2 h=2 - /// assert_eq!(r.min, IVec2::splat(-1)); - /// assert_eq!(r.max, IVec2::splat(1)); - /// ``` - from-center-size: func(origin: ivec2, size: ivec2) -> irect; - /// Rectangle width (max.x - min.x). - /// # Examples - /// ``` - /// # use bevy_math::IRect; - /// let r = IRect::new(0, 0, 5, 1); // w=5 h=1 - /// assert_eq!(r.width(), 5); - /// ``` - width: func(self: irect) -> s32; - assert-receiver-is-total-eq: func(self: irect); - /// Returns self as [`Rect`] (f32) - as-rect: func(self: irect) -> rect; -} - -/// Methods for Rect -interface rect { - use types.{reflect-reference}; - - clone: func(self: rect) -> rect; - /// Returns self as [`URect`] (u32) - as-urect: func(self: rect) -> urect; - /// Return the area of this rectangle. - /// # Examples - /// ``` - /// # use bevy_math::Rect; - /// let r = Rect::new(0., 0., 10., 10.); // w=10 h=10 - /// assert_eq!(r.area(), 100.0); - /// ``` - area: func(self: rect) -> f32; - /// Rectangle half-size. - /// # Examples - /// ``` - /// # use bevy_math::{Rect, Vec2}; - /// let r = Rect::new(0., 0., 5., 1.); // w=5 h=1 - /// assert!(r.half_size().abs_diff_eq(Vec2::new(2.5, 0.5), 1e-5)); - /// ``` - half-size: func(self: rect) -> vec2; - /// Build a new rectangle formed of the union of this rectangle and another rectangle. - /// The union is the smallest rectangle enclosing both rectangles. - /// # Examples - /// ``` - /// # use bevy_math::{Rect, Vec2}; - /// let r1 = Rect::new(0., 0., 5., 1.); // w=5 h=1 - /// let r2 = Rect::new(1., -1., 3., 3.); // w=2 h=4 - /// let r = r1.union(r2); - /// assert!(r.min.abs_diff_eq(Vec2::new(0., -1.), 1e-5)); - /// assert!(r.max.abs_diff_eq(Vec2::new(5., 3.), 1e-5)); - /// ``` - union: func(self: rect, other: rect) -> rect; - /// Build a new rectangle from this one with its coordinates expressed - /// relative to `other` in a normalized ([0..1] x [0..1]) coordinate system. - /// # Examples - /// ``` - /// # use bevy_math::{Rect, Vec2}; - /// let r = Rect::new(2., 3., 4., 6.); - /// let s = Rect::new(0., 0., 10., 10.); - /// let n = r.normalize(s); - /// assert_eq!(n.min.x, 0.2); - /// assert_eq!(n.min.y, 0.3); - /// assert_eq!(n.max.x, 0.4); - /// assert_eq!(n.max.y, 0.6); - /// ``` - normalize: func(self: rect, other: rect) -> rect; - /// Rectangle size. - /// # Examples - /// ``` - /// # use bevy_math::{Rect, Vec2}; - /// let r = Rect::new(0., 0., 5., 1.); // w=5 h=1 - /// assert!(r.size().abs_diff_eq(Vec2::new(5., 1.), 1e-5)); - /// ``` - size: func(self: rect) -> vec2; - eq: func(self: rect, other: rect) -> bool; - /// Build a new rectangle formed of the union of this rectangle and a point. - /// The union is the smallest rectangle enclosing both the rectangle and the point. If the - /// point is already inside the rectangle, this method returns a copy of the rectangle. - /// # Examples - /// ``` - /// # use bevy_math::{Rect, Vec2}; - /// let r = Rect::new(0., 0., 5., 1.); // w=5 h=1 - /// let u = r.union_point(Vec2::new(3., 6.)); - /// assert!(u.min.abs_diff_eq(Vec2::ZERO, 1e-5)); - /// assert!(u.max.abs_diff_eq(Vec2::new(5., 6.), 1e-5)); - /// ``` - union-point: func(self: rect, other: vec2) -> rect; - /// Create a new rectangle from two corner points. - /// The two points do not need to be the minimum and/or maximum corners. - /// They only need to be two opposite corners. - /// # Examples - /// ``` - /// # use bevy_math::Rect; - /// let r = Rect::new(0., 4., 10., 6.); // w=10 h=2 - /// let r = Rect::new(2., 3., 5., -1.); // w=3 h=4 - /// ``` - new: func(x0: f32, y0: f32, x1: f32, y1: f32) -> rect; - /// Check if the rectangle is empty. - /// # Examples - /// ``` - /// # use bevy_math::{Rect, Vec2}; - /// let r = Rect::from_corners(Vec2::ZERO, Vec2::new(0., 1.)); // w=0 h=1 - /// assert!(r.is_empty()); - /// ``` - is-empty: func(self: rect) -> bool; - /// Create a new rectangle from its center and size. - /// # Panics - /// This method panics if any of the components of the size is negative. - /// # Examples - /// ``` - /// # use bevy_math::{Rect, Vec2}; - /// let r = Rect::from_center_size(Vec2::ZERO, Vec2::ONE); // w=1 h=1 - /// assert!(r.min.abs_diff_eq(Vec2::splat(-0.5), 1e-5)); - /// assert!(r.max.abs_diff_eq(Vec2::splat(0.5), 1e-5)); - /// ``` - from-center-size: func(origin: vec2, size: vec2) -> rect; - /// Returns self as [`IRect`] (i32) - as-irect: func(self: rect) -> irect; - /// Create a new rectangle from its center and half-size. - /// # Panics - /// This method panics if any of the components of the half-size is negative. - /// # Examples - /// ``` - /// # use bevy_math::{Rect, Vec2}; - /// let r = Rect::from_center_half_size(Vec2::ZERO, Vec2::ONE); // w=2 h=2 - /// assert!(r.min.abs_diff_eq(Vec2::splat(-1.), 1e-5)); - /// assert!(r.max.abs_diff_eq(Vec2::splat(1.), 1e-5)); - /// ``` - from-center-half-size: func(origin: vec2, half-size: vec2) -> rect; - /// Build a new rectangle formed of the intersection of this rectangle and another rectangle. - /// The intersection is the largest rectangle enclosed in both rectangles. If the intersection - /// is empty, this method returns an empty rectangle ([`Rect::is_empty()`] returns `true`), but - /// the actual values of [`Rect::min`] and [`Rect::max`] are implementation-dependent. - /// # Examples - /// ``` - /// # use bevy_math::{Rect, Vec2}; - /// let r1 = Rect::new(0., 0., 5., 1.); // w=5 h=1 - /// let r2 = Rect::new(1., -1., 3., 3.); // w=2 h=4 - /// let r = r1.intersect(r2); - /// assert!(r.min.abs_diff_eq(Vec2::new(1., 0.), 1e-5)); - /// assert!(r.max.abs_diff_eq(Vec2::new(3., 1.), 1e-5)); - /// ``` - intersect: func(self: rect, other: rect) -> rect; - /// Create a new rectangle from two corner points. - /// The two points do not need to be the minimum and/or maximum corners. - /// They only need to be two opposite corners. - /// # Examples - /// ``` - /// # use bevy_math::{Rect, Vec2}; - /// // Unit rect from [0,0] to [1,1] - /// let r = Rect::from_corners(Vec2::ZERO, Vec2::ONE); // w=1 h=1 - /// // Same; the points do not need to be ordered - /// let r = Rect::from_corners(Vec2::ONE, Vec2::ZERO); // w=1 h=1 - /// ``` - from-corners: func(p0: vec2, p1: vec2) -> rect; - /// Check if a point lies within this rectangle, inclusive of its edges. - /// # Examples - /// ``` - /// # use bevy_math::Rect; - /// let r = Rect::new(0., 0., 5., 1.); // w=5 h=1 - /// assert!(r.contains(r.center())); - /// assert!(r.contains(r.min)); - /// assert!(r.contains(r.max)); - /// ``` - contains: func(self: rect, point: vec2) -> bool; - /// Rectangle height (max.y - min.y). - /// # Examples - /// ``` - /// # use bevy_math::Rect; - /// let r = Rect::new(0., 0., 5., 1.); // w=5 h=1 - /// assert!((r.height() - 1.).abs() <= 1e-5); - /// ``` - height: func(self: rect) -> f32; - /// Create a new rectangle by expanding it evenly on all sides. - /// A positive expansion value produces a larger rectangle, - /// while a negative expansion value produces a smaller rectangle. - /// If this would result in zero or negative width or height, [`Rect::EMPTY`] is returned instead. - /// # Examples - /// ``` - /// # use bevy_math::{Rect, Vec2}; - /// let r = Rect::new(0., 0., 5., 1.); // w=5 h=1 - /// let r2 = r.inflate(3.); // w=11 h=7 - /// assert!(r2.min.abs_diff_eq(Vec2::splat(-3.), 1e-5)); - /// assert!(r2.max.abs_diff_eq(Vec2::new(8., 4.), 1e-5)); - /// let r = Rect::new(0., -1., 6., 7.); // w=6 h=8 - /// let r2 = r.inflate(-2.); // w=11 h=7 - /// assert!(r2.min.abs_diff_eq(Vec2::new(2., 1.), 1e-5)); - /// assert!(r2.max.abs_diff_eq(Vec2::new(4., 5.), 1e-5)); - /// ``` - inflate: func(self: rect, expansion: f32) -> rect; - /// Rectangle width (max.x - min.x). - /// # Examples - /// ``` - /// # use bevy_math::Rect; - /// let r = Rect::new(0., 0., 5., 1.); // w=5 h=1 - /// assert!((r.width() - 5.).abs() <= 1e-5); - /// ``` - width: func(self: rect) -> f32; - /// The center point of the rectangle. - /// # Examples - /// ``` - /// # use bevy_math::{Rect, Vec2}; - /// let r = Rect::new(0., 0., 5., 1.); // w=5 h=1 - /// assert!(r.center().abs_diff_eq(Vec2::new(2.5, 0.5), 1e-5)); - /// ``` - center: func(self: rect) -> vec2; -} - -/// Methods for URect -interface urect { - use types.{reflect-reference}; - - /// Check if a point lies within this rectangle, inclusive of its edges. - /// # Examples - /// ``` - /// # use bevy_math::URect; - /// let r = URect::new(0, 0, 5, 1); // w=5 h=1 - /// assert!(r.contains(r.center())); - /// assert!(r.contains(r.min)); - /// assert!(r.contains(r.max)); - /// ``` - contains: func(self: urect, point: uvec2) -> bool; - /// Build a new rectangle formed of the union of this rectangle and another rectangle. - /// The union is the smallest rectangle enclosing both rectangles. - /// # Examples - /// ``` - /// # use bevy_math::{URect, UVec2}; - /// let r1 = URect::new(0, 0, 5, 1); // w=5 h=1 - /// let r2 = URect::new(1, 0, 3, 8); // w=2 h=4 - /// let r = r1.union(r2); - /// assert_eq!(r.min, UVec2::new(0, 0)); - /// assert_eq!(r.max, UVec2::new(5, 8)); - /// ``` - union: func(self: urect, other: urect) -> urect; - /// The center point of the rectangle. - /// # Rounding Behavior - /// If the (min + max) contains odd numbers they will be rounded down to the nearest whole number when calculating the center. - /// # Examples - /// ``` - /// # use bevy_math::{URect, UVec2}; - /// let r = URect::new(0, 0, 4, 2); // w=4 h=2 - /// assert_eq!(r.center(), UVec2::new(2, 1)); - /// ``` - center: func(self: urect) -> uvec2; - /// Rectangle size. - /// # Examples - /// ``` - /// # use bevy_math::{URect, UVec2}; - /// let r = URect::new(0, 0, 5, 1); // w=5 h=1 - /// assert_eq!(r.size(), UVec2::new(5, 1)); - /// ``` - size: func(self: urect) -> uvec2; - /// Build a new rectangle formed of the union of this rectangle and a point. - /// The union is the smallest rectangle enclosing both the rectangle and the point. If the - /// point is already inside the rectangle, this method returns a copy of the rectangle. - /// # Examples - /// ``` - /// # use bevy_math::{URect, UVec2}; - /// let r = URect::new(0, 0, 5, 1); // w=5 h=1 - /// let u = r.union_point(UVec2::new(3, 6)); - /// assert_eq!(u.min, UVec2::ZERO); - /// assert_eq!(u.max, UVec2::new(5, 6)); - /// ``` - union-point: func(self: urect, other: uvec2) -> urect; - /// Rectangle half-size. - /// # Rounding Behavior - /// If the full size contains odd numbers they will be rounded down to the nearest whole number when calculating the half size. - /// # Examples - /// ``` - /// # use bevy_math::{URect, UVec2}; - /// let r = URect::new(0, 0, 4, 2); // w=4 h=2 - /// assert_eq!(r.half_size(), UVec2::new(2, 1)); - /// ``` - half-size: func(self: urect) -> uvec2; - /// Check if the rectangle is empty. - /// # Examples - /// ``` - /// # use bevy_math::{URect, UVec2}; - /// let r = URect::from_corners(UVec2::ZERO, UVec2::new(0, 1)); // w=0 h=1 - /// assert!(r.is_empty()); - /// ``` - is-empty: func(self: urect) -> bool; - eq: func(self: urect, other: urect) -> bool; - /// Create a new rectangle from its center and half-size. - /// # Panics - /// This method panics if any of the components of the half-size is negative or if `origin - half_size` results in any negatives. - /// # Examples - /// ``` - /// # use bevy_math::{URect, UVec2}; - /// let r = URect::from_center_half_size(UVec2::ONE, UVec2::ONE); // w=2 h=2 - /// assert_eq!(r.min, UVec2::splat(0)); - /// assert_eq!(r.max, UVec2::splat(2)); - /// ``` - from-center-half-size: func(origin: uvec2, half-size: uvec2) -> urect; - /// Create a new rectangle by expanding it evenly on all sides. - /// A positive expansion value produces a larger rectangle, - /// while a negative expansion value produces a smaller rectangle. - /// If this would result in zero width or height, [`URect::EMPTY`] is returned instead. - /// # Examples - /// ``` - /// # use bevy_math::{URect, UVec2}; - /// let r = URect::new(4, 4, 6, 6); // w=2 h=2 - /// let r2 = r.inflate(1); // w=4 h=4 - /// assert_eq!(r2.min, UVec2::splat(3)); - /// assert_eq!(r2.max, UVec2::splat(7)); - /// let r = URect::new(4, 4, 8, 8); // w=4 h=4 - /// let r2 = r.inflate(-1); // w=2 h=2 - /// assert_eq!(r2.min, UVec2::splat(5)); - /// assert_eq!(r2.max, UVec2::splat(7)); - /// ``` - inflate: func(self: urect, expansion: s32) -> urect; - /// Rectangle width (max.x - min.x). - /// # Examples - /// ``` - /// # use bevy_math::URect; - /// let r = URect::new(0, 0, 5, 1); // w=5 h=1 - /// assert_eq!(r.width(), 5); - /// ``` - width: func(self: urect) -> u32; - /// Create a new rectangle from two corner points. - /// The two points do not need to be the minimum and/or maximum corners. - /// They only need to be two opposite corners. - /// # Examples - /// ``` - /// # use bevy_math::{URect, UVec2}; - /// // Unit rect from [0,0] to [1,1] - /// let r = URect::from_corners(UVec2::ZERO, UVec2::ONE); // w=1 h=1 - /// // Same; the points do not need to be ordered - /// let r = URect::from_corners(UVec2::ONE, UVec2::ZERO); // w=1 h=1 - /// ``` - from-corners: func(p0: uvec2, p1: uvec2) -> urect; - /// Create a new rectangle from two corner points. - /// The two points do not need to be the minimum and/or maximum corners. - /// They only need to be two opposite corners. - /// # Examples - /// ``` - /// # use bevy_math::URect; - /// let r = URect::new(0, 4, 10, 6); // w=10 h=2 - /// let r = URect::new(2, 4, 5, 0); // w=3 h=4 - /// ``` - new: func(x0: u32, y0: u32, x1: u32, y1: u32) -> urect; - clone: func(self: urect) -> urect; - /// Returns self as [`Rect`] (f32) - as-rect: func(self: urect) -> rect; - /// Create a new rectangle from its center and size. - /// # Rounding Behavior - /// If the size contains odd numbers they will be rounded down to the nearest whole number. - /// # Panics - /// This method panics if any of the components of the size is negative or if `origin - (size / 2)` results in any negatives. - /// # Examples - /// ``` - /// # use bevy_math::{URect, UVec2}; - /// let r = URect::from_center_size(UVec2::ONE, UVec2::splat(2)); // w=2 h=2 - /// assert_eq!(r.min, UVec2::splat(0)); - /// assert_eq!(r.max, UVec2::splat(2)); - /// ``` - from-center-size: func(origin: uvec2, size: uvec2) -> urect; - /// Rectangle height (max.y - min.y). - /// # Examples - /// ``` - /// # use bevy_math::URect; - /// let r = URect::new(0, 0, 5, 1); // w=5 h=1 - /// assert_eq!(r.height(), 1); - /// ``` - height: func(self: urect) -> u32; - /// Returns self as [`IRect`] (i32) - as-irect: func(self: urect) -> irect; - /// Build a new rectangle formed of the intersection of this rectangle and another rectangle. - /// The intersection is the largest rectangle enclosed in both rectangles. If the intersection - /// is empty, this method returns an empty rectangle ([`URect::is_empty()`] returns `true`), but - /// the actual values of [`URect::min`] and [`URect::max`] are implementation-dependent. - /// # Examples - /// ``` - /// # use bevy_math::{URect, UVec2}; - /// let r1 = URect::new(0, 0, 2, 2); // w=2 h=2 - /// let r2 = URect::new(1, 1, 3, 3); // w=2 h=2 - /// let r = r1.intersect(r2); - /// assert_eq!(r.min, UVec2::new(1, 1)); - /// assert_eq!(r.max, UVec2::new(2, 2)); - /// ``` - intersect: func(self: urect, other: urect) -> urect; - assert-receiver-is-total-eq: func(self: urect); -} - -/// Methods for Rot2 -interface rot2 { - use types.{reflect-reference}; - - /// Returns whether `self` has a length of `1.0` or not. - /// Uses a precision threshold of approximately `1e-4`. - is-normalized: func(self: rot2) -> bool; - /// Returns `true` if the rotation is NaN. - is-nan: func(self: rot2) -> bool; - /// Returns a corresponding rotation angle as a fraction of a full 360 degree turn in the `(-0.5, 0.5]` range. - as-turn-fraction: func(self: rot2) -> f32; - /// Computes `1.0 / self.length()`. - /// For valid results, `self` must _not_ have a length of zero. - length-recip: func(self: rot2) -> f32; - /// Returns `self` with a length of `1.0`. - /// Note that [`Rot2`] should typically already be normalized by design. - /// Manual normalization is only needed when successive operations result in - /// accumulated floating point error, or if the rotation was constructed - /// with invalid values. - /// # Panics - /// Panics if `self` has a length of zero, NaN, or infinity when debug assertions are enabled. - normalize: func(self: rot2) -> rot2; - /// Performs a spherical linear interpolation between `self` and `end` - /// based on the value `s`. - /// This corresponds to interpolating between the two angles at a constant angular velocity. - /// When `s == 0.0`, the result will be equal to `self`. - /// When `s == 1.0`, the result will be equal to `rhs`. - /// If you would like the rotation to have a kind of ease-in-out effect, consider - /// using the slightly more efficient [`nlerp`](Self::nlerp) instead. - /// # Example - /// ``` - /// # use bevy_math::Rot2; - /// # - /// let rot1 = Rot2::IDENTITY; - /// let rot2 = Rot2::degrees(135.0); - /// let result1 = rot1.slerp(rot2, 1.0 / 3.0); - /// assert_eq!(result1.as_degrees(), 45.0); - /// let result2 = rot1.slerp(rot2, 0.5); - /// assert_eq!(result2.as_degrees(), 67.5); - /// ``` - slerp: func(self: rot2, end: rot2, s: f32) -> rot2; - /// Computes the length or norm of the complex number used to represent the rotation. - /// The length is typically expected to be `1.0`. Unexpectedly denormalized rotations - /// can be a result of incorrect construction or floating point error caused by - /// successive operations. - length: func(self: rot2) -> f32; - /// Returns a corresponding rotation angle in radians in the `(-pi, pi]` range. - as-radians: func(self: rot2) -> f32; - mul: func(p0: rot2, p1: rot2) -> rot2; - /// Creates a [`Rot2`] from a counterclockwise angle in radians. - /// A negative argument corresponds to a clockwise rotation. - /// # Note - /// Angles larger than or equal to 2π (in either direction) loop around to smaller rotations, since a full rotation returns an object to its starting orientation. - /// # Example - /// ``` - /// # use bevy_math::Rot2; - /// # use approx::assert_relative_eq; - /// # use std::f32::consts::{FRAC_PI_2, PI}; - /// let rot1 = Rot2::radians(3.0 * FRAC_PI_2); - /// let rot2 = Rot2::radians(-FRAC_PI_2); - /// #[cfg(feature = "approx")] - /// assert_relative_eq!(rot1, rot2); - /// let rot3 = Rot2::radians(PI); - /// #[cfg(feature = "approx")] - /// assert_relative_eq!(rot1 * rot1, rot3); - /// // A rotation by 3π and 1π are the same - /// #[cfg(feature = "approx")] - /// assert_relative_eq!(Rot2::radians(3.0 * PI), Rot2::radians(PI)); - /// ``` - radians: func(radians: f32) -> rot2; - /// Creates a [`Rot2`] from the sine and cosine of an angle. - /// The rotation is only valid if `sin * sin + cos * cos == 1.0`. - /// # Panics - /// Panics if `sin * sin + cos * cos != 1.0` when the `glam_assert` feature is enabled. - from-sin-cos: func(sin: f32, cos: f32) -> rot2; - eq: func(self: rot2, other: rot2) -> bool; - /// Returns `true` if the rotation is neither infinite nor NaN. - is-finite: func(self: rot2) -> bool; - /// Returns `self` after an approximate normalization, assuming the value is already nearly normalized. - /// Useful for preventing numerical error accumulation. - /// See [`Dir3::fast_renormalize`](crate::Dir3::fast_renormalize) for an example of when such error accumulation might occur. - fast-renormalize: func(self: rot2) -> rot2; - /// Creates a [`Rot2`] from a counterclockwise fraction of a full turn of 360 degrees. - /// A negative argument corresponds to a clockwise rotation. - /// # Note - /// Angles larger than or equal to 1 turn (in either direction) loop around to smaller rotations, since a full rotation returns an object to its starting orientation. - /// # Example - /// ``` - /// # use bevy_math::Rot2; - /// # use approx::assert_relative_eq; - /// let rot1 = Rot2::turn_fraction(0.75); - /// let rot2 = Rot2::turn_fraction(-0.25); - /// #[cfg(feature = "approx")] - /// assert_relative_eq!(rot1, rot2); - /// let rot3 = Rot2::turn_fraction(0.5); - /// #[cfg(feature = "approx")] - /// assert_relative_eq!(rot1 * rot1, rot3); - /// // A rotation by 1.5 turns and 0.5 turns are the same - /// #[cfg(feature = "approx")] - /// assert_relative_eq!(Rot2::turn_fraction(1.5), Rot2::turn_fraction(0.5)); - /// ``` - turn-fraction: func(fraction: f32) -> rot2; - /// Returns the angle in radians needed to make `self` and `other` coincide. - angle-to: func(self: rot2, other: rot2) -> f32; - /// Creates a [`Rot2`] from a counterclockwise angle in degrees. - /// A negative argument corresponds to a clockwise rotation. - /// # Note - /// Angles larger than or equal to 360° (in either direction) loop around to smaller rotations, since a full rotation returns an object to its starting orientation. - /// # Example - /// ``` - /// # use bevy_math::Rot2; - /// # use approx::{assert_relative_eq, assert_abs_diff_eq}; - /// let rot1 = Rot2::degrees(270.0); - /// let rot2 = Rot2::degrees(-90.0); - /// #[cfg(feature = "approx")] - /// assert_relative_eq!(rot1, rot2); - /// let rot3 = Rot2::degrees(180.0); - /// #[cfg(feature = "approx")] - /// assert_relative_eq!(rot1 * rot1, rot3); - /// // A rotation by 365° and 5° are the same - /// #[cfg(feature = "approx")] - /// assert_abs_diff_eq!(Rot2::degrees(365.0), Rot2::degrees(5.0), epsilon = 2e-7); - /// ``` - degrees: func(degrees: f32) -> rot2; - /// Returns a corresponding rotation angle in degrees in the `(-180, 180]` range. - as-degrees: func(self: rot2) -> f32; - /// Performs a linear interpolation between `self` and `rhs` based on - /// the value `s`, and normalizes the rotation afterwards. - /// When `s == 0.0`, the result will be equal to `self`. - /// When `s == 1.0`, the result will be equal to `rhs`. - /// This is slightly more efficient than [`slerp`](Self::slerp), and produces a similar result - /// when the difference between the two rotations is small. At larger differences, - /// the result resembles a kind of ease-in-out effect. - /// If you would like the angular velocity to remain constant, consider using [`slerp`](Self::slerp) instead. - /// # Details - /// `nlerp` corresponds to computing an angle for a point at position `s` on a line drawn - /// between the endpoints of the arc formed by `self` and `rhs` on a unit circle, - /// and normalizing the result afterwards. - /// Note that if the angles are opposite like 0 and π, the line will pass through the origin, - /// and the resulting angle will always be either `self` or `rhs` depending on `s`. - /// If `s` happens to be `0.5` in this case, a valid rotation cannot be computed, and `self` - /// will be returned as a fallback. - /// # Example - /// ``` - /// # use bevy_math::Rot2; - /// # - /// let rot1 = Rot2::IDENTITY; - /// let rot2 = Rot2::degrees(135.0); - /// let result1 = rot1.nlerp(rot2, 1.0 / 3.0); - /// assert_eq!(result1.as_degrees(), 28.675055); - /// let result2 = rot1.nlerp(rot2, 0.5); - /// assert_eq!(result2.as_degrees(), 67.5); - /// ``` - nlerp: func(self: rot2, end: rot2, s: f32) -> rot2; - /// Computes the squared length or norm of the complex number used to represent the rotation. - /// This is generally faster than [`Rot2::length()`], as it avoids a square - /// root operation. - /// The length is typically expected to be `1.0`. Unexpectedly denormalized rotations - /// can be a result of incorrect construction or floating point error caused by - /// successive operations. - length-squared: func(self: rot2) -> f32; - /// Rotates the [`Dir2`] using a [`Rot2`]. - mul: func(self: rot2, direction: dir2) -> dir2; - /// Returns the sine and cosine of the rotation angle. - sin-cos: func(self: rot2) -> tuple; - clone: func(self: rot2) -> rot2; - /// Returns `true` if the rotation is near [`Rot2::IDENTITY`]. - is-near-identity: func(self: rot2) -> bool; - mul: func(p0: rot2, p1: vec2) -> vec2; - /// Returns the inverse of the rotation. This is also the conjugate - /// of the unit complex number representing the rotation. - inverse: func(self: rot2) -> rot2; -} - -/// Methods for Instant -interface instant { - use types.{reflect-reference}; - - assert-receiver-is-total-eq: func(self: instant); - /// Returns the amount of time elapsed since this instant. - /// # Panics - /// Previous Rust versions panicked when the current time was earlier than self. Currently this - /// method returns a Duration of zero in that case. Future versions may reintroduce the panic. - /// See [Monotonicity]. - /// [Monotonicity]: Instant#monotonicity - /// # Examples - /// ```no_run - /// use std::thread::sleep; - /// use std::time::{Duration, Instant}; - /// let instant = Instant::now(); - /// let three_secs = Duration::from_secs(3); - /// sleep(three_secs); - /// assert!(instant.elapsed() >= three_secs); - /// ``` - elapsed: func(self: instant) -> duration; - /// Returns the amount of time elapsed from another instant to this one, - /// or zero duration if that instant is later than this one. - /// # Examples - /// ```no_run - /// use std::time::{Duration, Instant}; - /// use std::thread::sleep; - /// let now = Instant::now(); - /// sleep(Duration::new(1, 0)); - /// let new_now = Instant::now(); - /// println!("{:?}", new_now.saturating_duration_since(now)); - /// println!("{:?}", now.saturating_duration_since(new_now)); // 0ns - /// ``` - saturating-duration-since: func(self: instant, earlier: instant) -> duration; - /// Returns an instant corresponding to "now". - /// # Examples - /// ``` - /// use std::time::Instant; - /// let now = Instant::now(); - /// ``` - now: func() -> instant; - eq: func(self: instant, other: instant) -> bool; - sub: func(self: instant, other: duration) -> instant; - clone: func(self: instant) -> instant; - /// # Panics - /// This function may panic if the resulting point in time cannot be represented by the - /// underlying data structure. See [`Instant::checked_add`] for a version without panic. - add: func(self: instant, other: duration) -> instant; - /// Returns the amount of time elapsed from another instant to this one, - /// or zero duration if that instant is later than this one. - /// # Panics - /// Previous Rust versions panicked when `earlier` was later than `self`. Currently this - /// method saturates. Future versions may reintroduce the panic in some circumstances. - /// See [Monotonicity]. - /// [Monotonicity]: Instant#monotonicity - /// # Examples - /// ```no_run - /// use std::time::{Duration, Instant}; - /// use std::thread::sleep; - /// let now = Instant::now(); - /// sleep(Duration::new(1, 0)); - /// let new_now = Instant::now(); - /// println!("{:?}", new_now.duration_since(now)); - /// println!("{:?}", now.duration_since(new_now)); // 0ns - /// ``` - duration-since: func(self: instant, earlier: instant) -> duration; - sub: func(p0: instant, p1: instant) -> duration; -} - -/// Methods for Fixed -interface fixed { - use types.{reflect-reference}; - - clone: func(self: fixed) -> fixed; -} - -/// Methods for Real -interface real { - use types.{reflect-reference}; - - clone: func(self: real) -> real; -} - -/// Methods for Stopwatch -interface stopwatch { - use types.{reflect-reference}; - - /// Resets the stopwatch. The reset doesn't affect the paused state of the stopwatch. - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut stopwatch = Stopwatch::new(); - /// stopwatch.tick(Duration::from_secs_f32(1.5)); - /// stopwatch.reset(); - /// assert_eq!(stopwatch.elapsed_secs(), 0.0); - /// ``` - reset: func(self: stopwatch); - /// Sets the elapsed time of the stopwatch. - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut stopwatch = Stopwatch::new(); - /// stopwatch.set_elapsed(Duration::from_secs_f32(1.0)); - /// assert_eq!(stopwatch.elapsed_secs(), 1.0); - /// ``` - set-elapsed: func(self: stopwatch, time: duration); - /// Pauses the stopwatch. Any call to [`tick`](Stopwatch::tick) while - /// paused will not have any effect on the elapsed time. - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut stopwatch = Stopwatch::new(); - /// stopwatch.pause(); - /// stopwatch.tick(Duration::from_secs_f32(1.5)); - /// assert!(stopwatch.is_paused()); - /// assert_eq!(stopwatch.elapsed_secs(), 0.0); - /// ``` - pause: func(self: stopwatch); - assert-receiver-is-total-eq: func(self: stopwatch); - /// Returns the elapsed time since the last [`reset`](Stopwatch::reset) - /// of the stopwatch, in seconds, as f64. - /// # See Also - /// [`elapsed`](Stopwatch::elapsed) - if a `Duration` is desirable instead. - /// [`elapsed_secs`](Stopwatch::elapsed_secs) - if an `f32` is desirable instead. - elapsed-secs-f64: func(self: stopwatch) -> f64; - /// Unpauses the stopwatch. Resume the effect of ticking on elapsed time. - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut stopwatch = Stopwatch::new(); - /// stopwatch.pause(); - /// stopwatch.tick(Duration::from_secs_f32(1.0)); - /// stopwatch.unpause(); - /// stopwatch.tick(Duration::from_secs_f32(1.0)); - /// assert!(!stopwatch.is_paused()); - /// assert_eq!(stopwatch.elapsed_secs(), 1.0); - /// ``` - unpause: func(self: stopwatch); - /// Returns the elapsed time since the last [`reset`](Stopwatch::reset) - /// of the stopwatch, in seconds. - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut stopwatch = Stopwatch::new(); - /// stopwatch.tick(Duration::from_secs(1)); - /// assert_eq!(stopwatch.elapsed_secs(), 1.0); - /// ``` - /// # See Also - /// [`elapsed`](Stopwatch::elapsed) - if a `Duration` is desirable instead. - /// [`elapsed_secs_f64`](Stopwatch::elapsed_secs_f64) - if an `f64` is desirable instead. - elapsed-secs: func(self: stopwatch) -> f32; - /// Returns `true` if the stopwatch is paused. - /// # Examples - /// ``` - /// # use bevy_time::*; - /// let mut stopwatch = Stopwatch::new(); - /// assert!(!stopwatch.is_paused()); - /// stopwatch.pause(); - /// assert!(stopwatch.is_paused()); - /// stopwatch.unpause(); - /// assert!(!stopwatch.is_paused()); - /// ``` - is-paused: func(self: stopwatch) -> bool; - eq: func(self: stopwatch, other: stopwatch) -> bool; - /// Returns the elapsed time since the last [`reset`](Stopwatch::reset) - /// of the stopwatch. - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut stopwatch = Stopwatch::new(); - /// stopwatch.tick(Duration::from_secs(1)); - /// assert_eq!(stopwatch.elapsed(), Duration::from_secs(1)); - /// ``` - /// # See Also - /// [`elapsed_secs`](Stopwatch::elapsed_secs) - if an `f32` value is desirable instead. - /// [`elapsed_secs_f64`](Stopwatch::elapsed_secs_f64) - if an `f64` is desirable instead. - elapsed: func(self: stopwatch) -> duration; - /// Create a new unpaused `Stopwatch` with no elapsed time. - /// # Examples - /// ``` - /// # use bevy_time::*; - /// let stopwatch = Stopwatch::new(); - /// assert_eq!(stopwatch.elapsed_secs(), 0.0); - /// assert_eq!(stopwatch.is_paused(), false); - /// ``` - new: func() -> stopwatch; - clone: func(self: stopwatch) -> stopwatch; -} - -/// Methods for Timer -interface timer { - use types.{reflect-reference}; - - /// Sets the mode of the timer. - /// # Examples - /// ``` - /// # use bevy_time::*; - /// let mut timer = Timer::from_seconds(1.0, TimerMode::Repeating); - /// timer.set_mode(TimerMode::Once); - /// assert_eq!(timer.mode(), TimerMode::Once); - /// ``` - set-mode: func(self: timer, mode: timer-mode); - /// Pauses the Timer. Disables the ticking of the timer. - /// See also [`Stopwatch::pause`](Stopwatch::pause). - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut timer = Timer::from_seconds(1.0, TimerMode::Once); - /// timer.pause(); - /// timer.tick(Duration::from_secs_f32(0.5)); - /// assert_eq!(timer.elapsed_secs(), 0.0); - /// ``` - pause: func(self: timer); - /// Resets the timer. The reset doesn't affect the `paused` state of the timer. - /// See also [`Stopwatch::reset`](Stopwatch::reset). - /// Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut timer = Timer::from_seconds(1.0, TimerMode::Once); - /// timer.tick(Duration::from_secs_f32(1.5)); - /// timer.reset(); - /// assert!(!timer.is_finished()); - /// assert!(!timer.just_finished()); - /// assert_eq!(timer.elapsed_secs(), 0.0); - /// ``` - reset: func(self: timer); - /// Returns `true` only on the tick the timer reached its duration. - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut timer = Timer::from_seconds(1.0, TimerMode::Once); - /// timer.tick(Duration::from_secs_f32(1.5)); - /// assert!(timer.just_finished()); - /// timer.tick(Duration::from_secs_f32(0.5)); - /// assert!(!timer.just_finished()); - /// ``` - just-finished: func(self: timer) -> bool; - /// Unpauses the Timer. Resumes the ticking of the timer. - /// See also [`Stopwatch::unpause()`](Stopwatch::unpause). - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut timer = Timer::from_seconds(1.0, TimerMode::Once); - /// timer.pause(); - /// timer.tick(Duration::from_secs_f32(0.5)); - /// timer.unpause(); - /// timer.tick(Duration::from_secs_f32(0.5)); - /// assert_eq!(timer.elapsed_secs(), 0.5); - /// ``` - unpause: func(self: timer); - /// Returns the fraction of the timer remaining time (goes from 1.0 to 0.0). - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut timer = Timer::from_seconds(2.0, TimerMode::Once); - /// timer.tick(Duration::from_secs_f32(0.5)); - /// assert_eq!(timer.fraction_remaining(), 0.75); - /// ``` - fraction-remaining: func(self: timer) -> f32; - /// Almost finishes the timer leaving 1 ns of remaining time. - /// This can be useful when needing an immediate action without having - /// to wait for the set duration of the timer in the first tick. - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut timer = Timer::from_seconds(1.5, TimerMode::Once); - /// timer.almost_finish(); - /// assert!(!timer.is_finished()); - /// assert_eq!(timer.remaining(), Duration::from_nanos(1)); - /// ``` - almost-finish: func(self: timer); - /// Sets the elapsed time of the timer without any other considerations. - /// See also [`Stopwatch::set`](Stopwatch::set). - /// # - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut timer = Timer::from_seconds(1.0, TimerMode::Once); - /// timer.set_elapsed(Duration::from_secs(2)); - /// assert_eq!(timer.elapsed(), Duration::from_secs(2)); - /// // the timer is not finished even if the elapsed time is greater than the duration. - /// assert!(!timer.is_finished()); - /// ``` - set-elapsed: func(self: timer, time: duration); - /// Returns the remaining time in seconds - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::cmp::Ordering; - /// use std::time::Duration; - /// let mut timer = Timer::from_seconds(2.0, TimerMode::Once); - /// timer.tick(Duration::from_secs_f32(0.5)); - /// let result = timer.remaining_secs().total_cmp(&1.5); - /// assert_eq!(Ordering::Equal, result); - /// ``` - remaining-secs: func(self: timer) -> f32; - /// Finishes the timer. - /// # Examples - /// ``` - /// # use bevy_time::*; - /// let mut timer = Timer::from_seconds(1.5, TimerMode::Once); - /// timer.finish(); - /// assert!(timer.is_finished()); - /// ``` - finish: func(self: timer); - /// Creates a new timer with a given duration in seconds. - /// # Example - /// ``` - /// # use bevy_time::*; - /// let mut timer = Timer::from_seconds(1.0, TimerMode::Once); - /// ``` - from-seconds: func(duration: f32, mode: timer-mode) -> timer; - assert-receiver-is-total-eq: func(self: timer); - /// Returns `true` if the timer is paused. - /// See also [`Stopwatch::is_paused`](Stopwatch::is_paused). - /// # Examples - /// ``` - /// # use bevy_time::*; - /// let mut timer = Timer::from_seconds(1.0, TimerMode::Once); - /// assert!(!timer.is_paused()); - /// timer.pause(); - /// assert!(timer.is_paused()); - /// timer.unpause(); - /// assert!(!timer.is_paused()); - /// ``` - is-paused: func(self: timer) -> bool; - clone: func(self: timer) -> timer; - /// Returns the time elapsed on the timer. Guaranteed to be between 0.0 and `duration`. - /// Will only equal `duration` when the timer is finished and non repeating. - /// See also [`Stopwatch::elapsed`](Stopwatch::elapsed). - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut timer = Timer::from_seconds(1.0, TimerMode::Once); - /// timer.tick(Duration::from_secs_f32(0.5)); - /// assert_eq!(timer.elapsed(), Duration::from_secs_f32(0.5)); - /// ``` - elapsed: func(self: timer) -> duration; - /// Returns the fraction of the timer elapsed time (goes from 0.0 to 1.0). - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut timer = Timer::from_seconds(2.0, TimerMode::Once); - /// timer.tick(Duration::from_secs_f32(0.5)); - /// assert_eq!(timer.fraction(), 0.25); - /// ``` - fraction: func(self: timer) -> f32; - /// Returns the mode of the timer. - /// # Examples - /// ``` - /// # use bevy_time::*; - /// let mut timer = Timer::from_seconds(1.0, TimerMode::Repeating); - /// assert_eq!(timer.mode(), TimerMode::Repeating); - /// ``` - mode: func(self: timer) -> timer-mode; - /// Returns the time elapsed on the timer as an `f32`. - /// See also [`Timer::elapsed`](Timer::elapsed). - elapsed-secs: func(self: timer) -> f32; - /// Returns the time elapsed on the timer as an `f64`. - /// See also [`Timer::elapsed`](Timer::elapsed). - elapsed-secs-f64: func(self: timer) -> f64; - /// Returns the number of times a repeating timer - /// finished during the last [`tick`](Timer::tick) call. - /// For non repeating-timers, this method will only ever - /// return 0 or 1. - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut timer = Timer::from_seconds(1.0, TimerMode::Repeating); - /// timer.tick(Duration::from_secs_f32(6.0)); - /// assert_eq!(timer.times_finished_this_tick(), 6); - /// timer.tick(Duration::from_secs_f32(2.0)); - /// assert_eq!(timer.times_finished_this_tick(), 2); - /// timer.tick(Duration::from_secs_f32(0.5)); - /// assert_eq!(timer.times_finished_this_tick(), 0); - /// ``` - times-finished-this-tick: func(self: timer) -> u32; - /// Returns the remaining time using Duration - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut timer = Timer::from_seconds(2.0, TimerMode::Once); - /// timer.tick(Duration::from_secs_f32(0.5)); - /// assert_eq!(timer.remaining(), Duration::from_secs_f32(1.5)); - /// ``` - remaining: func(self: timer) -> duration; - /// Returns the duration of the timer. - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let timer = Timer::new(Duration::from_secs(1), TimerMode::Once); - /// assert_eq!(timer.duration(), Duration::from_secs(1)); - /// ``` - duration: func(self: timer) -> duration; - /// Returns `true` if the timer has reached its duration. - /// For repeating timers, this method behaves identically to [`Timer::just_finished`]. - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut timer_once = Timer::from_seconds(1.0, TimerMode::Once); - /// timer_once.tick(Duration::from_secs_f32(1.5)); - /// assert!(timer_once.is_finished()); - /// timer_once.tick(Duration::from_secs_f32(0.5)); - /// assert!(timer_once.is_finished()); - /// let mut timer_repeating = Timer::from_seconds(1.0, TimerMode::Repeating); - /// timer_repeating.tick(Duration::from_secs_f32(1.1)); - /// assert!(timer_repeating.is_finished()); - /// timer_repeating.tick(Duration::from_secs_f32(0.8)); - /// assert!(!timer_repeating.is_finished()); - /// timer_repeating.tick(Duration::from_secs_f32(0.6)); - /// assert!(timer_repeating.is_finished()); - /// ``` - is-finished: func(self: timer) -> bool; - /// Creates a new timer with a given duration. - /// See also [`Timer::from_seconds`](Timer::from_seconds). - new: func(duration: duration, mode: timer-mode) -> timer; - /// Sets the duration of the timer. - /// # Examples - /// ``` - /// # use bevy_time::*; - /// use std::time::Duration; - /// let mut timer = Timer::from_seconds(1.5, TimerMode::Once); - /// timer.set_duration(Duration::from_secs(1)); - /// assert_eq!(timer.duration(), Duration::from_secs(1)); - /// ``` - set-duration: func(self: timer, duration: duration); - eq: func(self: timer, other: timer) -> bool; -} - -/// Methods for TimerMode -interface timer-mode { - use types.{reflect-reference}; - - clone: func(self: timer-mode) -> timer-mode; - eq: func(self: timer-mode, other: timer-mode) -> bool; - assert-receiver-is-total-eq: func(self: timer-mode); -} - -/// Methods for Virtual -interface virtual { - use types.{reflect-reference}; - - clone: func(self: virtual) -> virtual; -} - -/// Methods for GlobalTransform -interface global-transform { - use types.{reflect-reference}; - - mul: func(p0: global-transform, p1: global-transform) -> global-transform; - from-translation: func(translation: vec3) -> global-transform; - /// Get the rotation as a [`Quat`]. - /// The transform is expected to be non-degenerate and without shearing, or the output will be invalid. - /// # Warning - /// This is calculated using `to_scale_rotation_translation`, meaning that you - /// should probably use it directly if you also need translation or scale. - rotation: func(self: global-transform) -> quat; - mul: func(self: global-transform, value: vec3) -> vec3; - /// Return the local left vector (-X). - left: func(self: global-transform) -> dir3; - /// Multiplies `self` with `transform` component by component, returning the - /// resulting [`GlobalTransform`] - mul-transform: func(self: global-transform, transform: transform) -> global-transform; - /// Get the translation as a [`Vec3A`]. - translation-vec3a: func(self: global-transform) -> vec3-a; - /// Returns the transformation as a [`Transform`]. - /// The transform is expected to be non-degenerate and without shearing, or the output - /// will be invalid. - compute-transform: func(self: global-transform) -> transform; - /// Return the local up vector (Y). - up: func(self: global-transform) -> dir3; - from-scale: func(scale: vec3) -> global-transform; - /// Get an upper bound of the radius from the given `extents`. - radius-vec3a: func(self: global-transform, extents: vec3-a) -> f32; - /// Computes a Scale-Rotation-Translation decomposition of the transformation and returns - /// the isometric part as an [isometry]. Any scaling done by the transformation will be ignored. - /// Note: this is a somewhat costly and lossy conversion. - /// The transform is expected to be non-degenerate and without shearing, or the output - /// will be invalid. - /// [isometry]: Isometry3d - to-isometry: func(self: global-transform) -> isometry3d; - /// Returns the [`Transform`] `self` would have if it was a child of an entity - /// with the `parent` [`GlobalTransform`]. - /// This is useful if you want to "reparent" an [`Entity`](bevy_ecs::entity::Entity). - /// Say you have an entity `e1` that you want to turn into a child of `e2`, - /// but you want `e1` to keep the same global transform, even after re-parenting. You would use: - /// ``` - /// # use bevy_transform::prelude::{GlobalTransform, Transform}; - /// # use bevy_ecs::prelude::{Entity, Query, Component, Commands, ChildOf}; - /// #[derive(Component)] - /// struct ToReparent { - /// new_parent: Entity, - /// } - /// fn reparent_system( - /// mut commands: Commands, - /// mut targets: Query<(&mut Transform, Entity, &GlobalTransform, &ToReparent)>, - /// transforms: Query<&GlobalTransform>, - /// ) { - /// for (mut transform, entity, initial, to_reparent) in targets.iter_mut() { - /// if let Ok(parent_transform) = transforms.get(to_reparent.new_parent) { - /// *transform = initial.reparented_to(parent_transform); - /// commands.entity(entity) - /// .remove::() - /// .insert(ChildOf(to_reparent.new_parent)); - /// } - /// } - /// } - /// ``` - /// The transform is expected to be non-degenerate and without shearing, or the output - /// will be invalid. - reparented-to: func(self: global-transform, parent: global-transform) -> transform; - mul: func(p0: global-transform, p1: transform) -> global-transform; - /// Returns the 3d affine transformation matrix as an [`Affine3A`]. - affine: func(self: global-transform) -> affine3-a; - from-rotation: func(rotation: quat) -> global-transform; - /// Returns the 3d affine transformation matrix as a [`Mat4`]. - to-matrix: func(self: global-transform) -> mat4; - from-xyz: func(x: f32, y: f32, z: f32) -> global-transform; - clone: func(self: global-transform) -> global-transform; - from-isometry: func(iso: isometry3d) -> global-transform; - /// Return the local down vector (-Y). - down: func(self: global-transform) -> dir3; - /// Get the scale as a [`Vec3`]. - /// The transform is expected to be non-degenerate and without shearing, or the output will be invalid. - /// Some of the computations overlap with `to_scale_rotation_translation`, which means you should use - /// it instead if you also need rotation. - scale: func(self: global-transform) -> vec3; - eq: func(self: global-transform, other: global-transform) -> bool; - /// Get the translation as a [`Vec3`]. - translation: func(self: global-transform) -> vec3; - /// Transforms the given point from local space to global space, applying shear, scale, rotation and translation. - /// It can be used like this: - /// ``` - /// # use bevy_transform::prelude::{GlobalTransform}; - /// # use bevy_math::prelude::Vec3; - /// let global_transform = GlobalTransform::from_xyz(1., 2., 3.); - /// let local_point = Vec3::new(1., 2., 3.); - /// let global_point = global_transform.transform_point(local_point); - /// assert_eq!(global_point, Vec3::new(2., 4., 6.)); - /// ``` - /// ``` - /// # use bevy_transform::prelude::{GlobalTransform}; - /// # use bevy_math::Vec3; - /// let global_point = Vec3::new(2., 4., 6.); - /// let global_transform = GlobalTransform::from_xyz(1., 2., 3.); - /// let local_point = global_transform.affine().inverse().transform_point3(global_point); - /// assert_eq!(local_point, Vec3::new(1., 2., 3.)) - /// ``` - /// To apply shear, scale, and rotation *without* applying translation, different functions are available: - /// ``` - /// # use bevy_transform::prelude::{GlobalTransform}; - /// # use bevy_math::prelude::Vec3; - /// let global_transform = GlobalTransform::from_xyz(1., 2., 3.); - /// let local_direction = Vec3::new(1., 2., 3.); - /// let global_direction = global_transform.affine().transform_vector3(local_direction); - /// assert_eq!(global_direction, Vec3::new(1., 2., 3.)); - /// let roundtripped_local_direction = global_transform.affine().inverse().transform_vector3(global_direction); - /// assert_eq!(roundtripped_local_direction, local_direction); - /// ``` - transform-point: func(self: global-transform, point: vec3) -> vec3; - /// Return the local forward vector (-Z). - forward: func(self: global-transform) -> dir3; - /// Return the local right vector (X). - right: func(self: global-transform) -> dir3; - /// Return the local back vector (Z). - back: func(self: global-transform) -> dir3; -} - -/// Methods for Transform -interface transform { - use types.{reflect-reference}; - - /// Rotates this [`Transform`] around the `Y` axis by `angle` (in radians). - /// If this [`Transform`] has a parent, the axis is relative to the rotation of the parent. - rotate-y: func(self: transform, angle: f32); - /// Rotates this [`Transform`] around its local `X` axis by `angle` (in radians). - rotate-local-x: func(self: transform, angle: f32); - /// Translates this [`Transform`] around a `point` in space. - /// If this [`Transform`] has a parent, the `point` is relative to the [`Transform`] of the parent. - translate-around: func(self: transform, point: vec3, rotation: quat); - /// Equivalent to [`-local_y()`][Transform::local_y] - down: func(self: transform) -> dir3; - eq: func(self: transform, other: transform) -> bool; - /// Rotates this [`Transform`] by the given rotation. - /// If this [`Transform`] has a parent, the `rotation` is relative to the rotation of the parent. - /// # Examples - /// - [`3d_rotation`] - /// [`3d_rotation`]: https://github.com/bevyengine/bevy/blob/latest/examples/transforms/3d_rotation.rs - rotate: func(self: transform, rotation: quat); - /// Returns this [`Transform`] with a new rotation. - with-rotation: func(self: transform, rotation: quat) -> transform; - /// Equivalent to [`local_z()`][Transform::local_z] - back: func(self: transform) -> dir3; - /// Equivalent to [`-local_z()`][Transform::local_z] - forward: func(self: transform) -> dir3; - /// Get the [isometry] defined by this transform's rotation and translation, ignoring scale. - /// [isometry]: Isometry3d - to-isometry: func(self: transform) -> isometry3d; - /// Equivalent to [`local_y()`][Transform::local_y] - up: func(self: transform) -> dir3; - /// Rotates this [`Transform`] around its local `Z` axis by `angle` (in radians). - rotate-local-z: func(self: transform, angle: f32); - /// Rotates this [`Transform`] around the `X` axis by `angle` (in radians). - /// If this [`Transform`] has a parent, the axis is relative to the rotation of the parent. - rotate-x: func(self: transform, angle: f32); - /// Creates a new [`Transform`], with `rotation`. Translation will be 0 and scale 1 on - /// all axes. - from-rotation: func(rotation: quat) -> transform; - /// Get the unit vector in the local `Y` direction. - local-y: func(self: transform) -> dir3; - mul: func(p0: transform, p1: global-transform) -> global-transform; - /// Extracts the translation, rotation, and scale from `matrix`. It must be a 3d affine - /// transformation matrix. - from-matrix: func(world-from-local: mat4) -> transform; - /// Rotates this [`Transform`] around the `Z` axis by `angle` (in radians). - /// If this [`Transform`] has a parent, the axis is relative to the rotation of the parent. - rotate-z: func(self: transform, angle: f32); - /// Rotates this [`Transform`] around its local `axis` by `angle` (in radians). - /// # Warning - /// If you pass in an `axis` based on the current rotation (e.g. obtained via [`Transform::local_x`]), - /// floating point errors can accumulate exponentially when applying rotations repeatedly this way. This will - /// result in a denormalized rotation. In this case, it is recommended to normalize the [`Transform::rotation`] after - /// each call to this method. - rotate-local-axis: func(self: transform, axis: dir3, angle: f32); - /// Rotates this [`Transform`] around the given `axis` by `angle` (in radians). - /// If this [`Transform`] has a parent, the `axis` is relative to the rotation of the parent. - /// # Warning - /// If you pass in an `axis` based on the current rotation (e.g. obtained via [`Transform::local_x`]), - /// floating point errors can accumulate exponentially when applying rotations repeatedly this way. This will - /// result in a denormalized rotation. In this case, it is recommended to normalize the [`Transform::rotation`] after - /// each call to this method. - rotate-axis: func(self: transform, axis: dir3, angle: f32); - /// Equivalent to [`local_x()`][Transform::local_x()] - right: func(self: transform) -> dir3; - /// Get the unit vector in the local `Z` direction. - local-z: func(self: transform) -> dir3; - /// Returns the 3d affine transformation matrix from this transforms translation, - /// rotation, and scale. - compute-affine: func(self: transform) -> affine3-a; - clone: func(self: transform) -> transform; - /// Rotates this [`Transform`] around its local `Y` axis by `angle` (in radians). - rotate-local-y: func(self: transform, angle: f32); - /// Transforms the given `point`, applying scale, rotation and translation. - /// If this [`Transform`] has an ancestor entity with a [`Transform`] component, - /// [`Transform::transform_point`] will transform a point in local space into its - /// parent transform's space. - /// If this [`Transform`] does not have a parent, [`Transform::transform_point`] will - /// transform a point in local space into worldspace coordinates. - /// If you always want to transform a point in local space to worldspace, or if you need - /// the inverse transformations, see [`GlobalTransform::transform_point()`]. - transform-point: func(self: transform, point: vec3) -> vec3; - mul: func(p0: transform, p1: transform) -> transform; - /// Returns this [`Transform`] with a new scale. - with-scale: func(self: transform, scale: vec3) -> transform; - /// Rotates this [`Transform`] by the given `rotation`. - /// The `rotation` is relative to this [`Transform`]'s current rotation. - rotate-local: func(self: transform, rotation: quat); - /// Get the unit vector in the local `X` direction. - local-x: func(self: transform) -> dir3; - /// Multiplies `self` with `transform` component by component, returning the - /// resulting [`Transform`] - mul-transform: func(self: transform, transform: transform) -> transform; - /// Creates a new [`Transform`], with `translation`. Rotation will be 0 and scale 1 on - /// all axes. - from-translation: func(translation: vec3) -> transform; - /// Rotates this [`Transform`] around a `point` in space. - /// If this [`Transform`] has a parent, the `point` is relative to the [`Transform`] of the parent. - rotate-around: func(self: transform, point: vec3, rotation: quat); - /// Returns `true` if, and only if, translation, rotation and scale all are - /// finite. If any of them contains a `NaN`, positive or negative infinity, - /// this will return `false`. - is-finite: func(self: transform) -> bool; - /// Computes the 3d affine transformation matrix from this transform's translation, - /// rotation, and scale. - to-matrix: func(self: transform) -> mat4; - /// Equivalent to [`-local_x()`][Transform::local_x()] - left: func(self: transform) -> dir3; - /// Returns this [`Transform`] with a new translation. - with-translation: func(self: transform, translation: vec3) -> transform; - /// Creates a new [`Transform`] that is equivalent to the given [isometry]. - /// [isometry]: Isometry3d - from-isometry: func(iso: isometry3d) -> transform; - /// Creates a new [`Transform`], with `scale`. Translation will be 0 and rotation 0 on - /// all axes. - from-scale: func(scale: vec3) -> transform; - mul: func(self: transform, value: vec3) -> vec3; - /// Creates a new [`Transform`] at the position `(x, y, z)`. In 2d, the `z` component - /// is used for z-ordering elements: higher `z`-value will be in front of lower - /// `z`-value. - from-xyz: func(x: f32, y: f32, z: f32) -> transform; -} - -/// Methods for TransformTreeChanged -interface transform-tree-changed { - use types.{reflect-reference}; - - eq: func(self: transform-tree-changed, other: transform-tree-changed) -> bool; - clone: func(self: transform-tree-changed) -> transform-tree-changed; -} - -/// Methods for StaticTransformOptimizations -interface static-transform-optimizations { - use types.{reflect-reference}; - - /// Unconditionally disable static scene optimizations. - disabled: func() -> static-transform-optimizations; - /// If the percentage of moving objects exceeds this threshold, disable static [`Transform`] - /// optimizations. This is done because the scene is so dynamic that the cost of tracking static - /// trees exceeds the performance benefit of skipping propagation for these trees. - /// - Setting this to `0.0` will result in never running static scene tracking. - /// - Setting this to `1.0` will result in always tracking static transform trees. - from-threshold: func(threshold: f32) -> static-transform-optimizations; - /// Unconditionally enable static scene optimizations. - enabled: func() -> static-transform-optimizations; -} - -/// Methods for TypeId -interface type-id { - use types.{reflect-reference}; - - assert-receiver-is-total-eq: func(self: type-id); - clone: func(self: type-id) -> type-id; - eq: func(self: type-id, other: type-id) -> bool; -} - -/// Methods for SocketAddr -interface socket-addr { - use types.{reflect-reference}; - - clone: func(self: socket-addr) -> socket-addr; - eq: func(self: socket-addr, other: socket-addr) -> bool; - /// Returns the port number associated with this socket address. - /// # Examples - /// ``` - /// use std::net::{IpAddr, Ipv4Addr, SocketAddr}; - /// let socket = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080); - /// assert_eq!(socket.port(), 8080); - /// ``` - port: func(self: socket-addr) -> u16; - assert-receiver-is-total-eq: func(self: socket-addr); - /// Changes the port number associated with this socket address. - /// # Examples - /// ``` - /// use std::net::{IpAddr, Ipv4Addr, SocketAddr}; - /// let mut socket = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080); - /// socket.set_port(1025); - /// assert_eq!(socket.port(), 1025); - /// ``` - set-port: func(self: socket-addr, new-port: u16); - /// Returns [`true`] if the [IP address] in this `SocketAddr` is an - /// [`IPv4` address], and [`false`] otherwise. - /// [IP address]: IpAddr - /// [`IPv4` address]: IpAddr::V4 - /// # Examples - /// ``` - /// use std::net::{IpAddr, Ipv4Addr, SocketAddr}; - /// let socket = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080); - /// assert_eq!(socket.is_ipv4(), true); - /// assert_eq!(socket.is_ipv6(), false); - /// ``` - is-ipv4: func(self: socket-addr) -> bool; - /// Returns [`true`] if the [IP address] in this `SocketAddr` is an - /// [`IPv6` address], and [`false`] otherwise. - /// [IP address]: IpAddr - /// [`IPv6` address]: IpAddr::V6 - /// # Examples - /// ``` - /// use std::net::{IpAddr, Ipv6Addr, SocketAddr}; - /// let socket = SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 65535, 0, 1)), 8080); - /// assert_eq!(socket.is_ipv4(), false); - /// assert_eq!(socket.is_ipv6(), true); - /// ``` - is-ipv6: func(self: socket-addr) -> bool; -} - -/// Methods for RangeFull -interface range-full { - use types.{reflect-reference}; - - eq: func(self: range-full, other: range-full) -> bool; - clone: func(self: range-full) -> range-full; - assert-receiver-is-total-eq: func(self: range-full); -} - -/// Methods for AtomicBool -interface atomic-bool { - use types.{reflect-reference}; - - /// Creates a new `AtomicBool`. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicBool; - /// let atomic_true = AtomicBool::new(true); - /// let atomic_false = AtomicBool::new(false); - /// ``` - new: func(v: bool) -> atomic-bool; - /// Consumes the atomic and returns the contained value. - /// This is safe because passing `self` by value guarantees that no other threads are - /// concurrently accessing the atomic data. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicBool; - /// let some_bool = AtomicBool::new(true); - /// assert_eq!(some_bool.into_inner(), true); - /// ``` - into-inner: func(self: atomic-bool) -> bool; -} - -/// Methods for AtomicI16 -interface atomic-i16 { - use types.{reflect-reference}; - - /// Consumes the atomic and returns the contained value. - /// This is safe because passing `self` by value guarantees that no other threads are - /// concurrently accessing the atomic data. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicI16; - /// let some_var = AtomicI16::new(5); - /// assert_eq!(some_var.into_inner(), 5); - /// ``` - into-inner: func(self: atomic-i16) -> s16; - /// Creates a new atomic integer. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicI16; - /// let atomic_forty_two = AtomicI16::new(42); - /// ``` - new: func(v: s16) -> atomic-i16; -} - -/// Methods for AtomicI32 -interface atomic-i32 { - use types.{reflect-reference}; - - /// Creates a new atomic integer. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicI32; - /// let atomic_forty_two = AtomicI32::new(42); - /// ``` - new: func(v: s32) -> atomic-i32; - /// Consumes the atomic and returns the contained value. - /// This is safe because passing `self` by value guarantees that no other threads are - /// concurrently accessing the atomic data. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicI32; - /// let some_var = AtomicI32::new(5); - /// assert_eq!(some_var.into_inner(), 5); - /// ``` - into-inner: func(self: atomic-i32) -> s32; -} - -/// Methods for AtomicI64 -interface atomic-i64 { - use types.{reflect-reference}; - - /// Creates a new atomic integer. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicI64; - /// let atomic_forty_two = AtomicI64::new(42); - /// ``` - new: func(v: s64) -> atomic-i64; - /// Consumes the atomic and returns the contained value. - /// This is safe because passing `self` by value guarantees that no other threads are - /// concurrently accessing the atomic data. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicI64; - /// let some_var = AtomicI64::new(5); - /// assert_eq!(some_var.into_inner(), 5); - /// ``` - into-inner: func(self: atomic-i64) -> s64; -} - -/// Methods for AtomicI8 -interface atomic-i8 { - use types.{reflect-reference}; - - /// Consumes the atomic and returns the contained value. - /// This is safe because passing `self` by value guarantees that no other threads are - /// concurrently accessing the atomic data. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicI8; - /// let some_var = AtomicI8::new(5); - /// assert_eq!(some_var.into_inner(), 5); - /// ``` - into-inner: func(self: atomic-i8) -> s8; - /// Creates a new atomic integer. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicI8; - /// let atomic_forty_two = AtomicI8::new(42); - /// ``` - new: func(v: s8) -> atomic-i8; -} - -/// Methods for AtomicIsize -interface atomic-isize { - use types.{reflect-reference}; - - /// Consumes the atomic and returns the contained value. - /// This is safe because passing `self` by value guarantees that no other threads are - /// concurrently accessing the atomic data. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicIsize; - /// let some_var = AtomicIsize::new(5); - /// assert_eq!(some_var.into_inner(), 5); - /// ``` - into-inner: func(self: atomic-isize) -> s64; - /// Creates a new atomic integer. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicIsize; - /// let atomic_forty_two = AtomicIsize::new(42); - /// ``` - new: func(v: s64) -> atomic-isize; -} - -/// Methods for AtomicU16 -interface atomic-u16 { - use types.{reflect-reference}; - - /// Creates a new atomic integer. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicU16; - /// let atomic_forty_two = AtomicU16::new(42); - /// ``` - new: func(v: u16) -> atomic-u16; - /// Consumes the atomic and returns the contained value. - /// This is safe because passing `self` by value guarantees that no other threads are - /// concurrently accessing the atomic data. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicU16; - /// let some_var = AtomicU16::new(5); - /// assert_eq!(some_var.into_inner(), 5); - /// ``` - into-inner: func(self: atomic-u16) -> u16; -} - -/// Methods for AtomicU32 -interface atomic-u32 { - use types.{reflect-reference}; - - /// Creates a new atomic integer. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicU32; - /// let atomic_forty_two = AtomicU32::new(42); - /// ``` - new: func(v: u32) -> atomic-u32; - /// Consumes the atomic and returns the contained value. - /// This is safe because passing `self` by value guarantees that no other threads are - /// concurrently accessing the atomic data. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicU32; - /// let some_var = AtomicU32::new(5); - /// assert_eq!(some_var.into_inner(), 5); - /// ``` - into-inner: func(self: atomic-u32) -> u32; -} - -/// Methods for AtomicU64 -interface atomic-u64 { - use types.{reflect-reference}; - - /// Creates a new atomic integer. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicU64; - /// let atomic_forty_two = AtomicU64::new(42); - /// ``` - new: func(v: u64) -> atomic-u64; - /// Consumes the atomic and returns the contained value. - /// This is safe because passing `self` by value guarantees that no other threads are - /// concurrently accessing the atomic data. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicU64; - /// let some_var = AtomicU64::new(5); - /// assert_eq!(some_var.into_inner(), 5); - /// ``` - into-inner: func(self: atomic-u64) -> u64; -} - -/// Methods for AtomicU8 -interface atomic-u8 { - use types.{reflect-reference}; - - /// Creates a new atomic integer. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicU8; - /// let atomic_forty_two = AtomicU8::new(42); - /// ``` - new: func(v: u8) -> atomic-u8; - /// Consumes the atomic and returns the contained value. - /// This is safe because passing `self` by value guarantees that no other threads are - /// concurrently accessing the atomic data. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicU8; - /// let some_var = AtomicU8::new(5); - /// assert_eq!(some_var.into_inner(), 5); - /// ``` - into-inner: func(self: atomic-u8) -> u8; -} - -/// Methods for AtomicUsize -interface atomic-usize { - use types.{reflect-reference}; - - /// Creates a new atomic integer. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicUsize; - /// let atomic_forty_two = AtomicUsize::new(42); - /// ``` - new: func(v: u64) -> atomic-usize; - /// Consumes the atomic and returns the contained value. - /// This is safe because passing `self` by value guarantees that no other threads are - /// concurrently accessing the atomic data. - /// # Examples - /// ``` - /// use std::sync::atomic::AtomicUsize; - /// let some_var = AtomicUsize::new(5); - /// assert_eq!(some_var.into_inner(), 5); - /// ``` - into-inner: func(self: atomic-usize) -> u64; -} - -/// Methods for Duration -interface duration { - use types.{reflect-reference}; - - /// Multiplies `Duration` by `f32`. - /// # Panics - /// This method will panic if result is negative, overflows `Duration` or not finite. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let dur = Duration::new(2, 700_000_000); - /// assert_eq!(dur.mul_f32(3.14), Duration::new(8, 478_000_641)); - /// assert_eq!(dur.mul_f32(3.14e5), Duration::new(847_800, 0)); - /// ``` - mul-f32: func(self: duration, rhs: f32) -> duration; - /// Creates a new `Duration` from the specified number of whole seconds. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let duration = Duration::from_secs(5); - /// assert_eq!(5, duration.as_secs()); - /// assert_eq!(0, duration.subsec_nanos()); - /// ``` - from-secs: func(secs: u64) -> duration; - /// Returns the fractional part of this `Duration`, in whole milliseconds. - /// This method does **not** return the length of the duration when - /// represented by milliseconds. The returned number always represents a - /// fractional portion of a second (i.e., it is less than one thousand). - /// # Examples - /// ``` - /// use std::time::Duration; - /// let duration = Duration::from_millis(5_432); - /// assert_eq!(duration.as_secs(), 5); - /// assert_eq!(duration.subsec_millis(), 432); - /// ``` - subsec-millis: func(self: duration) -> u32; - /// Returns the number of _whole_ seconds contained by this `Duration`. - /// The returned value does not include the fractional (nanosecond) part of the - /// duration, which can be obtained using [`subsec_nanos`]. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let duration = Duration::new(5, 730_023_852); - /// assert_eq!(duration.as_secs(), 5); - /// ``` - /// To determine the total number of seconds represented by the `Duration` - /// including the fractional part, use [`as_secs_f64`] or [`as_secs_f32`] - /// [`as_secs_f64`]: Duration::as_secs_f64 - /// [`as_secs_f32`]: Duration::as_secs_f32 - /// [`subsec_nanos`]: Duration::subsec_nanos - as-secs: func(self: duration) -> u64; - /// Returns the fractional part of this `Duration`, in nanoseconds. - /// This method does **not** return the length of the duration when - /// represented by nanoseconds. The returned number always represents a - /// fractional portion of a second (i.e., it is less than one billion). - /// # Examples - /// ``` - /// use std::time::Duration; - /// let duration = Duration::from_millis(5_010); - /// assert_eq!(duration.as_secs(), 5); - /// assert_eq!(duration.subsec_nanos(), 10_000_000); - /// ``` - subsec-nanos: func(self: duration) -> u32; - /// Divides `Duration` by `f64`. - /// # Panics - /// This method will panic if result is negative, overflows `Duration` or not finite. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let dur = Duration::new(2, 700_000_000); - /// assert_eq!(dur.div_f64(3.14), Duration::new(0, 859_872_611)); - /// assert_eq!(dur.div_f64(3.14e5), Duration::new(0, 8_599)); - /// ``` - div-f64: func(self: duration, rhs: f64) -> duration; - /// Creates a new `Duration` from the specified number of nanoseconds. - /// Note: Using this on the return value of `as_nanos()` might cause unexpected behavior: - /// `as_nanos()` returns a u128, and can return values that do not fit in u64, e.g. 585 years. - /// Instead, consider using the pattern `Duration::new(d.as_secs(), d.subsec_nanos())` - /// if you cannot copy/clone the Duration directly. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let duration = Duration::from_nanos(1_000_000_123); - /// assert_eq!(1, duration.as_secs()); - /// assert_eq!(123, duration.subsec_nanos()); - /// ``` - from-nanos: func(nanos: u64) -> duration; - /// Returns the fractional part of this `Duration`, in whole microseconds. - /// This method does **not** return the length of the duration when - /// represented by microseconds. The returned number always represents a - /// fractional portion of a second (i.e., it is less than one million). - /// # Examples - /// ``` - /// use std::time::Duration; - /// let duration = Duration::from_micros(1_234_567); - /// assert_eq!(duration.as_secs(), 1); - /// assert_eq!(duration.subsec_micros(), 234_567); - /// ``` - subsec-micros: func(self: duration) -> u32; - /// Creates a new `Duration` from the specified number of milliseconds. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let duration = Duration::from_millis(2_569); - /// assert_eq!(2, duration.as_secs()); - /// assert_eq!(569_000_000, duration.subsec_nanos()); - /// ``` - from-millis: func(millis: u64) -> duration; - /// Creates a new `Duration` from the specified number of seconds represented - /// as `f32`. - /// # Panics - /// This constructor will panic if `secs` is negative, overflows `Duration` or not finite. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let res = Duration::from_secs_f32(0.0); - /// assert_eq!(res, Duration::new(0, 0)); - /// let res = Duration::from_secs_f32(1e-20); - /// assert_eq!(res, Duration::new(0, 0)); - /// let res = Duration::from_secs_f32(4.2e-7); - /// assert_eq!(res, Duration::new(0, 420)); - /// let res = Duration::from_secs_f32(2.7); - /// assert_eq!(res, Duration::new(2, 700_000_048)); - /// let res = Duration::from_secs_f32(3e10); - /// assert_eq!(res, Duration::new(30_000_001_024, 0)); - /// // subnormal float - /// let res = Duration::from_secs_f32(f32::from_bits(1)); - /// assert_eq!(res, Duration::new(0, 0)); - /// // conversion uses rounding - /// let res = Duration::from_secs_f32(0.999e-9); - /// assert_eq!(res, Duration::new(0, 1)); - /// ``` - from-secs-f32: func(secs: f32) -> duration; - mul: func(self: duration, rhs: u32) -> duration; - eq: func(self: duration, other: duration) -> bool; - sub: func(self: duration, rhs: duration) -> duration; - /// Creates a new `Duration` from the specified number of whole seconds and - /// additional nanoseconds. - /// If the number of nanoseconds is greater than 1 billion (the number of - /// nanoseconds in a second), then it will carry over into the seconds provided. - /// # Panics - /// This constructor will panic if the carry from the nanoseconds overflows - /// the seconds counter. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let five_seconds = Duration::new(5, 0); - /// ``` - new: func(secs: u64, nanos: u32) -> duration; - /// Computes the absolute difference between `self` and `other`. - /// # Examples - /// ``` - /// use std::time::Duration; - /// assert_eq!(Duration::new(100, 0).abs_diff(Duration::new(80, 0)), Duration::new(20, 0)); - /// assert_eq!(Duration::new(100, 400_000_000).abs_diff(Duration::new(110, 0)), Duration::new(9, 600_000_000)); - /// ``` - abs-diff: func(self: duration, other: duration) -> duration; - /// Returns the total number of whole microseconds contained by this `Duration`. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let duration = Duration::new(5, 730_023_852); - /// assert_eq!(duration.as_micros(), 5_730_023); - /// ``` - as-micros: func(self: duration) -> u64; - /// Returns true if this `Duration` spans no time. - /// # Examples - /// ``` - /// use std::time::Duration; - /// assert!(Duration::ZERO.is_zero()); - /// assert!(Duration::new(0, 0).is_zero()); - /// assert!(Duration::from_nanos(0).is_zero()); - /// assert!(Duration::from_secs(0).is_zero()); - /// assert!(!Duration::new(1, 1).is_zero()); - /// assert!(!Duration::from_nanos(1).is_zero()); - /// assert!(!Duration::from_secs(1).is_zero()); - /// ``` - is-zero: func(self: duration) -> bool; - /// Saturating `Duration` multiplication. Computes `self * other`, returning - /// [`Duration::MAX`] if overflow occurred. - /// # Examples - /// ``` - /// #![feature(duration_constants)] - /// use std::time::Duration; - /// assert_eq!(Duration::new(0, 500_000_001).saturating_mul(2), Duration::new(1, 2)); - /// assert_eq!(Duration::new(u64::MAX - 1, 0).saturating_mul(2), Duration::MAX); - /// ``` - saturating-mul: func(self: duration, rhs: u32) -> duration; - /// Returns the total number of nanoseconds contained by this `Duration`. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let duration = Duration::new(5, 730_023_852); - /// assert_eq!(duration.as_nanos(), 5_730_023_852); - /// ``` - as-nanos: func(self: duration) -> u64; - /// Divides `Duration` by `Duration` and returns `f32`. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let dur1 = Duration::new(2, 700_000_000); - /// let dur2 = Duration::new(5, 400_000_000); - /// assert_eq!(dur1.div_duration_f32(dur2), 0.5); - /// ``` - div-duration-f32: func(self: duration, rhs: duration) -> f32; - /// Saturating `Duration` addition. Computes `self + other`, returning [`Duration::MAX`] - /// if overflow occurred. - /// # Examples - /// ``` - /// #![feature(duration_constants)] - /// use std::time::Duration; - /// assert_eq!(Duration::new(0, 0).saturating_add(Duration::new(0, 1)), Duration::new(0, 1)); - /// assert_eq!(Duration::new(1, 0).saturating_add(Duration::new(u64::MAX, 0)), Duration::MAX); - /// ``` - saturating-add: func(self: duration, rhs: duration) -> duration; - /// Creates a new `Duration` from the specified number of seconds represented - /// as `f64`. - /// # Panics - /// This constructor will panic if `secs` is negative, overflows `Duration` or not finite. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let res = Duration::from_secs_f64(0.0); - /// assert_eq!(res, Duration::new(0, 0)); - /// let res = Duration::from_secs_f64(1e-20); - /// assert_eq!(res, Duration::new(0, 0)); - /// let res = Duration::from_secs_f64(4.2e-7); - /// assert_eq!(res, Duration::new(0, 420)); - /// let res = Duration::from_secs_f64(2.7); - /// assert_eq!(res, Duration::new(2, 700_000_000)); - /// let res = Duration::from_secs_f64(3e10); - /// assert_eq!(res, Duration::new(30_000_000_000, 0)); - /// // subnormal float - /// let res = Duration::from_secs_f64(f64::from_bits(1)); - /// assert_eq!(res, Duration::new(0, 0)); - /// // conversion uses rounding - /// let res = Duration::from_secs_f64(0.999e-9); - /// assert_eq!(res, Duration::new(0, 1)); - /// ``` - from-secs-f64: func(secs: f64) -> duration; - /// Saturating `Duration` subtraction. Computes `self - other`, returning [`Duration::ZERO`] - /// if the result would be negative or if overflow occurred. - /// # Examples - /// ``` - /// use std::time::Duration; - /// assert_eq!(Duration::new(0, 1).saturating_sub(Duration::new(0, 0)), Duration::new(0, 1)); - /// assert_eq!(Duration::new(0, 0).saturating_sub(Duration::new(0, 1)), Duration::ZERO); - /// ``` - saturating-sub: func(self: duration, rhs: duration) -> duration; - div: func(self: duration, rhs: u32) -> duration; - /// Returns the number of seconds contained by this `Duration` as `f64`. - /// The returned value includes the fractional (nanosecond) part of the duration. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let dur = Duration::new(2, 700_000_000); - /// assert_eq!(dur.as_secs_f64(), 2.7); - /// ``` - as-secs-f64: func(self: duration) -> f64; - /// Divides `Duration` by `f32`. - /// # Panics - /// This method will panic if result is negative, overflows `Duration` or not finite. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let dur = Duration::new(2, 700_000_000); - /// // note that due to rounding errors result is slightly - /// // different from 0.859_872_611 - /// assert_eq!(dur.div_f32(3.14), Duration::new(0, 859_872_580)); - /// assert_eq!(dur.div_f32(3.14e5), Duration::new(0, 8_599)); - /// ``` - div-f32: func(self: duration, rhs: f32) -> duration; - /// Returns the number of seconds contained by this `Duration` as `f32`. - /// The returned value includes the fractional (nanosecond) part of the duration. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let dur = Duration::new(2, 700_000_000); - /// assert_eq!(dur.as_secs_f32(), 2.7); - /// ``` - as-secs-f32: func(self: duration) -> f32; - assert-receiver-is-total-eq: func(self: duration); - add: func(self: duration, rhs: duration) -> duration; - clone: func(self: duration) -> duration; - /// Multiplies `Duration` by `f64`. - /// # Panics - /// This method will panic if result is negative, overflows `Duration` or not finite. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let dur = Duration::new(2, 700_000_000); - /// assert_eq!(dur.mul_f64(3.14), Duration::new(8, 478_000_000)); - /// assert_eq!(dur.mul_f64(3.14e5), Duration::new(847_800, 0)); - /// ``` - mul-f64: func(self: duration, rhs: f64) -> duration; - /// Returns the total number of whole milliseconds contained by this `Duration`. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let duration = Duration::new(5, 730_023_852); - /// assert_eq!(duration.as_millis(), 5_730); - /// ``` - as-millis: func(self: duration) -> u64; - /// Creates a new `Duration` from the specified number of microseconds. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let duration = Duration::from_micros(1_000_002); - /// assert_eq!(1, duration.as_secs()); - /// assert_eq!(2_000, duration.subsec_nanos()); - /// ``` - from-micros: func(micros: u64) -> duration; - /// Divides `Duration` by `Duration` and returns `f64`. - /// # Examples - /// ``` - /// use std::time::Duration; - /// let dur1 = Duration::new(2, 700_000_000); - /// let dur2 = Duration::new(5, 400_000_000); - /// assert_eq!(dur1.div_duration_f64(dur2), 0.5); - /// ``` - div-duration-f64: func(self: duration, rhs: duration) -> f64; -} - -/// Methods for Affine2 -interface affine2 { - use types.{reflect-reference}; - - /// Returns true if the absolute difference of all elements between `self` and `rhs` - /// is less than or equal to `max_abs_diff`. - /// This can be used to compare if two 3x4 matrices contain similar elements. It works - /// best when comparing with a known value. The `max_abs_diff` that should be used used - /// depends on the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: affine2, rhs: affine2, max-abs-diff: f32) -> bool; - /// The given [`Mat3A`] must be an affine transform, - from-mat3a: func(m: mat3-a) -> affine2; - /// Creates an affine transform from a 2x2 matrix (expressing scale, shear and rotation) and a - /// translation vector. - /// Equivalent to - /// `Affine2::from_translation(translation) * Affine2::from_mat2(mat2)` - from-mat2-translation: func(matrix2: mat2, translation: vec2) -> affine2; - mul: func(p0: affine2, p1: mat3) -> mat3; - /// Transforms the given 2D vector, applying shear, scale and rotation (but NOT - /// translation). - /// To also apply translation, use [`Self::transform_point2()`] instead. - transform-vector2: func(self: affine2, rhs: vec2) -> vec2; - /// Transforms the given 2D point, applying shear, scale, rotation and translation. - transform-point2: func(self: affine2, rhs: vec2) -> vec2; - /// Creates a `[[f32; 2]; 3]` 2D array storing data in - /// column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array-2d: func(self: affine2) -> list>; - /// Casts all elements of `self` to `f64`. - as-daffine2: func(self: affine2) -> daffine2; - /// Creates an affine transform that changes scale. - /// Note that if any scale is zero the transform will be non-invertible. - from-scale: func(scale: vec2) -> affine2; - /// Creates an affine transformation from the given 2D `translation`. - from-translation: func(translation: vec2) -> affine2; - mul: func(p0: affine2, p1: mat3-a) -> mat3-a; - eq: func(self: affine2, rhs: affine2) -> bool; - /// Creates an affine transform from the given 2D `scale`, rotation `angle` (in radians) and - /// `translation`. - /// Equivalent to `Affine2::from_translation(translation) * - /// Affine2::from_angle(angle) * Affine2::from_scale(scale)` - from-scale-angle-translation: func(scale: vec2, angle: f32, translation: vec2) -> affine2; - /// Creates an affine transform from three column vectors. - from-cols: func(x-axis: vec2, y-axis: vec2, z-axis: vec2) -> affine2; - /// Creates an affine transform from the given rotation `angle`. - from-angle: func(angle: f32) -> affine2; - clone: func(self: affine2) -> affine2; - /// The given `Mat3` must be an affine transform, - from-mat3: func(m: mat3) -> affine2; - /// Returns `true` if, and only if, all elements are finite. - /// If any element is either `NaN`, positive or negative infinity, this will return - /// `false`. - is-finite: func(self: affine2) -> bool; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: affine2) -> bool; - mul: func(p0: affine2, p1: affine2) -> affine2; - /// Return the inverse of this transform. - /// Note that if the transform is not invertible the result will be invalid. - inverse: func(self: affine2) -> affine2; - /// Creates an affine transform from the given 2D rotation `angle` (in radians) and - /// `translation`. - /// Equivalent to `Affine2::from_translation(translation) * Affine2::from_angle(angle)` - from-angle-translation: func(angle: f32, translation: vec2) -> affine2; - /// Creates an affine transform from a 2x2 matrix (expressing scale, shear and rotation) - from-mat2: func(matrix2: mat2) -> affine2; - mul: func(self: affine2, rhs: affine2) -> affine2; - mul: func(p0: affine2, p1: mat3) -> mat3; - mul: func(p0: affine2, p1: mat3-a) -> mat3-a; - /// Creates a `[f32; 6]` array storing data in column major order. - to-cols-array: func(self: affine2) -> list; -} - -/// Methods for Affine3A -interface affine3-a { - use types.{reflect-reference}; - - /// Creates an affine transform containing a 3D rotation around the z axis of - /// `angle` (in radians). - from-rotation-z: func(angle: f32) -> affine3-a; - mul: func(self: affine3-a, rhs: affine3-a) -> affine3-a; - /// Creates a `[f32; 12]` array storing data in column major order. - to-cols-array: func(self: affine3-a) -> list; - /// Creates an affine transform containing a 3D rotation around the y axis of - /// `angle` (in radians). - from-rotation-y: func(angle: f32) -> affine3-a; - /// Creates an affine transform containing a 3D rotation around a normalized - /// rotation `axis` of `angle` (in radians). - from-axis-angle: func(axis: vec3, angle: f32) -> affine3-a; - /// Transforms the given [`Vec3A`], applying shear, scale and rotation (but NOT - /// translation). - /// To also apply translation, use [`Self::transform_point3a()`] instead. - transform-vector3a: func(self: affine3-a, rhs: vec3-a) -> vec3-a; - /// Creates a `[[f32; 3]; 4]` 3D array storing data in - /// column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array-2d: func(self: affine3-a) -> list>; - /// Creates an affine transform that changes scale. - /// Note that if any scale is zero the transform will be non-invertible. - from-scale: func(scale: vec3) -> affine3-a; - eq: func(self: affine3-a, rhs: affine3-a) -> bool; - mul: func(p0: affine3-a, p1: mat4) -> mat4; - mul: func(p0: affine3-a, p1: affine3-a) -> affine3-a; - /// The given `Mat4` must be an affine transform, - /// i.e. contain no perspective transform. - from-mat4: func(m: mat4) -> affine3-a; - /// Creates an affine transform from a 3x3 matrix (expressing scale, shear and - /// rotation) - from-mat3: func(mat3: mat3) -> affine3-a; - /// Returns true if the absolute difference of all elements between `self` and `rhs` - /// is less than or equal to `max_abs_diff`. - /// This can be used to compare if two 3x4 matrices contain similar elements. It works - /// best when comparing with a known value. The `max_abs_diff` that should be used used - /// depends on the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: affine3-a, rhs: affine3-a, max-abs-diff: f32) -> bool; - /// Returns `true` if, and only if, all elements are finite. - /// If any element is either `NaN`, positive or negative infinity, this will return - /// `false`. - is-finite: func(self: affine3-a) -> bool; - /// Transforms the given 3D points, applying shear, scale, rotation and translation. - transform-point3: func(self: affine3-a, rhs: vec3) -> vec3; - mul: func(p0: affine3-a, p1: mat4) -> mat4; - /// Casts all elements of `self` to `f64`. - as-daffine3: func(self: affine3-a) -> daffine3; - /// Creates an affine transform from a 3x3 matrix (expressing scale, shear and rotation) - /// and a translation vector. - /// Equivalent to `Affine3A::from_translation(translation) * Affine3A::from_mat3(mat3)` - from-mat3-translation: func(mat3: mat3, translation: vec3) -> affine3-a; - /// Transforms the given [`Vec3A`], applying shear, scale, rotation and translation. - transform-point3a: func(self: affine3-a, rhs: vec3-a) -> vec3-a; - /// Creates an affine transform from three column vectors. - from-cols: func(x-axis: vec3-a, y-axis: vec3-a, z-axis: vec3-a, w-axis: vec3-a) -> affine3-a; - /// Creates a right-handed view transform using a camera position, an up direction, and a focal - /// point. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-rh: func(eye: vec3, center: vec3, up: vec3) -> affine3-a; - /// Creates a left-handed view transform using a camera position, an up direction, and a facing - /// direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - look-to-lh: func(eye: vec3, dir: vec3, up: vec3) -> affine3-a; - /// Creates an affine transform from the given `rotation` quaternion. - from-quat: func(rotation: quat) -> affine3-a; - clone: func(self: affine3-a) -> affine3-a; - /// Creates a left-handed view transform using a camera position, an up direction, and a focal - /// point. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-lh: func(eye: vec3, center: vec3, up: vec3) -> affine3-a; - /// Creates an affine transform from the given 3D `rotation` and `translation`. - /// Equivalent to `Affine3A::from_translation(translation) * Affine3A::from_quat(rotation)` - from-rotation-translation: func(rotation: quat, translation: vec3) -> affine3-a; - /// Creates a right-handed view transform using a camera position, an up direction, and a facing - /// direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - look-to-rh: func(eye: vec3, dir: vec3, up: vec3) -> affine3-a; - /// Creates an affine transform from the given 3D `scale`, `rotation` and - /// `translation`. - /// Equivalent to `Affine3A::from_translation(translation) * - /// Affine3A::from_quat(rotation) * Affine3A::from_scale(scale)` - from-scale-rotation-translation: func(scale: vec3, rotation: quat, translation: vec3) -> affine3-a; - /// Transforms the given 3D vector, applying shear, scale and rotation (but NOT - /// translation). - /// To also apply translation, use [`Self::transform_point3()`] instead. - transform-vector3: func(self: affine3-a, rhs: vec3) -> vec3; - /// Return the inverse of this transform. - /// Note that if the transform is not invertible the result will be invalid. - inverse: func(self: affine3-a) -> affine3-a; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: affine3-a) -> bool; - /// Creates an affine transform containing a 3D rotation around the x axis of - /// `angle` (in radians). - from-rotation-x: func(angle: f32) -> affine3-a; - /// Creates an affine transformation from the given 3D `translation`. - from-translation: func(translation: vec3) -> affine3-a; -} - -/// Methods for BVec2 -interface bvec2 { - use types.{reflect-reference}; - - assert-receiver-is-total-eq: func(self: bvec2); - /// Creates a new vector mask. - new: func(x: bool, y: bool) -> bvec2; - eq: func(self: bvec2, other: bvec2) -> bool; - /// Tests the value at `index`. - /// Panics if `index` is greater than 1. - test: func(self: bvec2, index: u64) -> bool; - /// Creates a vector mask with all elements set to `v`. - splat: func(v: bool) -> bvec2; - /// Creates a new vector mask from a bool array. - from-array: func(a: list) -> bvec2; - /// Returns true if any of the elements are true, false otherwise. - any: func(self: bvec2) -> bool; - /// Returns a bitmask with the lowest 2 bits set from the elements of `self`. - /// A true element results in a `1` bit and a false element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - bitmask: func(self: bvec2) -> u32; - clone: func(self: bvec2) -> bvec2; - /// Sets the element at `index`. - /// Panics if `index` is greater than 1. - set: func(self: bvec2, index: u64, value: bool); - /// Returns true if all the elements are true, false otherwise. - all: func(self: bvec2) -> bool; -} - -/// Methods for BVec3 -interface bvec3 { - use types.{reflect-reference}; - - /// Sets the element at `index`. - /// Panics if `index` is greater than 2. - set: func(self: bvec3, index: u64, value: bool); - clone: func(self: bvec3) -> bvec3; - /// Returns true if all the elements are true, false otherwise. - all: func(self: bvec3) -> bool; - /// Creates a vector mask with all elements set to `v`. - splat: func(v: bool) -> bvec3; - eq: func(self: bvec3, other: bvec3) -> bool; - /// Tests the value at `index`. - /// Panics if `index` is greater than 2. - test: func(self: bvec3, index: u64) -> bool; - assert-receiver-is-total-eq: func(self: bvec3); - /// Returns a bitmask with the lowest 3 bits set from the elements of `self`. - /// A true element results in a `1` bit and a false element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - bitmask: func(self: bvec3) -> u32; - /// Creates a new vector mask. - new: func(x: bool, y: bool, z: bool) -> bvec3; - /// Creates a new vector mask from a bool array. - from-array: func(a: list) -> bvec3; - /// Returns true if any of the elements are true, false otherwise. - any: func(self: bvec3) -> bool; -} - -/// Methods for BVec3A -interface bvec3-a { - use types.{reflect-reference}; - - /// Creates a vector mask with all elements set to `v`. - splat: func(v: bool) -> bvec3-a; - /// Creates a new vector mask. - new: func(x: bool, y: bool, z: bool) -> bvec3-a; - /// Returns true if all the elements are true, false otherwise. - all: func(self: bvec3-a) -> bool; - /// Returns a bitmask with the lowest 3 bits set from the elements of `self`. - /// A true element results in a `1` bit and a false element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - bitmask: func(self: bvec3-a) -> u32; - /// Tests the value at `index`. - /// Panics if `index` is greater than 2. - test: func(self: bvec3-a, index: u64) -> bool; - eq: func(self: bvec3-a, rhs: bvec3-a) -> bool; - /// Creates a new vector mask from a bool array. - from-array: func(a: list) -> bvec3-a; - clone: func(self: bvec3-a) -> bvec3-a; - /// Returns true if any of the elements are true, false otherwise. - any: func(self: bvec3-a) -> bool; - /// Sets the element at `index`. - /// Panics if `index` is greater than 2. - set: func(self: bvec3-a, index: u64, value: bool); -} - -/// Methods for BVec4 -interface bvec4 { - use types.{reflect-reference}; - - /// Creates a new vector mask from a bool array. - from-array: func(a: list) -> bvec4; - /// Tests the value at `index`. - /// Panics if `index` is greater than 3. - test: func(self: bvec4, index: u64) -> bool; - /// Returns true if any of the elements are true, false otherwise. - any: func(self: bvec4) -> bool; - /// Sets the element at `index`. - /// Panics if `index` is greater than 3. - set: func(self: bvec4, index: u64, value: bool); - /// Creates a new vector mask. - new: func(x: bool, y: bool, z: bool, w: bool) -> bvec4; - assert-receiver-is-total-eq: func(self: bvec4); - eq: func(self: bvec4, other: bvec4) -> bool; - /// Returns a bitmask with the lowest 4 bits set from the elements of `self`. - /// A true element results in a `1` bit and a false element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - bitmask: func(self: bvec4) -> u32; - /// Creates a vector mask with all elements set to `v`. - splat: func(v: bool) -> bvec4; - /// Returns true if all the elements are true, false otherwise. - all: func(self: bvec4) -> bool; - clone: func(self: bvec4) -> bvec4; -} - -/// Methods for BVec4A -interface bvec4-a { - use types.{reflect-reference}; - - eq: func(self: bvec4-a, rhs: bvec4-a) -> bool; - clone: func(self: bvec4-a) -> bvec4-a; - /// Creates a new vector mask. - new: func(x: bool, y: bool, z: bool, w: bool) -> bvec4-a; - /// Creates a vector mask with all elements set to `v`. - splat: func(v: bool) -> bvec4-a; - /// Tests the value at `index`. - /// Panics if `index` is greater than 3. - test: func(self: bvec4-a, index: u64) -> bool; - /// Creates a new vector mask from a bool array. - from-array: func(a: list) -> bvec4-a; - /// Returns true if all the elements are true, false otherwise. - all: func(self: bvec4-a) -> bool; - /// Returns true if any of the elements are true, false otherwise. - any: func(self: bvec4-a) -> bool; - /// Returns a bitmask with the lowest 4 bits set from the elements of `self`. - /// A true element results in a `1` bit and a false element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - bitmask: func(self: bvec4-a) -> u32; - /// Sets the element at `index`. - /// Panics if `index` is greater than 3. - set: func(self: bvec4-a, index: u64, value: bool); -} - -/// Methods for DAffine2 -interface daffine2 { - use types.{reflect-reference}; - - mul: func(p0: daffine2, p1: daffine2) -> daffine2; - /// Creates an affine transform from the given 2D rotation `angle` (in radians) and - /// `translation`. - /// Equivalent to `DAffine2::from_translation(translation) * DAffine2::from_angle(angle)` - from-angle-translation: func(angle: f64, translation: dvec2) -> daffine2; - /// Creates an affine transform from the given 2D `scale`, rotation `angle` (in radians) and - /// `translation`. - /// Equivalent to `DAffine2::from_translation(translation) * - /// DAffine2::from_angle(angle) * DAffine2::from_scale(scale)` - from-scale-angle-translation: func(scale: dvec2, angle: f64, translation: dvec2) -> daffine2; - /// Returns true if the absolute difference of all elements between `self` and `rhs` - /// is less than or equal to `max_abs_diff`. - /// This can be used to compare if two 3x4 matrices contain similar elements. It works - /// best when comparing with a known value. The `max_abs_diff` that should be used used - /// depends on the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: daffine2, rhs: daffine2, max-abs-diff: f64) -> bool; - eq: func(self: daffine2, rhs: daffine2) -> bool; - /// Returns `true` if, and only if, all elements are finite. - /// If any element is either `NaN`, positive or negative infinity, this will return - /// `false`. - is-finite: func(self: daffine2) -> bool; - mul: func(self: daffine2, rhs: daffine2) -> daffine2; - /// The given `DMat3` must be an affine transform, - from-mat3: func(m: dmat3) -> daffine2; - /// Return the inverse of this transform. - /// Note that if the transform is not invertible the result will be invalid. - inverse: func(self: daffine2) -> daffine2; - mul: func(p0: daffine2, p1: dmat3) -> dmat3; - /// Creates a `[f64; 6]` array storing data in column major order. - to-cols-array: func(self: daffine2) -> list; - /// Transforms the given 2D vector, applying shear, scale and rotation (but NOT - /// translation). - /// To also apply translation, use [`Self::transform_point2()`] instead. - transform-vector2: func(self: daffine2, rhs: dvec2) -> dvec2; - clone: func(self: daffine2) -> daffine2; - /// Creates a `[[f64; 2]; 3]` 2D array storing data in - /// column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array-2d: func(self: daffine2) -> list>; - /// Creates an affine transform from three column vectors. - from-cols: func(x-axis: dvec2, y-axis: dvec2, z-axis: dvec2) -> daffine2; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: daffine2) -> bool; - /// Casts all elements of `self` to `f32`. - as-affine2: func(self: daffine2) -> affine2; - mul: func(p0: daffine2, p1: dmat3) -> dmat3; - /// Creates an affine transform that changes scale. - /// Note that if any scale is zero the transform will be non-invertible. - from-scale: func(scale: dvec2) -> daffine2; - /// Creates an affine transform from a 2x2 matrix (expressing scale, shear and rotation) and a - /// translation vector. - /// Equivalent to - /// `DAffine2::from_translation(translation) * DAffine2::from_mat2(mat2)` - from-mat2-translation: func(matrix2: dmat2, translation: dvec2) -> daffine2; - /// Creates an affine transform from a 2x2 matrix (expressing scale, shear and rotation) - from-mat2: func(matrix2: dmat2) -> daffine2; - /// Creates an affine transformation from the given 2D `translation`. - from-translation: func(translation: dvec2) -> daffine2; - /// Transforms the given 2D point, applying shear, scale, rotation and translation. - transform-point2: func(self: daffine2, rhs: dvec2) -> dvec2; - /// Creates an affine transform from the given rotation `angle`. - from-angle: func(angle: f64) -> daffine2; -} - -/// Methods for DAffine3 -interface daffine3 { - use types.{reflect-reference}; - - /// Creates an affine transform containing a 3D rotation around the z axis of - /// `angle` (in radians). - from-rotation-z: func(angle: f64) -> daffine3; - /// Creates a `[f64; 12]` array storing data in column major order. - to-cols-array: func(self: daffine3) -> list; - /// Returns true if the absolute difference of all elements between `self` and `rhs` - /// is less than or equal to `max_abs_diff`. - /// This can be used to compare if two 3x4 matrices contain similar elements. It works - /// best when comparing with a known value. The `max_abs_diff` that should be used used - /// depends on the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: daffine3, rhs: daffine3, max-abs-diff: f64) -> bool; - /// Creates an affine transformation from the given 3D `translation`. - from-translation: func(translation: dvec3) -> daffine3; - /// Creates an affine transform from the given 3D `scale`, `rotation` and - /// `translation`. - /// Equivalent to `DAffine3::from_translation(translation) * - /// DAffine3::from_quat(rotation) * DAffine3::from_scale(scale)` - from-scale-rotation-translation: func(scale: dvec3, rotation: dquat, translation: dvec3) -> daffine3; - /// Creates an affine transform that changes scale. - /// Note that if any scale is zero the transform will be non-invertible. - from-scale: func(scale: dvec3) -> daffine3; - /// Creates a left-handed view transform using a camera position, an up direction, and a facing - /// direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - look-to-lh: func(eye: dvec3, dir: dvec3, up: dvec3) -> daffine3; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: daffine3) -> bool; - mul: func(p0: daffine3, p1: dmat4) -> dmat4; - /// Creates a right-handed view transform using a camera position, an up direction, and a focal - /// point. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-rh: func(eye: dvec3, center: dvec3, up: dvec3) -> daffine3; - /// Creates an affine transform containing a 3D rotation around the x axis of - /// `angle` (in radians). - from-rotation-x: func(angle: f64) -> daffine3; - /// Creates a `[[f64; 3]; 4]` 3D array storing data in - /// column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array-2d: func(self: daffine3) -> list>; - mul: func(p0: daffine3, p1: daffine3) -> daffine3; - /// Transforms the given 3D points, applying shear, scale, rotation and translation. - transform-point3: func(self: daffine3, rhs: dvec3) -> dvec3; - /// Casts all elements of `self` to `f32`. - as-affine3a: func(self: daffine3) -> affine3-a; - /// Returns `true` if, and only if, all elements are finite. - /// If any element is either `NaN`, positive or negative infinity, this will return - /// `false`. - is-finite: func(self: daffine3) -> bool; - /// Creates an affine transform from a 3x3 matrix (expressing scale, shear and rotation) - /// and a translation vector. - /// Equivalent to `DAffine3::from_translation(translation) * DAffine3::from_mat3(mat3)` - from-mat3-translation: func(mat3: dmat3, translation: dvec3) -> daffine3; - /// Transforms the given 3D vector, applying shear, scale and rotation (but NOT - /// translation). - /// To also apply translation, use [`Self::transform_point3()`] instead. - transform-vector3: func(self: daffine3, rhs: dvec3) -> dvec3; - mul: func(self: daffine3, rhs: daffine3) -> daffine3; - clone: func(self: daffine3) -> daffine3; - /// The given `DMat4` must be an affine transform, - /// i.e. contain no perspective transform. - from-mat4: func(m: dmat4) -> daffine3; - /// Creates an affine transform from the given 3D `rotation` and `translation`. - /// Equivalent to `DAffine3::from_translation(translation) * DAffine3::from_quat(rotation)` - from-rotation-translation: func(rotation: dquat, translation: dvec3) -> daffine3; - /// Creates a right-handed view transform using a camera position, an up direction, and a facing - /// direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - look-to-rh: func(eye: dvec3, dir: dvec3, up: dvec3) -> daffine3; - /// Return the inverse of this transform. - /// Note that if the transform is not invertible the result will be invalid. - inverse: func(self: daffine3) -> daffine3; - /// Creates an affine transform from the given `rotation` quaternion. - from-quat: func(rotation: dquat) -> daffine3; - /// Creates an affine transform containing a 3D rotation around a normalized - /// rotation `axis` of `angle` (in radians). - from-axis-angle: func(axis: dvec3, angle: f64) -> daffine3; - /// Creates an affine transform from a 3x3 matrix (expressing scale, shear and - /// rotation) - from-mat3: func(mat3: dmat3) -> daffine3; - /// Creates an affine transform from three column vectors. - from-cols: func(x-axis: dvec3, y-axis: dvec3, z-axis: dvec3, w-axis: dvec3) -> daffine3; - /// Creates a left-handed view transform using a camera position, an up direction, and a focal - /// point. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-lh: func(eye: dvec3, center: dvec3, up: dvec3) -> daffine3; - eq: func(self: daffine3, rhs: daffine3) -> bool; - mul: func(p0: daffine3, p1: dmat4) -> dmat4; - /// Creates an affine transform containing a 3D rotation around the y axis of - /// `angle` (in radians). - from-rotation-y: func(angle: f64) -> daffine3; -} - -/// Methods for DMat2 -interface dmat2 { - use types.{reflect-reference}; - - /// Adds two 2x2 matrices. - add-mat2: func(self: dmat2, rhs: dmat2) -> dmat2; - sub: func(p0: dmat2, p1: dmat2) -> dmat2; - mul: func(self: dmat2, rhs: dmat2) -> dmat2; - /// Multiplies a 2x2 matrix by a scalar. - mul-scalar: func(self: dmat2, rhs: f64) -> dmat2; - /// Takes the absolute value of each element in `self` - abs: func(self: dmat2) -> dmat2; - /// Returns true if the absolute difference of all elements between `self` and `rhs` - /// is less than or equal to `max_abs_diff`. - /// This can be used to compare if two matrices contain similar elements. It works best - /// when comparing with a known value. The `max_abs_diff` that should be used used - /// depends on the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: dmat2, rhs: dmat2, max-abs-diff: f64) -> bool; - /// Subtracts two 2x2 matrices. - sub-mat2: func(self: dmat2, rhs: dmat2) -> dmat2; - add: func(p0: dmat2, p1: dmat2) -> dmat2; - mul: func(p0: dmat2, p1: dvec2) -> dvec2; - clone: func(self: dmat2) -> dmat2; - /// Multiplies two 2x2 matrices. - mul-mat2: func(self: dmat2, rhs: dmat2) -> dmat2; - /// Creates a 2x2 matrix containing the combining non-uniform `scale` and rotation of - /// `angle` (in radians). - from-scale-angle: func(scale: dvec2, angle: f64) -> dmat2; - /// Returns the transpose of `self`. - transpose: func(self: dmat2) -> dmat2; - /// Creates a 2x2 matrix containing a rotation of `angle` (in radians). - from-angle: func(angle: f64) -> dmat2; - /// Returns the matrix row for the given `index`. - /// # Panics - /// Panics if `index` is greater than 1. - row: func(self: dmat2, index: u64) -> dvec2; - /// Creates a `[[f64; 2]; 2]` 2D array storing data in column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array-2d: func(self: dmat2) -> list>; - mul: func(p0: dmat2, p1: dvec2) -> dvec2; - sub: func(self: dmat2, rhs: dmat2) -> dmat2; - /// Transforms a 2D vector. - mul-vec2: func(self: dmat2, rhs: dvec2) -> dvec2; - /// Creates a 2x2 matrix from a 3x3 matrix, discarding the 2nd row and column. - from-mat3: func(m: dmat3) -> dmat2; - div: func(self: dmat2, rhs: f64) -> dmat2; - /// Returns the inverse of `self`. - /// If the matrix is not invertible the returned matrix will be invalid. - /// # Panics - /// Will panic if the determinant of `self` is zero when `glam_assert` is enabled. - inverse: func(self: dmat2) -> dmat2; - /// Creates a `[f64; 4]` array storing data in column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array: func(self: dmat2) -> list; - /// Creates a 2x2 matrix from two column vectors. - from-cols: func(x-axis: dvec2, y-axis: dvec2) -> dmat2; - neg: func(self: dmat2) -> dmat2; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: dmat2) -> bool; - as-mat2: func(self: dmat2) -> mat2; - /// Returns the determinant of `self`. - determinant: func(self: dmat2) -> f64; - mul: func(p0: dmat2, p1: f64) -> dmat2; - /// Returns `true` if, and only if, all elements are finite. - /// If any element is either `NaN`, positive or negative infinity, this will return `false`. - is-finite: func(self: dmat2) -> bool; - /// Creates a 2x2 matrix with its diagonal set to `diagonal` and all other entries set to 0. - from-diagonal: func(diagonal: dvec2) -> dmat2; - /// Creates a 2x2 matrix from the minor of the given 3x3 matrix, discarding the `i`th column - /// and `j`th row. - /// # Panics - /// Panics if `i` or `j` is greater than 2. - from-mat3-minor: func(m: dmat3, i: u64, j: u64) -> dmat2; - mul: func(p0: dmat2, p1: dmat2) -> dmat2; - eq: func(self: dmat2, rhs: dmat2) -> bool; - add: func(self: dmat2, rhs: dmat2) -> dmat2; - /// Returns the matrix column for the given `index`. - /// # Panics - /// Panics if `index` is greater than 1. - col: func(self: dmat2, index: u64) -> dvec2; - /// Divides a 2x2 matrix by a scalar. - div-scalar: func(self: dmat2, rhs: f64) -> dmat2; -} - -/// Methods for DMat3 -interface dmat3 { - use types.{reflect-reference}; - - /// Returns the inverse of `self`. - /// If the matrix is not invertible the returned matrix will be invalid. - /// # Panics - /// Will panic if the determinant of `self` is zero when `glam_assert` is enabled. - inverse: func(self: dmat3) -> dmat3; - /// Creates a 3D rotation matrix from `angle` (in radians) around the x axis. - from-rotation-x: func(angle: f64) -> dmat3; - mul: func(p0: dmat3, p1: daffine2) -> dmat3; - /// Creates a `[[f64; 3]; 3]` 3D array storing data in column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array-2d: func(self: dmat3) -> list>; - mul: func(p0: dmat3, p1: dmat3) -> dmat3; - /// Returns true if the absolute difference of all elements between `self` and `rhs` - /// is less than or equal to `max_abs_diff`. - /// This can be used to compare if two matrices contain similar elements. It works best - /// when comparing with a known value. The `max_abs_diff` that should be used used - /// depends on the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: dmat3, rhs: dmat3, max-abs-diff: f64) -> bool; - /// Multiplies a 3x3 matrix by a scalar. - mul-scalar: func(self: dmat3, rhs: f64) -> dmat3; - eq: func(self: dmat3, rhs: dmat3) -> bool; - /// Creates a 3D rotation matrix from `angle` (in radians) around the z axis. - from-rotation-z: func(angle: f64) -> dmat3; - sub: func(self: dmat3, rhs: dmat3) -> dmat3; - /// Creates a right-handed view matrix using a facing direction and an up direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - /// # Panics - /// Will panic if `dir` or `up` are not normalized when `glam_assert` is enabled. - look-to-rh: func(dir: dvec3, up: dvec3) -> dmat3; - /// Creates a 3D rotation matrix from the given quaternion. - /// # Panics - /// Will panic if `rotation` is not normalized when `glam_assert` is enabled. - from-quat: func(rotation: dquat) -> dmat3; - /// Creates a 3x3 matrix from a 4x4 matrix, discarding the 4th row and column. - from-mat4: func(m: dmat4) -> dmat3; - /// Returns the matrix column for the given `index`. - /// # Panics - /// Panics if `index` is greater than 2. - col: func(self: dmat3, index: u64) -> dvec3; - /// Creates an affine transformation matrix from the given 2D rotation `angle` (in - /// radians). - /// The resulting matrix can be used to transform 2D points and vectors. See - /// [`Self::transform_point2()`] and [`Self::transform_vector2()`]. - from-angle: func(angle: f64) -> dmat3; - /// Creates a 3D rotation matrix from the given euler rotation sequence and the angles (in - /// radians). - from-euler: func(order: euler-rot, a: f64, b: f64, c: f64) -> dmat3; - /// Creates a `[f64; 9]` array storing data in column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array: func(self: dmat3) -> list; - /// Creates an affine transformation matrix from the given 2D `scale`, rotation `angle` (in - /// radians) and `translation`. - /// The resulting matrix can be used to transform 2D points and vectors. See - /// [`Self::transform_point2()`] and [`Self::transform_vector2()`]. - from-scale-angle-translation: func(scale: dvec2, angle: f64, translation: dvec2) -> dmat3; - /// Rotates the given 2D vector. - /// This is the equivalent of multiplying `rhs` as a 3D vector where `z` is `0`. - /// This method assumes that `self` contains a valid affine transform. - /// # Panics - /// Will panic if the 2nd row of `self` is not `(0, 0, 1)` when `glam_assert` is enabled. - transform-vector2: func(self: dmat3, rhs: dvec2) -> dvec2; - /// Creates a left-handed view matrix using a facing direction and an up direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - /// # Panics - /// Will panic if `dir` or `up` are not normalized when `glam_assert` is enabled. - look-to-lh: func(dir: dvec3, up: dvec3) -> dmat3; - mul: func(self: dmat3, rhs: daffine2) -> dmat3; - /// Creates a 3x3 matrix from the minor of the given 4x4 matrix, discarding the `i`th column - /// and `j`th row. - /// # Panics - /// Panics if `i` or `j` is greater than 3. - from-mat4-minor: func(m: dmat4, i: u64, j: u64) -> dmat3; - add: func(self: dmat3, rhs: dmat3) -> dmat3; - /// Creates a 3x3 matrix with its diagonal set to `diagonal` and all other entries set to 0. - from-diagonal: func(diagonal: dvec3) -> dmat3; - div: func(self: dmat3, rhs: f64) -> dmat3; - /// Creates a 3D rotation matrix from a normalized rotation `axis` and `angle` (in - /// radians). - /// # Panics - /// Will panic if `axis` is not normalized when `glam_assert` is enabled. - from-axis-angle: func(axis: dvec3, angle: f64) -> dmat3; - /// Adds two 3x3 matrices. - add-mat3: func(self: dmat3, rhs: dmat3) -> dmat3; - clone: func(self: dmat3) -> dmat3; - /// Creates an affine transformation matrix from the given non-uniform 2D `scale`. - /// The resulting matrix can be used to transform 2D points and vectors. See - /// [`Self::transform_point2()`] and [`Self::transform_vector2()`]. - /// # Panics - /// Will panic if all elements of `scale` are zero when `glam_assert` is enabled. - from-scale: func(scale: dvec2) -> dmat3; - /// Creates a 3x3 matrix from three column vectors. - from-cols: func(x-axis: dvec3, y-axis: dvec3, z-axis: dvec3) -> dmat3; - /// Returns the determinant of `self`. - determinant: func(self: dmat3) -> f64; - add: func(p0: dmat3, p1: dmat3) -> dmat3; - mul: func(p0: dmat3, p1: dvec3) -> dvec3; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: dmat3) -> bool; - as-mat3: func(self: dmat3) -> mat3; - /// Creates a right-handed view matrix using a camera position, a focal point and an up - /// direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-rh: func(eye: dvec3, center: dvec3, up: dvec3) -> dmat3; - /// Transforms the given 2D vector as a point. - /// This is the equivalent of multiplying `rhs` as a 3D vector where `z` is `1`. - /// This method assumes that `self` contains a valid affine transform. - /// # Panics - /// Will panic if the 2nd row of `self` is not `(0, 0, 1)` when `glam_assert` is enabled. - transform-point2: func(self: dmat3, rhs: dvec2) -> dvec2; - /// Returns the matrix row for the given `index`. - /// # Panics - /// Panics if `index` is greater than 2. - row: func(self: dmat3, index: u64) -> dvec3; - /// Extract Euler angles with the given Euler rotation order. - /// Note if the input matrix contains scales, shears, or other non-rotation transformations then - /// the resulting Euler angles will be ill-defined. - /// # Panics - /// Will panic if any input matrix column is not normalized when `glam_assert` is enabled. - to-euler: func(self: dmat3, order: euler-rot) -> tuple; - /// Creates a left-handed view matrix using a camera position, a focal point and an up - /// direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-lh: func(eye: dvec3, center: dvec3, up: dvec3) -> dmat3; - /// Takes the absolute value of each element in `self` - abs: func(self: dmat3) -> dmat3; - mul: func(p0: dmat3, p1: f64) -> dmat3; - neg: func(self: dmat3) -> dmat3; - /// Returns the transpose of `self`. - transpose: func(self: dmat3) -> dmat3; - /// Creates an affine transformation matrix from the given 2x2 matrix. - /// The resulting matrix can be used to transform 2D points and vectors. See - /// [`Self::transform_point2()`] and [`Self::transform_vector2()`]. - from-mat2: func(m: dmat2) -> dmat3; - /// Creates an affine transformation matrix from the given 2D `translation`. - /// The resulting matrix can be used to transform 2D points and vectors. See - /// [`Self::transform_point2()`] and [`Self::transform_vector2()`]. - from-translation: func(translation: dvec2) -> dmat3; - /// Multiplies two 3x3 matrices. - mul-mat3: func(self: dmat3, rhs: dmat3) -> dmat3; - mul: func(p0: dmat3, p1: dmat3) -> dmat3; - /// Divides a 3x3 matrix by a scalar. - div-scalar: func(self: dmat3, rhs: f64) -> dmat3; - /// Transforms a 3D vector. - mul-vec3: func(self: dmat3, rhs: dvec3) -> dvec3; - /// Returns `true` if, and only if, all elements are finite. - /// If any element is either `NaN`, positive or negative infinity, this will return `false`. - is-finite: func(self: dmat3) -> bool; - mul: func(p0: dmat3, p1: dvec3) -> dvec3; - sub: func(p0: dmat3, p1: dmat3) -> dmat3; - /// Creates a 3D rotation matrix from `angle` (in radians) around the y axis. - from-rotation-y: func(angle: f64) -> dmat3; - /// Subtracts two 3x3 matrices. - sub-mat3: func(self: dmat3, rhs: dmat3) -> dmat3; -} - -/// Methods for DMat4 -interface dmat4 { - use types.{reflect-reference}; - - /// Creates a left-handed perspective projection matrix with `[0,1]` depth range. - /// # Panics - /// Will panic if `z_near` or `z_far` are less than or equal to zero when `glam_assert` is - /// enabled. - frustum-lh: func(left: f64, right: f64, bottom: f64, top: f64, z-near: f64, z-far: f64) -> dmat4; - /// Subtracts two 4x4 matrices. - sub-mat4: func(self: dmat4, rhs: dmat4) -> dmat4; - /// Returns the transpose of `self`. - transpose: func(self: dmat4) -> dmat4; - mul: func(self: dmat4, rhs: daffine3) -> dmat4; - neg: func(self: dmat4) -> dmat4; - /// Creates a right-handed perspective projection matrix with `[0,1]` depth range. - /// Useful to map the standard right-handed coordinate system into what WebGPU/Metal/Direct3D expect. - /// # Panics - /// Will panic if `z_near` or `z_far` are less than or equal to zero when `glam_assert` is - /// enabled. - perspective-rh: func(fov-y-radians: f64, aspect-ratio: f64, z-near: f64, z-far: f64) -> dmat4; - /// Transforms a 4D vector. - mul-vec4: func(self: dmat4, rhs: dvec4) -> dvec4; - /// Returns the determinant of `self`. - determinant: func(self: dmat4) -> f64; - /// Returns `true` if, and only if, all elements are finite. - /// If any element is either `NaN`, positive or negative infinity, this will return `false`. - is-finite: func(self: dmat4) -> bool; - mul: func(p0: dmat4, p1: dmat4) -> dmat4; - mul: func(p0: dmat4, p1: dvec4) -> dvec4; - /// Returns the matrix row for the given `index`. - /// # Panics - /// Panics if `index` is greater than 3. - row: func(self: dmat4, index: u64) -> dvec4; - /// Transforms the give 3D vector as a direction. - /// This is the equivalent of multiplying the 3D vector as a 4D vector where `w` is - /// `0.0`. - /// This method assumes that `self` contains a valid affine transform. - /// # Panics - /// Will panic if the 3rd row of `self` is not `(0, 0, 0, 1)` when `glam_assert` is enabled. - transform-vector3: func(self: dmat4, rhs: dvec3) -> dvec3; - /// Creates a right-handed perspective projection matrix with [-1,1] depth range. - /// This is the same as the OpenGL `glFrustum` function. - /// See - frustum-rh-gl: func(left: f64, right: f64, bottom: f64, top: f64, z-near: f64, z-far: f64) -> dmat4; - /// Creates a left-handed perspective projection matrix with `[0,1]` depth range. - /// Useful to map the standard left-handed coordinate system into what WebGPU/Metal/Direct3D expect. - /// # Panics - /// Will panic if `z_near` or `z_far` are less than or equal to zero when `glam_assert` is - /// enabled. - perspective-lh: func(fov-y-radians: f64, aspect-ratio: f64, z-near: f64, z-far: f64) -> dmat4; - /// Creates a `[f64; 16]` array storing data in column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array: func(self: dmat4) -> list; - /// Creates a left-handed view matrix using a camera position, a facing direction and an up - /// direction - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - /// # Panics - /// Will panic if `dir` or `up` are not normalized when `glam_assert` is enabled. - look-to-lh: func(eye: dvec3, dir: dvec3, up: dvec3) -> dmat4; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: dmat4) -> bool; - /// Creates an affine transformation matrix from the given 3D `translation`. - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - /// # Panics - /// Will panic if `rotation` is not normalized when `glam_assert` is enabled. - from-rotation-translation: func(rotation: dquat, translation: dvec3) -> dmat4; - /// Creates an affine transformation matrix containing a 3D rotation around the z axis of - /// `angle` (in radians). - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - from-rotation-z: func(angle: f64) -> dmat4; - /// Returns true if the absolute difference of all elements between `self` and `rhs` - /// is less than or equal to `max_abs_diff`. - /// This can be used to compare if two matrices contain similar elements. It works best - /// when comparing with a known value. The `max_abs_diff` that should be used used - /// depends on the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: dmat4, rhs: dmat4, max-abs-diff: f64) -> bool; - eq: func(self: dmat4, rhs: dmat4) -> bool; - /// Creates a affine transformation matrix containing a rotation from the given euler - /// rotation sequence and angles (in radians). - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - from-euler: func(order: euler-rot, a: f64, b: f64, c: f64) -> dmat4; - /// Creates a 4x4 matrix with its diagonal set to `diagonal` and all other entries set to 0. - from-diagonal: func(diagonal: dvec4) -> dmat4; - /// Creates an affine transformation matrix containing a 3D rotation around the y axis of - /// `angle` (in radians). - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - from-rotation-y: func(angle: f64) -> dmat4; - /// Creates a right-handed perspective projection matrix with `[0,1]` depth range. - /// # Panics - /// Will panic if `z_near` or `z_far` are less than or equal to zero when `glam_assert` is - /// enabled. - frustum-rh: func(left: f64, right: f64, bottom: f64, top: f64, z-near: f64, z-far: f64) -> dmat4; - /// Creates a right-handed view matrix using a camera position, a focal point, and an up - /// direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-rh: func(eye: dvec3, center: dvec3, up: dvec3) -> dmat4; - sub: func(self: dmat4, rhs: dmat4) -> dmat4; - /// Divides a 4x4 matrix by a scalar. - div-scalar: func(self: dmat4, rhs: f64) -> dmat4; - /// Creates a `[[f64; 4]; 4]` 4D array storing data in column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array-2d: func(self: dmat4) -> list>; - /// Creates an infinite reverse left-handed perspective projection matrix with `[0,1]` depth range. - /// Similar to `perspective_infinite_lh`, but maps `Z = z_near` to a depth of `1` and `Z = infinity` to a depth of `0`. - /// # Panics - /// Will panic if `z_near` is less than or equal to zero when `glam_assert` is enabled. - perspective-infinite-reverse-lh: func(fov-y-radians: f64, aspect-ratio: f64, z-near: f64) -> dmat4; - div: func(self: dmat4, rhs: f64) -> dmat4; - mul: func(p0: dmat4, p1: daffine3) -> dmat4; - /// Creates a left-handed view matrix using a camera position, a focal points and an up - /// direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-lh: func(eye: dvec3, center: dvec3, up: dvec3) -> dmat4; - as-mat4: func(self: dmat4) -> mat4; - clone: func(self: dmat4) -> dmat4; - /// Creates an affine transformation matrix from the given 3D `scale`, `rotation` and - /// `translation`. - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - /// # Panics - /// Will panic if `rotation` is not normalized when `glam_assert` is enabled. - from-scale-rotation-translation: func(scale: dvec3, rotation: dquat, translation: dvec3) -> dmat4; - /// Creates an affine transformation matrics from a 3x3 matrix (expressing scale, shear and - /// rotation) and a translation vector. - /// Equivalent to `DMat4::from_translation(translation) * DMat4::from_mat3(mat3)` - from-mat3-translation: func(mat3: dmat3, translation: dvec3) -> dmat4; - mul: func(p0: dmat4, p1: dmat4) -> dmat4; - /// Creates an affine transformation matrix containing a 3D rotation around the x axis of - /// `angle` (in radians). - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - from-rotation-x: func(angle: f64) -> dmat4; - /// Creates a right-handed perspective projection matrix with `[-1,1]` depth range. - /// Useful to map the standard right-handed coordinate system into what OpenGL expects. - /// This is the same as the OpenGL `gluPerspective` function. - /// See - perspective-rh-gl: func(fov-y-radians: f64, aspect-ratio: f64, z-near: f64, z-far: f64) -> dmat4; - /// Creates an affine transformation matrix containing a 3D rotation around a normalized - /// rotation `axis` of `angle` (in radians). - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - /// # Panics - /// Will panic if `axis` is not normalized when `glam_assert` is enabled. - from-axis-angle: func(axis: dvec3, angle: f64) -> dmat4; - /// Extract Euler angles with the given Euler rotation order. - /// Note if the upper 3x3 matrix contain scales, shears, or other non-rotation transformations - /// then the resulting Euler angles will be ill-defined. - /// # Panics - /// Will panic if any column of the upper 3x3 rotation matrix is not normalized when - /// `glam_assert` is enabled. - to-euler: func(self: dmat4, order: euler-rot) -> tuple; - /// Transforms the given 3D vector as a point. - /// This is the equivalent of multiplying the 3D vector as a 4D vector where `w` is - /// `1.0`. - /// This method assumes that `self` contains a valid affine transform. It does not perform - /// a perspective divide, if `self` contains a perspective transform, or if you are unsure, - /// the [`Self::project_point3()`] method should be used instead. - /// # Panics - /// Will panic if the 3rd row of `self` is not `(0, 0, 0, 1)` when `glam_assert` is enabled. - transform-point3: func(self: dmat4, rhs: dvec3) -> dvec3; - /// Takes the absolute value of each element in `self` - abs: func(self: dmat4) -> dmat4; - /// Returns the matrix column for the given `index`. - /// # Panics - /// Panics if `index` is greater than 3. - col: func(self: dmat4, index: u64) -> dvec4; - /// Creates an affine transformation matrix from the given `rotation` quaternion. - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - /// # Panics - /// Will panic if `rotation` is not normalized when `glam_assert` is enabled. - from-quat: func(rotation: dquat) -> dmat4; - /// Creates a right-handed view matrix using a camera position, a facing direction, and an up - /// direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - /// # Panics - /// Will panic if `dir` or `up` are not normalized when `glam_assert` is enabled. - look-to-rh: func(eye: dvec3, dir: dvec3, up: dvec3) -> dmat4; - /// Returns the inverse of `self`. - /// If the matrix is not invertible the returned matrix will be invalid. - /// # Panics - /// Will panic if the determinant of `self` is zero when `glam_assert` is enabled. - inverse: func(self: dmat4) -> dmat4; - /// Creates an infinite left-handed perspective projection matrix with `[0,1]` depth range. - /// Like `perspective_lh`, but with an infinite value for `z_far`. - /// The result is that points near `z_near` are mapped to depth `0`, and as they move towards infinity the depth approaches `1`. - /// # Panics - /// Will panic if `z_near` or `z_far` are less than or equal to zero when `glam_assert` is - /// enabled. - perspective-infinite-lh: func(fov-y-radians: f64, aspect-ratio: f64, z-near: f64) -> dmat4; - /// Adds two 4x4 matrices. - add-mat4: func(self: dmat4, rhs: dmat4) -> dmat4; - mul: func(p0: dmat4, p1: dvec4) -> dvec4; - /// Multiplies a 4x4 matrix by a scalar. - mul-scalar: func(self: dmat4, rhs: f64) -> dmat4; - /// Creates an affine transformation matrix from the given 3D `translation`. - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - from-translation: func(translation: dvec3) -> dmat4; - /// Creates a left-handed orthographic projection matrix with `[0,1]` depth range. - /// Useful to map a left-handed coordinate system to the normalized device coordinates that WebGPU/Direct3D/Metal expect. - orthographic-lh: func(left: f64, right: f64, bottom: f64, top: f64, near: f64, far: f64) -> dmat4; - add: func(p0: dmat4, p1: dmat4) -> dmat4; - /// Creates an infinite reverse right-handed perspective projection matrix with `[0,1]` depth range. - /// Similar to `perspective_infinite_rh`, but maps `Z = z_near` to a depth of `1` and `Z = infinity` to a depth of `0`. - /// # Panics - /// Will panic if `z_near` is less than or equal to zero when `glam_assert` is enabled. - perspective-infinite-reverse-rh: func(fov-y-radians: f64, aspect-ratio: f64, z-near: f64) -> dmat4; - /// Creates an affine transformation matrix containing the given 3D non-uniform `scale`. - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - /// # Panics - /// Will panic if all elements of `scale` are zero when `glam_assert` is enabled. - from-scale: func(scale: dvec3) -> dmat4; - /// Creates a right-handed orthographic projection matrix with `[0,1]` depth range. - /// Useful to map a right-handed coordinate system to the normalized device coordinates that WebGPU/Direct3D/Metal expect. - orthographic-rh: func(left: f64, right: f64, bottom: f64, top: f64, near: f64, far: f64) -> dmat4; - /// Creates a right-handed orthographic projection matrix with `[-1,1]` depth - /// range. This is the same as the OpenGL `glOrtho` function in OpenGL. - /// See - /// - /// Useful to map a right-handed coordinate system to the normalized device coordinates that OpenGL expects. - orthographic-rh-gl: func(left: f64, right: f64, bottom: f64, top: f64, near: f64, far: f64) -> dmat4; - sub: func(p0: dmat4, p1: dmat4) -> dmat4; - /// Creates a 4x4 matrix from four column vectors. - from-cols: func(x-axis: dvec4, y-axis: dvec4, z-axis: dvec4, w-axis: dvec4) -> dmat4; - mul: func(p0: dmat4, p1: f64) -> dmat4; - /// Multiplies two 4x4 matrices. - mul-mat4: func(self: dmat4, rhs: dmat4) -> dmat4; - /// Transforms the given 3D vector as a point, applying perspective correction. - /// This is the equivalent of multiplying the 3D vector as a 4D vector where `w` is `1.0`. - /// The perspective divide is performed meaning the resulting 3D vector is divided by `w`. - /// This method assumes that `self` contains a projective transform. - project-point3: func(self: dmat4, rhs: dvec3) -> dvec3; - add: func(self: dmat4, rhs: dmat4) -> dmat4; - /// Creates an infinite right-handed perspective projection matrix with `[0,1]` depth range. - /// Like `perspective_rh`, but with an infinite value for `z_far`. - /// The result is that points near `z_near` are mapped to depth `0`, and as they move towards infinity the depth approaches `1`. - /// # Panics - /// Will panic if `z_near` or `z_far` are less than or equal to zero when `glam_assert` is - /// enabled. - perspective-infinite-rh: func(fov-y-radians: f64, aspect-ratio: f64, z-near: f64) -> dmat4; - /// Creates an affine transformation matrix from the given 3x3 linear transformation - /// matrix. - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - from-mat3: func(m: dmat3) -> dmat4; -} - -/// Methods for DQuat -interface dquat { - use types.{reflect-reference}; - - /// Gets the minimal rotation for transforming `from` to either `to` or `-to`. This means - /// that the resulting quaternion will rotate `from` so that it is colinear with `to`. - /// The rotation is in the plane spanned by the two vectors. Will rotate at most 90 - /// degrees. - /// The inputs must be unit vectors. - /// `to.dot(from_rotation_arc_colinear(from, to) * from).abs() ≈ 1`. - /// # Panics - /// Will panic if `from` or `to` are not normalized when `glam_assert` is enabled. - from-rotation-arc-colinear: func(froma: dvec3, toa: dvec3) -> dquat; - /// Divides a quaternion by a scalar value. - /// The quotient is not guaranteed to be normalized. - div: func(self: dquat, rhs: f64) -> dquat; - add: func(self: dquat, rhs: dquat) -> dquat; - /// Creates a rotation quaternion from an array. - /// # Preconditions - /// This function does not check if the input is normalized, it is up to the user to - /// provide normalized input or to normalized the resulting quaternion. - from-array: func(a: list) -> dquat; - mul: func(self: dquat, rhs: dquat) -> dquat; - /// Multiplies two quaternions. If they each represent a rotation, the result will - /// represent the combined rotation. - /// Note that due to floating point rounding the result may not be perfectly normalized. - /// # Panics - /// Will panic if `self` or `rhs` are not normalized when `glam_assert` is enabled. - mul-quat: func(self: dquat, rhs: dquat) -> dquat; - /// Creates a quaternion from a 3x3 rotation matrix. - /// Note if the input matrix contain scales, shears, or other non-rotation transformations then - /// the resulting quaternion will be ill-defined. - /// # Panics - /// Will panic if any input matrix column is not normalized when `glam_assert` is enabled. - from-mat3: func(mat: dmat3) -> dquat; - /// Creates a quaternion from the `angle` (in radians) around the z axis. - from-rotation-z: func(angle: f64) -> dquat; - /// Returns `self` normalized to length 1.0. - /// For valid results, `self` must _not_ be of length zero. - /// Panics - /// Will panic if `self` is zero length when `glam_assert` is enabled. - normalize: func(self: dquat) -> dquat; - neg: func(self: dquat) -> dquat; - /// Gets the minimal rotation for transforming `from` to `to`. The rotation is in the - /// plane spanned by the two vectors. Will rotate at most 180 degrees. - /// The inputs must be unit vectors. - /// `from_rotation_arc(from, to) * from ≈ to`. - /// For near-singular cases (from≈to and from≈-to) the current implementation - /// is only accurate to about 0.001 (for `f32`). - /// # Panics - /// Will panic if `from` or `to` are not normalized when `glam_assert` is enabled. - from-rotation-arc: func(froma: dvec3, toa: dvec3) -> dquat; - /// Creates a quaternion from the upper 3x3 rotation matrix inside a homogeneous 4x4 matrix. - /// Note if the upper 3x3 matrix contain scales, shears, or other non-rotation transformations - /// then the resulting quaternion will be ill-defined. - /// # Panics - /// Will panic if any column of the upper 3x3 rotation matrix is not normalized when - /// `glam_assert` is enabled. - from-mat4: func(mat: dmat4) -> dquat; - /// Computes the squared length of `self`. - /// This is generally faster than `length()` as it avoids a square - /// root operation. - length-squared: func(self: dquat) -> f64; - /// Returns the angle (in radians) for the minimal rotation - /// for transforming this quaternion into another. - /// Both quaternions must be normalized. - /// # Panics - /// Will panic if `self` or `rhs` are not normalized when `glam_assert` is enabled. - angle-between: func(self: dquat, rhs: dquat) -> f64; - /// Returns the vector part of the quaternion. - xyz: func(self: dquat) -> dvec3; - /// Returns true if the absolute difference of all elements between `self` and `rhs` - /// is less than or equal to `max_abs_diff`. - /// This can be used to compare if two quaternions contain similar elements. It works - /// best when comparing with a known value. The `max_abs_diff` that should be used used - /// depends on the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: dquat, rhs: dquat, max-abs-diff: f64) -> bool; - /// Creates a quaternion from the `angle` (in radians) around the x axis. - from-rotation-x: func(angle: f64) -> dquat; - /// Returns the quaternion conjugate of `self`. For a unit quaternion the - /// conjugate is also the inverse. - conjugate: func(self: dquat) -> dquat; - /// Create a quaternion that rotates `v.length()` radians around `v.normalize()`. - /// `from_scaled_axis(Vec3::ZERO)` results in the identity quaternion. - from-scaled-axis: func(v: dvec3) -> dquat; - /// Creates a quaternion from a 3x3 rotation matrix inside a 3D affine transform. - /// Note if the input affine matrix contain scales, shears, or other non-rotation - /// transformations then the resulting quaternion will be ill-defined. - /// # Panics - /// Will panic if any input affine matrix column is not normalized when `glam_assert` is - /// enabled. - from-affine3: func(a: daffine3) -> dquat; - is-near-identity: func(self: dquat) -> bool; - /// Returns whether `self` of length `1.0` or not. - /// Uses a precision threshold of `1e-6`. - is-normalized: func(self: dquat) -> bool; - mul: func(p0: dquat, p1: dvec3) -> dvec3; - /// Returns the rotation axis scaled by the rotation in radians. - to-scaled-axis: func(self: dquat) -> dvec3; - /// Returns the rotation angles for the given euler rotation sequence. - to-euler: func(self: dquat, order: euler-rot) -> tuple; - /// Computes the dot product of `self` and `rhs`. The dot product is - /// equal to the cosine of the angle between two quaternion rotations. - dot: func(self: dquat, rhs: dquat) -> f64; - mul: func(p0: dquat, p1: dquat) -> dquat; - /// Computes the length of `self`. - length: func(self: dquat) -> f64; - /// Rotates towards `rhs` up to `max_angle` (in radians). - /// When `max_angle` is `0.0`, the result will be equal to `self`. When `max_angle` is equal to - /// `self.angle_between(rhs)`, the result will be equal to `rhs`. If `max_angle` is negative, - /// rotates towards the exact opposite of `rhs`. Will not go past the target. - /// Both quaternions must be normalized. - /// # Panics - /// Will panic if `self` or `rhs` are not normalized when `glam_assert` is enabled. - rotate-towards: func(self: dquat, rhs: dquat, max-angle: f64) -> dquat; - sub: func(p0: dquat, p1: dquat) -> dquat; - /// Returns `true` if any elements are `NAN`. - is-nan: func(self: dquat) -> bool; - mul: func(p0: dquat, p1: dvec3) -> dvec3; - /// Returns `true` if, and only if, all elements are finite. - /// If any element is either `NaN`, positive or negative infinity, this will return `false`. - is-finite: func(self: dquat) -> bool; - /// Creates a new rotation quaternion from a 4D vector. - /// # Preconditions - /// This function does not check if the input is normalized, it is up to the user to - /// provide normalized input or to normalized the resulting quaternion. - from-vec4: func(v: dvec4) -> dquat; - /// Computes `1.0 / length()`. - /// For valid results, `self` must _not_ be of length zero. - length-recip: func(self: dquat) -> f64; - /// Create a quaternion for a normalized rotation `axis` and `angle` (in radians). - /// The axis must be a unit vector. - /// # Panics - /// Will panic if `axis` is not normalized when `glam_assert` is enabled. - from-axis-angle: func(axis: dvec3, angle: f64) -> dquat; - sub: func(self: dquat, rhs: dquat) -> dquat; - /// Returns the inverse of a normalized quaternion. - /// Typically quaternion inverse returns the conjugate of a normalized quaternion. - /// Because `self` is assumed to already be unit length this method *does not* normalize - /// before returning the conjugate. - /// # Panics - /// Will panic if `self` is not normalized when `glam_assert` is enabled. - inverse: func(self: dquat) -> dquat; - eq: func(self: dquat, rhs: dquat) -> bool; - /// Performs a linear interpolation between `self` and `rhs` based on - /// the value `s`. - /// When `s` is `0.0`, the result will be equal to `self`. When `s` - /// is `1.0`, the result will be equal to `rhs`. - /// # Panics - /// Will panic if `self` or `end` are not normalized when `glam_assert` is enabled. - lerp: func(self: dquat, end: dquat, s: f64) -> dquat; - /// Gets the minimal rotation for transforming `from` to `to`. The resulting rotation is - /// around the z axis. Will rotate at most 180 degrees. - /// The inputs must be unit vectors. - /// `from_rotation_arc_2d(from, to) * from ≈ to`. - /// For near-singular cases (from≈to and from≈-to) the current implementation - /// is only accurate to about 0.001 (for `f32`). - /// # Panics - /// Will panic if `from` or `to` are not normalized when `glam_assert` is enabled. - from-rotation-arc-2d: func(froma: dvec2, toa: dvec2) -> dquat; - clone: func(self: dquat) -> dquat; - mul: func(p0: dquat, p1: f64) -> dquat; - /// Multiplies a quaternion and a 3D vector, returning the rotated vector. - /// # Panics - /// Will panic if `self` is not normalized when `glam_assert` is enabled. - mul-vec3: func(self: dquat, rhs: dvec3) -> dvec3; - /// Creates a quaterion rotation from facing direction and an up direction. - /// For a right-handed view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - /// # Panics - /// Will panic if `dir` and `up` are not normalized when `glam_assert` is enabled. - look-to-rh: func(dir: dvec3, up: dvec3) -> dquat; - add: func(p0: dquat, p1: dquat) -> dquat; - /// Creates a quaternion from the `angle` (in radians) around the y axis. - from-rotation-y: func(angle: f64) -> dquat; - /// `[x, y, z, w]` - to-array: func(self: dquat) -> list; - /// Creates a new rotation quaternion. - /// This should generally not be called manually unless you know what you are doing. - /// Use one of the other constructors instead such as `identity` or `from_axis_angle`. - /// `from_xyzw` is mostly used by unit tests and `serde` deserialization. - /// # Preconditions - /// This function does not check if the input is normalized, it is up to the user to - /// provide normalized input or to normalized the resulting quaternion. - from-xyzw: func(x: f64, y: f64, z: f64, w: f64) -> dquat; - /// Creates a left-handed view matrix using a camera position, a focal point, and an up - /// direction. - /// For a left-handed view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-lh: func(eye: dvec3, center: dvec3, up: dvec3) -> dquat; - /// Performs a spherical linear interpolation between `self` and `end` - /// based on the value `s`. - /// When `s` is `0.0`, the result will be equal to `self`. When `s` - /// is `1.0`, the result will be equal to `end`. - /// # Panics - /// Will panic if `self` or `end` are not normalized when `glam_assert` is enabled. - slerp: func(self: dquat, end: dquat, s: f64) -> dquat; - /// Creates a quaterion rotation from a facing direction and an up direction. - /// For a left-handed view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-to-lh: func(dir: dvec3, up: dvec3) -> dquat; - /// Creates a right-handed view matrix using a camera position, an up direction, and a focal - /// point. - /// For a right-handed view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-rh: func(eye: dvec3, center: dvec3, up: dvec3) -> dquat; - as-quat: func(self: dquat) -> quat; - /// Creates a quaternion from the given Euler rotation sequence and the angles (in radians). - from-euler: func(euler: euler-rot, a: f64, b: f64, c: f64) -> dquat; -} - -/// Methods for DVec2 -interface dvec2 { - use types.{reflect-reference}; - - /// Returns a vector containing the fractional part of the vector as `self - self.floor()`. - /// Note that this differs from the Rust implementation of `fract` which returns - /// `self - self.trunc()`. - /// Note that this is fast but not precise for large numbers. - fract-gl: func(self: dvec2) -> dvec2; - /// Returns a bitmask with the lowest 2 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: dvec2) -> u32; - /// Returns a vector containing the fractional part of the vector as `self - self.trunc()`. - /// Note that this differs from the GLSL implementation of `fract` which returns - /// `self - self.floor()`. - /// Note that this is fast but not precise for large numbers. - fract: func(self: dvec2) -> dvec2; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - min-element: func(self: dvec2) -> f64; - /// Returns true if the absolute difference of all elements between `self` and `rhs` is - /// less than or equal to `max_abs_diff`. - /// This can be used to compare if two vectors contain similar elements. It works best when - /// comparing with a known value. The `max_abs_diff` that should be used used depends on - /// the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: dvec2, rhs: dvec2, max-abs-diff: f64) -> bool; - /// Computes the squared length of `self`. - /// This is faster than `length()` as it avoids a square root operation. - length-squared: func(self: dvec2) -> f64; - div: func(p0: dvec2, p1: dvec2) -> dvec2; - sub: func(self: dvec2, rhs: dvec2) -> dvec2; - /// Returns a vector containing the nearest integer to a number for each element of `self`. - /// Round half-way cases away from 0.0. - round: func(self: dvec2) -> dvec2; - add: func(p0: dvec2, p1: dvec2) -> dvec2; - /// Casts all elements of `self` to `f32`. - as-vec2: func(self: dvec2) -> vec2; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: dvec2, rhs: dvec2) -> bvec2; - /// Casts all elements of `self` to `i8`. - as-i8vec2: func(self: dvec2) -> i8-vec2; - sub: func(p0: dvec2, p1: f64) -> dvec2; - /// Performs a linear interpolation between `self` and `rhs` based on the value `s`. - /// When `s` is `0.0`, the result will be equal to `self`. When `s` is `1.0`, the result - /// will be equal to `rhs`. When `s` is outside of range `[0, 1]`, the result is linearly - /// extrapolated. - lerp: func(self: dvec2, rhs: dvec2, s: f64) -> dvec2; - /// Returns `self` normalized to length 1.0 if possible, else returns a - /// fallback value. - /// In particular, if the input is zero (or very close to zero), or non-finite, - /// the result of this operation will be the fallback value. - /// See also [`Self::try_normalize()`]. - normalize-or: func(self: dvec2, fallback: dvec2) -> dvec2; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: dvec2) -> f64; - /// Computes the Euclidean distance between two points in space. - distance: func(self: dvec2, rhs: dvec2) -> f64; - div: func(self: dvec2, rhs: dvec2) -> dvec2; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: dvec2) -> u64; - /// Creates a 3D vector from `self` and the given `z` value. - extend: func(self: dvec2, z: f64) -> dvec3; - /// Returns the vector rejection of `self` from `rhs`. - /// The vector rejection is the vector perpendicular to the projection of `self` onto - /// `rhs`, in rhs words the result of `self - self.project_onto(rhs)`. - /// `rhs` must be normalized. - /// # Panics - /// Will panic if `rhs` is not normalized when `glam_assert` is enabled. - reject-from-normalized: func(self: dvec2, rhs: dvec2) -> dvec2; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// [Euclidean division]: f64::rem_euclid - rem-euclid: func(self: dvec2, rhs: dvec2) -> dvec2; - /// Casts all elements of `self` to `i16`. - as-i16vec2: func(self: dvec2) -> i16-vec2; - /// Fused multiply-add. Computes `(self * a) + b` element-wise with only one rounding - /// error, yielding a more accurate result than an unfused multiply-add. - /// Using `mul_add` *may* be more performant than an unfused multiply-add if the target - /// architecture has a dedicated fma CPU instruction. However, this is not always true, - /// and will be heavily dependant on designing algorithms with specific target hardware in - /// mind. - mul-add: func(self: dvec2, a: dvec2, b: dvec2) -> dvec2; - neg: func(self: dvec2) -> dvec2; - /// Moves towards `rhs` based on the value `d`. - /// When `d` is `0.0`, the result will be equal to `self`. When `d` is equal to - /// `self.distance(rhs)`, the result will be equal to `rhs`. Will not go past `rhs`. - move-towards: func(self: dvec2, rhs: dvec2, d: f64) -> dvec2; - sub: func(p0: dvec2, p1: dvec2) -> dvec2; - /// Performs `is_finite` on each element of self, returning a vector mask of the results. - /// In other words, this computes `[x.is_finite(), y.is_finite(), ...]`. - is-finite-mask: func(self: dvec2) -> bvec2; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: dvec2, rhs: dvec2) -> f64; - /// Returns a vector containing each element of `self` raised to the power of `n`. - powf: func(self: dvec2, n: f64) -> dvec2; - /// Returns a vector containing the reciprocal `1.0/n` of each element of `self`. - recip: func(self: dvec2) -> dvec2; - /// Returns the angle of rotation (in radians) from `self` to `rhs` in the range `[-π, +π]`. - /// The inputs do not need to be unit vectors however they must be non-zero. - angle-to: func(self: dvec2, rhs: dvec2) -> f64; - /// Returns the vector projection of `self` onto `rhs`. - /// `rhs` must be of non-zero length. - /// # Panics - /// Will panic if `rhs` is zero length when `glam_assert` is enabled. - project-onto: func(self: dvec2, rhs: dvec2) -> dvec2; - /// Component-wise clamping of values, similar to [`f64::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: dvec2, min: dvec2, max: dvec2) -> dvec2; - /// Returns a vector containing the base 2 logarithm for each element of `self`. - /// This returns NaN when the element is negative and negative infinity when the element is zero. - log2: func(self: dvec2) -> dvec2; - add: func(p0: dvec2, p1: f64) -> dvec2; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - max-element: func(self: dvec2) -> f64; - rem: func(p0: dvec2, p1: f64) -> dvec2; - /// Casts all elements of `self` to `u16`. - as-u16vec2: func(self: dvec2) -> u16-vec2; - /// Returns the refraction direction for a given incident vector `self`, surface normal - /// `normal` and ratio of indices of refraction, `eta`. When total internal reflection occurs, - /// a zero vector will be returned. - /// `self` and `normal` must be normalized. - /// # Panics - /// Will panic if `self` or `normal` is not normalized when `glam_assert` is enabled. - refract: func(self: dvec2, normal: dvec2, eta: f64) -> dvec2; - /// Returns a vector with elements representing the sign of `self`. - /// - `1.0` if the number is positive, `+0.0` or `INFINITY` - /// - `-1.0` if the number is negative, `-0.0` or `NEG_INFINITY` - /// - `NAN` if the number is `NAN` - signum: func(self: dvec2) -> dvec2; - /// Returns a vector with a length no less than `min`. - /// # Panics - /// Will panic if `min` is negative when `glam_assert` is enabled. - clamp-length-min: func(self: dvec2, min: f64) -> dvec2; - /// Casts all elements of `self` to `u32`. - as-uvec2: func(self: dvec2) -> uvec2; - /// Creates a new vector. - new: func(x: f64, y: f64) -> dvec2; - /// Calculates the midpoint between `self` and `rhs`. - /// The midpoint is the average of, or halfway point between, two vectors. - /// `a.midpoint(b)` should yield the same result as `a.lerp(b, 0.5)` - /// while being slightly cheaper to compute. - midpoint: func(self: dvec2, rhs: dvec2) -> dvec2; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: dvec2, rhs: dvec2) -> bvec2; - /// Returns `true` if, and only if, all elements are finite. If any element is either - /// `NaN`, positive or negative infinity, this will return `false`. - is-finite: func(self: dvec2) -> bool; - mul: func(p0: dvec2, p1: dvec2) -> dvec2; - /// Returns the reflection vector for a given incident vector `self` and surface normal - /// `normal`. - /// `normal` must be normalized. - /// # Panics - /// Will panic if `normal` is not normalized when `glam_assert` is enabled. - reflect: func(self: dvec2, normal: dvec2) -> dvec2; - /// Computes `1.0 / length()`. - /// For valid results, `self` must _not_ be of length zero. - length-recip: func(self: dvec2) -> f64; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - /// NaN propogation does not follow IEEE 754-2008 semantics for maxNum and may differ on - /// different SIMD architectures. - max: func(self: dvec2, rhs: dvec2) -> dvec2; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - /// NaN propogation does not follow IEEE 754-2008 semantics for minNum and may differ on - /// different SIMD architectures. - min: func(self: dvec2, rhs: dvec2) -> dvec2; - /// Returns a vector with a length no less than `min` and no more than `max`. - /// # Panics - /// Will panic if `min` is greater than `max`, or if either `min` or `max` is negative, when `glam_assert` is enabled. - clamp-length: func(self: dvec2, min: f64, max: f64) -> dvec2; - /// Casts all elements of `self` to `u64`. - as-u64vec2: func(self: dvec2) -> u64-vec2; - /// The perpendicular dot product of `self` and `rhs`. - /// Also known as the wedge product, 2D cross product, and determinant. - perp-dot: func(self: dvec2, rhs: dvec2) -> f64; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: dvec2) -> u64; - /// Returns a vector containing the smallest integer greater than or equal to a number for - /// each element of `self`. - ceil: func(self: dvec2) -> dvec2; - /// Casts all elements of `self` to `i32`. - as-ivec2: func(self: dvec2) -> ivec2; - eq: func(self: dvec2, other: dvec2) -> bool; - add: func(self: dvec2, rhs: dvec2) -> dvec2; - /// Returns a vector with a length no more than `max`. - /// # Panics - /// Will panic if `max` is negative when `glam_assert` is enabled. - clamp-length-max: func(self: dvec2, max: f64) -> dvec2; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: dvec2, rhs: dvec2) -> bvec2; - /// Rotates towards `rhs` up to `max_angle` (in radians). - /// When `max_angle` is `0.0`, the result will be equal to `self`. When `max_angle` is equal to - /// `self.angle_between(rhs)`, the result will be parallel to `rhs`. If `max_angle` is negative, - /// rotates towards the exact opposite of `rhs`. Will not go past the target. - rotate-towards: func(self: dvec2, rhs: dvec2, max-angle: f64) -> dvec2; - /// Creates a vector with all elements set to `v`. - splat: func(v: f64) -> dvec2; - mul: func(self: dvec2, rhs: dvec2) -> dvec2; - rem: func(p0: dvec2, p1: dvec2) -> dvec2; - /// Returns a vector containing the largest integer less than or equal to a number for each - /// element of `self`. - floor: func(self: dvec2) -> dvec2; - /// Returns the vector rejection of `self` from `rhs`. - /// The vector rejection is the vector perpendicular to the projection of `self` onto - /// `rhs`, in rhs words the result of `self - self.project_onto(rhs)`. - /// `rhs` must be of non-zero length. - /// # Panics - /// Will panic if `rhs` has a length of zero when `glam_assert` is enabled. - reject-from: func(self: dvec2, rhs: dvec2) -> dvec2; - /// Returns `rhs` rotated by the angle of `self`. If `self` is normalized, - /// then this just rotation. This is what you usually want. Otherwise, - /// it will be like a rotation with a multiplication by `self`'s length. - /// This can be used in conjunction with the [`from_angle()`][Self::from_angle()] method, e.g. - /// `DVec2::from_angle(PI).rotate(DVec2::Y)` will create the vector `[-1, 0]` - /// and rotate [`DVec2::Y`] around it returning `-DVec2::Y`. - rotate: func(self: dvec2, rhs: dvec2) -> dvec2; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: dvec2, rhs: dvec2) -> f64; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: dvec2, rhs: dvec2) -> bvec2; - /// Returns a vector that is equal to `self` rotated by 90 degrees. - perp: func(self: dvec2) -> dvec2; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: dvec2, rhs: dvec2) -> bvec2; - /// Casts all elements of `self` to `i64`. - as-i64vec2: func(self: dvec2) -> i64-vec2; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: dvec2, rhs: dvec2) -> dvec2; - /// Creates a new vector from an array. - from-array: func(a: list) -> dvec2; - /// Returns a vector containing the integer part each element of `self`. This means numbers are - /// always truncated towards zero. - trunc: func(self: dvec2) -> dvec2; - /// Creates a 2D vector from `self` with the given value of `y`. - with-y: func(self: dvec2, y: f64) -> dvec2; - /// Creates a 2D vector from `self` with the given value of `x`. - with-x: func(self: dvec2, x: f64) -> dvec2; - /// Returns the angle (in radians) of this vector in the range `[-π, +π]`. - /// The input does not need to be a unit vector however it must be non-zero. - to-angle: func(self: dvec2) -> f64; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: dvec2, rhs: dvec2) -> bvec2; - angle-between: func(self: dvec2, rhs: dvec2) -> f64; - clone: func(self: dvec2) -> dvec2; - mul: func(p0: dvec2, p1: f64) -> dvec2; - /// Returns whether `self` is length `1.0` or not. - /// Uses a precision threshold of approximately `1e-4`. - is-normalized: func(self: dvec2) -> bool; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: dvec2) -> dvec2; - /// Creates a 2D vector containing `[angle.cos(), angle.sin()]`. This can be used in - /// conjunction with the [`rotate()`][Self::rotate()] method, e.g. - /// `DVec2::from_angle(PI).rotate(DVec2::Y)` will create the vector `[-1, 0]` - /// and rotate [`DVec2::Y`] around it returning `-DVec2::Y`. - from-angle: func(angle: f64) -> dvec2; - /// Returns a vector containing `2^self` for each element of `self`. - exp2: func(self: dvec2) -> dvec2; - /// Converts `self` to `[x, y]` - to-array: func(self: dvec2) -> list; - /// Casts all elements of `self` to `u8`. - as-u8vec2: func(self: dvec2) -> u8-vec2; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec2, if-true: dvec2, if-false: dvec2) -> dvec2; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - div-euclid: func(self: dvec2, rhs: dvec2) -> dvec2; - /// Returns `self` normalized to length 1.0 if possible, else returns zero. - /// In particular, if the input is zero (or very close to zero), or non-finite, - /// the result of this operation will be zero. - /// See also [`Self::try_normalize()`]. - normalize-or-zero: func(self: dvec2) -> dvec2; - /// Returns `self` normalized to length 1.0. - /// For valid results, `self` must be finite and _not_ of length zero, nor very close to zero. - /// See also [`Self::try_normalize()`] and [`Self::normalize_or_zero()`]. - /// # Panics - /// Will panic if the resulting normalized vector is not finite when `glam_assert` is enabled. - normalize: func(self: dvec2) -> dvec2; - div: func(p0: dvec2, p1: f64) -> dvec2; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: dvec2) -> bool; - /// Performs `is_nan` on each element of self, returning a vector mask of the results. - /// In other words, this computes `[x.is_nan(), y.is_nan(), ...]`. - is-nan-mask: func(self: dvec2) -> bvec2; - rem: func(self: dvec2, rhs: dvec2) -> dvec2; - /// Returns a vector with signs of `rhs` and the magnitudes of `self`. - copysign: func(self: dvec2, rhs: dvec2) -> dvec2; - /// Returns the vector projection of `self` onto `rhs`. - /// `rhs` must be normalized. - /// # Panics - /// Will panic if `rhs` is not normalized when `glam_assert` is enabled. - project-onto-normalized: func(self: dvec2, rhs: dvec2) -> dvec2; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: dvec2) -> f64; - /// Returns a vector containing `e^self` (the exponential function) for each element of - /// `self`. - exp: func(self: dvec2) -> dvec2; - /// Returns a vector containing the natural logarithm for each element of `self`. - /// This returns NaN when the element is negative and negative infinity when the element is zero. - ln: func(self: dvec2) -> dvec2; - /// Computes the length of `self`. - length: func(self: dvec2) -> f64; -} - -/// Methods for DVec3 -interface dvec3 { - use types.{reflect-reference}; - - /// Returns a vector with elements representing the sign of `self`. - /// - `1.0` if the number is positive, `+0.0` or `INFINITY` - /// - `-1.0` if the number is negative, `-0.0` or `NEG_INFINITY` - /// - `NAN` if the number is `NAN` - signum: func(self: dvec3) -> dvec3; - /// Computes the Euclidean distance between two points in space. - distance: func(self: dvec3, rhs: dvec3) -> f64; - /// Casts all elements of `self` to `i64`. - as-i64vec3: func(self: dvec3) -> i64-vec3; - /// Component-wise clamping of values, similar to [`f64::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: dvec3, min: dvec3, max: dvec3) -> dvec3; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - div-euclid: func(self: dvec3, rhs: dvec3) -> dvec3; - /// Returns `true` if, and only if, all elements are finite. If any element is either - /// `NaN`, positive or negative infinity, this will return `false`. - is-finite: func(self: dvec3) -> bool; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: dvec3) -> u64; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: dvec3) -> f64; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: dvec3, rhs: dvec3) -> bvec3; - eq: func(self: dvec3, other: dvec3) -> bool; - /// Returns a vector containing the reciprocal `1.0/n` of each element of `self`. - recip: func(self: dvec3) -> dvec3; - div: func(p0: dvec3, p1: f64) -> dvec3; - /// Returns a vector containing the fractional part of the vector as `self - self.floor()`. - /// Note that this differs from the Rust implementation of `fract` which returns - /// `self - self.trunc()`. - /// Note that this is fast but not precise for large numbers. - fract-gl: func(self: dvec3) -> dvec3; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: dvec3, rhs: dvec3) -> bvec3; - /// Casts all elements of `self` to `u32`. - as-uvec3: func(self: dvec3) -> uvec3; - sub: func(p0: dvec3, p1: f64) -> dvec3; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: dvec3, rhs: dvec3) -> bvec3; - /// Returns the refraction direction for a given incident vector `self`, surface normal - /// `normal` and ratio of indices of refraction, `eta`. When total internal reflection occurs, - /// a zero vector will be returned. - /// `self` and `normal` must be normalized. - /// # Panics - /// Will panic if `self` or `normal` is not normalized when `glam_assert` is enabled. - refract: func(self: dvec3, normal: dvec3, eta: f64) -> dvec3; - /// Casts all elements of `self` to `u64`. - as-u64vec3: func(self: dvec3) -> u64-vec3; - /// Rotates around the x axis by `angle` (in radians). - rotate-x: func(self: dvec3, angle: f64) -> dvec3; - /// Returns true if the absolute difference of all elements between `self` and `rhs` is - /// less than or equal to `max_abs_diff`. - /// This can be used to compare if two vectors contain similar elements. It works best when - /// comparing with a known value. The `max_abs_diff` that should be used used depends on - /// the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: dvec3, rhs: dvec3, max-abs-diff: f64) -> bool; - /// Returns a vector with a length no less than `min` and no more than `max`. - /// # Panics - /// Will panic if `min` is greater than `max`, or if either `min` or `max` is negative, when `glam_assert` is enabled. - clamp-length: func(self: dvec3, min: f64, max: f64) -> dvec3; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: dvec3, rhs: dvec3) -> dvec3; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - /// NaN propogation does not follow IEEE 754-2008 semantics for maxNum and may differ on - /// different SIMD architectures. - max: func(self: dvec3, rhs: dvec3) -> dvec3; - /// Rotates around the z axis by `angle` (in radians). - rotate-z: func(self: dvec3, angle: f64) -> dvec3; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - /// NaN propogation does not follow IEEE 754-2008 semantics for minNum and may differ on - /// different SIMD architectures. - min: func(self: dvec3, rhs: dvec3) -> dvec3; - /// Returns the reflection vector for a given incident vector `self` and surface normal - /// `normal`. - /// `normal` must be normalized. - /// # Panics - /// Will panic if `normal` is not normalized when `glam_assert` is enabled. - reflect: func(self: dvec3, normal: dvec3) -> dvec3; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: dvec3, rhs: dvec3) -> f64; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec3, if-true: dvec3, if-false: dvec3) -> dvec3; - /// Projects a homogeneous coordinate to 3D space by performing perspective divide. - /// # Panics - /// Will panic if `v.w` is `0` when `glam_assert` is enabled. - from-homogeneous: func(v: dvec4) -> dvec3; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: dvec3) -> u64; - /// Returns a vector containing `2^self` for each element of `self`. - exp2: func(self: dvec3) -> dvec3; - /// Returns a vector containing the fractional part of the vector as `self - self.trunc()`. - /// Note that this differs from the GLSL implementation of `fract` which returns - /// `self - self.floor()`. - /// Note that this is fast but not precise for large numbers. - fract: func(self: dvec3) -> dvec3; - /// Returns the vector rejection of `self` from `rhs`. - /// The vector rejection is the vector perpendicular to the projection of `self` onto - /// `rhs`, in rhs words the result of `self - self.project_onto(rhs)`. - /// `rhs` must be normalized. - /// # Panics - /// Will panic if `rhs` is not normalized when `glam_assert` is enabled. - reject-from-normalized: func(self: dvec3, rhs: dvec3) -> dvec3; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: dvec3, rhs: dvec3) -> f64; - /// Returns the vector rejection of `self` from `rhs`. - /// The vector rejection is the vector perpendicular to the projection of `self` onto - /// `rhs`, in rhs words the result of `self - self.project_onto(rhs)`. - /// `rhs` must be of non-zero length. - /// # Panics - /// Will panic if `rhs` has a length of zero when `glam_assert` is enabled. - reject-from: func(self: dvec3, rhs: dvec3) -> dvec3; - rem: func(p0: dvec3, p1: f64) -> dvec3; - /// Returns the angle (in radians) between two vectors in the range `[0, +π]`. - /// The inputs do not need to be unit vectors however they must be non-zero. - angle-between: func(self: dvec3, rhs: dvec3) -> f64; - div: func(p0: dvec3, p1: dvec3) -> dvec3; - /// Creates a 2D vector from the `x` and `y` elements of `self`, discarding `z`. - /// Truncation may also be performed by using [`self.xy()`][crate::swizzles::Vec3Swizzles::xy()]. - truncate: func(self: dvec3) -> dvec2; - /// Fused multiply-add. Computes `(self * a) + b` element-wise with only one rounding - /// error, yielding a more accurate result than an unfused multiply-add. - /// Using `mul_add` *may* be more performant than an unfused multiply-add if the target - /// architecture has a dedicated fma CPU instruction. However, this is not always true, - /// and will be heavily dependant on designing algorithms with specific target hardware in - /// mind. - mul-add: func(self: dvec3, a: dvec3, b: dvec3) -> dvec3; - sub: func(p0: dvec3, p1: dvec3) -> dvec3; - /// Returns a vector containing the integer part each element of `self`. This means numbers are - /// always truncated towards zero. - trunc: func(self: dvec3) -> dvec3; - mul: func(self: dvec3, rhs: dvec3) -> dvec3; - /// Creates a 3D vector from `self` with the given value of `z`. - with-z: func(self: dvec3, z: f64) -> dvec3; - /// Rotates towards `rhs` up to `max_angle` (in radians). - /// When `max_angle` is `0.0`, the result will be equal to `self`. When `max_angle` is equal to - /// `self.angle_between(rhs)`, the result will be parallel to `rhs`. If `max_angle` is negative, - /// rotates towards the exact opposite of `rhs`. Will not go past the target. - rotate-towards: func(self: dvec3, rhs: dvec3, max-angle: f64) -> dvec3; - /// Creates a 3D vector from `self` with the given value of `x`. - with-x: func(self: dvec3, x: f64) -> dvec3; - mul: func(p0: dvec3, p1: f64) -> dvec3; - clone: func(self: dvec3) -> dvec3; - /// Casts all elements of `self` to `u8`. - as-u8vec3: func(self: dvec3) -> u8-vec3; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: dvec3) -> dvec3; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: dvec3) -> f64; - /// Casts all elements of `self` to `i8`. - as-i8vec3: func(self: dvec3) -> i8-vec3; - neg: func(self: dvec3) -> dvec3; - /// Creates a new vector from an array. - from-array: func(a: list) -> dvec3; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: dvec3, rhs: dvec3) -> bvec3; - /// Returns a bitmask with the lowest 3 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: dvec3) -> u32; - /// Returns some vector that is orthogonal to the given one. - /// The input vector must be finite and non-zero. - /// The output vector is not necessarily unit length. For that use - /// [`Self::any_orthonormal_vector()`] instead. - any-orthogonal-vector: func(self: dvec3) -> dvec3; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: dvec3, rhs: dvec3) -> bvec3; - /// Moves towards `rhs` based on the value `d`. - /// When `d` is `0.0`, the result will be equal to `self`. When `d` is equal to - /// `self.distance(rhs)`, the result will be equal to `rhs`. Will not go past `rhs`. - move-towards: func(self: dvec3, rhs: dvec3, d: f64) -> dvec3; - /// Returns `self` normalized to length 1.0. - /// For valid results, `self` must be finite and _not_ of length zero, nor very close to zero. - /// See also [`Self::try_normalize()`] and [`Self::normalize_or_zero()`]. - /// # Panics - /// Will panic if the resulting normalized vector is not finite when `glam_assert` is enabled. - normalize: func(self: dvec3) -> dvec3; - /// Returns a vector containing each element of `self` raised to the power of `n`. - powf: func(self: dvec3, n: f64) -> dvec3; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// [Euclidean division]: f64::rem_euclid - rem-euclid: func(self: dvec3, rhs: dvec3) -> dvec3; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - max-element: func(self: dvec3) -> f64; - /// Returns the vector projection of `self` onto `rhs`. - /// `rhs` must be normalized. - /// # Panics - /// Will panic if `rhs` is not normalized when `glam_assert` is enabled. - project-onto-normalized: func(self: dvec3, rhs: dvec3) -> dvec3; - /// Computes `1.0 / length()`. - /// For valid results, `self` must _not_ be of length zero. - length-recip: func(self: dvec3) -> f64; - /// Returns a vector containing the nearest integer to a number for each element of `self`. - /// Round half-way cases away from 0.0. - round: func(self: dvec3) -> dvec3; - /// Creates a new vector. - new: func(x: f64, y: f64, z: f64) -> dvec3; - /// Creates a 4D vector from `self` and the given `w` value. - extend: func(self: dvec3, w: f64) -> dvec4; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - min-element: func(self: dvec3) -> f64; - /// Returns a vector containing `e^self` (the exponential function) for each element of - /// `self`. - exp: func(self: dvec3) -> dvec3; - /// Creates a vector with all elements set to `v`. - splat: func(v: f64) -> dvec3; - /// Casts all elements of `self` to `f32`. - as-vec3a: func(self: dvec3) -> vec3-a; - /// Returns the vector projection of `self` onto `rhs`. - /// `rhs` must be of non-zero length. - /// # Panics - /// Will panic if `rhs` is zero length when `glam_assert` is enabled. - project-onto: func(self: dvec3, rhs: dvec3) -> dvec3; - /// Returns a vector with signs of `rhs` and the magnitudes of `self`. - copysign: func(self: dvec3, rhs: dvec3) -> dvec3; - /// Computes the cross product of `self` and `rhs`. - cross: func(self: dvec3, rhs: dvec3) -> dvec3; - sub: func(self: dvec3, rhs: dvec3) -> dvec3; - /// Computes the squared length of `self`. - /// This is faster than `length()` as it avoids a square root operation. - length-squared: func(self: dvec3) -> f64; - /// Returns a vector containing the smallest integer greater than or equal to a number for - /// each element of `self`. - ceil: func(self: dvec3) -> dvec3; - /// Returns a vector containing the base 2 logarithm for each element of `self`. - /// This returns NaN when the element is negative and negative infinity when the element is zero. - log2: func(self: dvec3) -> dvec3; - add: func(p0: dvec3, p1: f64) -> dvec3; - add: func(p0: dvec3, p1: dvec3) -> dvec3; - /// Casts all elements of `self` to `i32`. - as-ivec3: func(self: dvec3) -> ivec3; - /// Performs a spherical linear interpolation between `self` and `rhs` based on the value `s`. - /// When `s` is `0.0`, the result will be equal to `self`. When `s` is `1.0`, the result - /// will be equal to `rhs`. When `s` is outside of range `[0, 1]`, the result is linearly - /// extrapolated. - slerp: func(self: dvec3, rhs: dvec3, s: f64) -> dvec3; - /// Creates a homogeneous coordinate from `self`, equivalent to `self.extend(1.0)`. - to-homogeneous: func(self: dvec3) -> dvec4; - /// Rotates around the y axis by `angle` (in radians). - rotate-y: func(self: dvec3, angle: f64) -> dvec3; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: dvec3, rhs: dvec3) -> bvec3; - /// Casts all elements of `self` to `i16`. - as-i16vec3: func(self: dvec3) -> i16-vec3; - /// Converts `self` to `[x, y, z]` - to-array: func(self: dvec3) -> list; - /// Returns a vector containing the largest integer less than or equal to a number for each - /// element of `self`. - floor: func(self: dvec3) -> dvec3; - rem: func(self: dvec3, rhs: dvec3) -> dvec3; - add: func(self: dvec3, rhs: dvec3) -> dvec3; - /// Performs `is_finite` on each element of self, returning a vector mask of the results. - /// In other words, this computes `[x.is_finite(), y.is_finite(), ...]`. - is-finite-mask: func(self: dvec3) -> bvec3; - /// Returns a vector containing the natural logarithm for each element of `self`. - /// This returns NaN when the element is negative and negative infinity when the element is zero. - ln: func(self: dvec3) -> dvec3; - /// Returns `self` normalized to length 1.0 if possible, else returns zero. - /// In particular, if the input is zero (or very close to zero), or non-finite, - /// the result of this operation will be zero. - /// See also [`Self::try_normalize()`]. - normalize-or-zero: func(self: dvec3) -> dvec3; - /// Returns any unit vector that is orthogonal to the given one. - /// The input vector must be unit length. - /// # Panics - /// Will panic if `self` is not normalized when `glam_assert` is enabled. - any-orthonormal-vector: func(self: dvec3) -> dvec3; - rem: func(p0: dvec3, p1: dvec3) -> dvec3; - mul: func(p0: dvec3, p1: dvec3) -> dvec3; - /// Performs `is_nan` on each element of self, returning a vector mask of the results. - /// In other words, this computes `[x.is_nan(), y.is_nan(), ...]`. - is-nan-mask: func(self: dvec3) -> bvec3; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: dvec3) -> bool; - /// Returns `self` normalized to length 1.0 if possible, else returns a - /// fallback value. - /// In particular, if the input is zero (or very close to zero), or non-finite, - /// the result of this operation will be the fallback value. - /// See also [`Self::try_normalize()`]. - normalize-or: func(self: dvec3, fallback: dvec3) -> dvec3; - /// Returns whether `self` is length `1.0` or not. - /// Uses a precision threshold of approximately `1e-4`. - is-normalized: func(self: dvec3) -> bool; - /// Computes the length of `self`. - length: func(self: dvec3) -> f64; - /// Creates a 3D vector from `self` with the given value of `y`. - with-y: func(self: dvec3, y: f64) -> dvec3; - /// Casts all elements of `self` to `f32`. - as-vec3: func(self: dvec3) -> vec3; - /// Returns a vector with a length no less than `min`. - /// # Panics - /// Will panic if `min` is negative when `glam_assert` is enabled. - clamp-length-min: func(self: dvec3, min: f64) -> dvec3; - /// Rotates around `axis` by `angle` (in radians). - /// The axis must be a unit vector. - /// # Panics - /// Will panic if `axis` is not normalized when `glam_assert` is enabled. - rotate-axis: func(self: dvec3, axis: dvec3, angle: f64) -> dvec3; - /// Returns a vector with a length no more than `max`. - /// # Panics - /// Will panic if `max` is negative when `glam_assert` is enabled. - clamp-length-max: func(self: dvec3, max: f64) -> dvec3; - /// Calculates the midpoint between `self` and `rhs`. - /// The midpoint is the average of, or halfway point between, two vectors. - /// `a.midpoint(b)` should yield the same result as `a.lerp(b, 0.5)` - /// while being slightly cheaper to compute. - midpoint: func(self: dvec3, rhs: dvec3) -> dvec3; - /// Casts all elements of `self` to `u16`. - as-u16vec3: func(self: dvec3) -> u16-vec3; - div: func(self: dvec3, rhs: dvec3) -> dvec3; - /// Performs a linear interpolation between `self` and `rhs` based on the value `s`. - /// When `s` is `0.0`, the result will be equal to `self`. When `s` is `1.0`, the result - /// will be equal to `rhs`. When `s` is outside of range `[0, 1]`, the result is linearly - /// extrapolated. - lerp: func(self: dvec3, rhs: dvec3, s: f64) -> dvec3; -} - -/// Methods for DVec4 -interface dvec4 { - use types.{reflect-reference}; - - /// Creates a 4D vector from `self` with the given value of `y`. - with-y: func(self: dvec4, y: f64) -> dvec4; - /// Moves towards `rhs` based on the value `d`. - /// When `d` is `0.0`, the result will be equal to `self`. When `d` is equal to - /// `self.distance(rhs)`, the result will be equal to `rhs`. Will not go past `rhs`. - move-towards: func(self: dvec4, rhs: dvec4, d: f64) -> dvec4; - mul: func(self: dvec4, rhs: dvec4) -> dvec4; - /// Casts all elements of `self` to `i64`. - as-i64vec4: func(self: dvec4) -> i64-vec4; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: dvec4, rhs: dvec4) -> dvec4; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - div-euclid: func(self: dvec4, rhs: dvec4) -> dvec4; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - min-element: func(self: dvec4) -> f64; - /// Returns a vector containing `e^self` (the exponential function) for each element of - /// `self`. - exp: func(self: dvec4) -> dvec4; - /// Casts all elements of `self` to `i32`. - as-ivec4: func(self: dvec4) -> ivec4; - /// Casts all elements of `self` to `u64`. - as-u64vec4: func(self: dvec4) -> u64-vec4; - /// Casts all elements of `self` to `i16`. - as-i16vec4: func(self: dvec4) -> i16-vec4; - /// Returns a bitmask with the lowest 4 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: dvec4) -> u32; - clone: func(self: dvec4) -> dvec4; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: dvec4, rhs: dvec4) -> bvec4; - /// Returns a vector containing the base 2 logarithm for each element of `self`. - /// This returns NaN when the element is negative and negative infinity when the element is zero. - log2: func(self: dvec4) -> dvec4; - rem: func(p0: dvec4, p1: f64) -> dvec4; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: dvec4, rhs: dvec4) -> bvec4; - sub: func(self: dvec4, rhs: dvec4) -> dvec4; - /// Projects a homogeneous coordinate to 3D space by performing perspective divide. - /// # Panics - /// Will panic if `self.w` is `0` when `glam_assert` is enabled. - project: func(self: dvec4) -> dvec3; - /// Component-wise clamping of values, similar to [`f64::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: dvec4, min: dvec4, max: dvec4) -> dvec4; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - /// NaN propogation does not follow IEEE 754-2008 semantics for maxNum and may differ on - /// different SIMD architectures. - max: func(self: dvec4, rhs: dvec4) -> dvec4; - /// Returns `true` if, and only if, all elements are finite. If any element is either - /// `NaN`, positive or negative infinity, this will return `false`. - is-finite: func(self: dvec4) -> bool; - /// Performs `is_finite` on each element of self, returning a vector mask of the results. - /// In other words, this computes `[x.is_finite(), y.is_finite(), ...]`. - is-finite-mask: func(self: dvec4) -> bvec4; - add: func(p0: dvec4, p1: f64) -> dvec4; - sub: func(p0: dvec4, p1: dvec4) -> dvec4; - /// Returns `self` normalized to length 1.0 if possible, else returns a - /// fallback value. - /// In particular, if the input is zero (or very close to zero), or non-finite, - /// the result of this operation will be the fallback value. - /// See also [`Self::try_normalize()`]. - normalize-or: func(self: dvec4, fallback: dvec4) -> dvec4; - mul: func(p0: dvec4, p1: f64) -> dvec4; - add: func(p0: dvec4, p1: dvec4) -> dvec4; - /// Casts all elements of `self` to `f32`. - as-vec4: func(self: dvec4) -> vec4; - /// Returns a vector containing the nearest integer to a number for each element of `self`. - /// Round half-way cases away from 0.0. - round: func(self: dvec4) -> dvec4; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: dvec4, rhs: dvec4) -> bvec4; - /// Computes the squared length of `self`. - /// This is faster than `length()` as it avoids a square root operation. - length-squared: func(self: dvec4) -> f64; - neg: func(self: dvec4) -> dvec4; - eq: func(self: dvec4, other: dvec4) -> bool; - rem: func(p0: dvec4, p1: dvec4) -> dvec4; - /// Returns a vector with a length no more than `max`. - /// # Panics - /// Will panic if `max` is negative when `glam_assert` is enabled. - clamp-length-max: func(self: dvec4, max: f64) -> dvec4; - add: func(self: dvec4, rhs: dvec4) -> dvec4; - /// Returns true if the absolute difference of all elements between `self` and `rhs` is - /// less than or equal to `max_abs_diff`. - /// This can be used to compare if two vectors contain similar elements. It works best when - /// comparing with a known value. The `max_abs_diff` that should be used used depends on - /// the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: dvec4, rhs: dvec4, max-abs-diff: f64) -> bool; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: dvec4, rhs: dvec4) -> f64; - /// Returns the reflection vector for a given incident vector `self` and surface normal - /// `normal`. - /// `normal` must be normalized. - /// # Panics - /// Will panic if `normal` is not normalized when `glam_assert` is enabled. - reflect: func(self: dvec4, normal: dvec4) -> dvec4; - /// Computes `1.0 / length()`. - /// For valid results, `self` must _not_ be of length zero. - length-recip: func(self: dvec4) -> f64; - /// Creates a new vector. - new: func(x: f64, y: f64, z: f64, w: f64) -> dvec4; - /// Returns a vector containing the smallest integer greater than or equal to a number for - /// each element of `self`. - ceil: func(self: dvec4) -> dvec4; - /// Creates a new vector from an array. - from-array: func(a: list) -> dvec4; - /// Returns the vector projection of `self` onto `rhs`. - /// `rhs` must be of non-zero length. - /// # Panics - /// Will panic if `rhs` is zero length when `glam_assert` is enabled. - project-onto: func(self: dvec4, rhs: dvec4) -> dvec4; - /// Returns a vector containing the reciprocal `1.0/n` of each element of `self`. - recip: func(self: dvec4) -> dvec4; - rem: func(self: dvec4, rhs: dvec4) -> dvec4; - div: func(self: dvec4, rhs: dvec4) -> dvec4; - /// Casts all elements of `self` to `i8`. - as-i8vec4: func(self: dvec4) -> i8-vec4; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - max-element: func(self: dvec4) -> f64; - /// Returns the vector rejection of `self` from `rhs`. - /// The vector rejection is the vector perpendicular to the projection of `self` onto - /// `rhs`, in rhs words the result of `self - self.project_onto(rhs)`. - /// `rhs` must be normalized. - /// # Panics - /// Will panic if `rhs` is not normalized when `glam_assert` is enabled. - reject-from-normalized: func(self: dvec4, rhs: dvec4) -> dvec4; - mul: func(p0: dvec4, p1: dvec4) -> dvec4; - /// Returns `self` normalized to length 1.0 if possible, else returns zero. - /// In particular, if the input is zero (or very close to zero), or non-finite, - /// the result of this operation will be zero. - /// See also [`Self::try_normalize()`]. - normalize-or-zero: func(self: dvec4) -> dvec4; - /// Returns a vector containing each element of `self` raised to the power of `n`. - powf: func(self: dvec4, n: f64) -> dvec4; - /// Casts all elements of `self` to `u32`. - as-uvec4: func(self: dvec4) -> uvec4; - /// Returns a vector containing `2^self` for each element of `self`. - exp2: func(self: dvec4) -> dvec4; - /// Returns a vector containing the natural logarithm for each element of `self`. - /// This returns NaN when the element is negative and negative infinity when the element is zero. - ln: func(self: dvec4) -> dvec4; - /// Returns a vector with a length no less than `min`. - /// # Panics - /// Will panic if `min` is negative when `glam_assert` is enabled. - clamp-length-min: func(self: dvec4, min: f64) -> dvec4; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: dvec4) -> f64; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: dvec4, rhs: dvec4) -> bvec4; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec4, if-true: dvec4, if-false: dvec4) -> dvec4; - /// Converts `self` to `[x, y, z, w]` - to-array: func(self: dvec4) -> list; - /// Creates a 4D vector from `self` with the given value of `w`. - with-w: func(self: dvec4, w: f64) -> dvec4; - /// Fused multiply-add. Computes `(self * a) + b` element-wise with only one rounding - /// error, yielding a more accurate result than an unfused multiply-add. - /// Using `mul_add` *may* be more performant than an unfused multiply-add if the target - /// architecture has a dedicated fma CPU instruction. However, this is not always true, - /// and will be heavily dependant on designing algorithms with specific target hardware in - /// mind. - mul-add: func(self: dvec4, a: dvec4, b: dvec4) -> dvec4; - /// Returns a vector with elements representing the sign of `self`. - /// - `1.0` if the number is positive, `+0.0` or `INFINITY` - /// - `-1.0` if the number is negative, `-0.0` or `NEG_INFINITY` - /// - `NAN` if the number is `NAN` - signum: func(self: dvec4) -> dvec4; - /// Returns a vector containing the fractional part of the vector as `self - self.floor()`. - /// Note that this differs from the Rust implementation of `fract` which returns - /// `self - self.trunc()`. - /// Note that this is fast but not precise for large numbers. - fract-gl: func(self: dvec4) -> dvec4; - /// Casts all elements of `self` to `u8`. - as-u8vec4: func(self: dvec4) -> u8-vec4; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: dvec4, rhs: dvec4) -> bvec4; - /// Casts all elements of `self` to `u16`. - as-u16vec4: func(self: dvec4) -> u16-vec4; - div: func(p0: dvec4, p1: f64) -> dvec4; - /// Returns the vector projection of `self` onto `rhs`. - /// `rhs` must be normalized. - /// # Panics - /// Will panic if `rhs` is not normalized when `glam_assert` is enabled. - project-onto-normalized: func(self: dvec4, rhs: dvec4) -> dvec4; - /// Returns a vector containing the integer part each element of `self`. This means numbers are - /// always truncated towards zero. - trunc: func(self: dvec4) -> dvec4; - /// Performs `is_nan` on each element of self, returning a vector mask of the results. - /// In other words, this computes `[x.is_nan(), y.is_nan(), ...]`. - is-nan-mask: func(self: dvec4) -> bvec4; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: dvec4, rhs: dvec4) -> f64; - div: func(p0: dvec4, p1: dvec4) -> dvec4; - /// Calculates the midpoint between `self` and `rhs`. - /// The midpoint is the average of, or halfway point between, two vectors. - /// `a.midpoint(b)` should yield the same result as `a.lerp(b, 0.5)` - /// while being slightly cheaper to compute. - midpoint: func(self: dvec4, rhs: dvec4) -> dvec4; - /// Creates a 4D vector from `self` with the given value of `z`. - with-z: func(self: dvec4, z: f64) -> dvec4; - /// Computes the Euclidean distance between two points in space. - distance: func(self: dvec4, rhs: dvec4) -> f64; - /// Returns `self` normalized to length 1.0. - /// For valid results, `self` must be finite and _not_ of length zero, nor very close to zero. - /// See also [`Self::try_normalize()`] and [`Self::normalize_or_zero()`]. - /// # Panics - /// Will panic if the resulting normalized vector is not finite when `glam_assert` is enabled. - normalize: func(self: dvec4) -> dvec4; - /// Returns the vector rejection of `self` from `rhs`. - /// The vector rejection is the vector perpendicular to the projection of `self` onto - /// `rhs`, in rhs words the result of `self - self.project_onto(rhs)`. - /// `rhs` must be of non-zero length. - /// # Panics - /// Will panic if `rhs` has a length of zero when `glam_assert` is enabled. - reject-from: func(self: dvec4, rhs: dvec4) -> dvec4; - /// Computes the length of `self`. - length: func(self: dvec4) -> f64; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - /// NaN propogation does not follow IEEE 754-2008 semantics for minNum and may differ on - /// different SIMD architectures. - min: func(self: dvec4, rhs: dvec4) -> dvec4; - /// Creates a 4D vector from `self` with the given value of `x`. - with-x: func(self: dvec4, x: f64) -> dvec4; - sub: func(p0: dvec4, p1: f64) -> dvec4; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: dvec4) -> bool; - /// Returns a vector containing the largest integer less than or equal to a number for each - /// element of `self`. - floor: func(self: dvec4) -> dvec4; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: dvec4) -> f64; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: dvec4) -> dvec4; - /// Returns a vector with a length no less than `min` and no more than `max`. - /// # Panics - /// Will panic if `min` is greater than `max`, or if either `min` or `max` is negative, when `glam_assert` is enabled. - clamp-length: func(self: dvec4, min: f64, max: f64) -> dvec4; - /// Creates a vector with all elements set to `v`. - splat: func(v: f64) -> dvec4; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: dvec4) -> u64; - /// Returns a vector containing the fractional part of the vector as `self - self.trunc()`. - /// Note that this differs from the GLSL implementation of `fract` which returns - /// `self - self.floor()`. - /// Note that this is fast but not precise for large numbers. - fract: func(self: dvec4) -> dvec4; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// [Euclidean division]: f64::rem_euclid - rem-euclid: func(self: dvec4, rhs: dvec4) -> dvec4; - /// Returns a vector with signs of `rhs` and the magnitudes of `self`. - copysign: func(self: dvec4, rhs: dvec4) -> dvec4; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: dvec4) -> u64; - /// Creates a 3D vector from the `x`, `y` and `z` elements of `self`, discarding `w`. - /// Truncation to [`DVec3`] may also be performed by using [`self.xyz()`][crate::swizzles::Vec4Swizzles::xyz()]. - truncate: func(self: dvec4) -> dvec3; - /// Returns whether `self` is length `1.0` or not. - /// Uses a precision threshold of approximately `1e-4`. - is-normalized: func(self: dvec4) -> bool; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: dvec4, rhs: dvec4) -> bvec4; - /// Performs a linear interpolation between `self` and `rhs` based on the value `s`. - /// When `s` is `0.0`, the result will be equal to `self`. When `s` is `1.0`, the result - /// will be equal to `rhs`. When `s` is outside of range `[0, 1]`, the result is linearly - /// extrapolated. - lerp: func(self: dvec4, rhs: dvec4, s: f64) -> dvec4; - /// Returns the refraction direction for a given incident vector `self`, surface normal - /// `normal` and ratio of indices of refraction, `eta`. When total internal reflection occurs, - /// a zero vector will be returned. - /// `self` and `normal` must be normalized. - /// # Panics - /// Will panic if `self` or `normal` is not normalized when `glam_assert` is enabled. - refract: func(self: dvec4, normal: dvec4, eta: f64) -> dvec4; -} - -/// Methods for EulerRot -interface euler-rot { - use types.{reflect-reference}; - - clone: func(self: euler-rot) -> euler-rot; - eq: func(self: euler-rot, other: euler-rot) -> bool; - assert-receiver-is-total-eq: func(self: euler-rot); -} - -/// Methods for I16Vec2 -interface i16-vec2 { - use types.{reflect-reference}; - - /// Returns a bitmask with the lowest 2 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: i16-vec2) -> u32; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: i16-vec2) -> s16; - /// Casts all elements of `self` to `i64`. - as-i64vec2: func(self: i16-vec2) -> i64-vec2; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: i16-vec2, rhs: i16-vec2) -> bvec2; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: i16-vec2) -> s16; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - /// Returns `rhs` rotated by the angle of `self`. If `self` is normalized, - /// then this just rotation. This is what you usually want. Otherwise, - /// it will be like a rotation with a multiplication by `self`'s length. - /// This can be used to rotate by 90 degree increments, e.g. `[sin(90), cos(90)` = `[1, 0]` or - /// `[sin(180), cos(180)]` = `[0, -1]`. - rotate: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - rem: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - /// Creates a new vector. - new: func(x: s16, y: s16) -> i16-vec2; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: i16-vec2, rhs: i16-vec2) -> bvec2; - div: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - div: func(p0: i16-vec2, p1: s16) -> i16-vec2; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: i16-vec2, rhs: i16-vec2) -> s16; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: i16-vec2, rhs: i16-vec2) -> u16; - add: func(p0: i16-vec2, p1: s16) -> i16-vec2; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - /// Creates a 2D vector from `self` with the given value of `x`. - with-x: func(self: i16-vec2, x: s16) -> i16-vec2; - /// Creates a vector with all elements set to `v`. - splat: func(v: s16) -> i16-vec2; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - /// [Euclidean division]: i16::rem_euclid - rem-euclid: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - sub: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - add: func(p0: i16-vec2, p1: i16-vec2) -> i16-vec2; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - div-euclid: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: i16-vec2) -> i16-vec2; - /// Creates a 3D vector from `self` and the given `z` value. - extend: func(self: i16-vec2, z: s16) -> i16-vec3; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: i16-vec2, rhs: i16-vec2) -> s16; - /// Component-wise clamping of values, similar to [`i16::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: i16-vec2, min: i16-vec2, max: i16-vec2) -> i16-vec2; - /// Casts all elements of `self` to `u16`. - as-u16vec2: func(self: i16-vec2) -> u16-vec2; - /// Casts all elements of `self` to `u32`. - as-uvec2: func(self: i16-vec2) -> uvec2; - div: func(p0: i16-vec2, p1: i16-vec2) -> i16-vec2; - /// The perpendicular dot product of `self` and `rhs`. - /// Also known as the wedge product, 2D cross product, and determinant. - perp-dot: func(self: i16-vec2, rhs: i16-vec2) -> s16; - sub: func(p0: i16-vec2, p1: i16-vec2) -> i16-vec2; - /// Creates a new vector from an array. - from-array: func(a: list) -> i16-vec2; - mul: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - assert-receiver-is-total-eq: func(self: i16-vec2); - /// Returns a vector containing the wrapping addition of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_unsigned(rhs.x), self.y.wrapping_add_unsigned(rhs.y), ..]`. - wrapping-add-unsigned: func(self: i16-vec2, rhs: u16-vec2) -> i16-vec2; - rem: func(p0: i16-vec2, p1: i16-vec2) -> i16-vec2; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: i16-vec2, rhs: i16-vec2) -> bvec2; - /// Returns a vector that is equal to `self` rotated by 90 degrees. - perp: func(self: i16-vec2) -> i16-vec2; - /// Casts all elements of `self` to `u64`. - as-u64vec2: func(self: i16-vec2) -> u64-vec2; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - /// Casts all elements of `self` to `i32`. - as-ivec2: func(self: i16-vec2) -> ivec2; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: i16-vec2) -> u64; - /// Computes the squared length of `self`. - length-squared: func(self: i16-vec2) -> s16; - /// Casts all elements of `self` to `f32`. - as-vec2: func(self: i16-vec2) -> vec2; - sub: func(p0: i16-vec2, p1: s16) -> i16-vec2; - mul: func(p0: i16-vec2, p1: s16) -> i16-vec2; - rem: func(p0: i16-vec2, p1: s16) -> i16-vec2; - /// Casts all elements of `self` to `i8`. - as-i8vec2: func(self: i16-vec2) -> i8-vec2; - clone: func(self: i16-vec2) -> i16-vec2; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u16::MAX`]. - /// See also [`checked_manhattan_distance`][I16Vec2::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: i16-vec2, rhs: i16-vec2) -> u16; - eq: func(self: i16-vec2, other: i16-vec2) -> bool; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: i16-vec2, rhs: i16-vec2) -> bvec2; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec2, if-true: i16-vec2, if-false: i16-vec2) -> i16-vec2; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: i16-vec2) -> s16; - /// Converts `self` to `[x, y]` - to-array: func(self: i16-vec2) -> list; - mul: func(p0: i16-vec2, p1: i16-vec2) -> i16-vec2; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u16::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: i16-vec2, rhs: i16-vec2) -> option; - /// Returns a vector containing the wrapping subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_sub_unsigned(rhs.x), self.y.wrapping_sub_unsigned(rhs.y), ..]`. - wrapping-sub-unsigned: func(self: i16-vec2, rhs: u16-vec2) -> i16-vec2; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - /// Returns a vector containing the saturating subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.saturating_sub_unsigned(rhs.x), self.y.saturating_sub_unsigned(rhs.y), ..]`. - saturating-sub-unsigned: func(self: i16-vec2, rhs: u16-vec2) -> i16-vec2; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - add: func(self: i16-vec2, rhs: i16-vec2) -> i16-vec2; - /// Casts all elements of `self` to `f64`. - as-dvec2: func(self: i16-vec2) -> dvec2; - /// Casts all elements of `self` to `u8`. - as-u8vec2: func(self: i16-vec2) -> u8-vec2; - neg: func(self: i16-vec2) -> i16-vec2; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: i16-vec2) -> s16; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: i16-vec2, rhs: i16-vec2) -> bvec2; - /// Creates a 2D vector from `self` with the given value of `y`. - with-y: func(self: i16-vec2, y: s16) -> i16-vec2; - /// In other words this computes `[self.x.saturating_add_unsigned(rhs.x), self.y.saturating_add_unsigned(rhs.y), ..]`. - saturating-add-unsigned: func(self: i16-vec2, rhs: u16-vec2) -> i16-vec2; - /// Returns a vector with elements representing the sign of `self`. - /// - `0` if the number is zero - /// - `1` if the number is positive - /// - `-1` if the number is negative - signum: func(self: i16-vec2) -> i16-vec2; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: i16-vec2) -> u64; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: i16-vec2, rhs: i16-vec2) -> bvec2; -} - -/// Methods for I16Vec3 -interface i16-vec3 { - use types.{reflect-reference}; - - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec3, if-true: i16-vec3, if-false: i16-vec3) -> i16-vec3; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: i16-vec3, rhs: i16-vec3) -> bvec3; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u16::MAX`]. - /// See also [`checked_manhattan_distance`][I16Vec3::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: i16-vec3, rhs: i16-vec3) -> u16; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: i16-vec3, rhs: i16-vec3) -> bvec3; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - div: func(p0: i16-vec3, p1: i16-vec3) -> i16-vec3; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - /// In other words this computes `[self.x.saturating_add_unsigned(rhs.x), self.y.saturating_add_unsigned(rhs.y), ..]`. - saturating-add-unsigned: func(self: i16-vec3, rhs: u16-vec3) -> i16-vec3; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - /// Converts `self` to `[x, y, z]` - to-array: func(self: i16-vec3) -> list; - /// Creates a new vector. - new: func(x: s16, y: s16, z: s16) -> i16-vec3; - sub: func(p0: i16-vec3, p1: i16-vec3) -> i16-vec3; - sub: func(p0: i16-vec3, p1: s16) -> i16-vec3; - /// Casts all elements of `self` to `f32`. - as-vec3a: func(self: i16-vec3) -> vec3-a; - /// Returns a vector containing the wrapping addition of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_unsigned(rhs.x), self.y.wrapping_add_unsigned(rhs.y), ..]`. - wrapping-add-unsigned: func(self: i16-vec3, rhs: u16-vec3) -> i16-vec3; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: i16-vec3) -> s16; - div: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - rem: func(p0: i16-vec3, p1: s16) -> i16-vec3; - /// Creates a 3D vector from `self` with the given value of `y`. - with-y: func(self: i16-vec3, y: s16) -> i16-vec3; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: i16-vec3, rhs: i16-vec3) -> s16; - /// Computes the cross product of `self` and `rhs`. - cross: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - rem: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - /// Returns a vector with elements representing the sign of `self`. - /// - `0` if the number is zero - /// - `1` if the number is positive - /// - `-1` if the number is negative - signum: func(self: i16-vec3) -> i16-vec3; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: i16-vec3, rhs: i16-vec3) -> bvec3; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - /// Casts all elements of `self` to `i8`. - as-i8vec3: func(self: i16-vec3) -> i8-vec3; - assert-receiver-is-total-eq: func(self: i16-vec3); - add: func(p0: i16-vec3, p1: i16-vec3) -> i16-vec3; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: i16-vec3, rhs: i16-vec3) -> bvec3; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: i16-vec3, rhs: i16-vec3) -> bvec3; - /// Casts all elements of `self` to `i32`. - as-ivec3: func(self: i16-vec3) -> ivec3; - /// Creates a new vector from an array. - from-array: func(a: list) -> i16-vec3; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - mul: func(p0: i16-vec3, p1: s16) -> i16-vec3; - /// Creates a 3D vector from `self` with the given value of `z`. - with-z: func(self: i16-vec3, z: s16) -> i16-vec3; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - /// Casts all elements of `self` to `u8`. - as-u8vec3: func(self: i16-vec3) -> u8-vec3; - /// Casts all elements of `self` to `f64`. - as-dvec3: func(self: i16-vec3) -> dvec3; - /// Computes the squared length of `self`. - length-squared: func(self: i16-vec3) -> s16; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u16::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: i16-vec3, rhs: i16-vec3) -> option; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - div-euclid: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - /// [Euclidean division]: i16::rem_euclid - rem-euclid: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - neg: func(self: i16-vec3) -> i16-vec3; - /// Returns a bitmask with the lowest 3 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: i16-vec3) -> u32; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - add: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - /// Creates a 4D vector from `self` and the given `w` value. - extend: func(self: i16-vec3, w: s16) -> i16-vec4; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: i16-vec3) -> s16; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: i16-vec3) -> s16; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: i16-vec3, rhs: i16-vec3) -> s16; - add: func(p0: i16-vec3, p1: s16) -> i16-vec3; - /// Creates a 3D vector from `self` with the given value of `x`. - with-x: func(self: i16-vec3, x: s16) -> i16-vec3; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: i16-vec3, rhs: i16-vec3) -> bvec3; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: i16-vec3, rhs: i16-vec3) -> u16; - /// Component-wise clamping of values, similar to [`i16::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: i16-vec3, min: i16-vec3, max: i16-vec3) -> i16-vec3; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: i16-vec3) -> u64; - eq: func(self: i16-vec3, other: i16-vec3) -> bool; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: i16-vec3) -> u64; - /// Casts all elements of `self` to `u16`. - as-u16vec3: func(self: i16-vec3) -> u16-vec3; - mul: func(p0: i16-vec3, p1: i16-vec3) -> i16-vec3; - /// Casts all elements of `self` to `u64`. - as-u64vec3: func(self: i16-vec3) -> u64-vec3; - /// Creates a vector with all elements set to `v`. - splat: func(v: s16) -> i16-vec3; - sub: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - /// Casts all elements of `self` to `f32`. - as-vec3: func(self: i16-vec3) -> vec3; - /// Returns a vector containing the saturating subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.saturating_sub_unsigned(rhs.x), self.y.saturating_sub_unsigned(rhs.y), ..]`. - saturating-sub-unsigned: func(self: i16-vec3, rhs: u16-vec3) -> i16-vec3; - /// Casts all elements of `self` to `u32`. - as-uvec3: func(self: i16-vec3) -> uvec3; - /// Casts all elements of `self` to `i64`. - as-i64vec3: func(self: i16-vec3) -> i64-vec3; - div: func(p0: i16-vec3, p1: s16) -> i16-vec3; - rem: func(p0: i16-vec3, p1: i16-vec3) -> i16-vec3; - /// Returns a vector containing the wrapping subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_sub_unsigned(rhs.x), self.y.wrapping_sub_unsigned(rhs.y), ..]`. - wrapping-sub-unsigned: func(self: i16-vec3, rhs: u16-vec3) -> i16-vec3; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: i16-vec3) -> i16-vec3; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: i16-vec3) -> s16; - clone: func(self: i16-vec3) -> i16-vec3; - /// Creates a 2D vector from the `x` and `y` elements of `self`, discarding `z`. - /// Truncation may also be performed by using [`self.xy()`][crate::swizzles::Vec3Swizzles::xy()]. - truncate: func(self: i16-vec3) -> i16-vec2; - mul: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: i16-vec3, rhs: i16-vec3) -> i16-vec3; -} - -/// Methods for I16Vec4 -interface i16-vec4 { - use types.{reflect-reference}; - - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: i16-vec4) -> s16; - /// Creates a new vector from an array. - from-array: func(a: list) -> i16-vec4; - /// Casts all elements of `self` to `u32`. - as-uvec4: func(self: i16-vec4) -> uvec4; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: i16-vec4, rhs: i16-vec4) -> bvec4; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: i16-vec4, rhs: i16-vec4) -> bvec4; - rem: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - /// Creates a vector with all elements set to `v`. - splat: func(v: s16) -> i16-vec4; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: i16-vec4, rhs: i16-vec4) -> bvec4; - /// Creates a 4D vector from `self` with the given value of `y`. - with-y: func(self: i16-vec4, y: s16) -> i16-vec4; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: i16-vec4) -> i16-vec4; - add: func(p0: i16-vec4, p1: s16) -> i16-vec4; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - /// [Euclidean division]: i16::rem_euclid - rem-euclid: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - /// Returns a vector containing the wrapping subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_sub_unsigned(rhs.x), self.y.wrapping_sub_unsigned(rhs.y), ..]`. - wrapping-sub-unsigned: func(self: i16-vec4, rhs: u16-vec4) -> i16-vec4; - assert-receiver-is-total-eq: func(self: i16-vec4); - sub: func(p0: i16-vec4, p1: s16) -> i16-vec4; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: i16-vec4) -> u64; - /// Casts all elements of `self` to `u16`. - as-u16vec4: func(self: i16-vec4) -> u16-vec4; - /// Creates a 4D vector from `self` with the given value of `z`. - with-z: func(self: i16-vec4, z: s16) -> i16-vec4; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - /// Returns a vector containing the wrapping addition of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_unsigned(rhs.x), self.y.wrapping_add_unsigned(rhs.y), ..]`. - wrapping-add-unsigned: func(self: i16-vec4, rhs: u16-vec4) -> i16-vec4; - sub: func(p0: i16-vec4, p1: i16-vec4) -> i16-vec4; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: i16-vec4) -> s16; - sub: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: i16-vec4, rhs: i16-vec4) -> s16; - /// Returns a vector with elements representing the sign of `self`. - /// - `0` if the number is zero - /// - `1` if the number is positive - /// - `-1` if the number is negative - signum: func(self: i16-vec4) -> i16-vec4; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: i16-vec4, rhs: i16-vec4) -> bvec4; - /// Creates a 3D vector from the `x`, `y` and `z` elements of `self`, discarding `w`. - /// Truncation to [`I16Vec3`] may also be performed by using [`self.xyz()`][crate::swizzles::Vec4Swizzles::xyz()]. - truncate: func(self: i16-vec4) -> i16-vec3; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - add: func(p0: i16-vec4, p1: i16-vec4) -> i16-vec4; - mul: func(p0: i16-vec4, p1: i16-vec4) -> i16-vec4; - div: func(p0: i16-vec4, p1: s16) -> i16-vec4; - /// In other words this computes `[self.x.saturating_add_unsigned(rhs.x), self.y.saturating_add_unsigned(rhs.y), ..]`. - saturating-add-unsigned: func(self: i16-vec4, rhs: u16-vec4) -> i16-vec4; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: i16-vec4) -> s16; - rem: func(p0: i16-vec4, p1: i16-vec4) -> i16-vec4; - mul: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - /// Casts all elements of `self` to `i8`. - as-i8vec4: func(self: i16-vec4) -> i8-vec4; - /// Casts all elements of `self` to `f64`. - as-dvec4: func(self: i16-vec4) -> dvec4; - /// Creates a 4D vector from `self` with the given value of `x`. - with-x: func(self: i16-vec4, x: s16) -> i16-vec4; - /// Component-wise clamping of values, similar to [`i16::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: i16-vec4, min: i16-vec4, max: i16-vec4) -> i16-vec4; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: i16-vec4, rhs: i16-vec4) -> u16; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u16::MAX`]. - /// See also [`checked_manhattan_distance`][I16Vec4::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: i16-vec4, rhs: i16-vec4) -> u16; - /// Creates a 4D vector from `self` with the given value of `w`. - with-w: func(self: i16-vec4, w: s16) -> i16-vec4; - /// Casts all elements of `self` to `f32`. - as-vec4: func(self: i16-vec4) -> vec4; - div: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - div-euclid: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: i16-vec4) -> u64; - /// Casts all elements of `self` to `i64`. - as-i64vec4: func(self: i16-vec4) -> i64-vec4; - /// Returns a bitmask with the lowest 4 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: i16-vec4) -> u32; - rem: func(p0: i16-vec4, p1: s16) -> i16-vec4; - clone: func(self: i16-vec4) -> i16-vec4; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - /// Creates a new vector. - new: func(x: s16, y: s16, z: s16, w: s16) -> i16-vec4; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - /// Casts all elements of `self` to `u8`. - as-u8vec4: func(self: i16-vec4) -> u8-vec4; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: i16-vec4, rhs: i16-vec4) -> bvec4; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: i16-vec4, rhs: i16-vec4) -> bvec4; - mul: func(p0: i16-vec4, p1: s16) -> i16-vec4; - neg: func(self: i16-vec4) -> i16-vec4; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - eq: func(self: i16-vec4, other: i16-vec4) -> bool; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - add: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - /// Casts all elements of `self` to `u64`. - as-u64vec4: func(self: i16-vec4) -> u64-vec4; - /// Returns a vector containing the saturating subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.saturating_sub_unsigned(rhs.x), self.y.saturating_sub_unsigned(rhs.y), ..]`. - saturating-sub-unsigned: func(self: i16-vec4, rhs: u16-vec4) -> i16-vec4; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - /// Computes the squared length of `self`. - length-squared: func(self: i16-vec4) -> s16; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: i16-vec4, rhs: i16-vec4) -> s16; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec4, if-true: i16-vec4, if-false: i16-vec4) -> i16-vec4; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: i16-vec4) -> s16; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: i16-vec4, rhs: i16-vec4) -> i16-vec4; - /// Casts all elements of `self` to `i32`. - as-ivec4: func(self: i16-vec4) -> ivec4; - div: func(p0: i16-vec4, p1: i16-vec4) -> i16-vec4; - /// Converts `self` to `[x, y, z, w]` - to-array: func(self: i16-vec4) -> list; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u16::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: i16-vec4, rhs: i16-vec4) -> option; -} - -/// Methods for I64Vec2 -interface i64-vec2 { - use types.{reflect-reference}; - - add: func(p0: i64-vec2, p1: s64) -> i64-vec2; - /// Creates a 3D vector from `self` and the given `z` value. - extend: func(self: i64-vec2, z: s64) -> i64-vec3; - /// Computes the squared length of `self`. - length-squared: func(self: i64-vec2) -> s64; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: i64-vec2, rhs: i64-vec2) -> bvec2; - /// Casts all elements of `self` to `f32`. - as-vec2: func(self: i64-vec2) -> vec2; - sub: func(p0: i64-vec2, p1: i64-vec2) -> i64-vec2; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: i64-vec2, rhs: i64-vec2) -> bvec2; - /// Casts all elements of `self` to `i32`. - as-ivec2: func(self: i64-vec2) -> ivec2; - /// Casts all elements of `self` to `u32`. - as-uvec2: func(self: i64-vec2) -> uvec2; - /// Returns a vector containing the wrapping subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_sub_unsigned(rhs.x), self.y.wrapping_sub_unsigned(rhs.y), ..]`. - wrapping-sub-unsigned: func(self: i64-vec2, rhs: u64-vec2) -> i64-vec2; - /// Returns `rhs` rotated by the angle of `self`. If `self` is normalized, - /// then this just rotation. This is what you usually want. Otherwise, - /// it will be like a rotation with a multiplication by `self`'s length. - /// This can be used to rotate by 90 degree increments, e.g. `[sin(90), cos(90)` = `[1, 0]` or - /// `[sin(180), cos(180)]` = `[0, -1]`. - rotate: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: i64-vec2) -> u64; - eq: func(self: i64-vec2, other: i64-vec2) -> bool; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: i64-vec2, rhs: i64-vec2) -> s64; - /// In other words this computes `[self.x.saturating_add_unsigned(rhs.x), self.y.saturating_add_unsigned(rhs.y), ..]`. - saturating-add-unsigned: func(self: i64-vec2, rhs: u64-vec2) -> i64-vec2; - mul: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - div-euclid: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - /// Creates a vector with all elements set to `v`. - splat: func(v: s64) -> i64-vec2; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - /// Component-wise clamping of values, similar to [`i64::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: i64-vec2, min: i64-vec2, max: i64-vec2) -> i64-vec2; - /// Casts all elements of `self` to `u8`. - as-u8vec2: func(self: i64-vec2) -> u8-vec2; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u64::MAX`]. - /// See also [`checked_manhattan_distance`][I64Vec2::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: i64-vec2, rhs: i64-vec2) -> u64; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - rem: func(p0: i64-vec2, p1: s64) -> i64-vec2; - /// Returns a bitmask with the lowest 2 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: i64-vec2) -> u32; - clone: func(self: i64-vec2) -> i64-vec2; - assert-receiver-is-total-eq: func(self: i64-vec2); - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: i64-vec2) -> s64; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: i64-vec2) -> i64-vec2; - sub: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - /// Casts all elements of `self` to `u16`. - as-u16vec2: func(self: i64-vec2) -> u16-vec2; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: i64-vec2, rhs: i64-vec2) -> bvec2; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u64::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: i64-vec2, rhs: i64-vec2) -> option; - /// The perpendicular dot product of `self` and `rhs`. - /// Also known as the wedge product, 2D cross product, and determinant. - perp-dot: func(self: i64-vec2, rhs: i64-vec2) -> s64; - div: func(p0: i64-vec2, p1: s64) -> i64-vec2; - /// Returns a vector containing the saturating subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.saturating_sub_unsigned(rhs.x), self.y.saturating_sub_unsigned(rhs.y), ..]`. - saturating-sub-unsigned: func(self: i64-vec2, rhs: u64-vec2) -> i64-vec2; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: i64-vec2) -> s64; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: i64-vec2, rhs: i64-vec2) -> bvec2; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec2, if-true: i64-vec2, if-false: i64-vec2) -> i64-vec2; - neg: func(self: i64-vec2) -> i64-vec2; - /// Converts `self` to `[x, y]` - to-array: func(self: i64-vec2) -> list; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - /// [Euclidean division]: i64::rem_euclid - rem-euclid: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - add: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - div: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: i64-vec2) -> u64; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: i64-vec2) -> s64; - sub: func(p0: i64-vec2, p1: s64) -> i64-vec2; - mul: func(p0: i64-vec2, p1: s64) -> i64-vec2; - div: func(p0: i64-vec2, p1: i64-vec2) -> i64-vec2; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: i64-vec2, rhs: i64-vec2) -> bvec2; - /// Creates a 2D vector from `self` with the given value of `y`. - with-y: func(self: i64-vec2, y: s64) -> i64-vec2; - rem: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - /// Creates a 2D vector from `self` with the given value of `x`. - with-x: func(self: i64-vec2, x: s64) -> i64-vec2; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: i64-vec2, rhs: i64-vec2) -> u64; - add: func(p0: i64-vec2, p1: i64-vec2) -> i64-vec2; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: i64-vec2, rhs: i64-vec2) -> s64; - /// Casts all elements of `self` to `i8`. - as-i8vec2: func(self: i64-vec2) -> i8-vec2; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - /// Casts all elements of `self` to `i16`. - as-i16vec2: func(self: i64-vec2) -> i16-vec2; - mul: func(p0: i64-vec2, p1: i64-vec2) -> i64-vec2; - /// Creates a new vector. - new: func(x: s64, y: s64) -> i64-vec2; - /// Returns a vector that is equal to `self` rotated by 90 degrees. - perp: func(self: i64-vec2) -> i64-vec2; - rem: func(p0: i64-vec2, p1: i64-vec2) -> i64-vec2; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: i64-vec2) -> s64; - /// Casts all elements of `self` to `f64`. - as-dvec2: func(self: i64-vec2) -> dvec2; - /// Casts all elements of `self` to `u64`. - as-u64vec2: func(self: i64-vec2) -> u64-vec2; - /// Returns a vector with elements representing the sign of `self`. - /// - `0` if the number is zero - /// - `1` if the number is positive - /// - `-1` if the number is negative - signum: func(self: i64-vec2) -> i64-vec2; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: i64-vec2, rhs: i64-vec2) -> i64-vec2; - /// Returns a vector containing the wrapping addition of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_unsigned(rhs.x), self.y.wrapping_add_unsigned(rhs.y), ..]`. - wrapping-add-unsigned: func(self: i64-vec2, rhs: u64-vec2) -> i64-vec2; - /// Creates a new vector from an array. - from-array: func(a: list) -> i64-vec2; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: i64-vec2, rhs: i64-vec2) -> bvec2; -} - -/// Methods for I64Vec3 -interface i64-vec3 { - use types.{reflect-reference}; - - /// Creates a 3D vector from `self` with the given value of `x`. - with-x: func(self: i64-vec3, x: s64) -> i64-vec3; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: i64-vec3, rhs: i64-vec3) -> bvec3; - /// Casts all elements of `self` to `i8`. - as-i8vec3: func(self: i64-vec3) -> i8-vec3; - mul: func(p0: i64-vec3, p1: i64-vec3) -> i64-vec3; - /// Casts all elements of `self` to `i16`. - as-i16vec3: func(self: i64-vec3) -> i16-vec3; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: i64-vec3, rhs: i64-vec3) -> bvec3; - sub: func(p0: i64-vec3, p1: s64) -> i64-vec3; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u64::MAX`]. - /// See also [`checked_manhattan_distance`][I64Vec3::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: i64-vec3, rhs: i64-vec3) -> u64; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - /// [Euclidean division]: i64::rem_euclid - rem-euclid: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: i64-vec3) -> s64; - /// Casts all elements of `self` to `f64`. - as-dvec3: func(self: i64-vec3) -> dvec3; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: i64-vec3, rhs: i64-vec3) -> bvec3; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - rem: func(p0: i64-vec3, p1: i64-vec3) -> i64-vec3; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - div-euclid: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: i64-vec3) -> s64; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: i64-vec3, rhs: i64-vec3) -> u64; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - /// Creates a new vector. - new: func(x: s64, y: s64, z: s64) -> i64-vec3; - /// Returns a vector containing the saturating subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.saturating_sub_unsigned(rhs.x), self.y.saturating_sub_unsigned(rhs.y), ..]`. - saturating-sub-unsigned: func(self: i64-vec3, rhs: u64-vec3) -> i64-vec3; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: i64-vec3) -> i64-vec3; - /// Returns a vector with elements representing the sign of `self`. - /// - `0` if the number is zero - /// - `1` if the number is positive - /// - `-1` if the number is negative - signum: func(self: i64-vec3) -> i64-vec3; - /// Casts all elements of `self` to `i32`. - as-ivec3: func(self: i64-vec3) -> ivec3; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: i64-vec3) -> s64; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: i64-vec3, rhs: i64-vec3) -> bvec3; - /// Casts all elements of `self` to `f32`. - as-vec3a: func(self: i64-vec3) -> vec3-a; - sub: func(p0: i64-vec3, p1: i64-vec3) -> i64-vec3; - /// Computes the cross product of `self` and `rhs`. - cross: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - add: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: i64-vec3) -> s64; - /// Creates a new vector from an array. - from-array: func(a: list) -> i64-vec3; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - /// Creates a 3D vector from `self` with the given value of `y`. - with-y: func(self: i64-vec3, y: s64) -> i64-vec3; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - /// Returns a vector containing the wrapping subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_sub_unsigned(rhs.x), self.y.wrapping_sub_unsigned(rhs.y), ..]`. - wrapping-sub-unsigned: func(self: i64-vec3, rhs: u64-vec3) -> i64-vec3; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec3, if-true: i64-vec3, if-false: i64-vec3) -> i64-vec3; - /// Creates a 3D vector from `self` with the given value of `z`. - with-z: func(self: i64-vec3, z: s64) -> i64-vec3; - /// Casts all elements of `self` to `f32`. - as-vec3: func(self: i64-vec3) -> vec3; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: i64-vec3) -> u64; - eq: func(self: i64-vec3, other: i64-vec3) -> bool; - add: func(p0: i64-vec3, p1: i64-vec3) -> i64-vec3; - /// Creates a 2D vector from the `x` and `y` elements of `self`, discarding `z`. - /// Truncation may also be performed by using [`self.xy()`][crate::swizzles::Vec3Swizzles::xy()]. - truncate: func(self: i64-vec3) -> i64-vec2; - /// Converts `self` to `[x, y, z]` - to-array: func(self: i64-vec3) -> list; - /// Creates a 4D vector from `self` and the given `w` value. - extend: func(self: i64-vec3, w: s64) -> i64-vec4; - rem: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - add: func(p0: i64-vec3, p1: s64) -> i64-vec3; - neg: func(self: i64-vec3) -> i64-vec3; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: i64-vec3, rhs: i64-vec3) -> s64; - sub: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - /// Computes the squared length of `self`. - length-squared: func(self: i64-vec3) -> s64; - /// Casts all elements of `self` to `u16`. - as-u16vec3: func(self: i64-vec3) -> u16-vec3; - div: func(p0: i64-vec3, p1: s64) -> i64-vec3; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: i64-vec3, rhs: i64-vec3) -> bvec3; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - assert-receiver-is-total-eq: func(self: i64-vec3); - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: i64-vec3, rhs: i64-vec3) -> s64; - /// Creates a vector with all elements set to `v`. - splat: func(v: s64) -> i64-vec3; - /// Casts all elements of `self` to `u8`. - as-u8vec3: func(self: i64-vec3) -> u8-vec3; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: i64-vec3, rhs: i64-vec3) -> bvec3; - div: func(p0: i64-vec3, p1: i64-vec3) -> i64-vec3; - /// Casts all elements of `self` to `u64`. - as-u64vec3: func(self: i64-vec3) -> u64-vec3; - /// In other words this computes `[self.x.saturating_add_unsigned(rhs.x), self.y.saturating_add_unsigned(rhs.y), ..]`. - saturating-add-unsigned: func(self: i64-vec3, rhs: u64-vec3) -> i64-vec3; - /// Casts all elements of `self` to `u32`. - as-uvec3: func(self: i64-vec3) -> uvec3; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u64::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: i64-vec3, rhs: i64-vec3) -> option; - /// Returns a vector containing the wrapping addition of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_unsigned(rhs.x), self.y.wrapping_add_unsigned(rhs.y), ..]`. - wrapping-add-unsigned: func(self: i64-vec3, rhs: u64-vec3) -> i64-vec3; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - rem: func(p0: i64-vec3, p1: s64) -> i64-vec3; - /// Returns a bitmask with the lowest 3 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: i64-vec3) -> u32; - div: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - mul: func(self: i64-vec3, rhs: i64-vec3) -> i64-vec3; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: i64-vec3) -> u64; - clone: func(self: i64-vec3) -> i64-vec3; - mul: func(p0: i64-vec3, p1: s64) -> i64-vec3; - /// Component-wise clamping of values, similar to [`i64::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: i64-vec3, min: i64-vec3, max: i64-vec3) -> i64-vec3; -} - -/// Methods for I64Vec4 -interface i64-vec4 { - use types.{reflect-reference}; - - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; - mul: func(p0: i64-vec4, p1: i64-vec4) -> i64-vec4; - /// In other words this computes `[self.x.saturating_add_unsigned(rhs.x), self.y.saturating_add_unsigned(rhs.y), ..]`. - saturating-add-unsigned: func(self: i64-vec4, rhs: u64-vec4) -> i64-vec4; - /// Creates a 4D vector from `self` with the given value of `w`. - with-w: func(self: i64-vec4, w: s64) -> i64-vec4; - rem: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; - /// Casts all elements of `self` to `u16`. - as-u16vec4: func(self: i64-vec4) -> u16-vec4; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: i64-vec4) -> s64; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; - add: func(p0: i64-vec4, p1: i64-vec4) -> i64-vec4; - /// Returns a vector with elements representing the sign of `self`. - /// - `0` if the number is zero - /// - `1` if the number is positive - /// - `-1` if the number is negative - signum: func(self: i64-vec4) -> i64-vec4; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: i64-vec4, rhs: i64-vec4) -> bvec4; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: i64-vec4) -> s64; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: i64-vec4, rhs: i64-vec4) -> u64; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - /// [Euclidean division]: i64::rem_euclid - rem-euclid: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: i64-vec4) -> s64; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u64::MAX`]. - /// See also [`checked_manhattan_distance`][I64Vec4::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: i64-vec4, rhs: i64-vec4) -> u64; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: i64-vec4, rhs: i64-vec4) -> s64; - /// Creates a 4D vector from `self` with the given value of `x`. - with-x: func(self: i64-vec4, x: s64) -> i64-vec4; - /// Casts all elements of `self` to `i8`. - as-i8vec4: func(self: i64-vec4) -> i8-vec4; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; - /// Casts all elements of `self` to `f64`. - as-dvec4: func(self: i64-vec4) -> dvec4; - sub: func(p0: i64-vec4, p1: s64) -> i64-vec4; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; - rem: func(p0: i64-vec4, p1: i64-vec4) -> i64-vec4; - add: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; - assert-receiver-is-total-eq: func(self: i64-vec4); - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: i64-vec4) -> s64; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: i64-vec4) -> i64-vec4; - clone: func(self: i64-vec4) -> i64-vec4; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; - /// Creates a 3D vector from the `x`, `y` and `z` elements of `self`, discarding `w`. - /// Truncation to [`I64Vec3`] may also be performed by using [`self.xyz()`][crate::swizzles::Vec4Swizzles::xyz()]. - truncate: func(self: i64-vec4) -> i64-vec3; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: i64-vec4, rhs: i64-vec4) -> bvec4; - add: func(p0: i64-vec4, p1: s64) -> i64-vec4; - /// Component-wise clamping of values, similar to [`i64::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: i64-vec4, min: i64-vec4, max: i64-vec4) -> i64-vec4; - sub: func(p0: i64-vec4, p1: i64-vec4) -> i64-vec4; - /// Converts `self` to `[x, y, z, w]` - to-array: func(self: i64-vec4) -> list; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: i64-vec4, rhs: i64-vec4) -> bvec4; - /// Casts all elements of `self` to `u8`. - as-u8vec4: func(self: i64-vec4) -> u8-vec4; - /// Casts all elements of `self` to `u64`. - as-u64vec4: func(self: i64-vec4) -> u64-vec4; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; - /// Creates a 4D vector from `self` with the given value of `z`. - with-z: func(self: i64-vec4, z: s64) -> i64-vec4; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: i64-vec4) -> u64; - rem: func(p0: i64-vec4, p1: s64) -> i64-vec4; - mul: func(p0: i64-vec4, p1: s64) -> i64-vec4; - /// Creates a new vector. - new: func(x: s64, y: s64, z: s64, w: s64) -> i64-vec4; - /// Returns a vector containing the wrapping subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_sub_unsigned(rhs.x), self.y.wrapping_sub_unsigned(rhs.y), ..]`. - wrapping-sub-unsigned: func(self: i64-vec4, rhs: u64-vec4) -> i64-vec4; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - div-euclid: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; - mul: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; - /// Creates a new vector from an array. - from-array: func(a: list) -> i64-vec4; - div: func(p0: i64-vec4, p1: i64-vec4) -> i64-vec4; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; - /// Returns a vector containing the wrapping addition of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_unsigned(rhs.x), self.y.wrapping_add_unsigned(rhs.y), ..]`. - wrapping-add-unsigned: func(self: i64-vec4, rhs: u64-vec4) -> i64-vec4; - /// Creates a vector with all elements set to `v`. - splat: func(v: s64) -> i64-vec4; - /// Casts all elements of `self` to `f32`. - as-vec4: func(self: i64-vec4) -> vec4; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec4, if-true: i64-vec4, if-false: i64-vec4) -> i64-vec4; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: i64-vec4, rhs: i64-vec4) -> bvec4; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: i64-vec4, rhs: i64-vec4) -> bvec4; - /// Creates a 4D vector from `self` with the given value of `y`. - with-y: func(self: i64-vec4, y: s64) -> i64-vec4; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; - neg: func(self: i64-vec4) -> i64-vec4; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: i64-vec4, rhs: i64-vec4) -> s64; - eq: func(self: i64-vec4, other: i64-vec4) -> bool; - /// Returns a bitmask with the lowest 4 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: i64-vec4) -> u32; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: i64-vec4) -> u64; - div: func(p0: i64-vec4, p1: s64) -> i64-vec4; - /// Casts all elements of `self` to `i32`. - as-ivec4: func(self: i64-vec4) -> ivec4; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: i64-vec4, rhs: i64-vec4) -> bvec4; - /// Casts all elements of `self` to `u32`. - as-uvec4: func(self: i64-vec4) -> uvec4; - /// Casts all elements of `self` to `i16`. - as-i16vec4: func(self: i64-vec4) -> i16-vec4; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u64::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: i64-vec4, rhs: i64-vec4) -> option; - /// Computes the squared length of `self`. - length-squared: func(self: i64-vec4) -> s64; - div: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; - /// Returns a vector containing the saturating subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.saturating_sub_unsigned(rhs.x), self.y.saturating_sub_unsigned(rhs.y), ..]`. - saturating-sub-unsigned: func(self: i64-vec4, rhs: u64-vec4) -> i64-vec4; - sub: func(self: i64-vec4, rhs: i64-vec4) -> i64-vec4; -} - -/// Methods for I8Vec2 -interface i8-vec2 { - use types.{reflect-reference}; - - /// Creates a 2D vector from `self` with the given value of `x`. - with-x: func(self: i8-vec2, x: s8) -> i8-vec2; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: i8-vec2, rhs: i8-vec2) -> s8; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: i8-vec2, rhs: i8-vec2) -> bvec2; - div: func(p0: i8-vec2, p1: i8-vec2) -> i8-vec2; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: i8-vec2) -> s8; - clone: func(self: i8-vec2) -> i8-vec2; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - mul: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - /// Creates a 3D vector from `self` and the given `z` value. - extend: func(self: i8-vec2, z: s8) -> i8-vec3; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: i8-vec2) -> u64; - /// Casts all elements of `self` to `f32`. - as-vec2: func(self: i8-vec2) -> vec2; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: i8-vec2) -> s8; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - add: func(p0: i8-vec2, p1: s8) -> i8-vec2; - /// Creates a new vector from an array. - from-array: func(a: list) -> i8-vec2; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - /// Casts all elements of `self` to `i64`. - as-i64vec2: func(self: i8-vec2) -> i64-vec2; - mul: func(p0: i8-vec2, p1: s8) -> i8-vec2; - /// Returns a vector containing the saturating subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.saturating_sub_unsigned(rhs.x), self.y.saturating_sub_unsigned(rhs.y), ..]`. - saturating-sub-unsigned: func(self: i8-vec2, rhs: u8-vec2) -> i8-vec2; - /// Computes the squared length of `self`. - length-squared: func(self: i8-vec2) -> s8; - add: func(p0: i8-vec2, p1: i8-vec2) -> i8-vec2; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: i8-vec2, rhs: i8-vec2) -> bvec2; - /// Returns a vector containing the wrapping addition of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_unsigned(rhs.x), self.y.wrapping_add_unsigned(rhs.y), ..]`. - wrapping-add-unsigned: func(self: i8-vec2, rhs: u8-vec2) -> i8-vec2; - eq: func(self: i8-vec2, other: i8-vec2) -> bool; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - /// Returns a vector containing the wrapping subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_sub_unsigned(rhs.x), self.y.wrapping_sub_unsigned(rhs.y), ..]`. - wrapping-sub-unsigned: func(self: i8-vec2, rhs: u8-vec2) -> i8-vec2; - div: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec2, if-true: i8-vec2, if-false: i8-vec2) -> i8-vec2; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - /// Casts all elements of `self` to `f64`. - as-dvec2: func(self: i8-vec2) -> dvec2; - /// In other words this computes `[self.x.saturating_add_unsigned(rhs.x), self.y.saturating_add_unsigned(rhs.y), ..]`. - saturating-add-unsigned: func(self: i8-vec2, rhs: u8-vec2) -> i8-vec2; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - div: func(p0: i8-vec2, p1: s8) -> i8-vec2; - rem: func(p0: i8-vec2, p1: i8-vec2) -> i8-vec2; - rem: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - /// Creates a new vector. - new: func(x: s8, y: s8) -> i8-vec2; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u8::MAX`]. - /// See also [`checked_manhattan_distance`][I8Vec2::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: i8-vec2, rhs: i8-vec2) -> u8; - mul: func(p0: i8-vec2, p1: i8-vec2) -> i8-vec2; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: i8-vec2, rhs: i8-vec2) -> bvec2; - sub: func(p0: i8-vec2, p1: i8-vec2) -> i8-vec2; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: i8-vec2, rhs: i8-vec2) -> bvec2; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - rem: func(p0: i8-vec2, p1: s8) -> i8-vec2; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - /// [Euclidean division]: i8::rem_euclid - rem-euclid: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - /// Returns a vector that is equal to `self` rotated by 90 degrees. - perp: func(self: i8-vec2) -> i8-vec2; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - /// Casts all elements of `self` to `u32`. - as-uvec2: func(self: i8-vec2) -> uvec2; - /// Creates a vector with all elements set to `v`. - splat: func(v: s8) -> i8-vec2; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - div-euclid: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - /// Returns a vector with elements representing the sign of `self`. - /// - `0` if the number is zero - /// - `1` if the number is positive - /// - `-1` if the number is negative - signum: func(self: i8-vec2) -> i8-vec2; - sub: func(p0: i8-vec2, p1: s8) -> i8-vec2; - /// Casts all elements of `self` to `i32`. - as-ivec2: func(self: i8-vec2) -> ivec2; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - /// Converts `self` to `[x, y]` - to-array: func(self: i8-vec2) -> list; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - /// Casts all elements of `self` to `u16`. - as-u16vec2: func(self: i8-vec2) -> u16-vec2; - /// The perpendicular dot product of `self` and `rhs`. - /// Also known as the wedge product, 2D cross product, and determinant. - perp-dot: func(self: i8-vec2, rhs: i8-vec2) -> s8; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: i8-vec2, rhs: i8-vec2) -> u8; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: i8-vec2) -> s8; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u8::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: i8-vec2, rhs: i8-vec2) -> option; - /// Casts all elements of `self` to `u64`. - as-u64vec2: func(self: i8-vec2) -> u64-vec2; - /// Returns a bitmask with the lowest 2 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: i8-vec2) -> u32; - add: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - /// Component-wise clamping of values, similar to [`i8::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: i8-vec2, min: i8-vec2, max: i8-vec2) -> i8-vec2; - assert-receiver-is-total-eq: func(self: i8-vec2); - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: i8-vec2, rhs: i8-vec2) -> bvec2; - neg: func(self: i8-vec2) -> i8-vec2; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: i8-vec2) -> u64; - /// Casts all elements of `self` to `u8`. - as-u8vec2: func(self: i8-vec2) -> u8-vec2; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: i8-vec2, rhs: i8-vec2) -> s8; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: i8-vec2) -> i8-vec2; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - sub: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: i8-vec2, rhs: i8-vec2) -> bvec2; - /// Casts all elements of `self` to `i16`. - as-i16vec2: func(self: i8-vec2) -> i16-vec2; - /// Creates a 2D vector from `self` with the given value of `y`. - with-y: func(self: i8-vec2, y: s8) -> i8-vec2; - /// Returns `rhs` rotated by the angle of `self`. If `self` is normalized, - /// then this just rotation. This is what you usually want. Otherwise, - /// it will be like a rotation with a multiplication by `self`'s length. - /// This can be used to rotate by 90 degree increments, e.g. `[sin(90), cos(90)` = `[1, 0]` or - /// `[sin(180), cos(180)]` = `[0, -1]`. - rotate: func(self: i8-vec2, rhs: i8-vec2) -> i8-vec2; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: i8-vec2) -> s8; -} - -/// Methods for I8Vec3 -interface i8-vec3 { - use types.{reflect-reference}; - - mul: func(p0: i8-vec3, p1: s8) -> i8-vec3; - rem: func(p0: i8-vec3, p1: i8-vec3) -> i8-vec3; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: i8-vec3) -> u64; - clone: func(self: i8-vec3) -> i8-vec3; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: i8-vec3) -> i8-vec3; - /// Creates a 4D vector from `self` and the given `w` value. - extend: func(self: i8-vec3, w: s8) -> i8-vec4; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u8::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: i8-vec3, rhs: i8-vec3) -> option; - /// Creates a vector with all elements set to `v`. - splat: func(v: s8) -> i8-vec3; - /// Returns a bitmask with the lowest 3 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: i8-vec3) -> u32; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: i8-vec3, rhs: i8-vec3) -> u8; - /// Computes the cross product of `self` and `rhs`. - cross: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - div: func(p0: i8-vec3, p1: i8-vec3) -> i8-vec3; - add: func(p0: i8-vec3, p1: i8-vec3) -> i8-vec3; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - /// Casts all elements of `self` to `u16`. - as-u16vec3: func(self: i8-vec3) -> u16-vec3; - /// Casts all elements of `self` to `f32`. - as-vec3a: func(self: i8-vec3) -> vec3-a; - /// Returns a vector containing the saturating subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.saturating_sub_unsigned(rhs.x), self.y.saturating_sub_unsigned(rhs.y), ..]`. - saturating-sub-unsigned: func(self: i8-vec3, rhs: u8-vec3) -> i8-vec3; - neg: func(self: i8-vec3) -> i8-vec3; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - /// Component-wise clamping of values, similar to [`i8::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: i8-vec3, min: i8-vec3, max: i8-vec3) -> i8-vec3; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: i8-vec3) -> s8; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - /// Computes the squared length of `self`. - length-squared: func(self: i8-vec3) -> s8; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - /// Casts all elements of `self` to `f64`. - as-dvec3: func(self: i8-vec3) -> dvec3; - /// Returns a vector with elements representing the sign of `self`. - /// - `0` if the number is zero - /// - `1` if the number is positive - /// - `-1` if the number is negative - signum: func(self: i8-vec3) -> i8-vec3; - mul: func(p0: i8-vec3, p1: i8-vec3) -> i8-vec3; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - div-euclid: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - /// Returns a vector containing the wrapping addition of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_unsigned(rhs.x), self.y.wrapping_add_unsigned(rhs.y), ..]`. - wrapping-add-unsigned: func(self: i8-vec3, rhs: u8-vec3) -> i8-vec3; - add: func(p0: i8-vec3, p1: s8) -> i8-vec3; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: i8-vec3, rhs: i8-vec3) -> bvec3; - /// Creates a new vector. - new: func(x: s8, y: s8, z: s8) -> i8-vec3; - /// Converts `self` to `[x, y, z]` - to-array: func(self: i8-vec3) -> list; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u8::MAX`]. - /// See also [`checked_manhattan_distance`][I8Vec3::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: i8-vec3, rhs: i8-vec3) -> u8; - mul: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - /// Casts all elements of `self` to `f32`. - as-vec3: func(self: i8-vec3) -> vec3; - sub: func(p0: i8-vec3, p1: s8) -> i8-vec3; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - /// Casts all elements of `self` to `i16`. - as-i16vec3: func(self: i8-vec3) -> i16-vec3; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: i8-vec3, rhs: i8-vec3) -> bvec3; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - /// [Euclidean division]: i8::rem_euclid - rem-euclid: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - /// Casts all elements of `self` to `i32`. - as-ivec3: func(self: i8-vec3) -> ivec3; - sub: func(p0: i8-vec3, p1: i8-vec3) -> i8-vec3; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - /// Returns a vector containing the wrapping subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_sub_unsigned(rhs.x), self.y.wrapping_sub_unsigned(rhs.y), ..]`. - wrapping-sub-unsigned: func(self: i8-vec3, rhs: u8-vec3) -> i8-vec3; - /// Casts all elements of `self` to `u32`. - as-uvec3: func(self: i8-vec3) -> uvec3; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - /// Casts all elements of `self` to `u64`. - as-u64vec3: func(self: i8-vec3) -> u64-vec3; - assert-receiver-is-total-eq: func(self: i8-vec3); - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: i8-vec3, rhs: i8-vec3) -> bvec3; - /// Creates a 2D vector from the `x` and `y` elements of `self`, discarding `z`. - /// Truncation may also be performed by using [`self.xy()`][crate::swizzles::Vec3Swizzles::xy()]. - truncate: func(self: i8-vec3) -> i8-vec2; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: i8-vec3, rhs: i8-vec3) -> bvec3; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec3, if-true: i8-vec3, if-false: i8-vec3) -> i8-vec3; - /// Creates a 3D vector from `self` with the given value of `z`. - with-z: func(self: i8-vec3, z: s8) -> i8-vec3; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: i8-vec3, rhs: i8-vec3) -> bvec3; - sub: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: i8-vec3) -> s8; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: i8-vec3) -> s8; - /// Creates a new vector from an array. - from-array: func(a: list) -> i8-vec3; - /// Creates a 3D vector from `self` with the given value of `y`. - with-y: func(self: i8-vec3, y: s8) -> i8-vec3; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: i8-vec3) -> s8; - add: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - eq: func(self: i8-vec3, other: i8-vec3) -> bool; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: i8-vec3, rhs: i8-vec3) -> bvec3; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: i8-vec3) -> u64; - div: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - rem: func(self: i8-vec3, rhs: i8-vec3) -> i8-vec3; - /// Creates a 3D vector from `self` with the given value of `x`. - with-x: func(self: i8-vec3, x: s8) -> i8-vec3; - rem: func(p0: i8-vec3, p1: s8) -> i8-vec3; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: i8-vec3, rhs: i8-vec3) -> s8; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: i8-vec3, rhs: i8-vec3) -> s8; - div: func(p0: i8-vec3, p1: s8) -> i8-vec3; - /// Casts all elements of `self` to `i64`. - as-i64vec3: func(self: i8-vec3) -> i64-vec3; - /// Casts all elements of `self` to `u8`. - as-u8vec3: func(self: i8-vec3) -> u8-vec3; - /// In other words this computes `[self.x.saturating_add_unsigned(rhs.x), self.y.saturating_add_unsigned(rhs.y), ..]`. - saturating-add-unsigned: func(self: i8-vec3, rhs: u8-vec3) -> i8-vec3; -} - -/// Methods for I8Vec4 -interface i8-vec4 { - use types.{reflect-reference}; - - /// Creates a new vector from an array. - from-array: func(a: list) -> i8-vec4; - /// Casts all elements of `self` to `u32`. - as-uvec4: func(self: i8-vec4) -> uvec4; - eq: func(self: i8-vec4, other: i8-vec4) -> bool; - /// Creates a 4D vector from `self` with the given value of `w`. - with-w: func(self: i8-vec4, w: s8) -> i8-vec4; - /// In other words this computes `[self.x.saturating_add_unsigned(rhs.x), self.y.saturating_add_unsigned(rhs.y), ..]`. - saturating-add-unsigned: func(self: i8-vec4, rhs: u8-vec4) -> i8-vec4; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: i8-vec4) -> u64; - /// Creates a vector with all elements set to `v`. - splat: func(v: s8) -> i8-vec4; - mul: func(p0: i8-vec4, p1: s8) -> i8-vec4; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; - mul: func(p0: i8-vec4, p1: i8-vec4) -> i8-vec4; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: i8-vec4, rhs: i8-vec4) -> s8; - /// Creates a 3D vector from the `x`, `y` and `z` elements of `self`, discarding `w`. - /// Truncation to [`I8Vec3`] may also be performed by using [`self.xyz()`][crate::swizzles::Vec4Swizzles::xyz()]. - truncate: func(self: i8-vec4) -> i8-vec3; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; - /// Returns a vector containing the wrapping subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_sub_unsigned(rhs.x), self.y.wrapping_sub_unsigned(rhs.y), ..]`. - wrapping-sub-unsigned: func(self: i8-vec4, rhs: u8-vec4) -> i8-vec4; - /// Casts all elements of `self` to `u16`. - as-u16vec4: func(self: i8-vec4) -> u16-vec4; - /// Converts `self` to `[x, y, z, w]` - to-array: func(self: i8-vec4) -> list; - /// Returns a vector containing the saturating subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.saturating_sub_unsigned(rhs.x), self.y.saturating_sub_unsigned(rhs.y), ..]`. - saturating-sub-unsigned: func(self: i8-vec4, rhs: u8-vec4) -> i8-vec4; - sub: func(p0: i8-vec4, p1: s8) -> i8-vec4; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: i8-vec4, rhs: i8-vec4) -> bvec4; - /// Casts all elements of `self` to `i16`. - as-i16vec4: func(self: i8-vec4) -> i16-vec4; - /// Component-wise clamping of values, similar to [`i8::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: i8-vec4, min: i8-vec4, max: i8-vec4) -> i8-vec4; - add: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; - /// Casts all elements of `self` to `f32`. - as-vec4: func(self: i8-vec4) -> vec4; - div: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; - /// Casts all elements of `self` to `f64`. - as-dvec4: func(self: i8-vec4) -> dvec4; - /// Computes the squared length of `self`. - length-squared: func(self: i8-vec4) -> s8; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: i8-vec4, rhs: i8-vec4) -> bvec4; - /// Returns a vector containing the wrapping addition of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_unsigned(rhs.x), self.y.wrapping_add_unsigned(rhs.y), ..]`. - wrapping-add-unsigned: func(self: i8-vec4, rhs: u8-vec4) -> i8-vec4; - /// Casts all elements of `self` to `i64`. - as-i64vec4: func(self: i8-vec4) -> i64-vec4; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: i8-vec4) -> s8; - add: func(p0: i8-vec4, p1: s8) -> i8-vec4; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - div-euclid: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u8::MAX`]. - /// See also [`checked_manhattan_distance`][I8Vec4::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: i8-vec4, rhs: i8-vec4) -> u8; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; - assert-receiver-is-total-eq: func(self: i8-vec4); - /// Returns the index of the first minimum element of `self`. - min-position: func(self: i8-vec4) -> u64; - add: func(p0: i8-vec4, p1: i8-vec4) -> i8-vec4; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: i8-vec4) -> s8; - sub: func(p0: i8-vec4, p1: i8-vec4) -> i8-vec4; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec4, if-true: i8-vec4, if-false: i8-vec4) -> i8-vec4; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: i8-vec4, rhs: i8-vec4) -> bvec4; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u8::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: i8-vec4, rhs: i8-vec4) -> option; - /// Creates a 4D vector from `self` with the given value of `y`. - with-y: func(self: i8-vec4, y: s8) -> i8-vec4; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; - /// Creates a 4D vector from `self` with the given value of `z`. - with-z: func(self: i8-vec4, z: s8) -> i8-vec4; - neg: func(self: i8-vec4) -> i8-vec4; - rem: func(p0: i8-vec4, p1: s8) -> i8-vec4; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; - /// Casts all elements of `self` to `u64`. - as-u64vec4: func(self: i8-vec4) -> u64-vec4; - /// Returns a bitmask with the lowest 4 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: i8-vec4) -> u32; - clone: func(self: i8-vec4) -> i8-vec4; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; - /// Creates a 4D vector from `self` with the given value of `x`. - with-x: func(self: i8-vec4, x: s8) -> i8-vec4; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: i8-vec4) -> i8-vec4; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: i8-vec4) -> s8; - /// Returns a vector with elements representing the sign of `self`. - /// - `0` if the number is zero - /// - `1` if the number is positive - /// - `-1` if the number is negative - signum: func(self: i8-vec4) -> i8-vec4; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: i8-vec4, rhs: i8-vec4) -> u8; - /// Casts all elements of `self` to `i32`. - as-ivec4: func(self: i8-vec4) -> ivec4; - rem: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: i8-vec4) -> s8; - div: func(p0: i8-vec4, p1: i8-vec4) -> i8-vec4; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: i8-vec4, rhs: i8-vec4) -> bvec4; - mul: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: i8-vec4, rhs: i8-vec4) -> bvec4; - /// Creates a new vector. - new: func(x: s8, y: s8, z: s8, w: s8) -> i8-vec4; - div: func(p0: i8-vec4, p1: s8) -> i8-vec4; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: i8-vec4, rhs: i8-vec4) -> bvec4; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: i8-vec4, rhs: i8-vec4) -> s8; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; - rem: func(p0: i8-vec4, p1: i8-vec4) -> i8-vec4; - sub: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - /// [Euclidean division]: i8::rem_euclid - rem-euclid: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; - /// Casts all elements of `self` to `u8`. - as-u8vec4: func(self: i8-vec4) -> u8-vec4; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: i8-vec4, rhs: i8-vec4) -> i8-vec4; -} - -/// Methods for IVec2 -interface ivec2 { - use types.{reflect-reference}; - - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: ivec2, rhs: ivec2) -> ivec2; - rem: func(self: ivec2, rhs: ivec2) -> ivec2; - div: func(self: ivec2, rhs: ivec2) -> ivec2; - /// Creates a 2D vector from `self` with the given value of `y`. - with-y: func(self: ivec2, y: s32) -> ivec2; - /// Creates a 3D vector from `self` and the given `z` value. - extend: func(self: ivec2, z: s32) -> ivec3; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: ivec2, rhs: ivec2) -> ivec2; - eq: func(self: ivec2, other: ivec2) -> bool; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: ivec2, rhs: ivec2) -> ivec2; - assert-receiver-is-total-eq: func(self: ivec2); - /// Returns a vector containing the saturating subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.saturating_sub_unsigned(rhs.x), self.y.saturating_sub_unsigned(rhs.y), ..]`. - saturating-sub-unsigned: func(self: ivec2, rhs: uvec2) -> ivec2; - mul: func(p0: ivec2, p1: s32) -> ivec2; - /// Casts all elements of `self` to `u64`. - as-u64vec2: func(self: ivec2) -> u64-vec2; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: ivec2) -> s32; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: ivec2, rhs: ivec2) -> s32; - /// Creates a new vector. - new: func(x: s32, y: s32) -> ivec2; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: ivec2, rhs: ivec2) -> ivec2; - /// Converts `self` to `[x, y]` - to-array: func(self: ivec2) -> list; - /// Returns a vector that is equal to `self` rotated by 90 degrees. - perp: func(self: ivec2) -> ivec2; - /// Casts all elements of `self` to `i64`. - as-i64vec2: func(self: ivec2) -> i64-vec2; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: ivec2, rhs: ivec2) -> ivec2; - /// Returns `rhs` rotated by the angle of `self`. If `self` is normalized, - /// then this just rotation. This is what you usually want. Otherwise, - /// it will be like a rotation with a multiplication by `self`'s length. - /// This can be used to rotate by 90 degree increments, e.g. `[sin(90), cos(90)` = `[1, 0]` or - /// `[sin(180), cos(180)]` = `[0, -1]`. - rotate: func(self: ivec2, rhs: ivec2) -> ivec2; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: ivec2) -> s32; - /// Returns a vector containing the wrapping subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_sub_unsigned(rhs.x), self.y.wrapping_sub_unsigned(rhs.y), ..]`. - wrapping-sub-unsigned: func(self: ivec2, rhs: uvec2) -> ivec2; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: ivec2, rhs: ivec2) -> bvec2; - /// Casts all elements of `self` to `u8`. - as-u8vec2: func(self: ivec2) -> u8-vec2; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: ivec2) -> s32; - sub: func(p0: ivec2, p1: ivec2) -> ivec2; - /// Casts all elements of `self` to `u32`. - as-uvec2: func(self: ivec2) -> uvec2; - /// Creates a 2D vector from `self` with the given value of `x`. - with-x: func(self: ivec2, x: s32) -> ivec2; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u32::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: ivec2, rhs: ivec2) -> option; - /// Casts all elements of `self` to `i16`. - as-i16vec2: func(self: ivec2) -> i16-vec2; - sub: func(self: ivec2, rhs: ivec2) -> ivec2; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: ivec2, rhs: ivec2) -> ivec2; - rem: func(p0: ivec2, p1: ivec2) -> ivec2; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: ivec2, rhs: ivec2) -> bvec2; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: ivec2, rhs: ivec2) -> ivec2; - neg: func(self: ivec2) -> ivec2; - /// Creates a new vector from an array. - from-array: func(a: list) -> ivec2; - /// Casts all elements of `self` to `f64`. - as-dvec2: func(self: ivec2) -> dvec2; - div: func(p0: ivec2, p1: s32) -> ivec2; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec2, if-true: ivec2, if-false: ivec2) -> ivec2; - mul: func(p0: ivec2, p1: ivec2) -> ivec2; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: ivec2, rhs: ivec2) -> ivec2; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: ivec2) -> u64; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: ivec2, rhs: ivec2) -> bvec2; - /// Returns a vector with elements representing the sign of `self`. - /// - `0` if the number is zero - /// - `1` if the number is positive - /// - `-1` if the number is negative - signum: func(self: ivec2) -> ivec2; - add: func(p0: ivec2, p1: ivec2) -> ivec2; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u32::MAX`]. - /// See also [`checked_manhattan_distance`][IVec2::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: ivec2, rhs: ivec2) -> u32; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: ivec2) -> u64; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: ivec2, rhs: ivec2) -> u32; - /// Creates a vector with all elements set to `v`. - splat: func(v: s32) -> ivec2; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: ivec2, rhs: ivec2) -> bvec2; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: ivec2, rhs: ivec2) -> s32; - mul: func(self: ivec2, rhs: ivec2) -> ivec2; - div: func(p0: ivec2, p1: ivec2) -> ivec2; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: ivec2, rhs: ivec2) -> bvec2; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: ivec2, rhs: ivec2) -> ivec2; - /// Computes the squared length of `self`. - length-squared: func(self: ivec2) -> s32; - /// Returns a vector containing the wrapping addition of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_unsigned(rhs.x), self.y.wrapping_add_unsigned(rhs.y), ..]`. - wrapping-add-unsigned: func(self: ivec2, rhs: uvec2) -> ivec2; - /// Casts all elements of `self` to `f32`. - as-vec2: func(self: ivec2) -> vec2; - clone: func(self: ivec2) -> ivec2; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - /// [Euclidean division]: i32::rem_euclid - rem-euclid: func(self: ivec2, rhs: ivec2) -> ivec2; - add: func(p0: ivec2, p1: s32) -> ivec2; - /// The perpendicular dot product of `self` and `rhs`. - /// Also known as the wedge product, 2D cross product, and determinant. - perp-dot: func(self: ivec2, rhs: ivec2) -> s32; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: ivec2, rhs: ivec2) -> ivec2; - /// Returns a bitmask with the lowest 2 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: ivec2) -> u32; - /// Casts all elements of `self` to `i8`. - as-i8vec2: func(self: ivec2) -> i8-vec2; - add: func(self: ivec2, rhs: ivec2) -> ivec2; - rem: func(p0: ivec2, p1: s32) -> ivec2; - sub: func(p0: ivec2, p1: s32) -> ivec2; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: ivec2) -> ivec2; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - div-euclid: func(self: ivec2, rhs: ivec2) -> ivec2; - /// Casts all elements of `self` to `u16`. - as-u16vec2: func(self: ivec2) -> u16-vec2; - /// Component-wise clamping of values, similar to [`i32::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: ivec2, min: ivec2, max: ivec2) -> ivec2; - /// In other words this computes `[self.x.saturating_add_unsigned(rhs.x), self.y.saturating_add_unsigned(rhs.y), ..]`. - saturating-add-unsigned: func(self: ivec2, rhs: uvec2) -> ivec2; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: ivec2, rhs: ivec2) -> bvec2; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: ivec2) -> s32; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: ivec2, rhs: ivec2) -> ivec2; -} - -/// Methods for IVec3 -interface ivec3 { - use types.{reflect-reference}; - - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: ivec3) -> s32; - div: func(p0: ivec3, p1: s32) -> ivec3; - mul: func(self: ivec3, rhs: ivec3) -> ivec3; - sub: func(p0: ivec3, p1: ivec3) -> ivec3; - /// Casts all elements of `self` to `i64`. - as-i64vec3: func(self: ivec3) -> i64-vec3; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec3, if-true: ivec3, if-false: ivec3) -> ivec3; - /// Casts all elements of `self` to `u64`. - as-u64vec3: func(self: ivec3) -> u64-vec3; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: ivec3, rhs: ivec3) -> bvec3; - add: func(self: ivec3, rhs: ivec3) -> ivec3; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - div-euclid: func(self: ivec3, rhs: ivec3) -> ivec3; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: ivec3, rhs: ivec3) -> ivec3; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - /// [Euclidean division]: i32::rem_euclid - rem-euclid: func(self: ivec3, rhs: ivec3) -> ivec3; - /// Converts `self` to `[x, y, z]` - to-array: func(self: ivec3) -> list; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: ivec3, rhs: ivec3) -> ivec3; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: ivec3, rhs: ivec3) -> bvec3; - /// Casts all elements of `self` to `u16`. - as-u16vec3: func(self: ivec3) -> u16-vec3; - rem: func(p0: ivec3, p1: s32) -> ivec3; - /// Casts all elements of `self` to `i8`. - as-i8vec3: func(self: ivec3) -> i8-vec3; - /// Creates a 4D vector from `self` and the given `w` value. - extend: func(self: ivec3, w: s32) -> ivec4; - rem: func(self: ivec3, rhs: ivec3) -> ivec3; - /// Creates a new vector from an array. - from-array: func(a: list) -> ivec3; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: ivec3, rhs: ivec3) -> bvec3; - /// Casts all elements of `self` to `f32`. - as-vec3: func(self: ivec3) -> vec3; - assert-receiver-is-total-eq: func(self: ivec3); - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: ivec3, rhs: ivec3) -> ivec3; - add: func(p0: ivec3, p1: ivec3) -> ivec3; - /// Creates a 3D vector from `self` with the given value of `x`. - with-x: func(self: ivec3, x: s32) -> ivec3; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: ivec3) -> s32; - rem: func(p0: ivec3, p1: ivec3) -> ivec3; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: ivec3, rhs: ivec3) -> ivec3; - /// Returns a vector containing the saturating subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.saturating_sub_unsigned(rhs.x), self.y.saturating_sub_unsigned(rhs.y), ..]`. - saturating-sub-unsigned: func(self: ivec3, rhs: uvec3) -> ivec3; - /// Computes the squared length of `self`. - length-squared: func(self: ivec3) -> s32; - mul: func(p0: ivec3, p1: s32) -> ivec3; - /// Creates a 3D vector from `self` with the given value of `z`. - with-z: func(self: ivec3, z: s32) -> ivec3; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: ivec3, rhs: ivec3) -> u32; - /// Casts all elements of `self` to `u32`. - as-uvec3: func(self: ivec3) -> uvec3; - /// Creates a vector with all elements set to `v`. - splat: func(v: s32) -> ivec3; - /// In other words this computes `[self.x.saturating_add_unsigned(rhs.x), self.y.saturating_add_unsigned(rhs.y), ..]`. - saturating-add-unsigned: func(self: ivec3, rhs: uvec3) -> ivec3; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: ivec3, rhs: ivec3) -> bvec3; - /// Returns a bitmask with the lowest 3 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: ivec3) -> u32; - clone: func(self: ivec3) -> ivec3; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: ivec3, rhs: ivec3) -> bvec3; - div: func(p0: ivec3, p1: ivec3) -> ivec3; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: ivec3) -> u64; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: ivec3, rhs: ivec3) -> ivec3; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: ivec3, rhs: ivec3) -> bvec3; - sub: func(p0: ivec3, p1: s32) -> ivec3; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: ivec3, rhs: ivec3) -> ivec3; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: ivec3, rhs: ivec3) -> s32; - /// Returns a vector containing the wrapping subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_sub_unsigned(rhs.x), self.y.wrapping_sub_unsigned(rhs.y), ..]`. - wrapping-sub-unsigned: func(self: ivec3, rhs: uvec3) -> ivec3; - /// Casts all elements of `self` to `u8`. - as-u8vec3: func(self: ivec3) -> u8-vec3; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: ivec3) -> ivec3; - /// Creates a 2D vector from the `x` and `y` elements of `self`, discarding `z`. - /// Truncation may also be performed by using [`self.xy()`][crate::swizzles::Vec3Swizzles::xy()]. - truncate: func(self: ivec3) -> ivec2; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u32::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: ivec3, rhs: ivec3) -> option; - neg: func(self: ivec3) -> ivec3; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: ivec3) -> s32; - add: func(p0: ivec3, p1: s32) -> ivec3; - /// Casts all elements of `self` to `f32`. - as-vec3a: func(self: ivec3) -> vec3-a; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u32::MAX`]. - /// See also [`checked_manhattan_distance`][IVec3::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: ivec3, rhs: ivec3) -> u32; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: ivec3, rhs: ivec3) -> s32; - sub: func(self: ivec3, rhs: ivec3) -> ivec3; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: ivec3) -> u64; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: ivec3, rhs: ivec3) -> ivec3; - /// Casts all elements of `self` to `i16`. - as-i16vec3: func(self: ivec3) -> i16-vec3; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: ivec3, rhs: ivec3) -> ivec3; - /// Creates a new vector. - new: func(x: s32, y: s32, z: s32) -> ivec3; - mul: func(p0: ivec3, p1: ivec3) -> ivec3; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: ivec3, rhs: ivec3) -> ivec3; - /// Computes the cross product of `self` and `rhs`. - cross: func(self: ivec3, rhs: ivec3) -> ivec3; - div: func(self: ivec3, rhs: ivec3) -> ivec3; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: ivec3) -> s32; - /// Creates a 3D vector from `self` with the given value of `y`. - with-y: func(self: ivec3, y: s32) -> ivec3; - /// Returns a vector with elements representing the sign of `self`. - /// - `0` if the number is zero - /// - `1` if the number is positive - /// - `-1` if the number is negative - signum: func(self: ivec3) -> ivec3; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: ivec3, rhs: ivec3) -> ivec3; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: ivec3, rhs: ivec3) -> ivec3; - /// Component-wise clamping of values, similar to [`i32::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: ivec3, min: ivec3, max: ivec3) -> ivec3; - /// Casts all elements of `self` to `f64`. - as-dvec3: func(self: ivec3) -> dvec3; - /// Returns a vector containing the wrapping addition of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_unsigned(rhs.x), self.y.wrapping_add_unsigned(rhs.y), ..]`. - wrapping-add-unsigned: func(self: ivec3, rhs: uvec3) -> ivec3; - eq: func(self: ivec3, other: ivec3) -> bool; -} - -/// Methods for IVec4 -interface ivec4 { - use types.{reflect-reference}; - - add: func(p0: ivec4, p1: ivec4) -> ivec4; - /// Creates a 3D vector from the `x`, `y` and `z` elements of `self`, discarding `w`. - /// Truncation to [`IVec3`] may also be performed by using [`self.xyz()`][crate::swizzles::Vec4Swizzles::xyz()]. - truncate: func(self: ivec4) -> ivec3; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: ivec4, rhs: ivec4) -> ivec4; - div: func(self: ivec4, rhs: ivec4) -> ivec4; - mul: func(self: ivec4, rhs: ivec4) -> ivec4; - /// Returns a vector containing the wrapping addition of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_unsigned(rhs.x), self.y.wrapping_add_unsigned(rhs.y), ..]`. - wrapping-add-unsigned: func(self: ivec4, rhs: uvec4) -> ivec4; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: ivec4, rhs: ivec4) -> s32; - rem: func(self: ivec4, rhs: ivec4) -> ivec4; - clone: func(self: ivec4) -> ivec4; - /// Casts all elements of `self` to `u16`. - as-u16vec4: func(self: ivec4) -> u16-vec4; - /// Creates a 4D vector from `self` with the given value of `w`. - with-w: func(self: ivec4, w: s32) -> ivec4; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: ivec4, rhs: ivec4) -> ivec4; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: ivec4, rhs: ivec4) -> bvec4; - eq: func(self: ivec4, other: ivec4) -> bool; - div: func(p0: ivec4, p1: ivec4) -> ivec4; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: ivec4) -> s32; - /// Creates a new vector from an array. - from-array: func(a: list) -> ivec4; - /// Casts all elements of `self` to `i16`. - as-i16vec4: func(self: ivec4) -> i16-vec4; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec4, if-true: ivec4, if-false: ivec4) -> ivec4; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: ivec4, rhs: ivec4) -> ivec4; - mul: func(p0: ivec4, p1: s32) -> ivec4; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: ivec4, rhs: ivec4) -> ivec4; - /// Creates a 4D vector from `self` with the given value of `z`. - with-z: func(self: ivec4, z: s32) -> ivec4; - /// In other words this computes `[self.x.saturating_add_unsigned(rhs.x), self.y.saturating_add_unsigned(rhs.y), ..]`. - saturating-add-unsigned: func(self: ivec4, rhs: uvec4) -> ivec4; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: ivec4) -> s32; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: ivec4) -> u64; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - div-euclid: func(self: ivec4, rhs: ivec4) -> ivec4; - div: func(p0: ivec4, p1: s32) -> ivec4; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: ivec4, rhs: ivec4) -> ivec4; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: ivec4, rhs: ivec4) -> ivec4; - /// Casts all elements of `self` to `i8`. - as-i8vec4: func(self: ivec4) -> i8-vec4; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: ivec4) -> u64; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: ivec4, rhs: ivec4) -> s32; - assert-receiver-is-total-eq: func(self: ivec4); - /// Returns a bitmask with the lowest 4 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: ivec4) -> u32; - /// Creates a vector with all elements set to `v`. - splat: func(v: s32) -> ivec4; - /// Casts all elements of `self` to `f32`. - as-vec4: func(self: ivec4) -> vec4; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: ivec4, rhs: ivec4) -> bvec4; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: ivec4, rhs: ivec4) -> bvec4; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: ivec4) -> s32; - add: func(p0: ivec4, p1: s32) -> ivec4; - sub: func(p0: ivec4, p1: s32) -> ivec4; - /// Component-wise clamping of values, similar to [`i32::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: ivec4, min: ivec4, max: ivec4) -> ivec4; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: ivec4, rhs: ivec4) -> ivec4; - /// Returns a vector containing the saturating subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.saturating_sub_unsigned(rhs.x), self.y.saturating_sub_unsigned(rhs.y), ..]`. - saturating-sub-unsigned: func(self: ivec4, rhs: uvec4) -> ivec4; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: ivec4) -> s32; - sub: func(p0: ivec4, p1: ivec4) -> ivec4; - /// Casts all elements of `self` to `f64`. - as-dvec4: func(self: ivec4) -> dvec4; - /// Creates a new vector. - new: func(x: s32, y: s32, z: s32, w: s32) -> ivec4; - /// Casts all elements of `self` to `u8`. - as-u8vec4: func(self: ivec4) -> u8-vec4; - neg: func(self: ivec4) -> ivec4; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u32::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: ivec4, rhs: ivec4) -> option; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: ivec4, rhs: ivec4) -> bvec4; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: ivec4, rhs: ivec4) -> bvec4; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: ivec4, rhs: ivec4) -> bvec4; - rem: func(p0: ivec4, p1: ivec4) -> ivec4; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u32::MAX`]. - /// See also [`checked_manhattan_distance`][IVec4::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: ivec4, rhs: ivec4) -> u32; - /// Converts `self` to `[x, y, z, w]` - to-array: func(self: ivec4) -> list; - add: func(self: ivec4, rhs: ivec4) -> ivec4; - rem: func(p0: ivec4, p1: s32) -> ivec4; - /// Casts all elements of `self` to `u32`. - as-uvec4: func(self: ivec4) -> uvec4; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: ivec4, rhs: ivec4) -> u32; - /// Creates a 4D vector from `self` with the given value of `x`. - with-x: func(self: ivec4, x: s32) -> ivec4; - /// Computes the squared length of `self`. - length-squared: func(self: ivec4) -> s32; - /// Casts all elements of `self` to `i64`. - as-i64vec4: func(self: ivec4) -> i64-vec4; - /// Casts all elements of `self` to `u64`. - as-u64vec4: func(self: ivec4) -> u64-vec4; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: ivec4) -> ivec4; - /// Creates a 4D vector from `self` with the given value of `y`. - with-y: func(self: ivec4, y: s32) -> ivec4; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: ivec4, rhs: ivec4) -> ivec4; - /// Returns a vector containing the wrapping subtraction of `self` and unsigned vector `rhs`. - /// In other words this computes `[self.x.wrapping_sub_unsigned(rhs.x), self.y.wrapping_sub_unsigned(rhs.y), ..]`. - wrapping-sub-unsigned: func(self: ivec4, rhs: uvec4) -> ivec4; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: ivec4, rhs: ivec4) -> ivec4; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// # Panics - /// This function will panic if any `rhs` element is 0 or the division results in overflow. - /// [Euclidean division]: i32::rem_euclid - rem-euclid: func(self: ivec4, rhs: ivec4) -> ivec4; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: ivec4, rhs: ivec4) -> ivec4; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: ivec4, rhs: ivec4) -> ivec4; - /// Returns a vector with elements representing the sign of `self`. - /// - `0` if the number is zero - /// - `1` if the number is positive - /// - `-1` if the number is negative - signum: func(self: ivec4) -> ivec4; - sub: func(self: ivec4, rhs: ivec4) -> ivec4; - mul: func(p0: ivec4, p1: ivec4) -> ivec4; -} - -/// Methods for Mat2 -interface mat2 { - use types.{reflect-reference}; - - /// Creates a 2x2 matrix from the minor of the given 3x3 matrix, discarding the `i`th column - /// and `j`th row. - /// # Panics - /// Panics if `i` or `j` is greater than 2. - from-mat3-minor: func(m: mat3, i: u64, j: u64) -> mat2; - mul: func(p0: mat2, p1: f32) -> mat2; - /// Subtracts two 2x2 matrices. - sub-mat2: func(self: mat2, rhs: mat2) -> mat2; - as-dmat2: func(self: mat2) -> dmat2; - /// Creates a 2x2 matrix from a 3x3 matrix, discarding the 2nd row and column. - from-mat3: func(m: mat3) -> mat2; - /// Transforms a 2D vector. - mul-vec2: func(self: mat2, rhs: vec2) -> vec2; - /// Returns the matrix row for the given `index`. - /// # Panics - /// Panics if `index` is greater than 1. - row: func(self: mat2, index: u64) -> vec2; - sub: func(p0: mat2, p1: mat2) -> mat2; - /// Creates a 2x2 matrix from the minor of the given 3x3 matrix, discarding the `i`th column - /// and `j`th row. - /// # Panics - /// Panics if `i` or `j` is greater than 2. - from-mat3a-minor: func(m: mat3-a, i: u64, j: u64) -> mat2; - /// Returns the transpose of `self`. - transpose: func(self: mat2) -> mat2; - clone: func(self: mat2) -> mat2; - /// Divides a 2x2 matrix by a scalar. - div-scalar: func(self: mat2, rhs: f32) -> mat2; - /// Creates a 2x2 matrix from a 3x3 matrix, discarding the 2nd row and column. - from-mat3a: func(m: mat3-a) -> mat2; - /// Creates a 2x2 matrix containing a rotation of `angle` (in radians). - from-angle: func(angle: f32) -> mat2; - /// Returns the inverse of `self`. - /// If the matrix is not invertible the returned matrix will be invalid. - /// # Panics - /// Will panic if the determinant of `self` is zero when `glam_assert` is enabled. - inverse: func(self: mat2) -> mat2; - /// Creates a `[f32; 4]` array storing data in column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array: func(self: mat2) -> list; - /// Takes the absolute value of each element in `self` - abs: func(self: mat2) -> mat2; - mul: func(p0: mat2, p1: vec2) -> vec2; - mul: func(p0: mat2, p1: vec2) -> vec2; - add: func(self: mat2, rhs: mat2) -> mat2; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: mat2) -> bool; - /// Multiplies a 2x2 matrix by a scalar. - mul-scalar: func(self: mat2, rhs: f32) -> mat2; - /// Creates a 2x2 matrix containing the combining non-uniform `scale` and rotation of - /// `angle` (in radians). - from-scale-angle: func(scale: vec2, angle: f32) -> mat2; - mul: func(self: mat2, rhs: mat2) -> mat2; - /// Multiplies two 2x2 matrices. - mul-mat2: func(self: mat2, rhs: mat2) -> mat2; - sub: func(self: mat2, rhs: mat2) -> mat2; - /// Returns `true` if, and only if, all elements are finite. - /// If any element is either `NaN`, positive or negative infinity, this will return `false`. - is-finite: func(self: mat2) -> bool; - add: func(p0: mat2, p1: mat2) -> mat2; - /// Returns the matrix column for the given `index`. - /// # Panics - /// Panics if `index` is greater than 1. - col: func(self: mat2, index: u64) -> vec2; - /// Returns true if the absolute difference of all elements between `self` and `rhs` - /// is less than or equal to `max_abs_diff`. - /// This can be used to compare if two matrices contain similar elements. It works best - /// when comparing with a known value. The `max_abs_diff` that should be used used - /// depends on the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: mat2, rhs: mat2, max-abs-diff: f32) -> bool; - neg: func(self: mat2) -> mat2; - /// Creates a 2x2 matrix with its diagonal set to `diagonal` and all other entries set to 0. - from-diagonal: func(diagonal: vec2) -> mat2; - /// Creates a 2x2 matrix from two column vectors. - from-cols: func(x-axis: vec2, y-axis: vec2) -> mat2; - /// Adds two 2x2 matrices. - add-mat2: func(self: mat2, rhs: mat2) -> mat2; - eq: func(self: mat2, rhs: mat2) -> bool; - /// Returns the determinant of `self`. - determinant: func(self: mat2) -> f32; - mul: func(p0: mat2, p1: mat2) -> mat2; - /// Creates a `[[f32; 2]; 2]` 2D array storing data in column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array-2d: func(self: mat2) -> list>; - div: func(self: mat2, rhs: f32) -> mat2; -} - -/// Methods for Mat3 -interface mat3 { - use types.{reflect-reference}; - - neg: func(self: mat3) -> mat3; - /// Creates a 3D rotation matrix from `angle` (in radians) around the z axis. - from-rotation-z: func(angle: f32) -> mat3; - /// Creates a 3D rotation matrix from a normalized rotation `axis` and `angle` (in - /// radians). - /// # Panics - /// Will panic if `axis` is not normalized when `glam_assert` is enabled. - from-axis-angle: func(axis: vec3, angle: f32) -> mat3; - /// Returns the determinant of `self`. - determinant: func(self: mat3) -> f32; - mul: func(p0: mat3, p1: mat3) -> mat3; - /// Multiplies a 3x3 matrix by a scalar. - mul-scalar: func(self: mat3, rhs: f32) -> mat3; - /// Transforms the given 2D vector as a point. - /// This is the equivalent of multiplying `rhs` as a 3D vector where `z` is `1`. - /// This method assumes that `self` contains a valid affine transform. - /// # Panics - /// Will panic if the 2nd row of `self` is not `(0, 0, 1)` when `glam_assert` is enabled. - transform-point2: func(self: mat3, rhs: vec2) -> vec2; - add: func(p0: mat3, p1: mat3) -> mat3; - /// Rotates the given 2D vector. - /// This is the equivalent of multiplying `rhs` as a 3D vector where `z` is `0`. - /// This method assumes that `self` contains a valid affine transform. - /// # Panics - /// Will panic if the 2nd row of `self` is not `(0, 0, 1)` when `glam_assert` is enabled. - transform-vector2: func(self: mat3, rhs: vec2) -> vec2; - /// Transforms a [`Vec3A`]. - mul-vec3a: func(self: mat3, rhs: vec3-a) -> vec3-a; - /// Creates a 3x3 matrix from the minor of the given 4x4 matrix, discarding the `i`th column - /// and `j`th row. - /// # Panics - /// Panics if `i` or `j` is greater than 3. - from-mat4-minor: func(m: mat4, i: u64, j: u64) -> mat3; - /// Creates a 3D rotation matrix from `angle` (in radians) around the y axis. - from-rotation-y: func(angle: f32) -> mat3; - /// Creates an affine transformation matrix from the given 2D `scale`, rotation `angle` (in - /// radians) and `translation`. - /// The resulting matrix can be used to transform 2D points and vectors. See - /// [`Self::transform_point2()`] and [`Self::transform_vector2()`]. - from-scale-angle-translation: func(scale: vec2, angle: f32, translation: vec2) -> mat3; - /// Returns the matrix row for the given `index`. - /// # Panics - /// Panics if `index` is greater than 2. - row: func(self: mat3, index: u64) -> vec3; - sub: func(p0: mat3, p1: mat3) -> mat3; - as-dmat3: func(self: mat3) -> dmat3; - /// Adds two 3x3 matrices. - add-mat3: func(self: mat3, rhs: mat3) -> mat3; - /// Creates an affine transformation matrix from the given non-uniform 2D `scale`. - /// The resulting matrix can be used to transform 2D points and vectors. See - /// [`Self::transform_point2()`] and [`Self::transform_vector2()`]. - /// # Panics - /// Will panic if all elements of `scale` are zero when `glam_assert` is enabled. - from-scale: func(scale: vec2) -> mat3; - /// Creates an affine transformation matrix from the given 2D rotation `angle` (in - /// radians). - /// The resulting matrix can be used to transform 2D points and vectors. See - /// [`Self::transform_point2()`] and [`Self::transform_vector2()`]. - from-angle: func(angle: f32) -> mat3; - /// Creates a 3D rotation matrix from the given quaternion. - /// # Panics - /// Will panic if `rotation` is not normalized when `glam_assert` is enabled. - from-quat: func(rotation: quat) -> mat3; - /// Creates an affine transformation matrix from the given 2D `translation`. - /// The resulting matrix can be used to transform 2D points and vectors. See - /// [`Self::transform_point2()`] and [`Self::transform_vector2()`]. - from-translation: func(translation: vec2) -> mat3; - mul: func(p0: mat3, p1: vec3) -> vec3; - /// Returns the inverse of `self`. - /// If the matrix is not invertible the returned matrix will be invalid. - /// # Panics - /// Will panic if the determinant of `self` is zero when `glam_assert` is enabled. - inverse: func(self: mat3) -> mat3; - add: func(self: mat3, rhs: mat3) -> mat3; - /// Creates a 3x3 matrix from a 4x4 matrix, discarding the 4th row and column. - from-mat4: func(m: mat4) -> mat3; - /// Creates a 3x3 matrix from three column vectors. - from-cols: func(x-axis: vec3, y-axis: vec3, z-axis: vec3) -> mat3; - mul: func(p0: mat3, p1: vec3-a) -> vec3-a; - /// Divides a 3x3 matrix by a scalar. - div-scalar: func(self: mat3, rhs: f32) -> mat3; - /// Creates a 3D rotation matrix from the given euler rotation sequence and the angles (in - /// radians). - from-euler: func(order: euler-rot, a: f32, b: f32, c: f32) -> mat3; - /// Returns the matrix column for the given `index`. - /// # Panics - /// Panics if `index` is greater than 2. - col: func(self: mat3, index: u64) -> vec3; - /// Returns true if the absolute difference of all elements between `self` and `rhs` - /// is less than or equal to `max_abs_diff`. - /// This can be used to compare if two matrices contain similar elements. It works best - /// when comparing with a known value. The `max_abs_diff` that should be used used - /// depends on the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: mat3, rhs: mat3, max-abs-diff: f32) -> bool; - /// Creates a left-handed view matrix using a camera position, a focal point and an up - /// direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-lh: func(eye: vec3, center: vec3, up: vec3) -> mat3; - clone: func(self: mat3) -> mat3; - /// Creates a left-handed view matrix using a facing direction and an up direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - /// # Panics - /// Will panic if `dir` or `up` are not normalized when `glam_assert` is enabled. - look-to-lh: func(dir: vec3, up: vec3) -> mat3; - /// Creates an affine transformation matrix from the given 2x2 matrix. - /// The resulting matrix can be used to transform 2D points and vectors. See - /// [`Self::transform_point2()`] and [`Self::transform_vector2()`]. - from-mat2: func(m: mat2) -> mat3; - eq: func(self: mat3, rhs: mat3) -> bool; - /// Transforms a 3D vector. - mul-vec3: func(self: mat3, rhs: vec3) -> vec3; - mul: func(p0: mat3, p1: vec3) -> vec3; - /// Creates a 3x3 matrix with its diagonal set to `diagonal` and all other entries set to 0. - from-diagonal: func(diagonal: vec3) -> mat3; - /// Multiplies two 3x3 matrices. - mul-mat3: func(self: mat3, rhs: mat3) -> mat3; - /// Extract Euler angles with the given Euler rotation order. - /// Note if the input matrix contains scales, shears, or other non-rotation transformations then - /// the resulting Euler angles will be ill-defined. - /// # Panics - /// Will panic if any input matrix column is not normalized when `glam_assert` is enabled. - to-euler: func(self: mat3, order: euler-rot) -> tuple; - /// Creates a 3D rotation matrix from `angle` (in radians) around the x axis. - from-rotation-x: func(angle: f32) -> mat3; - div: func(self: mat3, rhs: f32) -> mat3; - /// Creates a right-handed view matrix using a camera position, a focal point and an up - /// direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-rh: func(eye: vec3, center: vec3, up: vec3) -> mat3; - /// Returns the transpose of `self`. - transpose: func(self: mat3) -> mat3; - /// Creates a `[[f32; 3]; 3]` 3D array storing data in column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array-2d: func(self: mat3) -> list>; - /// Takes the absolute value of each element in `self` - abs: func(self: mat3) -> mat3; - mul: func(p0: mat3, p1: f32) -> mat3; - mul: func(p0: mat3, p1: vec3-a) -> vec3-a; - mul: func(self: mat3, rhs: affine2) -> mat3; - mul: func(p0: mat3, p1: affine2) -> mat3; - /// Creates a right-handed view matrix using a facing direction and an up direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - /// # Panics - /// Will panic if `dir` or `up` are not normalized when `glam_assert` is enabled. - look-to-rh: func(dir: vec3, up: vec3) -> mat3; - mul: func(p0: mat3, p1: mat3) -> mat3; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: mat3) -> bool; - /// Creates a `[f32; 9]` array storing data in column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array: func(self: mat3) -> list; - /// Subtracts two 3x3 matrices. - sub-mat3: func(self: mat3, rhs: mat3) -> mat3; - sub: func(self: mat3, rhs: mat3) -> mat3; - /// Returns `true` if, and only if, all elements are finite. - /// If any element is either `NaN`, positive or negative infinity, this will return `false`. - is-finite: func(self: mat3) -> bool; -} - -/// Methods for Mat3A -interface mat3-a { - use types.{reflect-reference}; - - /// Extract Euler angles with the given Euler rotation order. - /// Note if the input matrix contains scales, shears, or other non-rotation transformations then - /// the resulting Euler angles will be ill-defined. - /// # Panics - /// Will panic if any input matrix column is not normalized when `glam_assert` is enabled. - to-euler: func(self: mat3-a, order: euler-rot) -> tuple; - /// Transforms a 3D vector. - mul-vec3: func(self: mat3-a, rhs: vec3) -> vec3; - /// Adds two 3x3 matrices. - add-mat3: func(self: mat3-a, rhs: mat3-a) -> mat3-a; - /// Transforms the given 2D vector as a point. - /// This is the equivalent of multiplying `rhs` as a 3D vector where `z` is `1`. - /// This method assumes that `self` contains a valid affine transform. - /// # Panics - /// Will panic if the 2nd row of `self` is not `(0, 0, 1)` when `glam_assert` is enabled. - transform-point2: func(self: mat3-a, rhs: vec2) -> vec2; - /// Creates an affine transformation matrix from the given non-uniform 2D `scale`. - /// The resulting matrix can be used to transform 2D points and vectors. See - /// [`Self::transform_point2()`] and [`Self::transform_vector2()`]. - /// # Panics - /// Will panic if all elements of `scale` are zero when `glam_assert` is enabled. - from-scale: func(scale: vec2) -> mat3-a; - mul: func(self: mat3-a, rhs: affine2) -> mat3-a; - /// Subtracts two 3x3 matrices. - sub-mat3: func(self: mat3-a, rhs: mat3-a) -> mat3-a; - /// Creates a 3x3 matrix from three column vectors. - from-cols: func(x-axis: vec3-a, y-axis: vec3-a, z-axis: vec3-a) -> mat3-a; - /// Returns `true` if, and only if, all elements are finite. - /// If any element is either `NaN`, positive or negative infinity, this will return `false`. - is-finite: func(self: mat3-a) -> bool; - /// Divides a 3x3 matrix by a scalar. - div-scalar: func(self: mat3-a, rhs: f32) -> mat3-a; - /// Creates a 3D rotation matrix from `angle` (in radians) around the x axis. - from-rotation-x: func(angle: f32) -> mat3-a; - neg: func(self: mat3-a) -> mat3-a; - /// Multiplies a 3x3 matrix by a scalar. - mul-scalar: func(self: mat3-a, rhs: f32) -> mat3-a; - /// Creates a 3D rotation matrix from `angle` (in radians) around the y axis. - from-rotation-y: func(angle: f32) -> mat3-a; - /// Multiplies two 3x3 matrices. - mul-mat3: func(self: mat3-a, rhs: mat3-a) -> mat3-a; - mul: func(p0: mat3-a, p1: mat3-a) -> mat3-a; - /// Creates a right-handed view matrix using a camera position, a focal point and an up - /// direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-rh: func(eye: vec3, center: vec3, up: vec3) -> mat3-a; - mul: func(p0: mat3-a, p1: vec3-a) -> vec3-a; - /// Creates an affine transformation matrix from the given 2D `translation`. - /// The resulting matrix can be used to transform 2D points and vectors. See - /// [`Self::transform_point2()`] and [`Self::transform_vector2()`]. - from-translation: func(translation: vec2) -> mat3-a; - mul: func(p0: mat3-a, p1: vec3) -> vec3; - /// Rotates the given 2D vector. - /// This is the equivalent of multiplying `rhs` as a 3D vector where `z` is `0`. - /// This method assumes that `self` contains a valid affine transform. - /// # Panics - /// Will panic if the 2nd row of `self` is not `(0, 0, 1)` when `glam_assert` is enabled. - transform-vector2: func(self: mat3-a, rhs: vec2) -> vec2; - /// Creates a 3D rotation matrix from the given quaternion. - /// # Panics - /// Will panic if `rotation` is not normalized when `glam_assert` is enabled. - from-quat: func(rotation: quat) -> mat3-a; - /// Creates a 3D rotation matrix from the given euler rotation sequence and the angles (in - /// radians). - from-euler: func(order: euler-rot, a: f32, b: f32, c: f32) -> mat3-a; - sub: func(self: mat3-a, rhs: mat3-a) -> mat3-a; - /// Creates an affine transformation matrix from the given 2x2 matrix. - /// The resulting matrix can be used to transform 2D points and vectors. See - /// [`Self::transform_point2()`] and [`Self::transform_vector2()`]. - from-mat2: func(m: mat2) -> mat3-a; - /// Takes the absolute value of each element in `self` - abs: func(self: mat3-a) -> mat3-a; - /// Creates a left-handed view matrix using a facing direction and an up direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - /// # Panics - /// Will panic if `dir` or `up` are not normalized when `glam_assert` is enabled. - look-to-lh: func(dir: vec3, up: vec3) -> mat3-a; - /// Creates an affine transformation matrix from the given 2D rotation `angle` (in - /// radians). - /// The resulting matrix can be used to transform 2D points and vectors. See - /// [`Self::transform_point2()`] and [`Self::transform_vector2()`]. - from-angle: func(angle: f32) -> mat3-a; - /// Creates a 3x3 matrix with its diagonal set to `diagonal` and all other entries set to 0. - from-diagonal: func(diagonal: vec3) -> mat3-a; - add: func(self: mat3-a, rhs: mat3-a) -> mat3-a; - /// Creates a `[f32; 9]` array storing data in column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array: func(self: mat3-a) -> list; - /// Creates a 3D rotation matrix from `angle` (in radians) around the z axis. - from-rotation-z: func(angle: f32) -> mat3-a; - /// Creates a `[[f32; 3]; 3]` 3D array storing data in column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array-2d: func(self: mat3-a) -> list>; - mul: func(p0: mat3-a, p1: vec3) -> vec3; - as-dmat3: func(self: mat3-a) -> dmat3; - /// Creates a right-handed view matrix using a facing direction and an up direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - /// # Panics - /// Will panic if `dir` or `up` are not normalized when `glam_assert` is enabled. - look-to-rh: func(dir: vec3, up: vec3) -> mat3-a; - /// Returns the matrix column for the given `index`. - /// # Panics - /// Panics if `index` is greater than 2. - col: func(self: mat3-a, index: u64) -> vec3-a; - sub: func(p0: mat3-a, p1: mat3-a) -> mat3-a; - mul: func(p0: mat3-a, p1: f32) -> mat3-a; - /// Returns the determinant of `self`. - determinant: func(self: mat3-a) -> f32; - /// Returns the transpose of `self`. - transpose: func(self: mat3-a) -> mat3-a; - /// Returns true if the absolute difference of all elements between `self` and `rhs` - /// is less than or equal to `max_abs_diff`. - /// This can be used to compare if two matrices contain similar elements. It works best - /// when comparing with a known value. The `max_abs_diff` that should be used used - /// depends on the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: mat3-a, rhs: mat3-a, max-abs-diff: f32) -> bool; - clone: func(self: mat3-a) -> mat3-a; - /// Creates a 3x3 matrix from the minor of the given 4x4 matrix, discarding the `i`th column - /// and `j`th row. - /// # Panics - /// Panics if `i` or `j` is greater than 3. - from-mat4-minor: func(m: mat4, i: u64, j: u64) -> mat3-a; - mul: func(p0: mat3-a, p1: vec3-a) -> vec3-a; - add: func(p0: mat3-a, p1: mat3-a) -> mat3-a; - mul: func(p0: mat3-a, p1: affine2) -> mat3-a; - div: func(self: mat3-a, rhs: f32) -> mat3-a; - eq: func(self: mat3-a, rhs: mat3-a) -> bool; - /// Creates a 3x3 matrix from a 4x4 matrix, discarding the 4th row and column. - from-mat4: func(m: mat4) -> mat3-a; - /// Returns the inverse of `self`. - /// If the matrix is not invertible the returned matrix will be invalid. - /// # Panics - /// Will panic if the determinant of `self` is zero when `glam_assert` is enabled. - inverse: func(self: mat3-a) -> mat3-a; - mul: func(p0: mat3-a, p1: mat3-a) -> mat3-a; - /// Creates a left-handed view matrix using a camera position, a focal point and an up - /// direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-lh: func(eye: vec3, center: vec3, up: vec3) -> mat3-a; - /// Creates a 3D rotation matrix from a normalized rotation `axis` and `angle` (in - /// radians). - /// # Panics - /// Will panic if `axis` is not normalized when `glam_assert` is enabled. - from-axis-angle: func(axis: vec3, angle: f32) -> mat3-a; - /// Creates an affine transformation matrix from the given 2D `scale`, rotation `angle` (in - /// radians) and `translation`. - /// The resulting matrix can be used to transform 2D points and vectors. See - /// [`Self::transform_point2()`] and [`Self::transform_vector2()`]. - from-scale-angle-translation: func(scale: vec2, angle: f32, translation: vec2) -> mat3-a; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: mat3-a) -> bool; - /// Returns the matrix row for the given `index`. - /// # Panics - /// Panics if `index` is greater than 2. - row: func(self: mat3-a, index: u64) -> vec3-a; - /// Transforms a [`Vec3A`]. - mul-vec3a: func(self: mat3-a, rhs: vec3-a) -> vec3-a; -} - -/// Methods for Mat4 -interface mat4 { - use types.{reflect-reference}; - - sub: func(p0: mat4, p1: mat4) -> mat4; - /// Creates a `[[f32; 4]; 4]` 4D array storing data in column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array-2d: func(self: mat4) -> list>; - /// Creates an affine transformation matrix containing a 3D rotation around the z axis of - /// `angle` (in radians). - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - from-rotation-z: func(angle: f32) -> mat4; - /// Multiplies a 4x4 matrix by a scalar. - mul-scalar: func(self: mat4, rhs: f32) -> mat4; - /// Creates an affine transformation matrix from the given 3D `translation`. - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - from-translation: func(translation: vec3) -> mat4; - /// Creates a right-handed perspective projection matrix with `[0,1]` depth range. - /// # Panics - /// Will panic if `z_near` or `z_far` are less than or equal to zero when `glam_assert` is - /// enabled. - frustum-rh: func(left: f32, right: f32, bottom: f32, top: f32, z-near: f32, z-far: f32) -> mat4; - /// Returns the transpose of `self`. - transpose: func(self: mat4) -> mat4; - /// Creates a right-handed perspective projection matrix with [-1,1] depth range. - /// This is the same as the OpenGL `glFrustum` function. - /// See - frustum-rh-gl: func(left: f32, right: f32, bottom: f32, top: f32, z-near: f32, z-far: f32) -> mat4; - /// Creates an affine transformation matrix from the given 3x3 linear transformation - /// matrix. - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - from-mat3a: func(m: mat3-a) -> mat4; - /// Creates a right-handed orthographic projection matrix with `[0,1]` depth range. - /// Useful to map a right-handed coordinate system to the normalized device coordinates that WebGPU/Direct3D/Metal expect. - orthographic-rh: func(left: f32, right: f32, bottom: f32, top: f32, near: f32, far: f32) -> mat4; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: mat4) -> bool; - /// Creates a right-handed perspective projection matrix with `[0,1]` depth range. - /// Useful to map the standard right-handed coordinate system into what WebGPU/Metal/Direct3D expect. - /// # Panics - /// Will panic if `z_near` or `z_far` are less than or equal to zero when `glam_assert` is - /// enabled. - perspective-rh: func(fov-y-radians: f32, aspect-ratio: f32, z-near: f32, z-far: f32) -> mat4; - /// Transforms the give 3D vector as a direction. - /// This is the equivalent of multiplying the 3D vector as a 4D vector where `w` is - /// `0.0`. - /// This method assumes that `self` contains a valid affine transform. - /// # Panics - /// Will panic if the 3rd row of `self` is not `(0, 0, 0, 1)` when `glam_assert` is enabled. - transform-vector3: func(self: mat4, rhs: vec3) -> vec3; - /// Creates an affine transformation matrix containing the given 3D non-uniform `scale`. - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - /// # Panics - /// Will panic if all elements of `scale` are zero when `glam_assert` is enabled. - from-scale: func(scale: vec3) -> mat4; - /// Creates an affine transformation matrix from the given 3x3 linear transformation - /// matrix. - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - from-mat3: func(m: mat3) -> mat4; - add: func(p0: mat4, p1: mat4) -> mat4; - /// Creates an affine transformation matrics from a 3x3 matrix (expressing scale, shear and - /// rotation) and a translation vector. - /// Equivalent to `Mat4::from_translation(translation) * Mat4::from_mat3(mat3)` - from-mat3-translation: func(mat3: mat3, translation: vec3) -> mat4; - eq: func(self: mat4, rhs: mat4) -> bool; - /// Creates an affine transformation matrix containing a 3D rotation around the x axis of - /// `angle` (in radians). - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - from-rotation-x: func(angle: f32) -> mat4; - /// Creates an affine transformation matrix containing a 3D rotation around a normalized - /// rotation `axis` of `angle` (in radians). - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - /// # Panics - /// Will panic if `axis` is not normalized when `glam_assert` is enabled. - from-axis-angle: func(axis: vec3, angle: f32) -> mat4; - /// Returns the matrix column for the given `index`. - /// # Panics - /// Panics if `index` is greater than 3. - col: func(self: mat4, index: u64) -> vec4; - /// Returns the matrix row for the given `index`. - /// # Panics - /// Panics if `index` is greater than 3. - row: func(self: mat4, index: u64) -> vec4; - /// Divides a 4x4 matrix by a scalar. - div-scalar: func(self: mat4, rhs: f32) -> mat4; - /// Creates an affine transformation matrix containing a 3D rotation around the y axis of - /// `angle` (in radians). - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - from-rotation-y: func(angle: f32) -> mat4; - /// Creates an infinite right-handed perspective projection matrix with `[0,1]` depth range. - /// Like `perspective_rh`, but with an infinite value for `z_far`. - /// The result is that points near `z_near` are mapped to depth `0`, and as they move towards infinity the depth approaches `1`. - /// # Panics - /// Will panic if `z_near` or `z_far` are less than or equal to zero when `glam_assert` is - /// enabled. - perspective-infinite-rh: func(fov-y-radians: f32, aspect-ratio: f32, z-near: f32) -> mat4; - mul: func(self: mat4, rhs: affine3-a) -> mat4; - /// Creates a left-handed perspective projection matrix with `[0,1]` depth range. - /// # Panics - /// Will panic if `z_near` or `z_far` are less than or equal to zero when `glam_assert` is - /// enabled. - frustum-lh: func(left: f32, right: f32, bottom: f32, top: f32, z-near: f32, z-far: f32) -> mat4; - /// Creates an infinite reverse left-handed perspective projection matrix with `[0,1]` depth range. - /// Similar to `perspective_infinite_lh`, but maps `Z = z_near` to a depth of `1` and `Z = infinity` to a depth of `0`. - /// # Panics - /// Will panic if `z_near` is less than or equal to zero when `glam_assert` is enabled. - perspective-infinite-reverse-lh: func(fov-y-radians: f32, aspect-ratio: f32, z-near: f32) -> mat4; - /// Returns the inverse of `self`. - /// If the matrix is not invertible the returned matrix will be invalid. - /// # Panics - /// Will panic if the determinant of `self` is zero when `glam_assert` is enabled. - inverse: func(self: mat4) -> mat4; - /// Transforms the given [`Vec3A`] as a 3D point, applying perspective correction. - /// This is the equivalent of multiplying the [`Vec3A`] as a 4D vector where `w` is `1.0`. - /// The perspective divide is performed meaning the resulting 3D vector is divided by `w`. - /// This method assumes that `self` contains a projective transform. - project-point3a: func(self: mat4, rhs: vec3-a) -> vec3-a; - mul: func(p0: mat4, p1: affine3-a) -> mat4; - /// Creates a left-handed orthographic projection matrix with `[0,1]` depth range. - /// Useful to map a left-handed coordinate system to the normalized device coordinates that WebGPU/Direct3D/Metal expect. - orthographic-lh: func(left: f32, right: f32, bottom: f32, top: f32, near: f32, far: f32) -> mat4; - add: func(self: mat4, rhs: mat4) -> mat4; - clone: func(self: mat4) -> mat4; - /// Creates a left-handed perspective projection matrix with `[0,1]` depth range. - /// Useful to map the standard left-handed coordinate system into what WebGPU/Metal/Direct3D expect. - /// # Panics - /// Will panic if `z_near` or `z_far` are less than or equal to zero when `glam_assert` is - /// enabled. - perspective-lh: func(fov-y-radians: f32, aspect-ratio: f32, z-near: f32, z-far: f32) -> mat4; - mul: func(p0: mat4, p1: vec4) -> vec4; - /// Creates a right-handed view matrix using a camera position, a facing direction, and an up - /// direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - /// # Panics - /// Will panic if `dir` or `up` are not normalized when `glam_assert` is enabled. - look-to-rh: func(eye: vec3, dir: vec3, up: vec3) -> mat4; - /// Transforms the give [`Vec3A`] as 3D vector. - /// This is the equivalent of multiplying the [`Vec3A`] as a 4D vector where `w` is `0.0`. - transform-vector3a: func(self: mat4, rhs: vec3-a) -> vec3-a; - as-dmat4: func(self: mat4) -> dmat4; - /// Transforms the given 3D vector as a point, applying perspective correction. - /// This is the equivalent of multiplying the 3D vector as a 4D vector where `w` is `1.0`. - /// The perspective divide is performed meaning the resulting 3D vector is divided by `w`. - /// This method assumes that `self` contains a projective transform. - project-point3: func(self: mat4, rhs: vec3) -> vec3; - /// Creates an infinite left-handed perspective projection matrix with `[0,1]` depth range. - /// Like `perspective_lh`, but with an infinite value for `z_far`. - /// The result is that points near `z_near` are mapped to depth `0`, and as they move towards infinity the depth approaches `1`. - /// # Panics - /// Will panic if `z_near` or `z_far` are less than or equal to zero when `glam_assert` is - /// enabled. - perspective-infinite-lh: func(fov-y-radians: f32, aspect-ratio: f32, z-near: f32) -> mat4; - /// Creates a right-handed view matrix using a camera position, a focal point, and an up - /// direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-rh: func(eye: vec3, center: vec3, up: vec3) -> mat4; - neg: func(self: mat4) -> mat4; - /// Creates a left-handed view matrix using a camera position, a focal points and an up - /// direction. - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-lh: func(eye: vec3, center: vec3, up: vec3) -> mat4; - mul: func(p0: mat4, p1: vec4) -> vec4; - /// Creates an infinite reverse right-handed perspective projection matrix with `[0,1]` depth range. - /// Similar to `perspective_infinite_rh`, but maps `Z = z_near` to a depth of `1` and `Z = infinity` to a depth of `0`. - /// # Panics - /// Will panic if `z_near` is less than or equal to zero when `glam_assert` is enabled. - perspective-infinite-reverse-rh: func(fov-y-radians: f32, aspect-ratio: f32, z-near: f32) -> mat4; - /// Returns the determinant of `self`. - determinant: func(self: mat4) -> f32; - /// Creates a right-handed perspective projection matrix with `[-1,1]` depth range. - /// Useful to map the standard right-handed coordinate system into what OpenGL expects. - /// This is the same as the OpenGL `gluPerspective` function. - /// See - perspective-rh-gl: func(fov-y-radians: f32, aspect-ratio: f32, z-near: f32, z-far: f32) -> mat4; - /// Creates a 4x4 matrix with its diagonal set to `diagonal` and all other entries set to 0. - from-diagonal: func(diagonal: vec4) -> mat4; - div: func(self: mat4, rhs: f32) -> mat4; - /// Returns true if the absolute difference of all elements between `self` and `rhs` - /// is less than or equal to `max_abs_diff`. - /// This can be used to compare if two matrices contain similar elements. It works best - /// when comparing with a known value. The `max_abs_diff` that should be used used - /// depends on the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: mat4, rhs: mat4, max-abs-diff: f32) -> bool; - /// Creates an affine transformation matrix from the given 3D `translation`. - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - /// # Panics - /// Will panic if `rotation` is not normalized when `glam_assert` is enabled. - from-rotation-translation: func(rotation: quat, translation: vec3) -> mat4; - /// Transforms a 4D vector. - mul-vec4: func(self: mat4, rhs: vec4) -> vec4; - /// Adds two 4x4 matrices. - add-mat4: func(self: mat4, rhs: mat4) -> mat4; - /// Transforms the given 3D vector as a point. - /// This is the equivalent of multiplying the 3D vector as a 4D vector where `w` is - /// `1.0`. - /// This method assumes that `self` contains a valid affine transform. It does not perform - /// a perspective divide, if `self` contains a perspective transform, or if you are unsure, - /// the [`Self::project_point3()`] method should be used instead. - /// # Panics - /// Will panic if the 3rd row of `self` is not `(0, 0, 0, 1)` when `glam_assert` is enabled. - transform-point3: func(self: mat4, rhs: vec3) -> vec3; - /// Creates a `[f32; 16]` array storing data in column major order. - /// If you require data in row major order `transpose` the matrix first. - to-cols-array: func(self: mat4) -> list; - /// Creates a right-handed orthographic projection matrix with `[-1,1]` depth - /// range. This is the same as the OpenGL `glOrtho` function in OpenGL. - /// See - /// - /// Useful to map a right-handed coordinate system to the normalized device coordinates that OpenGL expects. - orthographic-rh-gl: func(left: f32, right: f32, bottom: f32, top: f32, near: f32, far: f32) -> mat4; - /// Creates a left-handed view matrix using a camera position, a facing direction and an up - /// direction - /// For a view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - /// # Panics - /// Will panic if `dir` or `up` are not normalized when `glam_assert` is enabled. - look-to-lh: func(eye: vec3, dir: vec3, up: vec3) -> mat4; - /// Multiplies two 4x4 matrices. - mul-mat4: func(self: mat4, rhs: mat4) -> mat4; - /// Creates an affine transformation matrix from the given 3D `scale`, `rotation` and - /// `translation`. - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - /// # Panics - /// Will panic if `rotation` is not normalized when `glam_assert` is enabled. - from-scale-rotation-translation: func(scale: vec3, rotation: quat, translation: vec3) -> mat4; - /// Subtracts two 4x4 matrices. - sub-mat4: func(self: mat4, rhs: mat4) -> mat4; - mul: func(p0: mat4, p1: f32) -> mat4; - /// Creates a affine transformation matrix containing a rotation from the given euler - /// rotation sequence and angles (in radians). - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - from-euler: func(order: euler-rot, a: f32, b: f32, c: f32) -> mat4; - /// Creates a 4x4 matrix from four column vectors. - from-cols: func(x-axis: vec4, y-axis: vec4, z-axis: vec4, w-axis: vec4) -> mat4; - /// Returns `true` if, and only if, all elements are finite. - /// If any element is either `NaN`, positive or negative infinity, this will return `false`. - is-finite: func(self: mat4) -> bool; - /// Creates an affine transformation matrix from the given `rotation` quaternion. - /// The resulting matrix can be used to transform 3D points and vectors. See - /// [`Self::transform_point3()`] and [`Self::transform_vector3()`]. - /// # Panics - /// Will panic if `rotation` is not normalized when `glam_assert` is enabled. - from-quat: func(rotation: quat) -> mat4; - /// Transforms the given [`Vec3A`] as 3D point. - /// This is the equivalent of multiplying the [`Vec3A`] as a 4D vector where `w` is `1.0`. - transform-point3a: func(self: mat4, rhs: vec3-a) -> vec3-a; - /// Takes the absolute value of each element in `self` - abs: func(self: mat4) -> mat4; - sub: func(self: mat4, rhs: mat4) -> mat4; - mul: func(p0: mat4, p1: mat4) -> mat4; - mul: func(p0: mat4, p1: mat4) -> mat4; - /// Extract Euler angles with the given Euler rotation order. - /// Note if the upper 3x3 matrix contain scales, shears, or other non-rotation transformations - /// then the resulting Euler angles will be ill-defined. - /// # Panics - /// Will panic if any column of the upper 3x3 rotation matrix is not normalized when - /// `glam_assert` is enabled. - to-euler: func(self: mat4, order: euler-rot) -> tuple; -} - -/// Methods for Quat -interface quat { - use types.{reflect-reference}; - - /// Multiplies a quaternion and a 3D vector, returning the rotated vector. - /// # Panics - /// Will panic if `self` is not normalized when `glam_assert` is enabled. - mul-vec3: func(self: quat, rhs: vec3) -> vec3; - clone: func(self: quat) -> quat; - /// Create a quaternion for a normalized rotation `axis` and `angle` (in radians). - /// The axis must be a unit vector. - /// # Panics - /// Will panic if `axis` is not normalized when `glam_assert` is enabled. - from-axis-angle: func(axis: vec3, angle: f32) -> quat; - /// Create a quaternion that rotates `v.length()` radians around `v.normalize()`. - /// `from_scaled_axis(Vec3::ZERO)` results in the identity quaternion. - from-scaled-axis: func(v: vec3) -> quat; - eq: func(self: quat, rhs: quat) -> bool; - sub: func(p0: quat, p1: quat) -> quat; - /// `[x, y, z, w]` - to-array: func(self: quat) -> list; - /// Computes the dot product of `self` and `rhs`. The dot product is - /// equal to the cosine of the angle between two quaternion rotations. - dot: func(self: quat, rhs: quat) -> f32; - add: func(self: quat, rhs: quat) -> quat; - /// Divides a quaternion by a scalar value. - /// The quotient is not guaranteed to be normalized. - div: func(self: quat, rhs: f32) -> quat; - /// Computes the squared length of `self`. - /// This is generally faster than `length()` as it avoids a square - /// root operation. - length-squared: func(self: quat) -> f32; - /// Rotates towards `rhs` up to `max_angle` (in radians). - /// When `max_angle` is `0.0`, the result will be equal to `self`. When `max_angle` is equal to - /// `self.angle_between(rhs)`, the result will be equal to `rhs`. If `max_angle` is negative, - /// rotates towards the exact opposite of `rhs`. Will not go past the target. - /// Both quaternions must be normalized. - /// # Panics - /// Will panic if `self` or `rhs` are not normalized when `glam_assert` is enabled. - rotate-towards: func(self: quat, rhs: quat, max-angle: f32) -> quat; - /// Creates a quaternion from the `angle` (in radians) around the x axis. - from-rotation-x: func(angle: f32) -> quat; - mul: func(p0: quat, p1: vec3) -> vec3; - /// Creates a quaterion rotation from a facing direction and an up direction. - /// For a left-handed view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-to-lh: func(dir: vec3, up: vec3) -> quat; - /// Returns `true` if, and only if, all elements are finite. - /// If any element is either `NaN`, positive or negative infinity, this will return `false`. - is-finite: func(self: quat) -> bool; - mul: func(p0: quat, p1: vec3-a) -> vec3-a; - mul: func(self: quat, rhs: quat) -> quat; - add: func(p0: quat, p1: quat) -> quat; - mul: func(p0: quat, p1: quat) -> quat; - /// Creates a left-handed view matrix using a camera position, a focal point, and an up - /// direction. - /// For a left-handed view coordinate system with `+X=right`, `+Y=up` and `+Z=forward`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-lh: func(eye: vec3, center: vec3, up: vec3) -> quat; - /// Gets the minimal rotation for transforming `from` to `to`. The resulting rotation is - /// around the z axis. Will rotate at most 180 degrees. - /// The inputs must be unit vectors. - /// `from_rotation_arc_2d(from, to) * from ≈ to`. - /// For near-singular cases (from≈to and from≈-to) the current implementation - /// is only accurate to about 0.001 (for `f32`). - /// # Panics - /// Will panic if `from` or `to` are not normalized when `glam_assert` is enabled. - from-rotation-arc-2d: func(froma: vec2, toa: vec2) -> quat; - /// Creates a quaternion from a 3x3 SIMD aligned rotation matrix. - /// Note if the input matrix contain scales, shears, or other non-rotation transformations then - /// the resulting quaternion will be ill-defined. - /// # Panics - /// Will panic if any input matrix column is not normalized when `glam_assert` is enabled. - from-mat3a: func(mat: mat3-a) -> quat; - /// Creates a new rotation quaternion. - /// This should generally not be called manually unless you know what you are doing. - /// Use one of the other constructors instead such as `identity` or `from_axis_angle`. - /// `from_xyzw` is mostly used by unit tests and `serde` deserialization. - /// # Preconditions - /// This function does not check if the input is normalized, it is up to the user to - /// provide normalized input or to normalized the resulting quaternion. - from-xyzw: func(x: f32, y: f32, z: f32, w: f32) -> quat; - /// Creates a quaternion from the `angle` (in radians) around the z axis. - from-rotation-z: func(angle: f32) -> quat; - is-near-identity: func(self: quat) -> bool; - as-dquat: func(self: quat) -> dquat; - /// Returns the vector part of the quaternion. - xyz: func(self: quat) -> vec3; - /// Gets the minimal rotation for transforming `from` to `to`. The rotation is in the - /// plane spanned by the two vectors. Will rotate at most 180 degrees. - /// The inputs must be unit vectors. - /// `from_rotation_arc(from, to) * from ≈ to`. - /// For near-singular cases (from≈to and from≈-to) the current implementation - /// is only accurate to about 0.001 (for `f32`). - /// # Panics - /// Will panic if `from` or `to` are not normalized when `glam_assert` is enabled. - from-rotation-arc: func(froma: vec3, toa: vec3) -> quat; - /// Returns whether `self` of length `1.0` or not. - /// Uses a precision threshold of `1e-6`. - is-normalized: func(self: quat) -> bool; - /// Creates a rotation quaternion from an array. - /// # Preconditions - /// This function does not check if the input is normalized, it is up to the user to - /// provide normalized input or to normalized the resulting quaternion. - from-array: func(a: list) -> quat; - mul: func(p0: quat, p1: vec3) -> vec3; - /// Performs a linear interpolation between `self` and `rhs` based on - /// the value `s`. - /// When `s` is `0.0`, the result will be equal to `self`. When `s` - /// is `1.0`, the result will be equal to `rhs`. - /// # Panics - /// Will panic if `self` or `end` are not normalized when `glam_assert` is enabled. - lerp: func(self: quat, end: quat, s: f32) -> quat; - /// Returns the angle (in radians) for the minimal rotation - /// for transforming this quaternion into another. - /// Both quaternions must be normalized. - /// # Panics - /// Will panic if `self` or `rhs` are not normalized when `glam_assert` is enabled. - angle-between: func(self: quat, rhs: quat) -> f32; - /// Creates a new rotation quaternion from a 4D vector. - /// # Preconditions - /// This function does not check if the input is normalized, it is up to the user to - /// provide normalized input or to normalized the resulting quaternion. - from-vec4: func(v: vec4) -> quat; - /// Creates a quaternion from a 3x3 rotation matrix inside a 3D affine transform. - /// Note if the input affine matrix contain scales, shears, or other non-rotation - /// transformations then the resulting quaternion will be ill-defined. - /// # Panics - /// Will panic if any input affine matrix column is not normalized when `glam_assert` is - /// enabled. - from-affine3: func(a: affine3-a) -> quat; - /// Gets the minimal rotation for transforming `from` to either `to` or `-to`. This means - /// that the resulting quaternion will rotate `from` so that it is colinear with `to`. - /// The rotation is in the plane spanned by the two vectors. Will rotate at most 90 - /// degrees. - /// The inputs must be unit vectors. - /// `to.dot(from_rotation_arc_colinear(from, to) * from).abs() ≈ 1`. - /// # Panics - /// Will panic if `from` or `to` are not normalized when `glam_assert` is enabled. - from-rotation-arc-colinear: func(froma: vec3, toa: vec3) -> quat; - /// Creates a quaternion from the `angle` (in radians) around the y axis. - from-rotation-y: func(angle: f32) -> quat; - /// Returns the quaternion conjugate of `self`. For a unit quaternion the - /// conjugate is also the inverse. - conjugate: func(self: quat) -> quat; - sub: func(self: quat, rhs: quat) -> quat; - /// Returns true if the absolute difference of all elements between `self` and `rhs` - /// is less than or equal to `max_abs_diff`. - /// This can be used to compare if two quaternions contain similar elements. It works - /// best when comparing with a known value. The `max_abs_diff` that should be used used - /// depends on the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: quat, rhs: quat, max-abs-diff: f32) -> bool; - /// Creates a quaternion from the upper 3x3 rotation matrix inside a homogeneous 4x4 matrix. - /// Note if the upper 3x3 matrix contain scales, shears, or other non-rotation transformations - /// then the resulting quaternion will be ill-defined. - /// # Panics - /// Will panic if any column of the upper 3x3 rotation matrix is not normalized when - /// `glam_assert` is enabled. - from-mat4: func(mat: mat4) -> quat; - mul: func(p0: quat, p1: vec3-a) -> vec3-a; - /// Creates a quaternion from a 3x3 rotation matrix. - /// Note if the input matrix contain scales, shears, or other non-rotation transformations then - /// the resulting quaternion will be ill-defined. - /// # Panics - /// Will panic if any input matrix column is not normalized when `glam_assert` is enabled. - from-mat3: func(mat: mat3) -> quat; - /// Returns the rotation axis scaled by the rotation in radians. - to-scaled-axis: func(self: quat) -> vec3; - /// Returns `true` if any elements are `NAN`. - is-nan: func(self: quat) -> bool; - neg: func(self: quat) -> quat; - /// Computes `1.0 / length()`. - /// For valid results, `self` must _not_ be of length zero. - length-recip: func(self: quat) -> f32; - /// Returns the inverse of a normalized quaternion. - /// Typically quaternion inverse returns the conjugate of a normalized quaternion. - /// Because `self` is assumed to already be unit length this method *does not* normalize - /// before returning the conjugate. - /// # Panics - /// Will panic if `self` is not normalized when `glam_assert` is enabled. - inverse: func(self: quat) -> quat; - /// Computes the length of `self`. - length: func(self: quat) -> f32; - /// Multiplies a quaternion and a 3D vector, returning the rotated vector. - mul-vec3a: func(self: quat, rhs: vec3-a) -> vec3-a; - /// Multiplies two quaternions. If they each represent a rotation, the result will - /// represent the combined rotation. - /// Note that due to floating point rounding the result may not be perfectly normalized. - /// # Panics - /// Will panic if `self` or `rhs` are not normalized when `glam_assert` is enabled. - mul-quat: func(self: quat, rhs: quat) -> quat; - /// Returns `self` normalized to length 1.0. - /// For valid results, `self` must _not_ be of length zero. - /// Panics - /// Will panic if `self` is zero length when `glam_assert` is enabled. - normalize: func(self: quat) -> quat; - /// Creates a quaterion rotation from facing direction and an up direction. - /// For a right-handed view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - /// # Panics - /// Will panic if `dir` and `up` are not normalized when `glam_assert` is enabled. - look-to-rh: func(dir: vec3, up: vec3) -> quat; - mul: func(p0: quat, p1: f32) -> quat; - /// Returns the rotation angles for the given euler rotation sequence. - to-euler: func(self: quat, order: euler-rot) -> tuple; - /// Creates a right-handed view matrix using a camera position, an up direction, and a focal - /// point. - /// For a right-handed view coordinate system with `+X=right`, `+Y=up` and `+Z=back`. - /// # Panics - /// Will panic if `up` is not normalized when `glam_assert` is enabled. - look-at-rh: func(eye: vec3, center: vec3, up: vec3) -> quat; - /// Creates a quaternion from the given Euler rotation sequence and the angles (in radians). - from-euler: func(euler: euler-rot, a: f32, b: f32, c: f32) -> quat; - /// Performs a spherical linear interpolation between `self` and `end` - /// based on the value `s`. - /// When `s` is `0.0`, the result will be equal to `self`. When `s` - /// is `1.0`, the result will be equal to `end`. - /// # Panics - /// Will panic if `self` or `end` are not normalized when `glam_assert` is enabled. - slerp: func(self: quat, end: quat, s: f32) -> quat; -} - -/// Methods for U16Vec2 -interface u16-vec2 { - use types.{reflect-reference}; - - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: u16-vec2) -> u16; - /// Casts all elements of `self` to `u64`. - as-u64vec2: func(self: u16-vec2) -> u64-vec2; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: u16-vec2, rhs: u16-vec2) -> u16-vec2; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec2, if-true: u16-vec2, if-false: u16-vec2) -> u16-vec2; - /// Converts `self` to `[x, y]` - to-array: func(self: u16-vec2) -> list; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: u16-vec2, rhs: u16-vec2) -> u16-vec2; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: u16-vec2, rhs: u16-vec2) -> bvec2; - mul: func(p0: u16-vec2, p1: u16-vec2) -> u16-vec2; - /// Computes the squared length of `self`. - length-squared: func(self: u16-vec2) -> u16; - /// Casts all elements of `self` to `i32`. - as-ivec2: func(self: u16-vec2) -> ivec2; - /// Creates a 2D vector from `self` with the given value of `y`. - with-y: func(self: u16-vec2, y: u16) -> u16-vec2; - clone: func(self: u16-vec2) -> u16-vec2; - /// Returns a vector containing the wrapping addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_signed(rhs.x), self.y.wrapping_add_signed(rhs.y), ..]`. - wrapping-add-signed: func(self: u16-vec2, rhs: i16-vec2) -> u16-vec2; - add: func(p0: u16-vec2, p1: u16-vec2) -> u16-vec2; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: u16-vec2, rhs: u16-vec2) -> u16-vec2; - /// Casts all elements of `self` to `u8`. - as-u8vec2: func(self: u16-vec2) -> u8-vec2; - rem: func(p0: u16-vec2, p1: u16) -> u16-vec2; - /// Creates a new vector. - new: func(x: u16, y: u16) -> u16-vec2; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: u16-vec2) -> u16; - assert-receiver-is-total-eq: func(self: u16-vec2); - /// Returns the index of the first minimum element of `self`. - min-position: func(self: u16-vec2) -> u64; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: u16-vec2, rhs: u16-vec2) -> u16-vec2; - mul: func(self: u16-vec2, rhs: u16-vec2) -> u16-vec2; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: u16-vec2, rhs: u16-vec2) -> u16-vec2; - /// Creates a 2D vector from `self` with the given value of `x`. - with-x: func(self: u16-vec2, x: u16) -> u16-vec2; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: u16-vec2, rhs: u16-vec2) -> u16-vec2; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u16::MAX`]. - /// See also [`checked_manhattan_distance`][U16Vec2::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: u16-vec2, rhs: u16-vec2) -> u16; - /// Casts all elements of `self` to `i64`. - as-i64vec2: func(self: u16-vec2) -> i64-vec2; - /// Casts all elements of `self` to `u32`. - as-uvec2: func(self: u16-vec2) -> uvec2; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u16::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: u16-vec2, rhs: u16-vec2) -> option; - add: func(self: u16-vec2, rhs: u16-vec2) -> u16-vec2; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: u16-vec2, rhs: u16-vec2) -> u16-vec2; - rem: func(self: u16-vec2, rhs: u16-vec2) -> u16-vec2; - /// Creates a 3D vector from `self` and the given `z` value. - extend: func(self: u16-vec2, z: u16) -> u16-vec3; - mul: func(p0: u16-vec2, p1: u16) -> u16-vec2; - eq: func(self: u16-vec2, other: u16-vec2) -> bool; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: u16-vec2) -> u64; - div: func(self: u16-vec2, rhs: u16-vec2) -> u16-vec2; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: u16-vec2, rhs: u16-vec2) -> u16-vec2; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: u16-vec2, rhs: u16-vec2) -> u16; - sub: func(p0: u16-vec2, p1: u16) -> u16-vec2; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: u16-vec2, rhs: u16-vec2) -> bvec2; - /// Creates a new vector from an array. - from-array: func(a: list) -> u16-vec2; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: u16-vec2, rhs: u16-vec2) -> bvec2; - /// Returns a vector containing the saturating addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.saturating_add_signed(rhs.x), self.y.saturating_add_signed(rhs.y), ..]`. - saturating-add-signed: func(self: u16-vec2, rhs: i16-vec2) -> u16-vec2; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: u16-vec2) -> u16; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: u16-vec2, rhs: u16-vec2) -> bvec2; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: u16-vec2, rhs: u16-vec2) -> u16-vec2; - /// Casts all elements of `self` to `i16`. - as-i16vec2: func(self: u16-vec2) -> i16-vec2; - add: func(p0: u16-vec2, p1: u16) -> u16-vec2; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: u16-vec2, rhs: u16-vec2) -> bvec2; - sub: func(self: u16-vec2, rhs: u16-vec2) -> u16-vec2; - div: func(p0: u16-vec2, p1: u16) -> u16-vec2; - /// Casts all elements of `self` to `f32`. - as-vec2: func(self: u16-vec2) -> vec2; - /// Creates a vector with all elements set to `v`. - splat: func(v: u16) -> u16-vec2; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: u16-vec2) -> u16; - sub: func(p0: u16-vec2, p1: u16-vec2) -> u16-vec2; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: u16-vec2, rhs: u16-vec2) -> u16; - div: func(p0: u16-vec2, p1: u16-vec2) -> u16-vec2; - rem: func(p0: u16-vec2, p1: u16-vec2) -> u16-vec2; - /// Casts all elements of `self` to `i8`. - as-i8vec2: func(self: u16-vec2) -> i8-vec2; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: u16-vec2, rhs: u16-vec2) -> u16-vec2; - /// Casts all elements of `self` to `f64`. - as-dvec2: func(self: u16-vec2) -> dvec2; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: u16-vec2, rhs: u16-vec2) -> bvec2; - /// Component-wise clamping of values, similar to [`u16::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: u16-vec2, min: u16-vec2, max: u16-vec2) -> u16-vec2; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: u16-vec2, rhs: u16-vec2) -> u16-vec2; -} - -/// Methods for U16Vec3 -interface u16-vec3 { - use types.{reflect-reference}; - - /// Computes the dot product of `self` and `rhs`. - dot: func(self: u16-vec3, rhs: u16-vec3) -> u16; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: u16-vec3, rhs: u16-vec3) -> u16-vec3; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: u16-vec3, rhs: u16-vec3) -> bvec3; - /// Computes the squared length of `self`. - length-squared: func(self: u16-vec3) -> u16; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: u16-vec3) -> u64; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: u16-vec3) -> u16; - /// Casts all elements of `self` to `u8`. - as-u8vec3: func(self: u16-vec3) -> u8-vec3; - assert-receiver-is-total-eq: func(self: u16-vec3); - /// Creates a 3D vector from `self` with the given value of `z`. - with-z: func(self: u16-vec3, z: u16) -> u16-vec3; - sub: func(p0: u16-vec3, p1: u16) -> u16-vec3; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: u16-vec3, rhs: u16-vec3) -> u16-vec3; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: u16-vec3, rhs: u16-vec3) -> u16-vec3; - add: func(self: u16-vec3, rhs: u16-vec3) -> u16-vec3; - /// Casts all elements of `self` to `i64`. - as-i64vec3: func(self: u16-vec3) -> i64-vec3; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: u16-vec3) -> u16; - sub: func(p0: u16-vec3, p1: u16-vec3) -> u16-vec3; - /// Returns a vector containing the wrapping addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_signed(rhs.x), self.y.wrapping_add_signed(rhs.y), ..]`. - wrapping-add-signed: func(self: u16-vec3, rhs: i16-vec3) -> u16-vec3; - /// Casts all elements of `self` to `u32`. - as-uvec3: func(self: u16-vec3) -> uvec3; - /// Creates a new vector from an array. - from-array: func(a: list) -> u16-vec3; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: u16-vec3, rhs: u16-vec3) -> u16; - /// Creates a 4D vector from `self` and the given `w` value. - extend: func(self: u16-vec3, w: u16) -> u16-vec4; - /// Casts all elements of `self` to `f32`. - as-vec3a: func(self: u16-vec3) -> vec3-a; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u16::MAX`]. - /// See also [`checked_manhattan_distance`][U16Vec3::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: u16-vec3, rhs: u16-vec3) -> u16; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: u16-vec3, rhs: u16-vec3) -> bvec3; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: u16-vec3) -> u64; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: u16-vec3) -> u16; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: u16-vec3, rhs: u16-vec3) -> u16-vec3; - div: func(self: u16-vec3, rhs: u16-vec3) -> u16-vec3; - /// Casts all elements of `self` to `i8`. - as-i8vec3: func(self: u16-vec3) -> i8-vec3; - /// Returns a vector containing the saturating addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.saturating_add_signed(rhs.x), self.y.saturating_add_signed(rhs.y), ..]`. - saturating-add-signed: func(self: u16-vec3, rhs: i16-vec3) -> u16-vec3; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: u16-vec3, rhs: u16-vec3) -> u16-vec3; - eq: func(self: u16-vec3, other: u16-vec3) -> bool; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: u16-vec3, rhs: u16-vec3) -> bvec3; - /// Creates a 3D vector from `self` with the given value of `x`. - with-x: func(self: u16-vec3, x: u16) -> u16-vec3; - /// Casts all elements of `self` to `i16`. - as-i16vec3: func(self: u16-vec3) -> i16-vec3; - /// Creates a vector with all elements set to `v`. - splat: func(v: u16) -> u16-vec3; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: u16-vec3, rhs: u16-vec3) -> bvec3; - /// Component-wise clamping of values, similar to [`u16::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: u16-vec3, min: u16-vec3, max: u16-vec3) -> u16-vec3; - add: func(p0: u16-vec3, p1: u16) -> u16-vec3; - /// Creates a 2D vector from the `x` and `y` elements of `self`, discarding `z`. - /// Truncation may also be performed by using [`self.xy()`][crate::swizzles::Vec3Swizzles::xy()]. - truncate: func(self: u16-vec3) -> u16-vec2; - rem: func(self: u16-vec3, rhs: u16-vec3) -> u16-vec3; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec3, if-true: u16-vec3, if-false: u16-vec3) -> u16-vec3; - rem: func(p0: u16-vec3, p1: u16) -> u16-vec3; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: u16-vec3, rhs: u16-vec3) -> bvec3; - /// Casts all elements of `self` to `i32`. - as-ivec3: func(self: u16-vec3) -> ivec3; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: u16-vec3, rhs: u16-vec3) -> u16-vec3; - mul: func(p0: u16-vec3, p1: u16-vec3) -> u16-vec3; - /// Casts all elements of `self` to `u64`. - as-u64vec3: func(self: u16-vec3) -> u64-vec3; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u16::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: u16-vec3, rhs: u16-vec3) -> option; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: u16-vec3, rhs: u16-vec3) -> u16-vec3; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: u16-vec3, rhs: u16-vec3) -> u16-vec3; - /// Casts all elements of `self` to `f32`. - as-vec3: func(self: u16-vec3) -> vec3; - /// Creates a new vector. - new: func(x: u16, y: u16, z: u16) -> u16-vec3; - mul: func(self: u16-vec3, rhs: u16-vec3) -> u16-vec3; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: u16-vec3, rhs: u16-vec3) -> u16-vec3; - div: func(p0: u16-vec3, p1: u16) -> u16-vec3; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: u16-vec3) -> u16; - /// Creates a 3D vector from `self` with the given value of `y`. - with-y: func(self: u16-vec3, y: u16) -> u16-vec3; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: u16-vec3, rhs: u16-vec3) -> bvec3; - sub: func(self: u16-vec3, rhs: u16-vec3) -> u16-vec3; - mul: func(p0: u16-vec3, p1: u16) -> u16-vec3; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: u16-vec3, rhs: u16-vec3) -> u16-vec3; - /// Converts `self` to `[x, y, z]` - to-array: func(self: u16-vec3) -> list; - add: func(p0: u16-vec3, p1: u16-vec3) -> u16-vec3; - clone: func(self: u16-vec3) -> u16-vec3; - div: func(p0: u16-vec3, p1: u16-vec3) -> u16-vec3; - /// Casts all elements of `self` to `f64`. - as-dvec3: func(self: u16-vec3) -> dvec3; - /// Computes the cross product of `self` and `rhs`. - cross: func(self: u16-vec3, rhs: u16-vec3) -> u16-vec3; - rem: func(p0: u16-vec3, p1: u16-vec3) -> u16-vec3; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: u16-vec3, rhs: u16-vec3) -> u16-vec3; -} - -/// Methods for U16Vec4 -interface u16-vec4 { - use types.{reflect-reference}; - - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: u16-vec4, rhs: u16-vec4) -> u16-vec4; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: u16-vec4, rhs: u16-vec4) -> u16; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: u16-vec4) -> u16; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: u16-vec4) -> u16; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: u16-vec4, rhs: u16-vec4) -> u16; - rem: func(p0: u16-vec4, p1: u16-vec4) -> u16-vec4; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: u16-vec4) -> u16; - div: func(self: u16-vec4, rhs: u16-vec4) -> u16-vec4; - /// Creates a 4D vector from `self` with the given value of `y`. - with-y: func(self: u16-vec4, y: u16) -> u16-vec4; - mul: func(p0: u16-vec4, p1: u16-vec4) -> u16-vec4; - /// Returns a vector containing the saturating addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.saturating_add_signed(rhs.x), self.y.saturating_add_signed(rhs.y), ..]`. - saturating-add-signed: func(self: u16-vec4, rhs: i16-vec4) -> u16-vec4; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: u16-vec4, rhs: u16-vec4) -> u16-vec4; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: u16-vec4, rhs: u16-vec4) -> bvec4; - /// Casts all elements of `self` to `i8`. - as-i8vec4: func(self: u16-vec4) -> i8-vec4; - mul: func(self: u16-vec4, rhs: u16-vec4) -> u16-vec4; - /// Component-wise clamping of values, similar to [`u16::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: u16-vec4, min: u16-vec4, max: u16-vec4) -> u16-vec4; - add: func(self: u16-vec4, rhs: u16-vec4) -> u16-vec4; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: u16-vec4, rhs: u16-vec4) -> u16-vec4; - sub: func(p0: u16-vec4, p1: u16) -> u16-vec4; - /// Casts all elements of `self` to `u8`. - as-u8vec4: func(self: u16-vec4) -> u8-vec4; - /// Creates a 3D vector from the `x`, `y` and `z` elements of `self`, discarding `w`. - /// Truncation to [`U16Vec3`] may also be performed by using [`self.xyz()`][crate::swizzles::Vec4Swizzles::xyz()]. - truncate: func(self: u16-vec4) -> u16-vec3; - add: func(p0: u16-vec4, p1: u16-vec4) -> u16-vec4; - /// Casts all elements of `self` to `i32`. - as-ivec4: func(self: u16-vec4) -> ivec4; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: u16-vec4, rhs: u16-vec4) -> bvec4; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: u16-vec4, rhs: u16-vec4) -> bvec4; - div: func(p0: u16-vec4, p1: u16) -> u16-vec4; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: u16-vec4, rhs: u16-vec4) -> u16-vec4; - sub: func(self: u16-vec4, rhs: u16-vec4) -> u16-vec4; - eq: func(self: u16-vec4, other: u16-vec4) -> bool; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: u16-vec4, rhs: u16-vec4) -> u16-vec4; - rem: func(self: u16-vec4, rhs: u16-vec4) -> u16-vec4; - add: func(p0: u16-vec4, p1: u16) -> u16-vec4; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: u16-vec4, rhs: u16-vec4) -> u16-vec4; - /// Casts all elements of `self` to `f64`. - as-dvec4: func(self: u16-vec4) -> dvec4; - assert-receiver-is-total-eq: func(self: u16-vec4); - /// Casts all elements of `self` to `i16`. - as-i16vec4: func(self: u16-vec4) -> i16-vec4; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: u16-vec4, rhs: u16-vec4) -> u16-vec4; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: u16-vec4) -> u64; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: u16-vec4, rhs: u16-vec4) -> u16-vec4; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: u16-vec4, rhs: u16-vec4) -> bvec4; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u16::MAX`]. - /// See also [`checked_manhattan_distance`][U16Vec4::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: u16-vec4, rhs: u16-vec4) -> u16; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u16::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: u16-vec4, rhs: u16-vec4) -> option; - /// Creates a vector with all elements set to `v`. - splat: func(v: u16) -> u16-vec4; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: u16-vec4, rhs: u16-vec4) -> u16-vec4; - sub: func(p0: u16-vec4, p1: u16-vec4) -> u16-vec4; - /// Casts all elements of `self` to `u32`. - as-uvec4: func(self: u16-vec4) -> uvec4; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: u16-vec4, rhs: u16-vec4) -> bvec4; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec4, if-true: u16-vec4, if-false: u16-vec4) -> u16-vec4; - /// Casts all elements of `self` to `u64`. - as-u64vec4: func(self: u16-vec4) -> u64-vec4; - /// Creates a new vector from an array. - from-array: func(a: list) -> u16-vec4; - rem: func(p0: u16-vec4, p1: u16) -> u16-vec4; - /// Computes the squared length of `self`. - length-squared: func(self: u16-vec4) -> u16; - /// Converts `self` to `[x, y, z, w]` - to-array: func(self: u16-vec4) -> list; - div: func(p0: u16-vec4, p1: u16-vec4) -> u16-vec4; - /// Casts all elements of `self` to `f32`. - as-vec4: func(self: u16-vec4) -> vec4; - mul: func(p0: u16-vec4, p1: u16) -> u16-vec4; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: u16-vec4) -> u64; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: u16-vec4, rhs: u16-vec4) -> bvec4; - /// Returns a vector containing the wrapping addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_signed(rhs.x), self.y.wrapping_add_signed(rhs.y), ..]`. - wrapping-add-signed: func(self: u16-vec4, rhs: i16-vec4) -> u16-vec4; - /// Creates a new vector. - new: func(x: u16, y: u16, z: u16, w: u16) -> u16-vec4; - /// Creates a 4D vector from `self` with the given value of `x`. - with-x: func(self: u16-vec4, x: u16) -> u16-vec4; - clone: func(self: u16-vec4) -> u16-vec4; - /// Creates a 4D vector from `self` with the given value of `w`. - with-w: func(self: u16-vec4, w: u16) -> u16-vec4; - /// Casts all elements of `self` to `i64`. - as-i64vec4: func(self: u16-vec4) -> i64-vec4; - /// Creates a 4D vector from `self` with the given value of `z`. - with-z: func(self: u16-vec4, z: u16) -> u16-vec4; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: u16-vec4, rhs: u16-vec4) -> u16-vec4; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: u16-vec4, rhs: u16-vec4) -> u16-vec4; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: u16-vec4) -> u16; -} - -/// Methods for U64Vec2 -interface u64-vec2 { - use types.{reflect-reference}; - - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: u64-vec2) -> u64; - sub: func(self: u64-vec2, rhs: u64-vec2) -> u64-vec2; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: u64-vec2, rhs: u64-vec2) -> u64-vec2; - /// Casts all elements of `self` to `i64`. - as-i64vec2: func(self: u64-vec2) -> i64-vec2; - /// Casts all elements of `self` to `u16`. - as-u16vec2: func(self: u64-vec2) -> u16-vec2; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: u64-vec2, rhs: u64-vec2) -> u64; - /// Creates a new vector from an array. - from-array: func(a: list) -> u64-vec2; - /// Casts all elements of `self` to `f64`. - as-dvec2: func(self: u64-vec2) -> dvec2; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: u64-vec2, rhs: u64-vec2) -> u64-vec2; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: u64-vec2, rhs: u64-vec2) -> bvec2; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: u64-vec2, rhs: u64-vec2) -> u64-vec2; - add: func(p0: u64-vec2, p1: u64) -> u64-vec2; - mul: func(p0: u64-vec2, p1: u64) -> u64-vec2; - div: func(self: u64-vec2, rhs: u64-vec2) -> u64-vec2; - /// Casts all elements of `self` to `i16`. - as-i16vec2: func(self: u64-vec2) -> i16-vec2; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: u64-vec2) -> u64; - /// Returns a vector containing the saturating addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.saturating_add_signed(rhs.x), self.y.saturating_add_signed(rhs.y), ..]`. - saturating-add-signed: func(self: u64-vec2, rhs: i64-vec2) -> u64-vec2; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u64::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: u64-vec2, rhs: u64-vec2) -> option; - /// Converts `self` to `[x, y]` - to-array: func(self: u64-vec2) -> list; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: u64-vec2, rhs: u64-vec2) -> u64-vec2; - /// Casts all elements of `self` to `u8`. - as-u8vec2: func(self: u64-vec2) -> u8-vec2; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: u64-vec2) -> u64; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: u64-vec2, rhs: u64-vec2) -> u64-vec2; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: u64-vec2, rhs: u64-vec2) -> u64-vec2; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: u64-vec2, rhs: u64-vec2) -> bvec2; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u64::MAX`]. - /// See also [`checked_manhattan_distance`][U64Vec2::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: u64-vec2, rhs: u64-vec2) -> u64; - add: func(p0: u64-vec2, p1: u64-vec2) -> u64-vec2; - /// Creates a vector with all elements set to `v`. - splat: func(v: u64) -> u64-vec2; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: u64-vec2, rhs: u64-vec2) -> u64; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: u64-vec2, rhs: u64-vec2) -> bvec2; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: u64-vec2, rhs: u64-vec2) -> u64-vec2; - rem: func(p0: u64-vec2, p1: u64) -> u64-vec2; - /// Computes the squared length of `self`. - length-squared: func(self: u64-vec2) -> u64; - assert-receiver-is-total-eq: func(self: u64-vec2); - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: u64-vec2, rhs: u64-vec2) -> u64-vec2; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: u64-vec2) -> u64; - mul: func(self: u64-vec2, rhs: u64-vec2) -> u64-vec2; - /// Creates a 2D vector from `self` with the given value of `y`. - with-y: func(self: u64-vec2, y: u64) -> u64-vec2; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: u64-vec2, rhs: u64-vec2) -> u64-vec2; - rem: func(self: u64-vec2, rhs: u64-vec2) -> u64-vec2; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: u64-vec2, rhs: u64-vec2) -> bvec2; - div: func(p0: u64-vec2, p1: u64) -> u64-vec2; - sub: func(p0: u64-vec2, p1: u64) -> u64-vec2; - /// Creates a 3D vector from `self` and the given `z` value. - extend: func(self: u64-vec2, z: u64) -> u64-vec3; - /// Casts all elements of `self` to `u32`. - as-uvec2: func(self: u64-vec2) -> uvec2; - /// Casts all elements of `self` to `f32`. - as-vec2: func(self: u64-vec2) -> vec2; - div: func(p0: u64-vec2, p1: u64-vec2) -> u64-vec2; - clone: func(self: u64-vec2) -> u64-vec2; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: u64-vec2, rhs: u64-vec2) -> u64-vec2; - rem: func(p0: u64-vec2, p1: u64-vec2) -> u64-vec2; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: u64-vec2, rhs: u64-vec2) -> u64-vec2; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec2, if-true: u64-vec2, if-false: u64-vec2) -> u64-vec2; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: u64-vec2) -> u64; - mul: func(p0: u64-vec2, p1: u64-vec2) -> u64-vec2; - /// Casts all elements of `self` to `i8`. - as-i8vec2: func(self: u64-vec2) -> i8-vec2; - /// Casts all elements of `self` to `i32`. - as-ivec2: func(self: u64-vec2) -> ivec2; - sub: func(p0: u64-vec2, p1: u64-vec2) -> u64-vec2; - /// Creates a 2D vector from `self` with the given value of `x`. - with-x: func(self: u64-vec2, x: u64) -> u64-vec2; - /// Component-wise clamping of values, similar to [`u64::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: u64-vec2, min: u64-vec2, max: u64-vec2) -> u64-vec2; - /// Returns a vector containing the wrapping addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_signed(rhs.x), self.y.wrapping_add_signed(rhs.y), ..]`. - wrapping-add-signed: func(self: u64-vec2, rhs: i64-vec2) -> u64-vec2; - add: func(self: u64-vec2, rhs: u64-vec2) -> u64-vec2; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: u64-vec2, rhs: u64-vec2) -> bvec2; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: u64-vec2, rhs: u64-vec2) -> bvec2; - eq: func(self: u64-vec2, other: u64-vec2) -> bool; - /// Creates a new vector. - new: func(x: u64, y: u64) -> u64-vec2; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: u64-vec2) -> u64; -} - -/// Methods for U64Vec3 -interface u64-vec3 { - use types.{reflect-reference}; - - /// Component-wise clamping of values, similar to [`u64::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: u64-vec3, min: u64-vec3, max: u64-vec3) -> u64-vec3; - mul: func(self: u64-vec3, rhs: u64-vec3) -> u64-vec3; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: u64-vec3, rhs: u64-vec3) -> bvec3; - /// Casts all elements of `self` to `i8`. - as-i8vec3: func(self: u64-vec3) -> i8-vec3; - mul: func(p0: u64-vec3, p1: u64) -> u64-vec3; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: u64-vec3, rhs: u64-vec3) -> bvec3; - /// Computes the cross product of `self` and `rhs`. - cross: func(self: u64-vec3, rhs: u64-vec3) -> u64-vec3; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: u64-vec3, rhs: u64-vec3) -> u64-vec3; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: u64-vec3) -> u64; - /// Casts all elements of `self` to `u32`. - as-uvec3: func(self: u64-vec3) -> uvec3; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: u64-vec3, rhs: u64-vec3) -> u64-vec3; - /// Creates a 2D vector from the `x` and `y` elements of `self`, discarding `z`. - /// Truncation may also be performed by using [`self.xy()`][crate::swizzles::Vec3Swizzles::xy()]. - truncate: func(self: u64-vec3) -> u64-vec2; - rem: func(p0: u64-vec3, p1: u64-vec3) -> u64-vec3; - /// Creates a 3D vector from `self` with the given value of `x`. - with-x: func(self: u64-vec3, x: u64) -> u64-vec3; - /// Casts all elements of `self` to `i16`. - as-i16vec3: func(self: u64-vec3) -> i16-vec3; - /// Casts all elements of `self` to `f64`. - as-dvec3: func(self: u64-vec3) -> dvec3; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: u64-vec3, rhs: u64-vec3) -> bvec3; - sub: func(p0: u64-vec3, p1: u64-vec3) -> u64-vec3; - /// Returns a vector containing the wrapping addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_signed(rhs.x), self.y.wrapping_add_signed(rhs.y), ..]`. - wrapping-add-signed: func(self: u64-vec3, rhs: i64-vec3) -> u64-vec3; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: u64-vec3, rhs: u64-vec3) -> u64-vec3; - /// Creates a new vector from an array. - from-array: func(a: list) -> u64-vec3; - clone: func(self: u64-vec3) -> u64-vec3; - div: func(p0: u64-vec3, p1: u64) -> u64-vec3; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: u64-vec3, rhs: u64-vec3) -> bvec3; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: u64-vec3) -> u64; - /// Casts all elements of `self` to `f32`. - as-vec3a: func(self: u64-vec3) -> vec3-a; - assert-receiver-is-total-eq: func(self: u64-vec3); - /// Computes the squared length of `self`. - length-squared: func(self: u64-vec3) -> u64; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: u64-vec3, rhs: u64-vec3) -> bvec3; - sub: func(self: u64-vec3, rhs: u64-vec3) -> u64-vec3; - /// Casts all elements of `self` to `i64`. - as-i64vec3: func(self: u64-vec3) -> i64-vec3; - /// Casts all elements of `self` to `u16`. - as-u16vec3: func(self: u64-vec3) -> u16-vec3; - add: func(p0: u64-vec3, p1: u64) -> u64-vec3; - add: func(p0: u64-vec3, p1: u64-vec3) -> u64-vec3; - /// Creates a 3D vector from `self` with the given value of `y`. - with-y: func(self: u64-vec3, y: u64) -> u64-vec3; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u64::MAX`]. - /// See also [`checked_manhattan_distance`][U64Vec3::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: u64-vec3, rhs: u64-vec3) -> u64; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u64::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: u64-vec3, rhs: u64-vec3) -> option; - sub: func(p0: u64-vec3, p1: u64) -> u64-vec3; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: u64-vec3, rhs: u64-vec3) -> u64; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: u64-vec3, rhs: u64-vec3) -> u64-vec3; - eq: func(self: u64-vec3, other: u64-vec3) -> bool; - /// Casts all elements of `self` to `u8`. - as-u8vec3: func(self: u64-vec3) -> u8-vec3; - /// Creates a new vector. - new: func(x: u64, y: u64, z: u64) -> u64-vec3; - /// Creates a 4D vector from `self` and the given `w` value. - extend: func(self: u64-vec3, w: u64) -> u64-vec4; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: u64-vec3) -> u64; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec3, if-true: u64-vec3, if-false: u64-vec3) -> u64-vec3; - rem: func(self: u64-vec3, rhs: u64-vec3) -> u64-vec3; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: u64-vec3, rhs: u64-vec3) -> u64-vec3; - /// Converts `self` to `[x, y, z]` - to-array: func(self: u64-vec3) -> list; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: u64-vec3, rhs: u64-vec3) -> u64-vec3; - /// Returns a vector containing the saturating addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.saturating_add_signed(rhs.x), self.y.saturating_add_signed(rhs.y), ..]`. - saturating-add-signed: func(self: u64-vec3, rhs: i64-vec3) -> u64-vec3; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: u64-vec3) -> u64; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: u64-vec3) -> u64; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: u64-vec3, rhs: u64-vec3) -> u64-vec3; - /// Casts all elements of `self` to `i32`. - as-ivec3: func(self: u64-vec3) -> ivec3; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: u64-vec3, rhs: u64-vec3) -> bvec3; - div: func(self: u64-vec3, rhs: u64-vec3) -> u64-vec3; - add: func(self: u64-vec3, rhs: u64-vec3) -> u64-vec3; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: u64-vec3, rhs: u64-vec3) -> u64-vec3; - /// Creates a vector with all elements set to `v`. - splat: func(v: u64) -> u64-vec3; - div: func(p0: u64-vec3, p1: u64-vec3) -> u64-vec3; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: u64-vec3, rhs: u64-vec3) -> u64-vec3; - mul: func(p0: u64-vec3, p1: u64-vec3) -> u64-vec3; - /// Casts all elements of `self` to `f32`. - as-vec3: func(self: u64-vec3) -> vec3; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: u64-vec3, rhs: u64-vec3) -> u64-vec3; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: u64-vec3) -> u64; - /// Creates a 3D vector from `self` with the given value of `z`. - with-z: func(self: u64-vec3, z: u64) -> u64-vec3; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: u64-vec3, rhs: u64-vec3) -> u64-vec3; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: u64-vec3, rhs: u64-vec3) -> u64; - rem: func(p0: u64-vec3, p1: u64) -> u64-vec3; -} - -/// Methods for U64Vec4 -interface u64-vec4 { - use types.{reflect-reference}; - - /// Creates a 3D vector from the `x`, `y` and `z` elements of `self`, discarding `w`. - /// Truncation to [`U64Vec3`] may also be performed by using [`self.xyz()`][crate::swizzles::Vec4Swizzles::xyz()]. - truncate: func(self: u64-vec4) -> u64-vec3; - /// Casts all elements of `self` to `f64`. - as-dvec4: func(self: u64-vec4) -> dvec4; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: u64-vec4, rhs: u64-vec4) -> u64-vec4; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: u64-vec4, rhs: u64-vec4) -> bvec4; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: u64-vec4, rhs: u64-vec4) -> u64-vec4; - /// Computes the squared length of `self`. - length-squared: func(self: u64-vec4) -> u64; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: u64-vec4, rhs: u64-vec4) -> u64-vec4; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u64::MAX`]. - /// See also [`checked_manhattan_distance`][U64Vec4::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: u64-vec4, rhs: u64-vec4) -> u64; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: u64-vec4, rhs: u64-vec4) -> u64-vec4; - /// Casts all elements of `self` to `i16`. - as-i16vec4: func(self: u64-vec4) -> i16-vec4; - /// Casts all elements of `self` to `i64`. - as-i64vec4: func(self: u64-vec4) -> i64-vec4; - /// Casts all elements of `self` to `u16`. - as-u16vec4: func(self: u64-vec4) -> u16-vec4; - mul: func(self: u64-vec4, rhs: u64-vec4) -> u64-vec4; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: u64-vec4, rhs: u64-vec4) -> u64-vec4; - div: func(self: u64-vec4, rhs: u64-vec4) -> u64-vec4; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: u64-vec4) -> u64; - /// Casts all elements of `self` to `u8`. - as-u8vec4: func(self: u64-vec4) -> u8-vec4; - assert-receiver-is-total-eq: func(self: u64-vec4); - /// Creates a new vector from an array. - from-array: func(a: list) -> u64-vec4; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: u64-vec4, rhs: u64-vec4) -> bvec4; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec4, if-true: u64-vec4, if-false: u64-vec4) -> u64-vec4; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: u64-vec4, rhs: u64-vec4) -> u64-vec4; - div: func(p0: u64-vec4, p1: u64-vec4) -> u64-vec4; - /// Casts all elements of `self` to `i32`. - as-ivec4: func(self: u64-vec4) -> ivec4; - /// Casts all elements of `self` to `u32`. - as-uvec4: func(self: u64-vec4) -> uvec4; - add: func(p0: u64-vec4, p1: u64) -> u64-vec4; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: u64-vec4, rhs: u64-vec4) -> u64-vec4; - eq: func(self: u64-vec4, other: u64-vec4) -> bool; - /// Creates a 4D vector from `self` with the given value of `x`. - with-x: func(self: u64-vec4, x: u64) -> u64-vec4; - /// Creates a 4D vector from `self` with the given value of `w`. - with-w: func(self: u64-vec4, w: u64) -> u64-vec4; - /// Casts all elements of `self` to `i8`. - as-i8vec4: func(self: u64-vec4) -> i8-vec4; - /// Creates a 4D vector from `self` with the given value of `y`. - with-y: func(self: u64-vec4, y: u64) -> u64-vec4; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: u64-vec4) -> u64; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: u64-vec4) -> u64; - /// Creates a vector with all elements set to `v`. - splat: func(v: u64) -> u64-vec4; - /// Returns a vector containing the wrapping addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_signed(rhs.x), self.y.wrapping_add_signed(rhs.y), ..]`. - wrapping-add-signed: func(self: u64-vec4, rhs: i64-vec4) -> u64-vec4; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: u64-vec4, rhs: u64-vec4) -> bvec4; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: u64-vec4, rhs: u64-vec4) -> bvec4; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: u64-vec4) -> u64; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: u64-vec4, rhs: u64-vec4) -> u64; - sub: func(p0: u64-vec4, p1: u64-vec4) -> u64-vec4; - rem: func(p0: u64-vec4, p1: u64-vec4) -> u64-vec4; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: u64-vec4) -> u64; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: u64-vec4, rhs: u64-vec4) -> u64-vec4; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u64::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: u64-vec4, rhs: u64-vec4) -> option; - div: func(p0: u64-vec4, p1: u64) -> u64-vec4; - add: func(self: u64-vec4, rhs: u64-vec4) -> u64-vec4; - rem: func(p0: u64-vec4, p1: u64) -> u64-vec4; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: u64-vec4, rhs: u64-vec4) -> bvec4; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: u64-vec4, rhs: u64-vec4) -> u64; - mul: func(p0: u64-vec4, p1: u64) -> u64-vec4; - /// Creates a 4D vector from `self` with the given value of `z`. - with-z: func(self: u64-vec4, z: u64) -> u64-vec4; - /// Casts all elements of `self` to `f32`. - as-vec4: func(self: u64-vec4) -> vec4; - /// Returns a vector containing the saturating addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.saturating_add_signed(rhs.x), self.y.saturating_add_signed(rhs.y), ..]`. - saturating-add-signed: func(self: u64-vec4, rhs: i64-vec4) -> u64-vec4; - /// Component-wise clamping of values, similar to [`u64::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: u64-vec4, min: u64-vec4, max: u64-vec4) -> u64-vec4; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: u64-vec4, rhs: u64-vec4) -> bvec4; - mul: func(p0: u64-vec4, p1: u64-vec4) -> u64-vec4; - sub: func(p0: u64-vec4, p1: u64) -> u64-vec4; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: u64-vec4, rhs: u64-vec4) -> u64-vec4; - clone: func(self: u64-vec4) -> u64-vec4; - sub: func(self: u64-vec4, rhs: u64-vec4) -> u64-vec4; - add: func(p0: u64-vec4, p1: u64-vec4) -> u64-vec4; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: u64-vec4) -> u64; - rem: func(self: u64-vec4, rhs: u64-vec4) -> u64-vec4; - /// Creates a new vector. - new: func(x: u64, y: u64, z: u64, w: u64) -> u64-vec4; - /// Converts `self` to `[x, y, z, w]` - to-array: func(self: u64-vec4) -> list; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: u64-vec4, rhs: u64-vec4) -> u64-vec4; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: u64-vec4, rhs: u64-vec4) -> u64-vec4; -} - -/// Methods for U8Vec2 -interface u8-vec2 { - use types.{reflect-reference}; - - assert-receiver-is-total-eq: func(self: u8-vec2); - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: u8-vec2, rhs: u8-vec2) -> u8-vec2; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: u8-vec2, rhs: u8-vec2) -> bvec2; - /// Creates a 2D vector from `self` with the given value of `x`. - with-x: func(self: u8-vec2, x: u8) -> u8-vec2; - /// Casts all elements of `self` to `u64`. - as-u64vec2: func(self: u8-vec2) -> u64-vec2; - /// Casts all elements of `self` to `i16`. - as-i16vec2: func(self: u8-vec2) -> i16-vec2; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: u8-vec2, rhs: u8-vec2) -> bvec2; - sub: func(p0: u8-vec2, p1: u8-vec2) -> u8-vec2; - /// Component-wise clamping of values, similar to [`u8::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: u8-vec2, min: u8-vec2, max: u8-vec2) -> u8-vec2; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: u8-vec2, rhs: u8-vec2) -> bvec2; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: u8-vec2, rhs: u8-vec2) -> u8-vec2; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: u8-vec2, rhs: u8-vec2) -> u8-vec2; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: u8-vec2) -> u8; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: u8-vec2, rhs: u8-vec2) -> bvec2; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec2, if-true: u8-vec2, if-false: u8-vec2) -> u8-vec2; - /// Creates a 2D vector from `self` with the given value of `y`. - with-y: func(self: u8-vec2, y: u8) -> u8-vec2; - /// Casts all elements of `self` to `u16`. - as-u16vec2: func(self: u8-vec2) -> u16-vec2; - rem: func(p0: u8-vec2, p1: u8-vec2) -> u8-vec2; - mul: func(p0: u8-vec2, p1: u8-vec2) -> u8-vec2; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u8::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: u8-vec2, rhs: u8-vec2) -> option; - clone: func(self: u8-vec2) -> u8-vec2; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: u8-vec2, rhs: u8-vec2) -> u8-vec2; - /// Casts all elements of `self` to `f32`. - as-vec2: func(self: u8-vec2) -> vec2; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: u8-vec2, rhs: u8-vec2) -> bvec2; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: u8-vec2) -> u8; - div: func(self: u8-vec2, rhs: u8-vec2) -> u8-vec2; - /// Returns a vector containing the saturating addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.saturating_add_signed(rhs.x), self.y.saturating_add_signed(rhs.y), ..]`. - saturating-add-signed: func(self: u8-vec2, rhs: i8-vec2) -> u8-vec2; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: u8-vec2, rhs: u8-vec2) -> u8; - /// Casts all elements of `self` to `u32`. - as-uvec2: func(self: u8-vec2) -> uvec2; - /// Converts `self` to `[x, y]` - to-array: func(self: u8-vec2) -> list; - add: func(p0: u8-vec2, p1: u8) -> u8-vec2; - /// Casts all elements of `self` to `i8`. - as-i8vec2: func(self: u8-vec2) -> i8-vec2; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: u8-vec2, rhs: u8-vec2) -> bvec2; - /// Returns a vector containing the wrapping addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_signed(rhs.x), self.y.wrapping_add_signed(rhs.y), ..]`. - wrapping-add-signed: func(self: u8-vec2, rhs: i8-vec2) -> u8-vec2; - add: func(self: u8-vec2, rhs: u8-vec2) -> u8-vec2; - add: func(p0: u8-vec2, p1: u8-vec2) -> u8-vec2; - div: func(p0: u8-vec2, p1: u8-vec2) -> u8-vec2; - /// Computes the squared length of `self`. - length-squared: func(self: u8-vec2) -> u8; - /// Casts all elements of `self` to `i64`. - as-i64vec2: func(self: u8-vec2) -> i64-vec2; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u8::MAX`]. - /// See also [`checked_manhattan_distance`][U8Vec2::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: u8-vec2, rhs: u8-vec2) -> u8; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: u8-vec2) -> u64; - /// Creates a 3D vector from `self` and the given `z` value. - extend: func(self: u8-vec2, z: u8) -> u8-vec3; - /// Creates a new vector from an array. - from-array: func(a: list) -> u8-vec2; - rem: func(p0: u8-vec2, p1: u8) -> u8-vec2; - rem: func(self: u8-vec2, rhs: u8-vec2) -> u8-vec2; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: u8-vec2, rhs: u8-vec2) -> u8-vec2; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: u8-vec2) -> u64; - mul: func(self: u8-vec2, rhs: u8-vec2) -> u8-vec2; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: u8-vec2, rhs: u8-vec2) -> u8-vec2; - /// Casts all elements of `self` to `i32`. - as-ivec2: func(self: u8-vec2) -> ivec2; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: u8-vec2, rhs: u8-vec2) -> u8-vec2; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: u8-vec2) -> u8; - mul: func(p0: u8-vec2, p1: u8) -> u8-vec2; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: u8-vec2, rhs: u8-vec2) -> u8; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: u8-vec2, rhs: u8-vec2) -> u8-vec2; - /// Creates a new vector. - new: func(x: u8, y: u8) -> u8-vec2; - eq: func(self: u8-vec2, other: u8-vec2) -> bool; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: u8-vec2) -> u8; - sub: func(self: u8-vec2, rhs: u8-vec2) -> u8-vec2; - /// Casts all elements of `self` to `f64`. - as-dvec2: func(self: u8-vec2) -> dvec2; - sub: func(p0: u8-vec2, p1: u8) -> u8-vec2; - /// Creates a vector with all elements set to `v`. - splat: func(v: u8) -> u8-vec2; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: u8-vec2, rhs: u8-vec2) -> u8-vec2; - div: func(p0: u8-vec2, p1: u8) -> u8-vec2; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: u8-vec2, rhs: u8-vec2) -> u8-vec2; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: u8-vec2, rhs: u8-vec2) -> u8-vec2; -} - -/// Methods for U8Vec3 -interface u8-vec3 { - use types.{reflect-reference}; - - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: u8-vec3, rhs: u8-vec3) -> u8-vec3; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: u8-vec3, rhs: u8-vec3) -> bvec3; - /// Creates a new vector from an array. - from-array: func(a: list) -> u8-vec3; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: u8-vec3, rhs: u8-vec3) -> u8; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u8::MAX`]. - /// See also [`checked_manhattan_distance`][U8Vec3::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: u8-vec3, rhs: u8-vec3) -> u8; - div: func(p0: u8-vec3, p1: u8-vec3) -> u8-vec3; - mul: func(self: u8-vec3, rhs: u8-vec3) -> u8-vec3; - add: func(p0: u8-vec3, p1: u8-vec3) -> u8-vec3; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: u8-vec3) -> u8; - /// Casts all elements of `self` to `u16`. - as-u16vec3: func(self: u8-vec3) -> u16-vec3; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: u8-vec3, rhs: u8-vec3) -> u8-vec3; - /// Creates a 2D vector from the `x` and `y` elements of `self`, discarding `z`. - /// Truncation may also be performed by using [`self.xy()`][crate::swizzles::Vec3Swizzles::xy()]. - truncate: func(self: u8-vec3) -> u8-vec2; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: u8-vec3, rhs: u8-vec3) -> bvec3; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: u8-vec3, rhs: u8-vec3) -> u8-vec3; - /// Casts all elements of `self` to `u64`. - as-u64vec3: func(self: u8-vec3) -> u64-vec3; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: u8-vec3, rhs: u8-vec3) -> u8-vec3; - /// Computes the squared length of `self`. - length-squared: func(self: u8-vec3) -> u8; - /// Casts all elements of `self` to `f32`. - as-vec3: func(self: u8-vec3) -> vec3; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec3, if-true: u8-vec3, if-false: u8-vec3) -> u8-vec3; - mul: func(p0: u8-vec3, p1: u8-vec3) -> u8-vec3; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: u8-vec3, rhs: u8-vec3) -> bvec3; - /// Casts all elements of `self` to `u32`. - as-uvec3: func(self: u8-vec3) -> uvec3; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: u8-vec3, rhs: u8-vec3) -> bvec3; - /// Component-wise clamping of values, similar to [`u8::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: u8-vec3, min: u8-vec3, max: u8-vec3) -> u8-vec3; - /// Creates a 3D vector from `self` with the given value of `x`. - with-x: func(self: u8-vec3, x: u8) -> u8-vec3; - rem: func(self: u8-vec3, rhs: u8-vec3) -> u8-vec3; - /// Creates a 4D vector from `self` and the given `w` value. - extend: func(self: u8-vec3, w: u8) -> u8-vec4; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: u8-vec3, rhs: u8-vec3) -> u8; - /// Casts all elements of `self` to `f32`. - as-vec3a: func(self: u8-vec3) -> vec3-a; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: u8-vec3, rhs: u8-vec3) -> u8-vec3; - rem: func(p0: u8-vec3, p1: u8-vec3) -> u8-vec3; - /// Returns a vector containing the saturating addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.saturating_add_signed(rhs.x), self.y.saturating_add_signed(rhs.y), ..]`. - saturating-add-signed: func(self: u8-vec3, rhs: i8-vec3) -> u8-vec3; - eq: func(self: u8-vec3, other: u8-vec3) -> bool; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: u8-vec3, rhs: u8-vec3) -> u8-vec3; - /// Casts all elements of `self` to `i16`. - as-i16vec3: func(self: u8-vec3) -> i16-vec3; - div: func(self: u8-vec3, rhs: u8-vec3) -> u8-vec3; - /// Computes the cross product of `self` and `rhs`. - cross: func(self: u8-vec3, rhs: u8-vec3) -> u8-vec3; - add: func(p0: u8-vec3, p1: u8) -> u8-vec3; - mul: func(p0: u8-vec3, p1: u8) -> u8-vec3; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: u8-vec3, rhs: u8-vec3) -> bvec3; - add: func(self: u8-vec3, rhs: u8-vec3) -> u8-vec3; - /// Creates a new vector. - new: func(x: u8, y: u8, z: u8) -> u8-vec3; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: u8-vec3) -> u8; - /// Returns a vector containing the wrapping addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_signed(rhs.x), self.y.wrapping_add_signed(rhs.y), ..]`. - wrapping-add-signed: func(self: u8-vec3, rhs: i8-vec3) -> u8-vec3; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: u8-vec3, rhs: u8-vec3) -> u8-vec3; - /// Creates a 3D vector from `self` with the given value of `z`. - with-z: func(self: u8-vec3, z: u8) -> u8-vec3; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: u8-vec3, rhs: u8-vec3) -> u8-vec3; - sub: func(p0: u8-vec3, p1: u8-vec3) -> u8-vec3; - assert-receiver-is-total-eq: func(self: u8-vec3); - sub: func(self: u8-vec3, rhs: u8-vec3) -> u8-vec3; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u8::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: u8-vec3, rhs: u8-vec3) -> option; - sub: func(p0: u8-vec3, p1: u8) -> u8-vec3; - /// Casts all elements of `self` to `i64`. - as-i64vec3: func(self: u8-vec3) -> i64-vec3; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: u8-vec3, rhs: u8-vec3) -> u8-vec3; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: u8-vec3) -> u64; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: u8-vec3, rhs: u8-vec3) -> bvec3; - rem: func(p0: u8-vec3, p1: u8) -> u8-vec3; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: u8-vec3) -> u64; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: u8-vec3, rhs: u8-vec3) -> u8-vec3; - /// Casts all elements of `self` to `i8`. - as-i8vec3: func(self: u8-vec3) -> i8-vec3; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: u8-vec3, rhs: u8-vec3) -> u8-vec3; - /// Converts `self` to `[x, y, z]` - to-array: func(self: u8-vec3) -> list; - /// Creates a 3D vector from `self` with the given value of `y`. - with-y: func(self: u8-vec3, y: u8) -> u8-vec3; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: u8-vec3) -> u8; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: u8-vec3) -> u8; - /// Creates a vector with all elements set to `v`. - splat: func(v: u8) -> u8-vec3; - div: func(p0: u8-vec3, p1: u8) -> u8-vec3; - clone: func(self: u8-vec3) -> u8-vec3; - /// Casts all elements of `self` to `i32`. - as-ivec3: func(self: u8-vec3) -> ivec3; - /// Casts all elements of `self` to `f64`. - as-dvec3: func(self: u8-vec3) -> dvec3; -} - -/// Methods for U8Vec4 -interface u8-vec4 { - use types.{reflect-reference}; - - /// Casts all elements of `self` to `u64`. - as-u64vec4: func(self: u8-vec4) -> u64-vec4; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: u8-vec4, rhs: u8-vec4) -> u8-vec4; - rem: func(p0: u8-vec4, p1: u8) -> u8-vec4; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: u8-vec4, rhs: u8-vec4) -> u8-vec4; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: u8-vec4, rhs: u8-vec4) -> bvec4; - sub: func(self: u8-vec4, rhs: u8-vec4) -> u8-vec4; - sub: func(p0: u8-vec4, p1: u8) -> u8-vec4; - rem: func(self: u8-vec4, rhs: u8-vec4) -> u8-vec4; - /// Creates a new vector. - new: func(x: u8, y: u8, z: u8, w: u8) -> u8-vec4; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: u8-vec4, rhs: u8-vec4) -> bvec4; - sub: func(p0: u8-vec4, p1: u8-vec4) -> u8-vec4; - /// Creates a 4D vector from `self` with the given value of `z`. - with-z: func(self: u8-vec4, z: u8) -> u8-vec4; - /// Creates a 4D vector from `self` with the given value of `y`. - with-y: func(self: u8-vec4, y: u8) -> u8-vec4; - mul: func(p0: u8-vec4, p1: u8-vec4) -> u8-vec4; - /// Component-wise clamping of values, similar to [`u8::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: u8-vec4, min: u8-vec4, max: u8-vec4) -> u8-vec4; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u8::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: u8-vec4, rhs: u8-vec4) -> option; - /// Casts all elements of `self` to `i16`. - as-i16vec4: func(self: u8-vec4) -> i16-vec4; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: u8-vec4) -> u8; - add: func(p0: u8-vec4, p1: u8-vec4) -> u8-vec4; - /// Converts `self` to `[x, y, z, w]` - to-array: func(self: u8-vec4) -> list; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: u8-vec4) -> u64; - /// Creates a vector with all elements set to `v`. - splat: func(v: u8) -> u8-vec4; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: u8-vec4, rhs: u8-vec4) -> bvec4; - /// Casts all elements of `self` to `u32`. - as-uvec4: func(self: u8-vec4) -> uvec4; - add: func(self: u8-vec4, rhs: u8-vec4) -> u8-vec4; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: u8-vec4, rhs: u8-vec4) -> u8-vec4; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: u8-vec4, rhs: u8-vec4) -> u8; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: u8-vec4) -> u64; - eq: func(self: u8-vec4, other: u8-vec4) -> bool; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: u8-vec4, rhs: u8-vec4) -> bvec4; - /// Casts all elements of `self` to `i8`. - as-i8vec4: func(self: u8-vec4) -> i8-vec4; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: u8-vec4) -> u8; - clone: func(self: u8-vec4) -> u8-vec4; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: u8-vec4, rhs: u8-vec4) -> bvec4; - /// Casts all elements of `self` to `f64`. - as-dvec4: func(self: u8-vec4) -> dvec4; - div: func(p0: u8-vec4, p1: u8) -> u8-vec4; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec4, if-true: u8-vec4, if-false: u8-vec4) -> u8-vec4; - add: func(p0: u8-vec4, p1: u8) -> u8-vec4; - div: func(self: u8-vec4, rhs: u8-vec4) -> u8-vec4; - mul: func(p0: u8-vec4, p1: u8) -> u8-vec4; - /// Casts all elements of `self` to `i64`. - as-i64vec4: func(self: u8-vec4) -> i64-vec4; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: u8-vec4, rhs: u8-vec4) -> u8-vec4; - /// Casts all elements of `self` to `f32`. - as-vec4: func(self: u8-vec4) -> vec4; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: u8-vec4, rhs: u8-vec4) -> u8-vec4; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: u8-vec4, rhs: u8-vec4) -> u8-vec4; - div: func(p0: u8-vec4, p1: u8-vec4) -> u8-vec4; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: u8-vec4, rhs: u8-vec4) -> u8-vec4; - assert-receiver-is-total-eq: func(self: u8-vec4); - /// Creates a 4D vector from `self` with the given value of `w`. - with-w: func(self: u8-vec4, w: u8) -> u8-vec4; - /// Creates a new vector from an array. - from-array: func(a: list) -> u8-vec4; - /// Casts all elements of `self` to `i32`. - as-ivec4: func(self: u8-vec4) -> ivec4; - /// Computes the squared length of `self`. - length-squared: func(self: u8-vec4) -> u8; - mul: func(self: u8-vec4, rhs: u8-vec4) -> u8-vec4; - /// Creates a 3D vector from the `x`, `y` and `z` elements of `self`, discarding `w`. - /// Truncation to [`U8Vec3`] may also be performed by using [`self.xyz()`][crate::swizzles::Vec4Swizzles::xyz()]. - truncate: func(self: u8-vec4) -> u8-vec3; - /// Creates a 4D vector from `self` with the given value of `x`. - with-x: func(self: u8-vec4, x: u8) -> u8-vec4; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: u8-vec4) -> u8; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: u8-vec4, rhs: u8-vec4) -> bvec4; - /// Casts all elements of `self` to `u16`. - as-u16vec4: func(self: u8-vec4) -> u16-vec4; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: u8-vec4, rhs: u8-vec4) -> u8; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: u8-vec4, rhs: u8-vec4) -> u8-vec4; - rem: func(p0: u8-vec4, p1: u8-vec4) -> u8-vec4; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: u8-vec4, rhs: u8-vec4) -> u8-vec4; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u8::MAX`]. - /// See also [`checked_manhattan_distance`][U8Vec4::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: u8-vec4, rhs: u8-vec4) -> u8; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: u8-vec4, rhs: u8-vec4) -> u8-vec4; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: u8-vec4) -> u8; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: u8-vec4, rhs: u8-vec4) -> u8-vec4; - /// Returns a vector containing the saturating addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.saturating_add_signed(rhs.x), self.y.saturating_add_signed(rhs.y), ..]`. - saturating-add-signed: func(self: u8-vec4, rhs: i8-vec4) -> u8-vec4; - /// Returns a vector containing the wrapping addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_signed(rhs.x), self.y.wrapping_add_signed(rhs.y), ..]`. - wrapping-add-signed: func(self: u8-vec4, rhs: i8-vec4) -> u8-vec4; -} - -/// Methods for UVec2 -interface uvec2 { - use types.{reflect-reference}; - - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: uvec2, rhs: uvec2) -> u32; - /// Returns a vector containing the wrapping addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_signed(rhs.x), self.y.wrapping_add_signed(rhs.y), ..]`. - wrapping-add-signed: func(self: uvec2, rhs: ivec2) -> uvec2; - sub: func(self: uvec2, rhs: uvec2) -> uvec2; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: uvec2, rhs: uvec2) -> bvec2; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: uvec2, rhs: uvec2) -> uvec2; - mul: func(p0: uvec2, p1: uvec2) -> uvec2; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: uvec2, rhs: uvec2) -> bvec2; - rem: func(self: uvec2, rhs: uvec2) -> uvec2; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: uvec2, rhs: uvec2) -> bvec2; - mul: func(p0: uvec2, p1: u32) -> uvec2; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: uvec2, rhs: uvec2) -> bvec2; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: uvec2, rhs: uvec2) -> uvec2; - /// Creates a new vector. - new: func(x: u32, y: u32) -> uvec2; - /// Returns a vector containing the saturating addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.saturating_add_signed(rhs.x), self.y.saturating_add_signed(rhs.y), ..]`. - saturating-add-signed: func(self: uvec2, rhs: ivec2) -> uvec2; - div: func(p0: uvec2, p1: u32) -> uvec2; - /// Creates a 2D vector from `self` with the given value of `y`. - with-y: func(self: uvec2, y: u32) -> uvec2; - div: func(self: uvec2, rhs: uvec2) -> uvec2; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: uvec2, rhs: uvec2) -> bvec2; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: uvec2, rhs: uvec2) -> uvec2; - /// Casts all elements of `self` to `u64`. - as-u64vec2: func(self: uvec2) -> u64-vec2; - /// Creates a 3D vector from `self` and the given `z` value. - extend: func(self: uvec2, z: u32) -> uvec3; - /// Casts all elements of `self` to `u16`. - as-u16vec2: func(self: uvec2) -> u16-vec2; - /// Creates a new vector from an array. - from-array: func(a: list) -> uvec2; - /// Creates a 2D vector from `self` with the given value of `x`. - with-x: func(self: uvec2, x: u32) -> uvec2; - /// Casts all elements of `self` to `f32`. - as-vec2: func(self: uvec2) -> vec2; - /// Casts all elements of `self` to `i64`. - as-i64vec2: func(self: uvec2) -> i64-vec2; - rem: func(p0: uvec2, p1: uvec2) -> uvec2; - add: func(p0: uvec2, p1: u32) -> uvec2; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: uvec2, rhs: uvec2) -> uvec2; - clone: func(self: uvec2) -> uvec2; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: uvec2) -> u64; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: uvec2) -> u32; - eq: func(self: uvec2, other: uvec2) -> bool; - /// Casts all elements of `self` to `f64`. - as-dvec2: func(self: uvec2) -> dvec2; - /// Casts all elements of `self` to `i8`. - as-i8vec2: func(self: uvec2) -> i8-vec2; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec2, if-true: uvec2, if-false: uvec2) -> uvec2; - sub: func(p0: uvec2, p1: u32) -> uvec2; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: uvec2, rhs: uvec2) -> uvec2; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: uvec2) -> u32; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: uvec2, rhs: uvec2) -> uvec2; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u32::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: uvec2, rhs: uvec2) -> option; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u32::MAX`]. - /// See also [`checked_manhattan_distance`][UVec2::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: uvec2, rhs: uvec2) -> u32; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: uvec2) -> u32; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: uvec2, rhs: uvec2) -> bvec2; - div: func(p0: uvec2, p1: uvec2) -> uvec2; - sub: func(p0: uvec2, p1: uvec2) -> uvec2; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: uvec2) -> u32; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: uvec2, rhs: uvec2) -> uvec2; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: uvec2, rhs: uvec2) -> uvec2; - /// Creates a vector with all elements set to `v`. - splat: func(v: u32) -> uvec2; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: uvec2) -> u64; - /// Computes the squared length of `self`. - length-squared: func(self: uvec2) -> u32; - /// Converts `self` to `[x, y]` - to-array: func(self: uvec2) -> list; - add: func(self: uvec2, rhs: uvec2) -> uvec2; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: uvec2, rhs: uvec2) -> u32; - add: func(p0: uvec2, p1: uvec2) -> uvec2; - /// Casts all elements of `self` to `i32`. - as-ivec2: func(self: uvec2) -> ivec2; - rem: func(p0: uvec2, p1: u32) -> uvec2; - /// Casts all elements of `self` to `i16`. - as-i16vec2: func(self: uvec2) -> i16-vec2; - mul: func(self: uvec2, rhs: uvec2) -> uvec2; - assert-receiver-is-total-eq: func(self: uvec2); - /// Casts all elements of `self` to `u8`. - as-u8vec2: func(self: uvec2) -> u8-vec2; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: uvec2, rhs: uvec2) -> uvec2; - /// Component-wise clamping of values, similar to [`u32::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: uvec2, min: uvec2, max: uvec2) -> uvec2; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: uvec2, rhs: uvec2) -> uvec2; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: uvec2, rhs: uvec2) -> uvec2; -} - -/// Methods for UVec3 -interface uvec3 { - use types.{reflect-reference}; - - rem: func(self: uvec3, rhs: uvec3) -> uvec3; - /// Casts all elements of `self` to `i16`. - as-i16vec3: func(self: uvec3) -> i16-vec3; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: uvec3) -> u32; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: uvec3, rhs: uvec3) -> bvec3; - /// Casts all elements of `self` to `i8`. - as-i8vec3: func(self: uvec3) -> i8-vec3; - /// Creates a 3D vector from `self` with the given value of `x`. - with-x: func(self: uvec3, x: u32) -> uvec3; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u32::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: uvec3, rhs: uvec3) -> option; - mul: func(p0: uvec3, p1: uvec3) -> uvec3; - sub: func(self: uvec3, rhs: uvec3) -> uvec3; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: uvec3) -> u64; - add: func(self: uvec3, rhs: uvec3) -> uvec3; - /// Creates a 3D vector from `self` with the given value of `y`. - with-y: func(self: uvec3, y: u32) -> uvec3; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: uvec3, rhs: uvec3) -> uvec3; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: uvec3, rhs: uvec3) -> uvec3; - /// Casts all elements of `self` to `u16`. - as-u16vec3: func(self: uvec3) -> u16-vec3; - clone: func(self: uvec3) -> uvec3; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: uvec3, rhs: uvec3) -> uvec3; - /// Creates a 3D vector from `self` with the given value of `z`. - with-z: func(self: uvec3, z: u32) -> uvec3; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: uvec3, rhs: uvec3) -> uvec3; - /// Casts all elements of `self` to `f64`. - as-dvec3: func(self: uvec3) -> dvec3; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec3, if-true: uvec3, if-false: uvec3) -> uvec3; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: uvec3, rhs: uvec3) -> uvec3; - /// Casts all elements of `self` to `f32`. - as-vec3a: func(self: uvec3) -> vec3-a; - rem: func(p0: uvec3, p1: uvec3) -> uvec3; - /// Returns a vector containing the wrapping addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_signed(rhs.x), self.y.wrapping_add_signed(rhs.y), ..]`. - wrapping-add-signed: func(self: uvec3, rhs: ivec3) -> uvec3; - /// Creates a new vector from an array. - from-array: func(a: list) -> uvec3; - /// Converts `self` to `[x, y, z]` - to-array: func(self: uvec3) -> list; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: uvec3, rhs: uvec3) -> uvec3; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: uvec3) -> u32; - assert-receiver-is-total-eq: func(self: uvec3); - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: uvec3, rhs: uvec3) -> u32; - /// Casts all elements of `self` to `u8`. - as-u8vec3: func(self: uvec3) -> u8-vec3; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: uvec3, rhs: uvec3) -> bvec3; - div: func(p0: uvec3, p1: uvec3) -> uvec3; - sub: func(p0: uvec3, p1: uvec3) -> uvec3; - /// Creates a 4D vector from `self` and the given `w` value. - extend: func(self: uvec3, w: u32) -> uvec4; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: uvec3, rhs: uvec3) -> uvec3; - /// Computes the squared length of `self`. - length-squared: func(self: uvec3) -> u32; - /// Casts all elements of `self` to `i64`. - as-i64vec3: func(self: uvec3) -> i64-vec3; - eq: func(self: uvec3, other: uvec3) -> bool; - add: func(p0: uvec3, p1: uvec3) -> uvec3; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: uvec3, rhs: uvec3) -> uvec3; - mul: func(p0: uvec3, p1: u32) -> uvec3; - sub: func(p0: uvec3, p1: u32) -> uvec3; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: uvec3) -> u32; - /// Creates a 2D vector from the `x` and `y` elements of `self`, discarding `z`. - /// Truncation may also be performed by using [`self.xy()`][crate::swizzles::Vec3Swizzles::xy()]. - truncate: func(self: uvec3) -> uvec2; - /// Casts all elements of `self` to `f32`. - as-vec3: func(self: uvec3) -> vec3; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: uvec3, rhs: uvec3) -> uvec3; - add: func(p0: uvec3, p1: u32) -> uvec3; - /// Creates a new vector. - new: func(x: u32, y: u32, z: u32) -> uvec3; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: uvec3) -> u64; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: uvec3, rhs: uvec3) -> uvec3; - rem: func(p0: uvec3, p1: u32) -> uvec3; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: uvec3, rhs: uvec3) -> bvec3; - /// Creates a vector with all elements set to `v`. - splat: func(v: u32) -> uvec3; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: uvec3) -> u32; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: uvec3, rhs: uvec3) -> bvec3; - /// Casts all elements of `self` to `u64`. - as-u64vec3: func(self: uvec3) -> u64-vec3; - div: func(p0: uvec3, p1: u32) -> uvec3; - /// Computes the cross product of `self` and `rhs`. - cross: func(self: uvec3, rhs: uvec3) -> uvec3; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: uvec3, rhs: uvec3) -> u32; - div: func(self: uvec3, rhs: uvec3) -> uvec3; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u32::MAX`]. - /// See also [`checked_manhattan_distance`][UVec3::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: uvec3, rhs: uvec3) -> u32; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: uvec3, rhs: uvec3) -> bvec3; - mul: func(self: uvec3, rhs: uvec3) -> uvec3; - /// Returns a vector containing the saturating addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.saturating_add_signed(rhs.x), self.y.saturating_add_signed(rhs.y), ..]`. - saturating-add-signed: func(self: uvec3, rhs: ivec3) -> uvec3; - /// Casts all elements of `self` to `i32`. - as-ivec3: func(self: uvec3) -> ivec3; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: uvec3, rhs: uvec3) -> bvec3; - /// Component-wise clamping of values, similar to [`u32::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: uvec3, min: uvec3, max: uvec3) -> uvec3; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: uvec3, rhs: uvec3) -> uvec3; -} - -/// Methods for UVec4 -interface uvec4 { - use types.{reflect-reference}; - - sub: func(p0: uvec4, p1: uvec4) -> uvec4; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: uvec4, rhs: uvec4) -> bvec4; - add: func(p0: uvec4, p1: uvec4) -> uvec4; - /// Creates a 4D vector from `self` with the given value of `w`. - with-w: func(self: uvec4, w: u32) -> uvec4; - clone: func(self: uvec4) -> uvec4; - /// Returns a vector containing the wrapping multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_mul(rhs.x), self.y.wrapping_mul(rhs.y), ..]`. - wrapping-mul: func(self: uvec4, rhs: uvec4) -> uvec4; - /// Returns a vector containing the wrapping subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_sub(rhs.x), self.y.wrapping_sub(rhs.y), ..]`. - wrapping-sub: func(self: uvec4, rhs: uvec4) -> uvec4; - /// Creates a 4D vector from `self` with the given value of `y`. - with-y: func(self: uvec4, y: u32) -> uvec4; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: uvec4, rhs: uvec4) -> bvec4; - eq: func(self: uvec4, other: uvec4) -> bool; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: uvec4, rhs: uvec4) -> bvec4; - /// Casts all elements of `self` to `f64`. - as-dvec4: func(self: uvec4) -> dvec4; - mul: func(p0: uvec4, p1: u32) -> uvec4; - /// Creates a 3D vector from the `x`, `y` and `z` elements of `self`, discarding `w`. - /// Truncation to [`UVec3`] may also be performed by using [`self.xyz()`][crate::swizzles::Vec4Swizzles::xyz()]. - truncate: func(self: uvec4) -> uvec3; - /// Computes the [manhattan distance] between two points. - /// This will returns [`None`] if the result is greater than [`u32::MAX`]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - checked-manhattan-distance: func(self: uvec4, rhs: uvec4) -> option; - /// Computes the [manhattan distance] between two points. - /// # Overflow - /// This method may overflow if the result is greater than [`u32::MAX`]. - /// See also [`checked_manhattan_distance`][UVec4::checked_manhattan_distance]. - /// [manhattan distance]: https://en.wikipedia.org/wiki/Taxicab_geometry - manhattan-distance: func(self: uvec4, rhs: uvec4) -> u32; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: uvec4) -> u32; - rem: func(p0: uvec4, p1: uvec4) -> uvec4; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: uvec4) -> u64; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: uvec4, rhs: uvec4) -> bvec4; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec4, if-true: uvec4, if-false: uvec4) -> uvec4; - /// Creates a new vector from an array. - from-array: func(a: list) -> uvec4; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: uvec4) -> u32; - div: func(p0: uvec4, p1: u32) -> uvec4; - add: func(p0: uvec4, p1: u32) -> uvec4; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - min-element: func(self: uvec4) -> u32; - /// Converts `self` to `[x, y, z, w]` - to-array: func(self: uvec4) -> list; - /// Casts all elements of `self` to `u16`. - as-u16vec4: func(self: uvec4) -> u16-vec4; - /// Returns a vector containing the saturating subtraction of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_sub(rhs.x), self.y.saturating_sub(rhs.y), ..]`. - saturating-sub: func(self: uvec4, rhs: uvec4) -> uvec4; - /// Casts all elements of `self` to `i32`. - as-ivec4: func(self: uvec4) -> ivec4; - /// Computes the squared length of `self`. - length-squared: func(self: uvec4) -> u32; - /// Creates a new vector. - new: func(x: u32, y: u32, z: u32, w: u32) -> uvec4; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - max-element: func(self: uvec4) -> u32; - /// Casts all elements of `self` to `i16`. - as-i16vec4: func(self: uvec4) -> i16-vec4; - /// Returns a vector containing the saturating division of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_div(rhs.x), self.y.saturating_div(rhs.y), ..]`. - saturating-div: func(self: uvec4, rhs: uvec4) -> uvec4; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: uvec4, rhs: uvec4) -> u32; - div: func(p0: uvec4, p1: uvec4) -> uvec4; - div: func(self: uvec4, rhs: uvec4) -> uvec4; - mul: func(p0: uvec4, p1: uvec4) -> uvec4; - /// Creates a 4D vector from `self` with the given value of `x`. - with-x: func(self: uvec4, x: u32) -> uvec4; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - max: func(self: uvec4, rhs: uvec4) -> uvec4; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - min: func(self: uvec4, rhs: uvec4) -> uvec4; - /// Casts all elements of `self` to `u64`. - as-u64vec4: func(self: uvec4) -> u64-vec4; - assert-receiver-is-total-eq: func(self: uvec4); - /// Casts all elements of `self` to `i8`. - as-i8vec4: func(self: uvec4) -> i8-vec4; - /// Returns a vector containing the saturating multiplication of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_mul(rhs.x), self.y.saturating_mul(rhs.y), ..]`. - saturating-mul: func(self: uvec4, rhs: uvec4) -> uvec4; - /// Returns a vector containing the saturating addition of `self` and `rhs`. - /// In other words this computes `[self.x.saturating_add(rhs.x), self.y.saturating_add(rhs.y), ..]`. - saturating-add: func(self: uvec4, rhs: uvec4) -> uvec4; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: uvec4) -> u64; - /// Returns a vector containing the wrapping division of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_div(rhs.x), self.y.wrapping_div(rhs.y), ..]`. - wrapping-div: func(self: uvec4, rhs: uvec4) -> uvec4; - /// Creates a 4D vector from `self` with the given value of `z`. - with-z: func(self: uvec4, z: u32) -> uvec4; - sub: func(self: uvec4, rhs: uvec4) -> uvec4; - /// Casts all elements of `self` to `u8`. - as-u8vec4: func(self: uvec4) -> u8-vec4; - rem: func(self: uvec4, rhs: uvec4) -> uvec4; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: uvec4, rhs: uvec4) -> bvec4; - /// Computes the [chebyshev distance] between two points. - /// [chebyshev distance]: https://en.wikipedia.org/wiki/Chebyshev_distance - chebyshev-distance: func(self: uvec4, rhs: uvec4) -> u32; - sub: func(p0: uvec4, p1: u32) -> uvec4; - rem: func(p0: uvec4, p1: u32) -> uvec4; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: uvec4, rhs: uvec4) -> uvec4; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: uvec4, rhs: uvec4) -> bvec4; - /// Component-wise clamping of values, similar to [`u32::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: uvec4, min: uvec4, max: uvec4) -> uvec4; - /// Creates a vector with all elements set to `v`. - splat: func(v: u32) -> uvec4; - /// Casts all elements of `self` to `f32`. - as-vec4: func(self: uvec4) -> vec4; - /// Returns a vector containing the wrapping addition of `self` and `rhs`. - /// In other words this computes `[self.x.wrapping_add(rhs.x), self.y.wrapping_add(rhs.y), ..]`. - wrapping-add: func(self: uvec4, rhs: uvec4) -> uvec4; - /// Returns a vector containing the saturating addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.saturating_add_signed(rhs.x), self.y.saturating_add_signed(rhs.y), ..]`. - saturating-add-signed: func(self: uvec4, rhs: ivec4) -> uvec4; - add: func(self: uvec4, rhs: uvec4) -> uvec4; - /// Returns a vector containing the wrapping addition of `self` and signed vector `rhs`. - /// In other words this computes `[self.x.wrapping_add_signed(rhs.x), self.y.wrapping_add_signed(rhs.y), ..]`. - wrapping-add-signed: func(self: uvec4, rhs: ivec4) -> uvec4; - mul: func(self: uvec4, rhs: uvec4) -> uvec4; - /// Casts all elements of `self` to `i64`. - as-i64vec4: func(self: uvec4) -> i64-vec4; -} - -/// Methods for Vec2 -interface vec2 { - use types.{reflect-reference}; - - /// Creates a 2D vector from `self` with the given value of `x`. - with-x: func(self: vec2, x: f32) -> vec2; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: vec2, rhs: vec2) -> bvec2; - /// Casts all elements of `self` to `u32`. - as-uvec2: func(self: vec2) -> uvec2; - /// Returns a vector containing each element of `self` raised to the power of `n`. - powf: func(self: vec2, n: f32) -> vec2; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: vec2, rhs: vec2) -> f32; - /// Creates a new vector from an array. - from-array: func(a: list) -> vec2; - /// Component-wise clamping of values, similar to [`f32::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: vec2, min: vec2, max: vec2) -> vec2; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: vec2, rhs: vec2) -> bvec2; - /// Returns the vector rejection of `self` from `rhs`. - /// The vector rejection is the vector perpendicular to the projection of `self` onto - /// `rhs`, in rhs words the result of `self - self.project_onto(rhs)`. - /// `rhs` must be of non-zero length. - /// # Panics - /// Will panic if `rhs` has a length of zero when `glam_assert` is enabled. - reject-from: func(self: vec2, rhs: vec2) -> vec2; - /// Returns `true` if, and only if, all elements are finite. If any element is either - /// `NaN`, positive or negative infinity, this will return `false`. - is-finite: func(self: vec2) -> bool; - /// Casts all elements of `self` to `u8`. - as-u8vec2: func(self: vec2) -> u8-vec2; - /// Returns the vector projection of `self` onto `rhs`. - /// `rhs` must be of non-zero length. - /// # Panics - /// Will panic if `rhs` is zero length when `glam_assert` is enabled. - project-onto: func(self: vec2, rhs: vec2) -> vec2; - /// Returns the angle (in radians) of this vector in the range `[-π, +π]`. - /// The input does not need to be a unit vector however it must be non-zero. - to-angle: func(self: vec2) -> f32; - /// Fused multiply-add. Computes `(self * a) + b` element-wise with only one rounding - /// error, yielding a more accurate result than an unfused multiply-add. - /// Using `mul_add` *may* be more performant than an unfused multiply-add if the target - /// architecture has a dedicated fma CPU instruction. However, this is not always true, - /// and will be heavily dependant on designing algorithms with specific target hardware in - /// mind. - mul-add: func(self: vec2, a: vec2, b: vec2) -> vec2; - /// Casts all elements of `self` to `u16`. - as-u16vec2: func(self: vec2) -> u16-vec2; - mul: func(p0: vec2, p1: f32) -> vec2; - /// Returns a vector with a length no less than `min`. - /// # Panics - /// Will panic if `min` is negative when `glam_assert` is enabled. - clamp-length-min: func(self: vec2, min: f32) -> vec2; - /// Returns a vector containing the natural logarithm for each element of `self`. - /// This returns NaN when the element is negative and negative infinity when the element is zero. - ln: func(self: vec2) -> vec2; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: vec2) -> vec2; - sub: func(p0: vec2, p1: vec2) -> vec2; - /// Returns a vector containing the reciprocal `1.0/n` of each element of `self`. - recip: func(self: vec2) -> vec2; - /// Returns whether `self` is length `1.0` or not. - /// Uses a precision threshold of approximately `1e-4`. - is-normalized: func(self: vec2) -> bool; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec2, if-true: vec2, if-false: vec2) -> vec2; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: vec2) -> f32; - /// Returns a vector with elements representing the sign of `self`. - /// - `1.0` if the number is positive, `+0.0` or `INFINITY` - /// - `-1.0` if the number is negative, `-0.0` or `NEG_INFINITY` - /// - `NAN` if the number is `NAN` - signum: func(self: vec2) -> vec2; - clone: func(self: vec2) -> vec2; - /// Returns a vector containing the integer part each element of `self`. This means numbers are - /// always truncated towards zero. - trunc: func(self: vec2) -> vec2; - /// Moves towards `rhs` based on the value `d`. - /// When `d` is `0.0`, the result will be equal to `self`. When `d` is equal to - /// `self.distance(rhs)`, the result will be equal to `rhs`. Will not go past `rhs`. - move-towards: func(self: vec2, rhs: vec2, d: f32) -> vec2; - /// Returns a vector containing the smallest integer greater than or equal to a number for - /// each element of `self`. - ceil: func(self: vec2) -> vec2; - /// Creates a 2D vector containing `[angle.cos(), angle.sin()]`. This can be used in - /// conjunction with the [`rotate()`][Self::rotate()] method, e.g. - /// `Vec2::from_angle(PI).rotate(Vec2::Y)` will create the vector `[-1, 0]` - /// and rotate [`Vec2::Y`] around it returning `-Vec2::Y`. - from-angle: func(angle: f32) -> vec2; - /// Creates a vector with all elements set to `v`. - splat: func(v: f32) -> vec2; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: vec2, rhs: vec2) -> bvec2; - /// Returns `self` normalized to length 1.0 if possible, else returns a - /// fallback value. - /// In particular, if the input is zero (or very close to zero), or non-finite, - /// the result of this operation will be the fallback value. - /// See also [`Self::try_normalize()`]. - normalize-or: func(self: vec2, fallback: vec2) -> vec2; - /// Computes the squared length of `self`. - /// This is faster than `length()` as it avoids a square root operation. - length-squared: func(self: vec2) -> f32; - mul: func(p0: vec2, p1: vec2) -> vec2; - /// Converts `self` to `[x, y]` - to-array: func(self: vec2) -> list; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// [Euclidean division]: f32::rem_euclid - rem-euclid: func(self: vec2, rhs: vec2) -> vec2; - /// Returns a bitmask with the lowest 2 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: vec2) -> u32; - /// Returns a vector containing the base 2 logarithm for each element of `self`. - /// This returns NaN when the element is negative and negative infinity when the element is zero. - log2: func(self: vec2) -> vec2; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: vec2, rhs: vec2) -> f32; - /// Returns a vector containing the largest integer less than or equal to a number for each - /// element of `self`. - floor: func(self: vec2) -> vec2; - /// Creates a new vector. - new: func(x: f32, y: f32) -> vec2; - angle-between: func(self: vec2, rhs: vec2) -> f32; - add: func(self: vec2, rhs: vec2) -> vec2; - /// Casts all elements of `self` to `i32`. - as-ivec2: func(self: vec2) -> ivec2; - /// Returns a vector with a length no more than `max`. - /// # Panics - /// Will panic if `max` is negative when `glam_assert` is enabled. - clamp-length-max: func(self: vec2, max: f32) -> vec2; - add: func(p0: vec2, p1: f32) -> vec2; - div: func(p0: vec2, p1: f32) -> vec2; - /// Creates a 3D vector from `self` and the given `z` value. - extend: func(self: vec2, z: f32) -> vec3; - /// Rotates towards `rhs` up to `max_angle` (in radians). - /// When `max_angle` is `0.0`, the result will be equal to `self`. When `max_angle` is equal to - /// `self.angle_between(rhs)`, the result will be parallel to `rhs`. If `max_angle` is negative, - /// rotates towards the exact opposite of `rhs`. Will not go past the target. - rotate-towards: func(self: vec2, rhs: vec2, max-angle: f32) -> vec2; - /// Returns `rhs` rotated by the angle of `self`. If `self` is normalized, - /// then this just rotation. This is what you usually want. Otherwise, - /// it will be like a rotation with a multiplication by `self`'s length. - /// This can be used in conjunction with the [`from_angle()`][Self::from_angle()] method, e.g. - /// `Vec2::from_angle(PI).rotate(Vec2::Y)` will create the vector `[-1, 0]` - /// and rotate [`Vec2::Y`] around it returning `-Vec2::Y`. - rotate: func(self: vec2, rhs: vec2) -> vec2; - /// Returns a vector containing the nearest integer to a number for each element of `self`. - /// Round half-way cases away from 0.0. - round: func(self: vec2) -> vec2; - /// Returns the angle of rotation (in radians) from `self` to `rhs` in the range `[-π, +π]`. - /// The inputs do not need to be unit vectors however they must be non-zero. - angle-to: func(self: vec2, rhs: vec2) -> f32; - /// Casts all elements of `self` to `i64`. - as-i64vec2: func(self: vec2) -> i64-vec2; - /// Returns the refraction direction for a given incident vector `self`, surface normal - /// `normal` and ratio of indices of refraction, `eta`. When total internal reflection occurs, - /// a zero vector will be returned. - /// `self` and `normal` must be normalized. - /// # Panics - /// Will panic if `self` or `normal` is not normalized when `glam_assert` is enabled. - refract: func(self: vec2, normal: vec2, eta: f32) -> vec2; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: vec2) -> u64; - /// Casts all elements of `self` to `i16`. - as-i16vec2: func(self: vec2) -> i16-vec2; - eq: func(self: vec2, other: vec2) -> bool; - div: func(self: vec2, rhs: vec2) -> vec2; - /// Returns a vector containing `2^self` for each element of `self`. - exp2: func(self: vec2) -> vec2; - /// Calculates the midpoint between `self` and `rhs`. - /// The midpoint is the average of, or halfway point between, two vectors. - /// `a.midpoint(b)` should yield the same result as `a.lerp(b, 0.5)` - /// while being slightly cheaper to compute. - midpoint: func(self: vec2, rhs: vec2) -> vec2; - /// Computes the Euclidean distance between two points in space. - distance: func(self: vec2, rhs: vec2) -> f32; - rem: func(self: vec2, rhs: vec2) -> vec2; - /// Returns `self` normalized to length 1.0 if possible, else returns zero. - /// In particular, if the input is zero (or very close to zero), or non-finite, - /// the result of this operation will be zero. - /// See also [`Self::try_normalize()`]. - normalize-or-zero: func(self: vec2) -> vec2; - /// Returns the reflection vector for a given incident vector `self` and surface normal - /// `normal`. - /// `normal` must be normalized. - /// # Panics - /// Will panic if `normal` is not normalized when `glam_assert` is enabled. - reflect: func(self: vec2, normal: vec2) -> vec2; - sub: func(self: vec2, rhs: vec2) -> vec2; - /// Returns a vector containing `e^self` (the exponential function) for each element of - /// `self`. - exp: func(self: vec2) -> vec2; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - min-element: func(self: vec2) -> f32; - /// Returns the vector rejection of `self` from `rhs`. - /// The vector rejection is the vector perpendicular to the projection of `self` onto - /// `rhs`, in rhs words the result of `self - self.project_onto(rhs)`. - /// `rhs` must be normalized. - /// # Panics - /// Will panic if `rhs` is not normalized when `glam_assert` is enabled. - reject-from-normalized: func(self: vec2, rhs: vec2) -> vec2; - /// Returns the vector projection of `self` onto `rhs`. - /// `rhs` must be normalized. - /// # Panics - /// Will panic if `rhs` is not normalized when `glam_assert` is enabled. - project-onto-normalized: func(self: vec2, rhs: vec2) -> vec2; - /// Returns a vector containing the fractional part of the vector as `self - self.floor()`. - /// Note that this differs from the Rust implementation of `fract` which returns - /// `self - self.trunc()`. - /// Note that this is fast but not precise for large numbers. - fract-gl: func(self: vec2) -> vec2; - /// The perpendicular dot product of `self` and `rhs`. - /// Also known as the wedge product, 2D cross product, and determinant. - perp-dot: func(self: vec2, rhs: vec2) -> f32; - /// Returns a vector containing the fractional part of the vector as `self - self.trunc()`. - /// Note that this differs from the GLSL implementation of `fract` which returns - /// `self - self.floor()`. - /// Note that this is fast but not precise for large numbers. - fract: func(self: vec2) -> vec2; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - /// NaN propogation does not follow IEEE 754-2008 semantics for maxNum and may differ on - /// different SIMD architectures. - max: func(self: vec2, rhs: vec2) -> vec2; - /// Returns `self` normalized to length 1.0. - /// For valid results, `self` must be finite and _not_ of length zero, nor very close to zero. - /// See also [`Self::try_normalize()`] and [`Self::normalize_or_zero()`]. - /// # Panics - /// Will panic if the resulting normalized vector is not finite when `glam_assert` is enabled. - normalize: func(self: vec2) -> vec2; - /// Casts all elements of `self` to `i8`. - as-i8vec2: func(self: vec2) -> i8-vec2; - /// Casts all elements of `self` to `f64`. - as-dvec2: func(self: vec2) -> dvec2; - /// Performs a linear interpolation between `self` and `rhs` based on the value `s`. - /// When `s` is `0.0`, the result will be equal to `self`. When `s` is `1.0`, the result - /// will be equal to `rhs`. When `s` is outside of range `[0, 1]`, the result is linearly - /// extrapolated. - lerp: func(self: vec2, rhs: vec2, s: f32) -> vec2; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: vec2) -> f32; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - max-element: func(self: vec2) -> f32; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: vec2) -> u64; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: vec2, rhs: vec2) -> vec2; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: vec2) -> bool; - /// Returns a vector that is equal to `self` rotated by 90 degrees. - perp: func(self: vec2) -> vec2; - neg: func(self: vec2) -> vec2; - div: func(p0: vec2, p1: vec2) -> vec2; - add: func(p0: vec2, p1: vec2) -> vec2; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - div-euclid: func(self: vec2, rhs: vec2) -> vec2; - /// Creates a 2D vector from `self` with the given value of `y`. - with-y: func(self: vec2, y: f32) -> vec2; - /// Returns a vector with a length no less than `min` and no more than `max`. - /// # Panics - /// Will panic if `min` is greater than `max`, or if either `min` or `max` is negative, when `glam_assert` is enabled. - clamp-length: func(self: vec2, min: f32, max: f32) -> vec2; - /// Computes the length of `self`. - length: func(self: vec2) -> f32; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: vec2, rhs: vec2) -> bvec2; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: vec2, rhs: vec2) -> bvec2; - /// Returns a vector with signs of `rhs` and the magnitudes of `self`. - copysign: func(self: vec2, rhs: vec2) -> vec2; - mul: func(self: vec2, rhs: vec2) -> vec2; - /// Performs `is_finite` on each element of self, returning a vector mask of the results. - /// In other words, this computes `[x.is_finite(), y.is_finite(), ...]`. - is-finite-mask: func(self: vec2) -> bvec2; - rem: func(p0: vec2, p1: vec2) -> vec2; - /// Casts all elements of `self` to `u64`. - as-u64vec2: func(self: vec2) -> u64-vec2; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: vec2, rhs: vec2) -> bvec2; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - /// NaN propogation does not follow IEEE 754-2008 semantics for minNum and may differ on - /// different SIMD architectures. - min: func(self: vec2, rhs: vec2) -> vec2; - sub: func(p0: vec2, p1: f32) -> vec2; - rem: func(p0: vec2, p1: f32) -> vec2; - /// Returns true if the absolute difference of all elements between `self` and `rhs` is - /// less than or equal to `max_abs_diff`. - /// This can be used to compare if two vectors contain similar elements. It works best when - /// comparing with a known value. The `max_abs_diff` that should be used used depends on - /// the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: vec2, rhs: vec2, max-abs-diff: f32) -> bool; - /// Performs `is_nan` on each element of self, returning a vector mask of the results. - /// In other words, this computes `[x.is_nan(), y.is_nan(), ...]`. - is-nan-mask: func(self: vec2) -> bvec2; - /// Computes `1.0 / length()`. - /// For valid results, `self` must _not_ be of length zero. - length-recip: func(self: vec2) -> f32; -} - -/// Methods for Vec3 -interface vec3 { - use types.{reflect-reference}; - - /// Returns a vector containing the largest integer less than or equal to a number for each - /// element of `self`. - floor: func(self: vec3) -> vec3; - /// Returns a vector containing the base 2 logarithm for each element of `self`. - /// This returns NaN when the element is negative and negative infinity when the element is zero. - log2: func(self: vec3) -> vec3; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: vec3) -> f32; - eq: func(self: vec3, other: vec3) -> bool; - /// Computes `1.0 / length()`. - /// For valid results, `self` must _not_ be of length zero. - length-recip: func(self: vec3) -> f32; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - div-euclid: func(self: vec3, rhs: vec3) -> vec3; - /// Casts all elements of `self` to `u16`. - as-u16vec3: func(self: vec3) -> u16-vec3; - /// Creates a 3D vector from `self` with the given value of `y`. - with-y: func(self: vec3, y: f32) -> vec3; - /// Casts all elements of `self` to `i16`. - as-i16vec3: func(self: vec3) -> i16-vec3; - /// Rotates towards `rhs` up to `max_angle` (in radians). - /// When `max_angle` is `0.0`, the result will be equal to `self`. When `max_angle` is equal to - /// `self.angle_between(rhs)`, the result will be parallel to `rhs`. If `max_angle` is negative, - /// rotates towards the exact opposite of `rhs`. Will not go past the target. - rotate-towards: func(self: vec3, rhs: vec3, max-angle: f32) -> vec3; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: vec3, rhs: vec3) -> f32; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: vec3, rhs: vec3) -> bvec3; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: vec3) -> u64; - /// Returns the angle (in radians) between two vectors in the range `[0, +π]`. - /// The inputs do not need to be unit vectors however they must be non-zero. - angle-between: func(self: vec3, rhs: vec3) -> f32; - rem: func(p0: vec3, p1: f32) -> vec3; - /// Casts all elements of `self` to `i8`. - as-i8vec3: func(self: vec3) -> i8-vec3; - add: func(self: vec3, rhs: vec3) -> vec3; - to-vec3a: func(self: vec3) -> vec3-a; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec3, if-true: vec3, if-false: vec3) -> vec3; - /// Performs `is_finite` on each element of self, returning a vector mask of the results. - /// In other words, this computes `[x.is_finite(), y.is_finite(), ...]`. - is-finite-mask: func(self: vec3) -> bvec3; - /// Creates a 4D vector from `self` and the given `w` value. - extend: func(self: vec3, w: f32) -> vec4; - /// Performs `is_nan` on each element of self, returning a vector mask of the results. - /// In other words, this computes `[x.is_nan(), y.is_nan(), ...]`. - is-nan-mask: func(self: vec3) -> bvec3; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: vec3) -> u64; - /// Returns `self` normalized to length 1.0 if possible, else returns zero. - /// In particular, if the input is zero (or very close to zero), or non-finite, - /// the result of this operation will be zero. - /// See also [`Self::try_normalize()`]. - normalize-or-zero: func(self: vec3) -> vec3; - /// Returns a vector with a length no more than `max`. - /// # Panics - /// Will panic if `max` is negative when `glam_assert` is enabled. - clamp-length-max: func(self: vec3, max: f32) -> vec3; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: vec3, rhs: vec3) -> f32; - /// Returns the refraction direction for a given incident vector `self`, surface normal - /// `normal` and ratio of indices of refraction, `eta`. When total internal reflection occurs, - /// a zero vector will be returned. - /// `self` and `normal` must be normalized. - /// # Panics - /// Will panic if `self` or `normal` is not normalized when `glam_assert` is enabled. - refract: func(self: vec3, normal: vec3, eta: f32) -> vec3; - /// Returns the vector projection of `self` onto `rhs`. - /// `rhs` must be of non-zero length. - /// # Panics - /// Will panic if `rhs` is zero length when `glam_assert` is enabled. - project-onto: func(self: vec3, rhs: vec3) -> vec3; - div: func(self: vec3, rhs: vec3) -> vec3; - /// Computes the length of `self`. - length: func(self: vec3) -> f32; - neg: func(self: vec3) -> vec3; - rem: func(p0: vec3, p1: vec3) -> vec3; - /// Returns a vector containing the integer part each element of `self`. This means numbers are - /// always truncated towards zero. - trunc: func(self: vec3) -> vec3; - /// Returns true if the absolute difference of all elements between `self` and `rhs` is - /// less than or equal to `max_abs_diff`. - /// This can be used to compare if two vectors contain similar elements. It works best when - /// comparing with a known value. The `max_abs_diff` that should be used used depends on - /// the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: vec3, rhs: vec3, max-abs-diff: f32) -> bool; - /// Projects a homogeneous coordinate to 3D space by performing perspective divide. - /// # Panics - /// Will panic if `v.w` is `0` when `glam_assert` is enabled. - from-homogeneous: func(v: vec4) -> vec3; - mul: func(self: vec3, rhs: vec3) -> vec3; - /// Computes the Euclidean distance between two points in space. - distance: func(self: vec3, rhs: vec3) -> f32; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - /// NaN propogation does not follow IEEE 754-2008 semantics for minNum and may differ on - /// different SIMD architectures. - min: func(self: vec3, rhs: vec3) -> vec3; - /// Returns the reflection vector for a given incident vector `self` and surface normal - /// `normal`. - /// `normal` must be normalized. - /// # Panics - /// Will panic if `normal` is not normalized when `glam_assert` is enabled. - reflect: func(self: vec3, normal: vec3) -> vec3; - /// Rotates around the y axis by `angle` (in radians). - rotate-y: func(self: vec3, angle: f32) -> vec3; - /// Creates a 3D vector from `self` with the given value of `x`. - with-x: func(self: vec3, x: f32) -> vec3; - /// Returns a vector containing the fractional part of the vector as `self - self.trunc()`. - /// Note that this differs from the GLSL implementation of `fract` which returns - /// `self - self.floor()`. - /// Note that this is fast but not precise for large numbers. - fract: func(self: vec3) -> vec3; - mul: func(p0: vec3, p1: f32) -> vec3; - /// Casts all elements of `self` to `u64`. - as-u64vec3: func(self: vec3) -> u64-vec3; - sub: func(p0: vec3, p1: vec3) -> vec3; - /// Returns a vector with a length no less than `min` and no more than `max`. - /// # Panics - /// Will panic if `min` is greater than `max`, or if either `min` or `max` is negative, when `glam_assert` is enabled. - clamp-length: func(self: vec3, min: f32, max: f32) -> vec3; - /// Returns a vector containing the nearest integer to a number for each element of `self`. - /// Round half-way cases away from 0.0. - round: func(self: vec3) -> vec3; - /// Returns a vector containing the natural logarithm for each element of `self`. - /// This returns NaN when the element is negative and negative infinity when the element is zero. - ln: func(self: vec3) -> vec3; - /// Returns the vector rejection of `self` from `rhs`. - /// The vector rejection is the vector perpendicular to the projection of `self` onto - /// `rhs`, in rhs words the result of `self - self.project_onto(rhs)`. - /// `rhs` must be normalized. - /// # Panics - /// Will panic if `rhs` is not normalized when `glam_assert` is enabled. - reject-from-normalized: func(self: vec3, rhs: vec3) -> vec3; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// [Euclidean division]: f32::rem_euclid - rem-euclid: func(self: vec3, rhs: vec3) -> vec3; - /// Returns a vector containing the fractional part of the vector as `self - self.floor()`. - /// Note that this differs from the Rust implementation of `fract` which returns - /// `self - self.trunc()`. - /// Note that this is fast but not precise for large numbers. - fract-gl: func(self: vec3) -> vec3; - /// Creates a 3D vector from `self` with the given value of `z`. - with-z: func(self: vec3, z: f32) -> vec3; - /// Rotates around the z axis by `angle` (in radians). - rotate-z: func(self: vec3, angle: f32) -> vec3; - rem: func(self: vec3, rhs: vec3) -> vec3; - /// Returns a vector containing the smallest integer greater than or equal to a number for - /// each element of `self`. - ceil: func(self: vec3) -> vec3; - /// Casts all elements of `self` to `f64`. - as-dvec3: func(self: vec3) -> dvec3; - /// Creates a homogeneous coordinate from `self`, equivalent to `self.extend(1.0)`. - to-homogeneous: func(self: vec3) -> vec4; - add: func(p0: vec3, p1: f32) -> vec3; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: vec3, rhs: vec3) -> bvec3; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: vec3, rhs: vec3) -> bvec3; - clone: func(self: vec3) -> vec3; - /// Rotates around `axis` by `angle` (in radians). - /// The axis must be a unit vector. - /// # Panics - /// Will panic if `axis` is not normalized when `glam_assert` is enabled. - rotate-axis: func(self: vec3, axis: vec3, angle: f32) -> vec3; - /// Performs a spherical linear interpolation between `self` and `rhs` based on the value `s`. - /// When `s` is `0.0`, the result will be equal to `self`. When `s` is `1.0`, the result - /// will be equal to `rhs`. When `s` is outside of range `[0, 1]`, the result is linearly - /// extrapolated. - slerp: func(self: vec3, rhs: vec3, s: f32) -> vec3; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - max-element: func(self: vec3) -> f32; - /// Returns whether `self` is length `1.0` or not. - /// Uses a precision threshold of approximately `1e-4`. - is-normalized: func(self: vec3) -> bool; - /// Performs a linear interpolation between `self` and `rhs` based on the value `s`. - /// When `s` is `0.0`, the result will be equal to `self`. When `s` is `1.0`, the result - /// will be equal to `rhs`. When `s` is outside of range `[0, 1]`, the result is linearly - /// extrapolated. - lerp: func(self: vec3, rhs: vec3, s: f32) -> vec3; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: vec3) -> vec3; - sub: func(self: vec3, rhs: vec3) -> vec3; - /// Returns `true` if, and only if, all elements are finite. If any element is either - /// `NaN`, positive or negative infinity, this will return `false`. - is-finite: func(self: vec3) -> bool; - sub: func(p0: vec3, p1: f32) -> vec3; - /// Casts all elements of `self` to `u8`. - as-u8vec3: func(self: vec3) -> u8-vec3; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: vec3, rhs: vec3) -> vec3; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - /// NaN propogation does not follow IEEE 754-2008 semantics for maxNum and may differ on - /// different SIMD architectures. - max: func(self: vec3, rhs: vec3) -> vec3; - /// Returns some vector that is orthogonal to the given one. - /// The input vector must be finite and non-zero. - /// The output vector is not necessarily unit length. For that use - /// [`Self::any_orthonormal_vector()`] instead. - any-orthogonal-vector: func(self: vec3) -> vec3; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: vec3, rhs: vec3) -> bvec3; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: vec3, rhs: vec3) -> bvec3; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: vec3) -> f32; - /// Moves towards `rhs` based on the value `d`. - /// When `d` is `0.0`, the result will be equal to `self`. When `d` is equal to - /// `self.distance(rhs)`, the result will be equal to `rhs`. Will not go past `rhs`. - move-towards: func(self: vec3, rhs: vec3, d: f32) -> vec3; - /// Returns a vector containing `2^self` for each element of `self`. - exp2: func(self: vec3) -> vec3; - mul: func(p0: vec3, p1: vec3) -> vec3; - /// Casts all elements of `self` to `i32`. - as-ivec3: func(self: vec3) -> ivec3; - /// Creates a new vector. - new: func(x: f32, y: f32, z: f32) -> vec3; - /// Converts `self` to `[x, y, z]` - to-array: func(self: vec3) -> list; - /// Returns a vector with elements representing the sign of `self`. - /// - `1.0` if the number is positive, `+0.0` or `INFINITY` - /// - `-1.0` if the number is negative, `-0.0` or `NEG_INFINITY` - /// - `NAN` if the number is `NAN` - signum: func(self: vec3) -> vec3; - /// Returns a bitmask with the lowest 3 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: vec3) -> u32; - div: func(p0: vec3, p1: vec3) -> vec3; - add: func(p0: vec3, p1: vec3) -> vec3; - /// Creates a 2D vector from the `x` and `y` elements of `self`, discarding `z`. - /// Truncation may also be performed by using [`self.xy()`][crate::swizzles::Vec3Swizzles::xy()]. - truncate: func(self: vec3) -> vec2; - /// Returns `self` normalized to length 1.0. - /// For valid results, `self` must be finite and _not_ of length zero, nor very close to zero. - /// See also [`Self::try_normalize()`] and [`Self::normalize_or_zero()`]. - /// # Panics - /// Will panic if the resulting normalized vector is not finite when `glam_assert` is enabled. - normalize: func(self: vec3) -> vec3; - /// Returns a vector containing the reciprocal `1.0/n` of each element of `self`. - recip: func(self: vec3) -> vec3; - /// Returns a vector with signs of `rhs` and the magnitudes of `self`. - copysign: func(self: vec3, rhs: vec3) -> vec3; - /// Creates a new vector from an array. - from-array: func(a: list) -> vec3; - /// Returns a vector containing each element of `self` raised to the power of `n`. - powf: func(self: vec3, n: f32) -> vec3; - /// Component-wise clamping of values, similar to [`f32::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: vec3, min: vec3, max: vec3) -> vec3; - /// Calculates the midpoint between `self` and `rhs`. - /// The midpoint is the average of, or halfway point between, two vectors. - /// `a.midpoint(b)` should yield the same result as `a.lerp(b, 0.5)` - /// while being slightly cheaper to compute. - midpoint: func(self: vec3, rhs: vec3) -> vec3; - /// Returns the vector projection of `self` onto `rhs`. - /// `rhs` must be normalized. - /// # Panics - /// Will panic if `rhs` is not normalized when `glam_assert` is enabled. - project-onto-normalized: func(self: vec3, rhs: vec3) -> vec3; - /// Computes the cross product of `self` and `rhs`. - cross: func(self: vec3, rhs: vec3) -> vec3; - /// Casts all elements of `self` to `i64`. - as-i64vec3: func(self: vec3) -> i64-vec3; - /// Creates a vector with all elements set to `v`. - splat: func(v: f32) -> vec3; - /// Rotates around the x axis by `angle` (in radians). - rotate-x: func(self: vec3, angle: f32) -> vec3; - div: func(p0: vec3, p1: f32) -> vec3; - /// Returns the vector rejection of `self` from `rhs`. - /// The vector rejection is the vector perpendicular to the projection of `self` onto - /// `rhs`, in rhs words the result of `self - self.project_onto(rhs)`. - /// `rhs` must be of non-zero length. - /// # Panics - /// Will panic if `rhs` has a length of zero when `glam_assert` is enabled. - reject-from: func(self: vec3, rhs: vec3) -> vec3; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - min-element: func(self: vec3) -> f32; - /// Returns a vector with a length no less than `min`. - /// # Panics - /// Will panic if `min` is negative when `glam_assert` is enabled. - clamp-length-min: func(self: vec3, min: f32) -> vec3; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: vec3) -> bool; - /// Returns a vector containing `e^self` (the exponential function) for each element of - /// `self`. - exp: func(self: vec3) -> vec3; - /// Fused multiply-add. Computes `(self * a) + b` element-wise with only one rounding - /// error, yielding a more accurate result than an unfused multiply-add. - /// Using `mul_add` *may* be more performant than an unfused multiply-add if the target - /// architecture has a dedicated fma CPU instruction. However, this is not always true, - /// and will be heavily dependant on designing algorithms with specific target hardware in - /// mind. - mul-add: func(self: vec3, a: vec3, b: vec3) -> vec3; - /// Casts all elements of `self` to `u32`. - as-uvec3: func(self: vec3) -> uvec3; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: vec3, rhs: vec3) -> bvec3; - /// Computes the squared length of `self`. - /// This is faster than `length()` as it avoids a square root operation. - length-squared: func(self: vec3) -> f32; - /// Returns `self` normalized to length 1.0 if possible, else returns a - /// fallback value. - /// In particular, if the input is zero (or very close to zero), or non-finite, - /// the result of this operation will be the fallback value. - /// See also [`Self::try_normalize()`]. - normalize-or: func(self: vec3, fallback: vec3) -> vec3; - /// Returns any unit vector that is orthogonal to the given one. - /// The input vector must be unit length. - /// # Panics - /// Will panic if `self` is not normalized when `glam_assert` is enabled. - any-orthonormal-vector: func(self: vec3) -> vec3; -} - -/// Methods for Vec3A -interface vec3-a { - use types.{reflect-reference}; - - /// Rotates around the z axis by `angle` (in radians). - rotate-z: func(self: vec3-a, angle: f32) -> vec3-a; - mul: func(p0: vec3-a, p1: f32) -> vec3-a; - /// Returns a vector containing the fractional part of the vector as `self - self.trunc()`. - /// Note that this differs from the GLSL implementation of `fract` which returns - /// `self - self.floor()`. - /// Note that this is fast but not precise for large numbers. - fract: func(self: vec3-a) -> vec3-a; - /// Returns the refraction direction for a given incident vector `self`, surface normal - /// `normal` and ratio of indices of refraction, `eta`. When total internal reflection occurs, - /// a zero vector will be returned. - /// `self` and `normal` must be normalized. - /// # Panics - /// Will panic if `self` or `normal` is not normalized when `glam_assert` is enabled. - refract: func(self: vec3-a, normal: vec3-a, eta: f32) -> vec3-a; - add: func(p0: vec3-a, p1: vec3-a) -> vec3-a; - /// Fused multiply-add. Computes `(self * a) + b` element-wise with only one rounding - /// error, yielding a more accurate result than an unfused multiply-add. - /// Using `mul_add` *may* be more performant than an unfused multiply-add if the target - /// architecture has a dedicated fma CPU instruction. However, this is not always true, - /// and will be heavily dependant on designing algorithms with specific target hardware in - /// mind. - mul-add: func(self: vec3-a, a: vec3-a, b: vec3-a) -> vec3-a; - sub: func(self: vec3-a, rhs: vec3-a) -> vec3-a; - /// Returns a vector with signs of `rhs` and the magnitudes of `self`. - copysign: func(self: vec3-a, rhs: vec3-a) -> vec3-a; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - /// NaN propogation does not follow IEEE 754-2008 semantics for minNum and may differ on - /// different SIMD architectures. - min: func(self: vec3-a, rhs: vec3-a) -> vec3-a; - /// Returns the vector projection of `self` onto `rhs`. - /// `rhs` must be of non-zero length. - /// # Panics - /// Will panic if `rhs` is zero length when `glam_assert` is enabled. - project-onto: func(self: vec3-a, rhs: vec3-a) -> vec3-a; - sub: func(p0: vec3-a, p1: f32) -> vec3-a; - /// Creates a 3D vector from `self` with the given value of `y`. - with-y: func(self: vec3-a, y: f32) -> vec3-a; - /// Casts all elements of `self` to `i16`. - as-i16vec3: func(self: vec3-a) -> i16-vec3; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: vec3-a, rhs: vec3-a) -> bvec3-a; - rem: func(self: vec3-a, rhs: vec3-a) -> vec3-a; - rem: func(p0: vec3-a, p1: vec3-a) -> vec3-a; - div: func(p0: vec3-a, p1: f32) -> vec3-a; - /// Creates a new vector. - new: func(x: f32, y: f32, z: f32) -> vec3-a; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: vec3-a) -> f32; - /// Returns a vector containing the integer part each element of `self`. This means numbers are - /// always truncated towards zero. - trunc: func(self: vec3-a) -> vec3-a; - /// Creates a vector with all elements set to `v`. - splat: func(v: f32) -> vec3-a; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: vec3-a) -> u64; - /// Returns `self` normalized to length 1.0. - /// For valid results, `self` must be finite and _not_ of length zero, nor very close to zero. - /// See also [`Self::try_normalize()`] and [`Self::normalize_or_zero()`]. - /// # Panics - /// Will panic if the resulting normalized vector is not finite when `glam_assert` is enabled. - normalize: func(self: vec3-a) -> vec3-a; - /// Rotates around `axis` by `angle` (in radians). - /// The axis must be a unit vector. - /// # Panics - /// Will panic if `axis` is not normalized when `glam_assert` is enabled. - rotate-axis: func(self: vec3-a, axis: vec3-a, angle: f32) -> vec3-a; - /// Creates a 4D vector from `self` and the given `w` value. - extend: func(self: vec3-a, w: f32) -> vec4; - /// Returns a vector containing the largest integer less than or equal to a number for each - /// element of `self`. - floor: func(self: vec3-a) -> vec3-a; - /// Creates a 3D vector from `self` with the given value of `x`. - with-x: func(self: vec3-a, x: f32) -> vec3-a; - /// Returns a vector containing `2^self` for each element of `self`. - exp2: func(self: vec3-a) -> vec3-a; - /// Creates a homogeneous coordinate from `self`, equivalent to `self.extend(1.0)`. - to-homogeneous: func(self: vec3-a) -> vec4; - div: func(self: vec3-a, rhs: vec3-a) -> vec3-a; - /// Casts all elements of `self` to `f64`. - as-dvec3: func(self: vec3-a) -> dvec3; - /// Returns a vector containing `e^self` (the exponential function) for each element of - /// `self`. - exp: func(self: vec3-a) -> vec3-a; - /// Rotates around the x axis by `angle` (in radians). - rotate-x: func(self: vec3-a, angle: f32) -> vec3-a; - /// Performs a spherical linear interpolation between `self` and `rhs` based on the value `s`. - /// When `s` is `0.0`, the result will be equal to `self`. When `s` is `1.0`, the result - /// will be equal to `rhs`. When `s` is outside of range `[0, 1]`, the result is linearly - /// extrapolated. - slerp: func(self: vec3-a, rhs: vec3-a, s: f32) -> vec3-a; - /// Returns `self` normalized to length 1.0 if possible, else returns zero. - /// In particular, if the input is zero (or very close to zero), or non-finite, - /// the result of this operation will be zero. - /// See also [`Self::try_normalize()`]. - normalize-or-zero: func(self: vec3-a) -> vec3-a; - /// Computes `1.0 / length()`. - /// For valid results, `self` must _not_ be of length zero. - length-recip: func(self: vec3-a) -> f32; - /// Returns `self` normalized to length 1.0 if possible, else returns a - /// fallback value. - /// In particular, if the input is zero (or very close to zero), or non-finite, - /// the result of this operation will be the fallback value. - /// See also [`Self::try_normalize()`]. - normalize-or: func(self: vec3-a, fallback: vec3-a) -> vec3-a; - /// Returns a vector with a length no less than `min`. - /// # Panics - /// Will panic if `min` is negative when `glam_assert` is enabled. - clamp-length-min: func(self: vec3-a, min: f32) -> vec3-a; - /// Returns the vector rejection of `self` from `rhs`. - /// The vector rejection is the vector perpendicular to the projection of `self` onto - /// `rhs`, in rhs words the result of `self - self.project_onto(rhs)`. - /// `rhs` must be normalized. - /// # Panics - /// Will panic if `rhs` is not normalized when `glam_assert` is enabled. - reject-from-normalized: func(self: vec3-a, rhs: vec3-a) -> vec3-a; - add: func(self: vec3-a, rhs: vec3-a) -> vec3-a; - /// Performs `is_nan` on each element of self, returning a vector mask of the results. - /// In other words, this computes `[x.is_nan(), y.is_nan(), ...]`. - is-nan-mask: func(self: vec3-a) -> bvec3-a; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: vec3-a) -> vec3-a; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// [Euclidean division]: f32::rem_euclid - rem-euclid: func(self: vec3-a, rhs: vec3-a) -> vec3-a; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: vec3-a) -> f32; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: vec3-a, rhs: vec3-a) -> bvec3-a; - /// Casts all elements of `self` to `i8`. - as-i8vec3: func(self: vec3-a) -> i8-vec3; - /// Projects a homogeneous coordinate to 3D space by performing perspective divide. - /// # Panics - /// Will panic if `v.w` is `0` when `glam_assert` is enabled. - from-homogeneous: func(v: vec4) -> vec3-a; - /// Returns any unit vector that is orthogonal to the given one. - /// The input vector must be unit length. - /// # Panics - /// Will panic if `self` is not normalized when `glam_assert` is enabled. - any-orthonormal-vector: func(self: vec3-a) -> vec3-a; - /// Returns a bitmask with the lowest 3 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: vec3-a) -> u32; - /// Component-wise clamping of values, similar to [`f32::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: vec3-a, min: vec3-a, max: vec3-a) -> vec3-a; - /// Returns a vector containing the nearest integer to a number for each element of `self`. - /// Round half-way cases away from 0.0. - round: func(self: vec3-a) -> vec3-a; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: vec3-a) -> bool; - /// Computes the Euclidean distance between two points in space. - distance: func(self: vec3-a, rhs: vec3-a) -> f32; - sub: func(p0: vec3-a, p1: vec3-a) -> vec3-a; - /// Returns the vector rejection of `self` from `rhs`. - /// The vector rejection is the vector perpendicular to the projection of `self` onto - /// `rhs`, in rhs words the result of `self - self.project_onto(rhs)`. - /// `rhs` must be of non-zero length. - /// # Panics - /// Will panic if `rhs` has a length of zero when `glam_assert` is enabled. - reject-from: func(self: vec3-a, rhs: vec3-a) -> vec3-a; - neg: func(self: vec3-a) -> vec3-a; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - /// NaN propogation does not follow IEEE 754-2008 semantics for maxNum and may differ on - /// different SIMD architectures. - max: func(self: vec3-a, rhs: vec3-a) -> vec3-a; - mul: func(p0: vec3-a, p1: vec3-a) -> vec3-a; - /// Performs a linear interpolation between `self` and `rhs` based on the value `s`. - /// When `s` is `0.0`, the result will be equal to `self`. When `s` is `1.0`, the result - /// will be equal to `rhs`. When `s` is outside of range `[0, 1]`, the result is linearly - /// extrapolated. - lerp: func(self: vec3-a, rhs: vec3-a, s: f32) -> vec3-a; - /// Converts `self` to `[x, y, z]` - to-array: func(self: vec3-a) -> list; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - max-element: func(self: vec3-a) -> f32; - /// Creates a 3D vector from `self` with the given value of `z`. - with-z: func(self: vec3-a, z: f32) -> vec3-a; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec3-a, if-true: vec3-a, if-false: vec3-a) -> vec3-a; - /// Returns the vector projection of `self` onto `rhs`. - /// `rhs` must be normalized. - /// # Panics - /// Will panic if `rhs` is not normalized when `glam_assert` is enabled. - project-onto-normalized: func(self: vec3-a, rhs: vec3-a) -> vec3-a; - add: func(p0: vec3-a, p1: f32) -> vec3-a; - /// Casts all elements of `self` to `i32`. - as-ivec3: func(self: vec3-a) -> ivec3; - /// Computes the length of `self`. - length: func(self: vec3-a) -> f32; - /// Creates a [`Vec3A`] from the `x`, `y` and `z` elements of `self` discarding `w`. - /// On architectures where SIMD is supported such as SSE2 on `x86_64` this conversion is a noop. - from-vec4: func(v: vec4) -> vec3-a; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - min-element: func(self: vec3-a) -> f32; - /// Casts all elements of `self` to `u64`. - as-u64vec3: func(self: vec3-a) -> u64-vec3; - /// Returns a vector with a length no less than `min` and no more than `max`. - /// # Panics - /// Will panic if `min` is greater than `max`, or if either `min` or `max` is negative, when `glam_assert` is enabled. - clamp-length: func(self: vec3-a, min: f32, max: f32) -> vec3-a; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - div-euclid: func(self: vec3-a, rhs: vec3-a) -> vec3-a; - /// Returns a vector containing the fractional part of the vector as `self - self.floor()`. - /// Note that this differs from the Rust implementation of `fract` which returns - /// `self - self.trunc()`. - /// Note that this is fast but not precise for large numbers. - fract-gl: func(self: vec3-a) -> vec3-a; - /// Returns a vector containing the reciprocal `1.0/n` of each element of `self`. - recip: func(self: vec3-a) -> vec3-a; - /// Returns a vector containing the base 2 logarithm for each element of `self`. - /// This returns NaN when the element is negative and negative infinity when the element is zero. - log2: func(self: vec3-a) -> vec3-a; - /// Returns true if the absolute difference of all elements between `self` and `rhs` is - /// less than or equal to `max_abs_diff`. - /// This can be used to compare if two vectors contain similar elements. It works best when - /// comparing with a known value. The `max_abs_diff` that should be used used depends on - /// the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: vec3-a, rhs: vec3-a, max-abs-diff: f32) -> bool; - /// Creates a 2D vector from the `x` and `y` elements of `self`, discarding `z`. - /// Truncation may also be performed by using [`self.xy()`][crate::swizzles::Vec3Swizzles::xy()]. - truncate: func(self: vec3-a) -> vec2; - /// Returns a vector containing the natural logarithm for each element of `self`. - /// This returns NaN when the element is negative and negative infinity when the element is zero. - ln: func(self: vec3-a) -> vec3-a; - /// Performs `is_finite` on each element of self, returning a vector mask of the results. - /// In other words, this computes `[x.is_finite(), y.is_finite(), ...]`. - is-finite-mask: func(self: vec3-a) -> bvec3-a; - /// Rotates towards `rhs` up to `max_angle` (in radians). - /// When `max_angle` is `0.0`, the result will be equal to `self`. When `max_angle` is equal to - /// `self.angle_between(rhs)`, the result will be parallel to `rhs`. If `max_angle` is negative, - /// rotates towards the exact opposite of `rhs`. Will not go past the target. - rotate-towards: func(self: vec3-a, rhs: vec3-a, max-angle: f32) -> vec3-a; - to-vec3: func(self: vec3-a) -> vec3; - /// Casts all elements of `self` to `u8`. - as-u8vec3: func(self: vec3-a) -> u8-vec3; - /// Returns a vector with a length no more than `max`. - /// # Panics - /// Will panic if `max` is negative when `glam_assert` is enabled. - clamp-length-max: func(self: vec3-a, max: f32) -> vec3-a; - /// Returns some vector that is orthogonal to the given one. - /// The input vector must be finite and non-zero. - /// The output vector is not necessarily unit length. For that use - /// [`Self::any_orthonormal_vector()`] instead. - any-orthogonal-vector: func(self: vec3-a) -> vec3-a; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: vec3-a, rhs: vec3-a) -> bvec3-a; - /// Calculates the midpoint between `self` and `rhs`. - /// The midpoint is the average of, or halfway point between, two vectors. - /// `a.midpoint(b)` should yield the same result as `a.lerp(b, 0.5)` - /// while being slightly cheaper to compute. - midpoint: func(self: vec3-a, rhs: vec3-a) -> vec3-a; - /// Returns `true` if, and only if, all elements are finite. If any element is either - /// `NaN`, positive or negative infinity, this will return `false`. - is-finite: func(self: vec3-a) -> bool; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: vec3-a, rhs: vec3-a) -> f32; - /// Returns a vector containing each element of `self` raised to the power of `n`. - powf: func(self: vec3-a, n: f32) -> vec3-a; - /// Casts all elements of `self` to `u16`. - as-u16vec3: func(self: vec3-a) -> u16-vec3; - eq: func(self: vec3-a, rhs: vec3-a) -> bool; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: vec3-a, rhs: vec3-a) -> bvec3-a; - /// Returns a vector containing the smallest integer greater than or equal to a number for - /// each element of `self`. - ceil: func(self: vec3-a) -> vec3-a; - /// Computes the squared length of `self`. - /// This is faster than `length()` as it avoids a square root operation. - length-squared: func(self: vec3-a) -> f32; - /// Returns the angle (in radians) between two vectors in the range `[0, +π]`. - /// The inputs do not need to be unit vectors however they must be non-zero. - angle-between: func(self: vec3-a, rhs: vec3-a) -> f32; - /// Creates a new vector from an array. - from-array: func(a: list) -> vec3-a; - clone: func(self: vec3-a) -> vec3-a; - /// Rotates around the y axis by `angle` (in radians). - rotate-y: func(self: vec3-a, angle: f32) -> vec3-a; - /// Computes the cross product of `self` and `rhs`. - cross: func(self: vec3-a, rhs: vec3-a) -> vec3-a; - div: func(p0: vec3-a, p1: vec3-a) -> vec3-a; - /// Returns whether `self` is length `1.0` or not. - /// Uses a precision threshold of approximately `1e-4`. - is-normalized: func(self: vec3-a) -> bool; - rem: func(p0: vec3-a, p1: f32) -> vec3-a; - /// Casts all elements of `self` to `u32`. - as-uvec3: func(self: vec3-a) -> uvec3; - /// Casts all elements of `self` to `i64`. - as-i64vec3: func(self: vec3-a) -> i64-vec3; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: vec3-a) -> u64; - /// Moves towards `rhs` based on the value `d`. - /// When `d` is `0.0`, the result will be equal to `self`. When `d` is equal to - /// `self.distance(rhs)`, the result will be equal to `rhs`. Will not go past `rhs`. - move-towards: func(self: vec3-a, rhs: vec3-a, d: f32) -> vec3-a; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: vec3-a, rhs: vec3-a) -> bvec3-a; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: vec3-a, rhs: vec3-a) -> f32; - /// Returns a vector with elements representing the sign of `self`. - /// - `1.0` if the number is positive, `+0.0` or `INFINITY` - /// - `-1.0` if the number is negative, `-0.0` or `NEG_INFINITY` - /// - `NAN` if the number is `NAN` - signum: func(self: vec3-a) -> vec3-a; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: vec3-a, rhs: vec3-a) -> vec3-a; - mul: func(self: vec3-a, rhs: vec3-a) -> vec3-a; - /// Returns the reflection vector for a given incident vector `self` and surface normal - /// `normal`. - /// `normal` must be normalized. - /// # Panics - /// Will panic if `normal` is not normalized when `glam_assert` is enabled. - reflect: func(self: vec3-a, normal: vec3-a) -> vec3-a; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: vec3-a, rhs: vec3-a) -> bvec3-a; -} - -/// Methods for Vec4 -interface vec4 { - use types.{reflect-reference}; - - /// Returns a vector containing the nearest integer to a number for each element of `self`. - /// Round half-way cases away from 0.0. - round: func(self: vec4) -> vec4; - sub: func(p0: vec4, p1: vec4) -> vec4; - /// Returns the element-wise quotient of [Euclidean division] of `self` by `rhs`. - div-euclid: func(self: vec4, rhs: vec4) -> vec4; - /// Returns a vector containing the minimum values for each element of `self` and `rhs`. - /// In other words this computes `[min(x, rhs.x), min(self.y, rhs.y), ..]`. - /// NaN propogation does not follow IEEE 754-2008 semantics for minNum and may differ on - /// different SIMD architectures. - min: func(self: vec4, rhs: vec4) -> vec4; - /// Returns a vector containing the natural logarithm for each element of `self`. - /// This returns NaN when the element is negative and negative infinity when the element is zero. - ln: func(self: vec4) -> vec4; - /// Computes the length of `self`. - length: func(self: vec4) -> f32; - eq: func(self: vec4, rhs: vec4) -> bool; - /// Casts all elements of `self` to `i32`. - as-ivec4: func(self: vec4) -> ivec4; - /// Casts all elements of `self` to `i16`. - as-i16vec4: func(self: vec4) -> i16-vec4; - /// Returns a vector with a length no less than `min`. - /// # Panics - /// Will panic if `min` is negative when `glam_assert` is enabled. - clamp-length-min: func(self: vec4, min: f32) -> vec4; - /// Returns a vector with a length no more than `max`. - /// # Panics - /// Will panic if `max` is negative when `glam_assert` is enabled. - clamp-length-max: func(self: vec4, max: f32) -> vec4; - /// Computes the squared length of `self`. - /// This is faster than `length()` as it avoids a square root operation. - length-squared: func(self: vec4) -> f32; - /// Returns a vector with a length no less than `min` and no more than `max`. - /// # Panics - /// Will panic if `min` is greater than `max`, or if either `min` or `max` is negative, when `glam_assert` is enabled. - clamp-length: func(self: vec4, min: f32, max: f32) -> vec4; - /// Creates a vector with all elements set to `v`. - splat: func(v: f32) -> vec4; - div: func(p0: vec4, p1: f32) -> vec4; - /// Returns the refraction direction for a given incident vector `self`, surface normal - /// `normal` and ratio of indices of refraction, `eta`. When total internal reflection occurs, - /// a zero vector will be returned. - /// `self` and `normal` must be normalized. - /// # Panics - /// Will panic if `self` or `normal` is not normalized when `glam_assert` is enabled. - refract: func(self: vec4, normal: vec4, eta: f32) -> vec4; - /// Calculates the midpoint between `self` and `rhs`. - /// The midpoint is the average of, or halfway point between, two vectors. - /// `a.midpoint(b)` should yield the same result as `a.lerp(b, 0.5)` - /// while being slightly cheaper to compute. - midpoint: func(self: vec4, rhs: vec4) -> vec4; - /// Returns the horizontal maximum of `self`. - /// In other words this computes `max(x, y, ..)`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - max-element: func(self: vec4) -> f32; - add: func(p0: vec4, p1: vec4) -> vec4; - /// Creates a 3D vector from the `x`, `y` and `z` elements of `self`, discarding `w`. - /// Truncation to [`Vec3`] may also be performed by using [`self.xyz()`][crate::swizzles::Vec4Swizzles::xyz()]. - /// To truncate to [`Vec3A`] use [`Vec3A::from_vec4()`]. - truncate: func(self: vec4) -> vec3; - mul: func(self: vec4, rhs: vec4) -> vec4; - /// Returns a vector containing the smallest integer greater than or equal to a number for - /// each element of `self`. - ceil: func(self: vec4) -> vec4; - rem: func(p0: vec4, p1: vec4) -> vec4; - /// Projects a homogeneous coordinate to 3D space by performing perspective divide. - /// To project to [`Vec3A`] use [`Vec3A::from_homogeneous()`]. - /// # Panics - /// Will panic if `self.w` is `0` when `glam_assert` is enabled. - project: func(self: vec4) -> vec3; - /// Computes `1.0 / length()`. - /// For valid results, `self` must _not_ be of length zero. - length-recip: func(self: vec4) -> f32; - /// Returns the element-wise remainder of [Euclidean division] of `self` by `rhs`. - /// [Euclidean division]: f32::rem_euclid - rem-euclid: func(self: vec4, rhs: vec4) -> vec4; - /// Compute the squared euclidean distance between two points in space. - distance-squared: func(self: vec4, rhs: vec4) -> f32; - rem: func(self: vec4, rhs: vec4) -> vec4; - /// Casts all elements of `self` to `u32`. - as-uvec4: func(self: vec4) -> uvec4; - /// Casts all elements of `self` to `u8`. - as-u8vec4: func(self: vec4) -> u8-vec4; - /// Returns a vector containing the fractional part of the vector as `self - self.floor()`. - /// Note that this differs from the Rust implementation of `fract` which returns - /// `self - self.trunc()`. - /// Note that this is fast but not precise for large numbers. - fract-gl: func(self: vec4) -> vec4; - sub: func(p0: vec4, p1: f32) -> vec4; - /// Casts all elements of `self` to `f64`. - as-dvec4: func(self: vec4) -> dvec4; - /// Returns a vector mask containing the result of a `>=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x >= rhs.x, self.y >= rhs.y, ..]` for all - /// elements. - cmpge: func(self: vec4, rhs: vec4) -> bvec4-a; - /// Returns a vector containing the absolute value of each element of `self`. - abs: func(self: vec4) -> vec4; - /// Creates a 4D vector from `self` with the given value of `w`. - with-w: func(self: vec4, w: f32) -> vec4; - /// Returns the horizontal minimum of `self`. - /// In other words this computes `min(x, y, ..)`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - min-element: func(self: vec4) -> f32; - /// Returns the product of all elements of `self`. - /// In other words, this computes `self.x * self.y * ..`. - element-product: func(self: vec4) -> f32; - /// Returns the vector rejection of `self` from `rhs`. - /// The vector rejection is the vector perpendicular to the projection of `self` onto - /// `rhs`, in rhs words the result of `self - self.project_onto(rhs)`. - /// `rhs` must be normalized. - /// # Panics - /// Will panic if `rhs` is not normalized when `glam_assert` is enabled. - reject-from-normalized: func(self: vec4, rhs: vec4) -> vec4; - /// Returns `self` normalized to length 1.0 if possible, else returns a - /// fallback value. - /// In particular, if the input is zero (or very close to zero), or non-finite, - /// the result of this operation will be the fallback value. - /// See also [`Self::try_normalize()`]. - normalize-or: func(self: vec4, fallback: vec4) -> vec4; - /// Returns the index of the first maximum element of `self`. - max-position: func(self: vec4) -> u64; - /// Returns a vector mask containing the result of a `>` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x > rhs.x, self.y > rhs.y, ..]` for all - /// elements. - cmpgt: func(self: vec4, rhs: vec4) -> bvec4-a; - /// Returns a vector with signs of `rhs` and the magnitudes of `self`. - copysign: func(self: vec4, rhs: vec4) -> vec4; - /// Returns a vector containing the integer part each element of `self`. This means numbers are - /// always truncated towards zero. - trunc: func(self: vec4) -> vec4; - mul: func(p0: vec4, p1: vec4) -> vec4; - /// Moves towards `rhs` based on the value `d`. - /// When `d` is `0.0`, the result will be equal to `self`. When `d` is equal to - /// `self.distance(rhs)`, the result will be equal to `rhs`. Will not go past `rhs`. - move-towards: func(self: vec4, rhs: vec4, d: f32) -> vec4; - sub: func(self: vec4, rhs: vec4) -> vec4; - /// Returns a vector containing `2^self` for each element of `self`. - exp2: func(self: vec4) -> vec4; - /// Returns the vector projection of `self` onto `rhs`. - /// `rhs` must be normalized. - /// # Panics - /// Will panic if `rhs` is not normalized when `glam_assert` is enabled. - project-onto-normalized: func(self: vec4, rhs: vec4) -> vec4; - /// Returns the index of the first minimum element of `self`. - min-position: func(self: vec4) -> u64; - add: func(p0: vec4, p1: f32) -> vec4; - /// Component-wise clamping of values, similar to [`f32::clamp`]. - /// Each element in `min` must be less-or-equal to the corresponding element in `max`. - /// NaN propogation does not follow IEEE 754-2008 semantics and may differ on - /// different SIMD architectures. - /// # Panics - /// Will panic if `min` is greater than `max` when `glam_assert` is enabled. - clamp: func(self: vec4, min: vec4, max: vec4) -> vec4; - /// Returns a vector mask containing the result of a `<` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x < rhs.x, self.y < rhs.y, ..]` for all - /// elements. - cmplt: func(self: vec4, rhs: vec4) -> bvec4-a; - /// Creates a new vector. - new: func(x: f32, y: f32, z: f32, w: f32) -> vec4; - /// Casts all elements of `self` to `u16`. - as-u16vec4: func(self: vec4) -> u16-vec4; - /// Returns a bitmask with the lowest 4 bits set to the sign bits from the elements of `self`. - /// A negative element results in a `1` bit and a positive element in a `0` bit. Element `x` goes - /// into the first lowest bit, element `y` into the second, etc. - /// An element is negative if it has a negative sign, including -0.0, NaNs with negative sign - /// bit and negative infinity. - is-negative-bitmask: func(self: vec4) -> u32; - clone: func(self: vec4) -> vec4; - div: func(self: vec4, rhs: vec4) -> vec4; - div: func(p0: vec4, p1: vec4) -> vec4; - mul: func(p0: vec4, p1: f32) -> vec4; - /// Returns `self` normalized to length 1.0. - /// For valid results, `self` must be finite and _not_ of length zero, nor very close to zero. - /// See also [`Self::try_normalize()`] and [`Self::normalize_or_zero()`]. - /// # Panics - /// Will panic if the resulting normalized vector is not finite when `glam_assert` is enabled. - normalize: func(self: vec4) -> vec4; - /// Returns true if the absolute difference of all elements between `self` and `rhs` is - /// less than or equal to `max_abs_diff`. - /// This can be used to compare if two vectors contain similar elements. It works best when - /// comparing with a known value. The `max_abs_diff` that should be used used depends on - /// the values being compared against. - /// For more see - /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). - abs-diff-eq: func(self: vec4, rhs: vec4, max-abs-diff: f32) -> bool; - /// Returns a vector with elements representing the sign of `self`. - /// - `1.0` if the number is positive, `+0.0` or `INFINITY` - /// - `-1.0` if the number is negative, `-0.0` or `NEG_INFINITY` - /// - `NAN` if the number is `NAN` - signum: func(self: vec4) -> vec4; - /// Returns the reflection vector for a given incident vector `self` and surface normal - /// `normal`. - /// `normal` must be normalized. - /// # Panics - /// Will panic if `normal` is not normalized when `glam_assert` is enabled. - reflect: func(self: vec4, normal: vec4) -> vec4; - neg: func(self: vec4) -> vec4; - /// Casts all elements of `self` to `u64`. - as-u64vec4: func(self: vec4) -> u64-vec4; - /// Returns a vector containing the largest integer less than or equal to a number for each - /// element of `self`. - floor: func(self: vec4) -> vec4; - /// Returns a vector containing each element of `self` raised to the power of `n`. - powf: func(self: vec4, n: f32) -> vec4; - /// Returns the sum of all elements of `self`. - /// In other words, this computes `self.x + self.y + ..`. - element-sum: func(self: vec4) -> f32; - /// Returns whether `self` is length `1.0` or not. - /// Uses a precision threshold of approximately `1e-4`. - is-normalized: func(self: vec4) -> bool; - /// Returns a vector mask containing the result of a `==` comparison for each element of - /// `self` and `rhs`. - /// In other words, this computes `[self.x == rhs.x, self.y == rhs.y, ..]` for all - /// elements. - cmpeq: func(self: vec4, rhs: vec4) -> bvec4-a; - /// Returns a vector where every component is the dot product of `self` and `rhs`. - dot-into-vec: func(self: vec4, rhs: vec4) -> vec4; - /// Casts all elements of `self` to `i64`. - as-i64vec4: func(self: vec4) -> i64-vec4; - /// Returns a vector containing `e^self` (the exponential function) for each element of - /// `self`. - exp: func(self: vec4) -> vec4; - /// Returns a vector mask containing the result of a `<=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x <= rhs.x, self.y <= rhs.y, ..]` for all - /// elements. - cmple: func(self: vec4, rhs: vec4) -> bvec4-a; - /// Returns the vector projection of `self` onto `rhs`. - /// `rhs` must be of non-zero length. - /// # Panics - /// Will panic if `rhs` is zero length when `glam_assert` is enabled. - project-onto: func(self: vec4, rhs: vec4) -> vec4; - /// Performs a linear interpolation between `self` and `rhs` based on the value `s`. - /// When `s` is `0.0`, the result will be equal to `self`. When `s` is `1.0`, the result - /// will be equal to `rhs`. When `s` is outside of range `[0, 1]`, the result is linearly - /// extrapolated. - lerp: func(self: vec4, rhs: vec4, s: f32) -> vec4; - /// Casts all elements of `self` to `i8`. - as-i8vec4: func(self: vec4) -> i8-vec4; - /// Returns `true` if, and only if, all elements are finite. If any element is either - /// `NaN`, positive or negative infinity, this will return `false`. - is-finite: func(self: vec4) -> bool; - /// Returns a vector containing the base 2 logarithm for each element of `self`. - /// This returns NaN when the element is negative and negative infinity when the element is zero. - log2: func(self: vec4) -> vec4; - /// Returns a vector containing the reciprocal `1.0/n` of each element of `self`. - recip: func(self: vec4) -> vec4; - /// Creates a vector from the elements in `if_true` and `if_false`, selecting which to use - /// for each element of `self`. - /// A true element in the mask uses the corresponding element from `if_true`, and false - /// uses the element from `if_false`. - select: func(mask: bvec4-a, if-true: vec4, if-false: vec4) -> vec4; - rem: func(p0: vec4, p1: f32) -> vec4; - /// Returns `true` if any elements are `NaN`. - is-nan: func(self: vec4) -> bool; - add: func(self: vec4, rhs: vec4) -> vec4; - /// Creates a 4D vector from `self` with the given value of `z`. - with-z: func(self: vec4, z: f32) -> vec4; - /// Performs `is_finite` on each element of self, returning a vector mask of the results. - /// In other words, this computes `[x.is_finite(), y.is_finite(), ...]`. - is-finite-mask: func(self: vec4) -> bvec4-a; - /// Returns `self` normalized to length 1.0 if possible, else returns zero. - /// In particular, if the input is zero (or very close to zero), or non-finite, - /// the result of this operation will be zero. - /// See also [`Self::try_normalize()`]. - normalize-or-zero: func(self: vec4) -> vec4; - /// Converts `self` to `[x, y, z, w]` - to-array: func(self: vec4) -> list; - /// Creates a 4D vector from `self` with the given value of `x`. - with-x: func(self: vec4, x: f32) -> vec4; - /// Creates a 4D vector from `self` with the given value of `y`. - with-y: func(self: vec4, y: f32) -> vec4; - /// Returns a vector containing the maximum values for each element of `self` and `rhs`. - /// In other words this computes `[max(self.x, rhs.x), max(self.y, rhs.y), ..]`. - /// NaN propogation does not follow IEEE 754-2008 semantics for maxNum and may differ on - /// different SIMD architectures. - max: func(self: vec4, rhs: vec4) -> vec4; - /// Computes the dot product of `self` and `rhs`. - dot: func(self: vec4, rhs: vec4) -> f32; - /// Creates a new vector from an array. - from-array: func(a: list) -> vec4; - /// Performs `is_nan` on each element of self, returning a vector mask of the results. - /// In other words, this computes `[x.is_nan(), y.is_nan(), ...]`. - is-nan-mask: func(self: vec4) -> bvec4-a; - /// Returns a vector containing the fractional part of the vector as `self - self.trunc()`. - /// Note that this differs from the GLSL implementation of `fract` which returns - /// `self - self.floor()`. - /// Note that this is fast but not precise for large numbers. - fract: func(self: vec4) -> vec4; - /// Returns the vector rejection of `self` from `rhs`. - /// The vector rejection is the vector perpendicular to the projection of `self` onto - /// `rhs`, in rhs words the result of `self - self.project_onto(rhs)`. - /// `rhs` must be of non-zero length. - /// # Panics - /// Will panic if `rhs` has a length of zero when `glam_assert` is enabled. - reject-from: func(self: vec4, rhs: vec4) -> vec4; - /// Computes the Euclidean distance between two points in space. - distance: func(self: vec4, rhs: vec4) -> f32; - /// Returns a vector mask containing the result of a `!=` comparison for each element of - /// `self` and `rhs`. - /// In other words this computes `[self.x != rhs.x, self.y != rhs.y, ..]` for all - /// elements. - cmpne: func(self: vec4, rhs: vec4) -> bvec4-a; - /// Fused multiply-add. Computes `(self * a) + b` element-wise with only one rounding - /// error, yielding a more accurate result than an unfused multiply-add. - /// Using `mul_add` *may* be more performant than an unfused multiply-add if the target - /// architecture has a dedicated fma CPU instruction. However, this is not always true, - /// and will be heavily dependant on designing algorithms with specific target hardware in - /// mind. - mul-add: func(self: vec4, a: vec4, b: vec4) -> vec4; -} - -/// Methods for SmolStr -interface smol-str { - use types.{reflect-reference}; - - is-empty: func(self: smol-str) -> bool; - eq: func(self: smol-str, other: smol-str) -> bool; - to-string: func(self: smol-str) -> string; - is-heap-allocated: func(self: smol-str) -> bool; - clone: func(self: smol-str) -> smol-str; - len: func(self: smol-str) -> u64; -} - -/// Methods for NonNilUuid -interface non-nil-uuid { - use types.{reflect-reference}; - - clone: func(self: non-nil-uuid) -> non-nil-uuid; - /// Get the underlying [`Uuid`] value. - get: func(self: non-nil-uuid) -> uuid; - eq: func(self: non-nil-uuid, other: non-nil-uuid) -> bool; - eq: func(p0: non-nil-uuid, p1: uuid) -> bool; - assert-receiver-is-total-eq: func(self: non-nil-uuid); -} - -/// Methods for Uuid -interface uuid { - use types.{reflect-reference}; - - /// Creates a UUID from two 64bit values. - /// # Examples - /// Basic usage: - /// ``` - /// # use uuid::Uuid; - /// let hi = 0xa1a2a3a4b1b2c1c2u64; - /// let lo = 0xd1d2d3d4d5d6d7d8u64; - /// let uuid = Uuid::from_u64_pair(hi, lo); - /// assert_eq!( - /// "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8", - /// uuid.hyphenated().to_string(), - /// ); - /// ``` - from-u64-pair: func(high-bits: u64, low-bits: u64) -> uuid; - /// The 'nil UUID' (all zeros). - /// The nil UUID is a special form of UUID that is specified to have all - /// 128 bits set to zero. - /// # References - /// * [Nil UUID in RFC 9562](https://www.ietf.org/rfc/rfc9562.html#section-5.9) - /// # Examples - /// Basic usage: - /// ``` - /// # use uuid::Uuid; - /// let uuid = Uuid::nil(); - /// assert_eq!( - /// "00000000-0000-0000-0000-000000000000", - /// uuid.hyphenated().to_string(), - /// ); - /// ``` - nil: func() -> uuid; - /// Creates a random UUID. - /// This uses the [`getrandom`] crate to utilise the operating system's RNG - /// as the source of random numbers. If you'd like to use a custom - /// generator, don't use this method: generate random bytes using your - /// custom generator and pass them to the - /// [`uuid::Builder::from_random_bytes`][from_random_bytes] function - /// instead. - /// Note that usage of this method requires the `v4` feature of this crate - /// to be enabled. - /// # Examples - /// Basic usage: - /// ``` - /// # use uuid::{Uuid, Version}; - /// let uuid = Uuid::new_v4(); - /// assert_eq!(Some(Version::Random), uuid.get_version()); - /// ``` - /// # References - /// * [UUID Version 4 in RFC 9562](https://www.ietf.org/rfc/rfc9562.html#section-5.4) - /// [`getrandom`]: https://crates.io/crates/getrandom - /// [from_random_bytes]: struct.Builder.html#method.from_random_bytes - new-v4: func() -> uuid; - /// Creates a UUID from a 128bit value in little-endian order. - /// The entire value will be flipped to convert into big-endian order. - /// This is based on the endianness of the UUID, rather than the target - /// environment so bytes will be flipped on both big and little endian - /// machines. - /// # Examples - /// Basic usage: - /// ``` - /// # use uuid::Uuid; - /// let v = 0xa1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8u128; - /// let uuid = Uuid::from_u128_le(v); - /// assert_eq!( - /// "d8d7d6d5-d4d3-d2d1-c2c1-b2b1a4a3a2a1", - /// uuid.hyphenated().to_string(), - /// ); - /// ``` - from-u128-le: func(v: u64) -> uuid; - /// Creates a UUID from a 128bit value. - /// # Examples - /// Basic usage: - /// ``` - /// # use uuid::Uuid; - /// let v = 0xa1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8u128; - /// let uuid = Uuid::from_u128(v); - /// assert_eq!( - /// "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8", - /// uuid.hyphenated().to_string(), - /// ); - /// ``` - from-u128: func(v: u64) -> uuid; - /// Returns the bytes of the UUID in little-endian order. - /// The bytes for each field will be flipped to convert into little-endian order. - /// This is based on the endianness of the UUID, rather than the target environment - /// so bytes will be flipped on both big and little endian machines. - /// Note that ordering is applied to each _field_, rather than to the bytes as a whole. - /// This ordering is compatible with Microsoft's mixed endian GUID format. - /// # Examples - /// ``` - /// use uuid::Uuid; - /// # fn main() -> Result<(), uuid::Error> { - /// let uuid = Uuid::parse_str("a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8")?; - /// assert_eq!( - /// uuid.to_bytes_le(), - /// ([ - /// 0xa4, 0xa3, 0xa2, 0xa1, 0xb2, 0xb1, 0xc2, 0xc1, 0xd1, 0xd2, - /// 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8 - /// ]) - /// ); - /// # Ok(()) - /// # } - /// ``` - to-bytes-le: func(self: uuid) -> list; - assert-receiver-is-total-eq: func(self: uuid); - /// A buffer that can be used for `encode_...` calls, that is - /// guaranteed to be long enough for any of the format adapters. - /// # Examples - /// ``` - /// # use uuid::Uuid; - /// let uuid = Uuid::nil(); - /// assert_eq!( - /// uuid.simple().encode_lower(&mut Uuid::encode_buffer()), - /// "00000000000000000000000000000000" - /// ); - /// assert_eq!( - /// uuid.hyphenated() - /// .encode_lower(&mut Uuid::encode_buffer()), - /// "00000000-0000-0000-0000-000000000000" - /// ); - /// assert_eq!( - /// uuid.urn().encode_lower(&mut Uuid::encode_buffer()), - /// "urn:uuid:00000000-0000-0000-0000-000000000000" - /// ); - /// ``` - encode-buffer: func() -> list; - /// Tests if the UUID is max (all ones). - is-max: func(self: uuid) -> bool; - clone: func(self: uuid) -> uuid; - /// Creates a UUID using the supplied bytes. - /// # Examples - /// Basic usage: - /// ``` - /// # fn main() -> Result<(), uuid::Error> { - /// # use uuid::Uuid; - /// let bytes = [ - /// 0xa1, 0xa2, 0xa3, 0xa4, - /// 0xb1, 0xb2, - /// 0xc1, 0xc2, - /// 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, - /// ]; - /// let uuid = Uuid::from_bytes(bytes); - /// assert_eq!( - /// uuid.hyphenated().to_string(), - /// "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8" - /// ); - /// # Ok(()) - /// # } - /// ``` - from-bytes: func(bytes: list) -> uuid; - /// Returns a 128bit little-endian value containing the value. - /// The bytes in the `u128` will be flipped to convert into big-endian - /// order. This is based on the endianness of the UUID, rather than the - /// target environment so bytes will be flipped on both big and little - /// endian machines. - /// Note that this will produce a different result than - /// [`Uuid::to_fields_le`], because the entire UUID is reversed, rather - /// than reversing the individual fields in-place. - /// # Examples - /// ``` - /// # use uuid::Uuid; - /// # fn main() -> Result<(), uuid::Error> { - /// let uuid = Uuid::parse_str("a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8")?; - /// assert_eq!( - /// uuid.to_u128_le(), - /// 0xd8d7d6d5d4d3d2d1c2c1b2b1a4a3a2a1, - /// ); - /// # Ok(()) - /// # } - /// ``` - to-u128-le: func(self: uuid) -> u64; - /// The 'max UUID' (all ones). - /// The max UUID is a special form of UUID that is specified to have all - /// 128 bits set to one. - /// # References - /// * [Max UUID in RFC 9562](https://www.ietf.org/rfc/rfc9562.html#section-5.10) - /// # Examples - /// Basic usage: - /// ``` - /// # use uuid::Uuid; - /// let uuid = Uuid::max(); - /// assert_eq!( - /// "ffffffff-ffff-ffff-ffff-ffffffffffff", - /// uuid.hyphenated().to_string(), - /// ); - /// ``` - max: func() -> uuid; - /// Consumes self and returns the underlying byte value of the UUID. - /// # Examples - /// ``` - /// # use uuid::Uuid; - /// let bytes = [ - /// 0xa1, 0xa2, 0xa3, 0xa4, - /// 0xb1, 0xb2, - /// 0xc1, 0xc2, - /// 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, - /// ]; - /// let uuid = Uuid::from_bytes(bytes); - /// assert_eq!(bytes, uuid.into_bytes()); - /// ``` - into-bytes: func(self: uuid) -> list; - /// If the UUID is the correct version (v1, or v6) this will return the - /// node value as a 6-byte array. For other versions this will return `None`. - get-node-id: func(self: uuid) -> option>; - eq: func(p0: uuid, p1: uuid) -> bool; - /// Creates a UUID using the supplied bytes in little endian order. - /// Note that ordering is applied to each _field_, rather than to the bytes as a whole. - /// This ordering is compatible with Microsoft's mixed endian GUID format. - /// # Examples - /// Basic usage: - /// ``` - /// # fn main() -> Result<(), uuid::Error> { - /// # use uuid::Uuid; - /// let bytes = [ - /// 0xa1, 0xa2, 0xa3, 0xa4, - /// 0xb1, 0xb2, - /// 0xc1, 0xc2, - /// 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, - /// ]; - /// let uuid = Uuid::from_bytes_le(bytes); - /// assert_eq!( - /// "a4a3a2a1-b2b1-c2c1-d1d2-d3d4d5d6d7d8", - /// uuid.hyphenated().to_string(), - /// ); - /// # Ok(()) - /// # } - /// ``` - from-bytes-le: func(b: list) -> uuid; - /// Returns the version number of the UUID. - /// This represents the algorithm used to generate the value. - /// This method is the future-proof alternative to [`Uuid::get_version`]. - /// # Examples - /// Basic usage: - /// ``` - /// # use uuid::Uuid; - /// # fn main() -> Result<(), uuid::Error> { - /// let my_uuid = Uuid::parse_str("02f09a3f-1624-3b1d-8409-44eff7708208")?; - /// assert_eq!(3, my_uuid.get_version_num()); - /// # Ok(()) - /// # } - /// ``` - /// # References - /// * [Version Field in RFC 9562](https://www.ietf.org/rfc/rfc9562.html#section-4.2) - get-version-num: func(self: uuid) -> u64; - /// Returns two 64bit values containing the value. - /// The bytes in the UUID will be split into two `u64`. - /// The first u64 represents the 64 most significant bits, - /// the second one represents the 64 least significant. - /// # Examples - /// ``` - /// # use uuid::Uuid; - /// # fn main() -> Result<(), uuid::Error> { - /// let uuid = Uuid::parse_str("a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8")?; - /// assert_eq!( - /// uuid.as_u64_pair(), - /// (0xa1a2a3a4b1b2c1c2, 0xd1d2d3d4d5d6d7d8), - /// ); - /// # Ok(()) - /// # } - /// ``` - as-u64-pair: func(self: uuid) -> tuple; - /// Tests if the UUID is nil (all zeros). - is-nil: func(self: uuid) -> bool; - eq: func(self: uuid, other: non-nil-uuid) -> bool; - /// Returns a 128bit value containing the value. - /// The bytes in the UUID will be packed directly into a `u128`. - /// # Examples - /// ``` - /// # use uuid::Uuid; - /// # fn main() -> Result<(), uuid::Error> { - /// let uuid = Uuid::parse_str("a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8")?; - /// assert_eq!( - /// uuid.as_u128(), - /// 0xa1a2a3a4b1b2c1c2d1d2d3d4d5d6d7d8, - /// ); - /// # Ok(()) - /// # } - /// ``` - as-u128: func(self: uuid) -> u64; -} - -/// Methods for BlendState -interface blend-state { - use types.{reflect-reference}; - - assert-receiver-is-total-eq: func(self: blend-state); - clone: func(self: blend-state) -> blend-state; - eq: func(self: blend-state, other: blend-state) -> bool; -} - -/// Methods for TextureFormat -interface texture-format { - use types.{reflect-reference}; - - /// Returns the dimension of a [block](https://gpuweb.github.io/gpuweb/#texel-block) of texels. - /// Uncompressed formats have a block dimension of `(1, 1)`. - block-dimensions: func(self: texture-format) -> tuple; - /// Returns `true` for srgb formats. - is-srgb: func(self: texture-format) -> bool; - /// Returns `true` if the format is a combined depth-stencil format - /// see - is-combined-depth-stencil-format: func(self: texture-format) -> bool; - /// Adds an `Srgb` suffix to the given texture format, if the format supports it. - add-srgb-suffix: func(self: texture-format) -> texture-format; - /// Returns `true` if the format is a depth and/or stencil format - /// see - is-depth-stencil-format: func(self: texture-format) -> bool; - /// Returns `true` for BCn compressed formats. - is-bcn: func(self: texture-format) -> bool; - /// Returns the number of components this format has. - components: func(self: texture-format) -> u8; - clone: func(self: texture-format) -> texture-format; - /// Returns `true` if the format is a multi-planar format - is-multi-planar-format: func(self: texture-format) -> bool; - /// Returns `true` if the format has a depth aspect - has-depth-aspect: func(self: texture-format) -> bool; - /// Returns `true` for compressed formats. - is-compressed: func(self: texture-format) -> bool; - /// Returns `true` if the format has a color aspect - has-color-aspect: func(self: texture-format) -> bool; - /// Returns `true` if the format has a stencil aspect - has-stencil-aspect: func(self: texture-format) -> bool; - eq: func(self: texture-format, other: texture-format) -> bool; - /// Returns the size multiple requirement for a texture using this format. - size-multiple-requirement: func(self: texture-format) -> tuple; - assert-receiver-is-total-eq: func(self: texture-format); - /// Returns `true` if `self` is a depth or stencil component of the given - /// combined depth-stencil format - is-depth-stencil-component: func(self: texture-format, combined-format: texture-format) -> bool; - /// The number of bytes occupied per pixel in a color attachment - /// - target-pixel-byte-cost: func(self: texture-format) -> option; - /// Returns `true` for ASTC compressed formats. - is-astc: func(self: texture-format) -> bool; - /// Returns the number of planes a multi-planar format has. - planes: func(self: texture-format) -> option; - /// See - target-component-alignment: func(self: texture-format) -> option; - /// Strips the `Srgb` suffix from the given texture format. - remove-srgb-suffix: func(self: texture-format) -> texture-format; -} - -/// Global BMS functions -interface globals { - use types.{reflect-reference, component-registration, entity}; - - /// Attempts to construct the given type, given an arbitrary map of values. - construct: func(registration: script-type-registration, payload: list>) -> result, string>; - /// Logs a `Debug` level message to the console - /// * `message`: the message to log - log-debug: func(message: string); - /// Logs a `Error` level message to the console - /// * `message`: the message to log - log-error: func(message: string); - /// Logs a `Information` level message to the console - log-info: func(message: string); - /// Logs a `Trace` level message to the console - /// * `message`: the message to log - log-trace: func(message: string); - /// Logs a `Warning` level message to the console - /// * `message`: the message to log - log-warn: func(message: string); - /// Packs, a variable amount of values, into a single list. - pack-args: func(tuplea: string) -> list; - /// Registers a "frozen" callback handler, - /// - /// For example, this code: - /// - /// ```lua - /// register_callback("on_script_unloaded", my_unload_handler) - /// - /// function my_unload_handler() - /// print("handling unload!") - /// end - /// ``` - /// - /// would call the `my_unload_handler` function, whenever the `on_script_unloaded` callback is triggered, which is when your script is about to be unloaded. - /// - /// Registered callbacks take precedence over free-standing function callbacks, i.e. the below top level function: - /// ```lua - /// function on_script_unloaded() - /// print("freestanding unload handler!") - /// end - /// ``` - /// - /// would be a valid handler, but if a registered callback existed, it would be called instead. - register-callback: func(callback: string, function: string); - /// Creates a new script system builder, which can be used to add new systems to the world. - system-builder: func(callback: string, attachment: script-attachment) -> result; - /// Unpacks, a list of values, into many separate values. - unpack-args: func(values: list) -> string; -} /// The BMS guest world - what a guest component must implement world bms-guest { - import globals; - import worlda; - import script-component-registration; - import script-query-builder; - import script-query-result; - import script-resource-registration; - import script-type-registration; - import script-system-builder; - import script-attachment; - import reflect-schedule; - import reflect-system; - import handle; - import reflect-reference; - import color; - import hsla; - import hsva; - import hwba; - import laba; - import lcha; - import linear-rgba; - import oklaba; - import oklcha; - import srgba; - import xyza; - import order-independent-transparency-settings; - import deferred-prepass-double-buffer; - import depth-prepass; - import depth-prepass-double-buffer; - import motion-vector-prepass; - import normal-prepass; - import skybox; - import deband-dither; - import tonemapping; - import component-ticks; - import tick; - import component-id; - import entity; - import entity-generation; - import entity-index; - import entity-hash; - import entity-hash-set; - import entity-index-set; - import default-query-filters; - import disabled; - import child-of; - import children; - import add; - import despawn; - import insert; - import remove; - import removed-component-entity; - import replace; - import name; - import button-state; - import axis-settings; - import button-axis-settings; - import button-settings; - import gamepad; - import gamepad-axis; - import gamepad-axis-changed-event; - import gamepad-button; - import gamepad-button-changed-event; - import gamepad-button-state-changed-event; - import gamepad-connection; - import gamepad-connection-event; - import gamepad-event; - import gamepad-input; - import gamepad-rumble-intensity; - import gamepad-rumble-request; - import gamepad-settings; - import raw-gamepad-axis-changed-event; - import raw-gamepad-button-changed-event; - import raw-gamepad-event; - import double-tap-gesture; - import pan-gesture; - import pinch-gesture; - import rotation-gesture; - import key; - import key-code; - import keyboard-focus-lost; - import keyboard-input; - import native-key; - import native-key-code; - import accumulated-mouse-motion; - import accumulated-mouse-scroll; - import mouse-button; - import mouse-button-input; - import mouse-motion; - import mouse-scroll-unit; - import mouse-wheel; - import force-touch; - import touch-input; - import touch-phase; - import aspect-ratio; - import aabb2d; - import bounding-circle; - import aabb3d; - import bounding-sphere; - import aabb-cast2d; - import bounding-circle-cast; - import ray-cast2d; - import aabb-cast3d; - import bounding-sphere-cast; - import ray-cast3d; - import compass-octant; - import compass-quadrant; - import ease-function; - import jump-at; - import interval; - import dir2; - import dir3; - import dir3-a; - import dir4; - import float-ord; - import isometry2d; - import isometry3d; - import annulus; - import arc2d; - import capsule2d; - import circle; - import circular-sector; - import circular-segment; - import convex-polygon; - import ellipse; - import line2d; - import plane2d; - import polygon; - import polyline2d; - import rectangle; - import regular-polygon; - import rhombus; - import segment2d; - import triangle2d; - import capsule3d; - import cone; - import conical-frustum; - import cuboid; - import cylinder; - import infinite-plane3d; - import line3d; - import plane3d; - import polyline3d; - import segment3d; - import sphere; - import tetrahedron; - import torus; - import triangle3d; - import ray2d; - import ray3d; - import irect; - import rect; - import urect; - import rot2; - import instant; - import fixed; - import real; - import stopwatch; - import timer; - import timer-mode; - import virtual; - import global-transform; - import transform; - import transform-tree-changed; - import static-transform-optimizations; - import type-id; - import socket-addr; - import range-full; - import atomic-bool; - import atomic-i16; - import atomic-i32; - import atomic-i64; - import atomic-i8; - import atomic-isize; - import atomic-u16; - import atomic-u32; - import atomic-u64; - import atomic-u8; - import atomic-usize; - import duration; - import affine2; - import affine3-a; - import bvec2; - import bvec3; - import bvec3-a; - import bvec4; - import bvec4-a; - import daffine2; - import daffine3; - import dmat2; - import dmat3; - import dmat4; - import dquat; - import dvec2; - import dvec3; - import dvec4; - import euler-rot; - import i16-vec2; - import i16-vec3; - import i16-vec4; - import i64-vec2; - import i64-vec3; - import i64-vec4; - import i8-vec2; - import i8-vec3; - import i8-vec4; - import ivec2; - import ivec3; - import ivec4; - import mat2; - import mat3; - import mat3-a; - import mat4; - import quat; - import u16-vec2; - import u16-vec3; - import u16-vec4; - import u64-vec2; - import u64-vec3; - import u64-vec4; - import u8-vec2; - import u8-vec3; - import u8-vec4; - import uvec2; - import uvec3; - import uvec4; - import vec2; - import vec3; - import vec3-a; - import vec4; - import smol-str; - import non-nil-uuid; - import uuid; - import blend-state; - import texture-format; - export on-script-loaded: func(); export on-script-unloaded: func(); export on-update: func(); + export on-custom-event: func(); } diff --git a/guest_crate/src/lib.rs b/guest_crate/src/lib.rs index 91cfa31822..a0d79ea6d3 100644 --- a/guest_crate/src/lib.rs +++ b/guest_crate/src/lib.rs @@ -12,13 +12,13 @@ wit_bindgen::generate!({ path: "bindings.wit", }); -// The guest exports -struct Guest; +struct MyHost; -impl Guest { +impl Guest for MyHost { /// Called when the script is first loaded fn on_script_loaded() { println!("[Rust Guest] Script loaded!"); + panic!("asd"); // // Spawn an entity with Transform // match spawn_entity_with_transform() { @@ -44,75 +44,12 @@ impl Guest { } } } -} - -// /// Spawn an entity with a Transform component -// fn spawn_entity_with_transform() -> Result<(), String> { -// // Spawn a new entity -// let entity = world::spawn_entity().map_err(|e| format!("Failed to spawn entity: {:?}", e))?; - -// // Get the Transform component registration -// // In a real scenario, you'd get this from the component registry -// let transform_registration = ComponentRegistration { -// // This would be populated with the actual component registration -// // For now, we'll assume it's available - -// }; - -// // Add Transform component to the entity -// world::add_component( -// &entity, -// &transform_registration, -// &Transform { -// translation: Vec3 { -// x: 0.0, -// y: 1.0, -// z: 0.0, -// }, -// rotation: Quat { -// x: 0.0, -// y: 0.0, -// z: 0.0, -// w: 1.0, -// }, -// scale: Vec3 { -// x: 1.0, -// y: 1.0, -// z: 1.0, -// }, -// }, -// ) -// .map_err(|e| format!("Failed to add Transform component: {:?}", e))?; -// println!("[Rust Guest] Successfully spawned entity at position (0, 1, 0)"); -// Ok(()) -// } - -// // Component types (these would be generated from the WIT file) -// #[derive(Clone, Debug)] -// pub struct Vec3 { -// pub x: f32, -// pub y: f32, -// pub z: f32, -// } - -// #[derive(Clone, Debug)] -// pub struct Quat { -// pub x: f32, -// pub y: f32, -// pub z: f32, -// pub w: f32, -// } - -// #[derive(Clone, Debug)] -// pub struct Transform { -// pub translation: Vec3, -// pub rotation: Quat, -// pub scale: Vec3, -// } + fn on_custom_event() -> () { + println!("[Rust Guest] Script custom event!"); + } +} -// #[derive(Clone, Debug)] -// pub struct ComponentRegistration { -// // Component registration details -// // This would be properly defined based on the WIT interface -// } +// export! defines that the `MyHost` struct defined below is going to define +// the exports of the `world`, namely the `run` function. +export!(MyHost); diff --git a/rust-toolchain.toml b/rust-toolchain.toml index b67e7d5348..f19782d3c5 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,2 +1,2 @@ [toolchain] -channel = "1.89.0" +channel = "1.92.0" From b72360d16346f7300ff1f3f3eb174a39c7be4386 Mon Sep 17 00:00:00 2001 From: makspll Date: Sat, 9 May 2026 11:43:39 +0100 Subject: [PATCH 3/5] split out modules, add language to enum --- .../bevy_mod_scripting_asset/src/language.rs | 3 + .../src/context.rs | 249 ++++++++++ .../src/handler.rs | 115 +++++ .../bevy_mod_scripting_wasmtime/src/lib.rs | 470 +----------------- .../bevy_mod_scripting_wasmtime/src/plugin.rs | 76 +++ .../src/runtime.rs | 28 ++ 6 files changed, 479 insertions(+), 462 deletions(-) create mode 100644 crates/languages/bevy_mod_scripting_wasmtime/src/context.rs create mode 100644 crates/languages/bevy_mod_scripting_wasmtime/src/handler.rs create mode 100644 crates/languages/bevy_mod_scripting_wasmtime/src/plugin.rs create mode 100644 crates/languages/bevy_mod_scripting_wasmtime/src/runtime.rs diff --git a/crates/bevy_mod_scripting_asset/src/language.rs b/crates/bevy_mod_scripting_asset/src/language.rs index 863e6a5d24..675bcc1b7e 100644 --- a/crates/bevy_mod_scripting_asset/src/language.rs +++ b/crates/bevy_mod_scripting_asset/src/language.rs @@ -16,6 +16,8 @@ pub enum Language { Lua, /// The Rune scripting language Rune, + /// Any wasmtime compiled language + Wasmtime, /// An external scripting language External { /// The identifier of the language @@ -52,6 +54,7 @@ impl From<&Language> for Cow<'static, str> { Language::Lua => Cow::Borrowed("Lua"), Language::Rune => Cow::Borrowed("Rune"), Language::External { name, .. } => name.clone(), + Language::Wasmtime => Cow::Borrowed("Wasmtime"), Language::Unknown => Cow::Borrowed("Unknown"), } } diff --git a/crates/languages/bevy_mod_scripting_wasmtime/src/context.rs b/crates/languages/bevy_mod_scripting_wasmtime/src/context.rs new file mode 100644 index 0000000000..66e7747a81 --- /dev/null +++ b/crates/languages/bevy_mod_scripting_wasmtime/src/context.rs @@ -0,0 +1,249 @@ +use bevy_ecs::{reflect::AppTypeRegistry, world::WorldId}; +use bevy_mod_scripting_asset::Language; +use bevy_mod_scripting_bindings::{ + DynamicScriptFunction, FunctionCallContext, InteropError, Namespace, ReflectReference, + ScriptValue, ThreadWorldContainer, WorldExtensions, +}; +use bevy_mod_scripting_core::config::GetPluginThreadConfig; +use bevy_mod_scripting_script::ScriptAttachment; +use bevy_platform::collections::HashMap; +use wasmtime::{Engine, Store, component::*}; +use wasmtime_wasi::{WasiCtx, WasiCtxBuilder, WasiCtxView, WasiView}; + +use crate::{WasmtimeScriptingPlugin, script_value_to_val, val_to_script_value}; + +/// Per-script execution context. +pub struct WasmtimeContext { + pub store: Store, + pub instance: Instance, + /// Retained for hot-reload: re-instantiate from the same component bytes. + pub component: Component, +} + +/// Host-side data stored in each wasmtime Store. +pub struct WasmtimeStoreData { + resources: HashMap, + next_id: u32, + wasi_ctx: WasiCtx, + resource_table: ResourceTable, +} + +impl WasiView for WasmtimeStoreData { + fn ctx(&mut self) -> wasmtime_wasi::WasiCtxView<'_> { + WasiCtxView { + ctx: &mut self.wasi_ctx, + table: &mut self.resource_table, + } + } +} + +impl WasmtimeStoreData { + pub fn new() -> Self { + Self { + resources: HashMap::new(), + next_id: 1, + wasi_ctx: WasiCtxBuilder::new().inherit_stdio().build(), + resource_table: ResourceTable::new(), + } + } + + pub fn push_ref(&mut self, r: ReflectReference) -> u32 { + let id = self.next_id; + self.next_id = self.next_id.wrapping_add(1); + self.resources.insert(id, r); + id + } + + pub fn get_ref(&self, id: u32) -> Option<&ReflectReference> { + self.resources.get(&id) + } +} + +/// Load a wasmtime context from compiled `.wasm` component bytes. +pub fn wasmtime_context_load( + attachment: &ScriptAttachment, + content: &[u8], + world_id: WorldId, +) -> Result { + let config = WasmtimeScriptingPlugin::readonly_configuration(world_id); + let runtime = config.runtime; + + // Ensure the linker is populated (lazy, once) + { + let mut guard = runtime.linker.lock(); + if guard.is_none() { + *guard = Some(build_linker(&runtime.engine)?); + } + } + + let component = Component::new(&runtime.engine, content).map_err(|e| to_interop_error(e))?; + + let mut store = Store::new(&runtime.engine, WasmtimeStoreData::new()); + + let linker_guard = runtime.linker.lock(); + let linker = linker_guard.as_ref().unwrap(); + let instance = linker + .instantiate(&mut store, &component) + .map_err(|e| to_interop_error(e))?; + + let mut context = WasmtimeContext { + store, + instance, + component, + }; + + for init in config.context_initialization_callbacks { + init(attachment, &mut context)?; + } + + Ok(context) +} + +/// Reload a wasmtime context (hot-reload: re-instantiate from the same component). +pub fn wasmtime_context_reload( + attachment: &ScriptAttachment, + content: &[u8], + previous_context: &mut WasmtimeContext, + world_id: WorldId, +) -> Result<(), InteropError> { + // Re-compile the component (in case it changed) + let config = WasmtimeScriptingPlugin::readonly_configuration(world_id); + let runtime = config.runtime; + + let component = Component::new(&runtime.engine, content).map_err(|e| to_interop_error(e))?; + + // Re-instantiate with the same linker + let mut store = Store::new(&runtime.engine, WasmtimeStoreData::new()); + let linker_guard = runtime.linker.lock(); + let linker = linker_guard.as_ref().unwrap(); + let instance = linker + .instantiate(&mut store, &component) + .map_err(|e| to_interop_error(e))?; + + // Replace the context + previous_context.store = store; + previous_context.instance = instance; + previous_context.component = component; + + // Re-run initializers + for init in config.context_initialization_callbacks { + init(attachment, previous_context)?; + } + + Ok(()) +} + +/// Convert a type name to a WIT-compatible kebab-case interface name. +fn to_wit_ident(name: &str) -> String { + let mut result = String::new(); + let mut prev_upper = false; + for (i, c) in name.chars().enumerate() { + if c == '_' || c == ':' || c == ' ' { + if !result.is_empty() && !result.ends_with('-') { + result.push('-'); + } + prev_upper = false; + } else if c.is_uppercase() { + if i > 0 && !prev_upper && !result.is_empty() && !result.ends_with('-') { + result.push('-'); + } + result.push(c.to_lowercase().next().unwrap()); + prev_upper = true; + } else { + result.push(c); + prev_upper = false; + } + } + result.trim_end_matches('-').to_string() +} + +/// Get the WIT interface name for a given namespace. +fn namespace_to_interface(namespace: Namespace) -> String { + match namespace { + Namespace::Global => "bms:scripting/globals".to_string(), + Namespace::OnType(type_id) => { + let type_name = ThreadWorldContainer + .try_get_context() + .ok() + .and_then(|ctx| { + ctx.world + .with_resource(|r: &AppTypeRegistry| { + let registry = r.read(); + registry + .get_type_info(type_id) + .and_then(|info| info.type_path_table().ident()) + .map(|s| s.to_string()) + }) + .ok() + }) + .flatten() + .unwrap_or_else(|| format!("type-{type_id:?}")); + format!("bms:scripting/{}", to_wit_ident(&type_name)) + } + } +} + +/// Build and populate the wasmtime component linker from the BMS function registry. +fn build_linker(engine: &Engine) -> Result, InteropError> { + let mut linker = Linker::new(engine); + + let world = ThreadWorldContainer.try_get_context()?.world; + let registry = world.script_function_registry(); + let registry = registry.read(); + + // Group functions by interface name + let mut by_interface: HashMap> = HashMap::new(); + for (key, func) in registry.iter_all() { + let interface_name = namespace_to_interface(key.namespace); + by_interface + .entry(interface_name) + .or_default() + .push((key.name.to_string(), func.clone())); + } + + // Register each interface + for (interface_name, functions) in by_interface { + let mut instance_linker = linker + .instance(&interface_name) + .map_err(|e| to_interop_error(e))?; + + for (func_name, func) in functions { + let func_clone = func.clone(); + instance_linker + .func_new( + &func_name, + move |mut store: wasmtime::StoreContextMut, + _, + args: &[Val], + results: &mut [Val]| + -> wasmtime::error::Result<()> { + let script_args: Vec = args + .iter() + .map(|v| val_to_script_value(v, store.data_mut())) + .collect(); + + let ctx = FunctionCallContext::new(Language::Unknown); + + let result = func_clone + .call(script_args, ctx) + .map_err(|e| wasmtime::error::format_err!("{e:?}"))?; + + if !results.is_empty() { + results[0] = script_value_to_val(result, store.data_mut()); + } + + Ok(()) + }, + ) + .map_err(|e| to_interop_error(e))?; + } + } + + wasmtime_wasi::p2::add_to_linker_sync(&mut linker).map_err(to_interop_error)?; + + Ok(linker) +} + +pub fn to_interop_error(error: wasmtime::Error) -> InteropError { + InteropError::external_boxed(error.into_boxed_dyn_error()) +} diff --git a/crates/languages/bevy_mod_scripting_wasmtime/src/handler.rs b/crates/languages/bevy_mod_scripting_wasmtime/src/handler.rs new file mode 100644 index 0000000000..b7b927d564 --- /dev/null +++ b/crates/languages/bevy_mod_scripting_wasmtime/src/handler.rs @@ -0,0 +1,115 @@ +use bevy_ecs::world::WorldId; +use bevy_log::info; +use bevy_mod_scripting_bindings::{InteropError, ScriptValue}; +use bevy_mod_scripting_core::{config::GetPluginThreadConfig, event::CallbackLabel}; +use bevy_mod_scripting_script::ScriptAttachment; +use wasmtime::component::*; + +use crate::{WasmtimeContext, WasmtimeScriptingPlugin, WasmtimeStoreData, to_interop_error}; + +/// Convert a `ScriptValue` to a wasmtime component `Val`. +pub fn script_value_to_val(sv: ScriptValue, data: &mut WasmtimeStoreData) -> Val { + match sv { + ScriptValue::Unit => Val::Tuple(vec![]), + ScriptValue::Bool(b) => Val::Bool(b), + ScriptValue::Integer(i) => Val::S64(i), + ScriptValue::Float(f) => Val::Float64(f), + ScriptValue::String(s) => Val::String(s.into_owned().into()), + ScriptValue::List(list) => Val::List( + list.into_iter() + .map(|v| script_value_to_val(v, data)) + .collect(), + ), + ScriptValue::Reference(r) => Val::U32(data.push_ref(r)), + ScriptValue::Error(e) => { + Val::Result(Err(Some(Box::new(Val::String(format!("{e:?}").into()))))) + } + ScriptValue::Function(_) | ScriptValue::FunctionMut(_) => Val::Tuple(vec![]), + ScriptValue::Map(map) => Val::List( + map.into_iter() + .map(|(k, v)| Val::Tuple(vec![Val::String(k.into()), script_value_to_val(v, data)])) + .collect(), + ), + _ => todo!(), + } +} + +/// Convert a wasmtime component `Val` to a `ScriptValue`. +pub fn val_to_script_value(val: &Val, data: &mut WasmtimeStoreData) -> ScriptValue { + match val { + Val::Bool(b) => ScriptValue::Bool(*b), + Val::S64(i) => ScriptValue::Integer(*i), + Val::U32(i) => { + if let Some(r) = data.get_ref(*i).cloned() { + ScriptValue::Reference(r) + } else { + ScriptValue::Integer(*i as i64) + } + } + Val::Float64(f) => ScriptValue::Float(*f), + Val::String(s) => ScriptValue::String(s.to_string().into()), + Val::List(list) => { + ScriptValue::List(list.iter().map(|v| val_to_script_value(v, data)).collect()) + } + Val::Tuple(items) if items.is_empty() => ScriptValue::Unit, + Val::Tuple(items) => { + ScriptValue::List(items.iter().map(|v| val_to_script_value(v, data)).collect()) + } + _ => ScriptValue::Unit, + } +} + +/// The wasmtime handler for events. +pub fn wasmtime_handler( + args: Vec, + context_key: &ScriptAttachment, + callback_label: &CallbackLabel, + context: &mut WasmtimeContext, + world_id: WorldId, +) -> Result { + let config = WasmtimeScriptingPlugin::readonly_configuration(world_id); + + config + .pre_handling_callbacks + .iter() + .try_for_each(|init| init(context_key, context))?; + + // Get the exported function by callback name + let func = context.instance.get_func( + &mut context.store, + &callback_label.as_ref().replace("_", "-"), + ); + println!("{func:?}"); + // .and_then(|(item, f)| context.instance.get_func(&mut context.store, f)); + + let func = match func { + Some(f) => f, + None => { + info!( + "Context {} is not subscribed to callback {}", + context_key, + callback_label.as_ref() + ); + return Ok(ScriptValue::Unit); + } + }; + + // Convert args to Val + let input_vals: Vec = args + .into_iter() + .map(|v| script_value_to_val(v, context.store.data_mut())) + .collect(); + + // Call the function + let mut output_vals = vec![]; // Placeholder for result + func.call(&mut context.store, &input_vals, &mut output_vals) + .map_err(|e| to_interop_error(e))?; + + // Convert result back to ScriptValue + let result = output_vals + .first() + .map(|v| val_to_script_value(v, context.store.data_mut())) + .unwrap_or(ScriptValue::Unit); + + Ok(result) +} diff --git a/crates/languages/bevy_mod_scripting_wasmtime/src/lib.rs b/crates/languages/bevy_mod_scripting_wasmtime/src/lib.rs index 948c049ae5..ef851b4e31 100644 --- a/crates/languages/bevy_mod_scripting_wasmtime/src/lib.rs +++ b/crates/languages/bevy_mod_scripting_wasmtime/src/lib.rs @@ -12,466 +12,12 @@ clippy::unwrap_used, reason = "cooking" )] -use std::{any::TypeId, collections::HashMap, sync::Arc}; -use bevy_app::{App, Plugin}; -use bevy_ecs::{reflect::AppTypeRegistry, world::WorldId}; -use bevy_log::{error, info, trace}; -use bevy_mod_scripting_asset::{Language, ScriptAsset}; -use bevy_mod_scripting_bindings::{ - AppScriptGlobalsRegistry, InteropError, Namespace, ReflectReference, ScriptValue, - ThreadWorldContainer, WorldExtensions, - function::script_function::{ - AppScriptFunctionRegistry, DynamicScriptFunction, FunctionCallContext, - }, -}; -use bevy_mod_scripting_core::{ - IntoScriptPluginParams, ScriptingPlugin, - config::{GetPluginThreadConfig, ScriptingPluginConfiguration}, - event::CallbackLabel, - make_plugin_config_static, - script::ContextPolicy, -}; -use bevy_mod_scripting_script::ScriptAttachment; -use parking_lot::Mutex; -use wasmtime::{Config, Engine}; -use wasmtime::{ - Store, - component::{Component, Instance, Linker, Val}, -}; -use wasmtime_wasi::{ResourceTable, WasiCtx, WasiCtxBuilder, WasiCtxView, WasiView}; - -make_plugin_config_static!(WasmtimeScriptingPlugin); - -/// Per-script execution context. -pub struct WasmtimeContext { - pub store: Store, - pub instance: Instance, - /// Retained for hot-reload: re-instantiate from the same component bytes. - pub component: Component, -} - -/// Host-side data stored in each wasmtime Store. -pub struct WasmtimeStoreData { - resources: HashMap, - next_id: u32, - world_id: WorldId, - wasi_ctx: WasiCtx, - resource_table: ResourceTable, -} - -impl WasiView for WasmtimeStoreData { - fn ctx(&mut self) -> wasmtime_wasi::WasiCtxView<'_> { - WasiCtxView { - ctx: &mut self.wasi_ctx, - table: &mut self.resource_table, - } - } -} - -impl WasmtimeStoreData { - fn new(world_id: WorldId) -> Self { - Self { - resources: HashMap::new(), - next_id: 1, - world_id, - wasi_ctx: WasiCtxBuilder::new().inherit_stdio().build(), - resource_table: ResourceTable::new(), - } - } - - fn push_ref(&mut self, r: ReflectReference) -> u32 { - let id = self.next_id; - self.next_id = self.next_id.wrapping_add(1); - self.resources.insert(id, r); - id - } - - fn get_ref(&self, id: u32) -> Option<&ReflectReference> { - self.resources.get(&id) - } -} - -/// Shared wasmtime runtime. -pub struct WasmtimeRuntime { - pub engine: Engine, - /// Cached linker, populated once from the BMS function registry. - pub linker: Mutex>>, -} - -impl Default for WasmtimeRuntime { - fn default() -> Self { - Self::new() - } -} -impl WasmtimeRuntime { - fn new() -> Self { - let mut config = Config::new(); - config.wasm_component_model(true); - let engine = Engine::new(&config).expect("wasmtime Engine creation failed"); - Self { - engine, - linker: Mutex::new(None), - } - } -} - -/// Convert a `ScriptValue` to a wasmtime component `Val`. -fn script_value_to_val(sv: ScriptValue, data: &mut WasmtimeStoreData) -> Val { - match sv { - ScriptValue::Unit => Val::Tuple(vec![]), - ScriptValue::Bool(b) => Val::Bool(b), - ScriptValue::Integer(i) => Val::S64(i), - ScriptValue::Float(f) => Val::Float64(f), - ScriptValue::String(s) => Val::String(s.into_owned().into()), - ScriptValue::List(list) => Val::List( - list.into_iter() - .map(|v| script_value_to_val(v, data)) - .collect(), - ), - ScriptValue::Reference(r) => Val::U32(data.push_ref(r)), - ScriptValue::Error(e) => { - Val::Result(Err(Some(Box::new(Val::String(format!("{e:?}").into()))))) - } - ScriptValue::Function(_) | ScriptValue::FunctionMut(_) => Val::Tuple(vec![]), - ScriptValue::Map(map) => Val::List( - map.into_iter() - .map(|(k, v)| Val::Tuple(vec![Val::String(k.into()), script_value_to_val(v, data)])) - .collect(), - ), - _ => todo!(), - } -} - -/// Convert a wasmtime component `Val` to a `ScriptValue`. -fn val_to_script_value(val: &Val, data: &mut WasmtimeStoreData) -> ScriptValue { - match val { - Val::Bool(b) => ScriptValue::Bool(*b), - Val::S64(i) => ScriptValue::Integer(*i), - Val::U32(i) => { - if let Some(r) = data.get_ref(*i).cloned() { - ScriptValue::Reference(r) - } else { - ScriptValue::Integer(*i as i64) - } - } - Val::Float64(f) => ScriptValue::Float(*f), - Val::String(s) => ScriptValue::String(s.to_string().into()), - Val::List(list) => { - ScriptValue::List(list.iter().map(|v| val_to_script_value(v, data)).collect()) - } - Val::Tuple(items) if items.is_empty() => ScriptValue::Unit, - Val::Tuple(items) => { - ScriptValue::List(items.iter().map(|v| val_to_script_value(v, data)).collect()) - } - _ => ScriptValue::Unit, - } -} - -/// Convert a type name to a WIT-compatible kebab-case interface name. -fn to_wit_ident(name: &str) -> String { - let mut result = String::new(); - let mut prev_upper = false; - for (i, c) in name.chars().enumerate() { - if c == '_' || c == ':' || c == ' ' { - if !result.is_empty() && !result.ends_with('-') { - result.push('-'); - } - prev_upper = false; - } else if c.is_uppercase() { - if i > 0 && !prev_upper && !result.is_empty() && !result.ends_with('-') { - result.push('-'); - } - result.push(c.to_lowercase().next().unwrap()); - prev_upper = true; - } else { - result.push(c); - prev_upper = false; - } - } - result.trim_end_matches('-').to_string() -} - -/// Get the WIT interface name for a given namespace. -fn namespace_to_interface(namespace: Namespace, world_id: WorldId) -> String { - match namespace { - Namespace::Global => "bms:scripting/globals".to_string(), - Namespace::OnType(type_id) => { - let type_name = ThreadWorldContainer - .try_get_context() - .ok() - .and_then(|ctx| { - ctx.world - .with_resource(|r: &AppTypeRegistry| { - let registry = r.read(); - registry - .get_type_info(type_id) - .and_then(|info| info.type_path_table().ident()) - .map(|s| s.to_string()) - }) - .ok() - }) - .flatten() - .unwrap_or_else(|| format!("type-{type_id:?}")); - format!("bms:scripting/{}", to_wit_ident(&type_name)) - } - } -} - -/// Build and populate the wasmtime component linker from the BMS function registry. -fn build_linker( - engine: &Engine, - world_id: WorldId, -) -> Result, InteropError> { - let mut linker = Linker::new(engine); - - let world = ThreadWorldContainer.try_get_context()?.world; - let registry = world.script_function_registry(); - let registry = registry.read(); - - // Group functions by interface name - let mut by_interface: HashMap> = HashMap::new(); - for (key, func) in registry.iter_all() { - let interface_name = namespace_to_interface(key.namespace, world_id); - by_interface - .entry(interface_name) - .or_default() - .push((key.name.to_string(), func.clone())); - } - - // Register each interface - for (interface_name, functions) in by_interface { - let mut instance_linker = linker - .instance(&interface_name) - .map_err(|e| to_interop_error(e))?; - - for (func_name, func) in functions { - let func_clone = func.clone(); - instance_linker - .func_new( - &func_name, - move |mut store: wasmtime::StoreContextMut, - _, - args: &[Val], - results: &mut [Val]| - -> wasmtime::error::Result<()> { - let script_args: Vec = args - .iter() - .map(|v| val_to_script_value(v, store.data_mut())) - .collect(); - - let ctx = FunctionCallContext::new(Language::Unknown); - - let result = func_clone - .call(script_args, ctx) - .map_err(|e| wasmtime::error::format_err!("{e:?}"))?; - - if !results.is_empty() { - results[0] = script_value_to_val(result, store.data_mut()); - } - - Ok(()) - }, - ) - .map_err(|e| to_interop_error(e))?; - } - } - - wasmtime_wasi::p2::add_to_linker_sync(&mut linker).map_err(to_interop_error)?; - - Ok(linker) -} - -fn to_interop_error(error: wasmtime::Error) -> InteropError { - InteropError::external_boxed(error.into_boxed_dyn_error()) -} - -/// Load a wasmtime context from compiled `.wasm` component bytes. -pub fn wasmtime_context_load( - attachment: &ScriptAttachment, - content: &[u8], - world_id: WorldId, -) -> Result { - let config = WasmtimeScriptingPlugin::readonly_configuration(world_id); - let runtime = config.runtime; - - // Ensure the linker is populated (lazy, once) - { - let mut guard = runtime.linker.lock(); - if guard.is_none() { - *guard = Some(build_linker(&runtime.engine, world_id)?); - } - } - - let component = Component::new(&runtime.engine, content).map_err(|e| to_interop_error(e))?; - - let mut store = Store::new(&runtime.engine, WasmtimeStoreData::new(world_id)); - - let linker_guard = runtime.linker.lock(); - let linker = linker_guard.as_ref().unwrap(); - let instance = linker - .instantiate(&mut store, &component) - .map_err(|e| to_interop_error(e))?; - - let mut context = WasmtimeContext { - store, - instance, - component, - }; - - for init in config.context_initialization_callbacks { - init(attachment, &mut context)?; - } - - Ok(context) -} - -/// Reload a wasmtime context (hot-reload: re-instantiate from the same component). -pub fn wasmtime_context_reload( - attachment: &ScriptAttachment, - content: &[u8], - previous_context: &mut WasmtimeContext, - world_id: WorldId, -) -> Result<(), InteropError> { - // Re-compile the component (in case it changed) - let config = WasmtimeScriptingPlugin::readonly_configuration(world_id); - let runtime = config.runtime; - - let component = Component::new(&runtime.engine, content).map_err(|e| to_interop_error(e))?; - - // Re-instantiate with the same linker - let mut store = Store::new(&runtime.engine, WasmtimeStoreData::new(world_id)); - let linker_guard = runtime.linker.lock(); - let linker = linker_guard.as_ref().unwrap(); - let instance = linker - .instantiate(&mut store, &component) - .map_err(|e| to_interop_error(e))?; - - // Replace the context - previous_context.store = store; - previous_context.instance = instance; - previous_context.component = component; - - // Re-run initializers - for init in config.context_initialization_callbacks { - init(attachment, previous_context)?; - } - - Ok(()) -} - -/// The wasmtime handler for events. -pub fn wasmtime_handler( - args: Vec, - context_key: &ScriptAttachment, - callback_label: &CallbackLabel, - context: &mut WasmtimeContext, - world_id: WorldId, -) -> Result { - let config = WasmtimeScriptingPlugin::readonly_configuration(world_id); - - config - .pre_handling_callbacks - .iter() - .try_for_each(|init| init(context_key, context))?; - - // Get the exported function by callback name - let func = context.instance.get_func( - &mut context.store, - &callback_label.as_ref().replace("_", "-"), - ); - println!("{func:?}"); - // .and_then(|(item, f)| context.instance.get_func(&mut context.store, f)); - - let func = match func { - Some(f) => f, - None => { - info!( - "Context {} is not subscribed to callback {}", - context_key, - callback_label.as_ref() - ); - return Ok(ScriptValue::Unit); - } - }; - - // Convert args to Val - let input_vals: Vec = args - .into_iter() - .map(|v| script_value_to_val(v, context.store.data_mut())) - .collect(); - - // Call the function - let mut output_vals = vec![]; // Placeholder for result - func.call(&mut context.store, &input_vals, &mut output_vals) - .map_err(|e| to_interop_error(e))?; - - // Convert result back to ScriptValue - let result = output_vals - .first() - .map(|v| val_to_script_value(v, context.store.data_mut())) - .unwrap_or(ScriptValue::Unit); - - Ok(result) -} - -/// The wasmtime scripting plugin. -pub struct WasmtimeScriptingPlugin { - /// The internal scripting plugin - pub scripting_plugin: ScriptingPlugin, -} - -impl IntoScriptPluginParams for WasmtimeScriptingPlugin { - type C = WasmtimeContext; - type R = WasmtimeRuntime; - const LANGUAGE: Language = Language::Unknown; // TODO: Add Language::Wasm - - fn build_runtime() -> Self::R { - WasmtimeRuntime::new() - } - - fn handler() -> bevy_mod_scripting_core::handler::HandlerFn { - wasmtime_handler - } - - fn context_loader() -> bevy_mod_scripting_core::context::ContextLoadFn { - wasmtime_context_load - } - - fn context_reloader() -> bevy_mod_scripting_core::context::ContextReloadFn { - wasmtime_context_reload - } -} - -impl AsMut> for WasmtimeScriptingPlugin { - fn as_mut(&mut self) -> &mut ScriptingPlugin { - &mut self.scripting_plugin - } -} - -impl Default for WasmtimeScriptingPlugin { - fn default() -> Self { - Self { - scripting_plugin: ScriptingPlugin { - runtime_initializers: vec![], - context_policy: ContextPolicy::default(), - language: Self::LANGUAGE, - supported_extensions: vec!["wasm"], - context_initializers: vec![], - context_pre_handling_initializers: vec![], - emit_responses: false, - processing_pipeline_plugin: Default::default(), - }, - } - } -} - -impl Plugin for WasmtimeScriptingPlugin { - fn build(&self, app: &mut App) { - self.scripting_plugin.build(app); - } - - fn finish(&self, app: &mut App) { - self.scripting_plugin.finish(app); - } -} +mod context; +mod handler; +mod plugin; +mod runtime; +pub use context::*; +pub use handler::*; +pub use plugin::*; +pub use runtime::*; diff --git a/crates/languages/bevy_mod_scripting_wasmtime/src/plugin.rs b/crates/languages/bevy_mod_scripting_wasmtime/src/plugin.rs new file mode 100644 index 0000000000..ebf4784487 --- /dev/null +++ b/crates/languages/bevy_mod_scripting_wasmtime/src/plugin.rs @@ -0,0 +1,76 @@ +use bevy_app::{App, Plugin}; +use bevy_mod_scripting_asset::Language; +use bevy_mod_scripting_core::{ + IntoScriptPluginParams, ScriptingPlugin, + config::{GetPluginThreadConfig, ScriptingPluginConfiguration}, + make_plugin_config_static, + script::ContextPolicy, +}; + +use crate::{ + WasmtimeContext, WasmtimeRuntime, wasmtime_context_load, wasmtime_context_reload, + wasmtime_handler, +}; + +make_plugin_config_static!(WasmtimeScriptingPlugin); + +/// The wasmtime scripting plugin. +pub struct WasmtimeScriptingPlugin { + /// The internal scripting plugin + pub scripting_plugin: ScriptingPlugin, +} + +impl IntoScriptPluginParams for WasmtimeScriptingPlugin { + type C = WasmtimeContext; + type R = WasmtimeRuntime; + const LANGUAGE: Language = Language::Unknown; // TODO: Add Language::Wasm + + fn build_runtime() -> Self::R { + WasmtimeRuntime::new() + } + + fn handler() -> bevy_mod_scripting_core::handler::HandlerFn { + wasmtime_handler + } + + fn context_loader() -> bevy_mod_scripting_core::context::ContextLoadFn { + wasmtime_context_load + } + + fn context_reloader() -> bevy_mod_scripting_core::context::ContextReloadFn { + wasmtime_context_reload + } +} + +impl AsMut> for WasmtimeScriptingPlugin { + fn as_mut(&mut self) -> &mut ScriptingPlugin { + &mut self.scripting_plugin + } +} + +impl Default for WasmtimeScriptingPlugin { + fn default() -> Self { + Self { + scripting_plugin: ScriptingPlugin { + runtime_initializers: vec![], + context_policy: ContextPolicy::default(), + language: Self::LANGUAGE, + supported_extensions: vec!["wasm"], + context_initializers: vec![], + context_pre_handling_initializers: vec![], + emit_responses: false, + processing_pipeline_plugin: Default::default(), + }, + } + } +} + +impl Plugin for WasmtimeScriptingPlugin { + fn build(&self, app: &mut App) { + self.scripting_plugin.build(app); + } + + fn finish(&self, app: &mut App) { + self.scripting_plugin.finish(app); + } +} diff --git a/crates/languages/bevy_mod_scripting_wasmtime/src/runtime.rs b/crates/languages/bevy_mod_scripting_wasmtime/src/runtime.rs new file mode 100644 index 0000000000..6dc357cf00 --- /dev/null +++ b/crates/languages/bevy_mod_scripting_wasmtime/src/runtime.rs @@ -0,0 +1,28 @@ +use parking_lot::Mutex; +use wasmtime::{Config, Engine, component::Linker}; + +use crate::WasmtimeStoreData; + +/// Shared wasmtime runtime. +pub struct WasmtimeRuntime { + pub engine: Engine, + /// Cached linker, populated once from the BMS function registry. + pub linker: Mutex>>, +} + +impl Default for WasmtimeRuntime { + fn default() -> Self { + Self::new() + } +} +impl WasmtimeRuntime { + pub fn new() -> Self { + let mut config = Config::new(); + config.wasm_component_model(true); + let engine = Engine::new(&config).expect("wasmtime Engine creation failed"); + Self { + engine, + linker: Mutex::new(None), + } + } +} From 299196becfcf59b40b10a0496b036f2f086e1397 Mon Sep 17 00:00:00 2001 From: makspll Date: Tue, 12 May 2026 20:14:51 +0100 Subject: [PATCH 4/5] do a thing --- assets/scripts/bms_wasm_guest.wasm | Bin 2383617 -> 2855009 bytes .../src/docgen/info.rs | 29 +- .../src/docgen/typed_through.rs | 15 +- .../bevy_mod_scripting_wasmtime/Cargo.toml | 2 + .../src/context.rs | 139 +--------- .../src/handler.rs | 45 ++-- .../bevy_mod_scripting_wasmtime/src/lib.rs | 2 + .../bevy_mod_scripting_wasmtime/src/linker.rs | 251 ++++++++++++++++++ .../bevy_mod_scripting_wasmtime/src/plugin.rs | 2 +- examples/run_wasm.rs | 12 +- guest_crate/bindings.wit | 24 +- guest_crate/src/lib.rs | 4 +- 12 files changed, 366 insertions(+), 159 deletions(-) create mode 100644 crates/languages/bevy_mod_scripting_wasmtime/src/linker.rs diff --git a/assets/scripts/bms_wasm_guest.wasm b/assets/scripts/bms_wasm_guest.wasm index 2f6556e4de4971da26b6697cac327ee9bb81b45b..757961252b11db60da7455d5fad900f4e1dd5572 100644 GIT binary patch literal 2855009 zcmeFa4V+))S?7K3bN+8LXC`xK(|)ofK0W_`@^QmTAXW?*^>I$tLXlRh)_rhg9|*|+ znF*O>W)kRbB?AqVT2xxmQcGKEv0yEV+Gpm_a`Jb2j<+`u;>$+b~w0r)_@yJEp8MkYs6^$&+?LIJn+3ehviEBlz zz5C|AA#v`C$nA4((zWKN_Foo9Nh@0a16NKhTrs=%KUL+=IDF8x+!a-^b~N88riRYg zyKnyB{@t%}ozV?0df}y4&hMPxGq>;H!oCBSpSkdwgH!YEsQayMSF07Zr{?Bn=X}qh zTc`HErtH?1GhTYejy8R|Byzsp z?k_sGD{V#NvxgTB9$rxGsoe}XPGT2Vokz~?i`}94Mf-QpFKnAVI5oF>Vc+b5ZI|ud zw|{Cct#$V7pPirD8%3>X%r~*kgB^i~$Q}GaH%*UjGB&hzdV6LMEKD6(nD0itR&+)= zk|7w*xOD&Qo*9O+?W(zb3sc*6AK1I?vi*nWuW%!yr@H7x<pFcMDi^v+?}A zI~cjiD1vqqmrpHhn>ui0-`wnhE9n;Gyu?MPS_^yj?>n>cDm2sTevR9e05naw&iume zg~Ri325c~O^}Yq?YUEmdo`s6-&I>?CJdDonOWm%vFxpvxXgUx(MG?pz6`1o2dqIOs z>M^PZ|1|W`J#HT$bh!6qwLYNEDt+)Y^fA&|$2b}?FgoEHcS$tb8BqZfi_uX~WAYJ= zxnKF%-7Z3sTtvTzvrF93=#u!T|HmD@Bsr>U{mV^@AMTv4BmIpoY3mWs>=lnXcF%)w z!6RRUi`2iff4S|3+bF)THNKimZTNw?srlK%b9<(??VX!FSPN{lst8ts-IUnKt=4i? zw5bE4&T2(pxC{t2PX8r4*OGeH`eh~URkS+ipS5XO;UQUCz5U~BkjSknVrM-^X^q;x znZU&*hn-b2I}f7nP!S+ECaj9^AnLwY2)cOw!0v|q?AGhep!MWKz7fZ;aD0zGQwz$`edj4-5$F2uc>pwkoF6wk#r_+g$ z?GYEpTz2?3j+4gu1TzTh8^>E>PU_BV@9_}_6ooX|hF|Al{Y zif*jp9ihza;rGVyyIv*!(0ciV{riyp`>81HUef7YId$di+-u@!0u#08@chE;mD{F{ zp!cH}W<2qRcH92h-FvZE>t9emI(#5Je9;IG4YY=tmw--UhwXktqA<;^Ja7k=_9F9o@|JVpKdD&GcRFw%A?n@@Plg;>T@` zTRY+?cSUdd)Z+e6E-glzuT_QVeryl(IQx|D?IwHHU*<0RIbH3DFZ69(xFh~{N}Myz zKleq`+55_JJlYXo#M1{Oy*p<*yEC+QzaE?xzv^u3J*W2vo4qHL&Zl$zP%`_aP%ED< zVNhGY8=k7mclqn=r^2&GqiH|biS$)2F42(B^rJiqScq)Uk2bpnF+5~^e$cuJ9Y%n2 zat%KD+#7r#ah(#x?F|s)$>o2F+rLoL=w-#xL&eeg!X0|qIC9i@vo(%H?!t+VQ1X1r zjK^axEuL;bm;Lm0P%%n}s@9E;yRmp#g?Ft|p`SpeSX`7Gx9)140cY_o2VdrUT70M; zS_xV_xdw2I7+N*QydyrHCtKj8=F@)59_Fp=F5`@-*fgC-r^Q>ucu~<(@kYP>wmr=C zv#I1e74vK$4Bp%*UV=&K?G<~x)VY$F*$Sx}%cJa$z@u4J1)=?EJ)DsEzNfl+x4(Ly zL#YNqrbQ?kI5?IZ_e9_w@fbe>6u~Z*1Y$q&q6`LFc{0t&TE$OX%ZurLhs%3ZX1d?y z@{Rs!kIU=)R13<4D{VL(4tii z=SRYDc18(A7D|hEsz^|WMJv0xF2Vb4Q6jKAO|Ux?>6fs?CD=%EgH*zr%RZp-<}qp) ztGT#%^|}2do-BYkS92Tv7>dkj78e_)r=gt?J`K7Mv7!eV+dR=5{qp9tI66DgxZ~5} z*4fF1;!zuSCs4mDvQ77UdAE4llYE5BU-ZNOI%^6N_p;l)Xj_{!+ZVw{)wcDTa+glS z1!;hUay7@pw7;!^O{6E}{kIzeTt(}N^m~T*#SI&&9@LDo52=zYlJv|NB#(=u=YlJd zJG)0OVbn&GCxqgi|Ljow%=3Wa_f|l0Lcni(?p5BgqRK>+y-g3ZH|yVt^rGV_td=he z?xXB(m6yhWN?YTec@Dbb*_eLEvL9W$vzvWqRp)Q=_dAC=H*4jU89Gh8f4z!rhB?tz z>Kc-Z&++rpZ#aI{&976XWpz%7Vd^Z(-6>VtMEdIEGpG>rLEjTdFf=T4u0W8Ow`wwv zC(<3qYg9(!*VW{TYVS#0x7084=^6?~MqsO{foT2NiL645`ywBWUwL8WgO^uVr=yX6 z*2b%%nR$NIOGz2n`}XR=tF1vPtmYpSS7L%l3q^Ep<&t=t-a557_Nk>xjrLn;+yrC% zo>JSuMyRwnZ|{h=S3R9WPxz(ZVjW5up=R^Wj`$UMht7h#&}_G|!<`d@&;^7}-mO6B zh&)0UNIJ_y@+vyUO=x5Hdf6`+f?zv21V0(D^=R#04h^sb$G!0zk$F*ML6kWQp;Z@G!Go2QX}e1U+r zwmiXahhr)Da(<}x3Vs;wtBS|fU%&PT+U61Lh+mzzi?>klLVly2(Z!VS7Iz30XpKv_ zqshJe#QS!{R}6`Kdux0};bei$4F?x)rW8wSpx+DL#|ZWDE@*Hoy#UHV>fb9ZJV%aXX;;G-;q|>-P%*V686H)L0@Dxx#3WqGz zN#(~mp7qxW_}t+ww2PxV;z?d`zs@@l?cyu^*UjAl|E73fqm%6KecKdIaz;J*N~@%n z+r`rj9q_o}cp{8CV-Q(B!Kib}3CCM_(k^nI?60nRJP}>1sO_T;BG%bv*=STV$aL}gj_S*Ebu^TVhzvh(64YkMKJB1kZr%1(oQy57xiX3G4$TWcU zw*mgZl8oo$>Slv?Yu9nNZaQD*EBJ0Ghr};lO=UGi=3t^fP1_56G9gCJ zrm{hj8^~UNvdEU;Ztx0fldz8J`R~Fz=r+|;<|1-b&s~j>W2FkLpi*2k2LH8+r$p`5 zqQke{$O|7GKB6){I{XR$RMFuZ{N+f|MtF$~i}6NeD54BUhC*Mds`GRree-Zk=a#wp z2wCLA`lIIszH)h#{icvFF`+yhcM`r;@$6b7yxj&+d;@Cz1}`)J5@9;$1ioQ2BB~LL zQ~A6rzS|9Txdvy~Ho#Pf#3YmJCw-!uJlFsjmxtMP!Z3u~8Fj}Jc)=ciIk2%FqDB3~ z*VQFco^6Y|V)W%Hf#;N1c#F7ZwN^F{IUewo%$%6ZL|8+aNWblb*w`6O*l_+p-K>BV zoCpDr=;cH@VRv|8pY`{rgnJyCKl4x8n68O5;qPrO@>nkJXr%M%yc+T`^v0(?d}{Be zKU%8%iqa3wepo%klS7r(Zmw`UBWCl`;+w-LO*cd4ZLQgTElJIP1o10=HC>-k{>8~DLgiZ{VRu-qqf zpnp%;8gihAP6LbYst1~EJ{)ECmhDdR=~1zIV^$N07Kt}!^+Br$Jr-WRQ*`P9B*G?j`KV&UjN1> zi)`V^CmQHGg-Vnf*p=>se9AIpv7GRv7kCkBH z!U+s~H-Rxh$#s(ZIG^w-1Hh1T2^fU)7B@W51ViK6I-O@L!2mHh82wWyPcI5Z-tdv1NAEXKLPc3GzN$& zTW0hy88UjJE2xnPkRcokw;yU>#F=!fp;1kt>Z-dmRptYY|5P9=2Yav^# z496B8w#U_l84&;^DJRt1kF0#Bc(%zb_XqCc#eRi#^lfajohv%^x0XaHZu;Yz2eJo! zJ+GTB)uOBtQgRkQ3>$yJE3=lg*thVIpHO7X7g08*bz0o>A!8MSwg|w(WQc}=3kMi- zXc{8*e-EXFFd`vB)DH}Arlff4mKt7>UT6Y$0;{dArHV;i2*HG~W}nTR*ks{nG`=Xs zfv+YVAJecIpiKKm10W`C-Gqx7d)U07PU z?K6YYv13qposb-)Wc)BY3zR4`5F8-9`C&l_zyGzu2YiBLTh!}2@m7pslym8d)_LQa zMq{9`v`~w{>|&+>f$_}@qT>EARC!^HAu1lU2bC=_X^Ci)<}R>Slk>)7s4JqxJXaEd z>w%bg&{D@(-BTFfVr2iMstf6=ce?A9-Yy|HGl}N<8qeg(X^Hr%DQD>+uw>(kWVHd> zAc+bfDaA#Q0HHx5&<5sTgO+8G$f2v=St_E0#MO|bXQN~{Op2z)mpkMYegSjoiuV8Mc=fsL+HXBP6z~_QIino5dFaQNke>mGFU{w|#4K`&`N!X*{An?dS13lk-a-cfS13+Itdm049G3}ux5m{9H;Qr9NV)|h8nT!lbv zsZk>~*ruYd(kL#b7lwC6#3{au(l9*xnI$s}hDuq3UCA-{XCf_-qwFs{Et}UZaFu?p zoAi#x*Hq%UeVKU1pu+G34riFK$vIa=|t*5Nyzf zC^$ZCB|p{OAfZEe!xU@>VD&bcrfWdbt9~35J%J=r@LNKKn2aS?A`YC3bT7J*;y)&@+qL-7 z=zGT7V_>$8i7hstH{Ke9{mPqUjH2s`#cK`~tvQ-Z`)whjJsuXy6dyE8eOeOr#|)<; zNC!Gpxjm9siLt$p;(h!sx{~d`4fE-h-6jHABQt^VRHYnajjkg z@8p}zl_KSXy~leC_P$*_W8g?^qyQE_y#zm3#vYQ2KL!eC2k^pojVppaZhJRd3uSw^ z4!1YHYvXs1189_wAtgc^kcts;sq^-X_``?L7GFo;QT82GD5Kd9_B|DcX_N?=v7e-1 zAReTV&NBPXyH@qi6k%!K(}sP|N5LUrnV%)9;9HeGQE`_a!!d=XV493oJ{qjXvRADt z6i7dpB(0{1=WB?#$z$7OO%9XE%6%(jMf8Rg2#WqeP&&&6MXVbQx}}g1q%?%Y9OPE9 zp0!ePIZHWVdJH+?aZ^+>G>wT$ry(jm)AWOpJNq3Ijb0FqBx0R4^z1c6V?+Yb38K*> zf0B2`UBFk(`#lkVMC=fcb%fN;`Q!K;T8Jep)*-}`mM_~O=n>UNp?axwlxZ2HqB?7? zmQmgKwS1>!Oyys8npDT$3{hP{VDN;CC6kM+q&mE1UT7V3|C31kTmPHH|0|IA`Nw0A zTGaHfBp!SIXnN*f6Pg~2>tx66y+&wQEcT?wVgi80-m_^`dLT}IQ7?N;%A$x~ZbcU5 ztHM{G*F(S7KtbYSZ=7%u&w%S2djqatj;-eA7=FI#Y*u%eALoK|%?%-3;WFD`AKh*%N4ndql|2x zh*=eF<3+iHkd~|nPRt>n`Qx%>krr`Hc&SxuO86D8J!I~$y}%!qeZh*FL(A_$xf=Xl zVZW>@o}MOv>f&rtSx$EgryHj$HE&PkWF_809&62q`PbGS*Q$gohc8VqHE5d&l9#0@ zOK4X&%7_fwil1^zRTiStpL@@hc@ug0Dq`(IV}c;+60m!B$hXlA)zwi|Jyfe;q!r+q zW+7MGlbbau_+A5IE0GF6pAf-D6`UhDK(S&<9OKeI_Q>|ZiXqvvT7_g*;`BSBz;Yzp zixVNaV@Q@O6OgQ!c%Xp9kZidnoWd1I#)nWPLvl+%b=|s}9mnv4gKnX5#)juP-E<@nrA^-=``3 z>1~lF8wot&lfYf2yH31sYt{^a+k--j>e=yh?BHY3n!Q1W#z(u zdxQc}Qb!?wBB?5KsKD#9Z!GWquaYn$S3fcx;sA|Ii-jL?2tSmQQG6x@n!JfO2B^;n zDz%q6qP%NW@5DuwBicxGDi~&YVNiTU7`yeO>@@NwfJsOz=ph-wSdAeEVs1lZqZ zQVGWgtz886Wt4vN6H9QWqI8LWd)H9{mC&z$HNYb7a<3g=6IEGjVcXw5h&GD5I)vuR z6sNwwoJ}X*rc3xJ{oUe~ZP8etAMvm)u3^0olkNl{vZ9JVRm-fGjDe+_c?s8P?+)3A z260)Joc+D0&hd!MZm=eii|%xj&e1YD2hNC!hki<^D881iKj=B(ogT~ITPK)7aTF+q zBx{NbI7PTfz5uf`p*2_B_@`=3BeWc=D{i(2Wy;}Qam@y-&@8nEqa~+T@oVvyZx5{) z`J(J^HTvxq4C=$gqQN;Sv&0ugbDs1i1 zba>gbmy-t5l2Eigz*9WwW6`jT_r}Jq)f(@flUE{OT`P(b2P;bGqrwlpKx1wXdCo=B zhQS9!jE7N#?n@|{$I={3he=K4`VsEPh}v?7T{O&p&d-}sf~jwnkRvE%tGr67he(X# z`t?e0jW@?(mbkdNn%MXgQU3WE`g$9 zAkhnhNOnwYA-Cg$f9Bu$XX0&;#wd98C7TG6_J}nt%wn3Aa((i!D(?tgz?_Dnt8(_J zZ+4)5=j<&D6;3fV0%8`UzA#@bmFxEMD7~Ydw3)-HNQbV7y@Ytm31z(jVNwtf*&0VS zuv{mB-2+`_odk zk>UV5o{Q~{Bn(XTDNPFB znq+^XssrWJco$w0r%Gji-d@F)firr>lmf%BRbUE7Iq=o#uu$KFP$1(Aw zcT&jx9a9g|B}BofC5_y}=tUtpEoOQRzef$obWi}5G^PO7s$~O|zQof*Ps=f+10nrUx+=R)kSp2C zuI6}Ben5+~fZD!VWNz>JihJFzgg~527MGZTwA5%h@2719-YRxiSWN9LsNQL(L1i(U z^L~NDN{qbYT}wEB#VO*eu|aamF^y9Ip?-l7+0~wivh>gU(hnm@&637<;sjN^dd~k~ zWyO#Z_vJ5Ol=huGtvEog&KB!6Z>4|aYK4bUbm4^=0Po-UF$4szi*adSBGcqC0+5)m z0o0On3A^oW6fp!)2@EXinSz9ftJYf;Pd*}in2TwAH^41M0JcRV*^h{L(%Ld!49cV- zFJs0BPFV3hjd9hXYv9Z$ea_DjO9&v_X_GSq5+fRCNE!JYR@BI0mAQp@D80c+S!H@7 z#E!#htZL*@<)_exhavr;hEoEZuEf6w4UUjCVe~_w9Vfl^+%hkWy>y-OD7`+ZXN`uU zuk5$PqjG6QXoYP=+=|Jys2??zSCQ7kA&e$wmomVM-h7kln&`*HStk1R^3^TWH|N_z zZuay)tis}@4gPEcZ9rR()Yc0?Wt~jcp;YPGK0lMvbZtd;WLOH5-!Y{RW#L>{a|xJB zWxS(lD2;u6HTH6(u&gX~@nnsJq0z5jW%L|vz@*hsuHn7IhAZ+cQ6zm=r`9}}NXmg!Tr;8Bu z*48L0p7@Jj_&gI%a^4_!ACVkSwA!KtlNQ?*e4q%B8oha$S44CtfOQYSZ2lk^pa7m9 z0pSAf0!wCL@noYpPLP0_ig|7N>~)LBlru>dif7!RBT6+Z`5UApPT$h4)fc<)%hirK z&Vz#Gwsg%Feqhqm%R!Ow4hKHwrwksWlc6T)^XARt9v#nJkbI%w^5u= z7lmWNtWpAP$pqWwm3Fu&5BqnD+rpAPHuWp*u$LDWMZ+SEbX*%V=W}&x@lE0(pL=Mt z(o8QV)xG%7P6Dvw+uAJt=Gnt6pz;#Kny^<1xL1b--zwl2d=n*Zw%(+lS#a|m8l}Lc zyn?hV_yJcn)VBui71U%@FY$fzFNsP19qJR%w#MIH^+}1)DRf#LC&$*t$(x%)-||(( z39~IDQIh;PgODF%{U!+e*>K7lsyP0zH~c zqYO78lc+U~@jB4}ZVzgc`+CRlHKVo4INc%$rFT}mflZyAmfF2^PH`y0e~-lS$o zpep-gQ7=l%CC^tX*8UN%5Y0J5O=&tILRC0mi*1#GbVg7Jel#e9GVy_w_-DCARIa$y z#yddfG)UhV+6W&Z{nsbf(%=C)i@0pfT4)vw+C%OAV`p)Y?vy59C|?0V+9xBkYD z|Mf?I`&W-%f9zH8yxM6tVWqU9mD>HThtxQuyX#HA`N&iM{mp;>hkr?1on5bg=dXO= zhu`q!pZ}}q`eVCn?kp}o_tQ&AS)V-`7M3#*P1F~PhXtCTA6GJc;SIv^4$5X2G`s8Wp`{1mngWorA5(Ycweuu2@)O=!XoZ&+$14jsAXe2d&{)!xHU*1% zsfq<$%4@c+x^`6HSCn$*Wrl%ZD z?!-S^Fz~Avt0w)QHa1nbp%5OOB-g`MP#`^;YDy##Y%LGaf62-#OO^OpMzNRyrv92i ztK1n&8+gd7_&q5~M?3xFE?etcH7h*YYKlNyjF?k_&y<(C@twwl_BaxbJfWfObDc?+ z>9?6=X|Qr8*;O;iBpHThl7XRxvmZ~A9Q2%!!9?6>=@_^`2iz*>PMO791hF`t61_Sp@uO$>s8$`TsrI?6`l9NVaq$HB88yzyYz*G7Dib!{m#2a z`klKfnb6!C=AH8`rg5Cvr@ln&WH4J|&|{3OeL&C}s8O?^C3i!dt#S3ECWg>L8uf8@ z<@tyz@2!^SE8oeUR|9S=R*{)8qS;uv)U>%F0bl%->qRpDE*g>Us~}r4+EtKACyNy3 z2n14yHiNSF=L4DGdbAbnS-m3S!!m5uPP0Y?tr03OVoX6c&OjR2*-MI@6*Z6~4}A4> zn5-nk-j!$-O=AbBW+>3YiV74&>&{PJGI74zgrHvqKom|VO10@Q5GB%aApGu4#|@E1 zFu*R|WS$OG6^JbKA8X9}+2JXm4rlKfY2oyGS0@EAn%S3eC|s=rT#lK$9NKmAz6fKmD#Kw%vkbBdV;aRFoKJRG>y zu5)EB1o=M-azc1rUn|iK*NeJN|2<7nl$rbXKnm_($Zw;@Sekf8-T&Q z*d!sOTXcS^?Aw?RJUS=-C^|=M?H}(lO()@~?Tk1ii(KfEn`3%W;kT?ETyUhXos^+& zOHgxq8uMbI7UyW?ge$7tE*|xj6JOa{)maU^SFv_z#g}%)3yu^At+N*85g`08b?tC) z3hX7;z_^6TKItty7AC|7-Ca7nZ6Xi9uikhkQ*5wXo85xS-|?5-BqnuKv&8q^1CGDV zM<}X^C77TWW>R?CyZg0fcvKHe1lg!|b*MYCx2^9MSxvZ1cZ=hsx|`y!-VCX7mL>U; zLcdZD=vEW|RVN^t*&?_{6Q5v&3Ea4H^72mlhQ><7S|mK#p^;JPB*{*ES(3eV@?_VU zA&^y-1KC@ILB=yib{&esdljq6uF@6RITo}*c2fKDYhzS~5RFm-i^$GjN%Jxs@^e}P z?x#jY2tP_A1PB))$llm)Y3&=bOgudpAw(I!V~SmT%LrktWgZ#tf<=^#nIQ7} zVb^wp4l>^VdPwnhskDF5r1(m!PArq;Zh3Pfagaa+nY6VYIulYm2uI<_BzuPxDxAqm zk+zi;3o%JzuBi5*!JVvy|E_UOADQ3I1KCpBdq_K8ZNQ%ohShTHM-(TMOt7^!U6^T0N=e9A_G@glAu25g;_~K z(KRSM%vR9=32+Zrw4I~n67mgNr%y-a>I@xP4pfR|z}@ihhnGY!Pj4IR6cB1_of5lb zzzjiyxIzkhAOccsBS?*uSaIfZq<|(vN?azsmdr!SZV`77hE&5>Ku&j=xfA#_Lu)gp2vu@7&j?FhWn|NUs%&Tm^3F{nJc@y@nt@0*p)hgdyMT*}bR^pHm zm~COEL$-w+-&gG02w^8HW zYWbx=k-vG*5?cSdrRJKo*5G@ZHn%Dx3x z-&Y8(zSY2^%R9azhak$;w~F>oSrFc-NVjtH%^NS>d|UC!7^x*)N_Z$GfaJg0GpCPM zHJYY!iI)%9luKNR3ChLQ3tQ?&e}H)bu*D`c#i3v)P9)Qss({02G|GNXTt;}6up>^T zz;s_xB3s1Tq*|4T5}=x_TaX{gqA;tH9vNESSA|^S28L9}o~*R>5hbTn6d(4NHuT~_ zvn)J)pe$e-l4#$X9Q)9UL0)ReJZWs9dRyF50>I8Qi8O&-21?>?0wtO0K_>)C;nxBs zeHcW6lDu>NmVuJo9T{^4N}UiWxiU)964)wAqS9(n5`7FsNuCu=fr5M~P?8U|b1t)8 zI_H+JvPcNfmO1B^uPWb(Kx;YY9UmoW`ChsG%h-usCK}p56HooN8?x@zbV3!gz=>7B zLV8d6fmH(*l$mg1DJ`^!&_5KgND;0Tu<$M%|Db?{yR~rAIA*G1BH%eMJ*i=o&i=pL zVX%0{x~zVhQ!K{2!plfp8&BYTMjusZunMFuTfdH?2Bcoo>q198$bUI+L588%ef=OgKi1a(sWX?x8nK zwPl5<3`j{>R~<7|Se`DIv*Oo#0h`5J$XCUbd90}))`jWxSLC30>we+xKT$11~6 zi;`j0NB-$j9Wb$jDq=oTNWh;|)4JHAD?TrMsig9h5Zdy{`+j945zR6P9NPrbK2FVV27 z1*LbyxA{W4eCms|kRrtQ(a?i>ZqsM|xcO+N_%x5Hs%=2N)Qn}X*h#yd$5(CB6 z9x*e;#GwI45@1Shff+aPxY-Fi1*NX%^LE(R3t|K47y5a1*Fp zlee!r#7wI?QZ$A+_X+{{#>CZ}m!NqlYmt8hsBWb(mG||akFC>MDFFVU0o>*INQNTs z-$RzOCJ?Dw0A5f%Gk53;ptIXRO%b355v{@5QZd1L zj?`)s6R&Alz*5vh3Rt#If+IW-4MD3FB0zqhuERoB)|nB3B}WzpBg{n!Px%M~Hzeil z{)iAo)~?qd;j}7om$stwqy5=%B5M)sG+eN0=%WGPwGOxhD8mvsQ@`&wjE!nJ&*&9w zGb|o`Qb37PTDK0Ej07K|*9Vu$q&P(T+c>;J7wdIis)F*W=l}uC`FlRQ&Z*WCmNs%S z2$QZlY+lRXHz=Ie1*>=b`F~myPesu@aKPBOXGh+wA7~v^-cxGVhR(B0&!~)^0}07w zu5Vtl#KFo48Y)poN}h8Cxu=3cL52)X#>Ud(C`LFcK6KP)hF&OfJIHY?Lnw)gm)IhI zWP(o(sbstOS|Rnw<%8A?rylYVA5OoVDgIARPN8YTRH;d!;1D+H->WYhgf7Lh#lNAP zJ2Jz+FFALkKk9I#M03DCi!Tz*@O8kazE$A!&i*eer@O`Pk z9wQ>XZIYvOV2=@zzb9z5=`yeftT@CTb|2V-Q+C82qcmOt1`yh&sQadj@)Q9tGUaJZ zA5|jGEoR$fpBG*;NMdC?O8td;_IWI?72pQk6EIfP^2uc>wV+9A5VrMjnc_xX+B%8{ zA5o2o`A}-6$*GDc1?4ZrP-^;8Ps!yB?fDkXG(!-L@@ClTJSK=$ z4U8}3#M;I0MAL&5%?Pk;p6eVUZ_!4?5Q*(OVm>a8Jt)Wfq^z=?%CR&u(w^4iD-BR}5}9#}j6sp&466$Fa2RQI;$~E;h3k|ETYl zT`*2=PS~!;rn_=voWlcJUdch3kn)0YZ3Yg#BgZ6RbkHXZH$av3=e!AS< zjlsw?yQp+&%z*~B22^>;?5SK2RRK80DM7a9h5{k0_CI-5`mqgfm4-|tYgZP1^6W`F zr>1-==QP|ccTVjwTxL#6v4(RR>OP}Uh1k7SG@MiDaW%*fE~j?P<6D9xW^PMeB&-bk ztI|%Ul0XIB8@|QP=HXhBAK4L?V&f!|;CZa*X;}_=UbKaJLwmp$TZ3wY%GiG?WK)1L zY&H=oZLqR?232+s`hE8aUoDY?t)tms6l>dP1{_Ta0w;`LafY}ifv==Kux`ehC0E2) zxt4agN-3cGg2oAMlxdl0U;|{F##f;3{NPR@vff{6;um2Re(`83`~uI22VB@H&ISvh zXSygoF#d#u{-75LN?!0)3~^%nfT z9)2G$SMmFBiJ+uTo=M1a*n))0?dwOiQt^KF2*9;CHe0-GoeMx%6#%V(Xvmsk!3dgh z4v`|9!3E_hD`VMqD zxdsfL`@jLO(IYLwbsjEsmyn`Rg24d`f%gVqMFZv=kER)9<5WO8KFA`Jm0zO!ph)GQ zKy^7Nl~QP`09q<#uyjxo@1XFRBX!)c=;rGhV|f3`OSy!A#Rk7C`^;Fh{XEw}yT&tc z6KgKe78PA=MnU;epfZNE^}3@3qdg+M(Lf7pMh$_*d_=`z9OfN`D!W?Gzw(9|8j_>W zrIoIyM$4$|3naXO%d0TPUT7OLO>Ho%fs9Uwr=dmOo&!bRNraliPNMo{lnN%3pys#@ zrFrHF3=~Na5|rgyLc%^Sib+WH5omaj_^}}*cFM5{3HXM_J}%=&K`(%h@gtD|q#!Ev z8AK&PR3P8#qGGi-aWeA?QE3DCsF#jN(!nv}kOs&`^Qe*zj^hSvbRIwvU_wi>nylD9 z3s@kT#P#RKq=kdGJBw%^{WmQeZ%PL-$TkP#SVha zB5)fhPMQ>@Nf*PD+v&BKg5OOj<&)sZ5v4~=H#9 z75rF-)ob&kWfN+CWJD|Zkg@EiXV@c@bJpJN_XJT8asNGxJJUm7?2rK zu_Ic=Gp9cPgSL>^m6;AW)G{5?rJ{nC!d7|FR(fZT&muwltAokJduN6dUehH0)wwe} z3XyrtZ1Rj(<}gjE*nED7?oD}l+v)=?d=m)ZuUXdRkptU65vy(hR@DQzYS+NU4^nl1 zT~&w8Sn5o2EpTXO2p1&v{j;xW>Wk;70fm8(KtFL(he%E2lm|vh)sh=er2G^1!-sljHaZ} zHBu8CM%rB=MG}qN_HD3;DM*oBAw>u(G9F93B}L^BXxDGFvR=^Y^?29ymIZ=`@YF*%gdM{=U#wU#c8Ask_eox%!i!UCwm^>_3k1|??*3E@hMEA;sc zlrMY|Px?PF2ro??NYbccvdnlqXBbX6ftldhb9X7nxC{+BCjO@C23svemC%&TmGOX? z3Vi`VovNheaOqCsXrD*o83|tH|D-QDvkH-IgK!RRvNB#|l>s)91y@!%ngA1aR<9AFJ7# zvH?I3bkLR8P*B9nozxj)8e&K~Az3C-vd{4VN^M$Ju;egd6*UFZqBg{%*3dAICZ0!m z6L>VKc$8n>(%HD}B7C~mqTPs3=<}jRX+KtlB^jI+9dtyzmEg~@X zamA!suLE;^2%TwSr)lDYhxlcd7*N!_otF-!a8LsU5j&$;TrApGq=e_zoD3pYGa9_j zL4f;L+7U4{qmPFXYuI!gh3MSMVo#ZYVTjVtXxq6WhV*2lYgDPBWG`>|K0@%cT^lXu>nO5(XU6?}ey=gaD9&5xIps-3D z8P^Oaj-)Q6y94&!a%Y45(XwdWvPTNN$Qd!(kUioGXG39;Jcf`xDu)1w8gS-&!P%(C zYcJN9FTmEQ&m9G_kJMymZmdam@%rj~#k_xz66UldGG4>jDO?R1c-d(1Oc+ct$9Q*7>X zjW>HyerVkMyCBqtfyzIIWKE?kPhy3C>|pUy=T=CO`3hWdeE-;bFs)qr$Mj+Mo?E;+ z^nC=?SR!5|@YcWdkHwr4oFNX3Cna&KtHc%l@h~OvkEv*>7qua#w1$S6GWf^52~6qZ zGuZ*21^?K`Xmt#CvP_BRE1T+57S(_?^rn9dw^ex=Qyu?QZZrQ_>)!B>OK!8P2DgR0 zOgY9C+*TuGnA>W))x+Q__{XK31qa8++{&vJ4?lq`W`R8#5AHHWV!o#`XbS_y`j}I6 z6jt9}=84}Iji_@ztaLogrO6a|#B|BX#sov@A4_j(PrhGe9OEKr1nk4|$NPvT^PWNpJL zw%b7Eu4a5qI?f)ni6cwUl6kb()-8}|BUh5%t-bo*^4MZXs>xDX(*R4qS|->#Zce`sL& z!%p6@&(71qGCu{9+yvg6UHQ|DM%~qp$GjEV3h$tbZ_)G3}!!zn9X)XZRD<*2J?6j+$pmQ;il##YvWAj3+Kh ziwv4g!jr|~b$mb(Yyve_f#kxq*B!$y+K*}Cf(O0*{Wu9_kyw`euTqxnvDTKBfUMCV z&JHMsFR-`?`c&d&V>TgyL>e=_QYcCPE^e5GJem($MHIBeh>^f+8fpr2oY@%hG?ub4 zPJ@)*{L+sS*1Q1Ic^oXbjxF)Ea>y71SX@?+8akN@Nm&8BpHv0mopJKxSpF}B5x@h) z4EB3D@<9>6T3}%G3gw01H7W%J+Xw1|3E?wf!!vdsH8AhTZ>QeH#`Y3y!~FypL|J`S zY=0_Zu-!;e@~_C|hP0tnB={?1!8rXs+chjPU6M*Q<$9M_t|$b%V&R+~C|kjw;(_Rb zjab*>!4L3o`b-xUzx*@0vgkg0#02n4Yn6dT+2{0NP<~&6-erRCi$E@H+I5eS-L8Y85 zwO|+4%nav?sb{mRaM@pol$;s+m;QIzCkXzlQGVG&|6PJF$ariv)85#XR;p)1mAHrb zF|Wy3yNzDOMM3FH^JHIC+wzRK*Xj{xp&0%W2$LtnN(2_mnN|T{oFU_Urrwz}3#$pS z8--HC#Oa0eM?%QIvRlUX5m{@gbW953;axGDUtzek^)L}2FjIgRQhv6g0GRUnW(T^| ze-VAB^@jTB$3iVV`O)$=2%?1xtvIm#j0Mr{=nx3METXacLKeIL58w#XGj(>4e-CN-=G3HsEM zH5rRX%$#hCJk{-0Z1dH`@p!7+BDx{|w?|BU*&`Au_!#zxWft}berOe%ca00ajAW0< zZ<4?68x%b5Xl*w?YO^zFZKQ1LWx%J|HSkr40CDzqZ3rRaL*f@=$r7;?Qm;7~RcTBePph0m_N2)X zkl0RDT>ApfSiG7B1a7&mY19vo|^!ixilN#W_iXy!RMxzz! zu3BF4P2SjMu|TbP0(;V|NjR+wcge2X0byM@xL4o`;E=sxILhr1JqR|5zGiKlt}JNQ zW-}5KZE$(@G^q$_Smq`eUq4FJkX$&S%%9DxaSJ7lA--^aM_T&$&OCl$Ra>b}_`=ioTtTrN^qjB)X(^g*_d<@ZUs7h>AYz>5}80yL@ z3>bF)X19)?(QkIj#+NSiQ-zZ1w8RC zgwf>_#Xu%?qIkqS1qqP6aC!IS|7gbMcGii5wEPm!yQJK@)2%rLlT?@MFdVe4X5N&h6sZ~hp)qUZE!hS~av4v1r<@ytp z!7U%lt?C3_%~9qB3+S?^qeF8HkiE8+EKfb`2_0X{m(zka%86vg2QZOz3`vJm3>jLa z6F71tPrbp>{y4yful&3l3s(G0FS9g^ovn+nz#F85pRdZ{c@<3a(P>nK^aUwYRtz=@ z<8Uy8$Jv?r$c(HtgdQ8DL)tA=bo4892g`8VV@t9O|Bp1P0z!IS7t|>}j97GtT?|fM z-+OB7`TIzNisv+b)8mZUcVbH-uj!6XbyaGe)BZg=kxH+C;Y&wl+k)m42jC z=e3r*MV`x6{+qjXTVoggOWN4r@}~LQ(@odZs{|IEh`iz#bWwg^Vbwps*<0j3=uv{s zMfm)I=}8fp(hLLsr4Nar21;P8KQfJA=|c**&fK?-X#a{mdSQ6fs~^1}JQ}MX@rf*} znAMMz7uRWZ%v4-nkOfBlw2QyD7`83D^kuuWGAv6&;Y_1|@Zden*fV^3YL{?el<->I z*x6R%A1L`EQ{Z_U^YP7`panxktXFYxNAbv`j8uC_8;_oJdL*(}r5?9OLlqyfN9^^h zOMTED*~zhseko!7?&H>v(LfUiq+=E_88{&>yHzxR)so`H%SiCz>Rk0zNI>3yISIaI zB?;u-2|EoEY+Ol#Q?2t8li^|WvMaz)mR05CEI>{Ilt1rqXwHNwA(HvRTz_K?9ozd|Ry#8X$M;nrBlG4T^ zc(FIW#d?Lib^^aYA!^r?-B+VC^q2$hv5)@XFcM-!_CY}Y@;6LCILnQ1P2BwPXmQZi z&ow`ICkr!_N-Z9b4h%-fg-o9ri3h>PH98R!-Oj81Grmy$TC)Un$SGg%d#v>z`U*}- z?knt%nbg@eav_=}9AE}Dl3_UV_MHRuP<0%w+DCM^ec+S^Tl%5|pOwHOheowKc15EC zpE${mlS5efQvxwv5I4+ZUy{WE?6{%~e)TVO;$FD~3ZDdpXl^f_ZI94so7vss>kxQq`>vlc&mogmQJ)_QKm?4av} zY)pT|n!s4ebm46BH@qA>)Rz}#PoS_kX>@up7OcQ@&Jo$ANzhGcrN2WrN%f}hWY2Lp z20Buf42^A?S5xL_xx8wSl4=siWCR6go4!y4+Nv1F39-*~SbHE9(B;T&S0yV3X3Sxe zR2W+9HKzz9ht{>?$VG_Ccs~UR`8eBi;XZey4>(ndqfaez8y`qc$s0M7jlBf2= zH-HNVXb_l`6+3!ZX@Za0@G$Xpu<4RV_8ImD>+TfAzVezw#XbCL&XP@lG@#}Oqt+P< zlCX~u=q3?pJQ38>FmT%4aQDUb)w*xteyfjB@A_0NgKgAZTUDCj5^bu- z@jMMZMpchYXGQ1J5HH zRL0WBi4YGszFMsNt7)g zk%M^vdqgN`|Sg`r8y9j_0|FBp)bgD#fke++l&H#35A?!pCM`WffHuT(;F@8e6v6l%}Tz>CT(@p}^{06b;Of9cAO^C1z7Fc52)%q3$u z+RU;{7q8{~8%1z7#X4iclfbJu)Cx>q#xWkOdVrn-E#$YPp%z+je2H?15YpyVLe7@V zmcGfLN6YfRdbBM6t4GW7zk1Zn{}vr<3z$*BhMQv!cq(bmi1pGCXz{50!(P=2qDL~$j`R*)|BoZPS^2E^wAQJ5%8MG^)I6Rd_|?lIm)qKv;Igo3*C zuSUyPBgB!bKJKmr1%h-+&CDq)XgB;SJ*cvxo#J+2SQo{O{~XF}w7BF@aXWJ(HVZIX zypzv-#tavXa|V@9&W*|FbXogX93b;SmC2VIYx^rp?=0(%+MVKNI&8Zrij;xv@^M2; zZpDa&Dt>3##M3NLQVMW86p>LMEq+v=8WjWy8s6iIm<>Fkt(yZC0(GW^JQ8U<*dd?+ z0Nb8kkAhf+QxOk|47GgI(vxK^<%RN*~`fEeMWA;e571y;FOmGSR&b0qvFgjAWe;kta5yk^qDo? zONohD9kdFkSR5Wi^USIc=|0(&MfWaBfx`*<{)IKG}{xzZew(Z&3qpk|N0{sKPig z-DU?%$SGJAYra97nyqAM8P=W`WC3emUC6#Y^3seYMs(3|7og_2&>kt>C)rP42bvf= zL*njj;m&kncALLzd?V!E$IM=q-|l#2?J3q-YZw8?K>1vAFcP_ZC}ueg%0u!_)68tE z)0$Q3*wX8JsO84kHy6mG>;&Wyb=&&kJV1!75J}Tn^8ZKU$z&2!#8N0{!zAyIuH~5{ z;a^%+y@}COOrQ+X;6v(c7>0#a&rBbKVCkCCe9T+}-T;KxHiU+8P$w8Eln+M2HAtoT&@DjS=iTceQ->NAj@Lb2$Nezp)S+8hvGSwozx+utP=RGx z9x#aodo%rY!n}1(gJO>W`MJu9IA&$~3dhEj`DeOLfgw{(%Nmo#lur+FyXjNID^A)z zF5xY~x0J3Oi@Ggh)rRh2w?S`PG)f{`2}VkJMS>5*HU}n>icflNH&T4YUv%NWL3d+8 zV32n=s?;)Q;3=yL!>#%@bYL$*dGV;VTdZCfgb+FkcgW^q#NS2#J*zMvK~sKDkF_J# zakqHPH%Z-9pcAHa5Fa_+iHc5M(6tnV#K37WXaC4G=Zepj+i?)~9c(YcJ!Mc=@K5q3sIK1I0@C6Cg-iR-0f zwMt@yt!30Ec~;UJ9eYy<+Mn_x!i!x| znff1qEvZ=dWb-AtP`Vh6C!H7bmS$$X)Tp5(8SWu#Bd77^QL=5Q3NI$JDi za|BxQ2{Hj;xP$bsI(C2v%`u=NFc@V<1dJ<=B9%2Ej(6r*!)WVQ@H z%ny?-do9+ud}`*3(2Xfg1tK3h%7j9U3U1sqvU_Nm>P=r8XO-IvF$!6|*jlR^qJ)|P zkxK3jnD(|{M)^0OvroLBO~{?poqJUvl)(n4N6rAUhonNn!#F(Df~r_d|8IMtM%iE}rfl5-^}Z(WHLzPTvW3zvu@Wgh$;y0=_#(=4_?9 zHmLW^7_R=#8_HGR!9%My7*F$`m<+)IQ@!F~i6YoQ2WV?|EjA`*Usv&!YoF~N;?jPn zwLWA&yCIZGCuF=vku7Qr_|j zq#!*?PIllbKEyk&SdZcjrc{EbET#pEpb56LB|(0#p*3X$X1PJ5q?$C$6W4m??54kR zTzf6N(uO3<(1)xJMurw!c)i|K>11z%PJOu4BSTf-RsdXPRJ~5GYJS?+#EWcp2K*)( z-gN5lDNX0tiJ7ItQ>$?_)LQ0q4ZG+nMQV1@)yjLNUG&Kqmb}WR3FfR+qXwm18wm4A zi2~toSkuu&s9}?X2z&9TYnPTGZkXOqdQ)6S1LQ-}E#{n<4X6k<+##}u@M|_7k5RMv zs9>2imM0U%p^9}p@{MvT{467mkApq@SZSrppoI0i^#2gb>C{RvjLB`q5tV3pr0?P1>P0 z2~cIq+4l)5#LULfe52lWLi_^^m-t7}2i;$b9;EM9QprLy$j6*YM_~sG5p{(b$3HAZ z6)oKjvPia1(}g5ie-I~M3b~_jfJD3Z02R;aA&k`33rneq{-ReFFohn}8shczal=QJ zPBd;RmDcd944k{4C>H| zXp}^w#mfk#wGfgu%$wGGUFGG0T`!2BoU zPk@C>hOi)&<=Ya}z)T1;Cc-YINq5Omq%P2;{qjZiAF6`Op(x>~W>F}IEo9tWga`)Q#Ivqq1($qZnY>oC^d;v@JFz!P1 zR^_iNhA=BUcZ)x$7?IXJmxA)mZ_?wyyIV?jtZ7TxyyWP$$a88GxZ{oYi93p~WBbMp z(wI^Dv+X(*s`Jw&SIf-}6Wkg45(WgAT=OpItnACM9C14;)lVHsmG$KvwD1gK@jM%7 zmM7Vo$w_VDwwNY6pY#nVmz!vQlA46fF2LQ$Px@BF3H&}k8LaT}yI&>$Sana1ukK!| z?YZ<`8^i=Q0%1baZ9aox;lwfnY7qqpQ#gYMB+mBr*r_D+8lvsW5DgkUqQmUO^TzS= zL7p^vJ*=8=T${Mh1-s9oV=R7cF_~;ZnPfli8Fx?ZM{I9SBx8&;gY3@MC#M7Z-1{41 zdpQkm^P4Mia>bb@IC(Bzl=EIY_NA#y_j*B>;&vZDjo z;tXMb_U(KuR@0kBZ;l_uI=KAcut?EY{4+>6YCv-*Eso;ly@Hn39PdESf)wiZ?i0h?*>q9gNAE1+5V??I~~m z=sXM5p^&CTG^C0d!o*q5# zkiKG|p6zxc=hc;0mJcTc?9Zk~SKIp;HK z{G`BLkN>^~HDDQl!W8nX#DUuJ$k_yfaojX!(Mg32nU3R#9Zfy!1fB zs9;^m&=A;#i?4X@Mh&AwtNPL|hDpwzR3Z~s);|K|k2!PeG6~R_TyO zKCdxZQgc@@K6kS~-Moe$boYGavrB@|fXicP8(yGRdXy z;sKst<|OF++2$TL1*R-$)FAz$Cp#c2XQ{r08(3gjPOt5>W+bP7TiK+PO_Y8q)|qyR z{8g|0DxAsq8Pbg}$aI+e}DQe&1b#5`(mp|CbelZ>9gtb+;F z#w6Bv>vQjvA>a@qH7N&}QYADVG|98Z29-{4BC~6jhdqBnhC(jrh*PPhVxkQx#j6dM z-T47~#yDTlUXgSzpBmnW7m|^W1ORfk7XYK35g<*h0eG}_j1??Wh2+aepzki06K)k| zl?7u3H22k@o*Ej|)kALHkb*!Z_)JiuIb`X9Yo$Gk(%WNlS#BWH$txm#_}T}+(h>>5 zmQ6R~YSyaZr(E6h(op8bJj}N5+9G&Of1#o{*HM~^q(uPaCNp4ax-Ct$r3wmN@d-g{ zNe3$VBm0EZATlU7!Cxw(LzR$hpALr(O;7;P`AgMxzwz=Q( z1$9a`+MenBZ8@8A7Q3irpibp`T){xK24qHBSoGLw{PH|e0Ayn1mCFS>k*Y)5}YjvqIC5GE$+Jn54v|IG_J{RG}9!GW6Q| zi=ELnB!YbF>4*lD_Y$J7LT%ysmTDod76nTg^AGmle;HLcWJbvsdO*N2U%e^hZZmE3$uf_ui?!{Z-!` zK2W}$pWAcM{(YC8F*hF#HS&E2_wHVp$`|(Snc10t-@;|*ylif6cJ9dT{rmP_eE8tS z3$s(Yzj*)Df$y9>F!jB&S57rr+OvEA{;9qBCEqhOe|Z1G&Yg!3Ts61*;MUVF$!8Db zyAR}-(AXt8jWMRW|9`*pqVJoZnw!7q%H1>b2QNBfjxioSc+tY_?EXDh?A~`^{-Uox zZec#3n>uuO-`v!EzHkMVXZIagn3~HMX7fv@axiuI0g$l! zz~218?160u4)5Q8y4|Vl!tBEC{rUX9|2&n?US_qe14=Ha{?yfbri8$KDzS6tD~k&+ z86AD~75nCM2E1<%AkF8y^Ggq3&b{w@ZuauI-B+HGTcPheuy^XRed>MJ)D^oK#9Y4T zim5#_IStGn)ZlgpSoZ8bpe})TZfgHNDnOviC@yR)yylF3^B0G4K=GY^Olm}Rb~E6s zrslTIUbb!Fs@bn9@%GHlO&RSDUwW|(WWGtg|8KfJxG;AnyfMFUF<0vTtJ>|V?0PQD zSBc`KuYn0n2zSr(E28F??cRsn?aZ%$>Gn_M{cp{;=U@A^joZWD@KWQZhSb$EuzWy! zcF$ctd(qs~<@@Fr=3aA=>cD+dSD&$GP7HX)zS(VG|4nCo)1J%D*|X!)Z@lyyzwzwL zF1l*p!nR8(_5ZT>9dLFPW#6aWes}k7@0+{nb+emnb~lxl1VZnjC!6dhSxB;R3lKov zP^1Y6f})5tML>#OK@mi07K#D_iWIw4MZtpd{r@v(&dfP`cM1CX>i7M=lbkc{nVF}} zGtbPKb9ZC!);X;$3p!icM7@EbWBeiajstC2s{HU)A?V(oHCu)^=Y2KpKe2aU!{+{z z{v%`I9WjR?+#iE{(W0%rC#?zaH*G{W2Df1-#6Xgk;XgtVa2e>8!#O`VynYjq>)X09 z-woRWGreAzwmGm1z1@Soc}^JPRG|F`;G&xJKWfPXV=%aV>-xFfm|$ z-am}lNZ4>{nY3+Vib_~Mvd6b{wAAwg3qH_4jKR<|XLuXTBIcHEF#?4}@9Bqmrit{; zxVGZ|5i$Q;rBTpO{abqsm!4)ty6&5LPfkw3lAKk3^F7m5Diw(hNc>t{=V zJlvag{g{ciZcHn;YjCJXOx#18270@DwBNPm*zY|t`@k31pS;`ktKU<9{_Uj`KDy%N`_w>m>IySt-zVaLMx?Y+J2^X9kDRrnPg3UW#&&rTZX1H(?*)Q_2Y-SCDD zu)W~!&~{-dHqe@E>mAtAH#o?dyr*|7yfOG2TYJ|F!!ppjVR$f-GuS({sUJ&&;jKU) zF7i5PZ!dhYffLLuqY)vV-X5AJKexB1yQc>ZEFH@{I#4O$;GGC}!fX_-_SSU+{U?Bd z+xoWk`sjCWrf9dr*uhU2><1B&^(XZYZ|=#jgK0cLvEF6}dwv5Pn!)XZL%mz_^h!~?dt+~YOK(r#@D`(NbASIf0?<2VCuHH~zAey) z>Afu*Tk?b3w`}g)dIBb~{%tb`q1wH9#VNMpdq{m-#rg)VY#SbeYQv%Kg+s5hu^<9v z=sS;TL`w6N-huwD{Q+KsFd1;ldQYGmjrj;M@=s9lo?*EB{*2JuBYMTkCcha@7Bpe7 ze|TU$^)@5#OEhlhfCBCiJwAtToh^bZcs>FGTYixChAia<24?!i7b(A{%l_ty0s(|r&N*KC7W+-%31j-FTF zfN$V6*sA_R2&I7fu&9%BKy=`ux*E1Ud8)#@SmX+6Qw$t-Ls-g!DR8k2_U?b!zIl4| zh3MSYy;;z=ZQk6L78z@s+b@q4qMxNBH?j3$7r!vh8wOXM^Ld+(w= zcLZR?KW0|lC+XIIka_E}fciUs1Ll53P44jpZn%^=!)O&Iv)(IC;l+NASzeY|%f^mYb^)R|nWq(mY3phZd zHqedSF`9(O8NjSzBUCzTbk~6E-@0BnCUTsZP9g@65cZ%yqozZtXk%hpVK-rRZGjqT z9mRT!cDENgMTZE=P8*tEwR};29dw#@3ASfbH?~KF{fC6cltbHEjP?`zVA+JlII(-6 zPgo<&VLg3=+cra!u=k(@o?bG%m8#vdEQ+}B4Nicz5c#x^(X?s#=`*C;K%IiiwJ5!N z|H(^wwr|bvwsre5f|gL9xw-X#~h(y6WlW&Jg(9vzW7Fe!1j>Wxd>Y?l)R){8q_5O?^L~ z{n~dwl%L)|=sOxSf~ER+yJk_Q!KnGpK@S`YtR(3*3=D4S+afeA2fwHkcNuQRd6)a? zB80`bD{*IWXZ$$RCAe8e*r~X?aM$9l#!c81?lf+;$2`LFW}6kblep_~GmkJ;xY;iI zV4QG_^JX7&twV;_QyA7NYz1zFFG=f`AH;rHFUEznyr23jIb|Izwh6`bKR`wgVh~c} zto_9{)6md%>%gdMWE~JV8uTuZkoE<2RvwoKfL^2oHuchK7PqgIN}X z3vSNv)^6o&p`!Fc=sj3_L??XIH+>_&X=}Oit+W$m?O}S4@D(8f@TqseU|rzOgn@;t zY3)Vd63TD5m)33}Z_(OadxO@hxd-_2R3h;G6bQk0D+3Yu{FCz45?aNzwoV?}d-9O* zID`*mt$<_XJN$k}idD+Hv34uy=2(Yp-?FYB)4cGFgcB%)FJ@%r3t5LM2MS&hw$h*+ z!YP)rBj!S*lxgT60Iq?|c89Hv6tl*9n573O2 zg|#1W5@XhHEhr{QT1=trz{?eg=#*0N4c%KfG}%H>D29+vQ7{(5eeCbAz&LAw@0LoN zqo~lx^w%TiK=hYul!KfTd@H00Iz%v!gEUyrS$-a|(wW*?s^yyDxEo4g=0d6bwTr(# zvJMKZVXXb|a;I+-R$f?v!T7{+XM!ZjM=YkMn!GH`eZa z(0SOIMIJa(1yXRjfajD6nOCsyg4Y#r<@aewdr!uq!RUhn(XP44#CWM`|r#hvJV z)?04<&A!z-!(D6r(oT4nddGRQtRw7&_9fOmu`BF7oR#()F*OB(lkM zwv);vRyp-(&$c^@ZS)w+*ppNC2G5QIDW}%)+#G)D%yHs&iEX)-*WflfO*kuKCzAM? znv^{U?F~B zW4D;)>=$2|Y4c9CJ4$AN*0kG(b`$necQSq(ei=UWZBKz~o@1|Z9S@ALue9A{rQoiV zL~+86?O}sSR0!7tamCJI_}s^~tI2Db4{do77{?LTvlPI`3oiBY>De(WWjlYe)1GI4 z2>p9DK4*#x>BSwl1wyzFZQJ&P2{6k(xC#iOrBmX_f;6Cq?9R5J2ko(#TMe4yB{*c{ zTCv3m%ihI12wDXWv^dpP%#A0LPNK=X)U`Ujc}ct2u8P?uR>Ce7t;Txnt5IjEXL*y_MLKu-4-Dvn_B_Uai6MEZDx?uw_W?<8A2P4F6nwXJnt>-^UC)&;E{ zt(~o1tqa>)+uGXZwass9Z(GpT(bn14)wXb6>%6vk^XAQ;*FJB-ypDOD^Sb6OoZmXX zZT`IZ^XIqEUogL8e&_tI`3u`y+uPdbwa;&FZ(q>f(canK)xK~+>w>lg^A^ls(7s^7 zf{q293%V98>}c(1>zLOuzoWflK}SbNXGd4Z!p_#tw$6E-^E=x+7j$-Xc6N4kF6?UU zYU`TUHNUI9Ye82>S7%pO*TRKBaUr_Lt1vXQ5J1Rk!^Yr(j?S)y-RsulU93*;w)-B- zSFD_!PtQ(IpPrsEJAZ0^Q9gfa`n~!09(}BDN4f6794J@GYIzEY{YNifkpDu!fj9Q$ zMlO$+(c952EiK2c!^_C6+@0rk)O1E>U`Lhi2E02i<<_nh>kRRpGS7KYOwMq`x(D*> zxW|gK0E_e7C#G{Z*w@pW&rcVxQqdBeoV6_QH@E~mQpm-Yz(%YU(5c_D4Zf;=*Vf`k529gIW4iGQ# zqX#SUYk3yKKUe|Qxt4VX&gfhmTWcL#ezjFrou81+ubuGf?6tFIwmvtj|N5(EJ2&L# zH2p2#V*O)n$0y&ux&vPjcG~Ig&dEj1U7sz!X5rkL=0&eJHSe=)`!$C&bw7XTYsYsV zc0m90hh6!N?!&EzyI1!E=dL;O))$(Oe(4v_AM?m>x{u9UuN?Q9{r)u; z3=mAR6H6qVWHRNX@uyaby&SAZS**OF!mf0xo!X*?SYvVmjPvo{3C>pMHuv++H!#OP z>O7WxJoSY0W9Mo6x!Cj0uk2rYzj0p4zvlhf`D^TNc6Qq0W&0m+(I-E7)v4!y_#@YT z;f@b{KAuQ*EM0c^>yJF@Rn&BJ9=`hhH{E*MoeQ2TJNw)VKj{?}mzK?FYhSct<*L2+ zKcJ`gyboS*(O16p?eE<8y(fy=lJT6g;$e|+ohLk|7;6)kh8O+W0)tFO84Q=hrvmOH-jop>f&*|=zz6$f4a zneYGL>O^hb#3{>mdG^;Yz54dO_j&nAQ>IRz-?eD3z4txvki!l?;;3VeTf4q@!wG{Y zzxVy;ed?y$K6m#cx8An3|Nduw_Tl3uo*Hw#IqnA6p4&2VdZXJ`(%?-_HN|GdmV3oB zM{bHw_9lDNlkJ)P-S+H`&Qw)8S+jV>LU(;K)mnw`H|k^cQ@gxNX~wkw*^B#gnP#mgLN;x~UBn)v5i_+47>=L^{4# za$0IQv-`4{@x`%p{GhlU%ek@4kx8d5P?Yq9{%+_30`l2ghr|bW_riOr>0k?r^m{7d~VUmeMiUI zXYb=JOqA{#%Op~tcwz?LS6}n@9rH`<#(1%p-0{J4y%SW<59Z=8S#4wC9{rx_sZIBlj$c+umWZ`gUhW@ocXrdw6=} z)~?2)*&bCXM0X@YTAw?l8yNFoyA@g#5D4^ zGvVF3u~42r}xZ@uekEThaN5}ov~=~idCzRK5k7pq z&iukRzIoT_6zUH9Jq@Y6rp>+(B)aNk1@uiF2B)khw;=G+S}`utbE zde^t^yZ^_fRn zWJzw?+*e-R+TXc!m)%z!vT^u<2OoL#$)|q(kGHM-nu(`B>z%$lS?|S5cidb&@>zW8 zvZKMRP1@dEuiZ{&)r;I!hJNJFb@3w;vtldL zv++lrY_}~l+pCLb+>x76v~R`8ACpVm5_cKg-C42I-!835&MlqePAqON8Tp`h`p2s> zmFHXR&G@Kt*HPUJ+2?IpesTe`G)Dc;HA_|Bj{nY32yoaG1lHf|ci z9=|xJl+I(a+%U8#pO*RXgF@vj@F943E;wI@*S5Xl?J4%O#r6mG8Svgz9k^4+@C-1V zT=Vy>wqOGs8x+`gz_FsCKD;aD{4OS8O#BwSUU{jIsk}AvoJy;Zel7D`S`O~rutzVj zQ|oHH0UyA*xSl*N*&gd8a9g`Q@T0q}%#+x^%~=zXW+S{NBF*?DgbfIHLD+=wScKe^ zosOFutSUVNac;t@^i0ILDZB}}bqG~^h+1@^c&oltS`nhs@D;4j`2Dd@!n2H&(%kUg zH7W6#f=-Fc7m&uA9qS0(lX1VE%2~q*%fYw>M!EuN%Bm9gP&y~dZbV3&t8got*a!RN zrh8o`XC00ZfBjIT&p{iMp9xPna>JeaVCFX>&Hg4t^7BYH+cbA)BYd8o3IZf&Au=2c`>^rXH7#|)t?7hljnyZe-c8^FQ=|B zU%|BkE|27iC?{?TAL^Cjf9AkIEJaMxo&&KDjke+uI4XAbha z5cVQmh%ix_6a7s?I2&owL|LAK^i+hCY}7$`Ez;!AQ@GjhT}V@Yk0Im>4wZfZY4-Cf zLdvcO_1RusS^_Q+xIc@KeEd6bWBqpA3Mc9<`AOV) zDICZ{@(-uc`IkqmCAeu{D5Isgm*L(8_pZ2KM*Gy^Xg~4toajg8mmy6WRv;veyx1P^ z-I&0o(z_$R4Z686!pRsolM(KLTj9Mtl3sx{^ImGnSt}9liF+^HjIY8?x_RAN_f*{NxR>KT3U@#5Q*eI>_m#MB!2Lzs)U*H8jjjXUQ=jpT z`P*Nr$XUnN%ej!erQV*4G;QU_5#|wcOkhf}?rV}Z>vNbOIPO&XcBE-bc`1E59P!n- zkHG!A336Ozn&tSZMM#}!M948P2O;&K1tE25Awssl1|fA|Bf>bsDBKq0({8K$GmvI` zA4WJ4;g=E8rm6J(KKwHXX-j^GFpuzR+#KgBeJ0|x|HO&cbHJbDecSY$MVmufImT5Q z-hq&Kd>3Ig!sijPeU<+^zx=O$zAATTNE<#GA??9BgrxsAzy=QqI3Rs2LIy5hW zqtzL-Q$uxt`m4;^h-ig@sS89alJ$*tTRAPx5t$=1tI=!&%iEv>jZ%J$Hc^6%Oo&{9ql8qSy78WnkA;>8TlUrO+DFr7? z8yHe^F;?AT+NO6wEc*5oeNpotYCfT@(|FB?SY(ahhIlwi&7wSn5u`2DgIm*{ zoOiY_%G( zHA=Z_rHQQ5CbIq=Or-D4gczjN*Fc}z7B>l}wkahu^T`l!P@AZT>b z#&C@yvpA<9?Hd|IiNQ{yOzvu~lt}}y(;m#b8S5rDqVmKXqU9OWbDkI-A>E|(p_^I< zlbj|~AuTsqL-yirg!0>^Da}gu7D@INhuF(m9Cae&JEWO#Yv4l96=oCObBm?bpXgO8 z)l!{`iQQZ*U~1=_ipib1a(Wk})*6FFOxH#qM)r0Njw)3sjzINVMA9IWqr9a;uT>TKtl{rA?B(87vI2P0?-4Z zM(Sy8NKfmep4KCvjiO36Dvmc9@|&RKmsd2<;x(&zWumErf~-k~fG0}3poS>ag+WSg^&*2-X|OsvxZ$Hi#LkhH>HoM~)AYBIK)Z#9&EIv82>sNtx8!a;>)& zJEylE_A<8A1`AVfIuLKb#!DK8Mm}{_q5=n(jGQid!b;>Ia@_j1wyon6XY(Q5_-td)KhRqW_RG3j>ny_)V z2Mlhi%_zgut_tQ?WgE4BAh-q}87`d86t0g$`$jy*}5 zsBMU3TgXw0Fab71jB+)Or$$-?PQ++hv>H2_F2~u7(N*xGc60@{Gs}<&cl2k=G<(PD zq6^HK6JQS$#wsnEXqhoL+8?1>BbgaywrSfrPy6xnLp%5F+CVMPJ;`aL!< zz~%E{`&TFfu`=jNRNhk=t-ZpUEKJ9$$h5t;@-6n!qLI|?Yapd;(tc)7qP_it90hZL z(W|m<2L?pPNc2IXQ@qAIIKt%^=0%*Fm=BT<<#?nSqcR?5%*2Nqc&YYRM-&8#e?&k} z#-D7DRQCQTX{?Wyv(+(rwmMeNR>!H?YK=mXv(;M8a^0#k=B#V6ckj)j{=v9G8rsVKVn-)+MWK4niz8}qAky22-lWho62{)$|v(#)z z=)&l=r_#iVi2h=8LfblOM3u6FYRM^Zl|I#Y#@4VnV&$n@rEP@+MeUhDeads7MNKO7 zWMY7dKM(l^)!!|h46BZJ#8XTtB0SX``_txQI8N90Xq1mcFJqRrMYE*>&N1Ao7O9ML zwKBG9Wo$Eba9%JailH%IDQdgsu_#y&3;^&_8rKfhj%E`rDPGiSU$4v5?(uY2!TD_o zn>;?ef+YVujUAJ*NNW%bHr&EmjxD#aMq()(wgvD?3{0y>v{--_5nTCN zqc(?ymX|2JIBIeVZzk}%Erc=XDl^*?)ysn%(INKjqID`GS<)zCb0!1`_edDaYO_7j zL$Il=`0YbR-`WWWt4_;d7qKL%kMtwt+7QWk!mSP?FyIAmj0@9Hfe|&}8FEGZ!8ie-Z zX6Jk@k_fsNonw(6Zj^jT8I{D4iXIseij|4bD_EapRXx101_(7TV8ja1)@&yM&YBoW4jSmGt+A2noz%15Y9x|xu@I0YGP5X zD&Zb*NI_3mi68SALtD%Vb*in-s zL-hV1!h)ZrzD7v>Rocic zA*rPz9}5$+PNi0J_*=3qYPVDctWBs2f%Q{t7Z|_*hUHl&dsKr zDcD0~5 z#w6U;m|`iUFqL{BPME^@>){h^TfB$)cZ=E_d>M1d`o}Y+g8HX3nc$EOc5y?4gZ8k1 zs13=NYJQX{m&0g+4PfGlju^~2lxT3)0X1kCae|Qn4mi+0$|DY9vcM8ZH6d9I7sceg zaNgmis66SmV6KrF?5ok3i9l}?=Mc;{8XzCm;pV7WpGcJ_dXscN%EE|a4x_yrF|rG& zlE1KX!-mh(tiffyzR(ksYQua-@ThW&|m&^u|$jM+r`AD*rz&d$gwfzu7XaVO^z zYS4&zK@J-DF7R9eRKU>S&16LSSxuGLs?rQEmWCD@C`@{ZKf`9|V8Fpq3{X6VXG3i8 z!az2m?YmMi*mJ2J6&faBA6DnldU!V&o`-!8px~%AX>~Qr0teL~TY6&A7d2sO6Phhp ztVJ=4zNAr&3zv;!Dtb&VXk7SeSf53?r)FVkDM$H_XxLXXY=)@10q@EJ;xX6zhmfTe z!Ld2zBGZagnie?9MmZV^v0UhP6#PGIE9KzOR+6vfgrSs!LVPPh4_zFElY_!P`6@Y6 z7Us+-?>lgRwEr!JL8WQ5=z|-sQFS0@0VLxPR^_KTEVaj6jiWBIhe3U zQ^HomY=S>MLDGgFF2_}~?<1lN+pnrkSvE;()?_`*0`vPE~Mp{k7&%KiWGDQofYj9Po+o(yIq=>1Q z5#cg30%uv08(!#XzDnV!`Bo}*l@wKVprJ~)You=1DuZ7~J12F!UaJM%EU}aTzRDT) zm6;;M-o5Od#yUK~8fu^sq%~`%JasM3w1(FEXCjoMhjtK0OH)`G(_Xnj0@#_8-I(ZL zrZxM=fl(8?Bw4PJO;OKu5-)CaBBRG3-lB_qVZo(PaFm%mQkL1&1ONOeEeUN-sT5dL zamR8mG)7kO`TJL^wcxI0*5l}h-P0yZj0N##J{%5QdQ} z*pAQvlN)1dfKavuvY7Sp^Y(VbQ{K*!%REyPF7K|U2ele zi!|etlJP0Yc>PWT9P&RXqy?wZ4!+48#jxn7nPG^&H2>TyFpriTo?AwBM;?*dKckTKsANySV{#nijb9PiTjh%bo6 zdEsE{Lt#lUCkWe+lZLlcI&@{)?3ODRq(a%`=y-hx8s+9EZ4h@h`5B5a_P7`_I1mq8 z8vG`QVdpes)cadvDZkzg)7=gxu|upY#+^?vhtMO7P8U)8CiaPF-}nWv*x9I3Gqd_4 zaI~cGZi|wtlQK~6NlXbeh9ywQtI^`;gco*axQ!kag>YE@-ETQe?bmZTheAM*@TQ{g zBB668n@ACMQ?!7?{wB#2pH1OCxzug{mrf{He@D>#Y>GRA#;;GnwNzUrb$Zt%I8HHY z1{80{H7<=|y%a~Z^a&emuE@O~zPS(zp})(ED$gV;Je6m%)?aMPY01igjh#8Fi`tnp zCLp{O7r@Appg3TzYBNJ@;o_u~nKxQ9#2^h1#jwwzwML()5S9VI)6VF3+F4Uyv`#=@@By#6g&kgRa$u?*@xbK^e?M+o2e=mnmH?c6;boX6X0(6D zatcTvtq_L>#LH>si`UYOm`5rENP`w>Xg^NMNu8yQiU#NSOj!x}Mfc&vISXZE3XXDR zZAUY8o~`(f1FU z=jsKmvB80l&&hLqJg1})*a`JQ!muxm+EO-YONk}5Ss9a$lwfn=1w43VKg4nQj9TKNyBT1 zOhV%jv1%ZYYjETb6B|v{1o@&zy+;ztAz$>s(rC;l?$jF^Ic;dWVZMYl%}`95p|~@sJZVm0I7M=@Yog6Rde3a;M2^&5(=kombT2Zwc(hf4F|qYD=-m@qjy5@0ym~L zYGK+6==D6KHPSubNUP@LXm0oQTD*o|5R7G!#D{A>`$e)d;JZk6k=^QeGCo?97H$!@ zTBCE*f3<&2Gd2EMKhwMgEDLbVnOPGU;@ z_3NR?Le&^xY@k6N4CZ>s&>sJXO5_@QLSP}pdLeZF6671_FU5yq+=-Yhw;9Aw)A031 zp|iqrSWgS|RE*W>0mnpgMu3(`&h%ANB*f`pJ*;O-=XH*0CZfaJUnJ>sSoo_(9928# zSV!GzQ=7(}9OCfzSW1P=+!fcAZHVn_W;+q|sQMDtiR8yZ0 zRGMg-+tijsvz(nKs`b_+z1K5YYb%VP@|p^nK&h=tj}2|b z_ncvEomoH|W);_P#lHH{{M4J~2Nq3^IJOpi+83HUskHo^BV)*l{b*e;A68BAnJ`U(`t~t8 zg#U|IH6|m;EC@`~iEm$Y;$JxpV6akr-l-SX;utUmCpO?1snO<9t#AxIP+M=|ts5b2 zY0aa&_gzkNKSUdJ%-Wv0wWW9Fg?ppFbp&V3{dsd!27f)2x|CK%BBPCjIyR`i5WOQW zTzO?Y&E1z$wfll&)_T9c+&3~nq$0o=i30CzIA@s-=FT(Kw?78E`PN44-M`bGnA8(4 zdN_RO6d0>r{H`X&&>Wrz@e7Muy9#}I5*~x*QESy3`@)MI-OM!QOTylUCuczv;q?h@ zxuj7>SFI+M6Jb~op2e0bEULim^r;g`p362$aXMSzBg)JZ+TyFxHgiJ|e>X-?BlGn% z(jJ`|#C8ki*ukzD5nC*bbQK_!WG?jCBG6c*8&qV9pB3|smcVR@bc2>A@#ABQGd1F` zCyXyo2S2w!~NrBza&ITxjqO+A?+bzth4PRF?Zu(ZkefqUT&(PV0mO32$>E#Uy0@|wmx zz6Nn-^{5!N%@Yi1Zu1xft2s>2r{6k=B;5~#i97dgfie+t6)P64#_I>U2{p>%5+@E& z^QVi&K&vxMfc%nND}z*pQHy#|$}w%M!r<)atrzt!31G4T7+hg)wbaG0m*^VmlNPDj zSblPO&uMImrd4@XQ>9+3wY=cE>;}J6B74xAUFzL=fXd8Za6%zw=~>MDVMeZXjh|&K zXmz664)ZJye(8ZY&i88OOcVMZz@Iu4-$oz%iQ*z$xdOPzd5;Itq;?5Q;hFv7kFRsQ zVs)q;9Q?M4#6LhltAb)bc0`4LAxD?+F65CME&uPbTHuQ*QDAe@O*? zk!GZM_p3Tk>XS zDc$+e6sCVP!BWjb+Z>~I266I%T3tXtB-X`I9VjtHT$rZl_m`l^_zae|*!ZqpTJ1u6 zIQpYxQ?BNZu83Cvh3TWRi3vgxs5L)~bfMqCkVD+~#=-w}Wjai-8{yeBA=e#AweASc zCu2=l|g>GOpnH9f^(ca|Y(C^n&!$5Wp0hD#2eeG)8`bj|hx)sUF7E`+_)| zgPUt{%qE({W4hO4V#`C>#v&~GabI*JmuHcL!(tvS3#;7!8(8~uqMCR|b6O6=m^o-n zO^J#LjMZYo&+?0e@RHax*eWxGxho(nDi%K^GBoKOJ|v1tPVcR$Pld%{8X7$D(|#Nh zYHKR`9#hXt!LRult0QbA&{@^nHKEUF;hvkH(JDj4pM|#?)v0E6Nbg-NDSZB`7OoU+s{MebM1PJl}Mwy&;qKi09 zNJl)PG5i;f4JfV_RH6Mvk`g@_W~`pXJS;TYRB^s=6&uT;pWg9% z(kqpke{LQmO4094MvZC$g}yTgdY6i4>atWM{cBX<|F|!+71Py(Vlur%Y7aI&u;rnc zUQicCp{%yQtMb=nLot+Yx zqW+z~9XFMSp%ST?Q{&3)*9?kI&Y+7OEJ z9>>%Re)?*769r~0V*0^=+oenhzL)Ji!4&|vzHkoT(Nqu@8mEUO$!i&y-c0!g2VfzJB zu*v@@cM7?_vaWn_%HNEoT85`_bE^VIZ`4+W)^YLGr#!;0_JRyf&}PBUk?x$>c1d> z1(^8F?#MQS$P0NP7<54!V%4U9)>|aSUpSK64DjO&I#my~#Yw!Hp9!Gr799Oib@?mB!ACxRru^M~{2_1!B<(}+=2d}_lj27;L!Fv`FhHR^ zDQL_8{qfLGehFOv1>N)Qk%^Z0IemqeF@-7^I3(n@Wc_OJ!2BtFAsSQbL`Eho$>2vX zgt0b6Cv-*sl)OlapOQCK6h9^(W^Ul#>TLM9;bsM&f}b7KfI|A>H{}&Q0y6k5Rs{*G zAJCvABR0A;W};$^8kQujHo(*uo%ls?#aaO$`dhRj2Z|@>2)}Fb%kSb()B0U0{T`)y z{%eGSf2TrA%-1{BnE&09P8#~=D?Wb3Foco#%LsVu8_g8FjQ+6-%zD!zprA;A;$5&} zuiq111&13Ia8dOZvx+jUz5DIRgeyq7Kes#btqLD0D|=VI&AK*XN=DhlJ518Ps)3HRckT9?4Cdv@E$ z5X8TV%;~b=0afs#Bp_LXng^l`OXs|rlXXZ~w-ba|<>{AFoAR7g^^Anc+N|qH-Z$!_} zA%h8lpM&i(oW;Pyvh4snE3-#J=6nz(tYu}s?B@_Wkz+X@MWJ&A8`y}#BoO!{8v+q* zJ988>U9YSN8RfFaippyML20ASDy#BPfE+7RR)$4@&l17MWh2?2AP+mv_+uY#b^(CD zf!^&T8fQ%czllP8glsv2ch#>V3Q97cfXs71r~%=XY%A$z4@7(^+ahwykRZmB5&GQ7 z&P3dAE8DK(anyEhVGp0jBl9pDu)U%`14+ToJCX4=5~9@`ffY*?ld>%R5So(Az8uAw zdkew5?$b+Ec!)F#a-3fxnRy!z+qTONLoelQ*(U2=Lhg3tKq0E^%D*9XwMLGlO+f5bRCCmqC! z0|qowb*@4duZBy}ug`G1WqA4+?5~m=Ucpo2U z;!&&^i8;)<>O$nagxj9;06HjfE>2E@gKy8d1+62M?G>pzkU~exkboU4nvPI#)pCm3 z5hrQ3N0`KGXe$|KCD8OZn$$GCiK4$qDnOG1m^`W=!%DIU6|y^!AWhl**%%-MDa@sH zNV3k@V5~zhU_pvoqIe7sRBc{W7y?JL0sB zF!e=es5s5D6?f5Y!j4^yp7ufsuh`)L&7dD%@nPg9y!iVWIHkWvko3Ik5WFrL_wGj2 zrLKEc*;~lsRsLCIT6Qdl{GTw2tAaePY!sbZRrez|nXo3aqIDKqvZtWO2J1LHry_lp z-#>jP=c`DVgXBP=yBDFT27i7Sy89CV_=DsPMEyZxqfkVX9!_LP0Dq9YBglCGx4k~y45U-gxE)v`BYB-n zX1^|zcOsd-9ZWtR(BSTC44@;cu`x?=-U+Z~6jPjkLi|a zbBf-B4AGR-`(GiMeG3nagIo(R)BU`R+=G!L`}s3c+hq#oO;$+n@NrH58Id=TDVk?4 zhgFt!5E%oEbqIzlMiyNS=7|JF_yLt*_uXI+ulVpT9FL5q| zi||OkjXE*|>PiO$tWh!|Q;82u48+^PD8R=p~ zZbl?^D;^C2Aw4(MjKW=n(A*RWC05cAh+mB)Ou}~X9KxeqJOW5xf9eUqmu-4<5C2(djXX>F_?}yp3D7Ugu&vg?7PC(=ycW z3yg07_;--Nc1;7OmmXv_#^FUTMIJW}nw*Pk-h&X=gj0|Yr_xf}7nus|zu>m%3gM@< zAgD$@?Zc7TU|odg8L0XdguF&@JHJ7~c^MD)Otdx+Sz@!}7nSgntI*UG*Td|G;HRh= zTLI3@L6POA;q3>|d*eggCvj`&-x9h%fc}sPeMPNhy^32ybCV(Vn*jRTCUkwBWxWr# zhQ{#;E5@B4iOCx#^zDFbt~a4^9@L6`Q$ahM@!LxAoA7{riG2(GvXR6fGWLvhB*p*w0}FYoI8o?k0h#z2N6E5G29RQcJ{<0eg+;e zWQl_iN&qKuEaEii(vUeD33oCcutLdwk)L8$ww1OrTamkskQniHW)P{^_8KX8AZwFKoP+YIH zHUZj6lZl3qvtNZO2Mr|}uz<&HHZ+qBy$+~?4F$So#cu^()D)GKXhz1cp()%lq^876 zp#OwaavBABzYmF36e%v{qaKg=bUdgtY?=d%>JYylVpo|QM^e*ZId=yXR;!(q_)<#z z0&p4jIPdl3|}JgWfZ>Q^OH0YE9pz* z_D3>dmr-HPM3h(V2h8)z$fg@0Q(k3c&!1I-R%AaYizuPg`c;C0xmqPy=O-$`);gd` z;`%Y3o|T4fc=iX7*cd%A8Q?Z#z6ZCR_P&ek7DO#~ zA%KoSL}>NZ$oiFlz$UVXzZ?eGAF)uwe!l(-HFe4Q}U4NI19iaVH+`7bih{w&&fA#0O9gO^khU zvSq!D+uphWIq{>xz~7=cu>d_-v1wD__T%w;#euYzweE5P!uH?OJX>5~TJpgc3K`I~sAnEw5L_xm0nU0!q#^c({MZ z1LHM*ts{x`UPQ)?NO0h~e*#u4{gGKZ9khyJ?fe48Ztdg(FxzbbnZTUo0 zXvG6-u;fnwlVZzQwON@)04d955h?^Y#{Y`ksmK)EBIaDuxvVob z80!!Wgr7;YFTw*E@#U^0919ZQ${a;3Ag3eCnT?0rg$Fnxdh9?I->wyZyO{&K_*V?9 z65{eYqP$AJjYN#S;L1IOo)gr9#M8*OitB)E!Y*-;^CF_Wio2QTl-`dZ>18MgnnBOX zd>lCqjAARM5+Sehvsle8nSu1z8O2pW%qo`>B5oC5gWQBy^%(@ogh1{5NdnArzJZ8y z4<7E#pbO^Jdk~2eU7s$8DfdEI6!0T{8_FL;iAT-5Qv!SE0ZK3gS}Yqb`T=0TNXvNw z5w{Nju)GDD`5B5|LoM)9D+&k0o~+_}xCmN?P6$O72Bu@haiq z&S5n3s{RV><vFH@gav8qC5c$+7MkmcT0E;2BWWevfMNRke+wYBUOQ0@Fmmf2DP@ zPQo1T+1pXQ!TJK8Q;>ejZ|p#b+QGS7%cwu*))yadx>jM>2$OR#wNEQ@9Vhj^qBxj3CQIA z$RLoNW;%5}t0%ub9jY*cnSTi~t@vd#b(=T)ZC-^u+2)hF%|9S>F>v!cx;w@;w;{vm zNMyo3BiB0xJ97b12Z4;jL^&^@$RS?wRda+UC9XtbdK^7jU_USC2GA0pC#e^7-i!>v zhCfM^6Td^o0)Pvj=O{^2n%EbFJkp26hTbpH!0xEbE9=~fnDa$GzJ^EqIXuYlyAYP5 zj<&;DM16pbT#mv@z!~0J4@9Zve8)QOKh2C6JV} zD<6B|QFJIC*D`gL`x8{tm5aZibBn(!2q^9&fq~Tv3k;0UUwD4IjM+8G8srApwa14}y5xmN70dxl<0{Rw2 zIH1TfJ1s^;=|PAm>tGZGbw6%JGJH}T*;m=b1s zKa|f#W}*d;qa|?Sb;JdWVEQc4aQPHufjgEn50Ur}@!&q#=w=q7~hbV!x?G6f6Y^;{H|pfAWIK{^N|EvO*%2xRdp`(+9*XgGfO3g#ZyfOek$JO^fW(kTeXMAed9BClysA@y%cE&X4$WfEpxU{(i(5|!mt2F; zs@Xe(O#?*GLHk-+kxUBZuQ&3K27Hl(Z#YQiQyTtN_CXW}n(-2Hqng3twG4KNSK0G` z?nXpt2Au{#dy;aRu$sy&P(?YZ-y}QRBQ9$0fs#O{s$@-Hr-bpV<(vMxB?L}dr7r3w ztoj8Al8MsI2;lCXibBtNC`krxLso-zBc4wq{Rl!{m!n+x8FQ}P#3;+p2iH8+;+OUO#+rB4$ zH|vh-B5@JzeEdSde2;LeO|?iaX7W*KM|t zATU)nSH``8?;sCh_F;s$Ml%7KLdqqj5S=gwO^CQZ#RKMGG<*z4RIO8daj!>w z3tGm&jt@e}U%>6u+7$5Unu$K(jHd5k(^!QB3WOhxwQA4`%tq`2#Lr_K%0%TO5L-V5 zigXul=S_Pr7OToZHwkWAz)%8%!-&NnBo<@90W^n`WiY%>D*}foI1BJ_Psf8kxYCx` z5@d)jfl)v&HZ?3~IpJ3qf){Emx4%vx&;TCbZO|wxUyLm0G8TRo5A+zj2B8=`vf^b> zKIaNNO0U9$1IarrtjJ|gpujtgot1Imd8e^DE@vIo(tSU5)3(cB1+En&$Hs0_RUdN8 z0S3jaw5v`mV`)80+{;pnd?B4B~+dcR@Q? z4k|x`^u>UIg%FlwE}G@M?fw7-SX{<#L)a`cW49wtCkzYK*tb=ji%ZyWJof|9ymFsL zB;kp?0WgYJ%`F(oD-pp+_O4oo2*)es40}WcMKbv&4ZsJ)i7q6wpFkIWQj4mZ%Kn1i zYVB>*$I;qn)&6*lf@+$^N1&0sY7Y`nO1FY`tZD)r2W)uNo{xuCmH&|*;Z~d2v1nm+(X|5a^jWyGV{FLT@0K$ z{JjtM#=)?k5Kh$}QE)7y=+nEZZ2)rz@L*f*2tUX=(95NWf0%LX7Vd%gmjR7e zIo@U!Pr?h_fCRUP??GYmTYz@(iXnXva{nm6t(2WU0;v=R7y3&%>En=Uk}1n2Ah%Br zMJQ@xVeS%MWeQ|4Wn@?lnXpD6g{2Q6V~J=7BW0MGu9sMajHE!?%BD%wX1`x6O-w(g z`ehLf?xP4#h60jzG58NIg@8Sx1JEAdiqSojGy*t4lBUke)Y9L;F#ZZc?h);dkS_wj zZ|@ky=ddjfJazsXCdFFoU4%g5OUBW|8MeFE?ET#qZN~zc#w=X|k%7+mFyr@%hw6iO{b`Lr)_$xN^TBv{gz@ zyoxBV(j4e|8XVzOb|qLDr*g*g$hJzqhMIT#g~gvh1f5V+`v^Tt4wP*%WI zzLxNIDQBP$`Bf{(n#y59#I35+*iJ%Vv6jrmRr(Q>^j^WA8=W zvoDivTh2ywm5MJBRyKVC5;w5|-ixx}`=Hg!x#>mNDr<*>3k#CT0d@m!=bk?Sx$N`w zdoAZ$HuG~lV64-hMkxBt+38ymf16EK*y%4JF5fxX>1R|N#ya(5Bxn=3M^!urEjoA| zk-G=EUqTMVRAT2IMCw65<>Vel>Sr=#r3i@X>3b21+A!8B!mCVy42*Rtt0B`$y|7r8 z?gGl*679HF>Tzb`)MyH17Yn4VvK)z;O+Ek%D@RPZ8HALi7x3xb(MXpVQEs{y@uSHq z&rRQk_KpK2jkTl^zyXrNSeI@GJX9l91y~sC^tDKTj2$H1^fwSci*3PJr*1-m^aKor zjL1YmFghc1MO+x`OOQ%c$SOroX?j4yl_+{kl2Dc_0Z6ex9q=qc7v*vES%d;B#bPr@ zV9#RTSW{`8y#SOt5)T;ba-J$@-Sk0t2py%1?7WW}a}FNyi}82`ckGy$(9@tsf@cGe z8;k(Ng_b%8FT;303J-I@Snk)5Qw(j6RfQY!L_<|XLZto!K9<)@%1qS_nJ|7q1QK<|S ztX}M@Pa@~Hxb5Xt?#17+-V)JT7&;^$u!Nad&UTRez9o#7Nh@4 zw}fNI#fs43b5@p^HGLE!KC~FfBN00`RxT>sfXt>-jS}z8qB2o(J~G8s%SHP?P?4)w z`@IW9k6g4*_?S^ZOwniU9RMl=XAVZ_o?8Ln2dwWRj>sd{p9#&?{4dP zMEt9H8Ap~qk$Sc_qP&{-L?mG~AH~3%bRL4Fmm5Iv0H8c8_dY}^NVxfvDIH#u&eCA7 zjt1jM;MII8z!G-z#~65%Ue%Q*gNc#0>D`J--z2m%=|yO@kIBKKp?~c|PuzsEMH~RQ zraTFjWob0CCnMXMNPi;l7fyN$g9;7Ogj^>Zd>qj)G78deW(8bR??$F&PrMuH*BHe$ zjr33d0U_enjGrPmnGj68+i!c~D<~U;{oyr@T$0eXHM1Fr+8*aX=N?XLF-AQZw?rfM zuA-V{9Zv_r;<;AOE<$F5wGz*JA`tG~`z-*50Dxno z-fosUrdgt*___m80pK6g{3|N(iodxlSZ~EsD916)2@Iy-k*q<(*kVqthSttTM(PL~ zJ57kBJMq|n1Sj_jK%IkTIHA9}9PeFLKuPb3^T5*Rn%OHkY%*s6=5E5Rjz5fyvEZ!4 zUjS6(tOS>EyU!I7+8zyF{604JT#;xU=#z$$7Cc}et;AwPlCSgO6e4C1lzhvU#Ec-$ zuVgUIW;TJC&)~++)uL6^LdF&_jT84xh_6J8WEIgO583+0J@66+ zH+HtJ1ZYq>ATB$Lt!EryusgB%gTz9~AOZ)Xe-0KUe}@NO3s8U`Lw$6c`91Qc?TK#Z zJL}^pX1Q1D8+m<2y%jnmA6IbM4?dbO^)ltrukB3N6? z#dfPK>Sxh1zbL^XY`B(9F*3N}T9Gv~HbtxX-!yP*1MhwfEQCbTqu->xU zohI6N`>N&0EqenC^H5uiWL zOmoG6^fn`B7e=8$`~^~8lUB2u9orY_vl+!T`5Zi^97%|{HFc2fBw{o|kNN=CFcO}% z9Nx8OzlzKTYx+Kxb$U6z`9a953lPo@B%BZ7;V#;jpq`h7E`13Zu^aH<7Ca`H*dGu- z7jc~YiEjhoH*nkORSn(dfQl@q3Zs-lYEZtA`LOm|n%N2evCj;<1 zxb5^u*o%VqdvVaqUby{Ug3`3;#d0nMzRu-*T#JW$8y=udkR*`iPX3=H!6H-i!HFK1 z^A*FJQElA*1$10k4!(VN^Q_Il3AptBJFQn6w@digyjFH&{>OIT`is1F^D0 zcpa)c^O116@Nj>M2Vc1?LHJ%2VUF^K5Wh?EI`%8XCmsaoi;|USJKlhY72AxQ8<=~E zk!!i@0F3#}TaNJavH@>@#J`3(<}>dI6~}z$e2w+Lfk#52B@FL<$RTF-VRKO{2?6Yf z9Q&~2(J@ll6RASgNpF#Kq&WG-^oA_xDA?UFr^I$NeJmqn|BN=`=b49f8W;xa^EX4JFFe8~(~t15xMtBdh~Q7ZieauZ(7wFvM|Vjfv-^Ynt%i72mHR}^-La!aHh;m9))-t;!w|IkBW;8=`u9yRN;|077x~I zK==w#un#VTrvenA&j@$(zVP)*>Dx~(5DJ#JuREQB) z5R+iBnUnlK?0pNIR@3_bTKnDayz{;@P1ALznrfIpg@0D4{p`*esxf-u(&NGE(g)blwWBzrZLFz);{8Vw+Z{4)@Kj*s{?W>GX5!5Dd}>105$^v}~9 zT(v>!Vcr3(hdbc^9n`~Pap!Lc5;)@#aBkz@o%jpQ1NJZ+M;HL);%^Ol&~RKM-aEE`4ZhFhKe5;!j2T0dhW}wFLy^Z{S}KqVRJ* zLi+G(lUbDbFY%nW41WxmK`wSbf)O42j5oKSQ!_LuB58A;frmmg3GxBDOr#o+`UsHZ zuV8mXhu_>-vwz0}qUTRE43QTE8{Tb#JrKkz{I_cmzN0ac=m&r(Q=jAi=H{4l93&CY z*MajF5pZ6{UufkKs6=>x*4|(YcOe77F2~(jjla-ZM7bUVDUJo%K%|?0Fi>t&{JU;B z{`1|=_%C*Q;lJG73IBcEeegd*y90T1+~aw3-7|U1cQ4_s*u9pwa`#r=`nZ#MLy9Nm z?zpq$?z(TuJ>Oj<_hR=extF`&%e{{q0%s$bu-H5}Zfo=4x>e>O->oqZ#qLh#q1@fq zJoIr7HxEdEl6`XAbL^ArUT&ZARd~Q>)Tx`d1fcz?D0D{HHgG7az+FQG75VCTymkR} z-pYX(rctvHCqH~0d{ek$U-4{~AWn1&@X^0Ng`8p!hP3(`S8S{%G!cg>RP0DtLwDhd zeXnmqy${e4mfa8_q7n}s!XU%PILsIVK8h?Kk3NU>H(ar=*i}UQIMFH3`h1{afKT+1 zl5vp1Kfoh}4gX`7$$s*br0nxww%9=jpyna%jC+!>wLe*GcP!%&OO}J2e}Zi+Ij_ac zlXO|r0_@gT2sY+md(^JDVlDNP6yJ{&okg)@ZOR=r7#FnD5+xF#i0o6h=kQ2CRPPgW@Bc6tKt25ryYq#5aB<0Eu20_pi7|$ zRWSJt>;S=qXuF@xX#7u()?_ZD>965t#f4}TLPz+Y9PNlV5zTo8QJe)JQt-A-(BxV- zEx|iSqXWIxl>`NQLxi8vF#zxgN=ZlfFZtSN@4ij)Z){ZRC0vL`ZRkMULK}^0sW;Jj z=JxyYR?pn(skeGY`zuSj7mWR#aG^|Fp~>qA|5@~^;8&rPvje6H1^w}NH?AhvhSy4s z@|%yXDq(4bsHVrR_3P>>czO<3(}|(CA0sEnwo0mm7FyVSoy1_Ks$k)FaD;p>fF+MI z$t^8YlMtGkt)r-coK2 zhN36B^+F2{igWW~{~uRv!LKOu=Qx_Qb69^l7Nqr#7MfDCV76_8>O2@%!&9B43NK^B zsZKR|-NJoP$AM*&ki>YF%HQAsRQ&UCNz$O=+oUHXB@G%ukTm)O{9d>uY0v;{(%X}g z293c_TJQme2@Vw)g3^WxJD|x>@f+kSxXq3-ppZ7oSPC-A{08ysIgB>=^;&9h>n|Ag zaWyPLv8I+yk&`H!A}3KcMYdSmVVZRiE=ihNHbqXNY>J#j+4xDn#!j-1FbE}S(0hv3 zijpc*QBq~HN$aWfdY1n0oLl{@p8A&RN$4=yX*RqBOP7gGa~Iob3OMLAo${--3Qxr! zO~4dGo%R&0(7Xy*LO(RZNCGE9^=K_dd&z;V8zfoWVzk4Q?0JL9$2X$Il%!eh=Tm?_ zocTPDh#N2tl^n?9$x@AOjC&0>ONQUMH0swp>swRWSn~soJ>C5HRjA+4E&P`D{@>P( z|AzkAS=-7{MH}!JhkaLeRH}K`kn{htql|S|FnN%p-o%B{-Q_wOTl`O+uN=ljhl0H0 z9Mu^Yq8)V?qwzmE+Hm@|8f-hvQAgmCCK^PM@$r%fqnJ6>C6XLgAYTWN8JLnY&P{e|uEHJ9G>~Cat(g_>FvdV;V4^FAS9p$v zd>=qM-Du)G8RS!lahy31o#CgN@q~fA_o5GZ|0M&t5_3b7bNder>fb2K;Onxe&43T_m49Wzn4C>t@guJxYXIXIeJe&U34e9mLbh4 z;;krNpFtm=7EI9J$^;C3dKnHvx&-}Xh|nimHX?-QJTB}NAA%fG1-u}cz_rN)D9+aK z!z2hKLxcd)BoO-+`FBC3DO?vKEJzpq8*((hA-FAO87V&oER_k}G)c-PCXkTw8Mq}9 zOi)T6B1|w~q`dMIaDZam0Xd`+I5L^QnaKnYKXU!W$pn%iLV#$I@}1YTYVbOWu~(P} zY6R&bgD-)r`BX^S4OvGSLZL1#z)lTt^F{_YJnagVs27-guLv&Qswm_!VUx6 zg`&cJ_A?ZC>R770`WgV0zO0tFkloq`)G~BCEemN83Z0rCNL+N0OCgm zqSr}CkPHz5L>mHUjW7hh$so`a?IdV;olL-}h}jLgA)SB^5dsVt0yjM+_D%7A$RSll zXC)K3GMNCYc?}w7LV{$75FlEr#A(yDx*u2Jm2UqMR0%&_WQX&OM>CQ?9**y+aBZ^X zM;TJFVJ~Yn1s77W#w1d)s?pOIxilpeLn>DC7EC!@xoK@kNyQLq$%yBW1ck`Yv!trv z96$mcUu6PD$7}Bl^1$uvGm`10-PLH4{iMap5)TO!yFCf&pQo2HWs1!UZM>i}|tY{amh-$W*N05iFzO%J1U5g1JKwJz9#8 z@%6_ZUZK>FxbhEi==n{=IRzmV+qepE|E&hv32}Opinfe3n~%}gaRNVKIyWzY8#qGt zfdh(8C~#BuD6;aWRM8h2pm{Q+Vt2s!UyCdM8Ha#GoGn`hdT6$RgMGsNo=)ylBmCdc zmT$rZat$9tR=&G2dJu?58B(!3f5s9nE(lK-LLyE#gjB5SMlAK?g7A!=iZ;T>_G_or zWL)_lhBC>h*gWzmi7bQx)$HWK$leXS>*=zzZY>3Q#1&Xy#06P4P!``A zAKeL|C_^gt+>gNjgzFH84wpon#R#cb`we)%9v5U`{8Y4+Wd`JE(q3fAB%@;gxL>QC zaX}Wk5)xSm1FG5dOSBrDm=mYVa<-9WN0@`-aOID5QrDNz)<;il(u zqvV1LRfc*VuEHNj2i8q?mU*oG49IHG^Q@OTQ85L}dgX8xYB{SB()txcunZt=e#n+v z>65HZK^#+WRJbvV4Qc&?khBai?T?d?D&(o&R7 z!n*1wk*Zkm$58nrwf#rZ`a`sb74M_b5I^DH=lE;B3V(x-!7hQlr0N!>g&Tf+9&s{E z)P+mW=RY0(EAg_qvi>J|S18wQF#!&D!Ng4L-}dN6O!tb(eP5u?1;mwkSQX+-G9eWv zistT$#-@J^3|TRm2<7xE%rv>9(cCq&w8v)A=b($7}AB6r7fMBS=Jdk;n zcaV^wj|35acS7V@boMl)g}zu>+S1P*jcI^|{9DbHeQ3o8ApbP^0ZEeIgbaObTniTb z#i9@Ba~nV)f9_~9J&;*ytM?!qOxO1k^qY$K>n(Xl#Bb{fGlo3kN4$%(sh?0-$WA7dsH6UjEiw;2 zg`keg1kZ1ytfSeZF%9X*UR{q0^#fR#?QrIo89llZjG>e|ZZvAT1AL^YX|`q4l+uc1 zHd&ecIbCX3LTFHzb4T+_Db^o$<7K$OCg+BkxkhgQVX%24wv$qw{kI6%wCX$=5Y{H6 z&T%G`P-npBhyO@Yr|_Aq&g{{c#uVrI2OIixGw82Oq2HuJxJl6Wo$-;WcPG&&G^NYQ z9*t>)zH)|LfZqQc{1se^zmIUahd5I)?@C(w68mz5aqSpcXdlUUDE9Cd(?N3qf|A;EtPlY=DpQycmVf8BK z_84~9PsU#yu7CGBo!a3I428~2Q+nC zNaf*~I8`uiBu@Rs1pvKLi7q@NEmfPE_Rpdl2Iq(30?%}bCPsh^o~hSVo^SaU^5P1w zmCZ8=d8K{e`wEP#m zI*Kd2KsG8RYK7r#ffb>ik``n3a0q7*3uNz7x}*zaEUvdgIy)M#S4wWxZztC}pEpwq z_0-#cV;!E~1Y5kCLIb8zCQ2uA%)rbxYZ^b|5{doW&9!P@B8k&Fy!6CGrzQTgTJ8Tm ziT^B3|5`>h+v|{*`Ci^_->-$C($e z;DVaCtv<1dA`%&tJmoX!Kuttq%7<;)P0NwE(4C3RGKs`y#$4#~b!j++=-hF-T!h0L zYVh|6uE@qz4@N_}$s-%-{%J@bQe@*d^ko#Cc^S@kz!lk;`qpM<{Ez7(`H$ycjU7J^ zayQw=RM$!-Klj7J{p<1n->(1vcK%mwt<@3Tuq$&pU$#q3Mos-$o~ZxJIU7|)n;ZYX zT|fWj{3~bsd@LO7iof@9MV?JtI4G39%|J_JWe`y~UX>I?;d777kPUUJ;JQMs+F&ay zu&MKZKLeTe*O9@c@Zw27J3+G}O^kjf0|T`jOb`xAEen$k3)lb%U!HWm6EyqQB&W0p zVW4$q@jpFqIRneSe~HrgYj83AIM`&zOVv*G5&2bHY`HqB_S2_nGXzi29AguGs9&`S zt-D_SH8k;85G1YDrv-n9P9QDEw4f^Z%}PkiF)jEzw7s+((}Mp~5jwauoumc-r=tH8 zD*AY#R>S^@j(wzFaz^rm+w{vLHK*aWUmlraa@^>f92+qa-5D3M;LI^;J}D;0NX;o~ zomnWS2@I)%GW>}FR-C?7OfoW1n^Ccy^WO@4OKh&&e^GDH{4+B7qfa0`;B45`@Mu1;Fe-v*k&a(DJ*vV#J z80ep*xBu~`3Vuz!{{KyH1#oOiU;9hezV?^ozV;WhAq^)Yqf;!JgTGy|uPxF#$CftZ zi4bfH+0hnhEk4nr&P8~43Rk3c>XbCt7-mxvo0{^^pn1dzT78Zy(mHjPkoh#xHOnosfWUt|a$TM+6RuqrycSgYr8MFypIzcw2J z>yyoYA2+{6A-U4lM+>>q)~6tHrR{&RR@dQ*3`!jfY#|c(dlh0X7XH)h=b~F5mH%=T zWQNqq$u>jkB#U^~IPK)fDxE629w!;UhbyvgY8p$GlPc4R38f?kK=lwT@r6g>kFTin zl}mXwp677!5MsP4o_7+Ea$+&QAyR<|eH+6mhXeAj2b{+hv>w8>!62WX5!oVmf)3BVvPxD2@{=e_E+$9!K~*eceFH zV-rXDAb;TDAy`*(4uGF?K$p9ekHOS71)IbnWsw({cL9y?$@ueQio$uo_js(iLgBIV zfg~pd*Jz%}B%CmkVIsEo=~~^4tKfDm2RMu7dqj za0C86#MP{MXeQ3J(Xyh80Hc+B2ZU<_|DmW*$Fdi}V(D!8j&j~g1jfw~7W0UB8<&xpk}sYG5}S0-Ae}hcK~*kd~lw_QUXJ6@c;mVR~9MM*_N(qLQe1Y z=@NzbaRc>6dUM_e}1 zw-8=J0%(?B;duw<#lt2(K!EZD3I#DL(dH$}m1p?`#w1X2&iWK(bpie!!_~OS;MYMZ zIIIGPjD2Qu+zof5p-|plcs@i6$^2vRd<(9|5A+;@W)PfDk^lPVsH01OxRi)Q12vUD z|DG@K0e4(BU2qJAD*7CWS`cG-2~c%la`ONCrh&RX$Ja_)EyG_s95K}LSbS)PowL)V z9sbJj7w&{V_G|2KxjQD0cm`PTJla~ch=#HkBHoItP04XbKy!ZlC?EK9W&r8T=HDCm zEBFw9 zq1M0P*A7JG>k}8_`&Lg6ca(m_ZG*2$a2W`XGw}h5;OrAL9{6?Yat!V(5bryO z#}Q`cZsVPSp3DuyeLGWsIyGCoK>0SoPM%ip;?mPMnc%&zAZFVwF3@T2E^uAD+$#cn`k@78(=;P10f6F|1a#iA2n8Q`ji06{*f0+@VWzD=tG z(IlZzzS>upBG|In6{Yb*u!@yW)M_d&@WaMiuY6MZG5Jh_mD%-f(Iw5(@kK zB8lV><&mc<|Kw6f?brg@Z2j{lvSDpXOC6ir(otLEOkEw<=iFRBE^IHGVmFS?Dv((_nCBp4y>in5Sv)`%mBRfx?g!3owhrlMoRb ziic)}=fE-=9WoQ8l<_8SG3fI=aQEO)-Xky?c?g{|DwM~WqL@Wjh4Q|@b9*Sw9T>{v zCzs-UR-tyc;Y$o(lIQv)@ZHggI#ojtesqHXU>LyfDw)$Rv@* z{fZlW5n_F(YBdp;9+r#XQOJ?!mC8{i?J)yR%ZzxVkJ!VH;WU)TC9@n_e8_$-+b zZ!_z(QmZR*>CbZr6_t`Oo%aujc-SgL{(94qRrq@}*+SGQGVv&$P9C2DJ?D)JFPvG+5xF9cULdn zbSf2l7!HGu+aN)Hm?!RLArsVIN@NRq)+DVSy924NuOD+{-W*++zZX98cz3>|TI_w` z+N|{MyT?}ERKf%s>ZlCp$v0uqxq+m$J z8s4hZ1-R-l`sc*6VhqX5q?h$)+XPd!kaG;L2?|`U!$p zmlBpEY1)=}*CaRr??65|Eyv7!0?RQepB?VRkwUn1q2?#&>S)nXqoQx`QtI)$k)Wym zk_j@JqbcavEvTl4z*5s;ISnE+UP3;e6eLrG1Yd3cfmXc7qe%W_mU?2UN6?m{al9{~ z+8zt-Y}s&ge#v1?yY>RVj(n8*71vvQw=5%DKnx#v)Rg5aotw1P8Jhkuo6bz*De zlXDK0nNMoLnS6#0)vEI;$R{itNV4dc@nq(as$Y}*#bH|Q%S}o-r-T6;{@X%n;+QF6 zH+T!^KCg#3K|ZPCn0($kTdQl&sY{$7d8#-j`B$E!_U{P$eu%Emz{C#G_F&!jaMVOx zdf;ZJRN*maZnF2iqdvWFyGE#x=zVuR3$7Vl_2{?!e4}GzwCi{dQsTnBLGYrcdj?V2=gzxBw)7}Q1}pPc z)9L|Sx!X!+KB=;sd@k4yrfTnc@e?$f)Uq&*=Hl%!1=yip`~>-=@?-Lu+Fu*1;gwBV z4RRKK?6`qieS=HS)rHw@Eng9~1geH;^$aeU8O$NGv?DRZKL{6MP;Y{!JVLXPIo zZO9~28r}~2Osko=;3-&vfxV6aF_F?V!k0TZsw?^-^g)}L-6v8Snhkb$)Va9O2W?(T z72fAcGaXzWQ63;RBfmW1hmw4zO@Nu~qL(>CV8rCJSW0bS)Z%~>px>N=S2 z)--S4%UarBxcqoVmck4SUNU7Z?YTQ@bwfYU+9FgR9SKn;SFt^J(rVDoNV(R{ZfQqN zyz>U(r18TM?|{&_aasBDrI9(;1AAeL{Q5>v$Uo*=tsY;iRg0F{2}CkYd66t(%Ewyl z>Zql-FhANn@l?3mSThVwfv$7-`u)~Xr>}o!GYsXgKz@_2N2ORY5S@Nq#Y0bvioLVD zR>#9Fq+fAph(&Vq5oLxd*8d2c?Se~>a9EkLQ1JPUzVr(csPGZ+M5Ro6`N5}6PI?cb zK$!HNiHUjNoA5le{&UZyN$dvDBtIk6pQ{6PG!oiOQuAnpsMv(paMsuBNO|Gr zro6c)%%K{nXfJnD6EPvx_T6)}+8_O}ULMNSXS5Ql@^ad~%ss8W{N9CH{csVIe3UJT zkznw}S{-mS;%o>lX_mF9g0{*8X*6upE#AseXH}qXkH`}jPi_T9g{lgVgfpD;+T2ws za2D5DrB5(bIyPh(j`GKa8kfU0<*$ZCA9@2N*VbF3)YrK5F4^W1CeHrfAmX=(b3&Fl z2}ctn`}6fKPi|5!-|VhauJest`74m$6f{D;DsoZXrNfqKi{t7UaJW7%%GlJL{YdyZ zRsQ`ml{)1`Bv`j8D)fs+x#t3(N8i`>3U6+*S75Ga_~g{evaz5k2E2k z3|vQYLr;arePF6uZq9_zCS5}lZ4>%9uGIxyA+dE71;~5l0b!b`PU|e^&5Dd?dnl0Y!kQ)Kf|SO&~nmwhLa=Fyvd<$ zSOt|@orBAtzvWg@(0fJyy+U-grB+Yl(jRVe{dc>SOb~xVtAF5veJfvYs}Cu1s$wt1 z9d&S5DEB?*$w_tBB$Hr7Uq=nx(cu~tKMGk_)iVixJk(K#W4Dbz(W(z`q6V`QqNPUD zTcyGiqh~v6Ph7f91Un&$`Q8#9xw#&}QhK-%q>~%LvMFd(2y%Brd+w*esH-|SV?C}e zxw>59dF65JSHdp>q;4N++Y#Ar3z$hV+a#&D|59#JYaiix8{Wt~lO)C@UZfq8RNMv_ z?xpwRo``{}!x%l1Vsth!&WV~l4lpqqAV$|~0mHre7IW`)FYal1b&51g%F9yg`?kre zh^HRiDLHpRD+zPph1! zDf-+sQ=je;fj%+Jun0{@G zPLW%m+*^}dpQmKe=ct_e7v3T53ktV zE6UgaQuDIC^7nu zi2?f`{^dv|RZ|L>w<<~A{79%V5gRC{w=rarlpz32D_|;0T_7rU@D$vBruD*92q zwrX6C2T0ZVilOX>szn)|&m!aL9+B2aa8QBB+=P7>b~Dfw^~H%;fkb zdX>~7_z3E6cb>EYwv(hHNad-F&%c5skY>F&cl~2-Q1gANDdP?*j*bMgk+F{va&^tJl z31M%TFmZ7zM%cSqFjr+^Z<1y2LCfAWVK3;$g}wRUShUyh0!IzNm8v~!wiR0T81(K< zWkT4SDNMYPiV^mf3TBRFuV0e(KD6vDwd}1G_Gk*qC=^FBnwmK#;{D{5GUQNn-S5XGzo=)CcG=0+M9?|$5hXZmE_ zd>z|mH+W@n>E(HQWOaW>>8*#Krn-+Q1!gFvkm5NpWHNUk`JR)0eer23`10Whskft> zdD=?Tdspk{yu++mWVFU8b4_j{XB>hz&JG2^_U60D87YFfeB?sxS?Go6X?e)>K1!sD z^*hQsM5l)~{({2Fom;j{@Co20_`>ZM;HEY-d=m{eSZ$zwWwqhF;TkN=S&sK)Rv?QO z@-9*&qa30p-U(l8we1?j+rwx&lhsTLcVG!##XebwPkMiclxKwat+2Wpwx5Mat77ME zVO_oFY|_=sa>8DnE{>{!OQQS&&F_8HLCR22;q9>8kiEM5twXB2>DDu=I~}2@?kfC` zJxw*{3S?$yLTDYGN$g3i{#>y)RCH91dKfgm#9|RwmC$|`{te&j#c=d0iZ#2>Fjya~ z(^>TrrYrK|(sujg(ultvAsV5xmoIjucK~$1vICfhY@`ENldA*Z#yD&MeDN@BDCY9* z^`Wabf``JxO+dCYhKmq@c*W}xIn|9@b|V?^-MHJDka6QuA50#&aTy5QxH++#;$`VQ zQpUxXfmVVS?sc9V@WS2DZ~43sMN@%oiqEpmk}+hPv-EBBEfbPEnkX94lymEaaw#xm}gyxG!5949T5H>eF*=sP$KS0&*(+@)XmK0_!SeILKvP z`NP2{58|wuhftS>hBmP_lo+9tY=}2j;mwxSNPc&oj3$|VoX<^^*{j&f#*TWf2}B&5 z*JDzh{Y@k-WnQJD-o=H*yzREAJEh+d8Jgx>TF%<1wW_>t8XAY&!AxSGKvHq#%tE7gE<$zPo|D*o@%C=-PhyK-Vk_U?ILsd1K4}u$ zN4#J8uLEWrm1p81;jQTt5pPYSe3L}x;eEv$)pSe1FqbW^!CiT;VqPE2!~2Ris`L}U z5Toe|b1(Zh?r2DCvkCWVAV4E9zi);BcAA?az``s7e4A4M@pbH!MS#Pt04It7Zo^Cg zS^`D^I+=S}H{2lr%QuSv--G#{7pIqiod~B0@Jki}TI_(V#S@ZV0JjR3(^S!VLjg0NJfYry;)6ks>;gGd$H&96d*QiXOiRj3n~Wobu{ z6z}M8Va4qe2*AA%^bs0|-yWt4Jzxb8pX=Wu6|6e5jR1x7MS$~?1^Am(p{8RDK?rvOrgimlr}xdf^JLrE0&6am&`5g@NvVw5&E z_p&y)qYVUAD7-UfI5gPm=oWd{6CAB}+@N!6XTpm*|i{KDjK`Bi|GWtVeG7 z5|fsY+|ihZ(Ny^KriT8G$UoJ3J=Rdfh6v_$O*(y=LPDS0X#)C$rqItGjcE-1W4qz~ zcFLbY|H~Bm4eme+1%`d=xd#A3f7pm5`h*7bX+39;#x#chLtEp}6~wE<_foH#w7;!M z8?cIfd_T0NfqE03nP37IC6Cz4fZYhPBjJ@z?nsaXD*SGZDZ7nGpIUb9?-Xs>vfIss z5_RWv07Q4o@eq_9p@HsLcd|!g8l$^Mdq~-djx%SsQWSN(Cbsjoj%ucpOxIUXkgfN8$;kUrAU#l`3doGFndC214j(VsT zgooB&V&-YxQvLU~`*Y68+tmIXDpa+-YJW#99ss|GTj%C6Mz*_4_8#J>dyk-BQ8#E| z&8Ad8v_CnECZ)RN3`hNRCQ|M1h;wo65$WFRAl2~O;Q3+*%6uPtji^le88ekhXdOLg z?2rQ-)#*S{<|ed}nA9;(tIXv{`t(6aeqrd@Eg)$f?LU}lkq&;&25dWX)PDHO<6lGk zRdQyGNmm)3JN!h>n~VqKAU?9&ayoyDm_6_(Fgk@qm)qtB)=1ftbQ5$<{rh(OIV;9C^e2alD) z0-$KO0!6iy@p%r7^Fkx|9hTvbBhr9-lY5ny0X+v0u!~;hQ-q!|AxzFqf=x{%=OLOD z#rt>=R|h@r(%~>Wb~tscEU*wVbKrd2^hNKsFkHv(OXs=^APKHdGoj7nnj^q(<2oe= ze~?t+XFAB}Q#><;YrZkRB;cBF$p7GTO%#SJQD5M`VvKYkN^>LT&qbe~fOdHzmSGyR zY3c}@Eo(u9L3zRW!O2R!hFA@Ex>F+>TWE`c*cPDMH72UG#ZeMyF-`)_4}&(_wPZG> zEiM4YZP$u{7P5@pt`)Q8&p83OmZ#$n@9*Qf6%?Gi`S&pXq!B3HgjJWl0b&$fg}8KB zl^^8XbSq4;ER#{c8!5cd#3SJn=Ap|Ea7?cvvP^KVQ+}k1YfIx?AHOW3N9F})eE?y1tMD(WfhiPEojPDNS!09ltMwz>$JKY7l<9- zl*G=-No*YOsvz%1yw{HlIZ%`=q6WkuP6{#mHJGBSw7L*i^wAK@PG>1w`P>EYl+Rbz zV<9OjO5#Qz3tdXlRl!ZyYb`_pxe=v`m1`Xy`73+oaKv*u^93yvuRwL?TULIcibqkD50S{Kvg;9e(83veWNkQO z4-9##=o$U`C=)e46M_1<5ap1mwptEs5_11I*5>hJz4ItJ4%B*@JSsaPkjW)iBfw=@ z?~~Z^RB@+vUp(>`uRf8?W>_b3ycQ0?kdrRr1G7g8+Ng>BRG2wSJ=9N|O5c^viNP3Y z#II2e4Q(A7J55t=r-({J@I}pL;xuHP>vkpzjA<~WE2mLu_tVNv7!zWp+v~=v8k^Nr zkI>lJT6R7;jo9N?Pcp!Tn)ZO}R4{8*JXMn% zwE5s3HO-lL0&AKxR!K#xm5Sz!jY&P*o)pBtM_GI1k1ZSLjx8PM8ddMe%(^}Mh^Zrt z;q2JGR}g6t5a=~BnoH0UROKsJy~=EYv~}1~a3$;1;mibWuOmE+bx9b^h6`;Ymv<~B zkN#(yJfzp?d#(w@2TO*T-1)P0(@v*rlMfI7dG9=%l?~;W5&I)_mr2((cVqaF8uuRWi6%S)-KGFsVJ^gYMs9c5z ztF6oos^}X0>)>}ZMMiTgrdTf=zdUU9E2x1#|IJcD>)?kOi+21;8Od`l|^}DIL_i z1Lm!snuO@&G$EoP5w|5Hp3#DM1u*=iq2ss()giJ<<#o79Pc$25C&&SK-iUIOWig`a z+a$~OV*oSh1~46V@p6m43pA^!ceG`15R=^Da2Ij$O@QI<-9>JEHl^cStxJ41YkW2Z z0X7|C44>XE6^0S^IC{0N0;*yNV9Hy!mBG{+%r?MuF6m+=^)V4Rri34L+8~10 z0WjRFyWozWSB7#9bb5#50oQv=z|ddMR5f@|-o7>p%_DuMk?S%OWwsiFhd?kXmNgpiM3__tLSr zdmkcCKSK1WFk5Hoa=`GbYap%SNZjWJiKpTV5y&K;)C;t8% z(}@iYk(TMih9-4luYov}6q*=4RXVW>>BP2jNCdrBXCD5I^OSfvg!D7$&e>lS^6*<% zcS#_68$|UG8g4*HM=}?=P%mXb>aI>_=%wN-z?ApB#YkoC>NE$YS2-rhxL0?^9ltD^ z6E?unpQNn!L0M|lc1BrUla&=(1+RnA)^)zNIEZm|($`ji$f~XHAa|O!x;CGVEW8f* zCni~2djdvn9l{t{wI$T3EvaYQO^|phJ`~K?Is63`&YEPV!rdpyG7YaFwkTt|t)2_( z6}zLp8H}N!&0G^VqVqPeC(NJBVaNJNWY~Gykxn9S;?}1p^{7t5* zvq_vL8H&Pbjn8Sap=eq4Zb-JLXeiR2dRXkKle-u;Ye{jnwWqEFP)Od22k*o_CQ2Mp z#8xERBLPH|1?pNn;O8|2ckEF`w==|^TBO4Ww79EZ3{LcZzy?iz9_<0K~+oIYRoJwRfT7OQyLu1G2ukoO~4K_|21oTX& z137O!gP1D(lZjG;p^rIlWiDlgf?2ASZ`6Tl-Umz_%3n1LROK?}+ zuC)s`8=f$idEDPzBSbB=m;wZaP3!`4jOb>IR)2 zHI9Wu5ck(+{J92ebrpB9PkEklV#pbdKo%y06E6(6BOE#3nNnwIS1n_*^#s?0gDFY05X)1a7P}?1o%~~ zV$QniJcOe*X=gTJvy_x)*1F!Yn5sJv?b6wjQgx=hCYr{`3d}V=hP)dL8rE@;SGQOR z)wxCQ@bf|~E(1-s=w12BkgPw=fcX5ypF1CM>oxn8S;?7lIG2ilzj?_nvdK1k#w5qt z#y7hW+hix#S2pXOOw8=9d$NlA{PNzix~jLQK*e9FFKN3lv4x!Ut>SuUJz2KtwlwLa zzj`(gg-j2`?MI2dTqY&9qr4?jJw7B8=&l#a(6v*T8wjhX638_+1KnMqwR2Hp<^!Ym z3AgP9bH{lT06eUB{)GosyX7lNEhB#Sa193gY5D*FyqodI4xpx*S*|E5YnAP=mu5o zItqxjH@#E18#>IcZNNz?k7o;y6MP=;PUi7$!{dA>BP09v>u+Pk_g>GI*>I9=(ID%+go)3zs6l4bCviEHe{&Hdv-1S>4q8OYvthD^%t4 z?~^03jJSDAn^kIS8C4$h&umybKa0-FsKtbrkqu8JQxggJ5YZ3xp=RYZm3=y z`&~U=OfNz7F^Jw~$iG>0QtfT|x~YOEL3(^ihsP2X_5(~@pzQ$M8vzWJ<@?}nDX?EI zF(+EwBF9?QUI-+QB++;1W_`+rm@FG2TH`6LoxV@BHh_Ern&vru-?D&+0Gd0hcUL4H zO-l6NUt=C-tDEt#<9+xey7428=`EkB9s&Rlv(+>_;8!~v_x_|lQ8(*0c}NQN?U$z# z-#*;N;4N*{dk9j#iyT0Du3BIo=BdSa*p8%$25AtS>rsuJRU?bcG`vITJAc@=;l1+b;DxIek#YH_NLOua_f1z zAiflVbT`c*&M9wFxV)B`I45LqQ?milPsP+0`FseN@|IbQ^lhg)y|I{H zj1~97ajv2&B+DyJmQAmbEKijceXlpr?Cn|e^l8qP-HVa|m|2^&BTU+|TP5vj4o}nf zZn9C?rt~m}XM>gB3z&C)QXclqn)0gvQ{D%*4`!>gXV!S%0OsABgs^AUcryWGqQ`A^ zF$DCPP7%d^opgMC$hf$x(>~CL@)p`OJ(=cgr>fhmA*oHU+%`Ge{nOf-I}tjJ@6-!NY>^bv4QwhFrL1~eTc&~ZWVtk3(g4%PId+S__NKCf`m6( zo|Z^ErC&dAO5`6RTLe@*Bsr$yoDjDUs2pvdF4|me-{77=TTG0YD*o%XfyGxJ#cVQ{ zBmBP8c8fFRqh-cpavNBaUf|hl&=kZE_P&27sV$!Fwn;SNl6QfAAsPLm zZqoCSWWcsq>b4F25Kuwi(Uhx=u0Gx6a;3MftI50;NIlFgLscy;*;=Y>c?aCRAN!aH zaYV2y+~rOBN(8SB?)c>pmKzm*#XcK3S3ExQENZb1KZC#L!*tDUwMn*Fn{eX4M}%`tX~08;(mk&#I0V2yZma`f&Fr1rx%D| z^K{8pJ~ce_n?pH(reHLb=j)}uWZ&Xp$9pIVxoOkTpkMGsdmRt`w%*yIA)3MOK}d9L zFDu(Y3{r}t@z9U5?GrY#F?t|eZxOEMyENe#XQ3`Sz)I)g0h!HIaXiS+yZ=3-j>{3$ zZ@H~7(Hx;c`!f731Fq(b1ttQhayh8P=^0LjaN$MOL@P}sS(3nV66uc89RO7|lhOCm zk~q?2unlpe_3MBp)A|76nqiQUQK@`?aiVNAfXOk(BP_NHiQPjax4+(thoEeUiQKPw zQfrwl+8gvc$Q7i=YnHM6yzi~>mVc*c2rtGX7M~Kr3k1Sr(`(mc z;j!360iV#ji|}7q;ddhitTquhP3LzLkpfyx5w3X>5>WVU5S7B`A?i&176pur4WfRC zut-l^aT$@Q1^O#I1cgrwr6;YKe&J8mEl}ow%+;&~^7HyZMv@F8s6TK^y_CYns%J)7 z)0p%+TD2X^Wb<6UE?#&vU_o+UT|shRTkz}n+A3mVvoyC-iL$(tt+IAEDDLE1qpkyx z1a4&oITXV*8Saf3)Dic-6`lbg?oBVk9Y60H%U%Zrz#g|puU8WQtU29c$PUeRYG}P0 z0Vo#z&^s|}PCaP26SqM<0cgz@g$Wc*cZ2E+D1Y7^wmq>{<7)mPMNrIF#E`dXq&0rXaZ3F^exmtZ!KGw%$mE><>~=Y+;CQ`Z3K;YA5a zM2t*yh-qn+rM%uY&k|C5#cgNAJr>ZK6iu{;Uoc4(Jr|anY(*2|BFti}abz~e+8^sr z-n@-Fzvot*Uu&%Wo?CN%<%B6d>vU9sET!mgcgk(7aeGjju@)Ov-^|jDwWQ2^V{Nmx zR>@L8t8$GBoo;M2I?n!u{IW`=3`PH5R z_KWi%m~W1a^#!{P5B;_Q`xQVZ%(26K$&SUtjt%xU_`n?70svvQJ0ALN1CE(I5}0HA z1CnHp4Q7y1oQ#Kll&ue=LpBZyfpEP=xSEk^!ZFT5J;9gmF-k{sY=$qMci<;R9hXDe zbaU)R;A+Z0HW8pvYmPnkQ4++MV+SQ$B!M}0x>zK)z}8@&o@$QGFcwK*`n^hvtQ?uWt(h{*`mEc4>4L8uUW?O^X{_3XEVn>OBUX@ zFPxsf@VDl$390m zFvr#qiCUn)!9!5^spgn1{HgjrBmZ2@T43Z~W965!r8$;T*fhs{aU}-ITFkL`Y?U~c zLRoXH5wZ%B`|1jk``Usz=4(raRo@&FWqF5NWu=&7mjFnk>l)l^p0V~tiaGW!?F*P= zA6xTcTPszHIkp>%vyH`&orF2I6`-nSSypq*f#5Y~Wi`jH^UblntUB1eB+Ri(07dJY zr>?<6pc%gv8AGElQRyl+s6}XGK>7_!wB?&)(yqMrR$H|s>ziXcQ(L6EFCM(Bth!Rn zvAd`)nqv=JeLZFQPcg^lkhNPZ#@82;Em8LasJs`mnPVT)9NR0KId*(tj(uf&k5qH4 z2{Nro(L}-=6IJwFR&JVyXd;(6#)14dnPZ!0SEai>x5(mJ{m{Br*Jg3#erO!Il}qvA zX>11Ja%98DFqW9*Po5qP=ZpATIM~C2cP5@bR7Q03Uee_*2YBzCrAex}%586I(9M8) zeUnjWzXo*@pgr%ks0i!Nwh3S7LWC2(&Z~^CvnhHgc1}{+u7(i}UuO+qxR>|C-CLes z)qn`?C=t9O+!5ueWP(?_wMg4}4q#?IuXd>jZy!rmdW6wJw(A*&ta~x; zH7$`f`AY5(-0p^M{`Q9MJIQoM3*BCy26Q8aZg1JEr$@_~-2mmV5>4g$b?$B1?Q&vA zlq7!fwnszlS*ZBFZsR7LuHXBLv45wURze1Smy4%W2qbjU}MB#(VM+dSG{TAy0>p_Z>irPng4ApeGj#CLGnb*Lc0 z0?Pv~PY3b(uS}{TPrGf{zo>~P0P4BPs70phQ4_lW+H<%?rPq+zpoOld)GV_+ZMq(} z+K`}Kq^C>@th@k}0W*H>IRxvGzEVd7alsB|uMw&}wJ)$rW)s$jxm!bp`4f$ji>Ki3 z#rm0CrHx>+uW+so_fNFXIVBYo?!Ma47j)*TH7Moc^as_@)o&3!4y{A1|rAUj5uy1^E!t4uxc z%pUu%T)t&06$F}Q1!>BY(Otd5<>wIuv7bRy@H+{vUggU7YqRzO!S12>p2OMj>sUby zzNMZ1o?OzR-%>4~){fs;@66JjQc0P8XEWREa~^)v`g3e7^^m&|!$L8FNF=V&E8EV=_8YWwc3)Fhx~^aaGo;uLfL z96*`It;Pf5&Qw3(L4Mvnl}Vk4KiPZ%K&-(|qv)veW?^={EX>ySf_(ES+7E7LQ^&VpD9Jo(Eh)z=w;m#JIv(61j@F9n(cbFi%*1OPlB zTq48T$vF1}gnM^IjNwF3QD@_!U*3W6g#v08qL8jF0FV@=fCt2zt9sx;e%`!fNqr~8 zmm;aO&Kg1U5z)It+>cP*ABBhpQf;;~+$XQ&*KYAW zc9sI69|(CnwL!5S3IP4f$Kqal3Yx7{&l;`-R!+B{maa z-@?82id_xXb_=uBBml6x$wMQl9_K!YP|zz(CyEW>89aD9q7kr;M!=2j6=ti$0F<_J zEFM6l;&j~Q=dDd{D(nXzxZ$2o@07m?LAxBhKvj!CUL2Dh;-vjP9O8?FOVl9% z;$fvahEpNst^eLcYRnAo3)%ME9>|&(Eh<73+Ou6xTmi7^ncvQ&gM~vRUOC9tqCXlA zY#pPZir+PcF*580JJc=Dldmqt7oEpge9bWXCu3Bl{u^q$*>nFYqG>Z2azPXD_}k-{ zK7&dy2nS!Ov2>3P$=7N&dHR)#-+e>YoNYd9^5mm2@oz6;tUCCwD!CVf56(m7uZqL@ z-uv6YjC-)vdO%X(-v`(Lt*!@fmMecU+i~ErM2nA1JU^wycW`MGv{$F3oKCI8mp?*ogZX1!KFn(D(0^;Ygyy>e&T9Z|dg@Pmn8%=jzvw&>p1 zW?%sapwB8tlL6I99Kj1n}P^npbr_K5hACU>25A3G0A${KwYfo-(?Q|M({7eWR1(p;(chTm6KYH+Xbr0 zm2NGfcAswJizdE-YV=P@y80#$s!5fgr`s!s1cuoX5QeH2kk9%2TZlhXdYwg8L3WI( zJG(uRU21HjkSq<(pC|+$8~cOzg;us3nAjPJfzCRoS3vP_PREPRhCo@^_O~pWy@Nj; zZrWV@Zn50!(XANw=YgTuH$r2-!|7h}9X7$JA^3zjV=i9r$%uavPvST+dlF9-=YB^Y zY2|K!dR>>A4D}JtOTR$e%JYuVs=~}uMxqH>m9x#cWv1U61N&Mml~+^xt!Ip-fsLZuIC$!h0WfW3G9F+b6`E!-TfTzkEws6F_|cu9Tnd)OnHCGs@E{;lG3)Qx#K%x585IbV&fVz`kymF`uM{>{i>tfJ#-w%0FQ*Frb zyihl9gat@XH!su-6xZtq4C!_HDUwDvXQ-@GUkL5jq?BqY{K3HJ1)*Jcrr@VB0HGZS zZBmTTMqLZc=$gXWGRxVUhO_y}oV^w5p32!8+L5nvB+ec(N95RzK4CcsOU3It{bA@J$sZL^UbK*tA#Rs< z@k&b=a0@1BbNYjr8$3cA&DNQC=g{N{MpRzUggIeOc!gAnq$BRe@nubPG+HTWXrrre*TrW~z;Q?{Ib-2sV z>mSn6Fpou0Hx9QlUDz-{F)QNUW;jePLdff2BTA>m15i*Ndg69Oedm}w1jQpz1l1fU zFx0ooFeE*bIRs^X87`C&eWq^8DCaXIbS{?;db@%fWZD;p>B+jmlkIm7_gMEEDU8qT0 z@q8ERKkJ=Yx(hWaGv9^U?hNQ8OaBuvRA>KVe7b+-ou&VQE_?H~LUO{e`aHH!JEOw~ zVc5myO+13@Bk)+tn<>jfm3YkrLF2+%p6bF`Zpx zgc}7kYXZ;2DtyI=y^)`0E=CFn!lS=7sQDtc_fvB0 zwV~3~D#hJ{z8+;jg&yH-QC>frOuF_}#($KfF^5#AY~w$nzQ~EOJ634h6Yi=lg3>AX-NDxms%o3>d!(A zL8SOzz;JK+81CKY*$DZJ(8uYBTb7x`A3cE>buu+w#}cByKhQq}JmZv|Km5Sn%{zKb zCK0`TpXD@Lcg!lq&r)|Vw_hZC==4T^?!Q>c-2WGU?!QdQD5qSGa)`fH$-=i5C#LsH zk*Ry)3kbW-yU(=%-viKnK)ck2sA>ZTqrOFl&sLiJ!``UM5cdc}6(t zesrawD}jE0w@i%1J;8*3sNRF*Zj0P@*ci4`({@wP{kE}ivV(67$zkGs z0W)S9bf&r>8lp$y=3d&H$@aF%SmC0N%Pys|VSs__$VIq&Pg`juLSdL^XP3Q9aV8`o zN)Gl2p8}BiWtMQF=EUn$2f`>!TL<`sqqI7}FFhSP#t^GwU@prZzd8<9j9)8tU>r)A z!<|$Q)PZM_Dzy&GNv;FuWYht(`RZJLlBwHH_+tS{QC}cMJ&^Fv(~A0GTaYXqQ`A4E z74@7fMZE_Kh`CEqUnE6+3d`(jTV}~c{V-sOqCVdgapVGXFa0}{J!g|87xgEAv8Y$z z?mcUzNiOQwD9)rLge~ev05ZQii~6GM#)^ERkB1ILg863p9wOQ?!HaEXzWH*!GfSTU zCuR0~PJlOiyEXa1cT$dIXHgiDC~w;Yb;;4cyd zP9K4~dE(}`&~;8XfrbTI8*dIv8S!;tUMI}u*Ey#EP`e23g#LsYm(z&QFUHZZ&MByY zQ|42+6NUh7T~4DyKN&~EIw!I((1+}1(AMQNDs%<_*l+h7m)h6i?_z|-=S1^pG?6%y zJ9G^myeHvG;K)gg-Agno^d^8XqsN4n;DH_o=W9I3&pW@w4CG-1!EQ;<2FU>N5O^O| znM}pyU>r;voPPrdW-oxe=TOuJqJSGh&r$&`YOooKP~%{l5b6y8DBlq3kB5HEAm(JN z0KO2rSj7Pm{C0Tg_Y6dt3B2(z5x;;^V#^^_a5oOXT#Rt2p*cb8V~(8KrTX! zkBJGJ9W1g>4sD4CM4apN#Dn|-*=bII(}e5-fb4mAXJX4F*^QTJe5eh8ke!9U2Gn%p zymDkcJH*28$HLEtpMZt$Lb!Q;>CXlv|DP3qunqJjH>2cZswTbUDbL(c zQqdm|db+uYzg~*IAB%njp(uJrAK}`vU!N%Z@xW9381R>ATlVWiLD^5G6mYXqip#Vu z`vnw#lxxd=E~0EO;*WNJruZy-LMgt<*p~fh*OvXlMA--8`(>XH-!J?kRg+%$lxKr2 z{p!V_h0bHPU48NL=(+%4On98^H8+6TS5YU{BdYF{*AbOueE1hOkOQHmVi?cX6*(z< zE&zhQ91s0=Lq(_nno4R4qLaf%nFcaGd@AcmtKAKrO3D{}4?xgB7Ewv#!{gk(2>0%T zEcPM-wNUSkhkpG~`3a?x3MJt{(?I6wVWxpBb}kGW$hSCPioJ<+4s=J(P6miOa?9lQ zVcd}u!aJMxLD3JUkXz>Qtl$S7ir$Z+pGGLWuvF+M$IAYo6UaUac*@T6YbQ8X_6MCn z_DK{0va_5gI9B#0lzl4xMD}TjGRVk2%{kncolweNED5db(;O@NvV`n4zU(FJ93Z>f z(-&SK5FUpf`O-Hvk>ZqRjAO+2N-$Vadm1B~uF7kJ;<=kFPR8G!zy&01Y8)-(lMo0< zIGH5aUoO%@qUQ2mrgM7Lkl&uT1$r`|$+Vt8xP~=`%v_DA)NFG^U8Ak$0=B3*8Cm)w z+Q~+H>-A7P)Uf6-17fJbBFVsNaDzS$Xh7CWH9{2py!(@flDxdqpu?5=1b1}z^uZ=Q zQ6#TL&{F+GPDV!s?|}D#rFA0+>qe+=a#}L#1NzJ6rBHTyf0vm}erA71g+5{WyP9#R zw^RTYBc*RAZd&LmK$B_BLb!%qIHMkjs8lwq#WKGe$05#!tzZ~ug?hmBWoy(FJk+o& zX9mPj*(L+qozD#Y6KG_)MsYxwpXWhFrWk{uZYJ_CBB90jJ1SXzzr#z&?{|2GnH?Tw zTw*%Bn)x+`r_)IRojY;MLTdqq`~j_B5U%0)O=bolD&=PvwZR|5gQy(CrLvVET7ju- z>q3RBZ0yUK0Wp-{WMKRAHKB4-+1AORjwmSq)2;l+A)s64al_FVcWScWzJ-&QQGbdv z3!Wp-4XzAyH4V^y$jna68iP7<-uht6LUhu< zlc;95WL2S#5I5C5*{Eu=dk$4~OPZ?KkxX_UH>$cpKW|kv2ntAq>LIkSPBMujky>fZ`|GdL21n0H0~k(P@>( zsiSwUB{vk&^#5b;UEs8wy8q#Q9qxM$&1kBbW~P~G?&>a6(oA!%ndvk|4W;rR=ZfTf ze#jvvg(!3w8N@^(gb;Ebgb;>82q6?9grw*3e!pw)>psnx^8EbX_y4}{bALY9b?v>@ z+Iz3P_S$Rjz4pGYJKN9C$gg&90uX^U?wvZ&=stviX!9`8J%b2Fye9Wq9a!hCK_GZ2 z$|egq;iRlOm!nscdnSOA)y3p2c$J~)t!V;4t#cP^nnw2l(inCR(Cn^vb?atJ>w^Cc zhW~8Mzt=NPVurbXe(i8m%RM8$SKT|7OV8lQ zyUFVr+g-0`#F?2zH_c@+s1{ls0fdt-*cH#OOzhPM(O+jkkCBH$CQoAKNV8>fu>-pB>r8SGT7ygq72xmMG55(Mq^rKUZIFhx69WndYDJLqS$1x^35D}D*wMeRP78k9~1aL)`$9EPo@4c`2RON zmHn|<8vgdV%5N{;Q4WRT@#M~R{FN5t_?Is6l!kD|8%k+-f7hnz{?GNY|Nqe6DlXO| zFvwuz*KT<7WO1?9`ozUr<~J_Z89s5bmTBi_6YRTjvG(_C7b_r`YpnEX7i)#4+e|v` zVy)D43Qj}NJ>}Cb)+$Yxp`ndF?P9Ig&;kuz<IVKs#82gL+kyTcBD5WT4=~d3R%@T`&eoYNUcM}afP`X0M*Z9a=MgI$i0%N8kZ^ef3(L)M2iWI6DZ2&cI#9HSxY zMMJ8oA*)$2NQ4cr!Z9jBhuz%mo{DS)$ukrcx{dQJ0@YLzLcOK%3diWkQ;yM*g{|mF zd@~(MZ6=Y77IcJj+(k}=j_d#n*0Cay4PhNg!D5y=Lh@CP(UA>d9mxY;&w257gJX1L zLs&-!0Z)l=t+?JXIvOZ+13vJ23^sGF4>U<>`8-qII?90cIRrc0Z zb~BwzY$johK+PmfLxHzR*$c}aF;W=K!i>XdskNR`K(U)Bgq=nR1x5&dVmiQ4gKQeD z&h*$|J(8BMTZ-;Da7`IJWd#8Qb)W#xvfoTqnGe^N{LDol9+=WC2E%5G$KsN{#wwHF zPUd&0_}W%MRpAzx?_SL8Vy(2lnKbrlCJiWaNGCii%`P$9);jTnk;bzu)Oew0*s1-+ zq=t$QAYMj0L-m;kQmO_!$RgX=nh+_6qmZxnb!~5!+HW9GMtj2y1|tLZFt*Af+t{3C z_Wjx%FSTiWSoZm%>G3CwhJk+g3nl8#^{whK}uTeX=k>x0UY z&8JzY@iuL;$7qp+ia(kn;b25kOkPDKbUM{~#wJ9{0VyPsKHA{Sbn+1>arc7E0(nd#8_=wGm#QJpgpw?>NNXr_NCfJi#qKUxQB{YN1XavYtA2<-kG|4BMf z=RXgD;8R%Zv-C`6r5#6e{Op*`H zIc)Z^4+lN1^}K%}tK~WWupR0(2fG7DO{CuHlkOVyx~sTJ(HcN)^GR=I2~pj(7^$h4 z)T_-t(_iaC{WT6%W^Kjwcc8x#R6Bef0WAB**q=z(-wxkSKvmh>Fs@8RVR){;UB0b= zmW_d_@lc-YZW{?c{AYTYDN%m5iCzOpsb9K)8l2y zsuKNj5uy5}f;IkQ0TA>l2vmPD2FL$_W_7ufx6c0uAcAi*7We^BF5)=?a(G$iA4k1Q z#Fihr58XJ&BVO4AlCy|_z?`!YsLnVXCw!R@{gdA2b^gA9Ah6ll9{~_9^NmG7e!+6*H4c0+Y90G@THjauoNx-VzlcfoW>-G_suR@Z%lf0|c!LRoiC zv{t&N?i>83?kmD|FZ1dyW0UOUd6gH4-pTW7FQyl@XML8ry86K@jj-@Wgt8{fPTodZ zw@tV`4P3J#?9$jGu#*>C1hs#MBSn;*VocfVkSH~YxNXk0+LVRLx{0QY8bf8i2BefM zck*U?k_(Yiav@W8ot9pmI|qR>Y7R5-Oc`zAY)^vqZY9uw)VUO;{sq59b2Evk&oJ!d zdA33T+{ufb;lR>FCE5==d9jI_&x<&^dh;qVPzQ*CS}pUc=t6l`CALsk1!JdGsL2|i zjG#epRy7Ef;s^>j9jKO)@w(37x&Gn55B5g1mz>O%rFZpeldwXyJ;p_uMYJ z3Q^A9sB{(nUeTIBXK!pW^xK~%;E!96K!EO{6$t#te^A#r5$yhzBc+p zLT9!0F}vq{zhKuSNnXZyUS0vmIqMttpg?{U&-)GqU*AdMOFowQ4u$w%PPN7V;x=?T zMZa#OUm1B_O2k`{*=OOHne~Q`FKFPz+uQn$kT->i;0=RycNF{emalhrKi-(`melYZ z;KA_*DP0rt_mEcuu8L-uHl%v-n@4)*iwEp60Ckuzma*3>OJ|Zmu#>1cJw!g%L4aT1xsUW;x_sivVbs+BYH~zu^4+B9=v5kUTal0sucRK2z}WK6=tD z%W8dizSj8^Kul3;!6=Vs-70M`%g6a>)oci%p7p=hmyPn4JFfvyO{pv=6jBjauP2t} z4#iSUv8)E3Vj+IEW#qElpQ=pviln5W4)dhFH#!**SJf9_KaWuDGurIL zS4jCAom2#>M}qr7K(k`9BVkPj1pIAu&SAyWf%s+@@T?e1TV!y1VFgb-iUzwLQNfVj(JV(ImZ%J@Vk8? znp!)@HaYRVnL+VPl!T`4eYZ6AJRcW6RXtGuML<~BOHBLB%Bb(>6klBdFGANhD+HRAT}BGQ$3|!&Zih&$B|e_Vu4ji_h}*Zom3dM|ajYoL*Lz|Xi1x~PMZo@$ zNW5|zEfI9t80?PGq4K!K$-4yWt#bj5EUOmrGAa&9F9IorMn~*+PkBOYQ7AGp3;@|f zS}?n;hY={F0x<((C>(0%c29|F?RHw5c8Qcgg0UpNM%N#Mq_Xbz6(Yel6#!5L_cf?N z8r8q>m+?Ax4AiRqy*UHM!B@}H5*SbQ4>-rfIWDzN?Wmc|N2C%tL2c&PRXR{-k3gVs zKO=jRw10paGRHm;Fa+xC!w}#vIM-0gz;v6hFQmqo%jBrS-9i++e}7$xqd;%X_wk>% zcR1ey*sSwQ+iP1_wjSzB_Pvb&;%eRB0hRP|Y>^{?Buz1LW{XfwcR1$&iojCq5~c-@ zJxtHbMg$B{iZk6301=q&4o09X(U8!gp||dc$^^7@r(s`EX76s4AwQcrF7WZsu9u-h z;FR)w_ZsFGYu0E%S7@_VmI~I%HBE)L;k42%12i(5YF3cL5=m=7$_lbOt@I3Ws6-lK zQ91N>HAbu4Dt9bZj>8i(AciU@4sy>RH@dF^jVxD*Wd;d^^_{7jj7T^8I+c0T69K?U zYlr41-k{YUgHSfwdN}%=b+51gpbg`7sYVs;!Cj+u(H>kCt&Fy+9FN5NAQNcfMz^;P zY;wyH7(z`X8d^v#*ytKH+~gWHEIJMptR{8aTI9v*P_EoxcsD5_=b^n-;i)YFf$V{Hko?eZ0ZGt2yG0nbDjYdq6=m7DyzpyAcc(=FGMMsO`SIp43UOr$W*;; zNP>o4X#IddnKwiBl#*k9oi`!e;7r#_xzOTV+4}{LGR-9)VVUj=mUcG)X>)ie-O{=) znlaC_>>_b=x@o>1&C=P;(!q_1et@Y4Ybl=WOSRk5?v~MzfntN+v@Oy*O5~?Vq>5ts zK-X*TBjze>AeMu1^z3%62Tl0%tbglw5C7}t+k-E{{y*_W#{atcB98*IhwS->5&rAu zgTe5=a}xf#NK4<(FkgZ3{*nB@ZazrP+b}d=w)ok6*i1qC9&e^{TDTISv8PF11hR#Gb$4 zg-7T)giI6Y*}L`d2!QtNRrc1IMtSxQ1rSbv6TxUR&)zu@LM`j>dG;Oxpqf&tCp6^Q zGh$ipP%PCH%W~i;7S6Y3TShL+9m=Jea#;;L<-+;uY|98HOvKwFZ0nn_N_Ux7Ere5tG4WV%oEJEBTM`?A?QS<#>=h zMg%>3D-o!E{s_1PnGhAzp1ltN0lypE9}pl1_AUf;Q!mFKr_c;Yucl}3vPgh<_O6a> zY0tB_M7Q)56x7_aSFfQlo;`|bB`_h+9>r8mF|8*wTF+7Xu14&W&#`fXtN}*}bo)JojltKx4_TJHg*=4Lt{dG=OCds7B{675V0d-ggaCn)b6J6#9r>~07Y?rX}9 z^z0P@1{Uk=0ptO{;1omEl4oy@5CyM4QgeC~IrThy>i}%l`K9e0>HKBSKz&&qx3Yw+X$4m%hOFB?Em&35w;DEqE3{cF+i7Zs=8o{}qq7t#bcKmE-Wl3_K@__Usvh+~_uFm0Km28SFq<@0hB|h(ynxH$4%6 zc=lokt@fBPIcVzwbb9gZr9`WuJ^0#aU9<<^9j%P;>a*}D?BX7!>{Hko=&Gxa*0iBT`&);UW6g&hpJ>z1>6oCH$X(Vjgs z5e$)rX2?{%4q7P}TB%e@P6nBQr<5G?>nt-N+~ADUO1aSDT-o~tt4)P-0I}%VOEQ44 zXKzUtoo|$9FDe~9d$H;4(%5w3*?R|LD4E1eQ&|z7y*~gCdOaZ4v$q;ZRTP^ahQj8a zJ+8vUv&TaeF`m8u%;(c<7Yg6;2yXcGIt9IQz+*a+{~97z9PyzqNhW<|4?Ptdr|B9#%x!Yk^j$5%qjFu{CqALEy+-Frmr*a44h=;IhUkzA9oCrE?$L$FXeLZ zBO_hj#7*k&BM;`w!k>d>9BgqKp2K%4vAor%YDZYiEU3UV8&ho97^^GKk2*NS+KY9T zgPM;cfSGk_+Ozz6%@~U{uNnjNcp9~Xt-W-T-VNgc6JyJ6dnzI@Sew;p%t%!&z+(y% z`~wMa9`rHd6X)`;OYvW#^W7H^m&B7m-9#i`1$hgBU=Ik2EYdh6&31FpC$_310R%~b zf3gk~`_DxnxDg3RE9!TsH6-{OLLMOgIlFJs6c|1az;oWv$`xHSNMvxR1p}m!rI z>f`9kqV$mof~!t%Ss%XxycK=?9q6So`j~h|gg$meMD#Ho0km%qJQ^ePaev|?^zmTC zL;5(LNNU{#1cHkoC~8oYKE4B>=;Nn4Q0)H>f#8`);AxvheN6R-)lc+sesg_X)up*U z)*_?z5&Bq^vg9zZaCrb7o|83@;Th9D;V#S)<$6XN7pXwu#yVb{c zqU|I9Z8B0HBkdz`VSQ}LKAw4gls+;+@E>QjtdExf-ikiX0(x7FKHdbFG!^aRors7& z-o=bm)uVXCV;b(+$M=Yj(8tda59#AJBB_r*AQ0?yV+;Ct5P+hON9sVa|3n0W>g*VO z%#YQ_`{^`AMfg~7G-pE=X<4|uOB5XnOy z3u`KWH6m6VsapPL=#W`fy|#epiH#B*3&ux2-C}8~=jhKuwcB{E{Iftr z?fS_s4#?!~ls6HO6RAZg0t2_=sBc|ujY7KOatNQpvi?tqSr-3IqUu~MjYhLoW?TH) zR>lonI^hdli}9=)bFfDGX4rgFBjXgri98?AsxL78WXd=TeqA8{;Jh?`E)Qh{=euo2 z!S8b-&>09YO(vdI2}k0TC(|szDNUs5ia4IZeencQd^w)-3vTM7RaDl(v#s8s>be~; zXyklUh89u=-&s~B3Qa+wN%P$mzyyzsM9;7~6a^vy{qbK+ElnXk*{hyYIQwa)0N%fO z--90C>U&G!zw6~6UoZN~w0Xk3JxIsbkK!JIs@yZm47t_-=fd-lMXzseRqE?4CbNnL zX4Z=0c}(buTdwso^TVp1;_oVXoc*^}3{#iif7oW^ZH|sUJ zil_Ke?}KjSe~G%=_`xI?cSDN_Leeyy z_YVJu3&_y!{w!JbqMH1=&9v;f(nQTF8UC~QXze)AxorxyBN>%H@<*MA7=nvoq-6&G z@dfyQ82l@iyr!0!b@&uU;TKzj^Q@WKcikcX9@CZw(=&5;9HO`u-4p*Dld^>eUNdv~ z2dE`*BUn3hoZJ>(33Xx*?2Q^`2GYC7aRso^YIp+hqJs=F0Hih8>8c9X83@j{g1k?W z!c3USy|tw(Uc^G-K(aqQ27G4*Xu1cqIbWAT6Oh?8OO_TVxk5O{mbc9^yOK~4%o{nZ zur;6MT&ffnm>i_w@*Y?Qtgw#&41qcJ2?(IRjk@SX)@c51S7tun94vgrB<#+j`{tG1 zYU0B2slH6R^c(|$ocTUpAf?o+l`JIih91678k4NFd9wD+l3{sKn2ScGfbf+Jm08jg z>^53ufC=B#2m~W*W^MP;=e#VoYFaQHw%CAbu+*j50eO1|Jw{QuvQWQJ^%6|= z{LT2pM+Ll882_27G?dDSAQ0ayRXl354s!Ov1Ha}5DUO{=ybj0Xe|K%g; zB-fPI9!hG(O})l&80F9ahjpkxm_w3*!_AVtm&VI}W>ofuH0N4o-`wJILJ$_$Ja^pJ zr~|)G_E-O=MC|dIuv=n}JDeVAk4LlZV2^ibdpt($u`~A%`A_-Gu~eYKDBVtW?4bn&HE#h$Z1&qxcRQ z%;BiwIb>VUVvgpw02W&BBQ87zQN$OBfTzvYmk5CPXFQe*F+W8-$8s;hK7_{;=7PeL zdCS>C3NTS?{WOG398DD|3?Km|cQ$A{3gQ)W=XXf*7e0E6k96EJdk*EvR`5#_BKrIn6lfK&=>_8_<(D&ol;Wo}XgP zNT+RZt$II=LnwN)e8a`8W}46((rMc%MWT^hVY zEhSh>om++II~h`~%no9_q&YZe03uH#QpH;DQA6~iQTmFn_~V!V`w6sDt%%uM!ARa? zQf$?hhCXW*4Q5;ZjZ)T&PhJKmb*4<6vR>!ZDHK~HvA^Rh3Hg6feXf%EbSw4Zj5kVs zILPltee&Pgol=I(yBVS=rKllF%=R0OXrS9LWHM9^tt%oeBrz0lr6po5qF5_dxUsKe1XEeBmoeEmfRL=wIvxR| zh~p5*MHC62vH}Pc{(>75!al34HN{LAm>~(DvU($cUvWxjs9oE+tMPYPb64@U2DkS( z2h6IZ1S=LHlL8QBRTiL&MAN+rT-8~)jRt|~A|Z--fa@yJ(!7TlIBT-jM}fc8;Puv5 z1nVwRfPmO|@jzr%iD8mH(o1xT1GKMAP<@Gln@F=>A)|I{-GH5j+OP6!(Pn$p zWAqX--zbSi>}465Umpgo%9+>+%9W9M3UY9BCUt)sW#gCsLsS9MnYlBhjVE4Iegt^z zETNVU2N*<>GGr7kS89_u*JAc6e+~$(xJGcc=|aRst5G8Ds@w1cwVL0;5Vd}v^+&Wx z{`EHNeX2F0>r@uT-mLe@d*RN@wdQen%KDhIh&3w6%1c{;PqtOIn7XWw>An&;RX`g4 z3oh@nK6xGXD8EX4a>@kkxwi3}8^Eb?Q|Ff;HfpYEBAqL6PKm0EOgC1cIae znj{V+ad~!k$>n4KgZwBh6BEH$PX>(pW$*re`9Kz@bmOU$RRsH>(Q)l#&U(91$t`3IqxdGW2@^lQWT%k%%Q zoVZ$jS`w{xAg+k^7O8fbX}_M8S3)&MuJk>10q9&m;^7 zsH~YuaCK&VO07eDwk4ki&ia%}$zN+GpxH=>Zg2v-!Jm&ZW^UsB;okIrwoV@QJ?C#a ze-BBul^Jizd?!C~?j9uL`a|WCl2mEK^8 zxcIOpTAWOYMLGa+6jd(cO<=Z7IRw9rENZsR0l7SV7AEe`#}ri*TaqdYf{tZ-1tI@d z)a@@!w6K`n&C1^B?gf4sPxD{c-GnMM^61>ndXIv>nztt0 zJ_kY34G~n>~;E7+<4UV2DJ$rpfYshiU{6_H~_Fg8*#jHg>&43`KAca0J_% zYv#Ze!i;D=Q{y1)HdQee#x*cg4s_@aA*k4u(p0Ici-To)D%XGDEJmVCJ-^SD;KNY9N0XfC}G!=n$D-if1c3AN3?`Z7FQ*{%**bRH5= z`43*#I(b~PRqB375ng7L+=g7d=*|AKYY|oX58S?+Ts=>i;btG_ETmBRw=LeobSgh@ zccd}?zkDMn`s?8D0)<)igeZOkTu*%VM+*)BDdtkO)<6U_csRf#HMq_iMX>H! zoGPPN&a}`g=U@#sRC?u`HZ>u5H0WpzNECR}?tuwti113_O0PEr((!vc9KebPfj#87 zkU1_vjt5GPO*R`o*ch4PTXrdO3=w_}T+xo09N~{+e%OWWEBU--^W;rcx4D)&6Ntdu zb{`m-rPfdYDrW*R8Uf_GjbfueWenmXwnZer2xEH$GAuUM;20+5`wzz=5WEC8R-Tx^ z#TeR&Sqflut&f&rTc)uCL3x_aW2JRE^LQjOkEs~5x#s=^!037+495U=kFun^Xq%E6V^cVaRUKJ}S4OD% zE!mXIfvoC{TN5Z^ZOTZ%!!~6eVq#O~hrqNcw`p*lbvwbW+Z1X-@Ilc1nN9f+xY8|# zAkwC6274{p6gGS?_4%UG2cWV5kR=F2 znvFXU7qJZ|d5ld7i;d+y#H6$w4opw^3XF{OqR6-?*C*-t_Ye{KtV%^r$H=p@3_%Of2!@ctQYCI@g1@*K7IE2@&wwIps;-T5fJO&gBAIR2xBp zS@OPGZ82l#+AtO476|oR*=H|Dk;UT!KqbxXjWHz;7tnh0>6g(c_)|oFfdo5%A|pss zZ$y!AMUYt2Q6!B0PZO{OfZ0Xp_2Y<7K75B_TWc6Oy`?8ef3=0~*u$K)fx5(@1pebw zzFRNbgVMrtrCduN4$j7sXOF6{zlYq#;p{KUL*9!ss=bcIjD*||s%<^LXr=2Jm}sjE zx5Fl=6;%vJ_6pHX%+XEKUP|SdiCi_L6ETsqj7mD9lCN8$l0$Eb=(0_+cH>+Nek0uK zaGL~zqRa@Y@Y<~&H3+ZWnk=?P)j1%Y5}>KlYqwhv4}NOW%gb+EyWL{|Z6E=x)Ub9d z=&F4X5o@=Mn>BCr7Fv4kw!#_$Am%Fd)+hv^|8r1Qr2W-vw{^lycZ?EyErW;!+BR?zUZAbD*c8D-;V-2%?E++At<@JC zKV_W>AbzcNu3l`T<4-iIaatx-;|7#2K6APqlD0d^fO?z#zc|Di_w=s_$SVB;HavVV z;$HfPecmk=qgB%GhlnYvN?VGTtOH=~Fgt##VNf@{YJ$<1ky# zR&#N`eLN(2xh9#}M=ARZMC^-ry977q8r-^~FzXd7>05_PJ4*^vRM!Q7E4$)q(2d~j zFx*@=cL_*jGsw63ln8OcpXYxgIgOi35bgOmUq=K^kGM>#g*u2 z*)}71WQ8HfRsIFHp)o8g>3wYQ91M{sc1yV80cPV*SR$C@%OADXFSrsru`v@?04pNa zat0^eAt}2LZw&24c1n?fwB(3KbW0{zSZz&HBKWp$%ah)5lxw?jm8jUQ0J(~aal@Uq zO1b?GTP3;e79l*3RaWip^MY=>C%j<1YR}S+M7>d()9@im+wW0FC9lqlmo_OFdpBcG z+=a~;^5g&4P86BEf(_jPFA!PXT)zuZM}gw~ZNi{b7Vr%C>VU4-Uf>&#zfmcH-=N{$ z+Ch7)FS06tCX&+1|SiB{^QV&(7w!F z5NszF=c+8#ZXlqQE+Z<-YPUaPLru(XHwLl8P0VR`IAW*kn961{WaeiAsx(_$@`M`u znXVa-$zy>zrvtbWSMplxd$47+&)*hWT8vzu1u7RCaBj8}S5;@L56(h3=)^sZ@T;8= z&U51WF0$3p@Y1_UPTaxJ`)3OgR!-ay=>22$2)j<)uLy64t+I-pq%7op8m{C!6R1JD z$mDwg`Ge5=r9b=vj7qA2zRtmwd`|>v=QjWeLRpiGt=t(9<08a!p9cpIA)pBvQ-PO3 zlyjF5Qgd^86XLU=VPRs%ROk4+ZFM}ZG}8yn=ZoNnkJ3Tcrfd9tS`2OD z7a?iVF^E2btLQU7gFVi(GPIG#sNmTJe%K==bHFuIq>&*n(ljRsX&LCW%QkF(J~8FP84)!m-k zCizf{+DJPsX7f->)JI$NkzS$=KN^dEK-i)mU?}}pL!r=fGfSXSVZ(7DppyZC^1*Oi zir5(@X1BW>vGa9IWs?xevq^%dpU7B45U5AHZo-xPfEcv|s;^Q#STk-Cd!yi3i~|ce z7F=(00F_}0{atI(?Ld4<hESv1gVug#eSZADx0aKg?chW z*23fc{U@}NCr{F}GO+d{)eOy;-EiKMj_7IfX;Lg|;c_;D=sI+7R*HiaqPi#fDN@U} z;s!5p^rTEdA5#7aj%+J)6Byd36k&HblmxcE_W(qS6VW-3w^7k7t9K0m6$D%$0K4}g z01OEOoZjOB7(u`kQmAf&5Vx&v2kOUR@<=&V9_=UzO2HzfG+o<>>Td=%e-H z2YL9!vf?`9Ni%9GXWtTp#ip&W`&@?b+qjY+w-YV_2Ur$TR+O?Q(E-TrN@jVL-3(U` z_@~5OY)jKVrJL4m_z^&MzT~4V_C*LamGiOWW4vevhvejAMGt|^7JEA0x<(TR`m+Tl z2(e5TCLv>t$w6k~CLd=#{IQu8pw|(Rw?k$pCrS!{gqz1SH+DniB5ba$2U>K<(=_o<(=!5CmM!Byi{zbVJ6Cx3fVTT66%-1$wYD}n$4+1I2zzY z!bGL`-lq7&0C$u9HmjQ#9~7Qa3T`8?ovnMXvdO!@_;FZ5*t2gDdGep&1A{XM>YVcs zj(6fZ1Ao%7P=FLCXBfhZaJB!?8if9x@F+*MoRLr1>TX=^Kd~+jLCq9($deE|6{D*s z($%Qq0Q9x?Z@@ICP@3)EU`r#GN*>z3!J12Du0`&cxMfJ&wSRLYGEch~H|AFZT>G~= zcf>y969DO-tN_I7d;@@tU6=jfs5@bdldq%c3`l>y&T`*1Mbv=~&E;-FKX#LE2)E-z zjR;=gbAhP0I3uRITow@*CP!$({4~pjp{chzo&o@V!p0y3gpHkGgH!$FSz!x4%i?4R zM(J}HCDFUpn%r(U83w=SGichoEcQllo+6yzWi7z65YbdJ3@oF<2K{Z|FJq1HcbB!; zL!7P=*`LHB=%YZ2_$LH$uUEsQ7b4;y0e?Hs1UD4=7{pK=)$kccF)nwKr&~9$BiZFI znpH@FCb1gc+iu3JXT{tL`_J0Ey3-7l(Zlw-Uv!!w-+06JkZ)E=3jc6F+5u|H zMWdN*Aftj8G3Q>0fM;`tL$kOLwpJHR?1;s01gaLO=WtmU`cHyZCSmlaVy#32QqRW# z))QGl|Kra>n1;^!>0Rhn0>P?JJX(ns&vLAUBWXHOYZ!KE=Pp{it%l<_>l#=IZ09`I z8o@(QhrHFjbqn2&^`mRGvHHyfaH9tHp0g8O6F{yt)1Tj@b$lER zBRtKo?_5;WwhG_IV<6Ib3x2j#*CHxxDe9Nvw)+(X=Oc<0U3)YL7oTg;Bx*F)_qu)^_pJOy}k;avVdiFx5)EZkmz-0X$8`Bxw{ zn`kj2?cjt%vjmpDgNZh-eS5iT3EJhE$H8OZzIl%N_7y-sbHwYwnMVTaC^xjyZ%9(& zybFr8xV}wfTC0>zgNWqOI#$_J-!mPQ<^mnSZus|y+Oe?j6^ZmLpsnL2!z(01M3d;5 z0G7Um^il0}gN{b>eXmUHgocbi7O?c!Py;rXAihi7i-@-XOTRG^v9DX)QM%oOL>+2S z)QxSy59AXAQcGjXWw|eqYYe0ev7^|^1CEj zewRec?-DJ)QzPYfX<{}Ch@VRN%|~yDmEVnkrJo*&2+8jXqDB~0wEQLzRbWsd`K3ny zM1KGNTo)KAzhy1R??ofOCdzN(F=6=_`CSYUQ(Qj6mEYxV-~=&ape>v5I#BPp*R-30MB}{udWxiQ6n?!U!mc3JgIHxfECa zVg8E%_*1%94sz6}QJ5$OUG~Wq=%PDc0y)HoP|!nfM*qvd!j4Lo5KWE$UZ{7})wuFI z#u3#*{=a-drP6Dxl+lhV|1evrPXI#ya2ihf*ioAvbd)m`<45mvuZBZ(C@leE1s8&E z9m`wPOFM+(Xmp+ZXb;lbVOwl$4z?wbmouUQZBv=foihGJe}g?C;BkndB&*^4EsolN zEC1ED=n@b4@v84WG&>MV3IVZBQV)30mC!(1w1iHWW6RMAS^`ljk=|hUCk|G8R2@E zrNHYtrQLAtr;d67SK%=hb(1V|Fh!IahG+%{R1?js-A4xd0P}MTkCkdv-U3GJfhZhr z(Z~kwL%fO%vyr{a=~Cg@QH7l?i3Wt} zto~sttreO?*^eW&|18+Bc-w8RvvJP>Js}fSgAMyP!tX=PE!eQ$uwSR(>XRvQZ=N!t z8*Ny!LjR_1>a&xUumv*mt>*<|m6ZP=^5VE*GfK`o!MM^VnFnO!c+C!l%rs=D2y=)j zxcdAmni@(RDllQwO0W}n12lV)?H@JUo~@3h8w-mx_7^ANl9Y%OluZF0g{IYociHDEQ#7OiN@m1vR^n2#CR=eUYy+4M9w&sqgO z*b1ZeEl5sxZ@Zu+k`T+1dOgS!`aS_!aptT74YfPkkGXj%WS0{39N%@2&c%=%{Rr`U3-U9DLVsgXLrF(T<|CBHM-L<0dt#E z_W=(#TWzs z9R=8+6AdB`Dpy?6Mdf8+js_P?Z(2bYq?2F3L4+xwDgdH%k=31RH@D$RKn8P~!i4h? z!K9#|4o^@o#$&jq?t_BjA0k*hK2ITl%!_F{U1WAXY*+eLpqbOfK$hNSaXwU>47U=V z*_n8zPlL;e1mi(aa)g~gf(F3S?(G{!lqYfxSNt|W!WW6RAOgN}zQ!}{4y;a?3z|@s zcj9`s_*sB7HD?dMXzKD`NnLKrEG2aoS8wGc_F-I&VEkWq*kw!rq2kw_kBnR*4UW|3X|vN4PXj zRx23@iX+vK>VM5avzsKWjK5tQaM`+Pxab;Ny+C7(IaX+t4d_u;COAPSa2c}s7+2Bf z{)UTM@1Ykz&w}m#OC41*6t|7IiXQeCbZxy7;(7rc2ks%&-1c&dR`{1*%a|y0(Ifux z-5EPXaF6=Qv;1tHc91FROAwvRP1gSEs6%$3;5U6dvBc?o(VHB{)0Q2h)dyLrqNa4T z{ZrOUfT^_m!66lEGBPP@>Iucm`v9QyOoEu-Df>wwb33A~LBkF2O@~2OQ`u z(2ze)DT*HTcZR)S`8JYse?=^;({fD>Y> z>qqVVwcuLW)==f28w&m73xUauVLInx@H6<2$0Sb^PQy5_L;h`E=yOaM zHEb(5myq(0y~$Ryv5;!k0&&Yw)=8KLyW^a=p*Py9<7}jvshw1#mLPn!6L&V?jj(&} zQBK@V2*1uSImy2PuH_c9eHhu^gSMd^TZ!IuXeKNt<3zX`oH#r#osw z288{seR7M!PGD2R_%4CelAwf)9*c19`QSiQhw4Hod7TW5x3Zz?++|iXYf;3)Occ|_ z;k-F_H|)O(aw*t&xc&Q~eONkql+tHKmQH9(rGKPL$3pn~-AZkmmtku?;WaHa<$nin zW^t8&{r|8TzBkRl&mOGCRq~Eq4(~`S`6jSWsKC++N6n~oRM~m<0!*HEpWyEM9JSt0Cr3Y>){c%%PyU>~nv*BsI^cn`!VzS@b zoUwG{J}6exRWlE(WSlKRK&4*lshgn{i_@?tUBCNyQ7GkqAb+>*x7MON= zW4G<}C9c;)PMO1CDZ=NWIGCLT2-nnBI}ToRbWHh)^13v`xhsJog$#_+rCp4m zg#0-f(_lf2^1Gw_-59?;lE4Tffpdm9>Jwb(qt%!@wPMS1y?hhM4Om%=u1%I1ZEmcD zr>=3I$$*n?LV0OzFS}mp9zG62Z>>nymqe zDgRrT3uXh~Yyy$XxePOo>jV-#j9PJ=I?})5rdV;g2(t&^pdR{6kF{v1B_CjAgxt8k zkkaVa<)7rzAaU3|i^GcRBoF=2R`s}wI}N~uEJQEF0eM+LyipO1raTR?Z?g_^fZKrZ1FC#i$usAagy-f2N9 zp?TrG&q3VMmyOD-

ll&Ly_pCPF(B#IiCqE3FlT1#Gg2i1pQ+Q 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�o?f#DO zaDt@}AC=*s9Lj#>-^MfUMr0-q2}%erg1F9j#`3Ni=RTLjr-0%NJ8vS93srDa300}X zaW;X#@i-kTWLQ2=a6CMtG|lnws?zn2hef>eZzc|pM$dFS#fY=h@o=l-xxX8<*SaW` z`-k!H2*(|cho{1xcRY>IE`RKJcnBq1ju|8IJkCAX@hpXBn&aU_-ZPGecbXT#;^7}Y z?j7bRr}joDNu}LpP?Nk+cDv)@HKb#)eV>1_591oFZHtE?55Q~@4<-M%3zN z!^Qg(c)^>s2XPSE>KH_kxD8<=NZf}J?^nic6E$%=N!&KkqsJm{2wT-8a+@e4$IBo` zgV2IMRBkq8i*%132CVo1LSbu001QWx5*1j#s52pk1%P0kt>b>HjzjXSNWbWC#Le6T z6)Z(aWOy_$3o}MdB3RqTrkytU%?>Ttqq@PN;+u5jyR6GVG8{P~`p)Sh$$i!o1E9PO zsh4KJ2ltiM-z4NHksKs;X%h1di4z-MA&02gbyiMVlC2+YHK+hIsHdyKAEJE8A^~w zwKWn@{KXR$l8DdLX-I?xIj$WEXqkpCm!w&dvqXiBc7xn-ghbAX4$+ciqN0M_a;p%I z+;s@2Foona%`TAyeF~tUd;^DSJQ49*0U3hcVYSwdJFRYv?g)w^qhgoY3B|x>)1bXg2w}d69G3t9$LrSB)awAe z+-%ut>1-M0pz!(#)p!@8Uk?|=e8ajyJKnTzgTob5vgHSh+480%CZd|kkPinc!*rv_ zo>InjJuyKuO;9fh%G1@USM)Q~FK~JIC@my9L>1{AEkf1o^crCJ%YPWH$`@=|PK&UD zTLrApZR26Acxot{j6yaFz+m;v)2)U^$3=7q$-fG(H}J$pH8`I{3V+WO4`~&CqXXzx z`QO7+-VlND5G#YhjE6i-?Jmk20W1skk|BAA8V^NOdka(fvw^yv9Ja-MvTTcc9JE{I ze-5m6Il!E1`(&AFdzjko@S7$fMwV%|$fELlfWjrDa;2Z&l|Fvj4atD@CNaOaeEhz* zJbv2k@Y^XNhTl$0^TTE7AQ9|4vXXA!@lt=(?|Sqdqftqu?>GW+P2XYSCW3v(>OkL- zsFb4kMzHTFBNWG+Q~HiqgMG&sjdg(2b+8l7?17>`69J~{DEHv{gxhs&G$eG_k$XG%u|_*x2ZTA`5egMr@P&E~ zj@*k31}qR2#}%2xnB`#H2#42gyapdq@uga;9b44Hzmb4kht@399 zlWj&k9;Pk~W<2a+YPYF3$P$L=dIOKY&8Rg@9QOzj&7 z4ayAXEne+=`XH%&x(2-)F_v3Vn&tLA>{W@o*{gjfZfUUg1ueIp$m?{=Z6u+nGAXq$ z#d4dj<8Bwr&4%T+0$R^}q9IlU5n`%e*Y)tDJSRWFFADA+^)(zSzC%Y|k!l{StkXPr zI@LUgVeS#K|0m0>48}RD-`Qa6SZ>=@FF;YSmskhFk@E*+B2EEt9LsIH%5iX-!J(_* zFgQlRhmmW)L-C2wrsQx)s9cBv2X;lMO$v4IAS7d zuyy^@mfLUXt#E1n(Lz7J16rc-cwEbkrEwox;qwqT|5Ch+<@UJS3d4*eEyr@BTjjq6 zOk=sRGPstThZzsity^Im^^(5YEVtUjRQ`UsuI1*FWn0|ipxr9}bYL3G%_qxL+r!ju zN0w<4l4`lF02O1o`S@Mw}D=_NsNoacCakUi~^`D~S z?vlPEjK1R?WNqe8m~dKz5Yu;b%E_0$qiZw#qQ=a#+QFgX8+7E=sSVWHIvc3BQyZuq zn#9u72I?Py1}bL~__0b)1zV@@*rhI@SZr4>ha;!A!D$5?r|;OM4smcs!{PNE*TRRC ztgz;4$K%#wICB18OW*Ohb&u&gVtqu>o1~2jLykw-ca&v1^T^!oaa@0|3;mug8@2lHi>hW==ZoX(fbiO}8#gqXf#mpTUk z2=t>hm3pnf%gq+uckEKb9F!yAP>pvW`YgC0<}T|R?bu^2gu@k6vPJhDdmJ$l)$|>t zA_kMr3;(F!1T8W;u6@+s@@OrjZ`5Df8!-Ikk3dUw86LOqV1?d?zT-y3&0m6-={q(e zy6F){H6Sgg@1R@d{{T$Wcd#pM<~rS=^)Uf(elQ`Get^{;UHj#!1;cSu}r1`G~7-VSsgvA$9kKL~anr5d_grHnk* z2YZi^8m-3Sz(0oGV>dE4v!a<&(-9)Q2X8hR2>`0t1~m>2)S3^iQ{YhX8Xf%~sg2ZK z>5UY2IIzmBNNuDxXcF5~8>t#x_!5Ih~r~jz2 z<~TTu;L!cYA#l6_A5t>iep5SU+Z*A?dAyeXW4688^dCF4u!}5C0K_0iJ~kW1WBqh% zAW4g1>_H_q>Q;>1jRD(4oYh{RO11Ne=J-O zbdfz)JC@m}z>(_+>gzw2IdURue2f-qM{3smSZCJ!mYOwZYZ5CB33pazl_6oq9!}OQ z23uwglIZ44jm@0NP0blWF&R^1dl|z);Wk7-dRNR>%>9ICzP z*$wzbmHALDg+s*`>B!Sl2On3Omj4J@F!3)r&Pg47tk5Jjr_LL14bB^X1b(d3XM?S2 zp;oJJDOG5}PPH43+(!&b5hdfqF;n%DgR%||Z|D&%m2~{5GPL6tl?O-eJHD>N%pCus zxIYzt@zsIB9huJC03Sd_5h`Nh?ube-Kms-3Ds48VLa8`Av<3!)3!3#!MaW zao7M9m^yam&)uox(^DG`Wbu`z-M9*+@CiI_yFqF8q1|{Baq~CeWu}hXy6pz0i%H9w zI;LCYcP?_Lj;RdYZeSkS!_;nFcWh(|Lv-B1Ah$Ez#?QeYSHds4eUxNw)3Xcz#oD& zaH5X8*&Y6KO)!(E$>*~O=|%t6O)#Wp4Qzv7)WBa=H;%F6H9E30c6S&3ow0j*4ZJV4 z25!(Ku1q!GoK;V4BV?Wlemf|TwhvHYDG~2sm<>nn5WJjD*VMkv>L>^0I5;rjHvmih za6$h0)*|g#Xf1~$_Xkt+8Z%LP&1Rt$=8kUoO9yy0k3;_VS@Q-ENP~7PmQ%x#L3$5E ze2fOynDwc%1f0n)F-=E^u^2Y1PXU1Ni>z<_+RQhH^a@#Y zx2ce?qfn|Qz6!~_-G>TUfVlZ3c$o@0#9tvv%c+obtNinUY1VS6Bez0&nDH>(xDIwLsxT0v;~)ZMSay1Plo-70mLgRc@~ zQ0Dz@(bZrG<4oPX3P0*@*Y)^C*}ua21P+v7prAlG3j=Q5eJQ>7ECxPM*QVCpF`C4j z)Ve!AF!ahTZl^2fERZqvcdP0Qpj3fgaOCcUNUXp6Q!?FqZdD-%B?k_#_dF0jq+_Wy zR6Fjqj({V#5vnUm(7rcy_+D#2Q-{wsiFNJ!K1Tp+riQMNbaC7z`kMx7cOk^o)~#wD z01$PBwb;+cS6iQR_<(hwwmO!G+kHNoURz7wFts%g#c&uNxBH|t`%qiQBX0glc$wOI zyuY@RmQ!2lR{2i>)6`Zf!>z3zW;{%{F+G_p@YPmZW3`5<{H$hfZS`@OVtX948&z-= zP=noPtfyNAGy2xA3Xab*-RCI8H3qE2<$PqY|J-Q%r_XD2Irz*DOrLMi&|RrBARpR+ z`SaKyU5{*ig+;`>)>N&8hT4R?hSnmN6!Afis-Dq-WwWVYT{j5*c~zhl7JkyvL@DO z=n6?%0yU9JY}BJO_Gcl)odL0j0K%#m8VN^k951G*oYI;Z5WA^^(iRSE&_euia6!&}2|HMwhM zK%A`k1Z+(U>E_H1$(dXyXE^o5oRQ2k8M7l4%$V&uKcI8-Eg?+_051R4msZYFgN)aG)}5Hf6k)8IbKJsP-9<4^mrVHWELW zrg$QnqwDdwO)-n(J~YMmAa4F6c$pcHs}Wr{uvmU2EoTOVZhVTj*qs4kZ7`VekcX+= zx+zW|`x#_hAEF5>2I!pj(P z_aVA5&w6B%mSf1#jXA^?t|3QlxQ3jE84uHKY7nx8zS<1AM6F>e{~B;G!!93(DYnN! zyJ5(!18T4ycJ1XFav>DJ`qV>r8^jdEHHMstn=+OPZi85-%R$OEh^>UCkEK$!K@?$} zhic?)gIEJ4W&Q@!VmLyau~b0?iV((9`{5U5cb?S+4h$r8|-h#4+M_sTelFLfWUT zJUDV+M>tc|oziL}ZkPHPKtb6C2c~X@qA>(A1bxwJsU0s_T^QXF)Mv!K=*Wqv@lr%Z zzWz_PLG;ul{?j&y)U5I6%x1}%+|-;A6q7NVtzgEiK+2KcudRo)W4rY%9Bz7jM%>p< zdgCLtq~10N$(K_!)Y}FjMf+rEZze)a^SDc01ONp3(Ylg)?T43}EzUNGLmiZ3;ZTj2 zBKmx|Am*>u0`2(CS^|eFrq77`)e#d>P4ij+2QtT*FQ~{Ow-DX6;YiD|;poQJ17MnM5LCKr!+DtT5Zy%q zvrSGyaNmOv*;|;({|p?A4d;_(TioNI-Iy6Kb!|AGEK_X{Q@b60+H5njOcOMu=zLHy zHk^;&l|Fvjt@57(rrAR0fpv{Gjx9Bky?AZX{3&2jg+AH%hY)?Z#Nd%|8(@W4(Rnwi{T* zA}z;yqg&-a3rsT&M`gIyn}-<>({1VwGKIrEU3cISBHFU!q&dAo%TDDt#x%IG-h3RU z*d7P%hBPvVWxLyvaskTtCWN=Dex+Mj&FYS0TUW)dhW=xAtA=BciSV9}DT#v1z?e!Z zIPx&1Zg(6SK%Ff<9>D@-|xhTtp6vUjc|G{&?-HMf`wX z>J~qM=Be*~!~eQ8{*MLtf0W9f3s>ptBQ&7C+Rf2i120AfEbe(LPUoE~9{6>J~qM=BaND_}gea-b&;D6ChsWQ9M9= znm-~Gu%Ss;pEN&C<54%-1SDN5@6TXg*-q4V1vsQr_0)IXL{s{B*s=wEP~Ve?OY!Fq zNLAlTKs@n3)V^B859pk4XCenG*^AYz^$i#T^`)VE>Wdt2)W-?m7W6@VojPjq|ANRt z^_>HVCq5@2;j2abfL`hrKY-?`Z#4L`@pwIr|M!4cZqLifEBG{jHflU}o~}MZ*{F%( zR5zNdzAM1~B|K2yW#Eub)l=VWM}0LAtOb3LW>_aJ{v1ROs&9oB*i@eP>J&eqm%7Cd zpn2*$8~hVitVtF|aY6oF0l_(4!+*5)Y4ssO0avKg)kkP7X4F?VnybEB!Tw`BP~WrQ zkWST8U!xOD>Eo7>7W6@VCv?{0zm_KccLDJWFiJvVY7sx6m%7Cdpn2-M7W~7O-Q*C^ z5327hKx|iiH))^dj|c_aAD6B^LT%fquWmF~eJ_E1q>HHUcW_9j>Zxy`qdx9eZ9yNj zaSh^9{02Bc5fr}*AfEU~XT{2R2d z7V!gmsayO2ny0=G!Jpap&outu0ODm|-ofJYvX2Kh)73|4p!C&_=Bh8ZYgiqD2bK2{ za41Ma_tdw{Q6G=_x1bN|+km(feJ~qM=Bm%OFPwle1tr;MSBFhtPqLhEGb! z#W9Y-YZ>(;9j}1}BA1lP0DloC2hcN>%J}{{?a^rkPQg=-iSEoA$oQI23;(2>svAwl z_av_Db7Lm4#qddDpW{?T4|G3Y#yMYt#O53a(T%r&FqRS3k`rPf#B%02N)YLAM!e0+ zAK5UhX5g_`%LOe~A+M@29`%2r|1E7Odn)oT(jJAe$O=aLHf7F#qq7CG4bHUQS+3D?-2Mgn@IKpSL*)uDL8ulu0N zeu^xA!;37R#jlL(6IS$9xMh%K3h^DFGs)13(EwDD2olE7G0?&$p%YS(T@3&X zg`0c>KvNMKHI0c%P-p02R52y(r+qrTz>jj%^4XYeq>AUkeLdA04n_Y3dN*Pm~tfRc@jhkPo+ z5U?od0Jc)oBMkOKBw-9j?jphmTER_vfkKeMI89SCI5U+2FM(IFk-4Qjn{AwJK2X%01IC0}$OQGYvOrpXNYY&*?rj2R}qOINh6y^u*y?e%3xOqn#0}=D>`0Ai}{Jx~j;LIGshqX1~M1L5yP76Q*G(Alk5D z8pdd!=0J1bv7j^uKSVe<7LJOXTcovgB{@hrb~xMxh^M6|wa?QMalNucEjbY3Af#YH ztH=}B2v042Ne%%mHNXZkPfNwx=V^(!9tUd4fd~g7g}GT3QP{mkEe!{Spq9=6#M9C= z?enzcjGa6!IS}FCj6yK2jXh$V8@PuYWN55-txNDv^5t7#Afz?s+=G8oUlf*G8BeOb ze>z@E;D?9=&h)*COvMs0CFleSdzavB&7%$pW~55s%rkfrI1rJ*nFmmjx3Q+ne0+cs z1oH7;fOz@1S^KTy_) zzY|Y`>nxt#fkob$c?$1$r;E3YTk_#$HOR~!kFDPr%s05+if7|W%f|4l%-yZ2l-Z!%~mY}g6s}R3BG=ULpgMV1f5Zcp(CM8tHH|Q5-E0`SGYOqLH0R+jHVANvY zj#nh!7u_{F(Shi=y>9wJ1f2*7QiBdC1e`hAry>kOgaWRE?txoMzXc4bC+=b;1E8!W`lbx4{WAQ-!o@T3vt6u;;stQ(il{o!(BNPDB_3L1sd@o4 z_T~I5TLiR>aM{E1(>{iZYG@Bnk5mf#QX;)aY`c9!+DclI$?4dyIoM}{Xol)Y638D(^&3A@Ea?eQ%I$X<06`wt-g^$0^V2L1H_ z`WrGfQK}n*abT1WC|;L0*AnHJA9~Cv1Nqfuk1l2AYzs6#*b~a z&qCccxu0IZ+JA;n+bZU$K`c{M{4pTXnp>*HWHR#My!2HnroV! zHr70eZPor1np&EV?x4NUuxkHcQJ}af-ozvm&Alhs}Kn7!NP1MS(L-3EZe`bsSabm zL1Z}hC*Ue`s`E^=wU!E%XJHCy1fI;c7Uz|kp9=Sb^fwTH0gKvb_*>8c`>Pjegsdi) z0NHCfGXcF{D6-|uhwoA2vx_^xw?_L^Df&XWAGyLw^Bg4hd>J%?yf59(|ky|*ki$$x%gFXt>aOVC3 zl^&!y5(@m!aC1Ba%Is#b;l^KlfF`uv5bCK3xlm20mq)0XCbZcQ>f;ddbNSK)4t4^S zeH6sB$MJO%UhOZX)ZyZ@@x%58&5U%qSVYhb*vmsOj_DUxS@R^zDlrWPCnq_Ph*L6k`z8NWnc6=~D34+xkhd9=RboQg2->aC9*V zQH>N=3=k=bg1X2ptFIKV4Bgjq;pWJZh-%8k3j=++a7vNguYG-`c%%QHmZAz#jTBrM zcXPy*f)_H>FGpTJa9?x8t0RbNa%2EHPDr8ah+8^&rA7Uucn#*^zSUH>T#Q3hqYEz6 zLJD0jTwU;VZT+NpW$>TY#nFgrbivimbX`2zxxP}Y8Mv=fT&e4bU41N~8Y#GF2r0tB zI`V0k`bx2Oz`o{)TQ0^Ss>u>x&!uA3Rf2s5!Fb+B`jALjugh+ z6ibjJw5!<6)4pVfiFGe??mBBOySf)b+>I!`lkD2J7woTBiB^Z$H2C)0!eG4~F%s6R za!j#a`yI96J6-2usQTr8K}np=-$oK{?DI=v)~o!IGz2NEWW^{+7?RK)s@K-R6iLEt z?tMBj*Rh0+B-|snkCM=ctk*6)Ey>+lC*kVB19TRe%;6q0mMbI3c@yg^NJFZ`f=Xm0 zSfBlDDJq%4R^O)*Zr5VjGLrne-jcYPLsPb1Tfa12nd4NED-q`&R~!lszim~P1k!i_n8LF%qK zZZY8?u3lSzv>-EpEtcCfb^<8Panr20zY zs)U2udTs4UQAr=&A2=#8-zRWXvaH^MxGLc|y}aLipE_6T(*;PZ_5l6XA{=tlnr~3Jo-dMYpxU+j~47M2l#pzuh7$Y z0DOxTIv&4|(hdB&;FGf>YAv473s$H;?pF?rs3s$U51M|rKdxUkKm5Pt_Upk<)1O|y zY<{>Oe_!2xzID<3pQL@z>Jp;c z`V4g?9%i0D0e*ZxFF#IQyy}AcY5EIaT}t%B>yp8jsmeZK0_w#Xc!ek9^)R014MSG= zrIS#BPBxya?#xgx;E|AZZ)K>ge;LoLiE;HZ9tnBi!noRo=l>(`J>aY;mj3UaIdjgO zu)DC!0=vW|BT0ft5D-xm6(uVM5EMZWk)VL62oe>LY$6LPC@LbD5Cs(lBiDdA0AdzV zQBg$SZ}rTaonG8~xq6@f^SsZ)hnnqQb#--hb(o%>o<179%n$k`uJS>jYZGcABr&|K zSeH=F!(6_DDt2)!hJk!Km{W~QPpHw=uH{_1)Kzywjb`!|Eq9r#Izx@-0RH=9s$P^( zXG4uHXHSZKNnTVr!?`>THM%HiMP<+`5gN2+<|fr!5Roy7^Y7L6k^?Z?@&iLexYK#D zE|ILt3vLs?%4bAi+&-;bVh;CZ5#S{bxFG&M5rVV9%g-to|H8-kQ!VdVg=_3h)~3RS z^e343aRenlrA=c@P7lM6%13q0ZW^d6EHGA@Fav$x%g;-yz7U2b*X@t!-0){H4tNd8a`{?XYm(mu)ulKF z<~3e~+kq8Wad~|r#gD1;U<{>#rd?yza0js(E3w>k)wEu*s__SyIR%Uv)9domZUBXu z>dEJ&hLCtEpkk>=nbcGgZ7fZs+{>V zs;2^`jEhuJDW^2%Nz`QP_{g!!Qiig2wtKqIpe3jouh_ZCY%&lDVNAItmakkXj&Njy!;IJL>Z!{v;ovRF_B^Li z<}3X?&}yPx4qsLx`R8KaYjy+eh?468I3iON*A{?_5bTN8wgSuAHB)2I*b^|NpHn^a zT{H^N8r>;GN$%32rd;e)&-#?;fFUB(dh#g0?73oM8T)Ad#E%X0mQ{zvDDWx0d=dfO zi1yQfT9xzK;x1Z6go&I?t9578?X6EBdM;vj_@XD*^Eyd0Lv&go`XXYb%6nR0#P?$B zg@LH^kC$AP|8l5f-VmhgLYmvWbnZ%~fRc_`q_!sct>0)d-!sn}qOJ}SZzo}11uxV2 z{DQ%Svdg(AhZ)Q5EcfbnJ)5+|Y`bRS z_U&Hx)kDF<_1qaDoPBYuzPsn@ z9MUy*9m#d&Hpd&|JddP$Qe#7DQQ{5vS-<)i&{gxkc4PO-fnL!y<0SgTxyuR}Em~XI z@ffeI#D`MSti^JZA(NG_y6S;&O`afJd1bqpY(Mp~cE#J0G#HxyS9)GK`*23{?V)C! zk28Y%fm<=DIzhNUd0mF*kKhiYbmN>HxK0}W;f-Ct6_&moXcR56!F1Q~J^CE7c=<(b zL+Wdq(p103_3=@M^2!j`I?nIo5zoA zF)XbA4t}80lZe-$vL!mmg`;sbPFKFY;LkMtQK*5JkcNgXhiSMI4JG6^zQQ&P4jdeW7? z=j?;owwaDl_O1myKwQtWiS7)&QkK()M-e?#0hHZpaZE+~S7-hfs*!25V!s2&e&S}c zImq)(A}Uw*n)v-4m8!}uNV=;YOBebKX%u&7SoPv}(XvEBGoC0=IU~6}Z=&7Z)z8k0 zC10gk-a@ntp>U-6{P93Soyrf#pwBXZviELsRQ7Lp>mcsZ4miJRQq6=Ktxv33q?DY_ zzD8_$xSYE~*U6j>W6i^~`mSz?%>2d7QUvsN$ux1#$F};2#0eBPdN|7+1^xs) z4rRw(VOL7cfw2$yrG4x~Y7!v+2!LPBat~gFOfRp5OIKLs;)D7WG72h{P^p|}ZB-!R zE35|Yv!^49xZGSiJYbbduIf<8aLdQyDm9N8PIKftJZPmdJJt3;tD{O}l7znYSXHI2 zLj(WSaii?g?j#sDfV#nm*N9l|=%S2Ei!$aEWvqsAJ35*MI+he=H2oo>)*(?okk~=3 z3quBt`txGt;;)S>WE}lrE#=nyF`~91AydctH^=glr9+GcCFQ5bNZt;`JA5f^z9b76 z>0|*TNG3^D_AjKnA!rP{X$WPi>Bg{e5hELeU$`*@INcaJviN)=GArAlJ z8Cwkj^X#DSDQ@YPB56j413a;xxTBDfeJCR<@$d_Uj8mJHbyxYg02SGLlUb>%dm`#q zvdnH7%}L$Ls+WMAQ>==qX@E5X8r#{)u>i?hUUB5iw96;o!ido@xcv&FIe%1gJKAr8 zDK(M(Z89&jM>USS67BnvGG7t4_-{V}efK?pm+IEg&GNe=X_g%n$s%<PO8xmdPPX016gI?HkxT;llE~n32KxjGsQ)BF&$kPuy)G)zWPWul}je_FcmzG zwPpILQ`Jqmrs+!slI=JvQsv#KIuDACup)DEVrn}i{E&=tjzjojDBhdp`weG0>N_Z& zWm`^vo=)aL@yBe-{;DfE?C0YA&ShXX9&m1sSe)@S#js3|lcHf4sS^?>j8ldX&uDY)cF`~^#b1ZL*u7Y%$6`#54lTQKS zH$%Z)RpRRBg7}}rwC|fxi^lm@PXcU(w6<$_!!-F4fRx9u`uPb7b@fMR6LSm&&rC_E ziO^xirvF__joK~fdd?I=Qom(3qWRdj9kmcD^AR6eb;*iqf0St*u_Bw_iK<+>W|@X& zgmdqeF;xO8a}!An(EYoZx(h0EH<9aN{a&GLQy;+{2j|_xj*k0n zu}4SMK}e^m*eI%AfHe4^NmLEtpkNK&I4;U>75m_40v%fW;PNg}H6PNBHw-P)BdX>? zT7eOBi$7Mx$IIS<(NUFkl`r-lgNDsmp<{|q(_>~-T?1(`1DtzvR6PahOkZ3URn714 z!Lcd+ zmCa)+yM-U~O}m)7>_i_tMc{;!d@!Ft+4erTl)%#g_>Mrkll_>iQ)22iNL&3Qf%7`} z;HFb!>O)A!#7>K;<&Xwno*q*hJNlsenKAViq+{xJqHvG~CA-JeBajA@&W)+nkgnhz z1Wr27kC{l|PyjldA5(WiI?bUzF*UWX55Bm(h_KIlzgRRA3S)}jr40U);)4f^`G77bQ6b5-f)zJe*t3T0-fZHu48 z90$@xIOAkj%{s*gFLiL)^yh=ByQ0 zb+Zq;+~%t7kdB#oyQ|)VG^nwF>DEFY7_Pc@x2q09TI{q>uo@De-|Nf{J;DuS^*VLF zEMfDsFB0x6)xF0-dDoyBn~N|~>tJ;D#Z$Q~L8L*0Fqr&Rq%bDI0*8p@%(E&c8v^8s zG)fjZZ6n9%b!cJ80#Z)9NCmwP9WcTxL3$}&BF+n}lcjWn5v+lwCH{A;fyFxV>_3W9 z2M^!Z)?oud-K5l!UIgz)yet*!I+HgJLtq$7g$6_1WH7`{21Aw#uS18iRA?|{sqi)= zjHNS5C#RT(t(0WKQa9 zSIvVoxaS*JJ-XKi&wcBv%l3Idua1;wJ{7q3a@<Qiw}F7AZ)+TB(px zc2uN>lndj|uIsTs0g!QKsvnF?f^K^(V$u(eCsx}j9a9+jJ|iWab6n7ErE{i%bWQl-M0oMkpUnLq*VvN{om2?-C=&c(<)TIgI3i2)^AY45KpJZBC!U4 z^xJ23OD&~l1?U*5SpibBDH(RR3Sh`h&hF$nHiD9zQg&1CWuR2gzZ`^}{dAmi-_dzw zMi%+eRZl^ZpL0!qT)kZ`?t$>FT=%g8G7I|H1N5&;>wA6dCVxL*CE`U*sSOR3`WQ>6 zZ7&;N>PJc=nYR6?#H*7$!~d`aC)};birIqeJS|d?!S}jvu z0b3>Nb}KLQMBY?FhKSfIbt}bdE7?BbWT#{bCg9AYB026lfasHcD(%}1M*1{E zMtVa+Mtg%H<3hlYvEkpCfxYSXx0+)7lTO0Do3~=;nXtn97kie9C?Fh+Qf>p@>mKcmQdRJ(#0SH!_IsG2@31|oCOzti&(lEs zEg*e|eFa5PGD_cJ--jU;n4bOyjC50Dr3-N2cFU3z{#G%!ONM;b`ONCPo2 z4a7hJX#*uI!$4se1_q3ffu4nRLJqvR78ds8BGR>q(A9l!Gx1=*Xa|njvnSfE~8C`RTrLB-DjNS$$evy$}`z3gGNi+U8OkqmI`kOT%O;Y!j zrD2DsfjC@1+TkThZ#cXX48!38Bkl0RdWv)s-7y{w@)Rr5K&n3tr25l9tPzm5Mk>s( zMi_=Q0V8b8NwghVWAhT9nC2RY@Ju0piL6Sz#pXP@e z(D{r?_xmH$-ez9IXRhqEqsIO-N}AET=tE1TA`dN}PxDkrf0Kun8;d-&yd3I&^3Wom z=twz5UO%*aL01YGp@)`(zG=OYlZO^J-rSRG7uXsMUj;rx*V6WIEv13fQW{7trGeCv zfWKEu>7le-*p|=3wxogBk_KW+8i*|d{+=xi52bxq$snaC{=XHS_*X?jZS*Jp_hEzp zX)Y--LVy^dC;oW?{^rF0@Eg#U8vbA^Rc{QY4FgNWH)$Yd3HV#Sah|FZSIz4NU8X@? z4TN;h>Uwls)oJL1M5DO63QG5%5qK-O4ZKa?sn^iEvmbYy*CvPg)$Shecb7C{P|^NV zr%3E1N1#z6W>x=pjVS_A2pJid8cebK@P zPaYpv9ozb#$_a5b2TC{VPeRH+L2;W#UbCLhf!vZgPmEePG01-;%Z9PAY_;V3le|VK zIJ2>vP#L3;m_8b@JzA!dRGhs(Zgb0V@kWVVF~pJmgQngrO&3 zNjZK?OeilR*EyBkFZ?VSH`EE&^YkD;uqG11(2wtD^U+SgkRrMzeFg)XI$?Ll(aBT% zCv8g@XJlmXKowp#+LKW>ndDX}N=hN3EioQ&PWUdP*d^w~PrilRxYWY@Ot-RcpkQs_ zgrXZH>rL@8bCJ;dtRs^P8R=C|F()Px!9MGNk)9^F_57@ABc_Yq!e>+p7!&<@a+E zGDG9Gp4|)znG|oFRKp-la96$OH3%63wMps(&qiTnzgnW0F>z%u(8!pW1~Mk5fsBc1 zAY-C{zd0rd9P9eri_}p#mko*!bp!WuZ=5Yq(_+QNJw?2N0@*ScwWC( zY2-_3#ZqAbBb_W@1j$gT>x(K%*Vk^TuYFvk9gA67-LL327~d3Sd|ZT)yorU_a1vB8 zUJdKU9vn!tIxlyRtIK=%;C%uO&ho)y7w|PsA0JF!7FVkwz4PJ+0{M6N;L-=V|sk#ZDG@CcI@=FuxT*jtGHSP z>7A=XzK*LEkOsx4`Th5}I)=w6EmnLHjC_pp7%{~wFwz+27-H3-8 zAi*M;54I6#-p~g(5U?8gU~m(}j`6`F0#%#(;3@*o1Yi$=GmrIS4m3-skf$=K+jui>@ zIux(W-W+4YiJ^Mm!)z~n#8-XVqX{(>()pbA7^)%NcFJx7K-$pt1diJ50cF3~kzI+e za&cbg@*CtHqVZ2TleYnoTb;d_eou&<_N`%G-06ZilcBx zQ$8Mbsu7w8u^eJK-_(ey-Zf)?0xrEErrw9N*d={p>K#afZQEk18zB{2dLpmmGwf9Y} zGp$=p?StIQX_#TaFP067aY8Q_X;bdY#1{*cz3*{+{P6QJRhn;r-HY&X7%HhV>Pfsa?Do0esLKJ0k1@o;z<%OE zEZD;3N65`&)7tGzV(JCR{ng^5hu_u`?>-b&%^-I*8#zxTZiK{7jatlygVv4#_DlN_ z-XRw@mbr0u|31gIoc)jnHRmT(cSwLTO%L02q~-Vv#Z~sePV|P$P_nfZ zIqxP{ErpWTS&@7Bn{hqi8}Y&0GdSjH4;MK^DtRxQdoLmFd_LcmFRhagS>Z7IqL-4= zp2TMN$W2_fLU%t-sz&m`#mgW`b$1FUD7z+~nB?Bm-#q!OZquZ?2wFW83H@35J$$)g zKg=caESG2(PJ*s(8R2s{hF}Sl(b9?>L0H+hGEztG=HjO!D{bIi?A-nm%72ae`;kD? z^8tSVjF`vnjjEra{5G_i;$wz&OsLm>MnMxk#(o@d!UjNsA@~o#(7k{$HonoF=T~}A zI==L0{B|*vUoBxd7k=TWRZxBzM)IRb6{K{&1T^}Vn0mC$)&yn?*qZsz(oDgiv{6Q; zyNIcG00mFbeg8^6|5?>XsLk-sswz?SJ(RzhiZNo25Eza(fZ-4$W)#~ApMvs#$8Y^l z<9HA#zdhAl{UTT0!yu6_1EOJpp}>eKz6iy~7_Kt39U1WNkzcis7Pc(|eEdMPun9I< z7cFc-*8tMZb~7N|f-a=s>B1Y@+MOI%H$wRwY^LnY;fxGBP7P&kfVWOhq`QK$OVj(E zyophD(uAnG^cZUSB0vPX^m@P=0tW?b1spS(FS;fH$^)(gRE93S1n?4pvQq$G0#mWJ3^6zTrOM+i*Zxg zH=h<)PSw*AYA|$Z4Q^4_64)YO2R9FUMQ7sQ0JfrlmoAt4$xVbd3mPN>3n{9-T*`Y7 zmrtQgHl{dJ&vMjeD02!8tY;tkJfy+*Y^QHH7vRXvajB!`K$)3{&Hsj~-i!$C5IGBdbm|B{HRrpYL_kTF0Cu2Rpax&X@T%7A8w?Hv_Wr;H}%PR@(yHYTd3Lt5L|tE1`>NP|8r zqiP|fwT2^K5f2#}cJ zZ^qQUkZ0)5nCcGccF=8COwELJNuMV0y8yAe)+aI57t($+6#Vun<@t=5?lk391U?fW z?Rv>KG4&CY8DU6mzc;3)K)Qm9kLmg?yUrnPn^7gJ%DHM6q+<+Fr2?H9(k;-s62(r|bk&K_;i}u8>8kONF6rw8vO57Tqg~fM*H!%>oo4j_#t}%1tzz!92hwe4 z@C~lI7t+n8%8jn-59wxU6rmGmdfozQbFSUss>dL$ZTUu5y$|VpzI(=1^`8YugS~VM zvoc5nBTdVUxEcZJH0?^n)mTW2UDTNO$dInAo=xKFX6W$2!5DYG9UND6FGK8kT=n3{ zxcUatp#IG)B|{n*7R-Jou3m;RAEUO7UUJHgxS9ZIbMARRu0DkhFT%$@7}K zW9nll^A?6B15E5l2Zwabtd%?xLIRW><6|)ADZcTj+Z&b~gf#m>mY^U3oJ`B9X3k|? zf^IsXpW}6}yAz2T@4|aSPB`vO$hm~e*TOoNL-y=b z-hfH`nKE;}LZpiu+kYCj|`V9)Tlx^Tqd5&jt>-?ExA=4Q&lM-}?% zJyL=P`jOC03uFR*qS*fYg^v0ODwr&vs;_`^C!mXESK+Tyhs%?~m_WN&vDHznwgDCb zYJTjf#~~fFo`>%^hZ_{!PmBSKG{wglVn(J$n!f^y*Ji{Rz%a)s>7X%j^#fEeu&57= znA<+#7v}aLwgItupR#2R(#B={fPbOr@8!>IBRSGNnlMyOQ+$l!9YgHUISDoW+=MC+CmJB{mW1jv&yV>FKJX4@h~&^;XGovTwj!_Y za@1+Nz3|Il^69}>|2!N{dnDno&LfdO5}B~haJaa%VVQ8aIQfawIXMXu|E#4V>Ys

9&d-{!B44Ah2~#%l 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

|mdvO;?HxsM%ypae8 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 EgApF@i;roOZVk^-W@3G0qWGLv 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 z zu$d}jtPRm;2!I2P4ev&5G6ZcGB3gOJ#h(;S0niuphq*fwBmS&`xM24oyA%`}2@1*i zm(~-yF0v54WIwn|<~iV`<5p5hgg7PP$SUdGN`^L6-h@=u+tu;aE(5J_RYxq#LawcN zR$^_!`4sM}6=zHqt2&Q+f{2q^``^iMTOJYbi?dJRM0|Yc9*PaL|Ev*dA%YKc!rcT73BkUQ~4@KOq+DVK0hK!Q|#sJ?Zb z^zIn|J}^e9Rbb04qynNV@1BHv2oM+F4CH^_`Sfsi?lIpw|7Z)?nU96 z$Tlf&)S(lJgh+f_b%bR0(tw%~VcATcG^?wpHZY2J*4>&rkvIC^uHtM-Ute|57yQQp zG@Mersi#$OdNv+7oM?saVx(dhQ|QXqD|^}rc!)aIBB~~c?{c%d1Oy!)h@hYz%XLn8 z+}W&gDeybW+NnFy9xRTCNU4)AOk_Ajv+>H$Qcm=<$WCx*QL1%Bl0gE`I0F4Gf+=6! zIH9b*IJZKSqRx^h>_NLv{|y$i!m@RO=x6%N+@qaLQ4sd9<2y|AhiA+0uErb zp|$p$fS(o1rdB0Fu(I=3&?drTksyg|I241U2;|Lhg`#2-;ccc-GBp$h!wTX^R`Fd6 zYc+-BKuCZz-4OMALol$fKHo#t7l@Z_sAmy!iD57jq!omBkW`4Dbm!!WsOFSwZ2LoF zxU*ZD+g(aPcS}UrsiLssv;B#HXRx^5=V6ZRDGeIp6Lyp-%i+6+Y{rNd8bYte^C`IDx}OG6x4N*&*@`G|}PKdO=L<1+1q#8i|eY2asO1788Mn+@L?{ zf$os6X-3Q1&O6z7(ij+g(-p}BDSM^UBcZTdWw|4B-9x<*#!2@BQEhXX?i!!Zh-Lit}#QlAr9 z;X@qC0>3EF7eHhPScLF}=0kG%B2Jx_Ag7WtD3FVQck(b_{P(t0ltd^c)Tj=~3I&-r zv?Dl3xUXR>qWT10fpAkxGiZrtRoGg4x(R_1`g4a)5m(R_`zsA*MZo+`8Cmc$>g^YW zaSeq(^$=S>2Y5^6ZzV`eAbMOiLmc?F;g;5rfvQ(IOl3Em3`0^GalaHI<6xzK#>-E$ zP!>N$(Tj7GyDQ+r&V*uJ&`%Uf`~qaxsG&X`F$YHjfn~n>^tnD1@3C!Q5L*GZHk|`I zT4+&ur@BXra*%T21;cym9^zS%48XKqC_CC7&*;dtrxJ^q7J5=;{zz_Kk0O;R%AQJcVz{SlZ~T|d z#U_hbzr-r#Vk1%EzTwVqBLbU z@|!q~^9Ke-SnhQ@7SjJaf)*D!G|;R-u;P4UJ1JvZ7BDtrZO3OeeldV4-J0`k6z7>1 ztCi7rJND-{>?_w<1Qq}*J%SAPX1W+=M9JYW2SQLEwehUDG$~M<5I4q!`)bFESp%t+ zjj}XbPCF5~8Vk<=UgEfAlcK`!KwH}#^BSge!sU$$(Qt~D>`{<91d5CMAREF>n&QSe zu1k$~xhBW~dq^?$VYb;LLeNHVUgg((EfsHG7dI-gMp_!pc*@T>pjG^}dX4K)~37u`A3|knXSwQYb%X9j6E^Oe?jw zhn$K6&(-Dz@V=*kTN#4oQB*`9L>IoRW8tO63j;#BL%SW8QWImcO+2XGZ8=q@5=(za zNFLOHYyAf?BHC-`yGGJ>lSIk8E?W*Fkpo)7PMJe@H~QDh6=>>H8))j-r3IRj90nvg z!$1HDuL(2-l6{^El{rr4FG(+;KE$IMR~EH9O2jL_m~9|h&F7k4s6$Iu!Hff!=)I!3 z%2_e6!jbS)*M(m%kiSA5Zkri)wVDF75yQZ=ahD7LHdWw)kT%KXF-4Bq!>%RyNL)>& z1*9_ojP2aNSGvd()3_1~Uvw5x74PHJt36VmgqEQGK27NM{)BEnje7D1?m0R{dyINh z&hcDM6L>+gS1|<^K&K3sL@4vYANZ{1RWDTVqa{!8#zng&G*4a2tz4Xd>gjQaF}k`F$1f? z61ANrt|~mDuA&-9wr(u!V$=t{V9Y1>%)}ls>)&jR2&eSF z)f7yu5y3x_UWs2-Nwv#9PwJMzGdASNoMW4afgboiwF_=JvL!IhL$|LEgp&ee0vuB- zzYBs<9EiD=cLYu@0T;Rx`+0rX3^L|r(A+L;;<3HrrEy`jF|21{Z&06fBEd4U*c;ef zI!`HdizrEY(bH2o8!$bU(d>a!5Z>^61RL7aa$r}mc}n+WEIrfgUv2Se3{u5%5EQ*M zgH)*-jj1Y^kqIcMX`apVHcDhMPGty}868q&4G{N+T0_!(b`}18Myaetq>9Eb3i~-& z9QJ0`+3I4= z)lURJUv#ljmv&BR4>9JTR*=LAVm=a=+l8VA z^EiP6Sg8kq{WJIds$Jo`ORFhRsoS^;zJ+`kX4}MYk_0rj$^E&gG$0bZo;)DGilx@$ z{M3#!D`1=j_??O_GdZJ}w%Iu$8hf$YNpP-)2hQb}?^eBu-YI5 z6V!5SZx#ca2GX49)??Hc`DVCM&(Iv-i%7L-C&?|^PO?xSJMri*)-cUqf-^wD(qw6| zOw+?sQVME_e^^Xk1&e?iLO3;7o0y<6@8*`svPk%?)kfPlmytXwU8Q z5eU;_!gJL3ga@u6uv&zbrra}6^#ELAIlngAhj%Y_Dym;+ak-QHTZ1AczxlED_S!ju z>ts#Se6_YT|GL|JzsQJ`U(q}kI;M5{G0k&76(K4d+kU59M`Sv99yZpj6*hIO{H3y1 z10~AX)gqq>BzFQup|@m!3?#RcLk+#X@wby(aw=+aJ1pSZ=Bpmu|2f@%49)@`x&0c+ zv5?zuxPbi!$nDQ|oM{2$EI@91f;JB~V_j?FuMri|iMvUT?5HRcnr4(Ev3bZc5`L1) z0rr6FVK-(Yzp)a+l;0d~+I1dgKY~ZNeOxUVdRFpcNhqA23`AX%LO{U%`0a>`$Paj1 zP=_iJIi`*s17Gay2HQF%T>sLZ9wLT^0*kLlPl+#XjE$E`s!b-`yB!l2f1C-RTcoO= z{Le66MX0}k_(>w+D9MEij!PHL>P2@+nrb%zFof6fL1x%=+Rbt~N0GP3D~4)6x7SOC zgoK5B9TEaggq|%a7Y(*2PyAP}L#K|Z&(?dc#d9}3d;QJNrZlMkT!UvC-SA9G%5yh8 z*RbJ@&70rcqS4KbZn&{UiyIr*!`n-B7B&0*Ctrp@m^CrF*FX`LR zjX!1*7hdFzUzszcv_t?YkJmQGxHxTd+!HbilOZ1#d&XzmiJcfOW?v%L!f)G&ecOA) zciV}btSMiBhUmY%(JY)P&jxmiKltxCIMh+KfB&Vc@davuDe2WT7P*0Mx z2xLc-?GeZxk|6Y>+UucwTQYbk-vPTjq9zoIdhT$u#rHib;tnR=ME67vPTkW5Ouhx_ zdn4A7o_Thny1*6_%a5M7i2iM6XWjF*$l#tw_r!R6Ul%#c5?^svgUc;=yAXZd!T3aklHB%-8Gj0Ol#aUa&cb zOdF%6jf19*v9zI;Nr4;mBaJ(eIfbIm!C)xvv-8cs%2}Yemu!0iMV>VjhZrd42^0q# zDE?RgirLY6{){~0E@|anns~t1i|feD4tnBSB~?czHeXPloM?B@?$RD-5$=haS?KZy zY`#3;Q#AGHBX3pEv;)3=N8abBTWSx+HEA0^YL6-Yxubluu_7*_qC-v@F2OC`S6Svz;7w}5b!%>4!I`_+W2BF>pq4X6g za2G7N=s~mwj4Pu5&p`%DT+Ly6%EIb(3#)g{KHMq$aEjT7Ul-WR7-=lUZOdu0I4Y$6xRB;ZZvAs`VJlSt~xP>C5x2oarrIR;O(d^1jwMt^c8t^q?k&1%|rufYm6Vi%9jXg;jIia8-d6NxvB_KWU?i>EbTiLsi{@ zRN&ohg*HE&6}%Rk{4j?`mPsB0MKU+se;uBD*MpHfW-!la^=)xpLSRRxW*gTYZ;YD) z;Si}>+d(cd(_f|+lm{87Jh-rM7nJn9Au3u%S?Gcez(T=;a-@3Bww_LIb{ahH2oQLX z*5!fLEAs%PPZ)$@uM^amXI+WcgTo62#W<*>*H5hKAZuBYBPtg0V;2Gv@emae>&Jte zQCfwCOmhA!Z==mywQBpUzSnkW-sS1eEq?pG*5A@)Y31_VuYdO?y<@jF&&qYbUW=}& zzkf)rTeSZDjUXua{f)G2liHzWn~p7??RXj5N^Q~McenDp8>pud@b@>K8$ZCYwMRAfj@W$Uv zDIPkdK8=t}K4Nff+O~PRO{Z3^>|+aNt0iRe90Mo-vHUFUbX)dwtPkQegkYtjRCYrYOrcnaebOvVN+?K0k%7+f9s<6FI*-Ax zHA~aN&46zazwwz51A@bm#B@Y_TQ&SH=T3?KP(gy|Wj0TsL~W=N?^K5)xOK2oz50F> z8qLM?jVAY%G4j$vo7{MX+hkMXb`!g+Uic8_57m%izB12**v)^|PtHH5%A)n|4h#a?mM|JhW%aIc0zVgH2;m{k)^ z9rh8TsVk21{2HUFLu%jwe#tG!%dC-on1cYq@nwqwZ_urwMtL6Q(xKzmhdK>KPgY^o|+z z$#vTe7tDvUoTfO4;G|l&6H4o(L^bTDH2x-tt>Ucu$<7@eoQ5wEB;%n(HK%?We-j)m zBJ%3{9uIYzs%{xhoNR`VuRBH6h|wNK$!Da>Q$ zKa?nW57)3z*Ah27&8ayQ11#W*-)CQ7qU$&F*FXNCPFOL5S2ZIrv-%eBVZ*VuL3~^C zBt>Ce`2m34*dUv~36h)iU(|e5J)K5N)mVjre19K%LN{Fsh2_8plO+SjnFh&DO<1Z| z`HHT`1G?a@w?B|5U1jpBriu}>pOrw9%DW1wJi=5y=C7P)Dt`!cf?Hm3zixRcuWZX7 z0JFPLhf`8tAa<8PpuUFKXeu+{BZM}sscuJ8E{H|lQ-#$1IZ4;;f0NX$;jcTIjS$@K zPE&W9)CCaIDwcBZ--Ob9a}u&Up&^<;YO1grzpXHc=vKJM3hK>=Si|X<^y-azOz%#4 zCj|E3gS^}RQkqbRIX78@8gHk66dx)dMX9wtp*LYp4Ge!0bq}+M@@0CERz?e%CLpG` zT`iBdW&rY`OEQG2haoxnI>iQx_PTf#i=8@A5nXkwx!Ajf(cX0Y>+0-xt{Lhi-0oC^ zM11qKB*Rge@m8MgeSZAvfX`2NF`tiMi|70NM6&*TIr13X_Jh*CNEums}3l+P4q;u2V#L*Ngw(T#8YDTRz{w7GX zt83-zX6ODTT^_%##T4snD)u&lb1-g4Z9bYxXS_XD%ZyXCBv|&Eky! zV&mg_#7p&~biU;A0-bO1w=$JhcF@XH(@Jj(&hvmX4RD?}GaPS=_fnie@m`AA@`tYx zD%ME$WRmR3MtV;UOipy}z!dfx$f~Ad*Fwck0+ajE`2#9l|9*e{<)q!g(ryK>t`#b_ zkgA*wr)xpQ9@JDU4ZxnSm95fv(+FD$VD}fHVvRHv`})s`+|$&XlrjLQ*w=s7CX!RH zg_yB$*XG(6?@B69t4Df$9eE^U3na@Y~`&0jh1&6Qh9`_ ze9T`tjmpr+0e~`?QB`jX*;K+JS% z?ROeJPZ&8CSm7k@W|g1)rgvD{7n#C_=t*s@8CSf?ppm+qMBDNjlUYJGON=K zT}tQwxnIs-ID4zbJ5LJP`O8S>!MmNmYqIkSqkE-#ntG+E(a9t;s+&pfc~Ubd7aO=# z|43Jtt-t=sRLx~ohgMmDt*~t^d=jElJxMJzaO_<}x{zP%Y5dIxP3d-p*TlktP2~8Sm_idfX<`aZ@LAuh%;e5KA=w1f2>mDn`Sytd1DVQ8 zJCH3;B&wNL5f1YS-AayaWg5lXDV}DE^K9`Tice5Hh+>U*zi#QBXR$(N`5qBU_l!`k zM>M6I`&6QYxm(YxyEUb23ZZXO#z4oL&1b?p1zF>o=@fBT91lYk{ zZ~c3sbTx}tO%0`62K=eKw~)%iOywW^l`jA|D$fC)!7VR+LbtqvSGMJuRDK#Jf|3UX zVowVM9@G$fi^_6hUIo~OJ&`Nb&J>lU4CwqTfWJ)x;*EK4jD^p@k_glUK7%?i=7@S4xQ`G|s(32S1e8@H`V6N* zn?zZ}5v79xJ;`loo!ij5_B1pT!S4hvB5idlu60DQ$={+=nYU9>tyjlrJO(F#6>UMB z#qw*p{8}QvmdUTB@@uL5S|-1i$gkz{Yq9)VA-@*Mua)v^q5S$(el2LL2mEzR@R2wM ziJ5>?ZNaWV&-_!Fc^`*du5c!8l7ywqDxKyeaA9BB2H658&82B^4Zm-t_0qy~u$69= zt#qy4O0#$c!fz{$)L}-O9D&r%(!m{nO!@|o-Je4OPl5WE9qHR+_rd57T5C-CGPX!e zsi7A0QGpfR?apfudC7F!1EuXESM)?{4WQv}M;>Y%!)vfv)cX);wBJZB#fLvpi!#0N zHNX$Tp>I<))H{S9j#aTXl1rHLfQNbe%7)^h{X&|`Et|*R1m}-jaLcB1&yC1dV_uLH zH?+RL1WI-UqlLFVjyO26Dvn?XVir?znf^LOVVbYdaoM!rmiKbu{~w0o4w%jt@zQp_xKpB99)-JFC*AoG+sd01e@F3~rntX_@=rkdHK6Z99)|F#sCa<)#a5La*f?hPjlNOEw zu!kU%qj+-@(rbVaAT5+6<@dpm=%$7HJi+#$!C_=26(QMC07Tax^Hp%yOZb$oR`SZq z^fFE5Q-xIixs$Hk4-nbP-vS+4UQJ1G%QH;n9sbIrsC*ZLqolqZnE}$m-c)A5eTuu% zLP0F*4gu`Jb@!+0x)XF=xo6wD9~M$~g{iwt>H-LK~f?=2b27%&4JqB+Zp&#tI`kX>8)6-$$#D%V#2r zJkUm%y_n!bZbMB=Q)YFuXU*3HE~FbZ90&Bm&zf&w%k!T#iv#6~GdTKXvilfUzRAA# zS3TK%S6^hZD+4CuokhzlNb)XK(npT#%90O3%}S9ZRSZ+>PelIcBZyp>?6z?glf}T- zxhI)x``@{SWvSiIC8&uN^W?A8SVM9>Q-dh8ku3Q0?8Bd4&Nbhk@xC{22R{!9`-wnS zVc2%61(lMWhiLuYWb<}?O5odn1-%`f@9pHu@%g^ZZQ=Dx%d;!zZ+Tk_uVuK()m0+0 zFoVca^O`4#IO3-Y*w#Hl_VaKF?{J8)O~Mb2YRxyV5u8dxqW6{VJcY8A<}^6gBEfvH zyIj2c0d*fyQ?Gy^2zUs>kzR?e>V{{ioJ9X{dvBxH}&xMy|=Q3bjCADGL|#$bH8Vb1fDpj%FrvIgQ*$;`B49$!4b{1 z)={G|GT|SR;SMhN4kBLrgHRAd-?j-l=NMKq;A&!K;rlF$Fth&`3(hL`zg{p|D)Y_v(xhHLY9i2hjI0{WjSXTuYFy5za%ReTncdt)VU;a^x3|G|gM24R{ny9ktq^VD6mz~nDu5dC1M0el+DNzlro2I`1 zla@fus!L`$n3Iiv(sHa7b>U=;L~Y@pv>bjBFA)-_|8K^xoZCaD>wjbRC{ z6z=FF`M*I5H-(p0_?7brOjrU;*dwO3gf!dLjDnvX^ndmypMA$?Z<^0WkS$(D{O!Yf z#P8}y;bgvexIpLgd1*Ue{&1pNTrW*6e^_^Z(6%y);zJaVGR1u?l+OX>zCigL6NeOh zUPm|?EkX*AqfL2K%hA4J(fo3>bfEt%!ZJV=EOPqlPg*=QjaOQZmIL@;TzA#=K$kBcPKy>{fUj=u)f=}scDX*-w z>jP8yL?M-Xo62c`$W}fEbZGfgN`hOS^{{SvtH1I%DkC8Ko|0h6*Q-=Uj&`A*2*gG2 zDTqbgfq*@@?qSFRb;n*Wb%m3$b!Qe*_cK#>k<^8gk(!)$AIr{K`)Il-UzT4FSF`w! zS#qt}czrzgsXtJjqBog^BpQgZBZEBg3V5Qn4%|*p^UV zNt&EKgnA1TV~AIxBjQ_7yS_S4KIw4Y?}$k!fVDm+-foNP{534=BEY{=VqL+mIMhy( zY{W>giSJ8h=q3kukt4sd8blClG1WQT5sD@@A7Nr@GAJ5`DPj>8@TBi{gtQa-(Oi-X zG9ef3^`60%dC76fZ=kwh;H8YEcNEC17U>^%Kdq#1?-*qzvLl)d!3J zDi{)8lSyi^O87r?jNo)wkIQ};S+iy2kfB`Vbz|V`dq!lD6*-L`S~voapv2y-nmS0p zA2~lq11j^J{)^Aj>{b$+mW7FzJX+=We#uLcP_vTSBgsV8_mtj}q+2cN$={v(xiFFo zDihpOPJlseIRPTtATA`(WcwtiAqZbG$w}bx$MzCvC{&J|csLIUB#QzZW=_0+a>)i7 zD`CYp5&T%^(k*NOW*|d!*>Iqh{TUzH4QWhwrY0sCcgDYIXWFre!1>;3WtL1xW< z$-BJUC9hOO{8-f`!)%#Rsh7NE{!ql0NsBUD=Erv4mZ=379%Hx6*|x!3##@mSYy-qn z-JNQ0X_Q|@#NR-a|Jauwvl`7qbDzM5Gt2ASgSA;DIj2%kxBt2s;h0mmJ-|JbewQrp7??q`?E)ghD!iq8;p* zC{$u*iFhsCsfC7UQ%8+p^Gl?F!Ly1pA=Al_6VwtYTeOBbR!=aiq9cNnR31eWeS;nd?E?{j5edyz#G}Y z>g@fNh@eU~?J(xF(Zg7V;9pjFVH-WIO|B}$Yw`zo3D3FH z%8+Rp3A`-f5i{_N3c&z5Y4*`e`s_W<*(-L98Lj1GGAGY;8j1m-9nD^YZ$ky&y1_Bx zGzNOT>>R>S0HhH0g z9_C=zSJoS5e^>T?fEW-OrgQu%5m}IJM%gmQmA89ePHWtZ zdJ{;|(vR??W{Ect+|#fu-Y}QB6U;1ud53g%fC<7NWwy?hY=PTiapoB6+^K4_bEMrn z6>2g4>mKzF`4x|B#rt)Kf=RBX>ZM{%>i$Yl_et3;GCHE_R#W(gG*p=S-J{Ut&_Fzo zSm@m`Qoa;R9SjWbR5cj*1tZ;`5SMG>5qQJi>8h%RiK*DM z(*^D@7r4W<*76#I(EcrZ*lgK1?3Vq(G&runmK{ObcYU+nQCg3Lth}i2DpYdn91%sR z3}&&xuC>v@D?QQGQLK-&-yZ0kp?C0@$ap=g+|KC`#3*D4wykl7A|5S35q~bL*@-C2 zejl(6F71*r>3P6IPKr7z64p^jfq#|@TbgYv6dl5}5)Bx5vf9-(c<`R?s()5Mtr=Nm zwLevp0x*R{%Y_I3L zuVku8#_7%Xi2G5R`%$`P6rrVNO;6+51EkVj=Ft1Hulwa;_seNscZW=OGYfRL#U&PF zAQt-c;V>NDP1ZirzxKz>`8~G4`8~Rn#lfwm^cmYs&11B3rsh9hYw6>acocRLZ<$G) zC@_g_E>e#&NL@jlv1HWDeu%;7GX*eulY3;03j+}a*ymr;oZHLn^S{WM`|M@*`a(E! z0smX&3}?RkIm?-A#^xWe2;S-#zsGBpeR3R9s#y;8x52X+#NS;)u~f{@%wG-OC9vc(Vyto17k z^&NB~UK?^Joj`KNfIDe6BZ}v?kgTr-c0k#h!Upu^wGhnf`&jy8l~SE52aqYms{SPM z@Da-Ur?TRY6{}w3S-elq_QZ%;(MWzV;M*l@u2~A~T#J<%M{T_0!L>s!!RBAUTzz*`4>H zWM`Mz?h(V$?b2d`D$f2FcA}xeEJ$C5IB4ZEGz^0~IQFer;mL_K?I}%XPgDzLAa_@_ z%@68jn;%%zfWI*VK3`P^e8CL(y@CV2;DX?oJK)KeGT_h6fJfQ^A20)+>khc!ve!`K zlwW@4?YD8nw$zNoCW+W8@LEPSu>rd%ygtH85O~eOicsLS8Y58%;g;&b@S5am_SSW? z&9A~qQr`}66!=r%Y9K{kjx8R|Y^xdE%nH0E^eCryx6P1~+A>}RTA7G_Ag!FbD!7&Y z*VtALbn%~eA0uP0^VKg*cRqIiOm`;c=rY}n#y4S|>zg3ZtlFNvv9N~i;X_HhEYSQe zOr~qB(}Jfv4iiZRdbURJK!0$dc8-9|x|z|U#*{l%AyE7NuezD3u13>a+W{`ra$Tss zUo_OdG*DYq0BX4|h752qWavfabjr+WVu3l$NARhaaE=6-7BUR8aZsl9OTh2{R}K7K zR~z7G7zOTmce;h4`ecyI6%~8n7=i0^*(g;Wf7@ED2uJaCk3e0p7bL|%GQY%LaIu7u zA$o0S@S1!X;vG!+PUf=S$;?t-&J+2SP*1u{u%KU%F1rVEVbWzm!@)>RMY{aY!1Gvg z0_gMj`<_Lf$K?y1b#Ko1%Pk|+Y{;q**pShN4_S)D_Y$XFn1oQKy%oMmrd{2e_Eivh z;$!M*PwQ3Wv}X`irxq?w9K|I-7tOd`_mIB)&L@@}7_y$sPTE+_!>@t3M;GzU7ew*n zo0(z3-|Q^9p8=+ypS^xSURUV02UITE*PP(Q1og^KOSv^iw&iI;mu3-IEvS5;l)o8R z?l%6tqxT6H38zY5r$#5I%B@a~&Q8fYgXX*O7wQF!>jB$9qA_`xl(Y2%0Xe ze0yL!?s#7(vJd;Zz<6)B;|&qadyVF^-us8)yLMDHeAiU{TvF|> z>T)pw4IeJ7;g2aSq~R~0HVsdSHx2L9&n4B&c(-A9WFyvUqGRP%n;w<3fVB2#nKc2M ziE@TZb>(hO1z4Cxb9yC+R%-5A@Vhdn)Ms;$zX&Z`8xo9mJ80NY;}MVA6XpV~hH$Z& z(@S5Oj;$pEnn;g_&LKArH=dd6LgNoC;Mv_}g zlaXl6u`Fvc%6X)t{>SY}(#-9bZy$yoS{sr~Ii4FbMp~b|E+hf3qS?KCk7=X(+3N@+ zthZNTmUS;&3zv4PzDH3B(glgmFg zkXyf|0OZyYVV_N2bYp|=)~k?vt7&TF-Fgjvx;1zS-b&QwL=}iwQaLyMyDt=&+@*u$f0&5s;q$vNJCYUC=F9r{B%XQmWI03!G$E+FDlP5`R)GD@othn+ z*(CUS`C${g>+rh#pxgC7gDd2Ws@}b{udpP@) z?O|lKz#j6J7@^?kr7Up%yYKj=E>doEzg?d1+t2K`D+_*`xy=1`*^{>4O*piG(90GZ zgkHMLBJ`5Q2BCW|w+MZH5zAi>*e@fkGI#UE2BX(39Yb5>UUc{oY~z}Sr*8|!nPYcooEd++U6#U@ zekMyF+h0fW4)dlp$zAbvPg}@m$D0)wp+VOYWWL6Emm^&7k#hkX>E@sXmvzXtyi#ftB=B(v#Vribm+{5BwPqxTi%;Nm)9A!`rqM0gw$bVHOr!g=3pAR$!fkZG z6SmO-H8ns7EHnW9X$1fkJ#znrz1ZFe@7ITbLWuBF?v^Heg9^Qp-cYhZqO@ecD*=jT&u=}GVktAlYs!k~_?P{?{rXlU1CLyBFGl~i-l(0^PkY^IlEUPD8KRyETH^Xi7d z$K>}7wb@oQ-fm*HwYr(#hQ$Ye`%yh>!;&hJW(+;gH+{1Dp;%k(oA~S&HyJZMpp}u@EsS6M9=!dUgOzO(R1pTnb zycwq-a$ij9&YQRN!?!OcsS>F?zOElnnu`7P!|4~3oVvGTVQ0GD*N9VR{5`nt1L;P| zQ}}3^uD8T=wMaj#coC2OFYif2#?MSfM(Y`>aj8k#h-VyHnJcbGNZi?1PeWYu%uKd| zdIPiiy2yUm0gbdi(wwC~!n4BwUT9<>e*SJPVHZ0v*A&JlOFs10i!AvkG+kf|PEW|k zuq{M64U_+6f}dea$MTb+PZOB;f=7yG*v6yW&d=np!NQh7EvpwyPd+uXj>1jV;@P(` z;F-tdPcR>TSK!0*^(}&aFTv^rUhl+dF5&wJ^__5719K%j`XHnOX>S9j!G$oB2tPn? zR0H9j4-pQC>)<%v8FuSS-okCoX%NggZ=+FKS<`?`HTOZwHhqua z?&l8r4XUx<`K=sd{U*(+{^bfpc(Bp3i9`tt) z=t0lEfkCf-zz%x(4R+8Tb2ORUQ9`HH>XsIgtIHL()#nit2)eV7=t064E=$r&y5Xka zt-k*T+umz0+V);AOMCi+=uey~<}l>OU~O{tjrOA{FW8Tc%12tXAIM1#Co~d+*iE=2 z8N_%ZR?%MGjlqN1>`rQ|JE>DLDgPNf%nbiDF^TeX9mCy`d}&7FUVJ8`1YUeLnU1q= z4F3G2`}rxiZNm!JY%0)+o*ZDH3e6g4%>?ST-g? zC{0zwILT0zu>{=$#kST5t}j7M9@23Aw!VdHVdwZn4roh6T=B(%ayq_u6Q>e@uI8&* z#;NT4Ygs3DwSh6T+>`#DB9CEs{)mlEcpoEObKLgUBl5d8N}UKryw?yh`L*dzMF=LQ zJR#WDY6vV3gWp+<$TA$`K{C8+In4j22KG6j9GM`-&X+OD6eIC}#U)#THZm=w_~_S@ z_$zw$oWN(!&TB9j4iiqPv|1IGt=WXRUB#BU96SjwI3sW~(zfJTp%95xJyXQ0Jar;R zTrZN=Q6kypv$}FdaS<%WLG}q2TICSeN%{P)Vm1xjPdTJ+)2`zl;3psy#Z3E37Os-Q zK(E?U45FsGSH7sE8jukYE?_;`4)Z90vd-_3zztUbzv`>w^$4z!F>o5JGxML@f<^0SCs$Gs zAHn6D2cEXS1C#>BT|kp2l72lLf72{VJMkVxdk2)LNkR&}6I?tAqKFR)MVu1qCyCxE zJR3`e(oqq&JLTF-ruQ3T4bpg4;D~Z7N)D#7;l4Vts%f@J&*kcOHvuG^2eK6ctJ)mO zlr)o)hqBcYE{GH%4)TiR&d7IMc)jmLz*HBrHj3_-5C4>{7Mh!-h(I2cqQ|n86*h=W z$So2{3Fb;7(;(DDrt@&N644PwBII$4KB1^8j1xsd+9)0>)p$xH^&^r zRCba$Wluqz!}!1AQ+G;}O$Ru>cpbcBI@lH10mMtVg1rSg$VTPlLh3-UpzvX@rT0wX zP6{9K3MZSwZ}JsRGKG66)XSjT%rJ$y6h7pAKGqZ-%vW=iDg2hgKYBGsn8KqJ`iC^k z6duo4IK&j5pfJh%{0&ohl0yG92bjXs6iU$Xn+8kJai;=M>1*Dc=Z${`y-i_npH!de zR9MYzxQB-BtGZ~l)6n0-Pv*_*y!n$iihr5HK@|FDmS+mn^A&z?3WwWI z-`whdv){ZKZ{OVMf3w@Xkp$W@(Z>EaJI$N-c;g4_4pTV2U_)EXn^^@L+F;(yv2Pmr zyI5`B%(rju^1oSW-Ym9n68&$Mm^Ulzo7??wvdo)o`{p+Pn~%*K&f$P1{>T(=q|m>R zvrOTZe1(~&Fo(i>yak(P3csN60k7~~Q}`8y?B#5H%7!@2ssX=THMxi0th?adG$Za& zgFU{`uu77a=*ONB;-^wprAw+9iqvsDw`_^Y7BjkpxZcOALmllw?X_|S7Se9{Y}LC* zifs4Z%F++L%g(>75wb6ZnwaXsv!<}WEmWsp#!ZbNA2_t-zb<@M#cMy4wl6I}zciIo zC3wPbz!K{TuXZQAz@6}??t~ZE^f#vT5^zC90YyaQ`&ail_nx~1a0X_+dGGPloO}9oS5;ScS65e8S95ojD@3!@Jw)w5 zynjk?2v@w{O}q%0AQ3qv`VcaWQ7Q2_$oGXO-(4iJB>0jfGxDygR8wuz9#7H~l30*^ zMUqGfRa#^iwKp}IQSTC>)zt2AFPc;KhR3&Zn)6^Un$xD(=A1vIjQ56WTfOMoO(mc~ zs5w8q!Zhc-7kQ=kt}9ISW|J7M-VU2M$4OM%uP{{3zbLv5K4S`MD)VgfjO=2>1t4b51%i75Pv2}e0W!}x{xu_vF<2d?WG*hZ^&}^<|`@&4w!ChBb z>OQ&as)^cx4^wmd;xOeSKA)}1hskw~jOzAGWk_ z9w`_f=6rxD~DT*FD5$}R}ObEzR2BIa?RBzNfzV1H%DXKkAHxN>0N5> ziDw>X#)Gv&U5U`LH<+r5m< zwfbSW=~?4BF%v0*wt&b(dX^;}lfY^AR|)5;&A1||)h^w<^*9Vzd!_r8#P+GRT*&3h zvjVl`Mi~X_4KC&jPdSg@XlUF>Vpx4Cw~19GhLxvBZQ^DUe-n~@581>mBwij$yx%5n zBQZP+&b5gjkr+mFpH19JqHt2py3xp%Pq<7Vk}Xq`!)%f3Uuqt3>!JsJSUG*nj`X(} z>5`}x{n=o9*B#!W9=nMC6CpVMj%!|Io_elRwBR`8k&)>8N2$lHk$w1#8vF3<$c&EI zrF(>mbaJ~+jD(zAJIq$O6tH7d&hxmqCn;ed_w~fy<1Ke`4gLGCtoPVg;sqmx_@<+(tK+n~aiFmWMN=$bvn>KWvRClHPst>c~Q+#er>?rp8{1~~*N6Hy5WH&3meq6zlrXKfIAU9Lg zuX43tBFd73C9!%Fcw+f;fo)|YO)j5M%SM%92CAbzP7*Uv166%9dlz#!?XcaKD^JvBQXS)I)_ zQJo8KEF3y`aIiBMqy@>_xv*bPE`OK2XNEuZ9#GWBBn~{M%bD_RNSDsN`UeXWLJ0Z~ zGI``yE4gJat9OEJk>HI(@(Z*2$+c8&Ui*z}wF-lM_(Jm}z%;|+p4<}8y5EPr&R&TF zrv^ycCOolHQ&k4HFT&`cns9B7R%~9LCi{%rxr(#p@AN4{byF5^h48-v6U4`SAxwPB zKk8EkV{EB|S@2QLUDZYlJPos8>D8i?sKcl2<)qHl0e)ojG;ZI;9kI^z)eR@>v`=;V zT3vsVZrDfH@28tQuNy4Da(z{)Ik?@LJv@wnM1pNxt%)kpv{F6Zvp~Jsx>%=~9mf z6E<8M;75Vx3g3&_nIQJYwYgHAr`k%BC17esTbP@cvkV`E|qI@o%b^5o&9h!(BRh=J1G_NOl~N7Mb0d3hYkES8VvHD z7KXk`-0Y{RHBX`HnRfIPI?h@+B!i+2!DMC-vHG(%#Q}bB?hx+oZbP-}Kx-zE9=qr8 zUd+=(#QUNRY7UjWi#XOusju7Qu%lB!FQ8I)atwu??)`0wX?u$8Z&SfDOGr7;2BIhM zogwvIn=)PRx4JeRO`>7LnuFpXKE8XgbfzN`P<{;Q&~XUpnTh}%DXOVl{T(E96u2Q`G{wXOkxZI9ceJ-(woZZqw{PgBWB!m<6f749&tP$sRQQ*K}_cr9umjF{Ax z2H}EIy7p(}Y_Dd}GM(tIoJR;Sp3bo?w38N^MGNhug=W!0J82>NUgo@06B6)NpoMIX z3VG5(O&bU}fgJe#|s7dg22Koy!1mWdM+J{lRx?MpsRiqa`M?`KC zUX_mj^fjoh@MnEH2|D&9Ez4%cn+z~S0=ndI-R3IYl)IJD-&*;v)@>fswLZ~lB?vXL zQrR~$ve`dKk(#UFrNsZ~A)P|K){L&b6uAeq_07tG%x}o`8H~vHIfmIIh$vRuGIBUdG#7}e%tINhl&I@{Jxu4U&JckTr25?fl&kLUQL1af z@C^7hqX+8@^x$y;5jJJWAAArF;x%!e%0GSpDFnDv- z=XqKDF6Nmn%`rWYgMUC!?apIo5F!IrZ0+Q#&p1y8p1Ud3g<*23ADQ!69(S=b69=fw zcH+HLdLH=N(g>&cI}@?ESYL*ZcCIF7Q(HeZ-Iiyrvwt+etg;ETkAkbY9|`_;o@}#V zl?^bEHs%o}Kaj&S3-O^A3HZ12%H;dwfh>B;8+r5ya!A%J5!*`wbm9$p#_@SsfM%?O zcv|K=naXavIv^~6u`NxFxREY3OMcU_h5APV{C=0ZlfGPjug-&A;94Ij(~Zvor$zmi zaCi~5tP8o&-HdsmoI1$wmi{@!NdjjxOhSPIxGS5RkL5AxvCSO_!cgj$8B}w@L!Rvd zYYrTh4in&(Y3VQ&??8kg7%AOT0n_U4J1iPaO#rC?gg#N4tk7t__f z*g#Q|nZv5f6kl-*#iLNtVV4t0r-fQ`OO+7~b^Vh(Na+TAhRN4uNi&SgG!wM?o*NO6 zOXD+Xm4nxn%9xyxxmUMi{GIJD(#`1V2d;zp$b-x*l8e=TN|;evN@``~D9w%>rChq` z@5BUSN3ORzr{buVAgRe4qhr0(Q5q|VMLW*S7F z2&igO5O$9sbXusn*rj6GUq|gqsKnc#D0weCwe>)}u?M4RK}OaB-QZQN7BjqvcYzFC zk|BdiVqYK@GZ<{^dlZZGdp?8f>u=D_)@VH}xrip{!8K?ZIeV*_#d{R+Gm9tc#fuq| z5Oki&@`L%_WM<+e3p2mTg68pJMlr9XRr0f(?WL7HAJTv zMz1r|<^!34+HxJ^AH8C7W}pbK2f_hex7P}dfIpaAP>kTfKG3$HQX~jJWNJ(|80p z>VawFemve=s%bvP$697yBQl*DucXE=wk;?Z`N0wVq%M}!J?+R}iYh`Ie=YjrWR!9G^>i{Ak$0Oi|oEN1Pdc>?TvXn$VtMbAa>1)NxXK=A8ZfZplpC z9*t5i`fY&hPHq^?ReQS;qVCT2fnX^L@7``%@|$NB&m5k)&U=~j4*$u(4BoBSNs-c` zPLWpzd};dtLa0=CA;h=EKNUh-=IaJiIHhloA(VFu2w@H&M#-J+3;em#d-rxLH{i1Q z<&r{UTAG5+)6hg?S}JKweuzw%C4}w73tT$P?DkbMlvFj>7q!BT3nJ1PdOM(rfi|Z- z+tjbj7Pa7AsiT)H1#Hd_F>UErb+%N+1%`yg{hP;H``OzH~&(D4;r4*))O z8tW>_2ICjwd)_2d*Xs&*OLNr*;qDSRx}n=%c^WQnplUX)if0bra-H`w=N&GS0Rab> zZ4QAVTqdtn^*L$Zm%AmGO4BcKxwirCNw#dVxhUYC#T9g(1{d7hKpXR=On#td(ritV z842sV8Kv?m>gQ7#rM6-qS>7JyXEpo*`-=8C7*p%{cjz?w$@NFTq9e#t%uF*Y3yc1O<~snq`V zmAds5{IZ}N;NJ?s+ij)3YhSFJjzK=~i8>x^Uy$6$kXhA@mCIs6qWeVI_>s)L_ZF}yuE{k z`7P)38G#ci)u;$$;seY?y|1g$6z}W+v3tpa%$w4oSf4T)IoLHiP+(f?QO1m0NqDfJ1D9md zs#TUzNUxf9RTe*T z<%zbbKI=#e&$vofY9tqs#0rm3ZPC_wZS3dn+^e!JvbW_JY`GacD71TU&P+Rt(Qp;U zD7v}OHR&qD5e9rXEB*6;e4D^_oaqxBaSzjM&Sl~UWNE&Qde>n>)wfqU7q^=^+7#Y=I)daO?tlc*meZ-t1Ap0T5p79eR6igJ^Ol5c*Guch@i6IA zHt`#z($5J%E?V$ct>JztS>nNhmiy_bCr-2o*W@(>sPcUr`p7;UG|rt6sNGAc9>V7k3|Eo#q=*d z|4c+x>QQde zvq^Vh((^6Cpz}1q>G_9xR7pyi{E!J_JY+X4)Ea}*0a*r2$OtA=sc+G`Z?`J_x2W{D zqtbsXD*f%$;#*XD`$QYP9hKf@X1*aymiwukA33~!+e6gR+tKNR{FVYaP62reL^I(~ zw3OedqZANhHeE17RB~sBp|QyQBQt2_vNk@QT!g5uQXgVyqkr6w$t(fWXm?q4s>e8J zRi_a1Lib7;+6(!ZhFnc?m9e+F(;AD~ST*6T?pg9%z16*nCo$Q(=Q{6Y&O5C@2J8>r zi=7lHEv-Oa8P$t1%(P@wpU#!VnDC%yNgE6R`8q|Eu`F@+pW9vfh6@K>Y*8Dh?cVCn z-XGAif#y;|+gXx=&eM=Y+gT!MJAMd*o(FS^SX*C$5A?a^;FTV|x;sR#Y{PJWMV~@1 zZ9so+f+ViTx0Tk0xf-rC5bdiqZ7$?t*?Fan?dH!?FC^Jo0JM2Urx@)ky~<`|ByE7d z^)hveqkSzFcD?}%7kA$)PosS;rZP6Iif0bra-H`w=N$^k0QX?4%^^^Pt>l$?c(dI8 z_;7c$FF5yx%df@oOR{B?%|!vfEUuvQG`Qf`Vj7h%W%2_f2;8bC+SejXvPim()X%5V zP;R9DOr`IO4fjFp!tb{+%diK#7x0ri1-jGm-=~HTb`Q!E)hGE0PbpyAQj7rdqTrak zXj}kdDd6)bo=!grVJY`B6dvqeDW9E^@)R606a@TqPxb(|w+Fk+m_QVbcQ$|+(7QSW@U!7R7WZAtL{@*t=QR%-LZ}V*)P9mpZuYP zoretVKdfiaZZIaCj2+1n3{$|JU^)|Gm=lNJLk15RaGZFB#50HH7Y;5O+B^TuKK+NX zm+NfC_Q@~oJ+%Lj;NYQo!JfSatY(Bps>QP2p``dc`DjurG(05o@-ppQI%pvEL)ZVt#WuVi_*FxXsZ%XbB}+PK5mDoBrGJyy9t3|dyFl4NU2CpROTH43*AS`k_^67EpJOG8XO6K#_JO+A*2Q@I?X_zu62^ZH7GwOn_4;4k&Zi!JJXmqB}z; zm6L5G)vrJ_Eh2upYi)Sv+DxSrjcedZ?Cx@Vvel;XzHx&Pqa!GEPZHTaR8NKqptdk*cJH>_vg z0DNGOo#KeZWhN{D_^0aP-IJR9dtIAh(vW?4m8%G+o`f(#to+rCi{=<|W$y+@hJY%- z;O|UjSRqwQGB4k z60=0N__gTLtyLB6PdOyU;g(_~ySTeh z=sqb#;x5L(DgFXAlRPMDWT$ws+0FsuF2;PvOtBR))QxTOiv*O|yBG(pG4b%V!9GL7 zL;(lhLnPH%E8|v%L^~X9%kh8F-1>)eO9F{z7AWyy$eLpc9vVqO2Kyu*43Mdap)(oR zta>Oil}1lmaC~}_opKA0bDlnK&nlyH&`;zk9Xv08(6IhP2M@A(m+A6uigBz;usZ_M zc}~%Fu4f7@H9FrpMhr~&-zWy$mNCo<4jy9l+JQxdIJlwGIto(ftStHO?^c&QO;pe) zZ)pCYqJh2ghuUEtQl-#|pu!#HxcQltzG@Jr zJ~ulPn$Jya9!exwye8HeV&O7BrgoOIQ~Q>b_|>(=vgA8Guu%IJ`qiHUOx)_!Kw>go z9H1c@RF-eyLdg>g`8*4mbKn$RCDWgTYiZ|KME1w4vD9zy{DG;BBX}MVt{5YNi)ee7 z=#;ZRO3B2VHGusmoCfMT3M&$@R0mm+-)ayRf07Sqi&Oy9P224^y%JB`G zc=L^E@RK4GL?WDM7tVydU)|6@Xl0A-w5;fG;&eSX#XnOk>2QCZ!-_oBmzYW?dVx$y z30sbjN$zMo8RVZ}m;&wuH=SMY9j_2F63e?7kJ8UXfe<1kUta$~{e%5`4v^)RJ0rw# zybXz>yu5;+j9ib0fe0LB3wf*UQXTqD{tvUZ24CrK3!S4e>G%l^UDDs0yKNOS}x9N`@J% zUCFRJUWNmb;Wi85V7v?^a){uEk)~JQ>Wf3{}xk=I}+n?a+YMMzQv%pFJ6YnB*Qy6(?LUdybKkR;bjZq z`FI&#kqpajF>SFnUWO{k@Tf)cZoCX1NrwA4VGIq`@iOd@45b#u*YPs^C>h3B6r)v$ z4^2bkZKCq&M(CRRMidB^JLBb=XmQ<$KQ4xj}iOxsk&%Tw(TJ<}rlI9{H;PM%2?*EiujVSU?DNxnHI({7t-MmSTL>Ur$=3LCfDJP(BPghksENwmd=n@x{e8qQ#J?j9ncmM2*q zDncMuN~vco*jK})!eHN#43BYd8_l;VUWOf#VfM|YU3SLHuwODvycru6Aij;4W30@r zhi)=0G7g($qAVA@Vw){LwkK{fMBL?M_=CvygrD*EIQ9YDDKDXCufandt1(|F^U76VGJD?ku?MHmb+*s-Ou!b=#nDaPRB$gN1oT!Ttl}u$NH~oDBr| z*0WEaq3Ei7p<%;&2mJ@Jy)ZNw-ac?Q75HF^c=i>{W`vXO!imLje$=P_gU&aQY;w=u zz4M0zo%3s`ED;+Sg+22MdJgPA;KndHQSdF02>m#zw!7M`c#?_ffXvT&`$5F z)vfxRxmtA_tIxwLqu*HFaI8*7$$f@9bHsl4dIF~ECq^aq@aaBcj%Uk$s_rvXH{77F zU=K9IKUH5bR0pPU^yVgXZ`=!1YPs&C{#M4XdW2UqP!;NXwr7%&Uqa4Q@GHfU8+Pomga? zHT{VjpS}7I>SOJ8ab=k+m?DLQksq-_g5-pxBv&x7zj%%W%&Nu4nT&an47C{~DYECp zP#R)JNF#dWKx2h!9DR&$ee?9X5$&e^fN&jGs z?dREXwv--UlcDXzb_jb|`2@p^-=pIg1Pgi(V)MysQ={S`Q`_Jn`Gb0jCM1S7;}I!_ zd_|1P2C0c1n$t@PRL^qRuQ(eyt-1TtuYQe1g)JX6IXTOVdk=3NoHyKU*-O6w^9cup zyK24DWXAw{DJ}5}@z5mn8An@xtGl$~q){$`)QoE^(Xe&e3R8q`DYuFsPG1*M`GmEk zyy4hKFE!1Uc6{P04m<40?~`JsIKeG!tTqXSHx3-of6(=&jl2yPZ6ggE<%z5v1AWzV@e_aE(!vOP@bgW$hUha7l4PCh@OI}&*$jWsKG)}wSZ zq&p5W-H|iUPItW6C?Ko;zv_-uF@MmBZj_VK#!ZdvNdt?-rK+K9ETh&8C{~Sg)Br;VTCdR29QuN!zF1!R~wb8Q?kqf<{pjnK|^c!`*fbJZ`ownVmQ zIeBz(KjI=51}S75K_!B6g59MB!g}%kx`|_u7V8dq2KuwJqNTL>XVPRfBK-fzOGJp*zpc@tH zlpA%kWGKE>j8;D+RI`sw?27=-WC2`G)sIjlr>IVmNfKE&n!P20s z7t6M(;%4^c$Z9c)&6nRF;ERkjz27I^&OzLi#Y>M*koLjIZ25tUt-oJM$y!4zrZZol zWT#FWD_ee8=O7Cw=M0PpElSlPiA)JPY;MH#EY-fw)`k|6;cVQi)QgP)t=LS{@mFpq zSd#rqrK7XLj8e=(Q)Ph|f(r{>N#hwbtU9t%6Wcb%yb+*Ri;YtPNc_zlq;1OjcrA+& zHm*&io{ZdXx*p9!0!OiE!PDp~xvb7R5%Xm@M^b_k7A8$RAOGZzd=_uzp82M;>Is(FpmOo7Y?Zqv(eSM#P-L@v8B*%i6&RAJ<>YwWXAMO@Jw zkvK?}xn@#`NFF%2kDU}EQr*cWBGH{}A`%A|6vP5$1`3_Kh{)}knj+FeQ}z%0H$uMDPCNsV zhhY6vg*r>(?fglO@S;X$>;zUCNoE2iV# z#FA*0rF!SeX`kPtM)c0&mz>{WW@sH0OzP5PG#Ku8Ao^zxPZL}4BfRD{M?A_vR3D!X zUQ^H}W*!|^`7v>ANDySxK=wJvrV(lZouWk*N{?(Nwl`MCyd0I8qw>rVmJZ1cO_%?r znfO!x$9MT-O#C6EBeLEj+L-m*q~4{Q|G}8a1{yP2GgRV!#!S{YY$h{YtR0t&$C%^f zGgihv{Rf}mdG6%x|0Q65>p3vrOqEnQq&<1;55h*wwC=iG%-;KsX7)bEFi;;K16|jJ z6Ren;CH4u1Y4-^{){G)E@gI|QEnU_%HRk|sG(E2lJufKd08Vqwvt10^lK$tjZRkMP z06<-9>~P1)wNF{`CnaDNien0j8LcO$vz?T&ZfHMVSDus6(T_nujfS5XrboFl(B#3q zf<9uhG*0Yh+tgYwO;OjHNsESzJ{Uqg@(7JJp0y{WZlm~xtR?&o+k>nfG$P40wU|Ul zIrbJ7k{}LZ!eHFBg13xAPy}pO(~n4WHT{T0kM16k9@2?SYOL-~vYBn55GQw}v^`qL zrgFX1DOhsYI3{=*p$G!1pE*W-3R`M_Md1+-9@Ua5?>S>Ja0?Q7CZ-^PV9;$c$vdCz z08_ACOhMu|#1zam1v`>=gOu@k0Zq)1GlTlPfSit!=rTL7D0$K)#I1ZWIxT=yD(dJ|Ad~eY{0CaM)0vp1 zh_T!{Alj~E#Q976w%Tmi=suNfU?Og%&33oV_L*dZ!vYNse<81t9NrU;&dHX}y|Hx4 z7trq$Kq|FNJj4v0Uq{n9(PsQsGQMcDLFaeTbaLoh;2o4~w1z-~&L8A8vMqm%Yz^Cw zM%&V3d}OB&9^yg(N{^M-$nHCiAPJtHU`v08#S+{ToYMPjX?)k*(w8Ipk`ksc>|^&m zV&v}0ne0x6kIhdzI(334JEJKk^zMh$w-b_QrZHmIG24eGqquW{NsP1`MdWkmnTW*D zj1`gUP8$)4?z9n+=$SSm(nHgRNsXO0OtMogzJ?C*#NB)$b0`nt#j#8YQ zGTArCRlh6aLMJ8+qOudBrvbM6dV~%E^l#1R`Z;G)i&(bHp2M6XKm^qlCf?P>c+>VJ z!XS(IZ1qdCS0VF3V=jJ4pR7}U&!N(1*#KZ?qf#PXEVJ%XY=xM$w_E?)8Q5I)@oU`c z8W1d-5E&A;PQ44HP7wD92j|}d=AAE@8eDJ%zB)- z56Feh^7~;NS}|kn1YR9QNRn3K!J7_WTXSDgV4hCTV5_5=-HS|uZi{DZOWov;a?GB+ zo{J@FMw#sJe3g*fd9uz}N0?XeXe&Rv5KNi5K{XL}5GM|5VDOJ%!hcNbY*h?yXu4B& zH}(>>g`>9|sD}=5R{I3uRhO`p^6^tSdXM0{M>ab?VY7oDCIjY}*_3EC8Ip4e^&$Z@ zNReG9BPr7)*plosRRfIJ~)Q z*u?e=6?;_Z*NGZUME}lGRBC@eN>C4~iKJ|JEb>#7c|f zG+_wR_%X-~bC1_t5i0feB+~BtaaXJ9Lq_0m?!n-n&rVW+&?x z*>1&=}mCVGoQDqu4flgouCCad2qxcf0(o)@6E=W0(5X)e|3*i7?P%Ub^+0B(L6YvZ0 zF~29~vX?cLB>-b&5{FyT9@VLdS2fnPhN1m%=|Nj&!GPL_UjUNgPMK);@*7cAl~AS= ze&qroxO>&QhYcaKW!h9)TM#Q-{7IiLW^ z8)nax0?|W^TjG~K-ldYLH zXBmPQ)orZ=$$JK2iet<=AMNlI{6$W0z|*7|a<{%e@jAdh;ewSzYs6jWl>#q8fq`x! zo7R^La=0LjPPo8+ui|?GN+RmpvHPAxxTIOLv|=#Hz3EII+ZbT~nyx6_idw;kVx5GV zJl^)FBTi%9i=mpcul)U&t-F7kigjXV2fOA^=$ju5S#4u|@DSCZbs~b=BeoIM3257c z=W-~z0i$$~Xcnoeak;KnqSK5L?=uI82>y?QSWCump9<*@t>pZRSaUAcz7Gf$Vcf(d z-0pQ1GTI5KDkCk`C{ymNn z)7yp8A^G`3WrLK(hfyu!FFuSm;uu<_l$>kEFhX)j@1U0^gborn$M_e0j5w2JEJyAT ziw$HP$l9SZ-hM4@GQ)wh#fi+qDgNh4PB+PzP#6x^B5|1&YppeE3mMJ|E77Rim_C5Z z%yKru|Bs2kHzAnM%{7{Ih$3}?7$oD-B*Gb@Bvel%RgTntnGdqsdCsmF)*-}+N(y;= zH;0rZ1}PL`zBn3*0u35J6ywL-Q4WTroa2$)3qwrARL*N}Uh3*^a5LoJqCh#t1`&dQ_fom;+VgLyTR^s*>a{cd-57_ zY&4=5AeIHM_tfa~cEMW-G0uW_8G1__0yCKt)*SY%P)~!Hl=b11CrJVM2En$(F4o?3 zgYbsVS-%~N?GcM@OBmY&7TX75*z+y655p;QEw+yYTbaeS)4{eCX_J&ta(q+uzx8Yo zv!4Cuh;IpInlC{rMYzR^@{qg}qj1Qw!ueJ?=GW|1`YZlbSV_+Ct40A-Pr03@udX{s zH~9m0-k{@^mBmQB8fjLn{@Vl&>>{^c$ZZ(E)U}F8FGH{WC9o=3mvqKZ$cb6>-K2#& zwHK-89$E>B|KzA-%qiwbQ<7@MNUK1|@P46KB^)b*sK0f}?I+ecBF!AL$a5^~P%|*W zI!CQN@e1BS47u?NLWjVKDHT1M=3_bms%(2XqiF^UN358ivskRFhH-VGN<|5#ruchF z*a9~G#68}GEpV(ahKzkq*n$wXDdWlix41 zzriNP^UUQPh?d9((kgaMWLoDV=bYIWdVz^Ay%6gx#Tfi+eVBSB`f>^zTu-3~tYhQk zDP}tsce)yea&a%zkx(}o(KM91 zOr#1V4?@3a%yR(Gbe>!dif|?Pi-~+utomZ{B6yytC(}6?BM`_r6vOfH0x(vcFC43{ zPIn#Y)Tu~cnMiWQ+$6fMYzTD zY7**(6W%uo^}`99O#)jKb=3fx(j2v)E?1*F_J1_tOL_YRVJO(^+{-*A7pUA}_aOJ1 zN**S$1}5SvT@15`PwmG=|4eQS+oThR`AtwBSUX-+wu4q>o8+sqrZPg!I{GM~0_C35 zxLwgVz5aBkuT8WW#edQ2kSBK498hn?}BG*8jViN3^I%%D0mgnJq}h0ZcLwPt)Y zXC~4QcHLrbYrKo$BKJl5fRZI zW+uW*fpNZUhX%NCx>R=x$fl^iNOG1-&LH8N_$}w{xP_HZrl1_sqolwH-4JH9_SsPS zpSbd5(&_y|EuG3C`Fpw>F{X(+9_^Bk{pC}|#(y#81BKbj2Ghih|gW3FlD*AB- zEI+Zvyq_L5NiKv5hg0*~G>q!t%*3H9WQ?IBq!XvfkW5AZ45?K0bJUQ%=5M(%bI@%E z7pMj~NB=95{xTcK)34FZdu#tV>z4-w`>?V&B;3JF0o8;xGh{dPCv(e< zAzMx46I6(}7Ba-6gPccVb3(}Fwsx$BW{CLu450)G>$oG+OM@J?;a*T80w5#$XRD^n zd1B5`T)cp^8W~hG(O7mN!kF#Ld{t{Xt~-+ZPf6S^=7=Wbx*nNFG+XwD#7zVwbA9L( zO_Q&dyk(LXn0~%fLiX4m^cBm^KH2=p;b|t%N3e3}GtE6)>HZ9z)ZaRJv^NG1o%o*4 z*bfCk^%~ZMW-J8Jf*R5V()>(i>!=zOKTTS_&iu+{G1yg~+L=cXSpIVfub-}yle_3z zkL%=dy4Je>1k6i;)>>*fmv8?<*BVTOCKE9aYS;t%NVGWGt&DoZ;E$zp_l{(91V_rH zJ~r!;)Fn)-lWlIch;)Z*bhE$dme=S&Z+7p{w_xc~CIHSg>!#>ru;~@i55_T78W!Ym zjtScfN=OO0nIFa^+GXjTX(CNOLuvh&tp`trPvFV$vpLRP?&H3}!^AllGPtn+4R-kz zY4bMrnJ7;=R$(UDaS(#!4;0Uxua#W1i6sy(>fgTGZ#c$TFLSYGx$n0Z#4Dx z;4b<-c5L5;zmLy|0a>1^_I)rE7pNKh` zjQqEv0B^E@S4xo3qw`^_3t2AVav5>4h-1Q-Lo)YdM37uvPyGlRNXm zL?27)ZF+%WnlsGvByS! zkBfYlMLtK6Z@0+j`f`Tp3obOsFTlJhM6~o@gaT5=?+o4YQun7slrTiyCq(VAMBxh= zLDVCbs4qtzvzsh(iFyN~+{TMgX3c9p!~>dMEreSzh05mUmW zl%yZM?<&VK8dQ@rxx_WV}st~D@B0qv>JrlAg>E( zG1WlzH&LJuS7yHBcSW-4~g&sQMqR(GS+w9B3{+1GeTbdm7d-gQ__X%6kgdl zC=*T0I9sB4*%G)CO{ZDwtNzrdUvimhmZka`U8_tSqHyy-rzgZ2R;oF&aNbVreT;Vx zpnj??x0pDq4@J@Vu%&U&Epce%VgY*8Poa?#kWmt!#>IxlZ-CcWO-iH&uUqn-7V=)T z=(ojQYX?+o8?! zv`kgAo(!muMr0|jYT#*t9?elW!=TZ8=ppRKLUvgP+Ta0RssO&u0$&yd{CNxfy<-Dk6$bvi2l#viOP?KKh(dP=2@V44*l`CmQ?KssGXynb?d@ z^m6AU1baG85~VgL!tZ#<(0qy7S?Da+%r(d~lV{z=0xj;|m9wUay!V)P4sB>*^@_LP z1A45h9Kcvz*<)8?E%RK|SH{Ghrg{}%UkH>%7_xVoDP5wK-6MNGd&F~g3K#ouMCUtn zng+>NirZqYI>-wakJij=pWaf5>`;fXH*lZ_xG21kA zk>GVaO0aC5rKBd$cV>nhyiky9=wV`BddphJACJ;omQqHi-uN>y(wME7XYsCWh^bA> z7SH7%$1VE>6gdnlFZwV|wJp-=*!z~F{vtywG3hi#ST4h>6)kWg6~}D=Wxkl-#XOC2 zC});V$915g{~Y$=(Y2}FG+#OHtX$?2AjNEBO^1&SLGwAV08MZ<3_GB~aiLN?XP3cy znEM*Qnm#6qX8}Oj&y(X+<}6b~6qH3^WD{;9nS81Nn$K)}o#Ej70_{Q3+4)(Z)46Fy z{2VXSjn`@4C1zK|onv>hkkP4+i%T_FcVh%f=>}qah=cm{02ij3YmisTmemUUvauq* zfG>8d{yH6<_jz`05PJvZ>v%k{&yzhYITr)4+;q^Y5D=DmT53P6;cdN3a z##v-BgW^Mu7X@5?7+f91kt-Ko74w?Q?;M`S2mL*^hEgupZ9D14GSSs%yYtQ{^weA; z?={D|s*81?T5A#cT?}oBDY6}t655V=K<+wvp9`75_;8|xVhgIxw-iVPACg}8-Ywbk zL#G7%*FZ7-mD(&sWoouSH(aFCxvTO~ zh0H~f`}#&Gy9Oz*hd}g)(1ySH5ON*xTpAM(!_lvq8JgdF81o2oK-dBnc_Ph=%q83! zy1cVS*eR6Li!uP#Vz@3aJvS-jIk$)}`00(sPER~da}&x2oDLYOPa|4VFlw*0j&#rQ z+5poR7o)t4m_*8Oo4wqG8;XQ~Drs8z-$J2^B2Q>I%)JOotaUg)%Lca=Aj{pBic1O*ejCCK%)?((&_= ziC6l>n@qNO6G(*{pD-)H_L-z4O_uqiLbx`Yz2wyE{WyA>(|Bd_6YHYR>+edzy zpIq$ez+)XKAPztM#E4sWHi(qOMo2qi-y?}de?N)`tElE74_5TFDB+ysYG~W7aPH?3 z&a)Vx^s`SH*&>{0@S19lry-nigv#ZRni0-*(NmFlM4qLyn%jYl->13#!iZ-Cwg{Mz zcy3swlm99*Dogz-TTrll-3on^UB~nS-FOqijx%2prJ$=$c^7elg{-#!Y`^+tmFV8i zA>dMx9unLjb%0zhW~7ifz9wg2VJrNhGL^8kaNah7(^_$apy2%ujP`p<~ z@`;lxwzp~^#5ox}6S<2x7Z=#nBJoqI6op&d^krw=0FVR5i1q`ZaYVZaXhi7|a)r+i z>$+=6!Z!yg$%U#`R3AcJN6?Qah=3#L4(vofCXPIr-|HaqO8n9{1 zH`w2nDPn=0BHl7n1dWsLG)^afKexJT0LEhHTcP*%k(C^vLj3hHKEnr{>7X~VEGgkH z|C>E-ezH`tf$5lV3i}lW`wSjlv&(xzl6FM_*MQ;evWr`>Y7?n@Ax39&nY~$Ym#RJ{ zIC*%c-g=nI~!oWTKLD5#HVxG`_kV zF*{wZhE%WW<^y!&3w8Y^x>jP_W-RH0;@kJvpi0k?yT#Td$gV^MXBld#I;fzkkn_ct z@KU=>pqHxaj1i?R60JMsI>;SymtruQ1*y=(R3S&llTAGRGvgBUUxuKcc?sf*Gjkf` zXSuqgYKLXLvAR|WsLdg06-?~PU1~x?sv)7mjt15ib}T3&`C9yNjyovP)9t4BZVpz+ zsi<*vL`XKGP5wDL^NH25tiMc+3SG>He}bXor>T7>m>nENu*V}jLyv(N8hQ-F$l+#g z=8H^noKm6`M|-9qV%_hxJw$&9*&e(~X!x*!H&w8k?DhbJ_mk(G1IckBWuX0rR!JzX z=5PgvEMkq%2I@~$lL@2DG~>>4nG!~!T)ZV2N~g*h#7fnbNLjc}vi^EbHzr)xG*XML z6(e*<#pyvfetF2j*$g!IiRk34IKHKF|2a*kwbYlIzh|1imKLAtoXn;$5)_7p zx1`HiAvL0t$PNGy7EwoqOR%_?;GVh!MZGE3;@9wXOcq~FQC!5R@(Z1`6>~PZNM0RI z7UR3wD|}a+2_8XvW~qRRYz_l}xPGXoiuVR*rq%r{w^)O01BTeY>iI86;SS>9{&QXL zJ#pQn5$Edk*)ZYMG7df9{7&|-;$=_#eYz=t!d{yVh;&uN27pT4D@SGISBm@^&adxz z-oW!9&l`Du$MYth2XuN1-Sk_X-cmPraHdjUNsvMc5{MmuuWWN=iNeT{9ml_BEAYAwj~zmq@5^8c6)0}qS)i?QBuSBx>XGH zTUf=N!BRL8KXmo(Es5>ntB5hG&;^u#0OPqlf5-EDkmT_E8SlU0c_GhV^UUUX1u|?mmsYMTskQTjFNsAsDaZ+0J zb_LtM9Rc6s|AN^OU!_HFSGGmJVXK}^r}218#I)#_BW#NvF)h0AU*DofoE9BzTXdha z=pD92r#r3%;TD~V=K>4AOJ$VFJ)bA8v2b8uZbpLq$E3;#uWexR4#P zg;68_C7?3$uQMZGA%JVCKZwbvIu?W2Lck##g=&)`aODjghWtqG(=zA1?uYZukVe9J zo6K(U2t&~>uDwz-@%CWotcN;@(iE=PCy-DZ;j;r}o_*O7$PgyT-HO$%O36XV2&zf= z!t7VMx&wjua-FvVp4ps;Qs0oX6(WBkuT=m0aP`A`i-#3oiboVkhKWh^tZ!~Mmn)Yf z$?j~qI(##S-f%5VDrT)yrGB{CT(c3%$#5G_M7xG9$&3W`-|o(M4MP*p*y1#CL5oQn8iUvB!PeSId7@q zPg^>8m)9^&)ab!OBwQp)ejHVq6<%l=AZl}z37F3zO&VpH{RUU>tuJ@1C3n|}uZlNe zCHj);m#v!N(Pa!f&E;adf<&}jBv62$hnPn5jKb3%hk!y-5lV7FUN_@s+|j6n?4)!3 zF-KqiQjCF6or$^jLY*|+glwVTcLpS9j5;v6WSi42$^N#w$$dKY7Z_yB?$-;f#4#~S zywzWVBFLiL=%A}e4_O>#s68r9ozqdK=yVdQTnbU79)_q?*+E)>dI!eWqRScYT&LW7 zamvlM<+enZo9yCaUBG%J!44CBz>6rt%{43jXb8Vq8O6%1QE7^aaq0)rf40>cb8>mvC0 zjt7Hm-6>e+VtBwOmn?3A1eg`(vkB~awe+Es>7kt_YJx{fpuuN8_WnS8Ht(curF8KXL%MIH(L7n z5g+Q>7yAJHwD;ZmWW2&i+;sCvw`D|PM>7XJhK?eWz&pT4op>B{ z-f7?si}p!}WUnk<1%Y%ybhj|o0{?B1J>Q~^K{8FMF}jEvcPvz0NEllb`c%|^ydNusUy z+#D@qrlGcZWlZ(W)oON9j;g*nn`f~+r5VbS$~g3Sv$@c99%vj9^5M;hknKr1Xu6OC zpXT!|-0MEL*~py7!UZ-(7g!Kc;2jE3sV9Zj^*0-FQIX_rEjj_oh>I7|R7G5@;FWe; z0~j+3DxwioMj%*b5xg!4p0EhsaS=G;;t`8ri-X{Pi(tEpU=EC-#%_goM1a4~g8xjw z&#(o*lHa8_+lWR<(PQje*zfLUNgu~#FphGpFn$E^>G)@M3F=b=s@RTz(PEt%O$L}W zR)@B`ez=Ka)0EWs%^-@@UiJM=S&}j#oN|B^7&Xb*w{9}zOxDrlOw}>ue0Gx|XQq_f zbyKODsX6U@lQD$Omb7ZVL(SYUH6L1P=7({AV5xa9obtY<<`IGLuBB#yL(Mhk%dUh* zll>pKD{*2MGyh~~@|rgmoYjTdQTV&P$zv_|tX0GgZ>*bRh7e3u&dAg&(zWI=yX2_b ztYz?fj6V_f?+aCx>pvm=B^G za5*;KF<9U@e8eKE9(UDJweRe*{&v>=G1N?QsM*IngNkvdp=Mu_SbqsdYk4DTSKcBE+l|k7u9Pkp5K&hznsKIX%_A z%~nI~OHMV?Ldbp~E0;s45;Qz^e-6-P940xXijzX6!j-=*Db&{CL<~tT{BUKaGf&2= z%)K?F-v^MG4)8z?nIEYky*vygOx}_(dEvxo;w3&GFY(2AiLb;DxgY!?{mt$ozQ?>0gC`gqd_8T%mB{;dqH9I@ATiIVZ$RoE$H4 zdc4G0@e=37OME0=;-YY3xYs`+>Jl;zarb(nbo`@=yQg)WA@E!nZn%|K7`R4^u1Y+n z7+n>H8z$|gFlne-4w1(JY;71=nDwv4Bl4(Sal3<8*tU-?h!P0pZ{W4VW}HZh`#5$e5~tV z%hS52i|i}8!30_Ov6kBx-Ci|;1q;@;%k+P-5s#n~sB*Y8yiYjA&2fHBIqr3Hq%T6y zR;mw&=V~@aA7DHn_s1}O_V0Z27>wI#F zUFIU{xHgJd9WMN0GCKZ>;aK&t+OTD-!XqTymTQ0%645UBwIrS)yts_vh$`8MxRddD z@}^5j`Yu!BN2nsFE4Q-~9KaG%OLkw%hUaKp-m9tif53&=WWkkXzl3(3G@OZN01i%Y zs2krNYE&g~A)yDiQ)9Gr_S&Rv3Yrp5Vr2&bn*eF<9M z*r=|!H$=-^Q~&Xnmf}=T{SOzJ`rn#r>%XrETJA`-_1|4&>i>g7%UDaxREaqIWs%|e zJ*m<4zcY!d|YEP{_>5bOYf5jN?s8p3B-xO=^D z@33&cao|q0aL3jL?hipj`1sn$|429xgQenZ!{AE3O!<`wC5Gom|Iu)=vxR ztao$wq72sUg{HHPBfkvR?02Q2Q>6(j=Y<4Au0RbLYBr*_q(%48tx=$71M7FRGN3P%R<@wOc0k{0 zL4WQAJ;{PT5Ci(V5NHu}m1>LyU0m0K{_$^y>Pg)GCsgnIo1uDqT@Te?<93W5Gqr9s z)pyl(dq(nEB7CTC9+j1gIxc5ZgX6dqTM$#MJXFkx-pEobZK;=HO1&IWs!}}(;pfui z)T0e7dV*I3!Dgo(57~OW?XAZH7WB5dxl!`r!zj@ATF{?4pl4Xn`yJ2|E$BU7&=V}^ z?_)q83V}A_IkK)_4KW~`260GEIEo(UN3;v z{GB2AapN~oPY$_Ps@H7374_KiTxIjUWb!R1pCVj9J?3fR3B2KjanqA9FyzV?jUY1-;RNUK|7Zi3re91EPY! z)zo=yOsQ8Xl`nN3;nvwGQ<0rzo-O@ROz9mKC(h-zIy0cZ6RKPNN*wK30C4bla5k?w zJk62U15{MPi%lTo8Em81&oQsJ+j58NSGna%Y=&{%9xD02A7t|1+Q1e+G>EA7EFc<$ z^6wv%&1;U@&pj6ap6-;}ZOct_%6-l&eP|Z1r*3ASmpEsnoJxqH208MI~SyKH9Tkf@ReV5t{RZcx0v#;+s#TQuqYzgOo06bg3 z^MJ*((<;s1Dk<>iizxm~BN_hu5av&b<<9{xf5uq;6gQ0KPf0_s zkok6?5i-*oB4lJuVQ`z2U%?5H&2q1q+j3E(X^sU`9Rp@3V4Tt9w7Xpx zPaDX>5-|jU7towjc!hfhxfDYtzH!uruC>3Rr)!O+N_4FwF(^hi^6BnEY0x`hE7idP zx%zrM(HrHm*bJy|dHoG@V;h@U>smJ9h=7yM1k^ak%wFGI zZ^lt+W3KX`dA_o*lldyIU-L=>&1&p4Q1$hufo3%JG|)%a8y3%N9IZmk2Pf;*YxS+R z@2kz%mka7g9n_mFu0;;&x9sae2lYma`dJtC8jJc#FY1>p>Xk95U$E5;O=r&n4EeT> zyH*|f|J3!_ymF}!U@zd*6h!o5_Wl!TT%gB+fRI@lOq?g_fLZAt&)d z&o(bT_gZ>Bi=k(C1U==%&$*oa^Vu2_YMOduljyPdwo9e897N92ciU2*$CUblQWvKt-+%|gUyIe=CW+_z_+`$*?UN`r zcR&vE=b>~QA>JdB1ZU*-HOY~56Tyvi-CX^i6LP8*kpREq8ivwz+|K!Bdg(*yTxmh% z4k?iMAFvV4IK9fLS*3csf3E%|YZG#vMFT%(U*F+ex4bUkm7c$yli)@)m06fuh&C5m zy3B?q2HwZ%(LMi@bXP~T>cEo zDZ#LI_k)phxRXIA7SR1aB%%XtGqb6OA0OcV4?iAk8qJS~nnv7we;l~QgkBujdA1f_CHVQu$3O}}n_%Yw|<6SR5=30L22=T)+ zWOp`&Q!@#|Ot1X7X*N-oyhi;`qZn37%`T+_QPDH$oOkews6Q;&nWu{_?(e*~M_b$_ z&7#|4Y%{kl;;gm z$0;c^Sl0J7^Y}9{pqCwuprw|eH)2Y?8AZ?|mZ0|?f*!O4?Q{s5X$kt!OVB-*pxrT` zKR+5lM+yvw#-8GG$kV3dPVrc1Trqq*iFUncRjxe+xuVReX{Y33C??D%@AN7a z47f7F9T};!oe;>3vU^YQFmhXgVdMkxD0nCy1&>(@LT&dt7y+J+HLg3c*R+ zy=YNB>qWWJqI@ZY(yiRffbJzz{76@Gk)#byV^Ll(u`UK9^l6x%{5 zJbc|AuU0#4twK}$G;meSe|eWIoC z&K7YfJk-Zfcvp)WDBQ}46uRX@EutxWxP_$|?s}vn@Pbd8NhqQj2II^|FK0uHU1$@{ldHHHOj;j#lap zTk6}GQU^ly8{5ZRTlb?=zhYazu`O-=e&}uLSJKkd4GY*hV_J1U00$ zspsu2J@x#ux8d#dmeKW`(bC)cm1+mTm>B1^^h}H&^fnXYW0s8LQxrBr1QX*D%E&T( zgQambq@Nr`;q~4|QCQuQiE(*vCdSu<9Y#@DV);?&<;P;nkBu?>csq(84_ba~^YUY^ z<;N#Kg&)%`KfZGKQEK@yrq#*f#}vztF|FXokzVj)Vk?&)`+J%GF|L)Tf9&mL`p1-3 zZvXHIzq?v7DnI9rHe~elR^GLpC(}KW>0>gXP0VZ+txe2s<@T~TQ~v7~_mi!n$Nf`I zDXcxc%(#CZc8PF*sh6=buWV(k%(`i=dJ!0qw^l026!NsK;!EBtK55as9;%`%0N*$o zakFfxPhyDs)Rqd(X{FG_oVE{|WKO$-R|q=n5L9dl`p!$x=w4c znwFX!Q|dljDn!tho>oC>?I=jRLeLYfEr&MrG@YQlwWkxT?`ajJ7|_d(M$l4A&>JzO z-VBwpYmi4QLGL>RJ!lEq=@2y267->$pnEJqyJJ9q9s(VwKON~|I5ajRnyl7mR zNzZ?qG7QBhGqJ&}zs@)iJd^46C{N#bmH=2WePcO^Mxj0ZC{AE&B$K=M?e>pXkEi6u zcqKPEB{_I{o!RZ)mRaEJc3-F)TpY364RJ2QYKl2dZ08U!At_-SCyQc_mzl5-!I(>G z^9K!!3eWIQh$Uyk+a>fKkl%AC1Q6Q+!VQ7E^&dKT(3!ml4;<1{uAk?qoc9AMM07~d zr@Pfpw_X^DVIR~}@Y_#QDIAH~sr^O9aXlqh4a`-Ia{eECZvr1xkuCnGyZSbrl_U^$ zq1jz9fI8}E#L@9LKI6PM@4cD7)B0wHiIB!fNFeC|AqyIDR}8M>7QqF#;EJem!EH1u zxEpa_h>j?3!F~OIPu0D*mvlk`!ExTxj~{Zo?!9%ZPMve=Y;}&pvoKH%2wT}?Tx{k% zsmYi!o{#uau1K1pBOYu?VH5wzoT|#w$(0o|CJSWy_DEbzR=~~+SyDEmv}$H?!eY9k zv2Rb#&zJw5hx>SZI{!%AdPNr!=*}vRnAJ|YsBRGzo&3%&s6xt)n3H*=!b>p=Jz+&k z%22;r81{MPFg8iuseuyU+!8K)gvf!MRW8+aJNlDX(jTT-;Y%M$9%aQtb3@b}=EUd$ zv=AdYHs6{^>6M@==QW(e#KLf6nUy=suZ)jvpgDzi8Mx<5nVt0bW;a+6e=8{t_3=VT zcmI4$=-Wy4keKA7+frR9C1q}vjh?+@MzMGsgR43-W4NkpMx>;?taADsZk5k~eSyPL zo+7^X5V;-QZUQkGYvhnJv{}vaLMsk&vH`>bD-I63ZeGKJ>Tu#zNT-9q zXf|Tm9(*aU^?;YVtZ@f0>VLiBTD{{IDU}W@2hcG{4`)nzM4CnEjPwb7-c8e_Da3F| z2*utA=)rwJ@;KReGMF@IFZ$I2Ne-{lD5He&aR9r%uZlB+X+(PBWP>CK@EU+RHc#g_ zOAUdX8fVj55q`<-&+g%e*W=VDPh_5C7a*;FgEc;+@NBZ33^K(jh^jMNp-bLk)kmV1` zApS>}zp(FnCD}45rpWE2CQ25FM%;(X7=BQNgerEH;_50yW_rIO1C{44O+!a&dFHC# z(m)TksrW}+3fe*9#7|=vOQ|Z0#dZyXWMXP8s>VJ9&riVg7=qCfjVsI!j$?rY|HrYw z2sIHTJvS^cf-jknQI8q~hW$C{^ZIv2>h-JsVM{W73j4=(1X55N#T9XyM8v^^z;nal z^TiD?cr}7lBg?>LIo+v-O6-N~1N^zbudoXYRKY@JH2twg2D%m6^QBbsZ_jm%g(Z<* z@|R*>F=~NJ^&oXhRLUQsK^2n(aaYeQXAg*PEhVL@$8(b&_I14(c1c;JxT376w1Pl0^7a*_=1UqLheNN+-6l42rDAHIDzE zPy>^QD8feelr;PM@wZhS+XUC<7uy5X?ntA{&LiA=G|!sp4A+bP-L_2UpCWJf677$P zAPpN(9$g(Nu3S(wHz{`5`}-jDyX>?-!Q8yp>F9$0<=`oclpnJ_;JFh`!j~c>(PQpx z80=PQp>L7P6dFsJS6N6y!N!HN)EdL@a{V!O@q~7P5 zmj8bcl=Ybb$~j>lN?p7Yc?(joHDZ5|Qy zT8YZG2!^syn|uL8&PTb+hI@x(L2Q-&vWQxf{P2G#y(6!!lfG9k#>2K=`o5KPpFaG} zQatDZ)A7TU?@W<=*@%mz&W`wJ|K6H#KHD|#Yl-pJ#Ssa=d&tA|)NHzYn#_wd{G9}m znZk^`e)PPd^ms=-8GhO4AM+4SCxO^&0K;Q|VGV`nyPTw6tBLLENDY%`QX0t*zZhXvbucMGn-Sb4N9VO1@T`~2?&>)pd@zDB*}_s(GYKLMz$A?t zuxO+^zPw%lcq_m`+G!(KrtffKGi9DY{n?ZNvt9*E^(r=Uv|*G1oPX4jR2lhP-o1qx zli!ocbBpTnE>yrR%Dm=#God911z$<=P{JqhJFCAGb_`OqFkfwC=$U@j`VwmOjON^H ziqx$o5*3l&KL%&eV$|Yc>K|wbcwxrmO9QrbyMbSlk6kKiVJ(*;DucPsXU69PBNTv* zDUGuJQXUa=Hzg6}F|Da=BzHf9AO;g}yL7`W_hiEVu2t)Or2e4R!^vB&Pjc-?#hAch zmYPg|5`L|I(}3ck3fe)r26ae>EcOA6;@3^Oxv+CH8vp(@KT78FFe5A=1#Y2SMqgwV z4rFgr)giT;ltsvmhu;?(e&pK6{8mwk<3T`y0dEOQE%5x-EXIix-j!mAen0U1x}Il7 zk^eQH%K{;wQ-y%Os1I{d$X}g%^>lj3Dz^F^MX0yDuoJZw$i^B(CEVQ_kNbqyTx);3 zm0voi-!h@gkN7Avn9z`j=Nhj8Dzz*%9&^zGKIhAG1ev%50fNU6fJQtp6TIVqvkdiJ zs+{qG^E^@_M;$`T)vV?O!GB4LCFnVd5nclp$HM}+grYEM>k=kl*%`tzWL6qJjQ0z! zhv2if;W9q~F7m9rq~94N&yk@s8JOIM;CXT2YDxr`{@o2*Aj@VvU$AKueqht+3sME( z+Qk59nM~&+mey;KBTeN1rlhb7b_QI&MyN6V|280T=t5Yb+NYxvU9fZfh=jqmK`jy{ z{f?x|#gK3b#V&-&e6JZ8LnwC`1|AGHRu=fN^Mu})~=%K7i zAXm%szth6+X#VZ7_|i))O+b;{JiH@-)P=nSV3m|>gH}noqe?L6&L*->vQT-r6yaIS z!aiS&nw#nI_5)V};`Bnl}4w2iNG3c#--+xB(X)L>%;y;jrcgx(;O!S^nR z;U`VN&?LqGii>6%l~qr~p;!p3GsR-rh(RwwCiGWZdK|=}H(TW9NCgk<^(Wix$WlR~ zMJ*^O(~;#^UL2E%qH1BGs3dr@J+u9)LMp71$cFF8w&M4n$lS+wklwicpt^#w>vEYB`ccROYmIjT7V?Jr3 zCZPc6;Xvq}wA@g_QKfhuXVc7`RXk_Kv`aaIONe;DR8 zECPx%IMB_o(Ee6lCE{?Ss9g{aon|6l{txj&_%~5lF?$L5pv>TQT9M^x~&ZMyVL#vt;RDWoqvPvr}5LUl0khRQb zG=aM)t-`jcCWqC35#2+v6*Rm5(t6hvtPcMfmT&GW`L6y=n*)9+`O6B`q1xWEAIipW z0w_)UxZU}nN~XQM^_U!oeHY8=-SBd_lw15?czWoS79z%`71Z+nJctS z4kVkW`PsmY0(k(WA0u^r!85`%QzTrFFim=#!mmQ>zyhl<#BX|ikY1_(%U^jwdVMgZ zLplZRd4XRo{Kevetw$86yZFH0DROw1bY}WK5c9w^j!oj!k>x-Ml$$_jG%asCb>AKq zJB^fo1>)=Z!~g(uD?jPPwn{M?3@tR0jDpeJ%4jmVqGX;#8x+ux&(8>d3*-Sa$D8Q_ zGtQIz9*RfmX1=_){3KHw{NRvQYhOLA-{o_Q1%8qb+{_1fp1<;eCsRNoJ}|UEzq}I- zP1fW#e#q$s^$6CZUD2L*2Lz%y2Uf|*WjK_SlLcy(1-e5(*-GDc(040+-=X_%O+gtq zgXd{(G;pIp9x#JnV+Q{izr~$KX*z1u2`i|wre05UxQzHQdR;@WJj7oa@ncw=Os`D& zJfagB2(0cI#+|{?h6J-OtSl*r+_ck1)%hyN5zfR0G zug{Kqy`}57q5f2V3p$OK9Gx+Y)18ES+R22Zo$R7JDGG$qRN7Q}A)7s7D|Bdsq`OJ& z7C)(c-PNDE?5Z2+PBA_Gz+(GSma~y{wkQ0k`o2W5#O($wn=D zSAg3E3Ur~7nn;cvu>B;O13CCl~L|5TzX>VJp+Co{CX zVK_eGay5_mCu$e^37VxRS44h%bnn|QCQ=WJ1of0v2}@_%oeOM8jDe=Ar&bVBK(;P_ z+LqCNMdl-{-H2{LO(Loe0B0lWUL*?igGU9YZU?8Zbw40N(Y+vMZ2L|qCP7Mo=|IYT z*_P#D{@jmW4gn99!E~)&4)x}od5xQp-pMqhbB%$5+IGJQ2Cts^zbYFh4?EHXw+3rf4)= zs7Y=b|90lO-IJW`(k^+V5dLIuO@r93NTnY6{mJ`S-rrf7O%_$KvqQh9eB&tpT~r8# z9E^2p(@&Y>S4QT}m|N{~d~3MO@1QF{PndpYU>Joc^$Ap{UNNOikTZjM2STb0BM@O* zU}v$U(NZ~x`=kvUt#ZPuocx)J3{t2X<@xB%{40VyK{C$EG9Ss!s zAc_z!=TUI<5gceD3D7t-5HC8?YDkr`)gh@4VRFZSfzf#)B}ox;)cGN5NZ7)_O7t6b zbg{im)rfYSMzoS`K(sE<&6In6;Xa9FRr7~+tOeX`kyPpY z1&D-^8>u-JSLOnpj+_L+inaN@UZ>5y!4<;3%F6pl+v%mjMyzah*qLpo={5*0Mv?$b zg4{N`M#V}_y9Uy(#Qc@d_N69Z*2IpMgEs5+H)}0GKl(MmRMfm3s$=c`fPRl;Hy(pa z=htr5Z(XdxdeAnYfA=J~Lk}wL7}3sIvFWZ$)Q(;6N<4{KH4KI+#?<-yt3YQf^Dax& z$b}J!=}3hM65-CWk;B@DFg?FrY|lCxz~e84t&8hPk%d!2DCTLb&k1X+uhh%4JSo=q zjA8T+al2Sl!$OmYaHYj!lmtLVR9nmBMN}J=6c&DpsqE)W4avRV&_(5`xTdh=VZ_TP&JfLOZt5`~R<}GoLjMkvo zr$|7NNuYbu{js8`qIxnzDxV>TCWUqBmKiwR^eM{l9346y|JdYkSRZeTe-yI}1Xo!y zqtflh?RauU(Sqsoi<5j{ZluC}-2G}<)tt_ax-+*q+V#=p3yWvE?QS14%FE^#S0o#K zvT<~Nzp}JsM)BklLXo?;m!vt_TxJ|o6zw58>IISTzMXqW3Rra3&QHp~CKK*m5{ZJ_ zox8qSG_zRaP>i+?-X7U&1*>Gb+lHypS9U<#VHtMkh9-ytK5~oVs&Io%HVH zquFAMHB;hb9^-^)iALoDx|kswuw1jB&MBWMSMX^2%5twj>niY$<9#x4d5Qqs(xU3} zD%}xh`D`?hTdD4AY3^0JD_`;e1F*lq2u#p9tr-lltXewYD*B;J-FIbVIv6ZB8H#{O zF0-PS{duJ-_L;Ksvgv5erS>axiX+FA&(tH&){=v?Gmgr+#WM(r;6$XJJHxa`mIII+ zXcd)~%qp8xT&CyB_bZAkt4j3`M(RQ^*L`;Y{R&pw->?l}X21}--CQ(dM%5g-9w^hD zD_41DLc|E``EkQuohZbBdr8^M;)U`!^S4LK^yf3mnML{(rre{&V6FXQW_i`orNz^k zXR)5C^gX*|?(_x6l$7d$@@*Smr_)W5yf(<~f3SPSH!F(g%UxcmtS)n4By=XNKxAgI zV7>eR)H6!U%k;H?O0MgqDPl=3}J!&!^IBfBdpzg!Jaj}%qX8* z;&y2_50R-?PuJ6z7lyLn<&~8hwFFNLnh%qgHS5w?!3_``Yq^bEU_$Z2q8Sk_m`g7J zY$j|#kC>Yr+viFBOZqhHH(dJEWNE+QTFt3uNuY0SK%yVg)M|wdF~i@Y*40XoC4QM+iI4RBw8aN*}EaNN}=#E~J}Zcb=oZz1`5{9mL+_Q*3kEnR#zO z0;K|J>a?0RpJiq2g`1|fK|M(U@SFK8US?7vrUW-|Z-DyBi-G2v+K|sLHpnY{*lb>{ z3FJ~m)sNLj+=*)!wDTm^{&NZA(^ZWu6Wg};)d(|RD3324OUeg;Yh-|kv#x68SQ%NA*8sL8A z^+6sVhA8#if(`=O=M|{cS%v&XSh_8%fwa7|+(yge(y}H?2kk#LF9^7&lEXjxz&Oz>fi{IhP{<%S$41*RQ@*LEk{e_NWT!Pj2zIA=&dSs6-vt zzt9@AicVJJH_T8^VOh+a^1N@bh@oH4E#w8PDW~`6Kttx#O1u42-A>Qv^)ILljCzDD z@+9-eO7v|OD7<8zfBu0$s=CJ~4d8ZK$lwr@aN$5bR2~|p?(sM3Ilb2}w3RtI zw8LvDYJHBNUY5GG44}PQ(;y$D5>;MMfALgbi}~VEXBD4L0V6p?z^u~LT2C8Lya2zb z|86&6`Z*xrzt_Ar%z15v*W(LVW79av-e~pB*58IVm0`i29w_v-@r+|N~q!f+1u zjlhKVRsaeA#`)gK9^Wu@4|NUk-2rQal4QBd>@Lim660NpK~T;G+zk+1ej%=27y>4@ z&F~?6{vqKS>J}C8rVG~Fl&^_d*o53%TNm+alHi96@Rn4M_7z51*j1?>-%i%PX;d<9 z9)TR=-LM_(fP_tW(u_qU+s+qIbDK+A}r zrNZoXf=`%Rs=B`>!h-|UySdo81x>qHQuL$(JdPsMc0w+InG1zc2!y3WY*82I;vapa(gQBO3EB}i{dZHNI2?_AOU>Ge^ae;I# z#mX|&<_uV-5=waQSa5_I2+Aqe=^(}iK%HUrPg5_a@N7CSy_GGTp}%S>Zv+)_;1Bjs z*5g>FBralMK6fd_v&I*swZCdq?L0==fQ9+uN_eE7RGcPKtVP|qP(HqoU%dkTj<9mn zW)+bJb#847M(P6EuvBeU;?cZgVH>v?;cL_!jxUC{+%m|aUZ@Yqddcn)VSxi`O=UaB zRx-fTBg1N9gM`yV>pKI@P@~$pL4|bC%0#NG5@#Syg$YfZ_T?lwwMpgv)_%Z|8&O{RLk5{kOGh7p}=73ky7j3ACw1ohNwHG#se*!xKJFnBGB{LUN-VjYi*$j&v5 zdRICUqHca|2o4YM>}M@1fs~a#-*u6ELOI4 zgu18(D;THThp=sV;W6LVwQ)RUeT)-p#usv7n0 z+iQWId99GgPq&{I@jxDKL3O*Zgwgqvvp*wMQyfA`Oa4mtb zIF<=TTT02|;j3V{oShra$-zbe2dA9ap~qXp)k{8+7aD$U>;@ni>P;Ug@E!nV-@4dp z_Dvu_G#_uJ`k=lMFlKT%u)s93-aoejoZi5pEgoc6>H^Nl&Tu?ePvOzaN6$>`?3w&ps)4y`Sfi! zi%9;E55ZCHcT_j|Fm-a8w?&@7{BFP2#?OiBc~40Hz8(?FJQnip0s`D#*J=dC~vQTQomq!T#^{gP|2a5`P1H=b>pGOWUhZrDo$o(ER_#bKu)bX&2A8K_B zz$pkWGTLzDPkI)E8hyL+b8pzh11P~e3toQ@fF`gKcUn#Q=E*hivj@S9zfxD!O(FQ~t_#Sh)Do2S!U#TX2b{9S_q8o&C!1|Ih< zTG=3>Y}**1?QVLbCyrz?Q|+ewpvjl+3{Un zaaZAJD}8LaFV%?o=yj}!gX1*8r?G2kO>hCqV{i39xHf7a3SkF-^Nl*#__I2=eOhmF zb?_<90;Q65#^{6J+xp;B5`6n}GlY<-wiPC#*2TcJN9tjvm4Si9)eYabI3DkIveZ+6 zf;mLpSrbv3NK@7Gct%9$eAm`F&k`a06-+{?h|i)tiDvjlounOdHAiU{&GADOC`2F0 zRPBUy1>XK~W$SolaJ-z$YePiML`2QCMbuZ*`gXGiklP}n#%_WMA}R`Suf@_>!8YpU z5|LFCpnw79cO4A(pDM8?3hJ>?=xfj3|CPXLe8A+qjrUiTSZv$r4RMn9t{x?A-F)^pAc49{2 ze>c)$jykI9Hy&wI$h*(;y zqEoD1{ZOI4A@iROE;+d#cbyK@a-&Nm{N`4?ZW7M$euWKe)Hr^2DW(wRpx(mtC#u^M zIo{np05^qYKeh=W5NYIALIN}l@XrHWb&3Q#yom$yGH;>$73onKt{iO4g_ds_|Gx?#J3E{iJD?r@#hQjUP*k5 ziEQeuA#?jMVkOEo8uv1EM0a|t=1zUOUQ7X9JlVuFItwN?xcDqL#&^ix{$yR;T_fuWHo1!IxSnJh3)_Pq{fF)d`pjVc?n;8v-T2^~7B&@2{@owsSCk(~q80YweKaNl1 zR9>rgOFt{27B|nAxG8Y|qm%~i<1Q-@E=quAlm5B99$&S(Fq^JVDQBLf!0g`u8J#Y9 z0A3}GXqZsY>)C~xP9LhIOW|HHEkG|**u)f!xBKZ-e(HcMa@xArbTA%+WwssI;12gp zXSij(AMR)3SZS_IHr%N)+)M1?o*aoC?lKwfM_U{2R0#;Wy?^3xKY<@>bIl*4)|%c1 zp|XjPi)w>a;q|H+#bN%_ft;_CpRqxSND< zrh-nbdY%w)q5k}{SYG@AJ5Z4ExRCkIONe0uJ0f7AJiOP2i_N?{G&^{i4ahL>Sop;3 zlTr9=`#w2T_Wk2kp=RY5OH4^SUS`e89~4%8PhYcgJw-CYXkuIo2a=WjG~nG$3k&RL z8We?{04w0`n!6ODfe=h+6$n|YB~VC0Oy|`^{|-$HREf^5PS3>RNjz;gN|UVtHy9oL zwk*QMGgO-dzQ#nj+IM3jT*=qvI<;iupDKa45{A}S!K=-}u}$!*%=E6=O*Yv%GUka) zG&Sug9?MjJ&x>ey+};2^ZK`y_Z+u)#A*p`Mm$9aS5iGpS);Xnk=TgzCBS8HN$ zD^IOlV7L(aTk>_1CE|EO0I^q=$N(G9J|Eqf;ff7Cf-C~$uUmmB4u=Z~PoN|-$@KM# zCj!`z<42ijAjGCem%&iAZndeJ6pCF&toN9zd$c&V54+u24^a$~$K7xHdWgF7!0bjQ zoGQr{v?Bd#y&PcyVgw4PcQYf`%K+4OC`pOZagMrbvBaB-X4jSTC|>bEnPq2CH_Q&x z=>T=7m($zo_xYOFm~HIEYY1pPUwL$s!+g#{#Lx=->Uu;$k6Q2Xj`tX)JJosSX2L2p zgSnty0$jK4FpRC<1(&1L9`6nN_5l}HE|!BXY^zwk)g}1^gt? zxErPHA+#F)%6uhGQ}od7ns2zv`97b*gsjXW#5c z8uSXjsE;qK<#dKED}>#hIoTf6pzogTYqIxky}JnTNLgv`)25>*eA)%0E>8tC9HL@i zkot>OBk1KJ!cTBj4z7vr-09$&y@#yMGNL4Q?grVCQn6H+QhTp`S>FyhKS;6#%n7rr7Y`jv~2kD>inozoC55}cK0A9?to z8p2B_u1IIUjScJ{lp(+NPOMqm#S@IQDH75pG76ILs9AEL{7B2TRe7YP4+hrA!-c)CR% zmLXgqL)b)N1Wl$|t4l_vdunBhKyEBX9LjCT~4YegfGIu1F_?VyfhX?WtUK zS0}mZq<*4jt2MQ_NJJZ3;$zpG%z>D1y>ga6TRoSJ!R81ndyHVBT2X>D`9zH_9)~v? z7LBK7PjNQ18AD=WGDD&kBVNeDzNV!F1T}R^EfSQRLb92^E1!u_!4R}mAtIeRwW^u- zInd4-O)>P@vX>wUzUe_)&R5SbU>!w8z}_b^Svc0*`W?Ig{6O0OA3x|a;pfKz7i)dx5mJyxU+G)XPBsG5x6s|w>VG! zGf=%N!==$|b||VZi3B=8bwO-U{f@e>P`y)#e(x}R7s>XbRVZ*R>G>Fq(;6Sot`74A% z!`)J7YbWvKCd-3cpS(D-0X?i!fH(Myr$sU2uAl2^U+4DGgtWD%CayItidI0unN@TgjLN)kC&>}pPbSFl% z#BG9lC+zMKX}@!!SV)2A7nYOY$OXYw$eGw_(f})RCT8teQw{cq8)VOZrY0hZZ(5LM z01Z(3i~McviS@=(s|7~%kOW4gm04`V$W=IR%e6z?F7QcugIx7qjY0N@=d}UbvpsTf zwl8Ab#4!3utsUd$ets3T`hsay8WI=HbB$JD=95bBt=Cz;G{xP>2I~(Tj_G?&Vt9r7 z<+F8#q`(1`^&N(6br1&elV{1Ey0`jjh%wDxKRcq^UjZa&-0Jlq1=fC~UuSLYWK$W@ zQgP~Pa#xM?OU`oy;0;)JZ2?BM#a&e^lBn#g7e*o&+24nQ90Fi(oK4XHbyPDafFG}C z`1BV+`9Y?3{HDtv;g+F2^z!FDb)+q@W@XjAyB+)Z*TF1ej)tp z)P=AnB^&8wUQ#!WI2>6$(5%CX4u%7gyB8>7$EN1M>ve5%jOGSX`D@mj%;E8#?eKUx z!Qt_Nf064RtW;8nOUNzH#5aP8W=VSh!l9!0kA4Nwa@2ETf?S7^5bLT%^!H2lL)b(TeSBXD zF8RTZU+l;UGJzbmw9N3Rj+~JFyA>_=Jly1z9#Wg5epn_Q6W6j$d|D6Sd^w8sUY)T6 z;|0kT({Oz3sBlqi4Yr=v#iZDPV~q?Z+;?9IwL1X-$iiLjZDmRpv6p7yKE{zJpK@fO zIMD4YSizeHr`;@+CxdSN5yF5*Gpvv8{!jXKGMoQK(}oumJNm>4YPxr z+_3&jN81qw*B{-BNJs6jkg#r1IveWRWKH0CjvIq7y`BTAyz!S#Te3CGCFu{SH$CbI zYQ&M7Ln9-`8bSv$=<z`3N*%vN{g zwb>>r{C4X3VnKkZ>H;MpHOaK8sHIWZ8j)~fzrvL(fpE#~R}%Vm4g!Ju4u;?kKC>G9obqhbhg%a z73b&7)_S+SwLWBX=+o+Ax7JOvwO&w*;y92UgJZCIYYha|d1i0jEPLy@KcT(#Lwj#M z0nec9t>1BiK;-`ua?RfQ-5l9lSN@25t5Dtc@2yNGTYV)0$N4(4HCE)%`(}q~Oz>%b zFjV$U_3*JecnQq#4{cw@Lbh$7@V*#K%MJ z9eH26b40ZVu_>hb+aTE~dN;dbkQ}GDV3t6g9s2KNOBUgLiDb^&UYSKpWLQkt%HGb_ zPCY*3NYQ%IbKdljbiRya@m-fra8vHbCc}3diz+ILs=KHm5LXw#eM4vN?<%do?#@lB z@4l0?T7pjW-uc;N=?=T@Cu zzjJd@<&2VKMMQMLr^Koh6|;_$2w% zj&Ks_Q#>M}WQ0_1a7q{SbNdLmSF}Zo0#HN({EU`;kjILuk1n3hvXzzS8VWEBJv+&@ z&%1Vc0A6&5PM-d7sU+%m>I}qIh0r}ZDR2ow?LmoBd2PlmYEh9m*UHXEnqpM0vXHri@KEqQ^ zVFm8Q)Yt&>riKSk#MHK+`Dg(LjY8Y73tf|6&$1SKq#f50;4EZVr zNJ`6RO`ReS@{-iAkV~M>x-KfND7SCe1uAH-j1C%&J(}l>C;W z7v)u^a0tM1OMcjN;uQMeXSk%)t~?<~WQv4D;RP`*awj{tsG`yxer5TL*~O8#g*FHV zhL%&9he0lw?t+&dnOVskkg~FPo{W&OM~Y@g2RmnuDat{+{*L{O4FOv1_wDwgijv4N zat*#!@+rHyw0KTQh3=F$q{d1K)kzlV1{QK=N%eFWcrv7lqFLsvK()9s!uae8C_p^1 za0#%24k8uhrP7B}C&Vo?B4py083B}nG?nuVt?;RsvK_34%`${}#FPTzMrqL^jWm=J zNi2#&HIcY_Fc4F;5DrB}Dgkb(>=FVB3WCh6C<*K95jL97rbe>dW2DD0I{R`iHJ$X9 zA;0;CUNU%YSR?gLE)EJ&m<1jQtf-Wtag@G*nuafzZnYC;vcO*4QSN(E_=FA7{;ta_ zSwNsZr$iTY3C8qIC-aM@mzGrOq4IqsDpLjp@KVr9*PM~w7-W<=kB;d9xC@R&Yt8VY zJqb8;T&)%vh3r_wQlj&Q~NAg7j};IO7&tcJ(+Gj{IBs!jOj z4WuLR;vFfM#0sfu6Q!KhO%-;!^A%Xpv~4wdbn|R%2Wg^-C~v;h2-!n@f;AcMu(e0X z*I&MO#{%LGUc^C}E!yoCiEccTNEE&;IR|oM($nUM0bbJ6<}#_fIZHc$*u+yF3v(7a*LI5Hr9bub+=a%>spc{fM0J>P=F|0D(3=>eFz?+JRF8A8hmNw-NSm; zi}9s#eua0W3|mAs=mfr)V8=$VEm9*Vi!8bRGKNX@=PY~^mVb_4{eOgQq)Bw;8L1L2 z9aJ5-{!+xxBlQ|Iu$zHNCiSyL<<3zn7qw$j;Wz%D0VG-2Pma?D)O~XBbSX|thRXqG zzC~b3XL!2n7vE(IW5`uEksd(0ycICU_G#8YlyRn%DMo z;2IgKaFfc5pK%hNr^qsjv3te5Ks!Y+=z-xIv>4^+ad(4t6Vd{Qh>t|wR@dPhg=uIV zF;1gdltvO#L{_7KMJ~Li7Q~N^$VAxRuk_s&e~Z$kU@|Dk%9MOV;skv z9?bCWZI`y;w)^Y2J$Xlw`v8k#k{Zy>;1em^ruv~5mmZQ`WX1>~XFzXtnT1h`r zz`Hr>g8`8D8^<Od$?{WrS1$sjG0vy*NQm)n~LN@R3Uy>M*4x;C#+{z{<3 zb$N}@M4o!MG)yw?h{bu};bMVWJD{0!KpE=m*-Yhy`c~i0*wMWahMxvJmWb&}a&GU! z?C&I}{6uUfTNc6>+c>XFvTmITdLdmw>PtDq&V3R`dSFG*>)hj*)}pVs>DND%*PrKg zV1*^!FEw#e)p3D#euf0vPy50Ar;ZKzCSnkjsD)Fch{6E**m2$_Ys`VXkgNU-z%dJZZdK37cQOZPLAg2uQ|Ik~w zP=ixjCcT9kY&X>NN?U!QlLuW=Wp}eClASv&J@FS}=)l)0ORBrNQMzIUSg1n15^ies z*e;!Qk|p_4R+MFsb368;$qBn}I7K6icVcEpFCJii$=}RA2F~$V>p&)W$Lx0DlXvIY z{79%b`+BJN5ktMlIn-;|>`j`@4p7gKy?h9sBfacvK-w{ZJZIgtLzD+4%SVCwGP{t! z`8+v^lLX)@sG#m8EB0`84_l;+@3C|}KJ$eOC96>Ei(rh5l^NP&ecBysHzm)8n|s&Y z##Br>v=-|RZ6+{5=IGW*J2Z{3gEZ*o!*Yn}#+oMev@dM!>sMI@S&x(RL;eOUmu;Nw zrYXAJjO3*g7O;BP*0syrp_Z&dJ^2g8$uknS#WMt=ihKC9RCXuXo5+7c3Tz&2CM~x8 zj-2QqUW0dJ;`u(fM0SHOO|8lVJnGf@HfvB|yrjxWQ&+&dq^U{we$#wC8g)Zfhlc$> z$jjsmwK-;I1fa2>ll{><2J86iY~QiZ)81S!mgb$aCTlqQ! z7?u$3O6jgi)+qIN3JwpQ$|>8$ZPpmS8XdGIuC^u<>|jl_&l8?R?kefv8zhiCwW!S+ zawrhgM`6h;kHwx3|9Yiso)ELTov@-; z_Z|}<3NJ~g>IB?`7`;T8$z2#q0SG=u-8(yEP5c{ChF#-Aqc!9{Yrv_pnCg~+Qov9P zh4~JHn(86Cd03jda{vcYry#JtRvv-#k}$Rw;ya8=K(Z8~WaaanPwF|oYXs)l9{j|P zsrM{)2YK^iglj*9y2)zSzb{w>7!M2fsHg28i_=4+J)3Z^XXEtHyv;p0@Mzg?csM;3 z*gc6ZwQZ2?qn;k2+U3Z!0NJO&m76JFpv%-*tnX3^M6UM1IG=G$H<_J^516TKL3k7$5eMO0sv8@ma^=Ss6!C zDlcLR?_t4U^k?Ct-3uw=jxr>%J4qCoK|wus>yXYeGbwDP4=0XcR~W5ik(Ba$WTfG^ z!dA=kZMBM@Bu5m1#SgFA%i2kO&LK^U!u7U_rONX2sn_ynh>^m|GV|Z_UQ0m>r_`9lT7ZGo~Z0UUAr zL2ODW%4lQ+j}0c)z_{IFl8 z2Tdjj7ozWD9HDgRujOp-15!HGj$R#Z?dBQ}$W?0jS0xAwpCVffCTkb(eKQB$S)HB> z9xpjoPyHl`bpN`hQ1m5=9OYh*kWdR2oQ_Rp5~l~6>KeM;C2bLrUD8r*dF+ywcY)a` zCpoBaA*PebR!*8aB?I%G`dgY*-FdglXd4fdA>vOWHhQhacuo?NpTrA+|0iOc5fSY= zFNVjbiN5Yfu|IVlAr+GV&&31|iMDbLTc-TpVA;XT?q`=;R2EGOoQP7mh-geK0_4ZC zG7r$5Uc8uPewvgYlO!7VIe!~GFH^0|X{2F*YA^FHfi+3fB{^Z5vem{iZ=q?qlt4+l zWdf;i0!Je7NN}W@PRM7al{fWzD|J4nMhmQISp23)+!{AOs-quuHbli8)AXSnftjSv zF>O5EXic%@@DKFU=bAhI<7eqHZ>FBqBqGJn^tM`gV~ee6N70wty$J4kgk7{*)6R*u ze^5ueT1xA{Kl0M`onPW+hc$4Nm3Pl!oo{y4W0&m#vRhy~ZLV$-YsLx-9shL-Q-ECO zT0nd=RUic#_em0k`v`L+>fFyiYpZ21dq7(6)vXUo>pir}B7mTS1?GBT>N>5Nt{ds zLrb;pks@2Hk*wodQy#I^3XkIzNdokUH6(DDHTCRh4;$?sF7dFEw{dEPm!Fp0CO2}; zI&QGSR5F&?`iO}W@k}fam67!c>MIrYz^**-mNjMr-a+Csw zpiZwB`Xts5dxh|WHk%(@=kf!Jk2;*_RNafbMCh%&^(8vHy!E*GGNDF^T;yE#vB}mR zY3izBErxB8yVa?2_KK(3+D(x+<(FdI5BeXremTb4jrd)58+w4B%X2SFvgnmM%r;e> znuO;ojSOe44MT;dcig8kquaLj_07dsfqws0$DSTu=?yis};*cKUN%jc8?li(R91LKDgGfP@ z&QYKGiJqRyMwE~78#qtPSEBt^8XPDT@=wwlKf zVB91ejs$L8<&BKioA9ZUWi~+?=?P`TEU0)h5Puv#q8Ah`um!S)OrG~pbiq5ezZI;s zMxS_Cl2zS}($OsV#Yq-6Pm=8cShnARYEU8(CgAvCT`YGzj_dS@F%Zg)U1kAA9E+0W zh1}qe*j4*BDQ1-AB8K&E5Mgjn{=11CVF0ycr`b_Yd#CdXa zrQpF!bqFYN3~1{tG6oUadyWWf;+@I6=ZFBE12!4=Mi1M!VRDaHLALJ%dY7rQV=>W- zaG7gX7ZxJ6foAViLALK-90~lQ6yFn3?7fWs?jj&QE z+gg8i0u+*;$fnlwY4?7y*%y*6_O|mpy_Ihl2ZvSmkb@^|XT4Z%UVeL(u_Qiet~Kf{puw-7uod*Vl#tuV6@YFR}@$6IFkA2p6C8r_HQ zz^Rpk`y|WpX2ssT*Y0Vf-P5Jr_4H78J@sl#+wt%|%og*GzcBfPx}EK|-|Q8fw&US_ z)TQ0cuGGOwllD`8#p{Frhj4qs@TWwqF*wfQY(Z?Bx8YPDE>4PbvPJIONqt)( zKB-SQPmWdjY=xBcVQmW+h5SXFI9uTgA3DF%8h)qTDUdsa2rm|2xV(ht|Na(lEk_ak>W<dk;v3yhe&=(fL_MK^^DVVuE*khNSx9iu-RPtBX$t*K z63NtlrjUz5c}7}TxLYWBVYj$%k$g0RXawZEHQMyg7vEGZ%g7b5Z21_=tu`V+9Cc%d{RRnK7 zmpHKBQW5#o!%05HN0^knx=~8}T?*oCWJ;F;nq9fF{Y88=Y=0GWSX0k0{ke?_3*4oo zJ#fE_6BP`4MP)D8U(_d$wfPWA0e)qB)H^!f}p0VEboCNep3rtxK3@Bs{*+q z{*?-+t?HGU4l4~yE5|Y7oq^AhjgY|BG<8?D4(IDG;FZiygu${OQ4=*+{Bc@IGx~s| z{q#sl6K7!{vK{)^P<8uaNd78fONh?jCDd(LMS}@G)RDJNAZm}_GEt}!LqScDs1m4! z%cQUazmf$DYuFjPJ7jQWeS_=H>+w+HCZLr~q~0p@_6Y1PH{ZbnA+3jcrga%6h@I9~>aIM)XQ zTV;c6X)MS%dE`G;mZHI$sG~heovDu?8IVmzZJVg8(mL%LVij6%IYQ3KLIaW^GQ2StYv2yifbrU%oWw;YLTQ}qU(bhU~n3(vx z8YUL(L~#CdSN?x^)@*;#Q&c?l(oclWK1NsJb?qz>n@Eq?L zIfD$-8LRS$=+o>ca2&)$oz5{$ngIz+zv>+|X)0$vYiycgBZ(s_;X$_63}J2`Rf%2) z9*j9uW5Z8!?8)(BI|Tk|4`Tv$uwgp|{_RseUh1onY{AgVIi^2D|3lR4HR87$saE); z)<=%IHdE{bHeu%F(KPj84d;EZ{9qmk z(Z>j>^O)Gfi^+QEv9RL`7(brK1W|5XWEy85E_7kiW0Y}c6vsB^Khhht>xIa)_1SpG zCDB!ThPv)t{+F*#cI!`Qb*K!0Kc>od*$A16%cj8oE%Yc(4Ft5Ucr`eD7Ioq{=KD_j zYM1zvbYJa~EZlvy7yWfc%zI*{zELx-5qLPv)Hi0DsbAXd)Qwl;UvTP)ewC)qewAlZ zIs)gZQty9ylKKERJt6Lu!6+;J{9XB2rW9IUjQv+)^TfLUEYAm2v3IfuuM8HIq;8p< z22999v2|ZhaD1X~1|7-u&4|KeoHH%_4U6^r9Ll8(_wJj6i^dv`Ze~0*ZFp$riDjz` z4~^qYFrFGY{VJXsTt9DQWIT>qfdM_-rbOzqTZU=JCnM+ zBPFSmzcbaoqy0BQ@!v@1BHM!#Bx-k>HF~BM++a=gP8ld6brY+s;C_M0+Nl%x8>VA% zvozp=xfjm>4j0G2Ln0HuthDVpdnP3i`KK>2jv@|yiC^b|+D2!|THMN@3262I`vi8Be!7H5)m z0GC0o+8sZJdnE>Mx=1A2x#%AM3?+(TeShz@gz0i&WU=G3^aB(hoX*%;DarQI+Dyv?JWzKrw(Uf zP6FK7ekxzETv2b5_>y#`2yWesD@$b0w^O7D;&3&_J4L8ur20#Q?`C0y#iP_J9wqHt zDwHeZTk4RZmlBQfF-gMUUTefF_m~vln-u49a#N11CUkDMv@JT3#`hU5kmNia%zRvb z&a$t5@~(&oN>rv)a!S*q&4-Kd%6Xpod#|ZnVxO$iN>cwa=IL`Hhc6E{^-g z{*EBIlgC#;oO@Z)H%6#$>Kp9eq?MrBZ2_f|po- zeP1u`c@}rt_)*|A^4EK?EbjY@1R>6|BJyY#ORINQmX<^5-7RfHPnH&`^9fQMCS6)~ zl$AB$53w0LWNF#o{aI$8~iiLd#ip19l04>#C4{4;S zUud#CJgCXx5)Y@ZEwmX!4}lI{mW!u_p7Auq(6jTN+DE8W5?!+5pLr$p|8#ypLO*y7 zF@r3pQ!(p6X?sd!+?#5tMK(=H;S@@LSrhKE5J~Xqd`|cdH2%Ic2Y4}(- zjHO{I4fOJ*H}pJ&RfnZaQ`8fb`Rq(mz+IEnc|Sf$#e*GIvsJJQ8%hp#5z?cy76Wz& z?SeW@Xg?{izfEA$H0sW&mCC!TUIKMLT>Ho6X-kQ%N+(*!`wQ8wlJK;Lb>dIt$D4g& z^(4CwL00dh)mR*TXTNAA6R00Xxyb`^x08UGRKrABin4SML1;oiLK5+O@D-1yr7P=$ z>NQV*<@wm~!Am5)Ogq=0?$y3RayODi0pg=aDF)dtJKfptPPf_YbQicg-9OAux7-){ zZDAJ5Wj5p;dOA72E$mEhEL^+Ub)0FUoLbqQ69?QP76 za+i=ZAj(6%V{^OSyN)-6`U8Y|f=9Nm$I-K)#=8k*{*S;7+SZbEzj}-zWU0IB!y;RL zU8lAGlVxN4s;)^m!Wmw6S}PD(f!&2o5P5rp0wH%E31~1m@S&5WUgXzx!emaC%dfbU zIPic70%$!NXQYYDDujp66jSST| zAB*AxWUWb2_j)?4jG+F3jJFy(%aqh5xhez9zqvjrlHY1k|5S#w_K$B(ok-h2yWZqh zhj0)>SYZ$0?D-;1I%8nN+<}8=vf;2sOR%4j3Tc0tR$GcFR;eB+|$V7?oTTEpl^Sj6(tq%2AJ;UqCH7a*FKB<1*Z>AGORC8T6yCwf;Rwk(nj zXZh8DkWTFXNflgZJ=wU1OV0dT(oMSmuftl#}rFW>P_ z(v~ZV8pM4`t%| zVAU``%*aNQj1#%_G1Bx87h!V?W+2Po-1~Rg&EDtTe6;|mS}L{B+WlJnoksng{%RG* zsa^gG0K~A%xK{`OZiy7g1T>hEPF~i4K|jwL^n;xpKOa(1Kctdca5)CNr^*Lk+OX+azPCj`NW+ zjGI{!^)cHyyZT9(?B&T9(QM%@*<cjv1<`=0KomMgz$ETeUoTjmhCk5mBE2AF+dok-s0eX z(vpEiFb!OG){1d_Pjbg>b*^Cbhhzi*tD8IqtMAV=SiQC)B+tK9 z9|(ctO?rmBcz-NX;gY zO;sf_lPw;I<_ySFh~_g-Bj!KqLD)nCS5Vi@2W_bSq$m4shEPZx7yK`BF;{{#r*hU% zQ&F-y5QcU>msFCcf$|W=Hy)cPT-5%KI`uAUKac)3lA>76upn0UxCNj9^`%nHFkZEg z=;DU~+rD8D!`LFj#R!sWu>2J(8J1r!Pkzpm+l1x9LA&EnKS=Uvl?%FlG(RRyI_yK; z-4Bh=J4l#;JMYK($-G_c|CSJdk@SBOy9zU3xlm{CzB5&5U}Zg>u2`tEVr=Rs`%SL; z93e3d7P0sjqAPIqjeZ7~e()!7huCM~;Id)2)35ATFIrTZf?*_D$-B~CW0&f}!yu2VFY>ka5 zk%Z(;&S~4VY#0X{#Knp9eZHnD7rWRN|5r}D6JNU_HHMp9 zX>*fTg_~4rvboU`l!c?8pD0 zd|~Wo06skMN>SIpGY-kG2mum0eusKM2~QHcvqGLc4x92eajLBem|tLckKd0kUeA7f z1(Sj!T|==ZjkBkSa2c~9%enDvsDnBXwVD^bfR{?B?&LK$APEK&51 zeRdn9$z9axaDg0M+h7;QWHWMxKp}4Dwu!l|K%g8hP3mfD-rM_-32ClLP?*_?7rF5}pKk-jpZrTpV*F;R7uDjIb z8KY!MUo6ZfY)$k|fJ9ax*NN?j%GOfT5g|`L%rj3^Hd96|Reh%GTv_UL>f6Y>H)c0= z`D(6tb&1pwlxJVccE7{Ou8@)aBSQ`qT*fL$alXl@;Ci>f?dj9oh3FKxsXmbEgy&QS zWwkbEK>O!bhU3~N>2~U0Hq-1BLck-(clNoR@3dvGIbK^yu;7asg-qiDUxE5Z4WGES zlAdqRCToGZLdv79tkjj1KF*fh5Fgd>sTGy^>U9#2@YnZiPT8mth)uutt3S74|2V?0 zhVsm;uo_yZX6bOzC6Xcb+qyQj#M{8%eEx<^wZpSW2a-#`+UD9usvTPDLX_Dca%B;elQ34qKuf4pC2{2^^u$s}~NEsU8u~F0YK3 zOdwe0R}t7!iSCAwiH0~pywtFPw=fZ!6?75>5(Gnwbr6}mFmE1B&2S5}0b z5~R4}DCVk`E`T4LKzIft!$@Qa@@A@YP`L*=>-;xhA_Y~xBUQwxsmQ7;=Ch@!{)FnO zXQ+z`KU3eU0R2cAw&4;R_e}=2q7y4yoR2Z2W%I&`-+&L0kX^Gw`GySV#45qrOm$Mf zFfPSG;7VpQnP1$(sW50WYVaUt)FMt~Qm>!@5ZT!Ip21Gt9gB@hZ+i1j0nJkx>{rxb zLA=$or^@=KM_~Q@(S!sNS3ZhSw zPmNM7ndoMzWS?nf>-ea)nVYHVsR}{i#qt55{B35?8u3Rf=Q3l29g7y&&t;SXt<%>p4`O92T;6=E<upyR( z`DTG&F}Mcp2#MTGb{9eGCq2y?cLgk|YD&J;#SIK$V#Cz!Onj=?(m$!%J}fosodipV z5saa+G?Qbv1$^nxVEr;E0JUi;r3nRB-;)?HK~=jLFYDfOoU*Z0m>v?n>|5?9K$i2e zY{Q(3EEmF}i8^2~fx}r^-0RKi6(UrLGQK;DMR*8H6pG8rte`)lUYb|PRUv=#r3G+8 z#AgzYFXmgRhl@@0>Z~TvwpG12FDx<7*HDab_={K+>2nNLAE^iW+&rA+v0p&W&msrq zOl!zO3`g@q^5jjtI8@5Zjw!T;Hmj%R6~v5)j_>1s-WD)$x*Ta74If^cFl;g^-O59w zR|(dsjq|`+_96%CNZG@TY^;;81;M(I#yXxCY>R+xkzQb1Khccu6?4}E#xeS!WZ%(& z4^b}f5P~j`dw)MeA{!P;G~cWOn@H@c)IzUA)h8IU#vczT3e}_Y3WcJCO5CSqp;@at zfcp4Lxhn9VV2!7AhriIjOjpl+U8DUGs-aSEp*fUk<-mg)A^PG>K&wUox`*Z!$a2eS z%S&PumwiTR?#d|g;6m~e`KA0SE#Jsuff%xNKCG!TuDXVH|AJ9>mR-Dvbl_BjZ?AoQnXu(#jc48pkG1lQu&@__} zNK(Q{#G)Actln51UD_=ut95~m#IA|`J02^3%%SVGPgMU!iI8>uveUYLZ`SpVpVu|& z$wZJWvLRZ4*i-kQ4U2)-Qf5i@Oany=O zIw8!1Ia+d~RrT*$8gczW$Tkx%b?2&w0*sp7ZR_<>OJ5a+V|X@S?MrTWYl%G3ZtDoV zxy2gZ6Lx&ZehuS$zvK8mcH?`ooAF)Z#^(n3%28iE0OyvpudfB*X-=qJ-pv5-@CWEd zc>mWh!bKfNcoie;7mxjjsN7VfzZ8`p93gX8uDQC9+Vk0q{$C*CgCVO0>u+WirBG5+ zdl!8b4bk8Uo3{M>m21L^PmDr&aJl{K0S54Bqh#XY<0*=6jm zOAD|!Juy*Hva<;Z^>#r6xQ6`Z&VU4g>cW6j_boCYSqoQid=T0gs2hi)iEYERE4Dmp z4yiQ5Q|1u#%iEz=-M^B5W`By(N6pUs{z)bO%ul4U+#K7UhgS4WYWQyD4M#nUhg&h$ zo1JukU5VSl-e@sT=>z0XI6~Ta=}cvDYNjv*FW-vhKOgP);OKvYJWG3Pq#_i=*Ui^w z*?YRNQaKBfGY;IlQDE^gH+@d~5!1*g+Qm}-+p!@)qwgz-wK&sur`qmjX!}*Vnck$77o1pi{7cel+uJ5JGs{NPh+l{o&(Q>mE@Yy#8moQAZU^yx zNeJI)Txp*_Qekx4u~Y{WrOGWcGS=jNH@ML6MDWga&iS@Yhfkq-fC%+CTK>~E5@W$Q z65fyTkUqL1#ketC9?sXcP7nG)290TM z1ruu_yl88)nDXlR=Czt;Y$bAM!aDY0u6*js=>jXqiIe5DTxLGP?F_nfPj!m>FgK5= zKEf5SEx}0i^zM#N#Xmi&K&!j57wu*by=oaKX6v+Ujs!hp*j&UpVXj>J0doGSlj>;*%xB>|^_3uE6>Jag~u= zn8(vXZ181pIA!MU5N^Z?P49%6zFa~Earpd>cIv&y?AcS4s!&0}daj&5h zgd2DjxZZBc!v$H0Hp{{FJgs6UxN3KNg>coNEL`m>Ea}HyS}-nQTKgsSUk`(=rvF0R zJ%#$1+?oWfd#V|8`}TscvimZSXtwEyMCZH7p5RdSV~euqw4RwCi@)nL=254%}F!uF1?GSKEpVK3cc@x zsYp?@GFMHk6uUy33U5!$ry=@ar`&!9cXeNa^B z4tPm;iBEWRBa;x>1MI^brUc(>c(38o zi?yB<`ALgGj}b)+27&Y-vOWZjO)6vC0QdaCaC4{U;_lR$z{;@&v8PL3S)SA2V`bw8 zyrb{ro9AHuGz1OrtewNBv+<1U89M{K6CW{>y4nGjcE;jH5J@N0F`?8@i~4uvfLs~Kn(&de z^Q%^T>FLz~XCW#+&LaP9C*1Y-sW4dXmSPY&EpQSO=0cI|{sMEgofn6&Q^&T&nTBvs z$HwG9#1s#KG!&|IEPa|Sy#XE-@hcwNN!q(6A};H!7SA3Y+u|~5=7h+?v-=o!MG5i# zmcPz7H{ftrfH&iQEsnuTItD9=Tq_1EycwJ?ql3eunU^1%i_6JbqAu4F%)r05D;~}=eY%lJdo!3on(S_F zfCqDfcWfVH7s%4IuO(Q1MzE}wbi$%Q>b$osrh_uxlgfQ^9rCN?IXi#^r^YOZ4Cw+Q zKLR2r&TOP%4lF)gfvY(Gh^y4OS9ocV$H_l=%uO>{af82ap z3!^s3TpS|dB$bVd!XsI%OXzG%$fvfDK}yEI)7M5+i;doU{x*il{m~oYnb@$_F8F$=?@ZGA*MDcDLq$ zqp#H>SDh}A__bPympCR-w#?x<-X-XPmKy>aj-2jg=T4;kzwDrW*|{>ZFFBZr*A{Jl zN2{|hGpY|MeCu)SPH`Qc@AeZxC@{B;1Bp37SmAR!=}T^Q%81v#!AhRnIt}_6tK>1& z3I+LwsCl06q~>|wLH6peLd~--t>$s+Kda-r7a={mtOMgw?(TU|6FIi78FR?z5`E*j8(a9`LG*0ER)mY>%MJ*I(cJM;Wb$v<|KHoeZ)PI>Dk`6Ad=#`ikriu6eXmD zTsk!$#1{{B@savkcIB*2 zo2c13?W?{l+gJTHQg*2Sx=HZRV^a)-$!#uGSCRR^BPv2{oAsGMK;Y@d<~=2}9+Na9 z5@w9evmy>6nA1KwRDR%>fF;-?yvL7I764CW{U1AMNIiOB2Y!6 zGIx_WEjq?g&V2%mdw?m}Abr8+eou!gxgra#t~Jftmh*m&Sxl8(v9^zjpK@rx`AbCw zfzrH?!`+oATFCc;9W2tqJA=$=c<-x%P7z@l%3E)5)>H0TpQ-PM!fL@dy#gy*5qrT*-XZg)Cb7t4(cJCJptJtwMugciR_BqwO*%jw3Lv+EuQIAYEcT z%F!?eo0X)*0m9}z(r=7rwf-uF^9%ZOg{(%8)JQHTiiU((qp5Jd78{Eeb(R!mBuW|? z3S`qNdw)TSEh_Jy(S!q%zk2X4-k>pF<>3slz&zF;JvZG{n#Mm%SFJlq+wI~%yYQPw z`@Vl87Br}!;8qsO0$l_6-2wbrd2@{ck6l?sVg1MAu;nA2wf1m(3Jt?tf4ZBn=!6bce#Jz@^+W@0F>?I-;1Z|*p}+|r}V2zYhxq<9DH zZGVSoyr|hJVg9TA4Z1V8^i4+DH#;R5PJy}X2(+k!Y*%xYGQNr4pt3Df6;GJamlhE^ zdk6WevN}Q1WPglST-P}vB;r-IR;#%nl!y_n_%C!#76xP}oor#CP8LY4Ceyc1lQSS( zk%sW~K=^yi%|duZ*APzmAQUJQU4wERpxhCM1#bsw=YZt`vdMLX1tI2n^?R0ZY5MZb5I~NF;ceSvR%PLii*L-W~NDAZPUMLwA)A-E_ABbm8i5 z5zy`cy1?^Ryl({0TZ3aQt=8dlJii59j?IYNH6!42dj5gPNo2J^qqPy*FsYW@>lF?S zN3xE^HSj|l$0vJzPleR7O~C2s(5Q6>V3|M6Nd|kQE5^hB9+XOloz+irWz7MJyKNby7G%dl{>1!VAZFp&8e3lhJ-hDfFt%R-fci?n2n0hO zkVd-J9L(0|%xs`=O&kAh>WLO0GJt4zJ+OxJmvdUtlpkg9a-wpV<_R_De}n(KNxy~b zFUjzD_DoJZ*5x(&DvbH=IcZw@IHy< zs;%jWL)nHd&nXbvY+_cssD3lI0DeL@-ot9qAH%@{-fqQNmH+DW6|kmXHB1W(FN0a@ z6Q&c{qrmuebg`SEx;?G7l50s?+Q5I~RiOH2s47O0)17t0g85Bh<9unTx8}6gkMs1S zzpmXSU-*YuuZwC)*o&(T{SzRqMni~V$EwR5%xC$cO@qy`lXzH6k^iaLECo~P2=R3oBx#a#9RvqFcw8&5e_zF*}HhNG~Ly`9d(DIno(s!;2L ztrOYxkp}zCW*LF!P0-F{eclU^Wh}NC+sXNLrB~%+R;4&@NIf?I`av#ZyD<02{Lq9w zJIxg8{5?a-(pT2jr41`=dZZofFHuPB)uqDo{^p^>-0!POMY40mjEO&lVLYQCKzWhU zVWw0vS>}t5Q_zb#FVC%(9Ot5kdv5N&VX5;}i*gWW;5LfqY;r9UZ@Zo^}DK_LK*xsIE69KzRErM)fuIMX-=x-kN z-&x#Or?B3EmZjSY=hojgyMLzfq_$j{Y?jK+QV(Dd@g8xq(bYjUs?2lZZaWiUfOEN`{wYi9*jo@Zco$2D*CG23Asa_xGWYt1zz_zoYlH8o*& zw`X+;tEE4ayNr{!rk04ABYwkM+vNFqj?4`d4p} z_~AS&n405>lF+;t&0x#CPgX|`qR%Ulay;Be&5i5ADgBp)_j<9aDQ- zll|7CTLpieyEx>H#>Margj21|+IRyty@^@}9wSdmb_MBmBTICZ*RKc|6Sz2x+o<;F zWBrApT?-_7{wRW^TYlVs&Bs$(==yl82J=yY#MLCv7`iJ`UOi%3C8Ayx|C@ADTmhFq zh_jA`ngF#$7F1uN9|3Z(btUa=sIcusN}z&VSeYg11n}co2K?lRbnDS=0RRPrEcp4D z4bXkrs|P6ZZdw6=7n=p9qjz5lEOGeiB`h=KYBELJaWDaiduhhVF@%{GLd#VylhWdD z)@m6Tcy|pO?Iu>L@OY>C9t{r@C{gZ0I^5(`0o6QiGb(kI41EN3V&9WTGk~#4LmHB? z6(nmiV^Ix*T?_*yh2*^ysFor74TI2}h4R2kklv6Rdw9wc9c0F;yCG(P%!c4%0o96+JpgqWS~-BaBM0aXK3oGyG83*{OOh?#4pwTm(q}eYGX=@@ z!d06B*)ieElA_d-B_;T0^lzno1n~@6G7HE~mW1=GM4VJ|O)E_v@3X&MYK}R1L>9Xd z82$YpZ2q*UxR5g%;poGhDrK53jE<4KSfM0F>ya1z&y|QfJzw(Na~yZz*fnxmM3?T% zdD^^`;Sv$q*woilI%U#(ap?mK&8w53ZO7og-a*_8hWSsc;eQ!XZUQX6=_6%HTEZjS zBNCp(v6KdZ+=es2%vdv52`=ij{a;7h9?BAu(}EnQR+b>wBtgzeN(t3HvXWerhk~(# zAO{haSd=NrVYf#v`WK9Me@WaU20*RVP0vPa65Jh{|i?BB1b0yw(9NTLpI|=-((-w`I zQpY7-UE0cTF~vAb&4mO>q|;fXTad=y+_G;uk!W*s7SVV5;=&o018R}H>3`9&-5FoB zyJI;COZC~8OWcb~4-?VoXEuSSy(Zv=ttT9E62p1`jY)Nuq=aPHgk-2$Nwb%Tln9|e|?^p=7!zMyd|62anpQRd~Uea zu2;rg4%~aB#c8TVhsREQ7)Lw_Zx96uZ~n5t$+7?qS^zB%|E*FqVA;Sg-Cy~=Y^0U(Y_La?9y=+G-aUBgS;9Xfn7II}F(%3~}Vz?yNtEuBEyrHQzP! zwT&Fq+1fzrJ2`D&ofz8nXak!q>(PZa5PlQATJ~Ao+QV7wl%1%1+c_ZdO*)=2@&-&% zPq#MoEKYxMJ!df@KrhZ>M9=l;5%+g_2CVPe$H*Cd%xjb-_hQF-ea3htHzShdV;zt% zLrJ&&6`lGP(OiAZG*Y(w-SfT|`56svsHu~Y;7|*92|r1i7Mf+)X}EnVPf;Vh9fmEK zhj@fkwHlQOPv+L(K1{ym)#0}2lLSE4_>NoG%0d5rQfSc)g0|`xt2BB&t`_!XII+3X zixDGzf_S=*REil7j}sYs-=AXkYw-#shRySajzNi3&RaWsMJIRzc0+teyn#ELBkgM& z<|R6urTMLu@|g#x$oTMHZL{CGDTM!g6OI!njx+Smt1ue~c&91M!gXE{y~is$%y#~= z>-=mre5saR&s1-(ka>oo&Q}r^Q<5~(2$_o68r;vLUFS)QEN?{1c_X+?aMh~WJdu;~ z`b??=!m2#Iv=*lyb1$0xg6KkT(_eW7 zhk65c2H@22DUZ(g`V5>-WGmk*wVH8SDQtlnf-zo}`G;{lqA^|J?8=V{#ES*uheG98 zh_0jw!@gfluH_mfYzrUjgIom;yB1XHxE}~EjqDaC`4Xcns`g5&0dBK76DzH~ne>Y0d8Nk% zH=WrMiAOJ)SEosVOz@b{{AH;S&YIc6MS}mzF>YR=j$?7O%67+Iehcex8PeChnba)f zm3PGQ*Sk->tvZkMX4Yw!tft*I(K<61+}@L4+NFQ=@`-Mk?Ha!?%>N75z;hj13M=2H zvHTxkIXMAtuf?q@YJT4)^7Ddr(F7ai@uvm`-^UC@39}GU3hT4}|;z>eJf)8s+^3CQz@pO!EuOTR&&THWR>wH5IREMTd|FDOIrK1x<+EnCt)!JCXsS5b#lmWcS`@o-baW%BBkcO>lI2||B7ahClXBgE zMuvzeYjkb|&6+fkzCFmgK;t$>bKFw**8q;eKvy`)D|(kpN1Kn8ztv|b3;dTdeOUz~ z1~4mJu@rhcnfykWH%>+y`~jyTJA8JyYLb`xU%H=Ge*!)HWm1BPRb)U^$O;x^#u<3qDc4sHT?OcOz3wiOJSdv39lg>IA00^Zdv4IDoAB+0so+0fN4(AmzT}Nk)nuw zzl^#Npc6X0a1-f%q4ef?H~@zGci97<$F0Vy72hT!f;fij<+l5e8kn1laJ$Q837@V> zV#{mRf9?LuWY~EEo2D0r%o1>8lU*DT9E-~!7!P{v#S}C)buVkguSedu-k#-40qp zRTt^bbh-;jyGUr?4#NQ3($q+JsO~vtOA_?GwRzzPhxd;ayNm?) z9L08DhTq-+s#9HOQxAN~u4iRG5WzlqCKabX$Z6uDLiI#B{Br;S`33V#dC~#mxJY`( z|N8+EHKW*i0b#b(T69^EFryOYm)5aF@JMz6k1})5QK~;D6l>slKkVH(I@aq=-OLsT zAt3%~EreDK9wk{U>dymO2wx{d3qNS5xZsr5<^UbK5714%n2xImxb>+DTfqDZ7{3JP zVE05KG7?4pn-MnH15?@3OQL-2fvFAt7V#r6i?b#bIRKV{b3_~D%^cM|aKjgRfqoC> zG=YvJpDHk;b#RQP+dKFki~Tq1RP-Uo*DAPDuuiEMO0V?tSIOcel^0l3&vrb3I)n;` zE;3uB=(CSGi1S5Gj&yN>SX@<(gYNv$R;PUoP4M3*9lt0{ETu|M z8|pQ9Nh;h%?~Iy#E6t7-X5R{uh=^*xmjk7H0$|#(fomc_V&!xcn?#!MUqt0b!Kqnc z);CguNZaBQ)xz0VgqWFsuY!C1VBTp!KX!;1PA1yz_9j5g99dUyq?gGbE}~h7;U>(! zoN+sryAN{4xeo$jH*g?$ZG>M|=CIgwS%@(|Q44!(E)#iI;+d7e&%%;x!4k~EeNoF) zC31A9j{2K1%=VL^iZ-{4Ew>L?2p*_Oon!kB3@8?iyp}9(#>bk3V0DoL5o$OYs5EUp zg0!Q(ufuj7i#IG#NRNdnf#14&#|w8QDYNKNp|gU$FLHs$G0%v zeDgr9y6I=`fals;@4m{he4w27&*Nl@#So}o-~d)|LrHWuZ+q(hlnA{Lr_N{D)zmx( zr^Ov^0KuDPR&kTC$k$xAh)`Ce+kNex-AAgjRZV)Ev}gwrns5S(#=O zHUqd6X!>a0{F%kOp(J4-s@wb)=9ULLKrxnkx%aWPrZxhDseJGt8-i9@=WTLR)cmMP zRAN^vrtf99?VXn1{Kf`{2i@E)meucPVq?_oO+jfk1-yUW*gd`eXH(C~%Ny;g4 zF{*1|+?mDWV8upL#bvBOeBl^M%P(+e=YwayxrH}W3CS`)FN^U%3pwd!*rS*$;&x>gWmWC(|suiRO(Tvfv80rvVr9xg7XFQXafdYp!+&Ly0N!3>J<3FjjN>XFo}AuE5O#WsM(@2 zLL9nz2B!p}!%Om_Ngy zn$L#j{RAIKP(<#aMzdI>g$3QL1Bio4fpH|drd%u_>yrt$R z$ad7O-pz|a-)~Wlq^EMo5DqUvJUmn8)QvuAa_RC^2sK2wHK&T7jOgfc`Pz`ULyQw& zhi&3Qk_HFjSj(4`M4zZtey+CnB>Gy-aAfq$=%J% zKUGn8xVtU0xUqybuy?PaO(}>ivhPIAGoj?9a}k>cl9?_Q*^OykXc_!6^D)w>ejgu7 zNd-O(9vOA|vq-HM&=LFgImsR8GYAmwJ*x{irM6XwdxIVay8hE)AlrGQn^H zuCE2l4I*)r1 z9rT;e>;iLhC>9g=Zb0@o*yA0jby=Xw&XaVzLLWF$%AXI3TNK;Q6{ zKUU#o&3Dhkw{}|$1-V#x`a~c0JoG}V=!r)Q$dMU5+CI7r$4eM%`-)vj1?PeV7lc{R z@X&Ccyr*^x(16HDEP^FNzgB@XtoQ;gLMuw%1?X{GSv;U}KK3!K`uTDxx{1sT z2kY*pTJjv!+)4d5o2GQNn-&bu83A|; za6ZI~@9cS#y(0TJ4AgKklxp>p9Di5r9=!jdXBB6vL`k|h`Tp<9^kYrtBWe{hjT55` z;lrtI8qO@L3|sn^e*13nndHS|Ki0c)IP~AWno{n(`;dx(UNxgd?><6)TK8^--EpB8 zGDR`!A%ch3V_4kPtnjKlv>^K@`O7UU^1Og%ZY#Fbkd#?C&3efKUFluY{+@Rl6o)p4 z#qK&0&i7QL@KHqo&7NjMP+24DENZD+JOvvlPe8L2vgxI^(GhN`g$rFRHHLy!ewu^b zGFG^b6(+T9#}#h0i}{rF9luZdi@LjBdqqjg&zxq9b-&6;`|rA#Qw#qxl!!Wi92P89 zfPMN!6w8`3Qef*;P|Uwdt9zNfRrlK2FR` ziYFGCv!NY*2ygQ-lV(i*qM0@jgkyg|iaVudA;JDAvdjwu%GHA3NjfPo|AIMul|5cG z)|`$Rne_-0{RI{j>&P~RsH^@$iOr48`^2{FTIuZ=tK){1t>=Y!__kBioGJC!D_ld> z&({5yxCWNzVlXa1yG>TpD*Zmk|BYKZNw(kyLUm{jT-(zyW~%M$%79AS`TlQG#)_sr zBP<6<(6ncDd4aurPM7C%>2Et^Rap;t{VbGv>h5KA$BBLlh2KkJ+cV_p)&P56q@HF~ zo@(nxO}{!Q=zNif71LGHmhRpwuOilILT$OlY<=aY7SgYWDey&Sv&@Fy%c{dR1FmU)G{VmMnG<5^e_fh zrMBjd>2#>HP0l01BHtHOa*ly zxM6?qP7xU_+N=bYo-`g?O#P%(XdXAm9p;qzpOmscs^ETiXN?bQuvm~omxWlgx z-K|pe3CmnuuH&i2UM|w*VE624z;2lnb=^;8obhBP>+H}c!irmQnnVr$uaLb6=^+cz%np5KYE-g z1}mN;RRd^x8(c~b|KM5duLd&(2oKM|^Lggz)Fj=?pUMeCXY8u`!p)rFTh@6SSHq=N zu-%^FjH81&C~)i+94sdKe?jc`Yd97;cP}Pis#kWN*Z<&Fui{;Xk~B}vuv_#p1FIWT z6^A$FfU)UhulPZF|3?m5`g!V}bNi<74@-U5=3KIya*H%Uu*vGvDr zTAYIEQ(J!yTVKE5B`xjf(blE-NvQOI*xp|8&%6QGdBwk0kVIoTMgnj>BMd`i=AzMx z&dlyPPT@o7?@IhJN+-~DKiS&2wGnwtltCBD-^iCZiT)C9^$K_Qyho)e#sh}49j$#C zELoofsYDQN(fFb5&D|XpF?d!7X`K)?FFH2%JlYN+jYDoZF@z}%7!PXciT_rEvTTf0 zhqsY4MiKMqxn&qEGLIX%TLs~2sUVV40RRV?bf8)*+>HxVvk5yO$6W`ior;eBEJmR~ zHIQ`3|MRlq*fJkG&S`8N!|52Q#-8dbQq3hr@e`o{>+8^^kI`1S14%mXAg}*_)7Qr4 z*f3#!n;hcL&LtSjPSetLFkX6&D#G&bipKNj=mPQBV9XH-5ZfK|eFHnvcJ>-`H(NaF zd<4#crO(X55(IbgKS_>|UPsW$-t{#`(Ak)-x#Z|le8>)veiTF-9y4s{_rpmL1t;R92Zw^izbTLW8f1Dh+!Wc{ z{I#q_PtDDLB#*l}LGd83PlI(nP24M2kuh>3U@R>Vby%UTs##u2vJ>9Y$Z9q&<`in?eo11Q9db$oJ zX^esf?WrE*)Tf!l@+^UJ_IWMfhhx#7Lpl&Sd^*YUK_^o*g?YRKs{{AVmaGtW)d6?! zB5#=PZqa_X1my?>uP8i<=S?-?QC1rO_e)kPDVO;w`b29hzkv8XZQtjVfAF&@ zv(jFET?6UyQH6@cB6SIF_}1kTwl z_lz`(7s{9G8Ii&ZapdBb?gZ%le+~TS3H;}OP2hh);9n^4zaa3Vq2U4t*>5NK8$VCr zcn9piK;UnHEklX=5|n=gMZ5|uFRlC$E<0uy>5(?!oX8HJRrKb!?#P9IY7ZEZxEqAg zb~ts}ye0A@ghp&TT-4iM4)9I59F4CBP3G+2K!D$*7vLIWo)s zT$N5y(KSmBE{OkL9B~ZLrO315z=!$#P^HhECmlZ&oZ8-SqH$o(aA^f|5SHI2fe$99 znkwN{n^^QYH3@GEE)(8n<=#MizqrvZ_4-!;l%yX!tBRFtKC+3L8QJxw(v@jRt4&s69V&=pW2t)r z)99?3k`JuLRNQfa`G5-Ie8F7cIkm}i(_m9ioXOGg5x#;0cK3EZn(-BzKXq22q|;0& z@dS$b*e|j)EbNJH?o0k!kIIFyjWla=D$%!;GH8*Q?)5L9;YNl2rO#roaFyphkK_h2 zqlNh^s#jkN^DZhN5DPuNLxjQ3m6n>P(RuEj*LerVoVsU$Hs&>(WGX`&Q|=4$Iz1d4 z^=5iMWam`3^#oewf>%yo-DogH5$dCIko^xP8R|N|2Q} z!IOF-0Kk9vv8DC@-~XIhJEai1D|oR3Q4&APnVEThbaisuwt#@P+AYMR*iCYa+}zK_ z%_4)uiPb|Y$5dmf{w*rB=4(>8eU*RvrtI6qh(-#{gVFGhTn>LpT2E4!%@;_TZ*tN+C&ug8$Nl_a%DvuEIa2ktD@QbjWWar~ z#`XnuC0#)Gi|b1MJz#GMz%DiER|0nSK`zeWNR5}_bo^!LOuhsEdUCyGV!Z|b0)hXc zUV|TVfYrZtVGeMxPn!e295vxL6!pIZbqT1yP_X~Iyk&`k!J1CZa~%mIxk-$WRN>v3 zXPoV>XY)*l^~hxCthE0|*qu94)X0oxKiCbkUDtuxCeG6-%`s2m%k!VcQd>~Gn3g-> z2IT`6SR*#vG?oeb3}!l?KyGBEv+?fq@1jJ8#U?|bZV+aVh`5NFLSq#6v_=Wu$P8dh zO@J9N8=p;SO^-@85}dw#BT32{N7kbo$g-8#(?6|pVOX%RAmb*|&dC~>PHy*Y&aKu# z4U?&+>yT&7&e-Q^y9L942wR^ChK?GkcGf;KrM<<9tdxhsif2%jI}BRv_9@Z*sO0__%b#G`Ipg%^%t9{i-nrl(KG z*nahD-?Y9h+FpE?y@g_~TXVhhV$q~-A>W2;oK_c0acuKVrZ1dUG2=TpbK}~hl4kyhfC~Ag@y&7yT>;)avB1)#0Tz??wevo9ci4C9d1}oIBju?w7zc2G*hE$hUo{59OIB7Hbs(PW zNz@vYk;urHt5O5Py^KVyJ>7!x1w}-9l`%K{#h$%uvW|^zw1a_j4GQs5?kX2RZ5Dw8@~=$dFeW$I;s>e!}awn|0JCE1W`ns=X+-jGx;8p;6GLUuHWJhleUe zX2+nPdHfiv_{8n_*p7VcXX$Tk;du(9IsLkv9CKGrC|sf!w+LQbNli-o;`=$gNn0{k zwZBTMy;^wh5u3aVf1>bqr>3A9%eoWsE1$VDe^yKL?QBleYly9yMGv!q?QVPRhz+S&G{(Km= zg9K{G3rwTecM#vdgSvD>F#uK3mq(H?jf30o=Y)U3NbD`fvJh*Q&&0SgrVCO@`|)L@ z0T|ApZXgGGjMQf)PHc+#A6$0LG%($aU@ZGf?876R^z%^`~QP|$@Li3swOO0#o=`H78bqs?HsX%`bmVB2s2Y@@ir6dhxTx^5$K zi4gBG`)F%q{a_?j8t{q< z<%}H9xVK3&Hw=g3(v*Os3pt!l>&oZ`3 zq5@(Rjv!~uatmlXxeqBR z0lZ!ugD<>k7*6i?6hDXy$l;e@7{$$dLdwNG(Qi7UuAb<~pi21`^cWC?7d8rc2R!K& zOtj-6#S{-sIb+$gb02RLsuJ|E7ahFyAhcq5h-6IEZGDB@j05+zgM6$YiR0fnhs->GNdy-7Y%pA3@q<=`u#Pv_g7{f45gaz$URL8gRx}5LimS^3C5#Hx;Kbb z8Mu>wtD(cYou4Sr5a57SZ6^On$rLujOjVO(>s@N|y(P>O8&yT}K#CV8tDNeKa^Sy} zB1U`35A$I;%U(%Z0ruA;*oHSU-y@SIu^-fTAdrx|l+Nz$O%6Civ{n1-kg4Cfn9)1( zoAg1`M50dc?8=!{a*6&d2MpUjTICJ2si4@^#Z@%(%ymarg1d(jef1lny}n1k#Tos& z6+b_}mA0Fhm6J5i3LUPQjby4B?>@eS+RE!~srdDz8x*xU2?6P9Oa*2v^hh~K@T*Rj z|K3XxSZ}DT;orz^W}PaImnR0eXFx*!SMXoOEWpFLwtUW4jfc_zm62*l9v~yTK|~Eu ztKtUla!N9-^cF7Tj2^4?pux$~VSPZdpKsjk_U>kO8aJX^i<{SofG#~8Fe+_gR7QYn zbK4n}-(^JG-V$T_w@;}Op}&nV$EfKa-jQ32rdX#K7>E$5T45oO%zvk?^m0BCi>d>X zW6qkC68gQ8-|F=r;uW7qvZvC z{X1<})TZ8Od`0l|)`Lr@Hy}HdnVY87NB#%0ej6MRpfk_pLU2#9r3}kZS;({UW1?g- z_W(Ck7tYdSsUzJ!_?J!rH@?)v=k;+$W7k~Y1y?@*cddH-P2A{z=M6QV5C@`Ik#mHEV{J~X z<4F}}L0bOxuAohZ_ZiyiV43|DMCkk&UiWv}k@o{G@|=Yabvsh$-^GvzOU-or~CT;`RdyQXk@*Z{s9I4;O|A zCnS}_apI=PzoH~6cjSsa9AVb}5l^pe?aBKY3|k{NcYs@)PVR?6hww$RNz=nyWGNhA zDDRqY_9mAV<$8%8EFePMrslkt&wy*^kPoBZFvb4(KWUTooBFlwj~9|r37j7Yt9rM~ zuCNfhRDV;h>~vI&cdw|o~&if_4vgG+A;X$@zYaZ-Np(6=nwZ9vj2 z>-|8Tgwie*`8@>Z+7O}S;nHA$*&VMrGQ4fbj%ZI5%vP_kd$`iS6O1w4cQCEqyfuus z4qO5-o+5WfZahY^jEiQ3_YIkUm@2LiKp=Ng@tiv&p^L~LM74fh8R-j&eWa$563;4+ z$>NgY!lNv7^eV^~G{XP2sCU1jk|e9e?@%?aoX(3)A9A~xyz=8F5y_4ZKR@E-bLfpj z*Y*vOTuGKLAV>XyL8N_zV4hRk7%>vSZx-KwXAKI9-d&+Zf#SSqAdC$&50#BW1vbd3)g%r`W}_$uW@$mL{G>;af~BZArEHFLOOYi(Y1+5xU#gJt;uRgL9Wa$!8(-fGG$#56t*R_R7BG!gR z{=_^lt5Sv}c0rP}c3(F|j1B35og71@gDgbOe6)J8<2gJLrG_Kbs8;*iQ&L_LBqa_+o3r4CV?rqJxSr@+;0fsIkkTh;tbZv22_`;{q#d+wl) zX!fp}?UZiD6W%#noxMcI@C6sd${lUp2n!t3zPuT<**s)&8x4#b1ea9WbpFZV&1BN( z%eT0SY=?P(++gWN8{V2t#@D-OqWu>NK{IG}uU;Cqp)c*gmoC-tw(}Ke&lI;tc0g*o z@kpS%6x}si<%e@%olyG(ilRDNxm4StCfO=19#!S#4J5V3mLU0+l#(AQ zCzey=5UjVLo9LBD*NXCX2X9mJ{#5cv{5P1@gjP-(r~9M&^rq&6spa12J$SH`eO891 zinqyaR3b*~c{HL)pNB#G6qFcKZ^r<`pQKS9`F>f9F-=-N)#&V_y`yiE1jwkYI#GSdPY%ZR{W0>q_5GjvXXpa_WPfbQ%*rKXT{kTl7J{a z0J6VC`eM?V?cnW!?OmEfvd!VmrEnNZG#vvERNO(@f6 zgyfYy!RNNJ4n`W-3$VHs<``t79R#Ak%g+9MkOwUt<|1U@`(*%jLa|Q?9vV-2^~hle zq1*ZV$NnVdIgD{_=b!CyXY`rb7|I7+p&FPklF!V@~4J$J5{aI<+2bg*ND>(gs zZk{+yB}L^^HOdx7@Ly6I_8wodU!jn~H@3apQ0}o65c--6{mI@%z9cE;Z!Rro^10^D z!y3t=^k=2ssTUTau?V&CB#ux`(G|+#(xnhQP8>a_RQ{60coo$f0%xbuHTxExq`m)<~Mz5~F`+uih z2MqM`cV#!{nv0JDe{O~#{XwdMSy8m03$Zmp%~6WgML8oromxptlvy|BCup^)xrgcw z%Coh0I)s2H=8kxqy>SasHtx5OlYoG!U~0N62;Zku(Vrr!tJsptM*Ng4QKWfN>jElb zQTxagR60&0jdinOYAn{>K>(Am?p7b`UjGj3x~GfZ6m0Jm)}7^J-71H5^P}(~Z%(Z= z^QlP>qM`Sjj%YwvFML!_)@P-vxzhy8iqZeOWxbk2rX6-IJLu=;o6W6|)u_X{@lM2F){_Xk|87~ooy)qK zB+0h0WSR)C4T$h(|FOIE+qe5D``2NamPDlTeGdiObcAebu;IJ3D;eQ`;N@=S_4yka zKA%L~w+Y<0Ob}3&^a|B3hVS>UD$G_5NI$V{U$t&&=>E_XqjZ#v^q`6-;b+A$z5^og zPf3P`lNK!Op&a)Vf!UJFgSh0AwrV1mh&o%)RB8s)B0I|^twLoGqVTBMLmIsv z^!#yOf#^gh-^_78?fK&#$01hvJck%H)MD}bRVGpZQ3}=rD@{eh90+GL8uh}@0NeIx zEcUYr#J?|PSt5K;2-QyPr06Bllc{0q?TmfQC)E&ReIVt%YT>DLZbO zMn{)o3yF-=vgA?gX%}=EgD4Hws9RJUXq1?0=GiwCdr@!gv1uPJXu zp#pjpd;8|{-)gfF(bvqB#jyz&1mEwg#eav<;FHXESpH3twryi1q2K1Q>9)ho%{mIJ zjYHjZ;&etzfyuZuD!z{)eB(Ib!(eQ&^P=W|EOHD>M2gLte3$iTK}s`Itz4>EnFC27 zdr9<&e*KM7tEl=0z$sV@)KQO;Mc?kD!@$S>w}Ou-nWf8* zn*pfY$Z~DQr(K2B#_EW^gf{>C%GdX;FKf)-_4D=M#y1kq$72LTp+_NsPu0Uh7N(KqGg=++WR(=% zdMRjlc5V3osiAH)gp2G{Gv@zzr}@7TEY89H;%u3@I0w1K*|L3c-W32A2S7Vru^@uc z+lmFrUcsA#Mpw+V+I>n!S<}4^<_i1L6FCj(SN43Je$NSB`MF&T^L_V1B3OwX+uO&M z)BfaO@H^XKY{^krVnJ9TBq7;KgR|~xF`m1H7j_9n4%fmRZrc}{EhznD%kYg3$o(h< zu-ppwmXyt8+bVBwR%Qsg8hj>8cJ;PA*ef{?28D{QQL|mS)4hz&FzSvDdF2y%HRbJ1 zQmRTytCa5A{fk*&jqT}e84Zsr@%mSJTVncYfbYQ@VLw|KDfrgF;FSwY#RJBwL6e`O zDK{S-p&*IbC9qM)Q<4e2{D~1z<-_SJcZeA|R^R8w-$PjSbvf{?k1_Q|(u6(+j5@w0)<-59mcQNK&~Fs*kw8jOBpvTs z;J=ZRRLZW;bYMG%i*XG7yC5iTmy)>( zH7;RfK-ZkTkqwizDA+!iuQz6=)3p2vv}yeR6O6yI)A%*%If_?XGg)|pi#esrc!vY6 z*$Pr@*_B=c6D}~@%P}b595Vx%;21EgRA=>rY+UIJC_=*1VK#;>iV%Gj8+I55KqYbf z1O?bY5rXD^NeExPqY78eXsiTn;%4Fa3TJNLG$4T2MMK_*cx+$xVyU^GxALJSx{-rNf6mQdp4?-QEcI#k)8H&XWzYHKU+v5JIfVfgCPmzfhSO68g3`&IE9d^{Xla|@oh7SEo?iK>JsN~Wu)HffG?RXQ?2vE%KTRT?*I z3)tjBnwP7ac)Qe=o^!vOEfSp-SE-+5HRo1t@l1_6&voeMlk8>91HiZ4^alUg*jy+Du*=;*r#PqD7dSJ)HU54 zzKy)M36tVIa*hT^Uw~!Fibw%_;gBkOYF!)Ul-BS2rxLG8y<103x;WD5)znXH1v12o z7Q`-grL|U569RM*EIBid(_wj}P;EYkrF9bRY)VtMwsJxV=% zOi@20_I{w(C(Vhy=!p|+(DP}2;d)R#{rKK~Ql+)>7zSSNjt>z1#CXUX7&rN(|3m3{ z4L)ksB95G2^NZ>t<3;J;JSs-D8C=-nIKF>RVMLA56L#_Xo~_0S>d^3@oJ*_VToA9K zK}&RghX$2uK+6RGE2IhSu3<(`N!!!k*WZ&gP%Y7p4KsSGg5>e}1#wC^)!ByQGX~$q z*wkZF^h!RR*)XF=Xp-xZmMzhrX15DEY-pb>924!~G&S!WuA8V*$u(DEDlUub?-SJ= zwOq0zp8!hzh?R(Q=Qgg15x4?MQ?{2@2jC!QGIu5LlXEjiupO}|~mP}~XL{AQGRqpAHn9fvl&1*-?iTL;#jq*NussI>W zLKqdC%QFh2x^SX(Q36DT2uZ$|Qoa0|1Xar$)zM9XnU9{oG~jH`B>YkiO(#?ft{a=v zJ<#*bRIAu9b%liL{GFh^89nK!E-<&_@!B`&=`}Lujt8jorzJK1HK__Y-kzD)=15F> zlRw5L-#Q*!#)R3*n^rm%!ZA}?(v&h<=SQWt%?NK5vIpKAghj_CHSv-D=E>=d=Q73& zcO@A|yp$u)(O89lw+#n!9gZE}{fFMY*rD`u@pAj-iPLc2Suh=Py^*|kt~QEtDYR*Z z#^XiNh%2mqKSnT~knXuc#r@}+PZ_m-*P(zJYEGEIGQ0vYA5TJ2(@NJvd3Nn&cu*CQ zWT0fLLCfI4j#^~Ot9cs1^m{qY$ZgR}EAfLybH5~tiZt<)H08CMaX4gEbg zkB|K;)n-#Lg1A|dIX_d^XrPp-Z1f( z_id5;I&Qov(=yK13Anspf@s%mOxrlUw-;d&vWXlN#3%c{qwF_7Dw(u@1ZQ#tLzuof z;m9^DzKJ>SKr9tU1*IE_&&SV^U>!|-P2VIFXGJU>q=eA)Dtus1O11GyskxpS%fie% z3*`w}U>4%QD2zRJN;A&~nRDgiLq$aaRt1>7k_liFk}aJ0HDKGIgS|4e2P+9;%4(2s zKcPLU-fZ;?HiJrcypg$49L{n!g-=ite7?loI}r-Ff-t#FILcxAS}3gwiwZ`ZO;u$v z8h7I=FHVEEpDzUYEYAVU~>5C~N@o z*&)a7++EOSH7clu7k&v9z1?E?l!;RHX3 zn>r&^*=IzfM~`zXkk39nFSTYn`{X~|DtP@pG`{e0aWktBg3}v8!18V%h5RuBS3xro z*^;T;Jdtyo%E*rO{3tK5HR|yE8kHP_#g{&+w2!_Q8~>Az=X@*=N;eq$=(;IToNH!? z*7_4*Ua0C&&&AE%a1DdaqZ3sK-VAnhc`ljh=-8~DXw`aVMUm=TYMF4>-!@TAH~u&7 zEz&}lnMbJoD2>7OhpR4I8KzlS?!FLf0zmBzMR^V+imB4B|B5{OK4V~HvyMtipI|iz zd^VpLcrvRjvk1bMec@wd0KOT#!|e#WKq0|w#@ z`&YJTyVf`=YOQUS9o!Mn^M5shXR6!8I$fb$MH=O>f}2+fZRj4S*n7gi6-Dq2y~HVR zSgijBqK5B8@FbN(dyR(z@dl!krL0zgBZaq1en~DQEm%U7fF-J8h1g7AwYsybWof4b zpnGEq%mFJM)O}h|Zr1`@0F}?eN2&0vCdsYrH*i-ZwIR$4P#&Sv?c%%}QG_mRw|c%$pvulI#p#Z$K78@#MUY094{O7dJq?rab&FVoJ0{rh*em-eZ&ot8 zK!z?ZWY<_DHuYJY-=V(qqYBk^poS%HOraEEYDJAKLy>t_48b)sx&lA3?_|}HcTBEX zi$G*4Lpfw(aY3c^<-a)vNQS^e+#j}_x2Y$qhcA#gYjB3q#g1TINc39=2Q1VZzW9=< z9dg{l@tC5YP%h9;xUYVmAf>r6>YMn++ zfXRvyJ&woPjPyb1%-Inuk-RiL!6nKRI`B<60pZWYkS{^I_|+kcd1O2!Ur6Ez%I)N$ z(>c(Zz1l*BSyNEmE2aZDBeRPQ)<${*m88~u{i~=DUijF1B2G(KU(?zfHP{fzB_sGzGUP^*EB7jRM zk`5goQDEqfXqe7xdr|VynqeMW1 za3pDRhxr!TvTrF1(W!8e?r299^wn@*-KRCQVs<)ZUs_+@7m?&S)es+!uB?BOS(Rb7 zBzR;5C(l+;@h7nHZ9%AAm?&x!2l&U!Tk=!a;rXRyw&N~B9Dq4G>Ie}bz5*jAR?znIwxOptWzawOeSSzE& zEW}qH4#T{opU2D$?;Hw5-X>p#2IM=a&`QilXp$yi-B^0KNbqM2&f04~Au3UZ+%^JG zo&L?4Enexb-T2m!V5+Z3uQ0}lIKqDUu6EOZ{dM6k+*r)eT2R5HDhxNc1J-{Us z8@&PB0drp$_+n05x8zljFAi)l=`%<>V}N;=411+!9BHIXK7qAcOR4o4o7gVh#Std+ zv_kW;#g_?UvFZcs$i!gt&GSOuCgkR@AiqDifsNPhZvr(&jdlD)=+{J4g-asf@}MXi ztgt+~iii2;dD1xO^GdUmPsW`TS1roCqYa#kiXHb=+x08?jUBr_KzY*O)J_IL1I{W&C)iPj?OWWNox6EHwNSg+G=z9gusMM%8GPHuizUcIr)s4EeOY( zwED6!8g^ecMlM2&t*v78iP8B%1fxf`dObd&Rs^v&4R2uXkEMX2ClN>$j* zjZ}pI>$@)i2gqIR$ok&YhX`s%l61Kc9{^avvuZ%gmz5rqD`o_BAlbU}s!A_DnLP!0 zJcpFnuG^LWp1G1-A9lTek5cz*Snv7a?$&$#M!W%9BWiOwBi?2KqAydjzq_WSIEdor z8arKO#@Y?E$Zde(o>DGKcP;w+sEIdpa5Om93L*gNSu7|3Dm@C{#Y(2cA()-6K3d{x z5n4!2&C6hde7sKB^WSQB270@h*Nu~pR!`;}Yb5Dkfd1)bVx%pHkCD(ZTRRm#=fQNBKz{9)nkfn!?QRcJTNblm9 zR%9dHnne}#z!0IV4_8J=zYX35WQVjc=^ifef!WprFlkRY7yHU zh5D!S{Ee7q_uv+VrEzn84@74IF&Izhh^2&e8jdhP@l%~Q`+nv0$DWgmeEKulD^5@Q zPHg;z%N>}yyPu}43&@R}K2~qvsK;aVX0guM$LeF#zLsP4f{h%Rof0gq5+@CV8^B;l z0#bjsw&t|kG3|cBhB>mM4YMIK1x$W-0y}jMNoTATrQL$*zh-x4ru7oSdn`^uQ-tyq z-f;A2axj`ZfOuKlEE3J##5_#pZCUdkrt+bDY415oxhpT{V^&{0A9it+H^kh1RJpe? zTiYg|89{dPWRI@6^Qa4SSL5(#ZfSy~+FGA>1!_uzMPV z?kGlf5r@_f=eOT~(%$c97RxdFLg`eW2{ohd%p(s`?2lggx!w;?ZExKyY58GNBaM=s z@C^!^o4?goa*@)1U-+B7ITNb%cEkWR!vFdW?me*qNU=}mIQF=KZpzJv`toXWD1EmR zOb>LZ7dV}T9gYt5;;k-sLI)38F=^(EqXGfw=zz$!p?!f#ikp8aTeh#^4Roqxzshzu zX^0#RgZBP}21lyX{Kq>agQJg+r;|c2-<+)Yh`&sM-0!SSUx3SpSq=y3_udd~YDhLE zoAg~|?HRNi2wT?ASCg&U27S|I?Xgq*x3m0YI(6G| z@UT5(D&vg$%M`K5_%l76i=1@jWQ7?8LXz)-vY8I0V{?6dS9+%R6otszMEKOFvk+~3q3Cu8Mxyli3EQ$&PqzB0tOuGO~$@-qrtC2&Q%sm6rju|!5wH`Ac9N{%(?ks;G(0fm+`-fSfz787YmSURSt##rb^mn z(U@KXg7J!oIAz?Yrsw%8Mo`$@W&@H$v9c$e*^|iB29Tq#u%m!Lese|?K>Ob{B6n2y zXe!%``Bzbu^Ih$%n6%YuacIPiIZH9=+zg@IW93)1IbL#+I;)es1jV9sluw4MB72*^ zmNf)gNG#B3pzNupt(UH*8N6QgwZHD`QdJqazqwT9Ku@i0kg`-dQt=aKp_&Rvk5dJu zJ=8AF4`C+n6E~}gM`J^`m{*RhFlQDg^dB|Fnbf<=ZSrq6@V_#62+I{Gt1M+C7bbTU+QpELSB_LV=*%V@!%LK0!^V@HNiu3uL8`}Ynn4?1RD@SUO}NSqQXT6h zjWMB*bny)+N#-{+rL1ox+-QTL*l*O?Z|oI{OvS4;8QIFL%L|{0c55nB`I%IBCK-i^ z=Q{&goaUDpPP(V?(+&KstFnzn&_+43$c%I2IE;P1C%0{H&d)_4nKvPAGXiKBn6R*T zE?Z?A&~ery_k;(qt#;`?QZW-*ke(olRRnllG4xcfTmBbZ59d?5+x5WH<0ycJYWx@_ zIynZr*v3NeQ}AWfeBQ$gVQ;wye^>(gpLm1~QY26wepZI8B_a7dXAVYR?P+R&e%^$n zUeScy1Og}pgYxg%8LbWBi24O*RHPI1O69|S_-kB}mM?Efz%l9n>g|%uM?J$y`c{r2 zLyOGPu);dlk82o2K(!RB$;%&UHBUGq9YUaVv)c*r{Ivwzj+<8BGs=|&^K0d`_603ikEJL1}OC4NZie_hmzz z2+%OWQei_G>q+LnPgXMjmy}Wc>=^tYzoG|V2_V3OS_bY<5VGF+N#kKj+h*?g^@Y7D7;isNzlohjZQvO~4gX z{ovurXletM!kdGo;osOSn5=ByKd3-06g3x6c8TzhU(1J|{MmOP0R^|6PJJ-1|3kSd zw!)P0OIg|CW;B_~iQHHPjfRgd^<5`d6ajV|Be4iX$rZt@_t&9^FY><3Twxo26rQ>~ zSm`VVhtN(`Q>sp!?N%bcm-zPAH5e9T=(>qK15wn+&7Lxe$IM4lLEAhdj(kkYj7X5I zOex5TrhuEz%C$~sTQHsusnl87D+xf=Lr8DNLuEM+dsI z)vw~g(wR!0-mFS~JttLnBekDpFSe&vZ`AmIC+TYi=@5zmQa^H{XySh*_QX~AQoXD} z=6bn*FX7~a2~-BK))WBSnk>D5`2$W!%$rd&wAtHa8Qrib>TO@V$a&?G3mdPfb`AK6NaCi?0(HhOx~_0}p^pm8lH zU8aq3jgdho7~A;~Hr}&hqJFJ5mth~av8tq6{P)An?n{X&vzj{>LKT zM=F*nM#)E=CfnQF9G~LCPSI5Kv^y?|sXt7HARqG`yWbt=hc}Z0O!uhYohWHX!WQsy z@6E#c+lBQH0W`QJXllN%e(7@mtAcyR{y!fd`fAfS(P+MouR6)w(!gqS5^WMK)` zGbfAq!i2wxtOkW7NtXXNBF-Yh*Nuk+2p#>M6?`aXhk$yiW=V6J@L6x)q0- zBS^%(;pRS+<9*48G;6%{Z^O;nK5RdJUw4%I&2zMcM<)25G;5!~1Ja(Lg}4A0W2^%Z zN_cuwHj3|`hohS4PRMUT&9oo0P_zU)I-87-|4hK$K*3dG&*14X9$)l z&@dN;A*_#+tH&?L+sy49m6F#hsNpQGX*8EoyZXtR2L4y^U-Yz$0C{YW(myOoCv&44 zB{Q>v<@1F}x*_B4BnF9nhUk5JikO2_+|NNmnu&Bk3JiD<9g0o32LE`;SDVj9JK@6u zPMHE!1y4^B#k?04wC}1wyuQEpnq2`^6O|0=uJ4FM@N_1 z|47kzMlGcUXVFp$CCf49VlTXu%sy)nW!r!~9D?35Owg+}& zT_i!;5*%i6p@rZ0bXvLYu8olK!`+Sh`46g@h&Gaa|FIx9^UFP}_qSSF@88 z(=n2xqz)Wf?v1#%M<*TU;`FRMBbeO=yz-#6&EH#O!@y)h#P<_jAaY~2GpOvoibu?L z2DMV{M{?=O4BSNX@Eks%1I?16^sGyIoOR2F3_06>Y6IqahVM9HU07cT{O@wTjngvW zt6Pw^2uf*b>ywA8;0%R&`%0BF@8AqoPH@{vj2&H1@b5GCjSE~)j!onI=DsKB(jLV6 zWAVB)dqd#^56QG34=S1+8hE;2gJgPhAE{cuTA7})fa{~2Ob@G<2Ge__qRl#nRu*#% zsiOQ%NBYN5N0{i0df?9iOzP4wd65%slr#jJpm?$y^wFX()8X;U@EELPO*ke3gc+Yf zA|A-IB*G!gySbJBpS|yZv#Y57e{b);&29<_5RfJ$5K1V^>jgvSQ33&^1`w9}TC%bw zYzc%CLJ^P}jr4L6L`6XnQ6Qi+QHo-r2rA-Fq6o+zMJ!1Bf4@_1d2`>}O{4sN+)pNZ zX3m*2XU@!=IaBU^`0xr|mYC10GGE7S6VZ>j_otGTay&EmjSlvSabvB^#t#WoWW6$| zh(=|J&cagQ-hPj>dZY$chc=l}U^1+aug-yv#&x?(J1XEv!bvGS^w@;dF zofUf+e>-D4pi@qqf@S0E*g8YjZS(lj4v3P+~0=X$mPpTfmbM6&%{(_ zy{oU}?yD{F+4#9md@gIObpgLQgh|eNc;IPk8tyIPy<_9v7(b#~$C&nWnYzI{yLDgd z@s=4zc75-Y*@G89mxf>A#UzgR`(wQ5$e$wq7rx{-!adx5X}>Rtse8C?^{&HAja#X+ zu%Whk#C<+%DQ24q_^o4ng!4$0bZJOQ?m5tYM%zHhL#?m# zGkniNgZgL$r+cShU4^#BdABvi5Zz_yHnw|5m5u!{azfX4@R;zCla{#+(~{sPO^wm@ z(J~FbH@RMbi>=?}g8lPe@d_gJK>7%J3g)T8s(S@?7* zvRQ8r$m!=Sysz+oCr+sl%UkR;=FFJBx z1>Z6eyWqwbG4W{#?9<>jByW!W5HGEopGXl!T+vdu0}igd7>yGQ-p3wktPLyc_w*>N zUnj10;UuCaM0)<@*{$2-2FZh84fq4AnhlQ-%wVRAz@WM-6)*ntjgV*Ug z)w{dROg=srvEJi2Ho|Rj{&LfE%emyP&#t!JSE(9AHJ`z~=xzB$i`#G`g>CdWu5J3Dk3=Cq`m?YOSu*?8IA4OhEMUf zS({?()H;S=2;P)S-Hy)I7Ie$!#Rpo}u%3v{79MGAteX{ILuZ%3tJ^rmiQ_g9hw)n0 zlc(SdDW!To}^8CVsIHwQ?1*_W3B(wL3GgDS;kKX zhXCL-_NRl_@(A?K@v~uNzKbtmJ;&~P=b(6-6N@6G-nQ^{FBNZizkoYK1qV9k00 z!{io}RKSt{_{DjWjIXPZC)8$(>-ve9KvYrTQF4yY(TIGVNQabgT^J;Cq)6G zsxosUdo)8-^?H7n;jJDHMKNA6glJzd_TIt$LpXxgTb3BLv=(C2vOjaw;vGNVsD)j9 z_LMWcQQI-9QHv@Y?K)$07T9N(1MRw4j9;lKu`7MUT9Pio(SZHP7Rpv8PzX{Lm8W%Ps8<(bK zBR#kH^NhB7*W+ah_U3yQi0bh(@%U=Sxocwn_)p(rIBM%*Ctz$1jfV;A$HVwRVOn0C zDqlaJ*XFP$zk4iN3hsn%Uv(!aY}iu0PYmJ{BEl@Mk_KiQ;rjxU+4Bn4H7DX)hMZ_e zR)(;-x~(|@%U=Js(#Wc6@Zs3rn_^C;abNLvujAo1Kh46B*1;J{2ilCSunI06sZ+pl zzH2OASvn#X`!+7d;fIMrI>N*9CxpW~g7CET^voYk`RQPT`Pm)HXf1PM4w^vGk+mB{ z|3Z)Dpb;ElVy5R8J~7W!6Z7jRh!Znkq<1Ig<*|~ZwTE)JC@)3~mle{I91?mi3O9dx zstB4V&wW`e+?IzraKQD`?x#7%aAOg_@=J%PA;%ZSFQwVIW{?Yq&G{2*(zm@A3kcX5 zd}#peXnxi7Av{Akvha=I4QW$^?jcPPmV=_#4X+|=1V6UU8m)Hqh8hE*WlW^kU?{^m zgrmCdwPGmWJ-;?uYlgab6BmscKR?UP>1tdY#6sn+Wmki^19ySeYukS0k-XfiRP+mc zc#}s`E4E6-S?c`yRqDlDd5--DSB|T6iOTgnUWgMf&ACg|x5eraOVsb5vhqt*l<=OV zO4tEEC#Tolcy~1idn;bYd(xV4`tj17Dzx$3`3@d!8TVkHo$J^5JIw{c}U-FkU}yVggXekImwa+M$SE42%8 zW-Qi@pEGUfLriG2SfGOI`ojvDZ@rZwS8Cyv7Oin}7nA5685!6!?;jJ+ysi*CWK>&tL= zm>>1u2cM6?4=&)gE4~EAU;3PaEjK2v8U zfIm~>7vVcm{Px*letZV__f8e{#Sd0ud>oIp##QDYe_S$7bZLny>?ia;lrg9GKra?)?#-8Zz{d3x=kx!ZSk zs(&c4cY74Qy+|G$o;R<5z|V7_DzJUSy^%<-T^{Hk>>L~LpC#*m94vCCctu?c?#rktEI>7-b2?G?rwO7X(KPMc<;(5j5%Ywxp$l_3xD@(P$ z*UL-zs2nEM$c)&A=f@^(-hLF{VZs|Y*m%Z0#*X3G8iTD->xGt~7IvCWD0LO}qZR2F z?`J=fU5A~>?NQ6ykB~X?U7@iV`2T|*dA?EN4PlkoKW}ig=+>t^Xkc(|cWp=w$hz@| z5n1XMIE=*LV2v505f`AJIb~^V?VZ}Jy=h1>jJ~qgOq@zS0>i$hbqQWtoMwFu#&A*;cZn zhc?@&EVVS3%WFm16}*;$8Up>_Y_?!yq4iWdve_zaG#4AKiq20hZa+A$TJE-cx=*TB zx+>lCy9TPgzHYnXnlhQ7v;j6ge3qBcFy`ziqQF)6y`S)T5isEDOe~Co_Q{=M zQ}FicFL4eEhwS#~;z8VkIblX@N-8#ed%VYtbnF*ximx(Fz=`I1ZPs}F+_sg%>}H*d z^YBOD!I9PX=VK{;IlitB=knDErYI1-J%+`ktn*LASLdy-oi;nRzx6Dnn1z+>R8Cs> z*wznmri^#*te1wbjcsi`6&Vsa-yGA4)Tzix4`~xn@xH-SoTi7wCOzuSewzt+< z8r$}8QS`6ZTq=tGwpa8`&<~1!J|c?7X)lW2DItoy7`OVPuuQL?AZz^V4w|4nabG~y z_(s%NXzV3H`APhqk)%8azgolgeREh*9vUFr)_Us%s2eZAiQJFlh0Q4Zj@vZftA!@H zHOt>fdw1a(JOI8kD(zltn|6HGq-%gX60b$tpKil8f!M6N<23$2$KLSQf6Nb;EjUi&?<#166bz8Kr#Hq-?7f!2TBx(sjsqlMApYfj-0 zGJ|}Yb^knE#QG$@eYSqvHTbmIsp3|~FL0ZUo#=`-d5*qp0s6{O%xt|ik(;C#2=ky+ zCj4h2X_#>BX*kiS#Wq6M#s6*3B8F_Zt;!yX5%w){M`a!BSNQ5Z5@g)^e^Kl}eBo4R z`UdO#Ee{*e%5{+!(DXui2anU$zZ{^KI4De%8TzIiz|TsgJ_( z6s28t8ktRn--yd+`0V%8olXbS3D%pFa3K*0>zw|@M~GrB9fM!Hwf@*KyY2Pb&|+xm zcKlW%zxw$5esqBw7UBb*b#1!7b$9>kg4;uQv!22%?MJ<@$NF(P7tqk#Rrr1uJMAK? zeW`Fum%@m)Mi%4$55~#z&5^MF!Nc9rXhHO-? zmFaVyBy7&m2sURWx*tf#^@EWUr$eAq{Y_H(DIP&v5tg)SyYH4^*S5JTWJv{Fs?2n=GFEKD*jYJ&) z;?dX|V&lZX3B!I4*sT>dV&weG;PHB4q}=%*vKrF7`82BZZWYhqmlnAI|xc8w4u^rQ2*rg zBCszh+7^e9rZp?u4lZLQC-5cIn08NK_jYLs>2{2XcKoht$C$%*Wb0A?F=s zY+%oIX$jpTV;D*G`g$4|&8gKHixy$4P$#X$!XhXfZ^IIREaYo-==EHUv*iOs{HzKq|;?8L}X*frmHoS^5 z>ib1WQL^nVXTFctY~8&;yEg)8Lq@~`U`|%ph(m}HkZ;6!4ba~e&T-k?FS92z~9oX+nuIO!qG}ksmC(i-*z2xEuz2V~C z2K26rBcx?*4ajP0^LfzzkIac)^bbIqYrFGbA0JbD7PO&DG4(YI*aM`#P-{Zh%2-IP z_W(wF0_JEs0@$NuUT`9`K*mCB@YBFNG7;Ve{dp@ApW=KOz*9QXh>}*K z8IC=IeIbnQD3n%`{tbNGdM%eKqB;rjA3vS`V)dsGl3T+3T;W~O&LR5 zmLO>bK@ir9_A8J*>1HIPGqyPgAk(1;tgzWl)1b||ISJ)uEX45a01V{~Yrx%*zK6^S z(Fy4~nw|e9V87|o61qdiLOTDJkbJt79()N=39O4b6m|z@PnWh{M>hlWeFULE0?Q<6 z$T%VCeVUYjCN+)mZ-D(Bf^1ttn%30yr_sF*mYofCA;b>Hy0kh6PQYRbLB{3)>XtE3 z66$qv_4VpThdoYqS_~aRx(l1q9t~`lqK!C&G_9%4BZ2*lqK!I)G_A?^F<^hDXd@1x zX-ZzR^&bZIQAHbd2x(f={Qe%;Ke)7n8q?m462H|@OSb|u8^*_qOqybhRw7SYgUB^a z86E-hG07MDB}7u$PW5f^17Pn}v=N7prZp$NrNG{!Xrm4xO>64+MPUD;Xiewz6<}Uf z*r-EDb21&Ze*ya+MH_Jloi|a|X60!2g-#BVdI>S$-vs6s7fa}GGKRsoIm+K1Ekli( zz2!;Jks@5*#Ex%>eHqwSWH}*@=FZ5si_9B>?FZ%|#o6o=KlEW+oj)SBOwwYs*7u1= zfO*Wt5*njw8*w%Or0Z_xd<(SLkzw6K_-^XUYxbChz%EjGqYj~O%UFnA9{^@Z(MB9X zn%1-mF*tH#lv5aW2+dKhohg3_n2Mr}ID{58q&*p!Q(am@+GRBPz6tDsYc=W<#3mYI zCjv7`VnbT}v%nnJ5PKysf0x*hZGe}3*j8r}T;;W-yByMX{|4=wk`u6mc2}--%qarW zj<&hkFdf*=hJ5!0W|oU3q&b;A37A0x+6$u140cjb6-V|whY;w2agoPuZM`SFd zZchO7luJwKMVFS)OD>Mk8!ql`K<~OZLRz}uEKGTx2ljs?E&B350BJrk=fA$3!Nme| zTBxVyYievUuwO)wy@=4iWh|tguLJXjqQy7`G)c9gIR?f7GeKfGP626Mo3xXyNQ4`_ zQU*eM$ynW}Wo@`cyRD)%TlfHAbWd-0{)X69s;39%esVe**e=Bh-YTG884IcT3BW9H zX$hV0(h|DR#SyyP#a##JdKX7XOJ}z5nZSNd(xTp%0n&V8&b7XrW($AKhc#Px0yHpD zY5`-G(2&xJ*%JN09It324xtMh(w+;t!tC-?|{XfSTXXA*c*}-Jr+YsJUo12Z+RA&-?~^r>#2>KR%c5< zd%3atoa2C*B(WiUw*zK-7fVQU3d+0v7bV~Q@Q3y*DBqKt4f@lFwei z>?5&|m(W~A8!Yo0CDDxv8+CpUh*p(+qYkabR?0p^oes3%Zn72Yj-r>J&w4JO4M*g9 zgrW_XU2}>!A@o~?p=NkphWU5K-`5mO9sLBO zm+7<&ZIFU6wKZA6{JSm!`+vkCq@`{NNF8iRYE{h7C_%O}%kpwUAn~w&llJq7p_{8x z2vG*+49< zr6r_kO}<9}`x!-R_WT}Tl&6LsMd%qx8&aEdfjLiNK}+ZsMQfIN88BD4w1hNm(3Vk4 z>!2mHzQ-D^ngBK>+X{Li#MYx;OisLpu#ch*dIT(|2bilcvY0oxOG4}^z%EpIBMzYp zWGtkd%YnJlr6qK;OH1fmE{@P$F7AFn54t!)uP9v9A@nyDGi&x0V7{ub?arNmG}m_L zUc@w?@rM2$_F;pb4{JRE`j{wnLXQB@kkXJTLq9ObD_VF2fRwKjqM>tvJRL)ZK#7O)@wOZz8zYcY zP=*EP2*SuRg$-I7jor0jUTn&7V@t_TXiM2E>Q=Ox)1!)0u;&rG88Dl>oCs+<)GFqa z8pfHd9U?1{b~zT9lERL0h5%`A47}A;|fqP#JVi?sG9`#34i< zR!T(ZJ;gORHkorQu$7q1X-c#uuv{TXPK551G1$>I@Z4YV4O&(5HD!3Wp$s;7mQ^WH zhtQd-l$f)luauzOVJVzR7O0#-Ye6hm1eB6mX>$$+q-6-M4@k=$xT_SWh(qWm8LOKy zNc&x2zUR^s`iVMh_&Ur88x}7ufq%&X~j9I?X5M{Kl6vXb&je z3qGu=v3bzKfYb@B1)*QdSV%p81|v4?e(795norE32di_MEzGN#8f$9o_rPj<6m?gr>W63!L%Uw16c&`}orc}Jprm>du7-Bz@w5SgTjd*CcS|+B$T!B_J0qky1!tBU;hA#RW^Dv11EC#ctZt4aEuT*#&^tdE ze-A;B`3Maw4F8_sVhEiqV`v9Lr?@ymv{$U7<*BgP>9Um-uA7C4_4|<#;YTJE z--tsf@0J2UJZuBz>_+T31l9xhH~@L2P``~;qJhYF4(=S}Ugf!paXd++E4H_Gq*NEkg z$}v(Vv>YL=HM8dQLh0X1tr60+W~pZYOTSdsoRFps_G7M^CPPB55ZE{IM?BOZaa$nv zT{YUxoWxE?kfn%>_)q6$T;;7B5qhnrvBB0LHjTUoAyB5j;P2lMP)gm3q@EH);?WY6 z5YuDpLcrt{R!bNZan2_-dpTmdyr5=T-kZR_g&=7O?JMUHC*+jnxV@mV~Ma!BUhq<^{&BsxP&^#H71b4((q65rL2w@tz z9VNbjK%D<_JN!TNhMMdVAv|?HaWRPtQcdbjlhBy%@-Ph#Lip{Kh*4)3K>N8dQtD?H z0PFw}=f{Ayl8QpipC8BDzWiRN+6>g2%N!VFgw&ApZ4$5%$%|!pLyxJX^{a@E*3*&_ z+z4&0ByM#GZ7XBI5u!v=Ze0^--rcPDgsPP}v`DRnmQPBZmy^vpGB3&@q-jk~9NHXC zlSR#zv@U7o@`e9f_@5X~Tk9$8tKb);AeKWhJUNxS4h z3QoG4hEma)@X8|{C%LUgLCY=XC9R~s5@FjWIkfg=8!#7hP>bUOxsV_pt#vJV8>lFy zmX6x+OYKQ=2J*Abi8V_lmL-Sh7e(VgT{@@a`w-Ahsx=sU1c6esm85=|@(hCRNitQJ zPt5ZOY$Gp^#@@h+3(!GMfHX4amYKGK*M_?N@%AvI-dl}n^IXcj< zM_&%9ryzuD0_?=2^_v1^1_5IVqm$4q8LJybCt>>D3OUb5khGGIY$;;*L4q2c;6#WU zz8tGTyFprxsG}qnw1kEfZHsdnAb2k#r)MoGFLUy6_p=g1FXdq{>OioGTKs(9J z2|zqr4~?;(x(+WwgEluf_(qN649&O;z4iTi@pWc?`-N z->}@3u?)?}LUX&(yj+MIIl%Srj|Fs|8~YLhd9^^%ryeIn5sbD<5rJfY!7XzXt8IZYhMcv||F&jtTJbR;aqx&m-rb zTs{EAqp>d{rloHWa0+g2v%Oyh?P~~9e}uF|9RZ0t0(^o;jpXxBgh4Dx*nX788yWP5PDB_VnRL%P@4iD8??oM^oFr*6jtN~PW47XtS-I4)Ig-;D8`FV&kVxK8^G0&CYQ4!bmOZzKY( zy%S$uIRnt%O1%);T*iDfNQlH$s@G4qLCSVA74;#+l?*lM(I7!{_pN3oAeH6HG6`)a zV?G*6qJ61|L+A!Y<7sPuq#P(yAps$FH%j2mut?A|x-XS}*angoISI{>F(1vANSW@^ z5XvhWPXgV$fYAO*$XF%z69|;d9LdDaQdm!JKj(8B=1l^VmRQt-&^Sw$V_MD{uzW>? zQkYh(0IV!$(xNHOONhOKAX|u#>WR<~p)soGMx1Q`rQH}%;?dHxN9>Cr`4G}|X%FNy ztuv+dhVP7@6s z9uHb|!5z{P(tIqzXD`Laa{PSETK^0=pGRPslZ;Zh6Wu8}p%g;8kC|4W1Z*#Yf6tqG zI|w1Dai*TCQaugrfRu+2IP>F=cxZDDKtO(!PpDhQ(0=Az$J{K*<9R+(u1BCu{QGT5 z0bYbOz2`L|(Y2tSu4q?N2$aIBH&Zey6}xMIRJ;2677`=>qqOT;-EeSa3 zUcY2|8EJ2d^n|kxIDA5J@nrovu-`yH?{BAEOWGOxxlX~=m?iCu{SpEDse*zRW|p)w zEr3D}!&FM>sv29t7*JCyIHeeq?Fup>-sp?H2 zyrl{u&Bzp(-BDw`PO6JRR(G*%=AGOW%e*`b4>pqKd^xaJA^;0T5!z1Cno`j0D7Vnp zWi_X}fW6!0L`ZWAz9B%(aM(WK(h~Z&jQIwO=6e|A;Z!3fB=m}s(A309!07t{UWe42 zZU^@JGB4^%NKY4DT_J|sRa%^A3+`4RPd_AKkg4B8U1!A%=uMhbIqn z%|aj_uMR&#N$l)*;5$ej<}1D>~o7O8~plQCb;g-FqNB)ptw z`)EB=e<4yYmK@Ofgfu_T2wj5It6Ul>hfKNFNTpLn{RHc>1gV$E8bWG9SIU@AQ@TC5 zDM?3z94zN`(7mf@JrkvAcLVKl2rZGkOG#MESWnj)$tR|{lrmON%fWv;g48gfAIg|- zn$djkfSg*^cH!2%;YyB7;?cA;`;SR1bU^4AiniS$w2`Xi7;yua^`-{QB?#XJT32F2 z#w%|%FI8Bt?X?U$1G8&GEbnCR>tYFgQ^xAP2Ewt zh(qWPG6tCl6;w{M)Fd$8yJrwVJZ`DL{#xcmUF)%*0p^&7*cvc%T`VEKrzLf$Iq`29 zfvH~mGL<%jsS$_J6d8jIgjCD;+HFUq?t*|EAtMTi$i_+^W-W;2qL-zadcO*onH;`r!3dnn+;5!e?Z4k6vcy!lYm{s7nqU0ML*(O5?4u*z~i1E?fp4f-A?k+MjZC=_moD> zQb|h*g){vH080?0dI{+wO|zs6;d+}z(E0SQy|pmcBV9Ewnv9U<8Fll?MgU4YI;VL_ z_1K0T<8EMnAh9Tg&;t!=O@sRPhO}ILzbLUGgW|uyyzOEMd5Y$@$G1TUuUk7X+;a=Z z@?7gz3TrkQm84$v^{pti)`%@4khA410Q5UIb`K={k(3uWB#XzN^G^zEb}Fvt$PFDO z>O2mB%n)gD$dUO3MsUP`nyJp#64}L<3*VO0xrnIGv?~&JM?f8*bwUTr7^a110R6_r z5qjChO@b5@i*=8P68`MQKqMY5*#3xdKV6nV$Sb2CG1gV;5P*1eP8y5G*gpaLB7)>g z$dj)P(on{5zW)GiW9(YUS4J2cNjghfmbApN%gH$FJK2}EWD+q9U?(0e_d}p$JB`JN z1&21!wAa)84fxj)r1XSZR6n$wtpJ_v#_Dsv16tMl(Po5nPE7O2#oXcb9@iAha>gPs zZ^YRGP^XHSeRS=nSRmc~4|7ya05-UT!ezQF^?E?u9g{Ht;?a6FbL#z>h{J7ya}Z?C z^8k&OD~r&4q5(cphkQ5$$<@>Xb8e)tWCn9pfn8?@^nNE$+M8T0kmX-L_^r6Kfh zmnI61Qx#XQC+-Wp_p+ImzZa;D6x==(C-zk>BlYshVzKD2ZSD0w5{UC ziO#vaV;M|7q7i)LW^TLy>Gu5aR@h5Qg`RK{pljS1 z0P$#hvkPLoA;`8SM0#3k%efTLW=iDWO zwB~5u3D~)k6UyN_u5qa*ZAA4=Q^I|Gd|Ms1oTfFc#EU?_hJd;@7{9vLm}B2>{Y@-= z2yOk%x&zr{w)1l~>o@v&#gxilu8F10x~H#tnKkF|9=8_CW{+!*HMOx6`R-|$cVA#; zNi0@VgwzH%Hi6lT&y+aCE(Ua)jDZq>c=SxT5V1uF>?aY2kfLp{nLJ6-hKwH|^hdB7 zoaRx&707j!o0E{ulca1gkL}z{3^QCgD!`EIih9hML_$zF#zJ3j{mnokU0sFE?iz9+|AsWa{)A> zKXHNah|MnjiHw-jhuBF7nR2<8Nz3IS>(BVv+Y2K%8mAIRW9) z$^!{aYqm8V)Jr5MU#UD8{ujd7$dWa1I3|wR$d%9i2=qMK@X~?*aE-VlkS=AK2S~q+ z8Fju4?dq2jy_$2Oup5H^Sl}qcO)cDs)E^>HuU>wpP?})sFHrK+QVt(2Q&_7Yt!|mm z0rP^yHgNQMWjVl}3g~P%20%QT(_M(208SVU>+$Q<=4c>!QI&<88-SL%v7?};;~Mrv z=DZR?YM3{)bk3;b&*^DMOI1TIQZT1!tA>F+LGnc(Af#zcTUAD>-BMm(f6?V2>;LMy zZ7a1DGS9K*eF|&p-;XuNU;^lr%nO|oYRsts?9MJN0P$%3?~0htYnHP&urm?l7$Br+ zOIkhUhKRWRD5a+xDO%1k%n$5gh$XMJ@05Hru^1VB6*%gC7ssBOq%ly|f= z*4z%DmUfYOp+`b{$ykUzV-L$nENBVsplHpuoCM6e2r+s@n~f)UHG((}z81i@b>uq$ z9@7!}`Y-4R-5|abCi1ib*i1(@2hgJ<{LO;z=?E_@Kc^$l1K&RCCyr?5D0oYbJ2Ked5;{Xil2;>xxzdhbU3fm(pUS#_h%9F9RkcnJm zOl5R^qRo&%w#1tK>Hh)yHw3;nje9N|h_@`M7$ihOU!>j&GA9wh550;IkFFV$NBXQS z%QE}p*}yDTv{8r97ga3c5Ta_rbFxmmArNcM0~-RfzRGK2nO9@Y(dNgRJ(*Z~B`i1U zu#cr(t#gHi8U=w7oK zV2w4UASFj~W36)47LH|JjSbhT#)fN^-z%0{B_}>wW@=974VQTk6wDi5?s1{mMKpDI zXf&8NC>6150mBVcV9}EaeKM3*-{fBhSaCT7e^nnrK0-XyGRx5UKB4j*g1?-*WO;;a z84Ky*K!_K)S)P9eh=>`Wr)fS~SV|MFEqY_&*d#DB1Qr+5qJ;KD7|&~J(IsOz4o!cu zO;G4MAtD~#vW)2dW{#K+V8;QyTp%b>A?0Z;=LXoixL7>JL=WhZp5TqYy(8Z$?kr)D?ZSW8D}4@#r>TM9)cPkM?8DkwhPI7lg+BSz_tGe~?nBoi9ki@pX)l zxY3%TS7FWC0-<-LLT1!7u(F&+{u(_#wn(^^xuOcUIlBSF*&cQz%3X_aJKTKcqV~z% zw0B$^?K~p)_g{mDLnhkN=C%H?%GG>U)OO75W311vBi35`#b#@A^+z9)CqdL6eWw<@ z%7s7T(WBm@!>=L$qkSy%mWrQJb7W64cgPlk&shj8o8C9qsbOV%bQmd$jvURsb3di# zNJ?{O<)`5DbA-mdWes4tFVYcNGC}OXF0t~6(p6||z9g2W;yTdXCTJTOj{6lh+-cBx z!w0{1*vtk6Q{M*kp@?Z(v-6O4J_1z~E``RLQqa}gOXO{2zSuR%`GYm0tJlmmU)agz zdYD_y%_Ta@jk_PWd8Z(K{g^K zx(T6ilm1xIMjbz`*}x!k-$#xFXwAg}X(=yD4Yy`mCexbft|J?aUFKv2uff>JOgRm~ z>qzaQBN4}rv42G$UKBz2;^yW%|TE2W=)Y@ zzo`*2+`P$q#oPh!El=GuJdSbK!C(uS7g)W?d&S&=W)4Q&bud`A>9kO@zeQ+lkEu5~ z-!6Xw{r+eC*yLP!-oX>!^PjL%3iMoAF#|GKlFH@S5ur*{k=&|Ul^3iR@ z*g*)aMO3`+v%rlJ$0v+75}*wqnd;D}!D2>Z&Dzq7kXv??m=GoO4jTBSRV0YVFWc&y znORg3fm#Y5UloNltq^6WPu9FA?5^^g+5kd-BqpS6E)xz$XwH50X=WVCUIPJ|3E9j6 zLb&_XTX@YlP0PMVT0Xi(cL2=3E9XMpi&Za>6MZ{J3@tZmFONh*`}gUBOCt$ZbR&=c zoLr=_mlERA$CHm=3Oxxa9Jh_-D3G|j&>)!uWP#$ah8IfOB-r2d>qos zHEsc&*PMyDT_LRwYxodi4u#Q0B(K1`;D+2bu)~oy5tw`tc5b}k*@pK(9%t`6ZxnyTxbQu7}qxpW2I2)2^ zsm(81YspwAbKZCvdC{Xruq>;0tu-FwIlR9d1Ia1~8;Oh17;8~%d_~6KHyPfh;_T@xTGOk;fYsp&S z*HOQ#=>3;)DJ&0rHvpf4tZzvF+YcD|{u9R{A%2xAI43Sb%9#kwN9b5kP^S^+^MJU- zlQD=U9xV?enzkiCYmPC}YEI#HWQr(R{)Krq-Eu-uaB4rUnt{T-bDor4wFQ` zMayHg+_uZ+Xm2j+C^LWSkCaPdERkW!Wcr^=T8X7BJm4b**or5t)*ovqOhX;e*8~Lg zng+J`{oe%|-9~UiN*%Jn%`PD4@-Q!f_1P5xJ+{f_`q7|hJd%18Hhk=8tT}d4$hV`& z%U%pXJpSIQYZX5Ce_X42ow5IpMQGfAXG$zAWEUX%myO$Xk-~et)ON;A~khto6txK(u@*KNi1m5p{=z3Yt}N?@-DpY6_2SksmO z(c}te9#|fs%e@9d`yqJNn5%Hk(ftUG{Z=5|-`oh7PwvBo*-5T_smbO(#_C;dalPMI zw~G}vT(_qytT_W@fMLy~ZV7R}O6gYZaQOB~n(Qs;)yT(wd6-`grMm02k2MsgA$kns z5zxm&RxZRgU)QW&PrJEg8JKH56dvdNum`cT|8p^a{CWmwOKZ$|<5 z@lq*tA@)Hz->bJ6}KL!vM{7V*tdXwZ+H@2&4_)aL`!Ok)<7w<%DfGkn=u@bHtgAIiQTt*kS&E zinc}2_A6SmRPtS@u%>;ZQ_d?U(tSPxkSsOqn2clR9RzupNN6JH)nQ^x9CWlGQ9N2- zbP0|{(3|aqnXAzT`N+LdJ2GZnMn1+{-n5e}?+z-jDJ!u$ueq4( z1(u6JlnYmqklw~JIc);$R7D$g2yH22=*t|ra&Z*4CKMQb@+(%#|50EkD+ulpS}72eFK3SHMMjrFt)VLEhkzVB?{5V&@o0rH!V^s?oIv3} zKURGVA!OCE87McGc~KQYnp61wCe6w09LTCax)9QA#A?oF_uWWg@v)1j^B+X0FjlAC z8BppH-@&*GTDTj5P1WKM>a;ZB96)p381jopYk|M%`UC=VMjS%V$XLh@){e+|07BS> z_%o6IIRx^FI)qMFWtu;^xeQoV1frYc!~ffk__!y8xm5{dUTY|zqUxuUL;4#rGn7&y z4xyc73{^V-kp59<^9RAR5Pc^lzS$@jATQM`8U@u5kJcw6pF&_GMFPKoVctXJU?8nv zbPs@^sf^}DL?B!{-0J)ov4P<-J4DWvY-9`!&ZVBF&oEmgajWt^e*?d1Z!WbW| z2>L1Npb8y=ke1O@1nq`eor0E-F4b(CJ5iUVvOcIgp?g&A%vok_VANMoK}$%}ntIw6 zSk9+nJV65S=*lp%JA!Ogfx>@&>uz_nXLdkIUybpnJv5iDdEUGJl2G69|%T2edgBLB=Gd zr$5p?<9?j`U zJ=3Kj^sJ2e=I=it(rx0O~jb*HHXkE5AL(^5johF*h*|{yyY#Is}}~Mewh?oSuXA}Kx%gj`3T+W;vNO0b|8Qwq+9@4HbTEslr2skHgyMSS3yZ= zXBh)!FQ9%GM@UZ;zO@WE#atRh+=uU;vWDJtITkowZ%lKD%|ZYTN+zW1-73C(yTHW} z()Dh2Zb0lt7e`3fyVZFJF)FAD~iZ

Xdc1_#wkZE;forrgK4weVH=M8oD&FSnMS}?DQltTvWzQJ1m zK<~8SWPF-EDE`#v?HU;B>^vL=9aJ6cA08-Ir|osfv~*>lf1da+k(-;eGx0(#Z>@-lKaUm8*0Q&g-!kBoZfd4|R3-&g&l-N`P%Voh;<5 zsZ6z0NG9z>x!5vVwgtCh$>Di^wsEkvQ+B>=mujg(GF7dW?4orRRaeL@kLD=%$|)^j z=j>cQT`44L4Hq?)c$5>@2TaI$z-7t&sWpgTB=kl zj_Gd1H>YZqNcwA)OqY84%g2Fr*9imNL)9+3uhLcP86KSLFDi+mGU-G-VcUspqMA;j zS&QwnLW@e3d%ClOLlsmb5uZ~Xg5(1B^?P>EQZ`Ykq${;*K3gf2>{79#IlKPhA(tKD zI(Dg2He1LgAy=v#uVu=`vDw=WyQllpy>^`YF$V}t689CFuf&Ow=^~CO>32SyqqgJ+idb-L({R4w*d>R_8w;<_w zS65GW-*H{#;lZK)-mbxFd8ivgR;n~BCAO66G0Ge)A@9~IPtS!nN5d| z@>vV^?jIcT_v4`L>g?Q$_Li0}kwJ+{fa?5e-w?_wm$QisLcEkp*7C_xanf zTIE$zTmhvG&#Tx&RW??tk}qZKe65zv6{_V#aqWryecMSbZzr@oc@h$&Dz=ldt+SSw zqUBw;18I`$Cyw^SEcXvoG5-z0atagD*?H(tEidedzs)6Ctrzp%9<(fM?i8XBFm31U zY%Ni?Gg-(9Ev&Z}*r(-eJMEx7ryVj%M%7xpl+TqDsZ1rCOJi`a-$gmIqFYJ<`Y}oO z_rb)9znsnwp(LX$pi)i1bky>tTs5DpR+GgI@+hEwD5Wq%BofkcVocRo$7C*B$!BtQ zIakSNv)O!c!%sEJnI0I%AmBjl>hCMF1+(cwp-{AM0lYNjR zFK5>Jacz{@K-c~AP&8|RzJdQ)ly-lriE=Gvr&7suHj~UH?Bd23)>S>b+N$n4I--Zj z`WNzvTs0N1#LIEGWa(salhs@QQmT|oX6-~FXJh`0=ZaGf_P2bxVALLFzP~I6r0_=f z9O&=$2BfS+B3{mAlgVnfng!2zvN*NmXPOntZ`zwi=q%_ccC}Q>rE;}I#m*;l)mm}W zIe{`v!RvcZgE9iGf`Y)iR!O8%n25^de6?KMY-bcyKPHn&%!YJ+F{YGh?1H1(4F;)N zJXI*9;;B?TZ|5@c;zE>sHfRH?Z6o?&bXJ~n~bNAoFE zOVw$)w0z>Emg^8?Bev# zam2pAt0y#TGFwVy%gGWJP|19znk{ZkPp`gTG+a0(5;csRuDNhbduW5JDY%XKQofSP z$MdN~qPPtwsZq1bx{PYMTsobL7wl>QE2L_rxNT_rqW3pn(4mnqvuEIimC6asE9G=? zyMsn4lDCGduVyBfPZd&yY9eF9PcGDoouie`a)W{PAvj&7H(77DgqD8!4~@3-92 zd0H!#;lbo{)e_dgY0T}#_-WwweyuA}oj4Xd)p#O-sSk5;x=>8e%w&YMP0fc}l{~Ck zcKwM&TJ)X)`-HA}_Q22}7?e|3ZI_erY6in2mC6^B$ACdLBb*auw85vd)8(`Kv|X3O zH?d2pN<3B0q;iFHJX0zZQ|t}?(VohSvf#$|2!F@tl4(0I$O5yp1@pPi%V$&ZbS77W zSCvV?ttzHxYMzh^Znbz^)^u;Y-=XCP=LlPP90 zt^%=e<1#aQu=rCDx*LWUiEPPCCQ**3@AGvOuG56oNzW~>TDWRiA1SE&{YE5WR0+qGJ`lrL56Y_gn77k3Do@`N92O6DJw z*xs9kTmgQ>r&fqfxrPd*u}_h#RpQxPqBw)?;P%{9-*9h6E(XH7uGBhP1e@k|~TN^x;A(mny|`)g;yrG}gtPbItRmxe7zZL8? z?t3@kjg^~}NXpSAmW6629q7Vd$Z$^uX0flk+%-SB$F5B{r81gRU%z5DIJdjEt9!6( zxNmUCF7;HwqDXDZof+&?ROVFs;MycYmQmGgK3}ur*;>93w-cq}p1Xu(Os0D61*NLm z41tT-rRt3KNR`snY$=OXdns#YDw*P56>!L={5D+Kq`i9jOSZJLYVTKC3WeU4T10ml zU_VX7RU^m+dlEZpiBuf>mbp|SUCtNx{*3M}91BTVoI4iW?w&{u_X%r@t*74MoLOH<;1=~z7LC?zTuvpM0WrFzWo7s4hl^Z29fG74f;yXE~IN% zf@d@7Y_^oH6c6B>E&7Vz;3X2$@QHmi43k>6Qq9`sc(#y5J603L1Gx_)vPp+2ixUa# zre^mOf07w7;nQkkkay3)0&N7jDkb!gd?kx@Y$cztE5%Q9t>tsZvZ`rZwI*^whYYJ* z2wFvB!NgWdwOk>a$!CiP9k~L0!pE7N&Dz+0$No6>-744-JD9VMlrg7zQ8F%j(LQ~B z)d9ARaQN!XLDnv0>DeW6iCjF1W!xd0`A5YlT^=47!1AuEx7yo3umCm2$~2WqS1_H_ zuw9Mgq(gb`ZzyNMaQnycV&D*?~MPGEg?#GqS4jtO(C zOd95a>fmq>b|>M9;V&Cw+I|O4n|2Vw?$b~jj*RNhh&-c}%B0FUyJX{(B2mbs62&9M zK?^x^gDztlRl#v^0r%X7D&)+=f_cf#&V$9dg*Ju-yT-GmQWZPka2|?BO;?rAafiP; zIGC|ZJkrB1YAun4K`SMznRGc20zjq@YI}=9G^c8o=&nGON6gD$bPPZJ>j> zIO?gAv2Cm;u)R{r7O>q@$~P&N%!GFp=F60~RszVum=_ZE_xGZdL@sCJaKwhcSSVEs zcCjLam0Qsv``LEig3iue`xda>b3DH7>ZSvj$KoWNOO&$ZR5FeY{9<*5*p#Z+3d$w0 z__XucT(w%P?ZYu4&ug0Qup5h}BsQUib7GeY@qD^moa33y=4LI25mp_TUri<|{qU&- zEYAJhtr4vC((ziZ0=Fcct=0;~x!imhm8DD6y8F5Z=XT8*=%>dGZ6!0gQmR_bRI4TI zn0Nb)hHyybQK$0IlL=VqLOz+qPI{)4O%*>&pE6)%5;=IC($LJu*%(GP8wf@QTPB5U z75i*?9HbYIL$wWF{O<`)w)rx(M=%w9^C(<|sE6~9$6tMGG>~Bt=tYRq&UkyeN z^{-Tl^LV16hhu7<-IJ9jE!jVqNXj*UTuq}g33ANtn+YaVr z_jLVSVKHebg>J-3Pp|mGeM;>Y(o;nos8#;L-SW>b7bUEKOC@h93Dxz!qX&d z!c>dHtG8Uy3pi}kwPb=1%%NRC=beAj>a4GFP~)v5zs-8Jm$&l?&ZsCEqx3d_TdzH%Ph0;wF9v^Z}#aVJzk8cX4v zC$hT^s2xc)66Bf7V2?17xETUFo5TeMp1RhO#RaZ!Ul0x%Z)YS@_8<)PP*=_F?h(b7 zE2UhekjE(|TrBK~7Eg-%G$*9THXg5DU=u@Z{8h8HbgfcOVdJwTZg8B;vjq0=?9g0H z{gwP7;?F)68skFs#JM(nJy94|AGxv(=ebhOWK!_+Pua#O4EHLaDzqs!72}CoE>kLH zD#2d?p4yp*k#^VoZYrAibR z9t&34gjnZuz64Y04+5Y`I(Vpp^^AY#(WQ{q3N|R{)isjR{mUlcvS(^_73s48y14A;bP7)a!I8?Fg4#Tw*r z`XB`{LfQK`_1L(8kuPHhxE4?5Q`d zxm@v#=(bAI6fVgiT`gZK-2)IKn<-9PYy)C6l)gOq3-MqFzW0SoN$gWyQPa9wH|ODoyYc9 zB~>lND>Yc=&qsNV!7BL8lH5L&p5s6g;tl6YxW$40%02yqFq42QOsGtQUaBcLy#+g8 zwM#frjc1GJMYVGi)Qh%RaD#Ayi7OZ7S`waop?JRA8gk=fUVryse_y6|c&K_}B0YEzdMxO>Hk1o;E=gJbRn31wL znZb?8JeKp7;>E7KzKjW}`f~qp-%!50uM7)5NShhQVM01zOQmpys*1I6ad9+dHXOFV zWsOytb`{%JrE<2C!UZ}UQWw7v8Vlnu zMtQ5PE?=Ou5qn7j*BSHJbF37~=_;<96_-T&SBmF|C1U!mzzxMlnQhxy^vf?rS9oDo z!q~-$LpoO~!vbKbc!|)6IyvE_h0ZF5VaW0mO8|Gw()_CvGWaQpT0D`>L&Ig9^AsS-etEfOzbT!k(>qpE| zf`a4enw`My;6gl|DBdt)7EC_ge8Q(JO;@-V)~JDYqT8eU*JmjO$%1 zSUJf3WtR+|)gUjs?=Jp|-ACI-jR#rfjjZxUKM5XANeXORlsij zVlu8Q=o3VebDb{@M*&+not?e*z;RV5;$Z9+g4#&Nv97LtXD81Pv}acouL(d9C?%Dx zCE*xn;CEJV9lTcjYIJ1|)hfwMyqZnc;JOwv<#MI?wdl&8s$m6|OO)aC!)#{JaK*1j zyZx<}Gq=S>UvXE0@a)8it#Y|=BLc6s*hA9GJy1^1R1~z4Nx|>IrW@|k*|bq!Z?kq-ymS=^Gvm2y~$R5n-qhVasie3>#9h;%s;)nu|%!d+jx zoXEi6Eq>D*T>keNxK}>E8;9>W|DaW^=Hlga2Iq8G+1=bAi?;`xOy_cO%vt#au7zV~ ztawY*J-%0-Sn@#XMrk4IIVp);21hNtlY`w%>{ov)YD4MjLbA|rlM{fZRyHHXH!74Y z*#(?wB?0~k|(~d#R8zFA#@=en~9;Vj@DfwuMXyhA9mN$ zxVno)98QO_*x(_vRIoY#nsJx@w=<8we@}(c3W}F756Gr z1@3c{inm9HpsT#xnQ+z6d=hAI3tP+;t^xy1gp1y#bQyPaO4zf`ms7>>y)VVuxg;(< zmnzuV!P^nIU-bR=r&#!HRjdJUeJh(t;|A*;?@O^|+{`Ga;cR2CE0ay8i+4tOa+#NB zMxt#STjPU=ut`ydHP)s$e2lAQISsXP@$Fgxd(g>D6_-v5SZNmTigF7!FW*%gq13QB zV6+8i({{F6!u2!mfTyq`SQ_OXY(d^`8KK~jt1DF1+37dTqSjb5bLOz)g-i|y{}s4# zbT&;>*@9|P5 zk;#_xIR5y7)WE2E+o;;Tc?%S(HdZ%qZ*o;!CXeNC zh9@n!MfT&Uc+pe3MPhw}Z4fSR8rZA4choA_P{oCre650;7}%aH{v_JQjpP3E!_oFi z&;Kv)%7f&n&ii|>dyd`N*`1wTNh=AV+2x27c~;YN&)O-gS2VIJ2)P6#PPtOcoMKmd z40|AyKP<2?HsJ_1fk+q}FarMIC{VdV8OK$aKL`-x7?Rim2@-KA5Q`(W@C6R}eXqM` zre}IryBw(;P@3)6-S7V1_rCXizwc}F@+lq!^tnp71NrD_u2!bY<-h0N(l}lGkbB7s zbE^0Z_gR>SAMqf0T};iCasHp1-1QH<6N%Bw39%!wP(S9~wt}~I?^*5{G2q+z9EXD& z5y1Fp0p6aIr1!MFOaGCtX?Rw*ZrIQNiHFVS_6_nZ{b%0SbhGAk`V$_q9@Sh+f66^l z1AUl#k+-!zzFH^ikD0Snf4O* zQ>t35?)ew)rQ6j#|0*v^bJb(qk2~_f@G@_=FGr?dkuQvwCtu}0+?^~=R9}<2Mki80 zi<@T^6MqWog0n;%)=f}(C02>S=zN^tMn_lNYy@!rA3UWlj>h472_zvDE~OHz@`;S` zZ~R;4_?SG|I!yfk8J`x@S|JAa%M9!j@L{OrD@EgVehvu8q`O3=GMXw9ZD%%LV7krc zMkMMGsE-CnBMzZi_=zP80G*U_c`cbS-rye==#tLI2_#JBo>-aSIR7pWr)G=HUoC5` z137=S)c~VAeE4yUh?6G(w!WWng03{JA(&sQ`Qqs8o{=f&Y$~SdI9`fp@+C0qYz#VG zK+R6@Dzawk9=jNXM#gGU4h9I?9~vPjp3ET{9E8mmDwS%vcz${JR&q@tB|>5bH%16y zNcthH-5gxe;3OQ&CrZUk3|r}&oFJb`^Wa0O)5iK5PPNTW8D)wGk;I;#1l$Lje&a2E zHWfr!NF=Tutf6_tE|!G11qKL)8slwFc6tZ^q?T&x-~tuqi%<%|QVxqWTn1pneuvjw zIFr=y%tU$ilBv=RToj!OG3pczMjBd@JP=_e8IhrUIqj4wOkJ*oqgXx>FKMtX{YQgh z6^+x<(m%(--jns77+{V(sFLs~fLkE!TE@>m?Dh&T;6fJq*<1;MAmHd_{DK!6N0C(L z2~6EWejC>6BHm=)N%t3DLY7F((a)m>shp#)e(5(I0k{7M&3GOBGX<3@|+ad!~T2EE)ePwLdjtt*r=?V>PM09dqMY5z;lnI;#UP2Mr%^Fcp}U z6To47@Uc+!sDr8z5{MkbU<(BT0A?}c3b7Qc*m+aC%hR8OHGJM)z=#spaQcT=Um^+r zT;s|mRd7)i;D-e($Yd)x*#gFp2L3Y-*Yhunn*RZfq_pdqE5&UZ+m@t_KV>9LZ}7*`8|;z;tXFGEY+4gM1=CSsLrB1ZO2 z^6vkt*ooKE=JBdwH!RGJjspw^nEU7RCEF0?E{?jZ9)aL3A=pN$0&GkQx=-V4;xl%` zXflC5GHcK@xz%G~&lP7=mC>>ZF@iY|{1E`l7$6vs`L7Wq<xIsw4r?mxeMv+aQ zovXqT&m406As{x&DJBu=q?AmRU|c14IpZ(p>q#8`LRPRT%$-?Kyk1Z#2^%$x+T`XA z%XrziQ6$~R(xJ4D10_&~n;#;l6@bnz8ebPRgd=bw;Q!4clJvxdRSD=7#9T|Gcko9| z8Q%~!t9{yxA48sYyQlNjIxMo1gbxafYTn!n=FNgcWT|k$n4BG*AUhg@G3ASZZo`2Nf_Wll+#;E{ z<<4$00BR5LVX_54NSOvx_qE?DmK4EZV4_dJV2Re}0T>ZA8)#+@U7UhFFK%6oAkWGDStpHsIyghWU1#m7cY3#4F61&Kp#IKQKsTK#` zzn&s%V=_^Mgaki~0tB6eaiG2~%u|!otxe0JfCi_w%b?F8*$vivaOX@3j^K!Sq-n;j zf*iW!94^e--6jG-c;L_p)PBAM>7xv|$VVv+E)2;m4!ITJbO26G7`J_t(zG}lRe=zn zNoRpbD;l@gsnzUh8fq?Rg0!Uh7i0_fKS`}6Ks?KYktInop#eD}H0LN;d2xK2AZ-#x zHiy**cu>4hhQC7v^3h+rtXzamf%`^%<(A>mf@P5|K_vv+c*eM+A(QD8*1FsghKZuz zWn;jp#IVU4cM7RqB*L$6mrkh_Ahx>His%}RCu%Gr$o{}dmkAG#WBj)TK?NmEG?bTf zps{h_f!iSZ4HE)fabP{o=3wB2asRIRPSub*Yc^mK$USnOvIOur<{Xd>Z2bsrl8I-G zgW?OQI%OJw%#|#~(|U}E#jat14zhKyS@X|+m(n}?Sg;m2ym4IXT@0; z`xyS20kD8l2YwS&P@woE;5PS&8or{TptM=g#ORDgNAnbi^_POdOM_Y-=Z*yM6@tJJ zACL6XWIYEMGnUQ5h#7;6hX$tOd!Ta}>mscu5V&>&`PwbpFB~K;HfU>m2S+TgO+Y+n z%Hnjl7fcU$dalgU^9mei8wzNUH)_X^W+j8%ndU!!IE2!c1FxEOX_bXhl{%l~=eBSE zLr`c1X!v(2@=gx@rI>C&*V-s}0iEs=oTvN_ z;AxjS=b~-f{$ydeCfx2vc3gD9g(DYSc+SYy^Di`ZoUflZ@<;l4)V(z9wq?Lx5vvTY z&vC;yJa2O>rw6+c@zGLz>p8@{ia2=z`U3bfm}NyX{JUI-s2LX__2VDeN1*MKp`TM6 zE!$VL4iow_ITiT2oX-||&Y1@cX&wIW2BLRd<~koWk-oOXn*7!pSg0-LIL^jR(Mmu{ z2vSvF7t)W@q@Y3mlu zH#j{-nnXmW8?lj$=&OtZA%+tdww%FPEZ)JsuBv zW*66JgSq%%EV2&gx)h>Q6e|&O6OL-}Xe_(lQ>1c6;;}((FdHSSYILTwE3)pA+1cvM z(8i5B;S)4h0C;s` zAY*FlgHSX^QATxY5_$%2Y>?^;(M>CKO_Z97`^nT`OulU2FXE<_8H}-mybDni$oB&W z8uAF7Y1AkVT`0I zbwfL%#>|f5oHAG5&;@S+ItE2|%0MkRei~^`5>N=15FXnsM#bPgh)V=u6`os5L%Q9>vG zDewjeu^lzv!DlJ#Oma6hv-CD)k&o~_0mx-}#2}ae{Xy$7;=qeA#jKv%icJbx%(B|4 zndS|qy0>ufi>4jO*|b4BPIgqPccKVK7?of^Cd@X=Q2`dftVgAg&-ixLvR;)bUdEZn zBR?F42>B}Wc|*!xuCqY>$7iVB*67Kjs*Eqqx@dKo;iFl1z#_aU-g5nsL$4ye0_kJNpSkaz8(#d*+emkz zn65FsKhzOnp=B)akSfGp{-w|=vmW(KCN{PHAMy=&)(NJ+`=dLr64=y9Fe4};Jfdt1DiNXcbAxUA zJ|*O50sR-tFYM@>&)l(~4MbWxCO)sKonNe}Pi+^zq^*2?luvITveP`&!OS+>?V=7~P69MnV*?(HhQczK zBM;3PO`J7n9-1?nIP1Bp$HqW}EO0>K3Q=Wb*MMSEON5W=oalnlu&bCtE4q{Nmg18h5p0& zsyx~IX<6{G!*_r0_yb1{(I8XFZybI8+9w{kl`66d3cD8kE`z{UR24V$Ier4a^J$T@|=*<~OzWe&kcU^sO|D#B*M)KvuH}8Ayx|a?SLG{q% zqfgy;%ZdHpF`LTuz?gm(n#MxC;37m0fxKB`XxD&13q%N{)qxeMVj0l7L8C$;T1!M0 zTo<$eIsPH-M|!VJhlE^0>qJNW77w6+5Y;eHtAThR1Ho`24~vhP z$-ls}6cC}!qcBWOJWJ8{Kcl2YFUD^#HCu`BwD9APqCXVFz=kM?+D~g;(5Q1=-2#Rs zhUIz@A=wSJACrP=p&v7kg*2cBS%AicW?N@nO>9!XVg&|An5zkGlS@g^Se=H% z9mj9J%a;aQ5ZEprzUim;??3b#%yJ0n6NkV5&0DT}@sXb+?MM2J7k=>GJvZEbBh5OM zLkmfkLkT(H&w>-T4!GE4{vYbozckjVaK^#OsrzUwdfCAPO;duAbxa93r#U4Ud3zEt zEi?%#RwB<}62QH-(00)>3Gy`zpSc5hh#esl=!_Z=A(n?iRh`d{^@B5`YP$13U@Y~k zJR!{M4#BYvgRNpIVH1|bK`fg(JQniM$VSvC0|^X^ehT$k&2f&~uZ#%u4~O|!kwb5SRKiHV{?apdef8jhza=(o z6@50SN3K{aEeXg=E7=QCN=iL_I>{8e5?ZN)RCK?7#T9Bu=?CeDR)To2_zuQQBI=8< zVUj@}Cow{7($B(5!;>dJpjD%v^?m>>+gkBy5>SwM@F@E<|FygX6~03kSUEQ>CjsNL zT+mL2A;<7wfFY1jaqW`>f><2LYlcB40-vNL#quFvFjEzD~X zI1AT0J6GML^D}W#?;3TG*04BJ1On{dPWcTb{#tM~BM0VqoaE`&PoKmko_GW@E1^wo zU(#u9 zUSnbM+Xa8T(3hFuI}0~e7!G2H2vLB)hBzqOOKLB7-kXq{^8z0+bpa^2%6T6$qZQWZZj0^?-6+lCD%z6+{!LAlNj# z-SdW*EFp`lo_d(1)0g~d{7w)B(nhQ+xLe>80k8qYO2EAM$ZR`b$<`#mnU;nf;cQ@5 zPGZbqN5Gdu{F@iZnx4oPrx621Yp@idkc3u}XgY)~M(EpE#b|Ro$hCiVfs%8>a}!ma z(Cemx9;FietVB@QA|ek0QD_9npgdo%?51VQ(y9tXEEXvMkYsCx3LQvTxEL0-LJnRC zpso&rd7PrGTHF$#P+|K5R3x1#rYUG_a8ZNgYytpJh-`<5rHIFX7z)sxHlBUES`W%0 zLcPw{MCStdFw_a>PM~YDaAUw{6k_nvj~U(dlX;ko#*3@Gi8g7lDFia$ZTL6`U~Xxn zXA$HGG%n@|Ay)x6EmM4g3_Jp}MlYdR=WB;O=P`TE6LAC{w&p((x6!=-v?2Og8Rm8R z`amLKEE`^8p|GE1fr$X#14?rQI8COFMUc~Xe_y&|Bly`Y^yyE1)HfVxht85@l8I~Lb}k!@qtUFt7> z;tY~~f(eE$<0r)whEA&tz2>amZ5pSxP7bLj;K%4Gs>kbFaubEhQHQsa<0I^C(gOxy z=LtVF5S`w&0*yh#IAguG_OJHJ;9S-3;dsQnZIoGs_BKKJx10^ADvy(4cfE5mY$=;bOAPfhS}yg($*^a+yKEWudOI*M+-GawJ1|7{HM6HF zEuih?ExPyMeDfQ&GiDYsznx2+->zn2?GdZcJa-xmp^caZoT*avF3Ck@;#;5tZYtw@P#Kvs!u|!!7~wY8c}<7gU8o=(4m2Af!X55*hj7r% zN)Yb!o(;a&$m{0e8vb^?A?CY&9mJ*C0&Y8oJ;kgDy*kY1vR{cw6@N6A}#Eri#Drv`t(mkf)aQDA_}v_626n+FrkuB zo`1>#uNabqU7j9tmvzKS$JAhqA1!HkUHAkg^qxm%+b*-as(Ys zvRj(&bQ3tb=4ofBT@Gv%aF&^Fk2%QS<{lq&8%8&Q7=ozHzZ;ouT3Mjis#^=)2RQ9@ z?<7AVc-Z~S)_9%}HV49lDfTr+%9Is7wSB8`H}ftmVEL9RPc=(JZA&bmy=CjeV!%MN+q56a)p`t2@xBV=~2 V+gU}}nd~uN;{O{~)ROfo{{_HjbP50f literal 2383617 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
B$oN}xW(40P-Gnm|MqbqiF`6p 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

3=$-?9hBH9_l)!rHHtdB!sbW*Os- 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 z

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�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 l}TKJ=dL;;al zB9pNhH#NmhSYLre`JLQd^=@}DSxhs=NT8?Bq#o8DE18OR?v6?IWrz&K1VXS$-ld?l zM3Td1r5PEjmj~TPt`Zkj>`8P-qzWk&l8PpzmAK{-r@J;7++uTP42L(dE?PYF>|v0S z0&TQxr({hEgGkwjFp#nM@)8X*i>M?mNEU!tK>@>K{ZU3{D}AF24-g!BIu|c0Os4c; z5`tgz(+@j2x?!aLeQo`2C)a5lP{^6QueJfnEfWz;0;KE z(v_faQ1}a^+O~s z;7Bse$E>d9J+6u2^US;zM!L@SwS%ik0uHc&3AqU14N>k(IeuX*m6l+HR?N&#PIT%g zCpz^}1$szgEVCH0*>DGj;<*LvvT6hhps`8Q&ZTbdK>ULFYD)CMF}?iy^~;yv@t+J$ z#3Iy~JglIXP+(cX?}hbDT|1)_Yo>d8s?$9^9i}To9Bxzbj*-hScTWum&F?L~MYqjL z_hv*%mfzOJFd!y?9wlmoixs2)PG9>;jBG%=!#wTr{u{&?JgT0|}v1S?{H z$G87x7sJKuIKb>m1|i(u$Oq3p)ho%8ETtwxk6mv`ecm366AssAJ6w}!kyTD*J!Vbf zPmeS=z9tX$A~H0{xha30?{d5TB1Dl38+T=t)SPIAXJ<(I^39!l?cg%h1z;p0czrp( z6wGu=*($XQft5mEDo%#Eh&+0Ho#-5FL+} zZ19VRH+9uS6=-+&ci&aNV5qaI`*4Ex1ZF#EnbaPke?&8om9X<$J(hp?A&=#puLyl!d z7MNVzLizIW8Hv@6TEr#gc2)ul2H7>$D|$TAnoY}cd=>yOBFI|3?xS5!_!{vIAb@qlJF z50D)Lu$f8>R4GNVSz0HM*sYrG&Z-%Q3gsAZQCnS zPzZc;d&sW+O@-%&2#Hv0#LWx}NQW1%L`W2|a9Fgxo5*jC2$57gSQMp?8?B$1b|T8G zz3xUT08!USTsd+#7+6|=chci9P`5aG&APkwkN5rIt93e~73E+$qv8HOIT`M6FGI`A z8*?ft%aMSM-vv2^VImuMh%|Dh_QRz)4ILgUFgVAUv7lQ!wY3f)l}PC1z$hN13K9-M zAsY(DkxncTom0Ic*T zW5X>cTjWUQ2oRzDv0bUX<&l&9HdqfU+>Zj2^5l@lc5 z(#j1YrM`n1AR%`KV3M$q^ef^-ExVY_?g_=-$>D^*@9nWNk%vrrMiesE=b;Kq8Pt=B zh|gOtKnQS=EMzGs-@wUN5ldGU1IB(Mmj{4rOSb*qlmI^ zZwzpm8gl0=wJ?R6WU{ z>h4z@-FKL5w@TIz_rC2Wiof$UVoZG6tCwHMT98D3eQv;e5Ll9kGEhB5VF}?8fPHx+ zk#+y?Cz9_W`$`V}%}wu`sKIxch~oK`svI2xHU^Pd5ek2 z_(_av+NKR)UR)wpJ{iO?9TY0UjzO8E8b)OI9tMWj*^Y)fWI7t9MbrEL!js^$Lu^Af zFKDzH7_2GXh?;)3>(73!E~K6n10&Nl!H^nI+AAP7fKZg#JD)ymAVZHf&EcYYi>)yG zTK@`T$V+;^?`;1-q_z^00R5BjBvIs(Hy+db(*t{c^d&qz`b_J*5v2hMeep9Q+OQew zS;11G<y$o-QA()*bm_rD$6fMPB~u1Nuugrh@41G&tC4f6-{d?*o2m;;dM)r3Sl8G zKx*UylFg&2+uWkDIa>A3U*GINY$E}7R2){#8Rr_{C4*<+BwNI7P5uu7g*cF)u1Qx` zv|k!Hosf@VIypTZb)qhU^WAI?3yFzVOOmAB?XfaWU>^8iLfX3opox8SI!@Zcf`4d8 zDj-HC-g|N*2~BQn^q%p`-(8C#=+qeH5@fLv9DdljO*Jd70wdr9X3GuKB-uiw3AS4E ziJA?f%t&nA_$?b?w@)p4%x&(+)6Kv|tpk|cl6QdaLz*;+Y;b6~-gUK?#$wOf7t<{B z-0rXBhiguYoJZaX6T>8KwYnmx48Yk^uA(gfXO6iO;60ArxL2G7DbW~An z1ep~%M#AbCM3?+L%#2v`uys-}gI?ifxhdH6*v6HjG$~Lv-sDkGLX*^{E(oa)#bFy; zsh%fs1BeFn%L0I+F6?S4B}U@L%I=9X&qP65G~Jb%L$e20c4_hrX_x`ZB3bTL5G3$O ze_=e&jt zY&|f>Be5lSSc)WqqUFzT_!Eob;TJEfo1Y{g^4njoy4Jdr_Zf@s&O@i_Wv=yMy57GA z^YL4%PNHRBRTtb`qfcJw#9sXI2d4MuY6Nx}hNHJqeMExuZf1wBr}n4(hwD#zaZjT5-Kuj3EE;siFm6?z9RKp*}Dn zO3jl*S5V5)&GCcJPAK(-B~)QWt5Z$n&77J7O4B1Xah}6Njn>q7 zQFMWZ^*Y#qTj=Qt_FOeI10%4elW1we>p^uU%ZJ*hS)XzvjGiCQtnhGe9UN!3nX&2( zuDsRS_A#_8Z)5kKZs8rFs?eJBlq5L&sS~41OUx?4`b7fPB)Ce{h{p&dn)~FH54x6? z!;PqJb~`Pz{f~ST94QNfVFxgTQLVeldotPkM37o6Da-T!TFd_q{Q0X(F@6mE#*uvj zu?xVbz=b3!n2RJWMxZo(@j@Ov&(-x%di{(fq5De#Usj)r^CK8J)c7z4;B5cu$;lV) zE4j%wA+$HV4~VYLj{rbVPxXbG)X5S<5o@G=1S76#!oABv7VpW%+F6T%Ddj;1|B$_A z=Cqf*Fa8Dw0y@U!H6=WSF9F8d1HOaEp9F;2iAi0bP25|?N2i{R8PbdC2z7+3d*;k= zHt`fgFP+NQbchL)*y}7qQJ|1YN_-f<*Un5PV`}QXq-Ihpy1@Qa{RoDhxUMKkgg?K| zVlpORxyURQ4Q-`e1jVD8E*jicRD+c=pEXr?$c2!bkYS~5|Vn_yAAYJrV`4Nx( zQW|eGS}nj`DH{T4V1znG;a8o*w%k>Q&nP39ToJah#eW%77?hx5to7Cs-F!$s`q_*B zjgjO+kM{Nog-L2&JxVft#?^$6I{xVwwvcGom}(e6+W`Q93W?A5GHZ zfek2v53vDGU6u32(jP4<%dC`bQu??twIu)!2;iLL?~qCo$FOkw>;noC#;|E@aK@3m zb|I)xinSFFGGPV?sB#cy>{=!qN*L=DVN0;Js=kc!lpqp;KAOB?t>5?;$l)1zJxJvl z+#dEN%=BXXxH`MKmpJ=xc30rDT^wFNQC#FqZrqCx*C#OZ=<*rou-==85O?<02CTFe zk5f?q3D}bC^iQ-lVCI;ZWp99F_Yz5U<|+UKFGH&Cz@dska8rAQum1P3?ebtkWn?8@ ziCg34Gms-*9TYF0K2&i){d{h^SrL(SMTzgKuE^k8oGL`9Y3W#izeXdzbpwZKF*Bmk>G)J@1;Ohlph4GB#D@z?F;w^m_l3{OMe4$3Z%ldldo z>#T8!RFr&xW#8xXh5A$usb0 zY4qCj@QNi<1Z<8nR>BTR)TEGJJ z5mBf9FUSz;1ME@atHI2L27yrV)HizVU(`p=A_1Bg`qwd6YjIWmeEuUQyN}OTl3Y|s zj~D18XB{e{FrXA@89^oq%AV*Tq6en09M*1}rTxi0CfoOnUh_$C$kySk6*1KcnJyvn zT5EzJg^-jtD4yScz&U#Ew#1IF&>2N5HSTlA1)g+SfLehdEG++g&pgeg|rl&Q~tL+AS` zsnZ?UG;JCJgA#J%!z@R;`Ar?zQMlOQ#re2sv(WnShB#{~GXi=;*(fTOP{Ri)|NO@{ zLb<;k>O6KUyzCuCvsAWc()|`W%fY^!Q9}5hS_mFsQ*gc=`7ReXyxC>Jz$&OS*`=Ty zhYdDu`|Ja5@@H6t#r<^n^c*k9V~Lg~4`MYz@Dc+SwyBLP~VvljTjisQXn)OWRT$u$A_{Wu?yf5Jx)?T`s#!#NA~>3%JRlU8U}VL z%vBn74OKWOPDFxuh40j_l!#30A-)gy;UB^I+#wW6VRjeTS%g3WEyDM_NbJ)5#@v-aPtI0g}aW8BB^uqd}y zx}&1*oJ>E@2RWLfO^>*U_hE6pyA~7#Hf=kvAi$pJ3d@`|{>f&cP38LXex; z9iQ1Kl}%mrKysh+D--E`p9^jZf7qG?{4D4o`~i6d4He@lMM_DM1o#&i(pdNWzzgwW z0t+t7VF(i(__Y$&6HKTK&XZOV1>1oWA==w}Np?3{B*l@Jq8)Tn==b#WFVsC9@N5)a zSISQ%Qbmd~G}FS9m{KulQ?Lib>5y`Gq`iz@`1E)4qCJ2u8g6a^NevRuULdJY=l9jD zJP?g!!`^89DgwjP7DUW0OR2vk$(rVoVFof}Q<;)3EwK&1d#W+C9d(Rz#U*S(_Q#N8 z$FMN(Hv?mU1%xc~npiz9ND^IAYRw@evH8=N^Y$Fvuu2kF0WB&MfEFtW_5$>u zfMN5@We%j8Ibb29AZjVhE=B$RWM11(OXx4}hNoO_F~6WA$<(8uDkU=;Y!(4L?+sU; zC(K0tRn}Cv`3dkS$xLenwGrlBG!*;^J9f!G)xrQ)`3+5K!#FR)4Dg8J6*lc847oS% z&Oy^5_ko_Nkr+s+Uu2^OWF&?6ynxja4MG`$iAcvbgmo)GT zYg94hqywDntu4+&)16dipR`}N-=+YmY5N2o_7O(+Hmj(gB91bBGJFN(P~i}VG6Og? zpusawfKNHu3H~IUN_mT$++)Rm+F$+N+#f6nN!@lt|MtoM{LGg6T6}!?2GkO&w>yGN zNs3?$S`aktD)QtT^l}jGn1p+7wT{UU{_x3xq3IYry^kxehAB|Y7x!&<*4*EmQAnHq zsWV6gh@8Y`02JdGHZ*%jmUFqa>>74LwO_8niilZ_^kSn+APRC|?KxEq7=ZJaq&*AE zAPdZKx}#E{i#I*2cqCj55jdYjsiDEp*Hq6gU!l>Tzkv=Dm8*{yKBW|f+crLC&G zDdi0}O-mJzjJTVm1u-lLpst0RMyY6nY6D9`Hnyd$qau$QFn++9$VDwMWXR(eul2_X z$!6wv)>j7r1WXB}0^rNiUI3Y$WDp(UDofS|NG-k?b>Q)KM-ptyeRo#_CEc7S5%ccuB!>OrQ8wMtM@Lf*_ z_|o-7NAZtVFzNoJ|N27yA%rf)T1DF{)nOy`TcE9?4ygBqsV<`KO(TWj{ZmJy&w6sp zo9o@}x!{nF%z#Iuf z*GbG@U7bOg+VlBycT-n)=US*8aiB&t1CE;fR*`*Y?^xk0j533cG%DC-gqv4xsc-iM zFm#nG?v+>amrz`)zhEvQ@$x-Yw`EPrL=e?D{FzB;HMDQ6!=%hAHqFMhu-XTX$+oAi zq~NDwyFlpCS0|#i9#&U`6Tm_vVU9qW%pBJQxV7n}9VHDSU{I^PuTZVm_q#;XxI~ER zMKGnb5XyMeHWYBjz=*WxpUV0?>-od-`;94l`R5d3#&TpSLLW;To0orX z5r5hSU+Nn@!LW1o#rgFnf79U6;s4yxzb&y?2+sm}A)uKDWfssjb}m-D+f zXH9ioHRlSWToTnwZ8=1Ds)n*l07{PEkfF}nOHF(JVDGm{(kL~ckT0Z=9A!v#3#g{6 zX&%NcpDzO z>(NXw)gb{Na0QpW3xio!ieYZPf9YKMJp`UR9X_MhkM7eN$^71;2gtA;#$K0~u$?FY z;;^NR9w%7F>qlys_ynzRHZXj}Q}EmbrC5M-fnJgz{sN0k7w0))4)VZ(=34WZu7QD_ z70~Ww>zQ%H2s2PDW&>WBD*SS)8&XKiP6Y=sRO$fs8EOS7EDlZ}GN66h3V9*6Dlo<1 zrpZ9F*^QT74GDZo)k#Ins;Lv!JGKqD zz3}%yiq7X!CgAVq3gH%phBp~vGwSMqmcmOXC;#XCT2Aigc#{7p=XGCXTKnuPL5H7w z%I8*7ZGreot3J$-GTv@+TP=hg@ld; zLEpS#S~t@*^e#kpdg`bQ{m@Fd)Yy5`EogV%*I+7iFO)OP1J=h@yJu5Dvh!|WdZs7NtIRD;(rk{N)CpI5M znTk@ZAV>66S?ITHKKr{eJCNZ&W=71%Y$WiUZ2(VXb&+9m@k#71E-2d}>yjA(^Q*NB z+_7Ez2{l%bWgRP$o4-`yRtTAcO-0sB;%C{$q^$)k%Re0pG_Sm=We}FOxkrYD9_z92 zjwr`iii@Sk_0FDN+QXg^+A(7AM zoWSy>ZrnB+@x-oX>xHe?w4!B z_{!cN3_;Jw1BbFblA}6(r#asW7L%LfQTun)OOyR{%};)5Hu+fQ6GmeKh6kmTRin%+ zNv~y5w-U)QeqoW6+4Zq#v(Iw=MNuN;>Mp$-yZv|xDvZXP3>_sP0Ak-tBI=9*CWfzS z{K6U?Epf_&RC3G(E`McinWw9Tw_ANi^G24h@lV|X_$K8(T= z^7~6n9dRB~KSttI(8kpbDkS(|G-+|XDUhO5BS}OlGJN&~uu&^sf(D!#x$jnSfdkpd zDKd;AnI(ja9D8y?bNe{p_l1}Q><~(l<^qb6Q6U&3Qh+AQ3@34V!v9WAoSE$FM5a8vJ2s)KNdhF_dwj;4CcfJE3(1i4BIR77P$nQvAF&9`a0bsH+W=4DJ zwV${6nwfhdMJ|gk&o2~_B@Bj79~sA8jTi2O`qMpQIs=GZ{+V`yKNJR_J?J; zhl_j!AB)-W1xNMr&ibJ)Z|r6mj3vAzYMP8XfN5G%`M1V3FobUIvvwaRy7b5y&L&mU z)~56s&LrZ**B)zV>grP`3D0t+*Bblm--fezT+w)ffVIvuB#^?^dYD>T_Yh75r*RK8 z>MNo)$ba5f)Utmow5dy;>bHgaeK{-Dw8~^9aOE%5H{L4+t=!gg-D!M_;k}e%rJ5b3 zxf9@z+RX4?aofp%jL{A4nOHyP6gM>*Za_d5nHkFZO^k~cjE?@V=QMh9!<_UMAgq;u ztGlyyXEIPiv@vo>D=I|h8BB2RtzjalR-3sKA%)h7bL?`$4Jnz;zAZ#U@00Np6W+#w zF+^!^;DvA(C8CoPM@6Q_>E}|Q+}z23AzI>0qa_fMSWn8BcK<1CI_{ew#1@3x9ZX5~ z!ah@aozcULRKs97LTDQEAp*g}Xmy{Y4cP{zgpO1CkP(wO&W=N<&*~@jZbVj!TAfkR zQ%VN>bh6Dh0y_8TaGBxyn`D8$58h40A5yHP1{+E+gsRzH$Hj=acjlzZHZB9MFe#cu zU12FzJv?5#TvjxEbUw!#)^4;>+){}c8zyCq^o7ek9!XuJ`)MSp9&FoQLLs2|DRpsL zB1_Yh4rb zE^`uVKyeLb+h;@zP@=l4TNBJ*lT%RC9ktlwCQGFJu77&$vK3hr5dc_9E)E(sL~!8l ze%KBD;9K^H8~vF_FuP@no4tc843bPEQVy_@Q=~8|#ihRYn%{zhSvO&m#Zk{DMEq5C zwDy2|=9!n{;O+CQtacK|fDRo+A|?RPmlTqAFwI>tD=`Vnvo^Q_6~-ss?44u1)JEKA ze=GMsF+TKZXqNj7^7U3gqKjvEcw&)MPAl4!LS|LbP*`x9STx~j z$4p7+wKSF$S;>==$%MXp_>5#FB$kK}4f~Uy*&R&^R0Kk2yNge1*E zK91%bIU7S_InL@?*espm4~Te2(ckuNRVbpd$b)^}7XAEcq9no|`#X5s#TBt!c>qR6 zT_%}i1^Xi^r1&8Z*TJzzBz;o{I_IvY5KlWZm_LSwnQ=ZQ+~c#frh+vm%$m};Pg0gO z4C^cnC7pmw;UTP7B$d7FfEYA{{dAF#qEbEC@~~cVQAZXOv|5)JP-tks6$OI9*092?Z2R@I< zgzrk^&W-nl{&ayBCU~eLLg&M%O5-{PIW3KlsBB}ZwGPw0CBV{)Ylsx&Rd*FxFcga{ zfUtv`Pu{S$!F_FWDz8l2_r@LCrzm_{vH~TM)O96#lCwc<8dVTTQ{lJXW zN}(ZgK7_q+FNV2$(=%Bc$X=vLlr*IHRvEAaA(GCdsntOCQPUv)NQHweY}=UXUy7Mz z$F;1rkdn&tX-7wmIg#%UvVykiNdTvURz+1&==HEm>Ij7?EF}JxFx>O2Taum5B=mE<$Olzw< z5?`4{l?R|CAj^l6r5a-BraK-jPUJJ2)9-g?!ZN~i=FKZ<%4Ag05l)OW@4Gr6wSxfm znK|0AgXH@DRtSi-g<8v;#|mVVGY8Bv~~RU5Ly(a1u~SB3qZIW z(duE(Q9+H6BjDLhAV$Lz5Ve{C(gjl^IipUE~?Wr%;S#XVgoa6fg^ z$uoCI#{Qzwca(SzQ7sBIMI1mD1w$@%dEfbpM(?Lw)`+4QJ(G^w;q)`Ux7GOK-adFI z;KEE0m!pErC1}*xBsX0t(M}w_n6HW|$nZ$!6_{KwDTBndn0olx3%$H=@4CzVp&A#I zJUckp9$+YJ?p4&JZH=XSAjP#4ICfBVUC-*mPbd?Y0i!T-P+9b#*-f-hzcpDkc9dD*JLYnr(-aG3J3WU zW^>3Nth18Z)q=g*a6lJkZX-utVzx{)*l3jJgN zE!DUh2@-5!$(DYXq;#^&sDvYhtq=_36#W2z@v4g{l_QxwZVJ?%kBm~{i<6pwih}bA z8uj_P5N%&2+$x+O4i4T~J)ru~j{wiG%^x;d$f{@fF-+w2u5W`H8GuwQZfdzW-B5?u zq}^%KdlZb4=!HdVmC6Kig6M|XKy{O^)RY~)9QrsBJ@O@O7s6+k*Vr4NvB<}bMgQm$ou z4$wTfC$pBqGVRd463V=iQ7gqM_ui7GCRbGXtp|uPK#Z6cvSufBb{SiWvn>JwrVnal zTygrFM-$oOpyj(Ds*w^$`IeRV=NdSbAm&lf8&!Glt-URqFNXDv^;JQFNI>`)Ng}u`#!jBG6U^dxjRbRZ zcSce>6ky`zTQhxkuuc*a8}M*2qc&3UWLsOBT<&5$8nz76!o@`xzv55BxFA_6l`cDz zW=RahWJo4`T<0t&zyI`qpd3oh@Qb@QQVRQw%8=E?i?8L+*E=!=yBl}HFBRU62TJkYTvkxgdvVrObSlgHR|?#+-2TgDCv>R}wcQCoCh*HO!JM z!%rJ3YUloIo&rSLcu+<0`1Zc0lNcSUAg>%mK9Ddg6bOFrDAmg`4{Es(ppi4vJmC`r zVH5#Ti*?8k;CtGKMiDj(K`Oa`-{?M?dp)^*d&LFx`OWMC3e~!I19Hx}pqV9EfVnLu zJ0iyY+p)r<=L+65HJ^y=G_T63c#x_iCz8F+gtdIy|7#0|odn)6yXkscm;3ZvK{2xM*huFtP@T**k2=XWUW=U2i9UXMU$Dg&lw z)cw^l#gd*JQGEdBTM)SE#$@Fsne*u>b6(i?l|dTfHns+6;^f54?Bv8y#RJw$pdA6J zY$yT}7GVI|l=X>g2%K4s$WLr$9{CwSbOr^aVOa@0N|GUr2|D658Jj0eGNanV=jb;lWD5 z$?gib+lc=r-|`D0PtS$b*DVI2vI7~g2Qx)Zl{|QXE_S^;zuhUV=p`)UDE+Tf?t<>u zF!{6m<*$!~D?v~kiP_CCz7lv}1r?eWmKGk2=Tj4HbuQu5e>6W>pkKyb8XZcvUHVig zSTmNB6YcfnM0@@B`|76kUGLKb0c$5G?ahur_doHcx>Mz!j1M+a1ItH>J9N>dFmict z-1t17$C4*s!CcRPj&9W0^?*^2UbTw>fY@j;T%?)oQ4Qp3+7r}@Uj|Xh4A*x&9=G2h z3h2t#5Xvln=~|87TV8*qRWm`+W@oW!${uA{Vf4#Qbq&+_(egl0xVT#Y?CkR#-3{hC zeqoOy1(vM+xw;t>We)ku?;Krr9ND(0Nq#`Y;a>O3lG5}*h_0>q_k?xEB*LULwIEH} zH^H^nqcj<~o_RgzA?)ko;!Jn|XaP5H0w9ih@*lsE*K%otM=l=b*umfZ07AaJ+FM1I~&BqdMU*GqAchh0a zL&xiWxe*KT>FL+}{5So1c$0%9AAEmDP{+e1H8O1KVD>#)UbBRIT<0?Yirhu?fYl0yuMRF2QKkWK zwLx8zmevZZ+)JYUC>HC#%w0Fx=M6dM;LfHL$?XVmO0fImf<*IK*;#+`+=cir2}oqR zkLx}YvM`#D8!G`}vg$?Gr6%aeSjYZto@-PwsgKIK7q5ul9yQq}anH@+=0Bxgs+v?23}K z$B#!Mf8N!6f@|w}2YBRmkF0#gt{6GH;tUNw%+O{nWAeD}Wtr3w9>Rd)I21ucA)mkG zybNVD zs{+JA)pbKP4GQ*lt&}=Cs0x^aPnEmYn56C8jMS`uULCx|Ljr1o5c4yY`9MH^KB1YQ zj{*k`$%}Y^5?Q_#Y2ibYqub0Qw1$Vs!T8n4;ir;F1oAxv!#~jc|4I18WRu=Sh{eVZ zQcOpPIw3&R5nSDt#T#|dgZ6H*_jjTGlWgh8cK%Qa6dMJcIY)xa>JmH3f&}_ZT;(AG zW)o0Z5j!^s?O9(+q|Y-6m>){oemV*C1J7V2vq*jCtNVpul*b6E4LLUn(F1@g0@T$1 z%WRCOkM#0S=4jX^nJLF8{k5`Wm3)YN5jD7E%bq`|;RKPbUSuEmY(2qk^?_$_EO&S^ z8Kur+ps2tn$4OkY60o)+I(uUJm!S=B>vtc_akR|=99^I-8dWW~?;ljw;)V!evQvVx z0s2bn@jjD>gZcs)?v0=g32MP9ze;hxfuksEq=wCeQkh-xr+Z)m1kuFgHgv5G!63LC z3lf!!swPQs@A|csIH35ty2u1-?mE;~!r=S2lJ4>YEk=PRNtlMtTGu>LCzRl!<{dG* zF{m9ei@5ZnAKqI2iw&!dql^?f5*5hcpwK<`0S`ID0HtawQ2=I$pei#iY=eG`_L|-Q zHQ~ti0zTA)#zyPA^HxTJy9B+M;#orqN0z9;!!Ngq)x;%K0W(J;D}f(sO*ynp=DQN~ z*e1%_Jc%Wj&E$_b&;4=RL__0kY6usTg7sO!x>hNHGH#p3FZykoQjzs>5*t@w`j(wX0QO9IHKKL#*TkP|USj);_~G><;L&k`>z93sL(#wr^l4N@ZnJj*(6 zq`qH5+^Bo#C$ToFFxdShalzfit+bS+ZQ7BL--4YXY58P``NuZ;#1Ml!R4%J({@YC& zGcgV!K@x79d&;z~LpCm^B|Q+AW>4En@LENr%NyWP?rR}I8-z^0JK)A8NClL*0;5%z zM^@$-D)Q@mkXMuSA0%}jkTaP{fT!{koI`yEQYMQZ z6(DSqJx@X3grYB~i}u;WSKe&Lzz!@1r!RXy-LCbMuHOyEeT|9++6J%)6jI`j0hFhJ zFLSW8Z9zq%Hm+S>ICekdtKBa&CXsSYP9RT& zk&aM7?8m!bhSRdKVcGqagzCv*DTtUOQH7K}47idKXCBEp{=+B2nI#mfrq&hF=On|S z_OPB;J3sBco5c=}gk7>UdvaFj0mk>mi?6P3?{FZxN$Q8W{Ur!nlC#Hku&Dnkxqgb8`?t;Mt9S9ohecCn?nCqvs6qBYF zrbN)THXB7n2B;c>39X~CNzgX!$%M>0{H0hNo^A3kg=+}RX6|r-MlC6%84wlr$Ex{> zIMAm1{_gFNi=JLrSLA6V)2F#+iQH3w^9=~bwaZ0&F{C5FNsA0y|oGvx_Ysv&R*JHZj>)W?FBH=Sxhw=B+`nkWPj$D z7dRz%QkNG#gxgF~bJ(s<;=uHYUtHvJn~f8Ow-;S^job3>T;fMjH4qm2F2x#LQfL+8 z9iF@IXNg-rflIf5G&#RKzbu-&%^lNF<(Z>PZR0W zy|J1M9wPRAn$N>VZ)ZSZKq*Yn)D)72Vz|L3J=xofZca~MpI_}I%ov~2F>60UHjx>j zI4)*d%+i7+H32~;2Oof)&*5qSry{vdKAsN3Boz4@*3o-(UETbo3JIK>HUXvx0A544 zriwYq+vJyyUhwC1O`^0qaEa(nn315aMmbo)MhAA=PLlD}j}j3he>;s=v*1vOO)8~i zJ1R=5yl9604Zm`qAP_G$Hj;=R(4HvM1uzKObpt5B-PWOyDE~H~AuP~&32$8z($hQVct<2geuLM2UJFGr^+NA>b zb9v!)4aZrUljN_k)UO0NgVc;OBPTFt0=UAaBkUNw5TJ*Um>1r&hYepNp;)76H!^;P zXtyb`o5WF{b7xH1R(;LTUx%QRJq>obAy!e7f^AB;{_GY)b1%sHGg)#*VS4yr4I@}z z!C)A(9{mRIB%noqX&Uf9{yy=2;av%C6+A3oKZ<<8(? zH|_I_i(O;2>&ZSEB8d`+M1Mae*?nqx>~{agXmb$t<(BdhrAZoNL`#T>!XO7cyz}Rq zRWUl_>8ZhDn3Cl_XWi%Xv%4`T&+m-h|cms0860K7 zkr+!l{%K)H+L~|~=@o<7N2OL2#emar>If)=y?7#O8EcAVGJ}=byZ6QRIR9&#p$hQWK z3K?t^uIw1g4|>mk)xPUyVAmy$GO7X$FVM2+K*A!X$A6o3F5Phlc_{igo8bSWe-*& zbw{i#b1pcs?2&4v8MgXl%Fwh`&(-an^6wYBy1LM=a+71M4~~aNFj^n!p*=Qq`Aeim zRDZJyz@<{2uj{*npnmLAC;;;00RuyM87)5O8414;8_;V5jxelvALSqnP+h4co016B z)fGR!cU>1-rbH;6!gnLR&5mGSyxv}ukmQCUXFhL~ELls)WZ>Sn~9|bR6$s$blav}`2HIVlh&$=!H zDv<+=K8!H<_wHsVOOuZ=>~Vi8+JZbhIYChTKm6cLpZg>?8-eeU(qYs`LUjR)ngZJ# z3TErvfz}N+v6Q&UKcEW|bp$FK+#i8OFm`SuB?yF{A;(#L#Re8ZSSSYW z&`})$K-eS;8!-~k-;xztYqa2PC3>35sR{!4L6?I-)KyZw&^^>OHl$>E9HXQBqEPM0 zi5=hmw6_m4$ZhzXQ-DIErbIYXf_?DWkwt0D;Q=C=n0CPsM6hULb9m(0i(7!oy7tBQ z^4Fgz%{MzvnR#CN=P<#px#=#+d1jd}&p=Kj?dnGl{UpAsI>4|R=NWONRPYc^wDHBE z4vQT|h5ka_U;zd5T0n=QDvsMKLi2JDr4=tq5ym>VCYcjuBy;LwdMr10FD;rV*m&&B z9SoJa3|JWOf6r}AMpBtc{Ep{pqt4)iRR72O^9#80Fjmy%{H9ZI5&Ehs5T2vDZ2-Z9 z#<|?>vjvm?0<_ntB>+sD2qSr2#({vG4GO>_CK%A?bRQO|3Xv34O|eV}pa#F6bnP6_ zMLqf=^ zc2R(8wmSnsOSU@a4yD8w3Q@>OXPEBcLT7r1k4~h6vvQx%9u9UOL%4Rz79Fu*= zfN88oXz;u)&o3^{lnkG1r@k3efhQwZTizNJ7{`!yZt=wPs!USLho;$|7lUq{yKd6vUvoWHA1#SdiR1#xx`9>zOC=Tn4$(`tnmll7;CmXdGC_aqZYZ#B)Zma|XFyVp z$c3RWfZhZa56o`14jrJZoq~>i`Eqr8Rf2NMkIzAuUr6Hfn;&oG*vo&VcL=a%)Jhj% zRSr5Xp1wzI^iOr$o^x-9O_bcBR6+sHcKsQM+5Yy4$Up>08! zoW?F7cHpL9Q1_i3mQ)Un@gNJJHPHyr+2oBU98_+i=N8GpV=k`=(ujNeAaG4zmXI0s z!i%;btl&*N_O zNxMx*PG`!VzpH-vYd3`_eb8PNRZX-2A)!PoW8t!L_Iu`M8=LC6Tv#M~%EkI(EK)O9 zh^~#(Nw}Ss_}I&@U%!0$9sdb0yN~LZ=33EDscGEGFN2rS_6#{ec5xpm9vBUL!Z^lg zk|XfR?JGzYaG&?oC2C_ERY;_*d~B)yM=ZmeX-B&qYu$qJ=f0yY9Ejxm|l z8i6?V!9D-bMZGEpBkkOvo{Ya(|v}})q-D5*m~QKstsA&zfs{Alw+!(ymjT>q_i!Sg(W-` zKn@8Eau1(E8}_q1J)O;NPbZ$~(W5WFpPEiA6u7(BMK2uN8dd$*OZzz3?G6hkW!k8o z*o6%yLG+c2-Bsu4cEzQ$G`y`F)jH@Pm?5yyw;`o_optB|BX3H|R6&oF;sQ?~HUS7v z43thC3jzSBEJx@#F`%6O1)y|4k&&5eWik9|TZ{13V8JDS|<9{(@YeXWhu1_ z8*&z7O1Xa^ZR z*2gJ_%RhDe>Aguj<1KY0EWxZu<&dzw#(u1D6^9v|=K!*_hT)!UmK1{7YVbTe{R z7NoH;o0o=L9y1CfqR7f~>01kVv%9z;KU8kDFCJL^nF15RvwllwU#Zx&BhY{>F-SiOUKqt&vrSN82`K9hEM!Dv@6(L_;pN>)S-MnWkZubT&@zih zTKBkkVavrQNr^lco2;VP#1R9O9T*V_Mfk|_rRJyEel1}!-_9iom6cnQ!L|h~dqHo? z)i#qy3O*9*(q>`aH~59eMdBQNE{)Bf>i0x&RDETg-)%jNCn&c@-{rEJ*#ztp%Mt9G z;N6ULF{H+{&d~P>R0huAtf{W6=KSt0FMS*=O(@+4dBJNJ3VAL~j-1f81gRC{3USII zmhx#U(fESj2V;!{mx7$@tVDi|#h)=*oA5qF5C*q1XoV=m-Tu z*KC_?v>Gxv2Eb(eSW(J`4l#Jt1n)I@R8T4@VM*sNz2~j>3~6%ByR;x9d;gP4SVlBA z{vw_I$qDEGE0VoJ`?g{+$QuOJXa#D1(IB&G@28jgl}~`|Q2%nmw(PLpz$# zaz*OVOi27M@ta{B1>u0`=aK($v+!GTTiq#UkuUw0_eEFWT?p%}3yJxInkTOe_o7?n zwF zlMBE9SZA^*-`R=aEKCSDm!vGprgTuvXd>@v@%?5`NMN)j%d{T`7{qO+r1Ib#EK1Va z+O&-;Ngo&pbaE_8UXx(-vM`6E%tKr?Bkhnr=ky?(O#)y{~lVhL&I7?8H40 zhWA&u_t)3E8!WWcrM$eXuG%n_@+A)At34OSKv^-u$*JW_p;>^6%$UdTtV~?cWG)2) za?}sa5gc4ni7jXWYYgiO!D96M(=kw@8RzNg=sAcT=C@XRwsXO(F69+ppI>*kLsYM9 z<>qWtRel*$0LT#)&4BXjNLvW8;pvlMS2j}Kt*%YzZ3V+2R|Jn9I4nljeuC-PnF=0m zcXPADuV7Q(b-(=rsN4MypOEqU1bq%r9Mkrdkd#i-+lzC`^NQ#l#$spnHdYJPNJUf( zH~38pP9WliKI)#BfGGAQ%oC>t89F?3zZV+87kOU)O32{Q{ z6F>D?nnMO2B|cA(3&|S{PKiu*LQ%!3UETppWpE3cY_Ca{Y4kZ z{p~MTU26$!aW$QaH5= z!O+u$UHR05w7Eur2DYGXrGJ)@$Okq6Lnx`9PE9=`#_OEaNHO8-Bloptc5M_sp^236 z763FLWgvXgk~8e%@l7RTvk@km;-dQd+r65zn47hVEs-C$_cz@c%;moa|1h8V(Vw2a zs;*ILI(u4258iYa*Wzy0#<{3=7e7l;+-Y+huCM8wM4q1}lPmp@qR_qIymo5yPIY)p zv;juA7raT*W{Xl>W%}f)$0?&LjJX3Y|$C_(;tRHcGe=N|4Yv8UuOZ@|^^9Cx1? zP16w$+Kr4ub$jKA%>lO%Ukr+QNp04(l{RD1VDTpr=sZJ z~}8{L3f7_agEy#2MJpGD#N|L%o#NL#>vTd z9=uvf3wAio@qYDkd2Duk#C-w68iC+U)^{(Za3=lP2nExblyVTnY$suuoNVqlC$4_?1QM(#=I8L-{mWm>GojSq?lVQC(eHU$0kce$HGAHs0`P@K%fujRD6R~PjN@+ zV!Q|7IAk4=gufQ~jX~g7)WHENUsZvicavGl`{d|>rE2iNGEawzhc!Q3r{Eutxc)g7 zA3LBCQrbW?n5Sf@dboN35kMtb3O)d-+cboMRM+*3qJ9H-hlY)9>F}78VfxmQnMvZQ z0)ZdXX(?s+k6MBJ(^ti2bNTOWpCA3@cT7+E6@XoPUT%OyrM_T$E|?ieoXrP@cl&mv zC72iKZIyGnZ`7f!{Pjb?4=Hd562A@r#xiljaf0(BjnQObEhC8HD-?wnt#4~%BjunYW zbEX!PZV*JI^$ZRnH8-ceNkN+=pFSh&woV0EdOoLqI8Q5*J5ty=AQLm1I3ja(;}ewt z?E#^P6Z_t4@){5rfEiA5K#m%%HcKa|1TP4j6yGe(ZqP5nti(YHC*|+ERH7kJ@@>6` zGzcMx8MOt1;QZ^mq@c!+|5$s3-=*k}|L|3Cj1(9#NkPH7@8#5kLeR&OgI_@2WrSso zYgA`&oQNFSX`F@zsAPf}02x>Us7gh_NoZit5NS!EH=hRSCm-4riD<3QUTe3y8gq9pG9jEFq>EFM&qB! zge^>dFu15v?SvsXbzZcNE?();9sv~a7$A2=0U8o=eA^zLkact9ec+16R8`Qg1FI|z z;nUsK_BE5kO9ie)_W@%}SZWj$<2xb-Mq3VP++Z%sE0%*_22@xE5@qQ8sv=uF1)Coy ziMjOh59WaD!;CA;zWMA7hnF5er_)Z3Gr7(`+Wry&c-Df@msBNai2|TxugNGM0|&Ay zR1I1xktdqKCDK*haYY%o;bdD~>ubQNV-m0L(iv+Xv%uava8LBc+fu6}fAfxIr-KM> zE3k~ok}Ly(O4_`$>})48U_Y@_JocE=Xsw<$p;h)C0O@aa$&EJF`jfRZShPX@=B+SjlR;nh6Pw&8_r27QhG7_6AG1;TGfz%q;C37S+0t7W#)D_4@iQw6c?lMj; zM^4*jMY`g*7l$~_`+rz3`V`7j*Wv?*g{jkRgV_ux#zmw6QIjMXmFr66otw;PT51~& zb~J>Cj^0dR^qrRPS{r?0arbK9059QeR$x}8U=#?(VJmaH_`|~%y^DplF|9@gaZT`` zs_^g8_{0#jrQ;nplweS41#LI-Z3xR4G;-eBK1glyT_SFv#RE$svx))6s7*xNHA*dsy5wgbXq|^HFTCb@xTNJAvjOk-d}P z60UOE7KR~f(G6YqGcIq4*{rRbSyvV1sRvYH0WC8lZ`ORF~C zOu6lg@68WuL(=&*HWyT6uI%P0fGrV}xDx!#4-<4S@!oxSscR8*-+^vdgXZeizqt)e zmys@K!H5U0Ne`emcLFD>LAzq<=kT6hr*G*cjL8qOLqIS$mtL~w(#z;iU-f+_9VO9s zscLykA97VzF#@GCAXN^`We@jtXUZ+CTYA0O0{cf&56_2`+|m+EnrMN9hECXCoLWJX z^Z{yMRsWt$dWdz{Nne*9Y}_WhWzv&f(BPds5%WfdgAX9U%SJ5+puTKu_Nq_64Swb&G)kk zWJpC#I7u}=exIHX2$^RcCHGH6MN{P@RYY-!2_?ADt;Rn7DlU3HDuxSfKk_xrxIQpF zJ`1jP6xWp`C6~FXc}aiyu=h>dI>JIRc9dxZEblc-K!ddE(%{tErV~TRs(k&CW4qS1 z7QTim#V8?zD~xhZLy0oN#%%il(cYKPA9M3zUFO?ci*paoa+7;RU>cf_0V9F5b8hJ0 z92vG^xQQOtuOF}LSJmFAgo&CY)Qj16odmSgj3$J16H^K8W%Ncp@bzq6LQmwR0Vq{K z=pun_6BcU<#P=;~!*Y`CL9#RjI)Qk6S=3e?)xnoG#AF1(zPFB6xk}K}kV>#3FeD`( zaQJ})we6!u1C7+~2rsal$!1G7+*?KD*xR7qWM+EVm*0f6ZR zrsefLB^ZV2zQTqAp%{om;${>~qV;sbCiv4=u#KA!m`3kj{PF>txbyByj-+Y5Xf7)c zSAvn;+t}RN;$DK}OM9_^*Mn9RN};nAwB~tZ^u+cxk$JY0xa~_w^eMnHSD_D=CjU)B zB0zp>g+ZTN6SorQN6(ih{nlg;3o`|2wm}#1>DP`P3p3^KFE0dkvQsD~O@5oE7$#J< zvAtP9|Hj5P5FP?s=?v?WRt{s)0aZcU;v}FYMF9tvoT0XAR4)UGuC5d4!202tNB2Ov z-m9|r0K!p9_7({sbjMx+`6z|bbUG~vnF?;7b6tojGi^2|ENMek#KSf5{=#b=Xgi6> zimV-gq?jxg4E-^z9poEF=#F&X1C&U@m10)!p~0DO{c&T}cXwpIS_zrAc0UUgg%SP9 znVgF8KnbrL+WY#H41FnPVNhs>3o|{L?nF2W=O7q571NV(fo=eR44GeOd^BF|d7(M_ z#;{VY0cJgE3g8)1ni3zxbRu6IO>2P3b*p=IOm+AoV}t!&PI23=6&Dn^))8@jziE6) zWw6|5ZZ3h2dY{|yuFN99BqUp)r2Pg}zeusc9pm>oZ^nI@D|Q5npo2*2&#k{1A|3wmP-v4@R> zo#@vtSrULjccgfBHsrWFfow!;L|`ANBPE3k5N4aeI{O+iSPz)3^7U|fCcy&JkB(*q zwMQ#~7^-n^kR`~B`M~>I4_xbS8*+)?WS$RT6J_dE2|!fjpZh9QM(Z&WT2goX!Pyi+ zcjSol?cENHm;s1@(#?vN9eh9ZBt_A6Tbd1AVg~*Er#HKouY`Eh!BLMmproTO?p=jhoLC@QL9 z1-p=vbg3QKQ}ooB|uiDj^C@WB3C0hI<9oZwN@f2$KC6 zQ|ZTSZHqxq^)W6v>D0JFBh1aXsB?{Su}T5%VkqaiNwb*gYU=$D>-IDWbEL&Al2B z%AZYZ78a3rmVQLubU?CbM)M^JqS^e!Oy?&?2Chc<#@|`yUo~p>NUhb*#y{7^-5WXN z;;<3T2JcMeH7E&mm8Y(daPQTv;fga=J#Z!3KFrn%#tR@^vlK8nG`}HDTymeV&kJ(k z%+O|Im3lLbJH&PL9kvW)rSK`@-2^EOn3pWWUD_W@S+BG(4UD##UdF#%Y;Vau#uK4i z!HI_>#ty7V@+%staXd!*DJfi{JFe8D@e%VCgL){rqQ8#M$m9xzBv00O z)xJNgK`Ui+)e!`LQneRks~Xmeh1EmdL`gW5)5iQi@4LY(i$7m)}j!i z>p!3iR1bV}=*3k|4+lkLj);uWsbj}t9KV?q*h61VBBwabu*d=HZj7#HIiVglZV~|Q z`QL|p%LIPBxU7G!Z>}!3Td7bx@GCfy=(J1jD2bQ_zqTA8j5P;{4W9N~(0K+vW|F8X z+L6Y)sa+M*?(-X4Yw4j4S(b zb90s7azK=!Lu#KsfC~Ax7Jf(_2QAhjf)Kce$#k|9+21pGR{-KexKlIg#9s_c6h1+w ziypj*tXmElW4I{P>8KVEF|jI^$4OmuH%|7dMi77jEqo!BD7>7U^X?w~uHz3rrW8G6 zGn6wL+U3$U$Q=AGah=m@B!gq{NZK}vBsjenzaO|qz^KzYQu+K$h=gLi$=vTTUOIEq zvl2!{H$v@PUSL!lJDe-fd_c{0!t&tEiw4 zF`T`<_`){F?1`P%CX`D_8GwrI)y_w28;xc$p-@0lsEfoBSI`T|UZydoQCLEQyJwT3 z%pv5(M>XY~wK_R#}xgya7WYZJ_Cd#L{iB#9Cg>N;~zU;L1!BOaS3bD z>!l$LN`u*5ORl(tLWtA1pL~wYU z)ex!ys6w}}95$Js)=D)qIiY||sRASD4?m|rt1nR_W;gWvJ0;erLQ-c>Mwb9ri^eC1 z#?+rrdY>m(l>TwVYWJznNSOD6|a|F`nu_v#G zcy$P9h&iB5pp)*nIqq&;+^~v=bfSnr>Wv5$7Ro2hRtl^QsahA<)a=&z`-?X~1&~K9 z#q$)v|EJC>Xam@j&uA!)7GdMn6-l5rk!@y2j@=L}&30VEv?!%;+weF;>bO>WyDgq) z8an?)c-R7O5KIx_c+&F`rY94@FR{S%^m0xy39JM^0%m=@6%6wC6RuC^u}hsZgW5v~D>s8K?Px6HXB?$6<7_c|1k%anz&nc3m* z52x87z>Jn#x())Wka|oXfFdd)rJ=ZJB?80oIS>T76GP~vz2xwS3o47MqUPd;tS3N_ zn)AAPBM#J{YDyw`5x~;{Wp60iJNG=}mDXgaQqS=EgSh0$R=7n&l68ft?cLgzJ^#S6 z%QG|~*p^rjY(azdM%EVA95{8Lm5bj(UwiILAA0+iQ?q<#8(3(;K$ist^n@g}Nb+g; z`zM`cS90Ts<4$K<4>W`!lhTUMGJ{k>c0$UOrEZt=J_MKET)cUEd;ab{6juR|Pss|& z&RGQNIQ!6E{1P{#(@aQzK9V7yaQ_bG5JG47W0hp1sr#}CJ@&1Na>_IqAws?qxzv! znLLYoxs$AvQMnmW!U@)@pOhYc^)^{a?*VlvJ+$BsPd?PTv-0ValKYV&rmq5>pMGn! ziZa3dPwGf$%{=OY#HsslzE3sZ@Ia4BhE8jmEQ{Wr+y9GUh;GXNb{U4K{p8>Wpdm)N zKy3MF086&LRCr+m!&m3gt49YR4pH?`;ow2 z(bU9}eH&FYzKMWKLI${^X|Eh;8Q~*%?~Y{K$54qyqHcVzj7mjIs+ybz#Tg`O(E%hp zKLR;mMZQqE+@897$mYEyY=eR^Qq=IqvGm;gj%Rrcmib99rh}a_PCeVz%F%v$|2SNa z{A=yne_D6X(D*;rJo~SI=qGwneCc@L03RZG0XXyAi=v{9SM^T1{X*dpw|{vPjRP)> zp3RQ54w4QGxhR^frjY?q$YgQ}kin;SA0NO++a3L{f9MTZ);Ua_B05J|g0D*W1k^qn z8%U+MxwM~xzEHkBJhjJgZx;TTl?PLkDsAdNd@9zoW7Dp@#wgg!zrWz+KW5RjIjfi5 zHt5rJ|8B~bgkUKql04VdN>}6Ctk+j95P_SG+?qd zv6J9_+(R-lp+@3fbaaorht^KMC;2BKmB$`pn=BskVV`K&?xE8At!ar&0*9f?V|44EXG>uxl(GNh~L-bshadWlL{he&|~)Iytsc2FCnuzNHW@U zH9=^KOwB0qCG_p?Bw18k38EhBMD*Sz5eW1`j?*WhD;1fuolAm(1iDV_g8Z3k{0P_{H{`ax7;BvlJl0 zFbt!J9wd~5n-!F|%M#xU?gy?)XD}o+sg5c6MlJ$F(BhFt;XiHVPfUKdvD4z%Oa$*H;nMUgZZFip88_vO&UC_qIz9o z=jdA`1(|oK5a@i0nW+k)U^&N2vUAV$tNdNMWr(t_;BEDvke#IRyP{SbF41I^I+v*)W<%wJsgodnv01HJu%+%Ma9%(C8(kfzlkDEIglv`o_d+7lxVt*2V;rEV z?Ia(VQHrv7@V$U)gYi@~?OzC|3f>=PDDuo5Pp{PO0ISI=x!`JpV;S!haqZBG zdn}j8tpm7dfd0uMMJ7U1hK+K>_+eUNRBo<6O19`#*NTbMz&u30G$nXil#>cl$l#uK zGpw5Jj`O!MMQFuKGabqY1(f1k|K&CPw)J0syt>umGt?cnyE~wVgi^{VC_rQY%fL?`Fq7eSw0hl>Y==)vyVxTL zfu+OveCoz_5Tmk`$ z?HTx_6Yy0XipZjoU|CKZo%R}Has!)_B>Bq9g@ zABE#2-v%wbe1#e24(`LQPj`W9e;P%%t11D3%2w{gC$SfzB~d+(xb~EQEKEh zSn_|+hi>On=8r4#lkWqjPnzY+NjZX*?kFK9Kvq8hxe-vd`e`2-z zL0T+}G}aOs*sr9fjZKYdn^CVWU0VjrhU&PJ3rJ;-kJkD`C7 zkOiK2p$(6nDEfux158+{rYwP4*qx{ze>aAG#O%y#-wDF^)PT59CSZ050IPd~=w{tg z2DQ**9GIo6dI-acPHo?5XRRsxBmTaT+BM_UYRx^-KnLZqT9=lM8AAys_+H>`I8uPk zq92M`wFRosV!q+nii|%y`}4)k4`7dcoI6*Y7kF$?_D7%uf#OygHU>MXtY3fk^Vj;K z=9AiO=X;x`0V2~Vyx=}uyrBg&j0_EihydUSW#Wr|#<85Z@pLnDD1?zGa6UZ)gr}iY;1`V)?xrS}4N>M++uf6*4Ef#O z((jpH zU-O$B8yR!A%DQ2@Z2_sg{t=aop0QOMjX>aM7;hjXM{$7e>{M-NYo$A?pzPSA`slMY zY{P7_YXiL+>l(vd?5B(r*@e-Nj0N-t#U zQVXn6S3>|4ZA2S(T_;9x^1bXgt)jyWjb{8XqSpdhyfd3-2PLg6WLchOXF8p;g>y&S z^1;ia6MKsJERZG|&fOB0lWW-(+K`Kk&H5{7Dt{#_S@YZz6$#C#FPfw><8-zg>Wr() z0oBMZ?YM-^8K8svFrhN_X|Yov-3bSyJDMGQin-coazHd0+E(i1vmUBEb{(Z(i!r1` zBNX1#>n=ztqK%nK>2*XgR_<5ua1#v~!)wuRR;kVA2=Qr@#oWCwD|Gp?LewinvJE?&72o#s= zq`Tu$T>dPl`NU{EauoN^`ynVUdej_*4tmE2Qi-G_fA+~_lD52Eh zFWmnWRK2)HI@|wgP+xE}q;#(lP!gX=*YT(?pN@b&3)Gi{)GQKX1*ums0uYe*Mtynm zl{Q5upFQde6|o-ahqN3M#4G9Ub~NhCr&;>L>wv8z4PYVkY`TTiWufw#L{Z0oI3>*2 zq(4gLy#ShF)Sg}zbQZ||uTSJ`&k7Mkna>vWMPT*tV-Cz0L)Iv3MaD|kQmXrca@eW zQ9VXq?Ny~kwd7wLt#KdSjb79{_hwlrp9BLW5_OY+#(NNiTa*6;o}k6;-T{$ma9WVH zlGCg;D9eO&+D{K6^XZx7(N%W`NW@1gQvCGG<$yOFun?_cLXGJ1-5n^caR>RKIO=zK zYtQ9InMO~+cC{a4R-^eBZ#|B;B2II%5lBvNXdDm}#42?3Vs?SG%6Pa&O(eMmjieGx zyw?CrSCR`V@#Eu=b)MC+TV(l0ul5tE4E?2UoY>}mo#{c!R?inieey|yv)-Kg91M!{ zZZmvZmXIq)RGH!|5aS&c%DwX`&h!3-Jeu0}Dhwng(#1x45lZbrLvod?Fz6*)0&{Em z>9Zq9lbUH9+A8`<_dpQh(+OG@#HXYrisK%sD5eo(MGT2Z#lJv&bQ=aixOzU8Jkf#r zW=)mXvd|uk*aGbBC1D$hKM9D>vpNQSm}3_5tb-p3Q>sKfpY+fmjcLr+!H@iL@A`eg zy5(b#+ZViCy~sUg;ZVg*HvO!k)oZfT8kpw*1CvQ?L4hw@NUEi1<)icS zWpl(Rf{%_!va2(S-q|8c;kVP=Yzd&OMK&>rB+7)`-_;+_-{(@6O#OzJ(IK7Ag0vU) z32x~yx4q$Ultf2S?qcS{&75#_pB9`X89>+hVS&jNW%=6l`3i2%BLFs7_5W^QoajU`HuCoF zs-`U+ae1LUNHU*qcVs>jM$K-jjALmHT20$ z7b3Bz@Q4E@%iZN629^t6tj|Grp-XL_&HLr=!GjZ{=nz65Ja{EwLV4xe>LpIFSjVl#zXN--J3P|ESUyDX?XZR@1zG|H3a-d)2e--l0x1&#W!IjV*vhW_#byXw&p z4)50Y^r=HC?wn1MI%GP_|oyl;>53c~N z8_b`IWS{^LDOIu~uBNa6Wj9*^TBAEE8W|;(khUb9^2Se80m=qYFG=Uvh~gEz;cf-! zeRp7i5$l6?d`)NJr%6U9>y!u;a3U!DPEOX7o`v)gOE^PHacMlBkPiXuirkb@RXP zJHMSO%yeQZ59j-svq?ckX&A<3PARsES`SOd^Y1%;%?Ur35=-DP5}Ib_ipGKwjh}~X z)+cbhE0-OkY)Ll%iVy5toriWvRo`UM=tGIMbHZ6AZd6eTK1Kp>OKT)dq>*9@7B zV-N*tFszJ_p4^h%ddbIF_s7<=X|e`nLg81GU{xBIPNuqOn^_flL6c77!FnBdSQqr< zero{ZU|Xa-9gHMQl4Et`c^hGg`ah9^20}k5P!-^+xVM@BWwD3oIC>)8$vR#I14G9H zTu*sPlN5eKN$w#k*wG`@jOHOD9kw7Pe}yen1m-ioVM{C1or0L^&Ev*m zP=6Yg3$nRaE1<`R8bC6p{domoVU>FU5+y|M>QXx2`5^!UGt0Rv+wZq#hWrRMB{tO? zjUSh2=4E9d*_UB19`ZH~d@^Qa#q9Ru8n4f{H>DBHw{Ha$0d&vn{KNX~X7diDL;3YT z`E_m+d*{epf=no0X@(d!RD*^v{M-i@zQn4M3oWIcU?{@hl30hg^ro5V&@QE&4!u&^ z>1>Y*2~mcr6uqhZrp|K!tb1~rn{+Dqk+*N_wFDP|HDP;5HHZK=5wCT7@pO~7wZh9g zsL5^O7Nhlh9gIqwy@=QS{l9tt)LU#E-l1%hilG=`a~%&;p79*6*R`O_qd|Ff(`4jW zfaWjlW%|qarnE=e-Mz`3rB98r2gbEvnxz8h?HUs;z6cSC96)TZ0zb4WrC?X%i_EQf zM~C0MxGCj@W_kUaQmKpWc?E>`B@qqQQW2Amf(k5rFRKWHv6lVy5&gW99oWCbK*Ro4 z=kNLtn|)2>kAsbkF6@@lN34!jRs|3k ztG$luqzo&t8XM0_wFeEdll4h9kdTg;AC7!4>(QPALdx? zJL&fAiJ0PWnSDjiqaA85@=(=DhIT}s7n+|9sr|s&ec@}R zBJB*=G?J@lyYJ+xp-~WiWaY(8DpAv&d%jTO>UpM-&M|G7z*Ud`qJOA>PMWexceP!o zGGcWiRU&u_F9`%x!oA~5UZrFp%Jos|n0coq9wo}lq^N!J0~!w&NA{FGtp7)`v7U<| zJUM&=9xsBZm5;*6SF652XP{D9Wqlwhr%a+&yvR><6A%c=MXb?I0Eg5lxeB$>`W3v05P>P1VFfX#IAx0Kf?g?d#v6Laas{9R( zwzr_aV^OFyE)se%#-xyKnjOuT^rH9mjr6b(r1pPP89ol_pwzbT&|MV1dGT`&YX8sq z$IDG#37thooDD(UN5Nj*u;Awnz70~1ITyC!C8%BW2S_S9q67(zksyYv7W`Zzh?eK? zHy4%hs+hhZyZHBqek!MDI*@yG)@(elmWne5ubWskTN1wRnx?)vFZ1iXytw^%epCO? z-NlUt(NA(Hfye^AImJavV#wUh{jpo$UHLnx_jhrqrA4^SZ|{Ivmn6*XUBTYuC8lNB z1OW{b6!@YX#=$M!Krc2VNN^3OpLHw{*J9$&k(u2TT7Q7ingVc zcwG9IjL`&4hX(0s@FR^nO?w>M@e3{uX5`)FEsNy7gpmkbY#zYG^EjfkSyP+LyS#N76saFwUyFAR#0PB#vYqlcw+4Og{%( zUEy5aUHF5`w1Fq?ql7FN!MO&UlB?Nno!y&BuqvA!E-2sY1FXHG$^De4$s+Z?NffU zOV}UR>O^h_@6K2Bz}8)tJ^ck*2}71YtJRSCzPTL;Ob(# zMU~$289}b}@Qjhm2tslNYjv)-FPI!{C~AkSRgwi{q4>03qs6Mib35@_3lWFrK$itn z#JsGiJ2BbNv+I#wZK{jrLUZyOHcJCBD(PtTjlZ4xdwX%}bMBLVg6Gfk5-%^L8<`W- z2yZX0>h#Z=qi@zY2BqiVI$v*OVZ4Us!2k`>pxQ4zpK0}%+fQopyUs6T(;!a2PkFCD zZg1^9$U`@?*V-4jUv!=$sF9J7SVnAWtwLy&4@L&_n^iE)Zuv#p zTfOGTS~~i=-h%F?Uy#mP<4~=fMsa{}A}SN$ z8&9@>Av6+3c?L6v+0na}a7Rb>!<)l(4uj(MLV$&6(otvR6N&>$E(k5fMhotu4??zl z(^4<2!d)&sZ@Hv9s2XkAw0Xo<0)^h3Wg2mNhzd~nsYDHpsL(tvENfah$Dsav&oAQh z(cmj8q!-tDv7rf^ZmYw1sf?qUcjVEHp`Ye0IeVgXf*m97lEwLAAUZ}6ow z^rA@m2@>oC?}sn-m-l?dE?u`MdMNtPGnCm=zqE82>8&1xvx?lSfQ)p#tMN{Q=)q^0 z@zEO;5*(}JhBP36essyYWtq~%TfbfTZ_%t#Q;=Qco)GmXSQ~iM7Su(Q(v z7;rR=11`A$*GrrmmsP*fuQsnQFUqAq6tnnn) z-0tgi2Wv+ZAG}a#{iE-+wU1_Wrmq>JEXzAw0)~r(DUVV6J$lx9JSQjiSF{Qtk!@AKbVt+tqSCcU!z_DoYTy!7r$i+f0z!|TOfRV9hSNrYKm z!5;bhGo)mhtPyx}zHEEGRDKu6l*&PpUjj2L8Yo6JDpEjuy0{ErNzZatE=I*^Mbchp z2zfeH(V%uKOk`y}gC>`S@c&|`;1C54JG9|{fs|CbeNK;OTsDV{rok4V=s^^{cit+F z8k$M?i6;h%I5u1-(1K|CL>zob_Z(6qFU5RK`Ja}Sdnb)Hi^eC7s}p{N_$u5<8#mj( zMC+VFHKiw5$!ZP^!PjKmHpoa@QO~7!bMsd+jF7M#kX>`uDA`)-+Ta=fq_ipuR~ac;dQ6G8$Hm;dNtW-v@N4uFE-UVX-@BCg!bQ}WIMeJCv|~^ z_Da~NMIa59d^|=$ZYyQ1KEP3O&!MK729hY;y$Zs>;r5;ro2$HX$Q8UB+qGz z6Q<2C^1~P>yc_|JVeZ~2N<{Be!j6NrhbF91Tw;S|JVF2AH&?^N-0SGYk2d^O3w|^^v z)xZsvH{c11o_*9->Ipo??sYT5S4Kb#M~(OtsRcgCj_7kNo&gUZP!WhvEh~uCx-aim zS<~;~E}p1+IW5gA{r`lhB5BJZwDcgF?%qv)NKr+KmX}Q!REZN2nsw*+aZOAD6t4gX z85VVCpAYj=Jjzz<1>1WxDLE!6N`X-1CrKho$HR|irayfSD}oph<2WFLiqvG<>?Ak^ z_I`k5O4q3ENanZpV5-o3!I3IxOf*uWLkH{y*X)4BbT8;>j!*1A{}Z3_a(s$;o!1er zejI;#HpV~|Ek|X4UvKlKZuJa>&P)jN)30TpVMfhviF^WcbG=g?v&AJ;xP6V#cagx(gp@IsgOD1@%3$GUvPj% z!<~ERZbJC6vvC!cDDIUn$upqp+TZ;7rIsO1VMdTD_B@KP4W`uR(oNHvq8853O1gW0b1sw=f;zu1Qpo9jJVpwqxrm%$sBL;_%w2`*lYAEUhc@ zd{R=;4YRcp_-%fZT-CR4H`UfRu@6b_)I%z{CLc}#lQ_S-C6-QTl%!zXW5BtR9!z4Q zUdX9$Q&7FFZ{F+hZ$yq{kw%5*dy+mP83p>9FpQ~ZQyI4;Fv+Yx0w*g_k+_voZ-N$57=CU!fJz4mc=hjjsnrril5&MS&v7yq z8BW6SZHC9_%os>q#H)$ZYbE4j{ml!>zmO@|PlfVt<>@4b_B#>9mpCDkfCb1BA6H6$ zdGGsMW^5p-sXndh-~CiDr7fbL?CRCs?fH6hSCnt-@*S&9?R`ykHrW|TRVI>lu=K#o zyYvu#$;8OrZ7O_RsV{l^2U_S7bnGWQt?&<4Zzq!_fe{8WlN5-$G{)@FZzDIBOqWB} zZ&?mVF-?)speX_bpM-;*c`ceT-PFurrso#z5VxiyZT?-X=j6dJEVi6k<*vnk7EOEY zJjok-x?#2F#kaBb^C$6D?px22=5kruY}A@ zc+__~Bc!g-+B(Gsr2yDZd*K|7Ln-IBv`r7^Ao&!V$02!Ic~o+qj0$R3bSH5Xm+Qg8_YC;*!3JIII{s9N=lPryfsMtJZ3|8)2__~ zg)6Lxt3QVtDkUqJdNDCv;-IB~mUM>7?qG(t%I?)&8XS%7^hD`W<@luR-M+*l zOPz$Jhz71SX5$=9YVXq|JTtv{tw;~{L2_^B5bT{Fd437$*Vvz^@3mBQ>?Kd~p9AT6 z6O*&!c`+K}@uF|EG7p})p7`GBk{R!b{}uT}eBZbF`vVk>F70;jrxh92=wZk;d|}vx z^z^#DxNMhO5~hPSUO$gQvo)bFiU(}Yd-iL2jX_iAS86ELVWucwL>DL(4|uIA`!K^n z@6&6>Te74C!Pp}b>nW+r?}*@_w{%Oun|uXCIHW;Z7wFl(iIurXN^^O;ue)6N1ML<< zt91<4h~G5iY9<4nEk$rruU1zXzX;1G56Ju}{!U*}zMzFm>y{4}x*7%Bt_cc2H7T@1 zT}JVDZ|J#F`(o{HF>i*Hbw!{cooex-m6;KN_wTT>{Coqm|&HIaMp{&kDm8z}g6Vcx+A$y`W}vLZB3kYdh1i&PfP(L%Q`Z@8XPsaRmB?~>v9N`9Bez80WBo{qp$L2Z}+1;+PXQ`$k{9^mEyctJ8+@qJs1 zOL^wV&J5_+&7%w{uG5k@F!e%_he$NXL<`b``X1Sd(KjbkwAz4mmK8D1c4BQpDb5cF zN!FE&0QvFj#-#WT$_!^ra}}p$7^w!AWF2aFv4LdLq}fyABsFtF43YKsjVZP#bfJ&* zk%@ONZ*8hL#~jN^R3pwHm|2rjdUqZ&_9sbv#(7Z%2!H}P>k|Z-Nqi>rXEFn|&E+~i z_t|~pt}-^c`#Zd>H6V{*XDuB|#wC?dH~Gaa1pTy$(M;RTjeew=ezL6TqG<{OgCQXp z07Zon={$P7!NL?t_7Fb1m_7b9i!@2lUpQ3=Ux^-+ovKwkRY>461IK`_E9i?S%uIfo zy*Coec-n;>>`TU`$i?^I<+1PKUn`{4|8yzlPc&sWQ~Ocm;>ZT5z`l-(fV92L&l_>a zYw6sw?s+l(a5CL1nA6HDeSG*BJSC2Nv^ZBV8%|{e#g2?SCW-oqcDDDMXoT{6W?07+ z=17X`QLqItUxq6(%CKf`9S8lF0ADh@T6#Z1Rk69*){nZ^Y7DM***ejv04Nf||8&El zxg#OD%~sCRq3?+SA-L4lnu!nU3XphNOma$G@G5iZn7660y4aTajrLt*^&&dxOy(64 zE_9z9M@(8=tb<#YU$4^61nBI{iH}4SwUXhODgIk_E5N; zCO+9#vA_h|@UyK&&I~xt&>lq~nd(N)m`qe>UX8sE!k(xu)_N@2E&OYuz;RvwE|Jkt zAW+HLqI3d4oD%nkTNVR?{#k ztjYo>p?ibOBzDRM#C_4fY`mbO=)SB!hCk3U1o&+?V?6ixwET*61*(uGB-dR%@yfMM zFwP$-Ex3|M5v73MIO-oog6l8#ktR8?6#C*|&k8T2!B&g;+~3ku(3A;#DBl@*y~;3* zf{c6+v<5PIP%-cC^}@z7v9)9Pud|gq0haD{tPT#K1Yceaun9=u8g13ZP3ms#SBXDq z|KC7fe0PXr16tPl>NwOHwxQ1N?{2o6n?%yuZZ#@s#1CZDyp%4ShT~q|>L7EGAm}+>v38VXLAqaSN;sf|t)aQ3=={kLO<}{`j z?^v&-9ORQyksg%BMrltwnWi~?xXZ|=B$r=>Di~0I&vAo^EijpQ`V0eR7E(;y&qAt- z`Pbj|lpI!Uy@JZ78tGwxC)*BGg~TiZ##$qZ@(c;2Qw`4t_q8s=!*fIiew|Tc){}l+!I)F+xpD8*uuRE-dIb zV9xlAIwHe<|Eg=0;Ack7Q0rwJJ{K-B9Zu z=D6ec>xOzPH`mAP(6}<4M(JWkstA=IekH&bj~`c_6b+}Cy{pmPBhc*A0Fw?n)CkmM z&NOVfYbhi4O`7PV4ZlC$0!pX+f7G@yhlFIPF5qA_UPX2e0r4V=Xb_8*-O9J64Ns)_ zn6v<1;9-x%9_)!+E6}2tqrE1e9i%o}&*d$CW1C0tchW9(HlvgCJWMe-$;v1P)o)kB z()*ekA$CmuYL0&J77*O3`W7g-H>TBqZZn{>N=4&UoYd+(*OytI4D~Z135{|`Pk>)I z4&CLJ0UQ*Oov6Sd(u7QpJuE}AVFYH^a+HH!*d-Fv9GH$Qg-0*UkS;VZ_)aP)Rcw;*6$GqnsXh0j?|$W1{5c}n|Lg1Tzy1gR(@ifUDR&jI5t4S7$3Aigzev#F&(>EA z%hEun8z2ycEPmP&2}f^gX=QVLXy^F_;8`QpX2x#@8F)W|>~alI-VZY7(NyA#H7UI! zKpP@&)c$%!87Dv|hzQh|KBLJblJt6YC$p&}ZygBTD6OL=R-9OS?UPR@TyLt{SKfbW ztR&eGdpI2`q@+p6aJ7`74{3DY(^3o{CUFpT zCe11eNtaLCm%Ad$E(wsjCB~Prn<@gnXn5p!&$EV`M2SJe(F3k;(p3^Cnb_BiSQEv zL0EhA%xlmT+#8-?U$oFZfUhslt3QeKS|jKhmsAvGag`bIIs1Nn5|y{TzPz}-7F2KH zq<&aO^z_VQim34vU|4mRWfM9-K?3JJ$6pZaAY>0A#6>GZJK)8V9Mgn2=R7}(W35D2 z)nO*O)}1Da&G-@aOwiYcIF_RoebSe%EWiOKM+Q7~M4x-Z!mcmx))&mzXm%%Sciw2* zTLnRh4;%E2s_>{O?@kSu7gq0hT}ZEYM{xXdEm|08od=wpgb zWt2aX2^l8L+d7#J`p`QDWK ztJAqDpg;#mY9F@@oeWH&>GIJ`!iVcR(jP$^DZcb?%84mkov@%sg;dUa*zROYvUTna zCneNH@hVE42-%x=l4v9vSAP=bQt1Bl)qk6v+v7<+dV5VTVngP~Zm=MA7jaO900PrR z0colInD#InLFbFY+z6#0xu3#poZp%zdUaTctR)k)2|N4gzR*YBS{M~yvPm1#v zmkG$`c=vr_2If-Rf@4a#8ty)7y7drDinE?Djy4zfe_JT;010;5GkH^+IxKr86OXt9 zxz{NWt3gqrUAQ-V$}{=oEAy`Y=yI!4bdnU8g-_#zAYx_Q8$RXA^hEhkZndDt8NRef zTEzE}7C(Jh*Og-%w~T1EWJuoaK}z614{A)^^SN+lh}4BorQ6%{Y>F=9b=rQRGU!RX1wm7 z&Ja1Rn&8Sh6s?dnGs;oZoV;QX_wkvzH+(8#c>3e@K!K=sJsVNvgN*@LQ!S{tIoU`P z#vneMvoq2=&ewN>xB9ou`fvQQUxyX_Q3UWwmwy*_wl(r;^h^j(S`vY38Ay|Z!;O5y zw4U2Eht7;+Pe1Tm1q}kL4A3m{2B;jut9H!kf0oO!EGIA&?xXOXKv_{hX1%Fh^&B91 zk1S}wds^?M4wuWwLOUqxt3j^yfrP@?r>6IS$l#|t^#L{QH-zqP&&#(L zm(@+ZmM(z&08;#7{Z3lJ>Gp9H$dgz?oumLnEF_7MT5V^-%e9javr@(!JtsQs>h562em{jJYv zZK7iHJI6i#Zli%de#K9zwHTF1GeL>(m5fFS zSNH7fKQ1>#e(9W%*_le(>|mC}^%L3-#8E;U$Vg^6xZ}CauysuA=f=Kj@9lGgkX$xz zIH9sC$USgRd|!I!>S;d?sm|@uL~^HzhpOa0vVAx9aj?T*mPsUIDjR>vKcM|EAb$0U|+x5-?S>>{)^NI;9z_}34D!Yeacrwg4uMh4Wf zNe8g)eOSXiy<{z8P_f2$7Fe=#1FHvzpfMrHs9qH}ptBJivmnsUO{XP_LAK`Nc1ni- z@fo6f>z|5}<^l!nvr0ub7)n575FL$%f^Q*8Lq^FAc+GT&0_0dcGjd@+llcO;(Jbi( z*v4RwUti{>V2=mX!BJQdRCJpuD#@&|*S_>sGJO)PIxv;PqZ7bx^LMpm(2Vo27oJ?} zytB`nh&rWqYH7>_O~!g4V8ogwUD%`p)Ry-(@vXKz&9>z{DF^C?H`M3$BytMvr|p&s z@l!dGQO-(6ZL9+6?%rPf@~M9>{XWO-T@*D&U-zG0U+*M@bgac+fGQ+{|q4_+1 zy27i{Qu1w&G{c{MmhKn(DbHE8e&pUiWs=h?5?F&YqRhZ+f&`EFUZtHbAy($e3pIaP ztsL>OQ*75(!rj|cZl|CRoi96dVI>f!EhOkw#Ce7Rt?0sJTngO{PjbvA*uWu+_$>L? zUWGhM0vc4&wve(2FY?4cXH}=gIS(ZA-jBo?s0U3<4GIMYp^rh`>KHUu{+GzMHH6Pg zBa`j#471KB00=K}kR~CeCM5IMK?)EL%E380-TOQ*^Hc;-PA*lSwe!ANuhrf9!%cn- zt59(a;$EG^I9~lyz|GAio8+^;15$^qt^Zx$&n!LE7m+{E7Ld@p+B#tY585`tV-7uRn`b7UI^q3rM{A`~?~c0J27kJ7qjoBXi@I=E$?MQJz1r!-Ibp!Gmz~wOf(OoB9qy-&v%)>&0YdHzQ0@rQ; z=#6`KuVwXldj<|6q)(PV*mm^8#-g*57nNB7(o{m$plD+!r4_vnnkx2-7*a;jjG7QY zvM|%A`&PvK0pHSB{~{QGsh+fuMowT`jzrv9Z@?k8im6K^-$p9)b$IT)%5QU&h?vMm zAeMau!D)20oqJA7dmW#0%&QJn!g%M}K$*l1dQuhbs`ZXbvLc<2Yux7mL`%~q?Hyl8 zjUVW81!ww9{s@xFr>k4oyCiP@xekLcD-PK98CUp_>j^ z+9+z;BktCv55XlD2xpoAl?q7mqCGNA*1agzX*`5yTCMQVO5EYg??;wY&(|OWQwa*x zslY6ER?9=kvMH)6=EY%DMK!2s6J&X>$<79Mv4tNi1p}o*HreTeU38SlGfI5E3#8*sYbjzXd)%;M7yhp6{GAsolo2` zX)w70WVbNOD$*oi142~o@pGH=Cdp9D$QIhfe!UieN=w%$iLc{-d?ju{Er2>y>|raZ z!3fBekNt*Dev(i~d*4$oZ%_GiW!yani}IVB{9|gc&v$ACbP2;zGYtx}0)OjJzz37Y zfT4vJ0bu%w#Fey9J{?W%pY)%;Qp%aQu9rKo3$qHcEb!6mRRab~!oUS|Zmw8Bt+Vo3Npo$;@`7sN#Dv{pj zvX+BSKX?IWiQ#Yu&uN9)js`|JE(69ntZ14>zeK!;?hT(-sI`J>hj-YOI~1;Ff&05f zVOR%qDCA9)h5?mMDg;yvr;Mo!-9amVFr{dQu&myw;0k>7a{(Zh<^<>@_x4enUjzn=dr0kEf4oQ82qI4}b4Ji<`Y0OI(B9iaBZrrz%6p*ql>ga#Ax9xX_g z1G^+$3TXa?KOETP;es4J3Sl(MyApa%>~9hasI|A1qBq1P)`ei$v3t^nFfK{w$6u2c z0nFUFzCWnb+PR4RPnHhaMj{WP-p}6C5dy;0RJ7qLCE^!AT+hVQal|e>sx-mr2*f^3 zcfE!PR{}eF4$`Duo#V`;1-Wqmv7dICT|*PT5tb$GrR%y1!Mww6cpjGM{g(M?hWzA< z?~*W!kDo*unP4`gV3zvN#Anqne!HNLtTlZ)e?X20)u;Q2N+cyqaJP@N-OLIhf}a&6 ziKgpM>53qYC8b=RMg{=|XSpd>&{3YJaz$jwjEW^F1KO*^3T^X?*x6YdaM-=tEcH`* zLBO9=)PDnSfoHRjz8e3BtTzrA-=4Qm?%F8g2EgBnMoKsV{SczRrx)TGvo(i{+{;r_ zK%!(Egc%JaNN=QR;}^9?vkc;JC()*sNs%?5))0^^vJU9KP^XM-5qp~0dp|7T#GN!*>L;2$a{ZY?t6%Md& z?(c7ENWclaf~KK$iH1jJ`)B8GlGuD-baKFIWd@CK`&JxoVCv_-&zVSKG7%$G-0tc= zSLw13@U-Usj>Rb@oa|T}sIfi)G;rE|aE~B7-Urn_ukmFNFqWR&pVb*X zavzR9BTv6O?jc}zXn92=XVOi4F9g5pnaVN^2LLU9#<6Hm*cFpm5XSa4X9 zdsd!{xH@LBk0$s7G{ny=1KYDG6{bB*OlDkKmH?ljl#u`1fmm?)Q*Ce?i}>Q!K7RM! z<|FxW5P77$19(mzc|$&ux%3$<`Dul(i#`Z@Cm>TK9>ww=4Qs;!_U_*BsaEGdMs_4IRG@tLhM{cajPnVJ-nP^7YL{QO>GY`Cw zB=}QgQ<|YaHTXiqov1F-sPa#yb-fy@b_*lTFqn!)Pv*?*Q^=L6R0lcS-><=f3>TepDdx`8BN66(z8Hk~R(A14W! z?A)}#=pKcXsA0I@d7VtIy>CHl+wd*9teab7Oa*lVeyblyU%sr!kO%hKmzRtCthOM% zxp?!|?tv0u0V(zHX`%~$5f+5K__=L@L6OVie|EZQLTT`OdRhkntHdVpq^npF`7d?Y z`i9l&$D7TS)N;{=VN}g!+6++R6$&H-dQ5^I>+`=5b*5^hnsjf{x}WXZ2m>grtjyQv zSM|*sQIm>TrCC-qSzS@2DLF_U@C;s|#gXjENC8{Tvp|9vbt#sqr(>SOB`}6!$h~ByT7uo4WCN%<*t- z4$OhFUJImfmic*|=Mv#k6d~djFqb|LzAU=uogwUR6KKW+o+Pb4z#9jfBA=pISAX} zitwG263REHQ_JIPt7&C6gxfYGQir~DwL#bH8HcYE=qbbSC-n@x&CHfcv? zGo9tedp7S&JKkf`4bT#TRaCn_&lARHe#(aPeXz~ytI5rS5m!0s@v)*YD3%mW0Y{p- z+2+R~yPa7Y$1eV+#rgKVLjv!ovb?*#z!S0tbiB9HZO^c*d*NRBTZTy%6YnZRADkB{ zoNGZeB;`6wtDDU=IML_2L56(D_#})Qd9~_$A3^=A70M<68tu>Xb$(T!Z*Om~|5mGC z^|in8r`P%~t*$EC5D>{>o`fLP()%>RS26gk#S)luU7HV{otdBR2hYxSKe*GED98pM zk+}`#@M^uTZ)A`RP(>h;N%#{pt{^bEJ3xK(+p*{eHCxmQfvjWVEq`k~{OR>#C=Jmf zKlW**6xX4j;sY4G+R$q|l<|8fmZc{;|E5&xVhf1h`VF0C-|#t{#IdR)((6+IF9bN; zx!#KM?Z{kmN`!K^N`9;Jce3VPqdUNESa3dBBqXqSWb;eH0L7eA zfyR}I*Z%3NKiHGBbD*H%#MeffzOY)!H&?6CH#HzqzSTck!rrb{vZAZipZTxse<=TC zTz*snuoIW~&XXXQW|eZ`$YFIPK{rC49vrR7u};wB_g{bg%a1KeqkYH-29`FYuc`U(o-xKdeA#M;X|Yl?sZy38qg7 zuQ@ww_@BJy?96?QL#q=9f;#&w^aCg$OMKAX4?Yk}UvxgX_ju5WAV{KsOmlI*NONB2 zcr1M6X%7of1Xy-?S^8B)gLF~ky2EnML3T$+dC`bAEWHiSxjs95ZI)mTI!Peu6dq8B zgv?M$Gdq>;d(6_DD`7-hXvCvg8Xi^FmzS&6-`88*z~A$`oDDnw_cd(pA9X2z zx=UMjpbwuo>&he|9#9kl4l1digAZ6SD{ntL>)+nak5`|a@#>d%X{UzjuXZgycLZ!Y z-X*&s!i%pr7u(HxwYs_^8ELh`j;VFy(?cdwt5OAiO3%BnBGqwP92=ozK7$S~?+2h$ zejGa^lTk6j3%m%4SSBPz<-i#$c6eW2tG0iOm zD|xW=L-nP5&)He`o@0(n9Y%C-@qEy$qqvDQ7UW0=o%+b!GKi9WdX+RRLoen8_$B== zbLq^~pMur~IChjhaeHF{WVy4Uh9a=o14vt^UYfHRT2;|f*2(@R;u(+yxNPcK(Qlq zqKbMkjr@o&^N*Xm+xRc~N1(PB|C_AB%^e`E)%o4EAo!Jc#0Rd<^UI4j(&RfyK^RPP zKNf(oIFn@9$Kzs@W9O8fdI$MXSxF6tDWtt8XYy`i@X?aR!pGCgO>P+)** z<&oaxd7O|c4kRbIyDE>z1_<5KjQwE^l{?@2dSH0j%ip>NLnyD~J8>k1u0YTV>~nhKH#uKYqBm+1zxh(7+@2>&-{TQs2C_M#}oNfk9T6)4fO`pXM%iLZ4B5?-K)x1sjLX+)-NDR9x| z($d3u_5Nb3Q(bsegCGeeEZtX#aqCM952t#^@>_Xa%5cEpPwPrmWhq_2HBI~%usZD< z{EJNljc#tT?h+w(@tpBItuhintwK4jg--UAqh+vd^=D`#xB0!s>-OD7YtTabnt6?_ z^5*Imzs3a!h51K09RYukA!dH65?ZR0XQe7>eP9Vg2KL*{#ciGGm4tQZV_&4DioG%b zp^`_ry}N3pur__5s|z|r2~Axq#PDs!6gBM%$;q4b9m;=8l=QMbC#AKL_U@#Hq)Foi zcxD^mMIl@FhL?Z*cZ+K&FSp+?r^)9ubpsilCH>{t(@r5CTdgiOs2egy1eG2e{NG)% z?k2qevReHj>~*VVU`S_puoM8^F}1&g71duI%{x>+Y`CEfL|9}r@Vdvm+093sH*eoN zZ%VfdV%mu!zMa8*4w!eQSS!R^KrlRxa+Yea-?kEvH9I>SZMo{U90`t>sph6Oer)^f z>V40Y-gjd@>lAzT|F*sXBc1;mfx!m5+i&hQH<842af=s0{w2;V^H}TF3Y*QPKtnf;CjMgKgXRSD$oY-Fpb{k2mcY!U{(|^T(M+=3} z?Ix>_O#9`fU7woFH~gP)H02qeu)DSG!sCd@@%b`7p@vtm&>!W5#Uvx+m?D@Q5=Le2|xAIN7pD@&Mr zL^Q_JUJhf(z2dDD2iOu+$&$~-G$!LM)S zru2?AELx~)B$_@E2OrXX+OlnliKqNeOUu2Jj=h>lEVvhyrND+BJ>eGM9Bg8fc1kjL1-ei8O=TaeLzFUYGfNvkvoS)x{eL&i70u}ivwAO0jdNks0E zc0J^=SLA_@_n-;O)We~#uUP)Pu9@9-Q@+DjLQ73}^=ti)Z~6Tj?!1M6ujPBTfs)aC z`3BK9b8)r${%wBqy3TLPx7a}=#c6o&FExcq+q%1*k*a77l)(8_ep|jhFDUikpmVq@ z4@6c-l|G*ZB6a7ULzY0P8`DR@3R_h+^aaHGlY|7lYgB3H`pc48=!0qety-tv11cK; z1HfQQ+WdH4m{N#>t}dlz{9T7QjSL)hV|L+JJ6HL^9lD_eF%@%ySCYpQf{Q@|8B_=U ze$cM6o0)N9SlCI_)>$bn!frRM&Zu1+7yRK|Zf2BlQp$8`Zx@Ai zoeHpKclCg=cAil^&@MqU&|ldjq{4m-?wB02GREZNjJYfI z6OX@)d3xM+Q>A_q6jT`%bt9hD1Gvk?^y|9zaap0n`eeEhc^ORKZuaOX$RNkZfjY)r zwq^?!RV=lM=j1$JT%6zJm6X=JO$wZ<(li>Ukq^i_HuBC*{hStFt;-(8W7@qKoGY>e zl8oqBk%b~Y^ozS&2Cub_!QIUiR@s`3GTYbiXJL{p#o39a?VFhoedD88g(NbI(>;~S z4w(<1?LWvrc9)1h$rg8-kc;J22HL&N#`V$bNLW)zGH$}-m*8ot4un@b%q zDWtX=Ob0x)04^6S>h4W12QLbRfhJe=?b}VY^>+!IYcjSJ&QM*vxe&JL!`uVf?$+D8>+8)8 zMLtYKl{vjAs1-+aBd|D=&UHsE($bsS-Zd&R7H01${|hniyX*hlY<)R}KAY-5^;m zip#o<_4RyGA35Hj-^rqoVOU^yMD)d}B2T*d4en^;x5!dFlC1>9V{4`3{iU7b!qfqt zvojsxnfbG8-c0NCVOUlbcv^8RXf3(K$agh=Lt>7r{I!m5`~}s}eg7b?W7PSK3VZV0 zR2oOA7m76L%!vbEIz8xw_*q0nMXwqAwvZ!k6M!-0)_6^#7X=XB5 zIoWN3@J(HlP@k`9X3la6J==fFK>p({zo`sui$ESJ%bKnUa@7qnHu<3$y8Z(s7{(#a z2UQau$r}}*73(XOv`o_7FLfjNd^3xU^UL_LPZh;tR387w$WX4Up!CIp<7_|ax&TE2 z+ENa`tjZ+SNr|#{%j;6yQB)Up@7zhpl_dX zSl~7-;eGV1E+T2m-5v+mJ zDFpeO=6nu8YLb@7rk|@Ka^O57Jw7OxrrRk!#OVSO#`GqF6Y48VgMGZ!?M8)PlI$fK5_m}peApoV znYK%j@rxepjY_|}YkrdeyADF?eT>a*Oc8X!h|~)&^CEm96#+$aX=#o zrG#2WuJ=CAss_(cM36nJM4V6GyR=e54YRb$?92|4RWaHjm-Tmau6I#$eElG!l;V1- z%Q8IeK^00r>51J~rUi;1uk-Ta_9L&$8;_L4q!b4y`AZOddvVV!cL`wmlgiiQmqalZ zf$tWW#dym}wXVFzR~;KPH|+U#HoL+@BD^Oz=rb~8y-|r&rhHtUNnVvC5}295%l3@& zk$CQ4bYbdKWJf+9X)c6|*uKXiz`gSU2K}w3KKx%3|U*m z6xUoUiqOhyY~DJ*a%tWu;^>T`=M;Bugz9Z3k$5QysnvC!h1B;LheT>R)gSOV2s^qw_6mUA1nE2Mv@eNJ8#793duQ1BA-AfrZ?%~W`Pf$>EEmC@z)n- z%BN_-5qe2fAbo@f-Bs7Jr^YE*UR_7xP1xE@tsTz-mshKw^PAg?{PKtY5tb`;RNu*@ z^z2&)gQ>3KuYUbM%+bd~LYI0HP3TgO%0?HZ|FJ0{O+y*eMkkG(o&B_B*GNTX^~f+B zU2!}Jk26j>b4B1!qw3~aP>NTTan20J+Co#KG>InUr)s#Y$WhnvU%zDmQ4}wJcge-t zh{M(GmX9j4CNBt{0M!g0v7ye`p-%U;-y?NM{9WH3{(hen(nt-lJ2MN^&BQMC%$9z9@1OS9B-NCZ8m@p~*x)=r(1WhcJL`+?+|aM|iG{$Z zUd1!b5pBqcq%&Pzf((rl5Iav_G1M;+670*8Oycj_Uw^!zB)ZMFTJo_jIMkIgF#$vV zdZexgTs$noV|p*RV=I_vbjW1J*Z%cgRFF}97ggE~EmQ8MORrV5Lah2)vNi=C@sR2E z#O6XXC!scdcF1jE-Cfe#8DuxW3{Oc>a7=1|xM-?=*Z>dN57(QLpe0HTsq!S}nb^YZ zg*Y{dDr7OSQF0u8Dszy&{pDUKLC><*EWgPOl6GNV=;p<7u*I$Onjh=V8Sr^I;wUq~ zeDG96!!i6-Vb_9Po-P;~&=V zO|AE!@?cVtLD{CiR?bmIh}D8iB0V*N9$cdOleW65E@ zHA=t^Nv2LpH2gRw8A<$;JIdi+E$uHCAO%Vd^yp+yPLFZ`(5K=;RSI;vW=1XS7SZuw zuU0?&esTNyHov`_UCYt@d>`*Z8lt^W((g%~l4MiKOKO>E>s;5h&!LX^dh3lqmvI=j zS$D4nCouJM+SQIVS{DMOgu;oWLBvph*!G-sOKsr7RB%oMaBS&@DS7d)<>#OC+uS&j zO;wjc8;E(*kg}~D>9IIa-im_sn}80R6f%hP9M?haeqljVNsL3ls$Qm!aQEwD9;S5w z?Ju8lt&^7NWi*!!se@FRgpiGET_38hJn)D?c7&PzxVa&>1@~N*U-I9zDe0l=H!T~< z8p%k1N-#CMtHO2kw!kUDgt=y(@I&lD+k-y7qE_I*74_Dj>Wzck><{ zQVYVzRBe$@RI^l2U=yR!JXn>2fzDA%uN`0MMkOL4l;5e(=Qmrb%ZSt|-@P*+7Ql)U zYr=cj)F2z>9xy+en?DJcY~n^3WLAOCQ7fs8(p*v#VmJ6*-CysUIgSCgh>HJF4^LwN z$uKQ4>^w@~z%N!L>_)ttzt7Xe>yKB(W_E!g)1^luCy|Kk~ET@G~_KmUfpJzX2fO0D}f(Q<1i@W z&@12?u(s~1yw>#zc3TJCiE0Vq;TIklaJ+qvZ2=Gf*W$mTD70WgO&o^!aZ!vYH-N)x z8tsGvNnyLN0?-hJe(g7x2f}yc7;r`rIz(M-@=*k8a`4if&Et(gK*-c~>658x675EJ zY_=OU%+jyI&**XDH8JN=vfXA6g(2MjlZKP(dIuFqvRbEgwdXypAWLYpN;3|JPB{E< z?ECkm3!2Z1lQ|;0u`WP^QFMJpla=7jK_4^cZBM;WM~_4Wh3!+yCzOX9ez zkXBQX@5#~R%XQC#75BT^HZsHg(*Q};RpcsBaVpLdoG|ff?IhxiyzT{;KG`Igl zyXR0d)~y!Ct6*2are%)zEOZ-v5Iyw*VRA2dC|S*MgNv*8JKmqDzCrSGEAx? zJPFZIh2hm+Z9*ln@xBe^j3eg8;*BvP*oMab-h_BC9I{eSTnL{~a)-mP)tKk@B^4Cy z+qYT=g8FFLK(dcd-zpNep#ytS!XSh^Zh+7z&#M}D&znnD`_J~b-L>A`72_%nSb22F zot5`kc?LOFS>_jc?=m3vqad%rRq%m?&Wr=b90rs5Hi>58ZzRFKPJ@P>L(imU-wUA7 z&AXTL6W_f8I7PcE+Dp|-+PNL*&!Iram&8!WiSg-=hfK2PaKxNH-qzcnZhpI{>izGx zCofDAFHm%f1n?v$71W-*g;!7R>g~tt8eQhQegp)=dQXbOrp%^KA2;7@`cs{XG6;*L zDM;95Zv~AOf_oeXR9vKSQV=$x7bki%+EN>vb5`cNR?#%PLvP{JSWsj{kJrh6&9@5V1@HZdUl8nLW;!Z!@A73 zK&)u@5@<#N?LBiJBs*yWsNXK^j&$_(1)1JI%MZcgBI$Oc!t4Cw<%TeaXfRq;jL}ak z-a(aCT?dkPJ-p?lqpcPA7zMaRRPF$XV*F`K#%!5M$&2KA&AvL_a>oB^ zwd{eit+#mTo33`J;PWs|U~Tc6fGnoJ>S%Yze)ka+yOiu)Fme*5fONvIHBju19bagX zVV$tyVNr=74`Z@HN#AE6#Q+f&U1Qlx?5A}qv3)6-3+UYHc!{+DnVEzf8j9$owrC7S zG5HMc)2r)k`J&i>*z>^#mb0+$=q0Hz%VQ;PkyMpUaw;pI9-bR-^! ztb0cH?uD}0T>G8aWWf3*_&kJJvZRbTIdAjrTRGQ@8oZV4Q9!PG(vTAZnly&`)9cg% z4m8%Ot!5WHnI+xYJF2e{GIPw@O@Z30_tiDc*cu!blxYM_?q)?WJSpgjcFS*|P|~0J zY%4eF-9_|m{uM5eq9&s{%aewa%t8wwm{umtYqdOT^Qn*mf*bXd{2-&sIiyp!eY-VT zR}pMqXI$lYk~O~A(H|>QO4CU4Pdu**BPm9N z_MQ&W#fHI>x{~(SlJQmH))JqL4ucuvL;edq)f`W`Z^Wqu!aOQ@JiJ z<_MKh8gxWFWIdjnn;8hGu|7u{s%U^s5`YW}cs`YnX;Y99$sx4o5DYZ!d$}+50H!h^-aoKl22<+vGl=ijA8s`6A~m#RqE$tr3ZNRK z^QO6^Jrv*I#NAxK&~}1wunDI^CxK|5v$>A+tv(of1mTs!>j4x1!DPb1lJB5XPM2Qd zJ`egvK?n)KH>JY=Bq1=&F_e_+=;Vt{#ZiY7TVlYDR zPEn3V##Y5DT3$a09czCk(F#+o-dC~@{K>AAG3Q!1S6|aB|C#`Fv&^1#jws|s7X?gN zg)CQZi%zPBGrE?n!zc$jzj=cd*z%%p`PTyn3qCTojR#CfP!{R`&)&N>Npc)#y7g0V zO!z>V#75pPePFZ$fCCXLkc44CV0XWi<#ncZy1SZH-7^@i@xPzPJt8tAE9=&m0Y(xi zVY;d^Ga@p=!^5wyn-HShOD0m@C;j~Oi9G>GfitHk?zyL|rTF4_Kf~vai;{_i^FTLI z&JGD$_6G+k5#wV6C)h(LCvO{*_akBSjTIx0iT74%<6Oo7B%yPjAxKYB7b2>Lzn^z) zu2w#@K?^Dr4b%99`_Mn-iYAqH&Zb_CAR3X!Q*)bKry%3CI-D;0cn!fvvFjXD9f0 zEJK8DIS%&w3T7NbR`>~&bdqC40u)h8q`fS^b?JN{+AbA_{I!JNkakmp1l$A#0LyKP zK^Y-HK+5H+oD0uN>XVMag(4=U795I#@HBWNaUF{MZU=?&q+;E6zL*GhL)&ycXc@IPS9&!1zm~Fmb&!;AXZkCHL9WE z;Zk)-;1Z0BS0&Q1AQ3fn@43PBqTnwsD~WpyH|3z|o6W2<9WN*H`K#HWW5lm_S|P-m|+#+l6D zx`+u7XrdU~8%Mc+!%1q)xqG|T7^;L~QK5i2MeqlNYi&ucndLcr{F}8u;G_3C2;&y7 zCI>ck>P?iY?c7^```VY6UP!q~X;|wzot&SbU3c4M!&a3Tm4qFQ5`rXIr$iQUDvXz9 zZj6b3PgQpz*C_q+2M{0rY%qWS{nM{L{gMAv)pp@N2)Yz-$0SZL0A-UT{&fiV**js* z`m?WC;ob+>$p>YVQl>2h@`LBS?;_2~Yye3v})wgTiaYtyy@YtV{Em_PPr zfT}y(R-HbdR1t&3pt85c1B8F*_CGk0N?G~96+8h;EcS=bBeyj&<5o@8tD3$PKTeop z6fhbeFfQAzB+mn+5J(suKwv3Z?C|29dxQkEO(?{*sadr9TC1fX9L~~=h-mN-pfa8w zG+ zg84sW)OQq+$x1y%3CSR62(zY_;kS1`4LIWm8Jm>~55RS+H|`O+h&}(~;OUSHDbZMP z7@QiZ9yz*jez^Vz$wSPM1V~qE3B|=V6HOB(k4@t^#+aO6sXDd(=a#B?arsjE1O2&&8pAI0(QadI!B z*V@H)?BLS_V?SD@?*@}J`JDvNa)_}g7yXiVUEpt1RFZKB~~shX%HGSM#4(%?K4L`dZk zMn|^RaCOqiDZtAbZ9AqqX`95k)b*4QBEW`y=)Kjgg*pD__6vnLHh>-SdF*P2W*Cfj z+3;78A%hllrhq8MB9?+qqSsQY96t>whO{N30AWsduT?iQI1sq-v{sj@Wik2yN?8t2 zWQ({3b8{EvaqD*y&$LN^7i1za zM`D8!U@Xzm&1`)yb1?#Ak;YE|Y(nVBz;!k>yzZk4O z@(1{7G6W5o3uRmaibM<@(*npS)xa^e0yLC0g8uTv4xD{9Evd&xrS(+oqttpIRJr~0 zWalJfwtx`u;i5<*V6T_tN)=L^g8gpEdVfRvCfsi>$pnKP(HWFvgkS8&$Iz$7NtcZz zwZ7zl-|nL9PN#YAfld))hdWW|5Efa557^~T-H~PnJnz!k56mt~J@|gcj z1P81QGcl34GB#nkgg;Qgo`bdLB$N|%xO#j@PAA@B%Pa@^b}KQLA*Vn+l+{Z(zKF(C z5;BLvblnK_Bij?y+^SB9>s2?AuBltMA^h-gHE@}wq3z_ZdL!o;NtZ<|SaKn*y{^T` zBo`jlDh{Vm*(T?<)-=_F8M9A|_p8S5DX8LlxGN%yz2$R>Lc6>KIC%L=05izwhW;=G z6Yn&tT8E7L5=v}VsUW1WB}pwMYKkMyq-=5N^ZP70-Hx@|q@;jW60rv=ahHh3D%Nrh zQ=u8D1!NUAwUUh90b{byk6K6yQxa=rPh$2qA$W4CePH8v2ViPemSG$d1fx0mjv9;- zaU$JPL=ZeQmDp~QgkTVW!8z>lhYQKLi@F`cakf)^r0D*B&tl)bFZV`L?x?HSVN`Sc z+o$(&Z6vb43`dUc;34A5i)Uuf8kDOFPX}@6a6|IbwA>8o0kS9LKW}KFyMF*cIM_td z5_}oJkeT0wZK;iY$uTuK7ZKG`M|#`}C_% zm%_v4zkJKZrGe_hd5FUw9Bl&9vkX3DukE9b9l~|-7CTmvCsXd6zzq=#b~X_Tm`I7a zBY<9y1sfD?54dxYI#gfTr@%<10Gu?EJ*uTX5g|0liaA^UdR_w++4-aQtZ;M+)WJ7TZ4Slfc-!PUD(rb^@w(M?6qu} z%8_$FJXY-CuMv?66p^PAfbuVcpt^T` z$tt2_n@ff|q*p2Zprcl*IRDikG5^)Fnv&h%p5akNl8;8e>||!fS2L7blL1BTm!=QN z4*?ZGUoAJ%oKYiGSCt}O7;&)F^cX5ML+{VT2FpM(N=_(j98OuX?0MB zTxoRxSTy@_3MDx~Zi{4uxk_lPM`bxp6#3TfXWqGUBz@XEPzc{Z8?nS#qRBUiH)O`N7+z%Fh*q zTP&o6WbmH&+Ev`Bo>B^%}7M6dU3uUFy`Nq~^Z)%cl zf$70|k%N~9felwJY3uvX(>?u>7~R`28kqt=+o{8Vu7(2_J13zELm!f&HC{)^-QI6R zpnNNZbxk;g*OA{3J62M=2>T<=LMnNQmtVhq%@^a$lKY3?KQk~bqr{W)O(ayNbNGZ) zg4$S8QeKbGnNach@6-qHpu)X@VR^8ZAWj-*l`y?poZ2aPzng}!?k3hDE&ICDU-*xG z7W$zu%fy#=&O9i+gpto4WfCqfP%>`$fWc!}3(5Dg%OXtE05^ME&~R7txS7$53!m-| zD+9yIL+w2$K0vNPCuX6ng4&0xPocg4Dogyh6}I(={1qA(c+;VlP?_}XMRnT*1<`I3 z;jD$MlVu=DOtni?Iq|^|OpPk!F4{GeCJr!!fymBZZnm@7`FvjU-+R4Pe)CU&d3}3v z#VTWC&!r*x4tQnAmI=Yr!P4R`9#}3&Mq;nu9=JTP42rcmmhphqWI2Cf#wiE<2QIV{ zCZ?8(W9%n&L;^{Bf-%vPb24BOM6{vQ`q5KhSi3=_JChJnJ>X7`3&(2FP|l_zksKEb zE}vms9M2!oX*eDnD!+X+hg>;qkCSsvnR3$g0)lvP6-Ehs)Sv6$L?I_vAz+Dk_3{pR z;|^3rsZr;PKf1qtAxBj^{|@mo4}zkcgkPd(d?n|auVt76^t4`xt)ePO(4sP6O?8n$ zFSKk80aQlxL5gSX@);4S$Rg=GK}qgWbi}kk=Z8xmnkn>OTa~M6F}xjaMlT_uqXb+; z2~O>Tpb72egCbr@nAVcWO;yE7XidQkMkl81te8LD#Zh3kI+B+VG|JjKT~h^)70HbctAX7tfb@28qX)VV#H$Hpxn`)7@Xn{u)Vp zPLX?#1j}qf*T#% zRZ|gvoE}xr`R7p+^Pg*e;>XO71c)r(y~G3(g0Gb$JcPkK-+CO~qtD6>j#B%x_H>lS5GVPc<31mRhyDSzO?bQ< z&V;Xere>i--yUb~1KLRMH%6PUKK*XLsA?WIL`*y`P0hhte8Wu_5nxh*q}n7E@n0yN z?yUI;N$td;`P->rbRkE#hM|q8rq7jrI~9B%!*8d8(S@YSxI6Psx+ea6o(gVreV{`@ zPXiN#De{0};r?j=le@S;TyW=r0@?YxyZ_kv=KyFVQ~(Nk{PI;@IuD>oi_VGmn|Si} zpN@(rCr+o|xbJT=`7fn6KdYpCl<1$er;{@I2WGzG7FDS{^bN?nQu%lY} zg!86o;<5qxPcY_d$spSi&UYm|m4G=Me$yq19r;M;cIR05&1|7jHzwj{ZjSxMOpDLT zxIPk6+qGGE*0Dn-T@w%Vt8lu+#*P3`8i8;Kj&@BYG0AyWv2(w?`5TAxqT@aivfJTs z=1}_0j=GU7N$0-TXvY7J8nZ}JsfnajE6XWWRqgJijNM<0fs@RXYdmg5$y3W2kY?)G zk!XX*jo%LlIip~9c{vDX2k!lin|yrS#K3c%5zuC7qXs;Px>w}Y08)lm_BYzF5i!px zN_`|J4MLkT5tUj#w)nl6yj36=L3f}yVIKQ&az`1zbp#E*>>*r3BN9m3FoD^b@dJga z`8(WxG9IKRQK=7rxi0~cZ>092JCqKD*H65nAH>f2oTPblZk@qkuc8e1A7*jqq~4!* zFm)3c0rjJwpQBs%(ERv^=x?r~-&{pc%wjpZNB@gz;wa<7$v?JJs;!7GruchNfpG;6 zhj$tr#J#fndN0g>}NB)f`52rRL+BTs$b`3ODC1}*=9Zvtb&Zwg^`x_4)BM*NI z;?lH17Xtf>$w~iZdGN=`f~%aG>=YzRs0x)OJptMS&pYY?8@xaAQsJ*+vmHXm&dePG z%O~k1JRe|V087Y37+w_-`=C61hT-}-x5m*~ckKB$$IWk!8?op2(~0Dw}Mqe{UX?t(b>Wj}V~eus;%3I1kIeL#5JQJL>q&)XBErN@T4V-{m%{2;-{ z@HNGP&^w}R<|vey21SVqgYof`q*jAlLG^1uEE+`o8mO1UjDI4_|K>efx{To+o78_t zC3>N?hW}h?%~q4c21?RUm$`74b6a{DUlBEMYD)E`6hegA1&AE>nne;hfH?Nx$}R&) znXR<|v=E3Q^&RDrE-%r6{RoExeL4%Gz!F_v8h9cT60!FIcStCB9{@k=t1Cc5q~BD# zrTA^zCBa|#_xrAwefy)QL1DC% zu-51PXmJ!Ze@a3O3_u#VyJ=Sz)KKri?=BHo_+5C%BYS>%U!UyRz@TM$oTM>cI^5W8 zSeSh4Ff_28B=KEbfPv=~k9#ase)n_L0OU?0FThUn`6VB}u^D0-Y+=fi^ic?ObesVX zQ=~<0U`>^_4*>**S`&}l{MF62+uS+mV(JV~KZO!|Wk#(RF*R#tpUG`*D}eJhNBUI! zLn$!epb#nX2>TsU_9fX9Z|K#Ipd=-zzt&1EzzOp7ch&o=bu|#w9+B_*j19SiaNR?9Cf-+2rg_;yn-a&mV z^Hj>KrL0;PLcAmDqh;vR$@O>@2=)%#u?aiL&__AUvWT*@#2R}j^Ltu2iS}5LAP-b% zNS$3N%FVEtEQ=4JWNr52h#dG_TR929fdoT`atk3yon}KlzT@+Ea!9dJ%9|vB z3j12}kjgJ5HorG0SrmB)mbcL5-4an2$|_2!02}8`O=*QPlG1p?Wof`{y(4vGqqX2* z(s?blo*T-%P{y1%nDrYYOiEE60T8`={pEe{+07=^afhDdFwgQyA-$22830iqN>f)- zdJsTW?ZGitd9@h8&@gCg>f4r7ji4@rU+2%79ClDiX;JpOH|8BtqX;Lh$mnzw$|i?d zzPK2t@#5ms`&^*v`NzTw^0}2C_=iJ)v6cy~0!hy;MY#7Uo5}>%iFKEtAG2k`Xku!>E`V+UoMxM`|Vv52J&aAtZ3nVJoZQ^ z54TrK-QbJK=OZ0Ow##LO;7@fU?caSl@?30tYdgQc;oBKcB3)lyts6Vi;oFfX-SjA2 zy`3C8U|kn8UB~7q*SV~_SF4+$Ox2MN3x7(N0^!?!7d^mkztb>`^)I=X};c6nFLgE7=Se7vuLo zbytw_sV8E?$s+1r0pgfYUjY=rz?@iNXwn&X20}GmTO;gLaWQ>$`q^Z>n}h zDLJ7r71@J~%7$?8oqIm_8;b_kxZG@0J;kJMygm26-cVQX>+8EHH0K+|=T%e$-}&nP zS}WuAh~a(SfvN+deLx7^-aFl~8ui;SpeoCk_p2+ZfR<3Ag5oqwD)$IygsCT8UxP;p ztQvJ^3PGHn-g2O&d}(f@g`6@URZ;eY9v1J0U9Q&$SE?toM%K)pw- z0+wkM2pDvUbXF*re3tKD~?9lO6TY_>ZUZCgv zP-RZAXkn;^fyntHs?rVrezDQAQhK-4@R6w=#FCx5bkqft>d#RV^(DxqXel4I`&i~_ zu<iQ*s^Ga(Er?~(Hs;jPTb)7b#`#OZr140hk z+FA4cgx*uz`|WzW5@AG$jw(o9NTsPhjVLz^0_+)7|M(#!TLaeL=IGCYLEpBpxo%2n zJGG~Vz5Wxn98;m;;S)cHEyO3#MsbCl5`~mI;aK$E`~wVOFb1;TMINK6Cq+aZl?Rk_vp~czKu|X+c@n{mtD<&eo>qZ0nn@rYb~J zC7i8pBDt0Fe0_C)b+^<Z17(3oq`qz~2lNxMB z(?8sJlyOGm*drf4tIL|ryVJNT=yR&sof_4o(ifY}dSh#oAb>|zT4QRXtB+n>P{VVB7J7>;ELF0;=c@=LPH}1}7|CInrhQ6un0FGo zIQ@+T+F#vo z1)Ua!gA=B2^S-CZpw!FOE5F8&bYd7%QAPoEA(H?dGfM@=Td$lRlJ2Ik5d8t9;9H8p zQpfm?3LP|>qO)Y|#;~lal3c_+npYL&ERKuMRY-i>s5ztu{oq>&axzE^qI)~t+oqO#9)Z0So*oSRgF zyhKr=_97x`hm3|1vx!(oy)x_EJXY#qCwK5DwX&+T%c*U{ff3}MoH6tzJ&G`v*A%Uy z^oo?jtfRzJ$K0(M!(xIGbR4nuf)HO&LYpe`73Jro?4-8`^*u5(x7=H{tWJVgOSVd% zihiThK6@lz!jw4pc?M~mV(%o{QtP*hV>#N*HSeK4CCI0xwbkGaqF662BK+hOs_Q#S zR8cMyLJ?DeUOm*NlBX$a{*y?6S_J+lVPX=A#1CRO5DN{^!W6WQANR;zu5WkCIsLDtDtx+rcLR;$8xTX;pzxYQ z2HJNo?}cz}H%PeR3Y~;^rv2UESjP`;LFVM+Id*naZT6 zMdq-hR5q2($|e72n5{n6lo6As~A)zD($4!{ffp^_?CJ!c3FOmnMr0!Tps0dye#M9Q3 zx79{&YI0npZHJ|E7HQg20x= zA(b7Qk^-Zcf$X)({nDYiKS~;eA?!a1MH@5O-u9Y*eLxv zpf98a>g<>q1I8^XBQ`jH;Et3fwc3w=*Pc<81{~_pM*U&)-tAQ>3#faLIbpNv1hZRZ zhE*c-tytz>{oRDxo81}oSwoT0il7=OE+17bgx9C!f@EPaYfQth#PtoOvR(g zb{3WJdi_>St}>Mb{7@nHH6U`aFZS}gHk;jm%oJmCD!5RV!h#q64qL)*?HY%EAr>w+{15Q6p(DcV_i>=B}SuHFjGA$Q>(!Qqe-=92c1&6G^WoA-@Y zjqzdVmYP}yG%38kiZOkY;{zDQs7BgV(s|M+6M0vjz;X}iCUpY&!|?aNhH)0?>}WS} z+teZDE;)Kz)U{ENopm$Fq#`%sn}gW13cV?hN_osltZ(+c;pEw}sRIhsXUM2oU5JZn zN&ys$h5wlIk;v~X%A1~|V5pR{J6T?5uPVY0mYYykG=wg9@67F1Vd&H~jY?b!`TZdP0TaP7~J*2DLCtu#iecyjCns-ZZPIB9c_b z_7!;t@hhZ)CNIi7!o*J=fQcC64gX8lYnosHx(nI;LL;SF5*ueJ=_b5_6fz%z~%h%P-Ju~}W;~p+A z|7^ehk+>Pp_}61#6gs%P{E2_RZe2dfBy7eM9U5riku%riQ9&$yk9{oauu~m*k5wEE z)}UePWSF;MgfJYM5-l=DVH0&%rWK(!d7GDbV%Qem^%+f$%|vQavqVWd1=vaZs1aAHhLH0y6&A% zk2KVgO1MBT`hL)nRm4Ek0GFvQ*e(MzZw+&l;FT?kpTs-)S|r*P6^E0y3TndddT4KY z%YoG&S|qTfA^E{ZhBP2o2ZaIJTCYo{6>~#sSL;K9x8}v46l!%z8KTx4C1s zt~z)#X+E>@%@!)he$%3s`)id`eolXj-oX(xG6Sz2hCp&}V2yoxkOMZu!v-Qc(F zl=b@kUAIkNUagug3bp3e@|Nn)1UA^09j;DV zr|5Z$Z3ww%`&uwP%=hJ+?!9ntF}5*Oc2I&1GUh8%;TBa+LQ$Ax?6@(MO_vmlm-!ptyaAEp2=@F>!#as@_2nR z@z)%(D7720Xn;P72!|1>iprW0XtlTa9UpI`c_%xcoHJstao|MgR-x2W<@fU&x#>i~ zlPa5KLdLx6mdR8uJ30zAU5hS3MKVr87B{b3B6~b7pA+F|6B&EkSm1*)C-6MP`rZ=@ zUQJiwWE+Nt}tHYc^f04>RhHR1@FtSO3>*&+qN7;uK(R< zGo!fiII&|%nqUpeBD6v=M|uR|#bC!nSlYL6F&C@$8h}Y+xY-+^xIx!b-Nk!6wLT89 zURY%&M;oA`JS-VYY9{e^JNN7#NkovRMyhs{=iN%twdKGPg(_Nn!IW9VW81^T3vfhwf(_QSN7*GMO!uLxRpI%9jyp5RHbQSvz^Pbqo=6s60juat`f8 zGDa=Qn1{lADytnZ$q!~eVY4O}erDd|fR!LMH7#CTe7XL4knVOK@+|Wp_7QnU0toSX zEmfO$MpwujU@#fyLb!9Bgc(dZ<=iXb(4#bGgpTjzBnZHyZE*yXD5Z3U9vgS0?zIu7 zP}#D><;i>`=3$(}qjKIxr21f+Oe!*cFnvtNXr2f)P~~>h^{b!h4@(#p_M+}f5?3@e z&bz*+!w7jESHLjdhEUvA%osJoH~rG3cf+0rVpRxkaemnmq(pOqhnQ8^EaCqnlk(;$ zHTo{J*4>B|kbyTyRjB7V_KlWc7BL*k6cXxf@7dG0ZARbFatkQ5?P~P)yloQx=b9Pr z+0#r(bS^46HctY{eirlRm9foX8mWmILKz8huD)38xo_TFy8J(Dbw84uMToN$%OvEs z?}S+7%KQn58<6oa3w;$3M2edmv5F#?I|P;sjgV{-CQGvD#;M`KEM}i!!|a+Q!+R_b zPHvg>>a`>G%3+FWC+4t*<034hgC*)$ncQ-$onek?rz|CSw!@Bt%Rbi-U1?{yWq&)_ z?OM>#sulJioKz}`fUJgrH^Y=g_Bo-~1TXL0bf7KiZ>KF>&0T;es1~a~VwSPj`Zw)u zE2c-@iJU9kND|^#bCgIp3BT`sAh|X13Y_>+8e(xuLj2q@EKn}kjCtWrNbQc-4(Ejt zy{~VtSx#yxvpOQw%3mwc2!pPc>zkvvSCs zxJ4_05OxQE^nxSO>N+8uLGlG}*DDfxG@^hB%gNj7gD#1iG?Iy%+%j!Rl`GMj!dz4} zkv!xCu<#nI8=^CvO9R=b%@gW3cf?9!+Y_&pyX-4*zzq;LSmE-Nb}ui#ci*LPYinyd z$&myT;440uhs7hluXgL@<+p?{7=QbCC&HmT@X{-{ZM8R}4G!`N9b9QJ$tINmp|)anM4ixjcsC#SU!!+y*^yT1NGJ}0fs&?i?NCJ9%^zuyE2X(Gfz zlioVIiIUxi^X{s;HL+d@LP<POdesr%q5t3!riyU=UIoJ?Uc&^b<9tRQh)BSqMgYq)ET+3()X6u_{I6{eil-lwP}zz7N-pf&oN`Q8S7Bkq1YjVsPZ>I*1^m%@kmP+{ zq*$fIH8;O)r@g5OEy^kan26b6x)O3Nc3;=toihmW2i>y_O;wnPDR zZTV9E{E_5@sAOkia*;@@oBL}N|C<{TgsmM~wk+V5b%Rz#R383O<+n$k*y%908GVTz zrUWDAU6;oM38ANtIsD2Nr_YSB6>iF@#G*y*(}*2r&K5ns#h z=hqc^*(&96a)X{Qw=q-8bOtC)2!sW0u7Yevn&S5(t%$2p8(m7P>TN60ZrGd}^^yi7 z54BTRzF&1$EiofviX>R2=px9tCK^8W$jI5>B2A5r@~(g^k}_n=6ZbGso4YNsF1DV^ zqG{SR1VvMdARWol-I%KTMP3xO9)!X)APE9zBhr%1RW~>r?tW*)4MX8Bn0a53Tgv0$ zT4Rl3r7I8^;*iI^>u$bgjihpu7a2%HD8#sL$;KqyttB{Z_G)efsZKLbglwTIz^z_K zRiUV^R*Bf{PQg-aydfse0*DICPXw}6{b+;OeW=9SPf%rt6M;!0mVnRzj8!Q`TPw^h z!`0n)EMDNt{0di97|B}5RH;QAB@qLJpnX9S#LP+tn16$7XS4^FU%EVA;)2D|vDb#@m6vKf9DWZ$1uzF0!$-CtIFL>9Do%BQ_Cxev|vd3A1q9_QB zE5yd=#9Ld0V@%!guw+8R{u|slXt!8j1eRbqxNBt6B(4Ov3GNaSzw(hz542J!<2J#U z6{{ahkT;3bJ&`N}jeE}$X?NGWwo*ZEB|7?zJA4cTHpDeqVAxvsKI>!~|Md$F+E}zb3|aMwkn})sz!#b(Vc zO2f$}GcXhIH!vMBK4~Fa%QpNbcV#mIRWkycnNJcJLkX6gKV-x-W1F-KK#pH6iP_kO zLFbf62QyZ+U&=l6W|05Jt)loT`VZ(9{rd|k7j7U_1V;s`K=>fsI`3!HDo zc03`$XcccjXii7cuXrM1#QO(QDiE!Gu*1}hJ{OTe$co5$GF+8cNG#$6fwy~b9=wdL zF$0SL5D{~6`2fX3Ob5*8`p%k9G%TqR^D$PimpDxx+ehEWIR<$w0YwPVf$8ISs-N!- zeX_dy-fJef=Mis83?@FZtcoeB)>k4+$(yQ1ad}BT*yZJqUGw>UF~9-ZOE%l_R;_blY`VzmPF}hg4`gz znC*@te0fQLoycgHmw#E`{BJ&dexD_e-uA$)5X6OdA*#Zvt}FpseymPp=zRV2=f7*; z-+W>Qp`nkLmoFp&@{@nDKRVdfmw0sNKjPx}=Vxa2oNocBCb*yr)TbCVY*-ARn5QnK zM{F83FmRMM4F)GPb<@v-p`0H}4Opkb9!SWRw=D3tneOfS>;nh>kg(8?n7*Fy0M23p z<6v*dp=SImfe3x3h)hhP#<~kmH;y%;-q!|) zB6&=A1bB8J{g6zD8pYe0v(q~%?1mML zMy6qkt&`V!ojPL z(-{aLq{jj&(u}iE;yq0R>Y&vqZkv*f;C@FEfdnIhYL5LWAuF0%ALQ(qmSw{TwZ|M& z>E0w`E?!(Hp#CIGo1lK_$nF%Ng0i%%;~)$P{}lV2=v$9&{C?7S3?_R?C<~EJh<82b zo!_{@8X0oGNyp)3iQg6{1&TQqw5DY|Husy$qgT`!70fkW^z!lxQ&x4nhe;oO+~Pd9 z$F_U7z1?F9Kz*%oT9NZeQqXgB&k=rZ_rwGeEnHx(C5(kQst0#}zS?J)>(R-`%OcOQ z+!7l_KEC)(9`=Fe~RQ2+NR%WKM&i6XeKhj~jy!f}{!Vhp0JYD#{}2 z$$yO~yBiDS!Q+N;U@C}F*gF*y7#<{j(#QflC#XnBk!}QXura%rT4(OazIYmCOosxl z4k8jToMl7xcDD7f56>FPFx-bN$z%*b6SU-4g0k18z;F#4_1x*uF&tQrL!>zw0D5pB z@QFDJUJd-nqbI>`jh7m$a*$C>`UbQS$TMD^4EKl;JgV;lFMk#>;)Mp@fpqJp1W!bg zS{_LOl>F^ zLtuL&p>Q%FspuZ)2~snj$J*_Y5MgIfk61Q$jl)y zhy#!KNgxX)vM(VaU*NUe#m_%L|Jm0!5~xOkwTwW*hejLl+qgGn^g3N)0Oi=K- zkZUZ|fDsY=`Fu>%6`3ov4%$kF(;|eB2LS=pa#mvk**yeTi_|=0by6HcE2~d#Gc4xf z;w$C;a!E7^re0;DPw&(EQ^2(DQv(~W0p22mB6S5=K5+l#K<>71U4k_xQ0K}(bk>w& zh9)74GBk5YDE}Glw{Be4MlLg}!?LyyqQ&gywtpt(YZYT;{?ceNJa7Iy^__rylmTW8 z^_{5wANc&|>UNkg%=0_29xxH6%gpit#QgmaK}v2uA*l{L*c4A@&urEJ=pUF%Z=^#N zA~iI)k(&A2>qU4%Nv31-8sU%gso$GdoBKe(ut7AEONT&I9D<4^X~U*3E)1L2iSqMF z?OnD5>|)Y1mNDJAW-%s&dmm8@KzD+%kI^vpG47uIjD^fC3tNM%SvQ7Z2gquX0}Lu* ziqR8{m3gfLJ6}3Hq)YSuE)Fv+rIZORyF*A@_6`Mzl|<>?Ifbd%>M#TVTwIU}a=pG` zW8S>A+mS%5o{$8^d!VcrV$Y-vZ)eefj7l0{3*Efk>H7d@Rc0Zv3}feC@Xhv)$kXAU zg&QIcYwpsa-ld7Ldud|Yf0|C79QK~}Z%xYZC7A?_ijv+p&H);wAS+6BAMjTil%z>p z-W&|JX`PI*q4UOKf}dCq7t8~d3~@YmM#z(q+M5xs5W*$;{p(>GB4*b$1W^nPO~-;@ zx0fbV0+CP$!{&#$KH>IK#Zh*LIk!4;o|qNZ2e86OWWz~|W_E_=E-!^O56uaOw#`k) z1?tA`xa{`CP%*$#D)}DegzT$Oys`<|gg|qN;cRz+c3%yiOFd{0Fgts%{j>K-$WPCx z&W6igBfEWGYRJxQi(xe<#De5d1gH+v+T4C93%3(1+EEPMf$6%qQ;(CfZaqsmFPBl<@tJ&XsEY% z^5_dUR)ri+m>BNXT60^>wP);YEdBr|$D9GoLyEPIfZ(x)f~BEH&Z4e#7=0%if-O&# zk&ws<$14UIVMt{~1`nXL$Wz3?>7^OHc%d0m-$$!lnQ*0%PW&*EYOCeBdeWBEQWzEy z7y&FA8WP2W*jkf2K37k`zkcF51mwIt)}ka2fq#$?nNk$w(C)S=pAqm6RRvso-+uS$-;lt5`1JelsPQw}(9Lo089GP9 zX4nF_Ac%McXmr?*tSjjlH+h_&=?P=ZspnCN`?wVG1LIQJ!Es)oBq|EQ+Bhh3Cyn z&s;zreGj%kOQfWE4X;q)FwuWKcV;-<3LSlR6-3|Js zzPn5(ALP$V0W|j89d3|3HI<42bpvWGN{+gM1PE%55c!Cn0))mB8{hGWN;EM3p^QCO z2Cf{!$3zhNs_6=tvzmG&`%5%!}Pz`_(M+#O@rzF!P=cmm5 zoOSj9ZO2JofILmv?Ba=wtL-yvoVt|$0o#?-Y|wO#5BAaX;@52fkQ!YQUjaGiU>DiY~mo-(yu!dZW{g0)~Dy(TFXAYIv*9z-J7?HGB}bT=FC>9{y>pjQCZUrv@+YO7mT1s(92tjF3NhHdkke! z3O0E_=?Cz@5{rqL?l#LYWGp@h=xTOK2LvWja)Z%=aX@^ZnFFs`IXAp0)H5d`r}zj} zVM$S>xCs~mvu39(x!X(*_<<+?q;++~3@{HO08~C_-3U4(53X%Z-kd)n5A9-q9S58z z)Zt#S>{>|Ao1h1FGZbJ*K+o#HJ|ot>On_2&>J$xCd^$|A)M>_d?qej2hpYPcdgLERq(wSxatp? z7E#xeW=Jt%Oc5YZn9-WpB(-~pz$dO!X9qvCT}m6pX+XjXj=GRIjmNe-GA>sL!UO{m zR0oa?@zZF5)EtL4jH|cdvQGHJUt#FVE~l~3P(q3HC+g0ic%pW~T}($@_4?8MC>$Oz zcyZJpJv(;H8{{yiWVe7#B+&vEz$x{@!={XJDs>;B7>SEPxy2ff!2@(;e+dTu!3Syn zrAYIDNcgKe+;c#nN0I5UPN3x%EyWk?_B=A~lkLx?;;4tSprC^(9)gVaY<>8#iR67! zq)mv;KW&WNT42IUXMD`G(B&; zMjv@O;BcJTE&=3-i9tQjUI|_ti$Gy)Cw4t)n&ymA%!^XQM9Rld$;Z;pGj!r} z#twUX4$?M8m5akp=wSHS~VqOeL70!|q6dPJnP=4A0QPj6MVW zTR5kwB|r&gN+&!+A9MQ5ThbTF+(U0CjLTMkwY*}OgmDSZnJLqWPoKb~qOgWi$dsHq zTg>=yCp!wlk#zDNx;Rw<5ByO|Fn)|wxXZ}Rl39> z3p!~6f-;!F>|Se(IMi%%0~SRT6n`Q_gPPo9yqY(FA>K;vy}0-b{{mHY*1ay0hoDJD z>PBpJmcw1R$G)WordX+Y_Uvc={YQBM7!XWOOb5jf0meuTv7=4@*PyC-2czfdHlZ=gr3LkV+;vnm+Pf;-(S7KG2c~JfUasSLyAb^Aq}Y4*dW47n##^SN7nA)0e8l2_oR2A zF5~bHo7Jn=LZ{?1;dBY8?E#<~C(Gm|^rnyOEsAzcS*^`02?7bQT)}aq`a^{ph<4^K zKI@=|7*daO3?Y`noLu-`mJq(DgA*WEt+}>r1juQIV)$Xkr_?bN<$xjJR3}bi7l+et=kWPB+2!NUDPgc7 zLX%d*15T=6zL6?YQ4$vwQHhAJ4M1TC_0wBE4B2|qK5Q$EToy>%_il4ZXsjL08)8%) zZW8e1Zv{IEd6CfB8G;D>{0T&PU_(uR9?x3^g$=VWHd<}_2PY(%pjm-yk|`!iucihS zp(;U!<=O@V%2o3YF6>jw{tVmWDP01YR{@}mv5caKk$BfN{&4JaC#GKX526^JZvdoQ ziSw@jw=N`UmUx8O0Hm1AUSwJO;zL~LVMLl|nJWN@$U+9uE^olvY!5HbzNp-jBgi)t zFXC0g5_{*5-IPpU?d1wEPSotvJcV-1LcH)#I8sUnJ@2PCpO2vDixFkqT@Z+eD~bMIwT z;1>`^usb@^*>O4npU|Y}HnY2)qif?Xo4zzN46xvbg~y46F-E)H=Ff2q&Zr;UP6Cy%=76ON zBCPQx`z?zF6Z7SmqBrvpOsNp∈UfG@Zhxd?e*Y{wCLSbzw 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 z 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%0ApQdr&v~Qi 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Ì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�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 c+$^8)6r<{~W%E5*HIoJ9eFZCDu@~ diff --git a/crates/bevy_mod_scripting_bindings/src/docgen/info.rs b/crates/bevy_mod_scripting_bindings/src/docgen/info.rs index e42b8891c7..48b7e087ed 100644 --- a/crates/bevy_mod_scripting_bindings/src/docgen/info.rs +++ b/crates/bevy_mod_scripting_bindings/src/docgen/info.rs @@ -2,6 +2,7 @@ use crate::function::arg_meta::ArgMeta; use crate::function::namespace::Namespace; +use bevy_ecs::world::World; use bevy_mod_scripting_derive::DebugWithTypeInfo; use bevy_mod_scripting_display::{DisplayWithTypeInfo, WithTypeInfo}; use bevy_mod_scripting_world::WorldGuard; @@ -44,6 +45,17 @@ impl Default for FunctionInfo { #[profiling::all_functions] impl FunctionInfo { + /// returns true if the function is defined with a first non-contextual argument matching its namespace + pub fn is_method(&self) -> bool { + self.arg_info + .iter() + .find(|a| a.is_passed) + .is_some_and(|a| match self.namespace { + Namespace::Global => false, + Namespace::OnType(type_id) => type_id == a.through_type_id(), + }) + } + /// Create a new function info with default values. pub fn new() -> Self { Self { @@ -128,6 +140,8 @@ pub struct FunctionArgInfo { /// The type information of the argument. #[reflect(ignore)] pub type_info: Option, + /// True if this is a passed argument and false if it's purely injected and not interacted with from scripts + pub is_passed: bool, } impl DisplayWithTypeInfo for FunctionArgInfo { @@ -148,12 +162,6 @@ impl DisplayWithTypeInfo for FunctionArgInfo { #[profiling::all_functions] impl FunctionArgInfo { - /// Create a new function argument info with a name. - pub fn with_name(mut self, name: Cow<'static, str>) -> Self { - self.name = Some(name); - self - } - /// Create a new function argument info for a specific type. pub fn for_type( name: Option>>, @@ -164,6 +172,15 @@ impl FunctionArgInfo { arg_index, type_id: TypeId::of::(), type_info: Some(T::through_type_info()), + is_passed: T::is_passed(), + } + } + + /// Returns the type id of the first typed argument (i.e. for `R` it would be the type id of `T`, ignoring any context arguments) + pub fn through_type_id(&self) -> TypeId { + match &self.type_info { + Some(ThroughTypeInfo::UntypedWrapper { through_type, .. }) => through_type.type_id(), + _ => self.type_id, } } } diff --git a/crates/bevy_mod_scripting_bindings/src/docgen/typed_through.rs b/crates/bevy_mod_scripting_bindings/src/docgen/typed_through.rs index adc6dbb7db..4a3b77cb01 100644 --- a/crates/bevy_mod_scripting_bindings/src/docgen/typed_through.rs +++ b/crates/bevy_mod_scripting_bindings/src/docgen/typed_through.rs @@ -206,6 +206,10 @@ pub fn as_reflect_primitive(type_info: &'static TypeInfo) -> Option ThroughTypeInfo; + /// Returns true if this argument is a "proper" passed argument, and false if it's purely injected + fn is_passed() -> bool { + true + } } impl TypedThrough for Union { @@ -313,7 +317,6 @@ macro_rules! impl_through_typed { } impl_through_typed!( - FunctionCallContext => FunctionCallContext, ReflectReference => ReflectReference, DynamicScriptFunctionMut => DynamicFunctionMut, DynamicScriptFunction => DynamicFunction, @@ -340,6 +343,16 @@ impl_through_typed!( &'static str => Str ); +impl TypedThrough for FunctionCallContext { + fn through_type_info() -> ThroughTypeInfo { + ThroughTypeInfo::Primitive(ReflectionPrimitiveKind::FunctionCallContext) + } + + fn is_passed() -> bool { + false + } +} + macro_rules! impl_through_typed_tuple { ($($ty:ident),*) => { impl<$($ty: TypedThrough),*> TypedThrough for ($($ty,)*) { diff --git a/crates/languages/bevy_mod_scripting_wasmtime/Cargo.toml b/crates/languages/bevy_mod_scripting_wasmtime/Cargo.toml index 71082403cc..0b51ff6eeb 100644 --- a/crates/languages/bevy_mod_scripting_wasmtime/Cargo.toml +++ b/crates/languages/bevy_mod_scripting_wasmtime/Cargo.toml @@ -16,6 +16,7 @@ bevy_mod_scripting_bindings = { path = "../../bevy_mod_scripting_bindings" } bevy_mod_scripting_asset = { path = "../../bevy_mod_scripting_asset" } bevy_mod_scripting_script = { path = "../../bevy_mod_scripting_script" } bevy_app = { workspace = true } +bevy_reflect = { workspace = true } bevy_ecs = { workspace = true } bevy_log = { workspace = true } parking_lot = { workspace = true } @@ -25,6 +26,7 @@ slotmap = "1" serde = { version = "1.0", features = ["derive"] } anyhow = { workspace = true } bevy_platform = {workspace = true} +heck = "0.5" [lints] workspace = true diff --git a/crates/languages/bevy_mod_scripting_wasmtime/src/context.rs b/crates/languages/bevy_mod_scripting_wasmtime/src/context.rs index 66e7747a81..8d130f2fe2 100644 --- a/crates/languages/bevy_mod_scripting_wasmtime/src/context.rs +++ b/crates/languages/bevy_mod_scripting_wasmtime/src/context.rs @@ -1,8 +1,8 @@ use bevy_ecs::{reflect::AppTypeRegistry, world::WorldId}; use bevy_mod_scripting_asset::Language; use bevy_mod_scripting_bindings::{ - DynamicScriptFunction, FunctionCallContext, InteropError, Namespace, ReflectReference, - ScriptValue, ThreadWorldContainer, WorldExtensions, + DynamicScriptFunction, FunctionCallContext, InteropError, IntoNamespace, Namespace, + ReflectReference, ScriptValue, ThreadWorldContainer, WorldExtensions, }; use bevy_mod_scripting_core::config::GetPluginThreadConfig; use bevy_mod_scripting_script::ScriptAttachment; @@ -10,7 +10,7 @@ use bevy_platform::collections::HashMap; use wasmtime::{Engine, Store, component::*}; use wasmtime_wasi::{WasiCtx, WasiCtxBuilder, WasiCtxView, WasiView}; -use crate::{WasmtimeScriptingPlugin, script_value_to_val, val_to_script_value}; +use crate::{WasmtimeScriptingPlugin, build_linker, script_value_to_val, val_to_script_value}; /// Per-script execution context. pub struct WasmtimeContext { @@ -22,8 +22,6 @@ pub struct WasmtimeContext { /// Host-side data stored in each wasmtime Store. pub struct WasmtimeStoreData { - resources: HashMap, - next_id: u32, wasi_ctx: WasiCtx, resource_table: ResourceTable, } @@ -40,22 +38,17 @@ impl WasiView for WasmtimeStoreData { impl WasmtimeStoreData { pub fn new() -> Self { Self { - resources: HashMap::new(), - next_id: 1, wasi_ctx: WasiCtxBuilder::new().inherit_stdio().build(), resource_table: ResourceTable::new(), } } - pub fn push_ref(&mut self, r: ReflectReference) -> u32 { - let id = self.next_id; - self.next_id = self.next_id.wrapping_add(1); - self.resources.insert(id, r); - id + pub fn push_ref(&mut self, r: ReflectReference) -> Resource { + self.resource_table.push(r).unwrap() } - pub fn get_ref(&self, id: u32) -> Option<&ReflectReference> { - self.resources.get(&id) + pub fn get_ref(&self, id: &Resource) -> Option<&ReflectReference> { + self.resource_table.get(id).ok() } } @@ -82,9 +75,10 @@ pub fn wasmtime_context_load( let linker_guard = runtime.linker.lock(); let linker = linker_guard.as_ref().unwrap(); - let instance = linker - .instantiate(&mut store, &component) - .map_err(|e| to_interop_error(e))?; + let instance = linker.instantiate(&mut store, &component).map_err(|e| { + println!("{e:#?}"); + to_interop_error(e) + })?; let mut context = WasmtimeContext { store, @@ -133,117 +127,6 @@ pub fn wasmtime_context_reload( Ok(()) } -/// Convert a type name to a WIT-compatible kebab-case interface name. -fn to_wit_ident(name: &str) -> String { - let mut result = String::new(); - let mut prev_upper = false; - for (i, c) in name.chars().enumerate() { - if c == '_' || c == ':' || c == ' ' { - if !result.is_empty() && !result.ends_with('-') { - result.push('-'); - } - prev_upper = false; - } else if c.is_uppercase() { - if i > 0 && !prev_upper && !result.is_empty() && !result.ends_with('-') { - result.push('-'); - } - result.push(c.to_lowercase().next().unwrap()); - prev_upper = true; - } else { - result.push(c); - prev_upper = false; - } - } - result.trim_end_matches('-').to_string() -} - -/// Get the WIT interface name for a given namespace. -fn namespace_to_interface(namespace: Namespace) -> String { - match namespace { - Namespace::Global => "bms:scripting/globals".to_string(), - Namespace::OnType(type_id) => { - let type_name = ThreadWorldContainer - .try_get_context() - .ok() - .and_then(|ctx| { - ctx.world - .with_resource(|r: &AppTypeRegistry| { - let registry = r.read(); - registry - .get_type_info(type_id) - .and_then(|info| info.type_path_table().ident()) - .map(|s| s.to_string()) - }) - .ok() - }) - .flatten() - .unwrap_or_else(|| format!("type-{type_id:?}")); - format!("bms:scripting/{}", to_wit_ident(&type_name)) - } - } -} - -/// Build and populate the wasmtime component linker from the BMS function registry. -fn build_linker(engine: &Engine) -> Result, InteropError> { - let mut linker = Linker::new(engine); - - let world = ThreadWorldContainer.try_get_context()?.world; - let registry = world.script_function_registry(); - let registry = registry.read(); - - // Group functions by interface name - let mut by_interface: HashMap> = HashMap::new(); - for (key, func) in registry.iter_all() { - let interface_name = namespace_to_interface(key.namespace); - by_interface - .entry(interface_name) - .or_default() - .push((key.name.to_string(), func.clone())); - } - - // Register each interface - for (interface_name, functions) in by_interface { - let mut instance_linker = linker - .instance(&interface_name) - .map_err(|e| to_interop_error(e))?; - - for (func_name, func) in functions { - let func_clone = func.clone(); - instance_linker - .func_new( - &func_name, - move |mut store: wasmtime::StoreContextMut, - _, - args: &[Val], - results: &mut [Val]| - -> wasmtime::error::Result<()> { - let script_args: Vec = args - .iter() - .map(|v| val_to_script_value(v, store.data_mut())) - .collect(); - - let ctx = FunctionCallContext::new(Language::Unknown); - - let result = func_clone - .call(script_args, ctx) - .map_err(|e| wasmtime::error::format_err!("{e:?}"))?; - - if !results.is_empty() { - results[0] = script_value_to_val(result, store.data_mut()); - } - - Ok(()) - }, - ) - .map_err(|e| to_interop_error(e))?; - } - } - - wasmtime_wasi::p2::add_to_linker_sync(&mut linker).map_err(to_interop_error)?; - - Ok(linker) -} - pub fn to_interop_error(error: wasmtime::Error) -> InteropError { InteropError::external_boxed(error.into_boxed_dyn_error()) } diff --git a/crates/languages/bevy_mod_scripting_wasmtime/src/handler.rs b/crates/languages/bevy_mod_scripting_wasmtime/src/handler.rs index b7b927d564..a4564663f2 100644 --- a/crates/languages/bevy_mod_scripting_wasmtime/src/handler.rs +++ b/crates/languages/bevy_mod_scripting_wasmtime/src/handler.rs @@ -1,14 +1,14 @@ use bevy_ecs::world::WorldId; use bevy_log::info; -use bevy_mod_scripting_bindings::{InteropError, ScriptValue}; +use bevy_mod_scripting_bindings::{InteropError, ReflectReference, ScriptValue}; use bevy_mod_scripting_core::{config::GetPluginThreadConfig, event::CallbackLabel}; use bevy_mod_scripting_script::ScriptAttachment; -use wasmtime::component::*; +use wasmtime::{AsContext, AsContextMut, StoreContext, StoreContextMut, component::*}; use crate::{WasmtimeContext, WasmtimeScriptingPlugin, WasmtimeStoreData, to_interop_error}; /// Convert a `ScriptValue` to a wasmtime component `Val`. -pub fn script_value_to_val(sv: ScriptValue, data: &mut WasmtimeStoreData) -> Val { +pub fn script_value_to_val(sv: ScriptValue, data: &mut StoreContextMut) -> Val { match sv { ScriptValue::Unit => Val::Tuple(vec![]), ScriptValue::Bool(b) => Val::Bool(b), @@ -20,7 +20,11 @@ pub fn script_value_to_val(sv: ScriptValue, data: &mut WasmtimeStoreData) -> Val .map(|v| script_value_to_val(v, data)) .collect(), ), - ScriptValue::Reference(r) => Val::U32(data.push_ref(r)), + ScriptValue::Reference(r) => { + let res = data.data_mut().push_ref(r); + let as_any = res.try_into_resource_any(data).unwrap(); + Val::Resource(as_any) + } ScriptValue::Error(e) => { Val::Result(Err(Some(Box::new(Val::String(format!("{e:?}").into()))))) } @@ -35,17 +39,14 @@ pub fn script_value_to_val(sv: ScriptValue, data: &mut WasmtimeStoreData) -> Val } /// Convert a wasmtime component `Val` to a `ScriptValue`. -pub fn val_to_script_value(val: &Val, data: &mut WasmtimeStoreData) -> ScriptValue { +pub fn val_to_script_value( + val: &Val, + data: &mut StoreContextMut, +) -> ScriptValue { match val { Val::Bool(b) => ScriptValue::Bool(*b), Val::S64(i) => ScriptValue::Integer(*i), - Val::U32(i) => { - if let Some(r) = data.get_ref(*i).cloned() { - ScriptValue::Reference(r) - } else { - ScriptValue::Integer(*i as i64) - } - } + Val::U32(i) => ScriptValue::Integer(*i as i64), Val::Float64(f) => ScriptValue::Float(*f), Val::String(s) => ScriptValue::String(s.to_string().into()), Val::List(list) => { @@ -55,6 +56,16 @@ pub fn val_to_script_value(val: &Val, data: &mut WasmtimeStoreData) -> ScriptVal Val::Tuple(items) => { ScriptValue::List(items.iter().map(|v| val_to_script_value(v, data)).collect()) } + Val::Resource(res) => { + // reborrow required for some reason due to implt AsContext consuming reference + + if let Ok(res) = res.try_into_resource::(&mut *data) + && let Some(res) = data.data_mut().get_ref(&res) + { + return ScriptValue::Reference(res.clone()); + } + return ScriptValue::Unit; + } _ => ScriptValue::Unit, } } @@ -79,7 +90,7 @@ pub fn wasmtime_handler( &mut context.store, &callback_label.as_ref().replace("_", "-"), ); - println!("{func:?}"); + // .and_then(|(item, f)| context.instance.get_func(&mut context.store, f)); let func = match func { @@ -94,21 +105,23 @@ pub fn wasmtime_handler( } }; + let mut context_mut = context.store.as_context_mut(); + // Convert args to Val let input_vals: Vec = args .into_iter() - .map(|v| script_value_to_val(v, context.store.data_mut())) + .map(|v| script_value_to_val(v, &mut context_mut)) .collect(); // Call the function let mut output_vals = vec![]; // Placeholder for result - func.call(&mut context.store, &input_vals, &mut output_vals) + func.call(&mut context_mut, &input_vals, &mut output_vals) .map_err(|e| to_interop_error(e))?; // Convert result back to ScriptValue let result = output_vals .first() - .map(|v| val_to_script_value(v, context.store.data_mut())) + .map(|v| val_to_script_value(v, &mut context_mut)) .unwrap_or(ScriptValue::Unit); Ok(result) diff --git a/crates/languages/bevy_mod_scripting_wasmtime/src/lib.rs b/crates/languages/bevy_mod_scripting_wasmtime/src/lib.rs index ef851b4e31..881b157b04 100644 --- a/crates/languages/bevy_mod_scripting_wasmtime/src/lib.rs +++ b/crates/languages/bevy_mod_scripting_wasmtime/src/lib.rs @@ -15,9 +15,11 @@ mod context; mod handler; +mod linker; mod plugin; mod runtime; pub use context::*; pub use handler::*; +pub use linker::*; pub use plugin::*; pub use runtime::*; diff --git a/crates/languages/bevy_mod_scripting_wasmtime/src/linker.rs b/crates/languages/bevy_mod_scripting_wasmtime/src/linker.rs new file mode 100644 index 0000000000..5a5bef44ca --- /dev/null +++ b/crates/languages/bevy_mod_scripting_wasmtime/src/linker.rs @@ -0,0 +1,251 @@ +use std::{any::TypeId, borrow::Cow, default, marker::PhantomData}; + +use bevy_ecs::{reflect::AppTypeRegistry, world::World}; +use bevy_mod_scripting_asset::Language; +use bevy_mod_scripting_bindings::{ + DynamicScriptFunction, FunctionArgInfo, FunctionCallContext, FunctionInfo, FunctionKey, + InteropError, IntoNamespace, Namespace, Primitive, ReflectReference, ScriptValue, + ThreadWorldContainer, WorldExtensions, +}; +use bevy_platform::collections::{HashMap, HashSet}; +use bevy_reflect::{Reflect, TypeInfo, TypeRegistry, impl_reflect_opaque}; +use wasmtime::{ + Engine, + component::{Linker, Resource, ResourceType, Val, types::ComponentFunc}, +}; + +use crate::{WasmtimeStoreData, script_value_to_val, to_interop_error, val_to_script_value}; +use heck::ToKebabCase; + +const WIT_KEYWORDS: &[&str] = &[ + "use", + "type", + "resource", + "record", + "flags", + "variant", + "enum", + "func", + "static", + "interface", + "world", + "import", + "export", + "package", + "constructor", + "include", + "with", + "from", + "as", + "future", + "stream", + "list", + "option", + "result", + "tuple", + "borrow", + "own", + "u8", + "u16", + "u32", + "u64", + "s8", + "s16", + "s32", + "s64", + "float32", + "float64", + "char", + "bool", + "string", +]; + +pub fn to_wit_ident(name: &str) -> String { + let ident = name + .replace("::", "-") + .replace('_', "-") + .replace(' ', "-") + .to_kebab_case(); + + if WIT_KEYWORDS.contains(&ident.as_str()) { + format!("%{ident}") + } else { + ident + } +} + +pub fn to_canonical_abi_func_name( + key: &FunctionKey, + type_reg: &TypeRegistry, + info: &FunctionInfo, +) -> Cow<'static, str> { + match key.namespace { + Namespace::Global => key.name.clone(), + Namespace::OnType(type_id) => { + let ident = type_reg + .get(type_id) + .map(|reg| reg.type_info().type_path_table().ident().unwrap()) + .or_else(|| { + if type_id == TypeId::of::() { + Some("world") + } else { + None + } + }) + .expect("missing type"); + let type_name = to_wit_ident(ident); + let is_method = info.is_method(); + let prefix = if is_method { "[method]" } else { "[static]" }; + let fname = to_wit_ident(&key.name); + format!("{prefix}{type_name}.{fname}").into() + } + } +} + +const REFLECT_REF_RES_NAME: &str = "reflect-ref"; + +/// Build and populate the wasmtime component linker from the BMS function registry. +pub fn build_linker(engine: &Engine) -> Result, InteropError> { + let mut linker = Linker::::new(engine); + + let world = ThreadWorldContainer.try_get_context()?.world; + let function_registry = world.script_function_registry(); + let function_registry = function_registry.read(); + + // build special reflect-ref resource + // let reflect_ref_interface = namespace_to_interface(ReflectReference::into_namespace()); + + // let mut reflect_ref_inst = linker.instance(&reflect_ref_interface).unwrap(); + // reflect_ref_inst + // .resource( + // REFLECT_REF_RES_NAME, + // ResourceType::host::(), + // |mut ctx, res| { + // // TODO: do we need a custom drop ? + // // ctx.data_mut().passed_references.remove(&res); + // Ok(()) + // }, + // ) + // .unwrap(); + + // reflect_ref_inst.func_wrap( + // "[method]reflect-ref.display", + // |a, r: (Resource,)| { + // let ref_ = a.data().get_ref(&r.0).unwrap(); + // println!("ref: {ref_:?}"); + // Ok(()) + // }, + // ); + + // Group functions by interface name + // let mut by_interface: HashMap> = + // HashMap::new(); + // for (key, func) in registry.iter_all() { + // let interface_name = namespace_to_interface(key.namespace); + // by_interface + // .entry(interface_name) + // .or_default() + // .push((key.clone(), func.clone())); + // } + + // Register each interface + let registry = world.type_registry(); + let registry = registry.read(); + let mut instance_linker = linker + .instance("bms:scripting/types") + .map_err(|e| to_interop_error(e))?; + + for type_ in registry.iter() { + if let Some(ident) = type_.type_info().type_path_table().ident() + && type_.type_info().generics().is_empty() + // https://github.com/bevyengine/bevy/issues/24235 + && !type_.type_info().type_path().contains("<") + { + let ident = to_wit_ident(ident); + println!( + "{ident}: {}, {:?}", + type_.type_info().type_path(), + type_.type_info().generics() + ); + instance_linker + .resource(&ident, ResourceType::host::(), |a, b| { + Ok(()) + }) + .map_err(|e| to_interop_error(e))?; + let type_namespace = Namespace::OnType(type_.type_id()); + let mut registered_already = HashSet::::default(); + for (func_name, func) in function_registry.iter_namespace(type_namespace) { + registered_already.insert(func_name.name.to_string()); + link_function(®istry, &mut instance_linker, func_name, func)?; + } + // TODO: exclude primitives from here + for (func_name, func) in + function_registry.iter_namespace(ReflectReference::into_namespace()) + { + if (registered_already.contains(&func_name.name.to_string())) { + continue; + } + let mut fake_key = func_name.clone(); + fake_key.namespace = type_namespace; + link_function(®istry, &mut instance_linker, &fake_key, func)?; + } + } + } + + for (func_name, func) in function_registry.iter_namespace(Namespace::Global) { + link_function(®istry, &mut instance_linker, func_name, func)?; + } + + wasmtime_wasi::p2::add_to_linker_sync(&mut linker).map_err(to_interop_error)?; + + Ok(linker) +} + +fn link_function( + registry: &std::sync::RwLockReadGuard<'_, TypeRegistry>, + instance_linker: &mut wasmtime::component::LinkerInstance<'_, WasmtimeStoreData>, + func_name: &FunctionKey, + func: &DynamicScriptFunction, +) -> Result<(), InteropError> { + let func_clone = func.clone(); + let canonical_abi_name = to_canonical_abi_func_name(&func_name, registry, &func.info); + instance_linker + .func_new( + &canonical_abi_name, + into_wasm_function_registration(func_clone), + ) + .map_err(|e| to_interop_error(e))?; + Ok(()) +} + +fn into_wasm_function_registration( + func: DynamicScriptFunction, +) -> impl Fn( + wasmtime::StoreContextMut, + ComponentFunc, + &[Val], + &mut [Val], +) -> wasmtime::error::Result<()> { + move |mut store: wasmtime::StoreContextMut, + _, + args: &[Val], + results: &mut [Val]| + -> wasmtime::error::Result<()> { + let script_args: Vec = args + .iter() + .map(|v| val_to_script_value(v, &mut store)) + .collect(); + + let ctx = FunctionCallContext::new(Language::Wasmtime); + + let result = func + .call(script_args, ctx) + .map_err(|e| wasmtime::error::format_err!("{e:?}"))?; + + if !results.is_empty() { + results[0] = script_value_to_val(result, &mut store); + } + + Ok(()) + } +} diff --git a/crates/languages/bevy_mod_scripting_wasmtime/src/plugin.rs b/crates/languages/bevy_mod_scripting_wasmtime/src/plugin.rs index ebf4784487..8c63e4f54f 100644 --- a/crates/languages/bevy_mod_scripting_wasmtime/src/plugin.rs +++ b/crates/languages/bevy_mod_scripting_wasmtime/src/plugin.rs @@ -23,7 +23,7 @@ pub struct WasmtimeScriptingPlugin { impl IntoScriptPluginParams for WasmtimeScriptingPlugin { type C = WasmtimeContext; type R = WasmtimeRuntime; - const LANGUAGE: Language = Language::Unknown; // TODO: Add Language::Wasm + const LANGUAGE: Language = Language::Wasmtime; // TODO: Add Language::Wasm fn build_runtime() -> Self::R { WasmtimeRuntime::new() diff --git a/examples/run_wasm.rs b/examples/run_wasm.rs index a8f5e4638d..dff56f8c73 100644 --- a/examples/run_wasm.rs +++ b/examples/run_wasm.rs @@ -8,6 +8,7 @@ use bevy::prelude::*; use bevy_mod_scripting::prelude::*; +use bevy_mod_scripting_bindings::{AppReflectAllocator, ReflectReference}; use bevy_mod_scripting_core::event::ScriptCallbackResponseEvent; fn main() { @@ -53,18 +54,23 @@ fn setup(mut commands: Commands, asset_server: Res) { callback_labels!(OnCustomEvent => "on_custom_event"); /// System that triggers events for scripts to handle -fn trigger_events(mut writer: MessageWriter) { +fn trigger_events( + mut writer: MessageWriter, + allocator: ResMut, +) { // Send a custom event every 60 frames (approximately 1 second at 60 FPS) static mut FRAME_COUNTER: u32 = 0; unsafe { FRAME_COUNTER += 1; if FRAME_COUNTER % 60 == 0 { println!("Triggering script event..."); - + let mut allocator = allocator.write(); + let test_ref = ReflectReference::new_allocated(Transform::default(), &mut allocator); + drop(allocator); // Send the event to all scripts writer.write(ScriptCallbackEvent::new_for_all_scripts( OnCustomEvent, - vec![], + vec![test_ref.into()], )); } } diff --git a/guest_crate/bindings.wit b/guest_crate/bindings.wit index 0867919563..864c416c61 100644 --- a/guest_crate/bindings.wit +++ b/guest_crate/bindings.wit @@ -1,10 +1,30 @@ -package bms:scripting@0.1.0; +package bms:scripting; + +interface types { + resource reflect-reference { + display: func() -> string; + } + + resource transform { + display: func() -> string; + up: func() -> dir3; + } + + resource dir3 { + display: func() -> string; + } + +} + /// The BMS guest world - what a guest component must implement world bms-guest { + import types; + use types.{transform, dir3}; + export on-script-loaded: func(); export on-script-unloaded: func(); export on-update: func(); - export on-custom-event: func(); + export on-custom-event: func(some-ref: transform); } diff --git a/guest_crate/src/lib.rs b/guest_crate/src/lib.rs index a0d79ea6d3..9c5ddc4c50 100644 --- a/guest_crate/src/lib.rs +++ b/guest_crate/src/lib.rs @@ -18,7 +18,6 @@ impl Guest for MyHost { /// Called when the script is first loaded fn on_script_loaded() { println!("[Rust Guest] Script loaded!"); - panic!("asd"); // // Spawn an entity with Transform // match spawn_entity_with_transform() { @@ -45,8 +44,9 @@ impl Guest for MyHost { } } - fn on_custom_event() -> () { + fn on_custom_event(a: Transform) { println!("[Rust Guest] Script custom event!"); + println!("{}", a.up().display()); } } From 9ceec34e1a8f9434977ddac767c16dca3aba7a50 Mon Sep 17 00:00:00 2001 From: makspll Date: Tue, 12 May 2026 22:19:08 +0100 Subject: [PATCH 5/5] clean up a bit --- Cargo.toml | 7 ++++++- .../src/function/script_function.rs | 2 +- .../src/context.rs | 19 ++++--------------- .../bevy_mod_scripting_wasmtime/src/linker.rs | 9 +++------ .../bevy_mod_scripting_wasmtime/src/plugin.rs | 14 +++++++++----- .../src/runtime.rs | 13 +++++++------ src/prelude.rs | 1 + 7 files changed, 31 insertions(+), 34 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 614296edb7..db1d11b8e9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -107,6 +107,10 @@ mlua_async = ["bevy_mod_scripting_lua?/mlua_async"] ## rhai rhai = ["bevy_mod_scripting_rhai", "bevy_mod_scripting_functions/rhai_bindings"] + +## wasmtime +wasmtime = ["bevy_mod_scripting_wasmtime"] + ## rune # rune = ["bevy_mod_scripting_rune"] @@ -119,6 +123,7 @@ bevy_app = { workspace = true } bevy_mod_scripting_core = { workspace = true } bevy_mod_scripting_lua = { workspace = true, optional = true } bevy_mod_scripting_rhai = { workspace = true, optional = true } +bevy_mod_scripting_wasmtime = { workspace = true, optional = true} bevy_mod_scripting_functions = { workspace = true } bevy_mod_scripting_derive = { workspace = true } bevy_mod_scripting_asset = { workspace = true } @@ -126,7 +131,6 @@ bevy_mod_scripting_bindings = { workspace = true } bevy_mod_scripting_bindings_domain = { workspace = true } bevy_mod_scripting_display = { workspace = true } bevy_mod_scripting_script = { workspace = true } -bevy_mod_scripting_wasmtime = { workspace = true } ladfile_builder = { workspace = true, optional = true } [workspace.dependencies] @@ -350,6 +354,7 @@ path = "examples/run_script.rs" [[example]] name = "run_wasm" path = "examples/run_wasm.rs" +required-features = ["wasmtime"] [[example]] diff --git a/crates/bevy_mod_scripting_bindings/src/function/script_function.rs b/crates/bevy_mod_scripting_bindings/src/function/script_function.rs index 152f7ebb9d..537103465e 100644 --- a/crates/bevy_mod_scripting_bindings/src/function/script_function.rs +++ b/crates/bevy_mod_scripting_bindings/src/function/script_function.rs @@ -84,7 +84,7 @@ pub struct LocationContext { } impl FunctionCallContext { - /// Create a new FunctionCallContext with the given 1-indexing conversion preference + /// Create a new FunctionCallContext pub const fn new(language: Language) -> Self { Self { language, diff --git a/crates/languages/bevy_mod_scripting_wasmtime/src/context.rs b/crates/languages/bevy_mod_scripting_wasmtime/src/context.rs index 8d130f2fe2..1d77cc37ca 100644 --- a/crates/languages/bevy_mod_scripting_wasmtime/src/context.rs +++ b/crates/languages/bevy_mod_scripting_wasmtime/src/context.rs @@ -59,22 +59,12 @@ pub fn wasmtime_context_load( world_id: WorldId, ) -> Result { let config = WasmtimeScriptingPlugin::readonly_configuration(world_id); - let runtime = config.runtime; - - // Ensure the linker is populated (lazy, once) - { - let mut guard = runtime.linker.lock(); - if guard.is_none() { - *guard = Some(build_linker(&runtime.engine)?); - } - } - + let runtime = config.runtime.read(); let component = Component::new(&runtime.engine, content).map_err(|e| to_interop_error(e))?; let mut store = Store::new(&runtime.engine, WasmtimeStoreData::new()); - let linker_guard = runtime.linker.lock(); - let linker = linker_guard.as_ref().unwrap(); + let linker = &runtime.linker; let instance = linker.instantiate(&mut store, &component).map_err(|e| { println!("{e:#?}"); to_interop_error(e) @@ -102,14 +92,13 @@ pub fn wasmtime_context_reload( ) -> Result<(), InteropError> { // Re-compile the component (in case it changed) let config = WasmtimeScriptingPlugin::readonly_configuration(world_id); - let runtime = config.runtime; + let runtime = config.runtime.read(); let component = Component::new(&runtime.engine, content).map_err(|e| to_interop_error(e))?; // Re-instantiate with the same linker let mut store = Store::new(&runtime.engine, WasmtimeStoreData::new()); - let linker_guard = runtime.linker.lock(); - let linker = linker_guard.as_ref().unwrap(); + let linker = &runtime.linker; let instance = linker .instantiate(&mut store, &component) .map_err(|e| to_interop_error(e))?; diff --git a/crates/languages/bevy_mod_scripting_wasmtime/src/linker.rs b/crates/languages/bevy_mod_scripting_wasmtime/src/linker.rs index 5a5bef44ca..d588960f7c 100644 --- a/crates/languages/bevy_mod_scripting_wasmtime/src/linker.rs +++ b/crates/languages/bevy_mod_scripting_wasmtime/src/linker.rs @@ -105,9 +105,7 @@ pub fn to_canonical_abi_func_name( const REFLECT_REF_RES_NAME: &str = "reflect-ref"; /// Build and populate the wasmtime component linker from the BMS function registry. -pub fn build_linker(engine: &Engine) -> Result, InteropError> { - let mut linker = Linker::::new(engine); - +pub fn build_linker(linker: &mut Linker) -> Result<(), InteropError> { let world = ThreadWorldContainer.try_get_context()?.world; let function_registry = world.script_function_registry(); let function_registry = function_registry.read(); @@ -196,9 +194,8 @@ pub fn build_linker(engine: &Engine) -> Result, Intero link_function(®istry, &mut instance_linker, func_name, func)?; } - wasmtime_wasi::p2::add_to_linker_sync(&mut linker).map_err(to_interop_error)?; - - Ok(linker) + wasmtime_wasi::p2::add_to_linker_sync(linker).map_err(to_interop_error)?; + Ok(()) } fn link_function( diff --git a/crates/languages/bevy_mod_scripting_wasmtime/src/plugin.rs b/crates/languages/bevy_mod_scripting_wasmtime/src/plugin.rs index 8c63e4f54f..ec34212d41 100644 --- a/crates/languages/bevy_mod_scripting_wasmtime/src/plugin.rs +++ b/crates/languages/bevy_mod_scripting_wasmtime/src/plugin.rs @@ -8,8 +8,8 @@ use bevy_mod_scripting_core::{ }; use crate::{ - WasmtimeContext, WasmtimeRuntime, wasmtime_context_load, wasmtime_context_reload, - wasmtime_handler, + WasmtimeContext, WasmtimeRuntime, WasmtimeRuntimeInner, build_linker, wasmtime_context_load, + wasmtime_context_reload, wasmtime_handler, }; make_plugin_config_static!(WasmtimeScriptingPlugin); @@ -26,7 +26,7 @@ impl IntoScriptPluginParams for WasmtimeScriptingPlugin { const LANGUAGE: Language = Language::Wasmtime; // TODO: Add Language::Wasm fn build_runtime() -> Self::R { - WasmtimeRuntime::new() + WasmtimeRuntime::new(WasmtimeRuntimeInner::new()) } fn handler() -> bevy_mod_scripting_core::handler::HandlerFn { @@ -52,10 +52,14 @@ impl Default for WasmtimeScriptingPlugin { fn default() -> Self { Self { scripting_plugin: ScriptingPlugin { - runtime_initializers: vec![], + runtime_initializers: vec![|runtime: &WasmtimeRuntime| { + let mut runtime = runtime.write(); + build_linker(&mut runtime.linker)?; + Ok(()) + }], context_policy: ContextPolicy::default(), language: Self::LANGUAGE, - supported_extensions: vec!["wasm"], + supported_extensions: vec!["wasm", "component.wasm"], context_initializers: vec![], context_pre_handling_initializers: vec![], emit_responses: false, diff --git a/crates/languages/bevy_mod_scripting_wasmtime/src/runtime.rs b/crates/languages/bevy_mod_scripting_wasmtime/src/runtime.rs index 6dc357cf00..2157de3594 100644 --- a/crates/languages/bevy_mod_scripting_wasmtime/src/runtime.rs +++ b/crates/languages/bevy_mod_scripting_wasmtime/src/runtime.rs @@ -1,28 +1,29 @@ -use parking_lot::Mutex; +use parking_lot::{Mutex, RwLock}; use wasmtime::{Config, Engine, component::Linker}; use crate::WasmtimeStoreData; +pub type WasmtimeRuntime = RwLock; /// Shared wasmtime runtime. -pub struct WasmtimeRuntime { +pub struct WasmtimeRuntimeInner { pub engine: Engine, /// Cached linker, populated once from the BMS function registry. - pub linker: Mutex>>, + pub linker: Linker, } -impl Default for WasmtimeRuntime { +impl Default for WasmtimeRuntimeInner { fn default() -> Self { Self::new() } } -impl WasmtimeRuntime { +impl WasmtimeRuntimeInner { pub fn new() -> Self { let mut config = Config::new(); config.wasm_component_model(true); let engine = Engine::new(&config).expect("wasmtime Engine creation failed"); Self { + linker: Linker::new(&engine), engine, - linker: Mutex::new(None), } } } diff --git a/src/prelude.rs b/src/prelude.rs index 5a65eaf350..8dd9c23b2b 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -21,6 +21,7 @@ pub use bevy_mod_scripting_core::commands::*; pub use bevy_mod_scripting_lua::LuaScriptingPlugin; #[cfg(feature = "rhai")] pub use bevy_mod_scripting_rhai::RhaiScriptingPlugin; +#[cfg(feature = "wasmtime")] pub use bevy_mod_scripting_wasmtime::WasmtimeScriptingPlugin; pub use crate::{BMSPlugin, ScriptFunctionsPlugin};

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